mirror of
https://github.com/zydeco/minivmac4ios.git
synced 2024-11-29 05:49:21 +00:00
handle key input with UIPress (iOS ≥9)
contributed by Steven Troughton-Smith
This commit is contained in:
parent
61dc6ddcd7
commit
c1c7c93c6a
@ -30,7 +30,6 @@
|
|||||||
28BA89801CE7315400A98104 /* KBKeyboardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BA89791CE7315400A98104 /* KBKeyboardView.m */; };
|
28BA89801CE7315400A98104 /* KBKeyboardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BA89791CE7315400A98104 /* KBKeyboardView.m */; };
|
||||||
28BA89821CE7336500A98104 /* Keyboard Layouts in Resources */ = {isa = PBXBuildFile; fileRef = 28BA89811CE7336500A98104 /* Keyboard Layouts */; };
|
28BA89821CE7336500A98104 /* Keyboard Layouts in Resources */ = {isa = PBXBuildFile; fileRef = 28BA89811CE7336500A98104 /* Keyboard Layouts */; };
|
||||||
28BA89851CE73E7200A98104 /* TrackPad.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BA89841CE73E7200A98104 /* TrackPad.m */; };
|
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 */; };
|
28BDBEA01D230EEB0072ED5B /* MYOSGLUE.m in Sources */ = {isa = PBXBuildFile; fileRef = 28CE8ECB1CD4CDC500FE25A8 /* MYOSGLUE.m */; };
|
||||||
28BDBEB11D230EEB0072ED5B /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 283423EC1CFA329C0088B634 /* Icon.png */; };
|
28BDBEB11D230EEB0072ED5B /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 283423EC1CFA329C0088B634 /* Icon.png */; };
|
||||||
28BDBEB21D230EEB0072ED5B /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 283423ED1CFA329C0088B634 /* Icon@2x.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 = "<group>"; };
|
28BA89811CE7336500A98104 /* Keyboard Layouts */ = {isa = PBXFileReference; lastKnownFileType = folder; path = "Keyboard Layouts"; sourceTree = "<group>"; };
|
||||||
28BA89831CE73E7200A98104 /* TrackPad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPad.h; sourceTree = "<group>"; };
|
28BA89831CE73E7200A98104 /* TrackPad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TrackPad.h; sourceTree = "<group>"; };
|
||||||
28BA89841CE73E7200A98104 /* TrackPad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TrackPad.m; sourceTree = "<group>"; };
|
28BA89841CE73E7200A98104 /* TrackPad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TrackPad.m; sourceTree = "<group>"; };
|
||||||
28BA89861CE73FBC00A98104 /* MNVMApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MNVMApplication.h; sourceTree = "<group>"; };
|
|
||||||
28BA89871CE73FBC00A98104 /* MNVMApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MNVMApplication.m; sourceTree = "<group>"; };
|
|
||||||
28BDBEB71D230EEB0072ED5B /* MacII-640x480.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "MacII-640x480.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
|
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; };
|
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 = "<group>"; };
|
28C67BF12AC49F0F000C7540 /* CNFUDALL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CNFUDALL.h; sourceTree = "<group>"; };
|
||||||
@ -612,8 +609,6 @@
|
|||||||
children = (
|
children = (
|
||||||
28F676C31CD15E0B00FC6FA6 /* AppDelegate.h */,
|
28F676C31CD15E0B00FC6FA6 /* AppDelegate.h */,
|
||||||
28F676C41CD15E0B00FC6FA6 /* AppDelegate.m */,
|
28F676C41CD15E0B00FC6FA6 /* AppDelegate.m */,
|
||||||
28BA89861CE73FBC00A98104 /* MNVMApplication.h */,
|
|
||||||
28BA89871CE73FBC00A98104 /* MNVMApplication.m */,
|
|
||||||
28CE8ED41CD4F56C00FE25A8 /* ScreenView.h */,
|
28CE8ED41CD4F56C00FE25A8 /* ScreenView.h */,
|
||||||
28CE8ED51CD4F56C00FE25A8 /* ScreenView.m */,
|
28CE8ED51CD4F56C00FE25A8 /* ScreenView.m */,
|
||||||
28D5A3FB1CD6868E001A33F6 /* TouchScreen.h */,
|
28D5A3FB1CD6868E001A33F6 /* TouchScreen.h */,
|
||||||
@ -1311,7 +1306,6 @@
|
|||||||
28D3C6172B76B8970079E915 /* DefaultSceneDelegate.swift in Sources */,
|
28D3C6172B76B8970079E915 /* DefaultSceneDelegate.swift in Sources */,
|
||||||
28CE8ED61CD4F56C00FE25A8 /* ScreenView.m in Sources */,
|
28CE8ED61CD4F56C00FE25A8 /* ScreenView.m in Sources */,
|
||||||
28848B651CDE97E900B86C45 /* SettingsViewController.m in Sources */,
|
28848B651CDE97E900B86C45 /* SettingsViewController.m in Sources */,
|
||||||
28BA89881CE73FBC00A98104 /* MNVMApplication.m in Sources */,
|
|
||||||
28F6B4CF1CF77099002D76D0 /* compat.m in Sources */,
|
28F6B4CF1CF77099002D76D0 /* compat.m in Sources */,
|
||||||
28F6B4521CF07C48002D76D0 /* UIImage+DiskImageIcon.m in Sources */,
|
28F6B4521CF07C48002D76D0 /* UIImage+DiskImageIcon.m in Sources */,
|
||||||
28D3C61D2B7795060079E915 /* SettingsMenu.swift in Sources */,
|
28D3C61D2B7795060079E915 /* SettingsMenu.swift in Sources */,
|
||||||
|
@ -9,6 +9,12 @@
|
|||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
#import "KBKeyboardLayout.h"
|
#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;
|
@class KBKey;
|
||||||
|
|
||||||
@protocol KBKeyboardViewDelegate <NSObject>
|
@protocol KBKeyboardViewDelegate <NSObject>
|
||||||
|
@ -9,12 +9,6 @@
|
|||||||
#import "KBKeyboardView.h"
|
#import "KBKeyboardView.h"
|
||||||
#import "KBKey.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 {
|
@implementation KBKeyboardView {
|
||||||
NSMutableArray *keyPlanes, *emptyKeyPlanes;
|
NSMutableArray *keyPlanes, *emptyKeyPlanes;
|
||||||
NSMutableSet *modifiers;
|
NSMutableSet *modifiers;
|
||||||
|
@ -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 <UIKit/UIKit.h>
|
|
||||||
|
|
||||||
@interface MNVMApplication : UIApplication
|
|
||||||
|
|
||||||
@end
|
|
@ -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
|
|
@ -24,12 +24,32 @@ API_AVAILABLE(ios(13.4))
|
|||||||
@end
|
@end
|
||||||
#endif
|
#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
|
@implementation ViewController
|
||||||
{
|
{
|
||||||
KBKeyboardView *keyboardView;
|
KBKeyboardView *keyboardView;
|
||||||
UISwipeGestureRecognizer *showKeyboardGesture, *hideKeyboardGesture, *insertDiskGesture, *showSettingsGesture;
|
UISwipeGestureRecognizer *showKeyboardGesture, *hideKeyboardGesture, *insertDiskGesture, *showSettingsGesture;
|
||||||
UIControl *pointingDeviceView;
|
UIControl *pointingDeviceView;
|
||||||
UIViewController *_keyboardViewController;
|
UIViewController *_keyboardViewController;
|
||||||
|
BOOL physicalCapsLocked;
|
||||||
id interaction;
|
id interaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,6 +451,65 @@ API_AVAILABLE(ios(13.4))
|
|||||||
[[AppDelegate sharedEmulator] keyUp:scancode];
|
[[AppDelegate sharedEmulator] keyUp:scancode];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event {
|
||||||
|
for (UIPress *press in presses) {
|
||||||
|
[self handlePressEvent:press];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)pressesChanged:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event {
|
||||||
|
for (UIPress *press in presses) {
|
||||||
|
[self handlePressEvent:press];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)pressesEnded:(NSSet<UIPress *> *)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
|
@end
|
||||||
|
|
||||||
#ifdef __IPHONE_13_4
|
#ifdef __IPHONE_13_4
|
||||||
|
@ -11,6 +11,6 @@
|
|||||||
|
|
||||||
int main(int argc, char * argv[]) {
|
int main(int argc, char * argv[]) {
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
return UIApplicationMain(argc, argv, @"MNVMApplication", NSStringFromClass([AppDelegate class]));
|
return UIApplicationMain(argc, argv, NSStringFromClass([UIApplication class]), NSStringFromClass([AppDelegate class]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user