input_server/tablet: Only send event messages when pen is in range.

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 <waddlesplash@gmail.com>
Reviewed-by: Stephan Aßmus <superstippi@gmx.de>
This commit is contained in:
Jeroen Oortwijn 2015-09-21 19:10:10 +02:00 committed by Stephan Aßmus
parent 45c3eb3a3c
commit 7625dca0e9

View File

@ -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;
}
}
}
}