Add omnipresent flag for views

This commit is contained in:
Brandon Nason 2023-11-25 17:54:36 -06:00 committed by Johan Malm
parent 6b8c79748a
commit bad8f334ea
6 changed files with 32 additions and 0 deletions

View file

@ -133,6 +133,9 @@ Actions are used in menus and keyboard/mouse bindings.
when defining window-rules for desktop-management tools that do not when defining window-rules for desktop-management tools that do not
support the wlr-layer-shell protocol. support the wlr-layer-shell protocol.
*<action name="ToggleOmnipresent" />*
Toggle omnipresent (visible on all workspaces / sticky) for the focused window.
*<action name="ToggleKeybinds" />* *<action name="ToggleKeybinds" />*
Stop handling keybinds other than ToggleKeybinds itself. Stop handling keybinds other than ToggleKeybinds itself.
This can be used to allow A-Tab and similar keybinds to be delivered This can be used to allow A-Tab and similar keybinds to be delivered

View file

@ -149,6 +149,7 @@ struct view {
bool minimized; bool minimized;
enum view_axis maximized; enum view_axis maximized;
bool fullscreen; bool fullscreen;
bool visible_on_all_workspaces;
enum view_edge tiled; enum view_edge tiled;
bool inhibits_keybinds; bool inhibits_keybinds;
xkb_layout_index_t keyboard_layout; xkb_layout_index_t keyboard_layout;
@ -400,8 +401,10 @@ void view_toggle_decorations(struct view *view);
bool view_is_always_on_top(struct view *view); bool view_is_always_on_top(struct view *view);
bool view_is_always_on_bottom(struct view *view); bool view_is_always_on_bottom(struct view *view);
bool view_is_omnipresent(struct view *view);
void view_toggle_always_on_top(struct view *view); void view_toggle_always_on_top(struct view *view);
void view_toggle_always_on_bottom(struct view *view); void view_toggle_always_on_bottom(struct view *view);
void view_toggle_visible_on_all_workspaces(struct view *view);
bool view_is_tiled(struct view *view); bool view_is_tiled(struct view *view);
bool view_is_floating(struct view *view); bool view_is_floating(struct view *view);

View file

@ -78,6 +78,7 @@ enum action_type {
ACTION_TYPE_TOGGLE_DECORATIONS, ACTION_TYPE_TOGGLE_DECORATIONS,
ACTION_TYPE_TOGGLE_ALWAYS_ON_TOP, ACTION_TYPE_TOGGLE_ALWAYS_ON_TOP,
ACTION_TYPE_TOGGLE_ALWAYS_ON_BOTTOM, ACTION_TYPE_TOGGLE_ALWAYS_ON_BOTTOM,
ACTION_TYPE_TOGGLE_OMNIPRESENT,
ACTION_TYPE_FOCUS, ACTION_TYPE_FOCUS,
ACTION_TYPE_UNFOCUS, ACTION_TYPE_UNFOCUS,
ACTION_TYPE_ICONIFY, ACTION_TYPE_ICONIFY,
@ -120,6 +121,7 @@ const char *action_names[] = {
"ToggleDecorations", "ToggleDecorations",
"ToggleAlwaysOnTop", "ToggleAlwaysOnTop",
"ToggleAlwaysOnBottom", "ToggleAlwaysOnBottom",
"ToggleOmnipresent",
"Focus", "Focus",
"Unfocus", "Unfocus",
"Iconify", "Iconify",
@ -744,6 +746,11 @@ actions_run(struct view *activator, struct server *server,
view_toggle_always_on_bottom(view); view_toggle_always_on_bottom(view);
} }
break; break;
case ACTION_TYPE_TOGGLE_OMNIPRESENT:
if (view) {
view_toggle_visible_on_all_workspaces(view);
}
break;
case ACTION_TYPE_FOCUS: case ACTION_TYPE_FOCUS:
if (view) { if (view) {
desktop_focus_view(view, /*raise*/ false); desktop_focus_view(view, /*raise*/ false);

View file

@ -723,6 +723,8 @@ init_windowmenu(struct server *server)
fill_item("name.action", "ToggleDecorations"); fill_item("name.action", "ToggleDecorations");
current_item = item_create(menu, _("AlwaysOnTop"), false); current_item = item_create(menu, _("AlwaysOnTop"), false);
fill_item("name.action", "ToggleAlwaysOnTop"); fill_item("name.action", "ToggleAlwaysOnTop");
current_item = item_create(menu, _("ToggleOmnipresent"), false);
fill_item("name.action", "ToggleOmnipresent");
/* Workspace sub-menu */ /* Workspace sub-menu */
struct menu *workspace_menu = menu_create(server, "workspaces", ""); struct menu *workspace_menu = menu_create(server, "workspaces", "");

View file

@ -1045,6 +1045,13 @@ view_toggle_always_on_bottom(struct view *view)
} }
} }
void
view_toggle_visible_on_all_workspaces(struct view *view)
{
assert(view);
view->visible_on_all_workspaces = !view->visible_on_all_workspaces;
}
void void
view_move_to_workspace(struct view *view, struct workspace *workspace) view_move_to_workspace(struct view *view, struct workspace *workspace)
{ {

View file

@ -276,6 +276,16 @@ workspaces_switch_to(struct workspace *target, bool update_focus)
wlr_scene_node_set_enabled( wlr_scene_node_set_enabled(
&server->workspace_current->tree->node, false); &server->workspace_current->tree->node, false);
/* Move Omnipresent views to new workspace */
struct view *view;
enum lab_view_criteria criteria =
LAB_VIEW_CRITERIA_CURRENT_WORKSPACE;
for_each_view(view, &server->views, criteria) {
if (view->visible_on_all_workspaces) {
view_move_to_workspace(view, target);
}
}
/* Enable the new workspace */ /* Enable the new workspace */
wlr_scene_node_set_enabled(&target->tree->node, true); wlr_scene_node_set_enabled(&target->tree->node, true);