feat: swipes can now be horizontal or vertical (closes #4020)

swipe recognition has also been improved in many ways
This commit is contained in:
lwouis committed 2024-12-27 00:33:05 +01:00
1 parent db5500f130
commit fda3ada055
55 files changed
+416 -150

No files matched your search

+12 -6
View File
@@ -235,6 +235,12 @@
/* No comment provided by engineer. */
"Hold" = "Hold";
/* No comment provided by engineer. */
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
/* No comment provided by engineer. */
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
/* No comment provided by engineer. */
"I think the app could be improved with…" = "I think the app could be improved with…";
@@ -478,12 +484,6 @@
/* Menubar option */
"Support this project ❤️" = "Support this project ❤️";
/* No comment provided by engineer. */
"Swipe with Four Fingers" = "Swipe with Four Fingers";
/* No comment provided by engineer. */
"Swipe with Three Fingers" = "Swipe with Three Fingers";
/* No comment provided by engineer. */
"Switch between 3 different styles. You can customize them." = "Switch between 3 different styles. You can customize them.";
@@ -532,6 +532,12 @@
/* No comment provided by engineer. */
"Version" = "Version";
/* No comment provided by engineer. */
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
/* No comment provided by engineer. */
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
/* No comment provided by engineer. */
"View existing discussions" = "View existing discussions";
@@ -96,6 +96,8 @@
"High" = "عالي";
"Highest" = "أعلى";
"Hold" = "ثبّت";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "أعتقد أنه بالإمكان تطوير البرنامج بـ…";
"Ignore shortcuts when active" = "تجاهل الاختصارات عند النشاط";
"Ignore shortcuts while a window from these apps is active" = "لا تفعّل الإختصارات عندما تكون نافذة من أحد هذه التطبيقات مفعّلة";
@@ -219,6 +221,8 @@
"Updates policy:" = "سياسة التحديثات:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "الإصدار";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "أنظر للنقاشات الحالية";
"Vim keys" = "مفاتيح Vim";
"Vim keys already assigned to other actions:\n%@" = "مفاتيح Vim المعينة بالفعل لإجراءات أخرى: \\\n%@";
@@ -96,6 +96,8 @@
"High" = "Високо";
"Highest" = "Най -високо";
"Hold" = "Със задръжане на";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Предлагам подобрение на приложението...";
"Ignore shortcuts when active" = "Игнорирай клавишни комбинации, когато е активно";
"Ignore shortcuts while a window from these apps is active" = "Игнорирай шорткъта в следните приложения:";
@@ -219,6 +221,8 @@
"Updates policy:" = "Политика за обновяване:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Версия";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Виж дискусиите";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "VIM клавиши, които вече са присвоени на други действия: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "উচ্চ";
"Highest" = "সর্বোচ্চ";
"Hold" = "ধরে রাখ";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "আমি মনে করি অ্যাপটি আরো উন্নত করা যেতে পারে...";
"Ignore shortcuts when active" = "সক্রিয় থাকাকালীন শর্টকাট উপেক্ষা করুন";
"Ignore shortcuts while a window from these apps is active" = "এই অ্যাপগুলির একটি উইন্ডো সক্রিয় থাকাকালীন শর্টকাটগুলি উপেক্ষা করুন৷";
@@ -219,6 +221,8 @@
"Updates policy:" = "আপডেট নীতি:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "সংস্করণ";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "বিদ্যমান আলোচনা দেখুন";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "ভিম কীগুলি ইতিমধ্যে অন্যান্য ক্রিয়াকলাপে নির্ধারিত: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "Alt";
"Highest" = "Més alt";
"Hold" = "Mantenir";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Crec que l'aplicació milloraria si…";
"Ignore shortcuts when active" = "Ignorar dreceres quan està activa";
"Ignore shortcuts while a window from these apps is active" = "Ignorar dreceres si una finestra d'aquestes aplicacions està activa";
@@ -219,6 +221,8 @@
"Updates policy:" = "Política d'actualitzacions:";
"Use the app without this permission. Thumbnails won’t show." = "Fer servir l'Alt-Tab sense aquest permís. No es mostraran les miniatures.";
"Version" = "Versió";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Veure discussions en curs";
"Vim keys" = "Tecles de Vim";
"Vim keys already assigned to other actions:\n%@" = "Tecles de Vim ja en ús:\n%@";
@@ -96,6 +96,8 @@
"High" = "Vysoký";
"Highest" = "Nejvyšší";
"Hold" = "Podržet";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Myslím, že aplikace by mohla být vylepšena tak, že...";
"Ignore shortcuts when active" = "Ignorujte zkratky, když jsou aktivní";
"Ignore shortcuts while a window from these apps is active" = "Ignorovat klávesové zkratky, když jsou aktivní okna následujících programů";
@@ -219,6 +221,8 @@
"Updates policy:" = "Kontrola aktualizací:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Verze";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Zobrazit existující diskuse";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Klávesy Vim již přiřazené k jiným akcím: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "Høj";
"Highest" = "Højest";
"Hold" = "Hold";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Jeg synes appen kunne forbedres med...";
"Ignore shortcuts when active" = "Ignorer genveje når aktiv";
"Ignore shortcuts while a window from these apps is active" = "Ignorer genveje imens et vindue fra disse apps er aktiv";
@@ -219,6 +221,8 @@
"Updates policy:" = "Opdaterings-politik:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Version";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Vis eksisterende diskussioner";
"Vim keys" = "Vim taster";
"Vim keys already assigned to other actions:\n%@" = "Vim taster allerede tildelt til andre funktioner: %@";
@@ -96,6 +96,8 @@
"High" = "Hoch";
"Highest" = "Höchste";
"Hold" = "Halten";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Ich denke, die Anwendung könnte wie folgt verbessert werden…";
"Ignore shortcuts when active" = "Kurzbefehle ignorieren, wenn aktiv";
"Ignore shortcuts while a window from these apps is active" = "Kurzbefehle ignorieren, wenn ein Fenster dieser App aktiv ist";
@@ -219,6 +221,8 @@
"Updates policy:" = "Richtlinie für Aktualisierungen:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Version";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Bestehende Vorschläge anzeigen";
"Vim keys" = "Vim-Tastenbelegung";
"Vim keys already assigned to other actions:\n%@" = "VIM-Tasten, die bereits anderen Aktionen zugewiesen sind:\n%@";
@@ -96,6 +96,8 @@
"High" = "Υψηλή";
"Highest" = "Μέγιστη";
"Hold" = "Κρατήστε πατημένο";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Πιστεύω ότι η εφαρμογή θα μπορούσε να βελτιωθεί με...";
"Ignore shortcuts when active" = "Αγνόησε τις συντομεύσεις όταν ενεργό";
"Ignore shortcuts while a window from these apps is active" = "Να αγνοούνται οι συντομεύσεις ενόσω κάποιο παράθυρο από αυτές τις εφαρμογές είναι ενεργό";
@@ -219,6 +221,8 @@
"Updates policy:" = "Πολιτική ενημερώσεων:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Έκδοση";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Εμφάνιση υπαρχουσών συζητήσεων";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Vim keys που έχουν ήδη ανατεθεί σε άλλες ενέργειες: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "High";
"Highest" = "Highest";
"Hold" = "Hold";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "I think the app could be improved with…";
"Ignore shortcuts when active" = "Ignore shortcuts when active";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Updates policy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Version";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "View existing discussions";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Vim keys already assigned to other actions:\n%@";
@@ -96,6 +96,8 @@
"High" = "High";
"Highest" = "El más alto";
"Hold" = "Mantener";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Creo que la aplicación podría mejorarse con…";
"Ignore shortcuts when active" = "Ignora los atajos al activarse";
"Ignore shortcuts while a window from these apps is active" = "Ignorar atajos mientras una ventana de estas aplicaciones está activa";
@@ -219,6 +221,8 @@
"Updates policy:" = "Política de actualizaciones:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versión";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Ver discusiones existentes";
"Vim keys" = "Teclas Vim";
"Vim keys already assigned to other actions:\n%@" = "Teclas Vim ya asignadas a otras acciones:\n%@";
@@ -96,6 +96,8 @@
"High" = "Kõrge";
"Highest" = "Kõrgeim";
"Hold" = "Hoia";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "I think the app could be improved with…";
"Ignore shortcuts when active" = "Ignoreeri otseteid aktiivselt";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Updates policy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Version";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "View existing discussions";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "VIM võtmed on juba muude toimingute jaoks määratud: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "عالی";
"Highest" = "بالاترین";
"Hold" = "نگه داشتن";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "من گمان می‌کنم این نرم‌افزار می‌تواند بهتر شود به طریق...";
"Ignore shortcuts when active" = "Ignore shortcuts when active";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Updates policy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "نسخه";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "بحث های موجود را مشاهده کنید";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "کلیدهای VIM قبلاً به اقدامات دیگر اختصاص داده شده اند: \\ n ٪@";
@@ -96,6 +96,8 @@
"High" = "Korkea";
"Highest" = "Korkein";
"Hold" = "Pidä";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Ohjelmaa voisi mielestäni parantaa…";
"Ignore shortcuts when active" = "Sivuuta pikanäppäimet, kun aktiivinen";
"Ignore shortcuts while a window from these apps is active" = "Älä käsittele pikanäppäimiä näiden ohjelmien ollessa aktiivisia";
@@ -219,6 +221,8 @@
"Updates policy:" = "Päivityskäytäntö:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versio";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Näytä keskustelut";
"Vim keys" = "Vim-näppäimet";
"Vim keys already assigned to other actions:\n%@" = "Vim-näppäimet on jo määritetty toisiin toimintoihin:\n%@";
@@ -96,6 +96,8 @@
"High" = "Haut";
"Highest" = "Le plus élevé";
"Hold" = "Maintenir";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Je pense que AltTab pourrait être améliorée avec…";
"Ignore shortcuts when active" = "Ignorer les raccourcis à l'activation";
"Ignore shortcuts while a window from these apps is active" = "Ignorer les raccourcis si une fenêtre de ces Apps est active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Politique de mise à jour :";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Version";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Voir les discussions existantes";
"Vim keys" = "Commandes Vim";
"Vim keys already assigned to other actions:\n%@" = "Commande Vim déjà affectée à\n%@";
@@ -96,6 +96,8 @@
"High" = "Ard";
"Highest" = "Is airde";
"Hold" = "Coinnigh";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Ceapaim go bhféadfaí an aip a fheabhsú le…";
"Ignore shortcuts when active" = "Déan neamhaird de aicearraí agus tú gníomhach";
"Ignore shortcuts while a window from these apps is active" = "Déan neamhaird de aicearraí agus fuinneog ó na haipeanna seo gníomhach";
@@ -219,6 +221,8 @@
"Updates policy:" = "Polasaí nuashonraithe:";
"Use the app without this permission. Thumbnails won’t show." = "Bain úsáid as an aip gan an cead seo. Ní thaispeánfar mionsamhlacha.";
"Version" = "Leagan";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Féach ar an bplé atá ann cheana féin";
"Vim keys" = "Eochracha Vim";
"Vim keys already assigned to other actions:\n%@" = "Eochracha Vim sannta cheana féin do ghníomhartha eile:\n%@";
@@ -96,6 +96,8 @@
"High" = "Alto";
"Highest" = "Máis alto";
"Hold" = "Manter";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Acho que a aplicación podría mellorarse con...";
"Ignore shortcuts when active" = "Ignore os atallos cando están activos";
"Ignore shortcuts while a window from these apps is active" = "Ignorar atallos mentras unha ventá destas aplicacións estea activa";
@@ -219,6 +221,8 @@
"Updates policy:" = "Política de actualizacións:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versión";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Ver discusións existentes";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "VIM teclas xa asignadas a outras accións: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "גָבוֹהַ";
"Highest" = "הֲכִי גָבוֹהַ";
"Hold" = "החזק";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "אני חושב שניתן לשפר את היישום באמצעות…";
"Ignore shortcuts when active" = "התעלם מהקיצורים כאשר פועל";
"Ignore shortcuts while a window from these apps is active" = "התעלם מקיצורי דרך כאשר חלון מיישום זו פעיל";
@@ -219,6 +221,8 @@
"Updates policy:" = "מדיניות עדכונים:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "גרסה";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "הצג דיונים קיימים";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Vim Keys כבר הוקצה לפעולות אחרות: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "उच्च";
"Highest" = "उच्चतम";
"Hold" = "दबाए रखें";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "मुझे लगता है कि इससे ऐप को बेहतर बनाया जा सकता है...";
"Ignore shortcuts when active" = "सक्रिय होने पर शॉर्टकट को अनदेखा करें";
"Ignore shortcuts while a window from these apps is active" = "इन ऐप्स की खिड़की सक्रिय होने पर शॉर्टकट पर ध्यान न दें";
@@ -219,6 +221,8 @@
"Updates policy:" = "अपडेट नीति:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "संस्करण";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "मौजूदा वाद-विवाद दिखाओ";
"Vim keys" = "विम कीयों";
"Vim keys already assigned to other actions:\n%@" = "Vim कीज़ पहले से ही अन्य कार्यों को सौंपा गया: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "Visok";
"Highest" = "Najviši";
"Hold" = "Zadržati";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Mislim da bi se aplikacija mogla poboljšati ...";
"Ignore shortcuts when active" = "Zanemarite prečace kada su aktivni";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Updates policy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Verzija";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Pogledajte postojeće rasprave";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "VIM ključevi već dodijeljeni drugim radnjama: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "Magas";
"Highest" = "Legmagasabb";
"Hold" = "Tart";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Azt gondolom hasznos lenne az app bővítése ezzel…";
"Ignore shortcuts when active" = "Hagyja figyelmen kívül a parancsokat ha";
"Ignore shortcuts while a window from these apps is active" = "Figyelmen kívül hagyja a parancsikonokat, miközben ezeknek az alkalmazásoknak az ablaka aktív";
@@ -219,6 +221,8 @@
"Updates policy:" = "Frissítési beállítások:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Verzió";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Aktuális beszélgetések megtekintése";
"Vim keys" = "VIM billentyűk";
"Vim keys already assigned to other actions:\n%@" = "VIM bill. már hozzárendelt más műveletekhez: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "Tinggi";
"Highest" = "Paling tinggi";
"Hold" = "Tahan";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Saya pikir aplikasi dapat ditingkatkan dengan…";
"Ignore shortcuts when active" = "Abaikan pintasan saat aktif";
"Ignore shortcuts while a window from these apps is active" = "Abaikan pintasan saat jendela dari aplikasi ini aktif";
@@ -219,6 +221,8 @@
"Updates policy:" = "Kebijakan pembaruan:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versi";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Lihat diskusi yang ada";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Kunci vim yang sudah ditetapkan untuk tindakan lain: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "High";
"Highest" = "Hæst";
"Hold" = "Halda inni";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Ég tel að forritið gæti orðið betra með";
"Ignore shortcuts when active" = "Hunsa flýtileiðir þegar forrit keyrir";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Uppfærslustefna:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Útgáfa";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Sjá umræður";
"Vim keys" = "Vim lyklar";
"Vim keys already assigned to other actions:\n%@" = "Vim lyklar nú þegar skráðir á aðrar virknir";
@@ -96,6 +96,8 @@
"High" = "Alto";
"Highest" = "Massimo";
"Hold" = "Tieni premuto";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Invia un suggerimento…";
"Ignore shortcuts when active" = "Ignora comandi rapidi quando attiva";
"Ignore shortcuts while a window from these apps is active" = "Ignora i comandi rapidi quando una finestra di queste app è attiva";
@@ -219,6 +221,8 @@
"Updates policy:" = "Aggiornamenti:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versione";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Visualizza discussioni esistenti";
"Vim keys" = "Tasti Vim";
"Vim keys already assigned to other actions:\n%@" = "I tasti Vim sono già assegnati ad altre azioni:\n%@";
@@ -96,6 +96,8 @@
"High" = "高い";
"Highest" = "最高";
"Hold" = " ";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "アプリの◯◯を改善したい…";
"Ignore shortcuts when active" = "アクティブの間はショートカットを無効にする";
"Ignore shortcuts while a window from these apps is active" = "これらのアプリのウィンドウがアクティブの間はショートカットを無効にする";
@@ -219,6 +221,8 @@
"Updates policy:" = "アップデートポリシー:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "バージョン";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "既存のディスカッションを見る";
"Vim keys" = "Vimのキーバインド";
"Vim keys already assigned to other actions:\n%@" = "他のアクションに割り当てられているVimキー:%@";
@@ -96,6 +96,8 @@
"High" = "High";
"Highest" = "Highest";
"Hold" = "ಹಿಡಿ";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "ತoತ್ರಾಂಶವನ್ನು ಹೀಗೆ ಸುಧಾರಿಸಬಹುದೆಂದು ನನ್ನ ಅನಿಸಿಕೆ…";
"Ignore shortcuts when active" = "Ignore shortcuts when active";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "ನವೀಕರಣ ನೀತಿ:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "ಆವೃತ್ತಿ";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಚರ್ಚೆಗಳನ್ನು ನೋಡಿ";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Vim keys already assigned to other actions:\n%@";
@@ -96,6 +96,8 @@
"High" = "높음";
"Highest" = "가장 높음";
"Hold" = " ";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "이 앱의 개선안은…";
"Ignore shortcuts when active" = "단축키 무시";
"Ignore shortcuts while a window from these apps is active" = "다음 앱들이 활성화되면 단축키를 무시합니다";
@@ -219,6 +221,8 @@
"Updates policy:" = "업데이트 정책:";
"Use the app without this permission. Thumbnails won’t show." = "권한 없이 앱을 사용합니다. 썸네일이 표시되지 않습니다.";
"Version" = "버전";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "진행중인 논의 보기";
"Vim keys" = "Vim 키";
"Vim keys already assigned to other actions:\n%@" = "Vim 키들은 다음과 같이 배정되어 있습니다:\n%@";
@@ -96,6 +96,8 @@
"High" = "Bilind";
"Highest" = "Bilindahî";
"Hold" = "Pêbigre";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Li gorî min sepên dikari bi ... ve bê geşandin.";
"Ignore shortcuts when active" = "Dema ku çalak bibe kurteyên kurt bikin";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Polîtikaya Geşandinê";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versîyon";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Niqaşên heyî bibînin";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Bişkojkên VIM berê ji bo kiryarên din hatine veqetandin: \\ N% @";
@@ -96,6 +96,8 @@
"High" = "Héichheet";
"Highest" = "Héchst";
"Hold" = "Bäihalen";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Ech mengen d'App kéint verbessert ginn mat ...";
"Ignore shortcuts when active" = "Ignoréieren Ofkiirzungen wann aktiv";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Updates policy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versioun";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Kuckt existent Diskussiounen";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Vim Schlësselen déi scho fir aner Aktiounen zougewisen hunn: \\ n% @";
@@ -96,6 +96,8 @@
"High" = "High";
"Highest" = "Highest";
"Hold" = "Hold";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "I think the app could be improved with…";
"Ignore shortcuts when active" = "Ignore shortcuts when active";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Updates policy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Version";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "View existing discussions";
"Vim keys" = "വിം കീകൾ";
"Vim keys already assigned to other actions:\n%@" = "Vim keys already assigned to other actions:\n%@";
@@ -96,6 +96,8 @@
"High" = "High";
"Highest" = "Highest";
"Hold" = "Hold";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Jeg synes appen kunne vært forbedret med…";
"Ignore shortcuts when active" = "Ignorer snarvei når aktiv";
"Ignore shortcuts while a window from these apps is active" = "Ignorér hurtigtaster mens et vindu fra disse appene er aktivt";
@@ -219,6 +221,8 @@
"Updates policy:" = "Oppdateringspolicy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versjon";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Se eksisterende diskusjoner";
"Vim keys" = "Vim-taster";
"Vim keys already assigned to other actions:\n%@" = "Vim-taster er allerede gitt til andre handlinger:\n%@";
@@ -96,6 +96,8 @@
"High" = "Hoog";
"Highest" = "Hoogst";
"Hold" = "Houd";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Ik denk dat het programma verbeterd kan worden door…";
"Ignore shortcuts when active" = "Negeer snelkoppeling wanneer actief";
"Ignore shortcuts while a window from these apps is active" = "Negeer snelkoppeling als één van deze vensters actief is";
@@ -219,6 +221,8 @@
"Updates policy:" = "Updatebeleid:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versie";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Bekijk bestaande discussies";
"Vim keys" = "Vim toetsen";
"Vim keys already assigned to other actions:\n%@" = "Vim toetsen al toegewezen aan andere acties:\n%@";
@@ -96,6 +96,8 @@
"High" = "High";
"Highest" = "Highest";
"Hold" = "Hald";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Eg tykkjer appen kunne ha vorte betre med…";
"Ignore shortcuts when active" = "Ignorer snarveg når aktiv";
"Ignore shortcuts while a window from these apps is active" = "Ignorer hurtigtastar medan eit vindauge frå desse appane er aktivt";
@@ -219,6 +221,8 @@
"Updates policy:" = "Oppdateringsinnstillingar:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versjon";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Sjå pågåande diskusjonar";
"Vim keys" = "Vim-tastar";
"Vim keys already assigned to other actions:\n%@" = "Vim-tastar er allereie gjevne til andre handlingar:\n%@";
@@ -96,6 +96,8 @@
"High" = "Wysoki";
"Highest" = "Najwyższy";
"Hold" = "Przytrzymaj";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Myślę, że aplikacja może zostać ulepszona dzięki…";
"Ignore shortcuts when active" = "Ignoruj skrót gdy aktywny";
"Ignore shortcuts while a window from these apps is active" = "Ignoruj skróty podczas gdy jedna z tych aplikacji jest aktywna";
@@ -219,6 +221,8 @@
"Updates policy:" = "Zasady aktualizacji:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Wersja";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Wyświetl istniejące dyskusje";
"Vim keys" = "Klawisze Vim";
"Vim keys already assigned to other actions:\n%@" = "Klawisze Vim są już przyporządkowane to innych akcji: %@";
@@ -96,6 +96,8 @@
"High" = "High";
"Highest" = "Highest";
"Hold" = "Segurar";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Eu acho que a aplicação poderia ser melhorada com…";
"Ignore shortcuts when active" = "Ignorar atalhos quando ativo";
"Ignore shortcuts while a window from these apps is active" = "Ignorar atalhos enquanto uma janela destes aplicativos estiver ativa";
@@ -219,6 +221,8 @@
"Updates policy:" = "Política de atualizações:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versão";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Ver discussões existentes";
"Vim keys" = "Teclas Vim";
"Vim keys already assigned to other actions:\n%@" = "Teclas Vim já atribuídas a outras ações:\n%@";
@@ -96,6 +96,8 @@
"High" = "Alta";
"Highest" = "Mais alta";
"Hold" = "Segurar";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Eu acho que a aplicação poderia ser melhorada se…";
"Ignore shortcuts when active" = "Ignorar atalhos enquanto activo";
"Ignore shortcuts while a window from these apps is active" = "Ignorar atalhos sempre que uma destas janelas esteja activa";
@@ -219,6 +221,8 @@
"Updates policy:" = "Regras de actualização:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versão";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Ver discussões existentes";
"Vim keys" = "Teclas Vim";
"Vim keys already assigned to other actions:\n%@" = "Teclas Vim já se encontram associadas a outras acções:\n%@";
@@ -96,6 +96,8 @@
"High" = "Ridicat";
"Highest" = "Cel mai înalt";
"Hold" = "Reține";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Cred că aplicația poate fi îmbunătățită prin…";
"Ignore shortcuts when active" = "Ignoră scurtăturile când este activ";
"Ignore shortcuts while a window from these apps is active" = "Ignoră scurtăturile cât timp o fereastră din aceste aplicații este activă";
@@ -219,6 +221,8 @@
"Updates policy:" = "Politică actualizări:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versiune";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Vezi discuții existente";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Tastele vim deja alocate altor acțiuni: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "Высокая";
"Highest" = "Высшая";
"Hold" = "Удерживать";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Я думаю, что приложение может быть улучшено…";
"Ignore shortcuts when active" = "Игнорировать комбинации, когда активно";
"Ignore shortcuts while a window from these apps is active" = "Игнорировать комбинации клавиш пока окно приложения из этого списка активно";
@@ -219,6 +221,8 @@
"Updates policy:" = "Правило обновлений:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Версия";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Посмотреть обсуждения";
"Vim keys" = "Vim клавиши";
"Vim keys already assigned to other actions:\n%@" = "Vim клавиши уже назначены на другие действия:\n%@";
@@ -96,6 +96,8 @@
"High" = "Vysoký";
"Highest" = "Najvyšší";
"Hold" = "Držať";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Myslím si, že by aplikácia mohla byť nasledovne vylepšená…";
"Ignore shortcuts when active" = "Ignorujte skratky, keď sú aktívne";
"Ignore shortcuts while a window from these apps is active" = "Ignorovať skratky, kým je aktívne okno niektorej z týchto aplikácií";
@@ -219,6 +221,8 @@
"Updates policy:" = "Pravidlá aktualizácií:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Verzia";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Zobraziť prebiehajúce diskusie";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Vim Keys už priradené k iným akciám: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "Visok";
"Highest" = "Najvišji";
"Hold" = "Pridži";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Menim, da bi lahko aplikacijo izboljšali z…";
"Ignore shortcuts when active" = "Ignorirajte bližnjice, ko je aktivna";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Politika posodobitev:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Verzija";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Oglej si obstoječe debate";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Vim Keys je že dodeljen drugim dejanjem: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "I lartë";
"Highest" = "Më i lartë";
"Hold" = "Mbaj";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Mendoj se aplikacioni mund të përmirësohet me…";
"Ignore shortcuts when active" = "Injoroni shkurtesat kur janë aktive";
"Ignore shortcuts while a window from these apps is active" = "Injoro shkurtesat kur një dritare nga këto aplikacione është aktive";
@@ -219,6 +221,8 @@
"Updates policy:" = "Politika e përditësimit:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Verzioni";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Shfaq diskutimet egzistuese";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Çelësat vim tashmë të caktuar për veprime të tjera: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "Високо";
"Highest" = "Највиши";
"Hold" = "Zadrži";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Smatram da bi se aplikacija mogla unaprediti tako što…";
"Ignore shortcuts when active" = "Ignoriši prečice za vreme aktivnosti";
"Ignore shortcuts while a window from these apps is active" = "Ignoriši prečice dok je prozor ovih aplikacija aktivan";
@@ -219,6 +221,8 @@
"Updates policy:" = "Polisa ažuriranja:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Verzija";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Vidi postojeće diskusije";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "ВиМ кључеви који су већ додељени другим акцијама: \\ н% @";
@@ -96,6 +96,8 @@
"High" = "Hög";
"Highest" = "Högsta";
"Hold" = "Håll ned";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Jag tycker att appen kan förbättras genom…";
"Ignore shortcuts when active" = "Ignorera kortkommandon när aktiv";
"Ignore shortcuts while a window from these apps is active" = "Ignorera kortkommandon när dessa appars fönster är aktiva";
@@ -219,6 +221,8 @@
"Updates policy:" = "Uppdateringspolicy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Version";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Visa befintliga diskussioner";
"Vim keys" = "Vim-tangenter";
"Vim keys already assigned to other actions:\n%@" = "Vim-tangenter används redan för följande:\n%@";
@@ -96,6 +96,8 @@
"High" = "உயர்ந்த";
"Highest" = "அதிகபட்சம்";
"Hold" = "பிடி";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "பயன்பாட்டை மேம்படுத்த முடியும் என்று நினைக்கிறேன்…";
"Ignore shortcuts when active" = "செயலில் இருக்கும்போது குறுக்குவழிகளை புறக்கணிக்கவும்";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Updates policy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "பதிப்பு";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "தற்போதுள்ள விவாதங்களைக் காண்க";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "மற்ற செயல்களுக்கு ஏற்கனவே ஒதுக்கப்பட்ட VIM விசைகள்: \\ n%@";
@@ -96,6 +96,8 @@
"High" = "สูง";
"Highest" = "มากที่สุด";
"Hold" = "กดค้าง";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "ฉันคิดว่าควรปรับปรุง...";
"Ignore shortcuts when active" = "ไม่ใช้คำสั่งลัดเมื่อใช้งาน";
"Ignore shortcuts while a window from these apps is active" = "ไม่ต้องใช้คำสั่งลัดขณะที่หน้าต่างจากแอปเหล่านี้ทํางานอยู่";
@@ -219,6 +221,8 @@
"Updates policy:" = "นโยบายอัพเดท:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "หมายเลขรุ่น";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "ดูการพูดคุย";
"Vim keys" = "ปุ่ม Vim";
"Vim keys already assigned to other actions:\n%@" = "ปุ่ม Vim ถูกกําหนดให้กับการดําเนินการอื่นแล้ว: \n%@";
@@ -96,6 +96,8 @@
"High" = "Yüksek";
"Highest" = "En yüksek";
"Hold" = "Tut";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Bence uygulama şu şekilde iyileştirilebilir…";
"Ignore shortcuts when active" = "Etkinken kestirmeleri yoksay";
"Ignore shortcuts while a window from these apps is active" = "Bu uygulamalardan bir pencere etkinken kestirmeleri devre dışı bırak";
@@ -219,6 +221,8 @@
"Updates policy:" = "Güncelleme politikası:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versiyon";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Mevcut tartışmaları görüntüle";
"Vim keys" = "Vim tuşları";
"Vim keys already assigned to other actions:\n%@" = "Diğer eylemlere hâlihazırda atanmış Vim tuşları:\n%@";
@@ -96,6 +96,8 @@
"High" = "Високий";
"Highest" = "Найвищий";
"Hold" = "Утримання";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Я думаю додаток може бути покращено з...";
"Ignore shortcuts when active" = "Ігнорувати хоткей допоки активне";
"Ignore shortcuts while a window from these apps is active" = "Ігнорувати ярлики поки вікна цих програм активні";
@@ -219,6 +221,8 @@
"Updates policy:" = "Політика оновлень:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Версія";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Переглянути наявні обговорення";
"Vim keys" = "Клавіші Vim";
"Vim keys already assigned to other actions:\n%@" = "Клавіші Vim уже призначені для інших дій:\n%@";
@@ -96,6 +96,8 @@
"High" = "Baland";
"Highest" = "Eng yuqori";
"Hold" = "Ushlab turmoq";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Menimcha, ilova yaxshilanishi mumkin ...";
"Ignore shortcuts when active" = "Faol bo'lganda yorliqlarni e'tiborsiz qoldiring";
"Ignore shortcuts while a window from these apps is active" = "Ignore shortcuts while a window from these apps is active";
@@ -219,6 +221,8 @@
"Updates policy:" = "Updates policy:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Versiya";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Mavjud munozarani ko'rish";
"Vim keys" = "Vim keys";
"Vim keys already assigned to other actions:\n%@" = "Boshqa harakatlar uchun tayinlangan Vim kalitlari: \\ n% @";
@@ -96,6 +96,8 @@
"High" = "Cao";
"Highest" = "Cao nhất";
"Hold" = "Giữ";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "Tôi nghĩ app có thể được cải thiện về mặt...";
"Ignore shortcuts when active" = "Bỏ qua phím tắt khi hoạt động";
"Ignore shortcuts while a window from these apps is active" = "Bỏ qua phím tắt khi một cửa sổ trong các ứng dụng sau đang bật";
@@ -219,6 +221,8 @@
"Updates policy:" = "Các chính sách cập nhật:";
"Use the app without this permission. Thumbnails won’t show." = "Use the app without this permission. Thumbnails won’t show.";
"Version" = "Phiên bản";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "Xem các cuộc thảo luận đã có";
"Vim keys" = "Tổ hợp phím Vim";
"Vim keys already assigned to other actions:\n%@" = "Tổ hợp phím Vim đã được đặt cho hành động khác: \n%@";
@@ -96,6 +96,8 @@
"High" = "高";
"Highest" = "最高";
"Hold" = "按住";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "我认为该应用程序可以这样改进…";
"Ignore shortcuts when active" = "活跃时忽略快捷键";
"Ignore shortcuts while a window from these apps is active" = "这些应用程序的窗口处于活动状态时,忽略快捷键";
@@ -219,6 +221,8 @@
"Updates policy:" = "更新方式:";
"Use the app without this permission. Thumbnails won’t show." = "如果不授予此权限,预览图不会展示。";
"Version" = "版本";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "查看现有讨论";
"Vim keys" = "Vim 快捷键";
"Vim keys already assigned to other actions:\n%@" = "Vim键已分配到其他动作:%@";
@@ -96,6 +96,8 @@
"High" = "高";
"Highest" = "最高";
"Hold" = "按住";
"Horizontal Swipe with Four Fingers" = "Horizontal Swipe with Four Fingers";
"Horizontal Swipe with Three Fingers" = "Horizontal Swipe with Three Fingers";
"I think the app could be improved with…" = "我覺得這個程式可以改善⋯";
"Ignore shortcuts when active" = "活躍時忽略快速鍵";
"Ignore shortcuts while a window from these apps is active" = "當這些程式的視窗活躍時,忽略快速鍵";
@@ -219,6 +221,8 @@
"Updates policy:" = "更新策略:";
"Use the app without this permission. Thumbnails won’t show." = "繼續使用但不授權這個權限。將不會顯示縮圖。";
"Version" = "版本";
"Vertical Swipe with Four Fingers" = "Vertical Swipe with Four Fingers";
"Vertical Swipe with Three Fingers" = "Vertical Swipe with Three Fingers";
"View existing discussions" = "查看目前的討論";
"Vim keys" = "Vim 快速鍵";
"Vim keys already assigned to other actions:\n%@" = "Vim 快速鍵已經被其它操作佔用:\n%@";
+14
View File
@@ -247,3 +247,17 @@ class ModifierFlags {
return NSEvent.modifierFlags
}
}
extension NSPoint {
static func + (lhs: NSPoint, rhs: NSPoint) -> NSPoint {
return NSPoint(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
}
static func - (lhs: NSPoint, rhs: NSPoint) -> NSPoint {
return NSPoint(x: lhs.x - rhs.x, y: lhs.y - rhs.y)
}
static func / (lhs: NSPoint, rhs: Int) -> NSPoint {
return NSPoint(x: lhs.x / Double(rhs), y: lhs.y / Double(rhs))
}
}
+57 -29
View File
@@ -203,31 +203,34 @@ class Preferences {
private static func updateToNewPreferences(_ versionInPlist: String) {
// x.compare(y) is .orderedDescending if x > y
if versionInPlist.compare("7.8.0", options: .numeric) != .orderedDescending {
migrateMenubarIconWithNewShownToggle()
if versionInPlist.compare("7.0.0", options: .numeric) != .orderedDescending {
migratePreferencesIndexes()
if versionInPlist.compare("6.43.0", options: .numeric) != .orderedDescending {
migrateBlacklists()
if versionInPlist.compare("6.28.1", options: .numeric) != .orderedDescending {
migrateMinMaxWindowsWidthInRow()
if versionInPlist.compare("6.27.1", options: .numeric) != .orderedDescending {
// "Start at login" new implem doesn't use Login Items; we remove the entry from previous versions
(Preferences.self as AvoidDeprecationWarnings.Type).migrateLoginItem()
if versionInPlist.compare("6.23.0", options: .numeric) != .orderedDescending {
// "Show windows from:" got the "Active Space" option removed
migrateShowWindowsFrom()
if versionInPlist.compare("6.18.1", options: .numeric) != .orderedDescending {
// nextWindowShortcut used to be able to have modifiers already present in holdShortcut; we remove these
migrateNextWindowShortcuts()
// dropdowns preferences used to store English text; now they store indexes
migrateDropdownsFromTextToIndexes()
// the "Hide menubar icon" checkbox was replaced with a dropdown of: icon1, icon2, hidden
migrateMenubarIconFromCheckboxToDropdown()
// "Show minimized/hidden/fullscreen windows" checkboxes were replaced with dropdowns
migrateShowWindowsCheckboxToDropdown()
// "Max size on screen" was split into max width and max height
migrateMaxSizeOnScreenToWidthAndHeight()
if versionInPlist.compare("7.13.1", options: .numeric) != .orderedDescending {
migrateGestures()
if versionInPlist.compare("7.8.0", options: .numeric) != .orderedDescending {
migrateMenubarIconWithNewShownToggle()
if versionInPlist.compare("7.0.0", options: .numeric) != .orderedDescending {
migratePreferencesIndexes()
if versionInPlist.compare("6.43.0", options: .numeric) != .orderedDescending {
migrateBlacklists()
if versionInPlist.compare("6.28.1", options: .numeric) != .orderedDescending {
migrateMinMaxWindowsWidthInRow()
if versionInPlist.compare("6.27.1", options: .numeric) != .orderedDescending {
// "Start at login" new implem doesn't use Login Items; we remove the entry from previous versions
(Preferences.self as AvoidDeprecationWarnings.Type).migrateLoginItem()
if versionInPlist.compare("6.23.0", options: .numeric) != .orderedDescending {
// "Show windows from:" got the "Active Space" option removed
migrateShowWindowsFrom()
if versionInPlist.compare("6.18.1", options: .numeric) != .orderedDescending {
// nextWindowShortcut used to be able to have modifiers already present in holdShortcut; we remove these
migrateNextWindowShortcuts()
// dropdowns preferences used to store English text; now they store indexes
migrateDropdownsFromTextToIndexes()
// the "Hide menubar icon" checkbox was replaced with a dropdown of: icon1, icon2, hidden
migrateMenubarIconFromCheckboxToDropdown()
// "Show minimized/hidden/fullscreen windows" checkboxes were replaced with dropdowns
migrateShowWindowsCheckboxToDropdown()
// "Max size on screen" was split into max width and max height
migrateMaxSizeOnScreenToWidthAndHeight()
}
}
}
}
@@ -237,6 +240,19 @@ class Preferences {
}
}
// we split gestures from disabled, 3-finger, 4-finger to: disabled, 3-finger-horizontal, 3-finger-vertical, 4-finger-horizontal, 4-finger-vertical
// no need to map 0 -> 0 (disabled -> disabled)
// no need to map 1 -> 1 (3-finger -> 3-finger-horizontal)
// we need to map 2 -> 3 (4-finger -> 4-finger-horizontal)
private static func migrateGestures() {
if let old = UserDefaults.standard.string(forKey: "nextWindowGesture") {
if old == "2" { // 2 (4-finger) -> 3 (4-finger-horizontal)
UserDefaults.standard.set("3", forKey: "nextWindowGesture")
}
}
}
// we added the new menubarIconShown toggle. It replaces menubarIcon having value "3" which would hide the icon
// there are now 2 preferences : menubarIconShown is a boolean, and menubarIcon has values 0, 1, 2
private static func migrateMenubarIconWithNewShownToggle() {
@@ -506,16 +522,28 @@ enum MenubarIconPreference: CaseIterable, MacroPreference {
enum GesturePreference: CaseIterable, MacroPreference {
case disabled
case threeFingerSwipe
case fourFingerSwipe
case threeFingerHorizontalSwipe
case threeFingerVerticalSwipe
case fourFingerHorizontalSwipe
case fourFingerVerticalSwipe
var localizedString: LocalizedString {
switch self {
case .disabled: return NSLocalizedString("Disabled", comment: "")
case .threeFingerSwipe: return NSLocalizedString("Swipe with Three Fingers", comment: "")
case .fourFingerSwipe: return NSLocalizedString("Swipe with Four Fingers", comment: "")
case .threeFingerHorizontalSwipe: return NSLocalizedString("Horizontal Swipe with Three Fingers", comment: "")
case .threeFingerVerticalSwipe: return NSLocalizedString("Vertical Swipe with Three Fingers", comment: "")
case .fourFingerHorizontalSwipe: return NSLocalizedString("Horizontal Swipe with Four Fingers", comment: "")
case .fourFingerVerticalSwipe: return NSLocalizedString("Vertical Swipe with Four Fingers", comment: "")
}
}
func isHorizontal() -> Bool {
return self == .threeFingerHorizontalSwipe || self == .fourFingerHorizontalSwipe
}
func isThreeFinger() -> Bool {
return self == .threeFingerHorizontalSwipe || self == .threeFingerVerticalSwipe
}
}
enum LanguagePreference: CaseIterable, MacroPreference {
+1 -1
View File
@@ -183,7 +183,7 @@ class Windows {
let nextIndex = windowIndexAfterCycling(step)
// don't wrap-around at the end, if key-repeat
if (((step > 0 && nextIndex < focusedWindowIndex) || (step < 0 && nextIndex > focusedWindowIndex)) &&
(ATShortcut.lastEventIsARepeat || KeyRepeatTimer.timer?.isValid ?? false))
(!allowWrap || ATShortcut.lastEventIsARepeat || KeyRepeatTimer.timer?.isValid ?? false))
// don't cycle to another row, if !allowWrap
|| (!allowWrap && list[nextIndex].rowIndex != list[focusedWindowIndex].rowIndex) {
return
+132 -114
View File
@@ -3,16 +3,7 @@ import Cocoa
fileprivate var eventTap: CFMachPort!
fileprivate var shouldBeEnabled: Bool!
//TODO: Should we add a sensitivity setting instead of these magic numbers?
fileprivate let SHOW_UI_THRESHOLD: Float = 0.003
fileprivate let CYCLE_THRESHOLD: Float = 0.04
// gesture tracking state
fileprivate var prevTouchPositions: [String: NSPoint] = [:]
fileprivate var totalDisplacement = Distance(x: 0, y: 0)
fileprivate var extendNextXThreshold = false
//TODO: underlying content scrolls if both Mission Control and App Expose use 4-finger swipes or are off in Trackpad settings. It doesn't scroll if any of them use 3-finger swipe though.
// TODO: underlying content scrolls if both Mission Control and App Expose use 4-finger swipes or are off in Trackpad settings. It doesn't scroll if any of them use 3-finger swipe though.
class TrackpadEvents {
static func observe() {
observe_()
@@ -30,12 +21,12 @@ class TrackpadEvents {
private func observe_() {
// CGEvent.tapCreate returns null if ensureAccessibilityCheckboxIsChecked() didn't pass
eventTap = CGEvent.tapCreate(
tap: .cghidEventTap, // we need raw data
place: .headInsertEventTap,
options: .defaultTap,
eventsOfInterest: NSEvent.EventTypeMask.gesture.rawValue,
callback: handleEvent,
userInfo: nil)
tap: .cghidEventTap, // we need raw data
place: .headInsertEventTap,
options: .defaultTap,
eventsOfInterest: NSEvent.EventTypeMask.gesture.rawValue,
callback: handleEvent,
userInfo: nil)
if let eventTap = eventTap {
let runLoopSource = CFMachPortCreateRunLoopSource(nil, eventTap, 0)
CFRunLoopAddSource(BackgroundWork.keyboardEventsThread.runLoop, runLoopSource, .commonModes)
@@ -56,124 +47,151 @@ private let handleEvent: CGEventTapCallBack = { _, type, cgEvent, _ in
}
private func touchEventHandler(_ cgEvent: CGEvent) -> Bool {
var nsEvent: NSEvent?
DispatchQueue.main.sync {
nsEvent = NSEvent(cgEvent: cgEvent)
}
guard let nsEvent = nsEvent else { return false }
guard let nsEvent = GestureDetector.convertEvent(cgEvent) else { return false }
// if the finger count doesn't match, we reset tracking data, and may trigger fingersUp
let touches = nsEvent.allTouches()
// Sometimes there are empty touch events that we have to skip. There are no empty touch events if Mission Control or App Expose use 3-finger swipes though.
if touches.isEmpty { return false }
let requiredFingers = Preferences.nextWindowGesture == .fourFingerSwipe ? 4 : 3
if touches.allSatisfy({ $0.phase == .ended }) || touches.count != requiredFingers {
clearState()
return checkForFingersUp(touches, requiredFingers)
if touches.count == 0 { return false } // sometimes the os sends events with no touches
let activeTouches = touches.filter { !$0.isResting && ($0.phase == .began || $0.phase == .moved || $0.phase == .stationary) }
let requiredFingers = Preferences.nextWindowGesture.isThreeFinger() ? 3 : 4
if touches.count != requiredFingers {
TriggerSwipeDetector.reset()
NavigationSwipeDetector.reset()
return GestureDetector.checkForFingersUp(activeTouches, requiredFingers)
}
if #available(macOS 10.13, *) {
// simulate mouseWheel-stopped to end potential existing scrolling started before AltTab was opened
// this avoid the swipe to trigger a scroll on the active window and show AltTab, at the same time
CGEvent(scrollWheelEvent2Source: nil, units: .pixel, wheelCount: 1, wheel1: 0, wheel2: 0, wheel3: 0)?
.post(tap: .cghidEventTap)
}
guard let delta = calculateTouchDelta(touches) else { return false }
let displacement = Distance(x: totalDisplacement.x + delta.x, y: totalDisplacement.y + delta.y)
totalDisplacement = displacement
if let r = checkForSwipeTrigger(displacement) { return r }
if let r = checkForSwipeHorizontalCycling(displacement) { return r }
if let r = checkForSwipeVerticalCycling(displacement) { return r }
return false
}
private func checkForFingersUp(_ touches: Set<NSTouch>, _ requiredFingers: Int) -> Bool {
if App.app.appIsBeingUsed && touches.count < requiredFingers && App.app.shortcutIndex == Preferences.gestureIndex
&& Preferences.shortcutStyle[App.app.shortcutIndex] == .focusOnRelease {
DispatchQueue.main.async { App.app.focusTarget() }
return true
// when the native using 3-finger swipe to shift Space, macOS will block scrolling in the background
// We imitate this behavior by sending a synthetic scrollWheel event
GestureDetector.blockOngoingScrolling()
// trigger actions if conditions are met
if App.app.appIsBeingUsed {
if !GestureDetector.updateStartPositions(touches, &NavigationSwipeDetector.startPositions) {
if let r = NavigationSwipeDetector.check(touches) { return r }
}
} else {
if !GestureDetector.updateStartPositions(touches, &TriggerSwipeDetector.startPositions) {
if let r = TriggerSwipeDetector.check(touches) { return r }
}
}
return false
}
private func checkForSwipeTrigger(_ displacement: Distance) -> Bool? {
if !App.app.appIsBeingUsed {
if abs(displacement.x) > SHOW_UI_THRESHOLD || abs(displacement.y) > SHOW_UI_THRESHOLD {
totalDisplacement.x = 0
totalDisplacement.y = 0
// the SHOW_UI_THRESHOLD is much less then the CYCLE_THRESHOLD
// so for consistency when swiping, extend the threshold for the next horizontal swipe
extendNextXThreshold = true
DispatchQueue.main.async { App.app.showUiOrCycleSelection(Preferences.gestureIndex) }
class GestureDetector {
static func convertEvent(_ cgEvent: CGEvent) -> NSEvent? {
var nsEvent: NSEvent?
// convertion has to happen on the main-thread, or appkit will crash
DispatchQueue.main.sync {
nsEvent = NSEvent(cgEvent: cgEvent)
}
return nsEvent
}
static func checkForFingersUp(_ touches: Set<NSTouch>, _ requiredFingers: Int) -> Bool {
if App.app.appIsBeingUsed && touches.count < requiredFingers && App.app.shortcutIndex == Preferences.gestureIndex
&& Preferences.shortcutStyle[App.app.shortcutIndex] == .focusOnRelease {
DispatchQueue.main.async { App.app.focusTarget() }
return true
}
return false
}
return nil
}
private func checkForSwipeHorizontalCycling(_ displacement: Distance) -> Bool? {
if abs(displacement.x) > CYCLE_THRESHOLD {
// if extendNextXThreshold is set, extend the threshold for a right swipe to account for the show ui swipe
if !extendNextXThreshold || displacement.x < 0 || displacement.x > 2 * CYCLE_THRESHOLD - SHOW_UI_THRESHOLD {
totalDisplacement.x = 0
extendNextXThreshold = false
DispatchQueue.main.async { App.app.cycleSelection(displacement.x < 0 ? .left : .right, allowWrap: false) }
static func updateStartPositions(_ activeTouches: Set<NSTouch>, _ startPositions: inout [String: NSPoint]) -> Bool {
// if touches are new, record their startPositions
if (activeTouches.contains { startPositions["\($0.identity)"] == nil }) {
for touch in activeTouches {
startPositions["\(touch.identity)"] = touch.normalizedPosition
}
return true
}
return false
}
return nil
}
private func checkForSwipeVerticalCycling(_ displacement: Distance) -> Bool? {
if abs(displacement.y) > CYCLE_THRESHOLD {
totalDisplacement.y = 0
DispatchQueue.main.async { App.app.cycleSelection(displacement.y < 0 ? .down : .up, allowWrap: false) }
return true
}
return nil
}
private func calculateTouchDelta(_ touches: Set<NSTouch>) -> Distance? {
var allRight = true
var allLeft = true
var allUp = true
var allDown = true
var sumDelta = Distance(x: 0, y: 0)
var count = 0
for touch in touches {
let prevPosition = prevTouchPositions["\(touch.identity)"]
let position = touch.normalizedPosition
if touch.phase == .ended {
prevTouchPositions.removeValue(forKey: "\(touch.identity)")
} else {
prevTouchPositions["\(touch.identity)"] = position
static func computeAverageDistance(_ activeTouches: Set<NSTouch>, _ startPositions: [String: NSPoint]) -> NSPoint {
var totalDelta = NSPoint(x: 0, y: 0)
for touch in activeTouches {
totalDelta = totalDelta + (touch.normalizedPosition - startPositions["\(touch.identity)"]!)
}
if prevPosition == nil { continue }
let delta = Distance(x: Float(position.x - prevPosition!.x), y: Float(position.y - prevPosition!.y))
allRight = allRight && delta.x > 0
allLeft = allLeft && delta.x < 0
allUp = allUp && delta.y > 0
allDown = allDown && delta.y < 0
sumDelta.x += delta.x
sumDelta.y += delta.y
count += 1
return totalDelta / activeTouches.count
}
// All fingers should move in the same direction.
if count == 0 || (!allRight && !allLeft && !allUp && !allDown) { return nil }
return Distance(x: sumDelta.x / Float(count), y: sumDelta.y / Float(count))
static func blockOngoingScrolling() {
if #available(macOS 10.13, *) {
// simulate mouseWheel-stopped to end potential existing scrolling started before AltTab was opened
// this avoid the swipe to trigger a scroll on the active window and show AltTab, at the same time
CGEvent(scrollWheelEvent2Source: nil, units: .pixel, wheelCount: 1, wheel1: 0, wheel2: 0, wheel3: 0)?
.post(tap: .cghidEventTap)
}
}
}
private func clearState() {
prevTouchPositions.removeAll(keepingCapacity: true)
totalDisplacement.x = 0
totalDisplacement.y = 0
extendNextXThreshold = false
class TriggerSwipeDetector {
// when the native using 3-finger swipe to shift Space, macOS will wait that a small distance is traveled before acting
// We imitate this behavior
static let MIN_SWIPE_DISTANCE: Double = 0.015 // % of trackpad surface traveled
// when the native using 3-finger swipe to shift Space, macOS will prevent a swipe until the fingers are raised,
// if the user moves too much in the vertical direction. We imitate this behavior
static let MAX_SWIPE_DISTANCE_IN_WRONG_DIRECTION: Double = 0.1 // % of trackpad surface traveled
static var startPositions: [String: NSPoint] = [:]
static var swipeStillPossible = true
static func check(_ activeTouches: Set<NSTouch>) -> Bool? {
if !App.app.appIsBeingUsed && swipeStillPossible {
let averageDistance = GestureDetector.computeAverageDistance(activeTouches, startPositions)
let (absX, absY) = (abs(averageDistance.x), abs(averageDistance.y))
let horizontal = Preferences.nextWindowGesture.isHorizontal()
if (updateSwipeStillPossible(horizontal ? absY : absX) && (horizontal ? absX : absY) >= MIN_SWIPE_DISTANCE) {
reset()
DispatchQueue.main.async { App.app.showUiOrCycleSelection(Preferences.gestureIndex) }
return true
}
return false
}
return nil
}
static func updateSwipeStillPossible(_ distanceInWrongDirection: Double) -> Bool {
swipeStillPossible = distanceInWrongDirection < MAX_SWIPE_DISTANCE_IN_WRONG_DIRECTION
return swipeStillPossible
}
static func reset() {
startPositions.removeAll(keepingCapacity: true)
swipeStillPossible = true
}
}
struct Distance {
var x: Float
var y: Float
class NavigationSwipeDetector {
// TODO: replace this approach with a "virtual cursor" approach
// Instead of detecting swipes, we would track coordinate, and check which thumbnail is under that cursor
static let MIN_SWIPE_DISTANCE: Double = 0.045 // % of trackpad surface traveled
static var startPositions: [String: NSPoint] = [:]
static func check(_ touches: Set<NSTouch>) -> Bool? {
let averageDistance = GestureDetector.computeAverageDistance(touches, startPositions)
let (absX, absY) = (abs(averageDistance.x), abs(averageDistance.y))
let maxIsX = absX >= absY
if (maxIsX ? absX : absY) > MIN_SWIPE_DISTANCE {
maxIsX ? resetX(touches) : resetY(touches)
let direction: Direction = maxIsX ? (averageDistance.x < 0 ? .left : .right) : (averageDistance.y < 0 ? .down : .up)
DispatchQueue.main.async { App.app.cycleSelection(direction, allowWrap: false) }
return true
}
return nil
}
static func reset() {
startPositions.removeAll(keepingCapacity: true)
}
static func resetX(_ activeTouches: Set<NSTouch>) {
for touch in activeTouches {
startPositions["\(touch.identity)"]!.x = touch.normalizedPosition.x
}
}
static func resetY(_ activeTouches: Set<NSTouch>) {
for touch in activeTouches {
startPositions["\(touch.identity)"]!.y = touch.normalizedPosition.y
}
}
}