mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-11-01 22:58:38 -04:00
Allow keyboard and pointer grabs to hook clear_focus()
This is necessary for some grabs, which currently have no way of knowing when the pointer/keyboard focus has left a surface. For example, without this, a drag-and-drop grab can erroneously drop into a window that the cursor is no longer over. This is the plumbing needed to properly fix swaywm/sway#5220. The existing fix, swaywm/sway#5222, relies on every grab's `enter()` hook allowing a `NULL` surface. This is not guaranteed by the API and, in fact, is not the case for the xdg-shell popup grab and results in a crash when the cursor leaves a surface and does not immediately enter another one while a popup is open (#2161). This fix also adds an assertion to wlr_seat_pointer_notify_enter() that ensures it's never called with a `NULL` surface. This will make Sway crash much more until it fixes its usage of the API, so we should land this at the same time as a fix in Sway (which I haven't posted yet).
This commit is contained in:
parent
8bf9f5bb8b
commit
dcae6f1431
6 changed files with 75 additions and 1 deletions
|
|
@ -78,6 +78,7 @@ struct wlr_seat_pointer_grab;
|
|||
struct wlr_pointer_grab_interface {
|
||||
void (*enter)(struct wlr_seat_pointer_grab *grab,
|
||||
struct wlr_surface *surface, double sx, double sy);
|
||||
void (*clear_focus)(struct wlr_seat_pointer_grab *grab);
|
||||
void (*motion)(struct wlr_seat_pointer_grab *grab, uint32_t time_msec,
|
||||
double sx, double sy);
|
||||
uint32_t (*button)(struct wlr_seat_pointer_grab *grab, uint32_t time_msec,
|
||||
|
|
@ -95,6 +96,7 @@ struct wlr_keyboard_grab_interface {
|
|||
void (*enter)(struct wlr_seat_keyboard_grab *grab,
|
||||
struct wlr_surface *surface, uint32_t keycodes[],
|
||||
size_t num_keycodes, struct wlr_keyboard_modifiers *modifiers);
|
||||
void (*clear_focus)(struct wlr_seat_keyboard_grab *grab);
|
||||
void (*key)(struct wlr_seat_keyboard_grab *grab, uint32_t time_msec,
|
||||
uint32_t key, uint32_t state);
|
||||
void (*modifiers)(struct wlr_seat_keyboard_grab *grab,
|
||||
|
|
@ -354,6 +356,8 @@ void wlr_seat_pointer_enter(struct wlr_seat *wlr_seat,
|
|||
|
||||
/**
|
||||
* Clear the focused surface for the pointer and leave all entered surfaces.
|
||||
* This function does not respect pointer grabs: you probably want
|
||||
* `wlr_seat_pointer_notify_clear_focus()` instead.
|
||||
*/
|
||||
void wlr_seat_pointer_clear_focus(struct wlr_seat *wlr_seat);
|
||||
|
||||
|
|
@ -399,6 +403,12 @@ void wlr_seat_pointer_send_frame(struct wlr_seat *wlr_seat);
|
|||
void wlr_seat_pointer_notify_enter(struct wlr_seat *wlr_seat,
|
||||
struct wlr_surface *surface, double sx, double sy);
|
||||
|
||||
/**
|
||||
* Notify the seat of a pointer leave event to the currently-focused surface.
|
||||
* Defers to any grab of the pointer.
|
||||
*/
|
||||
void wlr_seat_pointer_notify_clear_focus(struct wlr_seat *wlr_seat);
|
||||
|
||||
/**
|
||||
* Notify the seat of motion over the given surface. Pass surface-local
|
||||
* coordinates where the pointer motion occurred. Defers to any grab of the
|
||||
|
|
@ -485,6 +495,8 @@ void wlr_seat_keyboard_enter(struct wlr_seat *seat,
|
|||
|
||||
/**
|
||||
* Clear the focused surface for the keyboard and leave all entered surfaces.
|
||||
* This function does not respect keyboard grabs: you probably want
|
||||
* `wlr_seat_keyboard_notify_clear_focus()` instead.
|
||||
*/
|
||||
void wlr_seat_keyboard_clear_focus(struct wlr_seat *wlr_seat);
|
||||
|
||||
|
|
@ -511,6 +523,12 @@ void wlr_seat_keyboard_notify_enter(struct wlr_seat *seat,
|
|||
struct wlr_surface *surface, uint32_t keycodes[], size_t num_keycodes,
|
||||
struct wlr_keyboard_modifiers *modifiers);
|
||||
|
||||
/**
|
||||
* Notify the seat of a keyboard leave event to the currently-focused surface.
|
||||
* Defers to any keyboard grabs.
|
||||
*/
|
||||
void wlr_seat_keyboard_notify_clear_focus(struct wlr_seat *wlr_seat);
|
||||
|
||||
/**
|
||||
* Start a grab of the keyboard of this seat. The grabber is responsible for
|
||||
* handling all keyboard events until the grab ends.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue