refactor code for maximizing window 95/280095/1
authorDoyoun Kang <doyoun.kang@samsung.com>
Mon, 22 Aug 2022 09:16:37 +0000 (18:16 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 24 Aug 2022 00:16:52 +0000 (09:16 +0900)
Change-Id: I8436542def3bf74ef2231305b5e6eb85d5afe4c8

src/bin/e_client.c
src/bin/e_client.h
src/bin/e_comp_wl.c
src/bin/e_xdg_shell_v6.c

index 69b3ff4973faf507b1786535bd0292c90890b611..010247d70367c22f17774194c2afadb9386cb99c 100644 (file)
@@ -2587,23 +2587,23 @@ _e_client_maximize(E_Client *ec, E_Maximize max)
         switch (max & E_MAXIMIZE_DIRECTION)
           {
            case E_MAXIMIZE_BOTH:
-             e_client_frame_geometry_set(ec, x1, yy1, w, h);
+             e_client_maximized_geometry_set(ec, x1, yy1, w, h);
              break;
 
            case E_MAXIMIZE_VERTICAL:
-             e_client_frame_geometry_set(ec, ec->x, yy1, ec->w, h);
+             e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
              break;
 
            case E_MAXIMIZE_HORIZONTAL:
-             e_client_frame_geometry_set(ec, x1, ec->y, w, ec->h);
+             e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
              break;
 
            case E_MAXIMIZE_LEFT:
-             e_client_frame_geometry_set(ec, ec->desk->geom.x, ec->desk->geom.y, w / 2, h);
+             e_client_maximized_geometry_set(ec, ec->desk->geom.x, ec->desk->geom.y, w / 2, h);
              break;
 
            case E_MAXIMIZE_RIGHT:
-             e_client_frame_geometry_set(ec, x1, ec->desk->geom.y, w / 2, h);
+             e_client_maximized_geometry_set(ec, x1, ec->desk->geom.y, w / 2, h);
              break;
           }
         break;
@@ -2668,23 +2668,23 @@ _e_client_maximize(E_Client *ec, E_Maximize max)
         switch (max & E_MAXIMIZE_DIRECTION)
           {
            case E_MAXIMIZE_BOTH:
-             e_client_frame_geometry_set(ec, zx, zy, zw, zh);
+             e_client_maximized_geometry_set(ec, zx, zy, zw, zh);
              break;
 
            case E_MAXIMIZE_VERTICAL:
-             e_client_frame_geometry_set(ec, ec->x, zy, ec->w, zh);
+             e_client_maximized_geometry_set(ec, ec->x, zy, ec->w, zh);
              break;
 
            case E_MAXIMIZE_HORIZONTAL:
-             e_client_frame_geometry_set(ec, zx, ec->y, zw, ec->h);
+             e_client_maximized_geometry_set(ec, zx, ec->y, zw, ec->h);
              break;
 
            case E_MAXIMIZE_LEFT:
-             e_client_frame_geometry_set(ec, zx, zy, zw / 2, zh);
+             e_client_maximized_geometry_set(ec, zx, zy, zw / 2, zh);
              break;
 
            case E_MAXIMIZE_RIGHT:
-             e_client_frame_geometry_set(ec, zx + zw / 2, zy, zw / 2, zh);
+             e_client_maximized_geometry_set(ec, zx + zw / 2, zy, zw / 2, zh);
              break;
           }
 
@@ -2715,23 +2715,23 @@ _e_client_maximize(E_Client *ec, E_Maximize max)
         switch (max & E_MAXIMIZE_DIRECTION)
           {
            case E_MAXIMIZE_BOTH:
-             e_client_frame_geometry_set(ec, x1, yy1, w, h);
+             e_client_maximized_geometry_set(ec, x1, yy1, w, h);
              break;
 
            case E_MAXIMIZE_VERTICAL:
-             e_client_frame_geometry_set(ec, ec->x, yy1, ec->w, h);
+             e_client_maximized_geometry_set(ec, ec->x, yy1, ec->w, h);
              break;
 
            case E_MAXIMIZE_HORIZONTAL:
-             e_client_frame_geometry_set(ec, x1, ec->y, w, ec->h);
+             e_client_maximized_geometry_set(ec, x1, ec->y, w, ec->h);
              break;
 
            case E_MAXIMIZE_LEFT:
-             e_client_frame_geometry_set(ec, ec->desk->geom.x, ec->desk->geom.y, w / 2, h);
+             e_client_maximized_geometry_set(ec, ec->desk->geom.x, ec->desk->geom.y, w / 2, h);
              break;
 
            case E_MAXIMIZE_RIGHT:
-             e_client_frame_geometry_set(ec, x1, ec->desk->geom.y, w / 2, h);
+             e_client_maximized_geometry_set(ec, x1, ec->desk->geom.y, w / 2, h);
              break;
           }
         break;
@@ -6028,6 +6028,30 @@ e_client_unshade(E_Client *ec, E_Direction dir)
 
 ///////////////////////////////////////
 
+EINTERN void
+e_client_maximized_geometry_set(E_Client *ec, int x, int y, int w, int h)
+{
+   if (!ec) return;
+
+   ec->maximized_info.x = x;
+   ec->maximized_info.y = y;
+   ec->maximized_info.w = w;
+   ec->maximized_info.h = h;
+
+   e_client_frame_geometry_set(ec, x, y, w, h);
+}
+
+EINTERN void
+e_client_maximized_geometry_get(E_Client *ec, int *x, int *y, int *w, int *h)
+{
+   if (!ec) return;
+
+   if (x) *x = ec->maximized_info.x;
+   if (y) *y = ec->maximized_info.y;
+   if (w) *w = ec->maximized_info.w;
+   if (h) *h = ec->maximized_info.h;
+}
+
 E_API void
 e_client_maximize(E_Client *ec, E_Maximize max)
 {
index 070d6f954812d693d7695e23b8e450952e52efbf..90279e3f233b577ce05b828f3aa0efe67f80ab02 100644 (file)
@@ -1036,6 +1036,12 @@ struct E_Client
    } manage_resize;
 
    Eina_Bool move_after_resize;
+
+   struct
+   {
+      int x, y, w, h;
+   } maximized_info;
+
 };
 
 #define e_client_focus_policy_click(ec) \
@@ -1142,6 +1148,8 @@ EINTERN void e_client_focus_stack_clear(void);
 E_API Eina_List *e_client_lost_windows_get(E_Zone *zone);
 E_API void e_client_shade(E_Client *ec, E_Direction dir);
 E_API void e_client_unshade(E_Client *ec, E_Direction dir);
+EINTERN void e_client_maximized_geometry_set(E_Client *ec, int x, int y, int w, int h);
+EINTERN void e_client_maximized_geometry_get(E_Client *ec, int *x, int *y, int *w, int *h);
 E_API void e_client_maximize(E_Client *ec, E_Maximize max);
 E_API void e_client_unmaximize(E_Client *ec, E_Maximize max);
 E_API void e_client_fullscreen(E_Client *ec, E_Fullscreen policy);
index cff692a209afa643bddfcb1cd32a08b51103e0b9..7491e9341d1eef5f07805dbcf14e72f2bb1d9427 100644 (file)
@@ -1955,6 +1955,22 @@ _e_comp_wl_evas_cb_maximize_pre(void *data, Evas_Object *obj EINA_UNUSED, void *
    ec->comp_data->maximize_pre = 1;
 }
 
+static void
+_e_comp_wl_evas_cb_maximize_done(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Client *ec = data;
+   int w, h;
+
+   if (e_object_is_del(E_OBJECT(ec))) return;
+
+   if (ec->comp_data->shell.configure_send)
+     {
+        e_client_maximized_geometry_get(ec, NULL, NULL, &w, &h);
+        ec->comp_data->shell.configure_send(ec->comp_data->shell.surface, 0, w, h);
+     }
+   ec->comp_data->maximize_pre = 0;
+}
+
 static void
 _e_comp_wl_evas_cb_delete_request(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
 {
@@ -2128,7 +2144,7 @@ _e_comp_wl_client_evas_init(E_Client *ec)
    if (!ec->override)
      {
         evas_object_smart_callback_add(ec->frame, "client_resize",   _e_comp_wl_evas_cb_resize,       ec);
-        evas_object_smart_callback_add(ec->frame, "maximize_done",   _e_comp_wl_evas_cb_state_update, ec);
+        evas_object_smart_callback_add(ec->frame, "maximize_done",   _e_comp_wl_evas_cb_maximize_done,ec);
         evas_object_smart_callback_add(ec->frame, "unmaximize_done", _e_comp_wl_evas_cb_state_update, ec);
         evas_object_smart_callback_add(ec->frame, "maximize_pre",    _e_comp_wl_evas_cb_maximize_pre, ec);
         evas_object_smart_callback_add(ec->frame, "unmaximize_pre",  _e_comp_wl_evas_cb_maximize_pre, ec);
@@ -2174,7 +2190,7 @@ _e_comp_wl_client_evas_deinit(E_Client *ec)
    if (!ec->override)
      {
         evas_object_smart_callback_del(ec->frame, "client_resize",   _e_comp_wl_evas_cb_resize);
-        evas_object_smart_callback_del(ec->frame, "maximize_done",   _e_comp_wl_evas_cb_state_update);
+        evas_object_smart_callback_del(ec->frame, "maximize_done",   _e_comp_wl_evas_cb_maximize_done);
         evas_object_smart_callback_del(ec->frame, "unmaximize_done", _e_comp_wl_evas_cb_state_update);
         evas_object_smart_callback_del(ec->frame, "maximize_pre",    _e_comp_wl_evas_cb_maximize_pre);
         evas_object_smart_callback_del(ec->frame, "unmaximize_pre",  _e_comp_wl_evas_cb_maximize_pre);
index a5fc31173fd75d6447960a0d2a89a8d39e919448..7a75d9316d07e5017ced591727697d90e6fdc066 100644 (file)
@@ -496,13 +496,15 @@ _e_xdg_toplevel_configure_pending_set(E_Xdg_Toplevel *toplevel,
          * If the width or height arguments are zero, it means the client should
          * decide its own window dimension. See xdg-shell-v6.xml
          */
-        LOG("FORCELY STAY current size (%d %d) of E_Client, requested size "
+        int mw, mh;
+        e_client_maximized_geometry_get(ec, NULL, NULL, &mw, &mh);
+        LOG("FORCELY STAY current maximized size (%d %d) of E_Client, requested size "
             "is (%d %d), the state (maximize %d, fullscreen %d)",
-            ec, ec->w, ec->h, width, height,
+            ec, mw, mh, width, height,
             toplevel->pending.state.maximized,
             toplevel->pending.state.fullscreen);
-        toplevel->pending.size.w = ec->w;
-        toplevel->pending.size.h = ec->h;
+        toplevel->pending.size.w = mw;
+        toplevel->pending.size.h = mh;
      }
 
    focused = e_client_focused_get();
@@ -792,6 +794,7 @@ _e_xdg_toplevel_cb_maximized_set(struct wl_client *client, struct wl_resource *r
         return;
      }
 
+   ELOGF("XDG6", "Toplevel Maximized Set. res:%p, lock_user_maximize:%d", ec, resource, ec->lock_user_maximize);
    if (!ec->lock_user_maximize)
      {
         max = (e_config->maximize_policy & E_MAXIMIZE_TYPE) | E_MAXIMIZE_BOTH;
@@ -819,6 +822,7 @@ _e_xdg_toplevel_cb_maximized_unset(struct wl_client *client, struct wl_resource
         return;
      }
 
+   ELOGF("XDG6", "Toplevel Maximized Unset. res:%p, lock_user_maximize:%d", ec, resource, ec->lock_user_maximize);
    /* it's doubtful */
    e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
 }
@@ -845,6 +849,7 @@ _e_xdg_toplevel_cb_fullscreen_set(struct wl_client *client,
         return;
      }
 
+   ELOGF("XDG6", "Toplevel Fullscreen Set. res:%p, lock_user_fullscreen:%d", ec, resource, ec->lock_user_fullscreen);
    if (!ec->lock_user_fullscreen)
      e_client_fullscreen(ec, e_config->fullscreen_policy);
 }
@@ -869,6 +874,7 @@ _e_xdg_toplevel_cb_fullscreen_unset(struct wl_client *client, struct wl_resource
         return;
      }
 
+   ELOGF("XDG6", "Toplevel Fullscreen Unset. res:%p, lock_user_fullscreen:%d", ec, resource, ec->lock_user_fullscreen);
    if (!ec->lock_user_fullscreen)
      e_client_unfullscreen(ec);
 }
@@ -893,6 +899,7 @@ _e_xdg_toplevel_cb_minimized_set(struct wl_client *client, struct wl_resource *r
         return;
      }
 
+   ELOGF("XDG6", "Toplevel Minimized Set. res:%p, lock_client_iconify:%d", ec, resource, ec->lock_client_iconify);
    if (!ec->lock_client_iconify)
      e_client_iconify(ec);
 }