mirror of
				https://codeberg.org/dwl/dwl-patches.git
				synced 2025-10-31 03:54:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 4951ccc89dac2b557994b2f6c3aacb2398e2d1b1 Mon Sep 17 00:00:00 2001
 | |
| From: Ben Collerson <benc@benc.cc>
 | |
| Date: Thu, 4 Jan 2024 20:30:01 +1000
 | |
| Subject: [PATCH] warpcursor
 | |
| 
 | |
| ---
 | |
|  dwl.c | 27 +++++++++++++++++++++++++++
 | |
|  1 file changed, 27 insertions(+)
 | |
| 
 | |
| diff --git a/dwl.c b/dwl.c
 | |
| index 145fd018..f7ad6c13 100644
 | |
| --- a/dwl.c
 | |
| +++ b/dwl.c
 | |
| @@ -347,6 +347,7 @@ static void urgent(struct wl_listener *listener, void *data);
 | |
|  static void view(const Arg *arg);
 | |
|  static void virtualkeyboard(struct wl_listener *listener, void *data);
 | |
|  static void virtualpointer(struct wl_listener *listener, void *data);
 | |
| +static void warpcursor(const Client *c);
 | |
|  static Monitor *xytomon(double x, double y);
 | |
|  static void xytonode(double x, double y, struct wlr_surface **psurface,
 | |
|  		Client **pc, LayerSurface **pl, double *nx, double *ny);
 | |
| @@ -514,6 +515,7 @@ arrange(Monitor *m)
 | |
|  		m->lt[m->sellt]->arrange(m);
 | |
|  	motionnotify(0, NULL, 0, 0, 0, 0);
 | |
|  	checkidleinhibitor(NULL);
 | |
| +	warpcursor(focustop(selmon));
 | |
|  }
 | |
|  
 | |
|  void
 | |
| @@ -1323,6 +1325,10 @@ focusclient(Client *c, int lift)
 | |
|  	if (locked)
 | |
|  		return;
 | |
|  
 | |
| +	/* Warp cursor to center of client if it is outside */
 | |
| +	if (lift)
 | |
| +		warpcursor(c);
 | |
| +
 | |
|  	/* Raise client in stacking order if requested */
 | |
|  	if (c && lift)
 | |
|  		wlr_scene_node_raise_to_top(&c->scene->node);
 | |
| @@ -2927,6 +2933,27 @@ virtualpointer(struct wl_listener *listener, void *data)
 | |
|  		wlr_cursor_map_input_to_output(cursor, &pointer.base, event->suggested_output);
 | |
|  }
 | |
|  
 | |
| +void
 | |
| +warpcursor(const Client *c) {
 | |
| +	if (cursor_mode != CurNormal) {
 | |
| +		return;
 | |
| +	}
 | |
| +	if (!c && selmon) {
 | |
| +		wlr_cursor_warp_closest(cursor,
 | |
| +			  NULL,
 | |
| +			  selmon->w.x + selmon->w.width / 2.0 ,
 | |
| +			  selmon->w.y + selmon->w.height / 2.0);
 | |
| +	}
 | |
| +	else if ( c && (cursor->x < c->geom.x ||
 | |
| +		cursor->x > c->geom.x + c->geom.width ||
 | |
| +		cursor->y < c->geom.y ||
 | |
| +		cursor->y > c->geom.y + c->geom.height))
 | |
| +		wlr_cursor_warp_closest(cursor,
 | |
| +			  NULL,
 | |
| +			  c->geom.x + c->geom.width / 2.0,
 | |
| +			  c->geom.y + c->geom.height / 2.0);
 | |
| +}
 | |
| +
 | |
|  Monitor *
 | |
|  xytomon(double x, double y)
 | |
|  {
 | |
| -- 
 | |
| 2.45.2
 | |
| 
 | 
