mirror of
https://codeberg.org/dwl/dwl.git
synced 2024-12-26 11:16:30 +00:00
Make sure toplevel_from_wlr_surface is called with a valid surface pointer
This commit is contained in:
parent
7570dc0a41
commit
c2e7350f2e
1 changed files with 12 additions and 14 deletions
26
dwl.c
26
dwl.c
|
@ -397,7 +397,6 @@ static struct wl_listener lock_listener = {.notify = locksession};
|
|||
|
||||
static struct wlr_seat *seat;
|
||||
static KeyboardGroup *kb_group;
|
||||
static struct wlr_surface *held_grab;
|
||||
static unsigned int cursor_mode;
|
||||
static Client *grabc;
|
||||
static int grabcx, grabcy; /* client-relative */
|
||||
|
@ -603,7 +602,6 @@ buttonpress(struct wl_listener *listener, void *data)
|
|||
switch (event->state) {
|
||||
case WLR_BUTTON_PRESSED:
|
||||
cursor_mode = CurPressed;
|
||||
held_grab = seat->pointer_state.focused_surface;
|
||||
if (locked)
|
||||
break;
|
||||
|
||||
|
@ -623,7 +621,6 @@ buttonpress(struct wl_listener *listener, void *data)
|
|||
}
|
||||
break;
|
||||
case WLR_BUTTON_RELEASED:
|
||||
held_grab = NULL;
|
||||
/* If you released any buttons, we exit interactive move/resize mode. */
|
||||
/* TODO should reset to the pointer focus's current setcursor */
|
||||
if (!locked && cursor_mode != CurNormal && cursor_mode != CurPressed) {
|
||||
|
@ -1757,6 +1754,18 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d
|
|||
struct wlr_surface *surface = NULL;
|
||||
struct wlr_pointer_constraint_v1 *constraint;
|
||||
|
||||
/* Find the client under the pointer and send the event along. */
|
||||
xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy);
|
||||
|
||||
if (cursor_mode == CurPressed && !seat->drag
|
||||
&& surface != seat->pointer_state.focused_surface
|
||||
&& toplevel_from_wlr_surface(seat->pointer_state.focused_surface, &w, &l) >= 0) {
|
||||
c = w;
|
||||
surface = seat->pointer_state.focused_surface;
|
||||
sx = cursor->x - (l ? l->geom.x : w->geom.x);
|
||||
sy = cursor->y - (l ? l->geom.y : w->geom.y);
|
||||
}
|
||||
|
||||
/* time is 0 in internal calls meant to restore pointer focus. */
|
||||
if (time) {
|
||||
wlr_relative_pointer_manager_v1_send_relative_motion(
|
||||
|
@ -1805,17 +1814,6 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d
|
|||
return;
|
||||
}
|
||||
|
||||
/* Find the client under the pointer and send the event along. */
|
||||
xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy);
|
||||
|
||||
if (cursor_mode == CurPressed && !seat->drag && surface != held_grab
|
||||
&& toplevel_from_wlr_surface(held_grab, &w, &l) >= 0) {
|
||||
c = w;
|
||||
surface = held_grab;
|
||||
sx = cursor->x - (l ? l->geom.x : w->geom.x);
|
||||
sy = cursor->y - (l ? l->geom.y : w->geom.y);
|
||||
}
|
||||
|
||||
/* If there's no client surface under the cursor, set the cursor image to a
|
||||
* default. This is what makes the cursor image appear when you move it
|
||||
* off of a client or over its border. */
|
||||
|
|
Loading…
Reference in a new issue