diff --git a/Assets/Translations/de.json b/Assets/Translations/de.json index af524a04..b00899ed 100644 --- a/Assets/Translations/de.json +++ b/Assets/Translations/de.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "Wenn aktiviert, können sich Panels auf jedem Bildschirm öffnen. Wenn deaktiviert, öffnen sich Panels nur auf Bildschirmen mit einer Leiste, was den Speicherverbrauch reduzieren kann.", + "label": "Paneele auf Bildschirmen ohne Leiste zulassen" + }, "animation-disable": { "description": "Deaktivieren Sie alle Animationen für eine schnellere und reaktionsfreudigere Erfahrung.", "label": "UI-Animationen deaktivieren" diff --git a/Assets/Translations/en.json b/Assets/Translations/en.json index 5492048a..73aff4b3 100644 --- a/Assets/Translations/en.json +++ b/Assets/Translations/en.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "When enabled, panels can open on any screen. When disabled, panels will only open on screens that have a bar, which can reduce memory usage.", + "label": "Allow panels on screens without a bar" + }, "animation-disable": { "description": "Disable all animations for a faster, more responsive experience.", "label": "Disable UI Animations" diff --git a/Assets/Translations/es.json b/Assets/Translations/es.json index b9778975..52e038be 100644 --- a/Assets/Translations/es.json +++ b/Assets/Translations/es.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "Cuando está activado, los paneles se pueden abrir en cualquier pantalla. Cuando está desactivado, los paneles solo se abrirán en las pantallas que tengan una barra, lo que puede reducir el uso de memoria.", + "label": "Permitir paneles en pantallas sin barra." + }, "animation-disable": { "description": "Desactiva todas las animaciones para una experiencia más rápida y con mayor capacidad de respuesta.", "label": "Desactivar animaciones de la interfaz de usuario" diff --git a/Assets/Translations/fr.json b/Assets/Translations/fr.json index 4e952a2e..029a10b4 100644 --- a/Assets/Translations/fr.json +++ b/Assets/Translations/fr.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "Quand cette option est activée, les panneaux peuvent s'ouvrir sur n'importe quel écran. Quand elle est désactivée, les panneaux s'ouvriront uniquement sur les écrans qui ont une barre, ce qui peut réduire l'utilisation de la mémoire.", + "label": "Autoriser les panneaux sur les écrans sans barre." + }, "animation-disable": { "description": "Désactiver toutes les animations pour une expérience plus rapide et plus réactive.", "label": "Désactiver les animations de l'interface utilisateur" diff --git a/Assets/Translations/nl.json b/Assets/Translations/nl.json index 439bb77b..4d6dd535 100644 --- a/Assets/Translations/nl.json +++ b/Assets/Translations/nl.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "Indien ingeschakeld, kunnen panelen op elk scherm worden geopend. Indien uitgeschakeld, worden panelen alleen geopend op schermen met een balk, wat het geheugengebruik kan verminderen.", + "label": "Sta panelen toe op schermen zonder balk." + }, "animation-disable": { "description": "Schakel alle animaties uit voor een snellere, responsievere ervaring.", "label": "UI-animaties uitschakelen" diff --git a/Assets/Translations/pt.json b/Assets/Translations/pt.json index 82e67caa..38d6bb80 100644 --- a/Assets/Translations/pt.json +++ b/Assets/Translations/pt.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "Quando ativado, os painéis podem abrir em qualquer tela. Quando desativado, os painéis só abrirão em telas que tenham uma barra, o que pode reduzir o uso de memória.", + "label": "Permitir painéis em telas sem uma barra." + }, "animation-disable": { "description": "Desative todas as animações para uma experiência mais rápida e responsiva.", "label": "Desativar animações da interface do usuário" diff --git a/Assets/Translations/ru.json b/Assets/Translations/ru.json index 0c977e8e..4183de51 100644 --- a/Assets/Translations/ru.json +++ b/Assets/Translations/ru.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "Когда включено, панели могут открываться на любом экране. Когда выключено, панели будут открываться только на экранах с панелью, что может снизить использование памяти.", + "label": "Разрешить панели на экранах без панели задач." + }, "animation-disable": { "description": "Отключить все анимации для более быстрого и отзывчивого взаимодействия.", "label": "Отключить анимации интерфейса" diff --git a/Assets/Translations/tr.json b/Assets/Translations/tr.json index e24cd08b..0a5df3b4 100644 --- a/Assets/Translations/tr.json +++ b/Assets/Translations/tr.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "Etkinleştirildiğinde, paneller herhangi bir ekranda açılabilir. Devre dışı bırakıldığında, paneller yalnızca bir çubuğu olan ekranlarda açılır, bu da bellek kullanımını azaltabilir.", + "label": "Çubuksuz ekranlardaki panellere izin ver." + }, "animation-disable": { "description": "Daha hızlı ve daha duyarlı bir deneyim için tüm animasyonları devre dışı bırakın.", "label": "UI Animasyonlarını Devre Dışı Bırak" diff --git a/Assets/Translations/uk-UA.json b/Assets/Translations/uk-UA.json index d7220b6e..cfbd3090 100644 --- a/Assets/Translations/uk-UA.json +++ b/Assets/Translations/uk-UA.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "Якщо ввімкнено, панелі можуть відкриватися на будь-якому екрані. Якщо вимкнено, панелі відкриватимуться лише на екранах, де є панель завдань, що може зменшити використання пам'яті.", + "label": "Дозволити панелі на екранах без панелі завдань." + }, "animation-disable": { "description": "Вимкнути всі анімації для швидшого, більш відгукового досвіду.", "label": "Вимкнути анімації інтерфейсу" diff --git a/Assets/Translations/zh-CN.json b/Assets/Translations/zh-CN.json index 631846a2..5e904935 100644 --- a/Assets/Translations/zh-CN.json +++ b/Assets/Translations/zh-CN.json @@ -1653,6 +1653,10 @@ } }, "user-interface": { + "allow-panels-without-bar": { + "description": "启用后,面板可以在任何屏幕上打开。禁用后,面板将仅在有栏的屏幕上打开,这可以减少内存使用。", + "label": "允许在没有栏的屏幕上显示面板" + }, "animation-disable": { "description": "禁用所有动画以获得更快、更流畅的体验。", "label": "禁用 UI 动画" diff --git a/Assets/settings-default.json b/Assets/settings-default.json index 7d56d3a8..01b1188a 100644 --- a/Assets/settings-default.json +++ b/Assets/settings-default.json @@ -73,7 +73,8 @@ "shadowDirection": "bottom_right", "shadowOffsetX": 2, "shadowOffsetY": 3, - "language": "" + "language": "", + "allowPanelsOnScreenWithoutBar": true }, "ui": { "fontDefault": "Roboto", diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 4d22d191..0607b16a 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -219,6 +219,7 @@ Singleton { property int shadowOffsetX: 2 property int shadowOffsetY: 3 property string language: "" + property bool allowPanelsOnScreenWithoutBar: true } // ui diff --git a/Modules/MainScreen/AllScreens.qml b/Modules/MainScreen/AllScreens.qml index 79789b44..fb2fbf98 100644 --- a/Modules/MainScreen/AllScreens.qml +++ b/Modules/MainScreen/AllScreens.qml @@ -18,12 +18,23 @@ Variants { if (!modelData || !modelData.name) { return false; } - Logger.d("Shell", "MainScreen activated for", modelData?.name); - return true; + + let shouldLoad = true; + if (!Settings.data.general.allowPanelsOnScreenWithoutBar) { + // Check if bar is configured for this screen + var monitors = Settings.data.bar.monitors || []; + shouldLoad = monitors.length === 0 || monitors.includes(modelData?.name); + } + + if (shouldLoad) { + Logger.d("AllScreens", "Screen activated: ", modelData?.name); + } + return shouldLoad; } property bool windowLoaded: false + // Main Screen loader - Bar and panels backgrounds Loader { id: windowLoader active: parent.shouldBeActive @@ -58,7 +69,7 @@ Variants { } onLoaded: { - Logger.d("Shell", "BarContentWindow created for", modelData?.name); + Logger.d("AllScreens", "BarContentWindow created for", modelData?.name); } } @@ -80,14 +91,21 @@ Variants { } onLoaded: { - Logger.d("Shell", "BarExclusionZone created for", modelData?.name); + Logger.d("AllScreens", "BarExclusionZone created for", modelData?.name); } } // TrayMenuWindow - separate window for tray context menus - // This must be a top-level PanelWindow. + // Disabled when bar is hidden or not configured for this screen Loader { - active: parent.windowLoaded && parent.shouldBeActive + active: { + if (!parent.windowLoaded || !parent.shouldBeActive || !BarService.isVisible) + return false; + + // Check if bar is configured for this screen + var monitors = Settings.data.bar.monitors || []; + return monitors.length === 0 || monitors.includes(modelData?.name); + } asynchronous: false sourceComponent: TrayMenuWindow { @@ -95,7 +113,7 @@ Variants { } onLoaded: { - Logger.d("Shell", "TrayMenuWindow created for", modelData?.name); + Logger.d("AllScreens", "TrayMenuWindow created for", modelData?.name); } } } diff --git a/Modules/MainScreen/SmartPanelWindow.qml b/Modules/MainScreen/SmartPanelWindow.qml index 045c9b82..09a6764d 100644 --- a/Modules/MainScreen/SmartPanelWindow.qml +++ b/Modules/MainScreen/SmartPanelWindow.qml @@ -55,6 +55,7 @@ PanelWindow { color: Color.transparent mask: null // No mask - content window is rectangular visible: isPanelOpen + screen: placeholder.screen // Explicitly set screen to match placeholder // Wayland layer shell configuration - fullscreen window WlrLayershell.layer: WlrLayer.Top diff --git a/Modules/Panels/Settings/Tabs/UserInterfaceTab.qml b/Modules/Panels/Settings/Tabs/UserInterfaceTab.qml index c6438d92..12aa9edc 100644 --- a/Modules/Panels/Settings/Tabs/UserInterfaceTab.qml +++ b/Modules/Panels/Settings/Tabs/UserInterfaceTab.qml @@ -154,13 +154,21 @@ ColumnLayout { } } + NToggle { + visible: (Quickshell.screens.length > 1) + label: I18n.tr("settings.user-interface.allow-panels-without-bar.label") + description: I18n.tr("settings.user-interface.allow-panels-without-bar.description") + checked: Settings.data.ui.allowPanelsOnScreenWithoutBar + onToggled: checked => Settings.data.ui.allowPanelsOnScreenWithoutBar = checked + } + NDivider { Layout.fillWidth: true Layout.topMargin: Style.marginL Layout.bottomMargin: Style.marginL } - // User Interface + // User Interface Scaling ColumnLayout { spacing: Style.marginXXS Layout.fillWidth: true diff --git a/Services/Control/IPCService.qml b/Services/Control/IPCService.qml index ced678fc..a81fbe81 100644 --- a/Services/Control/IPCService.qml +++ b/Services/Control/IPCService.qml @@ -393,6 +393,16 @@ Item { // Execute pending callback if any if (pendingCallback) { + if (!Settings.data.general.allowPanelsOnScreenWithoutBar) { + // If we explicitely disabled panels on screen without bar, check if bar is configured + // for this screen, and fallback to primary screen if necessary + var monitors = Settings.data.bar.monitors || []; + const hasBar = monitors.length === 0 || monitors.includes(detectedScreen?.name); + if (!hasBar) { + detectedScreen = Quickshell.screens[0]; + } + } + Logger.d("IPC", "Executing pending IPC callback on screen:", detectedScreen.name); pendingCallback(detectedScreen); pendingCallback = null;