- static bool tap_detected = false;
- static bool double_tap_detected = false;
- static bool tap_drag_detected = false;
- static QTime press_time;
- static QTime up_time; //used for double clicks/tap&drag, for time after first tap
-
- if(!e) { //flush held taps
- if(tap_detected) {
- m_buttonMask |= 0x01;
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
- m_buttonMask &= 0xfe;
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
- tap_detected = false;
- } else if(double_tap_detected and press_time.elapsed() > TAP_PRESS_TIME) { //got tap + another press -> tap & drag
- m_buttonMask |= 0x01;
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
- double_tap_detected = false;
- tap_drag_detected = true;
- }
-
- return;
- }
-
- if(e->x() < 0 or e->y() < 0) { //QScrollArea tends to send invalid events sometimes...
- e->ignore();
- return;
- }
-
- cursor_x = qRound(e->x()/m_horizontalFactor);
- cursor_y = qRound(e->y()/m_verticalFactor);
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask); // plain move event
-
- if(!disable_tapping and e->button() == Qt::LeftButton) { //implement touchpad-like input for left button
- if(e->type() == QEvent::MouseButtonPress or e->type() == QEvent::MouseButtonDblClick) {
- press_time.start();
- if(tap_detected and up_time.elapsed() < DOUBLE_TAP_UP_TIME) {
- tap_detected = false;
- double_tap_detected = true;
-
- QTimer::singleShot(TAP_PRESS_TIME, this, SLOT(mouseEventHandler()));
- }
- } else if(e->type() == QEvent::MouseButtonRelease) {
- if(tap_drag_detected) {
- m_buttonMask &= 0xfe;
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
- tap_drag_detected = false;
- } else if(double_tap_detected) { //double click
- double_tap_detected = false;
-
- m_buttonMask |= 0x01;
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
- m_buttonMask &= 0xfe;
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
- m_buttonMask |= 0x01;
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
- m_buttonMask &= 0xfe;
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
- } else if(press_time.elapsed() < TAP_PRESS_TIME) { //tap
- up_time.start();
- tap_detected = true;
- QTimer::singleShot(DOUBLE_TAP_UP_TIME, this, SLOT(mouseEventHandler()));
- }
-
- }
- } else { //middle or right button, send directly
- if ((e->type() == QEvent::MouseButtonPress)) {
- if (e->button() & Qt::MidButton)
- m_buttonMask |= 0x02;
- if (e->button() & Qt::RightButton)
- m_buttonMask |= 0x04;
- } else if (e->type() == QEvent::MouseButtonRelease) {
- if (e->button() & Qt::MidButton)
- m_buttonMask &= 0xfd;
- if (e->button() & Qt::RightButton)
- m_buttonMask &= 0xfb;
- }
- vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
- }
-
- //prevent local cursor artifacts
- static int old_cursor_x = cursor_x;
- static int old_cursor_y = cursor_y;
- if(((m_dotCursorState == CursorOn) || m_forceLocalCursor)
- and (cursor_x != old_cursor_x or cursor_y != old_cursor_y)) {
- //clear last position
- repaint(old_cursor_x*m_horizontalFactor - CURSOR_SIZE/2, old_cursor_y*m_verticalFactor - CURSOR_SIZE/2, CURSOR_SIZE, CURSOR_SIZE);
- //and refresh new one
- repaint(cursor_x*m_horizontalFactor - CURSOR_SIZE/2, cursor_y*m_verticalFactor - CURSOR_SIZE/2, CURSOR_SIZE, CURSOR_SIZE);
-
- old_cursor_x = cursor_x; old_cursor_y = cursor_y;
- }
+ static bool tap_detected = false;
+ static bool double_tap_detected = false;
+ static bool tap_drag_detected = false;
+ static QTime press_time;
+ static QTime up_time; //used for double clicks/tap&drag, for time after first tap
+
+
+ if(!e) { //flush held taps
+ if(tap_detected) {
+ m_buttonMask |= rfbButton1Mask;
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+ m_buttonMask &= ~rfbButton1Mask;
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+ tap_detected = false;
+ } else if(double_tap_detected and press_time.elapsed() > TAP_PRESS_TIME) { //got tap + another press -> tap & drag
+ m_buttonMask |= rfbButton1Mask;
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+ double_tap_detected = false;
+ tap_drag_detected = true;
+ }
+
+ return;
+ }
+
+ if(e->x() < 0 or e->y() < 0) { //QScrollArea tends to send invalid events sometimes...
+ e->ignore();
+ return;
+ }
+
+ cursor_x = qRound(e->x()/m_horizontalFactor);
+ cursor_y = qRound(e->y()/m_verticalFactor);
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask); // plain move event
+
+ if(!disable_tapping and e->button() == Qt::LeftButton) { //implement touchpad-like input for left button
+ if(e->type() == QEvent::MouseButtonPress or e->type() == QEvent::MouseButtonDblClick) {
+ press_time.start();
+ if(tap_detected and up_time.elapsed() < DOUBLE_TAP_UP_TIME) {
+ tap_detected = false;
+ double_tap_detected = true;
+
+ QTimer::singleShot(TAP_PRESS_TIME, this, SLOT(mouseEventHandler()));
+ }
+ } else if(e->type() == QEvent::MouseButtonRelease) {
+ if(tap_drag_detected) { //end tap & drag
+ m_buttonMask &= ~rfbButton1Mask;
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+ tap_drag_detected = false;
+ } else if(double_tap_detected) { //double click
+ double_tap_detected = false;
+
+ m_buttonMask |= rfbButton1Mask;
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+ m_buttonMask &= ~rfbButton1Mask;
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+ m_buttonMask |= rfbButton1Mask;
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+ m_buttonMask &= ~rfbButton1Mask;
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+ } else if(press_time.elapsed() < TAP_PRESS_TIME) { //tap
+ up_time.start();
+ tap_detected = true;
+ QTimer::singleShot(DOUBLE_TAP_UP_TIME, this, SLOT(mouseEventHandler()));
+ }
+
+ }
+ } else { //middle or right button, send directly
+ if ((e->type() == QEvent::MouseButtonPress)) {
+ if (e->button() & Qt::MidButton)
+ m_buttonMask |= rfbButton2Mask;
+ if (e->button() & Qt::RightButton)
+ m_buttonMask |= rfbButton3Mask;
+ } else if (e->type() == QEvent::MouseButtonRelease) {
+ if (e->button() & Qt::MidButton)
+ m_buttonMask &= ~rfbButton2Mask;
+ if (e->button() & Qt::RightButton)
+ m_buttonMask &= ~rfbButton3Mask;
+ }
+ vncThread.mouseEvent(cursor_x, cursor_y, m_buttonMask);
+ }
+
+ //prevent local cursor artifacts
+ static int old_cursor_x = cursor_x;
+ static int old_cursor_y = cursor_y;
+ if(((m_dotCursorState == CursorOn) || m_forceLocalCursor)
+ and (cursor_x != old_cursor_x or cursor_y != old_cursor_y)) {
+ //clear last position
+ update(old_cursor_x*m_horizontalFactor - CURSOR_SIZE/2, old_cursor_y*m_verticalFactor - CURSOR_SIZE/2, CURSOR_SIZE, CURSOR_SIZE);
+ //and refresh new one
+ update(cursor_x*m_horizontalFactor - CURSOR_SIZE/2, cursor_y*m_verticalFactor - CURSOR_SIZE/2, CURSOR_SIZE, CURSOR_SIZE);
+
+ old_cursor_x = cursor_x;
+ old_cursor_y = cursor_y;
+ }