diff --git a/Assets/settings-default.json b/Assets/settings-default.json index b77983ec9..11b4b453b 100644 --- a/Assets/settings-default.json +++ b/Assets/settings-default.json @@ -102,12 +102,24 @@ "lockScreenBlur": 0.0, "lockScreenTint": 0.0, "keybinds": { - "keyUp": "Up", - "keyDown": "Down", - "keyLeft": "Left", - "keyRight": "Right", - "keyEnter": "Return", - "keyEscape": "Esc" + "keyUp": [ + "Up" + ], + "keyDown": [ + "Down" + ], + "keyLeft": [ + "Left" + ], + "keyRight": [ + "Right" + ], + "keyEnter": [ + "Return" + ], + "keyEscape": [ + "Esc" + ] } }, "ui": { @@ -340,27 +352,33 @@ "powerOptions": [ { "action": "lock", - "enabled": true + "enabled": true, + "keybind": "1" }, { "action": "suspend", - "enabled": true + "enabled": true, + "keybind": "2" }, { "action": "hibernate", - "enabled": true + "enabled": true, + "keybind": "3" }, { "action": "reboot", - "enabled": true + "enabled": true, + "keybind": "4" }, { "action": "logout", - "enabled": true + "enabled": true, + "keybind": "5" }, { "action": "shutdown", - "enabled": true + "enabled": true, + "keybind": "6" } ] }, diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 2e68259ad..2f9db75d8 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -559,27 +559,33 @@ Singleton { property list powerOptions: [ { "action": "lock", - "enabled": true + "enabled": true, + "keybind": "1" }, { "action": "suspend", - "enabled": true + "enabled": true, + "keybind": "2" }, { "action": "hibernate", - "enabled": true + "enabled": true, + "keybind": "3" }, { "action": "reboot", - "enabled": true + "enabled": true, + "keybind": "4" }, { "action": "logout", - "enabled": true + "enabled": true, + "keybind": "5" }, { "action": "shutdown", - "enabled": true + "enabled": true, + "keybind": "6" } ] } diff --git a/Helpers/Keybinds.js b/Helpers/Keybinds.js new file mode 100644 index 000000000..e21cb0fd2 --- /dev/null +++ b/Helpers/Keybinds.js @@ -0,0 +1,111 @@ +function getKeybindString(event) { + let keyStr = ""; + if (event.modifiers & Qt.ControlModifier) + keyStr += "Ctrl+"; + if (event.modifiers & Qt.AltModifier) + keyStr += "Alt+"; + if (event.modifiers & Qt.ShiftModifier) + keyStr += "Shift+"; + + let keyName = ""; + let rawText = event.text; + + if (event.key >= Qt.Key_A && event.key <= Qt.Key_Z || event.key >= Qt.Key_0 && event.key <= Qt.Key_9) { + keyName = String.fromCharCode(event.key); + } else if (event.key >= Qt.Key_F1 && event.key <= Qt.Key_F12) { + keyName = "F" + (event.key - Qt.Key_F1 + 1); + } else if (rawText && rawText.length > 0 && rawText.charCodeAt(0) > 31) { + keyName = rawText.toUpperCase(); + + if (event.modifiers & Qt.ShiftModifier) { + const shiftMap = { + "!": "1", + "\"": "2", + "§": "3", + "$": "4", + "%": "5", + "&": "6", + "/": "7", + "(": "8", + ")": "9", + "=": "0", + "@": "2", + "#": "3", + "^": "6", + "*": "8" + }; + if (shiftMap[keyName]) { + keyName = shiftMap[keyName]; + } + } + } else { + switch (event.key) { + case Qt.Key_Escape: + keyName = "Esc"; + break; + case Qt.Key_Space: + keyName = "Space"; + break; + case Qt.Key_Return: + keyName = "Return"; + break; + case Qt.Key_Enter: + keyName = "Enter"; + break; + case Qt.Key_Tab: + keyName = "Tab"; + break; + case Qt.Key_Backspace: + keyName = "Backspace"; + break; + case Qt.Key_Delete: + keyName = "Del"; + break; + case Qt.Key_Insert: + keyName = "Ins"; + break; + case Qt.Key_Home: + keyName = "Home"; + break; + case Qt.Key_End: + keyName = "End"; + break; + case Qt.Key_PageUp: + keyName = "PgUp"; + break; + case Qt.Key_PageDown: + keyName = "PgDn"; + break; + case Qt.Key_Left: + keyName = "Left"; + break; + case Qt.Key_Right: + keyName = "Right"; + break; + case Qt.Key_Up: + keyName = "Up"; + break; + case Qt.Key_Down: + keyName = "Down"; + break; + } + } + + if (!keyName) + return ""; + return keyStr + keyName; +} + +function checkKey(event, settingName, settings) { + // Map simplified names to the actual setting property names + var propName = "key" + settingName.charAt(0).toUpperCase() + settingName.slice(1); + var boundKeys = settings.data.general.keybinds[propName]; + if (!boundKeys || boundKeys.length === 0) + return false; + var eventString = getKeybindString(event); + for (var i = 0; i < boundKeys.length; i++) { + if (boundKeys[i] === eventString) + return true; + } + return false; +} diff --git a/Modules/LockScreen/LockScreen.qml b/Modules/LockScreen/LockScreen.qml index 8c9882d44..7096c9c6c 100644 --- a/Modules/LockScreen/LockScreen.qml +++ b/Modules/LockScreen/LockScreen.qml @@ -11,6 +11,7 @@ import qs.Services.Keyboard import qs.Services.Media import qs.Services.UI import qs.Widgets +import "../../Helpers/Keybinds.js" as Keybinds Loader { id: root @@ -278,11 +279,11 @@ Loader { onTextChanged: lockContext.currentText = text Keys.onPressed: function (event) { - if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + if (Keybinds.checkKey(event, 'enter', Settings)) { lockContext.tryUnlock(); event.accepted = true; } - if (event.key === Qt.Key_Escape && panelComponent.timerActive) { + if (Keybinds.checkKey(event, 'escape', Settings) && panelComponent.timerActive) { panelComponent.cancelTimer(); event.accepted = true; } diff --git a/Modules/MainScreen/MainScreen.qml b/Modules/MainScreen/MainScreen.qml index b0156b8ac..3db6572e6 100644 --- a/Modules/MainScreen/MainScreen.qml +++ b/Modules/MainScreen/MainScreen.qml @@ -574,57 +574,4 @@ PanelWindow { onActivated: PanelService.openedPanel.onPageDownPressed() } - Shortcut { - sequence: "1" - enabled: root.isPanelOpen && (PanelService.openedPanel.onNumberPressed !== undefined) - onActivated: PanelService.openedPanel.onNumberPressed(1) - } - - Shortcut { - sequence: "2" - enabled: root.isPanelOpen && (PanelService.openedPanel.onNumberPressed !== undefined) - onActivated: PanelService.openedPanel.onNumberPressed(2) - } - - Shortcut { - sequence: "3" - enabled: root.isPanelOpen && (PanelService.openedPanel.onNumberPressed !== undefined) - onActivated: PanelService.openedPanel.onNumberPressed(3) - } - - Shortcut { - sequence: "4" - enabled: root.isPanelOpen && (PanelService.openedPanel.onNumberPressed !== undefined) - onActivated: PanelService.openedPanel.onNumberPressed(4) - } - - Shortcut { - sequence: "5" - enabled: root.isPanelOpen && (PanelService.openedPanel.onNumberPressed !== undefined) - onActivated: PanelService.openedPanel.onNumberPressed(5) - } - - Shortcut { - sequence: "6" - enabled: root.isPanelOpen && (PanelService.openedPanel.onNumberPressed !== undefined) - onActivated: PanelService.openedPanel.onNumberPressed(6) - } - - Shortcut { - sequence: "7" - enabled: root.isPanelOpen && (PanelService.openedPanel.onNumberPressed !== undefined) - onActivated: PanelService.openedPanel.onNumberPressed(7) - } - - Shortcut { - sequence: "8" - enabled: root.isPanelOpen && (PanelService.openedPanel.onNumberPressed !== undefined) - onActivated: PanelService.openedPanel.onNumberPressed(8) - } - - Shortcut { - sequence: "9" - enabled: root.isPanelOpen && (PanelService.openedPanel.onNumberPressed !== undefined) - onActivated: PanelService.openedPanel.onNumberPressed(9) - } } diff --git a/Modules/Panels/Launcher/LauncherCore.qml b/Modules/Panels/Launcher/LauncherCore.qml index 899805ccf..2b63136b3 100644 --- a/Modules/Panels/Launcher/LauncherCore.qml +++ b/Modules/Panels/Launcher/LauncherCore.qml @@ -10,6 +10,7 @@ import qs.Services.Keyboard import qs.Services.Noctalia import qs.Services.UI import qs.Widgets +import "../../../Helpers/Keybinds.js" as Keybinds // Core launcher logic and UI - shared between SmartPanel (Launcher.qml) and overlay (LauncherOverlayWindow.qml) Rectangle { @@ -484,116 +485,8 @@ Rectangle { } } - function getKeybindString(event) { - let keyStr = ""; - if (event.modifiers & Qt.ControlModifier) - keyStr += "Ctrl+"; - if (event.modifiers & Qt.AltModifier) - keyStr += "Alt+"; - if (event.modifiers & Qt.ShiftModifier) - keyStr += "Shift+"; - - let keyName = ""; - let rawText = event.text; - - if (event.key >= Qt.Key_A && event.key <= Qt.Key_Z || event.key >= Qt.Key_0 && event.key <= Qt.Key_9) { - keyName = String.fromCharCode(event.key); - } else if (event.key >= Qt.Key_F1 && event.key <= Qt.Key_F12) { - keyName = "F" + (event.key - Qt.Key_F1 + 1); - } else if (rawText && rawText.length > 0 && rawText.charCodeAt(0) > 31) { - keyName = rawText.toUpperCase(); - - if (event.modifiers & Qt.ShiftModifier) { - const shiftMap = { - "!": "1", - "\"": "2", - "§": "3", - "$": "4", - "%": "5", - "&": "6", - "/": "7", - "(": "8", - ")": "9", - "=": "0", - "@": "2", - "#": "3", - "^": "6", - "*": "8" - }; - if (shiftMap[keyName]) { - keyName = shiftMap[keyName]; - } - } - } else { - switch (event.key) { - case Qt.Key_Escape: - keyName = "Esc"; - break; - case Qt.Key_Space: - keyName = "Space"; - break; - case Qt.Key_Return: - keyName = "Return"; - break; - case Qt.Key_Enter: - keyName = "Enter"; - break; - case Qt.Key_Tab: - keyName = "Tab"; - break; - case Qt.Key_Backspace: - keyName = "Backspace"; - break; - case Qt.Key_Delete: - keyName = "Del"; - break; - case Qt.Key_Insert: - keyName = "Ins"; - break; - case Qt.Key_Home: - keyName = "Home"; - break; - case Qt.Key_End: - keyName = "End"; - break; - case Qt.Key_PageUp: - keyName = "PgUp"; - break; - case Qt.Key_PageDown: - keyName = "PgDn"; - break; - case Qt.Key_Left: - keyName = "Left"; - break; - case Qt.Key_Right: - keyName = "Right"; - break; - case Qt.Key_Up: - keyName = "Up"; - break; - case Qt.Key_Down: - keyName = "Down"; - break; - } - } - - if (!keyName) - return ""; - return keyStr + keyName; - } - function checkKey(event, settingName) { - // Map simplified names to the actual setting property names - var propName = "key" + settingName.charAt(0).toUpperCase() + settingName.slice(1); - var boundKeys = Settings.data.general.keybinds[propName]; - if (!boundKeys || boundKeys.length === 0) - return false; - var eventString = getKeybindString(event); - for (var i = 0; i < boundKeys.length; i++) { - if (boundKeys[i] === eventString) - return true; - } - return false; + return Keybinds.checkKey(event, settingName, Settings); } // Keyboard handler diff --git a/Modules/Panels/SessionMenu/SessionMenu.qml b/Modules/Panels/SessionMenu/SessionMenu.qml index cea0b0eca..845cc9881 100644 --- a/Modules/Panels/SessionMenu/SessionMenu.qml +++ b/Modules/Panels/SessionMenu/SessionMenu.qml @@ -11,6 +11,7 @@ import qs.Modules.MainScreen import qs.Services.Compositor import qs.Services.UI import qs.Widgets +import "../../../Helpers/Keybinds.js" as Keybinds SmartPanel { id: root @@ -343,116 +344,8 @@ SmartPanel { } } - function getKeybindString(event) { - let keyStr = ""; - if (event.modifiers & Qt.ControlModifier) - keyStr += "Ctrl+"; - if (event.modifiers & Qt.AltModifier) - keyStr += "Alt+"; - if (event.modifiers & Qt.ShiftModifier) - keyStr += "Shift+"; - - let keyName = ""; - let rawText = event.text; - - if (event.key >= Qt.Key_A && event.key <= Qt.Key_Z || event.key >= Qt.Key_0 && event.key <= Qt.Key_9) { - keyName = String.fromCharCode(event.key); - } else if (event.key >= Qt.Key_F1 && event.key <= Qt.Key_F12) { - keyName = "F" + (event.key - Qt.Key_F1 + 1); - } else if (rawText && rawText.length > 0 && rawText.charCodeAt(0) > 31) { - keyName = rawText.toUpperCase(); - - if (event.modifiers & Qt.ShiftModifier) { - const shiftMap = { - "!": "1", - "\"": "2", - "§": "3", - "$": "4", - "%": "5", - "&": "6", - "/": "7", - "(": "8", - ")": "9", - "=": "0", - "@": "2", - "#": "3", - "^": "6", - "*": "8" - }; - if (shiftMap[keyName]) { - keyName = shiftMap[keyName]; - } - } - } else { - switch (event.key) { - case Qt.Key_Escape: - keyName = "Esc"; - break; - case Qt.Key_Space: - keyName = "Space"; - break; - case Qt.Key_Return: - keyName = "Return"; - break; - case Qt.Key_Enter: - keyName = "Enter"; - break; - case Qt.Key_Tab: - keyName = "Tab"; - break; - case Qt.Key_Backspace: - keyName = "Backspace"; - break; - case Qt.Key_Delete: - keyName = "Del"; - break; - case Qt.Key_Insert: - keyName = "Ins"; - break; - case Qt.Key_Home: - keyName = "Home"; - break; - case Qt.Key_End: - keyName = "End"; - break; - case Qt.Key_PageUp: - keyName = "PgUp"; - break; - case Qt.Key_PageDown: - keyName = "PgDn"; - break; - case Qt.Key_Left: - keyName = "Left"; - break; - case Qt.Key_Right: - keyName = "Right"; - break; - case Qt.Key_Up: - keyName = "Up"; - break; - case Qt.Key_Down: - keyName = "Down"; - break; - } - } - - if (!keyName) - return ""; - return keyStr + keyName; - } - function checkKey(event, settingName) { - // Map simplified names to the actual setting property names - var propName = "key" + settingName.charAt(0).toUpperCase() + settingName.slice(1); - var boundKeys = Settings.data.general.keybinds[propName]; - if (!boundKeys || boundKeys.length === 0) - return false; - var eventString = getKeybindString(event); - for (var i = 0; i < boundKeys.length; i++) { - if (boundKeys[i] === eventString) - return true; - } - return false; + return Keybinds.checkKey(event, settingName, Settings); } function handleUp() { @@ -541,7 +434,7 @@ SmartPanel { return false; } - const pressedKeybind = getKeybindString(event); + const pressedKeybind = Keybinds.getKeybindString(event); if (!pressedKeybind) return false; diff --git a/Modules/Panels/Wallpaper/WallpaperPanel.qml b/Modules/Panels/Wallpaper/WallpaperPanel.qml index 5a80226d9..87ef2ba8e 100644 --- a/Modules/Panels/Wallpaper/WallpaperPanel.qml +++ b/Modules/Panels/Wallpaper/WallpaperPanel.qml @@ -8,6 +8,7 @@ import qs.Modules.Panels.Settings import qs.Services.Theming import qs.Services.UI import qs.Widgets +import "../../../Helpers/Keybinds.js" as Keybinds SmartPanel { id: root @@ -420,51 +421,20 @@ SmartPanel { } Keys.onPressed: event => { - var boundKeys = Settings.data.general.keybinds.keyDown; - if (!boundKeys || boundKeys.length === 0) - return; - - // Helper to check key string (duplicated from LauncherCore/SessionMenu logic for now) - // Ideally this should be a shared helper - let keyStr = ""; - if (event.modifiers & Qt.ControlModifier) - keyStr += "Ctrl+"; - if (event.modifiers & Qt.AltModifier) - keyStr += "Alt+"; - if (event.modifiers & Qt.ShiftModifier) - keyStr += "Shift+"; - - let keyName = ""; - if (event.key >= Qt.Key_A && event.key <= Qt.Key_Z || event.key >= Qt.Key_0 && event.key <= Qt.Key_9) { - keyName = String.fromCharCode(event.key); - } else if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { - keyName = "Return"; // Standardize on Return for check - } else if (event.key === Qt.Key_Escape) { - keyName = "Esc"; - } else if (event.key === Qt.Key_Up) - keyName = "Up"; - else if (event.key === Qt.Key_Down) - keyName = "Down"; - else if (event.key === Qt.Key_Left) - keyName = "Left"; - else if (event.key === Qt.Key_Right) - keyName = "Right"; - - // If the key matches any bound key for Down - if (boundKeys.indexOf(keyStr + keyName) !== -1) { - if (Settings.data.wallpaper.useWallhaven) { - if (wallhavenView && wallhavenView.gridView) { - wallhavenView.gridView.forceActiveFocus(); - } - } else { - let currentView = screenRepeater.itemAt(currentScreenIndex); - if (currentView && currentView.gridView) { - currentView.gridView.forceActiveFocus(); - } - } - event.accepted = true; - } - } + if (Keybinds.checkKey(event, 'down', Settings)) { + if (Settings.data.wallpaper.useWallhaven) { + if (wallhavenView && wallhavenView.gridView) { + wallhavenView.gridView.forceActiveFocus(); + } + } else { + let currentView = screenRepeater.itemAt(currentScreenIndex); + if (currentView && currentView.gridView) { + currentView.gridView.forceActiveFocus(); + } + } + event.accepted = true; + } + } } NComboBox { @@ -935,13 +905,13 @@ SmartPanel { } onKeyPressed: event => { - if (event.key === Qt.Key_Return || event.key === Qt.Key_Space) { - if (currentIndex >= 0 && currentIndex < filteredItems.length) { - selectItem(filteredItems[currentIndex]); - } - event.accepted = true; - } - } + if (Keybinds.checkKey(event, 'enter', Settings)) { + if (currentIndex >= 0 && currentIndex < filteredItems.length) { + selectItem(filteredItems[currentIndex]); + } + event.accepted = true; + } + } delegate: Item { id: wallpaperItemWrapper @@ -1296,14 +1266,14 @@ SmartPanel { } onKeyPressed: event => { - if (event.key === Qt.Key_Return || event.key === Qt.Key_Space) { - if (currentIndex >= 0 && currentIndex < wallpapers.length) { - let wallpaper = wallpapers[currentIndex]; - wallhavenDownloadAndApply(wallpaper); - } - event.accepted = true; - } - } + if (Keybinds.checkKey(event, 'enter', Settings)) { + if (currentIndex >= 0 && currentIndex < wallpapers.length) { + let wallpaper = wallpapers[currentIndex]; + wallhavenDownloadAndApply(wallpaper); + } + event.accepted = true; + } + } delegate: Item { id: wallhavenItemWrapper