#include <libds/input_device.h>
#include <libds/keyboard.h>
#include <libds/touch.h>
+#include <libds/pointer.h>
#define TINYDS_UNUSED __attribute__((unused))
struct tinyds_server;
+struct tinyds_pointer
+{
+ struct ds_input_device *dev;
+ struct tinyds_server *server;
+
+ struct wl_listener destroy;
+ struct wl_listener motion;
+ struct wl_listener motion_absolute;
+ struct wl_listener button;
+ struct wl_listener frame;
+};
+
struct tinyds_keyboard
{
struct ds_input_device *dev;
}
static void
+pointer_handle_device_destroy(struct wl_listener *listener, void *data)
+{
+ struct tinyds_pointer *pointer;
+
+ pointer = wl_container_of(listener, pointer, destroy);
+
+ ds_inf("Pointer(%p) destroyed", pointer);
+
+ wl_list_remove(&pointer->destroy.link);
+ wl_list_remove(&pointer->motion.link);
+ wl_list_remove(&pointer->motion_absolute.link);
+ wl_list_remove(&pointer->button.link);
+ wl_list_remove(&pointer->frame.link);
+
+ free(pointer);
+}
+
+static void
+pointer_handle_motion(struct wl_listener *listener, void *data)
+{
+ struct tinyds_pointer *pointer;
+
+ pointer = wl_container_of(listener, pointer, motion);
+
+ ds_inf("Pointer(%p) motion", pointer);
+}
+
+static void
+pointer_handle_motion_absolute(struct wl_listener *listener, void *data)
+{
+ struct tinyds_pointer *pointer;
+ struct ds_event_pointer_motion_absolute *event = data;
+
+ pointer = wl_container_of(listener, pointer, motion_absolute);
+
+ ds_inf("Pointer(%p) motion absolute: (x %f y %f) time(%d)",
+ pointer, event->x, event->y, event->time_msec);
+}
+
+static void
+pointer_handle_button(struct wl_listener *listener, void *data)
+{
+ struct tinyds_pointer *pointer;
+ struct ds_event_pointer_button *event = data;
+
+ pointer = wl_container_of(listener, pointer, button);
+
+ ds_inf("Pointer(%p) button(%d): state(%s) time(%d)",
+ pointer, event->button,
+ (event->state == DS_BUTTON_PRESSED) ? "Pressed" : "Released",
+ event->time_msec);
+}
+
+static void
+pointer_handle_frame(struct wl_listener *listener, void *data)
+{
+ struct tinyds_pointer *pointer;
+
+ pointer = wl_container_of(listener, pointer, motion);
+
+ ds_inf("Pointer(%p) frame", pointer);
+}
+
+static void
+server_add_pointer(struct tinyds_server *server, struct ds_input_device *dev)
+{
+ struct tinyds_pointer *pointer;
+
+ pointer = calloc(1, sizeof *pointer);
+ assert(pointer);
+
+ pointer->dev = dev;
+ pointer->server = server;
+
+ pointer->destroy.notify = pointer_handle_device_destroy;
+ ds_input_device_add_destroy_listener(dev, &pointer->destroy);
+
+ pointer->motion.notify = pointer_handle_motion;
+ ds_pointer_add_motion_listener(ds_input_device_get_pointer(dev),
+ &pointer->motion);
+
+ pointer->motion_absolute.notify = pointer_handle_motion_absolute;
+ ds_pointer_add_motion_absolute_listener(ds_input_device_get_pointer(dev),
+ &pointer->motion_absolute);
+
+ pointer->button.notify = pointer_handle_button;
+ ds_pointer_add_button_listener(ds_input_device_get_pointer(dev),
+ &pointer->button);
+
+ pointer->frame.notify = pointer_handle_frame;
+ ds_pointer_add_frame_listener(ds_input_device_get_pointer(dev),
+ &pointer->frame);
+
+ ds_inf("Pointer(%p) added", pointer);
+}
+
+static void
server_handle_new_input(struct wl_listener *listener, void *data)
{
struct tinyds_server *server;
case DS_INPUT_DEVICE_TOUCH:
server_add_touch(server, dev);
break;
+ case DS_INPUT_DEVICE_POINTER:
+ server_add_pointer(server, dev);
+ break;
default:
ds_err("Unknown type(%d) of ds_input_device", dev_type);
break;