mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-01 19:18:28 -04:00
hyprland: workaround for focus re-grabbing a closing surface
related #2577
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import QtQuick
|
||||
import Quickshell.Hyprland
|
||||
import qs.Common
|
||||
|
||||
// Delays grab release so keyboardFocus=None commits before the grab dies,
|
||||
// keeping Hyprland from handing focus back to the closing surface (#2577)
|
||||
HyprlandFocusGrab {
|
||||
id: root
|
||||
|
||||
property bool wanted: false
|
||||
property bool _held: false
|
||||
property bool _compositorCleared: false
|
||||
property var _restoreToplevel: null
|
||||
|
||||
property Timer _releaseTimer: Timer {
|
||||
interval: 50
|
||||
onTriggered: {
|
||||
root._held = false;
|
||||
root.active = false;
|
||||
root._restoreToplevel = root._compositorCleared ? null : KeyboardFocus.restoreToplevel(root._restoreToplevel);
|
||||
}
|
||||
}
|
||||
|
||||
onWantedChanged: _sync()
|
||||
Component.onCompleted: _sync()
|
||||
|
||||
function _sync() {
|
||||
if (!wanted) {
|
||||
if (_held)
|
||||
_releaseTimer.restart();
|
||||
return;
|
||||
}
|
||||
_releaseTimer.stop();
|
||||
_held = true;
|
||||
_compositorCleared = false;
|
||||
_restoreToplevel = KeyboardFocus.captureActiveToplevel();
|
||||
active = true;
|
||||
}
|
||||
|
||||
onCleared: _compositorCleared = true
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
import QtQuick
|
||||
import Quickshell.Hyprland
|
||||
import qs.Common
|
||||
import qs.Services
|
||||
|
||||
@@ -62,7 +61,7 @@ Item {
|
||||
}
|
||||
|
||||
// Hyprland OnDemand grab: whitelist popout surfaces and bars so dismiss clicks still land.
|
||||
HyprlandFocusGrab {
|
||||
DankFocusGrab {
|
||||
windows: {
|
||||
const list = [];
|
||||
if (root.contentWindow)
|
||||
@@ -72,10 +71,7 @@ Item {
|
||||
const transientWindows = root.transientSurfaceTracker?.focusWindows ?? [];
|
||||
return list.concat(transientWindows).concat(KeyboardFocus.barWindows);
|
||||
}
|
||||
active: KeyboardFocus.wantsGrab(root.shouldBeVisible, root.customKeyboardFocus)
|
||||
|
||||
property var restoreToplevel: null
|
||||
onActiveChanged: restoreToplevel = active ? KeyboardFocus.captureActiveToplevel() : KeyboardFocus.restoreToplevel(restoreToplevel)
|
||||
wanted: KeyboardFocus.wantsGrab(root.shouldBeVisible, root.customKeyboardFocus)
|
||||
}
|
||||
|
||||
Loader {
|
||||
|
||||
Reference in New Issue
Block a user