From: Seunghun Lee Date: Wed, 6 Jul 2022 06:52:31 +0000 (+0900) Subject: Use ds_tizen_keyrouter X-Git-Tag: submit/tizen/20220818.083245~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f815c248c1c0534c5a7e02a54d35b6cdb9b3424c;p=platform%2Fcore%2Fuifw%2Fheadless-server.git Use ds_tizen_keyrouter Change-Id: I6c32a362e1d761ea45f5da717d0fd0b4daa7c12b --- diff --git a/configure.ac b/configure.ac index 3eb5cfc..b8f19bf 100644 --- a/configure.ac +++ b/configure.ac @@ -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) diff --git a/packaging/headless-server.spec b/packaging/headless-server.spec index f4e789c..fcae547 100644 --- a/packaging/headless-server.spec +++ b/packaging/headless-server.spec @@ -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 diff --git a/src/headless_server.c b/src/headless_server.c index 413546e..55d0365 100644 --- a/src/headless_server.c +++ b/src/headless_server.c @@ -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 diff --git a/src/headless_server.h b/src/headless_server.h index de093b6..6ca8378 100644 --- a/src/headless_server.h +++ b/src/headless_server.h @@ -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; }; diff --git a/src/input/input.c b/src/input/input.c index 8153540..8469d13 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #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); @@ -142,6 +163,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) { @@ -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