From 2ffc1ee714686e8c875bacb18d867c8cd470e8c4 Mon Sep 17 00:00:00 2001 From: jeon Date: Tue, 7 May 2019 17:41:00 +0900 Subject: [PATCH] headless: enable a pepper_devicemgr Change-Id: I3cad5a7fc3fa271aa787b347382a1086d5bce799 --- configure.ac | 6 +- src/bin/headless/input.c | 49 +++++--- src/lib/devicemgr/pepper-devicemgr.c | 40 +++--- src/lib/devicemgr/pepper-devicemgr.h | 1 + src/samples/headless_client.c | 175 +++++++++++++++++++++++++-- 5 files changed, 223 insertions(+), 48 deletions(-) diff --git a/configure.ac b/configure.ac index e9b5065..611ca80 100644 --- a/configure.ac +++ b/configure.ac @@ -317,10 +317,11 @@ AC_SUBST(SAMPLES_LIBS) # headless server HEADLESS_SERVER_REQUIRES="wayland-server capi-system-peripheral-io xdg-shell-unstable-v6-server tizen-extension-server" PKG_CHECK_MODULES(HEADLESS_SERVER, $[HEADLESS_SERVER_REQUIRES]) -HEADLESS_SERVER_CFLAGS="$PEPPER_DIR $PEPPER_KEYROUTER_DIR $PEPPER_EVDEV_DIR $HEADLESS_SERVER_CFLAGS $TBM_CFLAGS" +HEADLESS_SERVER_CFLAGS="$PEPPER_DIR $PEPPER_KEYROUTER_DIR $PEPPER_DEVICEMGR_DIR $PEPPER_EVDEV_DIR $HEADLESS_SERVER_CFLAGS $TBM_CFLAGS" HEADLESS_SERVER_CFLAGS="$PEPPER_XKB_DIR $HEADLESS_SERVER_CFLAGS" HEADLESS_SERVER_LIBS="$PEPPER_LIB $PEPPER_LIBS $PEPPER_EVDEV_LIB $PEPPER_EVDEV_LIBS $HEADLESS_SERVER_LIBS $TBM_LIBS" HEADLESS_SERVER_LIBS="$PEPPER_KEYROUTER_LIB $PEPPER_KEYROUTER_LIBS $HEADLESS_SERVER_LIBS" +HEADLESS_SERVER_LIBS="$PEPPER_DEVICEMGR_LIB $PEPPER_DEVICEMGR_LIBS $HEADLESS_SERVER_LIBS" HEADLESS_SERVER_LIBS="$PEPPER_XKB_LIB $PEPPER_XKB_LIBS $HEADLESS_SERVER_LIBS" AC_SUBST(HEADLESS_SERVER_CFLAGS) @@ -329,9 +330,10 @@ AC_SUBST(HEADLESS_SERVER_LIBS) # doctor (headless server) and headless client samples DOCTOR_SERVER_REQUIRES="wayland-server libtbm" PKG_CHECK_MODULES(DOCTOR_SERVER, $[DOCTOR_SERVER_REQUIRES]) -DOCTOR_SERVER_CFLAGS="$PEPPER_DIR $PEPPER_EVDEV_DIR $PEPPER_KEYROUTER_DIR $PEPPER_DEVICEMGR_DIR $DOCTOR_SERVER_CFLAGS" +DOCTOR_SERVER_CFLAGS="$PEPPER_DIR $PEPPER_EVDEV_DIR $PEPPER_XKB_DIR $PEPPER_KEYROUTER_DIR $PEPPER_DEVICEMGR_DIR $DOCTOR_SERVER_CFLAGS" DOCTOR_SERVER_LIBS="$PEPPER_LIB $PEPPER_LIBS $DOCTOR_SERVER_LIBS" DOCTOR_SERVER_LIBS="$PEPPER_EVDEV_LIB $PEPPER_EVDEV_LIBS $DOCTOR_SERVER_LIBS" +DOCTOR_SERVER_LIBS="$PEPPER_XKB_LIB $PEPPER_XKB_LIBS $DOCTOR_SERVER_LIBS" DOCTOR_SERVER_LIBS="$PEPPER_KEYROUTER_LIB $PEPPER_KEYROUTER_LIBS $PEPPER_DEVICEMGR_LIB $PEPPER_DEVICEMGR_LIBS $DOCTOR_SERVER_LIBS" AC_SUBST(DOCTOR_SERVER_CFLAGS) diff --git a/src/bin/headless/input.c b/src/bin/headless/input.c index b74d8e1..0e26be5 100644 --- a/src/bin/headless/input.c +++ b/src/bin/headless/input.c @@ -23,6 +23,7 @@ #include #include #include +#include #include typedef struct @@ -36,6 +37,7 @@ typedef struct pepper_view_t *top_view; pepper_keyrouter_t *keyrouter; + pepper_devicemgr_t *devicemgr; pepper_xkb_t *xkb; pepper_event_listener_t *listener_seat_keyboard_key; @@ -206,21 +208,7 @@ headless_input_init_input(headless_input_t *hi) { uint32_t caps = 0; uint32_t probed = 0; - - const char *seat_name = NULL; pepper_evdev_t *evdev = NULL; - pepper_seat_t *seat = NULL; - - seat_name = getenv("XDG_SEAT"); - - if (!seat_name) - seat_name = "seat0"; - - /* create a default seat (seat0) */ - seat = pepper_compositor_add_seat(hi->compositor, seat_name); - PEPPER_CHECK(seat, goto end, "Failed to add seat (%s)!\n", seat_name); - - hi->seat = seat; /* create pepper evdev */ evdev = pepper_evdev_create(hi->compositor); @@ -242,8 +230,6 @@ headless_input_init_input(headless_input_t *hi) return PEPPER_TRUE; end: - if (seat) - pepper_seat_destroy(seat); pepper_evdev_destroy(evdev); return PEPPER_FALSE; @@ -252,11 +238,26 @@ end: static void headless_input_init_modules(headless_input_t *hi) { + const char *seat_name = NULL; + pepper_seat_t *seat = NULL; + pepper_keyrouter_t *keyrouter = NULL; + pepper_devicemgr_t *devicemgr = NULL; pepper_xkb_t *xkb = NULL; PEPPER_TRACE("[%s] ... begin\n", __FUNCTION__); + seat_name = getenv("XDG_SEAT"); + + if (!seat_name) + seat_name = "seat0"; + + /* create a default seat (seat0) */ + seat = pepper_compositor_add_seat(hi->compositor, seat_name); + PEPPER_CHECK(seat, goto end, "Failed to add seat (%s)!\n", seat_name); + + hi->seat = seat; + /* create pepper xkb */ xkb = pepper_xkb_create(); PEPPER_CHECK(xkb, goto end, "Failed to create pepper_xkb !\n"); @@ -269,6 +270,13 @@ headless_input_init_modules(headless_input_t *hi) hi->keyrouter = keyrouter; + /* create pepper devicemgr */ + devicemgr = pepper_devicemgr_create(hi->compositor, hi->seat); + PEPPER_CHECK(devicemgr, goto end, "Failed to create devicemgr !\n"); + pepper_devicemgr_xkb_enable(devicemgr); + + hi->devicemgr = devicemgr; + PEPPER_TRACE("[%s] ... done\n", __FUNCTION__); return; @@ -277,9 +285,15 @@ end: pepper_xkb_destroy(hi->xkb); if (hi->keyrouter) pepper_keyrouter_destroy(hi->keyrouter); + if (hi->devicemgr) + pepper_devicemgr_destroy(hi->devicemgr); + if (hi->seat) + pepper_seat_destroy(hi->seat); hi->xkb = NULL; hi->keyrouter = NULL; + hi->devicemgr = NULL; + hi->seat = NULL; } static void @@ -289,9 +303,12 @@ headless_input_deinit_modules(headless_input_t *hi) pepper_xkb_destroy(hi->xkb); if (hi->keyrouter) pepper_keyrouter_destroy(hi->keyrouter); + if (hi->devicemgr) + pepper_devicemgr_destroy(hi->devicemgr); hi->xkb = NULL; hi->keyrouter = NULL; + hi->devicemgr = NULL; } PEPPER_API void diff --git a/src/lib/devicemgr/pepper-devicemgr.c b/src/lib/devicemgr/pepper-devicemgr.c index 2844941..6640421 100644 --- a/src/lib/devicemgr/pepper-devicemgr.c +++ b/src/lib/devicemgr/pepper-devicemgr.c @@ -24,9 +24,7 @@ #include "pepper-devicemgr.h" #include "pepper-internal.h" #include -#ifdef _F_DEVICEMGR_XKB #include -#endif #define MIN(a,b) ((a)<(b)?(a):(b)) @@ -37,17 +35,13 @@ struct pepper_devicemgr { struct wl_display *display; pepper_compositor_t *compositor; pepper_seat_t *seat; -#ifdef _F_DEVICEMGR_XKB + pepper_bool_t xkb_enabled; pepper_xkb_info_t *xkb_info; -#else pepper_list_t *keymap_list; -#endif pepper_event_listener_t *listener_input_device_add; -#ifdef _F_DEVICEMGR_XKB pepper_event_listener_t *listener_seat_keyboard_add; pepper_event_listener_t *listener_keyboard_keymap_update; -#endif pepper_list_t resources; @@ -61,7 +55,6 @@ struct pepper_devicemgr_resource { pepper_list_t link; }; -#ifdef _F_DEVICEMGR_XKB static void _pepper_devicemgr_handle_keyboard_keymap_update(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) { @@ -84,7 +77,6 @@ _pepper_devicemgr_handle_seat_keyboard_add(pepper_event_listener_t *listener, pe PEPPER_EVENT_KEYBOARD_KEYMAP_UPDATE, 0, _pepper_devicemgr_handle_keyboard_keymap_update, pepper_devicemgr); } -#endif static void _pepper_devicemgr_handle_input_device_add(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data) @@ -242,7 +234,7 @@ _pepper_devicemgr_keyname_to_keycode(pepper_list_t *list, const char *name) if (!strncmp(name, "Keycode-", sizeof("Keycode-")-1)) { return atoi(name + 8); } - else if (!pepper_list_empty(list)) { + else if (list && !pepper_list_empty(list)) { pepper_list_for_each(data, list, link) { if (data) { if (!strncmp(data->name, name, UINPUT_MAX_NAME_SIZE)) { @@ -267,13 +259,11 @@ _pepper_devicemgr_cb_generate_key(struct wl_client *client, struct wl_resource * PEPPER_CHECK(pepper_devicemgr, goto failed, "pepper_devicemgr is not set\n"); PEPPER_CHECK(pepper_devicemgr->devicemgr, goto failed, "devicemgr is not created\n"); -#ifdef _F_DEVICEMGR_XKB if (pepper_devicemgr->xkb_info) { keycode = pepper_xkb_info_keyname_to_keycode(pepper_devicemgr->xkb_info, keyname); - } else -#else - keycode = _pepper_devicemgr_keyname_to_keycode(pepper_devicemgr->keymap_list, keyname); -#endif + } + else + keycode = _pepper_devicemgr_keyname_to_keycode(pepper_devicemgr->keymap_list, keyname); ret = devicemgr_input_generator_generate_key(pepper_devicemgr->devicemgr, keycode, pressed); PEPPER_CHECK(ret == TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE, goto failed, "Failed to generate key(name: %s, code: %d), ret: %d\n", keyname, keycode, ret); @@ -369,6 +359,17 @@ _pepper_devicemgr_cb_bind(struct wl_client *client, void *data, uint32_t version pepper_devicemgr, _pepper_devicemgr_cb_unbind); } +PEPPER_API void +pepper_devicemgr_xkb_enable(pepper_devicemgr_t *pepper_devicemgr) +{ + if (pepper_devicemgr->xkb_enabled) return; + + pepper_devicemgr->xkb_enabled = PEPPER_TRUE; + pepper_devicemgr->listener_seat_keyboard_add = pepper_object_add_event_listener((pepper_object_t *)pepper_devicemgr->seat, + PEPPER_EVENT_SEAT_KEYBOARD_ADD, + 0, _pepper_devicemgr_handle_seat_keyboard_add, pepper_devicemgr); +} + PEPPER_API pepper_devicemgr_t * pepper_devicemgr_create(pepper_compositor_t *compositor, pepper_seat_t *seat) { @@ -387,16 +388,13 @@ pepper_devicemgr_create(pepper_compositor_t *compositor, pepper_seat_t *seat) pepper_devicemgr->compositor = compositor; pepper_devicemgr->seat = seat; + pepper_devicemgr->xkb_enabled = PEPPER_FALSE; + pepper_devicemgr->xkb_info = NULL; + pepper_devicemgr->listener_input_device_add = pepper_object_add_event_listener((pepper_object_t *)pepper_devicemgr->compositor, PEPPER_EVENT_COMPOSITOR_INPUT_DEVICE_ADD, 0, _pepper_devicemgr_handle_input_device_add, pepper_devicemgr); -#ifdef _F_DEVICEMGR_XKB - pepper_devicemgr->listener_seat_keyboard_add = pepper_object_add_event_listener((pepper_object_t *)pepper_devicemgr->seat, - PEPPER_EVENT_SEAT_KEYBOARD_ADD, - 0, _pepper_devicemgr_handle_seat_keyboard_add, pepper_devicemgr); -#endif - pepper_list_init(&pepper_devicemgr->resources); global = wl_global_create(display, &tizen_input_device_manager_interface, 2, pepper_devicemgr, _pepper_devicemgr_cb_bind); diff --git a/src/lib/devicemgr/pepper-devicemgr.h b/src/lib/devicemgr/pepper-devicemgr.h index ad04169..e41523a 100644 --- a/src/lib/devicemgr/pepper-devicemgr.h +++ b/src/lib/devicemgr/pepper-devicemgr.h @@ -38,3 +38,4 @@ PEPPER_API pepper_devicemgr_t *pepper_devicemgr_create(pepper_compositor_t *comp PEPPER_API void pepper_devicemgr_destroy(pepper_devicemgr_t *pepper_devicemgr); PEPPER_API void pepper_devicemgr_keymap_set(pepper_devicemgr_t *pepper_devicemgr, pepper_list_t *list); +PEPPER_API void pepper_devicemgr_xkb_enable(pepper_devicemgr_t *pepper_devicemgr); diff --git a/src/samples/headless_client.c b/src/samples/headless_client.c index 36e7550..4047bab 100644 --- a/src/samples/headless_client.c +++ b/src/samples/headless_client.c @@ -5,6 +5,7 @@ #include #include #include +#include #define MAX_STR 1024 @@ -32,6 +33,7 @@ typedef struct app_data app_data_t; typedef enum keygrab_type keygrab_type_e; +typedef enum key_type key_type_e; struct app_data { @@ -41,6 +43,8 @@ struct app_data struct wayland_tbm_client *wl_tbm_client; tbm_surface_queue_h tbm_queue; int last_serial; + + efl_util_inputgen_h inputgen; }; enum keygrab_type @@ -52,6 +56,13 @@ enum keygrab_type KEYGRAB_TYPE_EXCLUSIVE }; +enum key_type +{ + KEY_UP = 0, + KEY_DOWN, + KEY_ALL +}; + static Eina_Array *_ecore_event_hdls; static int KEY_WL_BUFFER = 0; @@ -87,6 +98,37 @@ static const struct wl_buffer_listener buffer_listener = { buffer_release }; +static char * +_eflutil_error_to_string(int type) +{ + switch (type) { + case EFL_UTIL_ERROR_NONE: + return "none"; + case EFL_UTIL_ERROR_INVALID_PARAMETER: + return "invalid parameter"; + case EFL_UTIL_ERROR_OUT_OF_MEMORY: + return "out of memory"; + case EFL_UTIL_ERROR_PERMISSION_DENIED: + return "permission denied"; + case EFL_UTIL_ERROR_NO_SUCH_DEVICE: + return "no such device"; + case EFL_UTIL_ERROR_INVALID_OPERATION: + return "invalid operation"; + case EFL_UTIL_ERROR_NOT_SUPPORTED: + return "not supported"; + case EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE: + return "not supported window type"; + case EFL_UTIL_ERROR_SCREENSHOT_INIT_FAIL: + return "screenshot init fail"; + case EFL_UTIL_ERROR_SCREENSHOT_EXECUTION_FAIL: + return "screenshot execution fail"; + case EFL_UTIL_ERROR_NO_RESOURCE_AVAILABLE: + return "no resource available"; + default: + return "Unknown"; + } +} + static void _update_window(app_data_t *client) { @@ -347,16 +389,84 @@ _keyungrab(char *keyname) else printf("Success to ungrab %s\n", keyname); } +static void +_inputgen_init(app_data_t *client) +{ + int ret = EFL_UTIL_ERROR_NONE; + + if (client->inputgen) { + printf("Input generator is already initialized\n"); + return; + } + + client->inputgen = efl_util_input_initialize_generator(EFL_UTIL_INPUT_DEVTYPE_KEYBOARD); + if (!client->inputgen) { + ret = get_last_result(); + printf("Failed to initialize input generator.(result: %s)\n", _eflutil_error_to_string(ret)); + } +} + +static void +_inputgen_deinit(app_data_t *client) +{ + int ret = EFL_UTIL_ERROR_NONE; + + if (!client->inputgen) { + printf("Input generator is not initialized\n"); + return; + } + + ret = efl_util_input_deinitialize_generator(client->inputgen); + if (ret != EFL_UTIL_ERROR_NONE) { + printf("Failed to deinitialize input generator.(result: %s)\n", _eflutil_error_to_string(ret)); + return; + } + client->inputgen = NULL; +} + +static void +_inputgen_key(app_data_t *client, char *name, int type) +{ + int ret = EFL_UTIL_ERROR_NONE; + ret = efl_util_input_generate_key(client->inputgen, name, type); + if (ret != EFL_UTIL_ERROR_NONE) printf("Failed to generate key %s(result: %s)\n", type?"down":"up", _eflutil_error_to_string(ret)); +} + + +static void +_key_gen(app_data_t *client, char *name, int type) +{ + printf("name: %s, type: %d\n", name, type); + + if (!client->inputgen) { + printf("Input generator is not initialized\n"); + return; + } + if (!name) { + printf("Invalid key name\n"); + return; + } + + if (type == KEY_ALL) { + _inputgen_key(client, name, 1); + _inputgen_key(client, name, 0); + } + else { + _inputgen_key(client, name, !!type); + } +} + static void _usage(void) { - printf(" Supported commands: grab (Grab a key)\n"); - printf(" : ungrab (Ungrab a key)\n"); - printf(" : hide (Hide current window)\n"); - printf(" : show (Show current window)\n"); - printf(" : help (Print this help text)\n"); - printf(" : update(update current window)\n"); - printf(" : q/quit (Quit program)\n"); + printf(" Supported commands: grab (Grab a key)\n"); + printf(" : ungrab (Ungrab a key)\n"); + printf(" : hide (Hide current window)\n"); + printf(" : show (Show current window)\n"); + printf(" : help (Print this help text)\n"); + printf(" : update (update current window)\n"); + printf(" : inputgen (input Generator)\n"); + printf(" : q/quit (Quit program)\n"); printf("grab [key_name] {grab_type}\n"); printf(" : grab_type:\n"); printf(" - default: shared\n"); @@ -368,6 +478,18 @@ _usage(void) printf("ungrab [key_name]\n"); printf(" : ex> ungrab XF86Back\n"); printf("\n"); + printf("inputgen [options...]\n"); + printf(" : options:\n"); + printf(" - init: init generator\n"); + printf(" - deinit: deinit generator\n"); + printf(" - key: generate key event\n"); + printf(" inputgen key [keyname] {type}\n"); + printf(" - keyname: keyname (ex> XF86Back)\n"); + printf(" - type: 1: press / 0: release (default: press/release)\n"); + printf(" : ex> inputgen init\n"); + printf(" : ex> inputgen key XF86Back / inputgen key XF86Back 1\n"); + printf(" : ex> inputgen deinit\n"); + printf("\n"); printf("* Actions *\n"); @@ -392,6 +514,7 @@ _stdin_cb(void *data, Ecore_Fd_Handler *handler EINA_UNUSED) int count = 0; char key_name[MAX_STR] = {0, }; int grab_mode = KEYGRAB_TYPE_SHARED; + int key_type = KEY_ALL; while ((c = getchar()) != EOF) { if (c == '\n') break; @@ -462,6 +585,40 @@ _stdin_cb(void *data, Ecore_Fd_Handler *handler EINA_UNUSED) _update_window(client); printf("update window\n"); } + else if (!strncmp(tmp, "inputgen", sizeof("inputgen"))) { + tmp = strtok_r(NULL, " ", &buf_ptr); + if (tmp) { + if (!strncmp(tmp, "init", sizeof("init"))) { + _inputgen_init(client); + } + else if (!strncmp(tmp, "deinit", sizeof("deinit"))) { + _inputgen_deinit(client); + } + else if (!strncmp(tmp, "key", sizeof("key"))) { + while (tmp) { + tmp = strtok_r(NULL, " ", &buf_ptr); + if (tmp) { + switch (count) { + case 0: + strncpy(key_name, tmp, MAX_STR - 1); + break; + case 1: + key_type = atoi(tmp); + break; + default: + break; + } + } + count++; + } + _key_gen(client, key_name, key_type); + } + else { + printf("invalid arguments\n"); + _usage(); + } + } + } else { printf("Invalid arguments\n"); _usage(); @@ -519,8 +676,8 @@ int main(int argc, char **argv) socket_name = getenv("WAYLAND_DISPLAY"); - if (!socket_name) - socket_name = "wayland-0"; + if (!socket_name) + socket_name = "wayland-0"; client = (app_data_t *)calloc(1, sizeof(app_data_t)); ERROR_CHECK(client, goto shutdown, "Failed to allocate memory for app_data_t"); -- 2.34.1