e_output: use the call E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE instead of e_eom_connect... 97/210797/3
authorSooChan Lim <sc1.lim@samsung.com>
Wed, 24 Jul 2019 12:16:52 +0000 (21:16 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 5 Aug 2019 07:16:45 +0000 (07:16 +0000)
Change-Id: Ice450dc51cb3523ac9b8da9b6cea8ed5ace39c7c

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

index 033c071d8f49b77503266d56b9b8f65887dd58cd..9f70e7423c15d8e3270639a7d2ddfd8f74cf0c54 100644 (file)
@@ -95,6 +95,7 @@ struct _E_Eom
    Eina_List *hooks;
    Eina_List *comp_object_intercept_hooks;
    Eina_List *added_outputs;
+   E_Output_Hook *output_connect_status_hook;
 
    /* Internal output data */
    E_Output *output_primary;
@@ -2095,110 +2096,8 @@ _e_eom_cb_client_buffer_change(void *data, int type, void *event)
    return ECORE_CALLBACK_PASS_ON;
 }
 
-static void
-_e_eom_deinit()
-{
-   Ecore_Event_Handler *h = NULL;
-
-   if (g_eom == NULL) return;
-
-   if (g_eom->handlers)
-     {
-        EINA_LIST_FREE(g_eom->handlers, h)
-          ecore_event_handler_del(h);
-
-        g_eom->handlers = NULL;
-     }
-
-   _e_eom_output_deinit();
-
-   if (g_eom->dpy)
-     g_eom->dpy = NULL;
-
-   if (g_eom->global)
-     wl_global_destroy(g_eom->global);
-   g_eom->global = NULL;
-
-   E_FREE(g_eom);
-}
-
 static Eina_Bool
-_e_eom_init()
-{
-   EINA_SAFETY_ON_NULL_GOTO(e_comp_wl, err);
-
-   if (e_comp->e_comp_screen->num_outputs < 1)
-     return EINA_TRUE;
-
-   g_eom = E_NEW(E_Eom, 1);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(g_eom, EINA_FALSE);
-
-   g_eom->global = wl_global_create(e_comp_wl->wl.disp, &wl_eom_interface, 1, g_eom, _e_eom_cb_wl_bind);
-   EINA_SAFETY_ON_NULL_GOTO(g_eom->global, err);
-
-   g_eom->dpy = e_comp->e_comp_screen->tdisplay;
-   EINA_SAFETY_ON_NULL_GOTO(g_eom->dpy, err);
-
-   g_eom->output_primary = e_comp_screen_primary_output_get(e_comp->e_comp_screen);
-   EINA_SAFETY_ON_NULL_GOTO(g_eom->output_primary, err);
-
-   if (!_e_eom_output_init())
-     {
-        EOERR("_e_eom_output_init fail", NULL);
-        goto err;
-     }
-
-   g_eom->timer = ecore_timer_add(EOM_CONNECT_CHECK_TIMEOUT, _e_eom_boot_connection_check, NULL);
-
-   E_LIST_HANDLER_APPEND(g_eom->handlers, E_EVENT_CLIENT_BUFFER_CHANGE, _e_eom_cb_client_buffer_change, NULL);
-
-   return EINA_TRUE;
-
-err:
-   _e_eom_deinit();
-
-   return EINA_FALSE;
-}
-
-EINTERN int
-e_eom_init(void)
-{
-   Eina_Bool ret = EINA_FALSE;
-
-   ret = _e_eom_init();
-
-   if (ret == EINA_FALSE)
-     return 0;
-
-   return 1;
-}
-
-EINTERN int
-e_eom_shutdown(void)
-{
-   if (!g_eom) return 1;
-
-   _e_eom_deinit();
-
-   return 1;
-}
-
-E_API Eina_Bool
-e_eom_is_ec_external(E_Client *ec)
-{
-   E_EomOutputPtr eom_output;
-
-   if (!g_eom) return EINA_FALSE;
-
-   eom_output = _e_eom_output_by_ec_child_get(ec);
-   if (!eom_output)
-     return EINA_FALSE;
-
-   return EINA_TRUE;
-}
-
-EINTERN Eina_Bool
-e_eom_connect(E_Output *output)
+_e_eom_connect(E_Output *output)
 {
    E_EomOutputPtr eom_output = NULL;
 
@@ -2244,11 +2143,8 @@ e_eom_connect(E_Output *output)
    else
      {
         EOINF("Start Mirroring", eom_output->eout);
-
-        _e_eom_output_state_set_mode(eom_output, EOM_OUTPUT_MODE_MIRROR);
         _e_eom_output_state_set_mode(eom_output, EOM_OUTPUT_MODE_MIRROR);
         eom_output->state = MIRROR;
-
         e_output_external_set(output, E_OUTPUT_EXT_MIRROR);
      }
 
@@ -2260,8 +2156,8 @@ e_eom_connect(E_Output *output)
    return EINA_TRUE;
 }
 
-EINTERN Eina_Bool
-e_eom_disconnect(E_Output *output)
+static Eina_Bool
+_e_eom_disconnect(E_Output *output)
 {
    E_EomOutputPtr eom_output = NULL;
 
@@ -2315,6 +2211,134 @@ e_eom_disconnect(E_Output *output)
    return EINA_TRUE;
 }
 
+static void
+_e_eom_output_cb_output_connect_status_change(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_output_connected(output))
+     {
+        _e_eom_connect(output);
+     }
+   else
+     {
+        _e_eom_disconnect(output);
+     }
+}
+
+static void
+_e_eom_deinit()
+{
+   Ecore_Event_Handler *h = NULL;
+
+   if (g_eom == NULL) return;
+
+   if (g_eom->output_connect_status_hook)
+     {
+        e_output_hook_del(g_eom->output_connect_status_hook);
+        g_eom->output_connect_status_hook = NULL;
+     }
+
+   if (g_eom->handlers)
+     {
+        EINA_LIST_FREE(g_eom->handlers, h)
+          ecore_event_handler_del(h);
+
+        g_eom->handlers = NULL;
+     }
+
+   _e_eom_output_deinit();
+
+   if (g_eom->dpy)
+     g_eom->dpy = NULL;
+
+   if (g_eom->global)
+     wl_global_destroy(g_eom->global);
+   g_eom->global = NULL;
+
+   E_FREE(g_eom);
+}
+
+static Eina_Bool
+_e_eom_init()
+{
+   EINA_SAFETY_ON_NULL_GOTO(e_comp_wl, err);
+
+   if (e_comp->e_comp_screen->num_outputs < 1)
+     return EINA_TRUE;
+
+   g_eom = E_NEW(E_Eom, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(g_eom, EINA_FALSE);
+
+   g_eom->global = wl_global_create(e_comp_wl->wl.disp, &wl_eom_interface, 1, g_eom, _e_eom_cb_wl_bind);
+   EINA_SAFETY_ON_NULL_GOTO(g_eom->global, err);
+
+   g_eom->dpy = e_comp->e_comp_screen->tdisplay;
+   EINA_SAFETY_ON_NULL_GOTO(g_eom->dpy, err);
+
+   g_eom->output_primary = e_comp_screen_primary_output_get(e_comp->e_comp_screen);
+   EINA_SAFETY_ON_NULL_GOTO(g_eom->output_primary, err);
+
+   if (!_e_eom_output_init())
+     {
+        EOERR("_e_eom_output_init fail", NULL);
+        goto err;
+     }
+
+   g_eom->timer = ecore_timer_add(EOM_CONNECT_CHECK_TIMEOUT, _e_eom_boot_connection_check, NULL);
+
+   E_LIST_HANDLER_APPEND(g_eom->handlers, E_EVENT_CLIENT_BUFFER_CHANGE, _e_eom_cb_client_buffer_change, NULL);
+
+   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);
+
+   return EINA_TRUE;
+
+err:
+   _e_eom_deinit();
+
+   return EINA_FALSE;
+}
+
+EINTERN int
+e_eom_init(void)
+{
+   Eina_Bool ret = EINA_FALSE;
+
+   ret = _e_eom_init();
+
+   if (ret == EINA_FALSE)
+     return 0;
+
+   return 1;
+}
+
+EINTERN int
+e_eom_shutdown(void)
+{
+   if (!g_eom) return 1;
+
+   _e_eom_deinit();
+
+   return 1;
+}
+
+E_API Eina_Bool
+e_eom_is_ec_external(E_Client *ec)
+{
+   E_EomOutputPtr eom_output;
+
+   if (!g_eom) return EINA_FALSE;
+
+   eom_output = _e_eom_output_by_ec_child_get(ec);
+   if (!eom_output)
+     return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
 EINTERN Eina_Bool
 e_eom_create(E_Output *output, Eina_Bool added)
 {
index 9226487b0a48c05855de302e0b4290355ea9651e..841fb625ce95c92469b2cac616cc60eaa232da12 100644 (file)
@@ -9,8 +9,6 @@
 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_connect(E_Output *output);
-EINTERN Eina_Bool e_eom_disconnect(E_Output *output);
 EINTERN Eina_Bool e_eom_create(E_Output *output, Eina_Bool added);
 EINTERN Eina_Bool e_eom_destroy(E_Output *output);
 EINTERN Eina_Bool e_eom_mode_change(E_Output *output, E_Output_Mode *emode);
index 90380991c8e5f76858302f27a80319ec92e2ee3d..a4e35e030b16f366d907684096753941fdd83da2 100644 (file)
@@ -52,6 +52,7 @@ static int _e_output_hooks_walking = 0;
 static Eina_Inlist *_e_output_hooks[] =
 {
    [E_OUTPUT_HOOK_DPMS_CHANGE] = NULL,
+   [E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE] = NULL,
 };
 
 static int _e_output_intercept_hooks_delete = 0;
@@ -3900,23 +3901,11 @@ e_output_external_update(E_Output *output)
              return EINA_FALSE;
           }
 
-        ret = e_eom_connect(output);
-        if (ret == EINA_FALSE)
-          {
-             EOERR("fail to e_eom_connect.", output);
-             e_hwc_del(output->hwc);
-             output->hwc = NULL;
-             return EINA_FALSE;
-          }
+        _e_output_hook_call(E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE, output);
      }
    else
      {
-        ret = e_eom_disconnect(output);
-        if (ret == EINA_FALSE)
-          {
-             EOERR("fail to e_eom_disconnect.", output);
-             return EINA_FALSE;
-          }
+        _e_output_hook_call(E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE, output);
 
         if (output->hwc)
           {
index 2a116ef639bdf37697a3d8c147658b7168aaf442..35d540109158bd84319b960b1cc12a9dc3c84b17 100644 (file)
@@ -135,6 +135,7 @@ struct _E_Output
 enum _E_Output_Hook_Point
 {
    E_OUTPUT_HOOK_DPMS_CHANGE,
+   E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE,
    E_OUTPUT_HOOK_LAST
 };