Manage outputs on hash with key by given pointer window. 01/68601/3
authorSeunghun Lee <shiin.lee@samsung.com>
Sun, 8 May 2016 11:01:08 +0000 (20:01 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Tue, 10 May 2016 04:04:51 +0000 (13:04 +0900)
if given window already composited, adding output will be skipped.
and if given window is deleted, added output also deleted together.

Change-Id: I705b004f63279074f22588b5301bba585fbc4c41

src/lib/compositor.c
src/lib/output.c
src/lib/private.h

index aa8d14825fa30bc71061684239d99db4777ada9f..30bcdd95ff0b0eae8e289ccac02737c6a707be2e 100644 (file)
@@ -88,11 +88,70 @@ _pepper_efl_compositor_get_socket_fd_from_server(pepper_efl_comp_t *comp)
    return fd;
 }
 
+static void
+_pepper_efl_compositor_output_del(pepper_efl_comp_t *comp, Evas_Object *eo)
+{
+   pepper_efl_output_t *output;
+
+   output = eina_hash_find(comp->output_hash, &eo);
+   if (EINA_UNLIKELY(!output))
+     return;
+
+   pepper_efl_output_destroy(output);
+   eina_hash_del(comp->output_hash, &eo, output);
+}
+
+static void
+_pepper_efl_compositor_win_cb_del(void *data, Evas *e, Evas_Object *eo, void *event_info)
+{
+   pepper_efl_comp_t *comp;
+
+   comp = data;
+   if (EINA_UNLIKELY(!comp))
+     return;
+
+   _pepper_efl_compositor_output_del(comp, eo);
+}
+
+static Eina_Bool
+_pepper_efl_compositor_output_add(pepper_efl_comp_t *comp, Evas_Object *eo)
+{
+   pepper_efl_output_t *output;
+
+   output = eina_hash_find(comp->output_hash, &eo);
+   if (output)
+     {
+        ERR("Already compositing given window.");
+        return EINA_TRUE;
+     }
+
+   output = pepper_efl_output_create(comp, eo);
+   if (!output)
+     return EINA_FALSE;
+
+   evas_object_event_callback_add(eo, EVAS_CALLBACK_DEL, _pepper_efl_compositor_win_cb_del, comp);
+   eina_hash_add(comp->output_hash, &eo, output);
+
+   return EINA_TRUE;
+}
+
+static void
+_pepper_efl_compositor_output_all_del(pepper_efl_comp_t *comp)
+{
+   pepper_efl_output_t *output;
+   Eina_Iterator *itr;
+
+   itr = eina_hash_iterator_data_new(comp->output_hash);
+   EINA_ITERATOR_FOREACH(itr, output)
+      pepper_efl_output_destroy(output);
+   eina_iterator_free(itr);
+   PE_FREE_FUNC(comp->output_hash, eina_hash_free);
+}
+
 Eina_Bool
 pepper_efl_compositor_destroy(const char *name)
 {
    pepper_efl_comp_t *comp;
-   pepper_efl_output_t *output;
 
    if (!name)
      return EINA_FALSE;
@@ -106,8 +165,7 @@ pepper_efl_compositor_destroy(const char *name)
         return EINA_FALSE;
      }
 
-   EINA_LIST_FREE(comp->output_list, output)
-      pepper_efl_output_destroy(output);
+   _pepper_efl_compositor_output_all_del(comp);
 
    pepper_efl_shell_shutdown();
 
@@ -133,11 +191,11 @@ const char *
 pepper_efl_compositor_create(Evas_Object *win, const char *name)
 {
    pepper_efl_comp_t *comp;
-   pepper_efl_output_t *output;
    Eina_Bool first_init = EINA_FALSE;
    int loop_fd;
    int socket_fd = -1;
    const char *sock_name;
+   Eina_Bool res = EINA_FALSE;
 
    pthread_mutex_lock(&_comp_hash_lock);
 
@@ -175,6 +233,8 @@ pepper_efl_compositor_create(Evas_Object *win, const char *name)
         goto err_alloc;
      }
 
+   comp->output_hash = eina_hash_pointer_new(NULL);
+
    DBG("Get socket_fd from server");
    socket_fd = _pepper_efl_compositor_get_socket_fd_from_server(comp);
    if (socket_fd == -1)
@@ -227,10 +287,10 @@ pepper_efl_compositor_create(Evas_Object *win, const char *name)
                                               comp);
 
 create_output:
-   output = pepper_efl_output_create(comp, win);
-   if (!output)
+   res = _pepper_efl_compositor_output_add(comp, win);
+   if (!res)
      {
-        ERR("failed to create output");
+        ERR("failed to add output");
 
         if (first_init)
           goto err_output;
@@ -239,7 +299,6 @@ create_output:
 
         return NULL;
      }
-   comp->output_list = eina_list_append(comp->output_list, output);
 
    eina_hash_add(_comp_hash, comp->name, comp);
 
@@ -261,6 +320,7 @@ err_shell:
    pepper_compositor_destroy(comp->pepper.comp);
 
 err_comp:
+   eina_hash_free(comp->output_hash);
    free(comp);
 
 err_alloc:
index bed564ca6200ee29d16b62b8af2e21369ae9eda2..7cde438390ac65bb3a19ac2802b80b6197155b19 100644 (file)
@@ -12,7 +12,7 @@ _pepper_efl_output_destroy(void *o)
    DBG("callback output");
 
    PE_FREE_FUNC(output->primary_plane, pepper_plane_destroy);
-   comp->output_list = eina_list_remove(comp->output_list, output);
+   eina_hash_del_by_data(comp->output_hash, output);
    free(output);
 }
 
index b4ca9cf903b6162bbb16746a70b1b4c57cb24aa2..0bf9666d94b3fd01b0253b468e36e2cf1b13ac15 100644 (file)
@@ -24,7 +24,8 @@ struct pepper_efl_comp
    Eina_Stringshare *name;
    Evas_Object *screen;
    Ecore_Fd_Handler *fd_hdlr;
-   Eina_List *output_list;
+
+   Eina_Hash *output_hash;
 
    pepper_efl_input_t *input;
    pepper_efl_shell_t *shell;