[haiku-commits] haiku: hrev53119 - src/add-ons/input_server/devices/tablet src/add-ons/kernel/drivers/input/usb_hid headers/os/drivers/usb

  • From: Stephan Aßmus <superstippi@xxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Tue, 14 May 2019 03:24:16 -0400 (EDT)

hrev53119 adds 3 changesets to branch 'master'
old head: 45c3eb3a3c98041ab5543901a94cb511ff7fd1f6
new head: 72f7f7d976c5f9c7c956a0e512c2766b2f5fb180
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=72f7f7d976c5+%5E45c3eb3a3c98

----------------------------------------------------------------------------

7625dca0e91c: 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@xxxxxxxxx>
  Reviewed-by: Stephan Aßmus <superstippi@xxxxxx>

419190fdc21f: usb_hid: Use In Range data instead of state
  
  According to the HID Usage Tables document (Hut1_12.pdf), the In Range
  usage is a Momentary Control (MC) (par. 16.3.1). A MC has a Logical
  Minimum of 0 and a Logical Maximum of 1 (par. 3.4.1.3).
  
  As the In Range usage is a bit quantity, the value can't be outside
  the Logical Minimum and Maximum and therefore can't be in an invalid
  state.
  
  Now the inRange boolean value properly changes.
  The pointer still moves to the upper left corner when the pen is out
  of range, though. Maybe the input_server add-on doesn't use this value?
  
  Change-Id: Idf511ac237158e90eb2e8f01422757655a7eea3a
  Reviewed-on: https://review.haiku-os.org/c/1449
  Reviewed-by: waddlesplash <waddlesplash@xxxxxxxxx>
  Reviewed-by: Stephan Aßmus <superstippi@xxxxxx>

72f7f7d976c5: USB_hid.h: Add Report Type constants
  
  From "Device Class Definition for Human Interface Devices (HID)
  Ver. 1.11", par. 7.2.1, page 51.
  
  Change-Id: I4628f8ca940758aaf4a09290e9fa407d30374e7a
  Reviewed-on: https://review.haiku-os.org/c/1450
  Reviewed-by: waddlesplash <waddlesplash@xxxxxxxxx>

                                    [ Jeroen Oortwijn <oortwijn@xxxxxxxxx> ]

----------------------------------------------------------------------------

3 files changed, 63 insertions(+), 52 deletions(-)
headers/os/drivers/usb/USB_hid.h                 |   7 ++
.../devices/tablet/TabletInputDevice.cpp         | 104 ++++++++++---------
.../input/usb_hid/TabletProtocolHandler.cpp      |   4 +-

############################################################################

Commit:      7625dca0e91ce95a10f2bdf523aaed402f8cacc1
URL:         https://git.haiku-os.org/haiku/commit/?id=7625dca0e91c
Author:      Jeroen Oortwijn <oortwijn@xxxxxxxxx>
Date:        Mon Sep 21 17:10:10 2015 UTC
Committer:   Stephan Aßmus <superstippi@xxxxxx>
Commit-Date: Tue May 14 07:24:09 2019 UTC

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@xxxxxxxxx>
Reviewed-by: Stephan Aßmus <superstippi@xxxxxx>

----------------------------------------------------------------------------

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
-
-               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");
-
-                               fTarget.EnqueueMessage(message);
-                               lastButtons = movements.buttons;
+               // Only send messages when pen is in range
+
+               if (movements.has_contact) {
+                       // Send single messages for each event
+
+                       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");
+
+                                       fTarget.EnqueueMessage(message);
+                                       lastButtons = movements.buttons;
+                               }
                        }
-               }
 
-               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 (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);
+                                       lastXPosition = movements.xpos;
+                                       lastYPosition = movements.ypos;
                                }
-
-                               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;
+                       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;
+                       }
                }
        }
 }

############################################################################

Commit:      419190fdc21f9f103115cda581e3049881f09c53
URL:         https://git.haiku-os.org/haiku/commit/?id=419190fdc21f
Author:      Jeroen Oortwijn <oortwijn@xxxxxxxxx>
Date:        Sun Sep 20 17:35:55 2015 UTC
Committer:   Stephan Aßmus <superstippi@xxxxxx>
Commit-Date: Tue May 14 07:24:09 2019 UTC

usb_hid: Use In Range data instead of state

According to the HID Usage Tables document (Hut1_12.pdf), the In Range
usage is a Momentary Control (MC) (par. 16.3.1). A MC has a Logical
Minimum of 0 and a Logical Maximum of 1 (par. 3.4.1.3).

As the In Range usage is a bit quantity, the value can't be outside
the Logical Minimum and Maximum and therefore can't be in an invalid
state.

Now the inRange boolean value properly changes.
The pointer still moves to the upper left corner when the pen is out
of range, though. Maybe the input_server add-on doesn't use this value?

Change-Id: Idf511ac237158e90eb2e8f01422757655a7eea3a
Reviewed-on: https://review.haiku-os.org/c/1449
Reviewed-by: waddlesplash <waddlesplash@xxxxxxxxx>
Reviewed-by: Stephan Aßmus <superstippi@xxxxxx>

----------------------------------------------------------------------------

diff --git a/src/add-ons/kernel/drivers/input/usb_hid/TabletProtocolHandler.cpp 
b/src/add-ons/kernel/drivers/input/usb_hid/TabletProtocolHandler.cpp
index d6c02b2160..af67fa33f9 100644
--- a/src/add-ons/kernel/drivers/input/usb_hid/TabletProtocolHandler.cpp
+++ b/src/add-ons/kernel/drivers/input/usb_hid/TabletProtocolHandler.cpp
@@ -289,8 +289,8 @@ TabletProtocolHandler::_ReadReport(void *buffer, uint32 
*cookie)
                yTilt = fYTilt->ScaledFloatData();
 
        bool inRange = true;
-       if (fRange != NULL)
-               inRange = fRange->Extract() == B_OK && fRange->Valid();
+       if (fRange != NULL && fRange->Extract() == B_OK && fRange->Valid())
+               inRange = fRange->Data() & 1 != 0;
 
        bool eraser = false;
        if (fEraser != NULL && fEraser->Extract() == B_OK && fEraser->Valid())

############################################################################

Revision:    hrev53119
Commit:      72f7f7d976c5f9c7c956a0e512c2766b2f5fb180
URL:         https://git.haiku-os.org/haiku/commit/?id=72f7f7d976c5
Author:      Jeroen Oortwijn <oortwijn@xxxxxxxxx>
Date:        Wed Aug 26 16:16:53 2015 UTC
Committer:   Stephan Aßmus <superstippi@xxxxxx>
Commit-Date: Tue May 14 07:24:09 2019 UTC

USB_hid.h: Add Report Type constants

From "Device Class Definition for Human Interface Devices (HID)
Ver. 1.11", par. 7.2.1, page 51.

Change-Id: I4628f8ca940758aaf4a09290e9fa407d30374e7a
Reviewed-on: https://review.haiku-os.org/c/1450
Reviewed-by: waddlesplash <waddlesplash@xxxxxxxxx>

----------------------------------------------------------------------------

diff --git a/headers/os/drivers/usb/USB_hid.h b/headers/os/drivers/usb/USB_hid.h
index f39c65fa90..fec5be3f3e 100644
--- a/headers/os/drivers/usb/USB_hid.h
+++ b/headers/os/drivers/usb/USB_hid.h
@@ -82,6 +82,13 @@ enum {
        B_USB_REQUEST_HID_SET_PROTOCOL
 };
 
+// HID Class-specific requests report types
+enum {
+       B_USB_REQUEST_HID_INPUT_REPORT = 0x01,
+       B_USB_REQUEST_HID_OUTPUT_REPORT,
+       B_USB_REQUEST_HID_FEATURE_REPORT
+};
+
 // HID Usage Pages
 enum {
        B_HID_USAGE_PAGE_GENERIC_DESKTOP = 0x1,


Other related posts:

  • » [haiku-commits] haiku: hrev53119 - src/add-ons/input_server/devices/tablet src/add-ons/kernel/drivers/input/usb_hid headers/os/drivers/usb - Stephan Aßmus