Added hookpoint for notification of shell surface ready 81/68281/2
authorMinJeong Kim <minjjj.kim@samsung.com>
Tue, 3 May 2016 08:06:49 +0000 (17:06 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Tue, 3 May 2016 08:32:06 +0000 (01:32 -0700)
Change-Id: I6702a1cba0c1fc62cc4e144cf38e03b657145d48

src/bin/e_comp_wl.c
src/bin/e_comp_wl.h
src/modules/wl_desktop_shell/e_mod_main.c

index 2805797caf8b36982f62315064b797313735d19f..8a8b4c737f7b3167fa8ccea4570132155ded2df3 100644 (file)
@@ -52,7 +52,50 @@ static Eina_Bool need_send_leave = EINA_TRUE;
 static Eina_Bool need_send_released = EINA_FALSE;
 static Eina_Bool need_send_motion = EINA_TRUE;
 
+static int _e_comp_wl_hooks_delete = 0;
+static int _e_comp_wl_hooks_walking = 0;
+
+static Eina_Inlist *_e_comp_wl_hooks[] =
+{
+   [E_COMP_WL_HOOK_SHELL_SURFACE_READY] = NULL,
+};
+
 /* local functions */
+static void
+_e_comp_wl_hooks_clean(void)
+{
+   Eina_Inlist *l;
+   E_Comp_Wl_Hook *ch;
+   unsigned int x;
+   for (x = 0; x < E_COMP_WL_HOOK_LAST; x++)
+     EINA_INLIST_FOREACH_SAFE(_e_comp_wl_hooks[x], l, ch)
+       {
+          if (!ch->delete_me) continue;
+          _e_comp_wl_hooks[x] = eina_inlist_remove(_e_comp_wl_hooks[x], EINA_INLIST_GET(ch));
+         free(ch); 
+       }
+}
+
+static void
+_e_comp_wl_hook_call(E_Comp_Wl_Hook_Point hookpoint, E_Client *ec)
+{
+   E_Comp_Wl_Hook *ch;
+
+   e_object_ref(E_OBJECT(ec));
+   _e_comp_wl_hooks_walking++;
+   EINA_INLIST_FOREACH(_e_comp_wl_hooks[hookpoint], ch)
+     {
+        if (ch->delete_me) continue;
+        ch->func(ch->data, ec);
+        if (e_object_is_del(E_OBJECT(ec)))
+          break;
+     }
+   _e_comp_wl_hooks_walking--;
+   if ((_e_comp_wl_hooks_walking == 0) && (_e_comp_wl_hooks_delete > 0))
+     _e_comp_wl_hooks_clean();
+   e_object_unref(E_OBJECT(ec));
+}
+
 static void
 _e_comp_wl_configure_send(E_Client *ec, Eina_Bool edges, Eina_Bool send_size)
 {
@@ -5048,3 +5091,39 @@ e_comp_wl_touch_cancel(void)
 {
    _e_comp_wl_touch_cancel();
 }
+
+E_API E_Comp_Wl_Hook *
+e_comp_wl_hook_add(E_Comp_Wl_Hook_Point hookpoint, E_Comp_Wl_Hook_Cb func, const void *data)
+{
+   E_Comp_Wl_Hook *ch;
+
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_COMP_WL_HOOK_LAST, NULL);
+   ch = E_NEW(E_Comp_Wl_Hook, 1);
+   if (!ch) return NULL;
+   ch->hookpoint = hookpoint;
+   ch->func = func;
+   ch->data = (void*)data;
+   _e_comp_wl_hooks[hookpoint] = eina_inlist_append(_e_comp_wl_hooks[hookpoint], EINA_INLIST_GET(ch));
+   return ch;
+}
+
+E_API void
+e_comp_wl_hook_del(E_Comp_Wl_Hook *ch)
+{
+   ch->delete_me = 1;
+   if (_e_comp_wl_hooks_walking == 0)
+     {
+        _e_comp_wl_hooks[ch->hookpoint] = eina_inlist_remove(_e_comp_wl_hooks[ch->hookpoint], EINA_INLIST_GET(ch));
+        free(ch);
+     }
+   else
+     _e_comp_wl_hooks_delete++;
+}
+
+E_API void
+e_comp_wl_shell_surface_ready(E_Client *ec)
+{
+   if (!ec) return;
+
+   _e_comp_wl_hook_call(E_COMP_WL_HOOK_SHELL_SURFACE_READY, ec);
+}
index d5b84f9bcc85ab9948abf5740768b2aa7a693d96..b6fc268435515c3c028f3f1a24d92cbde37f9eb6 100644 (file)
@@ -51,6 +51,7 @@ typedef struct _E_Comp_Wl_Client_Data E_Comp_Wl_Client_Data;
 typedef struct _E_Comp_Wl_Data E_Comp_Wl_Data;
 typedef struct _E_Comp_Wl_Output E_Comp_Wl_Output;
 typedef struct _E_Comp_Wl_Input_Device E_Comp_Wl_Input_Device;
+typedef struct _E_Comp_Wl_Hook E_Comp_Wl_Hook;
 
 typedef enum _E_Comp_Wl_Buffer_Type
 {
@@ -61,6 +62,14 @@ typedef enum _E_Comp_Wl_Buffer_Type
    E_COMP_WL_BUFFER_TYPE_TBM = 4,
 } E_Comp_Wl_Buffer_Type;
 
+typedef enum _E_Comp_Wl_Hook_Point
+{
+   E_COMP_WL_HOOK_SHELL_SURFACE_READY,
+   E_COMP_WL_HOOK_LAST,
+} E_Comp_Wl_Hook_Point;
+
+typedef void (*E_Comp_Wl_Hook_Cb) (void *data, E_Client *ec);
+
 struct _E_Comp_Wl_Aux_Hint
 {
    int           id;
@@ -469,6 +478,15 @@ struct _E_Comp_Wl_Output
    void *data;
 };
 
+struct _E_Comp_Wl_Hook
+{
+   EINA_INLIST;
+   E_Comp_Wl_Hook_Point hookpoint;
+   E_Comp_Wl_Hook_Cb func;
+   void *data;
+   unsigned char delete_me : 1;
+};
+
 E_API Eina_Bool e_comp_wl_init(void);
 EINTERN void e_comp_wl_shutdown(void);
 
@@ -492,6 +510,11 @@ EINTERN Eina_Bool e_comp_wl_key_up(Ecore_Event_Key *ev);
 E_API Eina_Bool e_comp_wl_evas_handle_mouse_button(E_Client *ec, uint32_t timestamp, uint32_t button_id, uint32_t state);
 E_API void        e_comp_wl_touch_cancel(void);
 
+E_API E_Comp_Wl_Hook *e_comp_wl_hook_add(E_Comp_Wl_Hook_Point hookpoint, E_Comp_Wl_Hook_Cb func, const void *data);
+E_API void e_comp_wl_hook_del(E_Comp_Wl_Hook *ch);
+
+E_API void e_comp_wl_shell_surface_ready(E_Client *ec);
+
 E_API extern int E_EVENT_WAYLAND_GLOBAL_ADD;
 
 # endif
index 15e24b798983a8b6f751c87b93d8bc05388d2ed0..bd586c3ab84a29baeb48534f847878c526b6fa7a 100644 (file)
@@ -582,6 +582,8 @@ _e_shell_cb_shell_surface_get(struct wl_client *client, struct wl_resource *reso
    cdata->shell.ping = _e_shell_surface_ping;
    cdata->shell.map = _e_shell_surface_map;
    cdata->shell.unmap = _e_shell_surface_unmap;
+
+   e_comp_wl_shell_surface_ready(ec);
 }
 
 static void
@@ -1237,6 +1239,8 @@ _e_xdg_shell_cb_surface_get(struct wl_client *client, struct wl_resource *resour
      ec->border.changed = ec->changes.border = !ec->borderless;
    ec->netwm.type = E_WINDOW_TYPE_NORMAL;
    ec->comp_data->set_win_type = EINA_TRUE;
+
+   e_comp_wl_shell_surface_ready(ec);
 }
 
 static void