void view_toggle_maximize(struct view *view);
void view_toggle_decorations(struct view *view);
void view_toggle_always_on_top(struct view *view);
+bool view_is_always_on_top(struct view *view);
void view_move_to_workspace(struct view *view, struct workspace *workspace);
void view_set_decorations(struct view *view, bool decorations);
void view_toggle_fullscreen(struct view *view);
view_set_decorations(view, !view->ssd_enabled);
}
-static bool
-is_always_on_top(struct view *view)
+bool
+view_is_always_on_top(struct view *view)
{
+ assert(view);
return view->scene_tree->node.parent ==
view->server->view_tree_always_on_top;
}
view_toggle_always_on_top(struct view *view)
{
assert(view);
- if (is_always_on_top(view)) {
+ if (view_is_always_on_top(view)) {
view->workspace = view->server->workspace_current;
wlr_scene_node_reparent(&view->scene_tree->node,
view->workspace->tree);
#include "common/list.h"
#include "common/mem.h"
#include "labwc.h"
+#include "view.h"
#include "workspaces.h"
/* Internal helpers */
/* Make sure new views will spawn on the new workspace */
server->workspace_current = target;
- /**
+ /*
* Make sure we are focusing what the user sees.
- *
- * TODO: This is an issue for always-on-top views as they will
- * loose keyboard focus once switching to another workspace.
+ * Only refocus if the focus is not already on an always-on-top view.
*/
- desktop_focus_topmost_mapped_view(target->server);
+ struct view *view = desktop_focused_view(server);
+ if (!view || !view_is_always_on_top(view)) {
+ desktop_focus_topmost_mapped_view(server);
+ }
/* And finally show the OSD */
_osd_show(server);