diff --git a/src/fmouse.cpp b/src/fmouse.cpp index f263808f..6e4a7770 100644 --- a/src/fmouse.cpp +++ b/src/fmouse.cpp @@ -708,10 +708,10 @@ void FMouseSGR::setRawData (char fifo_buf[], int fifo_buf_size) for (n = len; n < fifo_buf_size; n++) // Remove founded entry fifo_buf[n - len] = fifo_buf[n]; - n = fifo_buf_size - len - 1; + n = fifo_buf_size - len; for (; n < fifo_buf_size; n++) // Fill rest with '\0' - fifo_buf[n - len] = '\0'; + fifo_buf[n] = '\0'; input_data_pending = bool(fifo_buf[0] != '\0'); } diff --git a/src/test/fmouse-test.cpp b/src/test/fmouse-test.cpp index b1f4c551..dee2dfca 100644 --- a/src/test/fmouse-test.cpp +++ b/src/test/fmouse-test.cpp @@ -100,6 +100,7 @@ class FMouseTest : public CPPUNIT_NS::TestFixture void gpmMouseTest(); #endif void x11MouseTest(); + void sgrMouseTest(); private: // Adds code needed to register the test suite @@ -114,6 +115,7 @@ class FMouseTest : public CPPUNIT_NS::TestFixture CPPUNIT_TEST (gpmMouseTest); #endif CPPUNIT_TEST (x11MouseTest); + CPPUNIT_TEST (sgrMouseTest); // End of test suite definition CPPUNIT_TEST_SUITE_END(); @@ -285,6 +287,12 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( ! x11_mouse.isWheelDown() ); CPPUNIT_ASSERT ( ! x11_mouse.isMoved() ); + // The same input again + char raw[] = { 0x1b, '[', 'M', 0x23, 0x50, 0x32 }; + x11_mouse.setRawData ( raw, sizeof(raw)); + x11_mouse.processEvent (&tv); + CPPUNIT_ASSERT ( ! x11_mouse.hasEvent() ); + // Left mouse button pressed char rawdata2[] = { 0x1b, '[', 'M', 0x20, 0x21, 0x21 }; x11_mouse.setRawData (rawdata2, sizeof(rawdata2)); @@ -539,6 +547,79 @@ void FMouseTest::x11MouseTest() CPPUNIT_ASSERT ( x11_mouse.isShiftKeyPressed() ); CPPUNIT_ASSERT ( x11_mouse.isControlKeyPressed() ); CPPUNIT_ASSERT ( x11_mouse.isMetaKeyPressed() ); + + char rawdata10[] = { 0x1b, '[', 'M', 0x20, 0x7f, 0x3f }; + x11_mouse.setRawData (rawdata10, sizeof(rawdata9)); + CPPUNIT_ASSERT ( x11_mouse.hasData() ); + x11_mouse.processEvent (&tv); + CPPUNIT_ASSERT ( x11_mouse.hasEvent() ); + x11_mouse.clearEvent(); + CPPUNIT_ASSERT ( ! x11_mouse.hasEvent() ); +} + + +//---------------------------------------------------------------------- +void FMouseTest::sgrMouseTest() +{ + FMouseSGR sgr_mouse; + CPPUNIT_ASSERT ( ! sgr_mouse.hasData() ); + + char rawdata1[] = { 0x1b, '[', '<', '0', ';', '7' + , '3', ';', '4', 'm', '@', '@' }; + sgr_mouse.setRawData (rawdata1, sizeof(rawdata1)); + CPPUNIT_ASSERT ( sgr_mouse.hasData() ); + CPPUNIT_ASSERT ( sgr_mouse.isInputDataPending() ); + CPPUNIT_ASSERT ( strcmp(rawdata1, "@@") == 0 ); + + timeval tv; + FObject::getCurrentTime(&tv); + sgr_mouse.processEvent (&tv); + + CPPUNIT_ASSERT ( sgr_mouse.getPos() == FPoint(73, 4) ); + CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isLeftButtonPressed() ); + CPPUNIT_ASSERT ( sgr_mouse.isLeftButtonReleased() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isLeftButtonDoubleClick() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isRightButtonPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isRightButtonReleased() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isMiddleButtonPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isMiddleButtonReleased() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isShiftKeyPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isControlKeyPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isMetaKeyPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isWheelUp() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isWheelDown() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isMoved() ); + + // The same input again + char raw[] = { 0x1b, '[', '<', '0', ';', '7', '3', ';', '4', 'm' }; + sgr_mouse.setRawData ( raw, sizeof(raw)); + sgr_mouse.processEvent (&tv); + CPPUNIT_ASSERT ( ! sgr_mouse.hasEvent() ); + + // Left mouse button pressed + char rawdata2[] = { 0x1b, '[', '<', '0', ';', '1', ';', '1', 'M' }; + sgr_mouse.setRawData (rawdata2, sizeof(rawdata2)); + + CPPUNIT_ASSERT ( sgr_mouse.hasData() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isInputDataPending() ); + sgr_mouse.processEvent (&tv); + CPPUNIT_ASSERT ( ! sgr_mouse.hasData() ); + CPPUNIT_ASSERT ( sgr_mouse.getPos() == FPoint(1, 1) ); + CPPUNIT_ASSERT ( sgr_mouse.hasEvent() ); + CPPUNIT_ASSERT ( sgr_mouse.isLeftButtonPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isLeftButtonReleased() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isLeftButtonDoubleClick() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isRightButtonPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isRightButtonReleased() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isMiddleButtonPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isMiddleButtonReleased() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isShiftKeyPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isControlKeyPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isMetaKeyPressed() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isWheelUp() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isWheelDown() ); + CPPUNIT_ASSERT ( ! sgr_mouse.isMoved() ); }