From 20ea0ed150ae220cb44da8503bac1d9cb7f62ce1 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 12 Sep 2017 13:21:09 -0400 Subject: [PATCH] add/use helper function for rescaling individual clients in any case where client needs to be rescaled to use new screen geometry certain things must happen, such as handling shaded state and forcing the new geometry to be applied --- src/bin/e_client.c | 29 ++++++++++++++++++++--------- src/bin/e_client.h | 1 + src/bin/e_comp.c | 3 +-- src/bin/e_comp_x.c | 5 +---- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 9b74f1fa4..1386d3f77 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -2868,11 +2868,7 @@ e_client_desk_set(E_Client *ec, E_Desk *desk) ecore_event_add(E_EVENT_CLIENT_DESK_SET, ev, (Ecore_End_Cb)_e_client_event_desk_set_free, NULL); if (old_desk->zone == ec->zone) - { - e_client_res_change_geometry_save(ec); - e_client_res_change_geometry_restore(ec); - ec->pre_res_change.valid = 0; - } + e_client_rescale(ec); } if (ec->stack.prev || ec->stack.next) @@ -3321,6 +3317,23 @@ e_client_res_change_geometry_restore(E_Client *ec) memcpy(&ec->pre_res_change, &pre_res_change, sizeof(pre_res_change)); } +E_API void +e_client_rescale(E_Client *ec) +{ + Eina_Bool shaded; + int shade_dir; + E_OBJECT_CHECK(ec); + E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE); + + shaded = ec->shaded; + shade_dir = ec->shade_dir; + if (shaded) e_client_unshade(ec, shade_dir); + ec->pre_res_change.valid = 0; + e_client_res_change_geometry_save(ec); + e_client_res_change_geometry_restore(ec); + if (shaded) e_client_shade(ec, shade_dir); +} + E_API void e_client_zone_set(E_Client *ec, E_Zone *zone) { @@ -3380,9 +3393,7 @@ e_client_zone_set(E_Client *ec, E_Zone *zone) ecore_event_add(E_EVENT_CLIENT_ZONE_SET, ev, (Ecore_End_Cb)_e_client_event_zone_set_free, NULL); e_remember_update(ec); - e_client_res_change_geometry_save(ec); - e_client_res_change_geometry_restore(ec); - ec->pre_res_change.valid = 0; + e_client_rescale(ec); } E_API void @@ -3866,7 +3877,7 @@ e_client_shade(E_Client *ec, E_Direction dir) { E_OBJECT_CHECK(ec); E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE); - if ((ec->shaded) || (ec->shading) || (ec->fullscreen) || + if (((!ec->shaded) && ec->shading) || (ec->shaded && (!ec->shading)) || (ec->fullscreen) || ((ec->maximized) && (!e_config->allow_manip))) return; if (!e_util_strcmp("borderless", ec->bordername)) return; if (!e_comp_object_frame_allowed(ec->frame)) return; diff --git a/src/bin/e_client.h b/src/bin/e_client.h index c2a7e0cae..9aafa9897 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -785,6 +785,7 @@ E_API void e_client_mouse_up(E_Client *ec, int button, Evas_Point *output, E_Bin E_API void e_client_mouse_move(E_Client *ec, Evas_Point *output); E_API void e_client_res_change_geometry_save(E_Client *bd); E_API void e_client_res_change_geometry_restore(E_Client *ec); +E_API void e_client_rescale(E_Client *ec); E_API void e_client_zone_set(E_Client *ec, E_Zone *zone); E_API void e_client_geometry_get(E_Client *ec, int *x, int *y, int *w, int *h); E_API E_Client *e_client_above_get(const E_Client *ec); diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c index 38c28a3e8..63e4c6d40 100644 --- a/src/bin/e_comp.c +++ b/src/bin/e_comp.c @@ -1829,8 +1829,7 @@ e_comp_clients_rescale(void) EINA_LIST_FREE(tmp, ec) { ec->pre_res_change.valid = 0; - e_client_res_change_geometry_save(ec); - e_client_res_change_geometry_restore(ec); + e_client_rescale(ec); } } } diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index a1d960645..34871f352 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -3871,10 +3871,7 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) } } if (ec->placed && (!e_client_util_resizing_get(ec)) && (!ec->override)) - { - e_client_res_change_geometry_save(ec); - e_client_res_change_geometry_restore(ec); - } + e_client_rescale(ec); } if (ec->icccm.min_w > 32767) ec->icccm.min_w = 32767; if (ec->icccm.min_h > 32767) ec->icccm.min_h = 32767;