e_zone: move desk code to E_CLIENT_HOOK_MAXIMIZE callback 18/298218/1
authorSooChan Lim <sc1.lim@samsung.com>
Sun, 27 Aug 2023 07:08:08 +0000 (16:08 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 4 Sep 2023 02:36:41 +0000 (11:36 +0900)
For removing the dependency of the desk at e_client

Change-Id: I0e618e1cedb762934c07d5f52de8482eafc92191

src/bin/e_client.c
src/bin/e_client.h
src/bin/e_zone.c

index 95a1402e207de5786075dbf42f47324a33402db2..d8536ea1fd17bf0ec59f718c8fa081c2e25e661f 100644 (file)
@@ -118,6 +118,7 @@ static Eina_Inlist *_e_client_hooks[] =
 //#endif
    [E_CLIENT_HOOK_STICK] = NULL,
    [E_CLIENT_HOOK_UNSTICK] = NULL,
+   [E_CLIENT_HOOK_MAXIMIZE] = NULL,
 };
 
 static Eina_Inlist *_e_client_intercept_hooks[] =
@@ -2250,207 +2251,6 @@ _e_client_cb_evas_restack(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA
 
 ////////////////////////////////////////////////
 
-static void
-_e_client_maximize(E_Client *ec, E_Maximize max)
-{
-   int x1, yy1, x2, y2;
-   int w, h, pw, ph;
-   int zx, zy, zw, zh;
-   int ecx, ecy, ecw, ech;
-   int desk_x, desk_y, desk_w, desk_h;
-   Eina_Bool override = ec->maximize_override;
-   E_Zone *zone;
-
-   zx = zy = zw = zh = 0;
-   ec->maximize_override = 1;
-
-   zone = e_comp_zone_find_by_ec(ec);
-   if (!zone) return;
-
-   if (ec->desk_area.enable && ec->desk_area.desk_area)
-     {
-        desk_x = ec->desk_area.desk_area->x;
-        desk_y = ec->desk_area.desk_area->y;
-        desk_w = ec->desk_area.desk_area->w;
-        desk_h = ec->desk_area.desk_area->h;
-     }
-    else
-    {
-        desk_x = ec->desk->geom.x;
-        desk_y = ec->desk->geom.y;
-        desk_w = ec->desk->geom.w;
-        desk_h = ec->desk->geom.h;
-    }
-
-   switch (max & E_MAXIMIZE_TYPE)
-     {
-      case E_MAXIMIZE_NONE:
-        /* Ignore */
-        break;
-
-      case E_MAXIMIZE_FULLSCREEN:
-        w = desk_w;
-        h = desk_h;
-
-        e_client_resize_limit(ec, &w, &h);
-        /* center x-direction */
-        x1 = desk_x + (desk_w - w) / 2;
-        /* center y-direction */
-        yy1 = desk_y + (desk_h - h) / 2;
-
-        switch (max & E_MAXIMIZE_DIRECTION)
-          {
-           case E_MAXIMIZE_BOTH:
-             e_client_maximized_geometry_set(ec, x1, yy1, w, h);
-             break;
-
-           case E_MAXIMIZE_VERTICAL:
-             e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
-             break;
-
-           case E_MAXIMIZE_HORIZONTAL:
-             e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
-             break;
-
-           case E_MAXIMIZE_LEFT:
-             e_client_maximized_geometry_set(ec, desk_x, desk_y, w / 2, h);
-             break;
-
-           case E_MAXIMIZE_RIGHT:
-             e_client_maximized_geometry_set(ec, x1, desk_y, w / 2, h);
-             break;
-          }
-        break;
-
-      case E_MAXIMIZE_SMART:
-      case E_MAXIMIZE_EXPAND:
-        if (ec->desk->visible)
-          {
-             // base_output_resolution
-             if (ec->base_output_resolution.use)
-               {
-                  zx = desk_x;
-                  zy = desk_y;
-                  zw = ec->base_output_resolution.w;
-                  zh = ec->base_output_resolution.h;
-               }
-             else
-               {
-                  e_zone_desk_useful_geometry_get(zone, ec->desk, &zx, &zy, &zw, &zh);
-               }
-          }
-        else
-          {
-             x1 = desk_x;
-             yy1 = desk_y;
-             x2 = desk_x + desk_w;
-             y2 = desk_y + desk_h;
-             e_maximize_client_shelf_fill(ec, &x1, &yy1, &x2, &y2, max);
-             zx = x1, zy = yy1;
-             zw = x2 - x1;
-             zh = y2 - yy1;
-          }
-        w = zw, h = zh;
-
-        evas_object_smart_callback_call(ec->frame, "maximize", NULL);
-        e_comp_object_frame_xy_unadjust(ec->frame, ec->x, ec->y, &ecx, &ecy);
-        e_comp_object_frame_wh_unadjust(ec->frame, ec->w, ec->h, &ecw, &ech);
-
-        if (ecw < zw)
-          w = ecw;
-
-        if (ech < zh)
-          h = ech;
-
-        if (ecx < zx) // window left not useful coordinates
-          x1 = zx;
-        else if (ecx + ecw > zx + zw) // window right not useful coordinates
-          x1 = zx + zw - ecw;
-        else // window normal position
-          x1 = ecx;
-
-        if (ecy < zy) // window top not useful coordinates
-          yy1 = zy;
-        else if (ecy + ech > zy + zh) // window bottom not useful coordinates
-          yy1 = zy + zh - ech;
-        else // window normal position
-          yy1 = ecy;
-
-        switch (max & E_MAXIMIZE_DIRECTION)
-          {
-           case E_MAXIMIZE_BOTH:
-             e_client_maximized_geometry_set(ec, zx, zy, zw, zh);
-             break;
-
-           case E_MAXIMIZE_VERTICAL:
-             e_client_maximized_geometry_set(ec, ec->x, zy, ec->w, zh);
-             break;
-
-           case E_MAXIMIZE_HORIZONTAL:
-             e_client_maximized_geometry_set(ec, zx, ec->y, zw, ec->h);
-             break;
-
-           case E_MAXIMIZE_LEFT:
-             e_client_maximized_geometry_set(ec, zx, zy, zw / 2, zh);
-             break;
-
-           case E_MAXIMIZE_RIGHT:
-             e_client_maximized_geometry_set(ec, zx + zw / 2, zy, zw / 2, zh);
-             break;
-          }
-
-        break;
-
-      case E_MAXIMIZE_FILL:
-        x1 = desk_x;
-        yy1 = desk_y;
-        x2 = desk_x + desk_w;
-        y2 = desk_y + desk_h;
-
-        /* walk through all shelves */
-        e_maximize_client_shelf_fill(ec, &x1, &yy1, &x2, &y2, max);
-
-        /* walk through all windows */
-        e_maximize_client_client_fill(ec, &x1, &yy1, &x2, &y2, max);
-
-        w = x2 - x1;
-        h = y2 - yy1;
-        pw = w;
-        ph = h;
-        e_client_resize_limit(ec, &w, &h);
-        /* center x-direction */
-        x1 = x1 + (pw - w) / 2;
-        /* center y-direction */
-        yy1 = yy1 + (ph - h) / 2;
-
-        switch (max & E_MAXIMIZE_DIRECTION)
-          {
-           case E_MAXIMIZE_BOTH:
-             e_client_maximized_geometry_set(ec, x1, yy1, w, h);
-             break;
-
-           case E_MAXIMIZE_VERTICAL:
-             e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
-             break;
-
-           case E_MAXIMIZE_HORIZONTAL:
-             e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
-             break;
-
-           case E_MAXIMIZE_LEFT:
-             e_client_maximized_geometry_set(ec, desk_x, desk_y, w / 2, h);
-             break;
-
-           case E_MAXIMIZE_RIGHT:
-             e_client_maximized_geometry_set(ec, x1, desk_y, w / 2, h);
-             break;
-          }
-        break;
-     }
-   if (ec->maximize_override)
-     ec->maximize_override = override;
-}
-
 ////////////////////////////////////////////////
 static void
 _e_client_aux_hint_eval(E_Client *ec)
@@ -5027,14 +4827,9 @@ e_client_maximize_update(E_Client *ec)
 E_API void
 e_client_maximize(E_Client *ec, E_Maximize max)
 {
-  int desk_x, desk_y;
-  E_Zone *zone;
-
    E_OBJECT_CHECK(ec);
    E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
 
-   zone = e_comp_zone_find_by_ec(ec);
-   if (!zone) return;
    if (!(max & E_MAXIMIZE_DIRECTION)) max |= E_MAXIMIZE_BOTH;
 
    if ((ec->shaded) || (ec->shading)) return;
@@ -5054,39 +4849,16 @@ e_client_maximize(E_Client *ec, E_Maximize max)
         return;
      }
 
-   if (ec->desk_area.enable && ec->desk_area.desk_area)
-     {
-        desk_x = ec->desk_area.desk_area->x;
-        desk_y = ec->desk_area.desk_area->y;
-     }
-    else
-    {
-        desk_x = ec->desk->geom.x;
-        desk_y = ec->desk->geom.y;
-    }
+   // store the E_Maximize value requested
+   ec->requested_max = max;
 
-   evas_object_smart_callback_call(ec->frame, "maximize_pre", NULL);
-
-   if (ec->fullscreen)
-     e_client_unfullscreen(ec);
-   ec->pre_res_change.valid = 0;
-   if (!(ec->maximized & E_MAXIMIZE_HORIZONTAL))
-     {
-        /* Horizontal hasn't been set */
-        ec->saved.x = ec->client.x - desk_x;
-        ec->saved.w = ec->client.w;
-     }
-   if (!(ec->maximized & E_MAXIMIZE_VERTICAL))
-     {
-        /* Vertical hasn't been set */
-        ec->saved.y = ec->client.y - desk_y;
-        ec->saved.h = ec->client.h;
-     }
-
-   ec->saved.zone = zone->num;
+   // call the maximize hook of a client
+   _e_client_hook_call(E_CLIENT_HOOK_MAXIMIZE, ec);
 
-   _e_client_maximize(ec, max);
+   // clear the E_Maximize value requested
+   ec->requested_max = E_MAXIMIZE_NONE;
 
+   // store the E_Maximize value
    ec->maximized = max;
    ec->changes.need_unmaximize = 0;
 
index 8a4dfd4ee38bc25b9f7452857a9038328f7264d9..0b8f83e1001645df1ca9aa37be54045c9edce399 100644 (file)
@@ -281,6 +281,7 @@ typedef enum _E_Client_Hook_Point
 //#endif
    E_CLIENT_HOOK_STICK,
    E_CLIENT_HOOK_UNSTICK,
+   E_CLIENT_HOOK_MAXIMIZE,
    E_CLIENT_HOOK_LAST,
 } E_Client_Hook_Point;
 
@@ -776,6 +777,7 @@ struct E_Client
    unsigned int       take_focus : 1;
    unsigned int       want_focus : 1;
    unsigned int       user_skip_winlist : 1;
+   E_Maximize         requested_max;
    E_Maximize         maximized;
    E_Fullscreen       fullscreen_policy; // TODO: should be removed - yigl
    E_Transient        transient_policy;
index 8e7c0d00b6d01b8e6b192774e2eb7fb87a0585c2..1b5f5e120d77b988ca9e0aec398a07fd826c4ff7 100644 (file)
@@ -88,6 +88,203 @@ e_zone_all_edge_flip_eval(void)
    // TODO: deprecated.
 }
 
+static void
+_e_zone_client_maximize(E_Zone *zone, E_Desk *desk, E_Client *ec, E_Maximize max)
+{
+   int x1, yy1, x2, y2;
+   int w, h, pw, ph;
+   int zx, zy, zw, zh;
+   int ecx, ecy, ecw, ech;
+   int desk_x, desk_y, desk_w, desk_h;
+   Eina_Bool override = ec->maximize_override;
+
+   zx = zy = zw = zh = 0;
+   ec->maximize_override = 1;
+
+   if (ec->desk_area.enable && ec->desk_area.desk_area)
+     {
+        desk_x = ec->desk_area.desk_area->x;
+        desk_y = ec->desk_area.desk_area->y;
+        desk_w = ec->desk_area.desk_area->w;
+        desk_h = ec->desk_area.desk_area->h;
+     }
+    else
+    {
+        desk_x = desk->geom.x;
+        desk_y = desk->geom.y;
+        desk_w = desk->geom.w;
+        desk_h = desk->geom.h;
+    }
+
+   switch (max & E_MAXIMIZE_TYPE)
+     {
+      case E_MAXIMIZE_NONE:
+        /* Ignore */
+        break;
+
+      case E_MAXIMIZE_FULLSCREEN:
+        w = desk_w;
+        h = desk_h;
+
+        e_client_resize_limit(ec, &w, &h);
+        /* center x-direction */
+        x1 = desk_x + (desk_w - w) / 2;
+        /* center y-direction */
+        yy1 = desk_y + (desk_h - h) / 2;
+
+        switch (max & E_MAXIMIZE_DIRECTION)
+          {
+           case E_MAXIMIZE_BOTH:
+             e_client_maximized_geometry_set(ec, x1, yy1, w, h);
+             break;
+
+           case E_MAXIMIZE_VERTICAL:
+             e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
+             break;
+
+           case E_MAXIMIZE_HORIZONTAL:
+             e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
+             break;
+
+           case E_MAXIMIZE_LEFT:
+             e_client_maximized_geometry_set(ec, desk_x, desk_y, w / 2, h);
+             break;
+
+           case E_MAXIMIZE_RIGHT:
+             e_client_maximized_geometry_set(ec, x1, desk_y, w / 2, h);
+             break;
+          }
+        break;
+
+      case E_MAXIMIZE_SMART:
+      case E_MAXIMIZE_EXPAND:
+        if (desk->visible)
+          {
+             // base_output_resolution
+             if (ec->base_output_resolution.use)
+               {
+                  zx = desk_x;
+                  zy = desk_y;
+                  zw = ec->base_output_resolution.w;
+                  zh = ec->base_output_resolution.h;
+               }
+             else
+               {
+                  e_zone_desk_useful_geometry_get(zone, desk, &zx, &zy, &zw, &zh);
+               }
+          }
+        else
+          {
+             x1 = desk_x;
+             yy1 = desk_y;
+             x2 = desk_x + desk_w;
+             y2 = desk_y + desk_h;
+             e_maximize_client_shelf_fill(ec, &x1, &yy1, &x2, &y2, max);
+             zx = x1, zy = yy1;
+             zw = x2 - x1;
+             zh = y2 - yy1;
+          }
+        w = zw, h = zh;
+
+        evas_object_smart_callback_call(ec->frame, "maximize", NULL);
+        e_comp_object_frame_xy_unadjust(ec->frame, ec->x, ec->y, &ecx, &ecy);
+        e_comp_object_frame_wh_unadjust(ec->frame, ec->w, ec->h, &ecw, &ech);
+
+        if (ecw < zw)
+          w = ecw;
+
+        if (ech < zh)
+          h = ech;
+
+        if (ecx < zx) // window left not useful coordinates
+          x1 = zx;
+        else if (ecx + ecw > zx + zw) // window right not useful coordinates
+          x1 = zx + zw - ecw;
+        else // window normal position
+          x1 = ecx;
+
+        if (ecy < zy) // window top not useful coordinates
+          yy1 = zy;
+        else if (ecy + ech > zy + zh) // window bottom not useful coordinates
+          yy1 = zy + zh - ech;
+        else // window normal position
+          yy1 = ecy;
+
+        switch (max & E_MAXIMIZE_DIRECTION)
+          {
+           case E_MAXIMIZE_BOTH:
+             e_client_maximized_geometry_set(ec, zx, zy, zw, zh);
+             break;
+
+           case E_MAXIMIZE_VERTICAL:
+             e_client_maximized_geometry_set(ec, ec->x, zy, ec->w, zh);
+             break;
+
+           case E_MAXIMIZE_HORIZONTAL:
+             e_client_maximized_geometry_set(ec, zx, ec->y, zw, ec->h);
+             break;
+
+           case E_MAXIMIZE_LEFT:
+             e_client_maximized_geometry_set(ec, zx, zy, zw / 2, zh);
+             break;
+
+           case E_MAXIMIZE_RIGHT:
+             e_client_maximized_geometry_set(ec, zx + zw / 2, zy, zw / 2, zh);
+             break;
+          }
+
+        break;
+
+      case E_MAXIMIZE_FILL:
+        x1 = desk_x;
+        yy1 = desk_y;
+        x2 = desk_x + desk_w;
+        y2 = desk_y + desk_h;
+
+        /* walk through all shelves */
+        e_maximize_client_shelf_fill(ec, &x1, &yy1, &x2, &y2, max);
+
+        /* walk through all windows */
+        e_maximize_client_client_fill(ec, &x1, &yy1, &x2, &y2, max);
+
+        w = x2 - x1;
+        h = y2 - yy1;
+        pw = w;
+        ph = h;
+        e_client_resize_limit(ec, &w, &h);
+        /* center x-direction */
+        x1 = x1 + (pw - w) / 2;
+        /* center y-direction */
+        yy1 = yy1 + (ph - h) / 2;
+
+        switch (max & E_MAXIMIZE_DIRECTION)
+          {
+           case E_MAXIMIZE_BOTH:
+             e_client_maximized_geometry_set(ec, x1, yy1, w, h);
+             break;
+
+           case E_MAXIMIZE_VERTICAL:
+             e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
+             break;
+
+           case E_MAXIMIZE_HORIZONTAL:
+             e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
+             break;
+
+           case E_MAXIMIZE_LEFT:
+             e_client_maximized_geometry_set(ec, desk_x, desk_y, w / 2, h);
+             break;
+
+           case E_MAXIMIZE_RIGHT:
+             e_client_maximized_geometry_set(ec, x1, desk_y, w / 2, h);
+             break;
+          }
+        break;
+     }
+   if (ec->maximize_override)
+     ec->maximize_override = override;
+}
+
 static void
 _e_zone_client_apply_auto_placement(E_Zone *zone, E_Client *ec)
 {
@@ -567,6 +764,61 @@ _e_zone_cb_hook_client_unstick(void *d, E_Client *ec)
      }
 }
 
+static void
+_e_zone_cb_hook_client_maximize(void *d, E_Client *ec)
+{
+   E_Zone *zone;
+   E_Desk *desk;
+   int desk_x, desk_y;
+
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   zone = (E_Zone *)d;
+   EINA_SAFETY_ON_NULL_RETURN(zone);
+
+   // FIXME: A ec is set the current zone now.
+   //        We need to make a policy for the placement of the ec at the zone.
+   if (zone != e_zone_current_get()) return;
+
+   desk = e_zone_desk_find_by_ec(zone, ec);
+   EINA_SAFETY_ON_NULL_RETURN(desk);
+
+   if (ec->desk_area.enable && ec->desk_area.desk_area)
+     {
+        desk_x = ec->desk_area.desk_area->x;
+        desk_y = ec->desk_area.desk_area->y;
+     }
+    else
+    {
+        desk_x = desk->geom.x;
+        desk_y = desk->geom.y;
+    }
+
+   evas_object_smart_callback_call(ec->frame, "maximize_pre", NULL);
+
+   if (ec->fullscreen)
+     e_client_unfullscreen(ec);
+
+   ec->pre_res_change.valid = 0;
+
+   if (!(ec->maximized & E_MAXIMIZE_HORIZONTAL))
+     {
+        /* Horizontal hasn't been set */
+        ec->saved.x = ec->client.x - desk_x;
+        ec->saved.w = ec->client.w;
+     }
+   if (!(ec->maximized & E_MAXIMIZE_VERTICAL))
+     {
+        /* Vertical hasn't been set */
+        ec->saved.y = ec->client.y - desk_y;
+        ec->saved.h = ec->client.h;
+     }
+
+   ec->saved.zone = zone->num;
+
+   _e_zone_client_maximize(zone, desk, ec, ec->requested_max);
+}
+
 static void
 _e_zone_client_data_set(E_Zone *zone, E_Client *ec)
 {
@@ -678,6 +930,7 @@ e_zone_new(int num, int id, int x, int y, int w, int h)
    E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_UNICONIFY, _e_zone_cb_hook_client_uniconify, zone);
    E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_STICK, _e_zone_cb_hook_client_stick, zone);
    E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_STICK, _e_zone_cb_hook_client_unstick, zone);
+   E_LIST_HOOK_APPEND(zone->ec_hooks, E_CLIENT_HOOK_MAXIMIZE, _e_zone_cb_hook_client_maximize, zone);
 
    if (starting) return zone;