[PATCH weston 5/5] shell: override the default pointer grab interface
Kristian Høgsberg
hoegsberg at gmail.com
Fri Nov 15 14:59:52 PST 2013
On Thu, Nov 14, 2013 at 11:42:54PM +0100, Giulio Camuffo wrote:
> when a fullscreen surface hides the cursor, such as mpv, we must
> make sure that the cursor gets hidden also when it is over the
> underlying black surface. so check if the surface under the pointer
> is a black surface and focus on its parent surface instead.
> this results in sending pointer coordinates that are outside of
> the surface geometry.
I can't help thinking that this is an awful lot of code to duplicate
just to avoid picking the black surface. Maybe we could just have a
weston-internal (ie, not protocol exposed) surface flag to indicate
"don't pick me" or such...
Patches 1-4 look good all applied, but I'm not sure about this one.
Kristian
> src/shell.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 91 insertions(+)
>
> diff --git a/src/shell.c b/src/shell.c
> index fe332e1..fd6f57d 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -4892,6 +4892,96 @@ shell_add_bindings(struct weston_compositor *ec, struct desktop_shell *shell)
> debug_binding, shell);
> }
>
> +static void
> +default_grab_focus(struct weston_pointer_grab *grab)
> +{
> + struct weston_pointer *pointer = grab->pointer;
> + struct weston_view *view;
> + wl_fixed_t sx, sy;
> +
> + if (pointer->button_count > 0)
> + return;
> +
> + view = weston_compositor_pick_view(pointer->seat->compositor,
> + pointer->x, pointer->y,
> + &sx, &sy);
> +
> + if (view && view->surface->configure == &black_surface_configure) {
> + view = view->surface->configure_private;
> + }
> + if (pointer->focus != view)
> + weston_pointer_set_focus(pointer, view, sx, sy);
> +}
> +
> +static void
> +default_grab_motion(struct weston_pointer_grab *grab, uint32_t time,
> + wl_fixed_t x, wl_fixed_t y)
> +{
> + struct weston_pointer *pointer = grab->pointer;
> + wl_fixed_t sx, sy;
> + struct wl_list *resource_list;
> + struct wl_resource *resource;
> +
> + weston_pointer_move(pointer, x, y);
> +
> + resource_list = &pointer->focus_resource_list;
> + wl_resource_for_each(resource, resource_list) {
> + weston_view_from_global_fixed(pointer->focus,
> + pointer->x, pointer->y,
> + &sx, &sy);
> + wl_pointer_send_motion(resource, time, sx, sy);
> + }
> +}
> +
> +static void
> +default_grab_button(struct weston_pointer_grab *grab,
> + uint32_t time, uint32_t button, uint32_t state_w)
> +{
> + struct weston_pointer *pointer = grab->pointer;
> + struct weston_compositor *compositor = pointer->seat->compositor;
> + struct weston_view *view;
> + struct wl_resource *resource;
> + uint32_t serial;
> + enum wl_pointer_button_state state = state_w;
> + struct wl_display *display = compositor->wl_display;
> + wl_fixed_t sx, sy;
> + struct wl_list *resource_list;
> +
> + resource_list = &pointer->focus_resource_list;
> + if (!wl_list_empty(resource_list)) {
> + serial = wl_display_next_serial(display);
> + wl_resource_for_each(resource, resource_list)
> + wl_pointer_send_button(resource,
> + serial,
> + time,
> + button,
> + state_w);
> + }
> +
> + if (pointer->button_count == 0 &&
> + state == WL_POINTER_BUTTON_STATE_RELEASED) {
> + view = weston_compositor_pick_view(compositor,
> + pointer->x, pointer->y,
> + &sx, &sy);
> +
> + weston_pointer_set_focus(pointer, view, sx, sy);
> + }
> +}
> +
> +static void
> +default_grab_cancel(struct weston_pointer_grab *grab)
> +{
> +}
> +
> +
> +static const struct weston_pointer_grab_interface
> + default_pointer_grab_interface = {
> + default_grab_focus,
> + default_grab_motion,
> + default_grab_button,
> + default_grab_cancel
> +};
> +
> WL_EXPORT int
> module_init(struct weston_compositor *ec,
> int *argc, char *argv[])
> @@ -4932,6 +5022,7 @@ module_init(struct weston_compositor *ec,
> ec->shell_interface.resize = surface_resize;
> ec->shell_interface.set_title = set_title;
>
> + weston_compositor_set_default_pointer_grab(ec, &default_pointer_grab_interface);
> wl_list_init(&shell->input_panel.surfaces);
>
> weston_layer_init(&shell->fullscreen_layer, &ec->cursor_layer.link);
> --
> 1.8.4.2
>
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list