From 7625dca0e91ce95a10f2bdf523aaed402f8cacc1 Mon Sep 17 00:00:00 2001 From: Jeroen Oortwijn Date: Mon, 21 Sep 2015 19:10:10 +0200 Subject: [PATCH] input_server/tablet: Only send event messages when pen is in range. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the pen is moved out of range, the Wacom tablet sends one last message with all values set to 0 and the In Range value set to false. Don't send mouse event messages in this case. Change-Id: I419d57cede47a6ef40a160322f3025ef372ecaa3 Reviewed-on: https://review.haiku-os.org/c/1448 Reviewed-by: waddlesplash Reviewed-by: Stephan Aßmus --- .../devices/tablet/TabletInputDevice.cpp | 100 +++++++++--------- 1 file changed, 52 insertions(+), 48 deletions(-) diff --git a/src/add-ons/input_server/devices/tablet/TabletInputDevice.cpp b/src/add-ons/input_server/devices/tablet/TabletInputDevice.cpp index 283231abb9..1153997d68 100644 --- a/src/add-ons/input_server/devices/tablet/TabletInputDevice.cpp +++ b/src/add-ons/input_server/devices/tablet/TabletInputDevice.cpp @@ -322,61 +322,65 @@ TabletDevice::_ControlThread() movements.pressure, movements.wheel_xdelta, movements.wheel_ydelta, movements.eraser ? 'y' : 'n', movements.tilt_x, movements.tilt_y); - // Send single messages for each event + // Only send messages when pen is in range - uint32 buttons = lastButtons ^ movements.buttons; - if (buttons != 0) { - bool pressedButton = (buttons & movements.buttons) > 0; - BMessage* message = _BuildMouseMessage( - pressedButton ? B_MOUSE_DOWN : B_MOUSE_UP, - movements.timestamp, movements.buttons, movements.xpos, - movements.ypos); - if (message != NULL) { - if (pressedButton) { - message->AddInt32("clicks", movements.clicks); - LOG_EVENT("B_MOUSE_DOWN\n"); - } else - LOG_EVENT("B_MOUSE_UP\n"); + if (movements.has_contact) { + // Send single messages for each event - fTarget.EnqueueMessage(message); - lastButtons = movements.buttons; - } - } + uint32 buttons = lastButtons ^ movements.buttons; + if (buttons != 0) { + bool pressedButton = (buttons & movements.buttons) > 0; + BMessage* message = _BuildMouseMessage( + pressedButton ? B_MOUSE_DOWN : B_MOUSE_UP, + movements.timestamp, movements.buttons, movements.xpos, + movements.ypos); + if (message != NULL) { + if (pressedButton) { + message->AddInt32("clicks", movements.clicks); + LOG_EVENT("B_MOUSE_DOWN\n"); + } else + LOG_EVENT("B_MOUSE_UP\n"); - if (movements.xpos != lastXPosition - || movements.ypos != lastYPosition) { - BMessage* message = _BuildMouseMessage(B_MOUSE_MOVED, - movements.timestamp, movements.buttons, movements.xpos, - movements.ypos); - if (message != NULL) { - message->AddFloat("be:tablet_x", movements.xpos); - message->AddFloat("be:tablet_y", movements.ypos); - message->AddFloat("be:tablet_pressure", movements.pressure); - message->AddInt32("be:tablet_eraser", movements.eraser); - if (movements.tilt_x != 0.0 || movements.tilt_y != 0.0) { - message->AddFloat("be:tablet_tilt_x", movements.tilt_x); - message->AddFloat("be:tablet_tilt_y", movements.tilt_y); + fTarget.EnqueueMessage(message); + lastButtons = movements.buttons; } - - fTarget.EnqueueMessage(message); - lastXPosition = movements.xpos; - lastYPosition = movements.ypos; } - } - if (movements.wheel_ydelta != 0 || movements.wheel_xdelta != 0) { - BMessage* message = new BMessage(B_MOUSE_WHEEL_CHANGED); - if (message == NULL) - continue; + if (movements.xpos != lastXPosition + || movements.ypos != lastYPosition) { + BMessage* message = _BuildMouseMessage(B_MOUSE_MOVED, + movements.timestamp, movements.buttons, movements.xpos, + movements.ypos); + if (message != NULL) { + message->AddFloat("be:tablet_x", movements.xpos); + message->AddFloat("be:tablet_y", movements.ypos); + message->AddFloat("be:tablet_pressure", movements.pressure); + message->AddInt32("be:tablet_eraser", movements.eraser); + if (movements.tilt_x != 0.0 || movements.tilt_y != 0.0) { + message->AddFloat("be:tablet_tilt_x", movements.tilt_x); + message->AddFloat("be:tablet_tilt_y", movements.tilt_y); + } - if (message->AddInt64("when", movements.timestamp) == B_OK - && message->AddFloat("be:wheel_delta_x", - movements.wheel_xdelta) == B_OK - && message->AddFloat("be:wheel_delta_y", - movements.wheel_ydelta) == B_OK) - fTarget.EnqueueMessage(message); - else - delete message; + fTarget.EnqueueMessage(message); + lastXPosition = movements.xpos; + lastYPosition = movements.ypos; + } + } + + if (movements.wheel_ydelta != 0 || movements.wheel_xdelta != 0) { + BMessage* message = new BMessage(B_MOUSE_WHEEL_CHANGED); + if (message == NULL) + continue; + + if (message->AddInt64("when", movements.timestamp) == B_OK + && message->AddFloat("be:wheel_delta_x", + movements.wheel_xdelta) == B_OK + && message->AddFloat("be:wheel_delta_y", + movements.wheel_ydelta) == B_OK) + fTarget.EnqueueMessage(message); + else + delete message; + } } } }