aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/ecore_wl2/Ecore_Wl2.h10
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_window.c54
-rw-r--r--src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c4
3 files changed, 43 insertions, 25 deletions
diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h
index b97faadfd7..fd2e9d1c62 100644
--- a/src/lib/ecore_wl2/Ecore_Wl2.h
+++ b/src/lib/ecore_wl2/Ecore_Wl2.h
@@ -122,10 +122,18 @@ typedef struct _Ecore_Wl2_Event_Selection_Data_Ready
Eina_Bool done;
} Ecore_Wl2_Event_Selection_Data_Ready;
+typedef enum
+{
+ ECORE_WL2_WINDOW_STATE_NONE = 0,
+ ECORE_WL2_WINDOW_STATE_FULLSCREEN = (1 << 0),
+ ECORE_WL2_WINDOW_STATE_MAXIMIZED = (1 << 1),
+} Ecore_Wl2_Window_States;
+
typedef struct _Ecore_Wl2_Event_Window_Configure
{
unsigned int win, event_win, edges;
- int x, y, w, h;
+ unsigned int w, h;
+ unsigned int states;
} Ecore_Wl2_Event_Window_Configure;
typedef struct _Ecore_Wl2_Event_Sync_Done
diff --git a/src/lib/ecore_wl2/ecore_wl2_window.c b/src/lib/ecore_wl2/ecore_wl2_window.c
index dc35de086d..ad72a6260d 100644
--- a/src/lib/ecore_wl2/ecore_wl2_window.c
+++ b/src/lib/ecore_wl2/ecore_wl2_window.c
@@ -5,7 +5,7 @@
#include "ecore_wl2_private.h"
static void
-_ecore_wl2_window_configure_send(Ecore_Wl2_Window *window, int w, int h, unsigned int edges)
+_ecore_wl2_window_configure_send(Ecore_Wl2_Window *window, int w, int h, unsigned int edges, Eina_Bool fs, Eina_Bool max)
{
Ecore_Wl2_Event_Window_Configure *ev;
@@ -14,11 +14,13 @@ _ecore_wl2_window_configure_send(Ecore_Wl2_Window *window, int w, int h, unsigne
ev->win = window->id;
ev->event_win = window->id;
- ev->x = window->geometry.x;
- ev->y = window->geometry.y;
ev->w = w;
ev->h = h;
ev->edges = edges;
+ if (fs)
+ ev->states |= ECORE_WL2_WINDOW_STATE_FULLSCREEN;
+ if (max)
+ ev->states |= ECORE_WL2_WINDOW_STATE_MAXIMIZED;
ecore_event_add(ECORE_WL2_EVENT_WINDOW_CONFIGURE, ev, NULL, NULL);
}
@@ -32,14 +34,9 @@ _wl_shell_surface_cb_ping(void *data EINA_UNUSED, struct wl_shell_surface *shell
static void
_wl_shell_surface_cb_configure(void *data, struct wl_shell_surface *shell_surface EINA_UNUSED, unsigned int edges, int w, int h)
{
- Ecore_Wl2_Window *win;
-
- win = data;
- if (!win) return;
+ Ecore_Wl2_Window *win = data;
- if ((w <= 0) || (h <= 0)) return;
- if ((w > 0) && (h > 0))
- _ecore_wl2_window_configure_send(win, w, h, edges);
+ _ecore_wl2_window_configure_send(win, w, h, edges, win->fullscreen, win->maximized);
}
static void
@@ -79,11 +76,15 @@ static const struct xdg_popup_listener _xdg_popup_listener =
static void
_xdg_surface_cb_configure(void *data, struct xdg_surface *xdg_surface EINA_UNUSED, int32_t w, int32_t h, struct wl_array *states, uint32_t serial)
{
- Ecore_Wl2_Window *win;
+ Ecore_Wl2_Window *win = data;
uint32_t *s;
+ Eina_Bool fs, max;
- win = data;
- if (!win) return;
+ if ((!win->maximized) && (!win->fullscreen))
+ win->saved = win->geometry;
+
+ fs = win->fullscreen;
+ max = win->maximized;
win->minimized = EINA_FALSE;
win->maximized = EINA_FALSE;
@@ -115,8 +116,11 @@ _xdg_surface_cb_configure(void *data, struct xdg_surface *xdg_surface EINA_UNUSE
win->configure_serial = serial;
if ((win->geometry.w == w) && (win->geometry.h == h))
w = h = 0;
+ else if ((!w) && (!h) &&
+ (!win->fullscreen) && (!win->maximized) && ((win->fullscreen != fs) || (win->maximized != max)))
+ w = win->saved.w, h = win->saved.h;
- _ecore_wl2_window_configure_send(win, w, h, 0);
+ _ecore_wl2_window_configure_send(win, w, h, !!win->resizing, win->fullscreen, win->maximized);
}
static void
@@ -668,7 +672,8 @@ ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
maximized = !!maximized;
if (prev == maximized) return;
- window->maximized = maximized;
+ if (window->wl_shell_surface)
+ window->maximized = maximized;
if (maximized)
{
@@ -684,10 +689,12 @@ ecore_wl2_window_maximized_set(Ecore_Wl2_Window *window, Eina_Bool maximized)
if (window->xdg_surface)
xdg_surface_unset_maximized(window->xdg_surface);
else if (window->wl_shell_surface)
- wl_shell_surface_set_toplevel(window->wl_shell_surface);
+ {
+ wl_shell_surface_set_toplevel(window->wl_shell_surface);
- _ecore_wl2_window_configure_send(window, window->saved.w,
- window->saved.h, 0);
+ _ecore_wl2_window_configure_send(window, window->saved.w,
+ window->saved.h, 0, window->fullscreen, window->maximized);
+ }
}
}
@@ -710,7 +717,8 @@ ecore_wl2_window_fullscreen_set(Ecore_Wl2_Window *window, Eina_Bool fullscreen)
fullscreen = !!fullscreen;
if (prev == fullscreen) return;
- window->fullscreen = fullscreen;
+ if (window->wl_shell_surface)
+ window->fullscreen = fullscreen;
if (fullscreen)
{
@@ -728,10 +736,12 @@ ecore_wl2_window_fullscreen_set(Ecore_Wl2_Window *window, Eina_Bool fullscreen)
if (window->xdg_surface)
xdg_surface_unset_fullscreen(window->xdg_surface);
else if (window->wl_shell_surface)
- wl_shell_surface_set_toplevel(window->wl_shell_surface);
+ {
+ wl_shell_surface_set_toplevel(window->wl_shell_surface);
- _ecore_wl2_window_configure_send(window, window->saved.w,
- window->saved.h, 0);
+ _ecore_wl2_window_configure_send(window, window->saved.w,
+ window->saved.h, 0, window->fullscreen, window->maximized);
+ }
}
}
diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
index 5d17831b0f..41ec06ed06 100644
--- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
+++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
@@ -182,8 +182,8 @@ _ecore_evas_wl_common_cb_window_configure(void *data EINA_UNUSED, int type EINA_
prev_max = ee->prop.maximized;
prev_full = ee->prop.fullscreen;
- ee->prop.maximized = ecore_wl2_window_maximized_get(wdata->win);
- ee->prop.fullscreen = ecore_wl2_window_fullscreen_get(wdata->win);
+ ee->prop.maximized = (ev->states & ECORE_WL2_WINDOW_STATE_MAXIMIZED) == ECORE_WL2_WINDOW_STATE_MAXIMIZED;
+ ee->prop.fullscreen = (ev->states & ECORE_WL2_WINDOW_STATE_FULLSCREEN) == ECORE_WL2_WINDOW_STATE_FULLSCREEN;
nw = ev->w;
nh = ev->h;