mirror of
				https://codeberg.org/dwl/dwl.git
				synced 2025-11-03 09:01:45 -05:00 
			
		
		
		
	properly handle cursor motion when button is held
Based on: https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/3653
This commit is contained in:
		
							parent
							
								
									b5776e5180
								
							
						
					
					
						commit
						b8bc54b65d
					
				
					 1 changed files with 12 additions and 2 deletions
				
			
		
							
								
								
									
										14
									
								
								dwl.c
									
										
									
									
									
								
							
							
						
						
									
										14
									
								
								dwl.c
									
										
									
									
									
								
							| 
						 | 
					@ -66,7 +66,7 @@
 | 
				
			||||||
#define LISTEN(E, L, H)         wl_signal_add((E), ((L)->notify = (H), (L)))
 | 
					#define LISTEN(E, L, H)         wl_signal_add((E), ((L)->notify = (H), (L)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* enums */
 | 
					/* enums */
 | 
				
			||||||
enum { CurNormal, CurMove, CurResize }; /* cursor */
 | 
					enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */
 | 
				
			||||||
enum { XDGShell, LayerShell, X11Managed, X11Unmanaged }; /* client types */
 | 
					enum { XDGShell, LayerShell, X11Managed, X11Unmanaged }; /* client types */
 | 
				
			||||||
enum { LyrBg, LyrBottom, LyrTop, LyrOverlay, LyrTile, LyrFloat, LyrNoFocus, NUM_LAYERS }; /* scene layers */
 | 
					enum { LyrBg, LyrBottom, LyrTop, LyrOverlay, LyrTile, LyrFloat, LyrNoFocus, NUM_LAYERS }; /* scene layers */
 | 
				
			||||||
#ifdef XWAYLAND
 | 
					#ifdef XWAYLAND
 | 
				
			||||||
| 
						 | 
					@ -672,10 +672,11 @@ buttonpress(struct wl_listener *listener, void *data)
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							cursor_mode = CurPressed;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case WLR_BUTTON_RELEASED:
 | 
						case WLR_BUTTON_RELEASED:
 | 
				
			||||||
		/* If you released any buttons, we exit interactive move/resize mode. */
 | 
							/* If you released any buttons, we exit interactive move/resize mode. */
 | 
				
			||||||
		if (cursor_mode != CurNormal) {
 | 
							if (cursor_mode != CurNormal && cursor_mode != CurPressed) {
 | 
				
			||||||
			cursor_mode = CurNormal;
 | 
								cursor_mode = CurNormal;
 | 
				
			||||||
			/* Clear the pointer focus, this way if the cursor is over a surface
 | 
								/* Clear the pointer focus, this way if the cursor is over a surface
 | 
				
			||||||
			 * we will send an enter event after which the client will provide us
 | 
								 * we will send an enter event after which the client will provide us
 | 
				
			||||||
| 
						 | 
					@ -686,6 +687,8 @@ buttonpress(struct wl_listener *listener, void *data)
 | 
				
			||||||
			selmon = xytomon(cursor->x, cursor->y);
 | 
								selmon = xytomon(cursor->x, cursor->y);
 | 
				
			||||||
			setmon(grabc, selmon, 0);
 | 
								setmon(grabc, selmon, 0);
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								cursor_mode = CurNormal;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1532,6 +1535,13 @@ motionnotify(uint32_t time)
 | 
				
			||||||
	/* Find the client under the pointer and send the event along. */
 | 
						/* Find the client under the pointer and send the event along. */
 | 
				
			||||||
	xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy);
 | 
						xytonode(cursor->x, cursor->y, &surface, &c, NULL, &sx, &sy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (cursor_mode == CurPressed) {
 | 
				
			||||||
 | 
							surface = seat->pointer_state.focused_surface;
 | 
				
			||||||
 | 
							c = client_from_wlr_surface(surface);
 | 
				
			||||||
 | 
							sx = c ? cursor->x - c->geom.x : 0;
 | 
				
			||||||
 | 
							sy = c ? cursor->y - c->geom.y : 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* 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…
	
	Add table
		Add a link
		
	
		Reference in a new issue