e_server: move the init/shutdown of e_keyrouter_wl 87/312187/1
authorSooChan Lim <sc1.lim@samsung.com>
Fri, 31 May 2024 09:26:32 +0000 (18:26 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 5 Jun 2024 03:09:27 +0000 (12:09 +0900)
to the e_server directory

Change-Id: I1fb671afcd7f57431cc2b502178053bc8ffbba4d

src/bin/inputmgr/e_keyrouter.c
src/bin/inputmgr/e_keyrouter_events.c
src/bin/inputmgr/e_keyrouter_intern.h
src/bin/inputmgr/e_keyrouter_list.c
src/bin/server/e_keyrouter_wl.c
src/bin/server/e_keyrouter_wl_intern.h [new file with mode: 0644]
src/bin/server/e_server.c
src/bin/server/e_server_intern.h

index 20f76fe..17a00ce 100644 (file)
@@ -6,6 +6,7 @@
 #include "e_comp_wl_intern.h"
 #include "e_info_server_intern.h"
 #include "e_comp_input_intern.h"
+#include "e_keyrouter_wl_intern.h"
 
 #include <tizen-extension-server-protocol.h>
 #include <glib.h>
@@ -680,9 +681,6 @@ e_keyrouter_init(void)
         krt->composition_key.waiting_time = kconfig->conf->composition_key_wait_time;
      }
 
-   res = e_keyrouter_wl_init();
-   EINA_SAFETY_ON_FALSE_GOTO(res, err);
-
    /* Get keyname and keycode pair from Tizen Key Layout file */
    if (!e_input_thread_mode_get())
      {
@@ -718,7 +716,6 @@ err:
           }
      }
    _e_keyrouter_deinit_handlers();
-   e_keyrouter_wl_shutdown();
    eina_log_domain_unregister(_keyrouter_log_dom);
    _keyrouter_log_dom = -1;
    if (krt) E_FREE(krt);
@@ -774,8 +771,6 @@ e_keyrouter_shutdown(void)
 
    g_rec_mutex_clear(&krt->grab_key_mutex);
 
-   e_keyrouter_wl_shutdown();
-
    E_FREE(krt);
    /* TODO: free allocated memory */
 
index 851a4f7..f2c2f8c 100644 (file)
@@ -6,6 +6,7 @@
 #include "e_screensaver_intern.h"
 #include "e_config_intern.h"
 #include "e_client_intern.h"
+#include "e_keyrouter_wl_intern.h"
 
 #include <tizen-extension-server-protocol.h>
 
index 64db486..3fb9da9 100644 (file)
@@ -63,17 +63,13 @@ struct _E_Keyrouter_Config_Data
 
 struct _E_Keyrouter
 {
-   struct wl_global *global;
    Ecore_Event_Filter *ef_handler;
    Eina_List *handlers;
-   Eina_List *resources;
    Eina_List *ignore_list;
 
    E_Keyrouter_Config_Data *conf;
 
    E_Keyrouter_Grabbed_Key *HardKeys;
-   Eina_List *grab_surface_list;
-   Eina_List *grab_client_list;
 
    Eina_Bool isWindowStackChanged;
    int numTizenHWKeys;
@@ -213,21 +209,9 @@ EINTERN void e_keyrouter_conf_deinit(E_Keyrouter_Config_Data *kconfig);
 
 EINTERN int e_keyrouter_cb_picture_off(const int option, void *data);
 
-EINTERN Eina_Bool e_keyrouter_wl_init(void);
-EINTERN void      e_keyrouter_wl_shutdown(void);
-EINTERN int       e_keyrouter_wl_add_client_destroy_listener(struct wl_client *client);
-EINTERN int       e_keyrouter_wl_add_surface_destroy_listener(struct wl_resource *surface);
-#ifdef HAVE_CYNARA
-EINTERN Eina_Bool e_keyrouter_wl_util_do_privilege_check(struct wl_client *client, uint32_t mode, uint32_t keycode);
-#endif
-
 EINTERN int e_keyrouter_keygrab_set(struct wl_client *client, struct wl_resource *surface, int key, int mode);
 EINTERN int e_keyrouter_keygrab_unset(struct wl_client *client, struct wl_resource *surface, int key);
 
 EINTERN Eina_Bool e_keyrouter_event_process(void *event, E_Device *dev, int type);
 
-EINTERN Eina_Bool e_keyrouter_wl_key_send(Ecore_Event_Key *ev, E_Device *dev, Eina_Bool pressed, struct wl_client *client, struct wl_resource *surface, Eina_Bool focused);
-EINTERN void      e_keyrouter_keycancel_send(struct wl_client *client, struct wl_resource *surface, unsigned int key);
-EINTERN void      e_keyrouter_wl_event_surface_send(struct wl_resource *surface, int key, int mode);
-
 #endif
index 5704f00..fd92fa9 100644 (file)
@@ -1,6 +1,7 @@
 #include "e_keyrouter_intern.h"
 #include "e_input_thread_client_intern.h"
 #include "e_input_backend_intern.h"
+#include "e_keyrouter_wl_intern.h"
 
 #include <tizen-extension-server-protocol.h>
 
index 08d190d..d104c80 100644 (file)
@@ -1,4 +1,4 @@
-#include "e_keyrouter_intern.h"
+#include "e_keyrouter_wl_intern.h"
 #include "e_input_intern.h"
 #include "e_input_backend_intern.h"
 #include "e_comp_wl_input_intern.h"
@@ -8,23 +8,42 @@
 #include "e_comp_input_intern.h"
 #include "e_input_thread_client_intern.h"
 #include "e_security.h"
+#include "e_keyrouter_intern.h"
 
 #include <tizen-extension-server-protocol.h>
+#ifdef HAVE_CYNARA
+#include <cynara-client.h>
+#endif
+
+static E_Tizen_Keyrouter *g_tizen_keyrouter = NULL;
+
+struct _E_Tizen_Keyrouter
+{
+   struct wl_global *global;
+
+   Eina_List *resources;
+
+   Eina_List *grab_surface_list;
+   Eina_List *grab_client_list;
+
+#ifdef HAVE_CYNARA
+   cynara *p_cynara;
+#endif
+};
 
-void
+EINTERN void
 e_keyrouter_wl_event_surface_send(struct wl_resource *surface, int key, int mode)
 {
    Eina_List *l;
    struct wl_resource *res_data;
    struct wl_client *wc;
 
-   EINA_SAFETY_ON_NULL_RETURN(krt);
    EINA_SAFETY_ON_NULL_RETURN(surface);
 
    wc = wl_resource_get_client(surface);
    EINA_SAFETY_ON_NULL_RETURN(wc);
 
-   EINA_LIST_FOREACH(krt->resources, l, res_data)
+   EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, res_data)
      {
         if (wl_resource_get_client(res_data) != wc) continue;
         if (wl_resource_get_version(res_data) < 2) continue;
@@ -164,7 +183,7 @@ e_keyrouter_wl_key_send(Ecore_Event_Key *ev, E_Device *dev, Eina_Bool pressed, s
    return !!ec;
 }
 
-void
+EINTERN void
 e_keyrouter_keycancel_send(struct wl_client *client, struct wl_resource *surface, unsigned int key)
 {
    Eina_List *l;
@@ -186,7 +205,7 @@ e_keyrouter_keycancel_send(struct wl_client *client, struct wl_resource *surface
           {
              if (surface == data->surface)
                {
-                  EINA_LIST_FOREACH(krt->resources, l, resource)
+                  EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
                     {
                        if (wl_resource_get_client(resource) != wc) continue;
 
@@ -196,7 +215,7 @@ e_keyrouter_keycancel_send(struct wl_client *client, struct wl_resource *surface
           }
         else if (client == data->wc)
           {
-             EINA_LIST_FOREACH(krt->resources, l, resource)
+             EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
                {
                   if (wl_resource_get_client(resource) != wc) continue;
 
@@ -448,14 +467,13 @@ static const struct tizen_keyrouter_interface _e_keyrouter_implementation = {
 static void
 _e_keyrouter_cb_unbind(struct wl_resource *resource)
 {
-   krt->resources = eina_list_remove(krt->resources, resource);
+   g_tizen_keyrouter->resources = eina_list_remove(g_tizen_keyrouter->resources, resource);
 }
 
 /* tizen_keyrouter global object bind function */
 static void
 _e_keyrouter_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
 {
-   E_KeyrouterPtr krt_instance = data;
    struct wl_resource *resource;
 
    resource = wl_resource_create(client, &tizen_keyrouter_interface, version, id);
@@ -469,9 +487,9 @@ _e_keyrouter_cb_bind(struct wl_client *client, void *data, uint32_t version, uin
         return;
      }
 
-   krt->resources = eina_list_append(krt->resources, resource);
+   g_tizen_keyrouter->resources = eina_list_append(g_tizen_keyrouter->resources, resource);
 
-   wl_resource_set_implementation(resource, &_e_keyrouter_implementation, krt_instance, _e_keyrouter_cb_unbind);
+   wl_resource_set_implementation(resource, &_e_keyrouter_implementation, NULL, _e_keyrouter_cb_unbind);
 }
 
 static void
@@ -485,7 +503,7 @@ _e_keyrouter_wl_client_cb_destroy(struct wl_listener *l, void *data)
    wl_list_remove(&l->link);
    E_FREE(l);
 
-   krt->grab_client_list = eina_list_remove(krt->grab_client_list, client);
+   g_tizen_keyrouter->grab_client_list = eina_list_remove(g_tizen_keyrouter->grab_client_list, client);
 }
 
 static void
@@ -499,10 +517,10 @@ _e_keyrouter_wl_surface_cb_destroy(struct wl_listener *l, void *data)
    wl_list_remove(&l->link);
    E_FREE(l);
 
-   krt->grab_surface_list = eina_list_remove(krt->grab_surface_list, surface);
+   g_tizen_keyrouter->grab_surface_list = eina_list_remove(g_tizen_keyrouter->grab_surface_list, surface);
 }
 
-int
+EINTERN int
 e_keyrouter_wl_add_client_destroy_listener(struct wl_client *client)
 {
    struct wl_listener *destroy_listener = NULL;
@@ -511,7 +529,7 @@ e_keyrouter_wl_add_client_destroy_listener(struct wl_client *client)
 
    if (!client) return TIZEN_KEYROUTER_ERROR_NONE;
 
-   EINA_LIST_FOREACH(krt->grab_client_list, l, wc_data)
+   EINA_LIST_FOREACH(g_tizen_keyrouter->grab_client_list, l, wc_data)
      {
         if (wc_data)
           {
@@ -532,13 +550,13 @@ e_keyrouter_wl_add_client_destroy_listener(struct wl_client *client)
 
    destroy_listener->notify = _e_keyrouter_wl_client_cb_destroy;
    wl_client_add_destroy_listener(client, destroy_listener);
-   krt->grab_client_list = eina_list_append(krt->grab_client_list, client);
+   g_tizen_keyrouter->grab_client_list = eina_list_append(g_tizen_keyrouter->grab_client_list, client);
 
    return TIZEN_KEYROUTER_ERROR_NONE;
 }
 
 /* Function for registering wl_surface destroy listener */
-int
+EINTERN int
 e_keyrouter_wl_add_surface_destroy_listener(struct wl_resource *surface)
 {
    struct wl_listener *destroy_listener = NULL;
@@ -547,7 +565,7 @@ e_keyrouter_wl_add_surface_destroy_listener(struct wl_resource *surface)
 
    if (!surface) return TIZEN_KEYROUTER_ERROR_NONE;
 
-   EINA_LIST_FOREACH(krt->grab_surface_list, l, surface_data)
+   EINA_LIST_FOREACH(g_tizen_keyrouter->grab_surface_list, l, surface_data)
      {
         if (surface_data)
           {
@@ -568,7 +586,7 @@ e_keyrouter_wl_add_surface_destroy_listener(struct wl_resource *surface)
 
    destroy_listener->notify = _e_keyrouter_wl_surface_cb_destroy;
    wl_resource_add_destroy_listener(surface, destroy_listener);
-   krt->grab_surface_list = eina_list_append(krt->grab_surface_list, surface);
+   g_tizen_keyrouter->grab_surface_list = eina_list_append(g_tizen_keyrouter->grab_surface_list, surface);
 
    return TIZEN_KEYROUTER_ERROR_NONE;
 }
@@ -590,7 +608,7 @@ _e_keyrouter_wl_util_cynara_log(const char *func_name, int err)
    KLWRN("%s is failed: %s", func_name, buf);
 }
 
-Eina_Bool
+EINTERN EINTERN Eina_Bool
 e_keyrouter_wl_util_do_privilege_check(struct wl_client *client, uint32_t mode, uint32_t keycode)
 {
    int ret, retry_cnt=0;
@@ -613,7 +631,7 @@ e_keyrouter_wl_util_do_privilege_check(struct wl_client *client, uint32_t mode,
    if (!client) return EINA_FALSE;
 
    /* If initialize cynara is failed, allow keygrabs regardless of the privilege permission. */
-   if (krt->p_cynara == NULL)
+   if (g_tizen_keyrouter->p_cynara == NULL)
      {
         if (retried == EINA_FALSE)
           {
@@ -621,11 +639,11 @@ e_keyrouter_wl_util_do_privilege_check(struct wl_client *client, uint32_t mode,
              for(retry_cnt = 0; retry_cnt < 5; retry_cnt++)
                {
                   KLDBG("Retry cynara initialize: %d", retry_cnt+1);
-                  ret = cynara_initialize(&krt->p_cynara, NULL);
+                  ret = cynara_initialize(&g_tizen_keyrouter->p_cynara, NULL);
                   if (EINA_UNLIKELY(CYNARA_API_SUCCESS != ret))
                     {
                       _e_keyrouter_wl_util_cynara_log("cynara_initialize", ret);
-                       krt->p_cynara = NULL;
+                       g_tizen_keyrouter->p_cynara = NULL;
                     }
                   else
                     {
@@ -637,7 +655,7 @@ e_keyrouter_wl_util_do_privilege_check(struct wl_client *client, uint32_t mode,
         return EINA_TRUE;
      }
 
-   EINA_LIST_FOREACH(krt->grab_client_list, l, wc_data)
+   EINA_LIST_FOREACH(g_tizen_keyrouter->grab_client_list, l, wc_data)
      {
         if (wc_data == client)
           {
@@ -659,30 +677,36 @@ finish:
 }
 #endif
 
-Eina_Bool
-e_keyrouter_wl_init(void)
+EINTERN E_Tizen_Keyrouter *
+e_keyrouter_wl_init(struct wl_display *display)
 {
-   int ret;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(display, NULL);
+
+   if (g_tizen_keyrouter) return g_tizen_keyrouter;
 
-   EINA_SAFETY_ON_NULL_RETURN_VAL(krt, EINA_FALSE);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, EINA_FALSE);
+   g_tizen_keyrouter = E_NEW(E_Tizen_Keyrouter, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(g_tizen_keyrouter, NULL);
 
-   krt->global = wl_global_create(e_comp_wl->wl.disp, &tizen_keyrouter_interface, 2, krt, _e_keyrouter_cb_bind);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(krt->global, EINA_FALSE);
+
+   g_tizen_keyrouter->global = wl_global_create(display,
+                  &tizen_keyrouter_interface, 2, NULL, _e_keyrouter_cb_bind);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(g_tizen_keyrouter->global, NULL);
 
 #ifdef HAVE_CYNARA
-   ret = cynara_initialize(&krt->p_cynara, NULL);
+   int ret;
+
+   ret = cynara_initialize(&g_tizen_keyrouter->p_cynara, NULL);
    if (EINA_UNLIKELY(CYNARA_API_SUCCESS != ret))
      {
         _e_keyrouter_wl_util_cynara_log("cynara_initialize", ret);
-        krt->p_cynara = NULL;
+        g_tizen_keyrouter->p_cynara = NULL;
      }
 #endif
 
-   return EINA_TRUE;
+   return g_tizen_keyrouter;
 }
 
-void
+EINTERN void
 e_keyrouter_wl_shutdown(void)
 {
    Eina_List *l, *l_next;
@@ -690,9 +714,9 @@ e_keyrouter_wl_shutdown(void)
    struct wl_client *client;
    struct wl_listener *destroy_listener;
 
-   EINA_SAFETY_ON_NULL_RETURN(krt);
+   if (!g_tizen_keyrouter) return;
 
-   EINA_LIST_FOREACH_SAFE(krt->grab_client_list, l, l_next, client)
+   EINA_LIST_FOREACH_SAFE(g_tizen_keyrouter->grab_client_list, l, l_next, client)
      {
         destroy_listener = wl_client_get_destroy_listener(client, _e_keyrouter_wl_client_cb_destroy);
         if (destroy_listener)
@@ -700,9 +724,9 @@ e_keyrouter_wl_shutdown(void)
              wl_list_remove(&destroy_listener->link);
              E_FREE(destroy_listener);
           }
-        krt->grab_client_list = eina_list_remove(krt->grab_client_list, client);
+        g_tizen_keyrouter->grab_client_list = eina_list_remove(g_tizen_keyrouter->grab_client_list, client);
      }
-   EINA_LIST_FOREACH_SAFE(krt->grab_surface_list, l, l_next, resource)
+   EINA_LIST_FOREACH_SAFE(g_tizen_keyrouter->grab_surface_list, l, l_next, resource)
      {
         destroy_listener = wl_resource_get_destroy_listener(resource, _e_keyrouter_wl_surface_cb_destroy);
         if (destroy_listener)
@@ -710,15 +734,20 @@ e_keyrouter_wl_shutdown(void)
              wl_list_remove(&destroy_listener->link);
              E_FREE(destroy_listener);
           }
-        krt->grab_surface_list = eina_list_remove(krt->grab_surface_list, client);
+        g_tizen_keyrouter->grab_surface_list = eina_list_remove(g_tizen_keyrouter->grab_surface_list, client);
      }
 
-   EINA_LIST_FREE(krt->resources, resource)
+   EINA_LIST_FREE(g_tizen_keyrouter->resources, resource)
      wl_resource_destroy(resource);
 
-   if (krt->global) wl_global_destroy(krt->global);
+   if (g_tizen_keyrouter->global)
 
 #ifdef HAVE_CYNARA
-   if (krt->p_cynara) cynara_finish(krt->p_cynara);
+   if (g_tizen_keyrouter->p_cynara)
+     cynara_finish(g_tizen_keyrouter->p_cynara);
 #endif
+
+   wl_global_destroy(g_tizen_keyrouter->global);
+
+   E_FREE(g_tizen_keyrouter);
 }
diff --git a/src/bin/server/e_keyrouter_wl_intern.h b/src/bin/server/e_keyrouter_wl_intern.h
new file mode 100644 (file)
index 0000000..60bde8c
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef E_KEYROUTER_WL_INTERN_H
+#define E_KEYROUTER_WL_INTERN_H
+
+#include "e_intern.h"
+#include "e_device_intern.h"
+
+#include <wayland-server.h>
+
+typedef struct _E_Tizen_Keyrouter E_Tizen_Keyrouter;
+
+EINTERN E_Tizen_Keyrouter *e_keyrouter_wl_init(struct wl_display *display);
+EINTERN void               e_keyrouter_wl_shutdown(void);
+
+EINTERN int       e_keyrouter_wl_add_client_destroy_listener(struct wl_client *client);
+EINTERN int       e_keyrouter_wl_add_surface_destroy_listener(struct wl_resource *surface);
+EINTERN Eina_Bool e_keyrouter_wl_key_send(Ecore_Event_Key *ev, E_Device *dev, Eina_Bool pressed, struct wl_client *client, struct wl_resource *surface, Eina_Bool focused);
+EINTERN void      e_keyrouter_keycancel_send(struct wl_client *client, struct wl_resource *surface, unsigned int key);
+EINTERN void      e_keyrouter_wl_event_surface_send(struct wl_resource *surface, int key, int mode);
+
+EINTERN Eina_Bool e_keyrouter_wl_util_do_privilege_check(struct wl_client *client, uint32_t mode, uint32_t keycode);
+
+#endif
index 601e97f..78382b7 100644 (file)
@@ -23,6 +23,7 @@
 #include "e_comp_wl_tizen_hwc_intern.h"
 #include "e_tizen_surface_shm_intern.h"
 #include "e_devicemgr_wl_intern.h"
+#include "e_keyrouter_wl_intern.h"
 
 typedef struct _E_Server E_Server;
 
@@ -58,6 +59,7 @@ struct _E_Server
         Dummy_Handle *tizen_hwc_handle;
         E_Tizen_Surface_Shm *tizen_surface_shm;
         E_Tizen_Devicemgr *tizen_devicemgr_handle;
+        Dummy_Handle *tizen_keyrouter_handle;
     } handles; // feature handles
 };
 
@@ -125,6 +127,7 @@ e_server_init(void)
 
    e_server_feature_register(E_SERVER_FEATURE_TIZEN_SURFACE_SHM, e_tizen_surface_shm_init(e_comp_wl->wl.disp));
    e_server_feature_register(E_SERVER_FEATURE_TIZEN_DEVICEMGR, e_devicemgr_wl_init(e_comp_wl->wl.disp));
+   e_server_feature_register(E_SERVER_FEATURE_TIZEN_KEYROUTER, e_keyrouter_wl_init(e_comp_wl->wl.disp));
 
    return EINA_TRUE;
 }
@@ -132,8 +135,9 @@ e_server_init(void)
 EINTERN void
 e_server_shutdown(void)
 {
-   e_tizen_surface_shm_shutdown();
+   e_keyrouter_wl_shutdown();
    e_devicemgr_wl_shutdown();
+   e_tizen_surface_shm_shutdown();
    e_comp_wl_tizen_hwc_shutdown();
    e_screen_rotation_shutdown();
    e_linux_dmabuf_shutdown();
@@ -243,6 +247,9 @@ e_server_feature_register(E_SERVER_FEATURE feature, void *handle)
        case E_SERVER_FEATURE_TIZEN_DEVICEMGR:
          g_server->handles.tizen_devicemgr_handle = handle;
          break;
+       case E_SERVER_FEATURE_TIZEN_KEYROUTER:
+         g_server->handles.tizen_keyrouter_handle = handle;
+         break;
        default:
          ERR("Unknown feature(%d) and handle(%p)", feature, handle);
          break;
@@ -330,6 +337,9 @@ e_server_feature_handle_get(E_SERVER_FEATURE feature)
        case E_SERVER_FEATURE_TIZEN_DEVICEMGR:
          handle = g_server->handles.tizen_devicemgr_handle;
          break;
+       case E_SERVER_FEATURE_TIZEN_KEYROUTER:
+         handle = g_server->handles.tizen_keyrouter_handle;
+         break;
        default:
          ERR("Unknown feature(%d)", feature);
          break;
index 11af82e..37974e2 100644 (file)
@@ -28,6 +28,7 @@ typedef enum _E_SERVER_FEATURE {
     E_SERVER_FEATURE_TIZEN_HWC,
     E_SERVER_FEATURE_TIZEN_SURFACE_SHM,
     E_SERVER_FEATURE_TIZEN_DEVICEMGR,
+    E_SERVER_FEATURE_TIZEN_KEYROUTER,
     E_SERVER_FEATURE_MAX
 } E_SERVER_FEATURE;