e_eom: add e_eom create and destroy function to support added output 54/197454/2
authorJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 11 Jan 2019 07:59:23 +0000 (16:59 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 14 Jan 2019 04:55:01 +0000 (04:55 +0000)
Change-Id: I11fb2058b199bbf939d790cd666ea1ee21cfb2e2
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/bin/e_eom.c
src/bin/e_eom.h

index 8862202..06bf920 100644 (file)
@@ -81,6 +81,7 @@ struct _E_Eom
    Eina_List *comp_object_intercept_hooks;
    unsigned int virtual_output_count;
    Eina_List *virtual_outputs;
+   Eina_List *added_outputs;
 
    /* Internal output data */
    Eina_Bool main_output_state;
@@ -1156,6 +1157,24 @@ _e_eom_output_find(E_Output *output)
    return eom_output;
 }
 
+static E_EomOutputPtr
+_e_eom_output_find_added_output(E_Output *output)
+{
+   E_EomOutputPtr eom_output = NULL, eom_output_tmp = NULL;
+   Eina_List *l;
+
+   if (g_eom->added_outputs)
+     {
+        EINA_LIST_FOREACH(g_eom->added_outputs, l, eom_output_tmp)
+          {
+             if (eom_output_tmp->output == output->toutput)
+               eom_output = eom_output_tmp;
+          }
+     }
+
+   return eom_output;
+}
+
 static void
 _e_eom_main_output_info_get()
 {
@@ -1188,7 +1207,6 @@ _e_eom_output_init(tdm_display *dpy)
    Eina_List *l;
 
    count = e_comp->e_comp_screen->num_outputs;
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(count > 1, EINA_FALSE);
 
    g_eom->output_count = count - 1;
    EOMDB("external output count : %d", g_eom->output_count);
@@ -1396,6 +1414,8 @@ _e_eom_init_internal()
         goto err;
      }
 
+   g_eom->added_outputs = NULL;
+
    g_eom->timer = ecore_timer_add(EOM_CONNECT_CHECK_TIMEOUT, _e_eom_boot_connection_check, NULL);
 
    return EINA_TRUE;
@@ -2389,7 +2409,7 @@ _e_eom_init()
 
    EINA_SAFETY_ON_NULL_GOTO(e_comp_wl, err);
 
-   if (e_comp->e_comp_screen->num_outputs <= 1)
+   if (e_comp->e_comp_screen->num_outputs < 1)
      return EINA_TRUE;
 
    g_eom = E_NEW(E_Eom, 1);
@@ -2473,10 +2493,20 @@ e_eom_connect(E_Output *output)
    E_EomClientPtr iterator = NULL;
    Eina_List *l;
 
+   if (!g_eom) return EINA_TRUE;
+
    g_eom->check_first_boot = 1;
 
    eom_output = _e_eom_output_find(output);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE);
+   if (eom_output == NULL)
+     {
+        eom_output = _e_eom_output_find_added_output(output);
+        if (!eom_output)
+          {
+             EOMER("cannot find output");
+             return EINA_FALSE;
+          }
+     }
 
    if (eom_output->connection_status == EINA_TRUE)
      return EINA_TRUE;
@@ -2560,10 +2590,20 @@ e_eom_disconnect(E_Output *output)
    E_EomClientPtr iterator = NULL;
    Eina_List *l;
 
+   if (!g_eom) return EINA_TRUE;
+
    g_eom->check_first_boot = 1;
 
    eom_output = _e_eom_output_find(output);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE);
+   if (eom_output == NULL)
+     {
+        eom_output = _e_eom_output_find_added_output(output);
+        if (!eom_output)
+          {
+             EOMER("cannot find output");
+             return EINA_FALSE;
+          }
+     }
 
    if (eom_output->connection_status == EINA_FALSE)
      return EINA_TRUE;
@@ -2637,3 +2677,71 @@ e_eom_disconnect(E_Output *output)
 
    return EINA_TRUE;
 }
+
+EINTERN Eina_Bool
+e_eom_create(E_Output *output)
+{
+   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 = eom_output->eout->toutput;
+   eom_output->type = (eom_output_type_e)eom_output->eout->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;
+
+   EOMDB("create (%d)output, type:%d, name:%s",
+               eom_output->id, eom_output->type, eom_output->name);
+
+   g_eom->added_outputs = eina_list_append(g_eom->added_outputs, eom_output);
+
+   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;
+   E_EomOutputPtr eom_output_delete = NULL;
+   Eina_List *l;
+
+   if (!g_eom) return EINA_TRUE;
+
+   EINA_LIST_FOREACH(g_eom->added_outputs, l, eom_output)
+     {
+        if (eom_output && eom_output->eout == output)
+          {
+             eom_output_delete = eom_output;
+             break;
+          }
+     }
+
+   if (!eom_output_delete) return EINA_FALSE;
+
+   EOMDB("destroy (%d)output, type:%d, name:%s",
+               eom_output->id, eom_output->type, eom_output->name);
+
+   g_eom->added_outputs = eina_list_remove(g_eom->added_outputs, eom_output_delete);
+
+   E_FREE(eom_output_delete);
+
+   return EINA_TRUE;
+}
index 18a9a78..ec78e39 100644 (file)
@@ -12,6 +12,8 @@ EINTERN Eina_Bool e_eom_is_ec_external(E_Client *ec);
 EINTERN tdm_output* e_eom_tdm_output_by_ec_get(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);
+EINTERN Eina_Bool e_eom_destroy(E_Output *output);
 
 #endif
 #endif