Surface activity is determined by what surface is being displayed
fullscreen.  Only a single surface can be active in the shell.

Signed-off-by: Bryce Harrington <[email protected]>
---
 fullscreen-shell/fullscreen-shell.c | 36 ++++++++++++++++++++++++++++++++----
 1 file changed, 32 insertions(+), 4 deletions(-)

diff --git a/fullscreen-shell/fullscreen-shell.c 
b/fullscreen-shell/fullscreen-shell.c
index abc4e84..f04af0a 100644
--- a/fullscreen-shell/fullscreen-shell.c
+++ b/fullscreen-shell/fullscreen-shell.c
@@ -46,6 +46,7 @@ struct fullscreen_shell {
        struct wl_listener output_created_listener;
 
        struct wl_listener seat_created_listener;
+       struct weston_surface *active_surface;
 };
 
 struct fs_output {
@@ -84,12 +85,22 @@ struct pointer_focus_listener {
 };
 
 static void
-pointer_focus_changed(struct wl_listener *listener, void *data)
+pointer_focus_changed(struct wl_listener *l, void *data)
 {
        struct weston_pointer *pointer = data;
+       struct weston_surface *old_surface;
+       struct pointer_focus_listener *listener;
+
+       listener = container_of(l, struct pointer_focus_listener,
+                               seat_destroyed);
 
-       if (pointer->focus && pointer->focus->surface->resource)
+       if (pointer->focus && pointer->focus->surface->resource) {
+               old_surface = listener->shell->active_surface;
+               if (old_surface != NULL)
+                       weston_surface_deactivate(old_surface, pointer->seat);
                weston_surface_activate(pointer->focus->surface, pointer->seat);
+               listener->shell->active_surface = pointer->focus->surface;
+       }
 }
 
 static void
@@ -98,6 +109,7 @@ seat_caps_changed(struct wl_listener *l, void *data)
        struct weston_seat *seat = data;
        struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
        struct weston_pointer *pointer = weston_seat_get_pointer(seat);
+       struct weston_surface *old_surface;
        struct pointer_focus_listener *listener;
        struct fs_output *fsout;
 
@@ -116,9 +128,13 @@ seat_caps_changed(struct wl_listener *l, void *data)
        }
 
        if (keyboard && keyboard->focus != NULL) {
+               old_surface = listener->shell->active_surface;
                wl_list_for_each(fsout, &listener->shell->output_list, link) {
                        if (fsout->surface) {
+                               if (old_surface != NULL)
+                                       weston_surface_deactivate(old_surface, 
seat);
                                weston_surface_activate(fsout->surface, seat);
+                               listener->shell->active_surface = 
fsout->surface;
                                return;
                        }
                }
@@ -671,6 +687,7 @@ fullscreen_shell_present_surface(struct wl_client *client,
                wl_resource_get_user_data(resource);
        struct weston_output *output;
        struct weston_surface *surface;
+       struct weston_surface *old_surface;
        struct weston_seat *seat;
        struct fs_output *fsout;
 
@@ -703,8 +720,13 @@ fullscreen_shell_present_surface(struct wl_client *client,
                        struct weston_keyboard *keyboard =
                                weston_seat_get_keyboard(seat);
 
-                       if (keyboard && !keyboard->focus)
+                       if (keyboard && !keyboard->focus) {
+                               old_surface = shell->active_surface;
+                               if (old_surface != NULL)
+                                       weston_surface_deactivate(old_surface, 
seat);
                                weston_surface_activate(surface, seat);
+                               shell->active_surface = surface;
+                       }
                }
        }
 }
@@ -729,6 +751,7 @@ fullscreen_shell_present_surface_for_mode(struct wl_client 
*client,
                wl_resource_get_user_data(resource);
        struct weston_output *output;
        struct weston_surface *surface;
+       struct weston_surface *old_surface;
        struct weston_seat *seat;
        struct fs_output *fsout;
 
@@ -754,8 +777,13 @@ fullscreen_shell_present_surface_for_mode(struct wl_client 
*client,
                struct weston_keyboard *keyboard =
                        weston_seat_get_keyboard(seat);
 
-               if (keyboard && !keyboard->focus)
+               if (keyboard && !keyboard->focus) {
+                       old_surface = shell->active_surface;
+                       if (old_surface != NULL)
+                               weston_surface_deactivate(old_surface, seat);
                        weston_surface_activate(surface, seat);
+                       shell->active_surface = surface;
+               }
        }
 }
 
-- 
1.9.1

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

Reply via email to