mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-05-02 10:32:07 -04:00
Compare commits
2 Commits
frame
...
66ce79b9bf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
66ce79b9bf | ||
|
|
30dd640314 |
@@ -137,7 +137,7 @@ bind = SUPER, bracketright, layoutmsg, preselect r
|
|||||||
|
|
||||||
# === Sizing & Layout ===
|
# === Sizing & Layout ===
|
||||||
bind = SUPER, R, layoutmsg, togglesplit
|
bind = SUPER, R, layoutmsg, togglesplit
|
||||||
bind = SUPER CTRL, F, resizeactive, exact 100%
|
bind = SUPER CTRL, F, resizeactive, exact 100% 100%
|
||||||
|
|
||||||
# === Move/resize windows with mainMod + LMB/RMB and dragging ===
|
# === Move/resize windows with mainMod + LMB/RMB and dragging ===
|
||||||
bindmd = SUPER, mouse:272, Move window, movewindow
|
bindmd = SUPER, mouse:272, Move window, movewindow
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ windowrule = tile on, match:class ^(gnome-control-center)$
|
|||||||
windowrule = tile on, match:class ^(pavucontrol)$
|
windowrule = tile on, match:class ^(pavucontrol)$
|
||||||
windowrule = tile on, match:class ^(nm-connection-editor)$
|
windowrule = tile on, match:class ^(nm-connection-editor)$
|
||||||
|
|
||||||
|
windowrule = float on, match:class ^(org\.gnome\.Calculator)$
|
||||||
windowrule = float on, match:class ^(gnome-calculator)$
|
windowrule = float on, match:class ^(gnome-calculator)$
|
||||||
windowrule = float on, match:class ^(galculator)$
|
windowrule = float on, match:class ^(galculator)$
|
||||||
windowrule = float on, match:class ^(blueman-manager)$
|
windowrule = float on, match:class ^(blueman-manager)$
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import "settings/SettingsStore.js" as Store
|
|||||||
Singleton {
|
Singleton {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
readonly property int settingsConfigVersion: 11
|
readonly property int settingsConfigVersion: 5
|
||||||
|
|
||||||
readonly property bool isGreeterMode: Quickshell.env("DMS_RUN_GREETER") === "1" || Quickshell.env("DMS_RUN_GREETER") === "true"
|
readonly property bool isGreeterMode: Quickshell.env("DMS_RUN_GREETER") === "1" || Quickshell.env("DMS_RUN_GREETER") === "true"
|
||||||
|
|
||||||
@@ -186,7 +186,6 @@ Singleton {
|
|||||||
onPopoutElevationEnabledChanged: saveSettings()
|
onPopoutElevationEnabledChanged: saveSettings()
|
||||||
property bool barElevationEnabled: true
|
property bool barElevationEnabled: true
|
||||||
onBarElevationEnabledChanged: saveSettings()
|
onBarElevationEnabledChanged: saveSettings()
|
||||||
|
|
||||||
property bool blurEnabled: false
|
property bool blurEnabled: false
|
||||||
onBlurEnabledChanged: saveSettings()
|
onBlurEnabledChanged: saveSettings()
|
||||||
property string blurBorderColor: "outline"
|
property string blurBorderColor: "outline"
|
||||||
@@ -199,33 +198,6 @@ Singleton {
|
|||||||
property bool blurredWallpaperLayer: false
|
property bool blurredWallpaperLayer: false
|
||||||
property bool blurWallpaperOnOverview: false
|
property bool blurWallpaperOnOverview: false
|
||||||
|
|
||||||
property bool frameEnabled: false
|
|
||||||
onFrameEnabledChanged: saveSettings()
|
|
||||||
property real frameThickness: 16
|
|
||||||
onFrameThicknessChanged: saveSettings()
|
|
||||||
property real frameRounding: 23
|
|
||||||
onFrameRoundingChanged: saveSettings()
|
|
||||||
property string frameColor: ""
|
|
||||||
onFrameColorChanged: saveSettings()
|
|
||||||
property real frameOpacity: 1.0
|
|
||||||
onFrameOpacityChanged: saveSettings()
|
|
||||||
property var frameScreenPreferences: ["all"]
|
|
||||||
onFrameScreenPreferencesChanged: saveSettings()
|
|
||||||
property real frameBarSize: 40
|
|
||||||
onFrameBarSizeChanged: saveSettings()
|
|
||||||
property bool frameShowOnOverview: false
|
|
||||||
onFrameShowOnOverviewChanged: saveSettings()
|
|
||||||
property bool frameBlurEnabled: true
|
|
||||||
onFrameBlurEnabledChanged: saveSettings()
|
|
||||||
|
|
||||||
readonly property color effectiveFrameColor: {
|
|
||||||
const fc = frameColor;
|
|
||||||
if (!fc || fc === "default") return Theme.surfaceContainer;
|
|
||||||
if (fc === "primary") return Theme.primary;
|
|
||||||
if (fc === "surface") return Theme.surface;
|
|
||||||
return fc;
|
|
||||||
}
|
|
||||||
|
|
||||||
property bool showLauncherButton: true
|
property bool showLauncherButton: true
|
||||||
property bool showWorkspaceSwitcher: true
|
property bool showWorkspaceSwitcher: true
|
||||||
property bool showFocusedWindow: true
|
property bool showFocusedWindow: true
|
||||||
@@ -1966,66 +1938,6 @@ Singleton {
|
|||||||
return filtered;
|
return filtered;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getFrameFilteredScreens() {
|
|
||||||
var prefs = frameScreenPreferences || ["all"];
|
|
||||||
if (!prefs || prefs.length === 0 || prefs.includes("all")) {
|
|
||||||
return Quickshell.screens;
|
|
||||||
}
|
|
||||||
return Quickshell.screens.filter(screen => isScreenInPreferences(screen, prefs));
|
|
||||||
}
|
|
||||||
|
|
||||||
function getActiveBarEdgeForScreen(screen) {
|
|
||||||
if (!screen) return "";
|
|
||||||
for (var i = 0; i < barConfigs.length; i++) {
|
|
||||||
var bc = barConfigs[i];
|
|
||||||
if (!bc.enabled) continue;
|
|
||||||
var prefs = bc.screenPreferences || ["all"];
|
|
||||||
if (!prefs.includes("all") && !isScreenInPreferences(screen, prefs)) continue;
|
|
||||||
switch (bc.position ?? 0) {
|
|
||||||
case SettingsData.Position.Top: return "top";
|
|
||||||
case SettingsData.Position.Bottom: return "bottom";
|
|
||||||
case SettingsData.Position.Left: return "left";
|
|
||||||
case SettingsData.Position.Right: return "right";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function getActiveBarEdgesForScreen(screen) {
|
|
||||||
if (!screen) return [];
|
|
||||||
var edges = [];
|
|
||||||
for (var i = 0; i < barConfigs.length; i++) {
|
|
||||||
var bc = barConfigs[i];
|
|
||||||
if (!bc.enabled) continue;
|
|
||||||
var prefs = bc.screenPreferences || ["all"];
|
|
||||||
if (!prefs.includes("all") && !isScreenInPreferences(screen, prefs)) continue;
|
|
||||||
switch (bc.position ?? 0) {
|
|
||||||
case SettingsData.Position.Top: edges.push("top"); break;
|
|
||||||
case SettingsData.Position.Bottom: edges.push("bottom"); break;
|
|
||||||
case SettingsData.Position.Left: edges.push("left"); break;
|
|
||||||
case SettingsData.Position.Right: edges.push("right"); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return edges;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getActiveBarThicknessForScreen(screen) {
|
|
||||||
if (frameEnabled) return frameBarSize;
|
|
||||||
if (!screen) return frameThickness;
|
|
||||||
for (var i = 0; i < barConfigs.length; i++) {
|
|
||||||
var bc = barConfigs[i];
|
|
||||||
if (!bc.enabled) continue;
|
|
||||||
var prefs = bc.screenPreferences || ["all"];
|
|
||||||
if (!prefs.includes("all") && !isScreenInPreferences(screen, prefs)) continue;
|
|
||||||
const innerPadding = bc.innerPadding ?? 4;
|
|
||||||
const barT = Math.max(26 + innerPadding * 0.6, Theme.barHeight - 4 - (8 - innerPadding));
|
|
||||||
const spacing = bc.spacing ?? 4;
|
|
||||||
const bottomGap = bc.bottomGap ?? 0;
|
|
||||||
return barT + spacing + bottomGap;
|
|
||||||
}
|
|
||||||
return frameThickness;
|
|
||||||
}
|
|
||||||
|
|
||||||
function sendTestNotifications() {
|
function sendTestNotifications() {
|
||||||
NotificationService.dismissAllPopups();
|
NotificationService.dismissAllPopups();
|
||||||
sendTestNotification(0);
|
sendTestNotification(0);
|
||||||
|
|||||||
@@ -547,17 +547,7 @@ var SPEC = {
|
|||||||
clipboardEnterToPaste: { def: false },
|
clipboardEnterToPaste: { def: false },
|
||||||
|
|
||||||
launcherPluginVisibility: { def: {} },
|
launcherPluginVisibility: { def: {} },
|
||||||
launcherPluginOrder: { def: [] },
|
launcherPluginOrder: { def: [] }
|
||||||
|
|
||||||
frameEnabled: { def: false },
|
|
||||||
frameThickness: { def: 16 },
|
|
||||||
frameRounding: { def: 23 },
|
|
||||||
frameColor: { def: "" },
|
|
||||||
frameOpacity: { def: 1.0 },
|
|
||||||
frameScreenPreferences: { def: ["all"] },
|
|
||||||
frameBarSize: { def: 40 },
|
|
||||||
frameShowOnOverview: { def: false },
|
|
||||||
frameBlurEnabled: { def: true }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function getValidKeys() {
|
function getValidKeys() {
|
||||||
|
|||||||
@@ -248,10 +248,6 @@ function migrateToVersion(obj, targetVersion) {
|
|||||||
settings.configVersion = 6;
|
settings.configVersion = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentVersion < 11) {
|
|
||||||
settings.configVersion = 11;
|
|
||||||
}
|
|
||||||
|
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ import qs.Modules.OSD
|
|||||||
import qs.Modules.ProcessList
|
import qs.Modules.ProcessList
|
||||||
import qs.Modules.DankBar
|
import qs.Modules.DankBar
|
||||||
import qs.Modules.DankBar.Popouts
|
import qs.Modules.DankBar.Popouts
|
||||||
import qs.Modules.Frame
|
|
||||||
import qs.Modules.WorkspaceOverlays
|
import qs.Modules.WorkspaceOverlays
|
||||||
import qs.Services
|
import qs.Services
|
||||||
|
|
||||||
@@ -177,8 +176,6 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Frame {}
|
|
||||||
|
|
||||||
Repeater {
|
Repeater {
|
||||||
id: dankBarRepeater
|
id: dankBarRepeater
|
||||||
model: ScriptModel {
|
model: ScriptModel {
|
||||||
|
|||||||
@@ -518,20 +518,5 @@ FocusScope {
|
|||||||
Qt.callLater(() => item.forceActiveFocus());
|
Qt.callLater(() => item.forceActiveFocus());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Loader {
|
|
||||||
id: frameLoader
|
|
||||||
anchors.fill: parent
|
|
||||||
active: root.currentIndex === 33
|
|
||||||
visible: active
|
|
||||||
focus: active
|
|
||||||
|
|
||||||
sourceComponent: FrameTab {}
|
|
||||||
|
|
||||||
onActiveChanged: {
|
|
||||||
if (active && item)
|
|
||||||
Qt.callLater(() => item.forceActiveFocus());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,12 +120,6 @@ Rectangle {
|
|||||||
"text": I18n.tr("Widgets"),
|
"text": I18n.tr("Widgets"),
|
||||||
"icon": "widgets",
|
"icon": "widgets",
|
||||||
"tabIndex": 22
|
"tabIndex": 22
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "frame",
|
|
||||||
"text": I18n.tr("Frame"),
|
|
||||||
"icon": "frame_source",
|
|
||||||
"tabIndex": 33
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ Item {
|
|||||||
required property var axis
|
required property var axis
|
||||||
required property var barConfig
|
required property var barConfig
|
||||||
|
|
||||||
visible: !SettingsData.frameEnabled
|
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
@@ -39,8 +37,6 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
property real rt: {
|
property real rt: {
|
||||||
if (SettingsData.frameEnabled)
|
|
||||||
return SettingsData.frameRounding;
|
|
||||||
if (barConfig?.squareCorners ?? false)
|
if (barConfig?.squareCorners ?? false)
|
||||||
return 0;
|
return 0;
|
||||||
if (barWindow.hasMaximizedToplevel)
|
if (barWindow.hasMaximizedToplevel)
|
||||||
@@ -259,12 +255,11 @@ Item {
|
|||||||
h = h - wing;
|
h = h - wing;
|
||||||
const r = wing;
|
const r = wing;
|
||||||
const cr = rt;
|
const cr = rt;
|
||||||
const crE = SettingsData.frameEnabled ? 0 : cr;
|
|
||||||
|
|
||||||
let d = `M ${crE} 0`;
|
let d = `M ${cr} 0`;
|
||||||
d += ` L ${w - crE} 0`;
|
d += ` L ${w - cr} 0`;
|
||||||
if (crE > 0)
|
if (cr > 0)
|
||||||
d += ` A ${crE} ${crE} 0 0 1 ${w} ${crE}`;
|
d += ` A ${cr} ${cr} 0 0 1 ${w} ${cr}`;
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
d += ` L ${w} ${h + r}`;
|
d += ` L ${w} ${h + r}`;
|
||||||
d += ` A ${r} ${r} 0 0 0 ${w - r} ${h}`;
|
d += ` A ${r} ${r} 0 0 0 ${w - r} ${h}`;
|
||||||
@@ -278,9 +273,9 @@ Item {
|
|||||||
if (cr > 0)
|
if (cr > 0)
|
||||||
d += ` A ${cr} ${cr} 0 0 1 0 ${h - cr}`;
|
d += ` A ${cr} ${cr} 0 0 1 0 ${h - cr}`;
|
||||||
}
|
}
|
||||||
d += ` L 0 ${crE}`;
|
d += ` L 0 ${cr}`;
|
||||||
if (crE > 0)
|
if (cr > 0)
|
||||||
d += ` A ${crE} ${crE} 0 0 1 ${crE} 0`;
|
d += ` A ${cr} ${cr} 0 0 1 ${cr} 0`;
|
||||||
d += " Z";
|
d += " Z";
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
@@ -290,12 +285,11 @@ Item {
|
|||||||
h = h - wing;
|
h = h - wing;
|
||||||
const r = wing;
|
const r = wing;
|
||||||
const cr = rt;
|
const cr = rt;
|
||||||
const crE = SettingsData.frameEnabled ? 0 : cr;
|
|
||||||
|
|
||||||
let d = `M ${crE} ${fullH}`;
|
let d = `M ${cr} ${fullH}`;
|
||||||
d += ` L ${w - crE} ${fullH}`;
|
d += ` L ${w - cr} ${fullH}`;
|
||||||
if (crE > 0)
|
if (cr > 0)
|
||||||
d += ` A ${crE} ${crE} 0 0 0 ${w} ${fullH - crE}`;
|
d += ` A ${cr} ${cr} 0 0 0 ${w} ${fullH - cr}`;
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
d += ` L ${w} 0`;
|
d += ` L ${w} 0`;
|
||||||
d += ` A ${r} ${r} 0 0 1 ${w - r} ${r}`;
|
d += ` A ${r} ${r} 0 0 1 ${w - r} ${r}`;
|
||||||
@@ -309,9 +303,9 @@ Item {
|
|||||||
if (cr > 0)
|
if (cr > 0)
|
||||||
d += ` A ${cr} ${cr} 0 0 0 0 ${cr}`;
|
d += ` A ${cr} ${cr} 0 0 0 0 ${cr}`;
|
||||||
}
|
}
|
||||||
d += ` L 0 ${fullH - crE}`;
|
d += ` L 0 ${fullH - cr}`;
|
||||||
if (crE > 0)
|
if (cr > 0)
|
||||||
d += ` A ${crE} ${crE} 0 0 0 ${crE} ${fullH}`;
|
d += ` A ${cr} ${cr} 0 0 0 ${cr} ${fullH}`;
|
||||||
d += " Z";
|
d += " Z";
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
@@ -320,12 +314,11 @@ Item {
|
|||||||
w = w - wing;
|
w = w - wing;
|
||||||
const r = wing;
|
const r = wing;
|
||||||
const cr = rt;
|
const cr = rt;
|
||||||
const crE = SettingsData.frameEnabled ? 0 : cr;
|
|
||||||
|
|
||||||
let d = `M 0 ${crE}`;
|
let d = `M 0 ${cr}`;
|
||||||
d += ` L 0 ${h - crE}`;
|
d += ` L 0 ${h - cr}`;
|
||||||
if (crE > 0)
|
if (cr > 0)
|
||||||
d += ` A ${crE} ${crE} 0 0 0 ${crE} ${h}`;
|
d += ` A ${cr} ${cr} 0 0 0 ${cr} ${h}`;
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
d += ` L ${w + r} ${h}`;
|
d += ` L ${w + r} ${h}`;
|
||||||
d += ` A ${r} ${r} 0 0 1 ${w} ${h - r}`;
|
d += ` A ${r} ${r} 0 0 1 ${w} ${h - r}`;
|
||||||
@@ -339,9 +332,9 @@ Item {
|
|||||||
if (cr > 0)
|
if (cr > 0)
|
||||||
d += ` A ${cr} ${cr} 0 0 0 ${w - cr} 0`;
|
d += ` A ${cr} ${cr} 0 0 0 ${w - cr} 0`;
|
||||||
}
|
}
|
||||||
d += ` L ${crE} 0`;
|
d += ` L ${cr} 0`;
|
||||||
if (crE > 0)
|
if (cr > 0)
|
||||||
d += ` A ${crE} ${crE} 0 0 0 0 ${crE}`;
|
d += ` A ${cr} ${cr} 0 0 0 0 ${cr}`;
|
||||||
d += " Z";
|
d += " Z";
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
@@ -351,12 +344,11 @@ Item {
|
|||||||
w = w - wing;
|
w = w - wing;
|
||||||
const r = wing;
|
const r = wing;
|
||||||
const cr = rt;
|
const cr = rt;
|
||||||
const crE = SettingsData.frameEnabled ? 0 : cr;
|
|
||||||
|
|
||||||
let d = `M ${fullW} ${crE}`;
|
let d = `M ${fullW} ${cr}`;
|
||||||
d += ` L ${fullW} ${h - crE}`;
|
d += ` L ${fullW} ${h - cr}`;
|
||||||
if (crE > 0)
|
if (cr > 0)
|
||||||
d += ` A ${crE} ${crE} 0 0 1 ${fullW - crE} ${h}`;
|
d += ` A ${cr} ${cr} 0 0 1 ${fullW - cr} ${h}`;
|
||||||
if (r > 0) {
|
if (r > 0) {
|
||||||
d += ` L 0 ${h}`;
|
d += ` L 0 ${h}`;
|
||||||
d += ` A ${r} ${r} 0 0 0 ${r} ${h - r}`;
|
d += ` A ${r} ${r} 0 0 0 ${r} ${h - r}`;
|
||||||
@@ -370,9 +362,9 @@ Item {
|
|||||||
if (cr > 0)
|
if (cr > 0)
|
||||||
d += ` A ${cr} ${cr} 0 0 1 ${cr} 0`;
|
d += ` A ${cr} ${cr} 0 0 1 ${cr} 0`;
|
||||||
}
|
}
|
||||||
d += ` L ${fullW - crE} 0`;
|
d += ` L ${fullW - cr} 0`;
|
||||||
if (crE > 0)
|
if (cr > 0)
|
||||||
d += ` A ${crE} ${crE} 0 0 1 ${fullW} ${crE}`;
|
d += ` A ${cr} ${cr} 0 0 1 ${fullW} ${cr}`;
|
||||||
d += " Z";
|
d += " Z";
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,31 +23,6 @@ Item {
|
|||||||
readonly property real innerPadding: barConfig?.innerPadding ?? 4
|
readonly property real innerPadding: barConfig?.innerPadding ?? 4
|
||||||
readonly property real outlineThickness: (barConfig?.widgetOutlineEnabled ?? false) ? (barConfig?.widgetOutlineThickness ?? 1) : 0
|
readonly property real outlineThickness: (barConfig?.widgetOutlineEnabled ?? false) ? (barConfig?.widgetOutlineThickness ?? 1) : 0
|
||||||
|
|
||||||
readonly property real _frameLeftInset: {
|
|
||||||
if (!SettingsData.frameEnabled || barWindow.isVertical) return 0
|
|
||||||
return barWindow.hasAdjacentLeftBar
|
|
||||||
? SettingsData.frameBarSize
|
|
||||||
: 0
|
|
||||||
}
|
|
||||||
readonly property real _frameRightInset: {
|
|
||||||
if (!SettingsData.frameEnabled || barWindow.isVertical) return 0
|
|
||||||
return barWindow.hasAdjacentRightBar
|
|
||||||
? SettingsData.frameBarSize
|
|
||||||
: 0
|
|
||||||
}
|
|
||||||
readonly property real _frameTopInset: {
|
|
||||||
if (!SettingsData.frameEnabled || !barWindow.isVertical) return 0
|
|
||||||
return barWindow.hasAdjacentTopBar
|
|
||||||
? SettingsData.frameThickness
|
|
||||||
: 0
|
|
||||||
}
|
|
||||||
readonly property real _frameBottomInset: {
|
|
||||||
if (!SettingsData.frameEnabled || !barWindow.isVertical) return 0
|
|
||||||
return barWindow.hasAdjacentBottomBar
|
|
||||||
? SettingsData.frameThickness
|
|
||||||
: 0
|
|
||||||
}
|
|
||||||
|
|
||||||
property alias hLeftSection: hLeftSection
|
property alias hLeftSection: hLeftSection
|
||||||
property alias hCenterSection: hCenterSection
|
property alias hCenterSection: hCenterSection
|
||||||
property alias hRightSection: hRightSection
|
property alias hRightSection: hRightSection
|
||||||
@@ -56,14 +31,10 @@ Item {
|
|||||||
property alias vRightSection: vRightSection
|
property alias vRightSection: vRightSection
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.leftMargin: Math.max(Theme.spacingXS, innerPadding * 0.8) + _frameLeftInset
|
anchors.leftMargin: Math.max(Theme.spacingXS, innerPadding * 0.8)
|
||||||
anchors.rightMargin: Math.max(Theme.spacingXS, innerPadding * 0.8) + _frameRightInset
|
anchors.rightMargin: Math.max(Theme.spacingXS, innerPadding * 0.8)
|
||||||
anchors.topMargin: (barWindow.isVertical
|
anchors.topMargin: barWindow.isVertical ? (barWindow.hasAdjacentTopBar ? outlineThickness : Theme.spacingXS) : 0
|
||||||
? (barWindow.hasAdjacentTopBar ? outlineThickness : Theme.spacingXS)
|
anchors.bottomMargin: barWindow.isVertical ? (barWindow.hasAdjacentBottomBar ? outlineThickness : Theme.spacingXS) : 0
|
||||||
: 0) + _frameTopInset
|
|
||||||
anchors.bottomMargin: (barWindow.isVertical
|
|
||||||
? (barWindow.hasAdjacentBottomBar ? outlineThickness : Theme.spacingXS)
|
|
||||||
: 0) + _frameBottomInset
|
|
||||||
clip: false
|
clip: false
|
||||||
|
|
||||||
property int componentMapRevision: 0
|
property int componentMapRevision: 0
|
||||||
|
|||||||
@@ -133,11 +133,6 @@ PanelWindow {
|
|||||||
teardown();
|
teardown();
|
||||||
if (!BlurService.enabled || !BlurService.available)
|
if (!BlurService.enabled || !BlurService.available)
|
||||||
return;
|
return;
|
||||||
// In frame mode, FrameWindow owns the blur region for the entire screen edge
|
|
||||||
// (including the bar area). The bar must not set its own competing blur region
|
|
||||||
// so that frameBlurEnabled acts as the single control for all blur in frame mode.
|
|
||||||
if (SettingsData.frameEnabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const widgets = barWindow._blurWidgetItems.filter(w => w && w.visible && w.width > 0 && w.height > 0);
|
const widgets = barWindow._blurWidgetItems.filter(w => w && w.visible && w.width > 0 && w.height > 0);
|
||||||
const hasBar = barHasTransparency;
|
const hasBar = barHasTransparency;
|
||||||
@@ -192,11 +187,6 @@ PanelWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: SettingsData
|
|
||||||
function onFrameEnabledChanged() { barBlur.rebuild(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: topBarSlide
|
target: topBarSlide
|
||||||
function onXChanged() {
|
function onXChanged() {
|
||||||
@@ -248,9 +238,7 @@ PanelWindow {
|
|||||||
readonly property color _surfaceContainer: Theme.surfaceContainer
|
readonly property color _surfaceContainer: Theme.surfaceContainer
|
||||||
readonly property string _barId: barConfig?.id ?? "default"
|
readonly property string _barId: barConfig?.id ?? "default"
|
||||||
property real _backgroundAlpha: barConfig?.transparency ?? 1.0
|
property real _backgroundAlpha: barConfig?.transparency ?? 1.0
|
||||||
readonly property color _bgColor: SettingsData.frameEnabled
|
readonly property color _bgColor: Theme.withAlpha(_surfaceContainer, _backgroundAlpha)
|
||||||
? Qt.rgba(SettingsData.effectiveFrameColor.r, SettingsData.effectiveFrameColor.g, SettingsData.effectiveFrameColor.b, SettingsData.frameOpacity)
|
|
||||||
: Theme.withAlpha(_surfaceContainer, _backgroundAlpha)
|
|
||||||
|
|
||||||
function _updateBackgroundAlpha() {
|
function _updateBackgroundAlpha() {
|
||||||
const live = SettingsData.barConfigs.find(c => c.id === _barId);
|
const live = SettingsData.barConfigs.find(c => c.id === _barId);
|
||||||
@@ -396,7 +384,7 @@ PanelWindow {
|
|||||||
shouldHideForWindows = filtered.length > 0;
|
shouldHideForWindows = filtered.length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
property real effectiveSpacing: SettingsData.frameEnabled ? 0 : (hasMaximizedToplevel ? 0 : (barConfig?.spacing ?? 4))
|
property real effectiveSpacing: hasMaximizedToplevel ? 0 : (barConfig?.spacing ?? 4)
|
||||||
|
|
||||||
Behavior on effectiveSpacing {
|
Behavior on effectiveSpacing {
|
||||||
enabled: barWindow.visible
|
enabled: barWindow.visible
|
||||||
@@ -407,12 +395,7 @@ PanelWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
readonly property int notificationCount: NotificationService.notifications.length
|
readonly property int notificationCount: NotificationService.notifications.length
|
||||||
readonly property real effectiveBarThickness: SettingsData.frameEnabled
|
readonly property real effectiveBarThickness: Theme.snap(Math.max(barWindow.widgetThickness + (barConfig?.innerPadding ?? 4) + 4, Theme.barHeight - 4 - (8 - (barConfig?.innerPadding ?? 4))), _dpr)
|
||||||
? SettingsData.frameBarSize
|
|
||||||
: Theme.snap(Math.max(barWindow.widgetThickness + (barConfig?.innerPadding ?? 4) + 4, Theme.barHeight - 4 - (8 - (barConfig?.innerPadding ?? 4))), _dpr)
|
|
||||||
readonly property bool effectiveOpenOnOverview: SettingsData.frameEnabled
|
|
||||||
? SettingsData.frameShowOnOverview
|
|
||||||
: (barConfig?.openOnOverview ?? false)
|
|
||||||
readonly property real widgetThickness: Theme.snap(Math.max(20, 26 + (barConfig?.innerPadding ?? 4) * 0.6), _dpr)
|
readonly property real widgetThickness: Theme.snap(Math.max(20, 26 + (barConfig?.innerPadding ?? 4) * 0.6), _dpr)
|
||||||
|
|
||||||
readonly property bool hasAdjacentTopBar: {
|
readonly property bool hasAdjacentTopBar: {
|
||||||
@@ -668,7 +651,7 @@ PanelWindow {
|
|||||||
|
|
||||||
readonly property int barThickness: Theme.px(barWindow.effectiveBarThickness + barWindow.effectiveSpacing, barWindow._dpr)
|
readonly property int barThickness: Theme.px(barWindow.effectiveBarThickness + barWindow.effectiveSpacing, barWindow._dpr)
|
||||||
|
|
||||||
readonly property bool inOverviewWithShow: CompositorService.isNiri && NiriService.inOverview && barWindow.effectiveOpenOnOverview
|
readonly property bool inOverviewWithShow: CompositorService.isNiri && NiriService.inOverview && (barConfig?.openOnOverview ?? false)
|
||||||
readonly property bool effectiveVisible: (barConfig?.visible ?? true) || inOverviewWithShow
|
readonly property bool effectiveVisible: (barConfig?.visible ?? true) || inOverviewWithShow
|
||||||
readonly property bool showing: effectiveVisible && (topBarCore.reveal || inOverviewWithShow || !topBarCore.autoHide)
|
readonly property bool showing: effectiveVisible && (topBarCore.reveal || inOverviewWithShow || !topBarCore.autoHide)
|
||||||
|
|
||||||
@@ -809,7 +792,7 @@ PanelWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
property bool reveal: {
|
property bool reveal: {
|
||||||
const inOverviewWithShow = CompositorService.isNiri && NiriService.inOverview && barWindow.effectiveOpenOnOverview;
|
const inOverviewWithShow = CompositorService.isNiri && NiriService.inOverview && (barConfig?.openOnOverview ?? false);
|
||||||
if (inOverviewWithShow)
|
if (inOverviewWithShow)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@@ -906,7 +889,7 @@ PanelWindow {
|
|||||||
top: barWindow.isVertical ? parent.top : undefined
|
top: barWindow.isVertical ? parent.top : undefined
|
||||||
bottom: barWindow.isVertical ? parent.bottom : undefined
|
bottom: barWindow.isVertical ? parent.bottom : undefined
|
||||||
}
|
}
|
||||||
readonly property bool inOverview: CompositorService.isNiri && NiriService.inOverview && barWindow.effectiveOpenOnOverview
|
readonly property bool inOverview: CompositorService.isNiri && NiriService.inOverview && (barConfig?.openOnOverview ?? false)
|
||||||
hoverEnabled: (barConfig?.autoHide ?? false) && !inOverview && !topBarCore.hasActivePopout
|
hoverEnabled: (barConfig?.autoHide ?? false) && !inOverview && !topBarCore.hasActivePopout
|
||||||
acceptedButtons: Qt.NoButton
|
acceptedButtons: Qt.NoButton
|
||||||
enabled: (barConfig?.autoHide ?? false) && !inOverview
|
enabled: (barConfig?.autoHide ?? false) && !inOverview
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
import qs.Common
|
|
||||||
|
|
||||||
Variants {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
model: Quickshell.screens
|
|
||||||
|
|
||||||
FrameInstance {
|
|
||||||
required property var modelData
|
|
||||||
|
|
||||||
screen: modelData
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import QtQuick.Effects
|
|
||||||
import qs.Common
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
required property real cutoutTopInset
|
|
||||||
required property real cutoutBottomInset
|
|
||||||
required property real cutoutLeftInset
|
|
||||||
required property real cutoutRightInset
|
|
||||||
required property real cutoutRadius
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: borderRect
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
// Bake frameOpacity into the color alpha rather than using the `opacity` property.
|
|
||||||
// Qt Quick can skip layer.effect processing on items with opacity < 1 as an
|
|
||||||
// optimization, causing the MultiEffect inverted mask to stop working and the
|
|
||||||
// Rectangle to render as a plain square at low opacity values.
|
|
||||||
color: Qt.rgba(SettingsData.effectiveFrameColor.r,
|
|
||||||
SettingsData.effectiveFrameColor.g,
|
|
||||||
SettingsData.effectiveFrameColor.b,
|
|
||||||
SettingsData.frameOpacity)
|
|
||||||
|
|
||||||
layer.enabled: true
|
|
||||||
layer.effect: MultiEffect {
|
|
||||||
maskSource: cutoutMask
|
|
||||||
maskEnabled: true
|
|
||||||
maskInverted: true
|
|
||||||
maskThresholdMin: 0.5
|
|
||||||
maskSpreadAtMin: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: cutoutMask
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
layer.enabled: true
|
|
||||||
visible: false
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
anchors {
|
|
||||||
fill: parent
|
|
||||||
topMargin: root.cutoutTopInset
|
|
||||||
bottomMargin: root.cutoutBottomInset
|
|
||||||
leftMargin: root.cutoutLeftInset
|
|
||||||
rightMargin: root.cutoutRightInset
|
|
||||||
}
|
|
||||||
radius: root.cutoutRadius
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
import Quickshell.Wayland
|
|
||||||
import qs.Common
|
|
||||||
|
|
||||||
Scope {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
required property var screen
|
|
||||||
|
|
||||||
readonly property var barEdges: {
|
|
||||||
SettingsData.barConfigs; // force re-eval when bar configs change
|
|
||||||
return SettingsData.getActiveBarEdgesForScreen(screen);
|
|
||||||
}
|
|
||||||
|
|
||||||
// One thin invisible PanelWindow per edge.
|
|
||||||
// Skips any edge where a bar already provides its own exclusiveZone.
|
|
||||||
|
|
||||||
readonly property bool screenEnabled: SettingsData.frameEnabled && SettingsData.isScreenInPreferences(root.screen, SettingsData.frameScreenPreferences)
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
active: root.screenEnabled && !root.barEdges.includes("top")
|
|
||||||
sourceComponent: EdgeExclusion {
|
|
||||||
targetScreen: root.screen
|
|
||||||
anchorTop: true
|
|
||||||
anchorLeft: true
|
|
||||||
anchorRight: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
active: root.screenEnabled && !root.barEdges.includes("bottom")
|
|
||||||
sourceComponent: EdgeExclusion {
|
|
||||||
targetScreen: root.screen
|
|
||||||
anchorBottom: true
|
|
||||||
anchorLeft: true
|
|
||||||
anchorRight: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
active: root.screenEnabled && !root.barEdges.includes("left")
|
|
||||||
sourceComponent: EdgeExclusion {
|
|
||||||
targetScreen: root.screen
|
|
||||||
anchorLeft: true
|
|
||||||
anchorTop: true
|
|
||||||
anchorBottom: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
active: root.screenEnabled && !root.barEdges.includes("right")
|
|
||||||
sourceComponent: EdgeExclusion {
|
|
||||||
targetScreen: root.screen
|
|
||||||
anchorRight: true
|
|
||||||
anchorTop: true
|
|
||||||
anchorBottom: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
component EdgeExclusion: PanelWindow {
|
|
||||||
required property var targetScreen
|
|
||||||
|
|
||||||
screen: targetScreen
|
|
||||||
property bool anchorTop: false
|
|
||||||
property bool anchorBottom: false
|
|
||||||
property bool anchorLeft: false
|
|
||||||
property bool anchorRight: false
|
|
||||||
|
|
||||||
WlrLayershell.namespace: "dms:frame-exclusion"
|
|
||||||
WlrLayershell.layer: WlrLayer.Top
|
|
||||||
exclusiveZone: SettingsData.frameThickness
|
|
||||||
color: "transparent"
|
|
||||||
mask: Region {}
|
|
||||||
implicitWidth: 1
|
|
||||||
implicitHeight: 1
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: anchorTop
|
|
||||||
bottom: anchorBottom
|
|
||||||
left: anchorLeft
|
|
||||||
right: anchorRight
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
required property var screen
|
|
||||||
|
|
||||||
FrameWindow {
|
|
||||||
targetScreen: root.screen
|
|
||||||
}
|
|
||||||
|
|
||||||
FrameExclusions {
|
|
||||||
screen: root.screen
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import Quickshell
|
|
||||||
import Quickshell.Wayland
|
|
||||||
import qs.Common
|
|
||||||
import qs.Services
|
|
||||||
|
|
||||||
PanelWindow {
|
|
||||||
id: win
|
|
||||||
|
|
||||||
required property var targetScreen
|
|
||||||
|
|
||||||
screen: targetScreen
|
|
||||||
visible: true
|
|
||||||
|
|
||||||
WlrLayershell.namespace: "dms:frame"
|
|
||||||
WlrLayershell.layer: WlrLayer.Top
|
|
||||||
WlrLayershell.exclusionMode: ExclusionMode.Ignore
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: true
|
|
||||||
bottom: true
|
|
||||||
left: true
|
|
||||||
right: true
|
|
||||||
}
|
|
||||||
|
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
// No input — pass everything through to apps and bar
|
|
||||||
mask: Region {}
|
|
||||||
|
|
||||||
readonly property var barEdges: {
|
|
||||||
SettingsData.barConfigs;
|
|
||||||
return SettingsData.getActiveBarEdgesForScreen(win.screen);
|
|
||||||
}
|
|
||||||
|
|
||||||
readonly property real _dpr: CompositorService.getScreenScale(win.screen)
|
|
||||||
readonly property bool _frameActive: SettingsData.frameEnabled
|
|
||||||
&& SettingsData.isScreenInPreferences(win.screen, SettingsData.frameScreenPreferences)
|
|
||||||
readonly property int _windowRegionWidth: win._regionInt(win.width)
|
|
||||||
readonly property int _windowRegionHeight: win._regionInt(win.height)
|
|
||||||
|
|
||||||
function _regionInt(value) {
|
|
||||||
return Math.max(0, Math.round(Theme.px(value, win._dpr)));
|
|
||||||
}
|
|
||||||
|
|
||||||
readonly property int cutoutTopInset: win._regionInt(barEdges.includes("top") ? SettingsData.frameBarSize : SettingsData.frameThickness)
|
|
||||||
readonly property int cutoutBottomInset: win._regionInt(barEdges.includes("bottom") ? SettingsData.frameBarSize : SettingsData.frameThickness)
|
|
||||||
readonly property int cutoutLeftInset: win._regionInt(barEdges.includes("left") ? SettingsData.frameBarSize : SettingsData.frameThickness)
|
|
||||||
readonly property int cutoutRightInset: win._regionInt(barEdges.includes("right") ? SettingsData.frameBarSize : SettingsData.frameThickness)
|
|
||||||
readonly property int cutoutWidth: Math.max(0, win._windowRegionWidth - win.cutoutLeftInset - win.cutoutRightInset)
|
|
||||||
readonly property int cutoutHeight: Math.max(0, win._windowRegionHeight - win.cutoutTopInset - win.cutoutBottomInset)
|
|
||||||
readonly property int cutoutRadius: {
|
|
||||||
const requested = win._regionInt(SettingsData.frameRounding);
|
|
||||||
const maxRadius = Math.floor(Math.min(win.cutoutWidth, win.cutoutHeight) / 2);
|
|
||||||
return Math.max(0, Math.min(requested, maxRadius));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Slightly expand the subtractive blur cutout at very low opacity levels
|
|
||||||
readonly property int _blurCutoutCompensation: SettingsData.frameOpacity <= 0.2 ? 1 : 0
|
|
||||||
readonly property int _blurCutoutLeft: Math.max(0, win.cutoutLeftInset - win._blurCutoutCompensation)
|
|
||||||
readonly property int _blurCutoutTop: Math.max(0, win.cutoutTopInset - win._blurCutoutCompensation)
|
|
||||||
readonly property int _blurCutoutRight: Math.min(win._windowRegionWidth, win._windowRegionWidth - win.cutoutRightInset + win._blurCutoutCompensation)
|
|
||||||
readonly property int _blurCutoutBottom: Math.min(win._windowRegionHeight, win._windowRegionHeight - win.cutoutBottomInset + win._blurCutoutCompensation)
|
|
||||||
readonly property int _blurCutoutRadius: {
|
|
||||||
const requested = win.cutoutRadius + win._blurCutoutCompensation;
|
|
||||||
const maxRadius = Math.floor(Math.min(_blurCutout.width, _blurCutout.height) / 2);
|
|
||||||
return Math.max(0, Math.min(requested, maxRadius));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Must stay visible so Region.item can resolve scene coordinates.
|
|
||||||
Item {
|
|
||||||
id: _blurCutout
|
|
||||||
x: win._blurCutoutLeft
|
|
||||||
y: win._blurCutoutTop
|
|
||||||
width: Math.max(0, win._blurCutoutRight - win._blurCutoutLeft)
|
|
||||||
height: Math.max(0, win._blurCutoutBottom - win._blurCutoutTop)
|
|
||||||
}
|
|
||||||
|
|
||||||
property var _frameBlurRegion: null
|
|
||||||
|
|
||||||
function _buildBlur() {
|
|
||||||
_teardownBlur();
|
|
||||||
// Follow the global blur toggle
|
|
||||||
if (!BlurService.enabled || !SettingsData.frameBlurEnabled || !win._frameActive || !win.visible)
|
|
||||||
return;
|
|
||||||
try {
|
|
||||||
const region = Qt.createQmlObject(
|
|
||||||
'import QtQuick; import Quickshell; Region {' +
|
|
||||||
' property Item cutoutItem;' +
|
|
||||||
' property int cutoutRadius: 0;' +
|
|
||||||
' Region {' +
|
|
||||||
' item: cutoutItem;' +
|
|
||||||
' intersection: Intersection.Subtract;' +
|
|
||||||
' radius: cutoutRadius;' +
|
|
||||||
' }' +
|
|
||||||
'}',
|
|
||||||
win, "FrameBlurRegion");
|
|
||||||
|
|
||||||
region.x = Qt.binding(() => 0);
|
|
||||||
region.y = Qt.binding(() => 0);
|
|
||||||
region.width = Qt.binding(() => win._windowRegionWidth);
|
|
||||||
region.height = Qt.binding(() => win._windowRegionHeight);
|
|
||||||
region.cutoutItem = _blurCutout;
|
|
||||||
region.cutoutRadius = Qt.binding(() => win._blurCutoutRadius);
|
|
||||||
|
|
||||||
win.BackgroundEffect.blurRegion = region;
|
|
||||||
win._frameBlurRegion = region;
|
|
||||||
} catch (e) {
|
|
||||||
console.warn("FrameWindow: Failed to create blur region:", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _teardownBlur() {
|
|
||||||
if (!win._frameBlurRegion)
|
|
||||||
return;
|
|
||||||
try {
|
|
||||||
win.BackgroundEffect.blurRegion = null;
|
|
||||||
} catch (e) {}
|
|
||||||
win._frameBlurRegion.destroy();
|
|
||||||
win._frameBlurRegion = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Timer {
|
|
||||||
id: _blurRebuildTimer
|
|
||||||
interval: 1
|
|
||||||
onTriggered: win._buildBlur()
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: SettingsData
|
|
||||||
function onFrameBlurEnabledChanged() { _blurRebuildTimer.restart(); }
|
|
||||||
function onFrameEnabledChanged() { _blurRebuildTimer.restart(); }
|
|
||||||
function onFrameThicknessChanged() { _blurRebuildTimer.restart(); }
|
|
||||||
function onFrameBarSizeChanged() { _blurRebuildTimer.restart(); }
|
|
||||||
function onFrameOpacityChanged() { _blurRebuildTimer.restart(); }
|
|
||||||
function onFrameRoundingChanged() { _blurRebuildTimer.restart(); }
|
|
||||||
function onFrameScreenPreferencesChanged() { _blurRebuildTimer.restart(); }
|
|
||||||
function onBarConfigsChanged() { _blurRebuildTimer.restart(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: BlurService
|
|
||||||
function onEnabledChanged() { _blurRebuildTimer.restart(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
onVisibleChanged: {
|
|
||||||
if (visible) {
|
|
||||||
win._frameBlurRegion = null;
|
|
||||||
_blurRebuildTimer.restart();
|
|
||||||
} else {
|
|
||||||
_teardownBlur();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: Qt.callLater(() => win._buildBlur())
|
|
||||||
Component.onDestruction: win._teardownBlur()
|
|
||||||
|
|
||||||
FrameBorder {
|
|
||||||
anchors.fill: parent
|
|
||||||
visible: win._frameActive
|
|
||||||
cutoutTopInset: win.cutoutTopInset
|
|
||||||
cutoutBottomInset: win.cutoutBottomInset
|
|
||||||
cutoutLeftInset: win.cutoutLeftInset
|
|
||||||
cutoutRightInset: win.cutoutRightInset
|
|
||||||
cutoutRadius: win.cutoutRadius
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -693,8 +693,6 @@ Item {
|
|||||||
|
|
||||||
SettingsToggleRow {
|
SettingsToggleRow {
|
||||||
visible: CompositorService.isNiri
|
visible: CompositorService.isNiri
|
||||||
enabled: !SettingsData.frameEnabled
|
|
||||||
opacity: SettingsData.frameEnabled ? 0.5 : 1.0
|
|
||||||
text: I18n.tr("Show on Overview")
|
text: I18n.tr("Show on Overview")
|
||||||
checked: selectedBarConfig?.openOnOverview ?? false
|
checked: selectedBarConfig?.openOnOverview ?? false
|
||||||
onToggled: toggled => {
|
onToggled: toggled => {
|
||||||
@@ -800,42 +798,11 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: SettingsData.frameEnabled
|
|
||||||
width: parent.width
|
|
||||||
implicitHeight: frameNote.implicitHeight + Theme.spacingS * 2
|
|
||||||
|
|
||||||
Row {
|
|
||||||
id: frameNote
|
|
||||||
x: Theme.spacingM
|
|
||||||
width: parent.width - Theme.spacingM * 2
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
spacing: Theme.spacingS
|
|
||||||
|
|
||||||
DankIcon {
|
|
||||||
name: "frame_source"
|
|
||||||
size: Theme.fontSizeMedium
|
|
||||||
color: Theme.primary
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Spacing and size are managed by Frame mode")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
width: parent.width - Theme.fontSizeMedium - Theme.spacingS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsCard {
|
SettingsCard {
|
||||||
iconName: "space_bar"
|
iconName: "space_bar"
|
||||||
title: I18n.tr("Spacing")
|
title: I18n.tr("Spacing")
|
||||||
settingKey: "barSpacing"
|
settingKey: "barSpacing"
|
||||||
visible: selectedBarConfig?.enabled
|
visible: selectedBarConfig?.enabled
|
||||||
enabled: !SettingsData.frameEnabled
|
|
||||||
opacity: SettingsData.frameEnabled ? 0.5 : 1.0
|
|
||||||
|
|
||||||
SettingsSliderRow {
|
SettingsSliderRow {
|
||||||
id: edgeSpacingSlider
|
id: edgeSpacingSlider
|
||||||
@@ -1036,8 +1003,6 @@ Item {
|
|||||||
|
|
||||||
SettingsSliderRow {
|
SettingsSliderRow {
|
||||||
id: barTransparencySlider
|
id: barTransparencySlider
|
||||||
enabled: !SettingsData.frameEnabled
|
|
||||||
opacity: SettingsData.frameEnabled ? 0.5 : 1.0
|
|
||||||
text: I18n.tr("Bar Transparency")
|
text: I18n.tr("Bar Transparency")
|
||||||
value: (selectedBarConfig?.transparency ?? 1.0) * 100
|
value: (selectedBarConfig?.transparency ?? 1.0) * 100
|
||||||
minimum: 0
|
minimum: 0
|
||||||
@@ -1079,35 +1044,6 @@ Item {
|
|||||||
restoreMode: Binding.RestoreBinding
|
restoreMode: Binding.RestoreBinding
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: SettingsData.frameEnabled
|
|
||||||
width: parent.width
|
|
||||||
implicitHeight: transparencyFrameNote.implicitHeight + Theme.spacingS * 2
|
|
||||||
|
|
||||||
Row {
|
|
||||||
id: transparencyFrameNote
|
|
||||||
x: Theme.spacingM
|
|
||||||
width: parent.width - Theme.spacingM * 2
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
spacing: Theme.spacingS
|
|
||||||
|
|
||||||
DankIcon {
|
|
||||||
name: "frame_source"
|
|
||||||
size: Theme.fontSizeMedium
|
|
||||||
color: Theme.primary
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Opacity is controlled by Frame Border Opacity in Frame settings")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
width: parent.width - Theme.fontSizeMedium - Theme.spacingS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsCard {
|
SettingsCard {
|
||||||
@@ -1351,8 +1287,6 @@ Item {
|
|||||||
|
|
||||||
SettingsToggleRow {
|
SettingsToggleRow {
|
||||||
text: I18n.tr("Square Corners")
|
text: I18n.tr("Square Corners")
|
||||||
enabled: !SettingsData.frameEnabled
|
|
||||||
opacity: SettingsData.frameEnabled ? 0.5 : 1.0
|
|
||||||
checked: selectedBarConfig?.squareCorners ?? false
|
checked: selectedBarConfig?.squareCorners ?? false
|
||||||
onToggled: checked => SettingsData.updateBarConfig(selectedBarId, {
|
onToggled: checked => SettingsData.updateBarConfig(selectedBarId, {
|
||||||
squareCorners: checked
|
squareCorners: checked
|
||||||
@@ -1400,8 +1334,6 @@ Item {
|
|||||||
|
|
||||||
SettingsToggleRow {
|
SettingsToggleRow {
|
||||||
text: I18n.tr("Goth Corners")
|
text: I18n.tr("Goth Corners")
|
||||||
enabled: !SettingsData.frameEnabled
|
|
||||||
opacity: SettingsData.frameEnabled ? 0.5 : 1.0
|
|
||||||
checked: selectedBarConfig?.gothCornersEnabled ?? false
|
checked: selectedBarConfig?.gothCornersEnabled ?? false
|
||||||
onToggled: checked => SettingsData.updateBarConfig(selectedBarId, {
|
onToggled: checked => SettingsData.updateBarConfig(selectedBarId, {
|
||||||
gothCornersEnabled: checked
|
gothCornersEnabled: checked
|
||||||
|
|||||||
@@ -1,295 +0,0 @@
|
|||||||
pragma ComponentBehavior: Bound
|
|
||||||
|
|
||||||
import QtQuick
|
|
||||||
import qs.Common
|
|
||||||
import qs.Services
|
|
||||||
import qs.Widgets
|
|
||||||
import qs.Modules.Settings.Widgets
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root
|
|
||||||
|
|
||||||
LayoutMirroring.enabled: I18n.isRtl
|
|
||||||
LayoutMirroring.childrenInherit: true
|
|
||||||
|
|
||||||
DankFlickable {
|
|
||||||
anchors.fill: parent
|
|
||||||
clip: true
|
|
||||||
contentHeight: mainColumn.height + Theme.spacingXL
|
|
||||||
contentWidth: width
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: mainColumn
|
|
||||||
topPadding: 4
|
|
||||||
width: Math.min(550, parent.width - Theme.spacingL * 2)
|
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
|
||||||
spacing: Theme.spacingXL
|
|
||||||
|
|
||||||
// ── Enable Frame ──────────────────────────────────────────────────
|
|
||||||
SettingsCard {
|
|
||||||
width: parent.width
|
|
||||||
iconName: "frame_source"
|
|
||||||
title: I18n.tr("Frame")
|
|
||||||
settingKey: "frameEnabled"
|
|
||||||
|
|
||||||
SettingsToggleRow {
|
|
||||||
settingKey: "frameEnable"
|
|
||||||
tags: ["frame", "border", "outline", "display"]
|
|
||||||
text: I18n.tr("Enable Frame")
|
|
||||||
description: I18n.tr("Draw a connected picture-frame border around the entire display")
|
|
||||||
checked: SettingsData.frameEnabled
|
|
||||||
onToggled: checked => SettingsData.set("frameEnabled", checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── Border ────────────────────────────────────────────────────────
|
|
||||||
SettingsCard {
|
|
||||||
width: parent.width
|
|
||||||
iconName: "border_outer"
|
|
||||||
title: I18n.tr("Border")
|
|
||||||
settingKey: "frameBorder"
|
|
||||||
collapsible: true
|
|
||||||
visible: SettingsData.frameEnabled
|
|
||||||
|
|
||||||
SettingsSliderRow {
|
|
||||||
id: roundingSlider
|
|
||||||
settingKey: "frameRounding"
|
|
||||||
tags: ["frame", "border", "rounding", "radius", "corner"]
|
|
||||||
text: I18n.tr("Border Radius")
|
|
||||||
unit: "px"
|
|
||||||
minimum: 0
|
|
||||||
maximum: 100
|
|
||||||
step: 1
|
|
||||||
defaultValue: 23
|
|
||||||
value: SettingsData.frameRounding
|
|
||||||
onSliderDragFinished: v => SettingsData.set("frameRounding", v)
|
|
||||||
|
|
||||||
Binding {
|
|
||||||
target: roundingSlider
|
|
||||||
property: "value"
|
|
||||||
value: SettingsData.frameRounding
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsSliderRow {
|
|
||||||
id: thicknessSlider
|
|
||||||
settingKey: "frameThickness"
|
|
||||||
tags: ["frame", "border", "thickness", "size", "width"]
|
|
||||||
text: I18n.tr("Border Width")
|
|
||||||
unit: "px"
|
|
||||||
minimum: 2
|
|
||||||
maximum: 100
|
|
||||||
step: 1
|
|
||||||
defaultValue: 16
|
|
||||||
value: SettingsData.frameThickness
|
|
||||||
onSliderDragFinished: v => SettingsData.set("frameThickness", v)
|
|
||||||
|
|
||||||
Binding {
|
|
||||||
target: thicknessSlider
|
|
||||||
property: "value"
|
|
||||||
value: SettingsData.frameThickness
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsSliderRow {
|
|
||||||
id: barThicknessSlider
|
|
||||||
settingKey: "frameBarSize"
|
|
||||||
tags: ["frame", "bar", "thickness", "size", "height", "width"]
|
|
||||||
text: I18n.tr("Size")
|
|
||||||
description: I18n.tr("Height of horizontal bars / width of vertical bars in frame mode")
|
|
||||||
unit: "px"
|
|
||||||
minimum: 24
|
|
||||||
maximum: 100
|
|
||||||
step: 1
|
|
||||||
defaultValue: 40
|
|
||||||
value: SettingsData.frameBarSize
|
|
||||||
onSliderDragFinished: v => SettingsData.set("frameBarSize", v)
|
|
||||||
|
|
||||||
Binding {
|
|
||||||
target: barThicknessSlider
|
|
||||||
property: "value"
|
|
||||||
value: SettingsData.frameBarSize
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsSliderRow {
|
|
||||||
id: opacitySlider
|
|
||||||
settingKey: "frameOpacity"
|
|
||||||
tags: ["frame", "border", "opacity", "transparency"]
|
|
||||||
text: I18n.tr("Frame Opacity")
|
|
||||||
unit: "%"
|
|
||||||
minimum: 0
|
|
||||||
maximum: 100
|
|
||||||
defaultValue: 100
|
|
||||||
value: SettingsData.frameOpacity * 100
|
|
||||||
onSliderDragFinished: v => SettingsData.set("frameOpacity", v / 100)
|
|
||||||
|
|
||||||
Binding {
|
|
||||||
target: opacitySlider
|
|
||||||
property: "value"
|
|
||||||
value: SettingsData.frameOpacity * 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsToggleRow {
|
|
||||||
id: frameBlurToggle
|
|
||||||
settingKey: "frameBlurEnabled"
|
|
||||||
tags: ["frame", "blur", "background", "glass", "transparency", "frosted"]
|
|
||||||
text: I18n.tr("Frame Blur")
|
|
||||||
description: !BlurService.available
|
|
||||||
? I18n.tr("Requires a newer version of Quickshell")
|
|
||||||
: I18n.tr("Apply compositor blur behind the frame border")
|
|
||||||
checked: SettingsData.frameBlurEnabled
|
|
||||||
onToggled: checked => SettingsData.set("frameBlurEnabled", checked)
|
|
||||||
enabled: BlurService.available && SettingsData.blurEnabled
|
|
||||||
opacity: enabled ? 1.0 : 0.5
|
|
||||||
visible: BlurService.available
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
visible: BlurService.available && !SettingsData.blurEnabled
|
|
||||||
width: parent.width
|
|
||||||
height: blurToggleNote.height + Theme.spacingM * 2
|
|
||||||
|
|
||||||
Row {
|
|
||||||
id: blurToggleNote
|
|
||||||
x: Theme.spacingM
|
|
||||||
width: parent.width - Theme.spacingM * 2
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
spacing: Theme.spacingS
|
|
||||||
|
|
||||||
DankIcon {
|
|
||||||
name: "blur_on"
|
|
||||||
size: Theme.fontSizeMedium
|
|
||||||
color: Theme.primary
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Frame Blur is controlled by Background Blur in Theme & Colors")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
width: parent.width - Theme.fontSizeMedium - Theme.spacingS
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Color mode buttons
|
|
||||||
SettingsButtonGroupRow {
|
|
||||||
settingKey: "frameColor"
|
|
||||||
tags: ["frame", "border", "color", "theme", "primary", "surface", "default"]
|
|
||||||
text: I18n.tr("Border color")
|
|
||||||
model: [I18n.tr("Default"), I18n.tr("Primary"), I18n.tr("Surface"), I18n.tr("Custom")]
|
|
||||||
currentIndex: {
|
|
||||||
const fc = SettingsData.frameColor;
|
|
||||||
if (!fc || fc === "default") return 0;
|
|
||||||
if (fc === "primary") return 1;
|
|
||||||
if (fc === "surface") return 2;
|
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
onSelectionChanged: (index, selected) => {
|
|
||||||
if (!selected) return;
|
|
||||||
switch (index) {
|
|
||||||
case 0: SettingsData.set("frameColor", ""); break;
|
|
||||||
case 1: SettingsData.set("frameColor", "primary"); break;
|
|
||||||
case 2: SettingsData.set("frameColor", "surface"); break;
|
|
||||||
case 3:
|
|
||||||
const cur = SettingsData.frameColor;
|
|
||||||
const isPreset = !cur || cur === "primary" || cur === "surface";
|
|
||||||
if (isPreset) SettingsData.set("frameColor", "#2a2a2a");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Custom color swatch — only visible when a hex color is stored (Custom mode)
|
|
||||||
Item {
|
|
||||||
visible: {
|
|
||||||
const fc = SettingsData.frameColor;
|
|
||||||
return !!(fc && fc !== "primary" && fc !== "surface");
|
|
||||||
}
|
|
||||||
width: parent.width
|
|
||||||
height: customColorRow.height + Theme.spacingM * 2
|
|
||||||
|
|
||||||
Row {
|
|
||||||
id: customColorRow
|
|
||||||
width: parent.width - Theme.spacingM * 2
|
|
||||||
x: Theme.spacingM
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
spacing: Theme.spacingM
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
text: I18n.tr("Custom color")
|
|
||||||
font.pixelSize: Theme.fontSizeMedium
|
|
||||||
font.weight: Font.Medium
|
|
||||||
color: Theme.surfaceText
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: colorSwatch
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
width: 32
|
|
||||||
height: 32
|
|
||||||
radius: 16
|
|
||||||
color: SettingsData.effectiveFrameColor
|
|
||||||
border.color: Theme.outline
|
|
||||||
border.width: 1
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
cursorShape: Qt.PointingHandCursor
|
|
||||||
onClicked: {
|
|
||||||
PopoutService.colorPickerModal.selectedColor = SettingsData.effectiveFrameColor;
|
|
||||||
PopoutService.colorPickerModal.pickerTitle = I18n.tr("Frame Border Color");
|
|
||||||
PopoutService.colorPickerModal.onColorSelectedCallback = function (color) {
|
|
||||||
SettingsData.set("frameColor", color.toString());
|
|
||||||
};
|
|
||||||
PopoutService.colorPickerModal.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── Bar Integration ───────────────────────────────────────────────
|
|
||||||
SettingsCard {
|
|
||||||
width: parent.width
|
|
||||||
iconName: "toolbar"
|
|
||||||
title: I18n.tr("Bar Integration")
|
|
||||||
settingKey: "frameBarIntegration"
|
|
||||||
collapsible: true
|
|
||||||
expanded: false
|
|
||||||
visible: SettingsData.frameEnabled
|
|
||||||
|
|
||||||
SettingsToggleRow {
|
|
||||||
visible: CompositorService.isNiri
|
|
||||||
settingKey: "frameShowOnOverview"
|
|
||||||
tags: ["frame", "overview", "show", "hide", "niri"]
|
|
||||||
text: I18n.tr("Show on Overview")
|
|
||||||
description: I18n.tr("Show the bar and frame during Niri overview mode")
|
|
||||||
checked: SettingsData.frameShowOnOverview
|
|
||||||
onToggled: checked => SettingsData.set("frameShowOnOverview", checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── Display Assignment ────────────────────────────────────────────
|
|
||||||
SettingsCard {
|
|
||||||
width: parent.width
|
|
||||||
iconName: "monitor"
|
|
||||||
title: I18n.tr("Display Assignment")
|
|
||||||
settingKey: "frameDisplays"
|
|
||||||
collapsible: true
|
|
||||||
expanded: false
|
|
||||||
visible: SettingsData.frameEnabled
|
|
||||||
|
|
||||||
SettingsDisplayPicker {
|
|
||||||
displayPreferences: SettingsData.frameScreenPreferences
|
|
||||||
onPreferencesChanged: prefs => SettingsData.set("frameScreenPreferences", prefs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -83,6 +83,7 @@ Item {
|
|||||||
description: modelData.width + "×" + modelData.height
|
description: modelData.width + "×" + modelData.height
|
||||||
checked: localChecked
|
checked: localChecked
|
||||||
onToggled: isChecked => {
|
onToggled: isChecked => {
|
||||||
|
localChecked = isChecked;
|
||||||
var prefs = JSON.parse(JSON.stringify(root.displayPreferences));
|
var prefs = JSON.parse(JSON.stringify(root.displayPreferences));
|
||||||
if (!Array.isArray(prefs) || prefs.includes("all"))
|
if (!Array.isArray(prefs) || prefs.includes("all"))
|
||||||
prefs = [];
|
prefs = [];
|
||||||
@@ -93,11 +94,6 @@ Item {
|
|||||||
model: modelData.model || ""
|
model: modelData.model || ""
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (prefs.length === 0) {
|
|
||||||
localChecked = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
localChecked = isChecked;
|
|
||||||
root.preferencesChanged(prefs);
|
root.preferencesChanged(prefs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user