[PATCH libinput v2 3/3] Change the logging system to be per-context

Peter Hutterer peter.hutterer at who-t.net
Wed Jun 18 21:57:49 PDT 2014


Rather than a single global logging function, make the logging dependent on
the individual context. This way we won't stomp on each other's feet in the
(admittedly unusual) case of having multiple libinput contexts.

The userdata argument to the log handler was dropped. The caller has a ref to
the libinput context now, any userdata can be attached to that context
instead.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-mt-touchpad-buttons.c | 15 +++++--
 src/evdev-mt-touchpad-tap.c     | 13 ++++--
 src/evdev.c                     | 23 +++++++----
 src/libinput-private.h          | 23 +++++++----
 src/libinput.c                  | 48 ++++++++++------------
 src/libinput.h                  | 19 +++++----
 src/path.c                      | 20 +++++++---
 src/timer.c                     |  4 +-
 src/udev-seat.c                 | 17 ++++----
 test/litest.c                   | 13 ++++--
 test/log.c                      | 88 +++++++++++------------------------------
 tools/event-debug.c             | 33 +++++++++-------
 12 files changed, 161 insertions(+), 155 deletions(-)

diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c
index ce48ed0..b86f344 100644
--- a/src/evdev-mt-touchpad-buttons.c
+++ b/src/evdev-mt-touchpad-buttons.c
@@ -452,6 +452,7 @@ tp_button_handle_event(struct tp_dispatch *tp,
 		       enum button_event event,
 		       uint64_t time)
 {
+	struct libinput *libinput = tp->device->base.seat->libinput;
 	enum button_state current = t->button.state;
 
 	switch(t->button.state) {
@@ -485,7 +486,8 @@ tp_button_handle_event(struct tp_dispatch *tp,
 	}
 
 	if (current != t->button.state)
-		log_debug("button state: from %s, event %s to %s\n",
+		log_debug(libinput,
+			  "button state: from %s, event %s to %s\n",
 			  button_state_to_str(current),
 			  button_event_to_str(event),
 			  button_state_to_str(t->button.state));
@@ -538,11 +540,13 @@ tp_process_button(struct tp_dispatch *tp,
 		  const struct input_event *e,
 		  uint64_t time)
 {
+	struct libinput *libinput = tp->device->base.seat->libinput;
 	uint32_t mask = 1 << (e->code - BTN_LEFT);
 
 	/* Ignore other buttons on clickpads */
 	if (tp->buttons.is_clickpad && e->code != BTN_LEFT) {
-		log_bug_kernel("received %s button event on a clickpad\n",
+		log_bug_kernel(libinput,
+			       "received %s button event on a clickpad\n",
 			       libevdev_event_code_get_name(EV_KEY, e->code));
 		return 0;
 	}
@@ -562,6 +566,7 @@ int
 tp_init_buttons(struct tp_dispatch *tp,
 		struct evdev_device *device)
 {
+	struct libinput *libinput = tp->device->base.seat->libinput;
 	struct tp_touch *t;
 	int width, height;
 	double diagonal;
@@ -574,10 +579,12 @@ tp_init_buttons(struct tp_dispatch *tp,
 	if (libevdev_has_event_code(device->evdev, EV_KEY, BTN_MIDDLE) ||
 	    libevdev_has_event_code(device->evdev, EV_KEY, BTN_RIGHT)) {
 		if (tp->buttons.is_clickpad)
-			log_bug_kernel("clickpad advertising right button\n");
+			log_bug_kernel(libinput,
+				       "clickpad advertising right button\n");
 	} else {
 		if (!tp->buttons.is_clickpad)
-			log_bug_kernel("non clickpad without right button?\n");
+			log_bug_kernel(libinput,
+				       "non clickpad without right button?\n");
 	}
 
 	width = abs(device->abs.max_x - device->abs.min_x);
diff --git a/src/evdev-mt-touchpad-tap.c b/src/evdev-mt-touchpad-tap.c
index 34bb0d0..2541218 100644
--- a/src/evdev-mt-touchpad-tap.c
+++ b/src/evdev-mt-touchpad-tap.c
@@ -130,6 +130,7 @@ tp_tap_clear_timer(struct tp_dispatch *tp)
 static void
 tp_tap_idle_handle_event(struct tp_dispatch *tp, enum tap_event event, uint64_t time)
 {
+	struct libinput *libinput = tp->device->base.seat->libinput;
 
 	switch (event) {
 	case TAP_EVENT_TOUCH:
@@ -138,7 +139,8 @@ tp_tap_idle_handle_event(struct tp_dispatch *tp, enum tap_event event, uint64_t
 		break;
 	case TAP_EVENT_RELEASE:
 	case TAP_EVENT_MOTION:
-		log_bug_libinput("invalid event, no fingers are down\n");
+		log_bug_libinput(libinput,
+				 "invalid event, no fingers are down\n");
 		break;
 	case TAP_EVENT_TIMEOUT:
 		break;
@@ -197,11 +199,13 @@ tp_tap_hold_handle_event(struct tp_dispatch *tp, enum tap_event event, uint64_t
 static void
 tp_tap_tapped_handle_event(struct tp_dispatch *tp, enum tap_event event, uint64_t time)
 {
+	struct libinput *libinput = tp->device->base.seat->libinput;
 
 	switch (event) {
 	case TAP_EVENT_MOTION:
 	case TAP_EVENT_RELEASE:
-		log_bug_libinput("invalid event when fingers are up\n");
+		log_bug_libinput(libinput,
+				 "invalid event when fingers are up\n");
 		break;
 	case TAP_EVENT_TOUCH:
 		tp->tap.state = TAP_STATE_DRAGGING_OR_DOUBLETAP;
@@ -426,7 +430,9 @@ tp_tap_dead_handle_event(struct tp_dispatch *tp, enum tap_event event, uint64_t
 static void
 tp_tap_handle_event(struct tp_dispatch *tp, enum tap_event event, uint64_t time)
 {
+	struct libinput *libinput = tp->device->base.seat->libinput;
 	enum tp_tap_state current;
+
 	if (!tp->tap.enabled)
 		return;
 
@@ -477,7 +483,8 @@ tp_tap_handle_event(struct tp_dispatch *tp, enum tap_event event, uint64_t time)
 	if (tp->tap.state == TAP_STATE_IDLE || tp->tap.state == TAP_STATE_DEAD)
 		tp_tap_clear_timer(tp);
 
-	log_debug("tap state: %s → %s → %s\n",
+	log_debug(libinput,
+		  "tap state: %s → %s → %s\n",
 		  tap_state_to_str(current),
 		  tap_event_to_str(event),
 		  tap_state_to_str(tp->tap.state));
diff --git a/src/evdev.c b/src/evdev.c
index 34bd5b7..89f056f 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -110,6 +110,7 @@ evdev_device_transform_y(struct evdev_device *device,
 static void
 evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
 {
+	struct libinput *libinput = device->base.seat->libinput;
 	struct motion_params motion;
 	int32_t cx, cy;
 	double x, y;
@@ -142,7 +143,8 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
 			break;
 
 		if (device->mt.slots[slot].seat_slot != -1) {
-			log_bug_kernel("%s: Driver sent multiple touch down for the "
+			log_bug_kernel(libinput,
+				       "%s: Driver sent multiple touch down for the "
 				       "same slot", device->devnode);
 			break;
 		}
@@ -191,7 +193,8 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
 			break;
 
 		if (device->abs.seat_slot != -1) {
-			log_bug_kernel("%s: Driver sent multiple touch down for the "
+			log_bug_kernel(libinput,
+				       "%s: Driver sent multiple touch down for the "
 				       "same slot", device->devnode);
 			break;
 		}
@@ -586,6 +589,7 @@ configure_pointer_acceleration(struct evdev_device *device)
 static int
 evdev_configure_device(struct evdev_device *device)
 {
+	struct libinput *libinput = device->base.seat->libinput;
 	struct libevdev *evdev = device->evdev;
 	const struct input_absinfo *absinfo;
 	int has_abs, has_rel, has_mt;
@@ -670,7 +674,8 @@ evdev_configure_device(struct evdev_device *device)
 		    !libevdev_has_event_code(evdev, EV_KEY, BTN_TOOL_PEN) &&
 		    (has_abs || has_mt)) {
 			device->dispatch = evdev_mt_touchpad_create(device);
-			log_info("input device '%s', %s is a touchpad\n",
+			log_info(libinput,
+				 "input device '%s', %s is a touchpad\n",
 				 device->devname, device->devnode);
 		}
 		for (i = KEY_ESC; i < KEY_MAX; i++) {
@@ -699,7 +704,8 @@ evdev_configure_device(struct evdev_device *device)
 
 		device->seat_caps |= EVDEV_DEVICE_POINTER;
 
-		log_info("input device '%s', %s is a pointer caps =%s%s%s\n",
+		log_info(libinput,
+			 "input device '%s', %s is a pointer caps =%s%s%s\n",
 			 device->devname, device->devnode,
 			 has_abs ? " absolute-motion" : "",
 			 has_rel ? " relative-motion": "",
@@ -707,12 +713,14 @@ evdev_configure_device(struct evdev_device *device)
 	}
 	if (has_keyboard) {
 		device->seat_caps |= EVDEV_DEVICE_KEYBOARD;
-		log_info("input device '%s', %s is a keyboard\n",
+		log_info(libinput,
+			 "input device '%s', %s is a keyboard\n",
 			 device->devname, device->devnode);
 	}
 	if (has_touch && !has_button) {
 		device->seat_caps |= EVDEV_DEVICE_TOUCH;
-		log_info("input device '%s', %s is a touch device\n",
+		log_info(libinput,
+			 "input device '%s', %s is a touch device\n",
 			 device->devname, device->devnode);
 	}
 
@@ -735,7 +743,8 @@ evdev_device_create(struct libinput_seat *seat,
 	 * read.  mtdev_get() also expects this. */
 	fd = open_restricted(libinput, devnode, O_RDWR | O_NONBLOCK);
 	if (fd < 0) {
-		log_info("opening input device '%s' failed (%s).\n",
+		log_info(libinput,
+			 "opening input device '%s' failed (%s).\n",
 			 devnode, strerror(-fd));
 		return NULL;
 	}
diff --git a/src/libinput-private.h b/src/libinput-private.h
index 4a92fb9..02140c9 100644
--- a/src/libinput-private.h
+++ b/src/libinput-private.h
@@ -56,6 +56,9 @@ struct libinput {
 
 	const struct libinput_interface *interface;
 	const struct libinput_interface_backend *interface_backend;
+
+	libinput_log_handler log_handler;
+	enum libinput_log_priority log_priority;
 	void *user_data;
 };
 
@@ -88,17 +91,21 @@ struct libinput_device {
 typedef void (*libinput_source_dispatch_t)(void *data);
 
 
-#define log_debug(...) log_msg(LIBINPUT_LOG_PRIORITY_DEBUG, __VA_ARGS__)
-#define log_info(...) log_msg(LIBINPUT_LOG_PRIORITY_INFO, __VA_ARGS__)
-#define log_error(...) log_msg(LIBINPUT_LOG_PRIORITY_ERROR, __VA_ARGS__)
-#define log_bug_kernel(...) log_msg(LIBINPUT_LOG_PRIORITY_ERROR, "kernel bug: " __VA_ARGS__)
-#define log_bug_libinput(...) log_msg(LIBINPUT_LOG_PRIORITY_ERROR, "libinput bug: " __VA_ARGS__);
-#define log_bug_client(...) log_msg(LIBINPUT_LOG_PRIORITY_ERROR, "client bug: " __VA_ARGS__);
+#define log_debug(li_, ...) log_msg((li_), LIBINPUT_LOG_PRIORITY_DEBUG, __VA_ARGS__)
+#define log_info(li_, ...) log_msg((li_), LIBINPUT_LOG_PRIORITY_INFO, __VA_ARGS__)
+#define log_error(li_, ...) log_msg((li_), LIBINPUT_LOG_PRIORITY_ERROR, __VA_ARGS__)
+#define log_bug_kernel(li_, ...) log_msg((li_), LIBINPUT_LOG_PRIORITY_ERROR, "kernel bug: " __VA_ARGS__)
+#define log_bug_libinput(li_, ...) log_msg((li_), LIBINPUT_LOG_PRIORITY_ERROR, "libinput bug: " __VA_ARGS__);
+#define log_bug_client(li_, ...) log_msg((li_), LIBINPUT_LOG_PRIORITY_ERROR, "client bug: " __VA_ARGS__);
 
 void
-log_msg(enum libinput_log_priority priority, const char *format, ...);
+log_msg(const struct libinput *libinput,
+	enum libinput_log_priority priority,
+	const char *format, ...);
+
 void
-log_msg_va(enum libinput_log_priority priority,
+log_msg_va(const struct libinput *libinput,
+	   enum libinput_log_priority priority,
 	   const char *format,
 	   va_list args);
 
diff --git a/src/libinput.c b/src/libinput.c
index b6b8130..7c6c6b4 100644
--- a/src/libinput.c
+++ b/src/libinput.c
@@ -81,8 +81,8 @@ struct libinput_event_touch {
 };
 
 static void
-libinput_default_log_func(enum libinput_log_priority priority,
-			  void *data,
+libinput_default_log_func(const struct libinput *libinput,
+			  enum libinput_log_priority priority,
 			  const char *format, va_list args)
 {
 	const char *prefix;
@@ -98,55 +98,47 @@ libinput_default_log_func(enum libinput_log_priority priority,
 	vfprintf(stderr, format, args);
 }
 
-struct log_data {
-	enum libinput_log_priority priority;
-	libinput_log_handler handler;
-	void *user_data;
-};
-
-static struct log_data log_data = {
-	.priority = LIBINPUT_LOG_PRIORITY_ERROR,
-	.handler = libinput_default_log_func,
-	.user_data = NULL,
-};
-
 void
-log_msg_va(enum libinput_log_priority priority,
+log_msg_va(const struct libinput *libinput,
+	   enum libinput_log_priority priority,
 	   const char *format,
 	   va_list args)
 {
-	if (log_data.handler && log_data.priority <= priority)
-		log_data.handler(priority, log_data.user_data, format, args);
+	if (libinput->log_handler &&
+	    libinput->log_priority <= priority)
+		libinput->log_handler(libinput, priority, format, args);
 }
 
 void
-log_msg(enum libinput_log_priority priority, const char *format, ...)
+log_msg(const struct libinput *libinput,
+	enum libinput_log_priority priority,
+	const char *format, ...)
 {
 	va_list args;
 
 	va_start(args, format);
-	log_msg_va(priority, format, args);
+	log_msg_va(libinput, priority, format, args);
 	va_end(args);
 }
 
 LIBINPUT_EXPORT void
-libinput_log_set_priority(enum libinput_log_priority priority)
+libinput_log_set_priority(struct libinput *libinput,
+			  enum libinput_log_priority priority)
 {
-	log_data.priority = priority;
+	libinput->log_priority = priority;
 }
 
 LIBINPUT_EXPORT enum libinput_log_priority
-libinput_log_get_priority(void)
+libinput_log_get_priority(const struct libinput *libinput)
 {
-	return log_data.priority;
+	return libinput->log_priority;
 }
 
 LIBINPUT_EXPORT void
-libinput_log_set_handler(libinput_log_handler log_handler,
-			 void *user_data)
+libinput_log_set_handler(struct libinput *libinput,
+			 libinput_log_handler log_handler)
 {
-	log_data.handler = log_handler;
-	log_data.user_data = user_data;
+	libinput->log_handler = log_handler;
 }
 
 static void
@@ -487,6 +479,8 @@ libinput_init(struct libinput *libinput,
 		return -1;
 	}
 
+	libinput->log_handler = libinput_default_log_func;
+	libinput->log_priority = LIBINPUT_LOG_PRIORITY_ERROR;
 	libinput->interface = interface;
 	libinput->interface_backend = interface_backend;
 	libinput->user_data = user_data;
diff --git a/src/libinput.h b/src/libinput.h
index 02df43f..9425556 100644
--- a/src/libinput.h
+++ b/src/libinput.h
@@ -1032,13 +1032,15 @@ libinput_destroy(struct libinput *libinput);
  *
  * The default log priority is LIBINPUT_LOG_PRIORITY_ERROR.
  *
+ * @param libinput A previously initialized libinput context
  * @param priority The minimum priority of log messages to print.
  *
  * @see libinput_log_set_handler
  * @see libinput_log_get_priority
  */
 void
-libinput_log_set_priority(enum libinput_log_priority priority);
+libinput_log_set_priority(struct libinput *libinput,
+			  enum libinput_log_priority priority);
 
 /**
  * @ingroup base
@@ -1048,30 +1050,30 @@ libinput_log_set_priority(enum libinput_log_priority priority);
  *
  * The default log priority is LIBINPUT_LOG_PRIORITY_ERROR.
  *
+ * @param libinput A previously initialized libinput context
  * @return The minimum priority of log messages to print.
  *
  * @see libinput_log_set_handler
  * @see libinput_log_set_priority
  */
 enum libinput_log_priority
-libinput_log_get_priority(void);
+libinput_log_get_priority(const struct libinput *libinput);
 
 /**
  * @ingroup base
  *
  * Log handler type for custom logging.
  *
+ * @param libinput The libinput context
  * @param priority The priority of the current message
- * @param user_data Caller-specific data pointer as previously passed into
- * libinput_log_set_handler()
  * @param format Message format in printf-style
  * @param args Message arguments
  *
  * @see libinput_set_log_priority
  * @see libinput_log_set_handler
  */
-typedef void (*libinput_log_handler)(enum libinput_log_priority priority,
-				     void *user_data,
+typedef void (*libinput_log_handler)(const struct libinput *libinput,
+				     enum libinput_log_priority priority,
 				     const char *format, va_list args)
 	   LIBINPUT_ATTRIBUTE_PRINTF(3, 0);
 
@@ -1084,6 +1086,7 @@ typedef void (*libinput_log_handler)(enum libinput_log_priority priority,
  *
  * The default log handler prints to stderr.
  *
+ * @param libinput A previously initialized libinput context
  * @param log_handler The log handler for library messages.
  * @param user_data Caller-specific data pointer, passed into the log
  * handler.
@@ -1091,8 +1094,8 @@ typedef void (*libinput_log_handler)(enum libinput_log_priority priority,
  * @see libinput_log_set_handler
  */
 void
-libinput_log_set_handler(libinput_log_handler log_handler,
-			 void *user_data);
+libinput_log_set_handler(struct libinput *libinput,
+			 libinput_log_handler log_handler);
 
 /**
  * @defgroup seat Initialization and manipulation of seats
diff --git a/src/path.c b/src/path.c
index 27e5ad6..e9c0ee8 100644
--- a/src/path.c
+++ b/src/path.c
@@ -160,7 +160,9 @@ path_device_enable(struct path_input *input, const char *devnode)
 
 	if (path_get_udev_properties(devnode, &sysname,
 				     &seat_name, &seat_logical_name) == -1) {
-		log_info("failed to obtain sysname for device '%s'.\n", devnode);
+		log_info(&input->base,
+			 "failed to obtain sysname for device '%s'.\n",
+			 devnode);
 		return NULL;
 	}
 
@@ -171,7 +173,9 @@ path_device_enable(struct path_input *input, const char *devnode)
 	} else {
 		seat = path_seat_create(input, seat_name, seat_logical_name);
 		if (!seat) {
-			log_info("failed to create seat for device '%s'.\n", devnode);
+			log_info(&input->base,
+				 "failed to create seat for device '%s'.\n",
+				 devnode);
 			goto out;
 		}
 	}
@@ -181,10 +185,14 @@ path_device_enable(struct path_input *input, const char *devnode)
 
 	if (device == EVDEV_UNHANDLED_DEVICE) {
 		device = NULL;
-		log_info("not using input device '%s'.\n", devnode);
+		log_info(&input->base,
+			 "not using input device '%s'.\n",
+			 devnode);
 		goto out;
 	} else if (device == NULL) {
-		log_info("failed to create input device '%s'.\n", devnode);
+		log_info(&input->base,
+			 "failed to create input device '%s'.\n",
+			 devnode);
 		goto out;
 	}
 
@@ -264,7 +272,7 @@ libinput_path_add_device(struct libinput *libinput,
 	struct libinput_device *device;
 
 	if (libinput->interface_backend != &interface_backend) {
-		log_bug_client("Mismatching backends.\n");
+		log_bug_client(libinput, "Mismatching backends.\n");
 		return NULL;
 	}
 
@@ -301,7 +309,7 @@ libinput_path_remove_device(struct libinput_device *device)
 	struct path_device *dev;
 
 	if (libinput->interface_backend != &interface_backend) {
-		log_bug_client("Mismatching backends.\n");
+		log_bug_client(libinput, "Mismatching backends.\n");
 		return;
 	}
 
diff --git a/src/timer.c b/src/timer.c
index 65fdd17..f546185 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -59,7 +59,7 @@ libinput_timer_arm_timer_fd(struct libinput *libinput)
 
 	r = timerfd_settime(libinput->timer.fd, TFD_TIMER_ABSTIME, &its, NULL);
 	if (r)
-		log_error("timerfd_settime error: %s\n", strerror(errno));
+		log_error(libinput, "timerfd_settime error: %s\n", strerror(errno));
 }
 
 void
@@ -96,7 +96,7 @@ libinput_timer_handler(void *data)
 
 	r = clock_gettime(CLOCK_MONOTONIC, &ts);
 	if (r) {
-		log_error("clock_gettime error: %s\n", strerror(errno));
+		log_error(libinput, "clock_gettime error: %s\n", strerror(errno));
 		return;
 	}
 
diff --git a/src/udev-seat.c b/src/udev-seat.c
index a60071b..e9fc97d 100644
--- a/src/udev-seat.c
+++ b/src/udev-seat.c
@@ -80,10 +80,10 @@ device_added(struct udev_device *udev_device, struct udev_input *input)
 	libinput_seat_unref(&seat->base);
 
 	if (device == EVDEV_UNHANDLED_DEVICE) {
-		log_info("not using input device '%s'.\n", devnode);
+		log_info(&input->base, "not using input device '%s'.\n", devnode);
 		return 0;
 	} else if (device == NULL) {
-		log_info("failed to create input device '%s'.\n", devnode);
+		log_info(&input->base, "failed to create input device '%s'.\n", devnode);
 		return 0;
 	}
 
@@ -100,7 +100,8 @@ device_added(struct udev_device *udev_device, struct udev_input *input)
 					 &device->abs.calibration[4],
 					 &device->abs.calibration[5]) == 6) {
 		device->abs.apply_calibration = 1;
-		log_info("Applying calibration: %f %f %f %f %f %f\n",
+		log_info(&input->base,
+			 "Applying calibration: %f %f %f %f %f %f\n",
 			 device->abs.calibration[0],
 			 device->abs.calibration[1],
 			 device->abs.calibration[2],
@@ -128,7 +129,8 @@ device_removed(struct udev_device *udev_device, struct udev_input *input)
 		list_for_each_safe(device, next,
 				   &seat->base.devices_list, base.link) {
 			if (!strcmp(device->devnode, devnode)) {
-				log_info("input device %s, %s removed\n",
+				log_info(&input->base,
+					 "input device %s, %s removed\n",
 					 device->devname, device->devnode);
 				evdev_device_remove(device);
 				break;
@@ -243,7 +245,8 @@ udev_input_enable(struct libinput *libinput)
 
 	input->udev_monitor = udev_monitor_new_from_netlink(udev, "udev");
 	if (!input->udev_monitor) {
-		log_info("udev: failed to create the udev monitor\n");
+		log_info(libinput,
+			 "udev: failed to create the udev monitor\n");
 		return -1;
 	}
 
@@ -251,7 +254,7 @@ udev_input_enable(struct libinput *libinput)
 			"input", NULL);
 
 	if (udev_monitor_enable_receiving(input->udev_monitor)) {
-		log_info("udev: failed to bind the udev monitor\n");
+		log_info(libinput, "udev: failed to bind the udev monitor\n");
 		udev_monitor_unref(input->udev_monitor);
 		input->udev_monitor = NULL;
 		return -1;
@@ -367,7 +370,7 @@ libinput_udev_set_seat(struct libinput *libinput,
 		return -1;
 
 	if (libinput->interface_backend != &interface_backend) {
-		log_bug_client("Mismatching backends.\n");
+		log_bug_client(libinput, "Mismatching backends.\n");
 		return -1;
 	}
 
diff --git a/test/litest.c b/test/litest.c
index d3f8f0d..caf58f6 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -44,6 +44,7 @@
 #include "libinput-util.h"
 
 static int in_debugger = -1;
+static int verbose = 0;
 
 struct test {
 	struct list node;
@@ -250,8 +251,8 @@ litest_list_tests(struct list *tests)
 }
 
 static void
-litest_log_handler(enum libinput_log_priority pri,
-		   void *user_data,
+litest_log_handler(const struct libinput *libinput,
+		   enum libinput_log_priority pri,
 		   const char *format,
 		   va_list args)
 {
@@ -321,8 +322,7 @@ litest_run(int argc, char **argv) {
 				litest_list_tests(&all_tests);
 				return 0;
 			case 'v':
-				libinput_log_set_priority(LIBINPUT_LOG_PRIORITY_DEBUG);
-				libinput_log_set_handler(litest_log_handler, NULL);
+				verbose = 1;
 				break;
 			default:
 				fprintf(stderr, "usage: %s [--list]\n", argv[0]);
@@ -482,6 +482,11 @@ litest_create_context(void)
 	struct libinput *libinput =
 		libinput_path_create_context(&interface, NULL);
 	ck_assert_notnull(libinput);
+
+	libinput_log_set_handler(libinput, litest_log_handler);
+	if (verbose)
+		libinput_log_set_priority(libinput, LIBINPUT_LOG_PRIORITY_DEBUG);
+
 	return libinput;
 }
 
diff --git a/test/log.c b/test/log.c
index a281820..25b33ef 100644
--- a/test/log.c
+++ b/test/log.c
@@ -32,7 +32,7 @@
 #include "litest.h"
 
 static int log_handler_called;
-static void *log_handler_userdata;
+static struct libinput *log_handler_context;
 
 static int open_restricted(const char *path, int flags, void *data)
 {
@@ -51,56 +51,41 @@ const struct libinput_interface simple_interface = {
 };
 
 static void
-simple_log_handler(enum libinput_log_priority priority,
-		   void *userdata,
+simple_log_handler(const struct libinput *libinput,
+		   enum libinput_log_priority priority,
 		   const char *format,
 		   va_list args)
 {
 	log_handler_called++;
-	ck_assert(userdata == log_handler_userdata);
+	if (log_handler_context)
+		ck_assert(libinput == log_handler_context);
 	ck_assert(format != NULL);
 }
 
 START_TEST(log_default_priority)
 {
 	enum libinput_log_priority pri;
+	struct libinput *li;
 
-	pri = libinput_log_get_priority();
+	li = libinput_path_create_context(&simple_interface, NULL);
+	pri = libinput_log_get_priority(li);
 
 	ck_assert_int_eq(pri, LIBINPUT_LOG_PRIORITY_ERROR);
+
+	libinput_destroy(li);
 }
 END_TEST
 
 START_TEST(log_handler_invoked)
 {
 	struct libinput *li;
-	enum libinput_log_priority pri = libinput_log_get_priority();
-
-	libinput_log_set_priority(LIBINPUT_LOG_PRIORITY_DEBUG);
-	libinput_log_set_handler(simple_log_handler, NULL);
-	log_handler_userdata = NULL;
 
 	li = libinput_path_create_context(&simple_interface, NULL);
-	libinput_path_add_device(li, "/tmp");
-
-	ck_assert_int_gt(log_handler_called, 0);
-	log_handler_called = 0;
 
-	libinput_destroy(li);
-	libinput_log_set_priority(pri);
-}
-END_TEST
-
-START_TEST(log_userdata_NULL)
-{
-	struct libinput *li;
-	enum libinput_log_priority pri = libinput_log_get_priority();
-
-	libinput_log_set_priority(LIBINPUT_LOG_PRIORITY_DEBUG);
-	libinput_log_set_handler(simple_log_handler, NULL);
-	log_handler_userdata = NULL;
+	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_DEBUG);
+	libinput_log_set_handler(li, simple_log_handler);
+	log_handler_context = li;
 
-	li = libinput_path_create_context(&simple_interface, NULL);
 	libinput_path_add_device(li, "/tmp");
 
 	ck_assert_int_gt(log_handler_called, 0);
@@ -108,73 +93,48 @@ START_TEST(log_userdata_NULL)
 
 	libinput_destroy(li);
 
-	libinput_log_set_priority(pri);
-}
-END_TEST
-
-START_TEST(log_userdata)
-{
-	struct libinput *li;
-	enum libinput_log_priority pri = libinput_log_get_priority();
-
-	libinput_log_set_priority(LIBINPUT_LOG_PRIORITY_DEBUG);
-	libinput_log_set_handler(simple_log_handler, &li);
-	log_handler_userdata = &li;
-
-	li = libinput_path_create_context(&simple_interface, NULL);
-	libinput_path_add_device(li, "/tmp");
-
-	ck_assert_int_gt(log_handler_called, 0);
-	log_handler_called = 0;
-
-	libinput_destroy(li);
-	libinput_log_set_priority(pri);
+	log_handler_context = NULL;
 }
 END_TEST
 
 START_TEST(log_handler_NULL)
 {
 	struct libinput *li;
-	enum libinput_log_priority pri = libinput_log_get_priority();
-
-	libinput_log_set_priority(LIBINPUT_LOG_PRIORITY_DEBUG);
-	libinput_log_set_handler(NULL, NULL);
-	log_handler_userdata = NULL;
 
 	li = libinput_path_create_context(&simple_interface, NULL);
+	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_DEBUG);
+	libinput_log_set_handler(li, NULL);
+
 	libinput_path_add_device(li, "/tmp");
 
 	ck_assert_int_eq(log_handler_called, 0);
 	log_handler_called = 0;
-	libinput_log_set_handler(simple_log_handler, NULL);
 
 	libinput_destroy(li);
-	libinput_log_set_priority(pri);
 }
 END_TEST
 
 START_TEST(log_priority)
 {
 	struct libinput *li;
-	enum libinput_log_priority pri = libinput_log_get_priority();
-
-	libinput_log_set_priority(LIBINPUT_LOG_PRIORITY_ERROR);
-	libinput_log_set_handler(simple_log_handler, NULL);
-	log_handler_userdata = NULL;
 
 	li = libinput_path_create_context(&simple_interface, NULL);
+	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_ERROR);
+	libinput_log_set_handler(li, simple_log_handler);
+	log_handler_context = li;
+
 	libinput_path_add_device(li, "/tmp");
 
 	ck_assert_int_eq(log_handler_called, 0);
 
-	libinput_log_set_priority(LIBINPUT_LOG_PRIORITY_INFO);
+	libinput_log_set_priority(li, LIBINPUT_LOG_PRIORITY_INFO);
 	libinput_path_add_device(li, "/tmp");
 	ck_assert_int_gt(log_handler_called, 0);
 
 	log_handler_called = 0;
 
 	libinput_destroy(li);
-	libinput_log_set_priority(pri);
+	log_handler_context = NULL;
 }
 END_TEST
 
@@ -182,8 +142,6 @@ int main (int argc, char **argv) {
 	litest_add_no_device("log:defaults", log_default_priority);
 	litest_add_no_device("log:logging", log_handler_invoked);
 	litest_add_no_device("log:logging", log_handler_NULL);
-	litest_add_no_device("log:logging", log_userdata);
-	litest_add_no_device("log:logging", log_userdata_NULL);
 	litest_add_no_device("log:logging", log_priority);
 
 	return litest_run(argc, argv);
diff --git a/tools/event-debug.c b/tools/event-debug.c
index c81ca55..afca52b 100644
--- a/tools/event-debug.c
+++ b/tools/event-debug.c
@@ -131,6 +131,15 @@ static const struct libinput_interface interface = {
 	.close_restricted = close_restricted,
 };
 
+static void
+log_handler(const struct libinput *li,
+	    enum libinput_log_priority priority,
+	    const char *format,
+	    va_list args)
+{
+	vprintf(format, args);
+}
+
 static int
 open_udev(struct libinput **li)
 {
@@ -146,6 +155,11 @@ open_udev(struct libinput **li)
 		return 1;
 	}
 
+	if (verbose) {
+		libinput_log_set_handler(*li, log_handler);
+		libinput_log_set_priority(*li, LIBINPUT_LOG_PRIORITY_DEBUG);
+	}
+
 	if (libinput_udev_set_seat(*li, seat)) {
 		fprintf(stderr, "Failed to set seat\n");
 		libinput_destroy(*li);
@@ -166,6 +180,11 @@ open_device(struct libinput **li, const char *path)
 		return 1;
 	}
 
+	if (verbose) {
+		libinput_log_set_handler(*li, log_handler);
+		libinput_log_set_priority(*li, LIBINPUT_LOG_PRIORITY_DEBUG);
+	}
+
 	device = libinput_path_add_device(*li, path);
 	if (!device) {
 		fprintf(stderr, "Failed to initialized device %s\n", path);
@@ -438,15 +457,6 @@ mainloop(struct libinput *li)
 	close(fds[1].fd);
 }
 
-static void
-log_handler(enum libinput_log_priority priority,
-	    void *user_data,
-	    const char *format,
-	    va_list args)
-{
-	vprintf(format, args);
-}
-
 int
 main(int argc, char **argv)
 {
@@ -456,11 +466,6 @@ main(int argc, char **argv)
 	if (parse_args(argc, argv))
 		return 1;
 
-	if (verbose) {
-		libinput_log_set_handler(log_handler, NULL);
-		libinput_log_set_priority(LIBINPUT_LOG_PRIORITY_DEBUG);
-	}
-
 	if (mode == MODE_UDEV) {
 		if (open_udev(&li))
 			return 1;
-- 
1.9.3



More information about the wayland-devel mailing list