tReorder cb_click() to avoid passing events when grabbed - spkp - Stacking wayland compositor
(HTM) git clone git://git.z3bra.org/spkp.git
(DIR) Log
(DIR) Files
(DIR) Refs
---
(DIR) commit 3ecd4672a4ecac4dd091aa8817bf380b66344d2f
(DIR) parent 948970631cb014fc86a1e0433accd01c612b5fc0
(HTM) Author: Willy Goiffon <dev@z3bra.org>
Date: Tue, 10 Nov 2020 12:24:06 +0100
Reorder cb_click() to avoid passing events when grabbed
Diffstat:
M compositor.c | 48 +++++++++++++++++--------------
1 file changed, 27 insertions(+), 21 deletions(-)
---
(DIR) diff --git a/compositor.c b/compositor.c
t@@ -572,6 +572,8 @@ cb_motion_absolute(struct wl_listener *listener, void *data)
* pressed wilst pressing the button, the underlying window (if any!) will
* be moved or resized.
* Any mouse event will be ignored until the button is released.
+ *
+ * TODO: refactor grab mode
*/
void
cb_click(struct wl_listener *listener, void *data)
t@@ -585,41 +587,45 @@ cb_click(struct wl_listener *listener, void *data)
kb = wlr_seat_get_keyboard(server->seat);
ev = data;
+ if (kb->modifiers.depressed & WLR_MODIFIER_LOGO
+ && ev->state == WLR_BUTTON_PRESSED
+ && server->grabmode == NORMAL) {
+
+ switch (ev->button) {
+ case BTN_LEFT:
+ server->grabmode = MOVE;
+ break;
+ case BTN_RIGHT:
+ server->grabmode = RESIZE;
+ break;
+ }
+ }
+
+ /* pass down event when not grabbing a window */
if (server->grabmode == NORMAL)
wlr_seat_pointer_notify_button(server->seat,
ev->time_msec, ev->button, ev->state);
+ /* every release event would reset the grab mode */
if (ev->state == WLR_BUTTON_RELEASED) {
server->grabmode = NORMAL;
return;
}
+ /* don't enter grab mode when there is no window under the pointer */
if (!(w = underneath(server, server->cursor->x, server->cursor->y))) {
wlr_seat_pointer_clear_focus(server->seat);
+ server->grabmode = NORMAL;
return;
}
- if (kb->modifiers.depressed & WLR_MODIFIER_LOGO
- && ev->state == WLR_BUTTON_PRESSED
- && server->grabmode == NORMAL) {
-
- /*
- * Save which window was clicked, and the coordinates
- * of the event on that surface.
- */
- server->grabbed = w;
- server->gx = w->sx;
- server->gy = w->sy;
-
- switch (ev->button) {
- case BTN_LEFT:
- server->grabmode = MOVE;
- break;
- case BTN_RIGHT:
- server->grabmode = RESIZE;
- break;
- }
- }
+ /*
+ * Save which window was clicked, and the coordinates
+ * of the event on that surface.
+ */
+ server->grabbed = w;
+ server->gx = w->sx;
+ server->gy = w->sy;
/* bring window to the front */
wl_list_remove(&w->link);