From bd7a3102605731c9202bae39d007334d98f9feab Mon Sep 17 00:00:00 2001 From: Pete Tao Date: Fri, 21 Feb 2025 14:29:03 -0800 Subject: [PATCH] Add option to ignore specific first responder classes for keyboard shortcuts --- Classes/Manager/FLEXManager+Extensibility.h | 5 +++++ Classes/Manager/FLEXManager+Extensibility.m | 5 +++++ .../Utility/Keyboard/FLEXKeyboardShortcutManager.h | 3 +++ .../Utility/Keyboard/FLEXKeyboardShortcutManager.m | 13 ++++++++++--- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Classes/Manager/FLEXManager+Extensibility.h b/Classes/Manager/FLEXManager+Extensibility.h index 83260ed9e8..0c678f0461 100644 --- a/Classes/Manager/FLEXManager+Extensibility.h +++ b/Classes/Manager/FLEXManager+Extensibility.h @@ -78,6 +78,11 @@ NS_ASSUME_NONNULL_BEGIN action:(dispatch_block_t)action description:(NSString *)description; +/// The simulator shortcuts will no-op if there is already a first responder in the window. +/// Sometimes we might want to still allow simulator shortcuts despite this. +/// @param ignoredClassNames Classes that should be ignored by the simulator shortcut manager. +- (void)setSimulatorShortcutIgnoredClassNames:(NSArray *)ignoredClassNames; + @end NS_ASSUME_NONNULL_END diff --git a/Classes/Manager/FLEXManager+Extensibility.m b/Classes/Manager/FLEXManager+Extensibility.m index 0872ee66ff..537b9de5e2 100644 --- a/Classes/Manager/FLEXManager+Extensibility.m +++ b/Classes/Manager/FLEXManager+Extensibility.m @@ -105,6 +105,11 @@ - (BOOL)simulatorShortcutsEnabled { #endif } +- (void)setSimulatorShortcutIgnoredClassNames:(NSArray *)ignoredClassNames { +#if TARGET_OS_SIMULATOR + [FLEXKeyboardShortcutManager.sharedManager setSimulatorShortcutIgnoredClassNames:ignoredClassNames]; +#endif +} #pragma mark - Shortcuts Defaults diff --git a/Classes/Utility/Keyboard/FLEXKeyboardShortcutManager.h b/Classes/Utility/Keyboard/FLEXKeyboardShortcutManager.h index 292f3d4c68..ce989ced58 100644 --- a/Classes/Utility/Keyboard/FLEXKeyboardShortcutManager.h +++ b/Classes/Utility/Keyboard/FLEXKeyboardShortcutManager.h @@ -23,6 +23,9 @@ description:(NSString *)description allowOverride:(BOOL)allowOverride; +/// @param ignoredClassNames Classes that should be ignored by the simulator shortcut manager. +- (void)setSimulatorShortcutIgnoredClassNames:(NSArray *)ignoredClassNames; + @property (nonatomic, getter=isEnabled) BOOL enabled; @property (nonatomic, readonly) NSString *keyboardShortcutsDescription; diff --git a/Classes/Utility/Keyboard/FLEXKeyboardShortcutManager.m b/Classes/Utility/Keyboard/FLEXKeyboardShortcutManager.m index 4263245de3..5ab2f1959e 100644 --- a/Classes/Utility/Keyboard/FLEXKeyboardShortcutManager.m +++ b/Classes/Utility/Keyboard/FLEXKeyboardShortcutManager.m @@ -119,7 +119,9 @@ @interface FLEXKeyboardShortcutManager () @end -@implementation FLEXKeyboardShortcutManager +@implementation FLEXKeyboardShortcutManager { + NSArray *_ignoredFirstResponderClassNames; +} + (instancetype)sharedManager { static FLEXKeyboardShortcutManager *sharedManager = nil; @@ -222,6 +224,10 @@ - (void)registerSimulatorShortcutWithKey:(NSString *)key } } +- (void)setSimulatorShortcutIgnoredClassNames:(NSArray *)ignoredClassNames { + _ignoredFirstResponderClassNames = ignoredClassNames; +} + static const long kFLEXControlKeyCode = 0xe0; static const long kFLEXShiftKeyCode = 0xe1; static const long kFLEXCommandKeyCode = 0xe3; @@ -257,8 +263,9 @@ - (void)handleKeyboardEvent:(UIEvent *)event { if (isKeyDown && modifiedInput.length > 0 && interactionEnabled) { UIResponder *firstResponder = nil; for (UIWindow *window in FLEXUtility.allWindows) { - firstResponder = [window valueForKey:@"firstResponder"]; - if (firstResponder) { + NSString *const className = NSStringFromClass([firstResponder class]); + const BOOL isIgnored = [_ignoredFirstResponderClassNames containsObject:className]; + if (firstResponder && !isIgnored) { hasFirstResponder = YES; break; }