---
 src/shell.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 82 insertions(+), 5 deletions(-)

diff --git a/src/shell.c b/src/shell.c
index f775899..6cbb4bd 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -2999,6 +2999,83 @@ xdg_surface_resize(struct wl_client *client, struct 
wl_resource *resource,
        common_surface_resize(resource, seat_resource, serial, edges);
 }
 
+static void
+xdg_surface_set_output(struct wl_client *client,
+                      struct wl_resource *resource,
+                      struct wl_resource *output_resource)
+{
+       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+       struct weston_output *output;
+
+       if (output_resource)
+               output = wl_resource_get_user_data(output_resource);
+       else
+               output = NULL;
+
+       if (!weston_surface_is_mapped(shsurf->surface))
+               shsurf->output = output;
+}
+
+static void
+xdg_surface_set_fullscreen(struct wl_client *client,
+                          struct wl_resource *resource)
+{
+       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+
+       if (shsurf->type != SHELL_SURFACE_TOPLEVEL)
+               return;
+
+       if (!shsurf->next.fullscreen) {
+               shsurf->next.fullscreen = true;
+               shsurf->state_changed = true;
+               set_fullscreen(shsurf,
+                              WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT,
+                              0, shsurf->output);
+       }
+}
+
+static void
+xdg_surface_unset_fullscreen(struct wl_client *client,
+                            struct wl_resource *resource)
+{
+       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+
+       if (shsurf->type != SHELL_SURFACE_TOPLEVEL)
+               return;
+
+       shsurf->next.fullscreen = false;
+       shsurf->state_changed = true;
+}
+
+static void
+xdg_surface_set_maximized(struct wl_client *client,
+                         struct wl_resource *resource)
+{
+       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+
+       if (shsurf->type != SHELL_SURFACE_TOPLEVEL)
+               return;
+
+       if (!shsurf->next.maximized) {
+               shsurf->next.maximized = true;
+               shsurf->state_changed = true;
+               set_maximized(shsurf, shsurf->output);
+       }
+}
+
+static void
+xdg_surface_unset_maximized(struct wl_client *client,
+                           struct wl_resource *resource)
+{
+       struct shell_surface *shsurf = wl_resource_get_user_data(resource);
+
+       if (shsurf->type != SHELL_SURFACE_TOPLEVEL)
+               return;
+
+       shsurf->next.maximized = false;
+       shsurf->state_changed = true;
+}
+
 static const struct xdg_surface_interface xdg_surface_implementation = {
        xdg_surface_destroy,
        NULL, // set_transient_for
@@ -3007,11 +3084,11 @@ static const struct xdg_surface_interface 
xdg_surface_implementation = {
        xdg_surface_pong,
        xdg_surface_move,
        xdg_surface_resize,
-       NULL, // set_output
-       NULL, // set_fullscreen
-       NULL, // unset_fullscreen
-       NULL, // set_maximized
-       NULL, // unset_maximized
+       xdg_surface_set_output,
+       xdg_surface_set_fullscreen,
+       xdg_surface_unset_fullscreen,
+       xdg_surface_set_maximized,
+       xdg_surface_unset_maximized,
        NULL // set_minimized
 };
 
-- 
1.8.3.1

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to