Use ds_tizen_keyrouter 89/279089/1
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 6 Jul 2022 06:52:31 +0000 (15:52 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Tue, 2 Aug 2022 01:18:11 +0000 (10:18 +0900)
Change-Id: I6c32a362e1d761ea45f5da717d0fd0b4daa7c12b

configure.ac
packaging/headless-server.spec
src/headless_server.c
src/headless_server.h
src/input/input.c

index 3eb5cfc..b8f19bf 100644 (file)
@@ -29,7 +29,7 @@ fi
 AC_SUBST(GCC_CFLAGS)
 
 # headless server
-HEADLESS_SERVER_REQUIRES="xkbcommon capi-system-peripheral-io xdg-shell-unstable-v6-server tizen-extension-server wayland-tbm-server dlog wayland-server libds libds-tizen"
+HEADLESS_SERVER_REQUIRES="xkbcommon capi-system-peripheral-io xdg-shell-unstable-v6-server tizen-extension-server wayland-tbm-server dlog wayland-server libds libds-tizen-tbm-server libds-tizen-keyrouter"
 PKG_CHECK_MODULES(HEADLESS_SERVER, $[HEADLESS_SERVER_REQUIRES])
 
 AC_SUBST(HEADLESS_SERVER_CFLAGS)
index f4e789c..fcae547 100644 (file)
@@ -21,7 +21,8 @@ BuildRequires:        pkgconfig(tizen-extension-server)
 BuildRequires:  pkgconfig(dlog)
 BuildRequires:  pkgconfig(wayland-server)
 BuildRequires:  pkgconfig(libds)
-BuildRequires:  pkgconfig(libds-tizen)
+BuildRequires:  pkgconfig(libds-tizen-tbm-server)
+BuildRequires:  pkgconfig(libds-tizen-keyrouter)
 
 Requires: libtbm
 Requires: capi-system-peripheral-io
index 413546e..55d0365 100644 (file)
@@ -120,6 +120,7 @@ int main(int argc, char *argv[])
        wl_list_init(&server.views);
 
        wl_signal_init(&server.events.focus_change);
+       wl_signal_init(&server.events.top_change);
 
        server.compositor = ds_compositor_create(server.display);
        HEADLESS_CHECK(server.compositor, goto end, "Failed to create ds_compositor");
@@ -208,6 +209,8 @@ destroy_view(headless_view_t *view)
 {
        ds_inf("view(%p) destroyed", view);
 
+       wl_signal_emit(&view->events.destroy, view);
+
        wl_list_remove(&view->commit.link);
        wl_list_remove(&view->map.link);
        wl_list_remove(&view->unmap.link);
@@ -228,8 +231,10 @@ view_handle_shell_surface_destroy(struct wl_listener *listener, void *data)
        view = wl_container_of(listener, view, shell_surface_destroy);
        server = view->server;
 
-       if (server->top_view == view)
+       if (server->top_view == view) {
                server->top_view = NULL;
+               wl_signal_emit(&server->events.top_change, NULL);
+       }
 
        server_schedule_idle_task(server);
 
@@ -323,6 +328,8 @@ create_view(headless_server_t *server, headless_shell_surface_t *shell_surface)
        view->shell_surface = shell_surface;
        view->surface = headless_shell_surface_get_surface(shell_surface);
 
+       wl_signal_init(&view->events.destroy);
+
        view->shell_surface_destroy.notify = view_handle_shell_surface_destroy;
        headless_shell_surface_add_destroy_listener(shell_surface,
                        &view->shell_surface_destroy);
@@ -404,6 +411,8 @@ server_set_top_view(headless_server_t *server, headless_view_t *view)
        }
 
        server->top_view = view;
+
+       wl_signal_emit(&server->events.top_change, view);
 }
 
 static void
index de093b6..6ca8378 100644 (file)
@@ -96,6 +96,7 @@ struct headless_server
 
        struct {
                struct wl_signal focus_change;
+        struct wl_signal top_change;
        } events;
 
        bool boot_animating;
@@ -121,6 +122,10 @@ struct headless_view
        double x, y;
        int width, height;
 
+    struct {
+        struct wl_signal destroy;
+    } events;
+
        bool mapped;
        bool skip_focus;
 };
index 8153540..8469d13 100644 (file)
@@ -32,6 +32,7 @@
 #include <libds/input_device.h>
 #include <libds/keyboard.h>
 #include <libds/seat.h>
+#include <libds-tizen/keyrouter.h>
 #include <xkbcommon/xkbcommon.h>
 
 #include "headless_server.h"
@@ -43,12 +44,16 @@ struct headless_input
 {
        headless_server_t *server;
        headless_keyboard_t *keyboard;
+       headless_view_t *top_view;
 
        struct ds_backend *backend;
        struct ds_seat *seat;
+       struct ds_tizen_keyrouter *keyrouter;
 
        struct wl_listener new_input;
        struct wl_listener focus_change;
+       struct wl_listener top_change;
+       struct wl_listener top_view_destroy;
 };
 
 struct headless_keyboard
@@ -61,8 +66,10 @@ struct headless_keyboard
        struct wl_listener key;
 };
 
-static void handle_focus_change(struct wl_listener *listener, void *data);
 static void handle_new_input(struct wl_listener *listener, void *data);
+static void handle_focus_change(struct wl_listener *listener, void *data);
+static void handle_top_change(struct wl_listener *listener, void *data);
+static void handle_top_view_destroy(struct wl_listener *listener, void *data);
 static headless_keyboard_t *create_keyboard(headless_input_t *input,
                struct ds_input_device *dev);
 static void keyboard_destroy(headless_keyboard_t *keyboard);
@@ -86,6 +93,12 @@ headless_input_create(headless_server_t *server)
                goto err_backend;
        }
 
+       input->keyrouter = ds_tizen_keyrouter_create(server->display);
+       if (!input->keyrouter) {
+               ds_err("Could not create ds_tizen_keyrouter");
+               goto err_keyrouter;
+       }
+
        input->seat = ds_seat_create(server->display, "seat0");
        if (!input->seat) {
                ds_err("Could not create ds_seat");
@@ -98,6 +111,9 @@ headless_input_create(headless_server_t *server)
        input->focus_change.notify = handle_focus_change;
        wl_signal_add(&server->events.focus_change, &input->focus_change);
 
+       input->top_change.notify = handle_top_change;
+       wl_signal_add(&server->events.top_change, &input->top_change);
+
        ds_backend_start(input->backend);
 
        ds_inf("Created Headless input(%p)", input);
@@ -105,6 +121,7 @@ headless_input_create(headless_server_t *server)
        return input;
 
 err_seat:
+err_keyrouter:
        ds_backend_destroy(input->backend);
 err_backend:
        free(input);
@@ -118,6 +135,10 @@ headless_input_destroy(headless_input_t *input)
        if (input->keyboard)
                keyboard_destroy(input->keyboard);
 
+       if (input->top_view_destroy.notify)
+               wl_list_remove(&input->top_view_destroy.link);
+
+       wl_list_remove(&input->top_change.link);
        wl_list_remove(&input->focus_change.link);
        wl_list_remove(&input->new_input.link);
 
@@ -143,6 +164,37 @@ handle_focus_change(struct wl_listener *listener, void *data)
 }
 
 static void
+handle_top_change(struct wl_listener *listener, void *data)
+{
+       headless_input_t *input;
+       headless_view_t *view = data;
+
+       input = wl_container_of(listener, input, top_change);
+
+       input->top_view = view;
+
+       if (input->top_view_destroy.notify)
+               wl_list_remove(&input->top_view_destroy.link);
+       else
+               input->top_view_destroy.notify = handle_top_view_destroy;
+
+       wl_signal_add(&view->events.destroy, &input->top_view_destroy);
+}
+
+static void
+handle_top_view_destroy(struct wl_listener *listener, void *data)
+{
+       headless_input_t *input;
+
+       input = wl_container_of(listener, input, top_view_destroy);
+
+       wl_list_remove(&input->top_view_destroy.link);
+
+       input->top_view_destroy.notify = NULL;
+       input->top_view = NULL;
+}
+
+static void
 handle_new_input(struct wl_listener *listener, void *data)
 {
        headless_input_t *input;
@@ -203,6 +255,7 @@ create_keyboard(headless_input_t *input, struct ds_input_device *dev)
        context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
        keymap = xkb_keymap_new_from_names(context, NULL,
                        XKB_KEYMAP_COMPILE_NO_FLAGS);
+
        ds_keyboard_set_keymap(ds_keyboard, keymap);
        xkb_keymap_unref(keymap);
        xkb_context_unref(context);
@@ -237,17 +290,20 @@ keyboard_handle_destroy(struct wl_listener *listener, void *data)
 static void
 keyboard_handle_key(struct wl_listener *listener, void *data)
 {
+       headless_input_t *input;
        headless_keyboard_t *keyboard;
-       struct ds_event_keyboard_key *event = data;
+       struct ds_event_keyboard_key *ev = data;
 
        keyboard = wl_container_of(listener, keyboard, key);
+       input = keyboard->input;
 
-       ds_inf("Keyboard(%p) key: keycode(%d), state(%d), time_msec(%d), "
-                       "update_state(%d)", keyboard, event->keycode, event->state,
-                       event->time_msec, event->update_state);
+       ds_dbg("Keyboard(%p) KEY(%d) %s time_msec(%d) update_state(%d)", keyboard,
+                       ev->keycode, (ev->state == 0) ? "RELEASED" : "PRESSED",
+                       ev->time_msec, ev->update_state);
 
-       ds_seat_keyboard_notify_key(keyboard->input->seat, event->time_msec,
-                       event->keycode, event->state);
+       ds_tizen_keyrouter_notify_key(input->keyrouter, input->seat,
+                       input->top_view ? input->top_view->surface : NULL,
+                       ev->time_msec, ev->keycode, ev->state);
 }
 #else
 #include <pepper-evdev.h>