[PATCH weston v4 06/20] compositor: Keep track of what views were activated by clicking
Jonas Ådahl
jadahl at gmail.com
Tue Nov 17 02:10:52 PST 2015
Adds a weston_view_activate() that can be passed an additional active
flag WESTON_ACTIVATE_CLICKED, that the shell passes when a view was
activated by clicking.
This allows shell independent components implement heuristics depending
on how a view was activated.
Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
---
desktop-shell/shell.c | 3 ++-
src/compositor.c | 2 ++
src/compositor.h | 11 +++++++++++
src/input.c | 30 ++++++++++++++++++++++++++++++
4 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index 3b34529..ab5be7a 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -5055,7 +5055,7 @@ activate(struct desktop_shell *shell, struct weston_view *view,
* Leave fullscreen surfaces on unrelated outputs alone. */
lower_fullscreen_layer(shell, shsurf->output);
- weston_surface_activate(es, seat);
+ weston_view_activate(view, seat, flags);
state = ensure_focus_state(shell, seat);
if (state == NULL)
@@ -5130,6 +5130,7 @@ click_to_activate_binding(struct weston_pointer *pointer, uint32_t time,
return;
activate_binding(pointer->seat, data, pointer->focus,
+ WESTON_ACTIVATE_FLAG_CLICKED |
WESTON_ACTIVATE_FLAG_CONFIGURE);
}
diff --git a/src/compositor.c b/src/compositor.c
index f8437e8..6f8d769 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -4490,6 +4490,8 @@ weston_compositor_create(struct wl_display *display, void *user_data)
ec->output_id_pool = 0;
ec->repaint_msec = DEFAULT_REPAINT_WINDOW;
+ ec->activate_serial = 1;
+
if (!wl_global_create(ec->wl_display, &wl_compositor_interface, 3,
ec, compositor_bind))
goto fail;
diff --git a/src/compositor.h b/src/compositor.h
index d1f7b04..032c637 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -750,6 +750,8 @@ struct weston_compositor {
clockid_t presentation_clock;
int32_t repaint_msec;
+ unsigned int activate_serial;
+
int exit_code;
void *user_data;
@@ -848,6 +850,8 @@ struct weston_view {
/* For weston_layer inheritance from another view */
struct weston_view *parent_view;
+ unsigned int click_to_activate_serial;
+
pixman_region32_t clip; /* See weston_view_damage_below() */
float alpha; /* part of geometry, see below */
@@ -1067,6 +1071,7 @@ enum weston_key_state_update {
enum weston_activate_flag {
WESTON_ACTIVATE_FLAG_NONE = 0,
WESTON_ACTIVATE_FLAG_CONFIGURE = 1 << 0,
+ WESTON_ACTIVATE_FLAG_CLICKED = 1 << 1,
};
void
@@ -1123,6 +1128,12 @@ weston_spring_done(struct weston_spring *spring);
void
weston_surface_activate(struct weston_surface *surface,
struct weston_seat *seat);
+
+void
+weston_view_activate(struct weston_view *view,
+ struct weston_seat *seat,
+ enum weston_activate_flag flags);
+
void
notify_motion(struct weston_seat *seat, uint32_t time,
struct weston_pointer_motion_event *event);
diff --git a/src/input.c b/src/input.c
index 53e84a0..0a567da 100644
--- a/src/input.c
+++ b/src/input.c
@@ -1102,6 +1102,20 @@ notify_motion_absolute(struct weston_seat *seat,
pointer->grab->interface->motion(pointer->grab, time, &event);
}
+static unsigned int
+peek_next_activate_serial(struct weston_compositor *c)
+{
+ unsigned serial = c->activate_serial + 1;
+
+ return serial == 0 ? 1 : serial;
+}
+
+static void
+inc_activate_serial(struct weston_compositor *c)
+{
+ c->activate_serial = peek_next_activate_serial (c);
+}
+
WL_EXPORT void
weston_surface_activate(struct weston_surface *surface,
struct weston_seat *seat)
@@ -1109,6 +1123,8 @@ weston_surface_activate(struct weston_surface *surface,
struct weston_compositor *compositor = seat->compositor;
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
+ inc_activate_serial(compositor);
+
if (keyboard) {
weston_keyboard_set_focus(keyboard, surface);
wl_data_device_set_keyboard_focus(seat);
@@ -1118,6 +1134,20 @@ weston_surface_activate(struct weston_surface *surface,
}
WL_EXPORT void
+weston_view_activate(struct weston_view *view,
+ struct weston_seat *seat,
+ uint32_t flags)
+{
+ struct weston_compositor *compositor = seat->compositor;
+
+ if (flags & WESTON_ACTIVATE_FLAG_CLICKED) {
+ view->click_to_activate_serial =
+ peek_next_activate_serial(compositor);
+ }
+ weston_surface_activate(view->surface, seat);
+}
+
+WL_EXPORT void
notify_button(struct weston_seat *seat, uint32_t time, int32_t button,
enum wl_pointer_button_state state)
{
--
2.4.3
More information about the wayland-devel
mailing list