feat: add 3 more shortcut tabs in the preferences (closes #1064)

This commit is contained in:
decodism authored and Louis Pontoise committed 2022-10-27 11:16:24 +02:00
1 parent c3162bbb1f
commit 31bd0a6d68
48 files changed
+470 -45

No files matched your search

+2
View File
@@ -44,6 +44,7 @@ They helped [localize the app](https://poeditor.com/join/project/8AOEZ0eAZE):
* Ali Gokmen
* Allen Guan
* Ameng
* Anders Brandén
* Anurag Roy
* anushree b
* apple
@@ -158,6 +159,7 @@ They helped [localize the app](https://poeditor.com/join/project/8AOEZ0eAZE):
* Vlad
* Webmaster
* Whatsmine-HaoshuaiXu
* Yamada Keisuke
* Yossi Zahn
* ysaito
* Yukai
+9
View File
@@ -295,6 +295,15 @@
/* No comment provided by engineer. */
"Shortcut 2" = "Shortcut 2";
/* No comment provided by engineer. */
"Shortcut 3" = "Shortcut 3";
/* No comment provided by engineer. */
"Shortcut 4" = "Shortcut 4";
/* No comment provided by engineer. */
"Shortcut 5" = "Shortcut 5";
/* No comment provided by engineer. */
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -314,6 +314,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "الإختصار ٢";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "الإختصار محجوز لفعل آخر: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Шорткът 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Този шорткът вече се използва за %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "শর্টকাট 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "শর্টকাট ইতিমধ্যেই অন্য অ্যাকশনে অ্যাসাইন করা হয়েছে: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Drecera 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Drecera assignada a una altra acció: %@";
@@ -316,6 +316,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Zkratka 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Zkratka je již používána jinou akcí: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Shortcut 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Kurzbefehl 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Kurzbefehl ist bereits einer anderer Aktion zugewiesen: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Shortcut 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Shortcut 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Atajo 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Atajo ya asignado a otra acción: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Shortcut 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Shortcut 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Pikanäppäin 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Raccourci 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Raccourci déjà affecté à une autre action : %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Atallo 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Atallo xa asignado a outra acción: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "קיצור דרך 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "הקיצור שנבחר כבר משוייך לפעולה אחרת: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "शॉर्टकट २";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "शॉर्टकट पहले से ही किसी अन्य क्रिया को सौंपा गया है: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Parancsikon 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Pintasan 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Combinazione tasti 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Combinazione tasti già assegnata a un'altra azione: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "ショートカット2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "既に:%@に割り当てられたショートカット";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "단축키 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "단축키가 이미 다른 동작에 할당되어 있습니다: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Shortcut 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Snelkoppeling 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Toetscombinatie is al toegewezen aan een andere actie: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Hurtigtast 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Snarvei allerede tildelt en annen handling: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Skrót 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Skrót już przypisany do innej akcji: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Atalho 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Atalho já atribuído para outra ação: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Atalho 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Atalho já atribuído a outra acção: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Scurtătura 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Scurtătura este deja atribută unei alte acțiuni: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Комбинация 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Комбинация уже назначена к другом действие: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Skratka 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Shortcut 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shortcut already assigned to another action: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Shkurtesa 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Shkurtesa tashmë është caktuar tjetër veprimi: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Prečica 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Prečica već dodeljena drugoj akciji: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Kortkommando 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Kommandot är redan kopplat till en annan funktion: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Kısayol 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Kısayol başka bir eylem için atanmış: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Ярлик 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Ярлик уже призначено для іншої дії: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "Phím tắt 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "Phím tắt đã được gián cho hành động: %@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "快捷键 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "快捷键已经分配给了另一个动作:%@";
@@ -311,6 +311,15 @@
/*No comment provided by engineer.*/
"Shortcut 2" = "快速鍵 2";
/*No comment provided by engineer.*/
"Shortcut 3" = "Shortcut 3";
/*No comment provided by engineer.*/
"Shortcut 4" = "Shortcut 4";
/*No comment provided by engineer.*/
"Shortcut 5" = "Shortcut 5";
/*No comment provided by engineer.*/
"Shortcut already assigned to another action: %@" = "快速鍵已分配給另一個動作:%@";
+1 -2
View File
@@ -53,8 +53,7 @@ class ATShortcut {
// contains at least
return modifiers == (modifiers | shortcut.carbonModifierFlags)
}
let suffix = App.app.shortcutIndex == 0 ? "" : "2"
let holdModifiers = ControlsTab.shortcuts["holdShortcut" + suffix]!.shortcut.carbonModifierFlags
let holdModifiers = ControlsTab.shortcuts[Preferences.indexToName("holdShortcut", App.app.shortcutIndex)]!.shortcut.carbonModifierFlags
// contains exactly or exactly + holdShortcut modifiers
return modifiers == shortcut.carbonModifierFlags || modifiers == (shortcut.carbonModifierFlags | holdModifiers)
}
+2 -3
View File
@@ -15,10 +15,9 @@ class KeyRepeatTimer {
}
static func toggleRepeatingKeyNextWindow() {
let suffix = App.app.shortcutIndex == 0 ? "" : "2"
if let shortcut = ControlsTab.shortcuts["nextWindowShortcut" + suffix] {
if let shortcut = ControlsTab.shortcuts[Preferences.indexToName("nextWindowShortcut", App.app.shortcutIndex)] {
toggleRepeatingKey(shortcut) {
ControlsTab.shortcutsActions["nextWindowShortcut" + suffix]!()
ControlsTab.shortcutsActions[Preferences.indexToName("nextWindowShortcut", App.app.shortcutIndex)]!()
}
}
}
+46 -10
View File
@@ -13,8 +13,14 @@ class Preferences {
"fontHeight": "15",
"holdShortcut": "⌥",
"holdShortcut2": "⌥",
"holdShortcut3": "⌥",
"holdShortcut4": "⌥",
"holdShortcut5": "⌥",
"nextWindowShortcut": "⇥",
"nextWindowShortcut2": keyAboveTabDependingOnInputSource(),
"nextWindowShortcut3": "",
"nextWindowShortcut4": "",
"nextWindowShortcut5": "",
"focusWindowShortcut": "Space",
"previousWindowShortcut": "⇧",
"cancelShortcut": "⎋",
@@ -27,10 +33,19 @@ class Preferences {
"cursorFollowFocusEnabled": "false",
"showMinimizedWindows": ShowHowPreference.show.rawValue,
"showMinimizedWindows2": ShowHowPreference.show.rawValue,
"showMinimizedWindows3": ShowHowPreference.show.rawValue,
"showMinimizedWindows4": ShowHowPreference.show.rawValue,
"showMinimizedWindows5": ShowHowPreference.show.rawValue,
"showHiddenWindows": ShowHowPreference.show.rawValue,
"showHiddenWindows2": ShowHowPreference.show.rawValue,
"showHiddenWindows3": ShowHowPreference.show.rawValue,
"showHiddenWindows4": ShowHowPreference.show.rawValue,
"showHiddenWindows5": ShowHowPreference.show.rawValue,
"showFullscreenWindows": ShowHowPreference.show.rawValue,
"showFullscreenWindows2": ShowHowPreference.show.rawValue,
"showFullscreenWindows3": ShowHowPreference.show.rawValue,
"showFullscreenWindows4": ShowHowPreference.show.rawValue,
"showFullscreenWindows5": ShowHowPreference.show.rawValue,
"showTabsAsWindows": "false",
"hideColoredCircles": "false",
"windowDisplayDelay": "0",
@@ -40,10 +55,19 @@ class Preferences {
"alignThumbnails": AlignThumbnailsPreference.left.rawValue,
"appsToShow": AppsToShowPreference.all.rawValue,
"appsToShow2": AppsToShowPreference.active.rawValue,
"appsToShow3": AppsToShowPreference.all.rawValue,
"appsToShow4": AppsToShowPreference.all.rawValue,
"appsToShow5": AppsToShowPreference.all.rawValue,
"spacesToShow": SpacesToShowPreference.all.rawValue,
"spacesToShow2": SpacesToShowPreference.all.rawValue,
"spacesToShow3": SpacesToShowPreference.all.rawValue,
"spacesToShow4": SpacesToShowPreference.all.rawValue,
"spacesToShow5": SpacesToShowPreference.all.rawValue,
"screensToShow": ScreensToShowPreference.all.rawValue,
"screensToShow2": ScreensToShowPreference.all.rawValue,
"screensToShow3": ScreensToShowPreference.all.rawValue,
"screensToShow4": ScreensToShowPreference.all.rawValue,
"screensToShow5": ScreensToShowPreference.all.rawValue,
"fadeOutAnimation": "false",
"hideSpaceNumberLabels": "false",
"hideStatusIcons": "false",
@@ -57,6 +81,9 @@ class Preferences {
"windowMaxWidthInRow": "30",
"shortcutStyle": ShortcutStylePreference.focusOnRelease.rawValue,
"shortcutStyle2": ShortcutStylePreference.focusOnRelease.rawValue,
"shortcutStyle3": ShortcutStylePreference.focusOnRelease.rawValue,
"shortcutStyle4": ShortcutStylePreference.focusOnRelease.rawValue,
"shortcutStyle5": ShortcutStylePreference.focusOnRelease.rawValue,
"hideAppBadges": "false",
"hideWindowlessApps": "false",
"hideThumbnails": "false",
@@ -81,8 +108,8 @@ class Preferences {
static var rowsCount: CGFloat { defaults.cgfloat("rowsCount") }
static var iconSize: CGFloat { defaults.cgfloat("iconSize") }
static var fontHeight: CGFloat { defaults.cgfloat("fontHeight") }
static var holdShortcut: [String] { ["holdShortcut", "holdShortcut2"].map { defaults.string($0) } }
static var nextWindowShortcut: [String] { ["nextWindowShortcut", "nextWindowShortcut2"].map { defaults.string($0) } }
static var holdShortcut: [String] { ["holdShortcut", "holdShortcut2", "holdShortcut3", "holdShortcut4", "holdShortcut5"].map { defaults.string($0) } }
static var nextWindowShortcut: [String] { ["nextWindowShortcut", "nextWindowShortcut2", "nextWindowShortcut3", "nextWindowShortcut4", "nextWindowShortcut5"].map { defaults.string($0) } }
static var focusWindowShortcut: String { defaults.string("focusWindowShortcut") }
static var previousWindowShortcut: String { defaults.string("previousWindowShortcut") }
static var cancelShortcut: String { defaults.string("cancelShortcut") }
@@ -112,13 +139,13 @@ class Preferences {
static var alignThumbnails: AlignThumbnailsPreference { defaults.macroPref("alignThumbnails", AlignThumbnailsPreference.allCases) }
static var updatePolicy: UpdatePolicyPreference { defaults.macroPref("updatePolicy", UpdatePolicyPreference.allCases) }
static var crashPolicy: CrashPolicyPreference { defaults.macroPref("crashPolicy", CrashPolicyPreference.allCases) }
static var appsToShow: [AppsToShowPreference] { ["appsToShow", "appsToShow2"].map { defaults.macroPref($0, AppsToShowPreference.allCases) } }
static var spacesToShow: [SpacesToShowPreference] { ["spacesToShow", "spacesToShow2"].map { defaults.macroPref($0, SpacesToShowPreference.allCases) } }
static var screensToShow: [ScreensToShowPreference] { ["screensToShow", "screensToShow2"].map { defaults.macroPref($0, ScreensToShowPreference.allCases) } }
static var showMinimizedWindows: [ShowHowPreference] { ["showMinimizedWindows", "showMinimizedWindows2"].map { defaults.macroPref($0, ShowHowPreference.allCases) } }
static var showHiddenWindows: [ShowHowPreference] { ["showHiddenWindows", "showHiddenWindows2"].map { defaults.macroPref($0, ShowHowPreference.allCases) } }
static var showFullscreenWindows: [ShowHowPreference] { ["showFullscreenWindows", "showFullscreenWindows2"].map { defaults.macroPref($0, ShowHowPreference.allCases) } }
static var shortcutStyle: [ShortcutStylePreference] { ["shortcutStyle", "shortcutStyle2"].map { defaults.macroPref($0, ShortcutStylePreference.allCases) } }
static var appsToShow: [AppsToShowPreference] { ["appsToShow", "appsToShow2", "appsToShow3", "appsToShow4", "appsToShow5"].map { defaults.macroPref($0, AppsToShowPreference.allCases) } }
static var spacesToShow: [SpacesToShowPreference] { ["spacesToShow", "spacesToShow2", "spacesToShow3", "spacesToShow4", "spacesToShow5"].map { defaults.macroPref($0, SpacesToShowPreference.allCases) } }
static var screensToShow: [ScreensToShowPreference] { ["screensToShow", "screensToShow2", "screensToShow3", "screensToShow4", "screensToShow5"].map { defaults.macroPref($0, ScreensToShowPreference.allCases) } }
static var showMinimizedWindows: [ShowHowPreference] { ["showMinimizedWindows", "showMinimizedWindows2", "showMinimizedWindows3", "showMinimizedWindows4", "showMinimizedWindows5"].map { defaults.macroPref($0, ShowHowPreference.allCases) } }
static var showHiddenWindows: [ShowHowPreference] { ["showHiddenWindows", "showHiddenWindows2", "showHiddenWindows3", "showHiddenWindows4", "showHiddenWindows5"].map { defaults.macroPref($0, ShowHowPreference.allCases) } }
static var showFullscreenWindows: [ShowHowPreference] { ["showFullscreenWindows", "showFullscreenWindows2", "showFullscreenWindows3", "showFullscreenWindows4", "showFullscreenWindows5"].map { defaults.macroPref($0, ShowHowPreference.allCases) } }
static var shortcutStyle: [ShortcutStylePreference] { ["shortcutStyle", "shortcutStyle2", "shortcutStyle3", "shortcutStyle4", "shortcutStyle5"].map { defaults.macroPref($0, ShortcutStylePreference.allCases) } }
static var menubarIcon: MenubarIconPreference { defaults.macroPref("menubarIcon", MenubarIconPreference.allCases) }
// derived values
@@ -137,7 +164,7 @@ class Preferences {
static func removeCorruptedPreferences() {
// from v5.1.0+, there are crash reports of users somehow having their hold shortcuts set to ""
["holdShortcut", "holdShortcut2"].forEach {
["holdShortcut", "holdShortcut2", "holdShortcut3", "holdShortcut4", "holdShortcut5"].forEach {
if let s = defaults.string(forKey: $0), s == "" {
defaults.removeObject(forKey: $0)
}
@@ -373,6 +400,15 @@ class Preferences {
static func jsonEncode<T>(_ value: T) -> String where T: Encodable {
return String(data: try! JSONEncoder().encode(value), encoding: .utf8)!
}
static func indexToName(_ baseName: String, _ index: Int) -> String {
return baseName + (index == 0 ? "" : String(index + 1))
}
static func nameToIndex(_ name: String) -> Int {
guard let number = name.last?.wholeNumberValue else { return 0 }
return number - 1
}
}
// workaround to silence compiler warning
+8 -2
View File
@@ -10,8 +10,14 @@ class KeyboardEvents {
static let globalShortcutsIds = [
"nextWindowShortcut": 0,
"nextWindowShortcut2": 1,
"holdShortcut": 2,
"holdShortcut2": 3,
"nextWindowShortcut3": 2,
"nextWindowShortcut4": 3,
"nextWindowShortcut5": 4,
"holdShortcut": 5,
"holdShortcut2": 6,
"holdShortcut3": 7,
"holdShortcut4": 8,
"holdShortcut5": 9,
]
static var eventHotKeyRefs = [String: EventHotKeyRef?]()
static var hotKeyPressedEventHandler: EventHandlerRef?
@@ -86,15 +86,14 @@ class CustomRecorderControl: RecorderControl, RecorderControlDelegate {
return false
}
if (id.starts(with: "holdShortcut") && $0.id.starts(with: "holdShortcut") || (id.starts(with: "nextWindowShortcut")) && $0.id.starts(with: "nextWindowShortcut")) {
let index = id.last == "2" ? 1 : 0
let otherIndex = id.last == "2" ? 0 : 1
let otherSuffix = id.last == "2" ? "" : "2"
let index = Preferences.nameToIndex(id)
let otherIndex = Preferences.nameToIndex($0.id)
if id.starts(with: "holdShortcut") {
return Preferences.nextWindowShortcut[index] == Preferences.nextWindowShortcut[otherIndex] &&
shortcut.modifierFlags == ControlsTab.shortcutControls["holdShortcut" + otherSuffix]!.0.objectValue!.modifierFlags
shortcut.modifierFlags == ControlsTab.shortcutControls[Preferences.indexToName("holdShortcut", otherIndex)]!.0.objectValue!.modifierFlags
}
if id.starts(with: "nextWindowShortcut") {
if let nextWindowShortcut = ControlsTab.shortcutControls["nextWindowShortcut" + otherSuffix]?.0.objectValue {
if let nextWindowShortcut = ControlsTab.shortcutControls[Preferences.indexToName("nextWindowShortcut", otherIndex)]?.0.objectValue {
return Preferences.holdShortcut[index] == Preferences.holdShortcut[otherIndex] &&
shortcut.modifierFlags == nextWindowShortcut.modifierFlags &&
shortcut.keyCode == nextWindowShortcut.keyCode
@@ -103,8 +102,8 @@ class CustomRecorderControl: RecorderControl, RecorderControlDelegate {
}
}
if $0.id.starts(with: "nextWindowShortcut") {
let suffix = $0.id.last == "2" ? "2" : ""
return $0.shortcut.keyCode == shortcut.keyCode && ($0.shortcut.carbonModifierFlags ^ ControlsTab.shortcutControls["holdShortcut" + suffix]!.0.objectValue!.carbonModifierFlags) == shortcut.carbonModifierFlags
let index = Preferences.nameToIndex($0.id)
return $0.shortcut.keyCode == shortcut.keyCode && ($0.shortcut.carbonModifierFlags ^ ControlsTab.shortcutControls[Preferences.indexToName("holdShortcut", index)]!.0.objectValue!.carbonModifierFlags) == shortcut.carbonModifierFlags
}
return $0.shortcut.keyCode == shortcut.keyCode && $0.shortcut.modifierFlags == shortcut.modifierFlags
}
@@ -7,9 +7,15 @@ class ControlsTab {
static var shortcutsActions = [
"holdShortcut": { App.app.focusTarget() },
"holdShortcut2": { App.app.focusTarget() },
"holdShortcut3": { App.app.focusTarget() },
"holdShortcut4": { App.app.focusTarget() },
"holdShortcut5": { App.app.focusTarget() },
"focusWindowShortcut": { App.app.focusTarget() },
"nextWindowShortcut": { App.app.showUiOrCycleSelection(0) },
"nextWindowShortcut2": { App.app.showUiOrCycleSelection(1) },
"nextWindowShortcut3": { App.app.showUiOrCycleSelection(2) },
"nextWindowShortcut4": { App.app.showUiOrCycleSelection(3) },
"nextWindowShortcut5": { App.app.showUiOrCycleSelection(4) },
"previousWindowShortcut": { App.app.previousWindowShortcutWithRepeatingKey() },
"→": { App.app.cycleSelection(.right) },
"←": { App.app.cycleSelection(.left) },
@@ -41,14 +47,23 @@ class ControlsTab {
let miscCheckboxes = StackView([StackView(enableCursorFollowFocus)], .vertical)
let shortcuts = StackView([focusWindowShortcut, previousWindowShortcut, cancelShortcut, closeWindowShortcut, minDeminWindowShortcut, quitAppShortcut, hideShowAppShortcut].map { (view: [NSView]) in StackView(view) }, .vertical)
let orPress = LabelAndControl.makeLabel(NSLocalizedString("While open, press:", comment: ""), shouldFit: false)
let (holdShortcut, nextWindowShortcut, tab1View) = toShowSection("")
let (holdShortcut2, nextWindowShortcut2, tab2View) = toShowSection("2")
let tabView = TabView([(NSLocalizedString("Shortcut 1", comment: ""), tab1View), (NSLocalizedString("Shortcut 2", comment: ""), tab2View)])
let (holdShortcut, nextWindowShortcut, tab1View) = toShowSection(0)
let (holdShortcut2, nextWindowShortcut2, tab2View) = toShowSection(1)
let (holdShortcut3, nextWindowShortcut3, tab3View) = toShowSection(2)
let (holdShortcut4, nextWindowShortcut4, tab4View) = toShowSection(3)
let (holdShortcut5, nextWindowShortcut5, tab5View) = toShowSection(4)
let tabView = TabView([
(NSLocalizedString("Shortcut 1", comment: ""), tab1View),
(NSLocalizedString("Shortcut 2", comment: ""), tab2View),
(NSLocalizedString("Shortcut 3", comment: ""), tab3View),
(NSLocalizedString("Shortcut 4", comment: ""), tab4View),
(NSLocalizedString("Shortcut 5", comment: ""), tab5View),
])
ControlsTab.arrowKeysEnabledCallback(arrowKeysCheckbox)
// trigger shortcutChanged for these shortcuts to trigger .restrictModifiers
[holdShortcut, holdShortcut2].forEach { ControlsTab.shortcutChangedCallback($0[1] as! NSControl) }
[nextWindowShortcut, nextWindowShortcut2].forEach { ControlsTab.shortcutChangedCallback($0[0] as! NSControl) }
[holdShortcut, holdShortcut2, holdShortcut3, holdShortcut4, holdShortcut5].forEach { ControlsTab.shortcutChangedCallback($0[1] as! NSControl) }
[nextWindowShortcut, nextWindowShortcut2, nextWindowShortcut3, nextWindowShortcut4, nextWindowShortcut5].forEach { ControlsTab.shortcutChangedCallback($0[0] as! NSControl) }
let grid = GridView([
[tabView],
@@ -75,24 +90,24 @@ class ControlsTab {
return grid
}
private static func toShowSection(_ postfix: String) -> ([NSView], [NSView], GridView) {
private static func toShowSection(_ index: Int) -> ([NSView], [NSView], GridView) {
let toShowExplanations = LabelAndControl.makeLabel(NSLocalizedString("Show windows from:", comment: ""))
let toShowExplanations2 = LabelAndControl.makeLabel(NSLocalizedString("Minimized windows:", comment: ""))
let toShowExplanations3 = LabelAndControl.makeLabel(NSLocalizedString("Hidden windows:", comment: ""))
let toShowExplanations4 = LabelAndControl.makeLabel(NSLocalizedString("Fullscreen windows:", comment: ""))
var holdShortcut = LabelAndControl.makeLabelWithRecorder(NSLocalizedString("Hold", comment: ""), "holdShortcut" + postfix, Preferences.holdShortcut[postfix == "" ? 0 : 1], false, labelPosition: .leftWithoutSeparator)
var holdShortcut = LabelAndControl.makeLabelWithRecorder(NSLocalizedString("Hold", comment: ""), Preferences.indexToName("holdShortcut", index), Preferences.holdShortcut[index], false, labelPosition: .leftWithoutSeparator)
holdShortcut.append(LabelAndControl.makeLabel(NSLocalizedString("and press:", comment: "")))
let holdAndPress = StackView(holdShortcut)
let appsToShow = LabelAndControl.makeDropdown("appsToShow" + postfix, AppsToShowPreference.allCases)
let spacesToShow = LabelAndControl.makeDropdown("spacesToShow" + postfix, SpacesToShowPreference.allCases)
let screensToShow = LabelAndControl.makeDropdown("screensToShow" + postfix, ScreensToShowPreference.allCases)
let showMinimizedWindows = LabelAndControl.makeDropdown("showMinimizedWindows" + postfix, ShowHowPreference.allCases)
let showHiddenWindows = LabelAndControl.makeDropdown("showHiddenWindows" + postfix, ShowHowPreference.allCases)
let showFullscreenWindows = LabelAndControl.makeDropdown("showFullscreenWindows" + postfix, ShowHowPreference.allCases.filter { $0 != .showAtTheEnd })
let appsToShow = LabelAndControl.makeDropdown(Preferences.indexToName("appsToShow", index), AppsToShowPreference.allCases)
let spacesToShow = LabelAndControl.makeDropdown(Preferences.indexToName("spacesToShow", index), SpacesToShowPreference.allCases)
let screensToShow = LabelAndControl.makeDropdown(Preferences.indexToName("screensToShow", index), ScreensToShowPreference.allCases)
let showMinimizedWindows = LabelAndControl.makeDropdown(Preferences.indexToName("showMinimizedWindows", index), ShowHowPreference.allCases)
let showHiddenWindows = LabelAndControl.makeDropdown(Preferences.indexToName("showHiddenWindows", index), ShowHowPreference.allCases)
let showFullscreenWindows = LabelAndControl.makeDropdown(Preferences.indexToName("showFullscreenWindows", index), ShowHowPreference.allCases.filter { $0 != .showAtTheEnd })
let separator = NSBox()
separator.boxType = .separator
let nextWindowShortcut = LabelAndControl.makeLabelWithRecorder(NSLocalizedString("Select next window", comment: ""), "nextWindowShortcut" + postfix, Preferences.nextWindowShortcut[postfix == "" ? 0 : 1], labelPosition: .right)
let shortcutStyle = LabelAndControl.makeLabelWithDropdown(NSLocalizedString("Then release:", comment: ""), "shortcutStyle" + postfix, ShortcutStylePreference.allCases)
let nextWindowShortcut = LabelAndControl.makeLabelWithRecorder(NSLocalizedString("Select next window", comment: ""), Preferences.indexToName("nextWindowShortcut", index), Preferences.nextWindowShortcut[index], labelPosition: .right)
let shortcutStyle = LabelAndControl.makeLabelWithDropdown(NSLocalizedString("Then release:", comment: ""), Preferences.indexToName("shortcutStyle", index), ShortcutStylePreference.allCases)
let toShowDropdowns = StackView([appsToShow, spacesToShow, screensToShow], .vertical, false)
toShowDropdowns.spacing = TabView.padding
toShowDropdowns.fit()
@@ -135,9 +150,9 @@ class ControlsTab {
@objc static func shortcutChangedCallback(_ sender: NSControl) {
let controlId = sender.identifier!.rawValue
if controlId.hasPrefix("holdShortcut") {
let i = controlId == "holdShortcut" ? 0 : 1
let i = Preferences.nameToIndex(controlId)
addShortcut(.up, .global, Shortcut(keyEquivalent: Preferences.holdShortcut[i])!, controlId, i)
if let nextWindowShortcut = shortcutControls["nextWindowShortcut" + (i == 0 ? "" : "2")]?.0 {
if let nextWindowShortcut = shortcutControls[Preferences.indexToName("nextWindowShortcut", i)]?.0 {
nextWindowShortcut.restrictModifiers([(sender as! CustomRecorderControl).objectValue!.modifierFlags])
shortcutChangedCallback(nextWindowShortcut)
}
@@ -147,7 +162,7 @@ class ControlsTab {
removeShortcutIfExists(controlId)
restrictModifiersOfHoldShortcut(controlId, [])
} else {
let i = controlId.hasPrefix("nextWindowShortcut") ? (controlId == "nextWindowShortcut" ? 0 : 1) : nil
let i = controlId.hasPrefix("nextWindowShortcut") ? Preferences.nameToIndex(controlId) : nil
addShortcut(.down, controlId.hasPrefix("nextWindowShortcut") ? .global : .local, Shortcut(keyEquivalent: newValue)!, controlId, i)
restrictModifiersOfHoldShortcut(controlId, [(sender as! CustomRecorderControl).objectValue!.modifierFlags])
}
@@ -156,8 +171,8 @@ class ControlsTab {
private static func restrictModifiersOfHoldShortcut(_ controlId: String, _ modifiers: NSEvent.ModifierFlags) {
if controlId.hasPrefix("nextWindowShortcut") {
let i = controlId == "nextWindowShortcut" ? "" : "2"
if let holdShortcut = shortcutControls["holdShortcut" + i]?.0 {
let i = Preferences.nameToIndex(controlId)
if let holdShortcut = shortcutControls[Preferences.indexToName("holdShortcut", i)]?.0 {
holdShortcut.restrictModifiers(modifiers)
}
}
@@ -169,7 +184,7 @@ class ControlsTab {
return ""
}
if controlId.starts(with: "nextWindowShortcut") {
let holdShortcut = controlId.last == "2" ? Preferences.holdShortcut[1] : Preferences.holdShortcut[0]
let holdShortcut = Preferences.holdShortcut[Preferences.nameToIndex(controlId)]
return holdShortcut + baseValue
}
return baseValue