mirror of
https://github.com/labwc/labwc.git
synced 2025-11-04 13:30:07 -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