[PATCH libinput 03/13] tablet: reshuffle the event sending code

Peter Hutterer peter.hutterer at who-t.net
Thu Mar 9 11:06:47 UTC 2017


The current code modifies a bit of state inside the proximity_tip_down
function which makes for confusing reading. Clean this up by having a bunch of
helper functions for the various events.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-tablet.c | 231 +++++++++++++++++++++++++++++++++--------------------
 1 file changed, 143 insertions(+), 88 deletions(-)

diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
index 51f11dc..74b42e8 100644
--- a/src/evdev-tablet.c
+++ b/src/evdev-tablet.c
@@ -543,8 +543,10 @@ tablet_check_notify_axes(struct tablet_dispatch *tablet,
 	const char tmp[sizeof(tablet->changed_axes)] = {0};
 	struct device_coords delta;
 
-	if (memcmp(tmp, tablet->changed_axes, sizeof(tmp)) == 0)
+	if (memcmp(tmp, tablet->changed_axes, sizeof(tmp)) == 0) {
+		*axes_out = tablet->axes;
 		return false;
+	}
 
 	tablet_handle_xy(tablet, device, &axes.point, &delta);
 	axes.pressure = tablet_handle_pressure(tablet, device, tool);
@@ -1270,84 +1272,172 @@ tablet_update_proximity_state(struct tablet_dispatch *tablet,
 	tablet_set_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY);
 }
 
-static void
-tablet_send_axis_proximity_tip_down_events(struct tablet_dispatch *tablet,
-					   struct evdev_device *device,
-					   struct libinput_tablet_tool *tool,
-					   uint64_t time)
+static inline bool
+tablet_send_proximity_in(struct tablet_dispatch *tablet,
+			 struct libinput_tablet_tool *tool,
+			 struct evdev_device *device,
+			 const struct tablet_axes *axes,
+			 uint64_t time)
 {
-	struct tablet_axes axes = {0};
+	if (!tablet_has_status(tablet, TABLET_TOOL_ENTERING_PROXIMITY))
+		return false;
 
-	if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) {
-		/* Tool is leaving proximity, we can't rely on the last axis
-		 * information (it'll be mostly 0), so we just get the
-		 * current state and skip over updating the axes.
-		 */
-		axes = tablet->axes;
+	tablet_notify_proximity(&device->base,
+				time,
+				tool,
+				LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN,
+				tablet->changed_axes,
+				axes);
+	tablet_unset_status(tablet, TABLET_TOOL_ENTERING_PROXIMITY);
+	tablet_unset_status(tablet, TABLET_AXES_UPDATED);
 
-		/* Dont' send an axis event, but we may have a tip event
-		 * update */
-		tablet_unset_status(tablet, TABLET_AXES_UPDATED);
-	} else if (!tablet_check_notify_axes(tablet,
-					     device,
-					     tool,
-					     &axes,
-					     time)) {
-		goto out;
-	}
+	return true;
+}
 
-	if (tablet_has_status(tablet, TABLET_TOOL_ENTERING_PROXIMITY)) {
-		tablet_notify_proximity(&device->base,
-					time,
-					tool,
-					LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN,
-					tablet->changed_axes,
-					&axes);
-		tablet_unset_status(tablet, TABLET_TOOL_ENTERING_PROXIMITY);
-		tablet_unset_status(tablet, TABLET_AXES_UPDATED);
-	}
+static inline bool
+tablet_send_proximity_out(struct tablet_dispatch *tablet,
+			 struct libinput_tablet_tool *tool,
+			 struct evdev_device *device,
+			 const struct tablet_axes *axes,
+			 uint64_t time)
+{
+	if (!tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY))
+		return false;
+
+	tablet_notify_proximity(&device->base,
+				time,
+				tool,
+				LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_OUT,
+				tablet->changed_axes,
+				axes);
+
+	tablet_set_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY);
+	tablet_unset_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY);
 
+	return true;
+}
+
+static inline bool
+tablet_send_tip(struct tablet_dispatch *tablet,
+		struct libinput_tablet_tool *tool,
+		struct evdev_device *device,
+		const struct tablet_axes *axes,
+		uint64_t time)
+{
 	if (tablet_has_status(tablet, TABLET_TOOL_ENTERING_CONTACT)) {
 		tablet_notify_tip(&device->base,
 				  time,
 				  tool,
 				  LIBINPUT_TABLET_TOOL_TIP_DOWN,
 				  tablet->changed_axes,
-				  &tablet->axes);
+				  axes);
 		tablet_unset_status(tablet, TABLET_AXES_UPDATED);
 		tablet_unset_status(tablet, TABLET_TOOL_ENTERING_CONTACT);
 		tablet_set_status(tablet, TABLET_TOOL_IN_CONTACT);
-	} else if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_CONTACT)) {
+		return true;
+	}
+
+	if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_CONTACT)) {
 		tablet_notify_tip(&device->base,
 				  time,
 				  tool,
 				  LIBINPUT_TABLET_TOOL_TIP_UP,
 				  tablet->changed_axes,
-				  &tablet->axes);
+				  axes);
 		tablet_unset_status(tablet, TABLET_AXES_UPDATED);
 		tablet_unset_status(tablet, TABLET_TOOL_LEAVING_CONTACT);
 		tablet_unset_status(tablet, TABLET_TOOL_IN_CONTACT);
-	} else if (tablet_has_status(tablet, TABLET_AXES_UPDATED)) {
-		enum libinput_tablet_tool_tip_state tip_state;
-
-		if (tablet_has_status(tablet,
-				      TABLET_TOOL_IN_CONTACT))
-			tip_state = LIBINPUT_TABLET_TOOL_TIP_DOWN;
-		else
-			tip_state = LIBINPUT_TABLET_TOOL_TIP_UP;
-
-		tablet_notify_axis(&device->base,
-				   time,
-				   tool,
-				   tip_state,
-				   tablet->changed_axes,
-				   &axes);
+		return true;
+	}
+
+	return false;
+}
+
+static inline void
+tablet_send_axes(struct tablet_dispatch *tablet,
+		 struct libinput_tablet_tool *tool,
+		 struct evdev_device *device,
+		 const struct tablet_axes *axes,
+		 uint64_t time)
+{
+	enum libinput_tablet_tool_tip_state tip_state;
+
+	if (!tablet_has_status(tablet, TABLET_AXES_UPDATED))
+		return;
+
+	if (tablet_has_status(tablet,
+			      TABLET_TOOL_IN_CONTACT))
+		tip_state = LIBINPUT_TABLET_TOOL_TIP_DOWN;
+	else
+		tip_state = LIBINPUT_TABLET_TOOL_TIP_UP;
+
+	tablet_notify_axis(&device->base,
+			   time,
+			   tool,
+			   tip_state,
+			   tablet->changed_axes,
+			   axes);
+	tablet_unset_status(tablet, TABLET_AXES_UPDATED);
+}
+
+static inline void
+tablet_send_buttons(struct tablet_dispatch *tablet,
+		    struct libinput_tablet_tool *tool,
+		    struct evdev_device *device,
+		    uint64_t time)
+{
+	if (tablet_has_status(tablet, TABLET_BUTTONS_RELEASED)) {
+		tablet_notify_buttons(tablet,
+				      device,
+				      time,
+				      tool,
+				      LIBINPUT_BUTTON_STATE_RELEASED);
+		tablet_unset_status(tablet, TABLET_BUTTONS_RELEASED);
+	}
+
+	if (tablet_has_status(tablet, TABLET_BUTTONS_PRESSED)) {
+		tablet_notify_buttons(tablet,
+				      device,
+				      time,
+				      tool,
+				      LIBINPUT_BUTTON_STATE_PRESSED);
+		tablet_unset_status(tablet, TABLET_BUTTONS_PRESSED);
+	}
+}
+
+static void
+tablet_send_events(struct tablet_dispatch *tablet,
+		   struct libinput_tablet_tool *tool,
+		   struct evdev_device *device,
+		   uint64_t time)
+{
+	struct tablet_axes axes = {0};
+
+	if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) {
+		/* Tool is leaving proximity, we can't rely on the last axis
+		 * information (it'll be mostly 0), so we just get the
+		 * current state and skip over updating the axes.
+		 */
+		axes = tablet->axes;
+
+		/* Dont' send an axis event, but we may have a tip event
+		 * update */
 		tablet_unset_status(tablet, TABLET_AXES_UPDATED);
+	} else {
+		tablet_check_notify_axes(tablet, device, tool, &axes, time);
 	}
 
-out:
+	tablet_send_proximity_in(tablet, tool, device, &axes, time);
+	if (!tablet_send_tip(tablet, tool, device, &axes, time))
+		tablet_send_axes(tablet, tool, device, &axes, time);
+
 	memset(tablet->changed_axes, 0, sizeof(tablet->changed_axes));
 	tablet_unset_status(tablet, TABLET_TOOL_ENTERING_CONTACT);
+
+	tablet_send_buttons(tablet, tool, device, time);
+
+	if (tablet_send_proximity_out(tablet, tool, device, &axes, time))
+		tablet_change_to_left_handed(device);
 }
 
 static void
@@ -1390,42 +1480,7 @@ tablet_flush(struct tablet_dispatch *tablet,
 		sanitize_tablet_axes(tablet, tool);
 	}
 
-	tablet_send_axis_proximity_tip_down_events(tablet,
-						   device,
-						   tool,
-						   time);
-
-	if (tablet_has_status(tablet, TABLET_BUTTONS_RELEASED)) {
-		tablet_notify_buttons(tablet,
-				      device,
-				      time,
-				      tool,
-				      LIBINPUT_BUTTON_STATE_RELEASED);
-		tablet_unset_status(tablet, TABLET_BUTTONS_RELEASED);
-	}
-
-	if (tablet_has_status(tablet, TABLET_BUTTONS_PRESSED)) {
-		tablet_notify_buttons(tablet,
-				      device,
-				      time,
-				      tool,
-				      LIBINPUT_BUTTON_STATE_PRESSED);
-		tablet_unset_status(tablet, TABLET_BUTTONS_PRESSED);
-	}
-
-	if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) {
-		tablet_notify_proximity(&device->base,
-					time,
-					tool,
-					LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_OUT,
-					tablet->changed_axes,
-					&tablet->axes);
-
-		tablet_set_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY);
-		tablet_unset_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY);
-
-		tablet_change_to_left_handed(device);
-	}
+	tablet_send_events(tablet, tool, device, time);
 }
 
 static inline void
-- 
2.9.3



More information about the wayland-devel mailing list