From 2fbb79b6d995ad63350ede264a37e919347ba19a Mon Sep 17 00:00:00 2001 From: Stossy11 <69031796+stossy11@users.noreply.github.com> Date: Thu, 20 Mar 2025 08:24:10 +1100 Subject: [PATCH] first commit --- .DS_Store | Bin 0 -> 6148 bytes README.md | 10 + RyujinxHelper.xcodeproj/project.pbxproj | 381 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 42213 bytes .../xcschemes/xcschememanagement.plist | 14 + .../RyujinxHelper.docc/RyujinxKeyboard.md | 13 + RyujinxHelper/RyujinxHelper.h | 18 + RyujinxHelper/main.h | 22 + RyujinxHelper/main.mm | 142 +++++++ 10 files changed, 607 insertions(+) create mode 100644 .DS_Store create mode 100644 README.md create mode 100644 RyujinxHelper.xcodeproj/project.pbxproj create mode 100644 RyujinxHelper.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 RyujinxHelper.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 RyujinxHelper.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 RyujinxHelper/RyujinxHelper.docc/RyujinxKeyboard.md create mode 100644 RyujinxHelper/RyujinxHelper.h create mode 100644 RyujinxHelper/main.h create mode 100644 RyujinxHelper/main.mm diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0aad534791788f9802c791ceb756a6a759f3a14b GIT binary patch literal 6148 zcmeHK!AiqG5Peg7h=|gIsK@;Rp??rd1kd&dq>WTdYJyPETfWLa(2wv>y!mElEiKW5 zA|ho5X5Q{(X2QNDnOy)fT9!j#03f3(_I7DL5q+-OkzVrji4tqv;tmhEz%{B)v^)MI z1G;y|xWprtm}7na8t&pfPPv~`)F?S?IIl6UX2bEcUNp9x*Msj@Sky%^sp<(cv!ngD z!>8w$v!7Hcf1yfqv$h)1@4&?wa0Z-#t!IEeTP52wbn6T_1J1yT0sTJ&s$!n7HH^Ow zns@~u>M=43$MFnB4C)}}30p&YC}OEZOOoZa|WD&tztm>#kd%8NvXGX7N@;7P_L*e8rK@G jQaFgMn6cW5PpDDo4>};`30p&YD1H!#G`MjF{*-}tH>^h& literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..2ba6728 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# Ryujinx Helper + +**Ryujinx Helper** is a framework used in **MeloNX** to bridge the gap between iOS and C#. + +### Features +- `showAlert(const char *title, const char *message, bool showCancel)` – Displays an alert with an optional cancel button. +- `showKeyboardAlert(const char *title, const char *message, const char *placeholder)` – Presents a keyboard input prompt with a placeholder. +- `const char *getKeyboardInput()` – Retrieves the user's keyboard input. +- `clearKeyboardInput()` – Clears the stored keyboard input. + diff --git a/RyujinxHelper.xcodeproj/project.pbxproj b/RyujinxHelper.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a2ce969 --- /dev/null +++ b/RyujinxHelper.xcodeproj/project.pbxproj @@ -0,0 +1,381 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 4E7023CD2D5AE490002C7183 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E7023CC2D5AE490002C7183 /* UIKit.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 4E7023B12D5AD5FB002C7183 /* RyujinxHelper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RyujinxHelper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4E7023CC2D5AE490002C7183 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk/System/iOSSupport/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 4E7023B82D5AD5FB002C7183 /* Exceptions for "RyujinxHelper" folder in "RyujinxHelper" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + publicHeaders = ( + RyujinxHelper.h, + ); + target = 4E7023B02D5AD5FB002C7183 /* RyujinxHelper */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 4E7023B32D5AD5FB002C7183 /* RyujinxHelper */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4E7023B82D5AD5FB002C7183 /* Exceptions for "RyujinxHelper" folder in "RyujinxHelper" target */, + ); + path = RyujinxHelper; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4E7023AE2D5AD5FB002C7183 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4E7023CD2D5AE490002C7183 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4E7023A72D5AD5FB002C7183 = { + isa = PBXGroup; + children = ( + 4E7023B32D5AD5FB002C7183 /* RyujinxHelper */, + 4E7023CB2D5AE490002C7183 /* Frameworks */, + 4E7023B22D5AD5FB002C7183 /* Products */, + ); + sourceTree = ""; + }; + 4E7023B22D5AD5FB002C7183 /* Products */ = { + isa = PBXGroup; + children = ( + 4E7023B12D5AD5FB002C7183 /* RyujinxHelper.framework */, + ); + name = Products; + sourceTree = ""; + }; + 4E7023CB2D5AE490002C7183 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 4E7023CC2D5AE490002C7183 /* UIKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 4E7023AC2D5AD5FB002C7183 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 4E7023B02D5AD5FB002C7183 /* RyujinxHelper */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4E7023B92D5AD5FB002C7183 /* Build configuration list for PBXNativeTarget "RyujinxHelper" */; + buildPhases = ( + 4E7023AC2D5AD5FB002C7183 /* Headers */, + 4E7023AD2D5AD5FB002C7183 /* Sources */, + 4E7023AE2D5AD5FB002C7183 /* Frameworks */, + 4E7023AF2D5AD5FB002C7183 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 4E7023B32D5AD5FB002C7183 /* RyujinxHelper */, + ); + name = RyujinxHelper; + packageProductDependencies = ( + ); + productName = RyujinxKeyboard; + productReference = 4E7023B12D5AD5FB002C7183 /* RyujinxHelper.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4E7023A82D5AD5FB002C7183 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastUpgradeCheck = 1620; + TargetAttributes = { + 4E7023B02D5AD5FB002C7183 = { + CreatedOnToolsVersion = 16.2; + }; + }; + }; + buildConfigurationList = 4E7023AB2D5AD5FB002C7183 /* Build configuration list for PBXProject "RyujinxHelper" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4E7023A72D5AD5FB002C7183; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 4E7023B22D5AD5FB002C7183 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4E7023B02D5AD5FB002C7183 /* RyujinxHelper */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4E7023AF2D5AD5FB002C7183 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4E7023AD2D5AD5FB002C7183 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 4E7023BA2D5AD5FB002C7183 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 95J8WZ4TN8; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.RyujinxKeyboard; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 4E7023BB2D5AD5FB002C7183 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 95J8WZ4TN8; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.RyujinxKeyboard; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 4E7023BC2D5AD5FB002C7183 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 4E7023BD2D5AD5FB002C7183 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4E7023AB2D5AD5FB002C7183 /* Build configuration list for PBXProject "RyujinxHelper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4E7023BC2D5AD5FB002C7183 /* Debug */, + 4E7023BD2D5AD5FB002C7183 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4E7023B92D5AD5FB002C7183 /* Build configuration list for PBXNativeTarget "RyujinxHelper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4E7023BA2D5AD5FB002C7183 /* Debug */, + 4E7023BB2D5AD5FB002C7183 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 4E7023A82D5AD5FB002C7183 /* Project object */; +} diff --git a/RyujinxHelper.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RyujinxHelper.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/RyujinxHelper.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RyujinxHelper.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate b/RyujinxHelper.xcodeproj/project.xcworkspace/xcuserdata/stossy11.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..77455542cb257339696843317e7e89d7e71d53d1 GIT binary patch literal 42213 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 BfBygg literal 0 HcmV?d00001 diff --git a/RyujinxHelper.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcschemes/xcschememanagement.plist b/RyujinxHelper.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..968f09a --- /dev/null +++ b/RyujinxHelper.xcodeproj/xcuserdata/stossy11.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + RyujinxKeyboard.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/RyujinxHelper/RyujinxHelper.docc/RyujinxKeyboard.md b/RyujinxHelper/RyujinxHelper.docc/RyujinxKeyboard.md new file mode 100644 index 0000000..fea4637 --- /dev/null +++ b/RyujinxHelper/RyujinxHelper.docc/RyujinxKeyboard.md @@ -0,0 +1,13 @@ +# ``RyujinxKeyboard`` + +Summary + +## Overview + +Text + +## Topics + +### Group + +- ``Symbol`` \ No newline at end of file diff --git a/RyujinxHelper/RyujinxHelper.h b/RyujinxHelper/RyujinxHelper.h new file mode 100644 index 0000000..1ef86b4 --- /dev/null +++ b/RyujinxHelper/RyujinxHelper.h @@ -0,0 +1,18 @@ +// +// RyujinxKeyboard.h +// RyujinxKeyboard +// +// Created by Stossy11 on 11/02/2025. +// + +#import + +//! Project version number for RyujinxKeyboard. +FOUNDATION_EXPORT double RyujinxKeyboardVersionNumber; + +//! Project version string for RyujinxKeyboard. +FOUNDATION_EXPORT const unsigned char RyujinxKeyboardVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/RyujinxHelper/main.h b/RyujinxHelper/main.h new file mode 100644 index 0000000..d3ceb1a --- /dev/null +++ b/RyujinxHelper/main.h @@ -0,0 +1,22 @@ +// +// main.h +// RyujinxKeyboard +// +// Created by Stossy11 on 11/02/2025. +// + +#ifdef __cplusplus +extern "C" { +#endif + +void showAlert(const char *title, const char *message, bool showCancel); + +void showKeyboardAlert(const char *title, const char *message, const char *placeholder); + +const char *getKeyboardInput(); + +void clearKeyboardInput(); + +#ifdef __cplusplus +} +#endif diff --git a/RyujinxHelper/main.mm b/RyujinxHelper/main.mm new file mode 100644 index 0000000..a3de801 --- /dev/null +++ b/RyujinxHelper/main.mm @@ -0,0 +1,142 @@ +// +// main.mm +// RyujinxKeyboard +// +// Created by Stossy11 on 11/02/2025. +// + +#import +#import + +#ifdef __cplusplus +extern "C" { +#endif + +static char *keyboardInput = NULL; + +void showKeyboardAlert(const char *title, const char *message, const char *placeholder) { + NSString *alertTitle = [NSString stringWithUTF8String:title]; + NSString *alertMessage = [NSString stringWithUTF8String:message]; + NSString *alertPlaceholder = [NSString stringWithUTF8String:placeholder]; + + dispatch_async(dispatch_get_main_queue(), ^{ + UIWindowScene *activeScene = (UIWindowScene *)UIApplication.sharedApplication.connectedScenes.allObjects.firstObject; + if (!activeScene || ![activeScene isKindOfClass:[UIWindowScene class]]) { + return; + } + + UIWindow *popupWindow = [[UIWindow alloc] initWithWindowScene:activeScene]; + popupWindow.frame = UIScreen.mainScreen.bounds; + popupWindow.windowLevel = UIWindowLevelAlert + 1; + popupWindow.backgroundColor = [UIColor clearColor]; + + UIViewController *tempViewController = [[UIViewController alloc] init]; + popupWindow.rootViewController = tempViewController; + [popupWindow makeKeyAndVisible]; + + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:alertTitle + message:alertMessage + preferredStyle:UIAlertControllerStyleAlert]; + + [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { + textField.placeholder = alertPlaceholder; + }]; + + UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action) { + NSString *inputText = alertController.textFields.firstObject.text; + + if (keyboardInput) { + free(keyboardInput); + keyboardInput = NULL; + } + + if (inputText.length > 0) { + keyboardInput = strdup([inputText UTF8String]); + } + + popupWindow.hidden = YES; + popupWindow.rootViewController = nil; + }]; + + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" + style:UIAlertActionStyleCancel + handler:^(UIAlertAction *action) { + free(keyboardInput); + keyboardInput = strdup(""); + + popupWindow.hidden = YES; + popupWindow.rootViewController = nil; + }]; + + [alertController addAction:okAction]; + [alertController addAction:cancelAction]; + + [tempViewController presentViewController:alertController animated:YES completion:nil]; + }); +} + +void showAlert(const char *title, const char *message, bool showCancel) { + NSString *alertTitle = [NSString stringWithUTF8String:title]; + NSString *alertMessage = [NSString stringWithUTF8String:message]; + + dispatch_async(dispatch_get_main_queue(), ^{ + UIWindowScene *activeScene = (UIWindowScene *)UIApplication.sharedApplication.connectedScenes.allObjects.firstObject; + if (!activeScene || ![activeScene isKindOfClass:[UIWindowScene class]]) { + return; + } + + UIWindow *popupWindow = [[UIWindow alloc] initWithWindowScene:activeScene]; + popupWindow.frame = UIScreen.mainScreen.bounds; + popupWindow.windowLevel = UIWindowLevelAlert + 1; + popupWindow.backgroundColor = [UIColor clearColor]; + + UIViewController *tempViewController = [[UIViewController alloc] init]; + popupWindow.rootViewController = tempViewController; + [popupWindow makeKeyAndVisible]; + + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:alertTitle + message:alertMessage + preferredStyle:UIAlertControllerStyleAlert]; + + UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action) { + popupWindow.hidden = YES; + popupWindow.rootViewController = nil; + }]; + + [alertController addAction:okAction]; + + if (showCancel) { + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" + style:UIAlertActionStyleCancel + handler:^(UIAlertAction *action) { + popupWindow.hidden = YES; + popupWindow.rootViewController = nil; + }]; + [alertController addAction:cancelAction]; + } + + [tempViewController presentViewController:alertController animated:YES completion:nil]; + }); +} + +const char *getKeyboardInput() { + if (keyboardInput) { + return keyboardInput; + } + return NULL; +} + +void clearKeyboardInput() { + if (keyboardInput) { + free(keyboardInput); + keyboardInput = NULL; + } +} + +#ifdef __cplusplus +} +#endif