opt: UTILITY type x11 window layer should over top layer

This commit is contained in:
DreamMaoMao 2025-07-08 12:15:31 +08:00
parent cee0d0fd80
commit 38dccbe4b4
2 changed files with 29 additions and 16 deletions

View file

@ -397,6 +397,25 @@ static inline int client_should_ignore_focus(Client *c) {
return 0;
}
static inline int client_should_overtop(Client *c) {
#ifdef XWAYLAND
if (client_is_x11(c)) {
struct wlr_xwayland_surface *surface = c->surface.xwayland;
const uint32_t over_top_types[] = {
WLR_XWAYLAND_NET_WM_WINDOW_TYPE_UTILITY};
for (size_t i = 0;
i < sizeof(over_top_types) / sizeof(over_top_types[0]); ++i) {
if (wlr_xwayland_surface_has_window_type(surface,
over_top_types[i])) {
return 1;
}
}
}
#endif
return 0;
}
static inline int client_wants_focus(Client *c) {
#ifdef XWAYLAND
return client_is_unmanaged(c) &&

View file

@ -138,7 +138,7 @@ enum {
LyrFloat,
LyrTop,
LyrFadeOut,
LyrFS,
LyrFSorOverTop,
LyrOverlay,
LyrIMPopup, // text-input layer
LyrBlock,
@ -386,7 +386,6 @@ struct Monitor {
struct wl_list link;
struct wlr_output *wlr_output;
struct wlr_scene_output *scene_output;
// struct wlr_scene_rect *fullscreen_bg; /* See createmon() for info */
struct wl_listener frame;
struct wl_listener destroy;
struct wl_listener request_state;
@ -881,6 +880,9 @@ void toggleoverlay(const Arg *arg) {
if (selmon->sel->isoverlay) {
wlr_scene_node_reparent(&selmon->sel->scene->node, layers[LyrOverlay]);
wlr_scene_node_raise_to_top(&selmon->sel->scene->node);
} else if (client_should_overtop(selmon->sel) && selmon->sel->isfloating) {
wlr_scene_node_reparent(&selmon->sel->scene->node,
layers[LyrFSorOverTop]);
} else {
wlr_scene_node_reparent(
&selmon->sel->scene->node,
@ -1584,11 +1586,6 @@ arrange(Monitor *m, bool want_animation) {
}
}
// 给全屏窗口设置背景为黑色
// 好像要跟LyrFS图层一起使用我不用这个图层所以注释掉
// wlr_scene_node_set_enabled(&m->fullscreen_bg->node,
// (c = focustop(m)) && c->isfullscreen);
if (m->isoverview) {
overviewlayout.arrange(m);
} else if (m && m->pertag->ltidxs[m->pertag->curtag]->arrange) {
@ -2437,7 +2434,6 @@ void cleanupmon(struct wl_listener *listener, void *data) {
wlr_scene_node_destroy(&m->blur->node);
m->blur = NULL;
}
// wlr_scene_node_destroy(&m->fullscreen_bg->node);
free(m);
}
@ -2994,9 +2990,6 @@ void createmon(struct wl_listener *listener, void *data) {
* visible below the fullscreened surface.
*
*/
/* updatemons() will resize and set correct position */
// m->fullscreen_bg = wlr_scene_rect_create(layers[LyrFS], 0, 0,
// fullscreen_bg); wlr_scene_node_set_enabled(&m->fullscreen_bg->node, 0);
/* Adds this to the output layout in the order it was configured.
*
@ -3914,7 +3907,7 @@ mapnotify(struct wl_listener *listener, void *data) {
/* Handle unmanaged clients first so we can return prior create borders */
if (client_is_unmanaged(c)) {
/* Unmanaged clients always are floating */
wlr_scene_node_reparent(&c->scene->node, layers[LyrFS]);
wlr_scene_node_reparent(&c->scene->node, layers[LyrFSorOverTop]);
wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y);
if (client_wants_focus(c)) {
focusclient(c, 1);
@ -4623,6 +4616,8 @@ setfloating(Client *c, int floating) {
if (c->isoverlay) {
wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]);
} else if (client_should_overtop(c) && c->isfloating) {
wlr_scene_node_reparent(&c->scene->node, layers[LyrFSorOverTop]);
} else {
wlr_scene_node_reparent(&c->scene->node,
layers[c->isfloating ? LyrFloat : LyrTile]);
@ -4750,9 +4745,11 @@ void setfullscreen(Client *c, int fullscreen) // 用自定义全屏代理自带
if (c->isoverlay) {
wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]);
} else if (client_should_overtop(c) && c->isfloating) {
wlr_scene_node_reparent(&c->scene->node, layers[LyrFSorOverTop]);
} else {
wlr_scene_node_reparent(&c->scene->node,
layers[fullscreen ? LyrFS
layers[fullscreen ? LyrFSorOverTop
: c->isfloating ? LyrFloat
: LyrTile]);
}
@ -6222,9 +6219,6 @@ void updatemons(struct wl_listener *listener, void *data) {
*/
wlr_scene_output_set_position(m->scene_output, m->m.x, m->m.y);
// wlr_scene_node_set_position(&m->fullscreen_bg->node, m->m.x, m->m.y);
// wlr_scene_rect_set_size(m->fullscreen_bg, m->m.width, m->m.height);
if (blur && m->blur) {
wlr_scene_node_set_position(&m->blur->node, m->m.x, m->m.y);
wlr_scene_optimized_blur_set_size(m->blur, m->m.width, m->m.height);