mirror of
https://github.com/labwc/labwc.git
synced 2026-03-17 05:33:47 -04:00
parent
a3646721bc
commit
4faab834f9
6 changed files with 27 additions and 2 deletions
|
|
@ -1354,6 +1354,13 @@ situation.
|
||||||
*ignoreConfigureRequest* prevents a X11 window to position and size
|
*ignoreConfigureRequest* prevents a X11 window to position and size
|
||||||
itself.
|
itself.
|
||||||
|
|
||||||
|
*<windowRules><windowRule allowAlwaysOnTop="">* [yes|no|default]
|
||||||
|
*allowAlwaysOnTop* allows a X11 window to control its always-on-top
|
||||||
|
state ('above' in X11 terms).
|
||||||
|
|
||||||
|
Note: X11 window always-on-top requests are disallowed by default.
|
||||||
|
This window rule offers a means of allowing it.
|
||||||
|
|
||||||
*<windowRules><windowRule fixedPosition="">* [yes|no|default]
|
*<windowRules><windowRule fixedPosition="">* [yes|no|default]
|
||||||
*fixedPosition* disallows interactive move/resize and prevents
|
*fixedPosition* disallows interactive move/resize and prevents
|
||||||
re-positioning in response to changes in reserved output space, which
|
re-positioning in response to changes in reserved output space, which
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,7 @@ struct window_rule {
|
||||||
enum property ignore_configure_request;
|
enum property ignore_configure_request;
|
||||||
enum property fixed_position;
|
enum property fixed_position;
|
||||||
enum property icon_prefer_client;
|
enum property icon_prefer_client;
|
||||||
|
enum property allow_always_on_top;
|
||||||
|
|
||||||
struct wl_list link; /* struct rcxml.window_rules */
|
struct wl_list link; /* struct rcxml.window_rules */
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -300,6 +300,8 @@ fill_window_rule(xmlNode *node)
|
||||||
set_property(content, &window_rule->ignore_configure_request);
|
set_property(content, &window_rule->ignore_configure_request);
|
||||||
} else if (!strcasecmp(key, "fixedPosition")) {
|
} else if (!strcasecmp(key, "fixedPosition")) {
|
||||||
set_property(content, &window_rule->fixed_position);
|
set_property(content, &window_rule->fixed_position);
|
||||||
|
} else if (!strcasecmp(key, "allowAlwaysOnTop")) {
|
||||||
|
set_property(content, &window_rule->allow_always_on_top);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1543,6 +1543,9 @@ void
|
||||||
view_set_layer(struct view *view, enum view_layer layer)
|
view_set_layer(struct view *view, enum view_layer layer)
|
||||||
{
|
{
|
||||||
assert(view);
|
assert(view);
|
||||||
|
if (view->layer == layer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
view->layer = layer;
|
view->layer = layer;
|
||||||
wlr_scene_node_reparent(&view->scene_tree->node,
|
wlr_scene_node_reparent(&view->scene_tree->node,
|
||||||
view->workspace->view_trees[layer]);
|
view->workspace->view_trees[layer]);
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,10 @@ window_rules_get_property(struct view *view, const char *property)
|
||||||
&& !strcasecmp(property, "iconPreferClient")) {
|
&& !strcasecmp(property, "iconPreferClient")) {
|
||||||
return rule->icon_prefer_client;
|
return rule->icon_prefer_client;
|
||||||
}
|
}
|
||||||
|
if (rule->allow_always_on_top
|
||||||
|
&& !strcasecmp(property, "allowAlwaysOnTop")) {
|
||||||
|
return rule->allow_always_on_top;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return LAB_PROP_UNSPECIFIED;
|
return LAB_PROP_UNSPECIFIED;
|
||||||
|
|
|
||||||
|
|
@ -431,6 +431,11 @@ handle_request_above(struct wl_listener *listener, void *data)
|
||||||
wl_container_of(listener, xwayland_view, request_above);
|
wl_container_of(listener, xwayland_view, request_above);
|
||||||
struct view *view = &xwayland_view->base;
|
struct view *view = &xwayland_view->base;
|
||||||
|
|
||||||
|
if (window_rules_get_property(view, "allowAlwaysOnTop") != LAB_PROP_TRUE) {
|
||||||
|
wlr_log(WLR_INFO, "X11 client side always on top request rejected");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
view_set_layer(view, xwayland_view->xwayland_surface->above
|
view_set_layer(view, xwayland_view->xwayland_surface->above
|
||||||
? VIEW_LAYER_ALWAYS_ON_TOP : VIEW_LAYER_NORMAL);
|
? VIEW_LAYER_ALWAYS_ON_TOP : VIEW_LAYER_NORMAL);
|
||||||
}
|
}
|
||||||
|
|
@ -727,8 +732,11 @@ handle_map_request(struct wl_listener *listener, void *data)
|
||||||
axis |= VIEW_AXIS_VERTICAL;
|
axis |= VIEW_AXIS_VERTICAL;
|
||||||
}
|
}
|
||||||
view_maximize(view, axis);
|
view_maximize(view, axis);
|
||||||
view_set_layer(view, xsurface->above
|
|
||||||
? VIEW_LAYER_ALWAYS_ON_TOP : VIEW_LAYER_NORMAL);
|
if (window_rules_get_property(view, "allowAlwaysOnTop") == LAB_PROP_TRUE) {
|
||||||
|
view_set_layer(view, xsurface->above
|
||||||
|
? VIEW_LAYER_ALWAYS_ON_TOP : VIEW_LAYER_NORMAL);
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* We could also call set_initial_position() here, but it's not
|
* We could also call set_initial_position() here, but it's not
|
||||||
* really necessary until the view is actually mapped (and at
|
* really necessary until the view is actually mapped (and at
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue