From a890c5eced14cc77a3b533a5e3ea3dac1327f9c8 Mon Sep 17 00:00:00 2001 From: Steve Kondik <shade@chemlab.org> Date: Thu, 15 Jun 2017 02:46:23 -0700 Subject: [PATCH] vnc: Impove pointer handling * Better accuracy and state tracking --- src/InputDevice.cpp | 40 ++++++++++++++++++---------------------- src/InputDevice.h | 5 +++++ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/InputDevice.cpp b/src/InputDevice.cpp index 1f07f5a..ddfc499 100644 --- a/src/InputDevice.cpp +++ b/src/InputDevice.cpp @@ -53,6 +53,8 @@ status_t InputDevice::start(uint32_t width, uint32_t height) { status_t err = OK; + mLeftClicked = mMiddleClicked = mRightClicked = false; + struct input_id id = { BUS_VIRTUAL, /* Bus type */ 1, /* Vendor */ @@ -230,36 +232,28 @@ void InputDevice::onPointerEvent(int buttonMask, int x, int y, rfbClientPtr cl) InputDevice::getInstance().pointerEvent(buttonMask, x, y, cl); } -void InputDevice::pointerEvent(int buttonMask, int x, int y, rfbClientPtr cl) { - static int leftClicked = 0, rightClicked = 0, middleClicked = 0; - (void)cl; - +void InputDevice::pointerEvent(int buttonMask, int x, int y, rfbClientPtr /* cl */) { if (mFD < 0) return; ALOGV("pointerEvent: buttonMask=%x x=%d y=%d", buttonMask, x, y); Mutex::Autolock _l(mLock); - if ((buttonMask & 1) && leftClicked) { // left btn clicked and moving - static int i = 0; - i = i + 1; + if ((buttonMask & 1) && mLeftClicked) { // left btn clicked and moving + inject(EV_ABS, ABS_X, x); + inject(EV_ABS, ABS_Y, y); + inject(EV_SYN, SYN_REPORT, 0); - if (i % 10 == 1) // some tweak to not report every move event - { - inject(EV_ABS, ABS_X, x); - inject(EV_ABS, ABS_Y, y); - inject(EV_SYN, SYN_REPORT, 0); - } } else if (buttonMask & 1) { // left btn clicked - leftClicked = 1; + mLeftClicked = true; inject(EV_ABS, ABS_X, x); inject(EV_ABS, ABS_Y, y); inject(EV_KEY, BTN_TOUCH, 1); inject(EV_SYN, SYN_REPORT, 0); - } else if (leftClicked) // left btn released + } else if (mLeftClicked) // left btn released { - leftClicked = 0; + mLeftClicked = false; inject(EV_ABS, ABS_X, x); inject(EV_ABS, ABS_Y, y); inject(EV_KEY, BTN_TOUCH, 0); @@ -268,34 +262,36 @@ void InputDevice::pointerEvent(int buttonMask, int x, int y, rfbClientPtr cl) { if (buttonMask & 4) // right btn clicked { - rightClicked = 1; + mRightClicked = true; press(158); // back key inject(EV_SYN, SYN_REPORT, 0); - } else if (rightClicked) // right button released + } else if (mRightClicked) // right button released { - rightClicked = 0; + mRightClicked = false; release(158); inject(EV_SYN, SYN_REPORT, 0); } if (buttonMask & 2) // mid btn clicked { - middleClicked = 1; + mMiddleClicked = true; press(KEY_END); inject(EV_SYN, SYN_REPORT, 0); - } else if (middleClicked) // mid btn released + } else if (mMiddleClicked) // mid btn released { - middleClicked = 0; + mMiddleClicked = false; release(KEY_END); inject(EV_SYN, SYN_REPORT, 0); } if (buttonMask & 8) { inject(EV_REL, REL_WHEEL, 1); + inject(EV_SYN, SYN_REPORT, 0); } if (buttonMask & 0x10) { inject(EV_REL, REL_WHEEL, -1); + inject(EV_SYN, SYN_REPORT, 0); } } diff --git a/src/InputDevice.h b/src/InputDevice.h index 20f5063..e09bd3b 100644 --- a/src/InputDevice.h +++ b/src/InputDevice.h @@ -64,6 +64,11 @@ private: int mFD; struct uinput_user_dev mUserDev; + + bool mLeftClicked; + bool mRightClicked; + bool mMiddleClicked; + }; }; -- GitLab