mirror of
				https://codeberg.org/dwl/dwl.git
				synced 2025-10-31 03:54:15 +00:00 
			
		
		
		
	fix drag icon's surface returned by xytonode
This commit is contained in:
		
							parent
							
								
									c2899bc00b
								
							
						
					
					
						commit
						3e79a9a5d7
					
				
							
								
								
									
										29
									
								
								dwl.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								dwl.c
									
									
									
									
									
								
							| @ -68,7 +68,7 @@ | ||||
| /* enums */ | ||||
| enum { CurNormal, CurMove, CurResize }; /* cursor */ | ||||
| enum { XDGShell, LayerShell, X11Managed, X11Unmanaged }; /* client types */ | ||||
| enum { LyrBg, LyrBottom, LyrTop, LyrOverlay, LyrTile, LyrFloat, NUM_LAYERS }; /* scene layers */ | ||||
| enum { LyrBg, LyrBottom, LyrTop, LyrOverlay, LyrTile, LyrFloat, LyrNoFocus, NUM_LAYERS }; /* scene layers */ | ||||
| #ifdef XWAYLAND | ||||
| enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar, | ||||
| 	NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */ | ||||
| @ -1784,6 +1784,7 @@ setup(void) | ||||
| 	layers[LyrFloat] = &wlr_scene_tree_create(&scene->node)->node; | ||||
| 	layers[LyrTop] = &wlr_scene_tree_create(&scene->node)->node; | ||||
| 	layers[LyrOverlay] = &wlr_scene_tree_create(&scene->node)->node; | ||||
| 	layers[LyrNoFocus] = &wlr_scene_tree_create(&scene->node)->node; | ||||
| 
 | ||||
| 	/* Create a renderer with the default implementation */ | ||||
| 	if (!(drw = wlr_renderer_autocreate(backend))) | ||||
| @ -1953,7 +1954,7 @@ startdrag(struct wl_listener *listener, void *data) | ||||
| 	if (!drag->icon) | ||||
| 		return; | ||||
| 
 | ||||
| 	drag->icon->data = wlr_scene_subsurface_tree_create(layers[LyrTop], drag->icon->surface); | ||||
| 	drag->icon->data = wlr_scene_subsurface_tree_create(layers[LyrNoFocus], drag->icon->surface); | ||||
| 	motionnotify(0); | ||||
| 	wl_signal_add(&drag->icon->events.destroy, &drag_icon_destroy); | ||||
| } | ||||
| @ -2183,17 +2184,23 @@ xytonode(double x, double y, struct wlr_surface **psurface, | ||||
| 	struct wlr_surface *surface = NULL; | ||||
| 	Client *c = NULL; | ||||
| 	LayerSurface *l = NULL; | ||||
| 	int i; | ||||
| 	int focus_order[] = { LyrOverlay, LyrTop, LyrFloat, LyrTile, LyrBottom, LyrBg }; | ||||
| 
 | ||||
| 	if ((node = wlr_scene_node_at(&scene->node, x, y, nx, ny))) { | ||||
| 		if (node->type == WLR_SCENE_NODE_SURFACE) | ||||
| 			surface = wlr_scene_surface_from_node(node)->surface; | ||||
| 		/* Walk the tree to find a node that knows the client */ | ||||
| 		for (pnode = node; pnode && !c; pnode = pnode->parent) | ||||
| 			c = pnode->data; | ||||
| 		if (c && c->type == LayerShell) { | ||||
| 			c = NULL; | ||||
| 			l = pnode->data; | ||||
| 	for (i = 0; i < LENGTH(focus_order); i++) { | ||||
| 		if ((node = wlr_scene_node_at(layers[focus_order[i]], x, y, nx, ny))) { | ||||
| 			if (node->type == WLR_SCENE_NODE_SURFACE) | ||||
| 				surface = wlr_scene_surface_from_node(node)->surface; | ||||
| 			/* Walk the tree to find a node that knows the client */ | ||||
| 			for (pnode = node; pnode && !c; pnode = pnode->parent) | ||||
| 				c = pnode->data; | ||||
| 			if (c && c->type == LayerShell) { | ||||
| 				c = NULL; | ||||
| 				l = pnode->data; | ||||
| 			} | ||||
| 		} | ||||
| 		if (surface) | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	if (psurface) *psurface = surface; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Leonardo Hernández Hernández
						Leonardo Hernández Hernández