Signed-off-by: Bryce Harrington <br...@osg.samsung.com>
---
v3: Rename inhibit_screensaving to inhibit_idling

 desktop-shell/shell.c               |  4 +++-
 fullscreen-shell/fullscreen-shell.c | 25 +++++++++++++++-------
 ivi-shell/ivi-shell.c               |  4 +++-
 src/compositor.c                    | 42 +++++++++++++++++++++++++++++++++++++
 src/compositor.h                    | 27 +++++++++++++++++++++---
 src/input.c                         | 15 -------------
 tests/weston-test.c                 |  8 +++++--
 7 files changed, 96 insertions(+), 29 deletions(-)

diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index 780902d..6e49076 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -5055,7 +5055,9 @@ activate(struct desktop_shell *shell, struct 
weston_surface *es,
         * Leave fullscreen surfaces on unrelated outputs alone. */
        lower_fullscreen_layer(shell, shsurf->output);
 
-       weston_surface_activate(es, seat);
+       weston_surface_assign_keyboard(es, seat);
+       if (es != NULL)
+               weston_surface_activate(es);
 
        state = ensure_focus_state(shell, seat);
        if (state == NULL)
diff --git a/fullscreen-shell/fullscreen-shell.c 
b/fullscreen-shell/fullscreen-shell.c
index abc4e84..e1f8a63 100644
--- a/fullscreen-shell/fullscreen-shell.c
+++ b/fullscreen-shell/fullscreen-shell.c
@@ -88,8 +88,11 @@ pointer_focus_changed(struct wl_listener *listener, void 
*data)
 {
        struct weston_pointer *pointer = data;
 
-       if (pointer->focus && pointer->focus->surface->resource)
-               weston_surface_activate(pointer->focus->surface, pointer->seat);
+       if (pointer->focus && pointer->focus->surface->resource) {
+               weston_surface_assign_keyboard(pointer->focus->surface, 
pointer->seat);
+               if (pointer->focus->surface != NULL)
+                       weston_surface_activate(pointer->focus->surface);
+       }
 }
 
 static void
@@ -118,7 +121,9 @@ seat_caps_changed(struct wl_listener *l, void *data)
        if (keyboard && keyboard->focus != NULL) {
                wl_list_for_each(fsout, &listener->shell->output_list, link) {
                        if (fsout->surface) {
-                               weston_surface_activate(fsout->surface, seat);
+                               weston_surface_assign_keyboard(fsout->surface, 
seat);
+                               if (fsout->surface != NULL)
+                                       weston_surface_activate(fsout->surface);
                                return;
                        }
                }
@@ -703,8 +708,11 @@ fullscreen_shell_present_surface(struct wl_client *client,
                        struct weston_keyboard *keyboard =
                                weston_seat_get_keyboard(seat);
 
-                       if (keyboard && !keyboard->focus)
-                               weston_surface_activate(surface, seat);
+                       if (keyboard && !keyboard->focus) {
+                               weston_surface_assign_keyboard(surface, seat);
+                               if (surface != NULL)
+                                       weston_surface_activate(surface);
+                       }
                }
        }
 }
@@ -754,8 +762,11 @@ fullscreen_shell_present_surface_for_mode(struct wl_client 
*client,
                struct weston_keyboard *keyboard =
                        weston_seat_get_keyboard(seat);
 
-               if (keyboard && !keyboard->focus)
-                       weston_surface_activate(surface, seat);
+               if (keyboard && !keyboard->focus) {
+                       weston_surface_assign_keyboard(surface, seat);
+                       if (surface != NULL)
+                               weston_surface_activate(surface);
+               }
        }
 }
 
diff --git a/ivi-shell/ivi-shell.c b/ivi-shell/ivi-shell.c
index a767ccf..59f5656 100644
--- a/ivi-shell/ivi-shell.c
+++ b/ivi-shell/ivi-shell.c
@@ -425,7 +425,9 @@ activate_binding(struct weston_seat *seat,
        if (get_ivi_shell_surface(main_surface) == NULL)
                return;
 
-       weston_surface_activate(focus, seat);
+       weston_surface_assign_keyboard(focus, seat);
+       if (focus != NULL)
+               weston_surface_activate(focus);
 }
 
 static void
diff --git a/src/compositor.c b/src/compositor.c
index 83cabf7..9531a0a 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -612,6 +612,9 @@ weston_surface_create(struct weston_compositor *compositor)
        weston_matrix_init(&surface->buffer_to_surface_matrix);
        weston_matrix_init(&surface->surface_to_buffer_matrix);
 
+       surface->active = false;
+       surface->inhibit_idling = false;
+
        return surface;
 }
 
@@ -3422,6 +3425,45 @@ weston_surface_copy_content(struct weston_surface 
*surface,
                                         src_x, src_y, width, height);
 }
 
+/** Sets the keyboard focus to the given surface
+ */
+WL_EXPORT void
+weston_surface_assign_keyboard(struct weston_surface *surface,
+                             struct weston_seat *seat)
+{
+        struct weston_compositor *compositor = seat->compositor;
+        struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
+
+        if (keyboard) {
+                weston_keyboard_set_focus(keyboard, surface);
+                wl_data_device_set_keyboard_focus(seat);
+        }
+
+        wl_signal_emit(&compositor->activate_signal, surface);
+}
+
+/** Set surface as considered 'active' by the shell.
+ */
+WL_EXPORT void
+weston_surface_activate(struct weston_surface *surface)
+{
+       surface->active = true;
+}
+
+/** Set surface as no longer considered 'active' by the shell.
+ */
+WL_EXPORT void
+weston_surface_deactivate(struct weston_surface *surface)
+{
+       surface->active = false;
+}
+
+WL_EXPORT bool
+weston_surface_is_active(struct weston_surface *surface)
+{
+       return surface->active;
+}
+
 static void
 subsurface_set_position(struct wl_client *client,
                        struct wl_resource *resource, int32_t x, int32_t y)
diff --git a/src/compositor.h b/src/compositor.h
index df8ef2d..d8d5368 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1037,6 +1037,20 @@ struct weston_surface {
        const char *role_name;
 
        struct weston_timeline_object timeline;
+
+       /*
+        * A shell-specific indicator that the surface is in immediate
+        * use by the user.  For example, the surface might have keyboard
+        * focus.
+        */
+       bool active;
+
+       /*
+        * Indicates the surface prefers no screenblanking, screensaving,
+        * or other automatic obscurement to kick in while the surface is
+        * considered "active" by the shell.
+        */
+       bool inhibit_idling;
 };
 
 struct weston_subsurface {
@@ -1122,9 +1136,6 @@ int
 weston_spring_done(struct weston_spring *spring);
 
 void
-weston_surface_activate(struct weston_surface *surface,
-                       struct weston_seat *seat);
-void
 notify_motion(struct weston_seat *seat, uint32_t time,
              struct weston_pointer_motion_event *event);
 void
@@ -1402,6 +1413,16 @@ weston_surface_copy_content(struct weston_surface 
*surface,
                            int src_x, int src_y,
                            int width, int height);
 
+void
+weston_surface_assign_keyboard(struct weston_surface *surface,
+                              struct weston_seat *seat);
+void
+weston_surface_activate(struct weston_surface *surface);
+void
+weston_surface_deactivate(struct weston_surface *surface);
+bool
+weston_surface_is_active(struct weston_surface *surface);
+
 struct weston_buffer *
 weston_buffer_from_resource(struct wl_resource *resource);
 
diff --git a/src/input.c b/src/input.c
index a3d982e..6e35105 100644
--- a/src/input.c
+++ b/src/input.c
@@ -1206,21 +1206,6 @@ notify_motion_absolute(struct weston_seat *seat,
 }
 
 WL_EXPORT void
-weston_surface_activate(struct weston_surface *surface,
-                       struct weston_seat *seat)
-{
-       struct weston_compositor *compositor = seat->compositor;
-       struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
-
-       if (keyboard) {
-               weston_keyboard_set_focus(keyboard, surface);
-               wl_data_device_set_keyboard_focus(seat);
-       }
-
-       wl_signal_emit(&compositor->activate_signal, surface);
-}
-
-WL_EXPORT void
 notify_button(struct weston_seat *seat, uint32_t time, int32_t button,
              enum wl_pointer_button_state state)
 {
diff --git a/tests/weston-test.c b/tests/weston-test.c
index 03e2c54..15cd07f 100644
--- a/tests/weston-test.c
+++ b/tests/weston-test.c
@@ -181,13 +181,17 @@ activate_surface(struct wl_client *client, struct 
wl_resource *resource,
        seat = get_seat(test);
        keyboard = weston_seat_get_keyboard(seat);
        if (surface) {
-               weston_surface_activate(surface, seat);
+               weston_surface_assign_keyboard(surface, seat);
+               if (surface != NULL)
+                       weston_surface_activate(surface);
                notify_keyboard_focus_in(seat, &keyboard->keys,
                                         STATE_UPDATE_AUTOMATIC);
        }
        else {
                notify_keyboard_focus_out(seat);
-               weston_surface_activate(surface, seat);
+               weston_surface_assign_keyboard(surface, seat);
+               if (surface != NULL)
+                       weston_surface_activate(surface);
        }
 }
 
-- 
1.9.1

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

Reply via email to