[PATCH weston v4 06/20] compositor: Keep track of what views were activated by clicking
Peter Hutterer
peter.hutterer at who-t.net
Wed Nov 18 18:23:34 PST 2015
On Tue, Nov 17, 2015 at 06:10:52PM +0800, Jonas Ådahl wrote:
> 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
typo: shell-independent
02-06 are Acked-by: Peter Hutterer <peter.hutterer at who-t.net>
one comment at the bottom of this email:
> 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);
> +}
I'm not overly fond of this approach tbh, the peek and disassociated
serial increase is looking for trouble. would it make sense to simply return
the serial from weston_surface_activate()?
Cheers,
Peter
> +
> +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