examples: Rename pointer-test to input-device-test 68/278168/1
authorSeunghun Lee <shiin.lee@samsung.com>
Mon, 18 Apr 2022 01:35:14 +0000 (10:35 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 18 Jul 2022 05:58:27 +0000 (14:58 +0900)
This patch also adds code for ds_keyboard in input-device-test.

Change-Id: I39b92b87aff0f0f701afc1d4ac4e8674f3217715

src/examples/input-device-test.c [moved from src/examples/pointer-test.c with 70% similarity]
src/examples/meson.build

similarity index 70%
rename from src/examples/pointer-test.c
rename to src/examples/input-device-test.c
index d669a03..237d0b5 100644 (file)
@@ -7,6 +7,7 @@
 #include <libds/backend/wayland.h>
 #include <libds/input_device.h>
 #include <libds/pointer.h>
+#include <libds/keyboard.h>
 #include <libds/allocator/shm.h>
 #include <libds/swapchain.h>
 
@@ -24,6 +25,17 @@ struct pointer_device {
     struct wl_listener frame;
 };
 
+struct server;
+
+struct keyboard_device {
+    struct server *server;
+    struct ds_keyboard *ds_keyboard;
+
+    struct wl_listener destroy;
+    struct wl_listener modifiers;
+    struct wl_listener key;
+};
+
 struct output
 {
     struct server *server;
@@ -202,20 +214,101 @@ add_pointer(struct ds_input_device *dev)
 }
 
 static void
+keyboard_handle_device_destroy(struct wl_listener *listener, void *data)
+{
+    struct keyboard_device *keyboard;
+
+    keyboard = wl_container_of(listener, keyboard, destroy);
+
+    wl_list_remove(&keyboard->destroy.link);
+    wl_list_remove(&keyboard->modifiers.link);
+    wl_list_remove(&keyboard->key.link);
+
+    free(keyboard);
+}
+
+static void
+keyboard_handle_modifiers(struct wl_listener *listener, void *data)
+{
+    struct keyboard_device *keyboard;
+    struct ds_keyboard *ds_keyboard = data;
+
+    keyboard = wl_container_of(listener, keyboard, destroy);
+
+    ds_inf("Keyboard(%p) event modifiers", ds_keyboard);
+}
+
+static void
+keyboard_handle_key(struct wl_listener *listener, void *data)
+{
+    struct ds_event_keyboard_key *event = data;
+    struct keyboard_device *keyboard;
+    struct xkb_state *xkb_state;
+    const xkb_keysym_t *syms;
+    int nsyms = 0;
+
+    keyboard = wl_container_of(listener, keyboard, key);
+
+    ds_inf("Keyboard(%p) event key: keycode(%d), state(%d), time_msec(%d), "
+            "update_state(%d)", keyboard->ds_keyboard,
+            event->keycode, event->state, event->time_msec,
+            event->update_state);
+
+    xkb_state = ds_keyboard_get_xkb_state(keyboard->ds_keyboard);
+    if (!xkb_state)
+        return;
+
+    nsyms = xkb_state_key_get_syms(xkb_state, event->keycode + 8, &syms);
+
+    for (int i = 0; i < nsyms; i++) {
+        if (syms[i] == XKB_KEY_Escape)
+            wl_display_terminate(keyboard->server->display);
+    }
+}
+
+static void
+add_keyboard(struct server *server, struct ds_input_device *dev)
+{
+    struct keyboard_device *keyboard;
+
+    keyboard = calloc(1, sizeof *keyboard);
+    if (!keyboard)
+        return;
+
+    keyboard->server = server;
+    keyboard->ds_keyboard = ds_input_device_get_keyboard(dev);
+
+    ds_inf("Keyboard(%p) added", keyboard->ds_keyboard);
+
+    keyboard->destroy.notify = keyboard_handle_device_destroy;
+    ds_input_device_add_destroy_listener(dev, &keyboard->destroy);
+
+    keyboard->modifiers.notify = keyboard_handle_modifiers;
+    ds_keyboard_add_modifiers_listener(keyboard->ds_keyboard,
+            &keyboard->modifiers);
+
+    keyboard->key.notify = keyboard_handle_key;
+    ds_keyboard_add_key_listener(keyboard->ds_keyboard,
+            &keyboard->key);
+}
+
+static void
 handle_new_input(struct wl_listener *listener, void *data)
 {
+    struct server *server;
     struct ds_input_device *dev = data;
     enum ds_input_device_type type;
 
     type = ds_input_device_get_type(dev);
 
-    if (type != DS_INPUT_DEVICE_POINTER)
-        return;
+    ds_inf("New device(%p) type(%s)", dev, device_type_to_string(type));
 
-    ds_inf("New pointer device(%p) type(%s)", dev,
-            device_type_to_string(type));
-
-    add_pointer(dev);
+    if (type == DS_INPUT_DEVICE_POINTER)
+        add_pointer(dev);
+    else if (type == DS_INPUT_DEVICE_KEYBOARD) {
+        server = wl_container_of(listener, server, new_input);
+        add_keyboard(server, dev);
+    }
 }
 
 static void
index f19f139..c568eb6 100644 (file)
@@ -23,9 +23,9 @@ executable('tinyds',
   install : true
 )
 
-executable('pointer-test',
+executable('input-device-test',
   [
-    'pointer-test.c',
+    'input-device-test.c',
     'pixman-helper.c',
   ],
   dependencies: common_deps,