From 7e3bb39d4994767edb972fe3039c7dd317fb63b0 Mon Sep 17 00:00:00 2001 From: Vincent Vanlaer Date: Tue, 6 Feb 2018 12:26:54 +0100 Subject: [PATCH 1/6] Always notify seat on button press When the cursor is not over a view, wlr_seat_pointer_notify_button is not called. However, this function does the bookkeeping of the pointer state with regards to the number of pressed buttons. Because this function also sends updates to the focused view, it has been moved down, after the focus has been updated. --- rootston/cursor.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/rootston/cursor.c b/rootston/cursor.c index d8753f44..59996d30 100644 --- a/rootston/cursor.c +++ b/rootston/cursor.c @@ -261,12 +261,6 @@ static void roots_cursor_press_button(struct roots_cursor *cursor, } } - if (view && surface) { - if (!is_touch) { - wlr_seat_pointer_notify_button(seat->seat, time, button, state); - } - } - switch (state) { case WLR_BUTTON_RELEASED: if (!is_touch) { @@ -277,6 +271,10 @@ static void roots_cursor_press_button(struct roots_cursor *cursor, roots_seat_set_focus(seat, view); break; } + + if (!is_touch) { + wlr_seat_pointer_notify_button(seat->seat, time, button, state); + } } void roots_cursor_handle_motion(struct roots_cursor *cursor, From 7ae8800a637f9c4b0bc0ab33e10bc40fc30f91fa Mon Sep 17 00:00:00 2001 From: Vincent Vanlaer Date: Tue, 6 Feb 2018 12:36:38 +0100 Subject: [PATCH 2/6] Cancel rootston move/resize/rotate on escape press --- include/rootston/seat.h | 6 ++++++ rootston/keyboard.c | 3 +++ rootston/seat.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/include/rootston/seat.h b/include/rootston/seat.h index 966d98e5..70e8e867 100644 --- a/include/rootston/seat.h +++ b/include/rootston/seat.h @@ -84,11 +84,17 @@ void roots_seat_cycle_focus(struct roots_seat *seat); void roots_seat_begin_move(struct roots_seat *seat, struct roots_view *view); +void roots_seat_cancel_move(struct roots_seat *seat); + void roots_seat_begin_resize(struct roots_seat *seat, struct roots_view *view, uint32_t edges); +void roots_seat_cancel_resize(struct roots_seat *seat); + void roots_seat_begin_rotate(struct roots_seat *seat, struct roots_view *view); +void roots_seat_cancel_rotate(struct roots_seat *seat); + struct roots_seat_view *roots_seat_view_from_view( struct roots_seat *seat, struct roots_view *view); diff --git a/rootston/keyboard.c b/rootston/keyboard.c index f1123599..c29df46a 100644 --- a/rootston/keyboard.c +++ b/rootston/keyboard.c @@ -159,6 +159,9 @@ static bool keyboard_execute_compositor_binding(struct roots_keyboard *keyboard, if (keysym == XKB_KEY_Escape) { wlr_seat_pointer_end_grab(keyboard->seat->seat); wlr_seat_keyboard_end_grab(keyboard->seat->seat); + roots_seat_cancel_move(keyboard->seat); + roots_seat_cancel_resize(keyboard->seat); + roots_seat_cancel_rotate(keyboard->seat); } return false; diff --git a/rootston/seat.c b/rootston/seat.c index d7353d1e..a97f66ba 100644 --- a/rootston/seat.c +++ b/rootston/seat.c @@ -738,6 +738,18 @@ void roots_seat_begin_move(struct roots_seat *seat, struct roots_view *view) { ROOTS_XCURSOR_MOVE, seat->cursor->cursor); } +void roots_seat_cancel_move(struct roots_seat *seat) { + struct roots_cursor *cursor = seat->cursor; + struct roots_view *view = roots_seat_get_focus(seat); + + if (cursor->mode != ROOTS_CURSOR_MOVE || view == NULL) { + return; + } + + cursor->mode = ROOTS_CURSOR_PASSTHROUGH; + view_move(view, cursor->view_x, cursor->view_y); +} + void roots_seat_begin_resize(struct roots_seat *seat, struct roots_view *view, uint32_t edges) { struct roots_cursor *cursor = seat->cursor; @@ -766,6 +778,18 @@ void roots_seat_begin_resize(struct roots_seat *seat, struct roots_view *view, resize_name, seat->cursor->cursor); } +void roots_seat_cancel_resize(struct roots_seat *seat) { + struct roots_cursor *cursor = seat->cursor; + struct roots_view *view = roots_seat_get_focus(seat); + + if (cursor->mode != ROOTS_CURSOR_RESIZE || view == NULL) { + return; + } + + cursor->mode = ROOTS_CURSOR_PASSTHROUGH; + view_move_resize(view, cursor->view_x, cursor->view_y, cursor->view_width, cursor->view_height); +} + void roots_seat_begin_rotate(struct roots_seat *seat, struct roots_view *view) { struct roots_cursor *cursor = seat->cursor; cursor->mode = ROOTS_CURSOR_ROTATE; @@ -778,3 +802,15 @@ void roots_seat_begin_rotate(struct roots_seat *seat, struct roots_view *view) { wlr_xcursor_manager_set_cursor_image(seat->cursor->xcursor_manager, ROOTS_XCURSOR_ROTATE, seat->cursor->cursor); } + +void roots_seat_cancel_rotate(struct roots_seat *seat) { + struct roots_cursor *cursor = seat->cursor; + struct roots_view *view = roots_seat_get_focus(seat); + + if (cursor->mode != ROOTS_CURSOR_ROTATE || view == NULL) { + return; + } + + cursor->mode = ROOTS_CURSOR_PASSTHROUGH; + view->rotation = cursor->view_rotation; +} From 6567a359034c4a0829711e518fb284c7c5df5d44 Mon Sep 17 00:00:00 2001 From: Vincent Vanlaer Date: Tue, 6 Feb 2018 12:53:51 +0100 Subject: [PATCH 3/6] Update seat pointer on meta move/resize/rotate This will send the button pressed event to the client. This shouldn't be a problem since sebsequent pointer movements are not sent to the client. Thus the client will not for example start selecting text when it is being resized using the compositor keybindigns. --- rootston/cursor.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/rootston/cursor.c b/rootston/cursor.c index 59996d30..0b490989 100644 --- a/rootston/cursor.c +++ b/rootston/cursor.c @@ -244,6 +244,9 @@ static void roots_cursor_press_button(struct roots_cursor *cursor, roots_seat_begin_rotate(seat, view); break; } + if (!is_touch) { + wlr_seat_pointer_notify_button(seat->seat, time, button, state); + } return; } From 147e5c0f8f689d052f77bbcffda8e7da41241109 Mon Sep 17 00:00:00 2001 From: Vincent Vanlaer Date: Tue, 6 Feb 2018 13:15:27 +0100 Subject: [PATCH 4/6] Refactor roots_cursor_press_button Removed the button_count check when resizing/moving/rotating ends, since all buttons presses are now properly tracked. --- rootston/cursor.c | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/rootston/cursor.c b/rootston/cursor.c index 0b490989..87391e29 100644 --- a/rootston/cursor.c +++ b/rootston/cursor.c @@ -244,35 +244,29 @@ static void roots_cursor_press_button(struct roots_cursor *cursor, roots_seat_begin_rotate(seat, view); break; } - if (!is_touch) { - wlr_seat_pointer_notify_button(seat->seat, time, button, state); - } - return; - } + } else { - if (view && !surface) { - if (cursor->pointer_view) { - seat_view_deco_button(cursor->pointer_view, sx, sy, button, state); + if (view && !surface) { + if (cursor->pointer_view) { + seat_view_deco_button(cursor->pointer_view, sx, sy, button, state); + } } - } - if (state == WLR_BUTTON_RELEASED && - cursor->mode != ROOTS_CURSOR_PASSTHROUGH) { - cursor->mode = ROOTS_CURSOR_PASSTHROUGH; - if (seat->seat->pointer_state.button_count == 0) { - return; + if (state == WLR_BUTTON_RELEASED && + cursor->mode != ROOTS_CURSOR_PASSTHROUGH) { + cursor->mode = ROOTS_CURSOR_PASSTHROUGH; } - } - switch (state) { - case WLR_BUTTON_RELEASED: - if (!is_touch) { - roots_cursor_update_position(cursor, time); + switch (state) { + case WLR_BUTTON_RELEASED: + if (!is_touch) { + roots_cursor_update_position(cursor, time); + } + break; + case WLR_BUTTON_PRESSED: + roots_seat_set_focus(seat, view); + break; } - break; - case WLR_BUTTON_PRESSED: - roots_seat_set_focus(seat, view); - break; } if (!is_touch) { From 90eb50d9aabe7665ae081c869b2986c691150b56 Mon Sep 17 00:00:00 2001 From: Vincent Vanlaer Date: Tue, 6 Feb 2018 22:55:56 +0100 Subject: [PATCH 5/6] Merge roots_seat_cancel_* into one function --- include/rootston/seat.h | 6 +----- rootston/keyboard.c | 4 +--- rootston/seat.c | 43 +++++++++++++++-------------------------- 3 files changed, 18 insertions(+), 35 deletions(-) diff --git a/include/rootston/seat.h b/include/rootston/seat.h index 70e8e867..0eb3bee8 100644 --- a/include/rootston/seat.h +++ b/include/rootston/seat.h @@ -84,16 +84,12 @@ void roots_seat_cycle_focus(struct roots_seat *seat); void roots_seat_begin_move(struct roots_seat *seat, struct roots_view *view); -void roots_seat_cancel_move(struct roots_seat *seat); - void roots_seat_begin_resize(struct roots_seat *seat, struct roots_view *view, uint32_t edges); -void roots_seat_cancel_resize(struct roots_seat *seat); - void roots_seat_begin_rotate(struct roots_seat *seat, struct roots_view *view); -void roots_seat_cancel_rotate(struct roots_seat *seat); +void roots_seat_cancel_transform(struct roots_seat *seat); struct roots_seat_view *roots_seat_view_from_view( struct roots_seat *seat, struct roots_view *view); diff --git a/rootston/keyboard.c b/rootston/keyboard.c index c29df46a..e399ac96 100644 --- a/rootston/keyboard.c +++ b/rootston/keyboard.c @@ -159,9 +159,7 @@ static bool keyboard_execute_compositor_binding(struct roots_keyboard *keyboard, if (keysym == XKB_KEY_Escape) { wlr_seat_pointer_end_grab(keyboard->seat->seat); wlr_seat_keyboard_end_grab(keyboard->seat->seat); - roots_seat_cancel_move(keyboard->seat); - roots_seat_cancel_resize(keyboard->seat); - roots_seat_cancel_rotate(keyboard->seat); + roots_seat_cancel_transform(keyboard->seat); } return false; diff --git a/rootston/seat.c b/rootston/seat.c index a97f66ba..559a8b7f 100644 --- a/rootston/seat.c +++ b/rootston/seat.c @@ -738,18 +738,6 @@ void roots_seat_begin_move(struct roots_seat *seat, struct roots_view *view) { ROOTS_XCURSOR_MOVE, seat->cursor->cursor); } -void roots_seat_cancel_move(struct roots_seat *seat) { - struct roots_cursor *cursor = seat->cursor; - struct roots_view *view = roots_seat_get_focus(seat); - - if (cursor->mode != ROOTS_CURSOR_MOVE || view == NULL) { - return; - } - - cursor->mode = ROOTS_CURSOR_PASSTHROUGH; - view_move(view, cursor->view_x, cursor->view_y); -} - void roots_seat_begin_resize(struct roots_seat *seat, struct roots_view *view, uint32_t edges) { struct roots_cursor *cursor = seat->cursor; @@ -778,18 +766,6 @@ void roots_seat_begin_resize(struct roots_seat *seat, struct roots_view *view, resize_name, seat->cursor->cursor); } -void roots_seat_cancel_resize(struct roots_seat *seat) { - struct roots_cursor *cursor = seat->cursor; - struct roots_view *view = roots_seat_get_focus(seat); - - if (cursor->mode != ROOTS_CURSOR_RESIZE || view == NULL) { - return; - } - - cursor->mode = ROOTS_CURSOR_PASSTHROUGH; - view_move_resize(view, cursor->view_x, cursor->view_y, cursor->view_width, cursor->view_height); -} - void roots_seat_begin_rotate(struct roots_seat *seat, struct roots_view *view) { struct roots_cursor *cursor = seat->cursor; cursor->mode = ROOTS_CURSOR_ROTATE; @@ -803,14 +779,27 @@ void roots_seat_begin_rotate(struct roots_seat *seat, struct roots_view *view) { ROOTS_XCURSOR_ROTATE, seat->cursor->cursor); } -void roots_seat_cancel_rotate(struct roots_seat *seat) { +void roots_seat_cancel_transform(struct roots_seat *seat) { struct roots_cursor *cursor = seat->cursor; struct roots_view *view = roots_seat_get_focus(seat); - if (cursor->mode != ROOTS_CURSOR_ROTATE || view == NULL) { + if (view == NULL) { return; } + switch(cursor->mode) { + case ROOTS_CURSOR_MOVE: + view_move(view, cursor->view_x, cursor->view_y); + break; + case ROOTS_CURSOR_RESIZE: + view_move_resize(view, cursor->view_x, cursor->view_y, cursor->view_width, cursor->view_height); + break; + case ROOTS_CURSOR_ROTATE: + view->rotation = cursor->view_rotation; + break; + case ROOTS_CURSOR_PASSTHROUGH: + break; + } + cursor->mode = ROOTS_CURSOR_PASSTHROUGH; - view->rotation = cursor->view_rotation; } From 74264d4f6243fc8ff87e66faf1940d3dd9d5b501 Mon Sep 17 00:00:00 2001 From: Vincent Vanlaer Date: Thu, 8 Feb 2018 13:13:33 +0100 Subject: [PATCH 6/6] Rename roots_seat_cancel_transform --- include/rootston/seat.h | 2 +- rootston/keyboard.c | 2 +- rootston/seat.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/rootston/seat.h b/include/rootston/seat.h index 0eb3bee8..2be8e467 100644 --- a/include/rootston/seat.h +++ b/include/rootston/seat.h @@ -89,7 +89,7 @@ void roots_seat_begin_resize(struct roots_seat *seat, struct roots_view *view, void roots_seat_begin_rotate(struct roots_seat *seat, struct roots_view *view); -void roots_seat_cancel_transform(struct roots_seat *seat); +void roots_seat_end_compositor_grab(struct roots_seat *seat); struct roots_seat_view *roots_seat_view_from_view( struct roots_seat *seat, struct roots_view *view); diff --git a/rootston/keyboard.c b/rootston/keyboard.c index e399ac96..ddf541b4 100644 --- a/rootston/keyboard.c +++ b/rootston/keyboard.c @@ -159,7 +159,7 @@ static bool keyboard_execute_compositor_binding(struct roots_keyboard *keyboard, if (keysym == XKB_KEY_Escape) { wlr_seat_pointer_end_grab(keyboard->seat->seat); wlr_seat_keyboard_end_grab(keyboard->seat->seat); - roots_seat_cancel_transform(keyboard->seat); + roots_seat_end_compositor_grab(keyboard->seat); } return false; diff --git a/rootston/seat.c b/rootston/seat.c index 559a8b7f..edb98095 100644 --- a/rootston/seat.c +++ b/rootston/seat.c @@ -779,7 +779,7 @@ void roots_seat_begin_rotate(struct roots_seat *seat, struct roots_view *view) { ROOTS_XCURSOR_ROTATE, seat->cursor->cursor); } -void roots_seat_cancel_transform(struct roots_seat *seat) { +void roots_seat_end_compositor_grab(struct roots_seat *seat) { struct roots_cursor *cursor = seat->cursor; struct roots_view *view = roots_seat_get_focus(seat);