headless: enable a pepper_devicemgr 84/207184/1
authorjeon <jhyuni.kang@samsung.com>
Tue, 7 May 2019 08:41:00 +0000 (17:41 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 30 May 2019 08:34:15 +0000 (17:34 +0900)
Change-Id: I3cad5a7fc3fa271aa787b347382a1086d5bce799

configure.ac
src/bin/headless/input.c
src/lib/devicemgr/pepper-devicemgr.c
src/lib/devicemgr/pepper-devicemgr.h
src/samples/headless_client.c

index e9b5065..611ca80 100644 (file)
@@ -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)
index b74d8e1..0e26be5 100644 (file)
@@ -23,6 +23,7 @@
 #include <pepper-evdev.h>
 #include <pepper-input-backend.h>
 #include <pepper-keyrouter.h>
+#include <pepper-devicemgr.h>
 #include <pepper-xkb.h>
 
 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
index 2844941..6640421 100644 (file)
@@ -24,9 +24,7 @@
 #include "pepper-devicemgr.h"
 #include "pepper-internal.h"
 #include <tizen-extension-server-protocol.h>
-#ifdef _F_DEVICEMGR_XKB
 #include <pepper-xkb.h>
-#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);
index ad04169..e41523a 100644 (file)
@@ -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);
index 36e7550..4047bab 100644 (file)
@@ -5,6 +5,7 @@
 #include <Ecore_Input.h>
 #include <wayland-tbm-client.h>
 #include <tbm_surface_internal.h>
+#include <efl_util.h>
 
 #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)
 {
@@ -348,15 +390,83 @@ _keyungrab(char *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");