e_output: use the call E_OUTPUT_HOOK_MODE_CHANGE instead of e_eom_mode_change 98/210798/3
authorSooChan Lim <sc1.lim@samsung.com>
Wed, 24 Jul 2019 12:54:06 +0000 (21:54 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 5 Aug 2019 07:16:54 +0000 (07:16 +0000)
Change-Id: I592439572a47ab7f16ff76979736cdd3534fb17e

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

index 9f70e7423c15d8e3270639a7d2ddfd8f74cf0c54..eaf2a30dac72321687d0ef0d2774164ca8d57a70 100644 (file)
@@ -96,6 +96,7 @@ struct _E_Eom
    Eina_List *comp_object_intercept_hooks;
    Eina_List *added_outputs;
    E_Output_Hook *output_connect_status_hook;
+   E_Output_Hook *output_mode_changes_hook;
 
    /* Internal output data */
    E_Output *output_primary;
@@ -2211,6 +2212,58 @@ _e_eom_disconnect(E_Output *output)
    return EINA_TRUE;
 }
 
+static Eina_Bool
+_e_eom_mode_change(E_Output *output, E_Output_Mode *emode)
+{
+   E_EomOutputPtr eom_output = NULL;
+   E_Output *output_primary = NULL;
+
+   if (!g_eom) return EINA_TRUE;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
+
+   output_primary = e_comp_screen_primary_output_get(e_comp->e_comp_screen);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(output_primary, EINA_FALSE);
+   EINA_SAFETY_ON_TRUE_RETURN_VAL(output_primary == output, EINA_FALSE);
+
+   eom_output = _e_eom_output_find(output);
+   if (eom_output == NULL)
+     {
+        eom_output = _e_eom_output_find_added_output(output);
+        if (!eom_output)
+          {
+             EOERR("cannot find output", NULL);
+             return EINA_FALSE;
+          }
+     }
+
+   if (eom_output->connection_status == EINA_FALSE)
+     return EINA_FALSE;
+
+   if (eom_output->delay_timer)
+     ecore_timer_del(eom_output->delay_timer);
+   eom_output->delay_timer = NULL;
+
+   /* update eom_output connect */
+   eom_output->width = output->config.mode.w;
+   eom_output->height = output->config.mode.h;
+   eom_output->phys_width = output->info.size.w;
+   eom_output->phys_height = output->info.size.h;
+   eom_output->name = eina_stringshare_add(output->id);
+   eom_output->connection_status = EINA_TRUE;
+
+   EOINF("mode change output: (%dx%d)", eom_output->eout, eom_output->width, eom_output->height);
+   if (eom_output->state == PRESENTATION)
+     {
+        eom_output->state = WAIT_PRESENTATION;
+        _e_eom_send_configure_event();
+
+        eom_output->delay_timer = ecore_timer_add(EOM_DELAY_CONNECT_CHECK_TIMEOUT, _e_eom_presentation_check, eom_output);
+     }
+
+   return EINA_TRUE;
+}
+
 static void
 _e_eom_output_cb_output_connect_status_change(void *data, E_Output *output)
 {
@@ -2229,6 +2282,32 @@ _e_eom_output_cb_output_connect_status_change(void *data, E_Output *output)
      }
 }
 
+static void
+_e_eom_output_cb_output_mode_change(void *data, E_Output *output)
+{
+   E_Output_Mode *emode;
+
+   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))
+     {
+        EOERR("output is disconnected.", output);
+        return;
+     }
+
+   emode = e_output_current_mode_get(output);
+   EINA_SAFETY_ON_FALSE_RETURN(emode);
+
+   if (!_e_eom_mode_change(output, emode))
+     {
+        EOERR("_e_eom_mode_change fails.", output);
+        return;
+     }
+}
+
 static void
 _e_eom_deinit()
 {
@@ -2236,6 +2315,12 @@ _e_eom_deinit()
 
    if (g_eom == NULL) return;
 
+   if (g_eom->output_mode_changes_hook)
+     {
+        e_output_hook_del(g_eom->output_mode_changes_hook);
+        g_eom->output_mode_changes_hook = NULL;
+     }
+
    if (g_eom->output_connect_status_hook)
      {
         e_output_hook_del(g_eom->output_connect_status_hook);
@@ -2293,6 +2378,7 @@ _e_eom_init()
    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);
+   g_eom->output_mode_changes_hook = e_output_hook_add(E_OUTPUT_HOOK_MODE_CHANGE, _e_eom_output_cb_output_mode_change, g_eom);
 
    return EINA_TRUE;
 
@@ -2403,55 +2489,3 @@ e_eom_destroy(E_Output *output)
 
    return EINA_TRUE;
 }
-
-EINTERN Eina_Bool
-e_eom_mode_change(E_Output *output, E_Output_Mode *emode)
-{
-   E_EomOutputPtr eom_output = NULL;
-   E_Output *output_primary = NULL;
-
-   if (!g_eom) return EINA_TRUE;
-
-   EINA_SAFETY_ON_NULL_RETURN_VAL(output, EINA_FALSE);
-
-   output_primary = e_comp_screen_primary_output_get(e_comp->e_comp_screen);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(output_primary, EINA_FALSE);
-   EINA_SAFETY_ON_TRUE_RETURN_VAL(output_primary == output, EINA_FALSE);
-
-   eom_output = _e_eom_output_find(output);
-   if (eom_output == NULL)
-     {
-        eom_output = _e_eom_output_find_added_output(output);
-        if (!eom_output)
-          {
-             EOERR("cannot find output", NULL);
-             return EINA_FALSE;
-          }
-     }
-
-   if (eom_output->connection_status == EINA_FALSE)
-     return EINA_FALSE;
-
-   if (eom_output->delay_timer)
-     ecore_timer_del(eom_output->delay_timer);
-   eom_output->delay_timer = NULL;
-
-   /* update eom_output connect */
-   eom_output->width = output->config.mode.w;
-   eom_output->height = output->config.mode.h;
-   eom_output->phys_width = output->info.size.w;
-   eom_output->phys_height = output->info.size.h;
-   eom_output->name = eina_stringshare_add(output->id);
-   eom_output->connection_status = EINA_TRUE;
-
-   EOINF("mode change output: (%dx%d)", eom_output->eout, eom_output->width, eom_output->height);
-   if (eom_output->state == PRESENTATION)
-     {
-        eom_output->state = WAIT_PRESENTATION;
-        _e_eom_send_configure_event();
-
-        eom_output->delay_timer = ecore_timer_add(EOM_DELAY_CONNECT_CHECK_TIMEOUT, _e_eom_presentation_check, eom_output);
-     }
-
-   return EINA_TRUE;
-}
index 841fb625ce95c92469b2cac616cc60eaa232da12..751c210523ede0544983588f0ddbcbfae21fbccc 100644 (file)
@@ -11,6 +11,5 @@ 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);
-EINTERN Eina_Bool e_eom_mode_change(E_Output *output, E_Output_Mode *emode);
 #endif
 #endif
index a4e35e030b16f366d907684096753941fdd83da2..d4d7a3941e991254ef967aa551592b6ec2cd9ce7 100644 (file)
@@ -53,6 +53,7 @@ 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,
 };
 
 static int _e_output_intercept_hooks_delete = 0;
@@ -3976,7 +3977,8 @@ e_output_external_mode_change(E_Output *output, E_Output_Mode *mode)
 
    _e_output_external_rect_get(output_primary, p_w, p_h, w, h, &output->zoom_conf.rect);
 
-   e_eom_mode_change(output, mode);
+   /* call mode change hook */
+   _e_output_hook_call(E_OUTPUT_HOOK_MODE_CHANGE, output);
 
    if (e_hwc_policy_get(output->hwc) == E_HWC_POLICY_PLANES)
      {
index 35d540109158bd84319b960b1cc12a9dc3c84b17..8e7770d812bc84ffdeb5df628fa330dd5da644c2 100644 (file)
@@ -136,6 +136,7 @@ enum _E_Output_Hook_Point
 {
    E_OUTPUT_HOOK_DPMS_CHANGE,
    E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE,
+   E_OUTPUT_HOOK_MODE_CHANGE,
    E_OUTPUT_HOOK_LAST
 };