#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>
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;
}
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