mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-05 21:18:30 -04:00
fix(slideout): yield keyboard focus when modal is open on same screen (#2902)
DankSlideout always held WlrKeyboardFocus.OnDemand regardless of modals, causing Notepad to steal focus back when Launcher was opened. ModalManager: clone currentModalsByScreen on mutation so QML bindings re-evaluate when modals open/close. DankSlideout: set keyboardFocus to None while a modal is active on the same screen, letting the modal (launcher) claim focus exclusively.
This commit is contained in:
@@ -15,7 +15,11 @@ Singleton {
|
||||
function openModal(modal) {
|
||||
PopoutManager.screenshotActive = false;
|
||||
const screenName = modal.effectiveScreen?.name ?? "unknown";
|
||||
currentModalsByScreen[screenName] = modal;
|
||||
var next = {};
|
||||
for (var k in currentModalsByScreen)
|
||||
next[k] = currentModalsByScreen[k];
|
||||
next[screenName] = modal;
|
||||
currentModalsByScreen = next;
|
||||
modalChanged();
|
||||
Qt.callLater(() => {
|
||||
if (!modal.allowStacking)
|
||||
@@ -34,7 +38,12 @@ Singleton {
|
||||
function closeModal(modal) {
|
||||
const screenName = modal.effectiveScreen?.name ?? "unknown";
|
||||
if (currentModalsByScreen[screenName] === modal) {
|
||||
delete currentModalsByScreen[screenName];
|
||||
var next = {};
|
||||
for (var k in currentModalsByScreen) {
|
||||
if (k !== screenName)
|
||||
next[k] = currentModalsByScreen[k];
|
||||
}
|
||||
currentModalsByScreen = next;
|
||||
modalChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -105,9 +105,11 @@ PanelWindow {
|
||||
|
||||
readonly property bool slideoutBlurActive: root.visible && BlurService.enabled && Theme.connectedSurfaceBlurEnabled
|
||||
|
||||
readonly property string _slideoutScreenName: modelData?.name ?? ""
|
||||
|
||||
WlrLayershell.layer: (!suppressOverlayLayer && (triggerUsesOverlayLayer || CompositorService.framePeerSurfacesUseOverlayForScreen(modelData))) ? WlrLayershell.Overlay : WlrLayershell.Top
|
||||
WlrLayershell.exclusiveZone: 0
|
||||
WlrLayershell.keyboardFocus: isVisible ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
|
||||
WlrLayershell.keyboardFocus: isVisible && !ModalManager.currentModalsByScreen[_slideoutScreenName] ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
|
||||
|
||||
readonly property real dpr: CompositorService.getScreenScale(root.screen)
|
||||
readonly property real alignedWidth: Theme.px(expandable && expandedWidth ? expandedWidthValue : slideoutWidth, dpr)
|
||||
|
||||
Reference in New Issue
Block a user