e_output: set presentation ec to zone of external output 22/271322/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 10 Feb 2022 10:06:47 +0000 (19:06 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Fri, 18 Feb 2022 02:15:54 +0000 (11:15 +0900)
hwc_windows does not manage presentation ec, presentation mode means
client is set to zone in hwc_windows.

Change-Id: I3b10b44eabe928ee8b364773aff6d299b4870a80

src/bin/e_output.c

index 17ef3b751c3c9e66b9e1054c2376aeb690d8957a..fb0f5bff392ce069a50d4624d2e88aaa582a39b6 100644 (file)
@@ -4195,13 +4195,13 @@ e_output_presentation_update(E_Output *output, E_Client *ec)
              EOERR("e_hwc_planes_presentation_update fails.", output);
              return EINA_FALSE;
           }
+        EOINF("e_output_presentation_update done: E_OUTPUT_DISPLAY_MODE_PRESENTATION", output);
      }
 
    _e_output_display_mode_set(output, E_OUTPUT_DISPLAY_MODE_PRESENTATION);
 
    output->external_set = EINA_TRUE;
 
-   EOINF("e_output_presentation_update done: E_OUTPUT_DISPLAY_MODE_PRESENTATION", output);
 
    return EINA_TRUE;
 }
@@ -4209,7 +4209,12 @@ e_output_presentation_update(E_Output *output, E_Client *ec)
 EINTERN void
 e_output_presentation_unset(E_Output *output)
 {
+   E_Output *primary_output;
+   E_Client *subc;
+   E_Comp_Wl_Client_Data *cdata;
+   E_Zone *zone;
    E_Hwc *hwc;
+   Eina_List *l;
 
    EINA_SAFETY_ON_FALSE_RETURN(output);
 
@@ -4219,20 +4224,69 @@ e_output_presentation_unset(E_Output *output)
    output->external_set = EINA_FALSE;
 
    _e_output_display_mode_set(output, E_OUTPUT_DISPLAY_MODE_NONE);
-   output->presentation_ec = NULL;
 
    if (e_hwc_policy_get(hwc) == E_HWC_POLICY_PLANES)
-     e_hwc_planes_presentation_update(hwc, NULL);
+     {
+        e_hwc_planes_presentation_update(hwc, NULL);
+     }
+   else
+     {
+        if (output->presentation_ec)
+          {
+             primary_output = e_comp_screen_primary_output_get(e_comp->e_comp_screen);
+             EINA_SAFETY_ON_NULL_GOTO(primary_output, done);
+
+             zone = e_comp_zone_find(e_output_output_id_get(primary_output));
+             EINA_SAFETY_ON_NULL_RETURN(zone);
+
+             cdata = e_client_cdata_get(output->presentation_ec);
+             EINA_SAFETY_ON_NULL_RETURN(cdata);
+
+             e_client_zone_set(output->presentation_ec, zone);
+
+             EINA_LIST_FOREACH(cdata->sub.list, l, subc)
+               e_client_zone_set(subc, zone);
+
+             EINA_LIST_FOREACH(cdata->sub.list, l, subc)
+               e_client_zone_set(subc, zone);
+          }
+     }
+
+done:
+   output->presentation_ec = NULL;
 }
 
 EINTERN Eina_Bool
 e_output_presentation_ec_set(E_Output *output, E_Client *ec)
 {
+   E_Hwc *hwc;
+   E_Client *subc;
+   E_Zone *zone;
+   E_Comp_Wl_Client_Data *cdata;
+   Eina_List *l;
+
    EINA_SAFETY_ON_FALSE_RETURN_VAL(output, EINA_FALSE);
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(output, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(ec, EINA_FALSE);
+
+   hwc = output->hwc;
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(hwc, EINA_FALSE);
 
    output->presentation_ec = ec;
 
+   zone = e_comp_zone_find(e_output_output_id_get(output));
+   EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
+
+   cdata = e_client_cdata_get(ec);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(cdata, EINA_FALSE);
+
+   e_client_zone_set(ec, zone);
+
+   EINA_LIST_FOREACH(cdata->sub.list, l, subc)
+     e_client_zone_set(subc, zone);
+
+   EINA_LIST_FOREACH(cdata->sub.list, l, subc)
+     e_client_zone_set(subc, zone);
+
    return EINA_TRUE;
 }