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:
parent
45c3eb3a3c
commit
7625dca0e9
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user