Compare commits

...

103 Commits

Author SHA1 Message Date
Jesús A. Álvarez fdbf6aab7e iPad: when creating a new window, take over and close the previous one 2024-03-04 23:54:25 +01:00
Jesús A. Álvarez 19c0072d4c fix quick actions 2024-03-04 23:39:41 +01:00
Jesús A. Álvarez da3f639ef2 prefer pixel-perfect scaling when filter is set to nearest 2024-03-02 11:51:29 +01:00
Jesús A. Álvarez 65d377884b auto-hide home indicator 2024-03-01 22:49:04 +01:00
Jesús A. Álvarez 2dab9cca28 update README 2024-03-01 22:24:34 +01:00
Jesús A. Álvarez fcb71f79ff visionOS: use native toggles in menus 2024-02-17 15:21:41 +01:00
Jesús A. Álvarez 2ccef4e3a6 visionOS: add “run in background” setting and respect it 2024-02-17 15:21:41 +01:00
Jesús A. Álvarez fca6943bfe close keyboard when closing screen 2024-02-17 14:42:31 +01:00
Jesús A. Álvarez afef4e5b25 always show keyboard again when pressing keyboard button 2024-02-17 14:41:22 +01:00
Jesús A. Álvarez 772ce2c326 handle mouse input with UIHoverGestureRecognizer 2024-02-17 14:35:19 +01:00
Jesús A. Álvarez ef6ef61037 target iOS 13.4 2024-02-17 13:31:39 +01:00
Jesús A. Álvarez 3b4244e4e3 ifdef around all visionOS-specific things 2024-02-17 13:25:32 +01:00
Jesús A. Álvarez c1c7c93c6a handle key input with UIPress (iOS ≥9)
contributed by Steven Troughton-Smith
2024-02-17 13:25:32 +01:00
Jesús A. Álvarez 61dc6ddcd7 target iOS 13.0 2024-02-17 13:20:50 +01:00
Jesús A. Álvarez 0204043e10 add glass background to bar, remove from buttons 2024-02-16 21:29:22 +01:00
Jesús A. Álvarez 043c20b645 visionOS: make keyboard resizable ±25% 2024-02-10 21:37:13 +01:00
Jesús A. Álvarez 7a93412c3f visionOS: add reset, interrupt and shut down controls 2024-02-10 14:52:06 +01:00
Jesús A. Álvarez e1adde78f0 visionOS: hide toolbar from insert disk modal 2024-02-10 14:43:09 +01:00
Jesús A. Álvarez 632f01f169 visionOS: native settings menu 2024-02-10 14:43:09 +01:00
Jesús A. Álvarez ed99d1bbfb visionOS: show layout menu from keyboard button 2024-02-10 14:23:42 +01:00
Jesús A. Álvarez 53cb92f4ef find keyboard layouts from AppDelegate 2024-02-10 14:09:02 +01:00
Jesús A. Álvarez 22256824d2 make AppDelegate a bit swifty 2024-02-10 13:36:20 +01:00
Jesús A. Álvarez 3b96faf502 fix bundle identifier for MacII-512x384 2024-02-10 13:31:28 +01:00
Jesús A. Álvarez 33e01e0847 visionOS: always use touchscreen 2024-02-10 12:19:20 +01:00
Jesús A. Álvarez 7c1f280374 keyboard for visionOS 2024-02-10 12:15:01 +01:00
Jesús A. Álvarez 4aef44bf76 add icon for visionOS 2024-02-10 12:02:13 +01:00
Jesús A. Álvarez cf86226c6b build for visionOS 2024-02-09 16:06:37 +01:00
Jesús A. Álvarez 8f4bc46d12 target iOS 12.0 2024-02-09 15:39:32 +01:00
Jesús A. Álvarez 003c075108 update readme 2023-09-27 20:37:16 +02:00
Jesús A. Álvarez e2707af5ce use release build by default 2023-09-27 19:42:58 +02:00
Jesús A. Álvarez e8c8b8375f add 512×384 variant of Mac II 2023-09-27 19:42:36 +02:00
Jesús A. Álvarez 3db3bb6091 fix build with Xcode 15 2023-09-27 19:29:43 +02:00
Jesús A. Álvarez 7e2fc6ef59 update copyright year, change twitter link to mastodon 2023-02-03 21:48:24 +01:00
Jesús A. Álvarez ceb0813eee steal key events if handled by emulator
fixes #45 somewhat, but not for ⌘-Q or ⌘-H
2023-02-01 18:11:49 +01:00
Jesús A. Álvarez 1cfc5bd94f fix crash when deleting files on iPad 2022-05-26 20:24:05 +02:00
Jesús A. Álvarez aa52115d41 remove xpath usage from makefile 2022-05-26 19:50:48 +02:00
Jesús A. Álvarez 1a4d707447 call it 2.5 2022-05-26 19:15:46 +02:00
Jesús A. Álvarez 0b1eb1a37b add boot disks to app's quick actions 2022-05-26 19:12:09 +02:00
Jesús A. Álvarez d93ae3ce89 use default modal presentation transition for settings and disks
getting it right on iPad and iPhone seems too much of a hack
2022-05-26 17:43:16 +02:00
Jesús A. Álvarez ada4e0a4dd update to Mini vMac 37.03 beta 2022-05-26 16:22:32 +02:00
Bart a70c23fc70 use https URL for submodules 2022-01-05 18:24:09 +01:00
Jesús A. Álvarez d1eab98945 update README 2020-10-01 23:03:02 +02:00
Jesús A. Álvarez 21de19443a fix broken view after interactive sheet dismiss on iOS 13 2020-10-01 22:50:38 +02:00
Jesús A. Álvarez 479b9c243c show delete confirmation as action sheet 2020-10-01 22:50:38 +02:00
Jesús A. Álvarez 09fd85ca16 make launch screen black 2020-10-01 22:50:38 +02:00
Jesús A. Álvarez c4bd05128f use contextual menu for disk images on iOS 13 or later 2020-10-01 22:50:38 +02:00
Jesús A. Álvarez 9b74889621 handle dark mode on activity indicator 2020-10-01 22:50:38 +02:00
Jesús A. Álvarez c548061f42 add missing nullability annotation 2020-10-01 22:50:38 +02:00
Jesús A. Álvarez dfc5c9e01f set minimum target to iOS 9
remove iOS 8 stuff
2020-10-01 22:50:37 +02:00
Jesús A. Álvarez cd0bfb0638 bump version 2020-09-30 22:17:37 +02:00
Jesús A. Álvarez 66ed7bd009 update Mini vMac to b37.200926 2020-09-30 22:15:46 +02:00
Jesús A. Álvarez 79fb9b2c25 clear screen immediately when switching emulators 2020-09-25 22:17:04 +02:00
Jesús A. Álvarez bf2cde331d remove unused files from previous Mini vMac source import 2020-09-25 22:15:39 +02:00
Jesús A. Álvarez dead799d16 only reset speed when saved speed is faster than default
this saves the preferences, but still prevents accidentally locking up the app by setting a fast speed on a low end device
2020-09-25 22:13:52 +02:00
Jesús A. Álvarez fd665a1761 allow changing emulated machine without relaunching the app 2020-09-25 00:29:30 +02:00
Jesús A. Álvarez af3b2ba5b1 cache bundle icons manually
otherwise they seem to get mixed up on iOS 14
2020-09-25 00:16:53 +02:00
Jesús A. Álvarez b72a6f058a update to Mini vMac b37.200912 with patch fixing wintergames 2020-09-24 22:54:05 +02:00
Jesús A. Álvarez d2fda78a9c updated README.md 2020-06-23 20:21:54 +02:00
Jesús A. Álvarez 44f090a506 show gesture help screen by default 2020-06-23 19:19:28 +02:00
Jesús A. Álvarez ddfe6201a6 handle hardware mouse in trackpad mode 2020-06-23 19:07:30 +02:00
Jesús A. Álvarez 5ab79e73e2 don't annotate whole view controller with API_AVAILABLE(ios(13.4)) 2020-06-23 18:39:05 +02:00
Jesús A. Álvarez 9d3f2bd98c add gesture help screen 2020-06-23 18:32:07 +02:00
Jesús A. Álvarez 038ea05f0b remove flip transition between settings and disk views
it's based on ancient hacks that don't look good on modern iOS
2020-06-22 21:07:01 +02:00
Jesús A. Álvarez d2b8238109 update version 2020-06-22 18:16:37 +02:00
Jesús A. Álvarez 22c1849d70 support split screen multitasking 2020-06-22 18:16:37 +02:00
Jesús A. Álvarez 9a76a98ef9 put emulator bundles in Frameworks instead of PlugIns
fixes sideloading with AltStore
2020-06-22 14:38:01 +02:00
Jesús A. Álvarez 95756edc1f makefile: read version from built Info.plist 2020-05-14 19:15:24 +02:00
Jesús A. Álvarez 5d3ff85601 update version and copyright 2020-05-10 20:42:40 +02:00
Jesús A. Álvarez a5ef2cdb68 support dark mode on keyboard view 2020-05-10 20:41:33 +02:00
Jesús A. Álvarez 6f4cb689e4 add transparency to Mac II icon 2020-05-10 19:48:02 +02:00
Jesús A. Álvarez 877618862d support dark mode in settings and insert disk views 2020-05-10 19:41:01 +02:00
Jesús A. Álvarez 4d397d9c94 fix crash when pressing dead keys on physical keyboard 2020-04-03 12:35:55 +02:00
Jesús A. Álvarez 3af32e9acc
Merge pull request #35 from narbs/master
Add support for mouse pointer interaction introduced in iOS 13.4
2020-03-31 12:09:56 +02:00
narbs 1932ed3e03
Update Mini vMac/ViewController.m to hide the iOS system pointer when running on iOS 13.4
Uses the UIPointerStyle hiddenPointerStyle to set hide the iOS cursor in the pointerInteraction:styleForRegion delegate method. Also returns the defaultRegion in the pointerInteraction:regionForRequest:defaultRegion delegate method instead of returning nil

Co-Authored-By: Jesús A. Álvarez <zydeco@namedfork.net>
2020-03-31 13:00:57 +10:00
Christian Clare ee1c0357f2 Add support for mouse pointer interaction introduce d in iOS 13.4. When a mouse is connected to an iPad, the emulated mouse pointer will follow the iOS mouse pointer movements. Change is backward compatible to earlier iOS versions < 13.4 without mouse pointer support 2020-03-29 23:51:04 +10:00
Jesús A. Álvarez 455db22df5 fix mouse offset on notched screens 2019-05-03 21:46:04 +02:00
Jesús A. Álvarez e4c4d2f85c update README.md 2019-05-03 21:45:22 +02:00
Jesús A. Álvarez 857ef56be5 update to Mini vMac 36.04 2019-05-03 21:21:30 +02:00
Jesús A. Álvarez da174dde3d update build for Xcode 10 2018-09-30 22:14:05 +02:00
Jesús A. Álvarez 3ff092ded5 defer system gestures 2018-04-28 16:53:39 +02:00
Jesús A. Álvarez 49fa9c0182 copy opened files instead of moving 2018-04-28 13:05:20 +02:00
Jesús A. Álvarez f597a5ab9e update copyright year 2018-04-28 12:12:43 +02:00
Jesús A. Álvarez 40d93319f7 clavier français 2018-04-28 12:03:30 +02:00
Jesús A. Álvarez b73ced1dc2 bump version 2018-04-28 11:50:29 +02:00
Jesús A. Álvarez 1700d38dd7 show documents directory in iOS 11 files 2018-04-28 11:50:22 +02:00
Jesús A. Álvarez a6e6014220 also load keyboard layouts from Documents/Keyboard Layouts 2018-04-28 11:49:05 +02:00
Jesús A. Álvarez 097ac4e64d round scale up to 1.0 if it's > 0.9 2017-11-30 20:35:38 +01:00
Jesús A. Álvarez 97ab910a84 use nearest neighbour interpolation if scale is integer 2017-11-30 20:34:59 +01:00
Jesús A. Álvarez 6d5d57787b add settings to choose display scaling filter
resolves #23
2017-11-30 20:09:08 +01:00
Jesús A. Álvarez 838f7b241e update insets for iPhone X 2017-11-28 19:25:33 +01:00
Jesús A. Álvarez f7c3af636d convert to unix line endings 2017-10-01 20:30:42 +02:00
Jesús A. Álvarez 0643f8af6b update project settings for Xcode 9 2017-10-01 16:22:55 +02:00
Jesús A. Álvarez e010bed7d1 add missing super call 2017-10-01 13:47:47 +02:00
Jesús A. Álvarez 041c986ac4 ensure inserted disk paths are always standardized 2017-10-01 13:39:18 +02:00
Jesús A. Álvarez c3cc54e1f4 show version of Mini vMac core in settings 2017-09-23 15:54:59 +02:00
Jesús A. Álvarez deeb7b1247 update version and copyright year 2017-09-23 15:54:59 +02:00
Jesús A. Álvarez 49d44a6847 update to Mini vMac 3.5.8 (resolves #21) 2017-09-23 15:54:59 +02:00
Jesús A. Álvarez cd39334ebb update readme 2016-12-04 22:37:32 +01:00
Jesús A. Álvarez 9f2e3f87c0 support bluetooth HID pointing devices through BTC Mouse 2016-12-04 20:05:24 +01:00
Jesús A. Álvarez 81d985f190 bump version 2016-11-21 23:12:10 +01:00
Jesús A. Álvarez 09a178e85c don't play audio if switch is on silent 2016-11-21 23:10:46 +01:00
Jesús A. Álvarez 4f627541d2 more compatible way of checking for sandbox, hopefully 2016-11-21 23:07:10 +01:00
Jesús A. Álvarez 7103f11578 update readme 2016-11-19 00:37:32 +01:00
222 changed files with 4534 additions and 41439 deletions

4
.gitmodules vendored
View File

@ -4,3 +4,7 @@
[submodule "libres"]
path = libres
url = https://github.com/zydeco/libres.git
[submodule "minivmac"]
path = minivmac
url = https://github.com/zydeco/minivmac.git
branch = wintergames

View File

@ -3,7 +3,7 @@ PROJECT="Mini vMac.xcodeproj"
SCHEME="Mini vMac"
CONFIGURATION=Release
APP="build/Build/Products/$(CONFIGURATION)-iphoneos/Mini vMac.app"
VERSION=`xpath 2>/dev/null Mini\ vMac/Info.plist "/plist/dict/key[.='CFBundleShortVersionString']/following-sibling::*[1]/text()"`
VERSION=`plutil -extract CFBundleShortVersionString raw $(APP)/Info.plist -o -`
LDID=ldid
deb: $(APP)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:Mini vMac.xcodeproj">
</FileRef>
</Workspace>

View File

@ -0,0 +1,37 @@
{
"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "9C19786155D97B8ED78AB84AFAAA50249126341A",
"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : {
},
"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : {
"9C19786155D97B8ED78AB84AFAAA50249126341A" : 0,
"F2E8D120DACD6BF5E1EFFA012C92CE6FA0E44B4C" : 0,
"45D35ABA2A883CFEB6F6014CF9723CDA568B602B" : 0
},
"DVTSourceControlWorkspaceBlueprintIdentifierKey" : "A273011D-9F4F-4F93-8287-77CF2E175709",
"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
"9C19786155D97B8ED78AB84AFAAA50249126341A" : "minivmac4ios\/",
"F2E8D120DACD6BF5E1EFFA012C92CE6FA0E44B4C" : "minivmac4ios\/libres\/",
"45D35ABA2A883CFEB6F6014CF9723CDA568B602B" : "minivmac4ios\/libmfs\/"
},
"DVTSourceControlWorkspaceBlueprintNameKey" : "Mini vMac",
"DVTSourceControlWorkspaceBlueprintVersion" : 204,
"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "Mini vMac.xcodeproj",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/zydeco\/libmfs.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "45D35ABA2A883CFEB6F6014CF9723CDA568B602B"
},
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:zydeco\/minivmac4ios.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "9C19786155D97B8ED78AB84AFAAA50249126341A"
},
{
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/zydeco\/libres.git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git",
"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "F2E8D120DACD6BF5E1EFFA012C92CE6FA0E44B4C"
}
]
}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -29,11 +29,9 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
@ -51,8 +49,6 @@
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "28C67BD02AC49E46000C7540"
BuildableName = "MacII-512x384.framework"
BlueprintName = "MacII-512x384"
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "28C67BD02AC49E46000C7540"
BuildableName = "MacII-512x384.framework"
BlueprintName = "MacII-512x384"
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -29,11 +29,9 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
@ -51,8 +49,6 @@
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -29,11 +29,9 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
@ -51,8 +49,6 @@
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -29,11 +29,9 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
@ -51,8 +49,6 @@
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -27,8 +27,6 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@ -38,8 +36,8 @@
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@ -71,8 +69,6 @@
isEnabled = "NO">
</CommandLineArgument>
</CommandLineArguments>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -29,8 +29,6 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@ -51,8 +49,6 @@
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -29,8 +29,6 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@ -51,8 +49,6 @@
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -29,8 +29,6 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@ -51,8 +49,6 @@
ReferencedContainer = "container:Mini vMac.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"

View File

@ -3,11 +3,12 @@
// Mini vMac
//
// Created by Jesús A. Álvarez on 27/04/2016.
// Copyright © 2016 namedfork. All rights reserved.
// Copyright © 2016-2018 namedfork. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "EmulatorProtocol.h"
#import "BTCMouse.h"
extern NSString *DocumentsChangedNotification;
@ -15,16 +16,23 @@ extern NSString *DocumentsChangedNotification;
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, readonly) NSString *documentsPath;
@property (nonatomic, readonly) NSString *userKeyboardLayoutsPath;
@property (nonatomic, readonly) NSArray<NSString*> *diskImageExtensions;
@property (nonatomic, readonly) NSArray<NSBundle*> *emulatorBundles;
@property (nonatomic, readonly) NSString *emulatorBundlesPath;
@property (readonly, nonatomic, getter = isSandboxed) BOOL sandboxed;
@property (readonly, nonatomic) id<Emulator> sharedEmulator;
@property (readonly, nonatomic) NSArray<NSString*> *keyboardLayoutPaths;
+ (instancetype)sharedInstance;
+ (id<Emulator>)sharedEmulator;
@property (class, readonly, strong) AppDelegate *sharedInstance NS_SWIFT_NAME(shared);
@property (class, readonly, strong) id<Emulator> sharedEmulator NS_SWIFT_NAME(emulator);
- (void)loadAndStartEmulator;
- (void)showAlertWithTitle:(NSString *)title message:(NSString *)message;
- (IBAction)showInsertDisk:(id)sender;
- (IBAction)showSettings:(id)sender;
- (IBAction)showGestureHelp:(id)sender;
- (UIScene*)sceneWithName:(NSString*)name;
@end

View File

@ -3,25 +3,25 @@
// Mini vMac
//
// Created by Jesús A. Álvarez on 27/04/2016.
// Copyright © 2016 namedfork. All rights reserved.
// Copyright © 2016-2018 namedfork. All rights reserved.
//
@import AVFoundation;
#import "AppDelegate.h"
#import "SettingsViewController.h"
#import "InsertDiskViewController.h"
#import "ViewController.h"
static AppDelegate *sharedAppDelegate = nil;
static NSObject<Emulator> *sharedEmulator = nil;
NSString *DocumentsChangedNotification = @"documentsChanged";
@interface AppDelegate () <UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning>
@interface AppDelegate () <BTCMouseDelegate>
@end
@implementation AppDelegate
{
UISwipeGestureRecognizerDirection modalPanePresentationDirection;
}
+ (instancetype)sharedInstance {
@ -34,12 +34,18 @@ NSString *DocumentsChangedNotification = @"documentsChanged";
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
sharedAppDelegate = self;
if (![self loadEmulator:[[NSUserDefaults standardUserDefaults] stringForKey:@"machine"]]) {
[self loadEmulator:@"MacPlus4M"];
}
[self initDefaults];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:NULL];
[sharedEmulator performSelector:@selector(run) withObject:nil afterDelay:0.1];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:NULL];
[self loadAndStartEmulator];
if ([application respondsToSelector:@selector(btcMouseSetRawMode:)]) {
[application btcMouseSetRawMode:YES];
[application btcMouseSetDelegate:self];
}
// populate documents directory so it shows up in Files
[[NSFileManager defaultManager] createDirectoryAtPath:self.userKeyboardLayoutsPath withIntermediateDirectories:YES attributes:nil error:nil];
return YES;
}
@ -54,12 +60,14 @@ NSString *DocumentsChangedNotification = @"documentsChanged";
@"machine": @"MacPlus4M",
@"speedValue": @(sharedEmulator.initialSpeed),
@"runInBackground": @NO,
@"autoSlow": @(sharedEmulator.initialAutoSlow)
@"autoSlow": @(sharedEmulator.initialAutoSlow),
@"screenFilter": kCAFilterLinear,
@"autoShowGestureHelp": @YES,
@"recentDisks": @[]
};
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:defaultValues];
[defaults setValue:@(sharedEmulator.initialSpeed) forKey:@"speedValue"];
[defaults addObserver:self forKeyPath:@"speedValue" options:0 context:NULL];
}
@ -74,12 +82,15 @@ NSString *DocumentsChangedNotification = @"documentsChanged";
}
}
- (NSString*)emulatorBundlesPath {
return [NSBundle mainBundle].privateFrameworksPath;
}
- (NSArray<NSBundle*>*)emulatorBundles {
NSString *pluginsPath = [NSBundle mainBundle].builtInPlugInsPath;
NSArray<NSString*> *names = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:pluginsPath error:NULL];
NSArray<NSString*> *names = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:self.emulatorBundlesPath error:NULL];
NSMutableArray *emulatorBundles = [NSMutableArray arrayWithCapacity:names.count];
for (NSString *name in [names pathsMatchingExtensions:@[@"mnvm"]]) {
NSBundle *bundle = [NSBundle bundleWithPath:[pluginsPath stringByAppendingPathComponent:name]];
NSBundle *bundle = [NSBundle bundleWithPath:[self.emulatorBundlesPath stringByAppendingPathComponent:name]];
[emulatorBundles addObject:bundle];
}
return emulatorBundles;
@ -87,14 +98,48 @@ NSString *DocumentsChangedNotification = @"documentsChanged";
- (BOOL)loadEmulator:(NSString*)name {
NSString *emulatorBundleName = [name stringByAppendingPathExtension:@"mnvm"];
NSString *emulatorBundlePath = [[NSBundle mainBundle].builtInPlugInsPath stringByAppendingPathComponent:emulatorBundleName];
NSString *emulatorBundlePath = [self.emulatorBundlesPath stringByAppendingPathComponent:emulatorBundleName];
NSBundle *emulatorBundle = [NSBundle bundleWithPath:emulatorBundlePath];
[emulatorBundle load];
sharedEmulator = [[emulatorBundle principalClass] new];
sharedEmulator.rootViewController = self.window.rootViewController;
sharedEmulator.showAlert = ^(NSString *title, NSString *message) {
[self showAlertWithTitle:title message:message];
};
sharedEmulator.dataPath = self.documentsPath;
#if defined(TARGET_OS_VISION) && TARGET_OS_VISION == 1
[ViewController adjustToScreenSize];
#endif
return sharedEmulator != nil;
}
- (void)loadAndStartEmulator {
[self willChangeValueForKey:@"sharedEmulator"];
if (sharedEmulator) {
NSBundle *bundle = sharedEmulator.bundle;
id<Emulator> oldEmulator = sharedEmulator;
sharedEmulator = nil;
[oldEmulator shutdown];
[bundle unload];
}
if (![self loadEmulator:[[NSUserDefaults standardUserDefaults] stringForKey:@"machine"]]) {
[self loadEmulator:@"MacPlus4M"];
}
[self didChangeValueForKey:@"sharedEmulator"];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults integerForKey:@"speedValue"] > sharedEmulator.initialSpeed) {
[defaults setValue:@(sharedEmulator.initialSpeed) forKey:@"speedValue"];
} else {
sharedEmulator.speed = [defaults integerForKey:@"speedValue"];
}
[sharedEmulator performSelector:@selector(run) withObject:nil afterDelay:0.1];
}
- (id<Emulator>)sharedEmulator {
return sharedEmulator;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults synchronize];
@ -109,6 +154,11 @@ NSString *DocumentsChangedNotification = @"documentsChanged";
}
}
- (void)handleEventWithMove:(CGPoint)move andWheel:(float)wheel andPan:(float)pan andButtons:(int)buttons {
[sharedEmulator moveMouseX:move.x/2.0 Y:move.y/2.0];
[sharedEmulator setMouseButton:buttons == 1];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (sharedEmulator.running) {
@ -125,126 +175,60 @@ NSString *DocumentsChangedNotification = @"documentsChanged";
});
return;
}
if ([UIAlertController class]) {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
UIViewController *controller = self.window.rootViewController;
while (controller.presentedViewController) {
controller = controller.presentedViewController;
}
[controller presentViewController:alert animated:YES completion:nil];
} else {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alertView show];
BOOL wasRunning = sharedEmulator.isRunning;
UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[sharedEmulator setRunning:wasRunning];
}]];
UIViewController *controller = self.window.rootViewController;
while (controller.presentedViewController) {
controller = controller.presentedViewController;
}
[controller presentViewController:alert animated:YES completion:nil];
}
#pragma mark - Settings / Insert Disk panels
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler {
BOOL success = NO;
if ([shortcutItem.type isEqualToString:@"disk"]) {
NSString *fileName = (NSString*)shortcutItem.userInfo[@"disk"];
NSString *filePath = [self.documentsPath stringByAppendingPathComponent:fileName];
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath] && ![sharedEmulator isDiskInserted:filePath]) {
success = YES;
[sharedEmulator performSelector:@selector(insertDisk:) withObject:filePath afterDelay:1.0];
}
}
completionHandler(success);
}
#pragma mark - Settings / Insert Disk / Help
- (void)showSettings:(id)sender {
[self showModalPanel:@"settings" sender:sender];
[self.window.rootViewController performSelector:@selector(showSettings:) withObject:sender];
}
- (void)showInsertDisk:(id)sender {
[self showModalPanel:@"disk" sender:sender];
[self.window.rootViewController performSelector:@selector(showInsertDisk:) withObject:sender];
}
- (void)showModalPanel:(NSString*)name sender:(id)sender {
Class classToShow, otherClass;
if ([name isEqualToString:@"settings"]) {
classToShow = [SettingsViewController class];
otherClass = [InsertDiskViewController class];
} else {
classToShow = [InsertDiskViewController class];
otherClass = [SettingsViewController class];
}
UIViewController *rootViewController = self.window.rootViewController;
UIViewController *presentedViewController = rootViewController.presentedViewController;
UIViewController *presentedTopViewController = [presentedViewController isKindOfClass:[UINavigationController class]] ? [(UINavigationController*)presentedViewController topViewController] : nil;
if ([presentedTopViewController isKindOfClass:classToShow]) {
[presentedViewController dismissViewControllerAnimated:YES completion:nil];
return;
} else if ([presentedTopViewController isKindOfClass:otherClass]) {
// flip
UIViewController *viewController = [rootViewController.storyboard instantiateViewControllerWithIdentifier:name];
viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
viewController.modalPresentationStyle = UIModalPresentationFormSheet;
UIView *windowSnapshotView = [self.window snapshotViewAfterScreenUpdates:NO];
[self.window addSubview:windowSnapshotView];
UIView *oldPanelSnapshotView = [presentedViewController.view snapshotViewAfterScreenUpdates:NO];
[viewController.view addSubview:oldPanelSnapshotView];
[rootViewController dismissViewControllerAnimated:NO completion:^{
[rootViewController presentViewController:viewController animated:NO completion:^{
UIView *emptyView = [[UIView alloc] initWithFrame:viewController.view.bounds];
[windowSnapshotView removeFromSuperview];
viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[UIView transitionFromView:oldPanelSnapshotView
toView:emptyView
duration:0.5
options:UIViewAnimationOptionTransitionFlipFromRight
completion:^(BOOL finished) {
[emptyView removeFromSuperview];
}];
}];
}];
} else {
UIViewController *viewController = [rootViewController.storyboard instantiateViewControllerWithIdentifier:name];
viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
viewController.modalPresentationStyle = UIModalPresentationFormSheet;
if ([sender isKindOfClass:[UISwipeGestureRecognizer class]] && NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_8_0) {
modalPanePresentationDirection = [(UISwipeGestureRecognizer*)sender direction];
viewController.transitioningDelegate = self;
}
[rootViewController presentViewController:viewController animated:YES completion:nil];
}
}
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
return self;
}
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext {
return 0.3;
}
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
UIView *containerView = [transitionContext containerView];
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];
[containerView addSubview:toView];
switch (modalPanePresentationDirection) {
case UISwipeGestureRecognizerDirectionLeft:
toView.transform = CGAffineTransformMakeTranslation(containerView.bounds.size.width, 0);
break;
case UISwipeGestureRecognizerDirectionRight:
toView.transform = CGAffineTransformMakeTranslation(-containerView.bounds.size.width, 0);
break;
case UISwipeGestureRecognizerDirectionDown:
toView.transform = CGAffineTransformMakeTranslation(0, -containerView.bounds.size.height);
break;
default:
toView.transform = CGAffineTransformMakeTranslation(0, containerView.bounds.size.height);
}
[UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
toView.transform = CGAffineTransformIdentity;
} completion:^(BOOL finished) {
[transitionContext completeTransition:finished];
}];
- (void)showGestureHelp:(id)sender {
[self.window.rootViewController performSelector:@selector(showGestureHelp:) withObject:sender];
}
#pragma mark - Files
- (BOOL)isSandboxed {
#if TARGET_IPHONE_SIMULATOR
return YES;
#else
static dispatch_once_t onceToken;
static BOOL sandboxed;
dispatch_once(&onceToken, ^{
NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
sandboxed = ![bundlePath hasPrefix:@"/Applications/"];
// not sandboxed if parent of documents directory is "mobile"
NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject.stringByStandardizingPath;
sandboxed = ![documentsPath.stringByDeletingLastPathComponent.lastPathComponent isEqualToString:@"mobile"];
});
return sandboxed;
#endif
}
- (NSArray<NSString *> *)diskImageExtensions {
@ -264,7 +248,26 @@ NSString *DocumentsChangedNotification = @"documentsChanged";
return documentsPath;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
- (NSString *)userKeyboardLayoutsPath {
static dispatch_once_t onceToken;
static NSString *userKeyboardLayoutsPath;
dispatch_once(&onceToken, ^{
userKeyboardLayoutsPath = [self.documentsPath stringByAppendingPathComponent:@"Keyboard Layouts"];
});
return userKeyboardLayoutsPath;
}
- (NSArray<NSString *> *)keyboardLayoutPaths {
NSArray *keyboardLayouts = [[NSBundle mainBundle] pathsForResourcesOfType:@"nfkeyboardlayout" inDirectory:@"Keyboard Layouts"];
NSString *userKeyboardLayoutsPath = [AppDelegate sharedInstance].userKeyboardLayoutsPath;
NSArray *userKeyboardLayouts = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:userKeyboardLayoutsPath error:nil] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"pathExtension.lowercaseString = %@", @"nfkeyboardlayout"]];
if (userKeyboardLayouts.count > 0) {
keyboardLayouts = [keyboardLayouts arrayByAddingObjectsFromArray:userKeyboardLayouts];
}
return keyboardLayouts;
}
- (BOOL)importFileToDocuments:(NSURL *)url copy:(BOOL)copy {
if (url.fileURL) {
// opening file
NSFileManager *fileManager = [NSFileManager defaultManager];
@ -282,7 +285,11 @@ NSString *DocumentsChangedNotification = @"documentsChanged";
destinationPath = [self.documentsPath stringByAppendingPathComponent:newFileName];
tries++;
}
[fileManager moveItemAtPath:url.path toPath:destinationPath error:&error];
if (copy) {
[fileManager copyItemAtPath:url.path toPath:destinationPath error:&error];
} else {
[fileManager moveItemAtPath:url.path toPath:destinationPath error:&error];
}
if (error) {
[self showAlertWithTitle:fileName message:error.localizedFailureReason];
} else {
@ -294,4 +301,65 @@ NSString *DocumentsChangedNotification = @"documentsChanged";
return YES;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
if (url.fileURL) {
// opening file
NSString *inboxPath = [self.documentsPath stringByAppendingPathComponent:@"Inbox"];
if ([url.path.stringByStandardizingPath hasPrefix:inboxPath]) {
// pre-iOS 11 import through inbox
[url startAccessingSecurityScopedResource];
[self importFileToDocuments:url copy:NO];
[url stopAccessingSecurityScopedResource];
} else if ([url.path.stringByStandardizingPath hasPrefix:self.documentsPath]) {
// already in documents - mount
[sharedEmulator insertDisk:url.path];
} else if ([options[UIApplicationOpenURLOptionsOpenInPlaceKey] boolValue]) {
// not in documents - copy
[url startAccessingSecurityScopedResource];
[self importFileToDocuments:url copy:YES];
[url stopAccessingSecurityScopedResource];
} else {
return [self importFileToDocuments:url copy:NO];
}
}
return YES;
}
#pragma mark - Making a Scene
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
for (NSUserActivity *activity in options.userActivities) {
if ([activity.activityType isEqualToString:@"net.namedfork.keyboard"]) {
return [UISceneConfiguration configurationWithName:@"Keyboard" sessionRole:UIWindowSceneSessionRoleApplication];
}
}
if ([self sceneWithName:@"Default"] == nil) {
[[AppDelegate sharedEmulator] setRunning:YES];
return [UISceneConfiguration configurationWithName:@"Default" sessionRole:UIWindowSceneSessionRoleApplication];
}
return nil;
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
if ([self sceneWithName:@"Default"] == nil) {
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"runInBackground"] == NO) {
[[AppDelegate sharedEmulator] setRunning:NO];
}
UIScene *keyboardScene = [self sceneWithName:@"Keyboard"];
if (keyboardScene != nil) {
// if only keyboard is left, close it too
[application requestSceneSessionDestruction:keyboardScene.session options:nil errorHandler:nil];
}
}
}
- (UIScene*)sceneWithName:(NSString*)name {
for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) {
if ([scene.session.configuration.name isEqualToString:name]) {
return scene;
}
}
return nil;
}
@end

View File

@ -1,89 +1,111 @@
{
"images" : [
{
"size" : "29x29",
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"filename" : "Icon-Small@2x.png",
"scale" : "2x"
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-Small@3x.png",
"scale" : "3x"
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-Small-40@2x-1.png",
"scale" : "2x"
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-Small-40@3x.png",
"scale" : "3x"
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "Icon-60@3x.png",
"scale" : "3x"
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"size" : "29x29",
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "Icon-Small.png",
"scale" : "1x"
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-Small@2x-1.png",
"scale" : "2x"
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-Small-40.png",
"scale" : "1x"
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-Small-40@2x.png",
"scale" : "2x"
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-76.png",
"scale" : "1x"
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-76@2x.png",
"scale" : "2x"
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-iPadPro.png",
"scale" : "2x"
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"pre-rendered" : true
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -0,0 +1,13 @@
{
"images" : [
{
"filename" : "back.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,12 @@
{
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"frame-size" : {
"height" : 512,
"width" : 512
}
}
}

View File

@ -0,0 +1,17 @@
{
"info" : {
"author" : "xcode",
"version" : 1
},
"layers" : [
{
"filename" : "Front.solidimagestacklayer"
},
{
"filename" : "Middle.solidimagestacklayer"
},
{
"filename" : "Back.solidimagestacklayer"
}
]
}

View File

@ -0,0 +1,13 @@
{
"images" : [
{
"filename" : "Icon.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

View File

@ -0,0 +1,12 @@
{
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"frame-size" : {
"height" : 512,
"width" : 512
}
}
}

View File

@ -0,0 +1,13 @@
{
"images" : [
{
"filename" : "screen.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 B

View File

@ -0,0 +1,12 @@
{
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"frame-size" : {
"height" : 512,
"width" : 512
}
}
}

View File

@ -1,6 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBCapsLock~iphone@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBCapsLock~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBCapsLock~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBCapsLock~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBCapsLock~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 317 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBClearDown~iphone@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBClearDown~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBClearDown~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBClearDown~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBClearDown~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBClearUp~iphone.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBClearUp~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBClearUp~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBClearUp~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBClearUp~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBKeyCommand@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBKeyCommand@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBCommand~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBCommand@2x~ipad.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBCommand@2x~ipad 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBDeleteDown~iphone@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBDeleteDown~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBDeleteDown~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBDeleteDown~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBDeleteDown~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBDeleteUp~iphone.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBDeleteUp~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBDeleteUp~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBDeleteUp~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBDeleteUp~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 726 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBForwardDeleteDown~iphone@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBForwardDeleteDown~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBForwardDeleteDown~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBForwardDeleteDown~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBForwardDeleteDown~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBForwardDeleteUp~iphone.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBForwardDeleteUp~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBForwardDeleteUp~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBForwardDeleteUp~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBForwardDeleteUp~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 B

View File

@ -1,32 +1,41 @@
{
"images" : [
{
"filename" : "KBHide~ipad 2.png",
"idiom" : "iphone",
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBHide~iphone@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBHide~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBHide~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBHide~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBHide~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

View File

@ -1,103 +1,247 @@
{
"images" : [
{
"filename" : "KBKey.png",
"idiom" : "iphone",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 1,
"height" : 1
},
"cap-insets" : {
"bottom" : 8,
"top" : 8,
"left" : 8,
"right" : 8,
"left" : 8
}
"top" : 8
},
"center" : {
"height" : 1,
"mode" : "tile",
"width" : 1
},
"mode" : "9-part"
},
"idiom" : "iphone",
"filename" : "KBKey.png",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKey-1.png",
"idiom" : "iphone",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 2,
"height" : 2
"cap-insets" : {
"bottom" : 8,
"left" : 8,
"right" : 8,
"top" : 8
},
"center" : {
"height" : 1,
"mode" : "tile",
"width" : 1
},
"mode" : "9-part"
},
"scale" : "1x"
},
{
"filename" : "KBKey@2x.png",
"idiom" : "iphone",
"resizing" : {
"cap-insets" : {
"bottom" : 16,
"top" : 16,
"left" : 16,
"right" : 16,
"left" : 16
}
"top" : 16
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"idiom" : "iphone",
"filename" : "KBKey@2x.png",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKey@2x-1.png",
"idiom" : "iphone",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 3,
"height" : 3
"cap-insets" : {
"bottom" : 16,
"left" : 16,
"right" : 16,
"top" : 16
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"scale" : "2x"
},
{
"filename" : "KBKey@3x.png",
"idiom" : "iphone",
"resizing" : {
"cap-insets" : {
"bottom" : 24,
"top" : 24,
"left" : 24,
"right" : 24,
"left" : 24
}
"top" : 24
},
"center" : {
"height" : 3,
"mode" : "tile",
"width" : 3
},
"mode" : "9-part"
},
"idiom" : "iphone",
"filename" : "KBKey@3x.png",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKey@3x-2.png",
"idiom" : "iphone",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 1,
"height" : 1
"cap-insets" : {
"bottom" : 24,
"left" : 24,
"right" : 24,
"top" : 24
},
"center" : {
"height" : 3,
"mode" : "tile",
"width" : 3
},
"mode" : "9-part"
},
"scale" : "3x"
},
{
"filename" : "KBKey~ipad.png",
"idiom" : "ipad",
"resizing" : {
"cap-insets" : {
"bottom" : 16,
"top" : 16,
"left" : 16,
"right" : 16,
"left" : 16
}
"top" : 16
},
"center" : {
"height" : 1,
"mode" : "tile",
"width" : 1
},
"mode" : "9-part"
},
"idiom" : "ipad",
"filename" : "KBKey~ipad.png",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKey~ipad-2.png",
"idiom" : "ipad",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 2,
"height" : 2
"cap-insets" : {
"bottom" : 16,
"left" : 16,
"right" : 16,
"top" : 16
},
"center" : {
"height" : 1,
"mode" : "tile",
"width" : 1
},
"mode" : "9-part"
},
"scale" : "1x"
},
{
"filename" : "KBKey@2x~ipad.png",
"idiom" : "ipad",
"resizing" : {
"cap-insets" : {
"bottom" : 32,
"top" : 32,
"left" : 32,
"right" : 32,
"left" : 32
}
"top" : 32
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKey@2x~ipad-2.png",
"idiom" : "ipad",
"filename" : "KBKey@2x~ipad.png",
"resizing" : {
"cap-insets" : {
"bottom" : 32,
"left" : 32,
"right" : 32,
"top" : 32
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"scale" : "2x"
},
{
"filename" : "KBKey@2x~ipad-2 1.png",
"idiom" : "vision",
"resizing" : {
"cap-insets" : {
"bottom" : 32,
"left" : 32,
"right" : 32,
"top" : 32
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 B

View File

@ -1,103 +1,247 @@
{
"images" : [
{
"filename" : "KBKeyDark.png",
"idiom" : "iphone",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 1,
"height" : 1
},
"cap-insets" : {
"bottom" : 8,
"top" : 8,
"left" : 8,
"right" : 8,
"left" : 8
}
"top" : 8
},
"center" : {
"height" : 1,
"mode" : "tile",
"width" : 1
},
"mode" : "9-part"
},
"idiom" : "iphone",
"filename" : "KBKeyDark.png",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKeyDark-1.png",
"idiom" : "iphone",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 2,
"height" : 2
"cap-insets" : {
"bottom" : 8,
"left" : 8,
"right" : 8,
"top" : 8
},
"center" : {
"height" : 1,
"mode" : "tile",
"width" : 1
},
"mode" : "9-part"
},
"scale" : "1x"
},
{
"filename" : "KBKeyDark@2x.png",
"idiom" : "iphone",
"resizing" : {
"cap-insets" : {
"bottom" : 16,
"top" : 16,
"left" : 16,
"right" : 16,
"left" : 16
}
"top" : 16
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"idiom" : "iphone",
"filename" : "KBKeyDark@2x.png",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKeyDark@2x-1.png",
"idiom" : "iphone",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 3,
"height" : 3
"cap-insets" : {
"bottom" : 16,
"left" : 16,
"right" : 16,
"top" : 16
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"scale" : "2x"
},
{
"filename" : "KBKeyDark@3x.png",
"idiom" : "iphone",
"resizing" : {
"cap-insets" : {
"bottom" : 24,
"top" : 24,
"left" : 24,
"right" : 24,
"left" : 24
}
"top" : 24
},
"center" : {
"height" : 3,
"mode" : "tile",
"width" : 3
},
"mode" : "9-part"
},
"idiom" : "iphone",
"filename" : "KBKeyDark@3x.png",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKeyDark@3x-1.png",
"idiom" : "iphone",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 1,
"height" : 1
"cap-insets" : {
"bottom" : 24,
"left" : 24,
"right" : 24,
"top" : 24
},
"center" : {
"height" : 3,
"mode" : "tile",
"width" : 3
},
"mode" : "9-part"
},
"scale" : "3x"
},
{
"filename" : "KBKeyDark~ipad.png",
"idiom" : "ipad",
"resizing" : {
"cap-insets" : {
"bottom" : 16,
"top" : 16,
"left" : 16,
"right" : 16,
"left" : 16
}
"top" : 16
},
"center" : {
"height" : 1,
"mode" : "tile",
"width" : 1
},
"mode" : "9-part"
},
"idiom" : "ipad",
"filename" : "KBKeyDark~ipad.png",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKeyDark~ipad-1.png",
"idiom" : "ipad",
"resizing" : {
"mode" : "9-part",
"center" : {
"mode" : "tile",
"width" : 2,
"height" : 2
"cap-insets" : {
"bottom" : 16,
"left" : 16,
"right" : 16,
"top" : 16
},
"center" : {
"height" : 1,
"mode" : "tile",
"width" : 1
},
"mode" : "9-part"
},
"scale" : "1x"
},
{
"filename" : "KBKeyDark@2x~ipad.png",
"idiom" : "ipad",
"resizing" : {
"cap-insets" : {
"bottom" : 32,
"top" : 32,
"left" : 32,
"right" : 32,
"left" : 32
}
"top" : 32
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "KBKeyDark@2x~ipad-1.png",
"idiom" : "ipad",
"filename" : "KBKeyDark@2x~ipad.png",
"resizing" : {
"cap-insets" : {
"bottom" : 32,
"left" : 32,
"right" : 32,
"top" : 32
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"scale" : "2x"
},
{
"filename" : "KBKeyDark@2x~ipad-1 1.png",
"idiom" : "vision",
"resizing" : {
"cap-insets" : {
"bottom" : 32,
"left" : 32,
"right" : 32,
"top" : 32
},
"center" : {
"height" : 2,
"mode" : "tile",
"width" : 2
},
"mode" : "9-part"
},
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBNumPad@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBNumPad@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBNumPad~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBNumPad@2x~ipad.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBNumPad@2x~ipad 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBKeyOption@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBKeyOption@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBOption~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBOption@2x~ipad.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBOption@2x~ipad 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBShiftDown~iphone@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBShiftDown~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBShiftDown~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBShiftDown~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBShiftDown~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

View File

@ -5,28 +5,36 @@
"scale" : "1x"
},
{
"idiom" : "iphone",
"filename" : "KBShiftUp~iphone@2x.png",
"idiom" : "iphone",
"scale" : "2x"
},
{
"idiom" : "iphone",
"filename" : "KBShiftUp~iphone@3x.png",
"idiom" : "iphone",
"scale" : "3x"
},
{
"idiom" : "ipad",
"filename" : "KBShiftUp~ipad.png",
"idiom" : "ipad",
"scale" : "1x"
},
{
"idiom" : "ipad",
"filename" : "KBShiftUp~ipad@2x.png",
"idiom" : "ipad",
"scale" : "2x"
},
{
"filename" : "KBShiftUp~ipad@2x 1.png",
"idiom" : "vision",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 B

View File

@ -1,23 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "reset.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "reset@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "reset@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

View File

@ -1,23 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "Settings.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "Settings@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "Settings@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

View File

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "Swipe2Down.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Swipe2Down@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Swipe2Down@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "Swipe2Left.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Swipe2Left@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Swipe2Left@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "Swipe2Right.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Swipe2Right@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Swipe2Right@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "Swipe2Up.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "Swipe2Up@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "Swipe2Up@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -1,23 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "document.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "document@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "document@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

View File

@ -1,23 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "floppy.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "floppy@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "floppy@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

View File

@ -1,23 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "floppy30.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "floppy30@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "floppy30@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

View File

@ -1,23 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "floppyV.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "floppyV@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "floppyV@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

View File

@ -1,23 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "folder.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "folder@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "folder@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

View File

@ -1,23 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "hardDisk.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "hardDisk@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "hardDisk@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
}

20
Mini vMac/BTCMouse.h Normal file
View File

@ -0,0 +1,20 @@
//
// BTCMouse.h
// Mini vMac
//
// Created by Jesús A. Álvarez on 04/12/2016.
// Copyright © 2016-2018 namedfork. All rights reserved.
//
@protocol BTCMouseDelegate
- (void)handleEventWithMove:(CGPoint)move andWheel:(float)wheel andPan:(float)pan andButtons:(int)buttons;
@end
@interface UIApplication (BTCMouse)
- (void)btcMouseSetPanning:(BOOL)panning;
- (void)btcMouseSetZooming:(BOOL)zooming;
- (void)btcMouseSetDelegate:(id<BTCMouseDelegate>)delegate;
- (void)btcMouseSetRawMode:(BOOL)rawMode;
@end

View File

@ -1,7 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="8150" systemVersion="15A204g" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="8122"/>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
@ -13,10 +16,9 @@
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>

View File

@ -1,64 +1,236 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina5_9" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
<viewController modalPresentationStyle="currentContext" id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="70W-4V-tYr" customClass="ScreenView">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
<rect key="frame" x="0.0" y="44" width="375" height="734"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<visualEffectView hidden="YES" opaque="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="o5Z-in-kcg">
<rect key="frame" x="37.666666666666657" y="186" width="300" height="440"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="VP8-Cw-QnG">
<rect key="frame" x="0.0" y="0.0" width="300" height="440"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<visualEffectView opaque="NO" contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6hC-03-7fj">
<rect key="frame" x="0.0" y="0.0" width="60" height="312"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="BAe-j4-Jso">
<rect key="frame" x="0.0" y="0.0" width="60" height="312"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
<vibrancyEffect>
<blurEffect style="regular"/>
</vibrancyEffect>
</visualEffectView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Gestures" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mtd-2d-R6u">
<rect key="frame" x="0.0" y="28" width="300" height="21"/>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Swipe2Left" translatesAutoresizingMaskIntoConstraints="NO" id="pzY-d9-3Z5">
<rect key="frame" x="15" y="66" width="64" height="64"/>
<color key="tintColor" systemColor="labelColor"/>
<constraints>
<constraint firstAttribute="height" constant="64" id="CmV-Bq-j5o"/>
<constraint firstAttribute="width" constant="64" id="gH6-fx-cgO"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Swipe2Right" translatesAutoresizingMaskIntoConstraints="NO" id="7WX-Kv-Q7i">
<rect key="frame" x="15" y="152" width="64" height="64"/>
<color key="tintColor" systemColor="labelColor"/>
<constraints>
<constraint firstAttribute="height" constant="64" id="8yn-GP-Kd1"/>
<constraint firstAttribute="width" constant="64" id="dEn-fC-loh"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Swipe2Up" translatesAutoresizingMaskIntoConstraints="NO" id="ogt-xN-NKI">
<rect key="frame" x="15" y="238" width="64" height="64"/>
<color key="tintColor" systemColor="labelColor"/>
<constraints>
<constraint firstAttribute="height" constant="64" id="L2w-OD-WT1"/>
<constraint firstAttribute="width" constant="64" id="yKv-YC-eFy"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Swipe2Down" translatesAutoresizingMaskIntoConstraints="NO" id="GSB-g7-f2Y">
<rect key="frame" x="15" y="324" width="64" height="64"/>
<color key="tintColor" systemColor="labelColor"/>
<constraints>
<constraint firstAttribute="width" constant="64" id="1ZM-my-t5g"/>
<constraint firstAttribute="height" constant="64" id="9hg-7C-WG2"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Insert Disk" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IYD-cg-suz">
<rect key="frame" x="87" y="66" width="80.666666666666686" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Swipe left with two fingers" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SsX-0c-kRw">
<rect key="frame" x="87" y="95" width="167" height="17"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="14"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Show Settings" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pNn-B0-E5z">
<rect key="frame" x="87" y="152" width="110" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Swipe right with two fingers" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="lHi-aV-uGo">
<rect key="frame" x="86.999999999999986" y="181" width="175.66666666666663" height="17"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="14"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Show Keyboard" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QcY-8W-bqI">
<rect key="frame" x="87" y="238" width="119" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Swipe up with two fingers" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6u4-fn-SWw">
<rect key="frame" x="86.999999999999986" y="267" width="162.66666666666663" height="17"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="14"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Hide Keyboard" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8kk-bG-T9V">
<rect key="frame" x="87" y="324" width="112" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Swipe down with two fingers" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5ZP-Fp-fg5">
<rect key="frame" x="87" y="353" width="182" height="17"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="14"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="you can disable this help in Settings" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eaR-vV-QQc">
<rect key="frame" x="0.0" y="417.66666666666663" width="300" height="14.333333333333314"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="11"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="5ZP-Fp-fg5" secondAttribute="trailing" constant="8" id="9Gu-y0-PaJ"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="pNn-B0-E5z" secondAttribute="trailing" constant="8" id="9QD-19-je9"/>
<constraint firstItem="8kk-bG-T9V" firstAttribute="leading" secondItem="GSB-g7-f2Y" secondAttribute="trailing" constant="8" id="Anm-7T-dRr"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="6u4-fn-SWw" secondAttribute="trailing" constant="8" id="CzZ-uK-QDB"/>
<constraint firstItem="pzY-d9-3Z5" firstAttribute="leading" secondItem="VP8-Cw-QnG" secondAttribute="leading" constant="15" id="Ece-TK-n4P"/>
<constraint firstItem="lHi-aV-uGo" firstAttribute="top" secondItem="pNn-B0-E5z" secondAttribute="bottom" constant="8" id="JPX-71-3Bt"/>
<constraint firstItem="5ZP-Fp-fg5" firstAttribute="top" secondItem="8kk-bG-T9V" secondAttribute="bottom" constant="8" id="PRj-jH-UYX"/>
<constraint firstItem="IYD-cg-suz" firstAttribute="leading" secondItem="pzY-d9-3Z5" secondAttribute="trailing" constant="8" id="PVd-ls-uzM"/>
<constraint firstItem="GSB-g7-f2Y" firstAttribute="top" secondItem="ogt-xN-NKI" secondAttribute="bottom" constant="22" id="Pr9-tm-GBe"/>
<constraint firstItem="IYD-cg-suz" firstAttribute="top" secondItem="pzY-d9-3Z5" secondAttribute="top" id="QaT-ga-RpH"/>
<constraint firstItem="QcY-8W-bqI" firstAttribute="top" secondItem="ogt-xN-NKI" secondAttribute="top" id="TCj-tJ-mir"/>
<constraint firstItem="lHi-aV-uGo" firstAttribute="leading" secondItem="7WX-Kv-Q7i" secondAttribute="trailing" constant="8" id="TZw-2f-LzT"/>
<constraint firstItem="7WX-Kv-Q7i" firstAttribute="top" secondItem="pzY-d9-3Z5" secondAttribute="bottom" constant="22" id="Tfj-P8-Hjm"/>
<constraint firstItem="Mtd-2d-R6u" firstAttribute="top" secondItem="VP8-Cw-QnG" secondAttribute="top" constant="28" id="UjE-40-eQC"/>
<constraint firstItem="5ZP-Fp-fg5" firstAttribute="leading" secondItem="GSB-g7-f2Y" secondAttribute="trailing" constant="8" id="UpC-yy-CJC"/>
<constraint firstItem="6u4-fn-SWw" firstAttribute="top" secondItem="QcY-8W-bqI" secondAttribute="bottom" constant="8" id="Uxi-MW-Pdu"/>
<constraint firstItem="Mtd-2d-R6u" firstAttribute="width" secondItem="VP8-Cw-QnG" secondAttribute="width" id="Wzq-tS-xNx"/>
<constraint firstItem="Mtd-2d-R6u" firstAttribute="centerX" secondItem="VP8-Cw-QnG" secondAttribute="centerX" id="YIO-q1-Kal"/>
<constraint firstItem="pzY-d9-3Z5" firstAttribute="top" secondItem="Mtd-2d-R6u" secondAttribute="bottom" constant="17" id="Yiv-2o-k6a"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="IYD-cg-suz" secondAttribute="trailing" constant="8" id="Zl8-zx-U7H"/>
<constraint firstItem="pNn-B0-E5z" firstAttribute="top" secondItem="7WX-Kv-Q7i" secondAttribute="top" id="aNO-vN-07B"/>
<constraint firstItem="SsX-0c-kRw" firstAttribute="top" secondItem="IYD-cg-suz" secondAttribute="bottom" constant="8" id="ay6-dS-d9s"/>
<constraint firstItem="GSB-g7-f2Y" firstAttribute="leading" secondItem="VP8-Cw-QnG" secondAttribute="leading" constant="15" id="gZm-k7-TnC"/>
<constraint firstItem="eaR-vV-QQc" firstAttribute="width" secondItem="VP8-Cw-QnG" secondAttribute="width" id="hGL-WS-EBl"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="lHi-aV-uGo" secondAttribute="trailing" constant="8" id="imt-CF-8d7"/>
<constraint firstItem="ogt-xN-NKI" firstAttribute="leading" secondItem="VP8-Cw-QnG" secondAttribute="leading" constant="15" id="ivK-8T-nqE"/>
<constraint firstItem="QcY-8W-bqI" firstAttribute="leading" secondItem="ogt-xN-NKI" secondAttribute="trailing" constant="8" id="j2z-Af-SeH"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="SsX-0c-kRw" secondAttribute="trailing" constant="8" id="kFP-MT-M1q"/>
<constraint firstItem="pNn-B0-E5z" firstAttribute="leading" secondItem="7WX-Kv-Q7i" secondAttribute="trailing" constant="8" id="mor-uC-od4"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="8kk-bG-T9V" secondAttribute="trailing" constant="8" id="nvs-GX-kwP"/>
<constraint firstItem="6u4-fn-SWw" firstAttribute="leading" secondItem="ogt-xN-NKI" secondAttribute="trailing" constant="8" id="pEX-d7-Ybb"/>
<constraint firstItem="eaR-vV-QQc" firstAttribute="centerX" secondItem="VP8-Cw-QnG" secondAttribute="centerX" id="r6H-B1-mRG"/>
<constraint firstItem="8kk-bG-T9V" firstAttribute="top" secondItem="GSB-g7-f2Y" secondAttribute="top" id="u9p-vU-w4i"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="QcY-8W-bqI" secondAttribute="trailing" constant="8" id="uVe-7l-e36"/>
<constraint firstItem="ogt-xN-NKI" firstAttribute="top" secondItem="7WX-Kv-Q7i" secondAttribute="bottom" constant="22" id="xRf-Rk-xeC"/>
<constraint firstAttribute="bottom" secondItem="eaR-vV-QQc" secondAttribute="bottom" constant="8" id="xp5-4f-TyT"/>
<constraint firstItem="SsX-0c-kRw" firstAttribute="leading" secondItem="pzY-d9-3Z5" secondAttribute="trailing" constant="8" id="yXo-zt-NvQ"/>
<constraint firstItem="7WX-Kv-Q7i" firstAttribute="leading" secondItem="VP8-Cw-QnG" secondAttribute="leading" constant="15" id="z6y-It-hYy"/>
</constraints>
</view>
<gestureRecognizers/>
<constraints>
<constraint firstAttribute="width" constant="300" id="iDK-VU-jRi"/>
<constraint firstAttribute="height" constant="440" id="vKz-Fv-ZLf"/>
</constraints>
<blurEffect style="regular"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="25"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
</userDefinedRuntimeAttributes>
<connections>
<outletCollection property="gestureRecognizers" destination="LgR-E7-y3z" appends="YES" id="xAw-L3-sm3"/>
</connections>
</visualEffectView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="o5Z-in-kcg" firstAttribute="centerY" secondItem="8bC-Xf-vdC" secondAttribute="centerY" id="0jF-Nq-kPe"/>
<constraint firstItem="70W-4V-tYr" firstAttribute="bottom" secondItem="wfy-db-euE" secondAttribute="top" id="Xn1-gS-YTJ"/>
<constraint firstItem="o5Z-in-kcg" firstAttribute="centerX" secondItem="8bC-Xf-vdC" secondAttribute="centerX" id="bHO-kd-35A"/>
<constraint firstItem="70W-4V-tYr" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="ddo-cc-64n"/>
<constraint firstItem="70W-4V-tYr" firstAttribute="top" secondItem="8bC-Xf-vdC" secondAttribute="top" id="e9i-3F-kaI"/>
<constraint firstItem="70W-4V-tYr" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" id="e9i-3F-kaI"/>
<constraint firstAttribute="trailing" secondItem="70W-4V-tYr" secondAttribute="trailing" id="kDH-sv-91j"/>
</constraints>
</view>
<connections>
<outlet property="helpView" destination="o5Z-in-kcg" id="eha-6S-KGo"/>
<outlet property="screenView" destination="70W-4V-tYr" id="W9r-vA-9kk"/>
<segue destination="DCD-sd-Fu5" kind="presentation" identifier="disk" modalPresentationStyle="formSheet" id="wkd-we-QI6"/>
<segue destination="j8f-3L-8mp" kind="presentation" identifier="settings" modalPresentationStyle="formSheet" id="ak4-wm-owU"/>
<segue destination="cRQ-kQ-dxG" kind="presentation" identifier="disk" id="WX7-3F-M1R"/>
<segue destination="BoP-db-djl" kind="presentation" identifier="settings" id="QXf-fV-uw4"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
<tapGestureRecognizer id="LgR-E7-y3z">
<connections>
<action selector="hideGestureHelp:" destination="BYZ-38-t0r" id="Rgz-KD-Scl"/>
</connections>
</tapGestureRecognizer>
</objects>
<point key="canvasLocation" x="548" y="391"/>
<point key="canvasLocation" x="344.80000000000001" y="380.54187192118229"/>
</scene>
<!--Settings-->
<scene sceneID="Lht-Fe-oRx">
<objects>
<tableViewController id="WUA-f8-k8g" customClass="SettingsViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="9gA-gD-7Wx">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="758"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" systemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="speed" id="v4I-0T-H8m">
<rect key="frame" x="0.0" y="93.5" width="600" height="44"/>
<rect key="frame" x="0.0" y="49" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="v4I-0T-H8m" id="cO5-De-1JT">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<segmentedControl opaque="NO" tag="128" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="3" translatesAutoresizingMaskIntoConstraints="NO" id="gQ6-2l-dni">
<rect key="frame" x="8" y="8" width="584" height="29"/>
<rect key="frame" x="16" y="11" width="343" height="32"/>
<segments>
<segment title="1x"/>
<segment title="2x"/>
@ -81,16 +253,16 @@
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="mouse" id="JgY-zN-3ID">
<rect key="frame" x="0.0" y="137.5" width="600" height="44"/>
<rect key="frame" x="0.0" y="93" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="JgY-zN-3ID" id="iUk-se-WGk">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<segmentedControl opaque="NO" tag="128" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="jgK-lW-V9w">
<rect key="frame" x="178" y="7" width="244" height="29"/>
<rect key="frame" x="65.666666666666686" y="6.6666666666666679" width="244" height="32"/>
<constraints>
<constraint firstAttribute="width" constant="244" id="5ej-m2-BJ6"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="244" id="5ej-m2-BJ6"/>
</constraints>
<segments>
<segment title="Touchscreen"/>
@ -104,87 +276,111 @@
<constraints>
<constraint firstItem="jgK-lW-V9w" firstAttribute="centerY" secondItem="iUk-se-WGk" secondAttribute="centerY" id="h3J-dj-xrn"/>
<constraint firstItem="jgK-lW-V9w" firstAttribute="centerX" secondItem="iUk-se-WGk" secondAttribute="centerX" id="jma-Qa-lXw"/>
<constraint firstItem="jgK-lW-V9w" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="iUk-se-WGk" secondAttribute="leadingMargin" id="nfl-WM-x5W"/>
<constraint firstAttribute="trailingMargin" relation="greaterThanOrEqual" secondItem="jgK-lW-V9w" secondAttribute="trailing" id="ukC-5e-F8T"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="keyboard" textLabel="6WO-0z-y7c" style="IBUITableViewCellStyleDefault" id="q7C-00-4ss">
<rect key="frame" x="0.0" y="181.5" width="600" height="44"/>
<rect key="frame" x="0.0" y="137" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="q7C-00-4ss" id="yUn-mI-DwM">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="6WO-0z-y7c">
<rect key="frame" x="15" y="0.0" width="570" height="43.5"/>
<rect key="frame" x="16" y="0.0" width="343" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationWidth="60" reuseIdentifier="machine" textLabel="znE-ML-UrQ" detailTextLabel="xcq-HY-ZDe" style="IBUITableViewCellStyleSubtitle" id="MGj-K1-5lZ">
<rect key="frame" x="0.0" y="225.5" width="600" height="44"/>
<rect key="frame" x="0.0" y="181" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="MGj-K1-5lZ" id="ueO-zm-JQP">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="znE-ML-UrQ">
<rect key="frame" x="15" y="6" width="31.5" height="19.5"/>
<rect key="frame" x="16" y="6" width="31.666666666666668" height="19.333333333333332"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Detail" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="xcq-HY-ZDe">
<rect key="frame" x="15" y="25.5" width="30.5" height="13.5"/>
<rect key="frame" x="15.999999999999998" y="25.333333333333332" width="30.333333333333332" height="13.333333333333334"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="11"/>
<color key="textColor" red="0.5568627451" green="0.5568627451" blue="0.57647058819999997" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" systemColor="secondaryLabelColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<inset key="separatorInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="display" id="P6n-Bf-s6h">
<rect key="frame" x="0.0" y="225" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="P6n-Bf-s6h" id="NgN-Fe-hXo">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<segmentedControl opaque="NO" tag="128" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="aS2-J4-gUP">
<rect key="frame" x="16" y="6.6666666666666679" width="343" height="32"/>
<segments>
<segment title="Nearest"/>
<segment title="Linear"/>
<segment title="Trilinear"/>
</segments>
<connections>
<action selector="changeScreenScaling:" destination="WUA-f8-k8g" eventType="valueChanged" id="DAu-Xq-RX5"/>
</connections>
</segmentedControl>
</subviews>
<constraints>
<constraint firstItem="aS2-J4-gUP" firstAttribute="leading" secondItem="NgN-Fe-hXo" secondAttribute="leadingMargin" id="5XQ-sf-kkg"/>
<constraint firstItem="aS2-J4-gUP" firstAttribute="centerY" secondItem="NgN-Fe-hXo" secondAttribute="centerY" id="Kcr-hh-DwN"/>
<constraint firstAttribute="trailingMargin" secondItem="aS2-J4-gUP" secondAttribute="trailing" id="dCR-FP-Zgm"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="about" textLabel="YWX-qF-gPj" detailTextLabel="xr3-v1-hzM" style="IBUITableViewCellStyleValue1" id="Mon-vq-IrO">
<rect key="frame" x="0.0" y="269.5" width="600" height="44"/>
<rect key="frame" x="0.0" y="269" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Mon-vq-IrO" id="mGZ-Jb-6j4">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="YWX-qF-gPj">
<rect key="frame" x="15" y="12" width="31.5" height="19.5"/>
<rect key="frame" x="16" y="12.999999999999998" width="31.666666666666668" height="19.333333333333332"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Detail" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="xr3-v1-hzM">
<rect key="frame" x="543.5" y="12" width="41.5" height="19.5"/>
<rect key="frame" x="317.33333333333331" y="12.999999999999998" width="41.666666666666664" height="19.333333333333332"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="0.5568627451" green="0.5568627451" blue="0.57647058819999997" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" systemColor="secondaryLabelColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="toggle" textLabel="a1l-XI-MEz" style="IBUITableViewCellStyleDefault" id="1nB-54-Qfk">
<rect key="frame" x="0.0" y="313.5" width="600" height="44"/>
<rect key="frame" x="0.0" y="313" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="1nB-54-Qfk" id="fZu-5X-Z4B">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="a1l-XI-MEz">
<rect key="frame" x="15" y="0.0" width="570" height="43.5"/>
<rect key="frame" x="16" y="0.0" width="343" height="44"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
@ -215,53 +411,73 @@
<point key="canvasLocation" x="1996" y="31"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="UQ7-sc-pir">
<scene sceneID="4eA-xl-dqR">
<objects>
<navigationController storyboardIdentifier="settings" id="j8f-3L-8mp" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="7OA-7b-rux">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<navigationController storyboardIdentifier="settings" id="BoP-db-djl" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="0OU-GK-QgK">
<rect key="frame" x="0.0" y="0.0" width="375" height="56"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="WUA-f8-k8g" kind="relationship" relationship="rootViewController" id="Zpb-kg-HM5"/>
<segue destination="WUA-f8-k8g" kind="relationship" relationship="rootViewController" id="pw5-9i-jPL"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8IW-lr-03G" userLabel="First Responder" sceneMemberID="firstResponder"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="Jpf-Y3-KcP" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1318" y="31"/>
<point key="canvasLocation" x="1270" y="30"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="HCe-cW-vFN">
<objects>
<navigationController storyboardIdentifier="disk" toolbarHidden="NO" id="cRQ-kQ-dxG" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="Aek-q5-RuY">
<rect key="frame" x="0.0" y="0.0" width="375" height="56"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<toolbar key="toolbar" opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="Cuq-Py-BdB">
<rect key="frame" x="0.0" y="675" width="375" height="49"/>
<autoresizingMask key="autoresizingMask"/>
</toolbar>
<connections>
<segue destination="mbX-kA-h6M" kind="relationship" relationship="rootViewController" id="X1p-Xh-YQJ"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="DV1-vt-RIw" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1270" y="734"/>
</scene>
<!--Insert Disk-->
<scene sceneID="a1s-tB-X2g">
<objects>
<tableViewController id="mbX-kA-h6M" customClass="InsertDiskViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="EFr-QR-Vqc">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="758"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="cell" textLabel="8ef-Se-DXA" detailTextLabel="CbL-Kq-e9s" style="IBUITableViewCellStyleValue1" id="iZQ-DG-qho" customClass="FileTableViewCell">
<rect key="frame" x="0.0" y="72" width="600" height="44"/>
<rect key="frame" x="0.0" y="44.666666030883789" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="iZQ-DG-qho" id="pcB-3f-clB">
<rect key="frame" x="0.0" y="0.0" width="600" height="43.5"/>
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.69999999999999996" adjustsLetterSpacingToFitWidth="YES" id="8ef-Se-DXA">
<rect key="frame" x="15" y="12" width="31.5" height="19.5"/>
<rect key="frame" x="16" y="12.999999999999998" width="31.666666666666668" height="19.333333333333332"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="16"/>
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Detail" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" adjustsLetterSpacingToFitWidth="YES" id="CbL-Kq-e9s">
<rect key="frame" x="550" y="15" width="35" height="16"/>
<rect key="frame" x="324" y="16" width="35" height="15.666666666666666"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="13"/>
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="calibratedRGB"/>
<color key="textColor" systemColor="secondaryLabelColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<color key="tintColor" systemColor="labelColor"/>
</tableViewCell>
</prototypes>
<connections>
@ -298,6 +514,7 @@
</navigationItem>
<simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
<refreshControl key="refreshControl" opaque="NO" multipleTouchEnabled="YES" contentMode="center" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="RCk-27-wrb">
<rect key="frame" x="0.0" y="0.0" width="1000" height="1000"/>
<autoresizingMask key="autoresizingMask"/>
<connections>
<action selector="refresh:" destination="mbX-kA-h6M" eventType="valueChanged" id="kmL-YD-nSF"/>
@ -306,33 +523,29 @@
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="n7E-Ft-tEZ" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1996" y="735"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="V4m-xV-cjV">
<objects>
<navigationController storyboardIdentifier="disk" toolbarHidden="NO" id="DCD-sd-Fu5" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="jFP-L0-vQk">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<toolbar key="toolbar" opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="TXk-M9-69L">
<rect key="frame" x="0.0" y="556" width="600" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</toolbar>
<connections>
<segue destination="mbX-kA-h6M" kind="relationship" relationship="rootViewController" id="2hT-RO-fgU"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="oTI-h8-BGr" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1318" y="735"/>
<point key="canvasLocation" x="2102" y="734"/>
</scene>
</scenes>
<resources>
<image name="Interrupt" width="30" height="30"/>
<image name="Reset" width="30" height="30"/>
<image name="Settings" width="30" height="30"/>
<image name="Swipe2Down" width="64" height="64"/>
<image name="Swipe2Left" width="64" height="64"/>
<image name="Swipe2Right" width="64" height="64"/>
<image name="Swipe2Up" width="64" height="64"/>
<image name="floppy30" width="30" height="30"/>
<systemColor name="groupTableViewBackgroundColor">
<color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="labelColor">
<color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="secondaryLabelColor">
<color red="0.23529411764705882" green="0.23529411764705882" blue="0.2627450980392157" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>

View File

@ -1,95 +0,0 @@
#include <stdint.h>
#include <unistd.h>
#define BigEndianUnaligned 0
#define LittleEndianUnaligned 1
#define MayInline inline
#define MayNotInline __attribute__((noinline))
#define SmallGlobals 0
#define cIncludeUnused 0
#define UnusedParam(p) (void) p
/* --- integer types ---- */
typedef uint8_t ui3b;
#define HaveRealui3b 1
typedef int8_t si3b;
#define HaveRealsi3b 1
typedef uint16_t ui4b;
#define HaveRealui4b 1
typedef int16_t si4b;
#define HaveRealsi4b 1
typedef uint32_t ui5b;
#define HaveRealui5b 1
typedef int32_t si5b;
#define HaveRealsi5b 1
#define HaveRealui6b 0
#define HaveRealsi6b 0
/* --- integer representation types ---- */
typedef ui3b ui3r;
#define ui3beqr 1
typedef si3b si3r;
#define si3beqr 1
typedef ui4b ui4r;
#define ui4beqr 1
typedef si4b si4r;
#define si4beqr 1
typedef ui5b ui5r;
#define ui5beqr 1
typedef si5b si5r;
#define si5beqr 1
typedef int64_t si6r;
typedef int64_t si6b;
typedef uint64_t ui6r;
typedef uint64_t ui6b;
#define LIT64(a) a##ULL
/* --- shared config for all variants ---- */
#define NeedIntlChars 1
#define kStrAppName "Mini vMac"
#define kAppVariationStr "minivmac-3.4.0-ios"
#define kStrCopyrightYear "2016"
#define kMaintainerName "Jesús A. Álvarez"
#define kStrHomePage "https://namedfork.net/minivmac"
#define VarFullScreen 0
#define WantInitFullScreen 0
#define MayFullScreen 1
#define WantInitMagnify 0
#define WantInitRunInBackground 0
#define NeedRequestInsertDisk 0
#define NeedDoMoreCommandsMsg 0
#define NeedDoAboutMsg 0
#define UseControlKeys 0
#define UseActvCode 0
#define EnableDemoMsg 0
#define IncludePbufs 1
#define NumPbufs 4
#define dbglog_HAVE 0
#define EnableMouseMotion 1
#define IncludeHostTextClipExchange 1
#define IncludeSonyRawMode 1
#define IncludeSonyGetName 1
#define IncludeSonyNew 1
#define IncludeSonyNameNew 1
#define EmLocalTalk 0

72
Mini vMac/CNFUIALL.h Normal file
View File

@ -0,0 +1,72 @@
/*
see comment in OSGCOMUI.h
This file is automatically generated by the build system,
which tries to know what options are valid in what
combinations. Avoid changing this file manually unless
you know what you're doing.
*/
#include <stdint.h>
#define MayInline inline __attribute__((always_inline))
#define MayNotInline __attribute__((noinline))
#define SmallGlobals 0
#define cIncludeUnused 0
#define UnusedParam(p) (void) p
/* --- integer types ---- */
typedef unsigned char ui3b;
#define HaveRealui3b 1
typedef signed char si3b;
#define HaveRealsi3b 1
typedef unsigned short ui4b;
#define HaveRealui4b 1
typedef short si4b;
#define HaveRealsi4b 1
typedef unsigned int ui5b;
#define HaveRealui5b 1
typedef int si5b;
#define HaveRealsi5b 1
#define HaveRealui6b 1
#define HaveRealsi6b 1
/* --- integer representation types ---- */
typedef ui3b ui3r;
#define ui3beqr 1
typedef si3b si3r;
#define si3beqr 1
typedef ui4b ui4r;
#define ui4beqr 1
typedef si4b si4r;
#define si4beqr 1
typedef ui5b ui5r;
#define ui5beqr 1
typedef si5b si5r;
#define si5beqr 1
typedef int64_t si6r;
typedef int64_t si6b;
typedef uint64_t ui6r;
typedef uint64_t ui6b;
#define LIT64(a) a##ULL
#define NeedIntlChars 1
#define kStrAppName "Mini vMac"
#define kAppVariationStr "minivmac-b37-ios"
#define kStrCopyrightYear "2023"
#define kMaintainerName "Jesús A. Álvarez"
#define kStrHomePage "https://namedfork.net/minivmac"

16
Mini vMac/CNFUIOSG.h Normal file
View File

@ -0,0 +1,16 @@
/*
see comment in OSGCOMUI.h
This file is automatically generated by the build system,
which tries to know what options are valid in what
combinations. Avoid changing this file manually unless
you know what you're doing.
*/
#import <Foundation/Foundation.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/param.h>
#include <sys/time.h>

8
Mini vMac/CNFUIPIC.h Normal file
View File

@ -0,0 +1,8 @@
/*
see comment in PICOMMON.h
This file is automatically generated by the build system,
which tries to know what options are valid in what
combinations. Avoid changing this file manually unless
you know what you're doing.
*/

Some files were not shown because too many files have changed in this diff Show More