From: Ning Tang <ning.t...@intel.com>

When a client is binded, the server side will send an event to let the
client set fullscreen.
If the client don't response, it will remain centered.

 Signed-off-by: Ning Tang <tecto...@gmail.com>

---
 protocol/tablet-shell.xml |  2 ++
 src/tablet-shell.c        | 90 ++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 87 insertions(+), 5 deletions(-)

diff --git a/protocol/tablet-shell.xml b/protocol/tablet-shell.xml
index 10f1756..f226c01 100644
--- a/protocol/tablet-shell.xml
+++ b/protocol/tablet-shell.xml
@@ -35,6 +35,8 @@
   <interface name="tablet_client" version="1">
     <request name="destroy" type="destructor"/>
     <request name="activate"/>
+
+    <event name="set_fullscreen"/>
   </interface>
 
 </protocol>
diff --git a/src/tablet-shell.c b/src/tablet-shell.c
index 89f84bf..d7ce01f 100644
--- a/src/tablet-shell.c
+++ b/src/tablet-shell.c
@@ -45,6 +45,7 @@ enum {
 
 struct tablet_shell {
        struct wl_resource resource;
+       struct wl_resource client_resource;
 
        struct wl_listener lock_listener;
        struct wl_listener unlock_listener;
@@ -153,6 +154,11 @@ shell_handle_surface_destroy(struct wl_listener *listener, 
void *data)
        struct shell_surface *shsurf =
                container_of(listener, struct shell_surface,
                             surface_destroy_listener);
+       struct tablet_shell *shell = shsurf->shell;
+       if (shell->client_resource.client) {
+               wl_resource_destroy(&shell->client_resource);
+               shell->client_resource.client = NULL;
+       }
        if (shsurf->resource.client) {
                wl_resource_destroy(&shsurf->resource);
        } else {
@@ -211,6 +217,11 @@ shell_surface_set_transient(struct wl_client *client,
                        int x, int y, uint32_t flags)
 {
        struct shell_surface *shsurf = resource->data;
+       struct tablet_shell *shell = shsurf->shell;
+       if (shell->client_resource.client) {
+               wl_resource_destroy(&shell->client_resource);
+               shell->client_resource.client = NULL;
+       }
        if (shsurf->resource.client) {
                wl_resource_destroy(&shsurf->resource);
        } else {
@@ -546,6 +557,24 @@ shell_stack_fullscreen(struct shell_surface *shsurf)
 }
 
 static void
+configure(struct tablet_shell *shell, struct weston_surface *surface,
+         GLfloat x, GLfloat y, int32_t width, int32_t height)
+{
+       struct shell_surface *shsurf;
+
+       shsurf = get_shell_surface(surface);
+       surface->geometry.x = x;
+       surface->geometry.y = y;
+       surface->geometry.width = width;
+       surface->geometry.height = height;
+       surface->geometry.dirty = 1;
+
+       shell_stack_fullscreen(shsurf);
+       center_on_output(surface, surface->output);
+       weston_surface_assign_output(surface);
+}
+
+static void
 shell_surface_configure(struct weston_surface *surface,
                        int32_t sx, int32_t sy)
 {
@@ -558,12 +587,44 @@ shell_surface_configure(struct weston_surface *surface,
 
                wl_list_insert(&shell->application_layer.surface_list,
                               &surface->layer_link);
-               weston_surface_assign_output(surface);
-               center_on_output(surface, surface->output);
-               shell_stack_fullscreen(shsurf);
-               wl_list_for_each(seat, &surface->compositor->seat_list, link)
+               if (shell->client_resource.client) {
+                       weston_surface_assign_output(surface);
+                       center_on_output(surface, surface->output);
+                       shell_stack_fullscreen(shsurf);
+                       wl_list_for_each(seat,
+                                        &surface->compositor->seat_list,
+                                        link)
                        weston_surface_activate(surface, seat);
-               weston_compositor_schedule_repaint(shell->compositor);
+                       weston_compositor_schedule_repaint(surface->compositor);
+                       tablet_client_send_set_fullscreen(
+                                       &shell->client_resource);
+
+                       return;
+               } else {
+                       weston_surface_assign_output(surface);
+                       center_on_output(surface, surface->output);
+                       shell_stack_fullscreen(shsurf);
+                       wl_list_for_each(seat, &surface->compositor->seat_list,
+                                        link)
+                               weston_surface_activate(surface, seat);
+                       weston_compositor_schedule_repaint(shell->compositor);
+               }
+       }
+       if (sx != 0 || sy != 0 ||
+               surface->geometry.width != surface->buffer->width ||
+               surface->geometry.height != surface->buffer->height) {
+               GLfloat from_x, from_y;
+               GLfloat to_x, to_y;
+
+               weston_surface_to_global_float(surface, 0, 0,
+                                              &from_x, &from_y);
+               weston_surface_to_global_float(surface, sx, sy,
+                                              &to_x, &to_y);
+               configure(shell, surface,
+                         surface->geometry.x + to_x - from_x,
+                         surface->geometry.y + to_y - from_y,
+                         surface->buffer->width,
+                         surface->buffer->height);
        }
 }
 
@@ -890,6 +951,22 @@ bind_tablet_shell(struct wl_client *client, void *data, 
uint32_t version,
 }
 
 static void
+bind_tablet_client(struct wl_client *client, void *data, uint32_t version,
+                  uint32_t id)
+{
+       struct tablet_shell *shell = data;
+       shell->client_resource.object.id = id;
+       shell->client_resource.object.interface = &tablet_client_interface;
+       shell->client_resource.object.implementation =
+               (void (**)(void)) &tablet_client_implementation;
+       shell->client_resource.client = client;
+       shell->client_resource.data = shell;
+       shell->client_resource.destroy = destroy_tablet_shell;
+
+       wl_client_add_resource(client, &shell->client_resource);
+}
+
+static void
 tablet_shell_destroy(struct wl_listener *listener, void *data)
 {
        struct tablet_shell *shell =
@@ -928,6 +1005,9 @@ shell_init(struct weston_compositor *compositor)
        shell->unlock_listener.notify = tablet_shell_unlock;
        wl_signal_add(&compositor->unlock_signal, &shell->unlock_listener);
 
+       wl_display_add_global(compositor->wl_display, &tablet_client_interface,
+                             shell, bind_tablet_client);
+
        /* FIXME: This will make the object available to all clients. */
        wl_display_add_global(compositor->wl_display, &tablet_shell_interface,
                              shell, bind_tablet_shell);
-- 
1.7.11.5

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

Reply via email to