mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-10 15:38:31 -04:00
@@ -340,6 +340,9 @@ Item {
|
|||||||
|
|
||||||
readonly property bool active: widgetLoader.active
|
readonly property bool active: widgetLoader.active
|
||||||
readonly property var item: widgetLoader.item
|
readonly property var item: widgetLoader.item
|
||||||
|
readonly property bool itemVisible: widgetLoader.item?.visible ?? false
|
||||||
|
|
||||||
|
onItemVisibleChanged: layoutTimer.restart()
|
||||||
|
|
||||||
WidgetHost {
|
WidgetHost {
|
||||||
id: widgetLoader
|
id: widgetLoader
|
||||||
@@ -372,7 +375,6 @@ Item {
|
|||||||
onContentItemReady: contentItem => {
|
onContentItemReady: contentItem => {
|
||||||
contentItem.widthChanged.connect(() => layoutTimer.restart());
|
contentItem.widthChanged.connect(() => layoutTimer.restart());
|
||||||
contentItem.heightChanged.connect(() => layoutTimer.restart());
|
contentItem.heightChanged.connect(() => layoutTimer.restart());
|
||||||
contentItem.visibleChanged.connect(() => layoutTimer.restart());
|
|
||||||
layoutTimer.restart();
|
layoutTimer.restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -151,7 +151,7 @@ PanelWindow {
|
|||||||
barBlur.rebuild();
|
barBlur.rebuild();
|
||||||
}
|
}
|
||||||
function onBarRevealedChanged() {
|
function onBarRevealedChanged() {
|
||||||
_blurRebuildTimer.restart();
|
barBlur.rebuild();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,6 +169,73 @@ PanelWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: blurWingRegionComp
|
||||||
|
|
||||||
|
// r×r square at a bar end minus a quarter-disc — the swoop BarCanvas paints
|
||||||
|
Region {
|
||||||
|
id: wingRegion
|
||||||
|
|
||||||
|
property bool atEnd: false
|
||||||
|
|
||||||
|
readonly property real r: barBackground.wing
|
||||||
|
readonly property real bx: topBarMouseArea.x + barUnitInset.x + topBarSlide.x
|
||||||
|
readonly property real by: topBarMouseArea.y + barUnitInset.y + topBarSlide.y
|
||||||
|
readonly property real bw: barUnitInset.width
|
||||||
|
readonly property real bh: barUnitInset.height
|
||||||
|
|
||||||
|
x: {
|
||||||
|
switch (barPos) {
|
||||||
|
case SettingsData.Position.Left:
|
||||||
|
return bx + bw;
|
||||||
|
case SettingsData.Position.Right:
|
||||||
|
return bx - r;
|
||||||
|
default:
|
||||||
|
return atEnd ? bx + bw - r : bx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
y: {
|
||||||
|
switch (barPos) {
|
||||||
|
case SettingsData.Position.Top:
|
||||||
|
return by + bh;
|
||||||
|
case SettingsData.Position.Bottom:
|
||||||
|
return by - r;
|
||||||
|
default:
|
||||||
|
return atEnd ? by + bh - r : by;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
width: r
|
||||||
|
height: r
|
||||||
|
|
||||||
|
Region {
|
||||||
|
intersection: Intersection.Subtract
|
||||||
|
radius: wingRegion.r
|
||||||
|
width: wingRegion.r * 2
|
||||||
|
height: wingRegion.r * 2
|
||||||
|
x: {
|
||||||
|
switch (barPos) {
|
||||||
|
case SettingsData.Position.Left:
|
||||||
|
return wingRegion.bx + wingRegion.bw;
|
||||||
|
case SettingsData.Position.Right:
|
||||||
|
return wingRegion.bx - wingRegion.r * 2;
|
||||||
|
default:
|
||||||
|
return wingRegion.atEnd ? wingRegion.bx + wingRegion.bw - wingRegion.r * 2 : wingRegion.bx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
y: {
|
||||||
|
switch (barPos) {
|
||||||
|
case SettingsData.Position.Top:
|
||||||
|
return wingRegion.by + wingRegion.bh;
|
||||||
|
case SettingsData.Position.Bottom:
|
||||||
|
return wingRegion.by - wingRegion.r * 2;
|
||||||
|
default:
|
||||||
|
return wingRegion.atEnd ? wingRegion.by + wingRegion.bh - wingRegion.r * 2 : wingRegion.by;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: barBlur
|
id: barBlur
|
||||||
visible: false
|
visible: false
|
||||||
@@ -179,8 +246,7 @@ PanelWindow {
|
|||||||
teardown();
|
teardown();
|
||||||
if (!BlurService.enabled || !BlurService.available)
|
if (!BlurService.enabled || !BlurService.available)
|
||||||
return;
|
return;
|
||||||
// Hidden bar keeps a null region — an empty clip makes Hyprland blur the whole surface box
|
if (!barWindow.barRevealed && CompositorService.isHyprland)
|
||||||
if (!barWindow.barRevealed)
|
|
||||||
return;
|
return;
|
||||||
// FrameWindow owns the blur region for the whole edge while the bar wears frame chrome
|
// FrameWindow owns the blur region for the whole edge while the bar wears frame chrome
|
||||||
if (FrameTransitionState.effectiveFrameEnabled && barWindow.usesFrameBarChrome)
|
if (FrameTransitionState.effectiveFrameEnabled && barWindow.usesFrameBarChrome)
|
||||||
@@ -213,6 +279,17 @@ PanelWindow {
|
|||||||
if (sub)
|
if (sub)
|
||||||
subRegions.push(sub);
|
subRegions.push(sub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasBar && barBackground.gothEnabled && barWindow._wingR > 0) {
|
||||||
|
for (const atEnd of [false, true]) {
|
||||||
|
const wing = blurWingRegionComp.createObject(region, {
|
||||||
|
atEnd: atEnd
|
||||||
|
});
|
||||||
|
if (wing)
|
||||||
|
subRegions.push(wing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
region.regions = subRegions;
|
region.regions = subRegions;
|
||||||
|
|
||||||
barWindow.BackgroundEffect.blurRegion = region;
|
barWindow.BackgroundEffect.blurRegion = region;
|
||||||
@@ -224,7 +301,9 @@ PanelWindow {
|
|||||||
return;
|
return;
|
||||||
try {
|
try {
|
||||||
barWindow.BackgroundEffect.blurRegion = null;
|
barWindow.BackgroundEffect.blurRegion = null;
|
||||||
} catch (e) {}
|
} catch (e) {
|
||||||
|
log.warn("BarBlur: failed to clear blur region:", e);
|
||||||
|
}
|
||||||
barWindow.blurRegion.destroy();
|
barWindow.blurRegion.destroy();
|
||||||
barWindow.blurRegion = null;
|
barWindow.blurRegion = null;
|
||||||
}
|
}
|
||||||
@@ -257,6 +336,17 @@ PanelWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: barBackground
|
||||||
|
function onGothEnabledChanged() {
|
||||||
|
_blurRebuildTimer.restart();
|
||||||
|
}
|
||||||
|
function onWingChanged() {
|
||||||
|
if (barWindow.blurRegion)
|
||||||
|
barWindow.blurRegion.changed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Component.onCompleted: rebuild()
|
Component.onCompleted: rebuild()
|
||||||
Component.onDestruction: teardown()
|
Component.onDestruction: teardown()
|
||||||
}
|
}
|
||||||
@@ -803,14 +893,53 @@ PanelWindow {
|
|||||||
|
|
||||||
property bool autoHide: barConfig?.autoHide ?? false
|
property bool autoHide: barConfig?.autoHide ?? false
|
||||||
property bool revealSticky: false
|
property bool revealSticky: false
|
||||||
|
// In click-through mode the hidden bar's input mask covers the full
|
||||||
|
// band while the revealed bar's mask covers only the widget sections,
|
||||||
|
// so the pointer position is unknowable while it is over a gap. An
|
||||||
|
// enter on the hidden bar therefore only reveals once the pointer
|
||||||
|
// reaches a thin strip at the screen edge; anything else (including
|
||||||
|
// the spurious enter generated by the mask expanding underneath a
|
||||||
|
// resting pointer) keeps the bar hidden.
|
||||||
|
property bool gapEnterSuppressed: false
|
||||||
|
readonly property bool hoverReveal: topBarMouseArea.containsMouse && !gapEnterSuppressed
|
||||||
readonly property bool ipcReveal: !!SettingsData.barIpcRevealStates[barConfig?.id ?? ""]
|
readonly property bool ipcReveal: !!SettingsData.barIpcRevealStates[barConfig?.id ?? ""]
|
||||||
|
|
||||||
|
onRevealChanged: {
|
||||||
|
if (reveal && barWindow.clickThroughEnabled)
|
||||||
|
revealSettle.restart();
|
||||||
|
}
|
||||||
|
|
||||||
|
// The input mask updates lag reveal transitions, generating spurious
|
||||||
|
// enter/leave pairs. Hides are deferred until the transition settles;
|
||||||
|
// the timer re-evaluates against the post-transition mask.
|
||||||
|
Timer {
|
||||||
|
id: revealSettle
|
||||||
|
interval: 600
|
||||||
|
repeat: false
|
||||||
|
onTriggered: topBarCore.evaluateReveal()
|
||||||
|
}
|
||||||
|
|
||||||
|
function inEdgeStrip(x, y) {
|
||||||
|
const band = barWindow.isVertical ? topBarMouseArea.width : topBarMouseArea.height;
|
||||||
|
const strip = Math.max(8, band * 0.15);
|
||||||
|
switch (barPos) {
|
||||||
|
case SettingsData.Position.Bottom:
|
||||||
|
return y >= band - strip;
|
||||||
|
case SettingsData.Position.Left:
|
||||||
|
return x <= strip;
|
||||||
|
case SettingsData.Position.Right:
|
||||||
|
return x >= band - strip;
|
||||||
|
default:
|
||||||
|
return y <= strip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Timer {
|
Timer {
|
||||||
id: revealHold
|
id: revealHold
|
||||||
interval: barWindow.clickThroughEnabled ? Math.max((barConfig?.autoHideDelay ?? 250) * 6, 1500) : (barConfig?.autoHideDelay ?? 250)
|
interval: barConfig?.autoHideDelay ?? 250
|
||||||
repeat: false
|
repeat: false
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
if (!topBarMouseArea.containsMouse && !topBarCore.popoutPinsReveal)
|
if (!topBarCore.hoverReveal && !topBarCore.popoutPinsReveal)
|
||||||
topBarCore.revealSticky = false;
|
topBarCore.revealSticky = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -863,14 +992,14 @@ PanelWindow {
|
|||||||
const showOnWindowsSetting = barConfig?.showOnWindowsOpen ?? false;
|
const showOnWindowsSetting = barConfig?.showOnWindowsOpen ?? false;
|
||||||
if (showOnWindowsSetting && autoHide && (CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango)) {
|
if (showOnWindowsSetting && autoHide && (CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isMango)) {
|
||||||
if (barWindow.shouldHideForWindows)
|
if (barWindow.shouldHideForWindows)
|
||||||
return topBarMouseArea.containsMouse || popoutPinsReveal || revealSticky || ipcReveal;
|
return hoverReveal || popoutPinsReveal || revealSticky || ipcReveal;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CompositorService.isNiri && NiriService.inOverview)
|
if (CompositorService.isNiri && NiriService.inOverview)
|
||||||
return topBarMouseArea.containsMouse || popoutPinsReveal || revealSticky || ipcReveal;
|
return hoverReveal || popoutPinsReveal || revealSticky || ipcReveal;
|
||||||
|
|
||||||
return (barConfig?.visible ?? true) && (!autoHide || topBarMouseArea.containsMouse || popoutPinsReveal || revealSticky || ipcReveal);
|
return (barConfig?.visible ?? true) && (!autoHide || hoverReveal || popoutPinsReveal || revealSticky || ipcReveal);
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
@@ -888,7 +1017,7 @@ PanelWindow {
|
|||||||
if (!autoHide)
|
if (!autoHide)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (topBarMouseArea.containsMouse) {
|
if (hoverReveal) {
|
||||||
SettingsData.setBarIpcReveal(barConfig?.id ?? "", false);
|
SettingsData.setBarIpcReveal(barConfig?.id ?? "", false);
|
||||||
revealSticky = true;
|
revealSticky = true;
|
||||||
revealHold.stop();
|
revealHold.stop();
|
||||||
@@ -901,12 +1030,21 @@ PanelWindow {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (revealSettle.running)
|
||||||
|
return;
|
||||||
|
|
||||||
|
revealHold.interval = barConfig?.autoHideDelay ?? 250;
|
||||||
revealHold.restart();
|
revealHold.restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: topBarMouseArea
|
target: topBarMouseArea
|
||||||
function onContainsMouseChanged() {
|
function onContainsMouseChanged() {
|
||||||
|
if (!topBarMouseArea.containsMouse) {
|
||||||
|
topBarCore.gapEnterSuppressed = false;
|
||||||
|
} else if (barWindow.clickThroughEnabled && !topBarCore.reveal) {
|
||||||
|
topBarCore.gapEnterSuppressed = true;
|
||||||
|
}
|
||||||
topBarCore.evaluateReveal();
|
topBarCore.evaluateReveal();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -927,6 +1065,14 @@ PanelWindow {
|
|||||||
hoverEnabled: (barConfig?.autoHide ?? false) && !inOverview && !topBarCore.popoutPinsReveal
|
hoverEnabled: (barConfig?.autoHide ?? false) && !inOverview && !topBarCore.popoutPinsReveal
|
||||||
acceptedButtons: Qt.NoButton
|
acceptedButtons: Qt.NoButton
|
||||||
enabled: (barConfig?.autoHide ?? false) && !inOverview
|
enabled: (barConfig?.autoHide ?? false) && !inOverview
|
||||||
|
onPositionChanged: mouse => {
|
||||||
|
if (!topBarCore.gapEnterSuppressed)
|
||||||
|
return;
|
||||||
|
if (!topBarCore.inEdgeStrip(mouse.x, mouse.y))
|
||||||
|
return;
|
||||||
|
topBarCore.gapEnterSuppressed = false;
|
||||||
|
topBarCore.evaluateReveal();
|
||||||
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: topBarContainer
|
id: topBarContainer
|
||||||
|
|||||||
Reference in New Issue
Block a user