diff --git a/Mini vMac.xcodeproj/project.pbxproj b/Mini vMac.xcodeproj/project.pbxproj index 6847725..e8d5489 100644 --- a/Mini vMac.xcodeproj/project.pbxproj +++ b/Mini vMac.xcodeproj/project.pbxproj @@ -30,7 +30,6 @@ 28BA89801CE7315400A98104 /* KBKeyboardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BA89791CE7315400A98104 /* KBKeyboardView.m */; }; 28BA89821CE7336500A98104 /* Keyboard Layouts in Resources */ = {isa = PBXBuildFile; fileRef = 28BA89811CE7336500A98104 /* Keyboard Layouts */; }; 28BA89851CE73E7200A98104 /* TrackPad.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BA89841CE73E7200A98104 /* TrackPad.m */; }; - 28BA89881CE73FBC00A98104 /* MNVMApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BA89871CE73FBC00A98104 /* MNVMApplication.m */; }; 28BDBEA01D230EEB0072ED5B /* MYOSGLUE.m in Sources */ = {isa = PBXBuildFile; fileRef = 28CE8ECB1CD4CDC500FE25A8 /* MYOSGLUE.m */; }; 28BDBEB11D230EEB0072ED5B /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 283423EC1CFA329C0088B634 /* Icon.png */; }; 28BDBEB21D230EEB0072ED5B /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 283423ED1CFA329C0088B634 /* Icon@2x.png */; }; @@ -277,8 +276,6 @@ 28BA89811CE7336500A98104 /* Keyboard Layouts */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "Keyboard Layouts"; sourceTree = ""; }; 28BA89831CE73E7200A98104 /* TrackPad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPad.h; sourceTree = ""; }; 28BA89841CE73E7200A98104 /* TrackPad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TrackPad.m; sourceTree = ""; }; - 28BA89861CE73FBC00A98104 /* MNVMApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MNVMApplication.h; sourceTree = ""; }; - 28BA89871CE73FBC00A98104 /* MNVMApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MNVMApplication.m; sourceTree = ""; }; 28BDBEB71D230EEB0072ED5B /* MacII-640x480.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "MacII-640x480.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 28C67BEE2AC49E46000C7540 /* MacII-512x384.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "MacII-512x384.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 28C67BF12AC49F0F000C7540 /* CNFUDALL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CNFUDALL.h; sourceTree = ""; }; @@ -612,8 +609,6 @@ children = ( 28F676C31CD15E0B00FC6FA6 /* AppDelegate.h */, 28F676C41CD15E0B00FC6FA6 /* AppDelegate.m */, - 28BA89861CE73FBC00A98104 /* MNVMApplication.h */, - 28BA89871CE73FBC00A98104 /* MNVMApplication.m */, 28CE8ED41CD4F56C00FE25A8 /* ScreenView.h */, 28CE8ED51CD4F56C00FE25A8 /* ScreenView.m */, 28D5A3FB1CD6868E001A33F6 /* TouchScreen.h */, @@ -1311,7 +1306,6 @@ 28D3C6172B76B8970079E915 /* DefaultSceneDelegate.swift in Sources */, 28CE8ED61CD4F56C00FE25A8 /* ScreenView.m in Sources */, 28848B651CDE97E900B86C45 /* SettingsViewController.m in Sources */, - 28BA89881CE73FBC00A98104 /* MNVMApplication.m in Sources */, 28F6B4CF1CF77099002D76D0 /* compat.m in Sources */, 28F6B4521CF07C48002D76D0 /* UIImage+DiskImageIcon.m in Sources */, 28D3C61D2B7795060079E915 /* SettingsMenu.swift in Sources */, diff --git a/Mini vMac/KBKeyboardView.h b/Mini vMac/KBKeyboardView.h index ee93386..7d144d2 100644 --- a/Mini vMac/KBKeyboardView.h +++ b/Mini vMac/KBKeyboardView.h @@ -9,6 +9,12 @@ #import #import "KBKeyboardLayout.h" +#define KC_COMMAND 55 +#define KC_SHIFT 56 +#define KC_CAPSLOCK 57 +#define KC_OPTION 58 +#define KC_CONTROL 59 + @class KBKey; @protocol KBKeyboardViewDelegate diff --git a/Mini vMac/KBKeyboardView.m b/Mini vMac/KBKeyboardView.m index 929b522..1a0ef3a 100644 --- a/Mini vMac/KBKeyboardView.m +++ b/Mini vMac/KBKeyboardView.m @@ -9,12 +9,6 @@ #import "KBKeyboardView.h" #import "KBKey.h" -#define KC_COMMAND 55 -#define KC_SHIFT 56 -#define KC_CAPSLOCK 57 -#define KC_OPTION 58 -#define KC_CONTROL 59 - @implementation KBKeyboardView { NSMutableArray *keyPlanes, *emptyKeyPlanes; NSMutableSet *modifiers; diff --git a/Mini vMac/MNVMApplication.h b/Mini vMac/MNVMApplication.h deleted file mode 100644 index f9fc340..0000000 --- a/Mini vMac/MNVMApplication.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// MNVMApplication.h -// Mini vMac -// -// Created by Jesús A. Álvarez on 14/05/2016. -// Copyright © 2016-2018 namedfork. All rights reserved. -// - -#import - -@interface MNVMApplication : UIApplication - -@end diff --git a/Mini vMac/MNVMApplication.m b/Mini vMac/MNVMApplication.m deleted file mode 100644 index a036374..0000000 --- a/Mini vMac/MNVMApplication.m +++ /dev/null @@ -1,120 +0,0 @@ -// -// MNVMApplication.m -// Mini vMac -// -// Created by Jesús A. Álvarez on 14/05/2016. -// Copyright © 2016-2018 namedfork. All rights reserved. -// - -#import "MNVMApplication.h" -#import "AppDelegate.h" - -@interface UIApplication () -- (void)handleKeyUIEvent:(UIEvent *)event; -@end - -Class keyboardEventClass = nil; - -static int8_t usb_to_adb_scancode[] = { - -1, -1, -1, -1, 0, 11, 8, 2, 14, 3, 5, 4, 34, 38, 40, 37, - 46, 45, 31, 35, 12, 15, 1, 17, 32, 9, 13, 7, 16, 6, 18, 19, - 20, 21, 23, 22, 26, 28, 25, 29, 36, 53, 51, 48, 49, 27, 24, 33, - 30, 42, 42, 41, 39, 10, 43, 47, 44, 57, 122, 120, 99, 118, 96, 97, - 98, 100, 101, 109, 103, 111, 105, 107, 113, 114, 115, 116, 117, 119, 121, 60, - 59, 61, 62, 71, 75, 67, 78, 69, 76, 83, 84, 85, 86, 87, 88, 89, - 91, 92, 82, 65, 50, 55, 126, 81, 105, 107, 113, 106, 64, 79, 80, 90, - -1, -1, -1, -1, -1, 114, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, - 72, 73, -1, -1, -1, 95, -1, 94, -1, 93, -1, -1, -1, -1, -1, -1, - 104, 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 54, 56, 58, 55, 54, 56, 58, 55, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 -}; - -@interface UIPhysicalKeyboardEvent : UIPressesEvent - -@property (nonatomic, readonly) BOOL _isKeyDown; -@property (nonatomic, readonly) long _keyCode; -@property (nonatomic) int _modifierFlags; -@property(retain, nonatomic) NSString *_unmodifiedInput; -@property(retain, nonatomic) NSString *_modifiedInput; - -@end - -@implementation MNVMApplication -{ - BOOL physicalCapsLocked; -} - -+ (void)load { - // class is not visible - keyboardEventClass = NSClassFromString(@"UIPhysicalKeyboardEvent"); -} - -- (void)handleKeyboardEvent:(UIPhysicalKeyboardEvent *)event { - long keycode = event._keyCode; - int scancode = -1; - - if (keycode >= 0 && keycode < sizeof(usb_to_adb_scancode)) { - scancode = usb_to_adb_scancode[keycode]; - } - - if (scancode == 57) { - // caps lock - if (event._isKeyDown && !physicalCapsLocked) { - [[AppDelegate sharedEmulator] keyDown:scancode]; - physicalCapsLocked = YES; - } else if (event._isKeyDown && physicalCapsLocked) { - [[AppDelegate sharedEmulator] keyUp:scancode]; - physicalCapsLocked = NO; - } - } else if (scancode >= 0 && [AppDelegate sharedEmulator].running) { - if (event._isKeyDown) { - [self _updateCapsLockStatus:event]; - [[AppDelegate sharedEmulator] keyDown:scancode]; - } else { - [[AppDelegate sharedEmulator] keyUp:scancode]; - } - } -} - -- (void)_updateCapsLockStatus:(UIPhysicalKeyboardEvent *)event { - if (event._modifierFlags == 0 && event._unmodifiedInput.length == 1 && event._modifiedInput.length == 1) { - unichar unmodifiedChar = [event._unmodifiedInput characterAtIndex:0]; - unichar modifiedChar = [event._modifiedInput characterAtIndex:0]; - if ([[NSCharacterSet lowercaseLetterCharacterSet] characterIsMember:unmodifiedChar]) { - BOOL currentCapsLock = [[NSCharacterSet uppercaseLetterCharacterSet] characterIsMember:modifiedChar]; - if (currentCapsLock != physicalCapsLocked) { - physicalCapsLocked = currentCapsLock; - if (physicalCapsLocked) { - [[AppDelegate sharedEmulator] keyDown:57]; - } else { - [[AppDelegate sharedEmulator] keyUp:57]; - } - } - } - } -} - -- (void)handleKeyUIEvent:(UIEvent *)event { - static dispatch_once_t onceToken; - static BOOL handleKeyboardEvents = YES; - dispatch_once(&onceToken, ^{ - if ([NSProcessInfo instancesRespondToSelector:@selector(operatingSystemVersion)]) { - handleKeyboardEvents = [NSProcessInfo processInfo].operatingSystemVersion.majorVersion >= 9; - } else { - handleKeyboardEvents = NO; - } - }); - BOOL emulatorIsFrontmost = [AppDelegate sharedEmulator].running && [AppDelegate sharedInstance].window.rootViewController.presentedViewController == nil; - if ([event isKindOfClass:keyboardEventClass] && handleKeyboardEvents && emulatorIsFrontmost) { - [self handleKeyboardEvent:(UIPhysicalKeyboardEvent*)event]; - } else { - [super handleKeyUIEvent:event]; - } -} - -@end diff --git a/Mini vMac/ViewController.m b/Mini vMac/ViewController.m index 31e0d9d..a11a17a 100644 --- a/Mini vMac/ViewController.m +++ b/Mini vMac/ViewController.m @@ -24,12 +24,32 @@ API_AVAILABLE(ios(13.4)) @end #endif +static int8_t usb_to_adb_scancode[] = { + -1, -1, -1, -1, 0, 11, 8, 2, 14, 3, 5, 4, 34, 38, 40, 37, + 46, 45, 31, 35, 12, 15, 1, 17, 32, 9, 13, 7, 16, 6, 18, 19, + 20, 21, 23, 22, 26, 28, 25, 29, 36, 53, 51, 48, 49, 27, 24, 33, + 30, 42, 42, 41, 39, 10, 43, 47, 44, 57, 122, 120, 99, 118, 96, 97, + 98, 100, 101, 109, 103, 111, 105, 107, 113, 114, 115, 116, 117, 119, 121, 60, + 59, 61, 62, 71, 75, 67, 78, 69, 76, 83, 84, 85, 86, 87, 88, 89, + 91, 92, 82, 65, 50, 55, 126, 81, 105, 107, 113, 106, 64, 79, 80, 90, + -1, -1, -1, -1, -1, 114, -1, -1, -1, -1, -1, -1, -1, -1, -1, 74, + 72, 73, -1, -1, -1, 95, -1, 94, -1, 93, -1, -1, -1, -1, -1, -1, + 104, 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 54, 56, 58, 55, 54, 56, 58, 55, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; + @implementation ViewController { KBKeyboardView *keyboardView; UISwipeGestureRecognizer *showKeyboardGesture, *hideKeyboardGesture, *insertDiskGesture, *showSettingsGesture; UIControl *pointingDeviceView; UIViewController *_keyboardViewController; + BOOL physicalCapsLocked; id interaction; } @@ -431,6 +451,65 @@ API_AVAILABLE(ios(13.4)) [[AppDelegate sharedEmulator] keyUp:scancode]; } +- (void)pressesBegan:(NSSet *)presses withEvent:(UIPressesEvent *)event { + for (UIPress *press in presses) { + [self handlePressEvent:press]; + } +} + +- (void)pressesChanged:(NSSet *)presses withEvent:(UIPressesEvent *)event { + for (UIPress *press in presses) { + [self handlePressEvent:press]; + } +} + +- (void)pressesEnded:(NSSet *)presses withEvent:(UIPressesEvent *)event { + for (UIPress *press in presses) { + [self handlePressEvent:press]; + } +} + +- (void)handlePressEvent:(UIPress *)event { + long keycode = event.key.keyCode; + int scancode = -1; + + BOOL emulatorIsFrontmost = [AppDelegate sharedEmulator].running && [AppDelegate sharedInstance].window.rootViewController.presentedViewController == nil; + BOOL isKeyDown = (event.phase == UIPressPhaseBegan); + + if (keycode >= 0 && keycode < sizeof(usb_to_adb_scancode)) { + scancode = usb_to_adb_scancode[keycode]; + } + + if (scancode == KC_CAPSLOCK) { + // caps lock + if (isKeyDown && !physicalCapsLocked) { + [[AppDelegate sharedEmulator] keyDown:KC_CAPSLOCK]; + physicalCapsLocked = YES; + } else if (isKeyDown && physicalCapsLocked) { + [[AppDelegate sharedEmulator] keyUp:KC_CAPSLOCK]; + physicalCapsLocked = NO; + } + } else if (scancode >= 0 && emulatorIsFrontmost) { + [self _updateCapsLockStatus:event]; + if (isKeyDown) { + [[AppDelegate sharedEmulator] keyDown:scancode]; + } else { + [[AppDelegate sharedEmulator] keyUp:scancode]; + } + } +} + +- (void)_updateCapsLockStatus:(UIPress *)event { + BOOL currentCapsLock = (event.key.modifierFlags & UIKeyModifierAlphaShift) != 0; + if (currentCapsLock != physicalCapsLocked) { + physicalCapsLocked = currentCapsLock; + if (physicalCapsLocked) { + [[AppDelegate sharedEmulator] keyDown:KC_CAPSLOCK]; + } else { + [[AppDelegate sharedEmulator] keyUp:KC_CAPSLOCK]; + } + } +} @end #ifdef __IPHONE_13_4 diff --git a/Mini vMac/main.m b/Mini vMac/main.m index ac84a0e..e13beba 100644 --- a/Mini vMac/main.m +++ b/Mini vMac/main.m @@ -11,6 +11,6 @@ int main(int argc, char * argv[]) { @autoreleasepool { - return UIApplicationMain(argc, argv, @"MNVMApplication", NSStringFromClass([AppDelegate class])); + return UIApplicationMain(argc, argv, NSStringFromClass([UIApplication class]), NSStringFromClass([AppDelegate class])); } }