Keybinds.js: factorize keybind detection & display logic

LockScreen: remove hardcoded Keybinds
Launcher: remove most hardcoded keybinds (except for Tab etc)
MainScreen: remove most hardcoded keybinds (except for Home etc)
SessionMenu: remove all hardcoded keybinds
WallpaperPanel: remove all hardcoded keybinds
This commit is contained in:
Lysec
2026-02-11 10:09:51 +01:00
parent 17138ca7c0
commit 9a20838904
8 changed files with 191 additions and 352 deletions
+30 -12
View File
@@ -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"
}
]
},
+12 -6
View File
@@ -559,27 +559,33 @@ Singleton {
property list<var> 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"
}
]
}
+111
View File
@@ -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;
}
+3 -2
View File
@@ -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;
}
-53
View File
@@ -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)
}
}
+2 -109
View File
@@ -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
+3 -110
View File
@@ -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;
+30 -60
View File
@@ -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