From 65fbc73bc7bcd7283c2b88cda726cc6cde9863ec Mon Sep 17 00:00:00 2001 From: Doyoun Kang Date: Mon, 22 Aug 2022 18:16:37 +0900 Subject: [PATCH] refactor code for maximizing window Change-Id: I8436542def3bf74ef2231305b5e6eb85d5afe4c8 --- src/bin/e_client.c | 54 +++++++++++++++++++++++++++++----------- src/bin/e_client.h | 8 ++++++ src/bin/e_comp_wl.c | 20 +++++++++++++-- src/bin/e_xdg_shell_v6.c | 15 ++++++++--- 4 files changed, 76 insertions(+), 21 deletions(-) diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 69b3ff4973..010247d703 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -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) { diff --git a/src/bin/e_client.h b/src/bin/e_client.h index 070d6f9548..90279e3f23 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -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); diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index cff692a209..7491e9341d 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -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); diff --git a/src/bin/e_xdg_shell_v6.c b/src/bin/e_xdg_shell_v6.c index a5fc31173f..7a75d9316d 100644 --- a/src/bin/e_xdg_shell_v6.c +++ b/src/bin/e_xdg_shell_v6.c @@ -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); } -- 2.34.1