diff --git a/input/drivers/cocoa_input.c b/input/drivers/cocoa_input.c index 0cd8d7401d..a614bf276e 100644 --- a/input/drivers/cocoa_input.c +++ b/input/drivers/cocoa_input.c @@ -41,6 +41,20 @@ float cocoa_screen_get_backing_scale_factor(void); #endif static bool apple_key_state[MAX_KEYS]; + +// Send keyboard inputs directly using RETROK_* codes +// Used by the iOS custom keyboard implementation +void apple_direct_input_keyboard_event(bool down, + unsigned code, uint32_t character, uint32_t mod, unsigned device) +{ + int appleKey = rarch_keysym_lut[code]; + apple_key_state[appleKey] = down; + input_keyboard_event(down, + code, + character, (enum retro_mod)mod, device); +} + + #if TARGET_OS_IPHONE /* TODO/FIXME - static globals */ static bool small_keyboard_active = false; @@ -433,8 +447,12 @@ static int16_t cocoa_input_state( return apple->window_pos_x * cocoa_screen_get_backing_scale_factor(); #endif } +#ifdef IOS + val = apple->mouse_rel_x; +#else val = apple->window_pos_x - apple->mouse_x_last; apple->mouse_x_last = apple->window_pos_x; +#endif return val; case RETRO_DEVICE_ID_MOUSE_Y: if (device == RARCH_DEVICE_MOUSE_SCREEN) @@ -445,8 +463,12 @@ static int16_t cocoa_input_state( return apple->window_pos_y * cocoa_screen_get_backing_scale_factor(); #endif } +#ifdef IOS + val = apple->mouse_rel_y; +#else val = apple->window_pos_y - apple->mouse_y_last; apple->mouse_y_last = apple->window_pos_y; +#endif return val; case RETRO_DEVICE_ID_MOUSE_LEFT: return apple->mouse_buttons & 1; diff --git a/input/drivers_keyboard/keyboard_event_apple.h b/input/drivers_keyboard/keyboard_event_apple.h index 4cb4064dda..d1a5b6c131 100644 --- a/input/drivers_keyboard/keyboard_event_apple.h +++ b/input/drivers_keyboard/keyboard_event_apple.h @@ -169,6 +169,9 @@ RETRO_BEGIN_DECLS void apple_input_keyboard_event(bool down, unsigned code, uint32_t character, uint32_t mod, unsigned device); +void apple_direct_input_keyboard_event(bool down, + unsigned code, uint32_t character, uint32_t mod, unsigned device); + RETRO_END_DECLS #endif diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 3c36d20933..a840795dfb 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -2487,6 +2487,7 @@ static int action_ok_playlist_entry_collection(const char *path, } else { +#ifndef IOS core_info = playlist_entry_get_core_info(entry); if (core_info && !string_is_empty(core_info->path)) @@ -2498,6 +2499,10 @@ static int action_ok_playlist_entry_collection(const char *path, strlcpy(core_path, entry->core_path, sizeof(core_path)); playlist_resolve_path(PLAYLIST_LOAD, true, core_path, sizeof(core_path)); } +#else + strlcpy(core_path, entry->core_path, sizeof(core_path)); + playlist_resolve_path(PLAYLIST_LOAD, true, core_path, sizeof(core_path)); +#endif } } diff --git a/pkg/apple/CocoaView+KeyboardSupport.swift b/pkg/apple/CocoaView+KeyboardSupport.swift new file mode 100644 index 0000000000..61a2cd9dac --- /dev/null +++ b/pkg/apple/CocoaView+KeyboardSupport.swift @@ -0,0 +1,233 @@ +// +// CocoaView+KeyboardSupport.swift +// RetroArchiOS11 +// +// Created by Yoshi Sugawara on 2/25/21. +// Copyright © 2021 RetroArch. All rights reserved. +// + +import Foundation + +extension CocoaView { + var leftKeyboardModel: EmulatorKeyboardViewModel { + return EmulatorKeyboardViewModel(keys: [ + [ + EmulatorKeyboardKey(label: "1", code: Int(RETROK_1.rawValue)), + EmulatorKeyboardKey(label: "2", code: Int(RETROK_2.rawValue)), + EmulatorKeyboardKey(label: "3", code: Int(RETROK_3.rawValue)), + EmulatorKeyboardKey(label: "4", code: Int(RETROK_4.rawValue)), + EmulatorKeyboardKey(label: "5", code: Int(RETROK_5.rawValue)), + ], + [ + EmulatorKeyboardKey(label: "q", code: Int(RETROK_q.rawValue)), + EmulatorKeyboardKey(label: "w", code: Int(RETROK_w.rawValue)), + EmulatorKeyboardKey(label: "e", code: Int(RETROK_e.rawValue)), + EmulatorKeyboardKey(label: "r", code: Int(RETROK_r.rawValue)), + EmulatorKeyboardKey(label: "t", code: Int(RETROK_t.rawValue)), + ], + [ + EmulatorKeyboardKey(label: "a", code: Int(RETROK_a.rawValue)), + EmulatorKeyboardKey(label: "s", code: Int(RETROK_s.rawValue)), + EmulatorKeyboardKey(label: "d", code: Int(RETROK_d.rawValue)), + EmulatorKeyboardKey(label: "f", code: Int(RETROK_f.rawValue)), + EmulatorKeyboardKey(label: "g", code: Int(RETROK_g.rawValue)), + ], + [ + EmulatorKeyboardKey(label: "z", code: Int(RETROK_z.rawValue)), + EmulatorKeyboardKey(label: "x", code: Int(RETROK_x.rawValue)), + EmulatorKeyboardKey(label: "c", code: Int(RETROK_c.rawValue)), + EmulatorKeyboardKey(label: "v", code: Int(RETROK_v.rawValue)), + EmulatorKeyboardKey(label: "b", code: Int(RETROK_b.rawValue)), + ], + [ + EmulatorKeyboardKey(label: "SHIFT", code: Int(RETROK_LSHIFT.rawValue), keySize: .standard, isModifier: true, imageName: "shift", imageNameHighlighted: "shift.fill"), + EmulatorKeyboardKey(label: "Fn", code: 9000, keySize: .standard, imageName: "fn"), + EmulatorKeyboardKey(label: "CTRL", code: Int(RETROK_LCTRL.rawValue), isModifier: true, imageName: "control"), + EmulatorKeyboardKey(label: "Space", code: Int(RETROK_SPACE.rawValue), keySize: .wide) + ] + ], + alternateKeys: [ + [ + EmulatorKeyboardKey(label: "ESC", code: Int(RETROK_ESCAPE.rawValue), imageName: "escape"), + SliderKey(keySize: .standard) + ], + [ + EmulatorKeyboardKey(label: "F1", code: Int(RETROK_F1.rawValue)), + EmulatorKeyboardKey(label: "F2", code: Int(RETROK_F2.rawValue)), + EmulatorKeyboardKey(label: "F3", code: Int(RETROK_F3.rawValue)), + EmulatorKeyboardKey(label: "F4", code: Int(RETROK_F4.rawValue)), + EmulatorKeyboardKey(label: "F5", code: Int(RETROK_F5.rawValue)), + ], + [ + EmulatorKeyboardKey(label: "-", code: Int(RETROK_MINUS.rawValue)), + EmulatorKeyboardKey(label: "=", code: Int(RETROK_EQUALS.rawValue)), + EmulatorKeyboardKey(label: "/", code: Int(RETROK_SLASH.rawValue)), + EmulatorKeyboardKey(label: "[", code: Int(RETROK_LEFTBRACKET.rawValue)), + EmulatorKeyboardKey(label: "]", code: Int(RETROK_RIGHTBRACKET.rawValue)), + ], + [ + EmulatorKeyboardKey(label: ";", code: Int(RETROK_SEMICOLON.rawValue)), + EmulatorKeyboardKey(label: "~", code: Int(RETROK_TILDE.rawValue)), + EmulatorKeyboardKey(label: ":", code: Int(RETROK_COLON.rawValue)), + EmulatorKeyboardKey(label: "?", code: Int(RETROK_QUESTION.rawValue)), + EmulatorKeyboardKey(label: "!", code: Int(RETROK_EXCLAIM.rawValue)), + ], + [ + EmulatorKeyboardKey(label: "SHIFT", code: Int(RETROK_LSHIFT.rawValue), keySize: .standard, isModifier: true, imageName: "shift", imageNameHighlighted: "shift.fill"), + EmulatorKeyboardKey(label: "Fn", code: 9000, keySize: .standard, imageName: "fn"), + EmulatorKeyboardKey(label: "CTRL", code: Int(RETROK_LCTRL.rawValue), isModifier: true, imageName: "control"), + EmulatorKeyboardKey(label: "Space", code: Int(RETROK_SPACE.rawValue), keySize: .wide) + ] + ]) + } + + var rightKeyboardModel: EmulatorKeyboardViewModel { + EmulatorKeyboardViewModel(keys: [ + [ + EmulatorKeyboardKey(label: "6", code: Int(RETROK_6.rawValue)), + EmulatorKeyboardKey(label: "7", code: Int(RETROK_7.rawValue)), + EmulatorKeyboardKey(label: "8", code: Int(RETROK_8.rawValue)), + EmulatorKeyboardKey(label: "9", code: Int(RETROK_9.rawValue)), + EmulatorKeyboardKey(label: "0", code: Int(RETROK_0.rawValue)) + ], + [ + EmulatorKeyboardKey(label: "y", code: Int(RETROK_y.rawValue)), + EmulatorKeyboardKey(label: "u", code: Int(RETROK_u.rawValue)), + EmulatorKeyboardKey(label: "i", code: Int(RETROK_i.rawValue)), + EmulatorKeyboardKey(label: "o", code: Int(RETROK_o.rawValue)), + EmulatorKeyboardKey(label: "p", code: Int(RETROK_p.rawValue)), + ], + [ + EmulatorKeyboardKey(label: "h", code: Int(RETROK_h.rawValue)), + EmulatorKeyboardKey(label: "j", code: Int(RETROK_j.rawValue)), + EmulatorKeyboardKey(label: "k", code: Int(RETROK_k.rawValue)), + EmulatorKeyboardKey(label: "l", code: Int(RETROK_l.rawValue)), + EmulatorKeyboardKey(label: "'", code: Int(RETROK_QUOTE.rawValue)) + ], + [ + EmulatorKeyboardKey(label: "n", code: Int(RETROK_n.rawValue)), + EmulatorKeyboardKey(label: "m", code: Int(RETROK_m.rawValue)), + EmulatorKeyboardKey(label: ",", code: Int(RETROK_COMMA.rawValue)), + EmulatorKeyboardKey(label: ".", code: Int(RETROK_PERIOD.rawValue)), + EmulatorKeyboardKey(label: "BKSPC", code: Int(RETROK_BACKSPACE.rawValue), imageName: "delete.left", imageNameHighlighted: "delete.left.fill") + ], + [ + EmulatorKeyboardKey(label: "Alt", code: Int(RETROK_LALT.rawValue), isModifier: true, imageName: "alt"), + EmulatorKeyboardKey(label: "tab", code: Int(RETROK_TAB.rawValue), imageName: "arrow.right.to.line"), + EmulatorKeyboardKey(label: "RETURN", code: Int(RETROK_RETURN.rawValue), keySize: .wide) + ], + ], + alternateKeys: [ + [ + EmulatorKeyboardKey(label: "F6", code: Int(RETROK_F6.rawValue)), + EmulatorKeyboardKey(label: "F7", code: Int(RETROK_F7.rawValue)), + EmulatorKeyboardKey(label: "F8", code: Int(RETROK_F8.rawValue)), + EmulatorKeyboardKey(label: "F9", code: Int(RETROK_F9.rawValue)), + EmulatorKeyboardKey(label: "F10", code: Int(RETROK_F10.rawValue)), + ], + [ + EmulatorKeyboardKey(label: "PAGEUP", code: Int(RETROK_PAGEUP.rawValue), imageName: "arrow.up.doc"), + EmulatorKeyboardKey(label: "HOME", code: Int(RETROK_HOME.rawValue), imageName: "house"), + EmulatorKeyboardKey(label: "INS", code: Int(RETROK_INSERT.rawValue), imageName: "text.insert"), + EmulatorKeyboardKey(label: "END", code: Int(RETROK_END.rawValue)), + EmulatorKeyboardKey(label: "PAGEDWN", code: Int(RETROK_PAGEDOWN.rawValue), imageName: "arrow.down.doc"), + ], + [ + EmulatorKeyboardKey(label: "F11", code: Int(RETROK_F11.rawValue)), + EmulatorKeyboardKey(label: "⬆️", code: Int(RETROK_UP.rawValue), imageName: "arrow.up"), + SpacerKey(), + SpacerKey(), + EmulatorKeyboardKey(label: "F12", code: Int(RETROK_F12.rawValue)), + ], + [ + EmulatorKeyboardKey(label: "⬅️", code: Int(RETROK_LEFT.rawValue), imageName: "arrow.left"), + EmulatorKeyboardKey(label: "⬇️", code: Int(RETROK_DOWN.rawValue), imageName: "arrow.down"), + EmulatorKeyboardKey(label: "➡️", code: Int(RETROK_RIGHT.rawValue), imageName: "arrow.right"), + SpacerKey(), + EmulatorKeyboardKey(label: "DEL", code: Int(RETROK_DELETE.rawValue), imageName: "clear", imageNameHighlighted: "clear.fill"), + ], + [ + EmulatorKeyboardKey(label: "RETURN", code: Int(RETROK_RETURN.rawValue), keySize: .wide) + ] + ]) + } + + @objc func setupEmulatorKeyboard() { + keyboardController = EmulatorKeyboardController(leftKeyboardModel: leftKeyboardModel, rightKeyboardModel: rightKeyboardModel) + keyboardController.leftKeyboardModel.delegate = self; + keyboardController.rightKeyboardModel.delegate = self; + addChild(keyboardController) + keyboardController.didMove(toParent: self) + keyboardController.view.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(keyboardController.view) + keyboardController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true + keyboardController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true + keyboardController.view.topAnchor.constraint(equalTo: view.topAnchor).isActive = true + keyboardController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true + keyboardController.leftKeyboardModel.delegate = self + keyboardController.rightKeyboardModel.delegate = self + keyboardController.leftKeyboardModel.modifierDelegate = self + keyboardController.rightKeyboardModel.modifierDelegate = self + keyboardController.view.isHidden = true + keyboardModifierState = 0 + } +} + +extension CocoaView: EmulatorKeyboardKeyPressedDelegate { + func keyUp(_ key: KeyCoded) { + print("keyUp: code=\(key.keyCode) keyboardModifierState = \(keyboardModifierState)") + apple_direct_input_keyboard_event(false, UInt32(key.keyCode), 0, keyboardModifierState, UInt32(RETRO_DEVICE_KEYBOARD)) + } + + func keyDown(_ key: KeyCoded) { + print("keyDown: code=\(key.keyCode) keyboardModifierState = \(keyboardModifierState)") + apple_direct_input_keyboard_event(true, UInt32(key.keyCode), 0, keyboardModifierState, UInt32(RETRO_DEVICE_KEYBOARD)) + } +} + +extension CocoaView: EmulatorKeyboardModifierPressedDelegate { + func modifierPressedWithKey(_ key: KeyCoded, enable: Bool) { + switch UInt32(key.keyCode) { + case RETROK_LSHIFT.rawValue: + if enable { + keyboardModifierState |= RETROKMOD_SHIFT.rawValue + apple_direct_input_keyboard_event(true, UInt32(RETROK_LSHIFT.rawValue), 0, keyboardModifierState, UInt32(RETRO_DEVICE_KEYBOARD)) + } else { + keyboardModifierState &= ~RETROKMOD_SHIFT.rawValue + apple_direct_input_keyboard_event(false, UInt32(RETROK_LSHIFT.rawValue), 0, keyboardModifierState, UInt32(RETRO_DEVICE_KEYBOARD)) + } + case RETROK_LCTRL.rawValue: + if enable { + keyboardModifierState |= RETROKMOD_CTRL.rawValue + apple_direct_input_keyboard_event(true, UInt32(RETROK_LCTRL.rawValue), 0, keyboardModifierState, UInt32(RETRO_DEVICE_KEYBOARD)) + } else { + keyboardModifierState &= ~RETROKMOD_CTRL.rawValue + apple_direct_input_keyboard_event(false, UInt32(RETROK_LCTRL.rawValue), 0, keyboardModifierState, UInt32(RETRO_DEVICE_KEYBOARD)) + } + case RETROK_LALT.rawValue: + if enable { + keyboardModifierState |= RETROKMOD_ALT.rawValue + apple_direct_input_keyboard_event(true, UInt32(RETROK_LALT.rawValue), 0, keyboardModifierState, UInt32(RETRO_DEVICE_KEYBOARD)) + } else { + keyboardModifierState &= ~RETROKMOD_ALT.rawValue + apple_direct_input_keyboard_event(false, UInt32(RETROK_LALT.rawValue), 0, keyboardModifierState, UInt32(RETRO_DEVICE_KEYBOARD)) + } + default: + break + } + } + + func isModifierEnabled(key: KeyCoded) -> Bool { + switch UInt32(key.keyCode) { + case RETROK_LSHIFT.rawValue: + return (keyboardModifierState & RETROKMOD_SHIFT.rawValue) != 0 + case RETROK_LCTRL.rawValue: + return (keyboardModifierState & RETROKMOD_CTRL.rawValue) != 0 + case RETROK_LALT.rawValue: + return (keyboardModifierState & RETROKMOD_ALT.rawValue) != 0 + default: + break + } + return false + } +} diff --git a/pkg/apple/EmulatorKeyboard.swift b/pkg/apple/EmulatorKeyboard.swift new file mode 100644 index 0000000000..b7dac321ee --- /dev/null +++ b/pkg/apple/EmulatorKeyboard.swift @@ -0,0 +1,601 @@ +// +// EmulatorKeyboard.swift +// +// Created by Yoshi Sugawara on 7/30/20. +// + +// TODO: shift key should change the label of the keys to uppercase (need callback mechanism?) +// pan gesture to outer edges of keyboard view for better dragging + +import Foundation +import UIKit + +class KeyboardButton: UIButton { + let key: KeyCoded + var toggleState = false + + // MARK: - Functions + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + let newArea = CGRect( + x: self.bounds.origin.x - 5.0, + y: self.bounds.origin.y - 5.0, + width: self.bounds.size.width + 20.0, + height: self.bounds.size.height + 20.0 + ) + return newArea.contains(point) + } + + private func updateColors() { + backgroundColor = isHighlighted ? EmulatorKeyboardView.keyPressedBackgroundColor : isSelected ? EmulatorKeyboardView.keySelectedBackgroundColor : EmulatorKeyboardView.keyNormalBackgroundColor + layer.borderColor = (isHighlighted ? EmulatorKeyboardView.keyPressedBorderColor : isSelected ? EmulatorKeyboardView.keySelectedBorderColor : EmulatorKeyboardView.keyNormalBorderColor).cgColor + titleLabel?.textColor = isHighlighted ? EmulatorKeyboardView.keyPressedTextColor : isSelected ? EmulatorKeyboardView.keySelectedTextColor : EmulatorKeyboardView.keyNormalTextColor + titleLabel?.tintColor = titleLabel?.textColor + } + + override open var isHighlighted: Bool { + didSet { + updateColors() + } + } + + override open var isSelected: Bool { + didSet { + updateColors() + } + } + + required init(key: KeyCoded) { + self.key = key + super.init(frame: .zero) + updateColors() + } + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +@objc protocol EmulatorKeyboardKeyPressedDelegate: AnyObject { + func keyDown(_ key: KeyCoded) + func keyUp(_ key: KeyCoded) +} + +@objc protocol EmulatorKeyboardModifierPressedDelegate: AnyObject { + func modifierPressedWithKey(_ key: KeyCoded, enable: Bool) + func isModifierEnabled(key: KeyCoded) -> Bool +} + +protocol EmulatorKeyboardViewDelegate: AnyObject { + func toggleAlternateKeys() + func refreshModifierStates() + func updateTransparency(toAlpha alpha: Float) +} + +class EmulatorKeyboardView: UIView { + + static var keyboardBackgroundColor = UIColor.systemGray6.withAlphaComponent(0.5) + static var keyboardCornerRadius = 6.0 + static var keyboardDragColor = UIColor.systemGray + + static var keyCornerRadius = 6.0 + static var keyBorderWidth = 1.0 + + static var rowSpacing = 12.0 + static var keySpacing = 8.0 + + static var keyNormalFont = UIFont.systemFont(ofSize: 12) + static var keyPressedFont = UIFont.boldSystemFont(ofSize: 24) + + static var keyNormalBackgroundColor = UIColor.systemGray4.withAlphaComponent(0.5) + static var keyNormalBorderColor = keyNormalBackgroundColor + static var keyNormalTextColor = UIColor.label + + static var keyPressedBackgroundColor = UIColor.systemGray2 + static var keyPressedBorderColor = keyPressedBackgroundColor + static var keyPressedTextColor = UIColor.label + + static var keySelectedBackgroundColor = UIColor.systemGray2.withAlphaComponent(0.8) + static var keySelectedBorderColor = keySelectedBackgroundColor + static var keySelectedTextColor = UIColor.label + + var viewModel = EmulatorKeyboardViewModel(keys: [[KeyCoded]]()) { + didSet { + setupWithModel(viewModel) + } + } + var modifierButtons = Set() + + weak var delegate: EmulatorKeyboardViewDelegate? + + private lazy var keyRowsStackView: UIStackView = { + let stackView = UIStackView() + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.axis = .vertical + stackView.distribution = .equalCentering + stackView.spacing = Self.rowSpacing + return stackView + }() + + private lazy var alternateKeyRowsStackView: UIStackView = { + let stackView = UIStackView() + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.axis = .vertical + stackView.distribution = .equalCentering + stackView.spacing = Self.rowSpacing + stackView.isHidden = true + return stackView + }() + + let dragMeView: UIView = { + let view = UIView(frame: .zero) + view.backgroundColor = EmulatorKeyboardView.keyboardDragColor + view.translatesAutoresizingMaskIntoConstraints = false + view.widthAnchor.constraint(equalToConstant: 80).isActive = true + view.heightAnchor.constraint(equalToConstant: 2).isActive = true + let outerView = UIView(frame: .zero) + outerView.backgroundColor = .clear + outerView.translatesAutoresizingMaskIntoConstraints = false + outerView.addSubview(view) + view.centerXAnchor.constraint(equalTo: outerView.centerXAnchor).isActive = true + view.centerYAnchor.constraint(equalTo: outerView.centerYAnchor).isActive = true + outerView.heightAnchor.constraint(equalToConstant: 20).isActive = true + outerView.widthAnchor.constraint(equalToConstant: 100).isActive = true + return outerView + }() + + private var pressedKeyViews = [UIControl: UIView]() + + convenience init() { + self.init(frame: CGRect.zero) + } + + override init(frame: CGRect) { + super.init(frame: frame) + commonInit() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + commonInit() + } + + private func commonInit() { + backgroundColor = Self.keyboardBackgroundColor + layer.cornerRadius = Self.keyboardCornerRadius + layoutMargins = UIEdgeInsets(top: 16, left: 4, bottom: 16, right: 4) + insetsLayoutMarginsFromSafeArea = false + addSubview(keyRowsStackView) + keyRowsStackView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true + keyRowsStackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 4.0).isActive = true + keyRowsStackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -4.0).isActive = true + addSubview(alternateKeyRowsStackView) + alternateKeyRowsStackView.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor).isActive = true + alternateKeyRowsStackView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor, constant: 4.0).isActive = true + alternateKeyRowsStackView.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor, constant: -4.0).isActive = true + addSubview(dragMeView) + dragMeView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true + dragMeView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true + } + + + @objc private func keyPressed(_ sender: KeyboardButton) { + if sender.key.keyCode == 9000 { // hack for now + return + } + if !sender.key.isModifier { + // make a "stand-in" for our key, and scale up key + let view = UIView() + view.backgroundColor = EmulatorKeyboardView.keyPressedBackgroundColor + view.layer.cornerRadius = EmulatorKeyboardView.keyCornerRadius + view.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner] + view.frame = sender.convert(sender.bounds, to: self) + addSubview(view) + + var tx = 0.0 + let ty = sender.bounds.height * -1.20 + + if let window = self.window { + let rect = sender.convert(sender.bounds, to:window) + + if rect.maxX > window.bounds.width * 0.9 { + tx = sender.bounds.width * -0.5 + } + if rect.minX < window.bounds.width * 0.1 { + tx = sender.bounds.width * 0.5 + } + } + + sender.superview!.bringSubviewToFront(sender) + sender.transform = CGAffineTransform(translationX:tx, y:ty).scaledBy(x:2, y:2) + + pressedKeyViews[sender] = view + } + viewModel.keyPressed(sender.key) + } + + @objc private func keyCancelled(_ sender: KeyboardButton) { + sender.transform = .identity + if let view = pressedKeyViews[sender] { + view.removeFromSuperview() + pressedKeyViews.removeValue(forKey: sender) + } + } + + @objc private func keyReleased(_ sender: KeyboardButton) { + sender.transform = .identity + if sender.key.keyCode == 9000 { + delegate?.toggleAlternateKeys() + return + } + if let view = pressedKeyViews[sender] { + view.removeFromSuperview() + pressedKeyViews.removeValue(forKey: sender) + } + sender.isSelected = viewModel.modifierKeyToggleStateForKey(sender.key) + viewModel.keyReleased(sender.key) + self.delegate?.refreshModifierStates() + } + + func setupWithModel(_ model: EmulatorKeyboardViewModel) { + for row in model.keys { + let keysInRow = createKeyRow(keys: row) + keyRowsStackView.addArrangedSubview(keysInRow) + } + if let altKeys = model.alternateKeys { + for row in altKeys { + let keysInRow = createKeyRow(keys: row) + alternateKeyRowsStackView.addArrangedSubview(keysInRow) + } + } + if !model.isDraggable { + dragMeView.isHidden = true + } + } + + func toggleKeysStackView() { + if viewModel.alternateKeys != nil { + keyRowsStackView.isHidden.toggle() + alternateKeyRowsStackView.isHidden.toggle() + refreshModifierStates() + } + } + + func refreshModifierStates() { + modifierButtons.forEach{ button in + button.isSelected = viewModel.modifierKeyToggleStateForKey(button.key) + } + } + + private func createKey(_ keyCoded: KeyCoded) -> UIButton { + let key = KeyboardButton(key: keyCoded) + if let imageName = keyCoded.keyImageName { + key.tintColor = EmulatorKeyboardView.keyNormalTextColor + key.setImage(UIImage(systemName: imageName), for: .normal) + if let highlightedImageName = keyCoded.keyImageNameHighlighted { + key.setImage(UIImage(systemName: highlightedImageName), for: .highlighted) + key.setImage(UIImage(systemName: highlightedImageName), for: .selected) + } + } else { + key.setTitle(keyCoded.keyLabel, for: .normal) + key.titleLabel?.font = EmulatorKeyboardView.keyNormalFont + key.setTitleColor(EmulatorKeyboardView.keyNormalTextColor, for: .normal) + key.setTitleColor(EmulatorKeyboardView.keySelectedTextColor, for: .selected) + key.setTitleColor(EmulatorKeyboardView.keyPressedTextColor, for: .highlighted) + } + + key.translatesAutoresizingMaskIntoConstraints = false + key.widthAnchor.constraint(equalToConstant: (25 * CGFloat(keyCoded.keySize.rawValue))).isActive = true + key.heightAnchor.constraint(equalToConstant: 35).isActive = true + key.backgroundColor = EmulatorKeyboardView.keyNormalBackgroundColor + key.layer.borderWidth = EmulatorKeyboardView.keyBorderWidth + key.layer.borderColor = EmulatorKeyboardView.keyNormalBorderColor.cgColor + key.layer.cornerRadius = EmulatorKeyboardView.keyCornerRadius + key.addTarget(self, action: #selector(keyPressed(_:)), for: .touchDown) + key.addTarget(self, action: #selector(keyReleased(_:)), for: .touchUpInside) + key.addTarget(self, action: #selector(keyReleased(_:)), for: .touchUpOutside) + key.addTarget(self, action: #selector(keyCancelled(_:)), for: .touchCancel) + if keyCoded.isModifier { + modifierButtons.update(with: key) + } + return key + } + + private func createKeyRow(keys: [KeyCoded]) -> UIStackView { + let subviews: [UIView] = keys.enumerated().map { index, keyCoded -> UIView in + if keyCoded is SpacerKey { + let spacer = UIView() + spacer.widthAnchor.constraint(equalToConstant: 25.0 * CGFloat(keyCoded.keySize.rawValue)).isActive = true + spacer.heightAnchor.constraint(equalToConstant: 25.0).isActive = true + return spacer + } else if let sliderKey = keyCoded as? SliderKey { + sliderKey.keyboardView = self + return sliderKey.createView() + } + return createKey(keyCoded) + } + let stack = UIStackView(arrangedSubviews: subviews) + stack.axis = .horizontal + stack.distribution = .fill + stack.spacing = 8 + return stack + } +} + +@objc enum KeySize: Int { + case standard = 1, wide, wider +} + +// represents a key that has an underlying code that gets sent to the emulator +@objc protocol KeyCoded: AnyObject { + var keyLabel: String { get } + var keyImageName: String? { get } + var keyImageNameHighlighted: String? { get } + var keyCode: Int { get } + var keySize: KeySize { get } + var isModifier: Bool { get } +} + +protocol KeyRowsDataSource { + func keyForPositionAt(_ position: KeyPosition) -> KeyCoded? +} + +@objc class EmulatorKeyboardKey: NSObject, KeyCoded { + let keyLabel: String + var keyImageName: String? + var keyImageNameHighlighted: String? + let keyCode: Int + let keySize: KeySize + let isModifier: Bool + + override var description: String { + return String(format: "\(keyLabel) (%02X)", keyCode) + } + init(label: String, code: Int, keySize: KeySize = .standard, isModifier: Bool = false, imageName: String? = nil, imageNameHighlighted: String? = nil) { + self.keyLabel = label + self.keyCode = code + self.keySize = keySize + self.isModifier = isModifier + self.keyImageName = imageName + self.keyImageNameHighlighted = imageNameHighlighted + } +} + +class SpacerKey: KeyCoded { + let keyLabel = "" + let keyCode = 0 + let keySize: KeySize + let isModifier = false + let keyImageName: String? = nil + let keyImageNameHighlighted: String? = nil + init(keySize: KeySize = .standard) { + self.keySize = keySize + } +} + +class SliderKey: KeyCoded { + let keyLabel = "" + let keyCode = 0 + let keySize: KeySize + let isModifier = false + let keyImageName: String? = nil + let keyImageNameHighlighted: String? = nil + weak var keyboardView: EmulatorKeyboardView? + + init(keySize: KeySize = .standard) { + self.keySize = keySize + } + + func createView() -> UIView { + let slider = UISlider(frame: .zero) + slider.minimumValue = 0.1 + slider.maximumValue = 1.0 + slider.addTarget(self, action: #selector(adjustKeyboardAlpha(_:)), for: .valueChanged) + slider.value = 1.0 + let size = CGSize(width:EmulatorKeyboardView.keyNormalFont.pointSize, height:EmulatorKeyboardView.keyNormalFont.pointSize) + slider.setThumbImage(UIImage.dot(size:size, color:EmulatorKeyboardView.keyNormalTextColor), for: .normal) + return slider + } + @objc func adjustKeyboardAlpha(_ sender: UISlider) { + keyboardView?.delegate?.updateTransparency(toAlpha: sender.value) + } +} + +struct KeyPosition { + let row: Int + let column: Int +} + +@objc class EmulatorKeyboardViewModel: NSObject, KeyRowsDataSource { + var keys = [[KeyCoded]]() + var alternateKeys: [[KeyCoded]]? + var modifiers: [Int16: KeyCoded]? + + var isDraggable = true + + @objc weak var delegate: EmulatorKeyboardKeyPressedDelegate? + @objc weak var modifierDelegate: EmulatorKeyboardModifierPressedDelegate? + + init(keys: [[KeyCoded]], alternateKeys: [[KeyCoded]]? = nil) { + self.keys = keys + self.alternateKeys = alternateKeys + } + + func createView() -> EmulatorKeyboardView { + let view = EmulatorKeyboardView() + view.viewModel = self + return view + } + + func keyForPositionAt(_ position: KeyPosition) -> KeyCoded? { + guard position.row < keys.count else { + return nil + } + let row = keys[position.row] + guard position.column < row.count else { + return nil + } + return row[position.column] + } + + func modifierKeyToggleStateForKey(_ key: KeyCoded) -> Bool { + return key.isModifier && (modifierDelegate?.isModifierEnabled(key: key) ?? false) + } + + func keyPressed(_ key: KeyCoded) { + if key.isModifier { + let isPressed = modifierDelegate?.isModifierEnabled(key: key) ?? false + modifierDelegate?.modifierPressedWithKey(key, enable: !isPressed) + return + } + delegate?.keyDown(key) + } + + func keyReleased(_ key: KeyCoded) { + if key.isModifier { + return + } + delegate?.keyUp(key) + } + + // KeyCoded can support a shifted key label + // view can update with shifted key labels? + // cluster can support alternate keys and view can swap them out? +} + +@objc class EmulatorKeyboardController: UIViewController { + + class EmulatorKeyboardPassthroughView: UIView { + override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + let hitView = super.hitTest(point, with: event) + if hitView == self { + return nil + } + return hitView + } + } + + @objc let leftKeyboardModel: EmulatorKeyboardViewModel + @objc let rightKeyboardModel: EmulatorKeyboardViewModel + + @objc lazy var leftKeyboardView: EmulatorKeyboardView = { + let view = leftKeyboardModel.createView() + view.delegate = self + return view + }() + @objc lazy var rightKeyboardView: EmulatorKeyboardView = { + let view = rightKeyboardModel.createView() + view.delegate = self + return view + }() + var keyboardConstraints = [NSLayoutConstraint]() + + init(leftKeyboardModel: EmulatorKeyboardViewModel, rightKeyboardModel: EmulatorKeyboardViewModel) { + self.leftKeyboardModel = leftKeyboardModel + self.rightKeyboardModel = rightKeyboardModel + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + view = EmulatorKeyboardPassthroughView() + } + + override func viewDidLoad() { + super.viewDidLoad() + setupView() + + let panGesture = UIPanGestureRecognizer(target: self, action: #selector(draggedView(_:))) + leftKeyboardView.dragMeView.isUserInteractionEnabled = true + leftKeyboardView.dragMeView.addGestureRecognizer(panGesture) + let panGestureRightKeyboard = UIPanGestureRecognizer(target: self, action: #selector(draggedView(_:))) + rightKeyboardView.dragMeView.isUserInteractionEnabled = true + rightKeyboardView.dragMeView.addGestureRecognizer(panGestureRightKeyboard) + } + + func setupView() { + NSLayoutConstraint.deactivate(keyboardConstraints) + keyboardConstraints.removeAll() + leftKeyboardView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(leftKeyboardView) + leftKeyboardView.heightAnchor.constraint(equalToConstant: 270).isActive = true + leftKeyboardView.widthAnchor.constraint(equalToConstant: 180).isActive = true + keyboardConstraints.append(contentsOf: [ + leftKeyboardView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), + leftKeyboardView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) + ]) + rightKeyboardView.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(rightKeyboardView) + keyboardConstraints.append(contentsOf: [ + rightKeyboardView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), + rightKeyboardView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) + ]) + rightKeyboardView.heightAnchor.constraint(equalToConstant: 270).isActive = true + rightKeyboardView.widthAnchor.constraint(equalToConstant: 180).isActive = true + NSLayoutConstraint.activate(keyboardConstraints) + } + + func setupViewFrames() { + // initial placement on the bottom corners + // since we don't know the frame of this view yet until layout time, + // assume it's taking the full screen + let screenFrame = UIScreen.main.bounds + let keyboardHeight: CGFloat = 250.0 + let keyboardWidth: CGFloat = 180.0 + let bottomLeftFrame = CGRect( + x: 0, + y: screenFrame.size.height - 40 - keyboardHeight - 20, + width: keyboardWidth, height: keyboardHeight) + let bottomRightFrame = CGRect( + x: screenFrame.size.width - 20 - keyboardWidth, + y:screenFrame.size.height - 40 - keyboardHeight - 20, + width: keyboardWidth, height: keyboardHeight + ) + view.addSubview(leftKeyboardView) + view.addSubview(rightKeyboardView) + leftKeyboardView.frame = bottomLeftFrame + rightKeyboardView.frame = bottomRightFrame + } + + func setupKeyModels() { + leftKeyboardView.setupWithModel(leftKeyboardModel) + rightKeyboardView.setupWithModel(rightKeyboardModel) + } + + @objc func draggedView(_ sender:UIPanGestureRecognizer){ + guard let keyboardView = sender.view?.superview else { + return + } + let translation = sender.translation(in: self.view) + keyboardView.center = CGPoint(x: keyboardView.center.x + translation.x, y: keyboardView.center.y + translation.y) + sender.setTranslation(CGPoint.zero, in: self.view) + } +} + +extension EmulatorKeyboardController: EmulatorKeyboardViewDelegate { + func toggleAlternateKeys() { + for keyboard in [leftKeyboardView, rightKeyboardView] { + keyboard.toggleKeysStackView() + } + } + func refreshModifierStates() { + for keyboard in [leftKeyboardView, rightKeyboardView] { + keyboard.refreshModifierStates() + } + } + func updateTransparency(toAlpha alpha: Float) { + for keyboard in [leftKeyboardView, rightKeyboardView] { + keyboard.alpha = CGFloat(alpha) + } + } +} + +private extension UIImage { + static func dot(size:CGSize, color:UIColor) -> UIImage { + return UIGraphicsImageRenderer(size: size).image { context in + context.cgContext.setFillColor(color.cgColor) + context.cgContext.fillEllipse(in: CGRect(origin:.zero, size:size)) + } + } +} diff --git a/pkg/apple/EmulatorTouchMouse.swift b/pkg/apple/EmulatorTouchMouse.swift new file mode 100644 index 0000000000..b11a11a6c7 --- /dev/null +++ b/pkg/apple/EmulatorTouchMouse.swift @@ -0,0 +1,175 @@ +// +// EmulatorTouchMouse.swift +// RetroArchiOS +// +// Created by Yoshi Sugawara on 12/27/21. +// Copyright © 2021 RetroArch. All rights reserved. +// + +/** + Touch mouse behavior: + - Mouse movement: Pan finger around screen + - Left click: Tap with one finger + - Right click: Tap with two fingers (or hold with one finger and tap with another) + - Click-and-drag: Double tap and hold for 1 second, then pan finger around screen to drag mouse + + Code adapted from iDOS/dospad: https://github.com/litchie/dospad + */ + +import Combine +import UIKit + +@objc protocol EmulatorTouchMouseHandlerDelegate: AnyObject { + func handleMouseClick(isLeftClick: Bool, isPressed: Bool) + func handleMouseMove(x: CGFloat, y: CGFloat) +} + +@objcMembers public class EmulatorTouchMouseHandler: NSObject { + enum MouseHoldState { + case notHeld, wait, held + } + + struct MouseClick { + var isRightClick = false + var isPressed = false + } + + struct TouchInfo { + let touch: UITouch + let origin: CGPoint + let holdState: MouseHoldState + } + + let view: UIView + weak var delegate: EmulatorTouchMouseHandlerDelegate? + + private let positionChangeThreshold: CGFloat = 20.0 + private let mouseHoldInterval: TimeInterval = 1.0 + + private var pendingMouseEvents = [MouseClick]() + private var mouseEventPublisher: AnyPublisher { + mouseEventSubject.eraseToAnyPublisher() + } + private let mouseEventSubject = PassthroughSubject() + private var subscription: AnyCancellable? + + private var primaryTouch: TouchInfo? + private var secondaryTouch: TouchInfo? + + private let mediumHaptic = UIImpactFeedbackGenerator(style: .medium) + + public init(view: UIView) { + self.view = view + super.init() + setup() + } + + private func setup() { + subscription = mouseEventPublisher + .sink(receiveValue: {[weak self] value in + self?.pendingMouseEvents.append(value) + self?.processMouseEvents() + }) + } + + private func processMouseEvents() { + guard let event = pendingMouseEvents.first else { + return + } + delegate?.handleMouseClick(isLeftClick: !event.isRightClick, isPressed: event.isPressed) + if event.isPressed { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in + self?.mouseEventSubject.send(MouseClick(isRightClick: event.isRightClick, isPressed: false)) + } + } + pendingMouseEvents.removeFirst() + processMouseEvents() + } + + @objc private func beginHold() { + guard let primaryTouch = primaryTouch, primaryTouch.holdState == .wait else { + return + } + self.primaryTouch = TouchInfo(touch: primaryTouch.touch, origin: primaryTouch.origin, holdState: .held) + mediumHaptic.impactOccurred() + delegate?.handleMouseClick(isLeftClick: true, isPressed: true) + } + + private func endHold() { + guard let primaryTouch = primaryTouch else { return } + if primaryTouch.holdState == .notHeld { + return + } + if primaryTouch.holdState == .wait { + Thread.cancelPreviousPerformRequests(withTarget: self, selector: #selector(beginHold), object: self) + } else { + delegate?.handleMouseClick(isLeftClick: true, isPressed: false) + } + self.primaryTouch = TouchInfo(touch: primaryTouch.touch, origin: primaryTouch.origin, holdState: .notHeld) + } + + public func touchesBegan(touches: Set) { + guard let touch = touches.first else { + return + } + if primaryTouch == nil { + primaryTouch = TouchInfo(touch: touch, origin: touch.location(in: view), holdState: .wait) + if touch.tapCount == 2 { + self.perform(#selector(beginHold), with: nil, afterDelay: mouseHoldInterval) + } + } else if secondaryTouch == nil { + secondaryTouch = TouchInfo(touch: touch, origin: touch.location(in: view), holdState: .notHeld) + } + } + + public func touchesEnded(touches: Set) { + for touch in touches { + if touch == primaryTouch?.touch { + if touch.tapCount > 0 { + for _ in 1...touch.tapCount { + mouseEventSubject.send(MouseClick(isRightClick: false, isPressed: true)) + } + } + endHold() + primaryTouch = nil + secondaryTouch = nil + } else if touch == secondaryTouch?.touch { + if touch.tapCount > 0 { + mouseEventSubject.send(MouseClick(isRightClick: true, isPressed: true)) + endHold() + } + secondaryTouch = nil + } + } + delegate?.handleMouseMove(x: 0, y: 0) + } + + public func touchesMoved(touches: Set) { + for touch in touches { + if touch == primaryTouch?.touch { + let a = touch.previousLocation(in: view) + let b = touch.location(in: view) + if primaryTouch?.holdState == .wait && (distanceBetween(pointA: a, pointB: b) > positionChangeThreshold) { + endHold() + } + delegate?.handleMouseMove(x: b.x-a.x, y: b.y-a.y) + } + } + } + + public func touchesCancelled(touches: Set) { + for touch in touches { + if touch == primaryTouch?.touch { + endHold() + } + } + primaryTouch = nil + secondaryTouch = nil + } + + func distanceBetween(pointA: CGPoint, pointB: CGPoint) -> CGFloat { + let dx = pointA.x - pointB.x + let dy = pointA.y - pointB.y + return sqrt(dx*dx*dy*dy) + } +} diff --git a/pkg/apple/JITSupport.h b/pkg/apple/JITSupport.h new file mode 100644 index 0000000000..50641d1645 --- /dev/null +++ b/pkg/apple/JITSupport.h @@ -0,0 +1,17 @@ +// +// JITSupport.h +// RetroArchiOS +// +// Created by Yoshi Sugawara on 9/25/21. +// Copyright © 2021 RetroArch. All rights reserved. +// + +#ifndef JITSupport_h +#define JITSupport_h + +#include + +static bool jb_has_debugger_attached(void); +bool jb_enable_ptrace_hack(void); + +#endif /* JITSupport_h */ diff --git a/pkg/apple/JITSupport.m b/pkg/apple/JITSupport.m new file mode 100644 index 0000000000..aaa1fbc2e6 --- /dev/null +++ b/pkg/apple/JITSupport.m @@ -0,0 +1,76 @@ +// +// JITSupport.m +// RetroArchiOS +// +// Created by Yoshi Sugawara on 9/25/21. +// Copyright © 2021 RetroArch. All rights reserved. +// +// Copied from UTMApp, original author: osy +// + +#import + +#include +#include +#include +#include +#include + +extern int csops(pid_t pid, unsigned int ops, void * useraddr, size_t usersize); +extern boolean_t exc_server(mach_msg_header_t *, mach_msg_header_t *); +extern int ptrace(int request, pid_t pid, caddr_t addr, int data); + +#define CS_OPS_STATUS 0 /* return status */ +#define CS_KILL 0x00000200 /* kill process if it becomes invalid */ +#define CS_DEBUGGED 0x10000000 /* process is currently or has previously been debugged and allowed to run with invalid pages */ +#define PT_TRACE_ME 0 /* child declares it's being traced */ +#define PT_SIGEXC 12 /* signals as exceptions for current_proc */ + +static void *exception_handler(void *argument) { + mach_port_t port = *(mach_port_t *)argument; + mach_msg_server(exc_server, 2048, port, 0); + return NULL; +} + +static bool jb_has_debugger_attached(void) { + int flags; + return !csops(getpid(), CS_OPS_STATUS, &flags, sizeof(flags)) && flags & CS_DEBUGGED; +} + +bool jb_enable_ptrace_hack(void) { + bool debugged = jb_has_debugger_attached(); + + // Thanks to this comment: https://news.ycombinator.com/item?id=18431524 + // We use this hack to allow mmap with PROT_EXEC (which usually requires the + // dynamic-codesigning entitlement) by tricking the process into thinking + // that Xcode is debugging it. We abuse the fact that JIT is needed to + // debug the process. + if (ptrace(PT_TRACE_ME, 0, NULL, 0) < 0) { + return false; + } + + // ptracing ourselves confuses the kernel and will cause bad things to + // happen to the system (hangs…) if an exception or signal occurs. Setup + // some "safety nets" so we can cause the process to exit in a somewhat sane + // state. We only need to do this if the debugger isn't attached. (It'll do + // this itself, and if we do it we'll interfere with its normal operation + // anyways.) + if (!debugged) { + // First, ensure that signals are delivered as Mach software exceptions… + ptrace(PT_SIGEXC, 0, NULL, 0); + + // …then ensure that this exception goes through our exception handler. + // I think it's OK to just watch for EXC_SOFTWARE because the other + // exceptions (e.g. EXC_BAD_ACCESS, EXC_BAD_INSTRUCTION, and friends) + // will end up being delivered as signals anyways, and we can get them + // once they're resent as a software exception. + mach_port_t port = MACH_PORT_NULL; + mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); + mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND); + task_set_exception_ports(mach_task_self(), EXC_MASK_SOFTWARE, port, EXCEPTION_DEFAULT, THREAD_STATE_NONE); + pthread_t thread; + pthread_create(&thread, NULL, exception_handler, (void *)&port); + } + + return true; +} diff --git a/pkg/apple/RetroArch-Bridging-Header.h b/pkg/apple/RetroArch-Bridging-Header.h new file mode 100644 index 0000000000..0d5a44fe2d --- /dev/null +++ b/pkg/apple/RetroArch-Bridging-Header.h @@ -0,0 +1,16 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#ifndef HAVE_COCOATOUCH +#define HAVE_COCOATOUCH +#endif + +#ifndef HAVE_IOS_CUSTOMKEYBOARD +#define HAVE_IOS_CUSTOMKEYBOARD +#endif + +#include "libretro-common/include/libretro.h" +#import "../ui/drivers/cocoa/cocoa_common.h" +#include "../../input/drivers_keyboard/keyboard_event_apple.h" +#include "../../input/input_keymaps.h" diff --git a/pkg/apple/RetroArch_iOS11_Metal.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS11_Metal.xcodeproj/project.pbxproj index 3bd8b9f135..a76c6a1855 100644 --- a/pkg/apple/RetroArch_iOS11_Metal.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_iOS11_Metal.xcodeproj/project.pbxproj @@ -80,6 +80,7 @@ 92CC05C321FE3C6D00FF79F0 /* WebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC05C121FE3C6D00FF79F0 /* WebServer.m */; }; 92CC05C521FEDC9F00FF79F0 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92CC05C421FEDC9F00FF79F0 /* CFNetwork.framework */; }; 92CC05C721FEDD0B00FF79F0 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92CC05C621FEDD0B00FF79F0 /* MobileCoreServices.framework */; }; + 92DAF342277EC52900FE2A9E /* JITSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 92DAF341277EC52900FE2A9E /* JITSupport.m */; }; 92E5DCD4231A5786006491BF /* modules in Resources */ = {isa = PBXBuildFile; fileRef = 92E5DCD3231A5786006491BF /* modules */; }; /* End PBXBuildFile section */ @@ -332,6 +333,8 @@ 92CC05C121FE3C6D00FF79F0 /* WebServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebServer.m; sourceTree = ""; }; 92CC05C421FEDC9F00FF79F0 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; 92CC05C621FEDD0B00FF79F0 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + 92DAF340277EC52900FE2A9E /* JITSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITSupport.h; sourceTree = ""; }; + 92DAF341277EC52900FE2A9E /* JITSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JITSupport.m; sourceTree = ""; }; 92E5DCD3231A5786006491BF /* modules */ = {isa = PBXFileReference; lastKnownFileType = folder; path = modules; sourceTree = ""; }; 96366C5416C9AC3300D64A22 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; 96366C5816C9ACF500D64A22 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; @@ -410,6 +413,8 @@ children = ( 92B9EC9324E0536200E6CFB2 /* core */, 92B9EAE524E0518600E6CFB2 /* libretro-common */, + 92DAF340277EC52900FE2A9E /* JITSupport.h */, + 92DAF341277EC52900FE2A9E /* JITSupport.m */, ); name = Sources; sourceTree = ""; @@ -1102,7 +1107,7 @@ ORGANIZATIONNAME = RetroArch; TargetAttributes = { 9204BE091D319EF300BD49DB = { - DevelopmentTeam = UK699V5ZS8; + DevelopmentTeam = R72X3BF4KE; DevelopmentTeamName = RetroArch; }; 926C77D621FD1E6500103EDE = { @@ -1217,6 +1222,7 @@ 92CC05BA21FE3C1700FF79F0 /* GCDWebServerFileRequest.m in Sources */, 92CC05AE21FE3C1700FF79F0 /* GCDWebServerFileResponse.m in Sources */, 9210C2F624B3A32D00E6FE7C /* griffin_cpp.cpp in Sources */, + 92DAF342277EC52900FE2A9E /* JITSupport.m in Sources */, 92CC05B221FE3C1700FF79F0 /* GCDWebServerStreamedResponse.m in Sources */, 92CC05A221FE3C1700FF79F0 /* GCDWebServerResponse.m in Sources */, ); @@ -1276,7 +1282,7 @@ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist"; CURRENT_PROJECT_VERSION = 1.10.0; DEPS_DIR = "$(SRCBASE)/deps"; - DEVELOPMENT_TEAM = UK699V5ZS8; + DEVELOPMENT_TEAM = R72X3BF4KE; ENABLE_BITCODE = NO; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; @@ -1392,7 +1398,7 @@ CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist"; CURRENT_PROJECT_VERSION = 1.10.0; DEPS_DIR = "$(SRCBASE)/deps"; - DEVELOPMENT_TEAM = UK699V5ZS8; + DEVELOPMENT_TEAM = R72X3BF4KE; ENABLE_BITCODE = NO; GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PREFIX_HEADER = ""; diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..b1e877f0ab --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj @@ -0,0 +1,2079 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 9204BE0D1D319EF300BD49DB /* griffin_objc.m in Sources */ = {isa = PBXBuildFile; fileRef = 50521A431AA23BF500185CC9 /* griffin_objc.m */; }; + 9204BE101D319EF300BD49DB /* griffin.c in Sources */ = {isa = PBXBuildFile; fileRef = 501232C9192E5FC40063A359 /* griffin.c */; }; + 9204BE121D319EF300BD49DB /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 5040F04F1AE47ED4006F6972 /* libz.dylib */; }; + 9204BE131D319EF300BD49DB /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50C3B1AD1AB1107100F478D3 /* QuartzCore.framework */; }; + 9204BE141D319EF300BD49DB /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 963C3C33186E3DED00A6EB1E /* GameController.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 9204BE151D319EF300BD49DB /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 696012F119F3389A006A1088 /* CoreText.framework */; }; + 9204BE161D319EF300BD49DB /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50CCC827185E0E7D001F5BC8 /* CoreLocation.framework */; }; + 9204BE171D319EF300BD49DB /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 501881ED184BB54C006F665D /* CoreMedia.framework */; }; + 9204BE181D319EF300BD49DB /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 501881EB184BAD6D006F665D /* AVFoundation.framework */; }; + 9204BE191D319EF300BD49DB /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50E7189E184B88AA001956CE /* CoreVideo.framework */; }; + 9204BE1A1D319EF300BD49DB /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 96366C5816C9ACF500D64A22 /* AudioToolbox.framework */; }; + 9204BE1B1D319EF300BD49DB /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 96366C5416C9AC3300D64A22 /* CoreAudio.framework */; }; + 9204BE1C1D319EF300BD49DB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 96AFAE2916C1D4EA009DE44C /* UIKit.framework */; }; + 9204BE1D1D319EF300BD49DB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 96AFAE2B16C1D4EA009DE44C /* Foundation.framework */; }; + 9204BE1E1D319EF300BD49DB /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 96AFAE2D16C1D4EA009DE44C /* CoreGraphics.framework */; }; + 9204BE1F1D319EF300BD49DB /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 96AFAE2F16C1D4EA009DE44C /* GLKit.framework */; }; + 9204BE201D319EF300BD49DB /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 96AFAE3116C1D4EA009DE44C /* OpenGLES.framework */; }; + 9204BE231D319EF300BD49DB /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 967894611788EBD800D6CA69 /* InfoPlist.strings */; }; + 9204BE261D319EF300BD49DB /* iOS/modules in Resources */ = {isa = PBXBuildFile; fileRef = 83EB675F19EEAF050096F441 /* iOS/modules */; }; + 9210C2F224B3A19100E6FE7C /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9210C2F024B3A19100E6FE7C /* MetalKit.framework */; }; + 9210C2F324B3A19100E6FE7C /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9210C2F124B3A19100E6FE7C /* Metal.framework */; }; + 9210C2F624B3A32D00E6FE7C /* griffin_cpp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9210C2F424B3A32D00E6FE7C /* griffin_cpp.cpp */; }; + 9210C2F724B3A32D00E6FE7C /* griffin_cpp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9210C2F424B3A32D00E6FE7C /* griffin_cpp.cpp */; }; + 9210C2F824B3A32D00E6FE7C /* griffin_glslang.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9210C2F524B3A32D00E6FE7C /* griffin_glslang.cpp */; }; + 9210C2F924B3A32D00E6FE7C /* griffin_glslang.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9210C2F524B3A32D00E6FE7C /* griffin_glslang.cpp */; }; + 9210C2FC24B4CB4900E6FE7C /* menu_pipeline.metal in Sources */ = {isa = PBXBuildFile; fileRef = 9210C2FA24B4CB4900E6FE7C /* menu_pipeline.metal */; }; + 9210C2FD24B4CB4900E6FE7C /* menu_pipeline.metal in Sources */ = {isa = PBXBuildFile; fileRef = 9210C2FA24B4CB4900E6FE7C /* menu_pipeline.metal */; }; + 9210C2FE24B4CB4900E6FE7C /* Shaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = 9210C2FB24B4CB4900E6FE7C /* Shaders.metal */; }; + 9210C2FF24B4CB4900E6FE7C /* Shaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = 9210C2FB24B4CB4900E6FE7C /* Shaders.metal */; }; + 9222F1FF2314BA7C0097C0FD /* assets.zip in Resources */ = {isa = PBXBuildFile; fileRef = 9222F1FE2314BA7C0097C0FD /* assets.zip */; }; + 9222F2002314BA7C0097C0FD /* assets.zip in Resources */ = {isa = PBXBuildFile; fileRef = 9222F1FE2314BA7C0097C0FD /* assets.zip */; }; + 9222F2092315DAD50097C0FD /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9222F2082315DAD50097C0FD /* Launch Screen.storyboard */; }; + 9222F20B2315DD3D0097C0FD /* retroarch_logo.png in Resources */ = {isa = PBXBuildFile; fileRef = 9222F20A2315DD3D0097C0FD /* retroarch_logo.png */; }; + 926C77E321FD1E6700103EDE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 926C77E221FD1E6700103EDE /* Assets.xcassets */; }; + 926C77EA21FD20C100103EDE /* griffin_objc.m in Sources */ = {isa = PBXBuildFile; fileRef = 50521A431AA23BF500185CC9 /* griffin_objc.m */; }; + 926C77EB21FD20C400103EDE /* griffin.c in Sources */ = {isa = PBXBuildFile; fileRef = 501232C9192E5FC40063A359 /* griffin.c */; }; + 926C77EF21FD263800103EDE /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 926C77EE21FD263800103EDE /* AudioToolbox.framework */; }; + 926C77F121FD26E800103EDE /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 926C77F021FD26E800103EDE /* GameController.framework */; }; + 9289D20A25E40D7B004B5D52 /* EmulatorKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9289D20925E40D7B004B5D52 /* EmulatorKeyboard.swift */; }; + 9289D22825E88A63004B5D52 /* CocoaView+KeyboardSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9289D22725E88A63004B5D52 /* CocoaView+KeyboardSupport.swift */; }; + 929784502200EEE400989A60 /* iOS/Resources/Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 69D31DE31A547EC800EF4C92 /* iOS/Resources/Media.xcassets */; }; + 92A1F81827006CAE00DEAD2A /* JITSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 92A1F81727006CAE00DEAD2A /* JITSupport.m */; }; + 92CC05A221FE3C1700FF79F0 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058221FE3C1700FF79F0 /* GCDWebServerResponse.m */; }; + 92CC05A321FE3C1700FF79F0 /* GCDWebServerResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058221FE3C1700FF79F0 /* GCDWebServerResponse.m */; }; + 92CC05A421FE3C1700FF79F0 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058521FE3C1700FF79F0 /* GCDWebServerRequest.m */; }; + 92CC05A521FE3C1700FF79F0 /* GCDWebServerRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058521FE3C1700FF79F0 /* GCDWebServerRequest.m */; }; + 92CC05A621FE3C1700FF79F0 /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058821FE3C1700FF79F0 /* GCDWebServerFunctions.m */; }; + 92CC05A721FE3C1700FF79F0 /* GCDWebServerFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058821FE3C1700FF79F0 /* GCDWebServerFunctions.m */; }; + 92CC05A821FE3C1700FF79F0 /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058921FE3C1700FF79F0 /* GCDWebServer.m */; }; + 92CC05A921FE3C1700FF79F0 /* GCDWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058921FE3C1700FF79F0 /* GCDWebServer.m */; }; + 92CC05AA21FE3C1700FF79F0 /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058A21FE3C1700FF79F0 /* GCDWebServerConnection.m */; }; + 92CC05AB21FE3C1700FF79F0 /* GCDWebServerConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058A21FE3C1700FF79F0 /* GCDWebServerConnection.m */; }; + 92CC05AC21FE3C1700FF79F0 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058F21FE3C1700FF79F0 /* GCDWebServerErrorResponse.m */; }; + 92CC05AD21FE3C1700FF79F0 /* GCDWebServerErrorResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC058F21FE3C1700FF79F0 /* GCDWebServerErrorResponse.m */; }; + 92CC05AE21FE3C1700FF79F0 /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059121FE3C1700FF79F0 /* GCDWebServerFileResponse.m */; }; + 92CC05AF21FE3C1700FF79F0 /* GCDWebServerFileResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059121FE3C1700FF79F0 /* GCDWebServerFileResponse.m */; }; + 92CC05B021FE3C1700FF79F0 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059221FE3C1700FF79F0 /* GCDWebServerDataResponse.m */; }; + 92CC05B121FE3C1700FF79F0 /* GCDWebServerDataResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059221FE3C1700FF79F0 /* GCDWebServerDataResponse.m */; }; + 92CC05B221FE3C1700FF79F0 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059421FE3C1700FF79F0 /* GCDWebServerStreamedResponse.m */; }; + 92CC05B321FE3C1700FF79F0 /* GCDWebServerStreamedResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059421FE3C1700FF79F0 /* GCDWebServerStreamedResponse.m */; }; + 92CC05B421FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059921FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.m */; }; + 92CC05B521FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059921FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.m */; }; + 92CC05B621FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059A21FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.m */; }; + 92CC05B721FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059A21FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.m */; }; + 92CC05B821FE3C1700FF79F0 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059B21FE3C1700FF79F0 /* GCDWebServerDataRequest.m */; }; + 92CC05B921FE3C1700FF79F0 /* GCDWebServerDataRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059B21FE3C1700FF79F0 /* GCDWebServerDataRequest.m */; }; + 92CC05BA21FE3C1700FF79F0 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059C21FE3C1700FF79F0 /* GCDWebServerFileRequest.m */; }; + 92CC05BB21FE3C1700FF79F0 /* GCDWebServerFileRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC059C21FE3C1700FF79F0 /* GCDWebServerFileRequest.m */; }; + 92CC05BC21FE3C1700FF79F0 /* GCDWebUploader.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 92CC059F21FE3C1700FF79F0 /* GCDWebUploader.bundle */; }; + 92CC05BD21FE3C1700FF79F0 /* GCDWebUploader.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 92CC059F21FE3C1700FF79F0 /* GCDWebUploader.bundle */; }; + 92CC05BE21FE3C1700FF79F0 /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC05A121FE3C1700FF79F0 /* GCDWebUploader.m */; }; + 92CC05BF21FE3C1700FF79F0 /* GCDWebUploader.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC05A121FE3C1700FF79F0 /* GCDWebUploader.m */; }; + 92CC05C221FE3C6D00FF79F0 /* WebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC05C121FE3C6D00FF79F0 /* WebServer.m */; }; + 92CC05C321FE3C6D00FF79F0 /* WebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92CC05C121FE3C6D00FF79F0 /* WebServer.m */; }; + 92CC05C521FEDC9F00FF79F0 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92CC05C421FEDC9F00FF79F0 /* CFNetwork.framework */; }; + 92CC05C721FEDD0B00FF79F0 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 92CC05C621FEDD0B00FF79F0 /* MobileCoreServices.framework */; }; + 92DAF33F277A370600FE2A9E /* EmulatorTouchMouse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DAF33E277A370600FE2A9E /* EmulatorTouchMouse.swift */; }; + 92E5DCD4231A5786006491BF /* modules in Resources */ = {isa = PBXBuildFile; fileRef = 92E5DCD3231A5786006491BF /* modules */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 501232C9192E5FC40063A359 /* griffin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = griffin.c; path = ../../griffin/griffin.c; sourceTree = SOURCE_ROOT; }; + 501881EB184BAD6D006F665D /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + 501881ED184BB54C006F665D /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + 5040F04F1AE47ED4006F6972 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + 50521A431AA23BF500185CC9 /* griffin_objc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = griffin_objc.m; path = ../../griffin/griffin_objc.m; sourceTree = SOURCE_ROOT; }; + 50C3B1AD1AB1107100F478D3 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 50CCC827185E0E7D001F5BC8 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + 50E7189E184B88AA001956CE /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; + 696012F119F3389A006A1088 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; + 69D31DE31A547EC800EF4C92 /* iOS/Resources/Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = iOS/Resources/Media.xcassets; sourceTree = SOURCE_ROOT; }; + 83EB675F19EEAF050096F441 /* iOS/modules */ = {isa = PBXFileReference; lastKnownFileType = folder; path = iOS/modules; sourceTree = SOURCE_ROOT; }; + 9204BE2B1D319EF300BD49DB /* RetroArch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RetroArch.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 9210C2F024B3A19100E6FE7C /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; }; + 9210C2F124B3A19100E6FE7C /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; + 9210C2F424B3A32D00E6FE7C /* griffin_cpp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = griffin_cpp.cpp; path = ../../griffin/griffin_cpp.cpp; sourceTree = ""; }; + 9210C2F524B3A32D00E6FE7C /* griffin_glslang.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = griffin_glslang.cpp; path = ../../griffin/griffin_glslang.cpp; sourceTree = ""; }; + 9210C2FA24B4CB4900E6FE7C /* menu_pipeline.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = menu_pipeline.metal; path = ../../gfx/common/metal/menu_pipeline.metal; sourceTree = ""; }; + 9210C2FB24B4CB4900E6FE7C /* Shaders.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; name = Shaders.metal; path = ../../gfx/common/metal/Shaders.metal; sourceTree = ""; }; + 9222F1FE2314BA7C0097C0FD /* assets.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = assets.zip; sourceTree = ""; }; + 9222F2082315DAD50097C0FD /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; + 9222F20A2315DD3D0097C0FD /* retroarch_logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = retroarch_logo.png; sourceTree = ""; }; + 926C77D721FD1E6500103EDE /* RetroArchTV.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RetroArchTV.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 926C77E221FD1E6700103EDE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 926C77E421FD1E6700103EDE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 926C77EC21FD261600103EDE /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.1.sdk/System/Library/Frameworks/CoreAudio.framework; sourceTree = DEVELOPER_DIR; }; + 926C77EE21FD263800103EDE /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.1.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; }; + 926C77F021FD26E800103EDE /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.1.sdk/System/Library/Frameworks/GameController.framework; sourceTree = DEVELOPER_DIR; }; + 9289D20825E40D7A004B5D52 /* RetroArch-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RetroArch-Bridging-Header.h"; sourceTree = ""; }; + 9289D20925E40D7B004B5D52 /* EmulatorKeyboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmulatorKeyboard.swift; sourceTree = ""; }; + 9289D22725E88A63004B5D52 /* CocoaView+KeyboardSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CocoaView+KeyboardSupport.swift"; sourceTree = ""; }; + 92A1F81727006CAE00DEAD2A /* JITSupport.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = JITSupport.m; sourceTree = ""; }; + 92A1F81927006CCB00DEAD2A /* JITSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JITSupport.h; sourceTree = ""; }; + 92B9EB5724E0518700E6CFB2 /* base64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = base64.h; sourceTree = ""; }; + 92B9EB5824E0518700E6CFB2 /* utf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utf.h; sourceTree = ""; }; + 92B9EB5924E0518700E6CFB2 /* win32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = win32.h; sourceTree = ""; }; + 92B9EB5A24E0518700E6CFB2 /* crc32.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = crc32.h; sourceTree = ""; }; + 92B9EB5B24E0518700E6CFB2 /* memalign.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = memalign.h; sourceTree = ""; }; + 92B9EB5C24E0518700E6CFB2 /* libretro_dspfilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libretro_dspfilter.h; sourceTree = ""; }; + 92B9EB5E24E0518700E6CFB2 /* vfs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vfs.h; sourceTree = ""; }; + 92B9EB5F24E0518700E6CFB2 /* vfs_implementation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vfs_implementation.h; sourceTree = ""; }; + 92B9EB6024E0518700E6CFB2 /* vfs_implementation_cdrom.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vfs_implementation_cdrom.h; sourceTree = ""; }; + 92B9EB6224E0518700E6CFB2 /* cdrom.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cdrom.h; sourceTree = ""; }; + 92B9EB6324E0518700E6CFB2 /* libco.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libco.h; sourceTree = ""; }; + 92B9EB6524E0518700E6CFB2 /* apple_compat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = apple_compat.h; sourceTree = ""; }; + 92B9EB6624E0518700E6CFB2 /* strl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = strl.h; sourceTree = ""; }; + 92B9EB6724E0518700E6CFB2 /* strcasestr.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = strcasestr.h; sourceTree = ""; }; + 92B9EB6924E0518700E6CFB2 /* stdint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdint.h; sourceTree = ""; }; + 92B9EB6A24E0518700E6CFB2 /* fopen_utf8.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fopen_utf8.h; sourceTree = ""; }; + 92B9EB6B24E0518700E6CFB2 /* intrinsics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = intrinsics.h; sourceTree = ""; }; + 92B9EB6C24E0518700E6CFB2 /* posix_string.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = posix_string.h; sourceTree = ""; }; + 92B9EB6E24E0518700E6CFB2 /* zlib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zlib.h; sourceTree = ""; }; + 92B9EB6F24E0518700E6CFB2 /* zconf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = zconf.h; sourceTree = ""; }; + 92B9EB7024E0518700E6CFB2 /* getopt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = getopt.h; sourceTree = ""; }; + 92B9EB7124E0518700E6CFB2 /* fnmatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fnmatch.h; sourceTree = ""; }; + 92B9EB7224E0518700E6CFB2 /* msvc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = msvc.h; sourceTree = ""; }; + 92B9EB7324E0518700E6CFB2 /* ifaddrs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ifaddrs.h; sourceTree = ""; }; + 92B9EB7424E0518700E6CFB2 /* retro_common_api.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_common_api.h; sourceTree = ""; }; + 92B9EB7624E0518700E6CFB2 /* label_sanitization.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = label_sanitization.h; sourceTree = ""; }; + 92B9EB7824E0518700E6CFB2 /* dylib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dylib.h; sourceTree = ""; }; + 92B9EB7A24E0518700E6CFB2 /* net_ifinfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = net_ifinfo.h; sourceTree = ""; }; + 92B9EB7B24E0518700E6CFB2 /* net_compat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = net_compat.h; sourceTree = ""; }; + 92B9EB7C24E0518700E6CFB2 /* net_socket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = net_socket.h; sourceTree = ""; }; + 92B9EB7D24E0518700E6CFB2 /* net_natt.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = net_natt.h; sourceTree = ""; }; + 92B9EB7E24E0518700E6CFB2 /* net_socket_ssl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = net_socket_ssl.h; sourceTree = ""; }; + 92B9EB7F24E0518700E6CFB2 /* net_http.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = net_http.h; sourceTree = ""; }; + 92B9EB8024E0518700E6CFB2 /* net_http_parse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = net_http_parse.h; sourceTree = ""; }; + 92B9EB8124E0518700E6CFB2 /* retro_timers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_timers.h; sourceTree = ""; }; + 92B9EB8324E0518700E6CFB2 /* m3u_file.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = m3u_file.h; sourceTree = ""; }; + 92B9EB8424E0518700E6CFB2 /* rjson.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rjson.h; sourceTree = ""; }; + 92B9EB8524E0518700E6CFB2 /* rxml.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rxml.h; sourceTree = ""; }; + 92B9EB8624E0518700E6CFB2 /* cdfs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cdfs.h; sourceTree = ""; }; + 92B9EB8724E0518700E6CFB2 /* rpng.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rpng.h; sourceTree = ""; }; + 92B9EB8824E0518700E6CFB2 /* rtga.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rtga.h; sourceTree = ""; }; + 92B9EB8924E0518700E6CFB2 /* image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = image.h; sourceTree = ""; }; + 92B9EB8A24E0518700E6CFB2 /* logiqx_dat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = logiqx_dat.h; sourceTree = ""; }; + 92B9EB8B24E0518700E6CFB2 /* rbmp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rbmp.h; sourceTree = ""; }; + 92B9EB8C24E0518700E6CFB2 /* rwav.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rwav.h; sourceTree = ""; }; + 92B9EB8E24E0518700E6CFB2 /* rjpeg.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rjpeg.h; sourceTree = ""; }; + 92B9EB9024E0518700E6CFB2 /* rglgen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rglgen.h; sourceTree = ""; }; + 92B9EB9124E0518700E6CFB2 /* glsym_es2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = glsym_es2.h; sourceTree = ""; }; + 92B9EB9224E0518700E6CFB2 /* glsym.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = glsym.h; sourceTree = ""; }; + 92B9EB9324E0518700E6CFB2 /* rglgen_headers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rglgen_headers.h; sourceTree = ""; }; + 92B9EB9524E0518700E6CFB2 /* nx_gl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = nx_gl.h; sourceTree = ""; }; + 92B9EB9624E0518700E6CFB2 /* nx_glsym.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = nx_glsym.h; sourceTree = ""; }; + 92B9EB9724E0518700E6CFB2 /* rglgen_private_headers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rglgen_private_headers.h; sourceTree = ""; }; + 92B9EB9824E0518700E6CFB2 /* glsym_es3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = glsym_es3.h; sourceTree = ""; }; + 92B9EB9924E0518700E6CFB2 /* glsym_gl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = glsym_gl.h; sourceTree = ""; }; + 92B9EB9B24E0518700E6CFB2 /* string_list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = string_list.h; sourceTree = ""; }; + 92B9EB9C24E0518700E6CFB2 /* file_list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = file_list.h; sourceTree = ""; }; + 92B9EB9D24E0518700E6CFB2 /* dir_list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dir_list.h; sourceTree = ""; }; + 92B9EB9F24E0518700E6CFB2 /* nbio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = nbio.h; sourceTree = ""; }; + 92B9EBA024E0518700E6CFB2 /* config_file.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config_file.h; sourceTree = ""; }; + 92B9EBA124E0518700E6CFB2 /* archive_file.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = archive_file.h; sourceTree = ""; }; + 92B9EBA224E0518700E6CFB2 /* config_file_userdata.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config_file_userdata.h; sourceTree = ""; }; + 92B9EBA324E0518700E6CFB2 /* file_path.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = file_path.h; sourceTree = ""; }; + 92B9EBA424E0518700E6CFB2 /* retro_environment.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_environment.h; sourceTree = ""; }; + 92B9EBA724E0518700E6CFB2 /* rbuf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rbuf.h; sourceTree = ""; }; + 92B9EBA824E0518700E6CFB2 /* retro_dirent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_dirent.h; sourceTree = ""; }; + 92B9EBA924E0518700E6CFB2 /* retro_inline.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_inline.h; sourceTree = ""; }; + 92B9EBAA24E0518700E6CFB2 /* retro_math.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_math.h; sourceTree = ""; }; + 92B9EBAC24E0518700E6CFB2 /* memory_stream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = memory_stream.h; sourceTree = ""; }; + 92B9EBAD24E0518700E6CFB2 /* chd_stream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = chd_stream.h; sourceTree = ""; }; + 92B9EBAE24E0518700E6CFB2 /* trans_stream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = trans_stream.h; sourceTree = ""; }; + 92B9EBAF24E0518700E6CFB2 /* rzip_stream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rzip_stream.h; sourceTree = ""; }; + 92B9EBB024E0518700E6CFB2 /* file_stream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = file_stream.h; sourceTree = ""; }; + 92B9EBB124E0518700E6CFB2 /* stdin_stream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdin_stream.h; sourceTree = ""; }; + 92B9EBB224E0518700E6CFB2 /* file_stream_transforms.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = file_stream_transforms.h; sourceTree = ""; }; + 92B9EBB324E0518700E6CFB2 /* interface_stream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = interface_stream.h; sourceTree = ""; }; + 92B9EBB424E0518700E6CFB2 /* fastcpy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fastcpy.h; sourceTree = ""; }; + 92B9EBB624E0518700E6CFB2 /* lzma.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lzma.h; sourceTree = ""; }; + 92B9EBB724E0518700E6CFB2 /* minmax.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = minmax.h; sourceTree = ""; }; + 92B9EBB824E0518700E6CFB2 /* flac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = flac.h; sourceTree = ""; }; + 92B9EBB924E0518700E6CFB2 /* bitstream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = bitstream.h; sourceTree = ""; }; + 92B9EBBA24E0518700E6CFB2 /* cdrom.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = cdrom.h; sourceTree = ""; }; + 92B9EBBB24E0518700E6CFB2 /* chd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = chd.h; sourceTree = ""; }; + 92B9EBBC24E0518700E6CFB2 /* libchdr_zlib.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libchdr_zlib.h; sourceTree = ""; }; + 92B9EBBD24E0518700E6CFB2 /* huffman.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = huffman.h; sourceTree = ""; }; + 92B9EBBE24E0518700E6CFB2 /* coretypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = coretypes.h; sourceTree = ""; }; + 92B9EBC024E0518700E6CFB2 /* features_cpu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = features_cpu.h; sourceTree = ""; }; + 92B9EBC224E0518700E6CFB2 /* md5.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; + 92B9EBC324E0518700E6CFB2 /* retro_miscellaneous.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_miscellaneous.h; sourceTree = ""; }; + 92B9EBC424E0518700E6CFB2 /* clamping.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = clamping.h; sourceTree = ""; }; + 92B9EBC624E0518700E6CFB2 /* float_minmax.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = float_minmax.h; sourceTree = ""; }; + 92B9EBC724E0518700E6CFB2 /* fxp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fxp.h; sourceTree = ""; }; + 92B9EBC824E0518700E6CFB2 /* complex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = complex.h; sourceTree = ""; }; + 92B9EBCA24E0518700E6CFB2 /* rtime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rtime.h; sourceTree = ""; }; + 92B9EBCB24E0518700E6CFB2 /* boolean.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = boolean.h; sourceTree = ""; }; + 92B9EBCC24E0518700E6CFB2 /* libretro_gskit_ps2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libretro_gskit_ps2.h; sourceTree = ""; }; + 92B9EBCE24E0518700E6CFB2 /* dsp_filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = dsp_filter.h; sourceTree = ""; }; + 92B9EBCF24E0518700E6CFB2 /* audio_resampler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = audio_resampler.h; sourceTree = ""; }; + 92B9EBD024E0518700E6CFB2 /* audio_mixer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = audio_mixer.h; sourceTree = ""; }; + 92B9EBD224E0518700E6CFB2 /* s16_to_float.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = s16_to_float.h; sourceTree = ""; }; + 92B9EBD324E0518700E6CFB2 /* float_to_s16.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = float_to_s16.h; sourceTree = ""; }; + 92B9EBD424E0518700E6CFB2 /* audio_mix.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = audio_mix.h; sourceTree = ""; }; + 92B9EBD524E0518700E6CFB2 /* memmap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = memmap.h; sourceTree = ""; }; + 92B9EBD624E0518700E6CFB2 /* lrc_hash.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lrc_hash.h; sourceTree = ""; }; + 92B9EBD824E0518700E6CFB2 /* tpool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tpool.h; sourceTree = ""; }; + 92B9EBD924E0518700E6CFB2 /* rthreads.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rthreads.h; sourceTree = ""; }; + 92B9EBDA24E0518700E6CFB2 /* async_job.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = async_job.h; sourceTree = ""; }; + 92B9EBDB24E0518700E6CFB2 /* libretro.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libretro.h; sourceTree = ""; }; + 92B9EBDD24E0518700E6CFB2 /* vulkan_symbol_wrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vulkan_symbol_wrapper.h; sourceTree = ""; }; + 92B9EBDE24E0518700E6CFB2 /* retro_common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_common.h; sourceTree = ""; }; + 92B9EBE024E0518700E6CFB2 /* task_queue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = task_queue.h; sourceTree = ""; }; + 92B9EBE124E0518700E6CFB2 /* fifo_queue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fifo_queue.h; sourceTree = ""; }; + 92B9EBE224E0518700E6CFB2 /* message_queue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = message_queue.h; sourceTree = ""; }; + 92B9EBE324E0518700E6CFB2 /* retro_assert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_assert.h; sourceTree = ""; }; + 92B9EBE524E0518700E6CFB2 /* stdstring.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stdstring.h; sourceTree = ""; }; + 92B9EBE624E0518700E6CFB2 /* libretro_d3d.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libretro_d3d.h; sourceTree = ""; }; + 92B9EBE724E0518700E6CFB2 /* libretro_vulkan.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libretro_vulkan.h; sourceTree = ""; }; + 92B9EBE924E0518700E6CFB2 /* video_frame.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = video_frame.h; sourceTree = ""; }; + 92B9EBEB24E0518800E6CFB2 /* vector_4.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vector_4.h; sourceTree = ""; }; + 92B9EBEC24E0518800E6CFB2 /* vector_3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vector_3.h; sourceTree = ""; }; + 92B9EBED24E0518800E6CFB2 /* vector_2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vector_2.h; sourceTree = ""; }; + 92B9EBEE24E0518800E6CFB2 /* matrix_3x3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = matrix_3x3.h; sourceTree = ""; }; + 92B9EBEF24E0518800E6CFB2 /* matrix_4x4.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = matrix_4x4.h; sourceTree = ""; }; + 92B9EBF124E0518800E6CFB2 /* scaler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scaler.h; sourceTree = ""; }; + 92B9EBF224E0518800E6CFB2 /* pixconv.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = pixconv.h; sourceTree = ""; }; + 92B9EBF324E0518800E6CFB2 /* scaler_int.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = scaler_int.h; sourceTree = ""; }; + 92B9EBF424E0518800E6CFB2 /* filter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = filter.h; sourceTree = ""; }; + 92B9EBF524E0518800E6CFB2 /* gl_capabilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = gl_capabilities.h; sourceTree = ""; }; + 92B9EBF624E0518800E6CFB2 /* retro_endianness.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = retro_endianness.h; sourceTree = ""; }; + 92B9EBF724E0518800E6CFB2 /* filters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = filters.h; sourceTree = ""; }; + 92B9EBF924E0518800E6CFB2 /* media_detect_cd.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = media_detect_cd.h; sourceTree = ""; }; + 92B9EC7D24E0518900E6CFB2 /* gl_capabilities.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = gl_capabilities.c; sourceTree = ""; }; + 92B9EC7F24E0518900E6CFB2 /* scaler_int.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = scaler_int.c; sourceTree = ""; }; + 92B9EC8024E0518900E6CFB2 /* pixconv.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = pixconv.c; sourceTree = ""; }; + 92B9EC8124E0518900E6CFB2 /* scaler_filter.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = scaler_filter.c; sourceTree = ""; }; + 92B9EC8224E0518900E6CFB2 /* scaler.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = scaler.c; sourceTree = ""; }; + 92B9EC9424E0537500E6CFB2 /* command.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = command.h; path = ../../command.h; sourceTree = ""; }; + 92B9EC9524E0537500E6CFB2 /* configuration.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = configuration.c; path = ../../configuration.c; sourceTree = ""; }; + 92B9EC9624E0537500E6CFB2 /* configuration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = configuration.h; path = ../../configuration.h; sourceTree = ""; }; + 92B9EC9724E0537500E6CFB2 /* config.def.keybinds.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = config.def.keybinds.h; path = ../../config.def.keybinds.h; sourceTree = ""; }; + 92B9EC9824E0537500E6CFB2 /* config.def.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = config.def.h; path = ../../config.def.h; sourceTree = ""; }; + 92B9EC9924E0537500E6CFB2 /* config.features.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = config.features.h; path = ../../config.features.h; sourceTree = ""; }; + 92B9EC9A24E0537500E6CFB2 /* content.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = content.h; path = ../../content.h; sourceTree = ""; }; + 92B9EC9B24E0539000E6CFB2 /* core_type.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = core_type.h; path = ../../core_type.h; sourceTree = ""; }; + 92B9EC9C24E0539000E6CFB2 /* core_info.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = core_info.c; path = ../../core_info.c; sourceTree = ""; }; + 92B9EC9D24E0539000E6CFB2 /* core_info.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = core_info.h; path = ../../core_info.h; sourceTree = ""; }; + 92B9EC9E24E0539000E6CFB2 /* core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = core.h; path = ../../core.h; sourceTree = ""; }; + 92B9EC9F24E053BD00E6CFB2 /* playlist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = playlist.c; path = ../../playlist.c; sourceTree = ""; }; + 92B9ECA024E053BD00E6CFB2 /* retroarch.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = retroarch.c; path = ../../retroarch.c; sourceTree = ""; }; + 92B9ECA124E053BD00E6CFB2 /* retroarch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = retroarch.h; path = ../../retroarch.h; sourceTree = ""; }; + 92B9ECA224E053BD00E6CFB2 /* playlist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = playlist.h; path = ../../playlist.h; sourceTree = ""; }; + 92B9ECA324E053FF00E6CFB2 /* accessibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = accessibility.h; path = ../../accessibility.h; sourceTree = ""; }; + 92B9ECA424E053FF00E6CFB2 /* autosave.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = autosave.h; path = ../../autosave.h; sourceTree = ""; }; + 92B9ECA524E054B300E6CFB2 /* performance_counters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = performance_counters.h; path = ../../performance_counters.h; sourceTree = ""; }; + 92B9ECA624E054B300E6CFB2 /* disk_control_interface.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = disk_control_interface.c; path = ../../disk_control_interface.c; sourceTree = ""; }; + 92B9ECA724E054B300E6CFB2 /* file_path_special.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = file_path_special.h; path = ../../file_path_special.h; sourceTree = ""; }; + 92B9ECA824E054B300E6CFB2 /* version_git.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = version_git.h; path = ../../version_git.h; sourceTree = ""; }; + 92B9ECA924E054B400E6CFB2 /* translation_defines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = translation_defines.h; path = ../../translation_defines.h; sourceTree = ""; }; + 92B9ECAA24E054B400E6CFB2 /* paths.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = paths.h; path = ../../paths.h; sourceTree = ""; }; + 92B9ECAB24E054B400E6CFB2 /* manual_content_scan.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = manual_content_scan.c; path = ../../manual_content_scan.c; sourceTree = ""; }; + 92B9ECAC24E054B400E6CFB2 /* verbosity.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = verbosity.c; path = ../../verbosity.c; sourceTree = ""; }; + 92B9ECAD24E054B400E6CFB2 /* lakka.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = lakka.h; path = ../../lakka.h; sourceTree = ""; }; + 92B9ECAE24E054B400E6CFB2 /* msg_hash.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = msg_hash.h; path = ../../msg_hash.h; sourceTree = ""; }; + 92B9ECAF24E054B400E6CFB2 /* runtime_file.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = runtime_file.h; path = ../../runtime_file.h; sourceTree = ""; }; + 92B9ECB024E054B400E6CFB2 /* core_updater_list.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = core_updater_list.c; path = ../../core_updater_list.c; sourceTree = ""; }; + 92B9ECB124E054B400E6CFB2 /* version_git.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = version_git.c; path = ../../version_git.c; sourceTree = ""; }; + 92B9ECB224E054B400E6CFB2 /* dynamic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = dynamic.h; path = ../../dynamic.h; sourceTree = ""; }; + 92B9ECB324E054B400E6CFB2 /* list_special.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = list_special.h; path = ../../list_special.h; sourceTree = ""; }; + 92B9ECB424E054B400E6CFB2 /* setting_list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = setting_list.h; path = ../../setting_list.h; sourceTree = ""; }; + 92B9ECB524E054B400E6CFB2 /* disk_index_file.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = disk_index_file.c; path = ../../disk_index_file.c; sourceTree = ""; }; + 92B9ECB624E054B500E6CFB2 /* core_updater_list.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = core_updater_list.h; path = ../../core_updater_list.h; sourceTree = ""; }; + 92B9ECB724E054B500E6CFB2 /* switch_performance_profiles.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = switch_performance_profiles.h; path = ../../switch_performance_profiles.h; sourceTree = ""; }; + 92B9ECB824E054B500E6CFB2 /* driver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = driver.h; path = ../../driver.h; sourceTree = ""; }; + 92B9ECB924E054B500E6CFB2 /* version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../../version.h; sourceTree = ""; }; + 92B9ECBB24E054B500E6CFB2 /* disk_index_file.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = disk_index_file.h; path = ../../disk_index_file.h; sourceTree = ""; }; + 92B9ECBC24E054B500E6CFB2 /* core_backup.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = core_backup.c; path = ../../core_backup.c; sourceTree = ""; }; + 92B9ECBD24E054B500E6CFB2 /* database_info.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = database_info.h; path = ../../database_info.h; sourceTree = ""; }; + 92B9ECBE24E054B500E6CFB2 /* manual_content_scan.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = manual_content_scan.h; path = ../../manual_content_scan.h; sourceTree = ""; }; + 92B9ECBF24E054B500E6CFB2 /* core_backup.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = core_backup.h; path = ../../core_backup.h; sourceTree = ""; }; + 92B9ECC024E054B500E6CFB2 /* disk_control_interface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = disk_control_interface.h; path = ../../disk_control_interface.h; sourceTree = ""; }; + 92B9ECC124E054B600E6CFB2 /* msg_hash.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = msg_hash.c; path = ../../msg_hash.c; sourceTree = ""; }; + 92B9ECC224E054B600E6CFB2 /* nvda_controller.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = nvda_controller.h; path = ../../nvda_controller.h; sourceTree = ""; }; + 92B9ECC324E054B600E6CFB2 /* defaults.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = defaults.h; path = ../../defaults.h; sourceTree = ""; }; + 92B9ECC424E054B600E6CFB2 /* database_info.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = database_info.c; path = ../../database_info.c; sourceTree = ""; }; + 92B9ECC524E054B600E6CFB2 /* runtime_file.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = runtime_file.c; path = ../../runtime_file.c; sourceTree = ""; }; + 92B9ECC624E054B600E6CFB2 /* verbosity.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = verbosity.h; path = ../../verbosity.h; sourceTree = ""; }; + 92B9ECC724E054B600E6CFB2 /* file_path_special.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = file_path_special.c; path = ../../file_path_special.c; sourceTree = ""; }; + 92CC058021FE3C1700FF79F0 /* GCDWebServerFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerFunctions.h; sourceTree = ""; }; + 92CC058121FE3C1700FF79F0 /* GCDWebServerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerPrivate.h; sourceTree = ""; }; + 92CC058221FE3C1700FF79F0 /* GCDWebServerResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerResponse.m; sourceTree = ""; }; + 92CC058321FE3C1700FF79F0 /* GCDWebServerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerConnection.h; sourceTree = ""; }; + 92CC058421FE3C1700FF79F0 /* GCDWebServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServer.h; sourceTree = ""; }; + 92CC058521FE3C1700FF79F0 /* GCDWebServerRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerRequest.m; sourceTree = ""; }; + 92CC058621FE3C1700FF79F0 /* GCDWebServerHTTPStatusCodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerHTTPStatusCodes.h; sourceTree = ""; }; + 92CC058721FE3C1700FF79F0 /* GCDWebServerResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerResponse.h; sourceTree = ""; }; + 92CC058821FE3C1700FF79F0 /* GCDWebServerFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerFunctions.m; sourceTree = ""; }; + 92CC058921FE3C1700FF79F0 /* GCDWebServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServer.m; sourceTree = ""; }; + 92CC058A21FE3C1700FF79F0 /* GCDWebServerConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerConnection.m; sourceTree = ""; }; + 92CC058B21FE3C1700FF79F0 /* GCDWebServerRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerRequest.h; sourceTree = ""; }; + 92CC058D21FE3C1700FF79F0 /* GCDWebServerFileResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerFileResponse.h; sourceTree = ""; }; + 92CC058E21FE3C1700FF79F0 /* GCDWebServerStreamedResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerStreamedResponse.h; sourceTree = ""; }; + 92CC058F21FE3C1700FF79F0 /* GCDWebServerErrorResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerErrorResponse.m; sourceTree = ""; }; + 92CC059021FE3C1700FF79F0 /* GCDWebServerDataResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerDataResponse.h; sourceTree = ""; }; + 92CC059121FE3C1700FF79F0 /* GCDWebServerFileResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerFileResponse.m; sourceTree = ""; }; + 92CC059221FE3C1700FF79F0 /* GCDWebServerDataResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerDataResponse.m; sourceTree = ""; }; + 92CC059321FE3C1700FF79F0 /* GCDWebServerErrorResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerErrorResponse.h; sourceTree = ""; }; + 92CC059421FE3C1700FF79F0 /* GCDWebServerStreamedResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerStreamedResponse.m; sourceTree = ""; }; + 92CC059621FE3C1700FF79F0 /* GCDWebServerDataRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerDataRequest.h; sourceTree = ""; }; + 92CC059721FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerMultiPartFormRequest.h; sourceTree = ""; }; + 92CC059821FE3C1700FF79F0 /* GCDWebServerFileRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerFileRequest.h; sourceTree = ""; }; + 92CC059921FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerURLEncodedFormRequest.m; sourceTree = ""; }; + 92CC059A21FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerMultiPartFormRequest.m; sourceTree = ""; }; + 92CC059B21FE3C1700FF79F0 /* GCDWebServerDataRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerDataRequest.m; sourceTree = ""; }; + 92CC059C21FE3C1700FF79F0 /* GCDWebServerFileRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebServerFileRequest.m; sourceTree = ""; }; + 92CC059D21FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebServerURLEncodedFormRequest.h; sourceTree = ""; }; + 92CC059F21FE3C1700FF79F0 /* GCDWebUploader.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = GCDWebUploader.bundle; sourceTree = ""; }; + 92CC05A021FE3C1700FF79F0 /* GCDWebUploader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDWebUploader.h; sourceTree = ""; }; + 92CC05A121FE3C1700FF79F0 /* GCDWebUploader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDWebUploader.m; sourceTree = ""; }; + 92CC05C021FE3C6D00FF79F0 /* WebServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebServer.h; sourceTree = ""; }; + 92CC05C121FE3C6D00FF79F0 /* WebServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebServer.m; sourceTree = ""; }; + 92CC05C421FEDC9F00FF79F0 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; + 92CC05C621FEDD0B00FF79F0 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + 92DAF33E277A370600FE2A9E /* EmulatorTouchMouse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmulatorTouchMouse.swift; sourceTree = ""; }; + 92E5DCD3231A5786006491BF /* modules */ = {isa = PBXFileReference; lastKnownFileType = folder; path = modules; sourceTree = ""; }; + 96366C5416C9AC3300D64A22 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; + 96366C5816C9ACF500D64A22 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + 963C3C33186E3DED00A6EB1E /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; + 9678945F1788EBD000D6CA69 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = iOS/Info.plist; sourceTree = SOURCE_ROOT; }; + 967894621788EBD800D6CA69 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = iOS/en.lproj/InfoPlist.strings; sourceTree = SOURCE_ROOT; }; + 96AFAE2916C1D4EA009DE44C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 96AFAE2B16C1D4EA009DE44C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 96AFAE2D16C1D4EA009DE44C /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 96AFAE2F16C1D4EA009DE44C /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; }; + 96AFAE3116C1D4EA009DE44C /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 9204BE111D319EF300BD49DB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9210C2F224B3A19100E6FE7C /* MetalKit.framework in Frameworks */, + 9210C2F324B3A19100E6FE7C /* Metal.framework in Frameworks */, + 92CC05C721FEDD0B00FF79F0 /* MobileCoreServices.framework in Frameworks */, + 92CC05C521FEDC9F00FF79F0 /* CFNetwork.framework in Frameworks */, + 9204BE121D319EF300BD49DB /* libz.dylib in Frameworks */, + 9204BE131D319EF300BD49DB /* QuartzCore.framework in Frameworks */, + 9204BE141D319EF300BD49DB /* GameController.framework in Frameworks */, + 9204BE151D319EF300BD49DB /* CoreText.framework in Frameworks */, + 9204BE161D319EF300BD49DB /* CoreLocation.framework in Frameworks */, + 9204BE171D319EF300BD49DB /* CoreMedia.framework in Frameworks */, + 9204BE181D319EF300BD49DB /* AVFoundation.framework in Frameworks */, + 9204BE191D319EF300BD49DB /* CoreVideo.framework in Frameworks */, + 9204BE1A1D319EF300BD49DB /* AudioToolbox.framework in Frameworks */, + 9204BE1B1D319EF300BD49DB /* CoreAudio.framework in Frameworks */, + 9204BE1C1D319EF300BD49DB /* UIKit.framework in Frameworks */, + 9204BE1D1D319EF300BD49DB /* Foundation.framework in Frameworks */, + 9204BE1E1D319EF300BD49DB /* CoreGraphics.framework in Frameworks */, + 9204BE1F1D319EF300BD49DB /* GLKit.framework in Frameworks */, + 9204BE201D319EF300BD49DB /* OpenGLES.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 926C77D421FD1E6500103EDE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 926C77F121FD26E800103EDE /* GameController.framework in Frameworks */, + 926C77EF21FD263800103EDE /* AudioToolbox.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 83D632D719ECFCC4009E3161 /* iOS */ = { + isa = PBXGroup; + children = ( + 9222F20A2315DD3D0097C0FD /* retroarch_logo.png */, + 83EB675F19EEAF050096F441 /* iOS/modules */, + 69D31DE31A547EC800EF4C92 /* iOS/Resources/Media.xcassets */, + ); + name = iOS; + path = Resources; + sourceTree = ""; + }; + 926C77D821FD1E6500103EDE /* tvOS */ = { + isa = PBXGroup; + children = ( + 92E5DCD3231A5786006491BF /* modules */, + 926C77E221FD1E6700103EDE /* Assets.xcassets */, + 926C77E421FD1E6700103EDE /* Info.plist */, + ); + path = tvOS; + sourceTree = ""; + }; + 92B9EAE024E04F8800E6CFB2 /* Sources */ = { + isa = PBXGroup; + children = ( + 92B9EC9324E0536200E6CFB2 /* core */, + 92B9EAE524E0518600E6CFB2 /* libretro-common */, + 9289D20925E40D7B004B5D52 /* EmulatorKeyboard.swift */, + 92DAF33E277A370600FE2A9E /* EmulatorTouchMouse.swift */, + 9289D22725E88A63004B5D52 /* CocoaView+KeyboardSupport.swift */, + 9289D20825E40D7A004B5D52 /* RetroArch-Bridging-Header.h */, + 92A1F81927006CCB00DEAD2A /* JITSupport.h */, + 92A1F81727006CAE00DEAD2A /* JITSupport.m */, + ); + name = Sources; + sourceTree = ""; + }; + 92B9EAE524E0518600E6CFB2 /* libretro-common */ = { + isa = PBXGroup; + children = ( + 92B9EC7C24E0518900E6CFB2 /* gfx */, + 92B9EB5524E0518700E6CFB2 /* include */, + ); + name = "libretro-common"; + path = "../../libretro-common"; + sourceTree = ""; + }; + 92B9EB5524E0518700E6CFB2 /* include */ = { + isa = PBXGroup; + children = ( + 92B9EBA524E0518700E6CFB2 /* array */, + 92B9EBCD24E0518700E6CFB2 /* audio */, + 92B9EBCB24E0518700E6CFB2 /* boolean.h */, + 92B9EB6124E0518700E6CFB2 /* cdrom */, + 92B9EBC424E0518700E6CFB2 /* clamping.h */, + 92B9EB6424E0518700E6CFB2 /* compat */, + 92B9EB7724E0518700E6CFB2 /* dynamic */, + 92B9EB5624E0518700E6CFB2 /* encodings */, + 92B9EBB424E0518700E6CFB2 /* fastcpy.h */, + 92B9EBBF24E0518700E6CFB2 /* features */, + 92B9EB9E24E0518700E6CFB2 /* file */, + 92B9EBF724E0518800E6CFB2 /* filters.h */, + 92B9EB8224E0518700E6CFB2 /* formats */, + 92B9EBE824E0518700E6CFB2 /* gfx */, + 92B9EB8F24E0518700E6CFB2 /* glsym */, + 92B9EBB524E0518700E6CFB2 /* libchdr */, + 92B9EB6324E0518700E6CFB2 /* libco.h */, + 92B9EBE624E0518700E6CFB2 /* libretro_d3d.h */, + 92B9EB5C24E0518700E6CFB2 /* libretro_dspfilter.h */, + 92B9EBCC24E0518700E6CFB2 /* libretro_gskit_ps2.h */, + 92B9EBE724E0518700E6CFB2 /* libretro_vulkan.h */, + 92B9EBDB24E0518700E6CFB2 /* libretro.h */, + 92B9EB9A24E0518700E6CFB2 /* lists */, + 92B9EBC524E0518700E6CFB2 /* math */, + 92B9EBF824E0518800E6CFB2 /* media */, + 92B9EB5B24E0518700E6CFB2 /* memalign.h */, + 92B9EBD524E0518700E6CFB2 /* memmap.h */, + 92B9EB7924E0518700E6CFB2 /* net */, + 92B9EB7524E0518700E6CFB2 /* playlists */, + 92B9EBDF24E0518700E6CFB2 /* queues */, + 92B9EBE324E0518700E6CFB2 /* retro_assert.h */, + 92B9EB7424E0518700E6CFB2 /* retro_common_api.h */, + 92B9EBDE24E0518700E6CFB2 /* retro_common.h */, + 92B9EBA824E0518700E6CFB2 /* retro_dirent.h */, + 92B9EBF624E0518800E6CFB2 /* retro_endianness.h */, + 92B9EBA424E0518700E6CFB2 /* retro_environment.h */, + 92B9EBA924E0518700E6CFB2 /* retro_inline.h */, + 92B9EBAA24E0518700E6CFB2 /* retro_math.h */, + 92B9EBC324E0518700E6CFB2 /* retro_miscellaneous.h */, + 92B9EB8124E0518700E6CFB2 /* retro_timers.h */, + 92B9EBD624E0518700E6CFB2 /* lrc_hash.h */, + 92B9EBD724E0518700E6CFB2 /* rthreads */, + 92B9EBAB24E0518700E6CFB2 /* streams */, + 92B9EBE424E0518700E6CFB2 /* string */, + 92B9EBC924E0518700E6CFB2 /* time */, + 92B9EBC124E0518700E6CFB2 /* utils */, + 92B9EB5D24E0518700E6CFB2 /* vfs */, + 92B9EBDC24E0518700E6CFB2 /* vulkan */, + ); + path = include; + sourceTree = ""; + }; + 92B9EB5624E0518700E6CFB2 /* encodings */ = { + isa = PBXGroup; + children = ( + 92B9EB5724E0518700E6CFB2 /* base64.h */, + 92B9EB5824E0518700E6CFB2 /* utf.h */, + 92B9EB5924E0518700E6CFB2 /* win32.h */, + 92B9EB5A24E0518700E6CFB2 /* crc32.h */, + ); + path = encodings; + sourceTree = ""; + }; + 92B9EB5D24E0518700E6CFB2 /* vfs */ = { + isa = PBXGroup; + children = ( + 92B9EB5E24E0518700E6CFB2 /* vfs.h */, + 92B9EB5F24E0518700E6CFB2 /* vfs_implementation.h */, + 92B9EB6024E0518700E6CFB2 /* vfs_implementation_cdrom.h */, + ); + path = vfs; + sourceTree = ""; + }; + 92B9EB6124E0518700E6CFB2 /* cdrom */ = { + isa = PBXGroup; + children = ( + 92B9EB6224E0518700E6CFB2 /* cdrom.h */, + ); + path = cdrom; + sourceTree = ""; + }; + 92B9EB6424E0518700E6CFB2 /* compat */ = { + isa = PBXGroup; + children = ( + 92B9EB6524E0518700E6CFB2 /* apple_compat.h */, + 92B9EB6624E0518700E6CFB2 /* strl.h */, + 92B9EB6724E0518700E6CFB2 /* strcasestr.h */, + 92B9EB6824E0518700E6CFB2 /* msvc */, + 92B9EB6A24E0518700E6CFB2 /* fopen_utf8.h */, + 92B9EB6B24E0518700E6CFB2 /* intrinsics.h */, + 92B9EB6C24E0518700E6CFB2 /* posix_string.h */, + 92B9EB6D24E0518700E6CFB2 /* zlib */, + 92B9EB7024E0518700E6CFB2 /* getopt.h */, + 92B9EB7124E0518700E6CFB2 /* fnmatch.h */, + 92B9EB7224E0518700E6CFB2 /* msvc.h */, + 92B9EB7324E0518700E6CFB2 /* ifaddrs.h */, + ); + path = compat; + sourceTree = ""; + }; + 92B9EB6824E0518700E6CFB2 /* msvc */ = { + isa = PBXGroup; + children = ( + 92B9EB6924E0518700E6CFB2 /* stdint.h */, + ); + path = msvc; + sourceTree = ""; + }; + 92B9EB6D24E0518700E6CFB2 /* zlib */ = { + isa = PBXGroup; + children = ( + 92B9EB6E24E0518700E6CFB2 /* zlib.h */, + 92B9EB6F24E0518700E6CFB2 /* zconf.h */, + ); + path = zlib; + sourceTree = ""; + }; + 92B9EB7524E0518700E6CFB2 /* playlists */ = { + isa = PBXGroup; + children = ( + 92B9EB7624E0518700E6CFB2 /* label_sanitization.h */, + ); + path = playlists; + sourceTree = ""; + }; + 92B9EB7724E0518700E6CFB2 /* dynamic */ = { + isa = PBXGroup; + children = ( + 92B9EB7824E0518700E6CFB2 /* dylib.h */, + ); + path = dynamic; + sourceTree = ""; + }; + 92B9EB7924E0518700E6CFB2 /* net */ = { + isa = PBXGroup; + children = ( + 92B9EB7A24E0518700E6CFB2 /* net_ifinfo.h */, + 92B9EB7B24E0518700E6CFB2 /* net_compat.h */, + 92B9EB7C24E0518700E6CFB2 /* net_socket.h */, + 92B9EB7D24E0518700E6CFB2 /* net_natt.h */, + 92B9EB7E24E0518700E6CFB2 /* net_socket_ssl.h */, + 92B9EB7F24E0518700E6CFB2 /* net_http.h */, + 92B9EB8024E0518700E6CFB2 /* net_http_parse.h */, + ); + path = net; + sourceTree = ""; + }; + 92B9EB8224E0518700E6CFB2 /* formats */ = { + isa = PBXGroup; + children = ( + 92B9EB8324E0518700E6CFB2 /* m3u_file.h */, + 92B9EB8424E0518700E6CFB2 /* rjson.h */, + 92B9EB8524E0518700E6CFB2 /* rxml.h */, + 92B9EB8624E0518700E6CFB2 /* cdfs.h */, + 92B9EB8724E0518700E6CFB2 /* rpng.h */, + 92B9EB8824E0518700E6CFB2 /* rtga.h */, + 92B9EB8924E0518700E6CFB2 /* image.h */, + 92B9EB8A24E0518700E6CFB2 /* logiqx_dat.h */, + 92B9EB8B24E0518700E6CFB2 /* rbmp.h */, + 92B9EB8C24E0518700E6CFB2 /* rwav.h */, + 92B9EB8E24E0518700E6CFB2 /* rjpeg.h */, + ); + path = formats; + sourceTree = ""; + }; + 92B9EB8F24E0518700E6CFB2 /* glsym */ = { + isa = PBXGroup; + children = ( + 92B9EB9024E0518700E6CFB2 /* rglgen.h */, + 92B9EB9124E0518700E6CFB2 /* glsym_es2.h */, + 92B9EB9224E0518700E6CFB2 /* glsym.h */, + 92B9EB9324E0518700E6CFB2 /* rglgen_headers.h */, + 92B9EB9424E0518700E6CFB2 /* switch */, + 92B9EB9724E0518700E6CFB2 /* rglgen_private_headers.h */, + 92B9EB9824E0518700E6CFB2 /* glsym_es3.h */, + 92B9EB9924E0518700E6CFB2 /* glsym_gl.h */, + ); + path = glsym; + sourceTree = ""; + }; + 92B9EB9424E0518700E6CFB2 /* switch */ = { + isa = PBXGroup; + children = ( + 92B9EB9524E0518700E6CFB2 /* nx_gl.h */, + 92B9EB9624E0518700E6CFB2 /* nx_glsym.h */, + ); + path = switch; + sourceTree = ""; + }; + 92B9EB9A24E0518700E6CFB2 /* lists */ = { + isa = PBXGroup; + children = ( + 92B9EB9B24E0518700E6CFB2 /* string_list.h */, + 92B9EB9C24E0518700E6CFB2 /* file_list.h */, + 92B9EB9D24E0518700E6CFB2 /* dir_list.h */, + ); + path = lists; + sourceTree = ""; + }; + 92B9EB9E24E0518700E6CFB2 /* file */ = { + isa = PBXGroup; + children = ( + 92B9EB9F24E0518700E6CFB2 /* nbio.h */, + 92B9EBA024E0518700E6CFB2 /* config_file.h */, + 92B9EBA124E0518700E6CFB2 /* archive_file.h */, + 92B9EBA224E0518700E6CFB2 /* config_file_userdata.h */, + 92B9EBA324E0518700E6CFB2 /* file_path.h */, + ); + path = file; + sourceTree = ""; + }; + 92B9EBA524E0518700E6CFB2 /* array */ = { + isa = PBXGroup; + children = ( + 92B9EBA724E0518700E6CFB2 /* rbuf.h */, + ); + path = array; + sourceTree = ""; + }; + 92B9EBAB24E0518700E6CFB2 /* streams */ = { + isa = PBXGroup; + children = ( + 92B9EBAC24E0518700E6CFB2 /* memory_stream.h */, + 92B9EBAD24E0518700E6CFB2 /* chd_stream.h */, + 92B9EBAE24E0518700E6CFB2 /* trans_stream.h */, + 92B9EBAF24E0518700E6CFB2 /* rzip_stream.h */, + 92B9EBB024E0518700E6CFB2 /* file_stream.h */, + 92B9EBB124E0518700E6CFB2 /* stdin_stream.h */, + 92B9EBB224E0518700E6CFB2 /* file_stream_transforms.h */, + 92B9EBB324E0518700E6CFB2 /* interface_stream.h */, + ); + path = streams; + sourceTree = ""; + }; + 92B9EBB524E0518700E6CFB2 /* libchdr */ = { + isa = PBXGroup; + children = ( + 92B9EBB624E0518700E6CFB2 /* lzma.h */, + 92B9EBB724E0518700E6CFB2 /* minmax.h */, + 92B9EBB824E0518700E6CFB2 /* flac.h */, + 92B9EBB924E0518700E6CFB2 /* bitstream.h */, + 92B9EBBA24E0518700E6CFB2 /* cdrom.h */, + 92B9EBBB24E0518700E6CFB2 /* chd.h */, + 92B9EBBC24E0518700E6CFB2 /* libchdr_zlib.h */, + 92B9EBBD24E0518700E6CFB2 /* huffman.h */, + 92B9EBBE24E0518700E6CFB2 /* coretypes.h */, + ); + path = libchdr; + sourceTree = ""; + }; + 92B9EBBF24E0518700E6CFB2 /* features */ = { + isa = PBXGroup; + children = ( + 92B9EBC024E0518700E6CFB2 /* features_cpu.h */, + ); + path = features; + sourceTree = ""; + }; + 92B9EBC124E0518700E6CFB2 /* utils */ = { + isa = PBXGroup; + children = ( + 92B9EBC224E0518700E6CFB2 /* md5.h */, + ); + path = utils; + sourceTree = ""; + }; + 92B9EBC524E0518700E6CFB2 /* math */ = { + isa = PBXGroup; + children = ( + 92B9EBC624E0518700E6CFB2 /* float_minmax.h */, + 92B9EBC724E0518700E6CFB2 /* fxp.h */, + 92B9EBC824E0518700E6CFB2 /* complex.h */, + ); + path = math; + sourceTree = ""; + }; + 92B9EBC924E0518700E6CFB2 /* time */ = { + isa = PBXGroup; + children = ( + 92B9EBCA24E0518700E6CFB2 /* rtime.h */, + ); + path = time; + sourceTree = ""; + }; + 92B9EBCD24E0518700E6CFB2 /* audio */ = { + isa = PBXGroup; + children = ( + 92B9EBCE24E0518700E6CFB2 /* dsp_filter.h */, + 92B9EBCF24E0518700E6CFB2 /* audio_resampler.h */, + 92B9EBD024E0518700E6CFB2 /* audio_mixer.h */, + 92B9EBD124E0518700E6CFB2 /* conversion */, + 92B9EBD424E0518700E6CFB2 /* audio_mix.h */, + ); + path = audio; + sourceTree = ""; + }; + 92B9EBD124E0518700E6CFB2 /* conversion */ = { + isa = PBXGroup; + children = ( + 92B9EBD224E0518700E6CFB2 /* s16_to_float.h */, + 92B9EBD324E0518700E6CFB2 /* float_to_s16.h */, + ); + path = conversion; + sourceTree = ""; + }; + 92B9EBD724E0518700E6CFB2 /* rthreads */ = { + isa = PBXGroup; + children = ( + 92B9EBD824E0518700E6CFB2 /* tpool.h */, + 92B9EBD924E0518700E6CFB2 /* rthreads.h */, + 92B9EBDA24E0518700E6CFB2 /* async_job.h */, + ); + path = rthreads; + sourceTree = ""; + }; + 92B9EBDC24E0518700E6CFB2 /* vulkan */ = { + isa = PBXGroup; + children = ( + 92B9EBDD24E0518700E6CFB2 /* vulkan_symbol_wrapper.h */, + ); + path = vulkan; + sourceTree = ""; + }; + 92B9EBDF24E0518700E6CFB2 /* queues */ = { + isa = PBXGroup; + children = ( + 92B9EBE024E0518700E6CFB2 /* task_queue.h */, + 92B9EBE124E0518700E6CFB2 /* fifo_queue.h */, + 92B9EBE224E0518700E6CFB2 /* message_queue.h */, + ); + path = queues; + sourceTree = ""; + }; + 92B9EBE424E0518700E6CFB2 /* string */ = { + isa = PBXGroup; + children = ( + 92B9EBE524E0518700E6CFB2 /* stdstring.h */, + ); + path = string; + sourceTree = ""; + }; + 92B9EBE824E0518700E6CFB2 /* gfx */ = { + isa = PBXGroup; + children = ( + 92B9EBE924E0518700E6CFB2 /* video_frame.h */, + 92B9EBEA24E0518700E6CFB2 /* math */, + 92B9EBF024E0518800E6CFB2 /* scaler */, + 92B9EBF524E0518800E6CFB2 /* gl_capabilities.h */, + ); + path = gfx; + sourceTree = ""; + }; + 92B9EBEA24E0518700E6CFB2 /* math */ = { + isa = PBXGroup; + children = ( + 92B9EBEB24E0518800E6CFB2 /* vector_4.h */, + 92B9EBEC24E0518800E6CFB2 /* vector_3.h */, + 92B9EBED24E0518800E6CFB2 /* vector_2.h */, + 92B9EBEE24E0518800E6CFB2 /* matrix_3x3.h */, + 92B9EBEF24E0518800E6CFB2 /* matrix_4x4.h */, + ); + path = math; + sourceTree = ""; + }; + 92B9EBF024E0518800E6CFB2 /* scaler */ = { + isa = PBXGroup; + children = ( + 92B9EBF124E0518800E6CFB2 /* scaler.h */, + 92B9EBF224E0518800E6CFB2 /* pixconv.h */, + 92B9EBF324E0518800E6CFB2 /* scaler_int.h */, + 92B9EBF424E0518800E6CFB2 /* filter.h */, + ); + path = scaler; + sourceTree = ""; + }; + 92B9EBF824E0518800E6CFB2 /* media */ = { + isa = PBXGroup; + children = ( + 92B9EBF924E0518800E6CFB2 /* media_detect_cd.h */, + ); + path = media; + sourceTree = ""; + }; + 92B9EC7C24E0518900E6CFB2 /* gfx */ = { + isa = PBXGroup; + children = ( + 92B9EC7D24E0518900E6CFB2 /* gl_capabilities.c */, + 92B9EC7E24E0518900E6CFB2 /* scaler */, + ); + path = gfx; + sourceTree = ""; + }; + 92B9EC7E24E0518900E6CFB2 /* scaler */ = { + isa = PBXGroup; + children = ( + 92B9EC7F24E0518900E6CFB2 /* scaler_int.c */, + 92B9EC8024E0518900E6CFB2 /* pixconv.c */, + 92B9EC8124E0518900E6CFB2 /* scaler_filter.c */, + 92B9EC8224E0518900E6CFB2 /* scaler.c */, + ); + path = scaler; + sourceTree = ""; + }; + 92B9EC9324E0536200E6CFB2 /* core */ = { + isa = PBXGroup; + children = ( + 92B9ECA324E053FF00E6CFB2 /* accessibility.h */, + 92B9ECA424E053FF00E6CFB2 /* autosave.h */, + 92B9EC9424E0537500E6CFB2 /* command.h */, + 92B9EC9824E0537500E6CFB2 /* config.def.h */, + 92B9EC9724E0537500E6CFB2 /* config.def.keybinds.h */, + 92B9EC9924E0537500E6CFB2 /* config.features.h */, + 92B9EC9524E0537500E6CFB2 /* configuration.c */, + 92B9EC9624E0537500E6CFB2 /* configuration.h */, + 92B9EC9A24E0537500E6CFB2 /* content.h */, + 92B9ECBC24E054B500E6CFB2 /* core_backup.c */, + 92B9ECBF24E054B500E6CFB2 /* core_backup.h */, + 92B9EC9C24E0539000E6CFB2 /* core_info.c */, + 92B9EC9D24E0539000E6CFB2 /* core_info.h */, + 92B9EC9B24E0539000E6CFB2 /* core_type.h */, + 92B9ECB024E054B400E6CFB2 /* core_updater_list.c */, + 92B9ECB624E054B500E6CFB2 /* core_updater_list.h */, + 92B9EC9E24E0539000E6CFB2 /* core.h */, + 92B9ECC424E054B600E6CFB2 /* database_info.c */, + 92B9ECBD24E054B500E6CFB2 /* database_info.h */, + 92B9ECC324E054B600E6CFB2 /* defaults.h */, + 92B9ECA624E054B300E6CFB2 /* disk_control_interface.c */, + 92B9ECC024E054B500E6CFB2 /* disk_control_interface.h */, + 92B9ECB524E054B400E6CFB2 /* disk_index_file.c */, + 92B9ECBB24E054B500E6CFB2 /* disk_index_file.h */, + 92B9ECB824E054B500E6CFB2 /* driver.h */, + 92B9ECB224E054B400E6CFB2 /* dynamic.h */, + 92B9ECC724E054B600E6CFB2 /* file_path_special.c */, + 92B9ECA724E054B300E6CFB2 /* file_path_special.h */, + 92B9ECAD24E054B400E6CFB2 /* lakka.h */, + 92B9ECB324E054B400E6CFB2 /* list_special.h */, + 92B9ECAB24E054B400E6CFB2 /* manual_content_scan.c */, + 92B9ECBE24E054B500E6CFB2 /* manual_content_scan.h */, + 92B9ECC124E054B600E6CFB2 /* msg_hash.c */, + 92B9ECAE24E054B400E6CFB2 /* msg_hash.h */, + 92B9ECC224E054B600E6CFB2 /* nvda_controller.h */, + 92B9ECAA24E054B400E6CFB2 /* paths.h */, + 92B9ECA524E054B300E6CFB2 /* performance_counters.h */, + 92B9EC9F24E053BD00E6CFB2 /* playlist.c */, + 92B9ECA224E053BD00E6CFB2 /* playlist.h */, + 92B9ECA024E053BD00E6CFB2 /* retroarch.c */, + 92B9ECA124E053BD00E6CFB2 /* retroarch.h */, + 92B9ECC524E054B600E6CFB2 /* runtime_file.c */, + 92B9ECAF24E054B400E6CFB2 /* runtime_file.h */, + 92B9ECB424E054B400E6CFB2 /* setting_list.h */, + 92B9ECB724E054B500E6CFB2 /* switch_performance_profiles.h */, + 92B9ECA924E054B400E6CFB2 /* translation_defines.h */, + 92B9ECAC24E054B400E6CFB2 /* verbosity.c */, + 92B9ECC624E054B600E6CFB2 /* verbosity.h */, + 92B9ECB124E054B400E6CFB2 /* version_git.c */, + 92B9ECA824E054B300E6CFB2 /* version_git.h */, + 92B9ECB924E054B500E6CFB2 /* version.h */, + ); + name = core; + sourceTree = ""; + }; + 92CC057E21FE3C1700FF79F0 /* GCDWebServer */ = { + isa = PBXGroup; + children = ( + 92CC057F21FE3C1700FF79F0 /* Core */, + 92CC058C21FE3C1700FF79F0 /* Responses */, + 92CC059521FE3C1700FF79F0 /* Requests */, + ); + path = GCDWebServer; + sourceTree = ""; + }; + 92CC057F21FE3C1700FF79F0 /* Core */ = { + isa = PBXGroup; + children = ( + 92CC058021FE3C1700FF79F0 /* GCDWebServerFunctions.h */, + 92CC058121FE3C1700FF79F0 /* GCDWebServerPrivate.h */, + 92CC058221FE3C1700FF79F0 /* GCDWebServerResponse.m */, + 92CC058321FE3C1700FF79F0 /* GCDWebServerConnection.h */, + 92CC058421FE3C1700FF79F0 /* GCDWebServer.h */, + 92CC058521FE3C1700FF79F0 /* GCDWebServerRequest.m */, + 92CC058621FE3C1700FF79F0 /* GCDWebServerHTTPStatusCodes.h */, + 92CC058721FE3C1700FF79F0 /* GCDWebServerResponse.h */, + 92CC058821FE3C1700FF79F0 /* GCDWebServerFunctions.m */, + 92CC058921FE3C1700FF79F0 /* GCDWebServer.m */, + 92CC058A21FE3C1700FF79F0 /* GCDWebServerConnection.m */, + 92CC058B21FE3C1700FF79F0 /* GCDWebServerRequest.h */, + ); + path = Core; + sourceTree = ""; + }; + 92CC058C21FE3C1700FF79F0 /* Responses */ = { + isa = PBXGroup; + children = ( + 92CC058D21FE3C1700FF79F0 /* GCDWebServerFileResponse.h */, + 92CC058E21FE3C1700FF79F0 /* GCDWebServerStreamedResponse.h */, + 92CC058F21FE3C1700FF79F0 /* GCDWebServerErrorResponse.m */, + 92CC059021FE3C1700FF79F0 /* GCDWebServerDataResponse.h */, + 92CC059121FE3C1700FF79F0 /* GCDWebServerFileResponse.m */, + 92CC059221FE3C1700FF79F0 /* GCDWebServerDataResponse.m */, + 92CC059321FE3C1700FF79F0 /* GCDWebServerErrorResponse.h */, + 92CC059421FE3C1700FF79F0 /* GCDWebServerStreamedResponse.m */, + ); + path = Responses; + sourceTree = ""; + }; + 92CC059521FE3C1700FF79F0 /* Requests */ = { + isa = PBXGroup; + children = ( + 92CC059621FE3C1700FF79F0 /* GCDWebServerDataRequest.h */, + 92CC059721FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.h */, + 92CC059821FE3C1700FF79F0 /* GCDWebServerFileRequest.h */, + 92CC059921FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.m */, + 92CC059A21FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.m */, + 92CC059B21FE3C1700FF79F0 /* GCDWebServerDataRequest.m */, + 92CC059C21FE3C1700FF79F0 /* GCDWebServerFileRequest.m */, + 92CC059D21FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.h */, + ); + path = Requests; + sourceTree = ""; + }; + 92CC059E21FE3C1700FF79F0 /* GCDWebUploader */ = { + isa = PBXGroup; + children = ( + 92CC059F21FE3C1700FF79F0 /* GCDWebUploader.bundle */, + 92CC05A021FE3C1700FF79F0 /* GCDWebUploader.h */, + 92CC05A121FE3C1700FF79F0 /* GCDWebUploader.m */, + ); + path = GCDWebUploader; + sourceTree = ""; + }; + 92CC05CC21FF782C00FF79F0 /* WebServer */ = { + isa = PBXGroup; + children = ( + 92CC05C021FE3C6D00FF79F0 /* WebServer.h */, + 92CC05C121FE3C6D00FF79F0 /* WebServer.m */, + 92CC057E21FE3C1700FF79F0 /* GCDWebServer */, + 92CC059E21FE3C1700FF79F0 /* GCDWebUploader */, + ); + path = WebServer; + sourceTree = ""; + }; + 96AFAE1A16C1D4EA009DE44C = { + isa = PBXGroup; + children = ( + 96AFAE9C16C1D976009DE44C /* Main Entry Core */, + 92B9EAE024E04F8800E6CFB2 /* Sources */, + 9222F2082315DAD50097C0FD /* Launch Screen.storyboard */, + 9222F1FE2314BA7C0097C0FD /* assets.zip */, + 9210C2FA24B4CB4900E6FE7C /* menu_pipeline.metal */, + 9210C2FB24B4CB4900E6FE7C /* Shaders.metal */, + 83D632D719ECFCC4009E3161 /* iOS */, + 926C77D821FD1E6500103EDE /* tvOS */, + 92CC05CC21FF782C00FF79F0 /* WebServer */, + 96AFAE2816C1D4EA009DE44C /* Frameworks */, + 96AFAE2616C1D4EA009DE44C /* Products */, + 96AFAE3416C1D4EA009DE44C /* Supporting Files */, + ); + indentWidth = 3; + sourceTree = ""; + tabWidth = 3; + }; + 96AFAE2616C1D4EA009DE44C /* Products */ = { + isa = PBXGroup; + children = ( + 9204BE2B1D319EF300BD49DB /* RetroArch.app */, + 926C77D721FD1E6500103EDE /* RetroArchTV.app */, + ); + name = Products; + sourceTree = ""; + }; + 96AFAE2816C1D4EA009DE44C /* Frameworks */ = { + isa = PBXGroup; + children = ( + 9210C2F124B3A19100E6FE7C /* Metal.framework */, + 9210C2F024B3A19100E6FE7C /* MetalKit.framework */, + 92CC05C621FEDD0B00FF79F0 /* MobileCoreServices.framework */, + 92CC05C421FEDC9F00FF79F0 /* CFNetwork.framework */, + 926C77F021FD26E800103EDE /* GameController.framework */, + 926C77EE21FD263800103EDE /* AudioToolbox.framework */, + 926C77EC21FD261600103EDE /* CoreAudio.framework */, + 5040F04F1AE47ED4006F6972 /* libz.dylib */, + 50C3B1AD1AB1107100F478D3 /* QuartzCore.framework */, + 696012F119F3389A006A1088 /* CoreText.framework */, + 963C3C33186E3DED00A6EB1E /* GameController.framework */, + 50CCC827185E0E7D001F5BC8 /* CoreLocation.framework */, + 501881ED184BB54C006F665D /* CoreMedia.framework */, + 501881EB184BAD6D006F665D /* AVFoundation.framework */, + 50E7189E184B88AA001956CE /* CoreVideo.framework */, + 96366C5816C9ACF500D64A22 /* AudioToolbox.framework */, + 96366C5416C9AC3300D64A22 /* CoreAudio.framework */, + 96AFAE2916C1D4EA009DE44C /* UIKit.framework */, + 96AFAE2B16C1D4EA009DE44C /* Foundation.framework */, + 96AFAE2D16C1D4EA009DE44C /* CoreGraphics.framework */, + 96AFAE2F16C1D4EA009DE44C /* GLKit.framework */, + 96AFAE3116C1D4EA009DE44C /* OpenGLES.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 96AFAE3416C1D4EA009DE44C /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 967894611788EBD800D6CA69 /* InfoPlist.strings */, + 9678945F1788EBD000D6CA69 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 96AFAE9C16C1D976009DE44C /* Main Entry Core */ = { + isa = PBXGroup; + children = ( + D48581DC16F823E2004BEB17 /* griffin */, + ); + name = "Main Entry Core"; + sourceTree = ""; + }; + D48581DC16F823E2004BEB17 /* griffin */ = { + isa = PBXGroup; + children = ( + 50521A431AA23BF500185CC9 /* griffin_objc.m */, + 501232C9192E5FC40063A359 /* griffin.c */, + 9210C2F424B3A32D00E6FE7C /* griffin_cpp.cpp */, + 9210C2F524B3A32D00E6FE7C /* griffin_glslang.cpp */, + ); + name = griffin; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 9204BE091D319EF300BD49DB /* RetroArchiOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9204BE281D319EF300BD49DB /* Build configuration list for PBXNativeTarget "RetroArchiOS" */; + buildPhases = ( + 9204BE0A1D319EF300BD49DB /* Sources */, + 9204BE111D319EF300BD49DB /* Frameworks */, + 9204BE271D319EF300BD49DB /* ShellScript */, + 9204BE211D319EF300BD49DB /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RetroArchiOS; + productName = RetroArch; + productReference = 9204BE2B1D319EF300BD49DB /* RetroArch.app */; + productType = "com.apple.product-type.application"; + }; + 926C77D621FD1E6500103EDE /* RetroArchTV */ = { + isa = PBXNativeTarget; + buildConfigurationList = 926C77E921FD1E6700103EDE /* Build configuration list for PBXNativeTarget "RetroArchTV" */; + buildPhases = ( + 926C77D321FD1E6500103EDE /* Sources */, + 926C77D421FD1E6500103EDE /* Frameworks */, + 92CC057521FE2D4900FF79F0 /* ShellScript */, + 926C77D521FD1E6500103EDE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RetroArchTV; + productName = RetroArchTV; + productReference = 926C77D721FD1E6500103EDE /* RetroArchTV.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 96AFAE1C16C1D4EA009DE44C /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0450; + ORGANIZATIONNAME = RetroArch; + TargetAttributes = { + 9204BE091D319EF300BD49DB = { + DevelopmentTeam = R72X3BF4KE; + DevelopmentTeamName = RetroArch; + LastSwiftMigration = 1240; + }; + 926C77D621FD1E6500103EDE = { + CreatedOnToolsVersion = 10.1; + DevelopmentTeam = R72X3BF4KE; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 96AFAE1F16C1D4EA009DE44C /* Build configuration list for PBXProject "RetroArch_iOS13" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 96AFAE1A16C1D4EA009DE44C; + productRefGroup = 96AFAE2616C1D4EA009DE44C /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 9204BE091D319EF300BD49DB /* RetroArchiOS */, + 926C77D621FD1E6500103EDE /* RetroArchTV */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 9204BE211D319EF300BD49DB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9222F2092315DAD50097C0FD /* Launch Screen.storyboard in Resources */, + 9204BE231D319EF300BD49DB /* InfoPlist.strings in Resources */, + 92CC05BC21FE3C1700FF79F0 /* GCDWebUploader.bundle in Resources */, + 9222F20B2315DD3D0097C0FD /* retroarch_logo.png in Resources */, + 929784502200EEE400989A60 /* iOS/Resources/Media.xcassets in Resources */, + 9204BE261D319EF300BD49DB /* iOS/modules in Resources */, + 9222F1FF2314BA7C0097C0FD /* assets.zip in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 926C77D521FD1E6500103EDE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 92CC05BD21FE3C1700FF79F0 /* GCDWebUploader.bundle in Resources */, + 92E5DCD4231A5786006491BF /* modules in Resources */, + 9222F2002314BA7C0097C0FD /* assets.zip in Resources */, + 926C77E321FD1E6700103EDE /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 9204BE271D319EF300BD49DB /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "./code-sign-cores.sh\n"; + }; + 92CC057521FE2D4900FF79F0 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "./code-sign-cores.sh tvos\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 9204BE0A1D319EF300BD49DB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 92CC05B821FE3C1700FF79F0 /* GCDWebServerDataRequest.m in Sources */, + 92CC05A421FE3C1700FF79F0 /* GCDWebServerRequest.m in Sources */, + 92CC05AA21FE3C1700FF79F0 /* GCDWebServerConnection.m in Sources */, + 92A1F81827006CAE00DEAD2A /* JITSupport.m in Sources */, + 92CC05BE21FE3C1700FF79F0 /* GCDWebUploader.m in Sources */, + 92CC05B621FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.m in Sources */, + 92CC05AC21FE3C1700FF79F0 /* GCDWebServerErrorResponse.m in Sources */, + 92CC05A621FE3C1700FF79F0 /* GCDWebServerFunctions.m in Sources */, + 9210C2F824B3A32D00E6FE7C /* griffin_glslang.cpp in Sources */, + 92CC05A821FE3C1700FF79F0 /* GCDWebServer.m in Sources */, + 9204BE0D1D319EF300BD49DB /* griffin_objc.m in Sources */, + 9204BE101D319EF300BD49DB /* griffin.c in Sources */, + 92CC05B421FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.m in Sources */, + 92DAF33F277A370600FE2A9E /* EmulatorTouchMouse.swift in Sources */, + 92CC05B021FE3C1700FF79F0 /* GCDWebServerDataResponse.m in Sources */, + 92CC05C221FE3C6D00FF79F0 /* WebServer.m in Sources */, + 9289D22825E88A63004B5D52 /* CocoaView+KeyboardSupport.swift in Sources */, + 9210C2FC24B4CB4900E6FE7C /* menu_pipeline.metal in Sources */, + 9210C2FE24B4CB4900E6FE7C /* Shaders.metal in Sources */, + 92CC05BA21FE3C1700FF79F0 /* GCDWebServerFileRequest.m in Sources */, + 92CC05AE21FE3C1700FF79F0 /* GCDWebServerFileResponse.m in Sources */, + 9210C2F624B3A32D00E6FE7C /* griffin_cpp.cpp in Sources */, + 9289D20A25E40D7B004B5D52 /* EmulatorKeyboard.swift in Sources */, + 92CC05B221FE3C1700FF79F0 /* GCDWebServerStreamedResponse.m in Sources */, + 92CC05A221FE3C1700FF79F0 /* GCDWebServerResponse.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 926C77D321FD1E6500103EDE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 92CC05B921FE3C1700FF79F0 /* GCDWebServerDataRequest.m in Sources */, + 92CC05A521FE3C1700FF79F0 /* GCDWebServerRequest.m in Sources */, + 92CC05AB21FE3C1700FF79F0 /* GCDWebServerConnection.m in Sources */, + 92CC05BF21FE3C1700FF79F0 /* GCDWebUploader.m in Sources */, + 92CC05B721FE3C1700FF79F0 /* GCDWebServerMultiPartFormRequest.m in Sources */, + 92CC05AD21FE3C1700FF79F0 /* GCDWebServerErrorResponse.m in Sources */, + 92CC05A721FE3C1700FF79F0 /* GCDWebServerFunctions.m in Sources */, + 9210C2F924B3A32D00E6FE7C /* griffin_glslang.cpp in Sources */, + 92CC05A921FE3C1700FF79F0 /* GCDWebServer.m in Sources */, + 926C77EA21FD20C100103EDE /* griffin_objc.m in Sources */, + 926C77EB21FD20C400103EDE /* griffin.c in Sources */, + 92CC05B521FE3C1700FF79F0 /* GCDWebServerURLEncodedFormRequest.m in Sources */, + 92CC05B121FE3C1700FF79F0 /* GCDWebServerDataResponse.m in Sources */, + 92CC05C321FE3C6D00FF79F0 /* WebServer.m in Sources */, + 9210C2FD24B4CB4900E6FE7C /* menu_pipeline.metal in Sources */, + 9210C2FF24B4CB4900E6FE7C /* Shaders.metal in Sources */, + 92CC05BB21FE3C1700FF79F0 /* GCDWebServerFileRequest.m in Sources */, + 92CC05AF21FE3C1700FF79F0 /* GCDWebServerFileResponse.m in Sources */, + 9210C2F724B3A32D00E6FE7C /* griffin_cpp.cpp in Sources */, + 92CC05B321FE3C1700FF79F0 /* GCDWebServerStreamedResponse.m in Sources */, + 92CC05A321FE3C1700FF79F0 /* GCDWebServerResponse.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 967894611788EBD800D6CA69 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 967894621788EBD800D6CA69 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 9204BE291D319EF300BD49DB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD)"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist"; + CURRENT_PROJECT_VERSION = 1.9.8; + DEPS_DIR = "$(SRCBASE)/deps"; + DEVELOPMENT_TEAM = R72X3BF4KE; + ENABLE_BITCODE = NO; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + HEADER_SEARCH_PATHS = ( + ../../, + "../../libretro-common/include", + "../../libretro-common/include/compat/zlib", + ../../deps/stb, + ../../deps/rcheevos/include, + ../../deps, + "$(DEPS_DIR)/glslang", + "$(DEPS_DIR)/SPIRV-Cross", + "$(DEPS_DIR)/glslang/glslang/glslang/Public", + "$(DEPS_DIR)/glslang/glslang/glslang/OSDependent/Unix", + "$(DEPS_DIR)/glslang/glslang/SPIRV", + "$(DEPS_DIR)/glslang/glslang/glslang/MachineIndependent", + ); + INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_NO_PIE = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ""; + MARKETING_VERSION = 1.9.8; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = NO; + OTHER_CFLAGS = ( + "-DDONT_WANT_ARM_OPTIMIZATIONS", + "-DHAVE_NETWORKGAMEPAD", + "-DHAVE_STB_FONT", + "-DHAVE_HID", + "-DHAVE_NETWORKING", + "-DHAVE_NETPLAYDISCOVERY", + "-DHAVE_RUNAHEAD", + "-DHAVE_TRANSLATE", + "-DHAVE_GRIFFIN", + "-DHAVE_STB_VORBIS", + "-DHAVE_MINIUPNPC", + "-DHAVE_BUILTINMINIUPNPC", + "-DHAVE_UPDATE_ASSETS", + "-DHAVE_ONLINE_UPDATER", + "-DHAVE_LANGEXTRA", + "-DHAVE_CHEEVOS", + "-DRC_DISABLE_LUA", + "-DHAVE_IMAGEVIEWER", + "-DHAVE_RGUI", + "-DHAVE_CONFIGFILE", + "-DHAVE_MENU", + "-DHAVE_GFX_WIDGETS", + "-DHAVE_LIBRETRODB", + "-DHAVE_AUDIOMIXER", + "-DIOS", + "-DHAVE_OPENGL", + "-DHAVE_OPENGLES", + "-DHAVE_IOS_CUSTOMKEYBOARD", + "-DHAVE_OPENGLES2", + "-DHAVE_CC_RESAMPLER", + "-DHAVE_GLSL", + "-DINLINE=inline", + "-D__LIBRETRO__", + "-DRARCH_MOBILE", + "-DHAVE_COREAUDIO", + "-DHAVE_DYNAMIC", + "-DHAVE_OVERLAY", + "-DHAVE_VIDEO_LAYOUT", + "-DHAVE_ZLIB", + "-DHAVE_RPNG", + "-DHAVE_RJPEG", + "-DHAVE_RBMP", + "-DHAVE_RTGA", + "-DHAVE_COCOATOUCH", + "-DHAVE_MAIN", + "-DRARCH_INTERNAL", + "-DHAVE_THREADS", + "-DHAVE_FILTERS_BUILTIN", + "-DHAVE_MATERIALUI", + "-DHAVE_XMB", + "-DHAVE_OZONE", + "-DHAVE_SHADERPIPELINE", + "-D_LZMA_UINT32_IS_ULONG", + "-DHAVE_MFI", + "-DHAVE_KEYMAPPER", + "-DHAVE_COCOA_METAL", + "-DHAVE_METAL", + "-DHAVE_SLANG", + "-DHAVE_SPIRV_CROSS", + "-DHAVE_GLSLANG", + "-DWANT_GLSLANG", + "-DGLSLANG_OSINCLUDE_UNIX", + "-DENABLE_HLSL", + "-DHAVE_BUILTINGLSLANG", + "-DHAVE_CHEATS", + "-DHAVE_BTSTACK", + "-DHAVE_RWAV", + "-DHAVE_SCREENSHOTS", + "-DHAVE_REWIND", + "-DHAVE_PATCH", + "-DHAVE_IOS_CUSTOMKEYBOARD", + "-DHAVE_IOS_TOUCHMOUSE", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.libretro.RetroArchiOS11; + PRODUCT_NAME = RetroArch; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; + SRCBASE = "$(SRCROOT)/../.."; + SWIFT_OBJC_BRIDGING_HEADER = "RetroArch-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VALID_ARCHS = "armv7 arm64"; + WARNING_CFLAGS = "-Wno-invalid-source-encoding"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 9204BE2A1D319EF300BD49DB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD)"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; + CODE_SIGN_RESOURCE_RULES_PATH = "$(SDKROOT)/ResourceRules.plist"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1.9.8; + DEPS_DIR = "$(SRCBASE)/deps"; + DEVELOPMENT_TEAM = R72X3BF4KE; + ENABLE_BITCODE = NO; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; + HEADER_SEARCH_PATHS = ( + ../../, + "../../libretro-common/include", + "../../libretro-common/include/compat/zlib", + ../../deps/stb, + ../../deps/rcheevos/include, + ../../deps, + "$(DEPS_DIR)/glslang", + "$(DEPS_DIR)/SPIRV-Cross", + "$(DEPS_DIR)/glslang/glslang/glslang/Public", + "$(DEPS_DIR)/glslang/glslang/glslang/OSDependent/Unix", + "$(DEPS_DIR)/glslang/glslang/SPIRV", + "$(DEPS_DIR)/glslang/glslang/glslang/MachineIndependent", + ); + INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_NO_PIE = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ""; + MARKETING_VERSION = 1.9.8; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = ( + "-DNS_BLOCK_ASSERTIONS=1", + "-DNDEBUG", + "-DDONT_WANT_ARM_ASM_OPTIMIZATIONS", + "-DHAVE_NETWORKGAMEPAD", + "-DHAVE_STB_FONT", + "-DHAVE_HID", + "-DHAVE_NETWORKING", + "-DHAVE_NETPLAYDISCOVERY", + "-DHAVE_RUNAHEAD", + "-DHAVE_TRANSLATE", + "-DHAVE_GRIFFIN", + "-DHAVE_STB_VORBIS", + "-DHAVE_MINIUPNPC", + "-DHAVE_BUILTINMINIUPNPC", + "-DHAVE_UPDATE_ASSETS", + "-DHAVE_ONLINE_UPDATER", + "-DHAVE_LANGEXTRA", + "-DHAVE_CHEEVOS", + "-DRC_DISABLE_LUA", + "-DHAVE_IMAGEVIEWER", + "-DHAVE_RGUI", + "-DHAVE_CONFIGFILE", + "-DHAVE_MENU", + "-DHAVE_GFX_WIDGETS", + "-DHAVE_LIBRETRODB", + "-DHAVE_AUDIOMIXER", + "-DIOS", + "-DHAVE_DYNAMIC", + "-DHAVE_OPENGL", + "-DHAVE_OPENGLES", + "-DHAVE_OPENGLES2", + "-DHAVE_CC_RESAMPLER", + "-DHAVE_GLSL", + "-DINLINE=inline", + "-DHAVE_THREADS", + "-D__LIBRETRO__", + "-DRARCH_MOBILE", + "-std=gnu99", + "-DHAVE_COREAUDIO", + "-DHAVE_OVERLAY", + "-DHAVE_VIDEO_LAYOUT", + "-DHAVE_ZLIB", + "-DHAVE_RPNG", + "-DHAVE_RJPEG", + "-DHAVE_RBMP", + "-DHAVE_RTGA", + "-DHAVE_COCOATOUCH", + "-DHAVE_MAIN", + "-DHAVE_CHEATS", + "-DHAVE_BTSTACK", + "-DHAVE_RWAV", + "-DHAVE_SCREENSHOTS", + "-DHAVE_REWIND", + "-DHAVE_PATCH", + "-DHAVE_IOS_CUSTOMKEYBOARD", + "-DHAVE_IOS_TOUCHMOUSE", + ); + "OTHER_CFLAGS[arch=*]" = ( + "-DNS_BLOCK_ASSERTIONS=1", + "-DNDEBUG", + "-DDONT_WANT_ARM_ASM_OPTIMIZATIONS", + "-DHAVE_NETWORKGAMEPAD", + "-DHAVE_STB_FONT", + "-DHAVE_HID", + "-DHAVE_NETWORKING", + "-DHAVE_NETPLAYDISCOVERY", + "-DHAVE_RUNAHEAD", + "-DHAVE_TRANSLATE", + "-DHAVE_GRIFFIN", + "-DHAVE_STB_VORBIS", + "-DHAVE_MINIUPNPC", + "-DHAVE_BUILTINMINIUPNPC", + "-DHAVE_UPDATE_ASSETS", + "-DHAVE_ONLINE_UPDATER", + "-DHAVE_LANGEXTRA", + "-DHAVE_CHEEVOS", + "-DRC_DISABLE_LUA", + "-DHAVE_IMAGEVIEWER", + "-DHAVE_RGUI", + "-DHAVE_CONFIGFILE", + "-DHAVE_MENU", + "-DHAVE_GFX_WIDGETS", + "-DHAVE_LIBRETRODB", + "-DHAVE_AUDIOMIXER", + "-DIOS", + "-DHAVE_OPENGL", + "-DHAVE_OPENGLES", + "-DHAVE_CC_RESAMPLER", + "-DHAVE_GLSL", + "-DINLINE=inline", + "-D__LIBRETRO__", + "-DRARCH_MOBILE", + "-DHAVE_COREAUDIO", + "-DHAVE_DYNAMIC", + "-DRARCH_INTERNAL", + "-DHAVE_OVERLAY", + "-DHAVE_VIDEO_LAYOUT", + "-DHAVE_ZLIB", + "-DHAVE_RPNG", + "-DHAVE_RJPEG", + "-DHAVE_RBMP", + "-DHAVE_RTGA", + "-DHAVE_COCOATOUCH", + "-DHAVE_MAIN", + "-DHAVE_THREADS", + "-DHAVE_FILTERS_BUILTIN", + "-DHAVE_7ZIP", + "-D_7ZIP_ST", + "-DHAVE_MATERIALUI", + "-DHAVE_XMB", + "-DHAVE_OZONE", + "-DHAVE_SHADERPIPELINE", + "-D_LZMA_UINT32_IS_ULONG", + "-DHAVE_MFI", + "-DHAVE_KEYMAPPER", + "-DHAVE_COCOA_METAL", + "-DHAVE_METAL", + "-DHAVE_SLANG", + "-DHAVE_SPIRV_CROSS", + "-DHAVE_GLSLANG", + "-DWANT_GLSLANG", + "-DGLSLANG_OSINCLUDE_UNIX", + "-DENABLE_HLSL", + "-DHAVE_BUILTINGLSLANG", + "-DHAVE_CHEATS", + "-DHAVE_SCREENSHOTS", + "-DHAVE_REWIND", + "-DHAVE_PATCH", + "-DHAVE_RWAV", + "-DHAVE_BTSTACK", + "-DHAVE_OPENGLES2", + "-DHAVE_IOS_CUSTOMKEYBOARD", + "-DHAVE_IOS_TOUCHMOUSE", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.libretro.RetroArchiOS11; + PRODUCT_NAME = RetroArch; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; + SRCBASE = "$(SRCROOT)/../.."; + SWIFT_OBJC_BRIDGING_HEADER = "RetroArch-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VALID_ARCHS = "armv7 arm64"; + WARNING_CFLAGS = "-Wno-invalid-source-encoding"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 926C77E721FD1E6700103EDE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = 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_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_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; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1.9.3; + DEBUG_INFORMATION_FORMAT = dwarf; + DEPS_DIR = "$(SRCBASE)/deps"; + DEVELOPMENT_TEAM = R72X3BF4KE; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + HEADER_SEARCH_PATHS = ( + ../../, + "../../libretro-common/include", + "../../libretro-common/include/compat/zlib", + ../../deps/stb, + ../../deps/rcheevos/include, + ../../deps, + "$(DEPS_DIR)/glslang", + "$(DEPS_DIR)/SPIRV-Cross", + "$(DEPS_DIR)/glslang/glslang/glslang/Public", + "$(DEPS_DIR)/glslang/glslang/glslang/OSDependent/Unix", + "$(DEPS_DIR)/glslang/glslang/SPIRV", + "$(DEPS_DIR)/glslang/glslang/glslang/MachineIndependent", + ); + INFOPLIST_FILE = "$(SRCROOT)/tvOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.9.3; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "-DDONT_WANT_ARM_OPTIMIZATIONS", + "-DHAVE_NETWORKGAMEPAD", + "-DHAVE_STB_FONT", + "-DHAVE_HID", + "-DHAVE_NETWORKING", + "-DHAVE_NETPLAYDISCOVERY", + "-DHAVE_RUNAHEAD", + "-DHAVE_TRANSLATE", + "-DHAVE_GRIFFIN", + "-DHAVE_STB_VORBIS", + "-DHAVE_MINIUPNPC", + "-DHAVE_BUILTINMINIUPNPC", + "-DHAVE_UPDATE_ASSETS", + "-DHAVE_ONLINE_UPDATER", + "-DHAVE_LANGEXTRA", + "-DHAVE_CHEEVOS", + "-DRC_DISABLE_LUA", + "-DHAVE_IMAGEVIEWER", + "-DHAVE_RGUI", + "-DHAVE_CONFIGFILE", + "-DHAVE_MENU", + "-DHAVE_GFX_WIDGETS", + "-DHAVE_LIBRETRODB", + "-DHAVE_AUDIOMIXER", + "-DIOS", + "-DHAVE_OPENGL", + "-DHAVE_OPENGLES", + "-DHAVE_OPENGLES2", + "-DHAVE_CC_RESAMPLER", + "-DHAVE_GLSL", + "-DINLINE=inline", + "-D__LIBRETRO__", + "-DRARCH_MOBILE", + "-DHAVE_COREAUDIO", + "-DHAVE_DYNAMIC", + "-DHAVE_VIDEO_LAYOUT", + "-DHAVE_ZLIB", + "-DHAVE_RPNG", + "-DHAVE_RJPEG", + "-DHAVE_RBMP", + "-DHAVE_RTGA", + "-DHAVE_COCOATOUCH", + "-DHAVE_MAIN", + "-DRARCH_INTERNAL", + "-DHAVE_THREADS", + "-DHAVE_FILTERS_BUILTIN", + "-DHAVE_XMB", + "-DHAVE_OZONE", + "-DHAVE_SHADERPIPELINE", + "-D_LZMA_UINT32_IS_ULONG", + "-DHAVE_MFI", + "-DHAVE_KEYMAPPER", + "-DHAVE_COCOA_METAL", + "-DHAVE_METAL", + "-DHAVE_SLANG", + "-DHAVE_SPIRV_CROSS", + "-DHAVE_GLSLANG", + "-DWANT_GLSLANG", + "-DGLSLANG_OSINCLUDE_UNIX", + "-DENABLE_HLSL", + "-DHAVE_BUILTINGLSLANG", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.libretro.dist.tvos.RetroArch; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = appletvos; + SRCBASE = "$(SRCROOT)/../.."; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 12.1; + }; + name = Debug; + }; + 926C77E821FD1E6700103EDE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = 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_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_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; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1.9.3; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEPS_DIR = "$(SRCBASE)/deps"; + DEVELOPMENT_TEAM = R72X3BF4KE; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + HEADER_SEARCH_PATHS = ( + ../../, + "../../libretro-common/include", + "../../libretro-common/include/compat/zlib", + ../../deps/stb, + ../../deps/rcheevos/include, + ../../deps, + "$(DEPS_DIR)/glslang", + "$(DEPS_DIR)/SPIRV-Cross", + "$(DEPS_DIR)/glslang/glslang/glslang/Public", + "$(DEPS_DIR)/glslang/glslang/glslang/OSDependent/Unix", + "$(DEPS_DIR)/glslang/glslang/SPIRV", + "$(DEPS_DIR)/glslang/glslang/glslang/MachineIndependent", + ); + INFOPLIST_FILE = "$(SRCROOT)/tvOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.9.3; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_CFLAGS = ( + "-DNS_BLOCK_ASSERTIONS=1", + "-DNDEBUG", + "-DDONT_WANT_ARM_OPTIMIZATIONS", + "-DHAVE_NETWORKGAMEPAD", + "-DHAVE_STB_FONT", + "-DHAVE_HID", + "-DHAVE_NETWORKING", + "-DHAVE_NETPLAYDISCOVERY", + "-DHAVE_RUNAHEAD", + "-DHAVE_TRANSLATE", + "-DHAVE_GRIFFIN", + "-DHAVE_STB_VORBIS", + "-DHAVE_MINIUPNPC", + "-DHAVE_BUILTINMINIUPNPC", + "-DHAVE_UPDATE_ASSETS", + "-DHAVE_ONLINE_UPDATER", + "-DHAVE_LANGEXTRA", + "-DHAVE_CHEEVOS", + "-DRC_DISABLE_LUA", + "-DHAVE_IMAGEVIEWER", + "-DHAVE_RGUI", + "-DHAVE_CONFIGFILE", + "-DHAVE_MENU", + "-DHAVE_GFX_WIDGETS", + "-DHAVE_LIBRETRODB", + "-DHAVE_AUDIOMIXER", + "-DIOS", + "-DHAVE_OPENGL", + "-DHAVE_OPENGLES", + "-DHAVE_OPENGLES2", + "-DHAVE_CC_RESAMPLER", + "-DHAVE_GLSL", + "-DINLINE=inline", + "-D__LIBRETRO__", + "-DRARCH_MOBILE", + "-DHAVE_COREAUDIO", + "-DHAVE_DYNAMIC", + "-DHAVE_VIDEO_LAYOUT", + "-DHAVE_ZLIB", + "-DHAVE_RPNG", + "-DHAVE_RJPEG", + "-DHAVE_RBMP", + "-DHAVE_RTGA", + "-DHAVE_COCOATOUCH", + "-DHAVE_MAIN", + "-DRARCH_INTERNAL", + "-DHAVE_THREADS", + "-DHAVE_FILTERS_BUILTIN", + "-DHAVE_7ZIP", + "-D_7ZIP_ST", + "-DHAVE_XMB", + "-DHAVE_OZONE", + "-DHAVE_SHADERPIPELINE", + "-D_LZMA_UINT32_IS_ULONG", + "-DHAVE_MFI", + "-DHAVE_KEYMAPPER", + "-DHAVE_COCOA_METAL", + "-DHAVE_METAL", + "-DHAVE_SLANG", + "-DHAVE_SPIRV_CROSS", + "-DHAVE_GLSLANG", + "-DWANT_GLSLANG", + "-DGLSLANG_OSINCLUDE_UNIX", + "-DENABLE_HLSL", + "-DHAVE_BUILTINGLSLANG", + "-DHAVE_CHEATS", + "-DHAVE_SCREENSHOTS", + "-DHAVE_REWIND", + "-DHAVE_PATCH", + "-DHAVE_RWAV", + "-DHAVE_BTSTACK", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.libretro.dist.tvos.RetroArch; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = appletvos; + SRCBASE = "$(SRCROOT)/../.."; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 12.1; + }; + name = Release; + }; + 96AFAE5216C1D4EA009DE44C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + COPY_PHASE_STRIP = NO; + ENABLE_BITCODE = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ../; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + ONLY_ACTIVE_ARCH = NO; + OTHER_CFLAGS = ( + "-DDONT_WANT_ARM_ASM_OPTIMIZATIONS", + "-DHAVE_NETWORKGAMEPAD", + "-DHAVE_STB_FONT", + "-DHAVE_HID", + "-DHAVE_NETWORKING", + "-DHAVE_NETPLAYDISCOVERY", + "-DHAVE_RUNAHEAD", + "-DHAVE_TRANSLATE", + "-DHAVE_GRIFFIN", + "-DHAVE_STB_VORBIS", + "-DHAVE_MINIUPNPC", + "-DHAVE_BUILTINMINIUPNPC", + "-DHAVE_UPDATE_ASSETS", + "-DHAVE_ONLINE_UPDATER", + "-DHAVE_LANGEXTRA", + "-DHAVE_CHEEVOS", + "-DRC_DISABLE_LUA", + "-DHAVE_IMAGEVIEWER", + "-DHAVE_RGUI", + "-DHAVE_CONFIGFILE", + "-DHAVE_MENU", + "-DHAVE_GFX_WIDGETS", + "-DHAVE_LIBRETRODB", + "-DHAVE_AUDIOMIXER", + "-DIOS", + "-DHAVE_DYNAMIC", + "-DHAVE_OPENGL", + "-DHAVE_OPENGLES", + "-DHAVE_OPENGLES3", + "-DHAVE_CC_RESAMPLER", + "-DHAVE_GLSL", + "-DINLINE=inline", + "-DHAVE_THREADS", + "-D__LIBRETRO__", + "-DRARCH_MOBILE", + "-std=gnu99", + "-DHAVE_COREAUDIO", + "-DHAVE_OVERLAY", + "-DHAVE_VIDEO_LAYOUT", + "-DHAVE_ZLIB", + "-DHAVE_RPNG", + "-DHAVE_RJPEG", + "-DHAVE_RBMP", + "-DHAVE_RTGA", + "-DHAVE_COCOATOUCH", + "-DHAVE_MAIN", + ); + "OTHER_LDFLAGS[arch=*]" = "-Wl,-segalign,4000"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALID_ARCHS = "armv7 arm64"; + }; + name = Debug; + }; + 96AFAE5316C1D4EA009DE44C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + COPY_PHASE_STRIP = NO; + ENABLE_BITCODE = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_OPTIMIZATION_LEVEL = 2; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ../; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + OTHER_CFLAGS = ( + "-DNS_BLOCK_ASSERTIONS=1", + "-DNDEBUG", + "-DDONT_WANT_ARM_OPTIMIZATIONS", + "-DHAVE_NETWORKGAMEPAD", + "-DHAVE_STB_FONT", + "-DHAVE_HID", + "-DHAVE_NETWORKING", + "-DHAVE_NETPLAYDISCOVERY", + "-DHAVE_RUNAHEAD", + "-DHAVE_TRANSLATE", + "-DHAVE_GRIFFIN", + "-DHAVE_STB_VORBIS", + "-DHAVE_MINIUPNPC", + "-DHAVE_BUILTINMINIUPNPC", + "-DHAVE_UPDATE_ASSETS", + "-DHAVE_ONLINE_UPDATER", + "-DHAVE_LANGEXTRA", + "-DHAVE_CHEEVOS", + "-DRC_DISABLE_LUA", + "-DHAVE_IMAGEVIEWER", + "-DHAVE_RGUI", + "-DHAVE_CONFIGFILE", + "-DHAVE_MENU", + "-DHAVE_GFX_WIDGETS", + "-DHAVE_LIBRETRODB", + "-DHAVE_AUDIOMIXER", + "-DIOS", + "-DHAVE_DYNAMIC", + "-DHAVE_OPENGL", + "-DHAVE_OPENGLES", + "-DHAVE_CC_RESAMPLER", + "-DHAVE_GLSL", + "-DINLINE=inline", + "-DHAVE_THREADS", + "-D__LIBRETRO__", + "-DRARCH_MOBILE", + "-std=gnu99", + "-DHAVE_COREAUDIO", + "-DHAVE_OVERLAY", + "-DHAVE_VIDEO_LAYOUT", + "-DHAVE_ZLIB", + "-DHAVE_RPNG", + "-DHAVE_RJPEG", + "-DHAVE_RBMP", + "-DHAVE_RTGA", + "-DHAVE_COCOATOUCH", + "-DHAVE_MAIN", + ); + "OTHER_LDFLAGS[arch=*]" = "-Wl,-segalign,4000"; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VALID_ARCHS = "armv7 arm64"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 9204BE281D319EF300BD49DB /* Build configuration list for PBXNativeTarget "RetroArchiOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9204BE291D319EF300BD49DB /* Debug */, + 9204BE2A1D319EF300BD49DB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 926C77E921FD1E6700103EDE /* Build configuration list for PBXNativeTarget "RetroArchTV" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 926C77E721FD1E6700103EDE /* Debug */, + 926C77E821FD1E6700103EDE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 96AFAE1F16C1D4EA009DE44C /* Build configuration list for PBXProject "RetroArch_iOS13" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 96AFAE5216C1D4EA009DE44C /* Debug */, + 96AFAE5316C1D4EA009DE44C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 96AFAE1C16C1D4EA009DE44C /* Project object */; +} diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..01ae31835d --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000000..18d981003d --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/RetroArch_iOS.xccheckout b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/RetroArch_iOS.xccheckout new file mode 100644 index 0000000000..92a419b12f --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/RetroArch_iOS.xccheckout @@ -0,0 +1,101 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 6D7FAF49-495D-480E-B0C9-8C39AC77CE3C + IDESourceControlProjectName + RetroArch_iOS + IDESourceControlProjectOriginsDictionary + + 6B9F0B13E5864452B91F13C09B7ED9EB989E82AD + https://github.com/libretro/retroarch-joypad-autoconfig.git + 76200F0D6584D865E96F58DE862E738E88B23A3C + https://github.com/libretro/libretro-super.git + A267D9543F572B4C32EC6E1B876E3B9BFE4DE8F6 + https://github.com/libretro/retroarch-assets.git + C3AEE01BDA902108663DB5DB9CD7916436919463 + https://github.com/libretro/libretro-database.git + C7C12374C7051F8843B3EFA1ACCAF2907102CCF7 + https://github.com/libretro/RetroArch.git + EF363D58F01B3FB341FA6C851870E60E4F080E97 + https://github.com/libretro/common-overlays.git + + IDESourceControlProjectPath + apple/iOS/RetroArch_iOS.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 6B9F0B13E5864452B91F13C09B7ED9EB989E82AD + ../../../..media/autoconfig + 76200F0D6584D865E96F58DE862E738E88B23A3C + ../../../../.. + A267D9543F572B4C32EC6E1B876E3B9BFE4DE8F6 + ../../../..media/assets + C3AEE01BDA902108663DB5DB9CD7916436919463 + ../../../..media/libretrodb + C7C12374C7051F8843B3EFA1ACCAF2907102CCF7 + ../../../.. + EF363D58F01B3FB341FA6C851870E60E4F080E97 + ../../../..media/overlays + + IDESourceControlProjectURL + https://github.com/libretro/RetroArch.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + C7C12374C7051F8843B3EFA1ACCAF2907102CCF7 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 76200F0D6584D865E96F58DE862E738E88B23A3C + IDESourceControlWCCName + + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + A267D9543F572B4C32EC6E1B876E3B9BFE4DE8F6 + IDESourceControlWCCName + assets + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 6B9F0B13E5864452B91F13C09B7ED9EB989E82AD + IDESourceControlWCCName + autoconfig + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + C3AEE01BDA902108663DB5DB9CD7916436919463 + IDESourceControlWCCName + libretrodb + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + EF363D58F01B3FB341FA6C851870E60E4F080E97 + IDESourceControlWCCName + overlays + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + C7C12374C7051F8843B3EFA1ACCAF2907102CCF7 + IDESourceControlWCCName + retroarch + + + + diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/RetroArch_iOS10.xcscmblueprint b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/RetroArch_iOS10.xcscmblueprint new file mode 100644 index 0000000000..b1429b86f1 --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/RetroArch_iOS10.xcscmblueprint @@ -0,0 +1,30 @@ +{ + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "C7C12374C7051F8843B3EFA1ACCAF2907102CCF7", + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { + + }, + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { + "76200F0D6584D865E96F58DE862E738E88B23A3C" : 9223372036854775807, + "C7C12374C7051F8843B3EFA1ACCAF2907102CCF7" : 9223372036854775807 + }, + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "8BA6E269-73BB-4AAE-8F4A-967CCF8ACA14", + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { + "76200F0D6584D865E96F58DE862E738E88B23A3C" : "", + "C7C12374C7051F8843B3EFA1ACCAF2907102CCF7" : "retroarch\/" + }, + "DVTSourceControlWorkspaceBlueprintNameKey" : "RetroArch_iOS10", + "DVTSourceControlWorkspaceBlueprintVersion" : 204, + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "pkg\/apple\/RetroArch_iOS10.xcodeproj", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/libretro\/libretro-super.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "76200F0D6584D865E96F58DE862E738E88B23A3C" + }, + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/libretro\/RetroArch.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "C7C12374C7051F8843B3EFA1ACCAF2907102CCF7" + } + ] +} \ No newline at end of file diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000000..0c67376eba --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,5 @@ + + + + + diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch iOS Debug.xcscheme b/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch iOS Debug.xcscheme new file mode 100644 index 0000000000..6698f4f6b5 --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch iOS Debug.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch iOS Release.xcscheme b/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch iOS Release.xcscheme new file mode 100644 index 0000000000..d4a8b001ae --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch iOS Release.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch tvOS Debug.xcscheme b/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch tvOS Debug.xcscheme new file mode 100644 index 0000000000..bac383c35e --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch tvOS Debug.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch tvOS Release.xcscheme b/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch tvOS Release.xcscheme new file mode 100644 index 0000000000..42aa74a6f3 --- /dev/null +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/xcshareddata/xcschemes/RetroArch tvOS Release.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/apple/iOS/Info.plist b/pkg/apple/iOS/Info.plist index 9b6a3ae86a..ffc8a7f2c7 100644 --- a/pkg/apple/iOS/Info.plist +++ b/pkg/apple/iOS/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - $(PRODUCT_NAME) + RetroArch CFBundleDocumentTypes diff --git a/ui/drivers/cocoa/cocoa_common.h b/ui/drivers/cocoa/cocoa_common.h index 3749c26c23..24a5ddd7cc 100644 --- a/ui/drivers/cocoa/cocoa_common.h +++ b/ui/drivers/cocoa/cocoa_common.h @@ -42,10 +42,18 @@ #endif #if TARGET_OS_IOS +@class EmulatorKeyboardController; + @interface CocoaView : UIViewController #elif TARGET_OS_TV @interface CocoaView : GCEventViewController #endif + +#if TARGET_OS_IOS && defined(HAVE_IOS_CUSTOMKEYBOARD) +@property(nonatomic,strong) EmulatorKeyboardController *keyboardController; +@property(nonatomic,assign) unsigned int keyboardModifierState; +#endif + + (CocoaView*)get; @end diff --git a/ui/drivers/cocoa/cocoa_common.m b/ui/drivers/cocoa/cocoa_common.m index bd032816ec..91a59e5326 100644 --- a/ui/drivers/cocoa/cocoa_common.m +++ b/ui/drivers/cocoa/cocoa_common.m @@ -26,20 +26,33 @@ #ifdef HAVE_COCOATOUCH #import "../../../pkg/apple/WebServer/GCDWebUploader/GCDWebUploader.h" #import "WebServer.h" +#if TARGET_OS_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= 130000 +#import "RetroArch-Swift.h" +#endif #endif #include "../../../configuration.h" #include "../../../retroarch.h" #include "../../../verbosity.h" +#include "../../input/drivers/cocoa_input.h" +#include "../../input/drivers_keyboard/keyboard_event_apple.h" + + static CocoaView* g_instance; #ifdef HAVE_COCOATOUCH void *glkitview_init(void); -@interface CocoaView() { - +@interface CocoaView() { + EmulatorTouchMouseHandler *mouseHandler; } +#else +> +#endif + @end #endif @@ -76,23 +89,12 @@ void *glkitview_init(void); #if defined(HAVE_COCOA) ui_window_cocoa_t cocoa_view; cocoa_view.data = (CocoaView*)self; -#elif defined(HAVE_COCOATOUCH) -#if defined(HAVE_COCOA_METAL) - self.view = [UIView new]; -#else - self.view = (BRIDGE GLKView*)glkitview_init(); -#endif #endif #if defined(OSX) video_driver_display_type_set(RARCH_DISPLAY_OSX); video_driver_display_set(0); video_driver_display_userdata_set((uintptr_t)self); -#elif TARGET_OS_IOS - UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(showNativeMenu)]; - swipe.numberOfTouchesRequired = 4; - swipe.direction = UISwipeGestureRecognizerDirectionDown; - [self.view addGestureRecognizer:swipe]; #endif return self; @@ -152,6 +154,35 @@ void *glkitview_init(void); }); } +-(void) showCustomKeyboard +{ +#ifdef HAVE_IOS_CUSTOMKEYBOARD + [self.keyboardController.view setHidden:false]; + [self updateOverlayAndFocus]; +#endif +} + +-(void) hideCustomKeyboard +{ +#ifdef HAVE_IOS_CUSTOMKEYBOARD + [self.keyboardController.view setHidden:true]; + [self updateOverlayAndFocus]; +#endif +} + +-(void) updateOverlayAndFocus +{ +#ifdef HAVE_IOS_CUSTOMKEYBOARD + int cmdData = self.keyboardController.view.isHidden ? 0 : 1; + command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, &cmdData); + if ( self.keyboardController.view.isHidden ) { + command_event(CMD_EVENT_OVERLAY_INIT, NULL); + } else { + command_event(CMD_EVENT_OVERLAY_DEINIT, NULL); + } +#endif +} + -(BOOL)prefersHomeIndicatorAutoHidden { return YES; } -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { @@ -227,12 +258,15 @@ void *glkitview_init(void); } [self adjustViewFrameForSafeArea]; +#ifdef HAVE_IOS_CUSTOMKEYBOARD + [self.view bringSubviewToFront:self.keyboardController.view]; +#endif } /* NOTE: This version runs on iOS6+. */ -- (NSUInteger)supportedInterfaceOrientations +- (UIInterfaceOrientationMask)supportedInterfaceOrientations { - return (NSUInteger)apple_frontend_settings.orientation_flags; + return (UIInterfaceOrientationMask)apple_frontend_settings.orientation_flags; } /* NOTE: This version runs on iOS2-iOS5, but not iOS6+. */ @@ -265,6 +299,50 @@ void *glkitview_init(void); #endif #ifdef HAVE_COCOATOUCH + +#pragma mark - UIViewController Lifecycle + +-(void)loadView { +#if defined(HAVE_COCOA_METAL) + self.view = [UIView new]; +#else + self.view = (BRIDGE GLKView*)glkitview_init(); +#endif +} + +-(void)viewDidLoad { + [super viewDidLoad]; +#if TARGET_OS_IOS + UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(showNativeMenu)]; + swipe.numberOfTouchesRequired = 4; + swipe.delegate = self; + swipe.direction = UISwipeGestureRecognizerDirectionDown; + [self.view addGestureRecognizer:swipe]; +#ifdef HAVE_IOS_TOUCHMOUSE + mouseHandler = [[EmulatorTouchMouseHandler alloc] initWithView:self.view]; + mouseHandler.delegate = self; +#endif +#ifdef HAVE_IOS_CUSTOMKEYBOARD + [self setupEmulatorKeyboard]; + UISwipeGestureRecognizer *showKeyboardSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(showCustomKeyboard)]; + showKeyboardSwipe.numberOfTouchesRequired = 3; + showKeyboardSwipe.direction = UISwipeGestureRecognizerDirectionUp; + showKeyboardSwipe.delegate = self; + [self.view addGestureRecognizer:showKeyboardSwipe]; + UISwipeGestureRecognizer *hideKeyboardSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideCustomKeyboard)]; + hideKeyboardSwipe.numberOfTouchesRequired = 3; + hideKeyboardSwipe.direction = UISwipeGestureRecognizerDirectionDown; + hideKeyboardSwipe.delegate = self; + [self.view addGestureRecognizer:hideKeyboardSwipe]; +#endif +#endif +} + +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { + return YES; +} + + - (void)viewDidAppear:(BOOL)animated { #if TARGET_OS_IOS @@ -282,6 +360,47 @@ void *glkitview_init(void); #endif } +#if TARGET_OS_IOS && HAVE_IOS_TOUCHMOUSE +-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + [mouseHandler touchesBeganWithTouches:touches]; +} + +-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { + [mouseHandler touchesMovedWithTouches:touches]; +} + +-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { + [mouseHandler touchesCancelledWithTouches:touches]; +} + +-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { + [mouseHandler touchesEndedWithTouches:touches]; +} + +#pragma mark EmulatorTouchMouseHandlerDelegate +-(void)handleMouseClickWithIsLeftClick:(BOOL)isLeftClick isPressed:(BOOL)isPressed { + cocoa_input_data_t *apple = (cocoa_input_data_t*) input_state_get_ptr()->current_data; + if (apple == NULL) { + return; + } + NSUInteger buttonIndex = isLeftClick ? 0 : 1; + if (isPressed) { + apple->mouse_buttons |= (1 << buttonIndex); + } else { + apple->mouse_buttons &= ~(1 << buttonIndex); + } +} + +-(void)handleMouseMoveWithX:(CGFloat)x y:(CGFloat)y { + cocoa_input_data_t *apple = (cocoa_input_data_t*) input_state_get_ptr()->current_data; + if (apple == NULL) { + return; + } + apple->mouse_rel_x = (int16_t)x; + apple->mouse_rel_y = (int16_t)y; +} +#endif + #pragma mark GCDWebServerDelegate - (void)webServerDidCompleteBonjourRegistration:(GCDWebServer*)server { @@ -309,6 +428,7 @@ void *glkitview_init(void); }]; #endif } + #endif @end diff --git a/ui/drivers/ui_cocoatouch.m b/ui/drivers/ui_cocoatouch.m index 27456c9bc7..141ad856fa 100644 --- a/ui/drivers/ui_cocoatouch.m +++ b/ui/drivers/ui_cocoatouch.m @@ -41,6 +41,9 @@ #import #if defined(HAVE_COCOA_METAL) || defined(HAVE_COCOATOUCH) +#if TARGET_OS_IOS +#import "JITSupport.h" +#endif id apple_platform; #else static id apple_platform; @@ -539,6 +542,13 @@ enum int main(int argc, char *argv[]) { +#if TARGET_OS_IOS + if (jb_enable_ptrace_hack()) { + NSLog(@"Ptrace hack complete, JIT support is enabled"); + } else { + NSLog(@"Ptrace hack NOT available; Please use an app like Jitterbug."); + } +#endif @autoreleasepool { return UIApplicationMain(argc, argv, NSStringFromClass([RApplication class]), NSStringFromClass([RetroArch_iOS class])); }