From 25e64a9a4e3adc259e81093a223c12996e424bf1 Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Tue, 13 Oct 2020 15:19:39 +0100 Subject: [PATCH] Ecore_Win32: add the API ecore_win32_window_maximized_set() Summary: ecore_evas win32 engine is updated to support it. This fixes the "maximized/unmaximized" elm "windows states" test. Test Plan: elm_test Reviewers: raster, jptiz, felipealmeida Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D12177 --- src/lib/ecore_win32/Ecore_Win32.h | 2 + src/lib/ecore_win32/ecore_win32_private.h | 1 + src/lib/ecore_win32/ecore_win32_window.c | 35 ++++++++++++++- .../engines/win32/ecore_evas_win32.c | 45 +++++++++++++++++-- 4 files changed, 78 insertions(+), 5 deletions(-) diff --git a/src/lib/ecore_win32/Ecore_Win32.h b/src/lib/ecore_win32/Ecore_Win32.h index fa5b80eb48..bb26a352d6 100644 --- a/src/lib/ecore_win32/Ecore_Win32.h +++ b/src/lib/ecore_win32/Ecore_Win32.h @@ -625,6 +625,8 @@ EAPI void ecore_win32_window_iconified_set(Ecore_Win32_Window *window, EAPI void ecore_win32_window_borderless_set(Ecore_Win32_Window *window, Eina_Bool on); +EAPI void ecore_win32_window_maximized_set(Ecore_Win32_Window *window, + Eina_Bool on); EAPI void ecore_win32_window_fullscreen_set(Ecore_Win32_Window *window, Eina_Bool on); diff --git a/src/lib/ecore_win32/ecore_win32_private.h b/src/lib/ecore_win32/ecore_win32_private.h index 88d0e12afb..64304bb606 100644 --- a/src/lib/ecore_win32/ecore_win32_private.h +++ b/src/lib/ecore_win32/ecore_win32_private.h @@ -104,6 +104,7 @@ struct _Ecore_Win32_Window unsigned int pointer_is_in : 1; unsigned int borderless : 1; unsigned int iconified : 1; + unsigned int maximized : 1; unsigned int fullscreen : 1; struct { diff --git a/src/lib/ecore_win32/ecore_win32_window.c b/src/lib/ecore_win32/ecore_win32_window.c index 2199d4a6df..914e0cf9ce 100644 --- a/src/lib/ecore_win32/ecore_win32_window.c +++ b/src/lib/ecore_win32/ecore_win32_window.c @@ -146,6 +146,7 @@ _ecore_win32_window_internal_new(Ecore_Win32_Window *parent, w->pointer_is_in = 0; w->borderless = 0; w->iconified = 0; + w->maximized = 0; w->fullscreen = 0; w->drag.x = x; @@ -1359,6 +1360,37 @@ ecore_win32_window_borderless_set(Ecore_Win32_Window *window, window->borderless = on; } +/** + * @brief Maximize or restore the given window. + * + * @param window The window. + * @param on @c EINA_TRUE for maximized window, @c EINA_FALSE to + * restore it. + * + * This function maximizes @p window if @p on is set + * to @c EINA_TRUE, or restores the window if it is set to + * @c EINA_FALSE. If @p window is @c NULL or if the state + * does not change (like setting to fullscreenmaximized the window is already + * maximized), this function does nothing. + * + * @since 1.26 + */ +EAPI void +ecore_win32_window_maximized_set(Ecore_Win32_Window *window, + Eina_Bool on) +{ + if (!window) return; + + if (((window->maximized) && (on)) || + ((!window->maximized) && (!on))) + return; + + INF("maximizing window: %s", on ? "yes" : "no"); + + ShowWindow(window->window, on ? SW_MAXIMIZE : SW_RESTORE); + window->maximized = on; +} + /** * @brief Set the given window to fullscreen. * @@ -1525,8 +1557,7 @@ ecore_win32_window_state_set(Ecore_Win32_Window *window, window->state.maximized_horz = 1; break; case ECORE_WIN32_WINDOW_STATE_MAXIMIZED: - window->state.maximized_horz = 1; - window->state.maximized_vert = 1; + window->state.maximized = 1; break; case ECORE_WIN32_WINDOW_STATE_SHADED: window->state.shaded = 1; diff --git a/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c index b159779940..623515da95 100644 --- a/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c +++ b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c @@ -73,6 +73,7 @@ struct _Ecore_Evas_Engine_Data_Win32 { unsigned char region : 1; unsigned char fullscreen : 1; + unsigned char maximized : 1; } state; }; @@ -434,9 +435,11 @@ _ecore_evas_win32_event_window_property_change(void *data EINA_UNUSED, int type { struct { struct { + unsigned char maximized : 1; unsigned char fullscreen : 1; } win32; struct { + Eina_Bool maximized : 1; Eina_Bool fullscreen : 1; } prop; } prev; @@ -456,12 +459,16 @@ _ecore_evas_win32_event_window_property_change(void *data EINA_UNUSED, int type wdata = ee->engine.data; prev.win32.fullscreen = wdata->state.fullscreen; + prev.win32.maximized = wdata->state.maximized; prev.prop.fullscreen = ee->prop.fullscreen; + prev.prop.maximized = ee->prop.maximized; wdata->state.fullscreen = 0; + wdata->state.maximized = 0; ee->prop.fullscreen = EINA_FALSE; + ee->prop.maximized = EINA_FALSE; /* we get the states status */ ecore_win32_window_state_get(e->window, &state, &num); @@ -475,6 +482,10 @@ _ecore_evas_win32_event_window_property_change(void *data EINA_UNUSED, int type ee->prop.fullscreen = 1; wdata->state.fullscreen = 1; break; + case ECORE_WIN32_WINDOW_STATE_MAXIMIZED: + ee->prop.maximized = 1; + wdata->state.maximized = 1; + break; default: break; } @@ -483,7 +494,9 @@ _ecore_evas_win32_event_window_property_change(void *data EINA_UNUSED, int type } if ((prev.win32.fullscreen != wdata->state.fullscreen) || - (prev.prop.fullscreen != ee->prop.fullscreen)) + (prev.prop.fullscreen != ee->prop.fullscreen) || + (prev.win32.maximized != wdata->state.maximized) || + (prev.prop.maximized != ee->prop.maximized)) { if (ee->func.fn_state_change) ee->func.fn_state_change(ee); @@ -508,6 +521,8 @@ _ecore_evas_win32_state_update(Ecore_Evas *ee) state[num++] = ECORE_WIN32_WINDOW_STATE_MAXIMIZED_VERT; if (ee->prop.maximized) state[num++] = ECORE_WIN32_WINDOW_STATE_MAXIMIZED_HORZ; + if (ee->prop.maximized) + state[num++] = ECORE_WIN32_WINDOW_STATE_MAXIMIZED; // if (bd->client.netwm.state.shaded) // state[num++] = ECORE_WIN32_WINDOW_STATE_SHADED; /* if (ee->prop.focus_skip) */ @@ -832,7 +847,7 @@ _ecore_evas_win32_activate(Ecore_Evas *ee) INF("ecore evas activate"); ecore_evas_show(ee); - ecore_win32_window_activate(ee->prop.window); + ecore_win32_window_activate((Ecore_Win32_Window *)ee->prop.window); } static void @@ -974,6 +989,30 @@ _ecore_evas_win32_override_set(Ecore_Evas *ee, Eina_Bool on) ee->prop.override = on; } +static void +_ecore_evas_win32_maximized_set(Ecore_Evas *ee, Eina_Bool on) +{ + Ecore_Evas_Engine_Data_Win32 *wdata = ee->engine.data; + + INF("ecore evas maximized set"); + + wdata->state.maximized = !!on; + if (ee->should_be_visible) + { + struct _Ecore_Win32_Window *window; + + window = (Ecore_Win32_Window *)ee->prop.window; + ecore_win32_window_maximized_set(window, on); + } + else + { + if (ee->prop.maximized == on) return; + ee->prop.maximized = on; + wdata->state.maximized = on; + _ecore_evas_win32_state_update(ee); + } +} + static void _ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, Eina_Bool on) { @@ -1373,7 +1412,7 @@ static Ecore_Evas_Engine_Func _ecore_win32_engine_func = _ecore_evas_win32_iconified_set, _ecore_evas_win32_borderless_set, _ecore_evas_win32_override_set, - NULL, /* _ecore_evas_x_maximize_set */ + _ecore_evas_win32_maximized_set, _ecore_evas_win32_fullscreen_set, NULL, /* _ecore_evas_x_avoid_damage_set */ NULL, /* _ecore_evas_x_withdrawn_set */