mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	xdg-popup: render above always-on-top
This commit is contained in:
		
							parent
							
								
									f2c3f83041
								
							
						
					
					
						commit
						78aec7945c
					
				
					 3 changed files with 42 additions and 2 deletions
				
			
		| 
						 | 
					@ -254,7 +254,14 @@ struct server {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Tree for all non-layer xdg/xwayland-shell surfaces */
 | 
						/* Tree for all non-layer xdg/xwayland-shell surfaces */
 | 
				
			||||||
	struct wlr_scene_tree *view_tree;
 | 
						struct wlr_scene_tree *view_tree;
 | 
				
			||||||
	/* Tree for all non-layer xdg/xwayland-shell surfaces with always-on-top */
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Popups need to be rendered above always-on-top views, so we reparent
 | 
				
			||||||
 | 
						 * them to this dedicated tree
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						struct wlr_scene_tree *xdg_popup_tree;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Tree for all non-layer xdg/xwayland-shell surfaces with always-on-top/below */
 | 
				
			||||||
	struct wlr_scene_tree *view_tree_always_on_top;
 | 
						struct wlr_scene_tree *view_tree_always_on_top;
 | 
				
			||||||
#if HAVE_XWAYLAND
 | 
					#if HAVE_XWAYLAND
 | 
				
			||||||
	/* Tree for unmanaged xsurfaces without initialized view (usually popups) */
 | 
						/* Tree for unmanaged xsurfaces without initialized view (usually popups) */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										23
									
								
								src/server.c
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								src/server.c
									
										
									
									
									
								
							| 
						 | 
					@ -285,8 +285,31 @@ server_init(struct server *server)
 | 
				
			||||||
		wlr_log(WLR_ERROR, "unable to create scene");
 | 
							wlr_log(WLR_ERROR, "unable to create scene");
 | 
				
			||||||
		exit(EXIT_FAILURE);
 | 
							exit(EXIT_FAILURE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * The order in which the scene-trees below are created determines the
 | 
				
			||||||
 | 
						 * z-order for nodes which cover the whole work-area.  For per-output
 | 
				
			||||||
 | 
						 * scene-trees, see new_output_notify() in src/output.c
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * | Type              | Scene Tree       | Per Output | Example
 | 
				
			||||||
 | 
						 * | ----------------- | ---------------- | ---------- | -------
 | 
				
			||||||
 | 
						 * | ext-session       | lock-screen      | Yes        | swaylock
 | 
				
			||||||
 | 
						 * | layer-shell       | layer-popups     | Yes        |
 | 
				
			||||||
 | 
						 * | layer-shell       | overlay-layer    | Yes        |
 | 
				
			||||||
 | 
						 * | layer-shell       | top-layer        | Yes        | waybar
 | 
				
			||||||
 | 
						 * | server            | labwc-menus      | No         |
 | 
				
			||||||
 | 
						 * | xwayland-OR       | unmanaged        | No         | dmenu
 | 
				
			||||||
 | 
						 * | xdg-popups        | xdg-popups       | No         |
 | 
				
			||||||
 | 
						 * | toplevels windows | always-on-top    | No         |
 | 
				
			||||||
 | 
						 * | toplevels windows | normal           | No         | firefox
 | 
				
			||||||
 | 
						 * | toplevels windows | always-on-bottom | No         | pcmanfm-qt --desktop
 | 
				
			||||||
 | 
						 * | layer-shell       | bottom-layer     | Yes        | waybar
 | 
				
			||||||
 | 
						 * | layer-shell       | background-layer | Yes        | swaybg
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	server->view_tree = wlr_scene_tree_create(&server->scene->tree);
 | 
						server->view_tree = wlr_scene_tree_create(&server->scene->tree);
 | 
				
			||||||
	server->view_tree_always_on_top = wlr_scene_tree_create(&server->scene->tree);
 | 
						server->view_tree_always_on_top = wlr_scene_tree_create(&server->scene->tree);
 | 
				
			||||||
 | 
						server->xdg_popup_tree = wlr_scene_tree_create(&server->scene->tree);
 | 
				
			||||||
#if HAVE_XWAYLAND
 | 
					#if HAVE_XWAYLAND
 | 
				
			||||||
	server->unmanaged_tree = wlr_scene_tree_create(&server->scene->tree);
 | 
						server->unmanaged_tree = wlr_scene_tree_create(&server->scene->tree);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,8 +85,18 @@ xdg_popup_create(struct view *view, struct wlr_xdg_popup *wlr_popup)
 | 
				
			||||||
	 * provide the proper parent scene node of the xdg popup. To enable
 | 
						 * provide the proper parent scene node of the xdg popup. To enable
 | 
				
			||||||
	 * this, we always set the user data field of xdg_surfaces to the
 | 
						 * this, we always set the user data field of xdg_surfaces to the
 | 
				
			||||||
	 * corresponding scene node.
 | 
						 * corresponding scene node.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * xdg-popups live in server->xdg_popup_tree so that they can be
 | 
				
			||||||
 | 
						 * rendered above always-on-top windows
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	struct wlr_scene_tree *parent_tree = parent->surface->data;
 | 
						struct wlr_scene_tree *parent_tree = NULL;
 | 
				
			||||||
 | 
						if (parent->role == WLR_XDG_SURFACE_ROLE_POPUP) {
 | 
				
			||||||
 | 
							parent_tree = parent->surface->data;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							parent_tree = view->server->xdg_popup_tree;
 | 
				
			||||||
 | 
							wlr_scene_node_set_position(&view->server->xdg_popup_tree->node,
 | 
				
			||||||
 | 
								view->current.x, view->current.y);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	wlr_popup->base->surface->data =
 | 
						wlr_popup->base->surface->data =
 | 
				
			||||||
		wlr_scene_xdg_surface_create(parent_tree, wlr_popup->base);
 | 
							wlr_scene_xdg_surface_create(parent_tree, wlr_popup->base);
 | 
				
			||||||
	node_descriptor_create(wlr_popup->base->surface->data,
 | 
						node_descriptor_create(wlr_popup->base->surface->data,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue