#include "view.h"
#include "window-rules.h"
-void
-view_impl_init_foreign_toplevel(struct view *view)
-{
- if (view->foreign_toplevel) {
- return;
- }
-
- view->foreign_toplevel = foreign_toplevel_create(view);
-
- if (view->impl->get_parent) {
- struct view *parent = view->impl->get_parent(view);
- if (parent && parent->foreign_toplevel) {
- foreign_toplevel_set_parent(view->foreign_toplevel,
- parent->foreign_toplevel);
- }
- }
-}
-
void
view_impl_map(struct view *view)
{
}
/*
- * It's tempting to just never create the foreign-toplevel handle in the
- * map handlers, but the app_id/title might not have been set at that
- * point, so it's safer to process the property here
+ * Create foreign-toplevel handle, respecting skipTaskbar rules.
+ * Also exclude unfocusable views (popups, floating toolbars,
+ * etc.) as these should not be shown in taskbars/docks/etc.
*/
- enum property ret = window_rules_get_property(view, "skipTaskbar");
- if (ret == LAB_PROP_TRUE) {
- if (view->foreign_toplevel) {
- foreign_toplevel_destroy(view->foreign_toplevel);
- view->foreign_toplevel = NULL;
+ if (!view->foreign_toplevel && view_is_focusable(view)
+ && window_rules_get_property(view, "skipTaskbar")
+ != LAB_PROP_TRUE) {
+ view->foreign_toplevel = foreign_toplevel_create(view);
+
+ struct view *parent = view->impl->get_parent(view);
+ if (parent && parent->foreign_toplevel) {
+ foreign_toplevel_set_parent(view->foreign_toplevel,
+ parent->foreign_toplevel);
}
}
view->mapped = true;
- if (!view->foreign_toplevel) {
- view_impl_init_foreign_toplevel(view);
- /*
- * Initial outputs will be synced via
- * view->events.new_outputs on view_moved()
- */
- }
-
if (!view->been_mapped) {
if (view_wants_decorations(view)) {
view_set_ssd_mode(view, LAB_SSD_MODE_FULL);
view->content_tree = tree;
}
- /*
- * Exclude unfocusable views from wlr-foreign-toplevel. These
- * views (notifications, floating toolbars, etc.) should not be
- * shown in taskbars/docks/etc.
- */
- if (!view->foreign_toplevel && view_is_focusable(view)) {
- view_impl_init_foreign_toplevel(view);
- /*
- * Initial outputs will be synced via
- * view->events.new_outputs on view_moved()
- */
- }
-
if (!view->been_mapped) {
check_natural_geometry(view);
set_initial_position(view, xwayland_surface);