Re: [PATCH libinput 17/24] tablet: Emit axis events on distance/pressure changes

2014-04-27 Thread Peter Hutterer
On Mon, Apr 21, 2014 at 07:11:26PM +0200, Carlos Garnacho wrote:
 Those have been made mutually exclusive, to make sure only one or the
 other is notified when there is some uncertainty from the device.
 
 Signed-off-by: Carlos Garnacho carl...@gnome.org
 ---
  src/evdev-tablet.c | 29 +
  1 file changed, 29 insertions(+)
 
 diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
 index cc55c74..1054f5a 100644
 --- a/src/evdev-tablet.c
 +++ b/src/evdev-tablet.c
 @@ -216,6 +216,23 @@ tablet_process_misc(struct tablet_dispatch *tablet,
  }
  
  static void
 +sanitize_tablet_axes(struct tablet_dispatch *tablet)
 +{
 + struct axis_info *distance, *pressure;
 +
 + distance = tablet_get_axis(tablet, ABS_DISTANCE);
 + pressure = tablet_get_axis(tablet, ABS_PRESSURE);
 +
 + if (distance  pressure  distance-updated  pressure-updated) {
 + /* Keep distance and pressure mutually exclusive */
 + distance-updated = 0;
 + } else if (pressure  pressure-updated 
 +!tablet_has_status(tablet, TABLET_HAS_CONTACT)) {
 + pressure-updated = 0;
 + }

what about an event where you go to distance 0 and pressure N in the same
SYN_REPORT? You need to check for != 0 on both axes, not just whether they
got updated.

Cheers,
   Peter

 +}
 +
 +static void
  tablet_check_notify_tool(struct tablet_dispatch *tablet,
struct evdev_device *device,
uint32_t time,
 @@ -360,6 +377,8 @@ tablet_flush(struct tablet_dispatch *tablet,
   tablet_notify_buttons(tablet, device, time, 0);
  
   if (tablet-state.tool != LIBINPUT_TOOL_NONE) {
 + sanitize_tablet_axes(tablet);
 +
   if (tablet_has_status(tablet, TABLET_UPDATED)) {
   /* FIXME: apply hysteresis, calibration */
   x = li_fixed_from_int(device-abs.x);
 @@ -426,6 +445,16 @@ static void
  tablet_init_axes(struct tablet_dispatch *tablet,
struct evdev_device *device)
  {
 + if (libevdev_has_event_code(device-evdev, EV_ABS, ABS_DISTANCE)) {
 + tablet_add_axis(tablet, device, ABS_DISTANCE,
 + LIBINPUT_POINTER_AXIS_DISTANCE);
 + }
 +
 + if (libevdev_has_event_code(device-evdev, EV_ABS, ABS_PRESSURE)) {
 + tablet_add_axis(tablet, device, ABS_PRESSURE,
 + LIBINPUT_POINTER_AXIS_PRESSURE);
 + }
 +
   if (libevdev_has_event_code(device-evdev, EV_ABS, ABS_TILT_X) 
   libevdev_has_event_code(device-evdev, EV_ABS, ABS_TILT_Y)) {
   tablet_add_axis(tablet, device, ABS_TILT_X,
 -- 
 1.9.0
 
 ___
 wayland-devel mailing list
 wayland-devel@lists.freedesktop.org
 http://lists.freedesktop.org/mailman/listinfo/wayland-devel
 
___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel


[PATCH libinput 17/24] tablet: Emit axis events on distance/pressure changes

2014-04-21 Thread Carlos Garnacho
Those have been made mutually exclusive, to make sure only one or the
other is notified when there is some uncertainty from the device.

Signed-off-by: Carlos Garnacho carl...@gnome.org
---
 src/evdev-tablet.c | 29 +
 1 file changed, 29 insertions(+)

diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
index cc55c74..1054f5a 100644
--- a/src/evdev-tablet.c
+++ b/src/evdev-tablet.c
@@ -216,6 +216,23 @@ tablet_process_misc(struct tablet_dispatch *tablet,
 }
 
 static void
+sanitize_tablet_axes(struct tablet_dispatch *tablet)
+{
+   struct axis_info *distance, *pressure;
+
+   distance = tablet_get_axis(tablet, ABS_DISTANCE);
+   pressure = tablet_get_axis(tablet, ABS_PRESSURE);
+
+   if (distance  pressure  distance-updated  pressure-updated) {
+   /* Keep distance and pressure mutually exclusive */
+   distance-updated = 0;
+   } else if (pressure  pressure-updated 
+  !tablet_has_status(tablet, TABLET_HAS_CONTACT)) {
+   pressure-updated = 0;
+   }
+}
+
+static void
 tablet_check_notify_tool(struct tablet_dispatch *tablet,
 struct evdev_device *device,
 uint32_t time,
@@ -360,6 +377,8 @@ tablet_flush(struct tablet_dispatch *tablet,
tablet_notify_buttons(tablet, device, time, 0);
 
if (tablet-state.tool != LIBINPUT_TOOL_NONE) {
+   sanitize_tablet_axes(tablet);
+
if (tablet_has_status(tablet, TABLET_UPDATED)) {
/* FIXME: apply hysteresis, calibration */
x = li_fixed_from_int(device-abs.x);
@@ -426,6 +445,16 @@ static void
 tablet_init_axes(struct tablet_dispatch *tablet,
 struct evdev_device *device)
 {
+   if (libevdev_has_event_code(device-evdev, EV_ABS, ABS_DISTANCE)) {
+   tablet_add_axis(tablet, device, ABS_DISTANCE,
+   LIBINPUT_POINTER_AXIS_DISTANCE);
+   }
+
+   if (libevdev_has_event_code(device-evdev, EV_ABS, ABS_PRESSURE)) {
+   tablet_add_axis(tablet, device, ABS_PRESSURE,
+   LIBINPUT_POINTER_AXIS_PRESSURE);
+   }
+
if (libevdev_has_event_code(device-evdev, EV_ABS, ABS_TILT_X) 
libevdev_has_event_code(device-evdev, EV_ABS, ABS_TILT_Y)) {
tablet_add_axis(tablet, device, ABS_TILT_X,
-- 
1.9.0

___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel