Don't pass NULL surfaces to wlr focus functions (#8)

Turns out that this will hit asserts that will abort dwl.
This commit is contained in:
Shugyousha 2020-06-14 11:05:21 +02:00 committed by GitHub
parent df10c475ad
commit 63f09d1f23
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

14
dwl.c
View file

@ -595,9 +595,11 @@ focusclient(Client *c, struct wlr_surface *surface, int lift)
* If the focused surface has changed, tell the seat to have the * If the focused surface has changed, tell the seat to have the
* keyboard enter the new surface. wlroots will keep track of this and * keyboard enter the new surface. wlroots will keep track of this and
* automatically send key events to the appropriate clients. If surface * automatically send key events to the appropriate clients. If surface
* is NULL, this will clear focus. * is NULL, we clear the focus instead.
*/ */
if (surface != psurface) { if (!surface) {
wlr_seat_pointer_notify_clear_focus(seat);
} else if (surface != psurface) {
kb = wlr_seat_get_keyboard(seat); kb = wlr_seat_get_keyboard(seat);
wlr_seat_keyboard_notify_enter(seat, surface, wlr_seat_keyboard_notify_enter(seat, surface,
kb->keycodes, kb->num_keycodes, &kb->modifiers); kb->keycodes, kb->num_keycodes, &kb->modifiers);
@ -897,11 +899,17 @@ pointerfocus(Client *c, struct wlr_surface *surface, double sx, double sy,
wlr_seat_pointer_notify_motion(seat, time, sx, sy); wlr_seat_pointer_notify_motion(seat, time, sx, sy);
return; return;
} }
/* If surface is NULL, clear pointer focus, otherwise let the client /* If surface is NULL, clear pointer focus, otherwise let the client
* know that the mouse cursor has entered one of its surfaces. */ * know that the mouse cursor has entered one of its surfaces. */
if (!surface) {
wlr_seat_pointer_notify_clear_focus(seat);
return;
}
wlr_seat_pointer_notify_enter(seat, surface, sx, sy); wlr_seat_pointer_notify_enter(seat, surface, sx, sy);
/* If keyboard focus follows mouse, enforce that */ /* If keyboard focus follows mouse, enforce that */
if (sloppyfocus && surface) if (sloppyfocus)
focusclient(c, surface, 0); focusclient(c, surface, 0);
} }