diff --git a/compositor/compositor.c b/compositor/compositor.c index 8cfa394e..e10404d5 100644 --- a/compositor/compositor.c +++ b/compositor/compositor.c @@ -571,6 +571,12 @@ move_grab_motion(struct wl_grab *grab, wlsc_surface_update_matrix(es); } +static void +move_grab_button(struct wl_grab *grab, + uint32_t time, int32_t button, int32_t state) +{ +} + static void move_grab_end(struct wl_grab *grab, uint32_t time) { @@ -579,6 +585,7 @@ move_grab_end(struct wl_grab *grab, uint32_t time) static const struct wl_grab_interface move_grab_interface = { move_grab_motion, + move_grab_button, move_grab_end }; @@ -652,6 +659,12 @@ resize_grab_motion(struct wl_grab *grab, surface, sx, sy, width, height); } +static void +resize_grab_button(struct wl_grab *grab, + uint32_t time, int32_t button, int32_t state) +{ +} + static void resize_grab_end(struct wl_grab *grab, uint32_t time) { @@ -660,6 +673,7 @@ resize_grab_end(struct wl_grab *grab, uint32_t time) static const struct wl_grab_interface resize_grab_interface = { resize_grab_motion, + resize_grab_button, resize_grab_end }; @@ -862,6 +876,16 @@ motion_grab_motion(struct wl_grab *grab, time, x, y, sx, sy); } +static void +motion_grab_button(struct wl_grab *grab, + uint32_t time, int32_t button, int32_t state) +{ + wl_client_post_event(grab->input_device->pointer_focus->client, + &grab->input_device->object, + WL_INPUT_DEVICE_BUTTON, + time, button, state); +} + static void motion_grab_end(struct wl_grab *grab, uint32_t time) { @@ -869,6 +893,7 @@ motion_grab_end(struct wl_grab *grab, uint32_t time) static const struct wl_grab_interface motion_grab_interface = { motion_grab_motion, + motion_grab_button, motion_grab_end }; @@ -973,11 +998,8 @@ notify_button(struct wl_input_device *device, (struct wl_shell *) &compositor->shell, &surface->surface, device, time, WLSC_DEVICE_GRAB_RESIZE_BOTTOM_RIGHT); - else if (device->grab == NULL || device->grab == &device->motion_grab) - wl_client_post_event(surface->surface.client, - &device->object, - WL_INPUT_DEVICE_BUTTON, - time, button, state); + + device->grab->interface->button(device->grab, time, button, state); if (!state && device->grab && device->grab_button == button) wl_input_device_end_grab(device, time); @@ -1203,6 +1225,12 @@ drag_grab_motion(struct wl_grab *grab, time, x, y, sx, sy); } +static void +drag_grab_button(struct wl_grab *grab, + uint32_t time, int32_t button, int32_t state) +{ +} + static void drag_grab_end(struct wl_grab *grab, uint32_t time) { @@ -1218,6 +1246,7 @@ drag_grab_end(struct wl_grab *grab, uint32_t time) static const struct wl_grab_interface drag_grab_interface = { drag_grab_motion, + drag_grab_button, drag_grab_end }; diff --git a/wayland/wayland-server.h b/wayland/wayland-server.h index 4e632a20..b911f1b3 100644 --- a/wayland/wayland-server.h +++ b/wayland/wayland-server.h @@ -137,6 +137,8 @@ struct wl_grab; struct wl_grab_interface { void (*motion)(struct wl_grab *grab, uint32_t time, int32_t x, int32_t y); + void (*button)(struct wl_grab *grab, + uint32_t time, int32_t button, int32_t state); void (*end)(struct wl_grab *grab, uint32_t time); };