fix: only show screen recording callout when it's needed (closes #5623)
This commit is contained in:
1 parent
a39816e303
commit
9a9994bf28
29 files changed
+340
-26
No files matched your search
@@ -297,6 +297,9 @@
|
||||
D04BADA3F2DAB820D6FC6E75 /* AppCenterApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = D04BA48BC82D3060C3A1AB11 /* AppCenterApplication.m */; };
|
||||
6E800CF06EE430DCCF9CE47B /* ObjCExceptionCatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = E7DD4D4CA23EE28B22048CE6 /* ObjCExceptionCatcher.m */; };
|
||||
D04BADCDA9F9A6C3D6499877 /* SystemPermissions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04BA7C6F2519091717F4B4E /* SystemPermissions.swift */; };
|
||||
5F117E40000000000000F202 /* PermissionCalloutResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F117E40000000000000F201 /* PermissionCalloutResolver.swift */; };
|
||||
5F117E40000000000000F203 /* PermissionCalloutResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F117E40000000000000F201 /* PermissionCalloutResolver.swift */; };
|
||||
5F117E40000000000000F212 /* PermissionCalloutResolverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F117E40000000000000F211 /* PermissionCalloutResolverTests.swift */; };
|
||||
D04BADE4DDF7597749FB13BD /* SettingsWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04BA099FA155FB4D517D66B /* SettingsWindow.swift */; };
|
||||
D04BAE8B16A06A10E2FA94DE /* AccessibilityEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04BA8FDCF137D892114F5F3 /* AccessibilityEvents.swift */; };
|
||||
D04BAF12DF5D15B9D7D316A4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D04BA61693F710CD7BD054D7 /* InfoPlist.strings */; };
|
||||
@@ -618,6 +621,8 @@
|
||||
D04BA7957E5E02FB09BCE10C /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = de; path = InfoPlist.strings; sourceTree = "<group>"; };
|
||||
D04BA7C25BD7B68BCEEE38B5 /* en */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = en; path = Localizable.strings; sourceTree = "<group>"; };
|
||||
D04BA7C6F2519091717F4B4E /* SystemPermissions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemPermissions.swift; sourceTree = "<group>"; };
|
||||
5F117E40000000000000F201 /* PermissionCalloutResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PermissionCalloutResolver.swift; sourceTree = "<group>"; };
|
||||
5F117E40000000000000F211 /* PermissionCalloutResolverTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PermissionCalloutResolverTests.swift; sourceTree = "<group>"; };
|
||||
D04BA7C836A8CE8C0B8D128B /* TextArea.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextArea.swift; sourceTree = "<group>"; };
|
||||
D04BA7CF9C2D1BEC7C05AB24 /* Spaces.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Spaces.swift; sourceTree = "<group>"; };
|
||||
D04BA7E3EA104941FE76DA70 /* AppCenterCrashes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppCenterCrashes.swift; sourceTree = "<group>"; };
|
||||
@@ -1058,6 +1063,8 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D04BA7C6F2519091717F4B4E /* SystemPermissions.swift */,
|
||||
5F117E40000000000000F201 /* PermissionCalloutResolver.swift */,
|
||||
5F117E40000000000000F211 /* PermissionCalloutResolverTests.swift */,
|
||||
5FA001000000000000000019 /* LoginItem.swift */,
|
||||
AA0C8A000000000000000001 /* AXCallScheduler.swift */,
|
||||
D04BA5BB6FB4E7D8F7AD357C /* api-wrappers */,
|
||||
@@ -1827,6 +1834,8 @@
|
||||
5E5EA12C0000000000000102 /* SearchModeResolverTests.swift in Sources */,
|
||||
5F117E40000000000000F003 /* WindowFilterResolver.swift in Sources */,
|
||||
5F117E40000000000000F102 /* WindowFilterResolverTests.swift in Sources */,
|
||||
5F117E40000000000000F203 /* PermissionCalloutResolver.swift in Sources */,
|
||||
5F117E40000000000000F212 /* PermissionCalloutResolverTests.swift in Sources */,
|
||||
5E7C0F70000000000000E003 /* ExceptionMatcher.swift in Sources */,
|
||||
5E7C0F70000000000000E102 /* ExceptionMatcherTests.swift in Sources */,
|
||||
5E0DE2A0000000000000D003 /* WindowOrderResolver.swift in Sources */,
|
||||
@@ -1894,6 +1903,7 @@
|
||||
F00DCAFE0000000000001003 /* SearchTestable.swift in Sources */,
|
||||
D04BAC011A71E0418154F8CD /* Preferences.swift in Sources */,
|
||||
D04BADCDA9F9A6C3D6499877 /* SystemPermissions.swift in Sources */,
|
||||
5F117E40000000000000F202 /* PermissionCalloutResolver.swift in Sources */,
|
||||
D04BABEECBC6D922298BC93A /* Spaces.swift in Sources */,
|
||||
D04BA6187A91A847844B6ABB /* Window.swift in Sources */,
|
||||
5F21C9E82C6E96A00091F72F /* SheetWindow.swift in Sources */,
|
||||
|
||||
@@ -88,8 +88,8 @@
|
||||
/* No comment provided by engineer. */
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial.";
|
||||
|
||||
/* Menubar callout */
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab is running without Screen Recording permissions. Thumbnails won’t show.";
|
||||
/* Menubar callout. %@ is one or more feature names, e.g. Thumbnails */
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab is running without Screen Recording permissions. %@ won’t show.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"AltTab needs some permissions" = "AltTab needs some permissions";
|
||||
@@ -796,6 +796,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Thumbnails" = "Thumbnails";
|
||||
|
||||
/* Menubar callout subject */
|
||||
"Thumbnails and window previews" = "Thumbnails and window previews";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Title truncation" = "Title truncation";
|
||||
|
||||
@@ -898,6 +901,9 @@
|
||||
/* No comment provided by engineer. */
|
||||
"Window is on Space %d" = "Window is on Space %d";
|
||||
|
||||
/* Menubar callout subject: the preview-selected-window feature */
|
||||
"Window previews" = "Window previews";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"window switches" = "window switches";
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "ترتيب أبجدي";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "تعطّل AltTab في آخر مرة استخدمته فيها. إرسال تقرير الأعطال سيساعد في إصلاح المشكلة";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab هو مُحوّل نوافذ مجاني ومفتوح المصدر لـ macOS. تتوفر ميزات Pro مع فترة تجريبية مجانية لمدة 14 يومًا.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "يعمل AltTab بدون أذونات تسجيل الشاشة. لن تظهر المصغّرات.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "يعمل AltTab بدون أذونات تسجيل الشاشة. لن تظهر %@.";
|
||||
"AltTab needs some permissions" = "يحتاج AltTab إلى بعض الأذونات";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "يضيف AltTab Pro 4 ميزات تتجاوز المُحوّل المجاني.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "هذا الإذن مطلوب لإظهار المصغّرات ومعاينة النوافذ المفتوحة";
|
||||
"This will keep your Downloads folder uncluttered." = "سيُبقي ذلك مجلد التنزيلات مرتبًا.";
|
||||
"Thumbnails" = "المصغّرات";
|
||||
"Thumbnails and window previews" = "المصغّرات ومعاينات النوافذ";
|
||||
"Title truncation" = "اقتطاع العنوان";
|
||||
"Titles" = "العناوين";
|
||||
"Titles appearance" = "مظهر العناوين";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "النافذة مصغّرة";
|
||||
"Window is on every Space" = "النافذة في كل مساحة";
|
||||
"Window is on Space %d" = "النافذة في المساحة %d";
|
||||
"Window previews" = "معاينات النوافذ";
|
||||
"window switches" = "تبديلات النوافذ";
|
||||
"Window Title" = "عنوان النافذة";
|
||||
"Window title contains" = "عنوان النافذة يحتوي على";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Alphabetische Reihenfolge";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab ist bei der letzten Verwendung abgestürzt. Das Senden eines Absturzberichts hilft bei der Behebung des Problems";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab ist ein kostenloser, quelloffener Fensterumschalter für macOS. Pro-Funktionen sind mit einer 14-tägigen kostenlosen Testversion verfügbar.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab läuft ohne die Berechtigung für Bildschirmaufnahme. Miniaturen werden nicht angezeigt.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab läuft ohne die Berechtigung für Bildschirmaufnahme. %@ werden nicht angezeigt.";
|
||||
"AltTab needs some permissions" = "AltTab benötigt einige Berechtigungen";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro fügt 4 Funktionen über den kostenlosen Umschalter hinaus hinzu.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Diese Berechtigung wird benötigt, um Miniaturen und Vorschauen geöffneter Fenster anzuzeigen";
|
||||
"This will keep your Downloads folder uncluttered." = "So bleibt Ihr Downloads-Ordner aufgeräumt.";
|
||||
"Thumbnails" = "Miniaturen";
|
||||
"Thumbnails and window previews" = "Miniaturen und Fenstervorschauen";
|
||||
"Title truncation" = "Titelkürzung";
|
||||
"Titles" = "Titel";
|
||||
"Titles appearance" = "Darstellung Titel";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Fenster minimiert";
|
||||
"Window is on every Space" = "Fenster auf jedem Space";
|
||||
"Window is on Space %d" = "Fenster auf Space %d";
|
||||
"Window previews" = "Fenstervorschauen";
|
||||
"window switches" = "Fensterwechsel";
|
||||
"Window Title" = "Fenstertitel";
|
||||
"Window title contains" = "Fenstertitel enthält";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Alphabetical Order";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab crashed last time you used it. Sending a crash report will help get the issue fixed";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab is running without Screen Recording permissions. Thumbnails won’t show.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab is running without Screen Recording permissions. %@ won’t show.";
|
||||
"AltTab needs some permissions" = "AltTab needs some permissions";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro adds 4 features beyond the free switcher.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "This permission is needed to show thumbnails and preview of open windows";
|
||||
"This will keep your Downloads folder uncluttered." = "This will keep your Downloads folder uncluttered.";
|
||||
"Thumbnails" = "Thumbnails";
|
||||
"Thumbnails and window previews" = "Thumbnails and window previews";
|
||||
"Title truncation" = "Title truncation";
|
||||
"Titles" = "Titles";
|
||||
"Titles appearance" = "Titles appearance";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Window is minimized";
|
||||
"Window is on every Space" = "Window is on every Space";
|
||||
"Window is on Space %d" = "Window is on Space %d";
|
||||
"Window previews" = "Window previews";
|
||||
"window switches" = "window switches";
|
||||
"Window Title" = "Window Title";
|
||||
"Window title contains" = "Window title contains";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Orden alfabético";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab se cerró inesperadamente la última vez que lo usaste. Enviar un informe de problema ayudará a solucionarlo";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab es un selector de ventanas gratuito y de código abierto para macOS. Las funciones Pro están disponibles con una prueba gratuita de 14 días.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab se está ejecutando sin permisos de grabación de pantalla. No se mostrarán miniaturas.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab se está ejecutando sin permisos de grabación de pantalla. %@ no se mostrarán.";
|
||||
"AltTab needs some permissions" = "AltTab necesita algunos permisos";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro añade 4 funciones más allá del selector gratuito.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Este permiso es necesario para mostrar miniaturas y previsualizaciones de las ventanas abiertas";
|
||||
"This will keep your Downloads folder uncluttered." = "Así mantendrás tu carpeta Descargas ordenada.";
|
||||
"Thumbnails" = "Miniaturas";
|
||||
"Thumbnails and window previews" = "Miniaturas y vistas previas de ventana";
|
||||
"Title truncation" = "Truncado de títulos";
|
||||
"Titles" = "Títulos";
|
||||
"Titles appearance" = "Apariencia de Títulos";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Ventana minimizada";
|
||||
"Window is on every Space" = "Ventana en todos los Espacios";
|
||||
"Window is on Space %d" = "Ventana en el Espacio %d";
|
||||
"Window previews" = "Vistas previas de ventana";
|
||||
"window switches" = "cambios de ventana";
|
||||
"Window Title" = "Título de la ventana";
|
||||
"Window title contains" = "El título de la ventana contiene";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Ordre alphabétique";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab a planté lors de votre dernière utilisation. Envoyer un rapport de plantage aidera à résoudre le problème";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab est un sélecteur de fenêtres gratuit et open source pour macOS. Les fonctionnalités Pro sont disponibles avec un essai gratuit de 14 jours.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab fonctionne sans l'autorisation d'enregistrement de l'écran. Les vignettes ne s'afficheront pas.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab fonctionne sans l'autorisation d'enregistrement de l'écran. %@ ne s'afficheront pas.";
|
||||
"AltTab needs some permissions" = "AltTab a besoin de certaines autorisations";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro ajoute 4 fonctionnalités au sélecteur gratuit.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Cette autorisation est nécessaire pour afficher les vignettes et l'aperçu des fenêtres ouvertes";
|
||||
"This will keep your Downloads folder uncluttered." = "Cela évitera d'encombrer votre dossier Téléchargements.";
|
||||
"Thumbnails" = "Vignettes";
|
||||
"Thumbnails and window previews" = "Vignettes et aperçus de fenêtre";
|
||||
"Title truncation" = "Troncature du titre";
|
||||
"Titles" = "Titres";
|
||||
"Titles appearance" = "Apparence Titres";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Fenêtre réduite";
|
||||
"Window is on every Space" = "Fenêtre sur tous les Bureaux";
|
||||
"Window is on Space %d" = "Fenêtre sur le Bureau %d";
|
||||
"Window previews" = "Aperçus de fenêtre";
|
||||
"window switches" = "changements de fenêtre";
|
||||
"Window Title" = "Titre de fenêtre";
|
||||
"Window title contains" = "Le titre de la fenêtre contient";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "סדר אלפביתי";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab קרס בפעם האחרונה שהשתמשת בו. שליחת דיווח קריסה תסייע לתקן את הבעיה";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab הוא מחליף חלונות חינמי בקוד פתוח עבור macOS. תכונות Pro זמינות עם תקופת ניסיון חינמית של 14 יום.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab פועל ללא הרשאות הקלטת מסך. תמונות ממוזערות לא יוצגו.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab פועל ללא הרשאות הקלטת מסך. %@ לא יוצגו.";
|
||||
"AltTab needs some permissions" = "AltTab זקוק להרשאות מסוימות";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro מוסיף 4 תכונות מעבר למחליף החינמי.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "הרשאה זו נחוצה כדי להציג תמונות ממוזערות ותצוגה מקדימה של חלונות פתוחים";
|
||||
"This will keep your Downloads folder uncluttered." = "כך תיקיית ההורדות שלך תישאר מסודרת.";
|
||||
"Thumbnails" = "תמונות ממוזערות";
|
||||
"Thumbnails and window previews" = "תמונות ממוזערות ותצוגות מקדימות של חלונות";
|
||||
"Title truncation" = "קיצור כותרת";
|
||||
"Titles" = "כותרות";
|
||||
"Titles appearance" = "מראה כותרות";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "חלון ממוזער";
|
||||
"Window is on every Space" = "חלון נמצא בכל מרחב";
|
||||
"Window is on Space %d" = "חלון נמצא במרחב %d";
|
||||
"Window previews" = "תצוגות מקדימות של חלונות";
|
||||
"window switches" = "החלפות חלונות";
|
||||
"Window Title" = "כותרת חלון";
|
||||
"Window title contains" = "כותרת החלון מכילה";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Urutan Abjad";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab mengalami kerusakan saat terakhir kali Anda menggunakannya. Mengirim laporan kerusakan akan membantu memperbaiki masalah";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab adalah pengalih jendela gratis dan sumber terbuka untuk macOS. Fitur Pro tersedia dengan uji coba gratis 14 hari.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab berjalan tanpa izin Perekaman Layar. Gambar mini tidak akan ditampilkan.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab berjalan tanpa izin Perekaman Layar. %@ tidak akan ditampilkan.";
|
||||
"AltTab needs some permissions" = "AltTab memerlukan beberapa izin";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro menambahkan 4 fitur di luar pengalih gratis.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Izin ini diperlukan untuk menampilkan gambar mini dan pratinjau jendela yang terbuka";
|
||||
"This will keep your Downloads folder uncluttered." = "Ini akan menjaga folder Unduhan Anda tetap rapi.";
|
||||
"Thumbnails" = "Gambar mini";
|
||||
"Thumbnails and window previews" = "Gambar mini dan pratinjau jendela";
|
||||
"Title truncation" = "Pemotongan judul";
|
||||
"Titles" = "Judul";
|
||||
"Titles appearance" = "Tampilan Judul";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Jendela diminimalkan";
|
||||
"Window is on every Space" = "Jendela ada di setiap Ruang";
|
||||
"Window is on Space %d" = "Jendela ada di Ruang %d";
|
||||
"Window previews" = "Pratinjau jendela";
|
||||
"window switches" = "pengalihan jendela";
|
||||
"Window Title" = "Judul Jendela";
|
||||
"Window title contains" = "Judul jendela mengandung";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Ordine alfabetico";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab si è arrestato in modo anomalo l'ultima volta che l'hai usato. L'invio di un resoconto di arresti anomali aiuterà a risolvere il problema";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab è un selettore di finestre gratuito e open source per macOS. Le funzionalità Pro sono disponibili con una prova gratuita di 14 giorni.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab è in esecuzione senza i permessi di Registrazione schermo. Le miniature non verranno mostrate.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab è in esecuzione senza i permessi di Registrazione schermo. %@ non verranno mostrate.";
|
||||
"AltTab needs some permissions" = "AltTab richiede alcuni permessi";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro aggiunge 4 funzionalità oltre al selettore gratuito.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Questo permesso è necessario per mostrare miniature e anteprime delle finestre aperte";
|
||||
"This will keep your Downloads folder uncluttered." = "Così la cartella Download resterà ordinata.";
|
||||
"Thumbnails" = "Miniature";
|
||||
"Thumbnails and window previews" = "Miniature e anteprime delle finestre";
|
||||
"Title truncation" = "Troncamento del titolo";
|
||||
"Titles" = "Titoli";
|
||||
"Titles appearance" = "Aspetto Titoli";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Finestra ridotta a icona";
|
||||
"Window is on every Space" = "Finestra in ogni Spazio";
|
||||
"Window is on Space %d" = "Finestra nello Spazio %d";
|
||||
"Window previews" = "Anteprime delle finestre";
|
||||
"window switches" = "cambi di finestra";
|
||||
"Window Title" = "Titolo finestra";
|
||||
"Window title contains" = "Il titolo della finestra contiene";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "アルファベット順";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "前回の使用時に AltTab がクラッシュしました。クラッシュレポートを送信すると問題の修正に役立ちます";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab は macOS 用の無料・オープンソースのウインドウスイッチャーです。Pro 機能は 14 日間の無料トライアルで利用できます。";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab は画面収録の権限なしで動作しています。サムネイルは表示されません。";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab は画面収録の権限なしで動作しています。%@は表示されません。";
|
||||
"AltTab needs some permissions" = "AltTab にはいくつかの権限が必要です";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro は無料版に加えて 4 つの機能を追加します。";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "開いているウインドウのサムネイルとプレビューを表示するために必要な権限です";
|
||||
"This will keep your Downloads folder uncluttered." = "ダウンロードフォルダを散らからないようにできます。";
|
||||
"Thumbnails" = "サムネイル";
|
||||
"Thumbnails and window previews" = "サムネイルとウィンドウプレビュー";
|
||||
"Title truncation" = "タイトルの省略";
|
||||
"Titles" = "タイトル";
|
||||
"Titles appearance" = "タイトルの外観";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "最小化されたウインドウ";
|
||||
"Window is on every Space" = "すべての Space にあるウインドウ";
|
||||
"Window is on Space %d" = "Space %d にあるウインドウ";
|
||||
"Window previews" = "ウィンドウプレビュー";
|
||||
"window switches" = "ウインドウ切り替え";
|
||||
"Window Title" = "ウインドウタイトル";
|
||||
"Window title contains" = "ウインドウタイトルに含まれる";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "알파벳 순서";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab이 마지막 사용 시 충돌했습니다. 충돌 보고서를 보내면 문제 해결에 도움이 됩니다";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab은 macOS용 무료 오픈 소스 윈도우 전환기입니다. Pro 기능은 14일 무료 체험으로 이용할 수 있습니다.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab이 화면 녹화 권한 없이 실행 중입니다. 썸네일이 표시되지 않습니다.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab이 화면 녹화 권한 없이 실행 중입니다. %@이(가) 표시되지 않습니다.";
|
||||
"AltTab needs some permissions" = "AltTab에 몇 가지 권한이 필요합니다";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro는 무료 전환기에 4가지 기능을 추가합니다.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "열린 윈도우의 썸네일 및 미리보기를 표시하려면 이 권한이 필요합니다";
|
||||
"This will keep your Downloads folder uncluttered." = "다운로드 폴더를 깔끔하게 유지할 수 있습니다.";
|
||||
"Thumbnails" = "썸네일";
|
||||
"Thumbnails and window previews" = "썸네일 및 윈도우 미리보기";
|
||||
"Title truncation" = "제목 자르기";
|
||||
"Titles" = "제목";
|
||||
"Titles appearance" = "제목 모양";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "윈도우 최소화됨";
|
||||
"Window is on every Space" = "윈도우가 모든 Space에 있음";
|
||||
"Window is on Space %d" = "윈도우가 Space %d에 있음";
|
||||
"Window previews" = "윈도우 미리보기";
|
||||
"window switches" = "회 윈도우 전환";
|
||||
"Window Title" = "윈도우 제목";
|
||||
"Window title contains" = "윈도우 제목 포함";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Alfabetische volgorde";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab is de vorige keer gecrasht. Door een crashrapport te versturen help je het probleem op te lossen";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab is een gratis, open-source vensterwisselaar voor macOS. Pro-functies zijn beschikbaar met een gratis proefperiode van 14 dagen.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab werkt zonder toegang voor Schermopname. Miniaturen worden niet weergegeven.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab werkt zonder toegang voor Schermopname. %@ worden niet weergegeven.";
|
||||
"AltTab needs some permissions" = "AltTab heeft enkele rechten nodig";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro voegt 4 functies toe aan de gratis wisselaar.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Deze toegang is nodig om miniaturen en voorvertoningen van open vensters te tonen";
|
||||
"This will keep your Downloads folder uncluttered." = "Zo blijft je map Downloads opgeruimd.";
|
||||
"Thumbnails" = "Miniaturen";
|
||||
"Thumbnails and window previews" = "Miniaturen en venstervoorvertoningen";
|
||||
"Title truncation" = "Titel afkappen";
|
||||
"Titles" = "Titels";
|
||||
"Titles appearance" = "Weergave Titels";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Venster is geminimaliseerd";
|
||||
"Window is on every Space" = "Venster op elke Space";
|
||||
"Window is on Space %d" = "Venster op Space %d";
|
||||
"Window previews" = "Venstervoorvertoningen";
|
||||
"window switches" = "vensterwissels";
|
||||
"Window Title" = "Venstertitel";
|
||||
"Window title contains" = "Venstertitel bevat";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Kolejność alfabetyczna";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab uległ awarii podczas ostatniego użycia. Wysłanie raportu awarii pomoże naprawić problem";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab to darmowy, otwartoźródłowy przełącznik okien dla macOS. Funkcje Pro są dostępne w 14-dniowym bezpłatnym okresie próbnym.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab działa bez uprawnień do Nagrywania ekranu. Miniatury nie będą wyświetlane.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab działa bez uprawnień do Nagrywania ekranu. %@ nie będą wyświetlane.";
|
||||
"AltTab needs some permissions" = "AltTab wymaga uprawnień";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro dodaje 4 funkcje wykraczające poza darmowy przełącznik.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "To uprawnienie jest potrzebne do wyświetlania miniatur i podglądu otwartych okien";
|
||||
"This will keep your Downloads folder uncluttered." = "Dzięki temu folder Pobrane pozostanie uporządkowany.";
|
||||
"Thumbnails" = "Miniatury";
|
||||
"Thumbnails and window previews" = "Miniatury i podglądy okien";
|
||||
"Title truncation" = "Przycinanie tytułów";
|
||||
"Titles" = "Tytuły";
|
||||
"Titles appearance" = "Wygląd Tytułów";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Okno zminimalizowane";
|
||||
"Window is on every Space" = "Okno na każdej Przestrzeni";
|
||||
"Window is on Space %d" = "Okno na Przestrzeni %d";
|
||||
"Window previews" = "Podglądy okien";
|
||||
"window switches" = "przełączeń okien";
|
||||
"Window Title" = "Tytuł okna";
|
||||
"Window title contains" = "Tytuł okna zawiera";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Ordem alfabética";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "O AltTab travou na última vez em que você o usou. Enviar um relatório de falha ajudará a corrigir o problema";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "O AltTab é um seletor de janelas gratuito e de código aberto para o macOS. Os recursos Pro estão disponíveis com uma avaliação gratuita de 14 dias.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "O AltTab está em execução sem permissão de Gravação de Tela. As miniaturas não serão exibidas.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "O AltTab está em execução sem permissão de Gravação de Tela. %@ não serão exibidas.";
|
||||
"AltTab needs some permissions" = "O AltTab precisa de algumas permissões";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "O AltTab Pro adiciona 4 recursos além do seletor gratuito.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Esta permissão é necessária para mostrar miniaturas e pré-visualização das janelas abertas";
|
||||
"This will keep your Downloads folder uncluttered." = "Isso manterá sua pasta Downloads organizada.";
|
||||
"Thumbnails" = "Miniaturas";
|
||||
"Thumbnails and window previews" = "Miniaturas e pré-visualizações de janela";
|
||||
"Title truncation" = "Truncamento do título";
|
||||
"Titles" = "Títulos";
|
||||
"Titles appearance" = "Aparência dos Títulos";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Janela minimizada";
|
||||
"Window is on every Space" = "Janela em todos os Espaços";
|
||||
"Window is on Space %d" = "Janela no Espaço %d";
|
||||
"Window previews" = "Pré-visualizações de janela";
|
||||
"window switches" = "alternâncias de janela";
|
||||
"Window Title" = "Título da Janela";
|
||||
"Window title contains" = "Título da janela contém";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "По алфавиту";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "В прошлый раз AltTab завершился со сбоем. Отправка отчёта о сбое поможет устранить проблему";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab — это бесплатный переключатель окон с открытым исходным кодом для macOS. Функции Pro доступны с бесплатным 14-дневным пробным периодом.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab работает без разрешения на запись экрана. Миниатюры не будут отображаться.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab работает без разрешения на запись экрана. %@ не будут отображаться.";
|
||||
"AltTab needs some permissions" = "AltTab требуется несколько разрешений";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro добавляет 4 функции к бесплатному переключателю.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Это разрешение необходимо для показа миниатюр и предпросмотра открытых окон";
|
||||
"This will keep your Downloads folder uncluttered." = "Это позволит не загромождать папку «Загрузки».";
|
||||
"Thumbnails" = "Миниатюры";
|
||||
"Thumbnails and window previews" = "Миниатюры и превью окон";
|
||||
"Title truncation" = "Обрезка заголовков";
|
||||
"Titles" = "Заголовки";
|
||||
"Titles appearance" = "Оформление заголовков";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Окно свёрнуто";
|
||||
"Window is on every Space" = "Окно на всех пространствах";
|
||||
"Window is on Space %d" = "Окно в пространстве %d";
|
||||
"Window previews" = "Превью окон";
|
||||
"window switches" = "переключений окон";
|
||||
"Window Title" = "Заголовок окна";
|
||||
"Window title contains" = "Заголовок окна содержит";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Alfabetisk ordning";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab kraschade förra gången du använde den. Att skicka en kraschrapport hjälper till att åtgärda problemet";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab är en gratis fönsterväxlare med öppen källkod för macOS. Pro-funktioner är tillgängliga med en 14-dagars gratis provperiod.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab körs utan behörighet för Skärminspelning. Miniatyrer visas inte.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab körs utan behörighet för Skärminspelning. %@ visas inte.";
|
||||
"AltTab needs some permissions" = "AltTab behöver vissa behörigheter";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro lägger till 4 funktioner utöver den kostnadsfria växlaren.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Den här behörigheten behövs för att visa miniatyrer och förhandsvisning av öppna fönster";
|
||||
"This will keep your Downloads folder uncluttered." = "Det gör att din Hämtningar-mapp hålls i ordning.";
|
||||
"Thumbnails" = "Miniatyrer";
|
||||
"Thumbnails and window previews" = "Miniatyrer och fönsterförhandsvisningar";
|
||||
"Title truncation" = "Trunkering av titel";
|
||||
"Titles" = "Titlar";
|
||||
"Titles appearance" = "Utseende för Titlar";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Fönster minimerat";
|
||||
"Window is on every Space" = "Fönster på varje skrivbord";
|
||||
"Window is on Space %d" = "Fönster på skrivbord %d";
|
||||
"Window previews" = "Fönsterförhandsvisningar";
|
||||
"window switches" = "fönsterväxlingar";
|
||||
"Window Title" = "Fönstertitel";
|
||||
"Window title contains" = "Fönstertitel innehåller";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "เรียงตามตัวอักษร";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab ขัดข้องในการใช้งานครั้งล่าสุด การส่งรายงานการขัดข้องจะช่วยแก้ไขปัญหา";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab เป็นโปรแกรมสลับหน้าต่างฟรีและโอเพนซอร์สสำหรับ macOS คุณสมบัติ Pro มีให้ทดลองใช้งานฟรี 14 วัน";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab กำลังทำงานโดยไม่มีสิทธิ์การบันทึกหน้าจอ ภาพย่อจะไม่แสดง";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab กำลังทำงานโดยไม่มีสิทธิ์การบันทึกหน้าจอ %@จะไม่แสดง";
|
||||
"AltTab needs some permissions" = "AltTab ต้องการสิทธิ์บางอย่าง";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro เพิ่มคุณสมบัติ 4 อย่างนอกเหนือจากตัวสลับฟรี";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "ต้องการสิทธิ์นี้เพื่อแสดงภาพย่อและตัวอย่างของหน้าต่างที่เปิดอยู่";
|
||||
"This will keep your Downloads folder uncluttered." = "การทำเช่นนี้จะช่วยให้โฟลเดอร์ดาวน์โหลดของคุณไม่รก";
|
||||
"Thumbnails" = "ภาพย่อ";
|
||||
"Thumbnails and window previews" = "ภาพย่อและตัวอย่างหน้าต่าง";
|
||||
"Title truncation" = "การตัดทอนชื่อ";
|
||||
"Titles" = "ชื่อ";
|
||||
"Titles appearance" = "ลักษณะชื่อ";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "หน้าต่างถูกย่อ";
|
||||
"Window is on every Space" = "หน้าต่างอยู่บนทุกพื้นที่ทำงาน";
|
||||
"Window is on Space %d" = "หน้าต่างอยู่บนพื้นที่ทำงาน %d";
|
||||
"Window previews" = "ตัวอย่างหน้าต่าง";
|
||||
"window switches" = "การสลับหน้าต่าง";
|
||||
"Window Title" = "ชื่อหน้าต่าง";
|
||||
"Window title contains" = "ชื่อหน้าต่างมี";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Alfabetik sıra";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab en son kullandığınızda çöktü. Bir çökme raporu göndermek sorunun düzeltilmesine yardımcı olacaktır";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab, macOS için ücretsiz ve açık kaynaklı bir pencere değiştiricidir. Pro özellikleri 14 günlük ücretsiz deneme ile kullanılabilir.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab, Ekran Kaydı izinleri olmadan çalışıyor. Küçük resimler gösterilmeyecek.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab, Ekran Kaydı izinleri olmadan çalışıyor. %@ gösterilmeyecek.";
|
||||
"AltTab needs some permissions" = "AltTab’ın bazı izinlere ihtiyacı var";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro, ücretsiz değiştiriciye ek olarak 4 özellik ekler.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Bu izin, açık pencerelerin küçük resimlerini ve önizlemelerini göstermek için gerekli";
|
||||
"This will keep your Downloads folder uncluttered." = "Bu, İndirilenler klasörünüzün düzenli kalmasını sağlar.";
|
||||
"Thumbnails" = "Küçük resimler";
|
||||
"Thumbnails and window previews" = "Küçük resimler ve pencere önizlemeleri";
|
||||
"Title truncation" = "Başlık kısaltma";
|
||||
"Titles" = "Başlıklar";
|
||||
"Titles appearance" = "Başlıklar görünümü";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Pencere küçültülmüş";
|
||||
"Window is on every Space" = "Pencere her Alanda";
|
||||
"Window is on Space %d" = "Pencere %d numaralı Alanda";
|
||||
"Window previews" = "Pencere önizlemeleri";
|
||||
"window switches" = "pencere değişimi";
|
||||
"Window Title" = "Pencere Başlığı";
|
||||
"Window title contains" = "Pencere başlığı şunu içeriyor";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "Thứ tự bảng chữ cái";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab đã gặp sự cố ở lần dùng trước. Gửi báo cáo sự cố sẽ giúp khắc phục vấn đề";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab là trình chuyển đổi cửa sổ miễn phí, mã nguồn mở cho macOS. Các tính năng Pro có sẵn với bản dùng thử miễn phí 14 ngày.";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab đang chạy mà không có quyền Ghi màn hình. Hình thu nhỏ sẽ không hiển thị.";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab đang chạy mà không có quyền Ghi màn hình. %@ sẽ không hiển thị.";
|
||||
"AltTab needs some permissions" = "AltTab cần một số quyền";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro bổ sung 4 tính năng ngoài trình chuyển đổi miễn phí.";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "Quyền này cần thiết để hiển thị hình thu nhỏ và bản xem trước của các cửa sổ đang mở";
|
||||
"This will keep your Downloads folder uncluttered." = "Điều này sẽ giúp thư mục Tải về của bạn gọn gàng.";
|
||||
"Thumbnails" = "Hình thu nhỏ";
|
||||
"Thumbnails and window previews" = "Hình thu nhỏ và bản xem trước cửa sổ";
|
||||
"Title truncation" = "Cắt ngắn tiêu đề";
|
||||
"Titles" = "Tiêu đề";
|
||||
"Titles appearance" = "Giao diện Tiêu đề";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "Cửa sổ đang được thu nhỏ";
|
||||
"Window is on every Space" = "Cửa sổ ở trên mọi Không gian";
|
||||
"Window is on Space %d" = "Cửa sổ ở trên Không gian %d";
|
||||
"Window previews" = "Bản xem trước cửa sổ";
|
||||
"window switches" = "lượt chuyển cửa sổ";
|
||||
"Window Title" = "Tiêu đề cửa sổ";
|
||||
"Window title contains" = "Tiêu đề cửa sổ chứa";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "按字母顺序";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab 在您上次使用时崩溃了。发送崩溃报告有助于修复问题";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab 是一款免费、开源的 macOS 窗口切换器。Pro 功能提供 14 天免费试用。";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab 正在运行但未获得屏幕录制权限。缩略图将无法显示。";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab 正在运行但未获得屏幕录制权限。%@将无法显示。";
|
||||
"AltTab needs some permissions" = "AltTab 需要一些权限";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro 在免费切换器之外新增 4 项功能。";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "需要此权限才能显示已打开窗口的缩略图和预览";
|
||||
"This will keep your Downloads folder uncluttered." = "这样可以让您的下载文件夹保持整洁。";
|
||||
"Thumbnails" = "缩略图";
|
||||
"Thumbnails and window previews" = "缩略图和窗口预览";
|
||||
"Title truncation" = "标题截断";
|
||||
"Titles" = "标题";
|
||||
"Titles appearance" = "标题外观";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "窗口已最小化";
|
||||
"Window is on every Space" = "窗口在所有桌面上";
|
||||
"Window is on Space %d" = "窗口在桌面 %d 上";
|
||||
"Window previews" = "窗口预览";
|
||||
"window switches" = "次窗口切换";
|
||||
"Window Title" = "窗口标题";
|
||||
"Window title contains" = "窗口标题包含";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "依字母順序";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab 在您上次使用時當機。傳送當機報告有助於修復此問題";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab 是一款免費、開放原始碼的 macOS 視窗切換器。Pro 功能提供 14 天免費試用。";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab 正在執行,但未取得螢幕錄製權限。將不會顯示縮圖。";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab 正在執行,但未取得螢幕錄製權限。將不會顯示%@。";
|
||||
"AltTab needs some permissions" = "AltTab 需要一些權限";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro 在免費版切換器之上加入 4 項功能。";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "需要此權限才能顯示已開啟視窗的縮圖和預覽";
|
||||
"This will keep your Downloads folder uncluttered." = "這樣可以讓您的「下載」檔案夾保持整潔。";
|
||||
"Thumbnails" = "縮圖";
|
||||
"Thumbnails and window previews" = "縮圖和視窗預覽";
|
||||
"Title truncation" = "標題截斷";
|
||||
"Titles" = "標題";
|
||||
"Titles appearance" = "標題外觀";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "視窗已縮到最小";
|
||||
"Window is on every Space" = "視窗位於每個空間";
|
||||
"Window is on Space %d" = "視窗位於空間 %d";
|
||||
"Window previews" = "視窗預覽";
|
||||
"window switches" = "次視窗切換";
|
||||
"Window Title" = "視窗標題";
|
||||
"Window title contains" = "視窗標題包含";
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Alphabetical Order" = "字母順序";
|
||||
"AltTab crashed last time you used it. Sending a crash report will help get the issue fixed" = "AltTab 在您上次使用時當機。傳送當機報告有助於修正問題";
|
||||
"AltTab is a free, open-source window switcher for macOS. Pro features are available with a 14-day free trial." = "AltTab 是一款免費、開放原始碼的 macOS 視窗切換器。Pro 功能提供 14 天免費試用。";
|
||||
"AltTab is running without Screen Recording permissions. Thumbnails won’t show." = "AltTab 正在沒有「螢幕錄影」權限的情況下執行,將無法顯示縮圖。";
|
||||
"AltTab is running without Screen Recording permissions. %@ won’t show." = "AltTab 正在沒有「螢幕錄影」權限的情況下執行,將無法顯示%@。";
|
||||
"AltTab needs some permissions" = "AltTab 需要部分權限";
|
||||
"AltTab Pro" = "AltTab Pro";
|
||||
"AltTab Pro adds 4 features beyond the free switcher." = "AltTab Pro 在免費版切換器之上新增了 4 項功能。";
|
||||
@@ -264,6 +264,7 @@
|
||||
"This permission is needed to show thumbnails and preview of open windows" = "需要此權限才能顯示已開啟視窗的縮圖與預覽";
|
||||
"This will keep your Downloads folder uncluttered." = "這樣可以讓您的「下載項目」資料夾保持整潔。";
|
||||
"Thumbnails" = "縮圖";
|
||||
"Thumbnails and window previews" = "縮圖和視窗預覽";
|
||||
"Title truncation" = "標題截斷";
|
||||
"Titles" = "標題";
|
||||
"Titles appearance" = "標題外觀";
|
||||
@@ -298,6 +299,7 @@
|
||||
"Window is minimized" = "視窗已最小化";
|
||||
"Window is on every Space" = "視窗位於每個 Space";
|
||||
"Window is on Space %d" = "視窗位於 Space %d";
|
||||
"Window previews" = "視窗預覽";
|
||||
"window switches" = "次視窗切換";
|
||||
"Window Title" = "視窗標題";
|
||||
"Window title contains" = "視窗標題包含";
|
||||
|
||||
+45
-2
@@ -4,6 +4,7 @@ class Menubar {
|
||||
static var statusItem: NSStatusItem!
|
||||
static var menu: NSMenu!
|
||||
static var permissionCalloutMenuItems: [NSMenuItem]?
|
||||
private static var permissionCallout: PermissionCallout?
|
||||
private static var upgradeToProMenuItem: NSMenuItem!
|
||||
private static var supportProjectMenuItem: NSMenuItem!
|
||||
private static var myAccountMenuItem: NSMenuItem!
|
||||
@@ -28,7 +29,9 @@ class Menubar {
|
||||
menu.title = App.name // perf: prevent going through expensive code-path within appkit
|
||||
menu.delegate = menuDelegate
|
||||
let permissionCalloutMenuItem = NSMenuItem(title: "", action: nil, keyEquivalent: "")
|
||||
permissionCalloutMenuItem.view = PermissionCallout()
|
||||
let callout = PermissionCallout()
|
||||
permissionCallout = callout
|
||||
permissionCalloutMenuItem.view = callout
|
||||
let calloutSeparator = NSMenuItem.separator()
|
||||
permissionCalloutMenuItems = [permissionCalloutMenuItem, calloutSeparator]
|
||||
addMenuItem(NSLocalizedString("Show", comment: "Menubar option"), #selector(App.showUiFromShortcut0), "", "eye", nil, App.self)
|
||||
@@ -114,6 +117,20 @@ class Menubar {
|
||||
}
|
||||
}
|
||||
|
||||
// The callout is only useful when the user lacks Screen Recording AND has settings that need it
|
||||
// (Thumbnails style or window previews). Users who skipped the permission but use neither aren't
|
||||
// nagged (see #5623). Its copy names whichever of the two features are actually affected, so we
|
||||
// refresh the text before showing it. Re-evaluated on permission ticks and on each menu open
|
||||
// (settings can change). Decision logic lives in `PermissionCalloutResolver` (unit-tested).
|
||||
static func refreshPermissionCallout() {
|
||||
let dependentFeatures = Preferences.screenRecordingDependentFeatures
|
||||
let show = PermissionCalloutResolver.shouldShowCallout(
|
||||
screenRecordingGranted: ScreenRecordingPermission.status == .granted,
|
||||
dependentFeatures: dependentFeatures)
|
||||
if show { permissionCallout?.update(dependentFeatures) }
|
||||
togglePermissionCallout(show)
|
||||
}
|
||||
|
||||
// NSMenuItem.isHidden isn't reliable with custom views. We add/remove to hide/show these items
|
||||
static func togglePermissionCallout(_ show: Bool) {
|
||||
permissionCalloutMenuItems?.enumerated().forEach { offset, element in
|
||||
@@ -377,12 +394,15 @@ private final class MenubarMenuDelegate: NSObject, NSMenuDelegate {
|
||||
// opens so the dropdown subtitle reflects the current clock instead of the launch-day value.
|
||||
func menuWillOpen(_ menu: NSMenu) {
|
||||
LicenseManager.shared.refreshState()
|
||||
Menubar.refreshPermissionCallout()
|
||||
}
|
||||
}
|
||||
|
||||
class PermissionCallout: StackView {
|
||||
private var label: NSTextField!
|
||||
|
||||
convenience init() {
|
||||
let label = NSTextField(wrappingLabelWithString: NSLocalizedString("AltTab is running without Screen Recording permissions. Thumbnails won’t show.", comment: "Menubar callout"))
|
||||
let label = NSTextField(wrappingLabelWithString: "")
|
||||
label.translatesAutoresizingMaskIntoConstraints = false
|
||||
label.textColor = .white
|
||||
label.preferredMaxLayoutWidth = 250
|
||||
@@ -396,7 +416,30 @@ class PermissionCallout: StackView {
|
||||
App.restart()
|
||||
}
|
||||
self.init([label, button], .vertical, true, top: 8, right: 15, bottom: 10, left: 15)
|
||||
self.label = label
|
||||
wantsLayer = true
|
||||
layer!.backgroundColor = NSColor.purple.cgColor
|
||||
}
|
||||
|
||||
// Name only the feature(s) the user actually enabled, so we never promise back a feature they
|
||||
// don't use. The wrapped label's height depends on the message, so re-fit after setting it.
|
||||
func update(_ dependentFeatures: PermissionCalloutResolver.DependentFeatures) {
|
||||
label.stringValue = PermissionCallout.message(dependentFeatures)
|
||||
fit()
|
||||
}
|
||||
|
||||
// One reusable sentence template + a feature subject inserted at `%@`, so translators localize the
|
||||
// shared sentence (and the spacing/punctuation between its two clauses) once and only the subject
|
||||
// varies. The Thumbnails subject reuses the existing appearance-style string, already translated
|
||||
// everywhere. `.none` is unreachable here — the callout is hidden when no feature needs it.
|
||||
static func message(_ dependentFeatures: PermissionCalloutResolver.DependentFeatures) -> String {
|
||||
let subject: String
|
||||
switch dependentFeatures {
|
||||
case .thumbnails: subject = NSLocalizedString("Thumbnails", comment: "")
|
||||
case .previews: subject = NSLocalizedString("Window previews", comment: "Menubar callout subject: the preview-selected-window feature")
|
||||
case .both: subject = NSLocalizedString("Thumbnails and window previews", comment: "Menubar callout subject")
|
||||
case .none: return ""
|
||||
}
|
||||
return String(format: NSLocalizedString("AltTab is running without Screen Recording permissions. %@ won’t show.", comment: "Menubar callout. %@ is one or more feature names, e.g. Thumbnails"), subject)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
import Foundation
|
||||
|
||||
/// Pure decisions for the menubar "AltTab is running without Screen Recording permissions" callout
|
||||
/// (see #5623): both whether to surface it and which feature(s) it should name.
|
||||
/// `PermissionCalloutResolver` is callable in tests with no AppKit / Preferences / UserDefaults
|
||||
/// dependencies, so we can pin exactly when the callout shows vs. stays hidden and which message it
|
||||
/// shows.
|
||||
///
|
||||
/// Screen Recording is consumed by exactly two features: the Thumbnails appearance style (window
|
||||
/// screenshots) and the "preview selected window" overlay. So the callout is only worth showing to a
|
||||
/// user who lacks the permission AND has at least one shortcut configured to use one of them — and
|
||||
/// its copy names whichever of the two are actually affected, so it never promises back a feature the
|
||||
/// user doesn't use. A user who skipped the permission but uses neither gains nothing by granting it,
|
||||
/// so we don't nag them.
|
||||
enum PermissionCalloutResolver {
|
||||
/// The Screen-Recording-dependent feature(s) the user's settings rely on, aggregated across all
|
||||
/// shortcuts. Drives both whether the callout shows (`.none` → never) and which message it shows.
|
||||
enum DependentFeatures: Equatable {
|
||||
/// No shortcut uses Thumbnails or Preview — the permission is irrelevant, callout stays hidden.
|
||||
case none
|
||||
/// At least one shortcut uses the Thumbnails appearance style; none uses Preview.
|
||||
case thumbnails
|
||||
/// At least one shortcut uses the preview-selected-window overlay; none uses Thumbnails.
|
||||
case previews
|
||||
/// Both features are used across the user's shortcuts.
|
||||
case both
|
||||
}
|
||||
|
||||
/// Classify the two independent "used by any shortcut" flags into the affected feature set.
|
||||
/// - `usesThumbnails`: any shortcut's effective appearance style is Thumbnails (`.thumbnails`).
|
||||
/// The other two styles (`.titles`, `.appIcons`) render no window screenshots, so they pass `false`.
|
||||
/// - `usesPreviews`: any shortcut shows the preview-selected-window overlay.
|
||||
static func dependentFeatures(usesThumbnails: Bool, usesPreviews: Bool) -> DependentFeatures {
|
||||
switch (usesThumbnails, usesPreviews) {
|
||||
case (true, true): return .both
|
||||
case (true, false): return .thumbnails
|
||||
case (false, true): return .previews
|
||||
case (false, false): return .none
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether the menubar permission callout should be shown.
|
||||
/// - `screenRecordingGranted`: the OS permission is granted. When `true` the callout is pointless
|
||||
/// and is never shown, regardless of settings. When `false` the permission is missing — whether
|
||||
/// the user actively skipped it or simply never granted it (both map to `false` here).
|
||||
/// - `dependentFeatures`: which features the user's settings rely on (the OR across all shortcuts).
|
||||
/// `.none` means no shortcut needs the permission, so the callout is suppressed even though the
|
||||
/// permission is missing — the user gains nothing by granting it.
|
||||
static func shouldShowCallout(screenRecordingGranted: Bool, dependentFeatures: DependentFeatures) -> Bool {
|
||||
!screenRecordingGranted && dependentFeatures != .none
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
# PermissionCalloutResolver — Specs
|
||||
|
||||
> **Line coverage:** _pending — run `/coverage-explore` to populate_
|
||||
|
||||
## Summary
|
||||
|
||||
The menubar shows a callout — "AltTab is running without Screen Recording permissions. _X_ won't
|
||||
show." — with a "Grant permission" button. It used to appear for **every** user missing the
|
||||
permission, including users who deliberately skipped it and don't use any feature that needs it
|
||||
(reported in [#5623](https://github.com/lwouis/alt-tab-macos/issues/5623)), and it always blamed
|
||||
"Thumbnails" even when the user relied on window previews instead.
|
||||
|
||||
Screen Recording is consumed by exactly two features: the **Thumbnails** appearance style (window
|
||||
screenshots) and the **preview selected window** overlay. `PermissionCalloutResolver` is the pure
|
||||
kernel deciding when the callout is worth showing and which feature(s) it names, split in two:
|
||||
|
||||
- `dependentFeatures(usesThumbnails:usesPreviews:)` — classify the two independent "used by any
|
||||
shortcut" flags into the affected feature set: `.none`, `.thumbnails`, `.previews`, or `.both`.
|
||||
- `shouldShowCallout(screenRecordingGranted:dependentFeatures:)` — given the permission state and the
|
||||
affected features, show the callout? (missing permission AND not `.none`.)
|
||||
|
||||
## Behavior & edge cases
|
||||
|
||||
- **The two inputs are independent dimensions.** The callout shows only at their intersection:
|
||||
permission missing **and** at least one feature depends on Screen Recording. The combinations where
|
||||
the permission is granted, or where `dependentFeatures` is `.none`, all hide it.
|
||||
- **`screenRecordingGranted` collapses three permission states into two.** Production passes
|
||||
`ScreenRecordingPermission.status == .granted`, so both `.skipped` (user opted out) and
|
||||
`.notGranted` (never granted) map to `false` → "permission missing". They behave identically.
|
||||
- **`dependentFeatures` is an OR of each flag across all shortcut slots.** Production computes it as
|
||||
`Preferences.screenRecordingDependentFeatures`, which OR-s the Thumbnails flag and the Preview flag
|
||||
independently over every shortcut (`0...maxShortcutCount`) using the *effective* per-shortcut
|
||||
appearance style and preview flag. So a per-shortcut override that turns on Thumbnails/Preview on a
|
||||
single slot is enough to surface the callout, even when the global appearance is Titles/App Icons.
|
||||
- **Titles and App Icons render no screenshots**, so they pass `usesThumbnails: false`. Only the
|
||||
`.thumbnails` style passes `true`.
|
||||
- **The copy names only the affected feature(s)**, so the callout never promises back a feature the
|
||||
user doesn't use. The message is one reusable template with the subject inserted at `%@`; the
|
||||
Thumbnails subject reuses the existing "Thumbnails" appearance-style translation.
|
||||
|
||||
## Test scenarios
|
||||
|
||||
Mirrors `PermissionCalloutResolverTests.swift` 1:1.
|
||||
|
||||
### Which features the settings depend on
|
||||
- **testThumbnailsOnlyClassifiedAsThumbnails** — Thumbnails on, Preview off → `.thumbnails`.
|
||||
- **testPreviewsOnlyClassifiedAsPreviews** — Preview on, Thumbnails off → `.previews`.
|
||||
- **testBothFeaturesClassifiedAsBoth** — both on → `.both`.
|
||||
- **testNeitherFeatureClassifiedAsNone** — Titles/App Icons, Preview off → `.none` (the #5623 case).
|
||||
|
||||
### When the callout shows vs. stays hidden
|
||||
- **testGrantedNeverShowsEvenWhenUsed** — permission granted + `.both` → hide (it works, no need to nag).
|
||||
- **testGrantedNeverShowsWhenUnused** — permission granted + `.none` → hide.
|
||||
- **testMissingPermissionShowsForThumbnails** — permission missing + `.thumbnails` → **show** (names Thumbnails).
|
||||
- **testMissingPermissionShowsForPreviews** — permission missing + `.previews` → **show** (names Window previews).
|
||||
- **testMissingPermissionShowsForBoth** — permission missing + `.both` → **show** (names both).
|
||||
- **testMissingPermissionHiddenWhenUnused** — permission missing + `.none` → hide (the #5623 fix).
|
||||
@@ -0,0 +1,86 @@
|
||||
import XCTest
|
||||
|
||||
/// Pins exactly when the menubar "AltTab is running without Screen Recording permissions" callout
|
||||
/// shows vs. stays hidden, and which feature(s) it names (see #5623). The callout used to appear
|
||||
/// whenever the permission was missing and always blamed Thumbnails; it now only appears when the
|
||||
/// permission is missing AND the user's settings actually use it (Thumbnails appearance style or the
|
||||
/// preview-selected-window overlay), and its copy names whichever of the two are affected.
|
||||
///
|
||||
/// `PermissionCalloutResolver` is the pure decision kernel, split in two:
|
||||
/// - `dependentFeatures` — which Screen-Recording features do the settings rely on (none / thumbnails
|
||||
/// / previews / both)?
|
||||
/// - `shouldShowCallout` — given the permission state and the affected features, show?
|
||||
///
|
||||
/// Production wires these to real state: `screenRecordingGranted` is `ScreenRecordingPermission.status
|
||||
/// == .granted` (so both `.skipped` and `.notGranted` map to `false`), and `dependentFeatures` is
|
||||
/// `Preferences.screenRecordingDependentFeatures`, which OR-s each feature flag over every shortcut
|
||||
/// slot — so a per-shortcut override that enables Thumbnails/Preview on any one slot flips it on.
|
||||
/// The shown copy reuses the existing "Thumbnails" translation; only the subject of the sentence varies.
|
||||
final class PermissionCalloutResolverTests: XCTestCase {
|
||||
|
||||
// MARK: - Which features the settings depend on
|
||||
|
||||
/// Thumbnails style on, Preview off → only Thumbnails depends on the permission.
|
||||
func testThumbnailsOnlyClassifiedAsThumbnails() {
|
||||
XCTAssertEqual(PermissionCalloutResolver.dependentFeatures(
|
||||
usesThumbnails: true, usesPreviews: false), .thumbnails)
|
||||
}
|
||||
|
||||
/// Preview on, Thumbnails off (e.g. Titles/App Icons + Preview) → only Previews depend on it.
|
||||
func testPreviewsOnlyClassifiedAsPreviews() {
|
||||
XCTAssertEqual(PermissionCalloutResolver.dependentFeatures(
|
||||
usesThumbnails: false, usesPreviews: true), .previews)
|
||||
}
|
||||
|
||||
/// Both features on → both depend on it; the callout names both.
|
||||
func testBothFeaturesClassifiedAsBoth() {
|
||||
XCTAssertEqual(PermissionCalloutResolver.dependentFeatures(
|
||||
usesThumbnails: true, usesPreviews: true), .both)
|
||||
}
|
||||
|
||||
/// Neither feature on (Titles/App Icons, Preview off) → nothing depends on the permission. This is
|
||||
/// the issue-#5623 case: no screenshots are ever taken, so the callout must stay hidden.
|
||||
func testNeitherFeatureClassifiedAsNone() {
|
||||
XCTAssertEqual(PermissionCalloutResolver.dependentFeatures(
|
||||
usesThumbnails: false, usesPreviews: false), .none)
|
||||
}
|
||||
|
||||
// MARK: - When the callout shows vs. stays hidden
|
||||
|
||||
/// Permission granted → never show, even if features use Screen Recording (they work fine).
|
||||
func testGrantedNeverShowsEvenWhenUsed() {
|
||||
XCTAssertFalse(PermissionCalloutResolver.shouldShowCallout(
|
||||
screenRecordingGranted: true, dependentFeatures: .both))
|
||||
}
|
||||
|
||||
/// Permission granted and nothing uses it → still never show.
|
||||
func testGrantedNeverShowsWhenUnused() {
|
||||
XCTAssertFalse(PermissionCalloutResolver.shouldShowCallout(
|
||||
screenRecordingGranted: true, dependentFeatures: .none))
|
||||
}
|
||||
|
||||
/// Permission missing (skipped or never granted) and Thumbnails is used → SHOW (names Thumbnails).
|
||||
func testMissingPermissionShowsForThumbnails() {
|
||||
XCTAssertTrue(PermissionCalloutResolver.shouldShowCallout(
|
||||
screenRecordingGranted: false, dependentFeatures: .thumbnails))
|
||||
}
|
||||
|
||||
/// Permission missing and only Preview is used → SHOW (names Window previews).
|
||||
func testMissingPermissionShowsForPreviews() {
|
||||
XCTAssertTrue(PermissionCalloutResolver.shouldShowCallout(
|
||||
screenRecordingGranted: false, dependentFeatures: .previews))
|
||||
}
|
||||
|
||||
/// Permission missing and both features are used → SHOW (names both).
|
||||
func testMissingPermissionShowsForBoth() {
|
||||
XCTAssertTrue(PermissionCalloutResolver.shouldShowCallout(
|
||||
screenRecordingGranted: false, dependentFeatures: .both))
|
||||
}
|
||||
|
||||
/// Permission missing but no feature uses it → HIDE. The user skipped the permission and uses
|
||||
/// neither Thumbnails nor Preview, so nagging them is pointless (the regression #5623 fixes).
|
||||
func testMissingPermissionHiddenWhenUnused() {
|
||||
XCTAssertFalse(PermissionCalloutResolver.shouldShowCallout(
|
||||
screenRecordingGranted: false, dependentFeatures: .none))
|
||||
}
|
||||
}
|
||||
@@ -60,7 +60,7 @@ class SystemPermissions {
|
||||
}
|
||||
}
|
||||
DispatchQueue.main.async {
|
||||
Menubar.togglePermissionCallout(ScreenRecordingPermission.status != .granted)
|
||||
Menubar.refreshPermissionCallout()
|
||||
if PermissionsWindow.shared != nil {
|
||||
PermissionsWindow.updatePermissionViews()
|
||||
}
|
||||
|
||||
@@ -336,6 +336,24 @@ class Preferences {
|
||||
return CachedUserDefaults.bool(indexToName("previewFocusedWindowOverride", index))
|
||||
}
|
||||
|
||||
/// Which Screen-Recording-dependent features any shortcut's effective settings rely on: the
|
||||
/// Thumbnails appearance style (window screenshots) and/or the "preview selected window" overlay.
|
||||
/// These are the only features needing the permission, so when none are configured the menubar
|
||||
/// callout that nags about the missing permission is pointless and is suppressed (see #5623). The
|
||||
/// result also drives which feature(s) the callout names. We OR each flag across every shortcut
|
||||
/// slot, so a per-shortcut override that enables Thumbnails/Preview on any one slot flips it on.
|
||||
/// The pure classification lives in `PermissionCalloutResolver` (unit-tested).
|
||||
static var screenRecordingDependentFeatures: PermissionCalloutResolver.DependentFeatures {
|
||||
var usesThumbnails = false
|
||||
var usesPreviews = false
|
||||
for index in 0...maxShortcutCount {
|
||||
usesThumbnails = usesThumbnails || effectiveAppearanceStyle(index) == .thumbnails
|
||||
usesPreviews = usesPreviews || effectivePreviewSelectedWindow(index)
|
||||
if usesThumbnails && usesPreviews { break }
|
||||
}
|
||||
return PermissionCalloutResolver.dependentFeatures(usesThumbnails: usesThumbnails, usesPreviews: usesPreviews)
|
||||
}
|
||||
|
||||
/// key-above-tab is ` on US keyboard, but can be different on other keyboards
|
||||
static func keyAboveTabDependingOnInputSource() -> String {
|
||||
return LiteralKeyCodeTransformer.shared.transformedValue(NSNumber(value: kVK_ANSI_Grave)) ?? "`"
|
||||
|
||||
Reference in new issue
Block a user