e_output: add hook for output add/remove 99/210799/3
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 25 Jul 2019 01:37:53 +0000 (10:37 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 5 Aug 2019 07:16:59 +0000 (07:16 +0000)
Change-Id: Ic51ffd3eb2b9107943a2a4edc0c25e796494a9ab

src/bin/e_comp_screen.c
src/bin/e_eom.c
src/bin/e_eom.h
src/bin/e_output.c
src/bin/e_output.h

index 8cf790e..4845995 100644 (file)
@@ -578,7 +578,6 @@ _e_comp_screen_output_destroy_cb(tdm_output *toutput, void *user_data)
           {
              e_comp_screen->num_outputs--;
              e_comp_screen->outputs = eina_list_remove_list(e_comp_screen->outputs, l);
-             e_eom_destroy(output);
              e_output_del(output);
           }
      }
@@ -626,7 +625,6 @@ _e_comp_screen_output_create_cb(tdm_display *dpy, tdm_output *toutput, void *use
         return;
      }
 
-   e_eom_create(output, EINA_TRUE);
    e_comp_screen->outputs = eina_list_append(e_comp_screen->outputs, output);
    e_comp_screen->num_outputs++;
 
index eaf2a30..2bedf9c 100644 (file)
@@ -97,6 +97,8 @@ struct _E_Eom
    Eina_List *added_outputs;
    E_Output_Hook *output_connect_status_hook;
    E_Output_Hook *output_mode_changes_hook;
+   E_Output_Hook *output_add_hook;
+   E_Output_Hook *output_remove_hook;
 
    /* Internal output data */
    E_Output *output_primary;
@@ -1180,6 +1182,71 @@ _e_eom_output_find_added_output(E_Output *output)
    return eom_output;
 }
 
+static Eina_Bool
+_e_eom_create(E_Output *output, Eina_Bool added)
+{
+   E_EomOutputPtr eom_output = NULL;
+
+   if (!g_eom) return EINA_TRUE;
+
+   eom_output = E_NEW(E_EomOutput, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE);
+
+   eom_output->id = output->index;
+   eom_output->mode = EOM_OUTPUT_MODE_NONE;
+   eom_output->connection = WL_EOM_STATUS_NONE;
+   eom_output->eout = output;
+   EINA_SAFETY_ON_NULL_GOTO(eom_output->eout, err);
+
+   eom_output->output = output->toutput;
+   eom_output->type = (eom_output_type_e)output->toutput_type;
+
+   eom_output->connection_status = EINA_FALSE;
+   eom_output->width = 0;
+   eom_output->height = 0;
+   eom_output->phys_width = 0;
+   eom_output->phys_height = 0;
+   eom_output->added = added;
+
+   if (eom_output->added)
+     g_eom->added_outputs = eina_list_append(g_eom->added_outputs, eom_output);
+   else
+     g_eom->eom_outputs = eina_list_append(g_eom->eom_outputs, eom_output);
+
+   EOINF("create (%d)output, type:%d, name:%s added:%d", eom_output->eout,
+         eom_output->id, eom_output->type, eom_output->name, eom_output->added);
+
+   return EINA_TRUE;
+
+err:
+   E_FREE(eom_output);
+
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_e_eom_destroy(E_Output *output)
+{
+   E_EomOutputPtr eom_output = NULL;
+
+   if (!g_eom) return EINA_TRUE;
+
+   eom_output = _e_eom_output_find_added_output(output);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE);
+
+   EOINF("destroy (%d)output, type:%d, name:%s added:%d", eom_output->eout,
+         eom_output->id, eom_output->type, eom_output->name, eom_output->added);
+
+   if (eom_output->added)
+     g_eom->added_outputs = eina_list_remove(g_eom->added_outputs, eom_output);
+   else
+     g_eom->eom_outputs = eina_list_remove(g_eom->eom_outputs, eom_output);
+
+   E_FREE(eom_output);
+
+   return EINA_TRUE;
+}
+
 static void
 _e_eom_output_deinit(void)
 {
@@ -1190,13 +1257,13 @@ _e_eom_output_deinit(void)
    if (!g_eom->eom_outputs) return;
 
    EINA_LIST_FOREACH(g_eom->added_outputs, l, eom_output)
-     e_eom_destroy(eom_output->eout);
+     _e_eom_destroy(eom_output->eout);
 
    eina_list_free(g_eom->eom_outputs);
    g_eom->added_outputs = NULL;
 
    EINA_LIST_FOREACH(g_eom->eom_outputs, l, eom_output)
-     e_eom_destroy(eom_output->eout);
+     _e_eom_destroy(eom_output->eout);
 
    eina_list_free(g_eom->eom_outputs);
    g_eom->eom_outputs = NULL;
@@ -1223,9 +1290,9 @@ _e_eom_output_init(void)
         if (!output) continue;
         if (output == g_eom->output_primary) continue;
 
-        if (!e_eom_create(output, EINA_FALSE))
+        if (!_e_eom_create(output, EINA_FALSE))
           {
-             EOERR("e_eom_create fails.", output);
+             EOERR("_e_eom_create fails.", output);
              goto err;
           }
      }
@@ -2309,12 +2376,54 @@ _e_eom_output_cb_output_mode_change(void *data, E_Output *output)
 }
 
 static void
+_e_eom_output_cb_output_add(void *data, E_Output *output)
+{
+   EINA_SAFETY_ON_NULL_RETURN(g_eom->output_primary);
+
+   /* doesn't care about the pirmary output */
+   if (g_eom->output_primary == output) return;
+
+   if (!_e_eom_create(output, EINA_TRUE))
+     {
+        EOERR("_e_eom_create fails.", output);
+        return;
+     }
+}
+
+static void
+_e_eom_output_cb_output_remove(void *data, E_Output *output)
+{
+   EINA_SAFETY_ON_NULL_RETURN(g_eom->output_primary);
+
+   /* doesn't care about the pirmary output */
+   if (g_eom->output_primary == output) return;
+
+   if (!_e_eom_destroy(output))
+     {
+        EOERR("_e_eom_destroy fails.", output);
+        return;
+     }
+}
+
+static void
 _e_eom_deinit()
 {
    Ecore_Event_Handler *h = NULL;
 
    if (g_eom == NULL) return;
 
+   if (g_eom->output_remove_hook)
+     {
+        e_output_hook_del(g_eom->output_remove_hook);
+        g_eom->output_remove_hook = NULL;
+     }
+
+   if (g_eom->output_add_hook)
+     {
+        e_output_hook_del(g_eom->output_add_hook);
+        g_eom->output_add_hook = NULL;
+     }
+
    if (g_eom->output_mode_changes_hook)
      {
         e_output_hook_del(g_eom->output_mode_changes_hook);
@@ -2379,6 +2488,8 @@ _e_eom_init()
 
    g_eom->output_connect_status_hook = e_output_hook_add(E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE, _e_eom_output_cb_output_connect_status_change, g_eom);
    g_eom->output_mode_changes_hook = e_output_hook_add(E_OUTPUT_HOOK_MODE_CHANGE, _e_eom_output_cb_output_mode_change, g_eom);
+   g_eom->output_add_hook = e_output_hook_add(E_OUTPUT_HOOK_ADD, _e_eom_output_cb_output_add, g_eom);
+   g_eom->output_remove_hook = e_output_hook_add(E_OUTPUT_HOOK_REMOVE, _e_eom_output_cb_output_remove, g_eom);
 
    return EINA_TRUE;
 
@@ -2423,69 +2534,4 @@ e_eom_is_ec_external(E_Client *ec)
      return EINA_FALSE;
 
    return EINA_TRUE;
-}
-
-EINTERN Eina_Bool
-e_eom_create(E_Output *output, Eina_Bool added)
-{
-   E_EomOutputPtr eom_output = NULL;
-
-   if (!g_eom) return EINA_TRUE;
-
-   eom_output = E_NEW(E_EomOutput, 1);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE);
-
-   eom_output->id = output->index;
-   eom_output->mode = EOM_OUTPUT_MODE_NONE;
-   eom_output->connection = WL_EOM_STATUS_NONE;
-   eom_output->eout = output;
-   EINA_SAFETY_ON_NULL_GOTO(eom_output->eout, err);
-
-   eom_output->output = output->toutput;
-   eom_output->type = (eom_output_type_e)output->toutput_type;
-
-   eom_output->connection_status = EINA_FALSE;
-   eom_output->width = 0;
-   eom_output->height = 0;
-   eom_output->phys_width = 0;
-   eom_output->phys_height = 0;
-   eom_output->added = added;
-
-   if (eom_output->added)
-     g_eom->added_outputs = eina_list_append(g_eom->added_outputs, eom_output);
-   else
-     g_eom->eom_outputs = eina_list_append(g_eom->eom_outputs, eom_output);
-
-   EOINF("create (%d)output, type:%d, name:%s added:%d", eom_output->eout,
-         eom_output->id, eom_output->type, eom_output->name, eom_output->added);
-
-   return EINA_TRUE;
-
-err:
-   E_FREE(eom_output);
-
-   return EINA_FALSE;
-}
-
-EINTERN Eina_Bool
-e_eom_destroy(E_Output *output)
-{
-   E_EomOutputPtr eom_output = NULL;
-
-   if (!g_eom) return EINA_TRUE;
-
-   eom_output = _e_eom_output_find_added_output(output);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE);
-
-   EOINF("destroy (%d)output, type:%d, name:%s added:%d", eom_output->eout,
-         eom_output->id, eom_output->type, eom_output->name, eom_output->added);
-
-   if (eom_output->added)
-     g_eom->added_outputs = eina_list_remove(g_eom->added_outputs, eom_output);
-   else
-     g_eom->eom_outputs = eina_list_remove(g_eom->eom_outputs, eom_output);
-
-   E_FREE(eom_output);
-
-   return EINA_TRUE;
-}
+}
\ No newline at end of file
index 751c210..0f5761d 100644 (file)
@@ -8,8 +8,8 @@
 
 EINTERN int e_eom_init(void);
 EINTERN int e_eom_shutdown(void);
+
 E_API   Eina_Bool e_eom_is_ec_external(E_Client *ec);
-EINTERN Eina_Bool e_eom_create(E_Output *output, Eina_Bool added);
-EINTERN Eina_Bool e_eom_destroy(E_Output *output);
+
 #endif
 #endif
index d4d7a39..3ac867a 100644 (file)
@@ -54,6 +54,8 @@ static Eina_Inlist *_e_output_hooks[] =
    [E_OUTPUT_HOOK_DPMS_CHANGE] = NULL,
    [E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE] = NULL,
    [E_OUTPUT_HOOK_MODE_CHANGE] = NULL,
+   [E_OUTPUT_HOOK_ADD] = NULL,
+   [E_OUTPUT_HOOK_REMOVE] = NULL,
 };
 
 static int _e_output_intercept_hooks_delete = 0;
@@ -2336,6 +2338,9 @@ e_output_new(E_Comp_Screen *e_comp_screen, int index)
    if (output_caps & TDM_OUTPUT_CAPABILITY_ASYNC_DPMS)
      output->dpms_async = EINA_TRUE;
 
+   /* call output add hook */
+   _e_output_hook_call(E_OUTPUT_HOOK_ADD, output);
+
    return output;
 
 fail:
@@ -2352,6 +2357,9 @@ e_output_del(E_Output *output)
 
    if (!output) return;
 
+   /* call output remove hook */
+   _e_output_hook_call(E_OUTPUT_HOOK_REMOVE, output);
+
    if (output->hwc) e_hwc_del(output->hwc);
 
    e_plane_shutdown();
index 8e7770d..75d593e 100644 (file)
@@ -137,6 +137,8 @@ enum _E_Output_Hook_Point
    E_OUTPUT_HOOK_DPMS_CHANGE,
    E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE,
    E_OUTPUT_HOOK_MODE_CHANGE,
+   E_OUTPUT_HOOK_ADD,
+   E_OUTPUT_HOOK_REMOVE,
    E_OUTPUT_HOOK_LAST
 };