mirror of
				https://codeberg.org/dwl/dwl.git
				synced 2025-10-31 12:04:16 +00:00 
			
		
		
		
	Make sure toplevel_from_wlr_surface is called with a valid surface pointer
This commit is contained in:
		
							parent
							
								
									21205f2f40
								
							
						
					
					
						commit
						e706b07110
					
				
							
								
								
									
										26
									
								
								dwl.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								dwl.c
									
									
									
									
									
								
							| @ -397,7 +397,6 @@ static struct wl_listener lock_listener = {.notify = locksession}; | |||||||
| 
 | 
 | ||||||
| static struct wlr_seat *seat; | static struct wlr_seat *seat; | ||||||
| static KeyboardGroup *kb_group; | static KeyboardGroup *kb_group; | ||||||
| static struct wlr_surface *held_grab; |  | ||||||
| static unsigned int cursor_mode; | static unsigned int cursor_mode; | ||||||
| static Client *grabc; | static Client *grabc; | ||||||
| static int grabcx, grabcy; /* client-relative */ | static int grabcx, grabcy; /* client-relative */ | ||||||
| @ -603,7 +602,6 @@ buttonpress(struct wl_listener *listener, void *data) | |||||||
| 	switch (event->state) { | 	switch (event->state) { | ||||||
| 	case WLR_BUTTON_PRESSED: | 	case WLR_BUTTON_PRESSED: | ||||||
| 		cursor_mode = CurPressed; | 		cursor_mode = CurPressed; | ||||||
| 		held_grab = seat->pointer_state.focused_surface; |  | ||||||
| 		if (locked) | 		if (locked) | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| @ -623,7 +621,6 @@ buttonpress(struct wl_listener *listener, void *data) | |||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
| 	case WLR_BUTTON_RELEASED: | 	case WLR_BUTTON_RELEASED: | ||||||
| 		held_grab = NULL; |  | ||||||
| 		/* If you released any buttons, we exit interactive move/resize mode. */ | 		/* If you released any buttons, we exit interactive move/resize mode. */ | ||||||
| 		/* TODO should reset to the pointer focus's current setcursor */ | 		/* TODO should reset to the pointer focus's current setcursor */ | ||||||
| 		if (!locked && cursor_mode != CurNormal && cursor_mode != CurPressed) { | 		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_surface *surface = NULL; | ||||||
| 	struct wlr_pointer_constraint_v1 *constraint; | 	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. */ | 	/* time is 0 in internal calls meant to restore pointer focus. */ | ||||||
| 	if (time) { | 	if (time) { | ||||||
| 		wlr_relative_pointer_manager_v1_send_relative_motion( | 		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; | 		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
 | 	/* 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 | 	 * default. This is what makes the cursor image appear when you move it | ||||||
| 	 * off of a client or over its border. */ | 	 * off of a client or over its border. */ | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Forrest Bushstone
						Forrest Bushstone