Currently xwayland desktop surfaces have multiple states for toplevel
surfaces - MAXIMIZED/FULLSCREEN/TOPLEVEL. With this change all "toplevel"
surfaces are marked as TOPLEVEL state and maximized/fullscreen are
boolean flags, just like they are in xdg-shell. This way maximized state
isn't lost when for example a maximized window is fullscreened
and then unfullscreened. We must also make sure to call set_toplevel()
in XWM for maximized/fullscreen windows, as now they are "toplevel" with
maximized state

Signed-off-by: Ilia Bozhinov <[email protected]>
---
 libweston-desktop/xwayland.c | 23 +++++++++--------------
 xwayland/window-manager.c    |  2 ++
 2 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/libweston-desktop/xwayland.c b/libweston-desktop/xwayland.c
index 4f4b453f..9ab9dfbf 100644
--- a/libweston-desktop/xwayland.c
+++ b/libweston-desktop/xwayland.c
@@ -40,8 +40,6 @@
 enum weston_desktop_xwayland_surface_state {
        NONE,
        TOPLEVEL,
-       MAXIMIZED,
-       FULLSCREEN,
        TRANSIENT,
        XWAYLAND,
 };
@@ -62,6 +60,8 @@ struct weston_desktop_xwayland_surface {
        struct weston_geometry next_geometry;
        bool has_next_geometry;
        bool added;
+       bool maximized;
+       bool fullscreen;
        enum weston_desktop_xwayland_surface_state state;
 };
 
@@ -190,7 +190,7 @@ weston_desktop_xwayland_surface_get_maximized(struct 
weston_desktop_surface *dsu
 {
        struct weston_desktop_xwayland_surface *surface = user_data;
 
-       return surface->state == MAXIMIZED;
+       return surface->maximized;
 }
 
 static bool
@@ -199,7 +199,7 @@ weston_desktop_xwayland_surface_get_fullscreen(struct 
weston_desktop_surface *ds
 {
        struct weston_desktop_xwayland_surface *surface = user_data;
 
-       return surface->state == FULLSCREEN;
+       return surface->fullscreen;
 }
 
 static const struct weston_desktop_surface_implementation 
weston_desktop_xwayland_surface_internal_implementation = {
@@ -305,8 +305,7 @@ static void
 set_fullscreen(struct weston_desktop_xwayland_surface *surface,
               struct weston_output *output)
 {
-       weston_desktop_xwayland_surface_change_state(surface, FULLSCREEN, NULL,
-                                                    0, 0);
+       surface->fullscreen = true;
        weston_desktop_api_fullscreen_requested(surface->desktop,
                                                surface->surface, true, output);
 }
@@ -316,15 +315,14 @@ set_xwayland(struct weston_desktop_xwayland_surface 
*surface, int x, int y)
 {
        weston_desktop_xwayland_surface_change_state(surface, XWAYLAND, NULL,
                                                     x, y);
+       surface->maximized = surface->fullscreen = false;
 }
 
 static int
 move(struct weston_desktop_xwayland_surface *surface,
      struct weston_pointer *pointer)
 {
-       if (surface->state == TOPLEVEL ||
-           surface->state == MAXIMIZED ||
-           surface->state == FULLSCREEN)
+       if (surface->state == TOPLEVEL)
                weston_desktop_api_move(surface->desktop, surface->surface,
                                        pointer->seat, pointer->grab_serial);
        return 0;
@@ -334,9 +332,7 @@ static int
 resize(struct weston_desktop_xwayland_surface *surface,
        struct weston_pointer *pointer, uint32_t edges)
 {
-       if (surface->state == TOPLEVEL ||
-           surface->state == MAXIMIZED ||
-           surface->state == FULLSCREEN)
+       if (surface->state == TOPLEVEL)
                weston_desktop_api_resize(surface->desktop, surface->surface,
                                          pointer->seat, pointer->grab_serial,
                                          edges);
@@ -363,8 +359,7 @@ set_window_geometry(struct weston_desktop_xwayland_surface 
*surface,
 static void
 set_maximized(struct weston_desktop_xwayland_surface *surface)
 {
-       weston_desktop_xwayland_surface_change_state(surface, MAXIMIZED, NULL,
-                                                    0, 0);
+       surface->maximized = true;
        weston_desktop_api_maximized_requested(surface->desktop,
                                               surface->surface, true);
 }
diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index 13acc84e..b0f78e2d 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -2750,6 +2750,7 @@ xserver_map_shell_surface(struct weston_wm_window *window,
        if (window->fullscreen) {
                window->saved_width = window->width;
                window->saved_height = window->height;
+               xwayland_interface->set_toplevel(window->shsurf);
                xwayland_interface->set_fullscreen(window->shsurf,
                                                   
window->legacy_fullscreen_output.output);
                return;
@@ -2769,6 +2770,7 @@ xserver_map_shell_surface(struct weston_wm_window *window,
                                                       parent->surface);
                }
        } else if (weston_wm_window_is_maximized(window)) {
+               xwayland_interface->set_toplevel(window->shsurf);
                xwayland_interface->set_maximized(window->shsurf);
        } else {
                if (weston_wm_window_type_inactive(window)) {
-- 
2.13.0

_______________________________________________
wayland-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to