2607 Commits
Author SHA1 Message Date
hermes-agent 6e340b6d6a Read app version from built .ipa instead of hardcoding
Build VoidLink IPA / Build .ipa and publish source (push) Successful in 4m3s
The built app reports CFBundleShortVersionString 0.0.1 (MARKETING_VERSION),
but metadata hardcoded 1.0, so SideStore rejected the version mismatch.
Now read the version from the built app's Info.plist so it always matches.
2026-08-28 22:58:03 +00:00
hermes-agent ec12492ea7 Build Release config so .ipa bundle id matches source metadata
Build VoidLink IPA / Build .ipa and publish source (push) Successful in 4m1s
Debug config produces com.voidlink.tf.debug10.iOS, which mismatches the
com.voidlink.tf.iOS declared in VoidLink.json, so SideStore rejects the
install. Release produces the matching com.voidlink.tf.iOS.
2026-08-28 17:09:19 +00:00
hermes-agent 13ccbb3866 Add auto-deploy CI: build unsigned .ipa and publish to SideStore source
Build VoidLink IPA / Build .ipa and publish source (push) Successful in 2m58s
Builds VoidLink via xcodebuild (no signing) on the macOS runner, packages
the .app into an .ipa, and uploads .ipa + metadata + icon to perlis so it
can be installed from the SideStore source at apps.bueso.eu.
2026-08-28 11:06:46 +00:00
True Zhuanjia 20d6e221a4 minor fixes 2026-08-26 00:25:56 +08:00
True Zhuanjia 2bfddf255a widget interaction fixes 2026-08-25 23:20:24 +08:00
True Zhuanjia 0e8903d233 add tip for saving changes before exiting widget layout editor 2026-08-25 18:20:48 +08:00
True Zhuanjia 78f385d732 settingsVC ui fix 2026-08-25 16:10:19 +08:00
True Zhuanjia bd306ba07f gameSirG8MFi rumbler ready 2026-08-25 00:30:31 +08:00
TrueZhuanJia ececc03d46 Merge pull request #214 from chrisnch
Priority: rumble support
2026-08-24 22:25:06 +08:00
chrisnch 6202a53153 Fix GameSir rumble session teardown threading 2026-08-22 08:13:56 +01:00
chrisnch 84b6b22f75 Add native rumble support for GameSir G8+ MFi 2026-08-22 07:33:00 +01:00
True Zhuanjia f8388658d8 controller navigation fixes 2026-08-22 01:08:44 +08:00
True Zhuanjia 3c36964b5c controller Navigation improvements 2026-08-21 22:08:41 +08:00
True Zhuanjia 089515443d dualSense emulation beta ready (works with Sunshine-Foundation) 2026-08-21 18:01:39 +08:00
True Zhuanjia e63e5f2120 nest qiin2333's haptic convertor 2026-08-18 15:52:31 +08:00
True Zhuanjia 5a5238afee dualSense haptic beta 2026-08-17 22:29:21 +08:00
True Zhuanjia e00e2f8000 Merge branch 'Integration' into ds5 2026-08-17 20:42:03 +08:00
True Zhuanjia 8795a9f173 onscreen widget fix
motionHandler fix
2026-08-17 20:41:02 +08:00
True Zhuanjia 5bd938abc5 Merge branch 'Integration' into ds5
emulated gyro fix
2026-08-17 17:43:23 +08:00
True Zhuanjia 514dbb98e7 fixed: emulated gyro data not enabled 2026-08-17 17:13:27 +08:00
True Zhuanjia 106b1548d4 update audio-haptic lib 2026-08-17 15:30:08 +08:00
True Zhuanjia cacf2b1951 EQ tmp fixes 2026-08-17 04:39:45 +08:00
True Zhuanjia f1a4a519c3 adaptive trigger fixes 2026-08-16 19:28:39 +08:00
True Zhuanjia 4f0be34947 dualSense haptic rumbling by qin2333's PCM convertor 2026-08-16 18:03:50 +08:00
True Zhuanjia 9da1121cdb dual sense adaptive trigger implementation working with Sunshine-Foundation 2026-08-16 15:29:49 +08:00
True Zhuanjia 0e92af13eb update c-module 2026-08-16 13:21:00 +08:00
True Zhuanjia cdd613cc63 fix build error for simulator 2026-08-13 08:33:55 +08:00
True Zhuanjia 58535c9997 minor ui fix 2026-08-12 19:41:07 +08:00
True Zhuanjia 48647d4d89 - update tip strings 2026-08-12 18:28:04 +08:00
True Zhuanjia 16c54ac966 ui & tip string fixes 2026-08-11 23:48:03 +08:00
True Zhuanjia 4214afd2b7 statsOverlay for frame interpolation 2026-08-11 13:32:24 +08:00
True Zhuanjia d28aa43319 resolution persistence fix 2026-08-10 15:08:40 +08:00
True Zhuanjia 4983aecb4c ui fixes 2026-08-10 02:59:11 +08:00
True Zhuanjia 5ba566ceee menu ui fixes 2026-08-09 21:42:19 +08:00
True Zhuanjia b0fd0222df Merge commit '6879bf63791c3422fd88095237bee508524b6959' into frameInterpolation
# Conflicts:
#	VoidLink/Localization/Localizable.xcstrings
#	VoidLink/Stream/VideoDecoderRenderer.m
2026-08-09 20:54:04 +08:00
True Zhuanjia 7b7bb3837c frameInterpolation beta ready 2026-08-09 20:34:39 +08:00
AcakiandClaude Fable 5 6879bf6379 Allow switching rendering backend without restarting the app
The renderer setting previously forced an app quit (exit(0)) because
switching backends between sessions crashed or leaked. Fix the
underlying lifecycle bugs and remove the restart requirement:

- FrameQueue: really release frames in clear(), clear on session
  start/stop, and guard start/stop with an owner so a stale session's
  async cleanup can't pause a new session's queue
- MetalView: weak delegate (breaks retain cycle leaking the whole Metal
  stack), never start two render threads, bound the shutdown wait to
  avoid deadlocking against the render thread's dispatch_sync to main
- MetalViewController: explicit idempotent shutdown called from stream
  teardown (viewDidDisappear isn't guaranteed); snapshot the renderer
  in render-thread callbacks to avoid use-after-free during shutdown
- MetalVideoRenderer: make the shared colorspace name thread-safe and
  ARC-managed instead of a CFStringRef over-released in dealloc; guard
  NULL format description extensions
- Connection: drop the static renderer reference in DrCleanup
- VideoDecoderRenderer: cache the application background state via
  notifications instead of calling UIKit from the decode queue
  (Main Thread Checker violation)
- Frame: don't CFRetain(NULL) when a format desc has no extensions
- StreamFrameViewController: fix _streamView cleanup ordering
- Settings: apply the backend change in place (with the Metal caveats
  alert) and update localized tips; takes effect on next stream

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 17:14:01 +08:00
True Zhuanjia fc2b1689d0 frame interpolation Demo1 2026-08-08 03:45:50 +08:00
True Zhuanjia 9c9ef4a13f make pixelBuffer available to metalRenderer 2026-08-07 16:39:46 +08:00
True Zhuanjia a92010f5b1 in-flight bitrate request fix 2026-08-07 00:26:56 +08:00
True Zhuanjia 813005694a frame interpolation preparations 2026-08-06 19:57:24 +08:00
True Zhuanjia 11dd542cb3 controller navigation fixes 2026-08-04 15:14:21 +08:00
True Zhuanjia 949a0e0bfb revert hud visual feedback demo 2026-08-04 15:14:08 +08:00
True Zhuanjia ed8a246bad hud visual feedback demo 2026-08-04 09:30:39 +08:00
True Zhuanjia cfb8946ac3 widget label fix 2026-08-03 14:20:12 +08:00
True Zhuanjia 660a015f8b minor tweak and fixes 2026-08-03 11:10:30 +08:00
True Zhuanjia 54ac7f6522 minor fixes for controller navigation 2026-08-02 17:54:28 +08:00
True Zhuanjia a01af9ee21 refresh partial settings update flag 2026-08-02 00:23:51 +08:00
True Zhuanjia 71b7634069 refresh profileSelector tip update flag 2026-08-02 00:00:58 +08:00
True Zhuanjia 32718071e0 set widget profile update flag 2026-08-01 22:51:46 +08:00
True Zhuanjia 30d602af29 update ui string 2026-08-01 22:36:17 +08:00
True Zhuanjia f0043a763b new Tips for users 2026-08-01 21:09:02 +08:00
True Zhuanjia 516648cf34 on screen widget sublabel 2026-08-01 16:04:30 +08:00
True Zhuanjia 5bd9c6bd98 generic improvements & fixes 2026-07-31 22:13:13 +08:00
True Zhuanjia 3d82009d4a minor change 2026-07-31 00:05:40 +08:00
True Zhuanjia 51c13faa0c pencil tip offset 2026-07-30 23:22:50 +08:00
True Zhuanjia e0aff4b532 - genshin touch control enhancement preview for settings menu
- controller navigation & first connection tips
- enhancedTouchPreview bug fix
2026-07-30 14:14:33 +08:00
True Zhuanjia b0c16922a2 controller navigation improvements and fixes 2026-07-30 01:05:51 +08:00
True Zhuanjia ef5d839f5e refactor profileSelector view 2026-07-29 18:01:33 +08:00
True Zhuanjia 4a3ca7774e refactor toolboxView 2026-07-28 17:56:12 +08:00
True Zhuanjia 8f93cce257 change default settings for controller mouse mode 2026-07-27 21:42:29 +08:00
True Zhuanjia 9a634da3ed - feat: global controller navigation
- shorten initial host detection
2026-07-26 16:07:03 +08:00
True Zhuanjia 6460036661 update aboutView 2026-07-07 16:35:58 +08:00
True Zhuanjia c968a1df2a - controller navigation preparations
- disable tilt button for pencil
- widget picker UI improvement & fixes
- allow triggers to be controller mouse buttons
2026-07-07 16:13:46 +08:00
True Zhuanjia 54c106e01e radial menu demo 2026-07-01 15:20:57 +08:00
True Zhuanjia 41a5855211 minor fixes 2026-06-23 12:19:14 +08:00
True Zhuanjia 2652c2a99b set default dark theme for iOS 13 2026-06-23 11:00:09 +08:00
True Zhuanjia e987965765 tweak widget templates 2026-06-23 00:48:36 +08:00
True Zhuanjia a7d7a7975f fixed pencil touch for absoluteTouch 2026-06-22 22:12:15 +08:00
True Zhuanjia c79929f37e iap minor fix 2026-06-22 17:34:56 +08:00
True Zhuanjia d286c8b073 update widget templates 2026-06-22 14:32:37 +08:00
True Zhuanjia 2cef75fb32 localization fixes 2026-06-22 12:35:07 +08:00
True Zhuanjia ca17c1cc66 - handle iap purchase on app launch
- localization fix
- iap workflow fixes
2026-06-22 12:30:17 +08:00
True Zhuanjia 98e8305c94 update ui string 2026-06-22 01:04:05 +08:00
True Zhuanjia 45ccfa0c7f Merge branch 'IAPImrovements' into Integration
# Conflicts:
#	VoidLink/Localization/Localizable.xcstrings
xiap button for aboutView
2026-06-22 00:57:49 +08:00
True Zhuanjia 7d7b909c66 iap button for aboutView 2026-06-22 00:56:28 +08:00
True Zhuanjia d6c1059e99 improved iap workflow 2026-06-22 00:53:01 +08:00
True Zhuanjia 9c43e39ffb UI bug fix for game profile selector 2026-06-21 15:49:51 +08:00
True Zhuanjia adb5091dc2 improved motion control 2026-06-21 15:29:40 +08:00
True Zhuanjia 7d3c2d93ac add support for purchase intents 2026-06-20 22:56:04 +08:00
True Zhuanjia f4b161ed06 Set correct default mouse cursor mode 2026-06-20 16:03:14 +08:00
True Zhuanjia d57334265b improved motion control 2026-06-19 16:32:34 +08:00
True Zhuanjia f7efa48ae8 fixed: folder expansion compatibility issue on low versions of iOS 2026-06-17 00:58:21 +08:00
True Zhuanjia deb335efc3 auto restore for docked folder when app becomes active 2026-06-14 18:33:17 +08:00
True Zhuanjia f039f5af29 update aboutView 2026-06-14 14:17:07 +08:00
True Zhuanjia 286b5e94e6 fixed: undoRelocation not working for widget just collected by folder button 2026-06-14 13:00:29 +08:00
True Zhuanjia 1a719e11e6 - tweak widget templates
- minor improvements & fixes
2026-06-08 01:16:00 +08:00
True Zhuanjia becfc596c1 minor improvement & fixes 2026-06-07 13:24:09 +08:00
True Zhuanjia 1b76d0e0a6 - update tip message strings
- folder widget collection fixes
2026-06-06 22:09:48 +08:00
True Zhuanjia 53209ce89e - update default widget template with profile name localized
- improve widget import
2026-06-06 20:07:01 +08:00
True Zhuanjia 384724ff27 refactor oscprofilemanager to swift 2026-06-05 21:48:57 +08:00
True Zhuanjia e2eccd7968 - tweak widget templates
- multiple on-screen widget tweaks and improvements
2026-06-05 16:58:51 +08:00
True Zhuanjia f762ecc3b2 detailed definitions for connection termination errors 2026-06-05 16:53:40 +08:00
True Zhuanjia fa0b864933 - layout tool improvement: handles subfolder visibility in edit tool
- tweak iPad widget template
2026-05-31 14:00:44 +08:00
True Zhuanjia e0f3921a75 - template file update
- minor fixes
2026-05-31 02:11:30 +08:00
True Zhuanjia f698ad2fb6 default template update flag 2026-05-30 21:36:14 +08:00
True Zhuanjia a0179cc6cc new widget template demo 2026-05-30 19:28:37 +08:00
True Zhuanjia 511e7c0e4b folder widget & autodock improvement and fixes 2026-05-30 17:42:15 +08:00
True Zhuanjia e734973be1 widget layout tool fixes 2026-05-30 11:05:30 +08:00
True Zhuanjia 9979408b1a folder behavior minor fixes 2026-05-28 21:04:43 +08:00
True Zhuanjia a5388bb60d revert default mouse cursor mode to "captured" 2026-05-28 16:44:51 +08:00
True Zhuanjia 4c32ec59d6 tweak button sliding 2026-05-28 16:33:50 +08:00
True Zhuanjia af1f0e75c7 more preparations for new widget template 2026-05-28 14:21:02 +08:00
True Zhuanjia 3aa7a90a2f string localization for new default widget template 2026-05-28 11:59:40 +08:00
True Zhuanjia ec956218fd add entries to shortcut lib 2026-05-27 17:46:12 +08:00
True Zhuanjia 02fcdcecea shortcut library for widget picker 2026-05-27 13:01:12 +08:00
True Zhuanjia 3575e84165 tweak functional tab of widget picker view 2026-05-27 10:59:11 +08:00
True Zhuanjia 90116e7ff6 folder behavior improvement 2026-05-27 10:17:39 +08:00
True Zhuanjia ffe48a5382 deprecate NativeTouchOnly mode 2026-05-26 16:17:52 +08:00
True Zhuanjia c4ddc0c4fc minor fixes for absolute touch mode 2026-05-26 15:05:10 +08:00
True Zhuanjia 23299ad73d folder widget fixes 2026-05-26 13:20:30 +08:00
True Zhuanjia accd07f808 minor fix for pencil handler 2026-05-25 12:13:22 +08:00
True Zhuanjia ed39f85508 - c-module update
- minor fixes
2026-05-22 02:35:34 +08:00
True Zhuanjia e8349b2a6f update ui string 2026-05-21 20:37:17 +08:00
True Zhuanjia c36051fffc improve widget alignment 2026-05-21 20:31:54 +08:00
True Zhuanjia 5f4fe6a040 widget layering fixes 2026-05-21 19:44:28 +08:00
True Zhuanjia 843570dbca feat: on-screen button auto tap repeats 2026-05-21 17:54:29 +08:00
True Zhuanjia bb44b2067e 4*16 widget pool grid for button macro 2026-05-21 16:05:57 +08:00
True Zhuanjia 2c2088e4b1 - button widget skill combo enhanced to macro
- widget picker view UI fixes
2026-05-21 14:18:50 +08:00
True Zhuanjia a7088c70e5 app launch background color 2026-05-20 10:13:36 +08:00
True Zhuanjia 091fd828ab widget layout tool layering fix 2026-05-20 02:14:43 +08:00
True Zhuanjia d168ffbd5a minor fix 2026-05-20 01:15:05 +08:00
True Zhuanjia 0af4c70e16 - walk-sprint sign for direction pad
- session launch UI & animation fixes
2026-05-20 00:59:34 +08:00
True Zhuanjia e402c17fa6 adopted qiin2333's network related common-c commits 2026-05-19 15:39:23 +08:00
True Zhuanjia ab9b2509ff allow reversed input for motion control channels 2026-05-19 13:35:12 +08:00
True Zhuanjia 535d6009ad controller report issue fixes 2026-05-19 11:23:30 +08:00
True Zhuanjia 09981df37e - mic audio encryption for sunshine-foundation
- merge c-module updates from upstream
2026-05-18 22:12:26 +08:00
True Zhuanjia f7eae4cee9 controller report issue 2026-05-18 11:19:10 +08:00
True Zhuanjia ab14e18b4a folder expansion fix 2026-05-17 21:40:24 +08:00
True Zhuanjia 1630f7987a home indicator interaction fix 2026-05-16 22:45:45 +08:00
True Zhuanjia 5a9bcab368 Merge branch 'fix/resolution_change_stretch' into Integration 2026-05-14 14:58:08 +08:00
True Zhuanjia f7b118b671 tip string fixes 2026-05-14 00:24:48 +08:00
True Zhuanjia b49f4a6891 update default widget profiles 2026-05-13 22:52:11 +08:00
True Zhuanjia 3fd0c1b397 update ui string 2026-05-13 20:41:43 +08:00
True Zhuanjia 9282c3f404 touch mode change tip 2026-05-13 20:16:00 +08:00
True Zhuanjia ef3fca754f minor fixes 2026-05-13 17:25:35 +08:00
True Zhuanjia c08bb232cd layout tool batch edit improvement and tips 2026-05-13 17:04:19 +08:00
True Zhuanjia 2d1a1573e1 folder alpha tweak bug fixes 2026-05-13 16:23:43 +08:00
True Zhuanjia 92b65b4a17 update ui tip string 2026-05-13 15:56:35 +08:00
True Zhuanjia f72e0f6292 - valid & invalid button mode tips
- widget panel tips
2026-05-13 15:45:25 +08:00
True Zhuanjia 57a8c22a3f minor improvements 2026-05-12 22:09:03 +08:00
True Zhuanjia 4195f97d56 widget layout tool minor improvements 2026-05-12 20:46:28 +08:00
True Zhuanjia c734030e87 widget resize improvement 2026-05-12 19:09:44 +08:00
True Zhuanjia 96d997d41e button widget batch resize 2026-05-12 17:09:14 +08:00
True Zhuanjia 023cc0b583 highlight touchpad widget border during resizing 2026-05-12 16:20:53 +08:00
True Zhuanjia 57dac128e2 globe as escape switch 2026-05-12 11:56:15 +08:00
True Zhuanjia 77e0048c57 more tips for on screen widgets 2026-05-11 22:57:47 +08:00
True Zhuanjia fe6954cb9c tips for first keyboard or mouse connection on iOS 2026-05-11 16:32:17 +08:00
True Zhuanjia 237f03a501 streamview bug fixes 2026-05-11 12:43:45 +08:00
True Zhuanjia 94f61ebf0c shortcut button triggering fix 2026-05-09 19:42:25 +08:00
True Zhuanjia c3a0004c68 add lsvpad 2026-05-08 21:49:09 +08:00
True Zhuanjia d7aa5cc9fc improved displacement based stick pads 2026-05-08 21:05:03 +08:00
True Zhuanjia 26c1d068a8 inertial scrolling for displacement based stickpads 2026-05-05 23:54:54 +08:00
True Zhuanjia 35ceebfe0d - update default widget template
- change default button action for mousepad
- minor fixes
2026-05-01 00:21:55 +08:00
True Zhuanjia 5daf158908 update widget localization strings 2026-04-30 01:24:15 +08:00
True Zhuanjia 8f12a4f598 minor tweak 2026-04-29 22:17:44 +08:00
True Zhuanjia 233a23c6c8 refactor touchMode to game profile 2026-04-29 22:01:18 +08:00
True Zhuanjia cf48d4d7c3 new widget, magnifier 2026-04-29 18:43:06 +08:00
True Zhuanjia 5bf8eeb873 widget picker view ui string update 2026-04-29 10:48:11 +08:00
True Zhuanjia 8f5d58a25c minor fix 2026-04-29 00:07:44 +08:00
True Zhuanjia 363b91b244 folder import fixes 2026-04-28 23:52:14 +08:00
True Zhuanjia efc34ae1fc mac desktop experience fixes & tips 2026-04-28 17:09:33 +08:00
True Zhuanjia 9e858520c8 tweak touchHandler 2026-04-28 15:04:54 +08:00
True Zhuanjia 20aba200b3 new touchpad widget: absolute mousepad 2026-04-28 14:25:25 +08:00
True Zhuanjia cb235d9255 tweak inputAccessoryBar 2026-04-28 10:21:06 +08:00
True Zhuanjia b0224d502a button-combo available for folder 2026-04-27 23:15:08 +08:00
True Zhuanjia ce67aefc3b motion control for external gamepad 2026-04-27 16:23:45 +08:00
True Zhuanjia e8d864ff66 soft keyboard fixes 2026-04-26 21:40:24 +08:00
True Zhuanjia 9e2ef6cc0d audio resume fix 2026-04-26 19:38:34 +08:00
True Zhuanjia 9d2df484d1 make inputAccessoryBar delete button easier to tap 2026-04-26 17:36:35 +08:00
True Zhuanjia d28573dcd4 widgetPickerView logic fix 2026-04-26 17:20:22 +08:00
True Zhuanjia c3cb31d443 widgetPicker view compatibility fixes for low iOS versions 2026-04-26 16:42:15 +08:00
True Zhuanjia b258c58d59 soft keyboard activation fix 2026-04-24 23:37:34 +08:00
True Zhuanjia d8e83d1704 Merge branch 'Integration' into inputAccessoryBar
# Conflicts:
#	VoidLink/Utility/GenericUtils.swift
2026-04-24 23:27:21 +08:00
True Zhuanjia e78a351c28 inputAccessoryBar for soft keyboard 2026-04-24 22:59:37 +08:00
True Zhuanjia 5ee443337c autoDock and gesture interaction fixes 2026-04-23 17:09:53 +08:00
True Zhuanjia 4dc96ba189 widget alpha tweak fix 2026-04-23 15:14:33 +08:00
True Zhuanjia ecacb1afa7 lower iOS compatibility fixes 2026-04-22 23:53:19 +08:00
True Zhuanjia 7e21292a62 game profile system & selector 2026-04-22 12:46:51 +08:00
True Zhuanjia 9104a7b7b9 GUI command picker for toolbox menu 2026-04-16 17:31:49 +08:00
True Zhuanjia ecc7a79a8c layout profile table improvements 2026-04-16 16:03:52 +08:00
True Zhuanjia a1a70fcca2 - tool box menu improvements
- autoDock improvements
- live gamepad overlay close button
2026-04-16 14:31:21 +08:00
True Zhuanjia d769c98e22 layout tool ui fixes 2026-04-15 14:15:39 +08:00
True Zhuanjia ce59a9eb05 auto dock fixes 2026-04-14 17:16:11 +08:00
True Zhuanjia b2984e0af5 Stop tracking .DS_Store files 2026-04-14 15:56:52 +08:00
True Zhuanjia bed2232aff widget template update 2026-04-14 15:46:31 +08:00
True Zhuanjia e87f0f1aa0 system audio playback fix 2026-04-14 14:46:18 +08:00
True Zhuanjia 9807a77d9b gamepad overlay crash fix 2026-04-14 11:08:59 +08:00
True Zhuanjia 3e1423ff46 multi gamepad input fixes 2026-04-14 10:45:50 +08:00
True Zhuanjia a4f805db26 audio playback fixes 2026-04-14 09:48:11 +08:00
True Zhuanjia 0195aeb765 Revert "audio playback improvement"
This reverts commit 46834a8a8b.
2026-04-14 08:43:13 +08:00
True Zhuanjia fcfe83572f autoDock fixes 2026-04-13 18:16:37 +08:00
True Zhuanjia d61942caec TF widget template fix 2026-04-13 12:51:46 +08:00
True Zhuanjia 515360166c ui string fixes 2026-04-13 12:44:22 +08:00
True Zhuanjia 5c5507b02f update ui string 2026-04-13 11:05:35 +08:00
True Zhuanjia 7e0d2af5b7 - update widget templates
- minor fixes
2026-04-13 09:44:55 +08:00
True Zhuanjia 780a0e7ab8 - update widget tempates
- minor fixes
2026-04-13 01:58:57 +08:00
True Zhuanjia 9359333b15 widget batch edit fix 2026-04-12 22:40:21 +08:00
True Zhuanjia 819aa436e8 iOS 12 app crash fixes 2026-04-12 22:03:47 +08:00
True Zhuanjia 5beee0ffe4 update UI string 2026-04-12 20:48:03 +08:00
True Zhuanjia 30aa9a6b8d - update UI string
- minor improvements
2026-04-12 20:03:06 +08:00
True Zhuanjia 7e088acd49 dpad improvements 2026-04-12 19:23:47 +08:00
True Zhuanjia f702f726b7 - functional button fixes
- tweak auto dock animation
- input fixes
2026-04-11 14:34:54 +08:00
True Zhuanjia 46834a8a8b audio playback improvement 2026-04-10 23:35:21 +08:00
True Zhuanjia ca69fd62d9 persist pickerView tab selection 2026-04-10 23:25:46 +08:00
True Zhuanjia 8fd43d47dd more functional buttons 2026-04-10 21:34:14 +08:00
True Zhuanjia 732ec9a9cd widget picker fix 2026-04-10 19:19:22 +08:00
True Zhuanjia a0d1982a14 autoDock & toolbox gesture fixes 2026-04-10 17:05:04 +08:00
True Zhuanjia bb63183a51 update copyrights 2026-04-10 10:13:19 +08:00
True Zhuanjia 707beddcae refactor target and scheme names 2026-04-09 16:06:15 +08:00
True Zhuanjia c4c896e43e live gamepad overlay tip fix 2026-04-09 11:48:35 +08:00
True Zhuanjia e2acf5ac4b disable toolbox menu gesture 2026-04-08 20:03:27 +08:00
True Zhuanjia fcecae3a87 - update default Templates
- make RsWheel available
2026-04-08 11:56:05 +08:00
True Zhuanjia 55a2bb7576 disable soft keyboard tap gesture by default 2026-04-08 02:38:10 +08:00
True Zhuanjia 6b085982f1 cancel tap gesture for widget layout tool 2026-04-08 02:25:57 +08:00
True Zhuanjia 94f1c625be update default widget templates 2026-04-08 02:15:07 +08:00
True Zhuanjia b0842ea4dc autoDock fixes 2026-04-08 00:21:55 +08:00
True Zhuanjia 49431b5eba - widget template editing code
- widgetPickerView fixes
2026-04-08 00:07:13 +08:00
True Zhuanjia 68ee5d879b minor changes 2026-04-07 21:43:14 +08:00
True Zhuanjia 984a1acd48 turn on live feedback overlay on controller arrival 2026-04-07 19:49:07 +08:00
True Zhuanjia 00b06b7b70 - update ui string
- improve autodock
2026-04-07 15:09:30 +08:00
True Zhuanjia 84adf3ac95 command picker for drawing toolkit 2026-04-07 14:35:06 +08:00
True Zhuanjia 9cd72271ca minor fixes 2026-04-06 23:58:49 +08:00
True Zhuanjia e71ce58d9b enable on-screen widget by default 2026-04-06 23:22:07 +08:00
True Zhuanjia eb03b055ea folder button auto dock 2026-04-06 23:07:43 +08:00
True Zhuanjia 5af39e8fb6 gamepad live feedback overlay 2026-04-06 01:19:44 +08:00
Acaki b12cb96416 fix: video streatched when changing resolution in stream 2026-04-04 17:02:52 +08:00
True Zhuanjia 7f4108c4e3 minor fix 2026-04-04 03:25:35 +08:00
True Zhuanjia be48a48704 bulk edit stacks fix 2026-04-04 02:53:06 +08:00
True Zhuanjia 88bc5c7551 minor fixes 2026-04-04 01:19:18 +08:00
True Zhuanjia 7cd857a38b highlight color fixes 2026-04-04 00:43:38 +08:00
True Zhuanjia 60e92c458e - widget bulk edit, clear, import
- refactor coding
2026-04-03 22:14:05 +08:00
True Zhuanjia 605f276a71 widget picker bug fixes 2026-04-02 10:33:28 +08:00
True Zhuanjia 210ca4190a refactor coding 2026-04-02 10:23:16 +08:00
True Zhuanjia bd2d9c05bc gui widgetPicker 2026-04-02 06:51:33 +08:00
True Zhuanjia ae526ecddf fixed: soft keyboard brought up by iOS26 system-level action 2026-03-23 12:22:56 +08:00
True Zhuanjia 37d7949304 widget profile template update 2026-03-22 15:29:22 +08:00
True Zhuanjia 6092839004 folder button bulk move fix 2026-03-22 15:02:53 +08:00
True Zhuanjia 31dc13b87d minor change 2026-03-22 14:10:42 +08:00
True Zhuanjia dbe91f5b07 widget layout tool improvements 2026-03-22 14:01:09 +08:00
True Zhuanjia d092b93a29 - allow wider size range for on-screen widgets
- minor improvements
2026-03-22 11:21:51 +08:00
True Zhuanjia eff35450f6 feat: folder button bulk move 2026-03-22 00:32:48 +08:00
True Zhuanjia 6204feefc0 feat: on-screen button "DisableTouch" 2026-03-21 22:06:40 +08:00
True Zhuanjia 924374bccd Merge branch 'keyboardHeight' into Integration 2026-03-21 19:45:35 +08:00
True Zhuanjia eac8d15240 feat: designate soft keyboard height manually 2026-03-21 19:45:21 +08:00
True Zhuanjia a55d840bce minor tweak for pencilHandler 2026-03-21 17:06:45 +08:00
True Zhuanjia 22aa0a5249 tweak curve view UI 2026-03-21 13:27:45 +08:00
True Zhuanjia c3358efa9d undo last move button for pressure curve tool 2026-03-21 13:13:39 +08:00
True Zhuanjia e59f3ba1ab stroke start equalization and filtering 2026-03-21 12:43:16 +08:00
True Zhuanjia 42f29074fa block keyboard action initiated by physical gamepad for iOS 26 2026-03-16 16:25:46 +08:00
True Zhuanjia 6299401286 enable liquid glass 2026-03-15 11:44:16 +08:00
True Zhuanjia deba65857d Merge branch 'iOS26UI' into Integration 2026-03-15 11:43:36 +08:00
True Zhuanjia 691aa9c899 liquid glass for soft keyboard toolbar 2026-03-15 11:43:20 +08:00
True Zhuanjia bd9dccd834 Merge branch 'iOS26UI' into Integration 2026-03-14 14:15:28 +08:00
True Zhuanjia 0dd419a5a3 tweak toolbox view 2026-03-14 14:15:16 +08:00
True Zhuanjia 2410222c19 Merge branch 'iOS26UI' into Integration 2026-03-14 11:50:48 +08:00
True Zhuanjia 1269c46f56 UI improvements: widget profile selector table 2026-03-14 11:50:07 +08:00
True Zhuanjia 2c787a8d77 Merge branch 'iOS26UI' into Integration 2026-03-12 19:46:26 +08:00
True Zhuanjia 92fca9bca1 try to fix app crash caused by host discovery 2026-03-12 19:44:13 +08:00
True Zhuanjia f8badd51c5 deal with osw profile selector table navigation bar 2026-03-12 18:10:39 +08:00
True Zhuanjia ed8bf5af9e deal with separator color 2026-03-12 16:45:50 +08:00
True Zhuanjia b2521de84e refactor themeManager 2026-03-12 16:15:52 +08:00
True Zhuanjia 4dd1aad123 Merge branch 'iOS26UI' into Integration 2026-03-12 10:19:47 +08:00
True Zhuanjia 165b5e6638 tweak settings menu navigation bar height 2026-03-12 10:19:08 +08:00
True Zhuanjia d8ac06ddca dummy commit 2026-03-12 09:56:39 +08:00
True Zhuanjia e742466409 app view and app view navigation bar 2026-03-12 09:54:11 +08:00
True Zhuanjia 201bf5b447 liquid glass: settings menu navigation bar 2026-03-11 22:26:50 +08:00
True Zhuanjia 7bed913a1e Merge branch 'Integration' into iOS26UI 2026-03-11 15:36:44 +08:00
True Zhuanjia e067fd8fa2 tweak menu section header 2026-03-09 12:09:06 +08:00
True Zhuanjia ba7d5feb81 enable liquid glass 2026-03-07 10:12:14 +08:00
True Zhuanjia 4a9e7ad2a1 iOS26 UI adaption: host view navigation bar 2026-03-07 10:08:17 +08:00
True Zhuanjia 4b56a44a47 UI improvements 2026-03-06 17:29:38 +08:00
True Zhuanjia bc98b43de2 secure folder unfolding fix at the end of animation 2026-03-05 19:39:28 +08:00
True Zhuanjia 16b3df5279 fixed: unexpected triggering of buttons collected by folder 2026-03-05 15:11:15 +08:00
True Zhuanjia d202f2f6e3 - remove auto codec option
- set default codec to HEVC
2026-03-05 11:10:46 +08:00
True Zhuanjia 142474eac8 - fixed: widget layout broken by windowing, entering background, orientationChange+PiP 2026-03-04 22:58:20 +08:00
True Zhuanjia acc89dba39 enable track point for onscreen widget edit mode 2026-03-04 13:06:22 +08:00
True Zhuanjia 8cd366d2cd update UI string 2026-02-28 18:44:24 +08:00
True Zhuanjia 2d67c1b22b update UI string 2026-02-28 12:30:32 +08:00
True Zhuanjia 77b0ef55c9 UI string update 2026-02-28 10:44:49 +08:00
True Zhuanjia d76f404a4c UI tip update 2026-02-27 00:48:46 +08:00
True Zhuanjia d0b45a019f minor fixes 2026-02-27 00:08:28 +08:00
True Zhuanjia 0728e999eb - add necessary UI tips
- restore "view all apps" for host card
- minor fixes
2026-02-26 22:32:37 +08:00
True Zhuanjia f325e9a206 default setting update 2026-02-26 18:39:16 +08:00
True Zhuanjia 49b03e65b2 feat: hover mode selector 2026-02-26 17:18:21 +08:00
True Zhuanjia 2bc18e2f02 add disable hovering switch 2026-02-26 00:29:57 +08:00
True Zhuanjia dadb292676 handle hovering automatically 2026-02-25 22:06:09 +08:00
True Zhuanjia 2c9902ce77 feat: auto hover 2026-02-25 00:38:24 +08:00
True Zhuanjia 6d36219e88 - fixed: unable to setup updated pressure curve mapping after switching widget profile during streaming 2026-02-24 19:47:20 +08:00
True Zhuanjia 470862dbe0 - fixed: unable to setup updated pressure curve mapping during streaming
- flexible pressure curve start point
- larger pressure curve view
2026-02-24 16:49:31 +08:00
True Zhuanjia f6017824ee default settings update 2026-02-24 00:32:35 +08:00
True Zhuanjia adeb77cf65 fixed cursor flickering on host 2026-02-23 22:57:46 +08:00
True Zhuanjia 9bc080815a update copyright 2026-02-23 20:48:25 +08:00
True Zhuanjia d03eebb5ba default settings update 2026-02-23 20:24:17 +08:00
True Zhuanjia ca453d8059 - tweak setting stack sequence
- auto set fullColorRangeSwitch
2026-02-23 19:37:17 +08:00
True Zhuanjia cb8126d201 UI fixes 2026-02-19 14:51:10 +08:00
True Zhuanjia 1626f30bb6 lowest latency option of queueSize slider 2026-02-19 13:23:30 +08:00
True Zhuanjia 47b5ec2678 default setting update flag 2026-02-19 01:39:18 +08:00
True Zhuanjia ccd032834d - restore asyncDequeue switch
- tweak frame buffering
2026-02-19 01:31:55 +08:00
True Zhuanjia c7ffd51cec pencil pro widget template import changes 2026-02-18 13:01:08 +08:00
True Zhuanjia 38f8c50d7f native touch track point fix 2026-02-18 08:44:56 +08:00
True Zhuanjia fd653b87af allow sdr workaround on av1 2026-02-18 07:59:52 +08:00
True Zhuanjia 9bf02e477b UI string update 2026-02-14 19:59:55 +08:00
True Zhuanjia 4440c668f1 revert pencil force tweak 2026-02-14 13:55:53 +08:00
True Zhuanjia 63d5417a2c widget profile accessibility 2026-02-14 12:43:31 +08:00
True Zhuanjia 28d9a0faf2 update aboutView 2026-02-14 02:07:28 +08:00
True Zhuanjia 04845df09c enable onscreen widget for pencil pro pack 2026-02-14 01:01:48 +08:00
True Zhuanjia 85df511a23 pencil pro widget profile 2026-02-14 00:14:25 +08:00
True Zhuanjia 4ecb8bfede - fixed: onscreen widget level
- flush frames when entering background
2026-02-13 23:51:31 +08:00
True Zhuanjia 6008865a41 functional button rule update 2026-02-13 23:19:10 +08:00
True Zhuanjia 02926b2c6b widget profile localization 2026-02-13 22:55:00 +08:00
True Zhuanjia 49c5fd308e button sliding fix 2026-02-13 21:31:05 +08:00
True Zhuanjia 7eeff3bc35 hide queueSize stack during streaming 2026-02-13 14:30:25 +08:00
True Zhuanjia 6e99889681 update profile template binaries 2026-02-13 14:19:47 +08:00
True Zhuanjia 8cbd09fe9a update default profile localization 2026-02-12 23:42:36 +08:00
True Zhuanjia edc703c534 allow default profile overwritten by stream view changes 2026-02-12 23:24:35 +08:00
True Zhuanjia f85d545c17 slid&Hold folder stream view guideline 2026-02-12 23:12:23 +08:00
True Zhuanjia 0830173e59 - double tap to make slid&Hold folder movable
- folder state restore improvements
- default profile location ready
2026-02-12 22:54:20 +08:00
True Zhuanjia 0e21e3a9ed Merge commit 'a9ede7a904b1fed1984c28803cf179b41ed257f6' into Integration 2026-02-12 16:03:27 +08:00
True Zhuanjia 6356427454 enable track point for all on screen widgets 2026-02-12 15:51:02 +08:00
True Zhuanjia 4dc6220f28 touch track point improvements 2026-02-12 15:33:43 +08:00
True Zhuanjia 03fcfaff28 sdr performance workaround fix 2026-02-12 14:04:42 +08:00
True Zhuanjia d5c96f77cb highlight touchpad widget while being folded & unfolded 2026-02-11 23:24:17 +08:00
True Zhuanjia bb6f2f0c0d feat: track point for native touch 2026-02-11 22:56:50 +08:00
True Zhuanjia 8d54ed9316 feat: on screen widget touch track point 2026-02-11 21:43:33 +08:00
True Zhuanjia 44123c74d9 crash fixes 2026-02-11 18:54:45 +08:00
True Zhuanjia fdf2548fe3 remove simple & complete legacy on screen controls 2026-02-11 17:04:00 +08:00
True Zhuanjia bee72bd854 - better widget profile update strategy
- feat: restore widget templates
2026-02-11 16:41:46 +08:00
True Zhuanjia 8ec8f32935 crash fixes 2026-02-11 15:00:23 +08:00
True Zhuanjia 1d33feec8b sdr performance workaround fix 2026-02-11 11:43:00 +08:00
True Zhuanjia 80af6a9636 movable button stream view guideline displayed without dragging & moving 2026-02-11 11:26:02 +08:00
True Zhuanjia 94eb4dd8a0 try to fix again:
fixed: squeeze shortcut keys can't be held down
2026-02-11 10:51:47 +08:00
True Zhuanjia d3ce55cbd6 hide sdr performance workaround stack during streaming 2026-02-10 20:16:59 +08:00
True Zhuanjia 0b942caa98 fixed: squeeze shortcut keys can't be held down 2026-02-10 20:12:15 +08:00
True Zhuanjia afc6289a56 - disable sdr performance workaround for av1
- UI string changes
2026-02-10 19:54:53 +08:00
True Zhuanjia 79684598ab learn more action for rendering backend tip 2026-02-10 17:17:35 +08:00
True Zhuanjia b901f2f506 UI string updates 2026-02-10 16:52:35 +08:00
True Zhuanjia 14294009f0 feat: pencil squeeze shortcut 2026-02-10 15:55:36 +08:00
True Zhuanjia adbebd23c8 temporarily disable pencil in-app-purchase for iOS14 and lower OS 2026-02-09 22:43:02 +08:00
True Zhuanjia 3973e13706 feat: disablePencilSlideGestureSwitch 2026-02-09 20:59:41 +08:00
True Zhuanjia e56e68dd6f external display mode settings menu UI string 2026-02-09 17:28:56 +08:00
True Zhuanjia c3fcff8d29 functional button fixes 2026-02-09 16:41:48 +08:00
True Zhuanjia 0152f48886 add mouseButton support for pencil side tap & toolbox menu 2026-02-09 16:19:42 +08:00
True Zhuanjia bbd2e37067 - rename:
balanced mode to standard,
performance mode to metal.

- renderer message text update & menu action fix
2026-02-09 14:50:59 +08:00
True Zhuanjia 8377b5062a default settings update 2026-02-09 09:50:59 +08:00
True Zhuanjia 086f1af974 runtime default setting update changes 2026-02-09 00:16:39 +08:00
True Zhuanjia 652e989927 frame queue tweaks 2026-02-08 23:52:07 +08:00
True Zhuanjia 5480e15595 resume video rendering when app returns from background in legacy pacing mode 2026-02-07 18:05:03 +08:00
True Zhuanjia 375670beb4 sdr performance workaround 2026-02-07 17:00:25 +08:00
True Zhuanjia fa164f0e02 - reduce pressure curve tool tips
- fixed crash in pressure curve tool drawing stage
- initial pencil move force tweak
- frame queue tweaks demo
2026-02-06 15:27:29 +08:00
True Zhuanjia a9ede7a904 fixed: touchPad double tap button not released 2026-02-03 16:13:00 +08:00
True Zhuanjia fa32d157ca load pencil section again 2026-02-02 15:52:48 +08:00
True Zhuanjia 10839f88d8 hide pencil section for 3.2.9 2026-02-02 15:06:51 +08:00
True Zhuanjia 8fa909dea8 tell apart regular & pencil TF 2026-02-02 12:54:59 +08:00
True Zhuanjia 94250624a8 fix renamed var 2026-02-02 11:59:16 +08:00
True Zhuanjia 6f264441ab Merge branch 'Integration' into stylus3
# Conflicts:
#	VoidLink/ViewControllers/StreamFrameViewController.m
2026-02-02 11:56:47 +08:00
True Zhuanjia 03cf463182 dummy event fix 2026-02-02 11:53:50 +08:00
True Zhuanjia 3e29501b23 safetimer for oc 2026-02-02 10:38:38 +08:00
True Zhuanjia 600b882929 restoring fold/unfold states 2026-02-01 16:02:57 +08:00
True Zhuanjia be69af925a folder button minor improvements 2026-02-01 11:26:39 +08:00
True Zhuanjia d14ee640c5 - exclusive folder fix
- other minor fixes
2026-02-01 10:20:12 +08:00
True Zhuanjia ac6c688054 feat: "folder" onscreen button 2026-01-31 20:59:24 +08:00
True Zhuanjia 8f8e86ab4f - on screen button “folder” prototype
- overlapped buttons triggered at touch began
- memory management fixes
- reduce toolbox view & widget layout tool animation
- fast widget profile loading
- toolbox & widget profile selector quick dismiss
2026-01-29 10:06:04 +08:00
True Zhuanjia ab1d6bfa90 storekit2 in app purchase implementation 2026-01-14 20:47:29 +08:00
True Zhuanjia e038601b37 host info updated tip 2026-01-14 10:41:20 +08:00
TrueZhuanjia 008beb9444 Merge branch 'Integration' into stylus3 2026-01-09 11:21:25 +08:00
TrueZhuanjia 835d9c9ef6 fixed: unable to display ipv6 address correctly by long pressing host card view 2026-01-09 11:19:32 +08:00
TrueZhuanjia e29e5bd650 fixed: app crash caused by detecting hosts with alternative IPs 2026-01-09 10:48:24 +08:00
TrueZhuanjia fecdbec31c fixed: unable to save pressure curve to oscProfile in certain cases 2026-01-08 20:28:18 +08:00
TrueZhuanjia 66fdb607d8 Merge branch 'Integration' into stylus3 2026-01-08 18:26:21 +08:00
TrueZhuanjia 6d4f192cbe pressure curve implementation 2026-01-08 16:51:41 +08:00
TrueZhuanjia 4a59af7c20 fixed: app crash caused by controller button string utility 2026-01-07 10:50:12 +08:00
TrueZhuanjia 156b363049 Merge branch 'Integration' into stylus3 2025-12-31 10:55:51 +08:00
TrueZhuanjia c68540c169 allow touchpad widget border width to be zero 2025-12-31 10:08:32 +08:00
TrueZhuanjia f89372e265 Merge branch 'Integration' into stylus3 2025-12-29 17:26:59 +08:00
TrueZhuanjia c134dffec2 turn off unnecessary logs 2025-12-29 16:43:28 +08:00
TrueZhuanjia c2d4527d7e separate X & Y decelerationRate slider 2025-12-29 16:41:07 +08:00
TrueZhuanjia 2071b89d18 new preset on-screen widget profiles 20251229 2025-12-29 16:34:29 +08:00
TrueZhuanjia 46902afdc4 tweak wasdPad center icon 2025-12-29 14:48:33 +08:00
TrueZhuanjia d23e640977 minor fixes 2025-12-28 22:30:40 +08:00
TrueZhuanjia 9c18ab4142 prewarm soft keyboard on app launch 2025-12-28 22:19:30 +08:00
TrueZhuanjia 22e270c4df improve on-screen touchPad stroke 2025-12-28 22:09:15 +08:00
TrueZhuanjia 16bd288e70 preset profile editing 2025-12-28 20:50:21 +08:00
TrueZhuanjia 39643153df Merge branch 'Integration' into stylus3 2025-12-27 20:44:19 +08:00
TrueZhuanjia 2cf9fdfd40 fixed: unable to send touchPad widget to bottom in streamview 2025-12-27 20:43:10 +08:00
TrueZhuanjia f5226562ae Merge branch 'Integration' into stylus3 2025-12-27 14:52:19 +08:00
TrueZhuanjia 32ad5d2f8a highlight border when moving on-screen widgets in layout tool 2025-12-27 14:41:23 +08:00
TrueZhuanjia 245f47f660 always send touchPad widgets to bottom 2025-12-27 14:32:41 +08:00
TrueZhuanjia 17e3fd07f9 quick double tap button for lsWheel/rsWheel 2025-12-27 14:15:51 +08:00
TrueZhuanjia cdbe480863 - directionPad improvements
- feat: highlight alpha tweak
2025-12-27 12:54:46 +08:00
TrueZhuanjia 189ad76f38 - change stroke style, use rounded font style for on-screen widget label 2025-12-26 20:33:21 +08:00
TrueZhuanjia d8528fdc81 - feat: new on-screen widget lsWheel/rsWheel, direction wheel for RPG games.
- feat: direct walkmode test for lsWheel/rsWheel
- feat: direction minimum offset test for all on-screen widgets, gyro->stick mapping & physical controller.
2025-12-26 16:17:55 +08:00
TrueZhuanjia c257a8cab0 Merge branch 'Integration' into stylus3 2025-12-23 01:35:46 +08:00
TrueZhuanjia 2912a3a5cb feat: multi-IP storage for host (tested with zeroTier) 2025-12-23 01:15:37 +08:00
TrueZhuanjia 75f1d4d392 restore content offset after settings menu being loaded for the first time 2025-12-22 15:35:46 +08:00
TrueZhuanjia a6159cc785 Merge branch 'Integration' into stylus3 2025-12-22 10:53:14 +08:00
TrueZhuanjia 38affb4981 add stereo(SDL) audio option 2025-12-22 10:51:33 +08:00
TrueZhuanjia e64090d88f feat: ability to resume mic redirection after a phone call 2025-12-20 20:19:08 +08:00
TrueZhuanjia ef60aeeead fixed: in stereo mode, audio playback can't be resumed after a phone call is ended 2025-12-19 22:27:05 +08:00
TrueZhuanjia 25112b2c27 Merge branch 'Integration' into stylus3 2025-12-13 20:40:57 +08:00
TrueZhuanjia c0b1326dbd fixed: unable to turn on-screen widget on/off during streaming 2025-12-13 20:39:43 +08:00
TrueZhuanjia f77e533dd6 Merge branch 'Integration' into stylus3 2025-12-12 23:47:47 +08:00
TrueZhuanjia 4b001f9366 vertical decelerationRate for inertial touchPads (trackball/LsvPad/RsvPad) 2025-12-12 23:28:19 +08:00
TrueZhuanjia 41eadce89a synthesize rsvPad inertia + gyro input convergently 2025-12-12 21:31:12 +08:00
TrueZhuanjia 46194a5aa0 fixed: tap to toggle button not release after being cleared
reload on-screen widgets only when necessary
2025-12-11 16:40:47 +08:00
TrueZhuanjia 3630880454 - fixed: mic redirection was enabled by default
- fixed: micHandler timer memory leak
- tweak touchPad scroll inertia
2025-12-10 10:38:42 +08:00
TrueZhuanjia a59ffacd3a Merge branch 'Integration' into stylus3 2025-12-09 22:50:45 +08:00
TrueZhuanjia 03817bcfd7 inertial scroll for touchpad gesture 2025-12-09 22:49:34 +08:00
TrueZhuanjia 2c4751bef9 Merge branch 'Integration' into stylus3 2025-12-09 16:40:58 +08:00
TrueZhuanjia 7caa778ff8 - fixed memory leaks caused by on-screen button auto-tap timer
- feat: Inertial RsvPad/LsvPad
2025-12-09 16:38:28 +08:00
TrueZhuanjia 3977d342ba disable pencil tick based on timestamp 2025-12-07 10:13:25 +08:00
TrueZhuanjia 4e83421104 on-screen button manual hover for low-end iPads 2025-12-06 11:22:19 +08:00
TrueZhuanjia adafacbf81 - feat: on-screen button "oscHome" 2025-12-05 10:28:08 +08:00
TrueZhuanjia 053893005b rename varialbles 2025-12-05 10:15:53 +08:00
TrueZhuanjia 838af88d64 minor change 2025-12-04 17:56:14 +08:00
TrueZhuanjia 573ed07b4f Merge branch 'Integration' into stylus3
full color range switch
2025-12-03 13:24:22 +08:00
TrueZhuanjia aad8673ff0 UI tweaks for full color range switch 2025-12-03 13:21:55 +08:00
TrueZhuanJia b6a58ea8ab Merge pull request #160 from Acaki/fix/Metal_AV1_SDR
Fix Metal AV1 SDR color range issue
2025-12-03 08:29:24 +08:00
TrueZhuanjia 8c7bf18b65 tweak touchUp delay 2025-12-02 22:09:00 +08:00
Acaki 3823c95582 feat: add toggle for full range and disable toggles for unsupported codecs 2025-12-02 21:26:09 +08:00
TrueZhuanjia ad0f3dca30 TF bundle ID 2025-12-02 20:36:21 +08:00
TrueZhuanjia 5248bbe9c3 default tickInterval to 1500 2025-12-02 17:39:52 +08:00
TrueZhuanjia 1262a7b41f advancedPencilSupport-demo1 2025-12-02 17:15:56 +08:00
Acaki 85611bcab5 refactor: request limited range for connection 2025-12-02 15:04:15 +08:00
Acaki 46b5d9522d refactor: force limited range for AV1 only 2025-12-02 02:40:03 +08:00
TrueZhuanjia 6dc9ee569b improve widget relocation 2025-12-01 19:16:25 +08:00
TrueZhuanjia 9916f64065 fixed: unable to move mouse cursor under touchpad mode or on mousepad widget when finger moves slowly 2025-12-01 18:51:58 +08:00
Acaki 0ad6b13fae feat: add keyboard shortcut to disconnect & quit app 2025-12-01 17:12:41 +08:00
Acaki 5bbdb76d21 fix: workaround for Metal AV1 darker image 2025-12-01 16:38:47 +08:00
TrueZhuanjia cbf42b1e52 - rounded shape stick boost compensation for physical, gyro mapped & onscreen stick inputs
- add setting stack tips
2025-11-27 22:35:58 +08:00
TrueZhuanjia 72867d855d - minimum offset slider for stick touchpads (rspad rsvpad lspad lsvpad)
- prevents edit button to update onscreen widgets to a different widget type (e.g. touchpad -> button)
2025-11-27 15:06:41 +08:00
TrueZhuanjia 7d5b984157 controller mouse stack info tag crash fix 2025-11-27 10:38:25 +08:00
TrueZhuanjia a3d5771b14 - unlcok motion control section
- controller gyro button stack refactored to motion control section, saved with osc (widget) profile
- feat: reverse gyro-hold button switch
- DS4 gyro activated by default if controller gyro button is disabled
-  synth physical stick input switch
2025-11-27 00:26:53 +08:00
TrueZhuanjia 1338b4fb85 synthesize physical stick input switch for built-in gyro motion control 2025-11-26 16:41:08 +08:00
TrueZhuanjia 379d965769 - feat: controller gyro button (toggle & hold)
- feat: synthesize physical stick input with gyro
2025-11-26 11:48:34 +08:00
TrueZhuanjia d7bc73250d localization fix 2025-11-24 13:07:35 +08:00
TrueZhuanjia 349daef47f UITouch vector util 2025-11-24 08:57:07 +08:00
TrueZhuanjia 138658c635 feat: map controller to mouse with self-defined sticks, buttons, curve expo, pointer velocity. 2025-11-23 13:57:52 +08:00
TrueZhuanjia e058839faf separated controller section in settings menu 2025-11-19 14:50:39 +08:00
TrueZhuanjia d4d5146f66 controller->mouse demo 2025-11-19 14:35:56 +08:00
TrueZhuanjia 85f4838067 fixed: gyro minimum stick offset slider doesn't work on iPad 2025-11-17 00:20:43 +08:00
TrueZhuanjia f23108a3ba fixed some app theme issues 2025-11-15 19:30:53 +08:00
TrueZhuanjia 1623fc34cf fixed: settings menu motion control section some times can't be expanded 2025-11-09 11:18:24 +08:00
TrueZhuanjia d244c9bd1f minor tweak for abs touch 2025-11-08 14:58:42 +08:00
TrueZhuanjia e53e997cd4 tweak favorite setting parentStack spacing 2025-11-08 12:04:30 +08:00
TrueZhuanjia 5c646ef3d2 - touchpad gesture tweaks and improvements
- cancel realtime switch for single point touch gesture passthrough
- cancel remembering settings menu content offset
2025-11-08 11:34:54 +08:00
TrueZhuanjia f01d36d4a0 minor changes 2025-11-08 03:18:09 +08:00
TrueZhuanjia 37fc7e2cb4 fix setting stack long press crash 2025-11-08 03:01:42 +08:00
TrueZhuanjia ea68353328 - optimize touch pad gesture
- relative touch minor fix
2025-11-08 00:42:26 +08:00
TrueZhuanjia da4bfb851c remove test code 2025-11-07 23:45:20 +08:00
TrueZhuanjia 6a1f85975f tweak touch pad gesture sensitivity 2025-11-07 23:41:50 +08:00
TrueZhuanjia 700552bd75 - fixes some UI memory leaks
- clear some obsolete codes
2025-11-07 23:21:53 +08:00
TrueZhuanjia 5750b99af3 - fixed: memory leak and UI stuck caused by MenuSenctionView
- feat: memorize content offset for settings menu
- optimize gesture passthrough for relative touch & absolute touch
- feat: passthroughGesturesSwitch, ctrlDownForPinchSwitch, leftClickDelaySlider, touchModeSelector2 in experimental section
2025-11-07 17:34:19 +08:00
TrueZhuanjia cc35e6b3a4 touchmode indicator for exprerimental section 2025-11-06 21:05:34 +08:00
TrueZhuanjia 3b4800eb78 - touchPad mode optimization 2025-11-06 20:36:09 +08:00
TrueZhuanjia a2855ef522 feat: touchPad gesture sensitivities 2025-11-06 20:19:06 +08:00
TrueZhuanjia 935406b75b - slide distance threshold slider for relative touch & "mousePad", that fixes mouse cursor jump 2025-11-06 16:36:48 +08:00
TrueZhuanjia e933c5de60 - enhanced relative touch (touchpad mode & "mousePad" widget) pointer accuracy
- touchpad gesture simulation for touchPad & single point mode
2025-11-06 11:52:13 +08:00
TrueZhuanjia a23a5491ae feat: functional button "AbsTchDrag" 2025-11-05 11:51:29 +08:00
TrueZhuanjia 1ad8f51b7a feat: widget "ABSMOUSE" 2025-11-05 08:59:39 +08:00
TrueZhuanjia 4d1619346d update c module for "ABSMOUSE" widget 2025-11-04 21:56:24 +08:00
TrueZhuanjia df8c273cb9 - feed integral for roll->left stick motion control
- feat: roll->left stick motion control multi-level sensitivity
2025-11-04 16:01:21 +08:00
TrueZhuanjia 6eca97b4aa fixed: default on-screen widget borderAlpha offset 2025-11-04 11:03:36 +08:00
TrueZhuanjia 39f8398b10 feat: on screen widget "discreteWheel" 2025-11-04 10:48:20 +08:00
TrueZhuanjia e32a356cb5 feat: optimized single point (absolute touch) for OSRS & regular use cases 2025-11-03 23:58:49 +08:00
TrueZhuanjia e0c556da10 feat: mute in background switch 2025-11-03 16:18:21 +08:00
TrueZhuanjia a3f9e07cf7 feat: duck other apps switch in audio section 2025-11-03 11:25:57 +08:00
TrueZhuanjia ff40e55cd1 feat: append mouse left click after touch up as an option for OSRS (Old School RuneScape) or similar games that requires double tap on touchscreen 2025-10-31 15:45:55 +08:00
TrueZhuanjia e548bda73a stereo to system audio engine, multi-channel audio to SDL 2025-10-30 21:35:27 +08:00
TrueZhuanjia cf11b06f3e multi-audioChannel test 2025-10-30 15:41:10 +08:00
TrueZhuanjia a799c39aff set "useBuiltinMic" to true by default 2025-10-29 09:59:06 +08:00
TrueZhuanjia ff230b3433 refactor audio engine init to Connection.m 2025-10-29 09:36:16 +08:00
TrueZhuanjia a9f4db52b5 audio session config test 2025-10-29 00:16:24 +08:00
TrueZhuanjia 071e2a764a feat: audio engine selector 2025-10-28 23:33:42 +08:00
TrueZhuanjia e050c914bb Merge branch 'systemAudioEngineTest' into Integration 2025-10-28 21:55:57 +08:00
TrueZhuanjia cd9ef74f3f add multi-channel audio support 2025-10-28 21:54:16 +08:00
TrueZhuanjia 644687a50c optimize direction pad haptic feedback 2025-10-28 20:24:48 +08:00
TrueZhuanjia e7132e3371 - feat: highlight size tweak
- fixed: legacy onscreen controls unavailable in touch disabled mode
2025-10-28 16:41:39 +08:00
TrueZhuanjia 7223ab3be5 cancel haptic feedback for legacy on-screen control direction pad 2025-10-28 08:47:04 +08:00
TrueZhuanjia 99952281cb fixed: legacy on-screen control layers pass through native touch events 2025-10-28 08:37:26 +08:00
TrueZhuanjia 9c518dfeb6 fixed: direction pad on-screen widgets losing haptic feedback on iPhone 2025-10-28 08:18:31 +08:00
TrueZhuanjia 28e2f13e87 test: replace SDL with system audio engine to support audio playing when screen is dimmed out 2025-10-27 17:12:45 +08:00
TrueZhuanjia 4a9e109de5 stop video render when app enters background without pip enabled for balanced mode 2025-10-25 13:57:36 +08:00
TrueZhuanjia f5b56ca67f Fixed: widget profile, widget tool entry doesn't work for single point touch 2025-10-22 11:43:26 +08:00
TrueZhuanjia b7ad4d3562 Fixed: on-screen widget default border alpha issue 2025-10-20 19:45:33 +08:00
TrueZhuanjia 94a8caa5df fixed: unable to typing non-ascii characters by default iOS soft keyboards 2025-10-20 15:56:45 +08:00
TrueZhuanjia b650ac0ca3 show soft keyboard toolbar by default 2025-10-20 11:50:05 +08:00
TrueZhuanjia 9dda594519 feat: on-screen widget border alpha tweak 2025-10-19 11:04:56 +08:00
TrueZhuanjia 0ea6248773 minor fix for settings menu 2025-10-19 00:14:45 +08:00
TrueZhuanjia fee003b824 feat: app theme selector 2025-10-18 23:30:40 +08:00
TrueZhuanjia cd415cc639 feat: setup autotap timer by text input instead of slider. 2025-10-18 19:14:21 +08:00
TrueZhuanjia 10ceac2ce3 feat: label alpha tweak for on-screen widgets 2025-10-17 20:39:06 +08:00
TrueZhuanjia 86a0ff46ee - dynamic update theme fix for safeAreaPadding on iPhone 2025-10-17 16:27:55 +08:00
TrueZhuanjia 3887ad0c4c - iOS 14 UI minor fix for settings menu 2025-10-17 15:02:02 +08:00
TrueZhuanjia 58f534fcc8 minor fix 2025-10-15 22:15:07 +08:00
TrueZhuanjia f8e14006c1 try to reduce on-screen widget performance overheads 2025-10-15 21:43:55 +08:00
TrueZhuanjia a959a346b0 fixed: motion control configs not loaded correctly from oscProfile 2025-10-15 09:53:28 +08:00
TrueZhuanjia 65459b3f4e update preset widget profiles 2025-10-15 09:35:40 +08:00
TrueZhuanjia 2216899204 minor tweak 2025-10-14 23:10:25 +08:00
TrueZhuanjia 5fb4887c67 fixed: settings menu safeArea adaption some times not working on iPhone 2025-10-14 23:05:25 +08:00
TrueZhuanjia 6ff2add9dd - feat: edge sliding sensitivity for edge sliding gestures
- update flag for new preset widget profiles
2025-10-14 22:34:28 +08:00
TrueZhuanjia c963c1254d update preset widget profiles 2025-10-14 16:43:36 +08:00
TrueZhuanjia 8afce40e81 - feat: functional buttons "toolbox" "widgetTool" "widgetProfiles" "softKeyboard" 2025-10-14 15:49:06 +08:00
TrueZhuanjia e44504bc48 - feat: hybrid form for mousePad & LT/RT Pad 2025-10-14 14:22:44 +08:00
TrueZhuanjia 11b79dda5b - feat: yaw & pitch factor for each on-screen "gyro" button for seamlessly toggling among different level of gyro sensitivities. 2025-10-14 01:37:22 +08:00
TrueZhuanjia 8cee8b679c new preset on-screen widget templates with gyro & settings button 2025-10-12 23:21:54 +08:00
TrueZhuanjia 1cb9360d83 refactor "gyroOff" to "gyroPause" 2025-10-12 22:01:38 +08:00
TrueZhuanjia 297f5ad7e6 fixed: direction pad on-screen widget (Wasdpad, dPad ...) not responsive on first touch move 2025-10-12 21:28:21 +08:00
TrueZhuanjia 3f2a011d7b - feat: gyro-off on-screen button, the opposite of "gyro" button
- fixed: auto tap slider disappeared for regular on-screen buttons
2025-10-12 20:41:33 +08:00
TrueZhuanjia dd0c36bb20 feat: haptic engine selector 2025-10-12 16:49:10 +08:00
TrueZhuanjia aff1bdfe89 - feat: on screen widget "LTAPD" & "RTPAD" (left trigger pad & right trigger pad)
- try to fix single-tap not responsive on some iPhone by "single tap sensitivity option" in settings menu
2025-10-11 15:31:41 +08:00
TrueZhuanJia 00533f5d3b Merge pull request #132 from twilightgod/iphone-haptics
Fall back to phone haptics engine if controller doesn't support it
2025-10-09 17:12:19 +08:00
TrueZhuanjia eff682bc05 feat: minimum stick offset for gyro -> stick mapping 2025-10-09 09:58:57 +08:00
TrueZhuanjia 16a210efa2 feat: motion control - direct mapping from gyro to mouse or controller sticks, with on-screen button "gyro" for toggling 2025-10-07 23:09:06 +08:00
TrueZhuanjia 99a2a4ca1a minor fixes 2025-10-04 17:22:32 +08:00
TrueZhuanjia 67af68fcf1 - motion control demo1
- feat: movable on-screen functional buttons
2025-10-04 16:44:43 +08:00
TrueZhuanjia b96e2d1bdf fixed: built-in gyro mapping doesn't work on iOS12 & iOS13 2025-10-02 12:25:31 +08:00
TrueZhuanjia 2bb0ce086f - feat: tap to toggle on-screen button triggering
- fixed: special overlay button relocation
2025-09-29 17:27:49 +08:00
TrueZhuanjia 9bc518dc68 set button-type widget default properties 2025-09-29 10:44:26 +08:00
TrueZhuanjia f60433ff3f try to fix: built-in gyro doesn't work on iOS12 & iOS13 2025-09-28 10:59:01 +08:00
TrueZhuanjia b4493707ca Merge branch 'menuSectionFoldStateMemorize' into Integration 2025-09-28 10:35:34 +08:00
TrueZhuanjia 0fe10d8654 feat: remember menu section fold state 2025-09-28 10:34:40 +08:00
Rex Xiong 87d9590f3b Update HapticContext.m 2025-09-27 13:35:19 -07:00
Rex Xiong eeff9b74da Fallback to phone haptics engine if controller doesn't support it 2025-09-27 13:13:26 -07:00
TrueZhuanjia ceebd19c0e Merge branch 'aliasKeyboardType' into Integration 2025-09-26 09:18:00 +08:00
TrueZhuanjia 00e0566dd4 story board UI string fix 2025-09-25 20:00:21 +08:00
TrueZhuanjia acd4a04076 fixed: settings menu accidentally resized on iPad 2025-09-25 16:22:27 +08:00
TrueZhuanjia ac0aa29578 feat: mic volume 2025-09-25 13:30:30 +08:00
TrueZhuanjia 9a053d9ed8 fixed: mic redirection not working on iOS 12 2025-09-24 22:43:14 +08:00
TrueZhuanjia 9124a1fee5 use Deque for mic audio ringBuffering 2025-09-24 16:50:14 +08:00
TrueZhuanjia 858e7c7440 feat: use built-in mic 2025-09-24 12:49:25 +08:00
TrueZhuanjia e5669e2a30 feat: local volume 2025-09-23 23:51:21 +08:00
TrueZhuanjia 431b32b680 try to fix broken native touch & broken on screen widget layout when orientation is locked on iPhone iOS 16/17 control center 2025-09-23 20:55:15 +08:00
TrueZhuanjia 7dce11b4c4 add libupos-sim.a file reference 2025-09-22 23:04:58 +08:00
TrueZhuanjia 9fca3a5984 storyboard & settings menu UI fixes 2025-09-22 21:42:02 +08:00
TrueZhuanjia 733d5c38f3 - fixed: non-AWDL stuttering fix doesn't work when settings menu expands during streaming 2025-09-22 15:49:40 +08:00
HsunLu 3834b5a604 Fix: allow default keyboard for alias input (support Zhuyin) 2025-09-22 14:40:11 +08:00
TrueZhuanjia 07e36029d0 tweak relative touch handler 2025-09-22 13:18:25 +08:00
TrueZhuanjia 689221f10e send dummy event to prevent stuttering 2025-09-21 18:35:56 +08:00
TrueZhuanjia 60dacdf05f feat: dynamic theme update 2025-09-18 16:53:17 +08:00
TrueZhuanjia 1614bb0609 Merge branch 'dynamicTheme' into Integration
# Conflicts:
#	VoidLink/ViewControllers/SettingsViewController.m
2025-09-18 11:02:15 +08:00
TrueZhuanjia a386867dd0 fixed: stream view interrupted by mic stream 2025-09-16 08:44:38 +08:00
TrueZhuanjia e177d6eaea perfGraph tips 2025-09-15 13:15:04 +08:00
TrueZhuanjia 464492529e fixed possible crash in micHandler 2025-09-15 11:37:50 +08:00
TrueZhuanjia b950882846 tweak stats overlay 2025-09-15 10:54:53 +08:00
TrueZhuanjia 63808c9e9c use safeTimer for micHandler 2025-09-15 10:39:20 +08:00
TrueZhuanjia 76d138d64d minor change on storyboard 2025-09-15 09:33:47 +08:00
TrueZhuanjia 1232644268 minor fixes 2025-09-14 10:07:50 +08:00
TrueZhuanjia 2e776baec9 fixed potential crash in mousePad widget 2025-09-14 03:09:11 +08:00
TrueZhuanjia 8fb4829aef further fix widget layout with orientation change issue 2025-09-13 22:57:20 +08:00
TrueZhuanjia fcbc844587 switch to default profile after importing widget templates 2025-09-13 22:33:34 +08:00
TrueZhuanjia aecb1163e3 minor UI fixes & tweaks 2025-09-13 21:55:02 +08:00
TrueZhuanjia 0e51a49898 tweak statsOverlay 2025-09-13 21:21:57 +08:00
TrueZhuanjia adce543c45 hostView settings menu gesture improvement 2025-09-13 18:34:49 +08:00
TrueZhuanjia 83a32f96e6 update preset on screen widget templates 2025-09-13 18:01:18 +08:00
TrueZhuanjia 6c72f0331b feat: implements button visual feedback switch for legacy osc 2025-09-13 17:33:40 +08:00
TrueZhuanjia 92f1fbf33b fixed: unpredictable on screen widget size after orientation change in layout tool. now widget size stays consistent. 2025-09-13 17:13:11 +08:00
TrueZhuanjia 424fe2c2f0 fixed: allow widget profiles with identical names and shows the checkmark at the correct profile 2025-09-12 22:47:10 +08:00
TrueZhuanjia f5d629c62c replace widget templates 2025-09-12 22:16:19 +08:00
TrueZhuanjia 19fa975b6d - fixed: widget height adjusting bug 2025-09-12 21:58:25 +08:00
TrueZhuanjia a4951309d3 widget layout tool minor fixes 2025-09-12 17:03:40 +08:00
TrueZhuanjia 3ec53c29d4 - minor UI fix for touch mode selector 2025-09-12 13:14:38 +08:00
TrueZhuanjia 3fcaafc42b iOS 14 settings menu UI bug fix 2025-09-12 12:58:06 +08:00
TrueZhuanjia 5318acc427 minor fix for setting menu loading speed 2025-09-12 10:13:48 +08:00
TrueZhuanjia daa4fc80eb fixed: broken touch input caused by Absolute Touch 2025-09-11 23:14:58 +08:00
TrueZhuanjia c094d74d8e - feat: allow touchPad label to be display if it's different from touchPad cmdString 2025-09-11 21:39:55 +08:00
TrueZhuanjia 5418936816 - feat: mouseWheel on-screen widget 2025-09-11 21:33:15 +08:00
TrueZhuanjia c3b7679268 - fixed: widget height changes unexpectedly after being tapped 2025-09-11 19:49:36 +08:00
TrueZhuanjia d12b83d1ef - Fixed: mousepad unable to perform 2-finger right click in hovering mode
- Minor changes & improvements for mousePad widget
2025-09-11 17:42:17 +08:00
TrueZhuanjia 32b78d1a4c - move performance graph setting stack to experimental section 2025-09-11 15:02:55 +08:00
TrueZhuanjia 71f66fe8c0 - UI: highlighting emerging setting stack 2025-09-11 14:51:39 +08:00
TrueZhuanjia d054bbe35f - feat: on-screen button visual feedback switch
- feat: touch input disabled mode (while allowing on-screen widget input)
- fixed: swapAbxy stack dynamic UI
2025-09-11 11:37:14 +08:00
TrueZhuanjia bd1c4e3cc9 - update mic permission tip 2025-09-10 21:27:23 +08:00
TrueZhuanjia 928b765700 compatibility fix from c-module 2025-09-10 20:47:35 +08:00
TrueZhuanjia 45acc28384 Tap gesture fix 2025-09-10 12:39:26 +08:00
TrueZhuanjia 4e65abf6b1 - feat: auto tap for on-screen widget.
- fixed: on-screen widget button stuck.
2025-09-10 03:02:28 +08:00
TrueZhuanjia d818f8a7ce allows on-screen widget vibration during mic redirection 2025-09-08 20:24:11 +08:00
TrueZhuanjia c0850ce9d2 Merge branch 'micDemo' into Integration 2025-09-08 16:52:45 +08:00
TrueZhuanjia c3941df7e9 - feat: mic redirection (with Sunshine-Foundation) 2025-09-08 16:47:27 +08:00
TrueZhuanjia b1b46b3ec0 Merge commit 'metal renderer crash fix' into Integration 2025-09-02 12:36:50 +08:00
TrueZhuanjia dff6679a90 lib opus file reference 2025-09-02 08:54:53 +08:00
Acaki 4ab21aed0e fix: crash on background timer expired with Metal renderer 2025-09-01 22:51:41 +08:00
TrueZhuanjia d67a40f155 c-module source file reference update 2025-09-01 22:04:55 +08:00
TrueZhuanjia b506917382 update c-module for mic implementation 2025-09-01 10:41:51 +08:00
TrueZhuanjia 944f7422b3 set maximum bitrate to 800Mbps 2025-08-31 11:12:48 +08:00
TrueZhuanjia 4843c046d7 fixed: bitrate slider disabled when sunshine server does not support dynamic bitrate 2025-08-31 09:14:52 +08:00
TrueZhuanjia 61df4e7e61 a few ui string tweaks 2025-08-30 19:22:09 +08:00
TrueZhuanjia 48558316d1 Merge branch 'perfMode' into Integration 2025-08-30 18:57:59 +08:00
TrueZhuanjia 5903b358ee - unify pixel format to MTLPixelFormatRGBA16Float
- move renderingBackEnd to experimental section, add a few tips for performance mode
2025-08-30 18:54:30 +08:00
TrueZhuanjia 6881098ca2 Fixed: failed to launch app on iPhone when there're specific number of hosts presented no the host view. 2025-08-30 11:34:29 +08:00
TrueZhuanjia 4d783649f5 cancel iOS13 availability check for metal renderer 2025-08-28 23:34:26 +08:00
Acaki 2b40224b2b refactor: replace MTLPixelFormatBGR10A2Unorm with MTLPixelFormatBGRA10_XR for older devices 2025-08-28 21:31:14 +08:00
Acaki e4d6be3bb3 Revert "fix: crash when host is on hdr but client is not on Metal lower iOS versions"
This reverts commit 6c0b1550fd.
2025-08-28 21:29:51 +08:00
Acaki 6c0b1550fd fix: crash when host is on hdr but client is not on Metal lower iOS versions 2025-08-28 13:28:28 +08:00
TrueZhuanjia 967fbe8072 feat: no click option for mousePad on-screen widget 2025-08-28 13:23:35 +08:00
Acaki c7dd7a2c21 fix: metal renderer packed format crash on emulator and lower iOS version 2025-08-28 00:07:56 +08:00
TrueZhuanjia 49ed0e43e9 reduce on-screen widget visual effect performance cost 2025-08-27 22:35:47 +08:00
TrueZhuanjia 6bae985e2c ui & string tweaks 2025-08-27 20:20:48 +08:00
Acaki 39d7d9e213 feat: add back lowest latency mode for AVSampleBuffer 2025-08-27 15:53:00 +08:00
Acaki eb3501e090 Revert "feat: bring back CAMetalDisplayLink"
This reverts commit b6c029df
2025-08-27 15:16:24 +08:00
TrueZhuanjia 83566ad4e1 try to reduce directionPad on-screen widget performance cost 2025-08-27 14:04:45 +08:00
TrueZhuanjia 19e78d5eb6 Merge branch 'dynamicBitrate' into Integration 2025-08-26 14:45:04 +08:00
Acaki 0a2fdbf0c0 refactor: separate metrics calculation for legacy and queue pacing 2025-08-26 03:18:52 +08:00
Acaki 91f95f13ae refactor: remove framerate limiter to avoid false positives 2025-08-26 03:07:30 +08:00
Acaki ebf46042ba feat: use CAPABILITY_PULL_RENDERER for legacy pacing mode 2025-08-26 03:06:19 +08:00
Acaki 8547cee1b9 revert: legacy frame pacing changes for VideoDecoderRenderer 2025-08-26 01:33:19 +08:00
Acaki 56729469bf fix: Metal kIOGPUCommandBufferCallbackErrorSubmissionsIgnored error 2025-08-26 00:09:18 +08:00
TrueZhuanjia e619d31622 ui tweaks for frame pacing & perfGraph setting stacks 2025-08-25 22:45:12 +08:00
TrueZhuanjia 370cc76dbe dynamic label for frameQueSizeStack 2025-08-25 18:08:49 +08:00
TrueZhuanjia 1ac2f9e923 - perfGraph UI & storyboard changes - iPad
- perfGraph info button tip
2025-08-25 18:05:55 +08:00
TrueZhuanjia 8caf360671 perfGraph UI & storyboard changes - iPhone 2025-08-25 18:05:55 +08:00
TrueZhuanjia 59b1dcfd13 feat: add back legacy pacing 2025-08-25 18:05:53 +08:00
Acaki 34a115706e Revert "fix: sync imgui fps to stream fps to avoid it interferes with displaylink timings"
This reverts commit 5d1bed4d25.
2025-08-25 15:29:30 +08:00
Acaki b6c029df38 feat: bring back CAMetalDisplayLink
This reverts commit 6f381362dd.
2025-08-25 15:29:29 +08:00
TrueZhuanjia 31ab333f5b realtime bitrate adjustment with Sunshine-Foundation (experimental) 2025-08-25 10:07:38 +08:00
Acaki 0582655954 fix: occasional crashes when put in foreground 2025-08-25 02:05:00 +08:00
Acaki c8f61b0b87 feat: pause Metal renderer and graph when app is in background 2025-08-25 00:42:01 +08:00
Acaki a2c4d440db fix: memory leak for Metal renderer when repeatedly connect/disconnect stream or toggling HDR on host 2025-08-24 20:54:51 +08:00
Acaki b64ad64524 fix: error handling of nil decompressionSession 2025-08-24 17:01:25 +08:00
Acaki e9e6f1deb9 fix: skip applying EDR metadata when HDR is disabled in client or host settings 2025-08-24 17:01:23 +08:00
Acaki 6f381362dd Revert "fix: sync imgui fps to stream fps to avoid it interferes with displaylink timings"
This reverts commit 5d1bed4d25.

Revert "fix: another attempt to fix occasional video freeze with metal renderer"

This reverts commit 958b391afa.

Revert "fix: attempt to fix occasional video freeze with metal renderer"

This reverts commit bcb4d0a905.

Revert "feat: use CAMetalDisplayLink for metal renderer to fix refresh rate issues"

This reverts commit 9e20efff4b.

Revert "Revert "MetalViewController: run a no-op DisplayLink at the target framerate so iOS won't switch to a slower rate""

This reverts commit 39b2621e30.
2025-08-22 17:39:25 +08:00
Acaki 5d1bed4d25 fix: sync imgui fps to stream fps to avoid it interferes with displaylink timings 2025-08-21 19:13:05 +08:00
TrueZhuanjia 9b9104b502 new bitrate table 2025-08-21 17:26:36 +08:00
TrueZhuanjia facbc01a9c c-module source 2025-08-21 17:26:33 +08:00
Acaki 3ba0e35032 refactor: remove duplicate video format creation 2025-08-21 05:11:12 +08:00
Acaki 958b391afa fix: another attempt to fix occasional video freeze with metal renderer 2025-08-21 03:08:07 +08:00
Acaki 678c8054d7 Revert "fix: frozen image when switching from metal to AVSB"
This reverts commit 2b052fef1e.
2025-08-21 00:07:40 +08:00
Acaki d90657b05a refactor: enable EDR metadata for Metal and add more error handling 2025-08-20 22:21:25 +08:00
Acaki 9e56547435 Revert "fix: remove waitUntilCompleted call as semaphore is used"
This reverts commit 05f6dd86b1.
2025-08-20 21:34:16 +08:00
Acaki bcb4d0a905 fix: attempt to fix occasional video freeze with metal renderer 2025-08-20 01:50:27 +08:00
Acaki 225b66cb06 Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal 2025-08-19 23:26:25 +08:00
Acaki cd1ff0da97 refactor: optimize graph dimensions 2025-08-19 23:14:48 +08:00
Acaki 1d1e553191 refactor: change render mode back to NSDefaultRunLoopMode 2025-08-19 23:14:47 +08:00
TrueZhuanjia e10691e2b7 fix: direction pad on-screen widget performance & indicator clean-up issue 2025-08-19 21:52:14 +08:00
Acaki 9e20efff4b feat: use CAMetalDisplayLink for metal renderer to fix refresh rate issues
This reverts commit 868288e7
Using CAMetalDisplayLink with CAMetalLayer is required for ProMotion to work consistently and make graphs and touch widgets work smoothly with Metal (especially wasdpad)
With CADisplayLink (no-op or not) the widgets and/or graphs can cause fps drops to the stream
2025-08-19 18:47:41 +08:00
Acaki 9e32c1da3d Revert "fix: metal renderer packed format crash on emulator and lower iOS version"
This reverts commit 34eb2ccd
2025-08-19 04:45:53 +08:00
Acaki 39b2621e30 Revert "MetalViewController: run a no-op DisplayLink at the target framerate so iOS won't switch to a slower rate"
This reverts commit 6010182592.
2025-08-19 04:38:07 +08:00
Acaki 4e44136f51 feat: prompt for restart when changing renderer 2025-08-19 04:04:18 +08:00
Acaki 62bd695138 Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal
# Conflicts:
#	VoidLink/ViewControllers/MainFrameViewController.m
#	VoidLink/ViewControllers/ToolboxViewController.swift
2025-08-19 02:21:03 +08:00
Acaki 0b9454896c Revert "feat: add proper CADisplayLink handling for iOS15 where commandBuffer presentDrawable:drawable afterMinimumDuration doesn't seem to work well"
This reverts commit ee67ff56c7.
2025-08-19 00:07:23 +08:00
TrueZhuanjia 51c1c6db33 remove session launch tip 2025-08-18 23:33:01 +08:00
TrueZhuanjia 0c1fc66be8 feat: disconnect & quit current app in tool box 2025-08-18 23:28:19 +08:00
Acaki ee67ff56c7 feat: add proper CADisplayLink handling for iOS15 where commandBuffer presentDrawable:drawable afterMinimumDuration doesn't seem to work well 2025-08-18 19:37:14 +08:00
Acaki ea1a2f3cd0 fix: metal renderer no image on ios15.2 simulator 2025-08-18 17:01:09 +08:00
Acaki 25ca131da1 fix: overlapping graphs for ipthone 13 pro max 2025-08-18 16:57:34 +08:00
Acaki 05f6dd86b1 fix: remove waitUntilCompleted call as semaphore is used 2025-08-18 01:30:59 +08:00
Acaki 2b052fef1e fix: frozen image when switching from metal to AVSB 2025-08-16 17:03:36 +08:00
Acaki d6aa64b816 fix: osc, stats, and video layering 2025-08-16 16:17:07 +08:00
Acaki b3664d0e2d refactor: remove unnecessary changes 2025-08-16 04:09:02 +08:00
Acaki 34eb2ccd31 fix: metal renderer packed format crash on emulator and lower iOS version 2025-08-15 04:32:48 +08:00
Acaki 0d32b8f06f fix: availability warnings 2025-08-15 01:18:03 +08:00
Acaki 73316ab5b8 fix: iphone storyboard and add more translations 2025-08-14 23:35:53 +08:00
Acaki 69ed345191 Merge remote-tracking branch 'refs/remotes/upstream/Integration' into feat/frame_pacing_metal
# Conflicts:
#	VoidLink/Base.lproj/iPhone.storyboard
2025-08-14 20:40:13 +08:00
Acaki 78188527a9 ci: build ipa for frame pacing metal branch 2025-08-14 20:35:55 +08:00
Acaki 2d57c3f7c1 feat: add translations for new settings 2025-08-14 20:11:59 +08:00
Acaki 4bfa6d270d refactor: remove old frame pacing setting as it's no longer used 2025-08-14 19:53:56 +08:00
TrueZhuanjia 85e6eb9eb6 deployment target: iOS 12.0 2025-08-14 09:11:03 +08:00
TrueZhuanjia 83593a0ea7 iOS 12 widget layout tool trashcan button fix 2 2025-08-14 02:17:55 +08:00
TrueZhuanjia dd6dbdf1aa localization fix 2025-08-14 02:10:55 +08:00
TrueZhuanjia 6a2c3d7b28 settings stack gyro check 2025-08-14 01:28:23 +08:00
TrueZhuanjia 15161ede06 Merge branch 'iOS12_compatibility' into Integration 2025-08-14 01:04:36 +08:00
TrueZhuanjia ee370ec978 iOS 12 fix: docked navigation bar tint color 2025-08-14 01:04:10 +08:00
TrueZhuanjia e844b5df65 disable external display settings stack for iOS12 2025-08-14 00:57:13 +08:00
TrueZhuanjia 087e38c9d7 change default selected resolution index 2025-08-14 00:32:47 +08:00
TrueZhuanjia 2bf39aeb2e waterMark for iOS12 2025-08-14 00:01:53 +08:00
TrueZhuanjia ccc85772d3 iOS 12 fix: UIAppView playIcon 2025-08-13 23:52:48 +08:00
TrueZhuanjia 9d2f7704c7 iOS12 fix: widget layout tool trashcan button 2025-08-13 23:34:29 +08:00
TrueZhuanjia 6e20c126c3 - iOS compatibility: on-screen widget profile tableView 2025-08-13 23:25:02 +08:00
TrueZhuanjia 9b149a1eb5 iOS12 compatibility: toolbox menu 2025-08-13 20:05:13 +08:00
Andy Grundman 6010182592 MetalViewController: run a no-op DisplayLink at the target framerate so iOS won't switch to a slower rate 2025-08-13 15:16:19 +08:00
Acaki 868288e70f Revert "feat: use CAMetalDisplayLink for metal renderer to fix refresh rate issues"
This reverts commit 628ce0f12e.
2025-08-13 15:15:52 +08:00
TrueZhuanjia d73c0ee319 iOS12 compatibility: on-screen widget layout Tool 2025-08-12 13:26:42 +08:00
TrueZhuanjia 5cf9ea74f4 iOS 12 compatibility: settings menu 2025-08-12 01:26:27 +08:00
Acaki 2ab705efdf docs: add copyright info to metal renderer related code 2025-08-12 00:35:10 +08:00
TrueZhuanjia 1f4865c468 - insert videoRenderView for iOS12 2025-08-11 23:32:00 +08:00
Acaki 8388076b71 fix: graph not showing on stream start when it's enabled with metal renderer 2025-08-11 22:04:19 +08:00
Acaki 7a37d11aea Revert "fix: disappearing graph when showing and hiding settings panel in stream"
This reverts commit 76f765ce5f.
2025-08-11 21:47:19 +08:00
Acaki cdd5802a72 refactor: rename rendering backend setting and add to iphone dashboard 2025-08-11 21:34:23 +08:00
Acaki 951b7bcfb0 refactor: disable pip toggle when metal renderer is used as it's not supported 2025-08-11 20:54:16 +08:00
TrueZhuanjia 4cb060f496 - feat: add several on-screen gamepad button widgets 2025-08-11 19:52:08 +08:00
Acaki c5da9e9bf7 Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal 2025-08-11 15:52:01 +08:00
Acaki 386516ade9 fix: ios12 compatibility 2025-08-11 15:46:08 +08:00
Acaki 211f90307f Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal
# Conflicts:
#	VoidLink/mul.lproj/iPad.xcstrings
2025-08-11 15:05:21 +08:00
TrueZhuanjia d6558c3619 - fix broken native touch passthrough after launching session without opening settings menu in advance 2025-08-11 14:06:08 +08:00
TrueZhuanjia bb265a51fd minor chage on UI strings 2025-08-11 11:15:50 +08:00
TrueZhuanJia 4bc8934b1b Merge pull request #103 from Acaki/fix/homebar_handling
Fix homebar handling
2025-08-11 08:33:10 +08:00
TrueZhuanjia 1bc15a1ba3 fix: slide & hold on-screen button storyboard update 2025-08-11 01:15:08 +08:00
Acaki 5026a6fbcf fix: better handling of app resize for metal renderer 2025-08-10 20:59:24 +08:00
Acaki 628ce0f12e feat: use CAMetalDisplayLink for metal renderer to fix refresh rate issues
- update imgui to use stream fps instead of hardcoded 60
- hide renderer setting for iOS < 17 as CAMetalDisplayLink only supports later versions
2025-08-10 20:58:56 +08:00
Acaki 8d05e8e670 feat: disable render backend settings during stream 2025-08-10 18:37:42 +08:00
TrueZhuanjia 2b11f12763 DS4Touch on-screen widget 2025-08-10 16:19:26 +08:00
TrueZhuanjia 3536bf06ba - feat: slide & hold mode for slidable buttons 2025-08-10 13:22:30 +08:00
TrueZhuanjia 88c0e358aa - make all buttons slidable by default 2025-08-10 00:45:40 +08:00
TrueZhuanjia 7b5d9cde2e - feat: vibration available for controller & keyboard direction pad sliding 2025-08-09 23:50:28 +08:00
TrueZhuanjia c5fc72cc2c make double tap dragging easier to trigger on iPhone 2025-08-09 22:14:16 +08:00
TrueZhuanjia ab503875cb - feat: implementation of slidable button 2025-08-09 22:02:03 +08:00
Acaki a9c4417434 Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal 2025-08-08 16:34:34 +08:00
TrueZhuanjia 679c0a2b4c normalize on-screen widget size 2025-08-08 12:57:59 +08:00
Acaki 5c1d2de9e5 Revert "fix: start stream with graph enabled and metal doesn't show the graph"
This reverts commit 69026cbcd6.
2025-08-08 02:03:46 +08:00
Acaki 1442495c9e Revert "fix: temporary fix for fps drop issue when starting stream with graph disabled"
This reverts commit d72930877a.
2025-08-08 01:51:09 +08:00
Acaki 22ce2edfa3 fix: prefersHomeIndicatorAutoHidden conflicting with preferredScreenEdgesDeferringSystemGestures 2025-08-07 16:18:06 +08:00
Acaki 69026cbcd6 fix: start stream with graph enabled and metal doesn't show the graph 2025-08-07 04:25:15 +08:00
Acaki 76f765ce5f fix: disappearing graph when showing and hiding settings panel in stream 2025-08-07 04:25:15 +08:00
Acaki b8ba716f34 feat: add and option to toggle stats and graphs temporaily in toolbox 2025-08-07 04:25:15 +08:00
Acaki 131d115761 fix: lift stream view for metal renderer when OSK is invoked 2025-08-07 04:04:54 +08:00
Acaki 9b9f4f7603 fix: allow clicking through statistics overlay 2025-08-07 04:04:54 +08:00
TrueZhuanjia c32f2d3f50 fix broken osw widget profile after switching app to background 2025-08-07 01:50:49 +08:00
TrueZhuanjia c2d3028668 further fix iPhone settings menu safe area issue 2025-08-06 23:45:53 +08:00
TrueZhuanjia 338523e216 - further fix for wake-on-lan button & logic 2025-08-06 23:04:04 +08:00
TrueZhuanjia 54bf701495 minor change 2025-08-06 22:15:49 +08:00
TrueZhuanJia c1bf40d825 Merge pull request #5 from xzzpig/resolution-fix
optimize resolution update handling logic
2025-08-06 22:00:46 +08:00
TrueZhuanjia 905e3eaf73 settings menu safeArea fix for iPhone 2025-08-06 21:01:34 +08:00
TrueZhuanjia 900a4cca14 ignore readme 2025-08-06 15:36:14 +08:00
TrueZhuanjia a44e9c87d7 - make wakeup button available as long as the host has valid mac address 2025-08-06 10:26:38 +08:00
TrueZhuanJia 7b9bbba3fd Merge pull request #8 from xzzpig/wol
feat: Allow WOL during host detection
2025-08-06 10:06:36 +08:00
TrueZhuanjia fc6591f26f Merge commit '245613162a37b4cbc0f40e79f873def8776ce20f' into Integration 2025-08-05 01:08:23 +08:00
TrueZhuanjia f50d1bd488 - Add online documentation link, including "Read Widget Instruction" button. 2025-08-05 00:52:45 +08:00
xzzpig 0c386ef337 feat: Allow WOL during host detection 2025-08-01 22:37:56 +08:00
TrueZhuanJia 245613162a Update README.md 2025-08-01 20:49:17 +08:00
TrueZhuanJia d2eb674bb5 Update README.md 2025-08-01 20:43:43 +08:00
Acaki d5af136da2 Merge remote-tracking branch 'refs/remotes/upstream/Integration' into feat/frame_pacing_metal 2025-07-31 03:33:51 +08:00
xzzpig ff8cb20cae add support for dynamic theme update 2025-07-30 01:20:36 +08:00
TrueZhuanjia 3e48df9756 remove KVC accessed api 2025-07-29 20:37:38 +08:00
xzzpig fb04850ae8 optimize resolution update handling logic 2025-07-29 20:22:32 +08:00
TrueZhuanjia f62a405979 default osw profile for iPhone 2025-07-29 11:19:44 +08:00
TrueZhuanjia 58180ae3fa session connection ui tweak 2025-07-29 09:22:04 +08:00
TrueZhuanjia e416dd5f78 simplify stage label for session connection 2025-07-29 09:06:31 +08:00
TrueZhuanjia e37c22b259 - remove legacy help button 2025-07-29 08:49:50 +08:00
Acaki 238d17020b Merge remote-tracking branch 'refs/remotes/upstream/Integration' into feat/frame_pacing_metal
# Conflicts:
#	VoidLink.xcodeproj/project.pbxproj
#	VoidLink/Input/PureNativeTouchHandler.m
#	VoidLink/Input/StreamView.m
#	VoidLink/UIComputerView.m
2025-07-28 23:23:13 +08:00
TrueZhuanjia 96f11a4a69 host view improvements 2025-07-27 02:13:11 +08:00
TrueZhuanjia 5fcfa84766 try to fix aboutView ok button 2025-07-27 01:12:07 +08:00
TrueZhuanjia 04ecd45f7c osw layouTool post orientation change actions 2025-07-27 00:32:44 +08:00
TrueZhuanjia dd9ad9728a fix: widget layout tool disfunction after display orientation change 2025-07-27 00:08:10 +08:00
TrueZhuanjia 6a3e1d8a88 - revert to blacklist edge detection for native touch 2025-07-26 13:55:37 +08:00
TrueZhuanjia d2e0cc779c fix: abnormal native/absolute touch after orientation change & expanding setting menu 2025-07-26 11:42:46 +08:00
TrueZhuanjia ee4c1defa0 fix: having no touch response under default osw profile. 2025-07-26 10:11:18 +08:00
TrueZhuanjia 49417e7bc9 - aboutView fix 2025-07-26 01:32:12 +08:00
TrueZhuanjia e301f2af16 full portrait support for on-screen widgets & legacy on-screen controls 2025-07-26 01:18:48 +08:00
TrueZhuanjia 0df5135f0b fix: widgets disappears after display orientation change & saving profile in osw tool 2025-07-25 20:18:43 +08:00
TrueZhuanjia ab7ccc7732 fix: profile saving issue caused by launching osw tool via tap gesture 2025-07-25 19:56:46 +08:00
TrueZhuanjia 02c6a12a82 - aboutView and tip url fixes for iOS 13
- final fix: osw profile saving issue
- replace document link for add widget action
2025-07-25 15:48:55 +08:00
TrueZhuanjia ed1efdd102 remove codes of deprecated views 2025-07-25 11:53:58 +08:00
TrueZhuanjia e51701ef00 background info update tweak 2025-07-25 11:51:18 +08:00
TrueZhuanjia 2b0fb3844b load default favorite setting stacks if persisted data is not available 2025-07-25 11:21:51 +08:00
TrueZhuanjia 323613e4db minor tweaks on UI 2025-07-25 10:42:11 +08:00
TrueZhuanjia 80f9118c0d fix osw tool outbounds issue again 2025-07-25 09:27:33 +08:00
TrueZhuanjia 074a31606c revert edge detection for touchHandler 2025-07-25 08:19:50 +08:00
Acaki 3bb78db2da Merge remote-tracking branch 'refs/remotes/upstream/Integration' into feat/frame_pacing_metal
# Conflicts:
#	VoidLink/Base.lproj/iPad.storyboard
#	VoidLink/ViewControllers/SettingsViewController.m
2025-07-25 01:50:47 +08:00
Andy Grundman e5fc439da2 Misc: fix bugs that were preventing starting a new stream after disconnecting. Known issue: this leaks a bit of memory. This also removes all OSX-specific code from the Apple example I used, as I have no intention of using this on Mac. 2025-07-25 01:46:49 +08:00
TrueZhuanjia 87ad97c00f bump up to 1.0.0 2025-07-25 01:09:03 +08:00
TrueZhuanjia ce21c398b5 - fix on-screen widget tool selectedWidgetView bug
- update & replace new widget template bin file
2025-07-25 00:36:04 +08:00
TrueZhuanjia ed56d26b1c fix unable to open osw profile table 2025-07-24 22:01:42 +08:00
TrueZhuanjia 08a2312099 toolbox ui string update 2025-07-24 21:11:06 +08:00
TrueZhuanjia 619e936c39 pop aboutView upon first app launch 2025-07-24 20:50:19 +08:00
TrueZhuanjia 75e88ee31e tweak aboutView 2025-07-24 20:32:58 +08:00
TrueZhuanjia 2e7abf0eb2 change default app icon 2025-07-24 19:58:13 +08:00
TrueZhuanjia 6941f006b3 tweak lockIcon size 2025-07-24 19:46:41 +08:00
TrueZhuanjia e0d03baf1c osw reshape fix 2025-07-24 19:37:36 +08:00
TrueZhuanjia 08ef392fca save osw profile when temporarily leaving osw layout tool 2025-07-24 19:25:05 +08:00
TrueZhuanjia b7d7b9a058 gyroModeStack tip 2025-07-24 16:24:40 +08:00
TrueZhuanjia a7fc2a65e0 - emulated controller type tip
- HDR switch fixes
2025-07-24 16:02:30 +08:00
TrueZhuanjia a707b21446 - stack tips: external display 2025-07-24 10:30:38 +08:00
TrueZhuanjia 0e8980da95 fill in stack tips 2025-07-23 23:59:20 +08:00
TrueZhuanjia ff991dd617 - PiP stack tip
- settings menu interaction minor fix
2025-07-23 20:10:42 +08:00
TrueZhuanjia a8c1451a28 yuv444Stack info button 2025-07-23 17:14:08 +08:00
TrueZhuanjia 9198960cc7 - pipStack 2025-07-23 13:52:14 +08:00
TrueZhuanjia b8478bfedc HDR info button 2025-07-23 13:10:16 +08:00
TrueZhuanjia 0f443af355 tweak toolbox view 2025-07-22 23:57:13 +08:00
TrueZhuanjia e63ce4d101 re-enable and update first launch tip 2025-07-22 21:41:38 +08:00
Andy Grundman e57f0cd723 Metal: after experimenting with EDR tone-mapping, it's here but disabled. It's unclear how best to render content from Windows. We get the system calibration peak nits in the Mastering Display Color Volume metadata, but this won't apply to most content. 2025-07-22 17:01:57 +08:00
Acaki 4fb3f7fa97 fix: metal renderer stuck when disconnect and resume stream 2025-07-22 16:55:12 +08:00
TrueZhuanjia 5759c122ed update about page 2025-07-22 00:47:00 +08:00
Acaki 55ac533718 Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal 2025-07-21 22:34:15 +08:00
TrueZhuanjia 282b3d6545 appView tweak 2025-07-21 13:14:12 +08:00
TrueZhuanjia eb41536749 disable background hostCard update while streaming 2025-07-21 13:01:19 +08:00
TrueZhuanjia 0728959ebe iOS13 compatibility: audio menu section icon 2025-07-21 00:41:59 +08:00
TrueZhuanjia b118f80b52 touchHandler debug 2025-07-20 23:11:02 +08:00
TrueZhuanjia 25073803ba iOS13 compatibility: apply background for each widget in widget panel 2025-07-20 21:54:06 +08:00
TrueZhuanjia 1046cfe9a0 - iOS 13 compatibility: try to fix iOS transparent osw widgetPanel background 2025-07-20 19:20:10 +08:00
Acaki 2250cba35c feat: apply normalization fix to new shader 2025-07-20 19:06:41 +08:00
Andy Grundman 1e24731b60 MetalVideoRenderer: EDR support, enabling better HDR output and tone-mapping regardless of screen brightness. This commit also includes some fixes around stream shutdown, but restarting the app is still needed if the stream stops. 2025-07-20 19:06:21 +08:00
Andy Grundman 034ee52eec ImGui: avoid garbage at the beginning of graphs 2025-07-20 17:08:53 +08:00
Acaki 13a1a4d97b Merge remote-tracking branch 'refs/remotes/upstream/Integration' into feat/frame_pacing_metal 2025-07-20 17:07:27 +08:00
TrueZhuanjia f22d05a34e - prevent onscreen widget moved out of superView bounds 2025-07-20 16:22:33 +08:00
TrueZhuanjia 0d3149a696 ios 13 compatibility fix: disable auto & controller gyro mode 2025-07-20 14:11:37 +08:00
TrueZhuanjia 11e5028020 - save osw profile when read instruction button tapped
- try to fix iOS 13 widgetPanel background
2025-07-20 12:51:45 +08:00
TrueZhuanjia 2b96bb1c77 appView background update tweak 2025-07-20 11:37:48 +08:00
TrueZhuanjia f843acf12f - hostView & host card fixes: add unpaired offline host to collection 2025-07-20 10:43:27 +08:00
Acaki 05d3567489 fix: missing frametime graph due to previous incorrect merge 2025-07-20 00:56:43 +08:00
TrueZhuanjia 25c4ca01de hostView test 2025-07-19 23:00:20 +08:00
TrueZhuanjia ac66ffe302 iOS 13 compatibility - hostIcon & lockIcon 2025-07-19 22:12:46 +08:00
Acaki f0b4e2e2ad fix: green tinted image for metal 10bit yuv444 2025-07-19 20:05:17 +08:00
Acaki d72930877a fix: temporary fix for fps drop issue when starting stream with graph disabled 2025-07-19 20:05:17 +08:00
Acaki 4d45c538cc Revert "feat: pip for metal renderer"
This reverts commit fa7710ce44.
2025-07-19 20:05:03 +08:00
Acaki f368076aaf Revert "refactor: use separate piplayer for AVSB pip function"
This reverts commit bd9e2e3215.
2025-07-19 17:43:46 +08:00
Acaki 61c5b958f2 feat: enable full range by default 2025-07-19 17:43:46 +08:00
TrueZhuanjia 334788c26f - fix appview background update issue
- relocate chevron view for ipad osw tool
- improve edge slide detection for native touchHandler
2025-07-19 14:47:04 +08:00
TrueZhuanjia 12ad168e13 about page content udpate 2025-07-17 23:41:11 +08:00
TrueZhuanjia 48fbec02e4 Merge branch 'aboutViewTest' into Integration 2025-07-17 22:49:01 +08:00
TrueZhuanjia ba453f9405 aboutView draft 2025-07-17 22:46:56 +08:00
TrueZhuanjia 00491d3bce tweak hostSpinner 2025-07-17 22:08:13 +08:00
TrueZhuanjia 98f73928fa zh-hant, zh-hk localization 2025-07-17 16:34:49 +08:00
TrueZhuanjia 3dccec3739 appView update 2025-07-17 02:05:05 +08:00
TrueZhuanjia 5e40c9f9ad tweak edge slide & touchHandler 2025-07-16 13:55:19 +08:00
Acaki 5bcc452c9f fix: metal renderer black screen 2025-07-16 02:40:51 +08:00
Acaki 5bf218d930 Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal
# Conflicts:
#	VoidLink/mul.lproj/iPad.xcstrings
2025-07-16 02:17:31 +08:00
Acaki 5df330f608 fix: stream freeze when turning screen off and on with AVSB 2025-07-16 02:15:28 +08:00
Acaki bd9e2e3215 refactor: use separate piplayer for AVSB pip function 2025-07-16 01:17:28 +08:00
TrueZhuanjia d1ecc894b3 swapAbxySwitch 2025-07-15 23:13:55 +08:00
Acaki 5a2d5af887 MetalVideoRenderer: don't recreate pipeline state every frame 2025-07-15 22:57:06 +08:00
Acaki 45895fa8bf Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal 2025-07-15 22:38:37 +08:00
Acaki fa7710ce44 feat: pip for metal renderer 2025-07-15 22:37:58 +08:00
TrueZhuanjia cd7d560e63 handle old profile sensitivityFactor 2025-07-15 21:44:47 +08:00
TrueZhuanjia fcf0ec98e5 tweak toolbar button order for osw tool 2025-07-15 21:34:33 +08:00
Acaki 7691d2c0eb Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal
# Conflicts:
#	VoidLink/Base.lproj/iPad.storyboard
#	VoidLink/Limelight.xcdatamodeld/VoidLink v1.0.xcdatamodel/contents
2025-07-15 18:10:07 +08:00
Acaki 686418997b fix: metal renderer teardown and resume 2025-07-15 18:08:54 +08:00
TrueZhuanjia f4b6fd709d fix resolution loading & update issue 2025-07-15 03:08:22 +08:00
Acaki 8126173128 fix: overlay level hanling 2025-07-15 02:30:08 +08:00
Andy Grundman 5e4ba088be Clean up render thread, plot method calls 2025-07-15 02:06:13 +08:00
Acaki 6682e64519 feat: allow toggling graphs in stream with shortcut 2025-07-15 02:06:13 +08:00
TrueZhuanjia 2140cc7820 emulated controller type selection 2025-07-15 00:12:52 +08:00
Acaki 7bafa39960 Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal 2025-07-14 01:33:21 +08:00
Acaki 37379220b4 fix: enableGraphsSwitch doesn't persist 2025-07-14 01:33:01 +08:00
TrueZhuanjia db6906d7a4 hide pipstack in streaming 2025-07-14 00:46:30 +08:00
TrueZhuanjia b262ae47e1 slide to open settings menu distance default value to 0 2025-07-14 00:19:01 +08:00
TrueZhuanjia 797b1a0b71 larger app card for iphone 2025-07-14 00:12:12 +08:00
TrueZhuanjia 77955f6bd6 host card appearance tweak 2025-07-13 23:20:22 +08:00
TrueZhuanjia 17a9fa39f5 - storyboard quick loading
- temporary default app view card image
- select new host button icon
2025-07-13 22:49:16 +08:00
Acaki f6032969c3 fix(AVSB): black screen when turning screen off and on 2025-07-13 22:07:40 +08:00
TrueZhuanjia 686696a6d9 disable pip for iOS lower than iOS15 2025-07-13 18:51:25 +08:00
TrueZhuanjia c629acfa4b fix session disconnection animation 2025-07-13 18:39:19 +08:00
Acaki 02ede90d77 refactor: remove comments added by xcode 2025-07-13 16:25:29 +08:00
Acaki 84cb37f6f3 fix: touch input and settings 2025-07-13 04:22:55 +08:00
Acaki 46526603cc Merge remote-tracking branch 'upstream/Integration' into feat/frame_pacing_metal
# Conflicts:
#	VoidLink/Base.lproj/iPad.storyboard
#	VoidLink/Database/DataManager.h
#	VoidLink/Database/DataManager.m
#	VoidLink/Database/TemporarySettings.m
#	VoidLink/ViewControllers/MainFrameViewController.m
#	VoidLink/ViewControllers/SettingsViewController.h
#	VoidLink/ViewControllers/SettingsViewController.m
#	VoidLink/ViewControllers/StreamFrameViewController.m
2025-07-13 01:01:51 +08:00
Acaki 80c6d488cf fix: attempt to fix background and resume issues with pip and new renderer changes 2025-07-13 00:52:08 +08:00
TrueZhuanjia 6ea23d94cb minor fixes 2025-07-13 00:09:42 +08:00
Acaki 29c8382825 fix: conflicts 2025-07-12 22:05:31 +08:00
TrueZhuanjia b83811cc62 settings item for background session timer 2025-07-12 22:01:10 +08:00
Acaki 47a590e92a Merge branch 'Integration' into feat/frame_pacing_metal
# Conflicts:
#	VoidLink.xcodeproj/project.pbxproj
#	VoidLink/Base.lproj/iPad.storyboard
#	VoidLink/Database/DataManager.m
#	VoidLink/Database/TemporarySettings.m
#	VoidLink/SceneDelegate.h
#	VoidLink/Stream/StreamManager.m
#	VoidLink/Stream/VideoDecoderRenderer.h
#	VoidLink/Stream/VideoDecoderRenderer.m
#	VoidLink/ViewControllers/MainFrameViewController.m
#	VoidLink/ViewControllers/SettingsViewController.m
2025-07-12 20:12:20 +08:00
TrueZhuanjia e2ab307da7 hostDiscovery improvement 2025-07-12 17:51:27 +08:00
TrueZhuanjia a83274ab28 ipad storyboard fix 2025-07-12 16:51:45 +08:00
TrueZhuanjia da8a210fcc 5 second host update period 2025-07-12 16:44:27 +08:00
TrueZhuanjia 0f8ba42975 Merge branch 'piptest' into Integration
- PiP & its toolbox special entry
- host update timer

# Conflicts:
#	VoidLink/ViewControllers/MainFrameViewController.m
#	VoidLink/ViewControllers/StreamFrameViewController.m
2025-07-12 16:41:47 +08:00
TrueZhuanjia 35a2c1111d pip tool box special entry 2025-07-12 16:30:37 +08:00
TrueZhuanjia d263482f7e Merge branch 'PiP2' into PiP1 2025-07-12 16:04:16 +08:00
TrueZhuanjia 19beac795b toolbox pip entry 2025-07-12 15:35:49 +08:00
Acaki e61e96b352 fix: background stream issues 2025-07-12 15:33:14 +08:00
Acaki 4b8691b943 fix: missing pip outlet for iphone 2025-07-12 14:45:51 +08:00
Acaki 487f987c25 Revert "fix: pip video freeze"
This reverts commit 0473233775.
2025-07-12 11:41:57 +08:00
Acaki a69d7eaede build: add new files to pbxproj 2025-07-12 11:25:11 +08:00
Acaki a87969d5b8 refactor: disable verbose logging and remove gesture handlers 2025-07-12 04:42:50 +08:00
Acaki 8f25081bbb fix: cleanup fps and resolution settings 2025-07-12 03:25:17 +08:00
Acaki 6a36e73463 fix: new settings 2025-07-12 02:47:27 +08:00
Acaki d69688678d fix: build 2025-07-12 02:00:33 +08:00
TrueZhuanjia 56c589f042 foreground host update timer 2025-07-11 22:08:14 +08:00
Travis Thieman df2b67ac99 Fix thread sync
Reformat Metal files

Rewrite Metal render loop to not use DisplayLink so we can use the amazing afterMinimumDuration API call

Improve frame drop algorithm

Misc fixes to HDR <-> SDR switching, deprecation warning cleanup

Fix AVSB mode

Fix renderingBackend selected value

Add Rendering Backend setting to iPhone

Let users choose which renderer to use. Refactor metrics into a singleton

Fix tvOS build

Port moonlight-qt's Metal renderer

Bump imgui to latest

Misc tweaks and refactoring

Switch iOS to use Opus float32 audio, in line with other clients.  It was already being sent from the server as float32, so this is simply decoding it with less loss of dynamic range.

Give FrameQueue a faster data structure and full test coverage. Remove pts frame pacing, it's not a fit for iOS.

Don't allow very transparent opacity for middle stats overlay box

Change wording to select button instead of remote button

Add tvOS gesture for double-clicking remote button to show/hide stats

Remove kVTDecodeFrame_1xRealTimePlayback, this was found to seriously impact decode times

Move decode time stat out of async block

Enabe FQ logging

Misc cleanup/fixes

iPad: 26 will require UIRequiresFullScreen to be false, and for all orientations to be supported

Updated iPhone and iPad settings panels

Add setting for graph opacity. Enable stats and graphs to be toggled via two finger swipe

Fix wait time in displaylink, fix settings spacing, stats fixes

Settings for frame queue size, graphs. Misc refactoring and cleanup

Bump moonlight-common-c

Improve logging readability

Fix host frametime and frame queue stats to be recorded during input not output. Show min/max/avg decode time

Add bytes per frame graph

Started on settings changes, both modes working very well

Misc refactoring, move graphs around, both pacing functions working well

Set frameDropTarget to 2 always

Use raw RTP timestamps without converting to floating point for even more accurate playback

Standard frame pacing: remove +3 logic

Switch to NSRunLoopCommonModes for displayLink

Add frame pacing algorithm based on moonlight-qt's Pacer class as a simpler baseline

Switch to os_unfair_lock, misc tweaks

Large refactor that now uses VTDecompressionSession based on PR535 from felipejfc. This now allows more control over queue size and allows dropping arbitrary frames, but introduces a lot of new problems

bump moonlight-common-c to fix 32-bit rollover issue

LiWait timing graph

Add displaylink interval graph

Graphs checkpoint

ImGui graph working checkpoint

ImGui working checkpoint

Add pending frames to stats, add a define for verbose logging

DisplayLink WIP

Add imgui & implot modules

Frame pacing: alternate method based on thieman's pullFrames thread

Frame pacing: simplify displayLink, support passing targetTimestamp down to the sample buffer

Point to my common-c with some timing changes.

Add stats gestures: 2-finger swipe down to show stats, and 2-finger swipe up to hide

Limit refresh rate to 60 when in low power mode

Display screen refresh rate in stats overlay, remove decode time and explain why it can't be measured

Adjust the refresh rate of the display to match the stream framerate and improve battery life

Don't use presentationTimeMs when creating CMSampleTimingInfo

Fix overlayView build for iOS

Refactor CADisplayLink callback for improved frame delivery. Support a user-configurable buffered frame count.

[opt] Use UILabel for stats overlay
2025-07-11 21:02:13 +08:00
Acaki 0473233775 fix: pip video freeze 2025-07-11 19:40:07 +08:00
Acaki 57b12d7a54 Revert "fix: flip UIRequiresFullScreen to true for pip to work properly"
This reverts commit 903312a9f16996a00bf8381dbbd62b8c8c990fd9.
2025-07-11 19:40:07 +08:00
Acaki 6c6d7b73c1 refactor: always create separate render view for stream as we no longer have disabled option 2025-07-11 19:40:07 +08:00
Acaki 10dcdc31d8 refactor: let os handle pip invocation 2025-07-11 19:40:07 +08:00
Acaki 7c725a4d80 fix: flip UIRequiresFullScreen to true for pip to work properly 2025-07-11 19:40:07 +08:00
Acaki 4640ec86ed Revert "fix: pip works only for first invocation"
This reverts commit 3df8f73c25e3ec81c4c90bedd01de7cea7bdda3f.
2025-07-11 19:40:07 +08:00
Acaki 03cabd0506 fix: pip works only for first invocation 2025-07-11 19:40:07 +08:00
Acaki 879c2f368c feat: update storyboard and translations for pip 2025-07-11 19:40:07 +08:00
Acaki fc73e7a3b2 build: dep update 2025-07-11 19:40:06 +08:00
Acaki b9bd1c8c44 fix: SceneDelegate files wrong folder 2025-07-11 03:03:19 +08:00
Acaki b5ce7a8ff7 refactor: adopt UIScene lifecycle
feat: add initial support for pip

feat: add setting toggle for pip

fix: let os handle invokation of pip which is more reliable

fix: UIScene compatibility with airplay

fix: black screen on external display when on app view and streaming

fix: incorrect window size when launched directly on external display

fix: wrong resolution shown in settings when in stream session

Enable gamemode flag for iOS18+

Explicitly enters pip mode when in background
2025-07-11 01:34:53 +08:00
TrueZhuanjia 51e915b598 disable unlockorientationSelector when it's iPad + requiresFulscreen disabled 2025-07-10 22:29:28 +08:00
TrueZhuanjia 0addca3876 Merge branch 'gyroImprovements' into Integration
- disable gyro mode selector when it's unable to perform in-stream hot switch
- make osc enabled when gyroMode is not off
- make it unable to set oscEnabled to false in streaming, to ensure gyro hot switch keeps working.
2025-07-10 22:19:56 +08:00
TrueZhuanjia 09349ebdef disable gyro mode selector when it's unable to perform in-stream hot switch 2025-07-10 22:10:48 +08:00
TrueZhuanjia e93d031f86 - make oscEnabled when gyroMode is not off
- make it unable to hot switch oscEnabled to false in streaming
2025-07-10 12:52:51 +08:00
Acaki c491132c09 fix: need to touch any buttons on physical controller for it to show up on host 2025-07-09 20:28:13 +08:00
Acaki 0fef5a389d fix: auto gyro mode not working for controllers without gyro 2025-07-09 17:39:55 +08:00
Acaki 0047bfe51f fix: built-in gyro not working when resuming stream 2025-07-09 14:17:29 +08:00
Acaki 994a60c8a4 fix: missing right brace and wrong device type for osc gyro 2025-07-08 22:40:22 +08:00
TrueZhuanjia 50d53cd826 tweak hostSpinner & lockIcon location for hostcard view 2025-07-08 22:36:18 +08:00
Acaki 1d6906e5e7 fix: virtual controller still appears when osc is disabled 2025-07-08 21:12:19 +08:00
Acaki 2c8f2ee408 feat: hide home indicator without needing a controller connected 2025-07-08 21:12:19 +08:00
TrueZhuanjia 4810451e6a tweak storyboard ui strings for zh-hant localization 2025-07-08 20:45:42 +08:00
TrueZhuanJia 60801e3553 Merge pull request #2 from Acaki/fix/translations
Update translations for zhhant and hk
2025-07-08 20:25:21 +08:00
Acaki 9bdd92aeb3 feat: update translations for zhhant and hk 2025-07-08 16:52:57 +08:00
TrueZhuanjia 835c9c1166 surround sound UI, localization tweak & fixes 2025-07-08 14:59:15 +08:00
TrueZhuanJia 9da143ed81 Merge pull request #1 from Acaki/feat/surround_sound
Add config to set audio channels
2025-07-08 11:59:58 +08:00
TrueZhuanjia f7a032a918 fix touchMode - osw - tapGestureForSoftkeyboard settings menu logic 2025-07-08 11:35:28 +08:00
TrueZhuanjia eacdda384a does not force return to host view after session connection 2025-07-07 22:56:44 +08:00
TrueZhuanjia 1f13fd691b fix unable to reorder setting items in favorite menu by long pressing 2025-07-07 22:14:50 +08:00
TrueZhuanjia 73de0877a1 switch to built-in gyro only when external controllers don't have any 2025-07-07 21:36:07 +08:00
Acaki 616c7673a4 Update SDL2 to newest version to fix 7.1 playback
This fixes 7.1 playback. Before this commit, SDL used 7.1 front audio configuration with Center Left and Center Right speakers, but without Rear speakers.

See https://github.com/libsdl-org/SDL/issues/11709 for more details.
2025-07-07 20:14:09 +08:00
Acaki 489e60d2b1 feat: add setting for audio configuration 2025-07-07 20:13:39 +08:00
TrueZhuanjia af2a2728f8 fix legacy osc button drag to delete issue 2025-07-07 11:50:41 +08:00
TrueZhuanjia 91f012ee9f disable user interaction when settings menu expanded in-streaming 2025-07-07 11:32:10 +08:00
TrueZhuanjia c4bc77db05 disable run-time theme switch 2025-07-07 09:46:56 +08:00
TrueZhuanjia 6579ea681e allows 30 min background streaming 2025-07-07 09:31:17 +08:00
TrueZhuanjia 07b6aa099b remove useless code 2025-07-06 23:38:00 +08:00
TrueZhuanjia e10a296305 iOS18 gameMode support 2025-07-06 23:28:56 +08:00
TrueZhuanjia c42fe94b46 reset controller gyro input when switched away 2025-07-06 23:01:35 +08:00
TrueZhuanjia 1d0743cda6 remove tmp annotations 2025-07-06 22:43:44 +08:00
TrueZhuanjia 0f6f105ec1 implementation of auto gyro mode 2025-07-06 22:36:18 +08:00
TrueZhuanjia 578ad81b8a switch between built-in & controller gyros 2025-07-06 21:12:57 +08:00
TrueZhuanjia 3cbdba78d6 fix osw stuck caused by gyro event 2025-07-04 23:38:11 +08:00
TrueZhuanjia 1de7592e86 remove useless codes in settingsViewController 2025-07-04 21:01:28 +08:00
TrueZhuanjia 6a9891adee c-module ready 2025-07-04 21:00:04 +08:00
TrueZhuanjia 29700e6f18 fix crash caused by long pressing blank area in favorite mode 2025-07-03 13:11:50 +08:00
TrueZhuanjia 7426e3e78c exchange trash & undo button for oswTool 2025-07-02 22:14:43 +08:00
TrueZhuanjia 724a11ae4f minor tweak 2025-07-02 21:57:43 +08:00
TrueZhuanjia 03d08a2c65 toolbox local soft keyboard toggle localization 2025-07-02 19:49:23 +08:00
TrueZhuanjia f24e68d0d9 change statsoverlay default setting 2025-07-02 17:09:33 +08:00
TrueZhuanjia a07e94ca74 toolbox local soft keyboard toggle 2025-07-02 17:02:20 +08:00
TrueZhuanjia 14a384436c gcDeviceBatteryState compatibility 2025-07-02 11:17:39 +08:00
TrueZhuanjia 6be5aa6507 current widget name displayed on current profile label 2025-07-02 10:55:35 +08:00
TrueZhuanjia 97d17f505b trackball deceleration rate implementation 2025-07-02 10:15:15 +08:00
TrueZhuanjia c2ed8c5517 minor tweak 2025-07-02 01:51:22 +08:00
TrueZhuanjia ac299287e4 tap to stall trackball scrolling 2025-07-02 01:21:47 +08:00
TrueZhuanjia ec5aec2601 trackball implementation 2025-07-02 00:52:41 +08:00
TrueZhuanjia 59033ff8d7 update 2025-07-02 00:35:39 +08:00
TrueZhuanjia 88edc7f263 smaller widgetPanel spacing for ipad 2025-07-02 00:27:07 +08:00
TrueZhuanjia 19882a9373 osw mousePad improvement: micro move fix 2025-07-02 00:07:47 +08:00
TrueZhuanjia 620385501f relativeTouch improvements:
- fix micro move issue
- fix clumsy move in portrait mode
2025-07-01 23:49:02 +08:00
TrueZhuanjia d0eb864814 move gyro settings to experimental stack 2025-07-01 23:05:12 +08:00
TrueZhuanjia 1920735efa gyro storyboards & localization 2025-07-01 23:00:57 +08:00
TrueZhuanjia 7370fa5c94 gyroSensitivity implementation 2025-07-01 22:25:54 +08:00
TrueZhuanjia a875a65a7f in-stream gyro switch stage 1 2025-07-01 13:00:18 +08:00
TrueZhuanjia 88414cd3db initial build for motion mode 2025-06-29 19:59:56 +08:00
TrueZhuanjia 00aff53e35 iboutlet motionselector ipad 2025-06-29 19:45:46 +08:00
TrueZhuanjia 62561ac423 update 2025-06-29 16:23:41 +08:00
TrueZhuanjia d26cef7ef4 rounded icon 2025-06-29 16:35:06 +08:00
TrueZhuanjia 527fb16428 white bg icon 2025-06-29 11:49:39 +08:00
TrueZhuanjia 0f7ba20e65 update 2025-06-29 11:40:54 +08:00
TrueZhuanjia 94e9bc35b1 icon1 2025-06-29 10:39:09 +08:00
TrueZhuanjia b3fd9e51d7 debug bundle id for tf version 2025-06-28 13:35:10 +08:00
TrueZhuanjia bef2456bea app icon test 2025-06-28 13:17:09 +08:00
TrueZhuanjia 25f65c3596 testflight bundle id 2025-06-28 00:42:32 +08:00
TrueZhuanjia 8260624a41 ignore .github 2025-06-27 14:47:01 +08:00
TrueZhuanjia 7ab1c43588 remove workflow 2025-06-27 01:54:45 +08:00
TrueZhuanjia 7d0477204b new bundle id 2025-06-26 22:59:46 +08:00
TrueZhuanjia 8f1dda44b9 further renaming 2025-06-26 22:37:00 +08:00
TrueZhuanjia ee03f6b866 further renaming 2025-06-26 22:15:18 +08:00
TrueZhuanjia 9e41537554 rebrand project to VoidLink 2025-06-26 21:23:11 +08:00
TrueZhuanjia 8baa2e9067 rename dataModel to VoidLink 2025-06-26 20:59:49 +08:00
TrueZhuanjia 556db88ff7 minor tweak 2025-06-26 02:10:32 +08:00
TrueZhuanjia 9063331d38 - button down action for MOUSEPAD 2025-06-26 01:17:31 +08:00
TrueZhuanjia 594906c121 fix host card resizing issue 2025-06-25 22:34:43 +08:00
TrueZhuanjia 357a907838 stage manager & display orientation lock for iPhone 2025-06-25 20:52:07 +08:00
TrueZhuanjia 6bc142a07b - notification lifecycle fixes - replace some notifications with delegates
- fix osw profile switch issue
2025-06-22 21:25:29 +08:00
TrueZhuanjia cd6e08956c - widget tool improvements
- tool box constraint fixes
2025-06-22 15:57:29 +08:00
TrueZhuanjia 9937b67509 iphone localization fix 2025-06-22 11:48:05 +08:00
TrueZhuanjia c478d641c6 add non-favorite setting stacks to favorites only 2025-06-22 11:21:38 +08:00
TrueZhuanjia 1702f37d3e - localization fixes
- auto hide all hidden menusections
2025-06-22 11:11:52 +08:00
TrueZhuanjia e1920ddb01 audio menuSection 2025-06-22 10:40:31 +08:00
TrueZhuanjia 9b5b93dc31 iphone menu spacing 2025-06-22 10:23:27 +08:00
TrueZhuanjia cd4c5bbc56 - legacy osc vibration style
- vibration style ios13 compatibility
- low ios verision UI fixes
2025-06-22 10:11:11 +08:00
TrueZhuanjia 47bae92dd5 downsized widget panel for iphone 2025-06-20 00:35:02 +08:00
TrueZhuanjia a5bbca55a2 widgetPanelStack coding fix 2025-06-18 20:47:31 +08:00
TrueZhuanjia a4f5c4f211 - create/reload/update onscreenWidget layer index fix
- iphone OSW layoutTool bar storyboard
2025-06-17 22:59:53 +08:00
TrueZhuanjia 9c61e5725f host view & menu size tweak 2025-06-17 21:07:53 +08:00
TrueZhuanjia 8c4f2e46f7 tweak host card 2025-06-17 20:27:00 +08:00
TrueZhuanjia 76253a9583 hostcard localization 2025-06-17 10:14:02 +08:00
TrueZhuanjia 5653215f68 new UI CN localization 2025-06-16 16:54:39 +08:00
TrueZhuanjia 1b9e9575f1 stage manager 2025-06-16 09:09:44 +08:00
TrueZhuangjia dfde770274 minor change 2025-06-15 23:26:22 +08:00
TrueZhuangjia 1737eae39b old iOS compatibility fixes:
- strong settingButton reference
- hidden stackView heightContraint
- navBarAppearance
2025-06-15 23:01:22 +08:00
TrueZhuanjia fb32ef3629 minor tweak 2025-06-14 21:37:28 +08:00
TrueZhuanjia 5734a0a0b7 highlighted background for long press setting stack 2025-06-14 21:34:31 +08:00
TrueZhuanjia 758a888a53 favorite section offset 2025-06-14 19:48:33 +08:00
TrueZhuanjia ed0045afec Other section & experimental section 2025-06-14 19:30:44 +08:00
TrueZhuanjia de5fb7a19b - Dynamic Label & its hiding mechanism
-
2025-06-14 18:09:31 +08:00
TrueZhuanjia e2bebbcc61 peripheral section 2025-06-14 10:52:27 +08:00
TrueZhuanjia 24fd69e7dc softkeyboard & layout osw gesture interaction 2025-06-14 01:12:16 +08:00
TrueZhuanjia 16b1f9164f new touch mode config 2025-06-13 18:12:08 +08:00
TrueZhuanjia 51a62ce1d8 settings menu resize 2025-06-13 12:39:16 +08:00
TrueZhuanjia 23b68b2d15 videoSection 2025-06-12 17:34:53 +08:00
TrueZhuanjia 7ee449c0e4 yuv444switch 2025-06-12 17:22:28 +08:00
TrueZhuanjia 2891beef5f storyBoard fix 2025-06-12 17:09:17 +08:00
TrueZhuanjia da47a6ae46 hdrSwitch 2025-06-12 13:38:54 +08:00
TrueZhuanjia 96145baa7a fix favorite settings relocation issue 2025-06-12 00:19:08 +08:00
TrueZhuanjia ab31ab393a video section - resolution new design & dynamic label for settings stacks 2025-06-11 23:41:37 +08:00
TrueZhuanjia 38ee17a852 better capturedStack locating 2025-06-11 19:11:34 +08:00
TrueZhuanjia 78be18ed89 visibility improvements 2025-06-10 23:42:23 +08:00
TrueZhuanjia 5fd8a7c587 on-screen widget tool icon compatibility 2025-06-10 21:05:34 +08:00
TrueZhuanjia 79a075e338 menuSection icon image compatibility 2025-06-10 20:24:35 +08:00
TrueZhuanjia 5c3a6de2b7 autoScroll improvement for settings menu 2025-06-10 11:56:23 +08:00
TrueZhuanjia 5a77571d6f otherSection 2025-06-10 00:14:08 +08:00
TrueZhuanjia 1e6a380f99 setting menuSections initial layout 2025-06-09 23:43:36 +08:00
TrueZhuanjia 8e00552c61 - new on-screen widget tool UI with movable widget panel
with iOS12 compatibility
2025-06-09 20:28:41 +08:00
TrueZhuanjia fabd01ca9e restore osc profile decode for ios12 2025-06-07 22:30:08 +08:00
TrueZhuanjia ab2efcf05a coding correction & old versoin better switch test 2025-06-07 21:50:28 +08:00
TrueZhuanjia dfaa4005bb - newUI ios12 compatibility
- settings wighet them color
- minor tweaks
2025-06-07 21:28:40 +08:00
TrueZhuanjia a64a29ce07 simulates ios 12 2025-06-07 18:25:45 +08:00
TrueZhuanjia 68f21fa8e5 ios 12 & 13 compatibility for moreButton of settings navBar 2025-06-07 18:18:41 +08:00
TrueZhuanjia d9dbb2bcee add to favorite actionsheet minor fix 2025-06-07 12:42:23 +08:00
TrueZhuanjia 782ac4c362 minor fix 2025-06-07 10:48:37 +08:00
TrueZhuanjia ff68114fe3 settingsView layout , separatorLine, etc 2025-06-07 01:48:57 +08:00
TrueZhuanjia cbf48bdf0a setting stack info button & its interactions 2025-06-06 23:29:35 +08:00
TrueZhuanjia fcb68bc54f settingView close/expand control 2025-06-06 22:44:17 +08:00
TrueZhuanjia a591380d60 close settings view before desktop launching 2025-06-06 22:17:01 +08:00
TrueZhuanjia 822dfc433b moreButton + disconnectButton in Streaming, and related codings 2025-06-06 22:06:47 +08:00
TrueZhuanjia 17ecd52755 dateModel Name change 2025-06-06 20:49:54 +08:00
TrueZhuanjia 6fd35deaa4 rebranding 2 2025-06-06 12:04:54 +08:00
TrueZhuanjia d80c2e35ca rebranding 1 2025-06-06 12:00:23 +08:00
TrueZhuanjia 7ed6c559e0 optimize relocating setting stacks to lowest point 2025-06-05 23:48:53 +08:00
TrueZhuanjia e5b1eda3a1 favorite setting stack removal function 2025-06-05 22:03:26 +08:00
TrueZhuanjia 3120cd785b - auto save favorite settings with order
- auto setup morebutton menu in 2 settings mode
2025-06-05 17:39:23 +08:00
TrueZhuanjia b036e01afc speed up settings menu loading 2025-06-05 16:03:01 +08:00
TrueZhuanjia 01e379eefe _UIConstraintBasedLayoutLogUnsatisfiable test 2025-06-05 02:19:18 +08:00
TrueZhuanjia 17a00a1604 setting stack relocation in favorite mode, with background color indicator 2025-06-05 00:49:06 +08:00
TrueZhuanjia 59660840e4 favorite settings basic fuction 2025-06-04 01:49:59 +08:00
TrueZhuanjia 2775ca09c7 - settings menu nav more bar button and separatorLine
- settings menu hit test
2025-06-03 20:58:04 +08:00
TrueZhuanjia 8c8fea0d4b switch wifi icon to svg 2025-06-01 14:30:02 +08:00
TrueZhuanjia 7f23c4a508 mainframVC coding 2025-06-01 12:38:59 +08:00
TrueZhuanjia fda5c8610c minor fixes 2025-06-01 11:18:09 +08:00
TrueZhuanjia 049034e5a9 - theme
- host card actions including long press
- add host button
2025-06-01 04:06:06 +08:00
TrueZhuanjia 6ae3beb2a5 - hostCardButtonActionDelegate
- better theme color management
2025-05-31 12:00:32 +08:00
TrueZhuanjia 13853449d2 hostCardView implementation 2025-05-29 23:22:22 +08:00
TrueZhuangjia 2679ba75af hide some settings in streaming 2025-05-17 23:07:33 +08:00
TrueZhuangjia 561080568c - modularized settings widgets for iPad
- navBar for settings menu
2025-05-17 22:40:10 +08:00
TrueZhuangjia 4edf1e2cf5 upstream updates 2025-05-15 15:30:00 +08:00
TrueZhuangjia e7998c3559 disable session disconnection in background 2025-05-14 11:22:10 +08:00
TrueZhuangjia 8f674d6a3d mark copyright 2025-05-14 11:01:24 +08:00
TrueZhuangjia f1a9fd2b4f cmd tool special entry visual effect 2025-05-14 01:54:30 +08:00
TrueZhuangjia 46f75f0676 first launcher tips 2025-05-14 01:27:05 +08:00
TrueZhuangjia d3b62e38fc Onscreen Widget Tool:
- edit/duplicate function support
- opened from cmd tool by sliding from screen edge
2025-05-13 23:18:32 +08:00
TrueZhuangjia c8ebdc0a88 disable async touch down&move priorities by GUI 2025-04-09 21:21:23 +08:00
TrueZhuangjia 238eb816d0 update c-module 2 2025-04-09 15:03:26 +08:00
TrueZhuangjia 0f054bb96f update c-module 2025-04-08 22:17:57 +08:00
TrueZhuangjia 711996b478 async touch qos & setting option 2025-04-08 22:15:11 +08:00
TrueZhuangjia a43fe609d3 tweak qos for async native touch 2025-04-04 16:39:00 +08:00
TrueZhuangjia 2712922ce5 setting option for async native touch 2025-04-04 14:29:54 +08:00
TrueZhuangjia 49b685b3ec update preset template profie 2025-04-03 18:15:22 +08:00
TrueZhuangjia 302606564c tweak dPad & L3R3 indicator 2025-04-03 01:04:03 +08:00
TrueZhuangjia 1fc1b5bc60 greyBackground for layout tool opened in settings menu 2025-04-03 00:42:20 +08:00
TrueZhuangjia f260d75372 preset advanced widget template profile 2025-04-03 00:13:52 +08:00
TrueZhuangjia a03a50d238 guide lines optimizations for legacy osc buttons 2025-04-02 20:35:14 +08:00
TrueZhuangjia 928284990b minor fixes 2025-04-02 16:59:35 +08:00
TrueZhuangjia 03046988c7 "airplay" for default external display mode 2025-04-02 10:39:32 +08:00
TrueZhuangjia c860433065 relative touch rollback 2025-04-01 22:22:52 +08:00
TrueZhuangjia 5d66c17bc1 fix LSPAD, RSPAD indicator visual effect glitches 2025-03-30 14:00:25 +08:00
TrueZhuangjia 16b5df7dd1 Fulscreen 2025-03-30 12:18:11 +08:00
TrueZhuangjia 589c025951 tweak on-screen widget resizing 2025-03-30 11:58:34 +08:00
TrueZhuangjia 7fbfe94b71 fix legacy osc button L1 R1 position shift after being duplicated 2025-03-30 10:36:54 +08:00
TrueZhuangjia 27bb8fd737 tweak storyboard 2025-03-29 22:03:18 +08:00
TrueZhuangjia cc285d5488 export profile Data 2025-03-29 21:44:06 +08:00
TrueZhuangjia c8522de476 normalize legacy controller position 2025-03-29 20:22:32 +08:00
TrueZhuangjia 94f2e39367 passing streamViewBounds 2025-03-29 19:43:03 +08:00
TrueZhuangjia bd83af8bf4 change touchMoveEvent range and default setting 2025-03-29 15:20:36 +08:00
TrueZhuangjia 420eebf831 async mouse move event for relative touch handler 2025-03-29 14:47:56 +08:00
TrueZhuangjia e0691dcd97 minStickOffset localization 2025-03-29 13:47:38 +08:00
TrueZhuangjia 24442c29bb touchPad move event async 2025-03-29 13:43:51 +08:00
TrueZhuangjia 871315c2bc - async native touch passthrough
- touchMoveEvent interval tweak
2025-03-29 00:51:05 +08:00
TrueZhuangjia 7b116b936c sensitivity tweak for direction touchpads (wasdpad, arrowpad, dpad) 2025-03-24 01:24:15 +08:00
TrueZhuangjia 9aa84c03d7 - button-touchPad hybrid widgets
- minimum stick offset for stick widgets
- expand controller cmd strings to playStation style
2025-03-24 00:36:24 +08:00
TrueZhuangjia 471325a358 - tweaking genshinImpact RsvPads ("YSB", "YSRT", "YSRB", "YSRSV") 2025-03-23 00:37:58 +08:00
TrueZhuangjia 978ab18cee - timeInterval command for super combo keys
- expand keyboardButtonMappings dict
2025-03-22 21:57:05 +08:00
TrueZhuangjia ea0c16e334 invalid input msgbox for adding on-screen widget 2025-03-22 21:55:05 +08:00
TrueZhuangjia dd0ff298d5 on screen widget shape - Chinese localization 2025-03-22 12:49:35 +08:00
TrueZhuangjia eca0b30728 - special game widget: YSLT for genshinImpact
- rename YSxx1 cmds to YSxx
2025-03-22 01:11:35 +08:00
TrueZhuangjia 9ade4b5ae0 special game widgets: YSRB1 2025-03-21 23:14:16 +08:00
TrueZhuangjia 4f8c5189e0 special game widgets: YSWASD, YSMR 2025-03-21 22:57:18 +08:00
TrueZhuangjia 0f2d54e8c0 - configurable on screen widget shape
- special game widgets: YSB1, YSRT1 for genshinImapct
2025-03-21 21:36:54 +08:00
Qian23333 c0fc1becb7 modify workflow to build Stage Manager version 2025-03-07 17:39:04 +08:00
TrueZhuangjia 70e5b3520c - fix the issue of previous selected on-screen widget get deleted when deleting legacy osc button
- coding improvements for on-screen widget deletion
2025-03-02 21:47:57 +08:00
TrueZhuangjia ebec9877b0 fix some traditional Chinese localization errors 2025-03-02 18:02:10 +08:00
TrueZhuangjia d9a5d8aaac tweak stick indicator border reaching visual feedback 2025-02-28 12:37:58 +08:00
TrueZhuangjia e58d05a85b slide from left to close settings menu 2025-02-26 23:46:39 +08:00
TrueZhuangjia 3efddab070 - vertical stick indicator offset
- smaller stick indicator cross
- animation for stick ball return
- border detection for stick ball
- allow zero alpha for custom on-screen touch pads
2025-02-26 22:48:10 +08:00
TrueZhuangjia a17a27005d fix on screen widget location shift while after quick tapping in layout tool 2025-02-23 20:42:31 +08:00
TrueZhuangjia a8f7f4679b github ipa build test 2025-02-23 19:39:21 +08:00
TrueZhuanJia 11c0119944 Merge pull request #60 from Qian23333/noWaterMark
actions build
2025-02-23 19:36:53 +08:00
TrueZhuangjia 80804ee7ac super combo custom on-screen button connected by "-" in key string 2025-02-23 16:12:23 +08:00
TrueZhuangjia 06e80823b8 try to fix: layoutTool unable to lock screen orientation in some conditions 2025-02-23 10:49:09 +08:00
TrueZhuangjia ecda390dc0 Merge branch 'DevDebug' into noWaterMark: tweak padding for iPad 2025-02-23 02:38:27 +08:00
TrueZhuanJia 481c443211 Merge pull request #57 from Acaki/feat/yuv444
Support YUV 4:4:4 streaming
2025-02-23 02:27:44 +08:00
Qian23333 80b7b8eaec Merge branch 'Moonlight-the-Fried-Fish:noWaterMark' into noWaterMark 2025-02-23 02:18:11 +08:00
TrueZhuangjia 1e33fc7935 tweak padding 2025-02-23 02:09:08 +08:00
Acaki 6b42d271ba refactor: adjust padding 2025-02-20 03:17:26 +08:00
Acaki 7823d1a60b refactor: remove unnecessary line 2025-02-20 01:16:01 +08:00
Acaki d23c4a5795 feat: update translations 2025-02-20 00:09:16 +08:00
Acaki c91c40e79f feat: update supportedVideoFormats according to YUV444 setting 2025-02-20 00:09:16 +08:00
Acaki 5302f418db feat: add YUV444 toggle 2025-02-20 00:09:16 +08:00
Acaki 6370bc187a fix: crypto build error 2025-02-20 00:09:16 +08:00
TrueZhuangjia 3e2dc4989e full screen version 2025-02-13 22:06:27 +08:00
TrueZhuangjia 715cb86ab9 - better alignment & resizing for on-screen widget view
- stage manager
2025-02-13 21:55:45 +08:00
TrueZhuangjia cf375eae84 full screen version 2025-02-10 00:57:33 +08:00
TrueZhuangjia 4d4ab333f4 - make dPad, select, start OSC button on-screen widgets rectangle
- on screen control & widget size factor up to 800%
- configurable borderWidth for on-screen widget views
stage manager version
2025-02-10 00:52:56 +08:00
TrueZhuangjia ca04c62ecd fullScreen version 2025-02-09 13:08:12 +08:00
TrueZhuangjia 34f632e7e4 - fix iPhone onScreen Widget sensitivity in storyboard
- fix the issue of unable to load touch point velocity factor higher than 200%
- 700% sensitivity available for touchPad mode mouse
- change maximum sensitivity for stick & on-screen mouse touchPad widget to 600%
stage manager version
2025-02-09 12:39:48 +08:00
TrueZhuangjia 4f952b5daa simplified statsOverlay, fullscreen version 2025-02-01 19:32:42 +08:00
TrueZhuangjia edcb9cf275 add simplified statsOverlay, stage manager version 2025-02-01 19:29:45 +08:00
TrueZhuangjia ac44efbbbe try to fix iPhone host view landscape lock 2025-01-31 09:14:39 +08:00
TrueZhuangjia e0a81dbd34 fullScreen version 2025-01-29 21:20:19 +08:00
TrueZhuangjia 301c8580c8 - onScreenWidget guidelines alignment with OnScreenControl CALayers
- stage manager version
2025-01-29 21:13:38 +08:00
TrueZhuangjia 9b9b278a14 - OnScreenButtonView refactored to OnScreenWidgetView
- oscLayer guideline alignment with onScreenWidgetViews
2025-01-29 19:37:31 +08:00
Qian23333 31c6569910 Create build.yml 2025-01-29 16:56:02 +08:00
TrueZhuangjia ed3a837200 fullscreen version 2025-01-29 16:11:24 +08:00
TrueZhuangjia 9cfa5f35cb fix touchPad sensitivity slider issue.
- stage manager version
2025-01-29 16:10:01 +08:00
TrueZhuangjia cc13b60411 in mainFrameView, lock landscape orientation for iPhone, lock current orientation for iPad
Fullscreen version
2025-01-28 18:59:18 +08:00
TrueZhuangjia caa4fccabd fullScreen version 2025-01-28 13:29:19 +08:00
TrueZhuangjia 4ba33002dd UI string updates for new onScreen widgets 2025-01-28 13:13:34 +08:00
TrueZhuangjia ef418be2df special overlay button "settings" implementation 2025-01-28 12:09:43 +08:00
TrueZhuangjia b7d8889180 sensitivity & stick indicator settings in touchPad profile config 2025-01-28 10:15:17 +08:00
TrueZhuangjia 18fe545533 UI construction for new TouchPad profile settings 2025-01-27 22:44:45 +08:00
TrueZhuangjia 87208b07a5 UI tweak 2025-01-27 01:55:51 +08:00
TrueZhuangjia c713eafac0 tweak visual effect for touchPads 2025-01-27 00:19:49 +08:00
TrueZhuangjia d493cba990 display "keystring" for touchPads in edit mode 2025-01-27 00:06:05 +08:00
TrueZhuangjia ae188fd999 MOUSEPAD implementation 2025-01-26 23:35:06 +08:00
TrueZhuangjia 5747656be7 implementation of round custom osc buttons in OnscreenButtonView.swift 2025-01-26 15:17:20 +08:00
TrueZhuangjia 4e85d3d079 DPAD implemention 2025-01-26 10:57:10 +08:00
TrueZhuangjia e2bd8b1512 implementation of WASDPAD & ARROWPAD 2025-01-25 22:39:02 +08:00
TrueZhuangjia 422c34f945 L3R3 button visual effect for onScreen touchPad 2025-01-25 22:04:07 +08:00
TrueZhuangjia 8d0b646fbe newTouchPad test - LRUD touchpad visual effect 2025-01-24 20:35:00 +08:00
TrueZhuangjia 2c4a7cc055 newTouchPad test phase3 2025-01-23 21:47:51 +08:00
TrueZhuangjia 54a31689f7 change annotations for unlock device orientation 2025-01-05 19:57:50 +08:00
TrueZhuangjia 6bf967b9d2 stage manager version 2025-01-05 13:55:29 +08:00
TrueZhuangjia b6abd71392 restore waterMark Text 2025-01-05 13:09:47 +08:00
TrueZhuangjia 8506640d7f change allowPortrait to unlockDisplayOrientationInStreaming 2025-01-05 12:54:08 +08:00
TrueZhuangjia 592b7acfc4 add legacy renderView mode 2025-01-05 12:02:15 +08:00
TrueZhuangjia 858843ff9a rename & refactor mouseMode to localMousePointerMode 2025-01-04 20:59:40 +08:00
TrueZhuangjia 9ffeba72fe stop user interaction for streamFrameController->renderView to fix multi-touch issue 2025-01-04 20:41:15 +08:00
TrueZhuangjia 4074823e4e newTouchPad test phase2 2025-01-04 19:48:57 +08:00
TrueZhuangjia b99172d932 Merge branch 'newTouchPad' into noWaterMark 2024-12-03 21:31:10 +08:00
TrueZhuangjia 017b03d200 new touchpad test 2024-12-03 21:30:23 +08:00
TrueZhuangjia ea12dd3c47 remove xcdatamodel v1.11 2024-12-03 21:28:38 +08:00
TrueZhuanJia 2b98543125 Merge pull request #43 from xzzpig/ExternalScreen
Add AirPlay support & Enhanced keyboard and mouse experience
2024-12-03 21:25:03 +08:00
xzzpig a0f13881bf Add key combo support 2024-12-01 18:16:46 +08:00
xzzpig 62ae63d7f6 Allow not capture mouse 2024-11-29 23:00:54 +08:00
xzzpig 589ca19e4f Add AirPlay support 2024-11-29 12:04:08 +08:00
TrueZhuangjia b1785b1fa5 fullscreen version 2024-11-25 20:37:00 +08:00
TrueZhuangjia 3fc26d279a stage manager version 2024-11-24 23:06:49 +08:00
TrueZhuangjia bde477558f - changes on background resolution update.
- disable allowPortrait setting option is force fullscreen is disabled in app bundle
2024-11-24 22:27:18 +08:00
TrueZhuangjia b5afe1fe29 onScreen touchPad control test 2024-11-24 21:30:23 +08:00
TrueZhuangjia 8b2470faf8 Merge branch 'noWaterMark' into DevDebug 2024-11-23 18:30:50 +08:00
TrueZhuangjia 7fcc3d0013 delete duplicated database entries in xcode project 2024-11-23 17:16:56 +08:00
TrueZhuangjia 153b6ce6fe annotations for onscreen controller stick move handling 2024-11-22 22:26:40 +08:00
TrueZhuangjia 777c825cca swift call obj-c test 2024-11-22 22:00:25 +08:00
TrueZhuangjia 33a8e02c5f update moonlight-common-c to 2024.10.21 2024-11-22 21:59:51 +08:00
TrueZhuangjia c797c9db1a restore runtime orientation limitation 2024-11-21 23:53:54 +08:00
TrueZhuangjia 766e30a066 Tips for screen orientation Change (non-FullScreen version) 2024-11-21 23:46:24 +08:00
TrueZhuangjia 3894d92f1b try to fix app crash issue triggered by manually adding host 2024-11-20 21:36:58 +08:00
TrueZhuangjia 2be2ffbcb6 change fullscreen/window resolution label for ipad 2024-11-20 21:02:00 +08:00
TrueZhuangjia 570dff2696 assign default settings for resolutionSelected & slide gesture screen edge 2024-11-20 12:53:28 +08:00
TrueZhuangjia be13295096 refactor app window resolution update to mainFrameView 2024-11-19 23:12:26 +08:00
TrueZhuanJia ea89d0a822 Merge pull request #37 from xzzpig/ExternalScreen
Add support to change app size
2024-11-19 21:02:28 +08:00
xzzpig d7bb9483e4 Update resolution table when mainView loaded 2024-11-19 14:56:33 +08:00
xzzpig 7699e47157 Modify the logic for saving resolution settings 2024-11-19 09:48:23 +08:00
xzzpig 978c50c271 Add support to change app size 2024-11-18 20:46:44 +08:00
TrueZhuanJia 0f5e644041 Merge pull request #26 from xzzpig/noWaterMark
修复某些特殊网络情况(网络掩码非24)时发送组播wol失败的问题 / Fix the issue of multicast WOL failure when sending in certain special network situations (such as network mask not being 24)
2024-11-08 21:11:24 +08:00
xzzpig c5e891eceb Fix the issue of multicast WOL failure when sending in certain special network situations (such as network mask not being 24) 2024-11-04 20:52:02 +08:00
TrueZhuangjia 147b2ce045 tweak watermark position 2024-11-04 20:06:23 +08:00
TrueZhuangjia 9553ec3d96 minor tweak on button down visual effect 2024-11-04 19:56:51 +08:00
TrueZhuangjia 890d3fbfe1 update waterMark 2024-11-04 19:45:36 +08:00
TrueZhuangjia b9ea8cc1a9 change button down effect for onScreenButtonView 2024-11-04 00:53:40 +08:00
TrueZhuangjia 141c9ee2ab change button down effect for onScreenButtonView 2024-11-03 23:31:17 +08:00
TrueZhuangjia f1811ca53d fix on-screen mouse middle button issue 2024-10-31 15:02:07 +08:00
TrueZhuangjia 5bf163f40c Merge branch 'DevDebug' into noWaterMark 2024-10-31 14:59:36 +08:00
TrueZhuangjia 395647cff9 代码注释 - 添加主机crash问题重点关注 2024-10-15 21:37:26 +08:00
TrueZhuangjia 3f3ffdca13 - fix disappearing on-screen sticks 2024-10-15 20:18:25 +08:00
TrueZhuangjia 34659cac70 tweak tap exclusion area size & its default value 2024-10-15 13:00:02 +08:00
TrueZhuangjia d8820df26e button size, height & alpha UISlider for iPhone storyboard 2024-10-15 12:42:06 +08:00
TrueZhuangjia 6495bad6fe button size, height & alpha labels with factors 2024-10-15 11:39:06 +08:00
TrueZhuangjia f918779fc8 adjustable on screen controller layer transparency 2024-10-15 10:48:53 +08:00
TrueZhuangjia 8999fd625d adjustable onScreenButtonView alpha(transparency) 2024-10-14 15:10:53 +08:00
TrueZhuangjia 113aaa1b81 button size & height slider labels 2024-10-13 23:33:22 +08:00
TrueZhuangjia ec29679c02 HD start & select buttons 2024-10-13 22:37:28 +08:00
TrueZhuangjia 962d19f3cb HD dPad buttons 2024-10-13 22:00:49 +08:00
TrueZhuangjia 3bec2d6e65 HD sticks 2024-10-13 19:14:47 +08:00
TrueZhuangjia 571812062f HD OSC round buttons 2024-10-13 17:27:28 +08:00
TrueZhuangjia c4801f9889 deal with invalid sizefactor 2024-10-13 09:15:25 +08:00
TrueZhuangjia ada2e6f480 resizable dPad buttons 2024-10-12 23:56:21 +08:00
TrueZhuangjia fadf023563 resizable on-screen sticks & single layer on-screen controller buttons 2024-10-12 19:32:58 +08:00
TrueZhuangjia 5db6aa0695 Merge branch 'noWaterMark' into buttonSizeTweak 2024-09-24 10:33:24 +08:00
TrueZhuangjia 1ca71bbc11 - Handles tap exclusion area for dPad 2024-09-24 10:32:11 +08:00
TrueZhuangjia 39b8429998 - on-screen button & on-screen controller resize test 2024-09-21 22:48:16 +08:00
TrueZhuangjia e05b626d51 9.0.263 build 63 2024-09-17 12:22:54 +08:00
TrueZhuangjia 146ca2353d - cancel mouseLeftButtonHeldDown flag 2024-09-17 11:11:27 +08:00
TrueZhuangjia 6d5c5fb0c2 - Fixed app crash caused by 2-finger mouse wheel event 2024-09-14 16:56:05 +08:00
TrueZhuangjia 3d5885f5bd - update UI string in settings 2024-09-14 16:20:54 +08:00
TrueZhuangjia 888ecad4d3 - implements upper screen edge touch detection for absolute touch mode 2024-09-14 16:03:43 +08:00
TrueZhuangjia b3a64fdf0f - minor fix 2024-09-14 14:14:43 +08:00
TrueZhuangjia dc8e361b6b - implements upper screen edge touch detection for relative touch(touchpad) mode 2024-09-14 14:02:04 +08:00
TrueZhuangjia 15bc488f71 - Completely refactor relative touch mode: implements quick double tap for dragging, simulates a real note book computer touchpad.
- Onscreen controllers, buttons & touchpad mouse able to work independently without blocking each other
- Tap exclusion area size upto 1000%
2024-09-14 12:29:31 +08:00
TrueZhuangjia 22b4cc6222 - add option to reverse physical mouse wheel direction
- add slider widget to adjust the size of tap exclusion area for on-screen buttons
2024-09-12 23:43:32 +08:00
TrueZhuangjia f5c03f8045 make on-screen buttons available for absolute touch 2024-09-12 15:20:55 +08:00
TrueZhuangjia 0a47becdc6 change default touch mode to native touch 2024-09-12 10:48:30 +08:00
TrueZhuangjia e4d264cc83 Change frame pacing zh-hans translation 2024-09-12 10:35:52 +08:00
True Zhuanjia 7c455b0daa 9.0.256 2024-09-04 14:19:10 +08:00
True Zhuanjia d2a1add105 remove invalid IP rule 2024-09-02 22:46:24 +08:00
True Zhuanjia dcdfbc7394 excludes on-screen controller & button taps for mouse scroller gesture in relative touch mode 2024-09-02 22:01:30 +08:00
True Zhuanjia 2b5a1c0551 Simplify border detection in native touch modes 2024-08-29 01:15:37 +08:00
True Zhuanjia cb034b96a4 Build 47: make bitrate stepping to 1Mbps under 70Mbps 2024-08-28 20:26:32 +08:00
True Zhuanjia e741f83c06 urgent fix: native touch pointer sensitivity tweak not working 2024-08-26 21:29:10 +08:00
True Zhuanjia b192360ef3 change watermark 2024-08-26 19:28:40 +08:00
True Zhuanjia a028191c82 make keyboard command delay 200ms 2024-08-24 23:46:04 +08:00
True Zhuanjia c6b27ad0e0 resolve conflicts between on-screen buttons & tap gestures 2024-08-24 23:29:18 +08:00
True Zhuanjia 1d1d4cbddf add mouse button function to commandManager & OnScreenButton 2024-08-24 16:48:17 +08:00
True Zhuanjia 747997f46c - Adjust stick style.
- Add + button for iphone
2024-08-23 21:41:29 +08:00
True Zhuanjia 805cf517bb adjust on screen keyboard button style 2024-08-22 23:20:50 +08:00
True Zhuanjia ea78b434d5 adjust UI 2024-08-22 22:38:53 +08:00
True Zhuanjia 69f5fbef31 - Resolving app crash which happens occasionally after slide from screen edge
- Slide from upper 40% of left & right screen edge to open in-stream menus will  no longer sends touch event to remote PC
2024-08-22 19:49:09 +08:00
True Zhuanjia db75cac9bc Build 31 touches spawned at the upper 40% screen edge (left or right) will not be sent to the remote PC 2024-08-20 23:16:26 +08:00
True Zhuanjia ba4af74a9d make on-screen L1/R1 & left & right stick larger by setting option 2024-08-20 21:18:06 +08:00
True Zhuanjia fb474237ee Build 29 oscPofileManViewController UI Improvement 2024-08-19 23:46:55 +08:00
True Zhuanjia d476f5d75b build 28, change on screen button visual effect color 2024-08-19 01:35:40 +08:00
True Zhuanjia 8720847f54 build 27, adjust font size for onscreen key label 2024-08-19 00:32:21 +08:00
True Zhuanjia a12bd80cc1 build 26, custom on screen keyboard localization 2024-08-18 23:50:32 +08:00
True Zhuanjia ab3c551357 implements custom on screen keyboard button 2024-08-18 23:29:00 +08:00
True Zhuanjia a1a7047370 make osdLayoutToolFingers configurable by settings menu 2024-08-17 21:29:44 +08:00
True Zhuanjia 29e43979a7 make OSC + native touch works 2024-08-17 18:59:54 +08:00
True Zhuanjia 6b25de1361 minor change 2024-08-17 01:18:34 +08:00
True Zhuanjia 53e68258f3 2nd time - completely resolving conflict between custom tap gesture & onscreen control taps 2024-08-16 21:45:50 +08:00
True Zhuanjia 6e3c982a22 Merge branch 'noWaterMark' into OSCDebug
# Conflicts:
#	Limelight/Input/StreamView.m
#	Limelight/ViewControllers/StreamFrameViewController.m
2024-08-15 22:29:55 +08:00
True Zhuanjia f0e812e9e2 iterate all customTapGestureRecognizer in OnScreenControls implementation to resolve conflict between tap gesture & osc touch 2024-08-15 21:55:01 +08:00
True Zhuanjia 9ff10135a8 - optimize _areVirtualControllerTap mechanism, fix onscreen game controller button stuck
- change keyboard toggle gesture finger number logic
2024-08-15 09:34:43 +08:00
True Zhuanjia 9618b7bb94 optimize _areVirtualControllerTap mechanism, fix onscreen game controller button stuck 2024-08-14 22:51:51 +08:00
True Zhuanjia fd768db70b onscreen keyboard profile test 2024-08-14 22:49:35 +08:00
True Zhuanjia 3c5b6ba795 udpate 2024-08-14 22:44:12 +08:00
True Zhuanjia add09210ba update 2024-08-11 21:59:21 +08:00
True Zhuanjia 6065b4f742 keyboard button profile test 2024-08-11 21:55:29 +08:00
True Zhuanjia d90bf747fc add OSC visual feedback & corresponding menu option.
adjust menu option layout for iPhone
2024-08-10 21:02:35 +08:00
True Zhuanjia ec8095ea9d fix Custom OSC abnormal touch (no response) after editing OSC profile 2024-08-10 11:52:24 +08:00
True Zhuanjia b11849e45b Merge branch 'onScreenKey test' into noWaterMark
# Conflicts:
#	Limelight/Input/ControllerSupport.m
2024-08-09 18:54:38 +08:00
True Zhuanjia e2f09d711d on screen key test 2024-08-09 18:51:12 +08:00
True Zhuanjia 04b68e3a61 test 2024-08-09 18:02:26 +08:00
True Zhuanjia b21b93ff71 cancel some restrictions for iOS 13.3 & lower 2024-08-09 11:40:41 +08:00
True Zhuanjia 9f9df09c61 test flight build (No.12) 2024-08-06 23:03:22 +08:00
True Zhuanjia c7700904e0 handle public ip 2024-08-03 20:57:32 +08:00
True Zhuanjia a8b45851cc rm waterMark 2024-08-03 18:43:33 +08:00
True Zhuanjia bf1a30505f try to fix invalid MAC issue that happens in some cases 2024-08-03 18:42:35 +08:00
True Zhuanjia 7a55fee258 fill sapces for all UI strings in settings view storyboard 2024-08-01 19:08:12 +08:00
True Zhuanjia abc7805aab add high bitrate warning to the settings view 2024-07-29 12:27:47 +08:00
True Zhuanjia 98db99b3ff minor improvement for command tool 2024-07-28 10:03:38 +08:00
True Zhuanjia 07d08918a3 improve entry selection after add / deleting entries in the command tool 2024-07-27 22:51:24 +08:00
True Zhuanjia 8371c9fedd fix unable to remove on-line paired host 2024-07-27 21:45:04 +08:00
True Zhuanjia b106e60880 add switch for attachWatermark 2024-07-27 12:45:08 +08:00
True Zhuanjia 81c04bc2b2 add watermark back to the host view in mainframe 2024-07-27 12:43:04 +08:00
True Zhuanjia 945a4c67e4 improve add / duplicate button 2024-07-26 22:24:28 +08:00
True Zhuanjia 95644075ec improve entry tapping flash effect for cmd tool tableview cells 2024-07-26 21:57:38 +08:00
True Zhuanjia 19adb5e106 update annotation 2024-07-26 21:44:49 +08:00
True Zhuanjia ff789200b9 add more default entries for cmd tool 2024-07-26 21:35:46 +08:00
True Zhuanjia b53b0784aa implement default entries for command tool. change add button to add/duplicate 2024-07-26 21:05:10 +08:00
True Zhuanjia 69056332d3 change command tool view constraint & transparency 2024-07-26 20:15:07 +08:00
True Zhuanjia f5342caca6 update placeholder for alias input field 2024-07-26 19:53:36 +08:00
True Zhuanjia 039bf549a9 refactor coding & settings menu for command sending tool 2024-07-26 00:19:39 +08:00
True Zhuanjia ea9e335a36 refactor Cancel button in osc layout tool to Exit button 2024-07-25 21:57:31 +08:00
True Zhuanjia 46e3f85903 localize send command view 2024-07-25 21:31:06 +08:00
True Zhuanjia b00d836c13 add pin button for the sending cmd view 2024-07-25 21:02:05 +08:00
True Zhuanjia b587279450 update 2024-07-25 01:07:17 +08:00
True Zhuanjia 279ef707d5 update 2024-07-25 01:06:52 +08:00
True Zhuanjia 7e8be94530 implement async keyboard event sending 2024-07-25 00:30:02 +08:00
True Zhuanjia c8262da5d7 sending keyboard cmd 2024-07-24 23:50:16 +08:00
True Zhuanjia 81beb35809 keyboard command test 2024-07-24 22:56:46 +08:00
True Zhuanjia eb302e5d19 correct CTRL & ALT keycode for toolbar 2024-07-24 22:15:36 +08:00
True Zhuanjia 9c54168173 cancel filling selected alias for the input field for new keyboard cmd entries 2024-07-24 20:23:30 +08:00
True Zhuanjia 3eb233ffe2 handling empty alias for keyboardCmdSring 2024-07-24 20:18:10 +08:00
True Zhuanjia cf21ca9503 conforming RemoteCommand class to NSSecureCoding 2024-07-24 20:09:16 +08:00
True Zhuanjia b6ecdcd0ea make key mapping static 2024-07-24 19:29:52 +08:00
True Zhuanjia a975b0e24a keep entry of send cmd manager selected 2024-07-24 19:20:54 +08:00
True Zhuanjia 84b198ed29 implement regular expression check 2024-07-24 18:56:41 +08:00
True Zhuanjia 4cff75c531 tweak view contrain 2024-07-24 13:02:13 +08:00
True Zhuanjia 916e9b65a6 implementation of alias for the send special command entries 2024-07-24 12:36:01 +08:00
True Zhuanjia eb6adea47c UI & Data persistence for Send Special Keys menu 2024-07-23 23:52:20 +08:00
True Zhuanjia 458daddf38 disable exitSwipeRecognizer for settings view 2024-07-22 12:49:26 +08:00
True Zhuanjia ea98fe1fbf minor changes 2024-07-21 10:39:18 +08:00
True Zhuanjia c3b7814542 update provisioning 2024-07-21 01:50:31 +08:00
True Zhuanjia abe414765e try to fix LAN host waking failure. 2024-07-21 01:14:17 +08:00
True Zhuanjia 9a93022478 update storyboard UI string for "allow portrait" setting 2024-07-20 20:04:03 +08:00
True Zhuanjia 033265d58e disallow orientation change in mainframe host view (need iOS16+) 2024-07-20 19:40:49 +08:00
True Zhuanjia 2bcdd25cc2 fix onscreen control not working after enabled from realtime game back menu, if the stream view is launched without onscreen control in the first time 2024-07-20 16:39:22 +08:00
True Zhuanjia c38dfc2c20 exclude bottom right corner for coord reset in high touch pointer velocity condition 2024-07-16 20:56:06 +08:00
True Zhuanjia ef5c77d8df fix touch interruption on the left side of screen under high pointer velocity (sensitivity) 2024-07-15 13:01:18 +08:00
True Zhuanjia b05c3c7e4a on iPhone, force close expanded settings view if target device orientation will be portrait. 2024-07-14 18:44:02 +08:00
True Zhuanjia 606ec51108 update NSLog for velocFactor 2024-07-14 18:24:14 +08:00
True Zhuanjia 3dbc97701d change pointer reset coordinate, change max pointer velocity 2024-07-14 18:19:16 +08:00
True Zhuanjia 31b3df08cc coord reset for extremely high pointer velocity, core implementation 2024-07-14 16:41:26 +08:00
True Zhuanjia 01718282ff single Host view refresh bug fix 2024-07-14 01:05:40 +08:00
True Zhuanjia 1b5f414c89 starRail pointer veloc tweak enchancement 2024-07-13 22:52:17 +08:00
True Zhuanjia a441670591 temporally enable allowPortrait selctor 2024-07-13 18:57:20 +08:00
True Zhuanjia 7c0f9b65f1 update annotation 2024-07-13 18:28:57 +08:00
True Zhuanjia 837a75c477 get isIPhonePortrait flag ready for release 2024-07-13 18:18:19 +08:00
True Zhuanjia 0a449c25eb Test: disable settings view in portrait mode for iphone (prevents buggy settings view), flag not ready for release 2024-07-13 17:51:19 +08:00
True Zhuanjia 88d5038f94 make allowportrait selector available on iOS16+ only 2024-07-13 14:32:50 +08:00
True Zhuanjia 2de3197ca9 runtime orientation limitation, tested on iOS17.2 (probably need iOS16+, not working with iOS14) 2024-07-13 13:55:10 +08:00
True Zhuanjia c72accb3cb scroll view update upon orientation change 2024-07-12 23:30:08 +08:00
True Zhuanjia 00d89f12e8 correct landscape host view well device sensor is portrait 2024-07-12 22:48:53 +08:00
True Zhuanjia 565e31983c landscape limitation test 2024-07-12 22:08:34 +08:00
True Zhuanjia 06aa772a02 orientation change test 2024-07-12 21:13:19 +08:00
True Zhuanjia a5b1cd6c99 revert to both rotatable 2024-07-12 20:33:55 +08:00
True Zhuanjia d84be68f4c udpate 2024-07-12 20:31:26 +08:00
True Zhuanjia e01b51bf37 back to landscape only 2024-07-12 00:12:38 +08:00
True Zhuanjia 9c6bf5c16f correct method name 2024-07-12 00:09:37 +08:00
True Zhuanjia 9bf4ba9af9 adjust widgets alignment 2024-07-12 00:00:22 +08:00
True Zhuanjia a37c7ed8f8 go back to stream view button for iphone 2024-07-11 23:50:32 +08:00
True Zhuanjia 36ba82dd16 go back to stream view button on ipad 2024-07-11 23:32:17 +08:00
True Zhuanjia 802f8714ef cancel immediate opening of osc layout tool in setting view during streaming 2024-07-11 03:13:49 +08:00
True Zhuanjia bf6cf21084 resolve absolute touch gesture 2024-07-11 02:54:36 +08:00
True Zhuanjia 30df8aec8a full auto screen resolution update in background 2024-07-11 01:34:16 +08:00
True Zhuanjia 84bffdd287 cancel auto osc mode 2024-07-11 01:14:24 +08:00
True Zhuanjia 6c4b5321e1 update iphone storyboard cn localization 2024-07-11 00:38:25 +08:00
True Zhuanjia 14ef07f072 fix gesture reconfig in real time streamview 2024-07-11 00:28:27 +08:00
True Zhuanjia 52c2a831d9 update statsOverlay localization 2024-07-10 02:22:25 +08:00
True Zhuanjia d427270699 localize statsOverlay 2024-07-09 23:39:17 +08:00
True Zhuanjia b25f2d0916 add statsOverlay realtime setting config 2024-07-09 23:12:04 +08:00
True Zhuanjia 56fc18c378 add exit button by storyboard, config widget disabling in streamview settingview 2024-07-09 22:42:01 +08:00
True Zhuanjia 38343c20cb get stream real time setting menu working 2024-07-08 23:59:42 +08:00
True Zhuanjia 6f1773d512 Real Time setting menu in streamView beta 2024-07-08 20:45:48 +08:00
True Zhuanjia d9fc1fc5c9 fix swipeToExitDistance loading problem 2024-07-08 19:57:51 +08:00
True Zhuanjia 3ad8b0db71 backmenutmp 2024-07-08 19:43:23 +08:00
True Zhuanjia a021784d48 replace force expand & close of settings view with background resolution width & height swap 2024-07-08 19:06:59 +08:00
True Zhuanjia 072f7bdffb force reload setting after quitting remote session 2024-07-07 13:38:11 +08:00
True Zhuanjia b8a3aa5d8c fix physical mouse wheel direction 2024-07-07 13:09:58 +08:00
True Zhuanjia ee91177ca6 fix OSCLayoutTool multi-reload bug 2024-07-07 12:34:59 +08:00
True Zhuanjia 3f02a76c3d update iphone storyboard 2024-07-07 12:34:04 +08:00
True Zhuanjia c88753c7e9 HybridNativeTouchMode 2024-07-07 12:19:03 +08:00
True Zhuanjia 94addc69f7 res auto load improvement 2024-07-07 03:48:53 +08:00
True Zhuanjia b4cfe21074 fix setting view won't expand after quitting remote session 2024-07-05 19:35:07 +08:00
True Zhuanjia 8437c8ada1 update default touchMode setting in database 2024-07-05 17:49:40 +08:00
True Zhuanjia 0a5109823c add resolution auto update for orientation change 2024-07-05 17:41:45 +08:00
True Zhuanjia e863a5df6a update annotation 2024-07-04 23:13:58 +08:00
True Zhuanjia 547eb1c85d auto res table update on orientation change 2024-07-04 23:04:45 +08:00
True Zhuanjia 63c853d4ce add portrait mode 2024-07-04 20:57:57 +08:00
True Zhuanjia 329c9b7b92 add touch mode label description 2024-07-04 20:47:21 +08:00
True Zhuanjia 0789a2f27e native only & native touch mode 2024-07-04 01:04:00 +08:00
True Zhuanjia 382116ab21 add waterMark 2024-07-03 20:50:00 +08:00
True Zhuanjia 7290bff594 display zh-hans for 2 zh-hant localizations 2024-07-03 12:59:14 +08:00
True Zhuanjia 8b57c448ef fix mini5 menu widget visibility update problem.
update Chinese Localizatioin
2024-07-02 21:55:51 +08:00
True Zhuanjia e5cf54e92f update localization 2024-07-01 18:06:08 +08:00
True Zhuanjia 34d9875ff3 host discovery Chinese localization. Cancel LAN restriction 2024-06-30 23:46:21 +08:00
True Zhuanjia 070fbc8b52 Chinese Localization 2024-06-30 22:26:52 +08:00
True Zhuanjia 9d57c22757 Fix weird setting & select new host disabling after closing OSC layout tool 2024-06-29 20:21:45 +08:00
True Zhuanjia 93f1a2b4fb prevent default layout from being changed, fix fake layout change bug 2024-06-29 09:27:24 +08:00
True Zhuanjia a156962259 current profile UILabel 2024-06-28 19:32:15 +08:00
True Zhuanjia 9d8fbf789f iphone OSC profile manager transparency improvements 2024-06-28 14:22:35 +08:00
True Zhuanjia 0d91be217b iphone transparency + exit icon 2024-06-28 12:56:19 +08:00
True Zhuanjia 91a8fdc392 OSCLayoutTool Improvements 2024-06-28 10:27:06 +08:00
True Zhuanjia b79a762ce1 enhanced CustomOSC, allow users to rebase OSC in stream view 2024-06-26 03:16:41 +08:00
True Zhuanjia 46770f4588 Merge branch 'onScreenControlStuckFix' into CustomOSC-Integration 2024-06-25 02:11:12 +08:00
True Zhuanjia aae87d1684 fix onscreenControl Stuck 2024-06-25 02:08:43 +08:00
True Zhuanjia 0bac5f1ae9 CustomOSC first integration 2024-06-24 23:15:55 +08:00
True Zhuanjia 457a4e8725 Merge commit 'CustomOSCRebase' into CustomOSC-Integration
# Conflicts:
#	Limelight/ViewControllers/SettingsViewController.h
#	Limelight/ViewControllers/SettingsViewController.m
#	Limelight/iPad.storyboard
#	Limelight/iPhone.storyboard
2024-06-24 18:55:20 +08:00
True Zhuanjia a5c8224023 add mouse pointer velocity tweak for trackpad (relative) mode 2024-06-23 21:31:18 +08:00
True Zhuanjia 001deeee66 update annotation 2024-06-21 20:16:23 +08:00
True Zhuanjia 7847299c77 minior change 2024-06-21 01:04:50 +08:00
True Zhuanjia ac77447066 minor change 2024-06-20 23:32:48 +08:00
True Zhuanjia f09c7be18d NativeTouchHandler improvement, general coding improvements. 2024-06-20 22:52:38 +08:00
True Zhuanjia ee4eb35fe3 improved coding for native touch 2024-06-20 11:51:46 +08:00
True Zhuanjia 8834f492b4 tweak RIGHTCLICK_TAP_DOWN_TIME_THRESHOLD_S for relative touch 2024-06-18 13:03:01 +08:00
True Zhuanjia f2cf788d86 minor change 2024-06-18 02:25:08 +08:00
True Zhuanjia c3c7e670fc resolve gesture competition in non-native touch modes 2024-06-18 02:12:35 +08:00
True Zhuanjia c3d44647f9 CustomTapGestureRecognizer improvement 2024-06-17 22:56:55 +08:00
True Zhuanjia 115d540b7d UI string improvement 2024-06-17 22:19:58 +08:00
True Zhuanjia ec4299fd88 Right click gesture & scroll gesture improvement in relative touch (trackpad) mode;
CustomTapGestureRecognizer improvement.
2024-06-17 21:45:11 +08:00
True Zhuanjia c6785e3728 minor improvement 2024-06-17 01:10:15 +08:00
True Zhuanjia b2e4d45025 minor change 2024-06-17 00:33:26 +08:00
True Zhuanjia 4170376945 del unnecessary files 2024-06-17 00:26:29 +08:00
True Zhuanjia 01d2a937ca update annotation 2024-06-17 00:20:39 +08:00
True Zhuanjia 4e3be8513d recover absolute touch related code. StreamFrameViewController gesture recovered 2024-06-17 00:03:46 +08:00
True Zhuanjia c8f0d8bf0b recover absolute touch related codes 2024-06-16 23:42:07 +08:00
True Zhuanjia bfe02ed6a3 minior change 2024-06-16 22:56:53 +08:00
True Zhuanjia 3442df0ca4 remove deprecated codes in StreamView.m 2024-06-16 22:15:58 +08:00
True Zhuanjia b85a1e9c07 minor change 2024-06-16 21:01:28 +08:00
True Zhuanjia e7fd911fb8 Refactor NativeTouchHandler, restore absolute touch, Bug fixes 2024-06-16 15:48:55 +08:00
True Zhuanjia d673c4900c more & higher bit rate options. 2024-06-15 21:19:46 +08:00
True Zhuanjia 49fb6dbbd6 pointerVelocityMD_defaultChange 2024-06-14 19:08:26 +08:00
True Zhuanjia 5c88787401 fix null relative coordinate when pointerVelocityfactor is 100% 2024-06-12 09:16:17 +08:00
True Zhuanjia 873269e410 Native touch oriented improvements 2024-06-01 16:37:04 +08:00
Cameron Gutman 557765f2c0 Version 9.0.2 2024-02-25 16:46:42 -06:00
Cameron Gutman c3ad7578fe Update moonlight-common-c to resolve build warning 2024-02-25 16:44:47 -06:00
Cameron Gutman 7df349ad7c Improve smooth scrolling precision 2024-02-25 16:25:56 -06:00
Marc Davis 855f48b455 mapped the Globe/Language key to Escape 2024-02-25 15:49:48 -06:00
Marc Davis dd5d233993 yes 0x0D is the correct code for Enter according to Microsoft's documentation 2024-02-25 15:49:48 -06:00
Cameron Gutman 796f87713f Update moonlight-common-c with RTSP encryption and QoS improvements 2024-02-25 15:44:35 -06:00
Cameron Gutman 38259af3f1 Remove xcpretty in CI 2024-02-17 17:17:05 -06:00
Cameron Gutman 08279d825c Update AppVeyor images 2024-02-17 14:40:01 -06:00
Cameron Gutman 7465835808 Remove CPU core count check
Decryption seems fast enough for all reasonable bitrates even on dual-core devices.
2024-01-28 14:37:03 -06:00
Cameron Gutman 303303bf6b Update moonlight-common-c with finalized encryption changes 2024-01-19 19:18:21 -06:00
Cameron Gutman 9b28981b59 Opt in for video encryption on A10 and later SoCs 2024-01-15 15:21:56 -06:00
Cameron Gutman 5501d85762 Update moonlight-common-c with new encryption support 2024-01-15 15:11:32 -06:00
Cameron Gutman cc799768ef Fix signing metadata for iOS 2023-12-29 23:36:40 -06:00
Cameron Gutman ae1c290b79 Version 9.0.1 2023-12-29 22:33:58 -06:00
Cameron Gutman 62c6661267 Update moonlight-common-c for X-SS-Connect-Data support 2023-12-29 22:32:39 -06:00
Cameron Gutman 485c5e10db Update moonlight-common-c with fix for v4-mapped v6 addresses 2023-12-28 16:13:36 -06:00
Cameron Gutman e69cd3dbbc Define __APPLE_USE_RFC_3542 at the project level for IPV6_PKTINFO
For some reason, the definition in unix.c is not working as expected.
2023-12-27 22:27:09 -06:00
Cameron Gutman e05a6e4ec1 Update moonlight-common.xcodeproj to recommended build settings 2023-12-27 22:17:22 -06:00
Cameron Gutman 77485f2d8d Display error codes when the connection is terminated 2023-12-22 14:46:23 -06:00
Cameron Gutman 951289a802 Don't consume stylus events unless they're supported by the host
Fixes #595
2023-12-22 14:03:22 -06:00
Cameron Gutman 6f40922704 Version 9.0.0 2023-12-06 21:12:50 -06:00
Cameron Gutman 27ac6c0128 Set Game application category 2023-12-06 20:34:33 -06:00
Cameron Gutman 1f543325f8 Rewrite the OSC merging logic 2023-12-06 19:42:51 -06:00
Cameron Gutman 73d4199917 Implement immediate controller arrival and battery events 2023-12-06 19:12:04 -06:00
Cameron Gutman e0808d6bfc Remove codec options that are not supported 2023-12-03 20:30:40 -06:00
Cameron Gutman 86919bd263 Enable reference frame invalidation for AV1 2023-12-03 20:21:41 -06:00
Cameron Gutman 401d9fbae7 Update moonlight-common-c with new bitrate logic 2023-12-03 20:21:12 -06:00
Cameron Gutman bbc89011d4 Don't hardcode server signature length 2023-11-29 23:04:44 -06:00
Cameron Gutman a2f470ddeb Raise toggleable keys upon dismissal of keyboard
Fixes #591
2023-11-29 21:16:09 -06:00
Cameron Gutman b20079a165 Fix build warning on tvOS 2023-11-06 19:21:38 -06:00
Cameron Gutman 01b349d8d0 Check that a sequence header OBU was present in the IDR frame 2023-11-06 19:18:41 -06:00
Cameron Gutman 089b424f65 Rework CMVideoFormatDescription handling to fix several bugs
- Populate CMVideoFormatDescription with data parsed directly from sequence header OBU
- Recreate AV1 CMVideoFormatDescription for each IDR frame (same as H.264/HEVC) to fix HDR-SDR transitions
- Fixed leaking the format description on each IDR frame
2023-11-06 19:09:56 -06:00
Cameron Gutman c51caba1ec Rebuild FFmpeg with AV1 CBS compiled in 2023-11-06 19:00:13 -06:00
Cameron Gutman cb26398414 Download required platforms at build-time if not present 2023-11-04 03:44:25 -05:00
Cameron Gutman 8cd931cf50 Run tvOS builds on Big Sur until AppVeyor fixes Xcode on the Monterey image 2023-11-04 03:29:52 -05:00
Cameron Gutman 06fc3ec5dc Update CI to macOS Monterey image 2023-11-04 03:23:47 -05:00
Cameron Gutman 3ebcc86f0d Fix simulator builds and update to libopus v1.4
- Split library search paths into simulator and native targets
- Fixed incorrectly removed arm64 split from SDL simulator libraries
- Added simulator builds for opus libraries
2023-11-04 03:15:59 -05:00
Cameron Gutman b81ea6b874 Write the AV1CodecConfigurationBox data into the CMFormatDescription extensions 2023-11-04 01:10:35 -05:00
Cameron Gutman 75a7b9e477 Add guards around AV1 checks 2023-11-04 01:08:56 -05:00
Cameron Gutman ce25a66dc5 Bump SDL to 2.28.5 and add FFmpeg for AV1 parsing 2023-11-04 01:08:23 -05:00
Cameron Gutman 9366c763d6 Update moonlight-common-c with multi-homed host fix 2023-11-03 23:14:51 -05:00
Cameron Gutman 6974cda328 Extend codec configuration option for AV1 support 2023-11-03 23:13:44 -05:00
Cameron Gutman 0a59ce0ca9 Create a basic AV1 extension dictionary
We may also need the AV1CodecConfigurationBox though.
2023-10-20 17:11:02 -05:00
Cameron Gutman 628252ed28 Update moonlight-common-c 2023-10-20 17:04:15 -05:00
Cameron Gutman 2c76654841 Refactor decoder interface to pass decode unit into VideoDecoderRenderer 2023-10-20 17:04:06 -05:00
Cameron Gutman f20d90791a Change AV1 bitrate multiplier to match HEVC 2023-10-15 15:37:45 -05:00
Cameron Gutman 2df60e571c Add support for H.264/HEVC bitstreams with multiple sets of parameter set NALUs 2023-10-13 23:39:26 -05:00
Cameron Gutman 0879bf0583 Update moonlight-common-c 2023-10-13 23:38:11 -05:00
Cameron Gutman 7c77a385cf Don't hit test against invisible controls
Fixes #568
2023-09-29 02:17:32 -05:00
Cameron Gutman b9dbfdd82f Offset WoL ports when the host is using alternate ports 2023-09-29 01:52:47 -05:00
Cameron Gutman 5d9fa4d003 Revert "iPadOS External Display Fullscreen Support (#557)"
This breaks App Store Guidelines because we don't support all device orientations.

This reverts commit ff40bc105e.
2023-09-29 01:35:23 -05:00
Cameron Gutman 40938d198f Sync bitrate logic with Moonlight Qt 2023-09-29 01:28:02 -05:00
Cameron Gutman a46e7fa100 Link to a website we control rather than directly to Nvidia's knowledge base 2023-09-29 01:27:33 -05:00
Cameron Gutman 043bf735e8 Fix a few bugs in the new resolution options and remove dead code 2023-09-29 01:23:35 -05:00
Cameron Gutman a342c294a1 Swap safe area and full resolution options to keep ascending order 2023-09-29 01:08:18 -05:00
goob47 f8a76e4584 Add support for full screen and safe area resolutions (#577)
Display full width x height in label below the resolution switcher
2023-09-29 01:03:47 -05:00
Cameron Gutman d6ee43dab5 Fixups for keyboard toolbar feature 2023-09-29 00:50:35 -05:00
goob47 884deb9244 Add a toolbar above the on-screen keyboard with extra keys that are missing from iOS keyboard (#576)
* Add required images to assets

* Add toolbar above keyboard with more key options

* Fix tvOS errors
2023-09-29 00:49:35 -05:00
Cameron Gutman 514e415956 Add handling for Apple TV D-Pad
Fixes #569
2023-09-28 23:54:28 -05:00
Cameron Gutman 95dcbf6024 Add workaround for old Xcode version in AppVeyor 2023-09-28 23:37:36 -05:00
Cameron Gutman 9d0dc49fd2 Implement controller LED support 2023-09-27 08:52:26 -05:00
Cameron Gutman 7249854641 Rework gamepad handling
- Fix accelerometer axis direction
- Fix touchpad input coordinates
- Use physicalInputProfile instead of casting to specific GC classes
- Remove deprecated GCGamepad support
2023-09-27 07:12:36 -05:00
Cameron Gutman 11da9e0eea Add native Apple Pencil support using Sunshine protocol extensions 2023-09-27 05:54:17 -05:00
Cameron Gutman 4f9eb6ea04 Implement host processing time in stats overlay 2023-09-27 03:57:49 -05:00
Cameron Gutman f883f5a2b5 Fix axis values for gyro input 2023-09-27 03:42:05 -05:00
Cameron Gutman 3fb328e238 Fix for old Xcode version in CI 2023-09-24 20:55:08 -04:00
empireslayer000 ff40bc105e iPadOS External Display Fullscreen Support (#557) 2023-09-24 20:48:42 -04:00
Cameron Gutman 957ce6095e Basic AV1 plumbing 2023-09-18 21:24:12 -05:00
Cameron Gutman d1c35144e1 Update moonlight-common-c 2023-09-18 21:20:45 -05:00
Cameron Gutman 65bf4ca6b1 Fix controller touch events being sent as normal touch events 2023-07-01 01:32:00 -05:00
Cameron Gutman ef5c3d36d3 Implement controller motion sensor support
Axis values probably still need to be swapped around to match other platforms
2023-06-29 00:35:35 -05:00
Cameron Gutman d48690b320 Implement controller touchpad support 2023-06-29 00:17:43 -05:00
Cameron Gutman b279caa00b Fix touchpad button flag 2023-06-28 23:51:24 -05:00
Cameron Gutman cc16186eed Implement extended gamepad buttons and controller metadata support 2023-06-28 23:46:39 -05:00
Cameron Gutman 20d0087bdc Plumb trigger rumble and motion sensor callbacks 2023-06-28 21:27:46 -05:00
Long Le 6740a7130b includes on screen controls 2023-06-27 14:13:05 -07:00
Cameron Gutman 4f3f27287c Remove legacy GCGamepad profile 2023-03-05 22:49:06 -06:00
Cameron Gutman 9f7ebdc771 Version 8.5.0 2023-03-05 22:47:48 -06:00
Cameron Gutman ba723816a1 Deregister GCMouse scroll callbacks 2023-03-05 19:45:29 -06:00
Cameron Gutman c57e89a0bd Implement Start+Select+L1+R1 shortcut to quit
Fixes #548
2023-03-05 19:10:28 -06:00
Cameron Gutman 7ddf4e12ed Implement horizontal scrolling for Apple TV 2023-03-05 18:57:58 -06:00
Cameron Gutman 4f265cd09f Rebuild libopus without LTO and float approximations 2023-03-05 15:25:44 -06:00
Cameron Gutman 69081367e4 Update to libopus 1.3.1 2023-03-05 14:57:30 -06:00
Cameron Gutman 83fd8225e4 Add GameStream EOL link 2023-03-05 14:19:32 -06:00
Cameron Gutman 2c422c77fb Add Sunshine note to pairing dialog 2023-03-05 14:17:23 -06:00
Cameron Gutman 5c47cb8908 Update to OpenSSL 1.1.1t 2023-03-05 14:15:15 -06:00
Cameron Gutman 924e79d00f Update moonlight-common-c 2023-03-04 12:12:35 -06:00
Cameron Gutman bdb7d08c57 Don't request IDR frame if the HDR metadata change was a no-op 2023-03-04 12:11:33 -06:00
Cameron Gutman 64803d9715 Tell the host if we want gamepads to persist after disconnection 2023-02-20 16:32:01 -06:00
oxkenshin 2462126963 Fix mouse speed too slow on iPad (#532)
* Fix mouse speed too slow on iPad

Fixes #491
2023-02-20 16:02:58 -06:00
Cameron Gutman 0e40e4795a Implement horizontal scrolling 2023-02-20 16:00:03 -06:00
Cameron Gutman 5c844d3d1f Pass SS_KBE_FLAG_NON_NORMALIZED when sending key events from characters 2023-02-03 00:01:18 -06:00
Cameron Gutman 6d7a8df54f Downgrade CI to Big Sur to fix missing tvOS targets 2023-02-02 23:57:18 -06:00
Cameron Gutman 9eae79f69c Add Sunshine references 2023-02-02 23:35:10 -06:00
Cameron Gutman a04e1ebb3b Consolidate launch and resume handling for Sunshine 2023-02-02 23:13:59 -06:00
Cameron Gutman dbb3087078 Don't suppress high refresh rates with Sunshine 2023-02-02 23:13:09 -06:00
Cameron Gutman eefe8522c4 Plumb HDR metadata from Sunshine 2023-02-02 23:11:27 -06:00
Cameron Gutman cf665ec774 Try to fix CI 2023-02-02 22:16:25 -06:00
Cameron Gutman da4f41291e Fix handling of older IPv6 addresses 2023-02-02 22:12:45 -06:00
Cameron Gutman 9a03dd184a Fix infinite loop of retries when multiple hosts are not resolving 2023-02-02 21:56:26 -06:00
Cameron Gutman 4f03dd8c08 Implement support for alternate ports with Sunshine
Fixes #529
2023-02-02 21:54:52 -06:00
Yannick B a2b15ed2ac Adding more Bitrate options to tvOS
Added bitrate value options of 70 and 80 Mbps in the Root.plist file specific to Moonlight TV.
2023-02-02 20:55:56 -06:00
Cameron Gutman 1c90ee607a Bump tvOS version too 2022-12-06 17:34:15 -06:00
Cameron Gutman 4f7b81335d Version 8.4.1 2022-12-06 17:25:13 -06:00
Cameron Gutman eab25181e3 Update moonlight-common-c to fix streaming from Sunshine 2022-12-06 17:23:44 -06:00
Cameron Gutman 9b234bc867 Version 8.4.0 2022-12-04 17:34:00 -06:00
Cameron Gutman c7badef9d7 Allow pairing with Sunshine hosts while streaming 2022-12-04 16:54:37 -06:00
Cameron Gutman 365f61b393 Fix undo menu appearing when opening the keyboard on iOS 16 2022-12-02 22:54:08 -06:00
Cameron Gutman 02e088ddb2 Fix suppression of right clicks when activating the keyboard 2022-12-02 22:03:42 -06:00
Cameron Gutman be0c071fb5 Update moonlight-common-c 2022-12-02 20:41:40 -06:00
Felipe Cavalcanti 71b953cdd2 Fix black screen in HDR mode in newer AppleTV 4K Models 2022-12-02 20:39:29 -06:00
Cameron Gutman 3494962bc0 Version 8.3.1 2022-10-09 17:52:54 -05:00
Cameron Gutman 7c65bfcc77 Update moonlight-common-c for speculative RFI support 2022-10-09 17:34:17 -05:00
Cameron Gutman bff3fd5f6c Version 8.3.0 2022-10-04 21:04:18 -05:00
Cameron Gutman c8907b8ab8 Add special error text for ML_ERROR_FRAME_CONVERSION 2022-10-04 20:32:23 -05:00
Cameron Gutman 66f8b6f40c Update moonlight-common-c with additional GFE 3.26 fixes 2022-10-04 20:23:26 -05:00
Cameron Gutman 6eaf9274b8 Upgrade project to Xcode 14 defaults
This drops support for iOS 11 and below (which appears to have already happened on the App Store side anyway)
2022-10-04 20:22:37 -05:00
Cameron Gutman dbc83234e9 Update moonlight-common-c 2022-10-03 23:10:56 -05:00
Cameron Gutman 054b3ae45e Enable RFI for HEVC only 2022-10-02 23:20:59 -05:00
Cameron Gutman 1f5ecdf1ea Default to HEVC enabled on iOS 2022-10-02 23:15:16 -05:00
Cameron Gutman 490abc320c Version 8.2.0 2022-09-28 18:17:51 -05:00
Cameron Gutman f99381df81 Only enable RFI at resolutions at or below 1080p due to bugs 2022-09-28 17:59:18 -05:00
Cameron Gutman 842b6b3c76 Remove stale function definition 2022-09-28 17:57:44 -05:00
Cameron Gutman f9a2eb022f Display HDR/SDR status in the performance overlay 2022-09-28 17:43:38 -05:00
Cameron Gutman d896101ed2 Try to recover if the frame header parsing fails 2022-09-28 17:43:17 -05:00
Cameron Gutman 2ae79c5827 Rewrite buffer patching logic to avoid leaking if the first NALU has an unexpected offset 2022-09-28 17:42:48 -05:00
Cameron Gutman c21f638399 Fix large frame header size for GFE 3.26 2022-09-23 00:03:46 -05:00
Cameron Gutman 6d94c8515e Fix mishandling of IDR frames with a SEI or AUD NAL 2022-09-12 00:05:55 -05:00
Cameron Gutman 65e40279ea Fix handling of 3 byte Annex B start sequences 2022-09-05 18:55:16 -05:00
Starlank 0bd81b8261 Added 1440p resolution option 2022-08-17 22:38:00 -05:00
Cameron Gutman ac801e9bfb Re-enable the tvOS's HEVC option (defaulted to enabled)
Fixes #481
2022-08-01 20:01:41 -05:00
Cameron Gutman 6678488edc Implement ABXY swap for on-screen controls 2022-07-21 20:54:57 -05:00
Cameron Gutman a80fa5cfbb Fix some minor issues with ABXY swap feature 2022-07-21 20:36:31 -05:00
IonBlade2K b9e0b28adc Add setting to swap A<->B and X<->Y buttons (#513)
* Added toggle for swapping A<->B and X<->Y buttons to enable proper button mapping for combined Joy-Cons in iOS16, where iOS level remapping is not supported and pushing Switch B (bottom face button) sends Xbox B (right face button) instead of Xbox A (bottom face button), etc.  Allows user to select between current behavior (button letter matches output) and muscle-memory behavior (face button pressed matches location of face button output)
2022-07-21 20:09:22 -05:00
Cameron Gutman eb801b553f Use newer AppVeyor machine image 2022-05-18 00:39:24 -05:00
Cameron Gutman 9cc7972d11 Update README.md 2022-04-05 19:52:30 -05:00
Cameron Gutman 1b2a2ebddf Version 8.1.0 (iOS) 2022-03-27 15:57:18 -05:00
Cameron Gutman 3b0d80bce2 Fix crash during display layer reinitialization 2022-03-27 14:14:19 -05:00
Cameron Gutman 9ea5e2ec99 Fix CI build 2022-03-27 13:34:06 -05:00
Cameron Gutman e79faba87d Ensure the HEVC selector is set appropriately upon startup 2022-03-27 13:29:51 -05:00
Cameron Gutman 11b180d1e3 Fix HDR selector state upon app restart 2022-03-27 13:25:04 -05:00
Cameron Gutman 54d1851c78 Add HDR toggle for iOS 2022-03-27 13:18:03 -05:00
Cameron Gutman 0d57bd1015 Version 8.0.0 2022-02-13 15:15:31 -06:00
Cameron Gutman 3a77bf3e65 Implement dynamic display mode changes for Apple TV 2022-02-13 14:27:17 -06:00
Cameron Gutman d7673075b2 Build with iOS 15 SDK on the BigSur AppVeyor image 2022-02-12 20:07:25 -06:00
Cameron Gutman 6fb6b9bf38 Don't pace frame delivery if the display refresh rate has dropped 2022-02-12 19:14:06 -06:00
Cameron Gutman 6435afd229 Remove per-app HDR support check
It doesn't seem to make a difference anymore whether it's supported or not.
GFE seems happy to enter HDR mode anyway.
2022-02-07 20:05:58 -06:00
Cameron Gutman bfdfdc3050 Enforce 256x256 minimum for streaming 2022-02-06 21:09:22 -06:00
Cameron Gutman d12c103117 Additional custom resolution limits and warning text 2022-02-06 20:40:55 -06:00
Cameron Gutman e3bce9cec3 Additional wording tweaks to frame pacing settings 2022-02-06 20:12:06 -06:00
Cameron Gutman fc73663253 Improve custom resolution support 2022-02-06 19:49:04 -06:00
hbouhadji b7ba94f77a ui fix resolutionSelector auto width 2022-02-06 19:07:11 -06:00
hbouhadji 29ba055024 dialog for custom resolution 2022-02-06 19:07:11 -06:00
hbouhadji 7f7770a42c Added support for native stream resolution 2022-02-06 19:06:58 -06:00
Cameron Gutman 77c6ca2993 Add scroll view to iPadOS settings 2022-02-06 18:48:17 -06:00
Cameron Gutman edf449b708 Cap selected channel count at physical maximum 2022-02-06 18:00:14 -06:00
Cameron Gutman 72292dde94 Fix iOS build 2022-02-06 17:59:32 -06:00
Cameron Gutman ff4f9e2bcb Tweak wording on surround options 2022-02-06 17:59:22 -06:00
Nitropud 701c83d79c Fix for: Surround sound audio on Apple TV #371
Added audio configuration option to the settings menu to allow users to select their speaker setup.
2022-02-06 17:52:06 -06:00
Cameron Gutman 87be7080cb Tweak frame pacing option text to be more clear 2022-02-06 17:35:53 -06:00
Cameron Gutman 736485616c Merge branch 'vsync' 2022-02-06 17:13:03 -06:00
Cameron Gutman f21c58306e Preserve stream aspect ratio even when host resolution changes 2022-02-06 16:57:23 -06:00
Felipe Cavalcanti 7d6cb247b8 Add Frame Pacing feature 2022-02-02 13:37:07 -03:00
Cameron Gutman bd582aa6c0 Switch to a pull-based renderer and render from CADisplayLink callback 2022-01-22 16:20:31 -06:00
Cameron Gutman 445c026ea9 Add xcschemes to .gitignore 2022-01-22 15:53:37 -06:00
Cameron Gutman bd313d97cb Clean up new audio code 2022-01-22 15:49:52 -06:00
Cameron Gutman 5055a6db1d Fix SDL initialization on tvOS 2022-01-14 19:01:03 -06:00
Cameron Gutman 8391c766c7 Switch to SDL for audio output 2022-01-13 22:00:47 -06:00
Cameron Gutman eccf517dc3 Fix scroll speed on recent GFE versions 2021-12-12 16:33:19 -06:00
Cameron Gutman 90d416ab34 Make GCMouse scroll direction consistent with UIPanGestureRecognizer 2021-12-12 16:28:21 -06:00
Cameron Gutman 283a5516d8 Fix erratic scroll movement when beginning a scroll gesture 2021-12-12 16:16:46 -06:00
Cameron Gutman dee18fb5c2 Add building instructions 2021-10-16 14:18:04 -05:00
Cameron Gutman c99ee24c65 Restore GCMouse scroll handling for tvOS 2021-10-15 22:32:32 -05:00
Cameron Gutman 76ef2ed432 Version 7.2.0 2021-10-12 19:27:46 -05:00
Cameron Gutman 92a2bbe28e Send Command key to host rather than treating it as Control
Fixes #464
2021-10-12 19:01:14 -05:00
Cameron Gutman 3dd0e8362a Xcode plist reorganization 2021-10-06 23:39:23 -05:00
Cameron Gutman cea8ed485f Improve scrolling behavior for continuous scroll input 2021-10-06 23:28:29 -05:00
Cameron Gutman 505d248472 Improve scrolling behavior for discrete scroll input 2021-10-06 23:20:42 -05:00
Cameron Gutman 3722de4011 Fix navigation bar color when building with iOS 15 SDK 2021-10-05 22:28:41 -05:00
Cameron Gutman 3f530afca4 Add CADisableMinimumFrameDurationOnPhone for iPhone 120 Hz support 2021-10-05 21:43:54 -05:00
Cameron Gutman d7cf8ced25 Go back to UIPanGestureRecognizer for all scroll events
GCMouse is broken in iPad 15 for mice with discrete scroll wheel events
2021-10-05 21:42:37 -05:00
Cameron Gutman c930a4656a Switch to X1Kit fork with Xcode 13 fixes 2021-10-05 21:08:10 -05:00
Cameron Gutman e80a4fd2b1 Add support for Unicode text input 2021-08-10 01:01:51 -05:00
Cameron Gutman 68e6690e55 Version 7.1.3 b2 2021-07-09 23:23:51 -05:00
Cameron Gutman 6c45a5c43a Actually update the moonlight-common-c submodule 2021-07-09 23:20:14 -05:00
Cameron Gutman 6490bb6d67 Version 7.1.3 2021-07-09 23:18:29 -05:00
Cameron Gutman 93bcd8615c Update moonlight-common-c to remove SEI NALs 2021-07-09 23:05:25 -05:00
Cameron Gutman 0fe84a7a1e Remove key frame detection logic
Moonlight-common-c already tells us whether a frame is an IDR or not
2021-07-09 17:43:36 -05:00
Cameron Gutman 7ed6b22cac Pass RTSP session URL to moonlight-common-c for dynamic ports 2021-07-02 17:31:45 -05:00
Cameron Gutman 295cf61727 Version 7.1.2 2021-06-20 17:14:00 -05:00
Cameron Gutman c234c82e63 Update moonlight-common-c with performance improvements and legacy GFE compatibility 2021-06-20 16:48:40 -05:00
Cameron Gutman e143dff76a Version 7.1.1 2021-06-04 18:54:51 -05:00
Cameron Gutman d317cdc476 Update moonlight-common-c with audio FEC support 2021-06-03 21:19:01 -05:00
Cameron Gutman b29259a330 Version 7.1.0 2021-05-19 22:20:53 -05:00
Cameron Gutman f804d000f9 Update moonlight-common-c to avoid excessive ENet retransmissions when RTT variance is 0 2021-05-16 15:42:20 -05:00
Cameron Gutman 9baaa10417 Update moonlight-common-c with with more accurate RTTs and minRequiredFecPackets 2021-05-16 14:51:17 -05:00
Cameron Gutman 073873f681 Add network latency to stats overlay 2021-05-15 17:22:46 -05:00
Cameron Gutman ab5a0a4470 Version 7.0.8 2021-05-06 23:57:36 -05:00
Cameron Gutman fd1db224cb Update moonlight-common-c with audio latency fix 2021-05-06 23:56:38 -05:00
Cameron Gutman 2d8d176160 Disable reference frame invalidation on tvOS and always enable HEVC (for now)
Reference frame invalidation seems to trigger a renderer hang on tvOS 14.5 in my testing.
Since we don't have RFI to bias us toward H.264, let's use HEVC all the time now.

This may change again if the RFI issues are sorted out (perhaps we need to implement
blocking waits for invalidated frames?)
2021-05-06 23:56:08 -05:00
Cameron Gutman a4035c18b5 Switch stream exit button to Play/Pause on Apple TV
It appears it's no longer possible to get a double-press for the Menu button on tvOS 14.5

Fixes #456
2021-05-06 23:42:52 -05:00
Cameron Gutman 05aedd5510 Version 7.0.7 2021-04-29 20:17:58 -05:00
Cameron Gutman fd5426b7e8 Update moonlight-common-c with RTSP handshake retry logic 2021-04-29 18:47:24 -05:00
Cameron Gutman 651559727f Version 7.0.6 2021-04-27 18:41:23 -05:00
Cameron Gutman 76751dbee2 Update moonlight-common-c with multi-FEC support 2021-04-27 18:37:09 -05:00
Cameron Gutman 1c3d072b49 Add audio stream encryption 2021-04-23 19:07:27 -05:00
Cameron Gutman d88321263f Update moonlight-common-c 2021-04-18 19:18:42 -05:00
Cameron Gutman 867777468f Version 7.0.5 2021-04-09 19:48:14 -05:00
Cameron Gutman d52703c20e Update moonlight-common-c for initial GFE 3.22 compatibility 2021-04-09 19:37:27 -05:00
Cameron Gutman 3e90e2ebf2 Version 7.0.4 2021-04-03 13:22:09 -05:00
Cameron Gutman 16acd71f6a Disable system gestures on gamepad buttons while streaming 2021-04-03 12:54:08 -05:00
Cameron Gutman 4079af5d22 Update moonlight-common-c to pick up AMF HEVC parsing fix 2021-03-31 20:06:03 -05:00
Cameron Gutman 97f96bb116 Migrate to AppVeyor 2021-03-03 17:14:20 -06:00
Cameron Gutman 81b9a3e859 Migrate from travis-ci.org to travis-ci.com 2021-03-03 01:54:31 -06:00
Cameron Gutman 5da55d88c5 Update template to direct to troubleshooting page 2021-03-03 01:39:31 -06:00
Cameron Gutman 1fdbd84cd4 Add issue templates 2021-03-03 01:21:55 -06:00
Cameron Gutman a66d6eb11b Version 7.0.3 2021-02-02 18:50:31 -06:00
Cameron Gutman d92437cfc9 Update moonlight-common-c 2021-02-02 18:05:01 -06:00
Cameron Gutman f719e080f9 Merge pull request #448 from ascagnel/tweak-tvos-icons
tweak tvOS icons
2021-02-02 18:00:48 -06:00
Cameron Gutman b7740eaffd Merge pull request #447 from mlostekk/fix/memLeaks
nil'ing observer references
2021-02-02 18:00:30 -06:00
Andrew Scagnelli 7b89d3813b tweaking gradient 2021-01-24 11:48:18 -05:00
Andrew Scagnelli b51cd67327 tweak tvOS icons
add a gradient background so the app icon fits in a little better with
tvOS 14
2021-01-24 11:33:56 -05:00
Martin Mlostek 6e480a46a0 nil'ing observer references 2021-01-23 22:05:58 +01:00
Cameron Gutman a3fe8e23f1 Enable some restricted key combos to pass through to the PC 2021-01-12 18:44:32 -06:00
Cameron Gutman e76344812e Don't lock enhancement requests 2021-01-01 13:21:40 -06:00
Cameron Gutman eed2b82230 Add configuration for GitHub lock bot 2021-01-01 13:08:42 -06:00
Cameron Gutman ecd3427767 Add handling for above 4K resolutions 2020-12-24 13:33:54 -06:00
Cameron Gutman 311bf33e84 Add special error text for an unexpected early termination 2020-12-24 12:48:10 -06:00
Cameron Gutman ea96bac31a Display failing ports when connection fails 2020-12-23 14:48:20 -06:00
Cameron Gutman f09b2fd222 Use LiStringifyPortFlags() rather than coding it ourselves 2020-12-23 14:39:51 -06:00
Cameron Gutman 8b8bc2f818 Version 7.0.2 (iOS) 2020-12-18 17:10:29 -06:00
Cameron Gutman 949f088ef5 Fix dragging mouse on iOS 13
Fixes #440
2020-12-18 17:10:16 -06:00
Cameron Gutman e29313d9b6 Version 7.0.1 (iOS) 2020-12-07 21:45:55 -06:00
Cameron Gutman 9e669d13fa Suppress all kbProductivity gesture recognizers 2020-12-07 21:10:30 -06:00
Cameron Gutman 015cfecdd6 Fix 3 finger taps causing the editing toolbar to appear 2020-12-07 20:54:24 -06:00
Cameron Gutman c623d40600 Update moonlight-common-c submodule 2020-12-07 20:08:31 -06:00
Cameron Gutman 65293dab30 Fix race condition during PC detection 2020-12-06 00:56:16 -06:00
Cameron Gutman f3635a515c Version 7.0.1 (tvOS) 2020-12-05 21:06:50 -06:00
Cameron Gutman 6b823e155a Don't emulate an OSC controller if absolute touch mode is enabled 2020-12-05 20:49:35 -06:00
Cameron Gutman 03f330ccff Fix keyboard input on tvOS
Fixes #434
2020-12-05 20:48:58 -06:00
Cameron Gutman c301891ff5 Fix stats overlay being off by 1 FPS 2020-12-05 20:38:30 -06:00
Cameron Gutman 1ba1ad64ec Version 7.0.0 2020-11-28 22:32:01 -06:00
Cameron Gutman 1f24d28ddd Update quit tip text for Apple TV 2020-11-28 20:23:15 -06:00
Cameron Gutman e9e03c74e2 Fix long pressing apps on tvOS 2020-11-28 20:16:26 -06:00
Cameron Gutman 0c6c3ccc83 Disable resizing the view for the keyboard size 2020-11-28 18:50:54 -06:00
Cameron Gutman 07b8e7fd50 Minor UI tweaks 2020-11-28 18:41:44 -06:00
Cameron Gutman 60a6582380 Fix conflicting touch action handling on UIAppView and UIComputerView 2020-11-14 17:03:22 -06:00
Cameron Gutman f5e0443abb Hide shadows on hidden app tiles 2020-11-14 16:46:00 -06:00
Cameron Gutman 9b8a179f4a Perform the initial updateLoop iteration immediately after attaching the view 2020-11-14 16:42:17 -06:00
Cameron Gutman 78f2b8ac47 Enable right-click context menus on iPadOS 2020-11-14 15:57:16 -06:00
Cameron Gutman dc9b5b7c96 Remove @available checks for < iOS 9.3 2020-11-14 15:27:49 -06:00
Cameron Gutman 313af5a7e7 Fix popover dialog not correctly anchoring to the UIComputerView on iPad
The view was being replaced after the UIAlertController was anchored to it
2020-11-14 15:15:46 -06:00
Cameron Gutman bb885465f6 Merge pull request #429 from MichaelMKenny/ipad-alertcontroller-crash-fix
Fixed crash on iPad due to missing up UIAlertController popoverPresentation.
2020-11-14 14:58:54 -06:00
Michael Kenny e258551008 Fixed crash on iPad when bringing up app long press menus, due to missing UIAlertController popoverPresentation. 2020-11-04 14:11:27 +10:30
Cameron Gutman e402902d6e Fix tvOS build 2020-11-02 20:39:37 -06:00
Cameron Gutman f55daf941c Add support for hiding apps 2020-11-02 20:39:24 -06:00
Cameron Gutman a483c6ea41 Allow panning to the bottom of the screen when the keyboard appears 2020-11-02 18:41:38 -06:00
Cameron Gutman 3ad4d857e8 Replace home-rolled edge swipe gesture recognizer with UIScreenEdgePanGestureRecognizer 2020-11-01 21:18:06 -06:00
Cameron Gutman 6b1d34e4a9 StreamView must be multi-touch enabled for gestures to work 2020-11-01 20:50:25 -06:00
Cameron Gutman bf36eaf661 Improve soft-keyboard handling 2020-11-01 20:47:14 -06:00
Cameron Gutman e809afdd9e Implement zoom and pan in touchscreen mode 2020-11-01 20:22:01 -06:00
Cameron Gutman 0d75dd4efb Create stream view hierarchy programmatically 2020-11-01 20:00:39 -06:00
Cameron Gutman b799978cac Remove old iOS 13.0 gesture recognizer hack 2020-11-01 17:53:21 -06:00
Cameron Gutman 42f29c44e6 Remove OSPortabilityDefs.h
The macOS support that used it has been removed for a while
2020-11-01 16:50:02 -06:00
Cameron Gutman c3ba447372 Reorganize tvOS settings 2020-11-01 16:43:13 -06:00
Cameron Gutman a358cdad3d Improve behavior of 2 finger scrolling in trackpad mode 2020-11-01 16:02:34 -06:00
Cameron Gutman a1f09f117f Fix first tap in touch mode not registering 2020-11-01 14:43:55 -06:00
Cameron Gutman 7270554153 Scale dead zone areas by screen size 2020-11-01 14:36:43 -06:00
Cameron Gutman 8d127decb6 Shrink and deadzone the edge swipe region for touchscreen mode 2020-11-01 14:28:13 -06:00
Cameron Gutman 8ffee9e10f Minor video stats improvements 2020-11-01 14:09:05 -06:00
Cameron Gutman 0eac28a74f Fix stats overlay width decreasing each iteration 2020-11-01 13:45:24 -06:00
Cameron Gutman 5d94800e11 Update moonlight-common-c to disable QoS on IPv6 2020-11-01 13:27:40 -06:00
Cameron Gutman 44f713f5c9 Add a basic stats overlay 2020-11-01 13:27:10 -06:00
Cameron Gutman 2114e39237 Plumb touch mode and stats overlay preferences 2020-11-01 11:50:00 -06:00
Cameron Gutman 6fd8baee41 Implement AbsoluteTouchHandler 2020-11-01 11:07:42 -06:00
Cameron Gutman 63beaebe55 Stub AbsoluteTouchHandler 2020-11-01 10:30:39 -06:00
Cameron Gutman 17d4079a5a Refactor relative touch handling into a separate class 2020-11-01 10:19:32 -06:00
Cameron Gutman b650119fe9 Merge pull request #426 from nauxliu/bump-max-bitrate
Bump max bitrate to 150Mbps to line up with android and qt version
2020-10-28 20:56:55 -05:00
Cameron Gutman 8b28606952 Update moonlight-common-c with QoS fix 2020-10-28 20:44:43 -05:00
Xiangxuan Liu 24258d6e17 Bump max bitrate to 150Mbps to line up with android and qt version 2020-10-28 01:04:34 +08:00
Cameron Gutman 3f1699258d Increase inactivity threshold to 60 seconds before killing the stream 2020-10-18 17:44:52 -05:00
Cameron Gutman 34f8696a5e Don't terminate the stream when resigning active on tvOS 2020-10-18 17:43:34 -05:00
Cameron Gutman 96e317fe31 Make Guide button emulation more granular by only enabling RB+Start or Start+Select based on physical buttons present 2020-10-18 17:37:18 -05:00
Cameron Gutman ecad1bea38 Disable Guide button emulation on gamepads with physical Guide buttons 2020-10-18 15:04:09 -05:00
Cameron Gutman e4534fd4af Version 6.1.1 2020-10-17 22:17:00 -05:00
Cameron Gutman 126735fa57 Update moonlight-common-c with MTU test 2020-10-17 21:52:31 -05:00
Cameron Gutman 9ff5fcb9d5 Fix off by one in rumble amplitude calculation 2020-10-17 21:25:10 -05:00
Cameron Gutman 8c66898765 Dynamically update haptic effects instead of creating new players all the time 2020-10-15 18:40:13 -05:00
Cameron Gutman 5faf1faf32 Add Guide button support on iOS 14 2020-10-15 17:55:53 -05:00
Cameron Gutman 7e704ee201 Trim the IP address string from the user 2020-10-06 21:57:22 -05:00
Cameron Gutman c3ae83f902 Version 6.1.0 2020-09-18 22:41:03 -05:00
Cameron Gutman 95e16c5e2d Sort ITSAppUsesNonExemptEncryption 2020-09-18 21:54:05 -05:00
Cameron Gutman fc08a7ee0e Set ITSAppUsesNonExemptEncryption=NO 2020-09-18 19:47:25 -05:00
Cameron Gutman 95e12f9853 Fix sorting of NSLocalNetworkUsageDescription 2020-09-18 19:18:51 -05:00
Cameron Gutman 88c18ad397 Don't use pointer lock if the mouse isn't compatible with GCMouse 2020-09-18 18:48:35 -05:00
Cameron Gutman 5043fadace Request pointer lock while streaming 2020-09-18 18:27:20 -05:00
Cameron Gutman 6fa5ef73f6 Add GCMouse support 2020-09-18 17:04:32 -05:00
Cameron Gutman c0367f711b Disable legacy iOS 13.4 mouse support when a GCMouse is connected 2020-09-18 16:44:24 -05:00
Cameron Gutman 0a5499f369 Raise iOS deployment target to iOS 9.3 as required by Xcode 12 2020-09-18 16:29:46 -05:00
Cameron Gutman 26209f187e Update TravisCI to use Xcode 12 2020-09-18 15:30:21 -05:00
Cameron Gutman e8c7eb67c6 Add rumble support on iOS 14 2020-09-17 20:32:41 -05:00
Cameron Gutman 2d24b0ec7b Fix mouse support on iOS 14 2020-09-17 18:59:18 -05:00
Cameron Gutman dfec190b82 Version 6.0.1 2020-09-08 19:53:32 -07:00
Cameron Gutman 88f9423802 Update moonlight-common-c to improve connection reliability 2020-09-08 19:53:13 -07:00
Cameron Gutman beeec54420 Version 6.0 2020-09-06 18:14:39 -07:00
Cameron Gutman b7b7a88ef7 Display the prohibited address warning on failures too 2020-08-30 20:47:40 -07:00
Cameron Gutman 6bf643968b Display a loading spinner while adding a PC is in progress 2020-08-30 20:39:11 -07:00
Cameron Gutman dbab07838d Only allow PCs on the same LAN to be added via the Add PC dialog
This is required to comply with App Store Guideline 4.2.7a.
2020-08-30 17:59:28 -07:00
Cameron Gutman 06a4ced692 Only impose app store restrictions on release builds 2020-08-30 16:43:56 -07:00
Cameron Gutman fb9d778dab Purge mentions of Internet streaming for App Store Guideline 4.2.7a 2020-08-30 15:37:52 -07:00
Cameron Gutman 2a0b29a284 Revert "Add direct-to-desktop mode"
This reverts commit e445989ec7.
2020-08-30 15:30:58 -07:00
Cameron Gutman bf437669fb Add warning if no key frames can be received in 10 seconds 2020-08-29 21:21:46 -07:00
Cameron Gutman e445989ec7 Add direct-to-desktop mode 2020-08-12 22:26:56 -07:00
Cameron Gutman 0b712a1589 Add manual connection testing option 2020-08-12 22:20:15 -07:00
Cameron Gutman 1aa11df725 Fix simulator build for Apple silicon 2020-08-12 19:28:12 -07:00
Cameron Gutman ff5e8d167d Add support for iOS 14 local network privacy changes 2020-08-12 18:34:49 -07:00
Cameron Gutman 286b19d360 Add automatic network testing on connection failure 2020-08-10 22:56:47 -07:00
Cameron Gutman 3ab0829db5 Update common-c to fix server-side log spam 2020-08-09 18:38:53 -07:00
Cameron Gutman 6f2041dfb6 Sync WoL ports with Android and Qt 2020-08-09 14:48:27 -07:00
Cameron Gutman 78600a4e06 Update common-c with client connectivity test and select() replacement 2020-07-27 00:23:00 -07:00
Cameron Gutman e0bb48320f Avoid modulo bias for PIN generation 2020-07-12 11:40:31 -07:00
Cameron Gutman 46b9f84a31 Update moonlight-common-c to fix QoS-related connection issues 2020-06-12 22:10:41 -07:00
Cameron Gutman abb4b5f9b9 Pad the SHA-1 hash for Gen5 and below servers 2020-06-09 01:13:30 -07:00
Cameron Gutman a4f7861ccf Avoid using functions deprecated in OpenSSL 3.0 2020-06-09 00:56:58 -07:00
Cameron Gutman 39c03bc8a8 Attempt to fix Apple's concerns about cloud streaming 2020-06-05 16:03:38 -07:00
Cameron Gutman 059a943a3d Fix dragging with middle, X1, or X2 mouse buttons down 2020-05-31 12:40:54 -07:00
Cameron Gutman 3e2e4d13a9 Update moonlight-common-c 2020-05-29 19:17:37 -07:00
Cameron Gutman 4a537c1806 Fix tvOS build in Travis CI 2020-05-29 19:10:13 -07:00
Cameron Gutman 839f2018cb Update osx_image for Travis CI 2020-05-29 19:02:25 -07:00
Cameron Gutman f9d1840941 Update README.md 2020-05-27 19:55:52 -07:00
Cameron Gutman 7747188363 Update README 2020-05-27 19:53:17 -07:00
Cameron Gutman c43ed56751 Use a better workaround for the GFE 3.20.3 high FPS bug 2020-05-25 19:24:03 -07:00
Cameron Gutman a3b01b3cd4 Revert "Disable SOPS for streams over 60 FPS for GFE 3.20.3"
This reverts commit fdaf7f92a1.
2020-05-25 18:58:15 -07:00
Cameron Gutman 96c2ac9be5 Version 5.0.2-2 (iOS) 2020-05-09 15:02:26 -07:00
Cameron Gutman aee4e3bf3d Update moonlight-common-c 2020-05-09 15:00:41 -07:00
Cameron Gutman d9cb55a17f Don't update the mouse position if it hasn't moved from the last location 2020-05-09 14:42:09 -07:00
Cameron Gutman 4c8ad13f3a Version 5.0.2 (iOS) 2020-05-01 19:48:49 -07:00
Cameron Gutman 99c160f8e5 Require iOS 13.4.1 to enable pointer interaction to avoid crashing on beta iOS 13.4 builds 2020-05-01 19:47:52 -07:00
Cameron Gutman 78e16b0e29 Fix crash on iOS 8 2020-05-01 19:43:21 -07:00
Cameron Gutman fdc9e00c54 Add a friendly error message when no video traffic is received 2020-05-01 19:37:33 -07:00
Cameron Gutman b16eaafd2c Allow continuous scroll type gestures. Fixes #408 2020-04-29 18:00:17 -07:00
Cameron Gutman 2ec6639351 Add special error text for the -1 launch error code 2020-04-25 16:29:47 -07:00
Cameron Gutman f49a908dc0 Fix parsing rare GFE status code of 0xFFFFFFFF 2020-04-23 20:07:52 -07:00
Cameron Gutman b3a666af8e Version 5.0.1 for iOS 2020-04-20 16:50:29 -07:00
Cameron Gutman 5abad38956 Revert "Refactor legacy UITextField-based keyboard support out of StreamView"
This refactoring breaks support for hardware keyboards on iOS 13.3
and below. The root cause of the breakage is not currently known.

This reverts commit 69d1ff15a1.
2020-04-20 16:31:21 -07:00
Cameron Gutman 7f034e0338 Version 4.0.2 for tvOS 2020-04-19 15:09:10 -07:00
Cameron Gutman fb196f661c Reorder Info.plist 2020-04-19 14:57:56 -07:00
Cameron Gutman 3cca55703e Fix the LoadingFrameViewController not display on top of other content on tvOS
Also remove hacks that were put in place due to this bug previously.
2020-04-19 14:40:39 -07:00
Cameron Gutman 084018719a Version 5.0.0-2 for iOS 2020-04-18 17:25:16 -07:00
Cameron Gutman 4aca666df4 Fix race condition that could cause pairing state to be lost
If a mDNS response for a host happened during the period where we
had removed the host from discovery, it would be re-added by mDNS
without the pairing cert. Now we no longer completely remove the host
and instead just remember that it's paused.
2020-04-18 17:16:53 -07:00
Cameron Gutman b833d3b3b7 Fix broken isEqual function for TemporaryApp and TemporaryHost 2020-04-18 17:05:36 -07:00
Cameron Gutman cb94d7aad7 Version 5.0.0 for iOS 2020-04-18 15:26:44 -07:00
Cameron Gutman b8631db5df Allow rediscovery of hosts after deletion without having to force quit the app 2020-04-18 15:03:52 -07:00
Cameron Gutman bd5e0ecc40 Standardize mouse input scaling to avoid variance based on stream resolution 2020-04-18 14:44:57 -07:00
Cameron Gutman 10d2e1635b Only hide the cursor over the video region 2020-04-18 14:09:19 -07:00
Cameron Gutman 68e59aba74 Scale mouse input to fit the video region 2020-04-18 14:00:26 -07:00
Cameron Gutman a4255f4cad Implement absolute mouse support on iOS 13.4
Fixes #402
2020-04-18 13:11:24 -07:00
Cameron Gutman f12e2f16dc Add handling for cancelled touch events 2020-04-18 11:25:24 -07:00
Cameron Gutman 177ecdbe0b Enable pointer interaction on the PC and app grid items 2020-04-18 11:24:02 -07:00
Cameron Gutman de05214728 Version 4.0.1 2020-04-17 12:46:46 -07:00
Cameron Gutman b0149b2fe9 Merge pull request #405 from loki-47-6F-64/master
Don't send PIN to GFE
2020-04-17 12:40:29 -07:00
Loki 1366ede690 Don't send PIN to GFE 2020-04-17 14:45:46 +02:00
Cameron Gutman fdaf7f92a1 Disable SOPS for streams over 60 FPS for GFE 3.20.3 2020-04-12 11:25:53 -07:00
Cameron Gutman 8efbe2670a Bump version to 4.0.0 2020-04-12 11:10:23 -07:00
Cameron Gutman 8bc66749c3 Update moonlight-common-c to avoid termination delay on GFE 3.20.3 2020-04-12 10:43:33 -07:00
Cameron Gutman 4ab71a3cc7 Allow Command key to function as Control 2020-04-11 11:17:25 -07:00
Cameron Gutman 55b2f39721 Adjust X1_MOUSE_SPEED_DIVISOR based on user testing 2020-04-11 11:04:00 -07:00
Cameron Gutman e59f0764a2 Update tvOS target to Swift 5 2020-04-11 11:01:44 -07:00
Cameron Gutman 6194d80108 Upgrade to Swift 5 2020-04-08 20:11:10 -07:00
Cameron Gutman 5264fee655 Update to OpenSSL 1.1.1f
Built for targets: ios-sim-cross-i386 ios-sim-cross-x86_64 ios64-cross-arm64 ios64-cross-arm64e ios-cross-armv7s ios-cross-armv7 tvos-sim-cross-x86_64 tvos64-cross-arm64

https://github.com/keeshux/openssl-apple
2020-04-08 19:57:45 -07:00
Cameron Gutman ab17c57c09 Update to latest upstream X1Kit with support for new X1 firmware 2020-04-08 18:47:08 -07:00
Cameron Gutman c7a7fc3fbc Add 7.1 surround sound support 2020-04-03 17:46:04 -07:00
Cameron Gutman f32d4f2886 Reduce retransmission delay on packet loss and enable QoS marking on ENet traffic 2020-03-29 22:22:03 -07:00
Cameron Gutman 8e4471fbc0 Slow X1 mouse input by 2x to make it more usable 2020-03-27 23:05:53 -07:00
Cameron Gutman 733b992912 Update to OpenSSL 1.1.1e 2020-03-27 21:24:32 -07:00
Cameron Gutman 6d03f4bc4c Add a settings option for enabling Citrix X1 support 2020-03-27 20:26:01 -07:00
Cameron Gutman 75ab28a2c3 Enhance physical keyboard support on iOS 13.4
Fixes #394
2020-03-25 18:24:04 -07:00
Cameron Gutman 69d1ff15a1 Refactor legacy UITextField-based keyboard support out of StreamView 2020-03-24 18:14:50 -07:00
Cameron Gutman eceb23e1cd Allow Moonlight audio to mix with other audio 2020-03-21 16:35:07 -07:00
Cameron Gutman ab5a9ba067 Use 10 ms audio samples on slow networks 2020-03-21 16:06:25 -07:00
Cameron Gutman 742bb7b516 Change errorCode from long to int 2020-02-25 00:00:00 -08:00
Cameron Gutman 65578b8a64 Fix tvOS build 2020-01-19 21:15:15 -08:00
Cameron Gutman 1246de3f18 Centralize Discord invite links 2020-01-18 10:54:22 -08:00
Cameron Gutman 5b5fdff6d8 Add support for Citrix X1 mice using X1Kit (untested) 2020-01-16 19:52:49 -08:00
Cameron Gutman 47aaa02d08 Version 3.3.0 (iOS) 2019-12-07 11:48:02 -08:00
Cameron Gutman b71f06aa04 Change audio buffer duration back to 80 ms for now 2019-12-04 18:58:36 -08:00
Cameron Gutman 61c18c201c Prevent concurrent modification of host list 2019-12-03 20:02:16 -08:00
Cameron Gutman 32b7396070 Reduce buffering for 5 ms and 20 ms audio packets 2019-12-03 19:51:31 -08:00
Cameron Gutman c327c5b1ec Force remote streaming mode when a VPN is connected 2019-12-01 20:55:20 -08:00
Cameron Gutman 44d4553031 Add support for arbitrary audio duration 2019-12-01 20:51:18 -08:00
Cameron Gutman a2b8e3a8b8 Update common-c to fix RTSP handshake error when PMTUD is broken 2019-12-01 20:50:45 -08:00
Cameron Gutman 9e91627601 Fix auto-comment line breaks 2019-11-16 12:24:49 -08:00
Cameron Gutman 250f6618fd Plumb the presentation time from the server into the renderer 2019-11-11 18:42:11 -08:00
Cameron Gutman ab5e253a59 Version 3.2.0 (iOS) 2019-11-11 18:41:40 -08:00
Cameron Gutman 12a64f8626 Don't emulate buttons when the controller already has them 2019-11-09 17:47:47 -08:00
Cameron Gutman 99fec8919e Add configuration for auto-comment bot 2019-11-09 15:03:16 -08:00
Cameron Gutman 52dcdd68c4 Fix concurrency issues accessing TemporaryHost fields that could be changed by other threads 2019-11-06 21:51:23 -08:00
Cameron Gutman 5a0e4bcc05 Fix UBSan undefined behavior warning
moonlight-ios/Limelight/Input/ControllerSupport.m:294:32: runtime error: 255 is outside the range of representable values of type 'char'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior moonlight-ios/Limelight/Input/ControllerSupport.m:294:32 in
2019-11-06 20:57:53 -08:00
Cameron Gutman 2577f581ba Revert "Don't navigate to a host that is known to be offline"
This reverts commit 95ce78bb00.
2019-11-05 20:30:17 -08:00
Cameron Gutman 1757359fbf Fix "server busy" pairing error dialog 2019-11-04 21:41:42 -08:00
Cameron Gutman e89707e601 Don't send a STUN request when a VPN is connected 2019-11-04 21:28:53 -08:00
Cameron Gutman c89de92e23 Fix tvOS build 2019-11-03 15:25:43 -08:00
Cameron Gutman ee7df54842 Launch directly to the app grid if there is exactly one PC 2019-11-03 15:17:27 -08:00
Cameron Gutman 95ce78bb00 Don't navigate to a host that is known to be offline 2019-11-03 15:13:44 -08:00
Cameron Gutman 3c9314dff3 Disable both navbar buttons when disabling navigation 2019-11-03 15:13:13 -08:00
Cameron Gutman c5e1bbf61b Set title immediately when a PC is tapped 2019-11-03 15:12:43 -08:00
Cameron Gutman abe850cd72 Fix UI problems when a pairing error occurs in the background 2019-11-03 15:11:02 -08:00
Cameron Gutman b0a3e163c4 Restart PC discovery when pairing fails 2019-11-03 14:43:12 -08:00
Cameron Gutman 2ae7fefc0c Prevent app grid from populating with empty cells during server info polling 2019-11-03 14:40:32 -08:00
Cameron Gutman 72af5d5217 Update initial PC state more quickly on launch 2019-11-03 14:26:13 -08:00
Cameron Gutman d1eb7b45a2 Add quick action shortcuts to open paired PCs 2019-11-03 13:38:52 -08:00
Cameron Gutman 3b5652c3f5 Update moonlight-common-c submodule 2019-11-02 21:48:00 -07:00
Cameron Gutman df50bb9583 Use blank gray launch screen to workaround inconsistent nav bar size 2019-11-02 18:22:09 -07:00
Cameron Gutman 18e2d67f6b Suppress home bar hiding when user is interacting 2019-11-02 15:17:52 -07:00
Cameron Gutman 9f19f5da27 Fix app store link 2019-10-28 18:41:38 -07:00
Cameron Gutman 005c3e4082 Update readme to include tvOS 2019-10-28 18:40:35 -07:00
Cameron Gutman 35b3c01582 Sync tvOS version numbering with iOS 2019-10-28 18:28:21 -07:00
Cameron Gutman d8f55b57fa Fix Travis CI build with their updated Xcode 11 images 2019-10-22 00:40:39 -04:00
Cameron Gutman 5faa8a0b85 Hide the home bar when a gamepad is connected and no on-screen controls are visible
Fixes #386
2019-10-22 00:32:56 -04:00
Cameron Gutman 967ddd7d68 Refactor OSC handling 2019-10-22 00:16:20 -04:00
Cameron Gutman 26fac5b56e Fix asserts not catching the intended bugs (code analysis warning) 2019-10-21 17:53:18 -07:00
Cameron Gutman 75c1c85de9 Remove old IPA binaries
They don't work with recent GFE versions anyway
2019-10-21 17:41:47 -07:00
Cameron Gutman 653a72eaf8 Remove macOS port
We now have a proper native PC port (Moonlight Qt) and if we
wanted to bring the full iOS app over we can now use Catalyst.
2019-10-21 17:39:48 -07:00
Cameron Gutman 27d95ae0ba Update moonlight-common-c submodule 2019-10-21 17:23:50 -07:00
Cameron Gutman 7dca4c6c63 Fix incompatible pointer type warning 2019-10-21 17:05:03 -07:00
Cameron Gutman 12e7dd2181 Update moonlight-common-c submodule 2019-10-12 19:21:07 -07:00
Cameron Gutman c9225d468a Change title of launch error dialog 2019-10-12 19:20:53 -07:00
Cameron Gutman a824c23c59 Fix iOS build 2019-10-12 19:20:26 -07:00
Cameron Gutman a9e01fc9a9 Fix pointer speed on tvOS 2019-10-12 18:23:28 -07:00
Cameron Gutman fb2d58da6a Fix default resolution not taking effect on tvOS 2019-10-12 18:10:12 -07:00
Cameron Gutman 09ac6cc057 Clamp stream resolution and FPS to device capabilities 2019-10-12 18:07:47 -07:00
Cameron Gutman 1121a918d1 Improve description messages of error message dialogs 2019-10-12 16:41:32 -07:00
Cameron Gutman 565a8e56e6 Add NSError information to the HttpResponse on failure 2019-10-12 16:13:59 -07:00
Cameron Gutman f8cc7bb77f Improve text for WoL alert 2019-10-12 16:03:35 -07:00
Cameron Gutman 55c52e1ee1 Require tvOS 12.0 due to navigation issues on tvOS 11.4 2019-10-10 02:20:33 -07:00
Diego Waxemberg 366a94d018 Removing manually specified signing certs
This will make signing for iOS and tvOS using the automatic signing possible. It complains if there is a manually specifed signing id.
2019-10-06 09:42:01 -04:00
Cameron Gutman 4e5264d5e9 Fix menu button recognizer not always working after returning from settings 2019-09-24 19:08:22 -07:00
Cameron Gutman d98aba66a8 Add settings button for tvOS 2019-09-24 18:56:37 -07:00
Cameron Gutman 8ccbdc7923 Fix Start button not working on some MFi controllers on iOS 13 2019-09-24 18:13:56 -07:00
Cameron Gutman 769840d089 Immediately stop streaming when resigning active on tvOS 2019-09-24 17:37:35 -07:00
Cameron Gutman 33b050f84f Increase bitrate warning font size on tvOS 2019-09-24 17:36:26 -07:00
Cameron Gutman d2bc7209f7 Use the same bundle identifier for tvOS 2019-09-24 06:06:35 -07:00
Cameron Gutman d32d1aa09a Add tvOS UI screenshots 2019-09-23 21:33:26 -07:00
Cameron Gutman 7f6db298d0 Remove remove disallowed GCSupportedGameControllers value 2019-09-23 21:33:25 -07:00
Cameron Gutman f9ff6a6004 Add tvOS launch image 2019-09-23 21:33:25 -07:00
Cameron Gutman a6e6d0e491 Restore focus on the correct app after closing the stream 2019-09-23 21:33:24 -07:00
Cameron Gutman 6613976291 Increase icon resolution for tvOS 2019-09-23 21:33:24 -07:00
Cameron Gutman 6f8d898b77 Prevent box art from overlapping other tiles when focused 2019-09-23 21:33:24 -07:00
Cameron Gutman d1cbfd9c44 Rewrite UIComputerView to use a pop-out effect on tvOS 2019-09-23 21:33:24 -07:00
Cameron Gutman e6b1dd6b64 Rewrite UIAppView to avoid needing a custom hover pop-up effect on tvOS 2019-09-23 21:33:24 -07:00
Diego Waxemberg 15fe5a06c2 Bumping version for v3.0.0 build 3 2019-09-22 22:14:27 -07:00
Cameron Gutman 8d4c7bd705 Fix Steam app detection if GFE gives us a lower-case path 2019-09-22 10:31:23 -07:00
Cameron Gutman b0d85abfa6 Increase audio circular buffer size to reduce glitching 2019-09-22 10:20:30 -07:00
Diego Waxemberg 4295017324 Bumping version for v3.0.0 build 2
Pulling in fix for assets
2019-09-21 23:26:09 -07:00
Cameron Gutman d80d70215a Add App Store screenshots 2019-09-21 16:45:45 -07:00
Cameron Gutman a46f905aa6 Fix case of Computer asset name 2019-09-21 14:32:12 -07:00
Diego Waxemberg 453c50d505 Bumping version for v3.0.0 2019-09-20 20:26:09 -07:00
Cameron Gutman 61c7d9f2b3 Disable bounce-back on the reveal view controller 2019-09-18 19:59:24 -07:00
Cameron Gutman 34707e7743 Update launch screen to match new UI 2019-09-18 19:45:27 -07:00
Cameron Gutman 9a9b9651a1 Address several iOS and tvOS compilation warnings 2019-09-15 15:46:23 -07:00
Cameron Gutman d4576a8739 Suppress availability warning for overrideUserInterfaceStyle field 2019-09-15 15:29:29 -07:00
Cameron Gutman 87824c2650 Fix control stream connection error on multi-homed hosts 2019-09-14 14:14:26 -07:00
Cameron Gutman 283e735f90 Remove the successful quit dialog since it's redundant and annoying 2019-09-14 13:08:47 -07:00
Cameron Gutman 202f968b98 Rework app labels on iOS to reuse title UILabel and use correct size and insets 2019-09-14 12:59:40 -07:00
Cameron Gutman 62df1cd5ba Reduce minimum spacing to 15 to allow an extra column on iPhone SE 2019-09-14 12:47:21 -07:00
Cameron Gutman f24c28c848 Switch back to text for navigation buttons 2019-09-14 12:46:50 -07:00
Cameron Gutman 8fb465d3ca Fix tvOS build warning 2019-09-14 12:28:37 -07:00
Cameron Gutman 29dff2320b Fix content insets for host and app scroll views 2019-09-14 12:28:21 -07:00
Cameron Gutman a40b30016b Rewrite storyboards with Xcode 11 GM 2019-09-14 12:07:38 -07:00
Cameron Gutman 409b262a4f Add a hack as a possible workaround for #372 2019-09-14 11:49:09 -07:00
Cameron Gutman 73197e4378 Clean up and fix storyboards 2019-09-14 11:34:22 -07:00
Cameron Gutman f51dbe4295 Fix some Xcode 11 warnings 2019-09-11 19:12:11 -07:00
Cameron Gutman 597aaa1bab Cleanup controller support code using the iOS 13 SDK directly 2019-09-11 18:44:37 -07:00
Cameron Gutman b9656da8a5 Use Xcode 11 image for Travis CI 2019-09-11 18:27:45 -07:00
Cameron Gutman 422db1898c Improve manually added Steam app detection heuristic to prevent FPs on apps with "Steam" in the name 2019-09-08 18:56:18 -07:00
Cameron Gutman 56691791b8 Fix race condition that could cause safe area insets to be missing 2019-09-01 12:26:39 -07:00
Cameron Gutman de2a5d3cd7 Fix overlays not being affected by button press and spinner eating touch events 2019-09-01 12:15:26 -07:00
Cameron Gutman 49fc10191c Fix transparent app grid background being incorrectly overridden 2019-08-31 20:19:03 -07:00
Cameron Gutman bf8aaa8198 Refresh app icon when the running state changes on tvOS 2019-08-31 19:52:55 -07:00
Cameron Gutman 9a4cdc9c94 Replace updating overlay icon with spinner 2019-08-31 16:02:37 -07:00
Cameron Gutman f6153fe818 Improve selection visibility on tvOS 2019-08-30 22:33:32 -07:00
Cameron Gutman f2fa9e18ea Reorder tvOS settings and fix default bitrate for 1080p60 2019-08-30 21:51:10 -07:00
Cameron Gutman aa013be6e6 Update settings config for tvOS 2019-08-30 21:44:12 -07:00
Cameron Gutman 7e21b131ac Redesign navigation bar on iOS 2019-08-30 21:15:11 -07:00
Cameron Gutman 97681f3a0d Increase size of PC icon 2019-08-30 20:00:00 -07:00
Cameron Gutman e476cc407c Fix crash on pre-iOS 13 2019-08-30 19:55:49 -07:00
Cameron Gutman f2e03bbf1f Always use dark mode on tvOS 2019-08-30 19:40:17 -07:00
Cameron Gutman a6cef32c9a Increase size of PC icons on tvOS 2019-08-30 19:37:16 -07:00
Cameron Gutman 6d94897c21 Distinguish between offline and unknown hosts 2019-08-30 19:19:23 -07:00
Cameron Gutman a065c78b5f Restyle UIComputerView to match other clients 2019-08-30 18:36:14 -07:00
Cameron Gutman 83479719a4 Fix styles on settings slideout on iOS 13 2019-08-30 17:16:56 -07:00
Cameron Gutman fd4ede58ca Reduce the size of the audio circular buffer to reduce peak latency 2019-08-29 22:00:27 -07:00
Cameron Gutman 7ed5a9831f Fix settings slideout scrolling too far on iOS 13 2019-08-29 21:57:51 -07:00
Cameron Gutman 42b7fd35ce Fix surround sound audio playing back silence 2019-08-29 21:07:10 -07:00
Cameron Gutman 42c97eafaa Fix slightly offset titles 2019-08-29 20:34:51 -07:00
Cameron Gutman 5b82be0546 Rewrite UIAppView rendering to consolidate tvOS and iOS codepaths 2019-08-29 20:32:18 -07:00
Cameron Gutman 1529058f52 Increase font size for app names 2019-08-29 19:00:42 -07:00
Cameron Gutman 3dcca3a922 Allow click and drag via tvOS remote trackpad 2019-08-29 18:55:33 -07:00
Cameron Gutman 9b8f230c46 Prevent gesture recognizers from eating our touch events. Fixes #375 2019-08-28 21:51:52 -07:00
Cameron Gutman 7699d9e574 Implement 5.1 surround sound support. Fixes #371 2019-08-26 22:46:35 -07:00
Cameron Gutman 641e1c5066 Update common-c for parallel STUN requests 2019-08-20 19:08:25 -07:00
Cameron Gutman 617ef7c6a6 Update common-c to support STUN fallback 2019-08-07 23:15:33 -07:00
Cameron Gutman c2620b8321 Fix tvOS build 2019-08-07 00:53:58 -07:00
Cameron Gutman 9e91d136bf Add Travis CI badge to readme 2019-08-07 00:48:26 -07:00
Cameron Gutman 9960d2a2ff Add Travis CI support 2019-08-07 00:40:54 -07:00
Cameron Gutman 311e77e01a Remove unit test for the old Swift controller class 2019-08-07 00:06:54 -07:00
Cameron Gutman c08df921da Update common-c to fix termination detection issue on GFE 3.19.0.107 2019-07-28 12:58:25 -04:00
Cameron Gutman ba4e55aac4 Add on-screen connection status warning 2019-07-23 18:43:41 -04:00
Cameron Gutman af16f03703 Stringify IPv6 addresses with scope IDs if present 2019-07-15 01:05:21 -07:00
Cameron Gutman 8189d54703 Remove forced population of host.address 2019-07-15 01:00:50 -07:00
Cameron Gutman ac8514e3cb Update common-c for IPv6 optimizations 2019-07-15 00:16:54 -07:00
Cameron Gutman 8f4b8da3ce Handle IPv6-only servers 2019-07-14 22:55:41 -07:00
Cameron Gutman 8337b3e708 Add support for zero configuration IPv6 streaming 2019-07-14 19:17:17 -07:00
Cameron Gutman cb527baead Generate SHA-256 client certificates instead of SHA-1 2019-07-05 22:20:55 -07:00
Cameron Gutman ed10612e2c Allow pairing to complete in the background to allow users to type the PIN using remote desktop apps 2019-07-05 22:18:30 -07:00
Diego Waxemberg 7d3eaeef83 Creating a new 2.7.0 build 2019-06-05 20:22:31 -07:00
Cameron Gutman dd5ecb37c4 Add support for Start and Select on iOS 13. Fixes #367 2019-06-05 19:54:56 -07:00
Cameron Gutman 636143ee97 Disable the 4K option for SoCs older than the A9 2019-06-05 18:59:40 -07:00
Cameron Gutman 28ff29bb96 Disable the HEVC toggle for devices that don't support HEVC 2019-06-05 18:41:30 -07:00
Cameron Gutman a508c6d855 Remove default Steam app to address Apple App Review rejection 2019-06-04 18:37:52 -07:00
Diego Waxemberg dbd6eabd24 Bumping app version for v2.7.0 2019-05-31 18:54:02 -07:00
Cameron Gutman ad0a5935f7 Don't compile asserts into release builds 2019-05-31 14:46:20 -05:00
Cameron Gutman dcd2dc97a6 Merge pull request #366 from MichaelMKenny/4K-120-bitrate-fix
Capped bitrate at 100Mbps.
2019-05-31 14:04:10 -05:00
Michael Kenny f92544c7d2 Capped bitrate at 100Mbps.
Choosing 4K 120Hz was causing an assert/crash.
2019-05-31 15:04:20 +09:30
Cameron Gutman 797fa0f492 Add 4K resolution option. Fixes #364 2019-05-27 10:37:26 -07:00
Cameron Gutman ff52adf4f8 Improve pairing messages 2019-05-27 10:27:10 -07:00
Cameron Gutman 8bb49ada11 Disable vibration for expedited review 2019-05-27 10:12:02 -07:00
Cameron Gutman 3f709b616b Fix video on GFE 3.19 2019-05-27 10:06:57 -07:00
Diego Waxemberg 83694f8141 Bumping version for v2.6.0 2019-04-29 19:20:46 -07:00
Cameron Gutman a4352aae4d Update common-c to pick up recent performance and bandwidth improvements 2019-04-27 15:01:40 -07:00
Cameron Gutman 2ac19336d6 Rename Multi-Controller Off to Single 2019-04-27 14:25:58 -07:00
Cameron Gutman 63b09c5b27 Remove the old message callbacks 2019-04-27 14:00:58 -07:00
Andrew Scagnelli b2c2f0837a more appletv tweaks (#351)
* redo now playing indicator

- instead of drawing an arrow overlay, add an offset green shadow

* do not show "Connection Terminated" on code 0

if an application quits successfully because it was asked to do so by
the user (errorCode = 0), then do not display an alert -- just go back
to the prior view.

* fix: add missing toggle for mutli-controller support
2019-02-13 21:03:09 -08:00
Cameron Gutman 335b5aef1f Add rumble support 2019-02-11 19:22:18 -08:00
Cameron Gutman 918e1248f2 Store GCController in Controller object to allow us to fetch controller attributes later 2019-02-11 18:21:04 -08:00
Cameron Gutman 442a791e0c Fix SOPS issues when streaming at 120 FPS 2019-02-09 21:03:48 -08:00
Cameron Gutman 573b93329d Merge pull request #354 from eraser2021999/master
Simple solution to solve focus issue on Apple TV.
2019-01-04 20:27:43 -08:00
Cameron Gutman 40359c5e32 Use stun.moonlight-stream.org for STUN 2019-01-04 20:23:46 -08:00
Cameron Gutman 3b01b50503 Update common-c with strict bitrate fix 2019-01-04 20:19:34 -08:00
Bogdan Coticopol 76b55cc230 Simple solution to solve focus issue on Apple TV. 2019-01-02 00:16:26 +02:00
Diego Waxemberg e136cd96c1 Bumping app version for 2.5.0 2018-12-29 10:32:02 -05:00
Cameron Gutman 5028eaed59 Fix crash presenting the loading frame while old one is still dismissing 2018-12-28 20:51:29 -08:00
Cameron Gutman d18c713684 Fix tip display on iPhone SE 2018-12-28 20:32:22 -08:00
Cameron Gutman 08e169eb23 Rewrite loading frame management (again) 2018-12-28 16:45:05 -08:00
Cameron Gutman 611358e35c Fix pairing code that didn't always call one of the pairing completion callbacks 2018-12-28 15:50:13 -08:00
Cameron Gutman 63275130bb Fix duplicate connection termination attempt due to race condition after calling LiInterruptConnection() 2018-12-28 15:31:18 -08:00
Cameron Gutman 7c9313e04d Ensure we don't deadlock if somehow a loading frame ends up under the active view 2018-12-28 02:09:57 -08:00
Cameron Gutman d466a0af07 Only cleanup the stream on termination 2018-12-28 02:03:21 -08:00
Cameron Gutman c8adc184c9 Use a semaphore to ensure the loading frame is safely shown and dismissed 2018-12-28 02:01:40 -08:00
Cameron Gutman d40a29df71 Ensure we can't enter the app grid without having a pinned cert 2018-12-28 01:32:53 -08:00
Cameron Gutman 85820bf812 Use the real online status rather than always assuming YES 2018-12-28 01:24:18 -08:00
Cameron Gutman 5d4d10ac8a Fix displaying GFE error messages for launch and resume 2018-12-28 01:16:56 -08:00
Cameron Gutman eca018ad15 Set host online immediately after using Add PC dialog to update host address 2018-12-28 00:54:26 -08:00
Cameron Gutman 90e582a263 Assert only in the cert untrusted error path 2018-12-28 00:45:32 -08:00
Cameron Gutman 3717228e28 Fix app grid running indicator not being correct immediately after returning from stream 2018-12-28 00:32:19 -08:00
Cameron Gutman 8c0997ddcd Update common-c to fix GFE 3.16 bitrate issue 2018-12-28 00:14:04 -08:00
Cameron Gutman d722c9e18d Use default auth handling if the pinning fails 2018-12-27 21:07:17 -08:00
Cameron Gutman 94c9433b99 Fix running state refresh on app grid 2018-12-27 19:54:27 -08:00
Cameron Gutman befef62b2f Log parsed XML attributes 2018-12-27 19:50:51 -08:00
Cameron Gutman dc00c1e3e7 Fix leak of UIComputerViews that poll forever 2018-12-27 19:50:29 -08:00
Cameron Gutman 3555d60a9b Add a quit tip for iOS and tvOS 2018-12-22 21:43:37 -08:00
Cameron Gutman bd8b9f8bfb Use a shared UID for all Moonlight clients 2018-12-22 21:02:24 -08:00
Cameron Gutman 72dcd76e37 Require cert pinning for HTTPS 2018-12-22 20:39:13 -08:00
Cameron Gutman fbae7f88b5 Add server cert pinning after pairing 2018-12-22 00:05:48 -08:00
Cameron Gutman 791a5b1ea1 Update project with Xcode recommendations 2018-12-07 21:48:54 -08:00
Cameron Gutman 8c5a82573b Update readme to new URL 2018-12-03 21:43:19 -08:00
Cameron Gutman cc56a36bbd Properly set GCSupportedGameControllers and GCSupportsControllerUserInteraction plist values 2018-12-01 15:00:24 -08:00
Cameron Gutman 336dbeed98 Remove loading frame from Add Host dialog flow 2018-11-28 18:43:45 -08:00
Cameron Gutman f8613cdbfd Fix broken app and host taps on iOS 8 2018-11-28 18:43:20 -08:00
Cameron Gutman a5961dd9b5 Use lower MTU for remote streaming and higher MTU for local networks 2018-11-21 21:03:08 -08:00
Cameron Gutman 17a5866fdd Merge pull request #341 from ascagnel/tv-fixes
tvOS app UI/UX fixes
2018-11-19 20:16:50 -08:00
Diego Waxemberg 5e77380636 Bumping app version for 2.4.0 2018-11-17 16:00:51 -08:00
Cameron Gutman 845af246b5 Fix a few cases where the loading frame could be left on-screen 2018-11-16 20:17:03 -08:00
Cameron Gutman 87cac4e562 Fix host long press causing duplicate menus to show up 2018-11-16 20:05:06 -08:00
Cameron Gutman 70eb4fd69d Allow waking non-paired hosts 2018-11-16 19:30:05 -08:00
Cameron Gutman c5120bec37 Remove wait between retries after polling failure 2018-11-16 19:14:00 -08:00
Cameron Gutman 24fc9ac0a9 Change "host already added" message to be more clear 2018-11-16 19:03:23 -08:00
Cameron Gutman 2c0624f1e7 Improve handling of non-local addresses and remote streaming 2018-11-16 19:02:31 -08:00
Cameron Gutman 8b227f28f7 Update common-c to fix NAT64 2018-11-16 00:41:23 -08:00
Cameron Gutman 23e9c3f236 Fix crash when the loading spinner is dismissed before fully presenting 2018-11-15 22:02:05 -08:00
Cameron Gutman eefde316de Fix bug that can cause spinner to get stuck 2018-11-15 21:11:02 -08:00
Cameron Gutman a3cfd787de Update common-c for GFE 3.16 2018-11-15 13:37:28 -08:00
Cameron Gutman 410d0d367b Fix handling of missing L3 and R3 buttons and adjust on-screen controls based on L3/R3 presence 2018-11-03 14:01:32 -07:00
Cameron Gutman 39b04d46a4 Add support for L3 and R3 on iOS 12.1 2018-10-31 18:08:34 -07:00
Andrew Scagnelli 0e8647ad07 feat: added settings bundle 2018-10-28 16:23:24 -04:00
Diego Waxemberg 73091e7e8c Creating build for 2.3.0 2018-10-27 12:55:02 -07:00
Cameron Gutman 16a2ab3941 Fix settings not saving on the first stream if the settings slideout is not closed 2018-10-27 11:57:29 -07:00
Cameron Gutman 39a2e8be78 Log an error if STUN fails 2018-10-26 20:51:31 -07:00
Cameron Gutman 8e6dadfa79 Use STUN to get the WAN address for PCs discovered by mDNS 2018-10-26 20:28:59 -07:00
Andrew Scagnelli c2134585df fix: apply tvos style to missing icon 2018-10-24 00:08:06 -04:00
Andrew Scagnelli dedcbd9d3e feat: update text color
do not apply UIComputerView text color so it uses the theme default
2018-10-23 23:28:07 -04:00
Andrew Scagnelli bd379677a2 feat: updated menu button handling
- on tapping menu once (or chording with LB/RB), behave as
start/select/special
- on doube-tapping menu, quit the stream
2018-10-23 23:18:56 -04:00
Andrew Scagnelli 466ebe2840 disable focus effects on overlay icon 2018-10-22 23:45:17 -04:00
Cameron Gutman 736887b945 Add 120 FPS option for devices with high refresh rate displays 2018-10-22 20:24:51 -07:00
Cameron Gutman 993bfca0ae Allow bitrate slider to go to 100 Mbps 2018-10-22 19:27:49 -07:00
Cameron Gutman 5ad87f7400 Hide the textbox so it doesn't obstruct normal UI controls. Fixes #344. 2018-10-22 19:06:52 -07:00
Andrew Scagnelli e862dbd6b6 adding some basic placeholder icons 2018-10-19 01:05:48 -04:00
Andrew Scagnelli befde5eb28 system theme, tvos icon styling
- using tvos icon styling
- updated to use system theme (light/dark) instead of always being grey
2018-10-19 00:03:14 -04:00
Andrew Scagnelli 7fd3b8df1c on tvOS, do not quit the stream on pressing B
on tvOS (maybe also on other cases where you're using a "real" gamepad?),
use GCEventViewController so the system-level "back" event doesn't quit
the stream
2018-10-18 00:04:04 -04:00
Diego Waxemberg cee501d9b4 Bumping app version for 2.2.0 2018-10-08 21:14:18 -07:00
Cameron Gutman a103c0fd45 Update common-c to use split frame encode on HEVC 2018-10-08 20:26:32 -07:00
Cameron Gutman bf71ae003f Add all modifier flag combinations 2018-10-08 20:25:43 -07:00
Cameron Gutman 5b102ce3d3 Merge pull request #335 from tranchis/ios-keyboard
Improve keyboard support
2018-09-27 21:44:11 -07:00
Sergio Alvarez-Napagao c2012fa195 Improve keyboard support 2018-08-30 21:06:36 +02:00
Cameron Gutman 003fc8c1f8 Improve keyboard handling for unexpected inputs and multi-character input (such as dictation) 2018-08-29 10:02:58 -07:00
Cameron Gutman 9123033bb3 Remove help links from tvOS version due to lack of browser and WebKit 2018-08-29 09:36:51 -07:00
Cameron Gutman 253144188c Purge box art cache on low memory warning 2018-08-29 09:24:47 -07:00
Cameron Gutman 4ccb9bebbf Fix stream cleanup when pressing Menu on tvOS 2018-08-29 09:21:49 -07:00
Cameron Gutman 49f647748c Fix discovery being stopped after returning from Add PC dialog 2018-08-29 07:52:33 -07:00
Cameron Gutman e2e8f0121d Persist the database in NSUserDefaults on tvOS 2018-08-28 17:42:59 -07:00
Cameron Gutman b5ea4c3e50 Change URL timeout to 4 seconds to improve offline behavior 2018-08-27 01:55:34 -07:00
Cameron Gutman 90d47004e7 Avoid storing images in the database 2018-08-27 01:54:58 -07:00
Cameron Gutman 450960eaaf Fix credential storage on tvOS 2018-08-27 00:34:34 -07:00
Diego Waxemberg 44550baaa9 Changing directories for storage on tvOS because tvOS does not allow permanent storage 2018-08-26 21:54:49 -07:00
Cameron Gutman 293dc26b2e Fix the navigation bar look 2018-08-26 19:03:22 -07:00
Cameron Gutman 109fa6f463 Set the title of the view to the selected PC 2018-08-26 17:05:13 -07:00
Cameron Gutman 44f64e1a35 Fix several UI issues 2018-08-26 16:43:45 -07:00
Cameron Gutman 2e479837ed Fix spinners on tvOS and mouse support using the remote 2018-08-26 15:55:39 -07:00
Cameron Gutman 1b681a8730 Allow tvOS to back out from app grid to PC grid 2018-08-26 15:05:32 -07:00
Cameron Gutman f988ce0278 Fix issues with the loading frame colliding with other views 2018-08-26 12:25:22 -07:00
Cameron Gutman 1ef5c87afc Share MainFrameViewController between iOS and tvOS 2018-08-26 11:56:27 -07:00
Diego Waxemberg f5b99b6b9c Can now stream to tvOS 2018-08-26 11:31:20 -07:00
Diego Waxemberg 485dd4b001 Merge branch 'tvOS' of github.com:moonlight-stream/moonlight-ios into tvOS 2018-08-26 11:17:20 -07:00
Diego Waxemberg 92e2c0d7cc app cells are now clickable in tvOS 2018-08-26 11:14:15 -07:00
Cameron Gutman 48ffca57ec Fix infinite loop of loading UI spinners 2018-08-26 11:09:15 -07:00
Cameron Gutman e83a996cd5 Re-port MainFrameViewController to tvOS to fix loading page issues 2018-08-26 10:59:31 -07:00
Diego Waxemberg 57191e3b9a added a highlight state for focused views (can now see what's selected in tvOS) 2018-08-26 10:53:28 -07:00
Diego Waxemberg eadcf3b3eb fixed 'unsafe' requests and can now click stuff 2018-08-26 01:15:53 -07:00
Cameron Gutman 71e0646659 Add code to handle discovery and game controllers 2018-08-26 00:48:29 -07:00
Diego Waxemberg f2edee1669 Merge branch 'tvOS' of github.com:moonlight-stream/moonlight-ios into tvOS 2018-08-26 00:33:43 -07:00
Diego Waxemberg 11948bf618 wip 2018-08-26 00:15:56 -07:00
Cameron Gutman 4a9294a4b7 Remove Roboto fonts, switch to iOS app delegate for tvOS, and add stream view and loading view 2018-08-26 00:14:08 -07:00
Cameron Gutman a9b8f753a2 Remove tvOS-specific data model 2018-08-25 23:32:43 -07:00
Diego Waxemberg 05761c787c working on tvOS UI 2018-08-25 23:22:52 -07:00
Cameron Gutman 9a7b3b1325 Build libopus for tvOS and iOS with bitcode 2018-08-25 21:17:08 -07:00
Cameron Gutman b04a4e72ff Rebuild OpenSSL with bitcode for macOS, iOS, and tvOS 2018-08-25 20:34:36 -07:00
Diego Waxemberg b0b9a614f3 Adding tvOS target 2018-08-25 20:33:03 -07:00
Diego Waxemberg 76ab786e94 Adding keyboard support 2018-08-25 15:22:32 -07:00
Cameron Gutman 8afcdc92d4 Update common-c to fix GFE 3.14.1 audio bitrate issues 2018-08-25 00:32:33 -07:00
Cameron Gutman 907a2cd59b Update README.md 2018-08-24 23:20:16 -07:00
Cameron Gutman a85b931d87 Enable stale and no-response bots to reduce inactive issues 2018-08-12 00:22:30 -07:00
Diego Waxemberg 62f1b3e595 Bumping app version for 2.1.0 2018-06-17 16:43:42 -07:00
Cameron Gutman b9381ad027 Update common-c to fix RTSP handshake error on quick reconnect 2018-06-09 21:54:25 -07:00
Cameron Gutman 98d01f7775 Ensure the C strings stay valid until connection-time. Fixes #228 2018-06-09 20:04:40 -07:00
Cameron Gutman de39c87185 Allow the stream to be inactive for 10 seconds before terminating 2018-06-09 16:29:48 -07:00
Cameron Gutman 10a00b0d28 Avoid leaving application lifetime notifications registered all the time 2018-06-09 16:28:37 -07:00
Diego Waxemberg 4d8788add3 Bumping app version for 2.0.0 2018-06-02 21:31:53 -07:00
Cameron Gutman 9c019be322 Fix subtle database corruption that would cause games common to 2 or more PCs to jump between them based on the last app list fetched 2018-06-02 20:44:12 -07:00
Cameron Gutman 80254513c4 Avoid blocking the main thread when delaying for button presses 2018-06-02 19:19:24 -07:00
Cameron Gutman 5a13e44fdb Use an exponential-ish bitrate slider 2018-06-02 19:09:38 -07:00
Cameron Gutman ec0a462092 Remove custom style on UISegmentedControl, since the default actually looks better 2018-06-02 18:14:20 -07:00
Cameron Gutman 25c7b18147 Add UI settings for HEVC, optimizing games, PC audio, multi-controller. Remove remote setting since it doesn't do much and might confuse users. 2018-06-02 18:13:32 -07:00
Cameron Gutman fb238e0d1d Log launch and resume requests 2018-06-02 17:50:48 -07:00
Cameron Gutman bfc0b89926 Add many new preferences to settings DB. Default HEVC to off due to reference frame invalidation not working 2018-06-02 17:10:52 -07:00
Cameron Gutman 2f0e219726 Always set the stream config from the data from the actual app we're going to start streaming, not just the one selected 2018-06-02 16:38:02 -07:00
Cameron Gutman 2305f33572 Fix scrolling jank on app list 2018-06-02 16:31:16 -07:00
Cameron Gutman d17f2f9dee Plumb multi-controller toggle 2018-06-02 13:52:58 -07:00
Cameron Gutman a28049a58c Plumb several new options into stream config and launch requests: optimizeGameSettings, playAudioOnPC, surround sound, and HDR 2018-06-02 13:25:53 -07:00
Cameron Gutman 2d2f71dcab Parse and persist ServerCodecModeSupport attribute for hosts 2018-06-02 13:10:10 -07:00
Cameron Gutman 59506a2364 Parse and remember the IsHdrSupported app attribute 2018-06-02 12:33:13 -07:00
Cameron Gutman 2cec53ab6b Fix typo in analog stick deadzone area 2018-06-02 01:38:52 -07:00
Cameron Gutman 42ef67d939 Let the spinner spin until video appears 2018-06-02 01:02:10 -07:00
Cameron Gutman 30ec68cd4e Ensure the progress messages aren't obscured by the video layer 2018-06-02 01:01:45 -07:00
Cameron Gutman 941c414930 Fix R2 being improperly sized on 3x DPI 2018-06-01 22:20:37 -07:00
Cameron Gutman b918005555 Improve OSC usability for iPad. Fixes #317 2018-06-01 22:09:24 -07:00
Cameron Gutman c74fa4d5b0 Change manual simple OSC mode to have useful buttons. Fixes #218 2018-06-01 21:18:41 -07:00
Cameron Gutman 1a71e040c0 Fix deadzones to dynamically detect controls on screen and add a deadzone for the analog sticks 2018-06-01 21:17:47 -07:00
Cameron Gutman 236c9d5c6e Use more aggressive mDNS querying for faster PC discovery, particularly in newly online PC scenarios 2018-06-01 20:23:39 -07:00
Cameron Gutman 862b8632e3 Fix DiscoveryManager trying to start discovery again on all machines when any machine is discovered 2018-06-01 19:50:32 -07:00
Cameron Gutman cdb5f51ab8 Quiet down PC discovery logging 2018-06-01 19:38:52 -07:00
Cameron Gutman 314f32388a Use the app name in the "Starting App" text 2018-06-01 19:11:10 -07:00
Cameron Gutman 39b0b429d6 Show loading spinner while waiting for apps to quit 2018-06-01 18:58:25 -07:00
Cameron Gutman 23a12ed101 Actually set CAPABILITY_DIRECT_SUBMIT and fix the bug it hides 2018-06-01 17:00:02 -07:00
Cameron Gutman 653a789110 Refresh app and host state when returning from streaming via error 2018-06-01 00:47:44 -07:00
Cameron Gutman 04b2fccaef Only interact with the AVSampleBufferDisplayLayer on the main thread 2018-06-01 00:31:41 -07:00
Cameron Gutman ec0124e255 Ensure we properly restart discovery after closing Control Center 2018-06-01 00:07:25 -07:00
Cameron Gutman 132a1fc410 Don't attempt to pair on entry to foreground if we've become unpaired 2018-05-31 01:53:09 -07:00
Cameron Gutman 63297c8483 Lan -> LAN 2018-05-31 01:37:13 -07:00
Cameron Gutman 5fd2c29a73 Avoid displaying error dialogs on passive actions like returning to foreground 2018-05-31 01:36:10 -07:00
Cameron Gutman e6e7ec9202 Avoid animating the loading frame 2018-05-31 01:22:03 -07:00
Cameron Gutman fcc770d820 Avoid firing off HTTP requests as we enter the background when entering home from streaming 2018-05-31 00:46:41 -07:00
Cameron Gutman 4243bcd5d1 Ensure double-starting or stopping DiscoveryManager and MDNSManager doesn't cause side-effects, since we do this when Home is pressed while streaming 2018-05-31 00:33:24 -07:00
Cameron Gutman 67b08cd8b9 Use LiInterruptConnection() to terminate connection attempts more quickly 2018-05-30 22:06:20 -07:00
Cameron Gutman e697938afc Re-enable the idle timer when streaming has ended 2018-05-30 22:04:06 -07:00
Cameron Gutman 275f6df8c1 Fix some minor issues with saving CoreData objects 2018-05-30 01:19:46 -07:00
Cameron Gutman aea2067e1c Silence the firehose of debug logging statements 2018-05-29 20:17:48 -07:00
Cameron Gutman b5241a0c30 Ok -> OK 2018-05-28 18:20:59 -07:00
Cameron Gutman 6cac2348b4 Add help button to error dialogs and use default style for non-destructive actions 2018-05-28 18:00:19 -07:00
Cameron Gutman 0293df7748 Rewrite audio playback to simplify code, reduce allocations, and eliminate priority inversion on the queue lock. This completely eliminates clicks and pops in audio for me on my iPhone SE and the emulator. 2018-05-28 17:38:09 -07:00
Cameron Gutman 391872ddb8 Ignore unsupported gamepads 2018-05-28 15:11:23 -07:00
Cameron Gutman 4bafefbe16 streamingRemotely should not be optional 2018-05-28 13:51:00 -07:00
Cameron Gutman 812f3f3717 Add 360p resolution support 2018-05-28 13:50:20 -07:00
Cameron Gutman e498736af6 Fix Moonlight macOS build 2018-05-28 13:25:18 -07:00
Cameron Gutman 1842a11f56 Fix errors saving PCs that were discovered via mDNS 2018-05-28 13:19:49 -07:00
Cameron Gutman 85f81ca8c1 Use CoreData codegen to resolve warnings about missing getters/setters on our DB objects 2018-05-28 12:40:15 -07:00
Cameron Gutman b792629943 Flip the pull arrow when the settings are open 2018-05-28 12:04:38 -07:00
Cameron Gutman 7df76fcd93 Allow the settings view to scroll on smaller iPhones 2018-05-28 11:39:04 -07:00
Cameron Gutman 8b60e79406 Minor common-c update to address a (currently) harmless warning 2018-05-28 10:49:41 -07:00
Cameron Gutman fcb6c7386c Update common-c to receive fixes to lower audio bitrate at low bandwidth settings 2018-05-28 10:36:17 -07:00
Cameron Gutman 2729fad47c Commit IDEWorkspaceChecks.plist 2018-05-28 10:35:36 -07:00
Cameron Gutman 41eb933e11 Update to XCode 9.3 recommended settings and fix "implict retain self" warnings 2018-04-21 22:20:27 -07:00
Felix Kratz f759f719e6 Dark Mode & Stream Overlay [macOS] (#315)
* dark mode & stream overlay

* removed all redundant imports

* update for the new xcode version with fixes for the new 'implicitly retains self warning'

* reworked the overlay view

* cleaning up unused variables

* small corrections
2018-04-22 00:44:22 -04:00
Cameron Gutman 74283a6763 Use HEVC on iOS 11.3 and later. Fixes #296 2018-04-10 18:57:02 -07:00
Cameron Gutman 0a19c5950a Update organization name in both projects 2018-03-27 00:38:47 -07:00
Cameron Gutman e8832ed746 Refactor new macOS code to reduce #ifs, increase shared code, and fix warnings 2018-03-27 00:34:38 -07:00
Felix Kratz 6cc165b589 Port for macOS (#311)
* merged moonlight-mac with moonlight-ios

* reverted to the original project.pbxproj

* cleaned up the code, fixed lots of unnecessary code duplications

* multicontroller support (not tested)

* new class that can be used for further modularization of the MainFrameViewController
2018-03-26 23:50:40 -07:00
Cameron Gutman 1c86c4485d Disable HEVC until iPhone X and other issues can be sorted out. See #296 2018-02-24 21:16:02 -08:00
Cameron Gutman 127e5ed54a Migrate to Swift 4.0 with @objc inferencing fixes for Moonlight build target 2018-02-19 14:43:50 -08:00
Cameron Gutman 3fee5d0a62 Fix build of unit tests 2018-02-19 14:33:20 -08:00
Cameron Gutman c913b3f04f Enable XCode 9 recommended warnings and fix occurrences of them in the code 2018-02-19 14:26:12 -08:00
Cameron Gutman dfd30c0624 Remove some old and unused references from the XCode project 2018-02-19 14:05:03 -08:00
Cameron Gutman 5117a6ede5 Replace dylibs with tbd 2018-02-19 13:56:50 -08:00
Cameron Gutman fb9c071243 Update moonlight-common-c 2018-02-19 00:25:57 -08:00
Cameron Gutman d0a8f0e0f1 Update README.md 2018-01-20 17:03:09 -08:00
Cameron Gutman 6bb6c40bec Report attached gamepads during launch to fix L4D2 2018-01-20 14:37:33 -08:00
Cameron Gutman af3bc82d0f Fix drag cancellation triggering on any movement and other drag bugs. Fixes #288 2018-01-20 01:51:50 -08:00
Cameron Gutman b9d5d94d70 Fix support for IPv6 literals 2018-01-20 01:30:29 -08:00
Cameron Gutman 43f4804194 Fix wake-on-lan failure on LAN after ARP cache expiration of target PC. Fixes #293 2018-01-19 20:18:39 -08:00
Diego Waxemberg be26ce9a8f Bumping app version for v1.7.0 2018-01-10 19:35:41 -08:00
Cameron Gutman ca562e2251 Update common-c to fix streaming on GFE 3.12 2018-01-10 00:45:38 -08:00
Cameron Gutman d7ee0916e9 Avoid crashing on iOS 11 betas released before iPhone X 2017-12-27 23:24:53 -08:00
Cameron Gutman 3bc9e050f1 Update common-c and use codec masks rather than exact formats 2017-12-03 11:33:11 -08:00
Cameron Gutman 4b9bd8398b Update for video decoder API changes 2017-11-18 18:17:22 -08:00
Diego Waxemberg 20a61dd9f4 Bumping app version for v1.6.0 2017-11-12 19:57:36 -08:00
Cameron Gutman dc4ecbf262 Update common-c to address HEVC corruption at 1080p60 2017-11-10 01:36:00 -08:00
Diego Waxemberg 68f55235ec Bumping app version for v1.5.0 2017-10-17 21:28:30 -07:00
Cameron Gutman 5434b653c7 Reduce bitrate when streaming HEVC to reduce bandwidth at better IQ than H.264 2017-10-17 01:07:41 -07:00
Cameron Gutman 25d7af9453 Fix pairing and game quitting issues with GFE 3.10 2017-10-16 23:59:00 -07:00
Diego Waxemberg 5584083809 Bumping app version for 1.4.0 2017-09-23 21:48:22 -07:00
Cameron Gutman 9f9aec70b0 Add 1024x1024 app icon 2017-09-23 21:47:33 -07:00
Cameron Gutman a8d1770871 Fix Main Thread Checker safety issue in DataManager 2017-09-15 00:51:37 -07:00
Cameron Gutman d0d60b8ffc Suppress system gesture detection during streaming 2017-09-15 00:30:51 -07:00
Cameron Gutman 86f7112789 Adjust settings view for iPhone X 2017-09-14 23:12:52 -07:00
Cameron Gutman da1115e529 Disable reference frame invalidation for HEVC 2017-09-14 22:03:20 -07:00
Cameron Gutman 593da7ef3e Merge branch 'hevc' 2017-09-14 21:54:46 -07:00
Cameron Gutman de5377a95d Only use HEVC if the client has hardware-accelerated decoding 2017-09-14 19:50:53 -07:00
Cameron Gutman 7d7500b187 Suppress accidental movements during drags and clicks 2017-09-10 23:14:13 -07:00
Cameron Gutman 45dbd46da1 Fix mouse cursor jumping on right click gesture where only the 2nd finger is lifted to complete the gesture 2017-09-10 22:58:43 -07:00
Cameron Gutman 89d8bc6009 Fix icon changing between launch screen and main view controller 2017-09-10 22:22:32 -07:00
Cameron Gutman b99988836a Implement HEVC decoding for iOS 11 devices 2017-09-10 00:00:40 -07:00
Cameron Gutman 3e94613eb3 Update common-c 2017-09-02 19:48:09 -07:00
Cameron Gutman 832b9189f8 Fix mDNS overriding manually specified addresses 2017-09-02 19:47:47 -07:00
Cameron Gutman 3464539bd3 Make iconography consistent with other Moonlight clients 2017-09-02 14:54:19 -07:00
Cameron Gutman 815592117d Update common-c 2017-06-11 14:54:17 -07:00
Cameron Gutman b51341ef54 Update to latest moonlight-common-c 2017-06-11 13:36:23 -07:00
Cameron Gutman 9ffbb5f155 Update moonlight-common-c with latency and FEC improvements 2017-06-08 21:09:21 -07:00
Cameron Gutman 9716867ade Update moonlight-common-c 2017-06-05 22:27:15 -07:00
Diego Waxemberg 7c141c1fd2 Bumping version for 1.2.0 2017-05-11 22:36:28 -07:00
Cameron Gutman 42c4e7ca58 Enable reference frame invalidation 2017-05-11 20:46:09 -07:00
Cameron Gutman 6a6ea4a79a Update moonlight-common-c 2017-05-11 20:12:06 -07:00
Cameron Gutman 5d0ca8451d Fix active game not being set when returning from streaming 2017-05-07 23:32:31 -07:00
Cameron Gutman 4641f68eb8 Update common-c with critical FEC fixes 2017-05-07 23:16:00 -07:00
Cameron Gutman dd33f57b9a Fix display of pairing failure dialog when machine is streaming 2017-05-07 16:51:57 -07:00
Cameron Gutman f6b225ca9c Update common-c with FEC changes 2017-05-06 16:09:56 -07:00
Cameron Gutman 4ac3f11ff8 Ensure that OSC always has Player 1 reserved 2017-02-06 19:17:27 -08:00
Cameron Gutman 62aaf27293 Update to new common-c to show the correct number of controllers on the host PC 2017-02-04 20:16:18 -08:00
Diego Waxemberg eac2d985e2 Created build v1.1.4 and removed empty icon sets 2016-12-14 22:05:47 -08:00
Cameron Gutman 61ea7f3f1c Update moonlight-common-c with support for GFE 3.2 2016-12-13 21:29:03 -08:00
Cameron Gutman 40f7faa1b1 Update moonlight-common-c project to recommended settings on Xcode 8.1 2016-10-29 19:55:22 -07:00
Diego Waxemberg 9e18b8021b Bumping app version for v1.1.3 2016-10-26 19:08:33 -07:00
Cameron Gutman ce95f2c153 Fix some pairing glitches and add a cancel button 2016-10-21 12:07:29 -07:00
Cameron Gutman fd50b71b16 Fix detection of running apps on GFE 3.1 2016-10-21 11:41:42 -07:00
Diego Waxemberg 39ab472cf6 Updated to use swift 3 2016-10-05 23:45:48 -07:00
Diego Waxemberg 48ba7eb2dc Bump version for v1.1.2 2016-10-05 23:00:46 -07:00
Diego Waxemberg 42edaa1bad Added DerivedData to gitignore 2016-10-05 22:58:38 -07:00
Diego Waxemberg 955fb59156 Merge branch 'master' of github.com:moonlight-stream/moonlight-ios 2016-10-05 22:57:43 -07:00
Diego Waxemberg 2fbc67ef00 Bumped version for v1.1.1 2016-10-05 22:56:40 -07:00
Cameron Gutman 23564a3028 Add support for GFE 3.0.7 2016-10-05 17:32:30 -07:00
Cameron Gutman 9a07d5a33a Display an error if attempting to close another session's app rather than silently failing 2016-09-24 21:26:50 -07:00
Cameron Gutman 84c037f235 Move the pull arrow up to the top of the left side and make it clickable on the PC view page 2016-09-24 20:39:43 -07:00
Cameron Gutman c13df82f5b Update common-c to fix Gen 3 servers 2016-09-24 19:09:21 -07:00
Cameron Gutman b15d61a5bf Allow existing host to be updated via the Add PC dialog 2016-09-24 18:53:52 -07:00
Cameron Gutman 5aff719984 Add message to enable GameStream for GFE 3.0 2016-09-24 18:51:55 -07:00
Cameron Gutman b0c2978405 Update common-c submodule with const char * change 2016-07-31 17:10:32 -07:00
Cameron Gutman 91dcb505de Fix displaying names of custom added apps on GFE 3.0 2016-07-31 14:40:08 -07:00
Cameron Gutman d1f35d938b Apply Xcode 8 recommended project settings 2016-07-31 12:02:35 -07:00
Cameron Gutman 359b822951 Migrate to Swift 2.3 for Xcode 8 2016-07-31 12:00:09 -07:00
Cameron Gutman 39580e4352 Fix wiki link 2016-05-30 12:23:41 -05:00
Cameron Gutman 7b3d099449 Use the same Controller object for player 0 and the on-screen controls so tapping on-screen buttons doesn't reset all physical controller input to 0. Fixes pressing L3 to run in some games. 2016-05-22 17:11:30 -05:00
Cameron Gutman b17c45e9ca Update common-c to include MTU fix for LTE streaming 2016-05-21 21:32:36 -05:00
Cameron Gutman 4c7a2cecdd Allow the user to slide between directions on the d-pad. This closes #222 2016-05-08 15:42:08 -04:00
Cameron Gutman 175074ece8 Tweaks to dragging behavior to match Moonlight Android 2016-05-08 15:09:43 -04:00
Cameron Gutman 8a5ec513bf Update common-c 2016-05-08 14:59:08 -04:00
Cameron Gutman 7cfb7f73a2 Fix some WOL issues including crashes and broken functionality with DNS names 2016-05-08 14:56:22 -04:00
Cameron Gutman c608685737 Update common-c with bugfixes 2016-04-27 02:24:54 -04:00
Cameron Gutman 3beca2fc72 Update moonlight-common-c to fix a couple crashing bugs 2016-04-18 16:46:59 -04:00
Cameron Gutman c59aafb4bb Merge pull request #215 from Mimiste/master
Drag and drop
2016-04-18 14:02:07 -04:00
Mimiste 256e40acdc 1 Second touch for the drag and drop
Changed the timer duration to 1 second to initiate the drag and drop
2016-04-18 19:44:00 +02:00
Mimiste 39b1b65e16 Merge remote-tracking branch 'moonlight-stream/master' 2016-04-16 18:56:02 +02:00
Cameron Gutman 1783abec13 Lock around LiStartConnection() and LiStopConnection() to fix thread-safety issues. This will hopefully address the crashes seen in 1.0.3 and 1.0.4. 2016-04-12 00:50:59 -04:00
David 983c65d399 Rewrote the Controller class in Swift (#216)
* Enabled Defines Modules for swift code

* Created bridge header, created swift Controller

-  Created Controller.swift
-  Created bridge header for use of objc in swift

* Finished porting Controller files to swift

* Added comments, created MoonlightUnitTest

-  Added comments for Controller.swift
-  Created MoonlightUnitTest for testing new class

* Started writing tests for ControllerUnitTests

-  General formatting
-  Wrote helper functions
-  Wrote tests for first four properties

* Finished writing Controller tests

* Removed commented out lines
2016-04-11 20:44:02 -07:00
Mimiste 4caa9672c9 Drag and drop
The drag and drop is now enabled only if touching with one finger.
The tap to drop does not fire another timer
2016-04-10 13:02:00 +02:00
Mimiste 15be6a3f75 Merge remote-tracking branch 'moonlight-stream/master' 2016-04-10 11:48:30 +02:00
Michelle Bergeron d38eb0a3ba s/current/currently 2016-04-09 23:12:59 -07:00
Mimiste e8ea942ad2 Drag and drop
Possibility to initiate a drag and drop

- Touch for 2 second to initiate a drag
- Move the cursor as usual
- Tap top drop
2016-04-08 00:12:59 +02:00
Diego Waxemberg cb68b10475 Removed "Headers" build phase from common and created v1.0.4 2016-03-31 20:36:07 -07:00
Cameron Gutman 11c854ce44 Update common-c to support Gen 7 2016-03-31 11:27:02 -04:00
Cameron Gutman 9636f4742b Implement pairing for Gen 7 servers 2016-03-31 11:20:18 -04:00
Cameron Gutman 5867317526 Move the submodule and subproject to their new locations 2016-03-31 07:59:35 -04:00
Cameron Gutman 8a8f7b6903 Remove old submodule 2016-03-31 07:23:37 -04:00
Diego Waxemberg 61b6e25a91 Bumping app version for 1.0.3 2016-03-08 22:35:06 -08:00
Diego Waxemberg 50cff820de Added app icon for ipad pro 2016-03-08 22:34:15 -08:00
Cameron Gutman 4e586a28c8 Update common-c to fix RTSP timeout issue 2016-03-08 13:15:33 -08:00
Cameron Gutman 0702b4ed57 Fix a performance regression in handling the applist response 2016-03-07 16:12:10 -08:00
Cameron Gutman 4a2132a682 Update common-c to support GFE 2.11 2016-03-07 14:45:05 -08:00
Diego Waxemberg ba81d1d6a9 Bumping version and creating build 1.0.2 2016-02-19 13:08:01 -08:00
Cameron Gutman 402ce4b3ec Update common-c to support Gen 5 servers 2016-02-19 15:09:37 -05:00
Cameron Gutman fc713453ad Merge branch 'master' of github.com:moonlight-stream/moonlight-ios 2016-02-16 10:38:25 -05:00
Cameron Gutman b222ccffbb Fix analysis warning 2016-02-16 10:37:59 -05:00
Michelle Bergeron 56ce7329d2 Point to website, add wiki link. 2016-02-15 22:39:32 -08:00
Michelle Bergeron 99ab6db557 Added note about Apple TV in effort to stave off some emails 2016-02-07 21:53:55 -08:00
Cameron Gutman d7adf96f3a Newer GFE versions don't mind resuming another device's stream 2016-02-06 23:10:36 -05:00
Cameron Gutman 0ae58c61a9 Remove apps from the database when they are removed from the app list 2016-01-21 16:24:02 -05:00
Cameron Gutman 2ec7d1d2f1 Use the main queue for the managed object context as a hack to prevent merge conflicts 2016-01-21 16:17:05 -05:00
Cameron Gutman ad1b9059ee Ensure the host matches for app entries 2016-01-21 15:01:15 -05:00
Cameron Gutman 4439c7cce6 Fix initial app list loading after pairing 2016-01-21 14:14:29 -05:00
Cameron Gutman b8a4093c75 Preserve app art when updating the app list 2016-01-21 14:03:07 -05:00
Cameron Gutman ec3748b26e Implement hash and isEqual for TemporaryApp and TemporaryHost 2016-01-21 13:34:34 -05:00
Cameron Gutman 1c1f22e047 Update the database on each server info poll 2016-01-21 12:09:49 -05:00
Cameron Gutman 9aa9b0fc5a Copy the pair state into the temporary host 2016-01-21 11:42:19 -05:00
Cameron Gutman f8e2ca8500 We can't hold onto managed objects in our temporary objects because they can disappear from under us, so do the lookup when we propagate values 2016-01-21 11:29:17 -05:00
Cameron Gutman 3076e29335 Basic database access is working 2015-12-02 00:25:38 -08:00
Cameron Gutman fe616d86c5 Reduce usage of DataManager 2015-12-01 20:56:08 -08:00
Cameron Gutman bfa4856bbe Move non-CoreData backed fields out of CoreData objects 2015-12-01 20:36:08 -08:00
Cameron Gutman 5ea92a7b48 Stop using CoreData-backed objects in any non-DataManager code 2015-12-01 20:31:24 -08:00
Diego Waxemberg 4ba71db7b2 bumped build version 2015-11-14 13:07:31 -08:00
Diego Waxemberg c1e6aeb43c Merge branch 'master' of github.com:moonlight-stream/moonlight-ios 2015-11-14 12:33:44 -08:00
Diego Waxemberg e3ffb66ef0 bumping version code 2015-11-14 12:33:41 -08:00
Cameron Gutman 5daa82b0ba Show the hosts in alphabetical order rather than in an undefined order 2015-11-13 19:55:18 -08:00
Cameron Gutman a8bcc6afba Split the work into 2 jobs per computer to retrieve assets faster 2015-11-13 19:52:35 -08:00
Cameron Gutman e6aa16ad01 Revert "Fix concurrent modification crash in app asset caching code"
This reverts commit ad0705d126.
2015-11-13 19:07:15 -08:00
Cameron Gutman ad0705d126 Fix concurrent modification crash in app asset caching code 2015-11-13 18:30:12 -08:00
Cameron Gutman 2f31f93bf8 Add support for GFE 2.8 2015-11-11 18:24:36 -08:00
Cameron Gutman ea3be613c5 Try 5 times to get the app list before failing 2015-11-11 18:14:59 -08:00
Cameron Gutman b495246f34 Only mark a PC offline if server info failed after 3 straight tries 2015-11-11 18:14:04 -08:00
Cameron Gutman 814470f4bf Set the default bitrate based on the selected resolution and FPS combo 2015-11-11 18:11:33 -08:00
Cameron Gutman 82293a08b6 Increase the request timeout to 7 seconds to give a bit more time for slow app lists to come in 2015-11-11 17:53:13 -08:00
Cameron Gutman 20d66336a7 Cache decoded UIImage objects for the scroll view to fix janky scrolling 2015-11-10 21:23:00 -08:00
Cameron Gutman c8441ec9fa Rasterize the cell layer to increase scrolling performance 2015-11-10 20:48:39 -08:00
Cameron Gutman f72135c227 Mark collection cells opaque for better performance 2015-11-10 20:47:09 -08:00
Michelle Bergeron 100e6e4ce8 Remove info about the beta 2015-11-09 21:53:58 -08:00
Michelle Bergeron ec8be20d62 Download link 2015-11-09 21:53:24 -08:00
Diego Waxemberg 55d48101ef Bumped build version
This is the first attempt at submission to the App Store
2015-11-01 00:12:39 -07:00
Cameron Gutman c36f4c5f84 Remove abort calls 2015-10-31 23:45:37 -07:00
Diego Waxemberg 06289ac4d2 No longer use IDFA, now generate UUID and persist in Core Data. Bumped version to 1.0.0 2015-10-31 23:04:32 -07:00
Cameron Gutman e6a2d5d425 Update project file after Xcode 7.1 2015-10-31 19:00:44 -07:00
Cameron Gutman ea8db9c4ea Update common with new bitrate logic 2015-10-31 19:00:05 -07:00
Cameron Gutman 3773e841d1 Update common to support GFE 2.7 2015-10-25 13:28:24 -07:00
Diego Waxemberg ad1ddd04f3 no longer allow multiple apps to be selected at the same time 2015-10-18 16:52:14 -07:00
Diego Waxemberg 67a8b232b9 added pull arrow to side of screen 2015-10-17 16:16:13 -07:00
Diego Waxemberg 5293c07fc0 fixed issue where we wouldn't terminate the stream on failure 2015-10-17 03:46:09 -07:00
Diego Waxemberg e3a42db007 On-screen controls revamp
- controls are bigger
- dead zone around buttons to avoid accidental mouse clicks and movement
- finished implementing control setup for AutoGCGamepad
- swiping to close stream requires swipe to 1/4 the screen width
- no longer send mouse movement if delta is too small
2015-10-17 03:02:55 -07:00
Diego Waxemberg 3b1462af22 removed support for native resolution stream 2015-10-16 23:38:14 -07:00
Cameron Gutman 74a0c5b1cd Merge branch 'master' of github.com:moonlight-stream/moonlight-ios 2015-09-30 20:44:26 -07:00
Cameron Gutman 05a5e4fa64 Fix a crash when apps are removed from GFE 2015-09-30 20:44:14 -07:00
Cameron Gutman b6445295a7 Use a temporary app object and database lock to avoid saving while the database is not in a consistent state 2015-09-30 20:34:52 -07:00
Diego Waxemberg 391605ef36 ignored the new xcsmblueprint files 2015-09-30 19:18:21 -07:00
Diego Waxemberg 695499dea9 host and app buttons now have feedback when tapped 2015-09-30 19:13:37 -07:00
Cameron Gutman 9ba7f35444 Require full-screen since the streaming game will be the primary interaction for the device 2015-09-30 18:00:52 -07:00
Cameron Gutman 37dc00735b Enabling bit code is causing linker errors when deploying to real devices for some reason. Turning it back off. 2015-09-29 00:06:27 -07:00
Cameron Gutman 920cbadc91 Add a workaround/hack to fix duplicating machines 2015-09-29 00:04:40 -07:00
Cameron Gutman bc53b4dc32 First stab at fixing on screen controls on various devices 2015-09-28 23:20:27 -07:00
Cameron Gutman 6015c38d17 Only display the native resolution dialog if the user has just chosen native resolution. Make the dialog a little nicer too. 2015-09-28 22:50:54 -07:00
Cameron Gutman 4ea8694a7d Fix status bar hiding while streaming on iPad 2015-09-28 21:49:46 -07:00
Cameron Gutman 00f01196fb Update placeholder app images to be the correct aspect ratio and invert the colors to better show against the new background 2015-09-28 21:40:10 -07:00
Diego Waxemberg 543639c93e Merge branch 'master' of github.com:moonlight-stream/moonlight-ios 2015-09-28 21:19:18 -07:00
Diego Waxemberg 1da877fed7 Changed theme to light/dark gray and updated launch screen. Also added a border and drop shadow to app icons 2015-09-28 21:18:35 -07:00
Cameron Gutman 396b5fc156 Update common 2015-09-28 19:22:28 -07:00
Cameron Gutman 297dfd4159 Update project file
- Change organization name
- Enable bit code
- Update Xcode compatibility version
2015-09-28 19:09:49 -07:00
Cameron Gutman 23e9d48b0d Update common-c and use the new LiInitializeXXX() functions 2015-08-16 12:27:21 -07:00
Cameron Gutman 9ec650a84f Zero audio renderer callbacks before populating 2015-08-12 01:18:22 -07:00
Cameron Gutman 90bdbc4ae0 Update common library 2015-08-12 01:11:38 -07:00
Cameron Gutman dd5f06723b Update common library to get assertions and a GFE 2.5.11 fix 2015-07-20 17:37:13 -07:00
Michelle Bergeron 55b2871b83 Update about beta program 2015-07-16 16:14:28 -07:00
Diego Waxemberg c8b13126d0 Adding build 0.9.2 2015-07-15 20:24:13 -07:00
Diego Waxemberg 96cfe0b70d bumping build number for new beta 2015-07-15 20:21:29 -07:00
Cameron Gutman 6dbb938368 Speed up app icon load time by 2 seconds by only waiting if it failed 2015-07-12 00:43:20 -07:00
Cameron Gutman 46fe7a8aed Don't show error messages if the PC isn't selected anymore 2015-07-12 00:30:44 -07:00
Cameron Gutman 3151ac6bf0 Remove hosts from discovery while they're handling operations the for UI. Sometimes these operations take a while and block the server from responding to our serverinfo queries that determine its online status. 2015-07-12 00:23:48 -07:00
Cameron Gutman dc5210f691 Propagate the running flag to the applist cache 2015-07-12 00:12:53 -07:00
Cameron Gutman 1f02265003 Fix a race condition that could cause an app to be populated with a null host 2015-07-11 23:59:09 -07:00
Cameron Gutman e4af9032e2 Implement a fast path to the app grid for online, paired machines with cached app lists. 2015-07-11 21:59:41 -07:00
Cameron Gutman e8650b2420 Don't use lightweight generics for Xcode 6 compatibility 2015-07-11 21:59:01 -07:00
Diego Waxemberg 9c6b718be2 fixed issue with apps duplicating in app list 2015-07-11 18:47:05 -07:00
Cameron Gutman 8f12114a56 Merge branch 'master' into persist-app-list 2015-07-11 01:38:30 -07:00
Cameron Gutman dc6ebffab1 Allow unpaired computer to be deleted. Remove the unpairing option since it hasn't worked for ages. 2015-07-11 01:29:28 -07:00
Cameron Gutman 13e894e9a3 Refactor app list to be non-static and sorted in alphabetical order 2015-07-11 01:28:52 -07:00
Cameron Gutman 4c95773131 Long clicking hosts that aren't paired doesn't bring up any useful options, so disable it 2015-07-11 00:13:58 -07:00
Cameron Gutman 38776a01e4 Only create an app if an app ID was found 2015-07-11 00:10:13 -07:00
Cameron Gutman b2563e534d Null terminate strings before passing them to BIO_puts 2015-07-10 22:33:09 -07:00
Diego Waxemberg 37f25c1f97 fixed some bugs with saving app list to database 2015-07-10 22:19:25 -07:00
Diego Waxemberg 642085ca32 App lists are now persisted in the database 2015-07-10 21:22:57 -07:00
Cameron Gutman 5dee29a21c Add a play indicator for running apps 2015-07-10 18:09:12 -07:00
Cameron Gutman b01d13976b Improve speed and reliability of host detection 2015-07-10 12:18:09 -07:00
Cameron Gutman ae1c83a011 Fix returning to the host selection screen after a failure 2015-07-10 11:52:27 -07:00
Cameron Gutman e5f962dc3f Perform stricter status checks during pairing to fix a crash when paired=3 2015-07-10 11:43:47 -07:00
Cameron Gutman 54dd79d2dd Remove OK button from pairing PIN dialog, since it dismisses automatically 2015-07-10 11:37:32 -07:00
Cameron Gutman 935fb6ffe3 Fix streaming over the external IP address when discovered via mDNS 2015-07-10 00:28:51 -07:00
Cameron Gutman 48d1c1a080 Commit host removals immediately so they remain if the app is unexpectedly terminated 2015-07-09 23:52:05 -07:00
Cameron Gutman 2d02ce2a1b Change the PC status to offline and return to the host selection screen if server info or applist is unavailable 2015-07-09 23:48:18 -07:00
Cameron Gutman 29fda59a72 Add applist and server info fetching error dialogs. Open the options menu when a user taps an offline PC. 2015-07-09 21:15:52 -07:00
Cameron Gutman 05f0dfd4f5 Replace dispatch_sync with dispatch_async in pairing 2015-07-09 21:02:19 -07:00
Cameron Gutman 0bdc5a83f1 Go directly to the app list after pairing like Android 2015-07-09 20:39:15 -07:00
Cameron Gutman 8688bf1210 Add failure handling for quitting apps 2015-07-09 20:33:23 -07:00
Cameron Gutman bf0858d57e Fix spelling mistake 2015-07-09 20:32:03 -07:00
Cameron Gutman 8d4d391310 For real this time - Update common to pickup Xcode 7 changes 2015-07-08 23:49:34 -07:00
Cameron Gutman 8fb15336c4 Update common to pickup Xcode 7 changes 2015-07-08 23:45:20 -07:00
Cameron Gutman 883385c42b Merge branch 'xcode-7.0' 2015-07-08 23:43:03 -07:00
Cameron Gutman 6d1139796e Cherry pick e58eb5f - Removing LimelightTests target 2015-07-08 23:25:37 -07:00
Cameron Gutman e58eb5f56a Remove LimelightTests target since it's old and unused 2015-07-08 23:21:05 -07:00
Cameron Gutman 2b0ce49646 Merge branch 'master' into xcode-7.0
Conflicts:
	limelight-common-c
2015-07-08 23:13:55 -07:00
Cameron Gutman 73364127d2 Fix pairing with GFE 2.4.5.57+ 2015-07-08 23:03:23 -07:00
Cameron Gutman 84a986bc88 Switch from deprecated NSURLConnection to NSURLSession 2015-07-08 22:35:25 -07:00
Cameron Gutman f13051aa31 Prepare for HTTP requests 2015-07-08 21:31:47 -07:00
Cameron Gutman 6bb559303b Remove executeRequest from HttpManager. It has some show-stopping bugs, like leaking semaphore counts (since it never waited) and being generally thread-unsafe. Implementing it in a way that would be asynchronous and thread-safe is a non-trivial task, so I've opted to remove it and change callers to use executeRequestSynchronously. 2015-07-08 21:26:01 -07:00
Cameron Gutman b7324f9a44 Remove a parameter from LiStartConnection 2015-07-08 19:17:58 -07:00
Cameron Gutman c0b2bbe552 Remove a parameter from LiStartConnection 2015-07-08 19:16:48 -07:00
Cameron Gutman 8c36cf40fd Update common for a leak fix and other minor bugs 2015-07-08 19:16:17 -07:00
Diego Waxemberg 717296269f updating common to xcode 7.0 settings 2015-07-04 11:23:31 -07:00
Diego Waxemberg 4be29abede updated project settings for xcode 7.0 2015-07-04 11:13:05 -07:00
Cameron Gutman 528af9684e Update common-c to fix scrolling issues 2015-06-25 21:54:39 -07:00
Cameron Gutman ff7a4ef190 Update common with better error messages 2015-06-25 00:11:09 -07:00
Cameron Gutman 99a2dbb956 Switch from deprecated UIAlertView to UIAlertController for pairing 2015-06-23 22:23:12 -07:00
Cameron Gutman 280341791a Use non-deprecated NSManagedObjectContext initializer 2015-06-23 22:09:08 -07:00
Cameron Gutman 1759565920 Removed supportedInterfaceOrientations since it didn't do anything and caused a warning on iOS 9 because the prototype seems to have changed 2015-06-23 22:01:59 -07:00
Cameron Gutman f57fa678f6 Escaping the URL strings is not required because no reserved characters are ever sent. Plus it's deprecated in iOS 9. 2015-06-23 21:58:32 -07:00
Cameron Gutman f8b5b16109 Create alert dialogs on the main thread 2015-06-23 21:46:58 -07:00
Cameron Gutman 005a678089 Disable App Transport Security since we need to make requests over HTTP and HTTPS to servers with self-signed certificates 2015-06-20 13:11:49 -07:00
Cameron Gutman 315dd53dcb Disable bitcode until native libraries are rebuilt for it 2015-06-20 13:06:02 -07:00
Cameron Gutman bb24495b3f Warning fix (char* -> const char*) 2015-06-19 20:53:14 -07:00
Cameron Gutman b9f2764990 Update common 2015-06-17 23:48:58 -07:00
Cameron Gutman a9a00629b1 Use API 1.1 common in preparation for IPv6 requirement 2015-06-17 23:32:00 -07:00
Diego Waxemberg 1223a9013f updated libopus and Opus build scrips 2015-06-01 22:25:56 -07:00
Diego Waxemberg ab019eef0f got rid of dumb compiler warnings 2015-06-01 00:36:21 -07:00
Diego Waxemberg 20f82ff739 updated project to Moonlight and created build 0.9.1 2015-05-31 23:57:47 -07:00
Diego Waxemberg 4d55a6a7e9 missed a file in earlier commit, this actually fixes the on screen control issues 2015-05-31 23:57:04 -07:00
Cameron Gutman d7ec41d56e Fix a controller batching bug 2015-06-01 01:30:18 -05:00
Diego Waxemberg a6a1929a43 updated icons to have different resolutions and fixed layout for smaller iPhones 2015-05-31 23:22:20 -07:00
Cameron Gutman 722850ceb6 Fix mouse batching bug 2015-05-29 16:42:00 -05:00
Diego Waxemberg 5a976764c3 now use custom edge swipe detection 2015-05-29 00:46:43 -07:00
Diego Waxemberg f90becb2f6 no longer try to parse responses when a network error occurs 2015-05-29 00:15:48 -07:00
Diego Waxemberg 5296b2eb39 now stop app asset requests before attempting to start a stream 2015-05-28 23:47:30 -07:00
Diego Waxemberg 987a30e15f updated style for moonlight 2015-05-28 23:39:13 -07:00
Diego Waxemberg 0880c3639c Merge branch 'master' of github.com:limelight-stream/limelight-ios 2015-05-28 23:38:09 -07:00
Diego Waxemberg 2972d40d92 added limit to app asset request 2015-05-28 23:37:55 -07:00
Cameron Gutman c4430ef18d Use the new optimizations added to common-c 2015-05-28 15:17:37 -05:00
Cameron Gutman 6b97af13bf Update common-c and remove unused callbacks 2015-05-13 23:13:20 -05:00
Cameron Gutman cd18ca64bb Fix build of tests and a warning in the main app 2015-05-13 23:07:05 -05:00
Diego Waxemberg d3c6302681 bumping common 2015-05-12 21:54:00 -04:00
Diego Waxemberg 58bd3cc706 Merge branch 'master' of github.com:limelight-stream/limelight-ios 2015-05-12 21:49:31 -04:00
Diego Waxemberg 8d3401f962 Changed name from Limelight to Moonlight due to C&D from Limelight
Networks, Inc.
2015-05-12 21:48:30 -04:00
Cameron Gutman dfc86015bd Renaming projects to Moonlight 2015-04-21 21:43:57 -04:00
Diego Waxemberg 772ee3a680 v0.9.0 first release candidate 2015-04-05 22:02:45 -07:00
Cameron Gutman f217ca9bbe Set the bitrate slider value based on the real interval instead of 1000 2015-04-06 00:48:54 -04:00
Cameron Gutman fab8d604d2 Check UUID length is non-zero before adding a new host 2015-04-06 00:27:36 -04:00
Cameron Gutman 7767ae497b Revert "Added a hack to de-duplicate hosts and some more checks when adding a host to minimize the chances for dupes"
This reverts commit fd9ee45dac.
2015-04-06 00:22:51 -04:00
Cameron Gutman 58e41dfcf1 Revert "forgot to add project file"
This reverts commit dfa07bf94b.
2015-04-06 00:22:45 -04:00
Diego Waxemberg 796ab2bf90 should now save hosts discovered through mdns 2015-04-05 21:18:22 -07:00
Diego Waxemberg dfa07bf94b forgot to add project file 2015-04-05 20:30:44 -07:00
Diego Waxemberg f43c74d59b trim whitespace from server info responses 2015-04-05 20:30:13 -07:00
Diego Waxemberg fd9ee45dac Added a hack to de-duplicate hosts and some more checks when adding a host to minimize the chances for dupes 2015-04-05 20:08:21 -07:00
Diego Waxemberg 40a04eb08b v0.4.1 2015-04-05 19:05:08 -07:00
Diego Waxemberg e9cff8f7b7 Merge branch 'master' of github.com:limelight-stream/limelight-ios 2015-04-05 19:00:01 -07:00
Cameron Gutman acee0af9df Update common to fix #58 2015-04-05 21:59:31 -04:00
Diego Waxemberg 8d3e81ed25 L3/R3 now show up on simple on-screen controls 2015-04-05 18:59:11 -07:00
Diego Waxemberg 5f8b0672f7 v0.4.0 build 2 2015-04-05 17:36:30 -07:00
Diego Waxemberg 62bbec3c5d now hide the loading spinner on network errors 2015-04-05 17:25:05 -07:00
Diego Waxemberg 65f7e75736 now show loading frame when waiting for background tasks 2015-02-24 22:33:14 -05:00
Diego Waxemberg 3617ea98e2 created a loading frame 2015-02-24 22:13:33 -05:00
Diego Waxemberg 81c84597c8 added ability to tag logs for easier filtering 2015-02-24 00:03:21 -05:00
Diego Waxemberg ea231e16b6 changed log level for connection errors 2015-02-24 00:03:02 -05:00
Diego Waxemberg c205b99080 changed bitrate to 0.5mbps interval 2015-02-24 00:02:37 -05:00
Diego Waxemberg e3dd4e7238 Created logger with log levels 2015-02-10 21:26:55 -05:00
Diego Waxemberg 0c36754ebe Now stop retrieving assets when the user deselects the host 2015-02-10 18:40:22 -05:00
Diego Waxemberg e7dc22bb15 Host discovery is much better now 2015-02-10 17:40:49 -05:00
Cameron Gutman d4b5ec5764 Only retry 5 times to fetch box art 2015-02-10 16:13:06 -05:00
Diego Waxemberg bed8c729f9 Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Michelle Bergeron
# Via Michelle Bergeron
* 'master' of github.com:limelight-stream/limelight-ios:
  Update README.md
2015-02-10 15:49:57 -05:00
Diego Waxemberg 0a767767fb Fixed crash if the applist did not contain certain info about the app 2015-02-10 15:48:29 -05:00
Diego Waxemberg e31df3f44e Fixed unregistering controllers and emulating extra buttons 2015-02-10 15:48:01 -05:00
Michelle Bergeron 9c9795ab1f Update README.md 2015-02-08 19:40:31 -08:00
Diego Waxemberg c7c28a18c5 hooked up multiple controller support 2015-02-02 03:22:09 -05:00
Diego Waxemberg 93119f25a6 added support for multiple controllers 2015-02-02 02:42:38 -05:00
Diego Waxemberg 1313429f65 Fix static analysis warning 2015-02-01 21:09:21 -05:00
Cameron Gutman 11c27baaf8 Finish GFE 2.1.x compatibility 2015-02-01 20:31:57 -05:00
Cameron Gutman d728e63bb4 Merge branch 'master' of github.com:limelight-stream/limelight-ios 2015-02-01 20:21:59 -05:00
Cameron Gutman 7d584fb4de Update for backwards compatibility with GFE 2.1.x (WIP) 2015-02-01 20:21:54 -05:00
Diego Waxemberg 7d7adb0753 now pass stream configuration through the segue 2015-02-01 19:46:28 -05:00
Diego Waxemberg 337e5e3d9d fixed host online state and simplified some code 2015-02-01 18:33:36 -05:00
Diego Waxemberg 879f304a79 Refactored http communications to be more abstract and OOP 2015-02-01 04:26:47 -05:00
Diego Waxemberg 75d3f23f0a forgot to commit the project 2015-01-31 20:22:23 -05:00
Diego Waxemberg 14f30349a3 improved app asset management and retrying to acquire 2015-01-31 20:10:14 -05:00
Diego Waxemberg 8e721a9c6a Fixed pairing bug 2015-01-31 16:13:25 -05:00
Diego Waxemberg e3e95c29f6 Created http response class and added error checking 2015-01-31 01:57:23 -05:00
Diego Waxemberg 4224d02eae created build 0.3.2 2015-01-23 18:20:53 -05:00
Cameron Gutman f300119d23 Update common for GFE 2.2.2+ 2015-01-22 16:55:49 -05:00
Diego Waxemberg ed1dc4c0ff created build 0.3.1 2015-01-20 19:48:08 -05:00
Diego Waxemberg 4b4aec0006 changed dialog to UIAlertController since UIAlertView is deprecated in iOS 8 2015-01-10 11:55:12 -05:00
Diego Waxemberg c44e03c945 now save the resolution setting when the user selects "Native" 2015-01-10 11:44:22 -05:00
Cameron Gutman 179110508c Scale mouse input deltas based on the ratio of the stream resolution to the screen size and the screen scale 2015-01-10 00:37:34 -05:00
Cameron Gutman 514d5d13a0 Fix bug where L3/R3 touch was passed through to become a mouse click 2015-01-09 23:43:11 -05:00
Cameron Gutman 3190c61a0a Add support for select+start to open Steam overlay 2015-01-09 23:31:16 -05:00
Cameron Gutman 1b629bc55d Merge branch 'master' of github.com:limelight-stream/limelight-ios 2015-01-09 23:22:16 -05:00
Cameron Gutman ae6ff4b442 Tweak the special button combos so they work more consistently 2015-01-09 23:22:05 -05:00
Diego Waxemberg 25d815dcd7 added l3/r3 support to simple on-screen controls 2015-01-09 23:21:46 -05:00
Cameron Gutman 3e85f13e08 Fix crash on bad server response 2015-01-09 23:21:42 -05:00
Diego Waxemberg 01902536ab added L3/R3 support to full on-screen controls 2015-01-09 22:10:32 -05:00
Diego Waxemberg 0a4fa5fc6c changed default value of on-screen controls to auto in the database 2015-01-09 20:29:34 -05:00
Diego Waxemberg 106ba15245 add host is now on the parallel with the other hosts 2015-01-09 20:13:15 -05:00
Cameron Gutman a535f908c7 Update common 2015-01-09 19:23:41 -05:00
Cameron Gutman de4ed222cd Replace the old sublayer rather than adding the new one on top of the onscreen controls 2015-01-09 18:23:00 -05:00
Cameron Gutman d92edc19df Merge branch 'master' of github.com:limelight-stream/limelight-ios 2015-01-09 18:02:42 -05:00
Cameron Gutman f7fdd7cb45 Request an IDR frame and reset the decoder if the decoder breaks 2015-01-09 18:02:18 -05:00
Cameron Gutman c1a1dbe881 Use larger 1350 byte video packets like Android 2015-01-09 18:00:35 -05:00
Cameron Gutman c368012e84 Update common 2015-01-09 17:58:46 -05:00
Diego Waxemberg 650eca829b Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Cameron Gutman
# Via Cameron Gutman
* 'master' of github.com:limelight-stream/limelight-ios:
  Change app menu options to be clearer and more similar to Android
2015-01-09 17:54:27 -05:00
Diego Waxemberg 4aac38e514 moved some UI code to the main thread and added a log for when the user ends the stream 2015-01-09 17:54:21 -05:00
Cameron Gutman 5ef91f2fc0 Change app menu options to be clearer and more similar to Android 2015-01-09 17:25:18 -05:00
Cameron Gutman 3da1d5e511 Update common 2015-01-09 16:59:17 -05:00
Cameron Gutman 64c60976f7 Merge branch 'master' of github.com:limelight-stream/limelight-ios 2015-01-09 16:58:26 -05:00
Cameron Gutman 61401b3e7b Only dispatch_async on limelight-common's threads 2015-01-09 16:58:18 -05:00
Diego Waxemberg b7ccf57a2d replaced all printf with NSLog 2015-01-09 16:56:17 -05:00
Cameron Gutman 600560d9e3 Merge branch 'master' of github.com:limelight-stream/limelight-ios
Conflicts:
	Limelight/ViewControllers/StreamFrameViewController.m
2015-01-09 16:14:50 -05:00
Cameron Gutman cdaf98398c Rewrote a bunch of controller support. Added auto on-screen controls layouts (GCGamepad not finished). Added LB+Start and RB+Start shortcuts for select and special (same as Android). 2015-01-09 16:13:44 -05:00
Diego Waxemberg 6f9c16a548 added swipe detection to stop streaming 2015-01-09 15:22:12 -05:00
Diego Waxemberg 9e054973c8 Fixed a concurrent modification error in caching app images 2015-01-09 15:17:19 -05:00
Diego Waxemberg afb7e930ee simple on-screen controls now show buttons at the bottom 2015-01-09 14:11:42 -05:00
Cameron Gutman 684aaf8cb2 Display a less pessimistic dialog when the connection ends 2015-01-09 01:35:40 -05:00
Cameron Gutman 8fc81b9563 Fix bounds calculations of the computer 2015-01-09 01:12:59 -05:00
Cameron Gutman 903395b273 Display bitrate in Mbps instead of Kbps 2015-01-09 00:45:56 -05:00
Cameron Gutman 6977684045 Update to latest common-c 2015-01-09 00:34:55 -05:00
Cameron Gutman abb0d5b8ba Fix memory leak in failure path 2015-01-09 00:34:42 -05:00
Diego Waxemberg 60cba0399d now parse server info into host object all at once 2015-01-08 23:58:04 -05:00
Diego Waxemberg b7fcce08d6 potentially fixed an intermittent heap corruption 2015-01-08 23:44:31 -05:00
Diego Waxemberg ec39c27498 now cache app images and reuse them when connecting to the same host 2015-01-08 22:18:26 -05:00
Diego Waxemberg ccd8b3332e now request app image on multiple threads 2015-01-08 21:36:29 -05:00
Diego Waxemberg 7cf521272a fixed multitouch issue with on-screen controls 2015-01-08 21:04:19 -05:00
Diego Waxemberg f0abd599d1 Merge branch 'mzyy94-black-ui-v2'
* mzyy94-black-ui-v2:
  fixed app image looking stretched
  Fix font family on UISegmentedControl
  Fix a computer name invisibility bug
  Change segmented control style
  Set Roboto font family for text labels and buttons.
  Add Roboto font family
  show an app title when the image of the app isn't available
2015-01-08 20:48:42 -05:00
Diego Waxemberg a754b55753 fixed app image looking stretched 2015-01-08 20:46:04 -05:00
Diego Waxemberg fe131af464 Merge branch 'black-ui' of git://github.com/mzyy94/limelight-ios into mzyy94-black-ui-v2
* 'black-ui' of git://github.com/mzyy94/limelight-ios:
  Fix font family on UISegmentedControl
  Fix a computer name invisibility bug
  Change segmented control style
  Set Roboto font family for text labels and buttons.
  Add Roboto font family
  show an app title when the image of the app isn't available

Conflicts:
	Limelight/UIAppView.m
	Limelight/UIComputerView.m
	Limelight/ViewControllers/MainFrameViewController.m
2015-01-08 19:46:00 -05:00
Diego Waxemberg b89515089f fixed long clicking host on iPads and made applist appear immediately after the apps are known 2015-01-08 19:37:51 -05:00
Diego Waxemberg e9c449bbf4 fixed bug that made it impossible to click an app that had no image 2015-01-08 18:09:09 -05:00
Diego Waxemberg 55e9d2daeb removed some unnecessary logging 2015-01-08 18:04:02 -05:00
Diego Waxemberg 132a90a865 fixed possible concurrent modification bug 2015-01-08 17:04:16 -05:00
Diego Waxemberg fe64d70577 fixed MDNS discovered hosts getting stuck in infinite loop 2015-01-08 17:03:51 -05:00
Diego Waxemberg 94d399e275 updated readme 2015-01-08 11:27:35 -05:00
Diego Waxemberg 89ac394891 added license 2015-01-08 11:23:38 -05:00
Diego Waxemberg bb03148b85 fixed empty border on app icon and updated splash screen 2015-01-07 22:19:04 -05:00
Diego Waxemberg d162bdbbc2 updated the app icon to the new design 2015-01-07 21:11:12 -05:00
Diego Waxemberg ce3f046ae8 created build 0.3.0 2015-01-07 19:42:18 -05:00
Diego Waxemberg d4cd8d3bba No longer duplicate hosts when the same host is discovered by MDNS 2015-01-05 18:28:10 -05:00
Yuki MIZUNO 021283e6ef Fix font family on UISegmentedControl 2015-01-05 17:20:10 +09:00
Yuki MIZUNO 84a314adb4 Fix a computer name invisibility bug 2015-01-05 16:32:30 +09:00
Yuki MIZUNO fcd3af5bcc Change segmented control style 2015-01-05 16:16:33 +09:00
Yuki MIZUNO 514d79fde9 Set Roboto font family for text labels and buttons. 2015-01-05 15:26:19 +09:00
Yuki MIZUNO e325ee1c27 Add Roboto font family 2015-01-05 15:09:26 +09:00
Yuki MIZUNO aaeef1d6bb show an app title when the image of the app isn't available 2015-01-05 14:32:11 +09:00
Diego Waxemberg 57bf748877 The host views now auto refresh and removed unused method 2015-01-02 23:58:59 -05:00
Diego Waxemberg d134ff83d6 mDNS discovered hosts have the name set to the address until they are polled 2015-01-02 23:57:49 -05:00
Diego Waxemberg f0b145c01a Now stop discovery when pairing 2015-01-02 23:57:11 -05:00
Diego Waxemberg 5aeedb894a Moved discovery to a worker thread per host 2015-01-02 23:56:28 -05:00
Diego Waxemberg ee61dc9a59 implemented wake on lan 2015-01-02 19:15:47 -05:00
Diego Waxemberg a52b20ee52 hostList is now thread-safe 2015-01-01 23:54:54 -05:00
Diego Waxemberg f209670c1a now remove host from database when the user removes it 2015-01-01 23:40:52 -05:00
Diego Waxemberg 168eac17eb Now display "no host selected" in nav bar before selecting a host 2015-01-01 23:30:18 -05:00
Diego Waxemberg 417f1e02bc Added long press to remove/unpair host 2015-01-01 23:25:09 -05:00
Diego Waxemberg 3eee684961 set discovery interval to 2 seconds 2015-01-01 22:32:43 -05:00
Diego Waxemberg e8c8f4f8e9 Created new host discovery system
- now store host uuid and mac address
- use uuid to check for duplicate hosts
- try local and external IPs
- pair status is shown
- server status is shown
- validate host when manually adding
2015-01-01 22:30:03 -05:00
Diego Waxemberg 0e2765ad86 added quitting an app 2015-01-01 16:50:10 -05:00
Diego Waxemberg 40d6ab91cf removed unused method and fixed log 2014-12-31 22:42:19 -05:00
Diego Waxemberg c96a77f1aa removed comment and fixed color of settings item 2014-12-31 19:13:54 -05:00
Diego Waxemberg ece113787d touches to the on screen controls are no longer sent as mouse clicks/movement 2014-12-31 19:03:24 -05:00
Diego Waxemberg cb93486bb0 implemented dead zone for analog sticks 2014-12-31 19:03:24 -05:00
Diego Waxemberg 809a660506 Added settings for displaying varying levels of the onscreen controls 2014-12-31 19:03:24 -05:00
Diego Waxemberg 7b0a383ad0 added L1/L2, R1/R2, Start, and Select buttons to on-screen controls 2014-12-31 18:55:31 -05:00
Diego Waxemberg 2cb1acc611 Added analog sticks to onscreen controls 2014-12-31 18:55:31 -05:00
Diego Waxemberg d6d30f021d started implementing on-screen controls
- directional pad works
- a,b,x,y work
2014-12-31 18:55:31 -05:00
Diego Waxemberg 4a08288d0d A little bit of code cleanup 2014-12-31 18:55:30 -05:00
Diego Waxemberg 5c488cf4aa Changed "native" to "Native" and made segment size match the slider 2014-12-31 18:51:42 -05:00
Diego Waxemberg c7b6011806 Merge branch 'mzyy94-black-ui'
* mzyy94-black-ui:
  Add current host name button
  Fix a very small warning
  Update UI theme

Conflicts:
	iPhone.storyboard
2014-12-31 18:46:16 -05:00
Diego Waxemberg af4a833806 Merge branch 'black-ui' of git://github.com/mzyy94/limelight-ios into mzyy94-black-ui
* 'black-ui' of git://github.com/mzyy94/limelight-ios:
  Add current host name button
  Fix a very small warning
  Update UI theme

Conflicts:
	Limelight/ViewControllers/MainFrameViewController.m
2014-12-31 18:04:48 -05:00
Diego Waxemberg 87a6d2f656 Merge pull request #40 from betrisey/master
Native resolution support added. [ISSUE #12 FIXED]
2014-12-31 17:59:29 -05:00
Samuel Bétrisey 0ee9b87742 UIScreen.bounds.size doesn't give the real resolution
We need to multiply it by the UIScreen.scale
2014-12-27 03:21:32 +01:00
Samuel Bétrisey 5968d511b2 Native resolution support added. 2014-12-27 02:42:14 +01:00
Diego Waxemberg 20561ae64f created 0.2.2 build 2 2014-12-25 23:37:35 -05:00
Diego Waxemberg 600e71223c created build 0.2.2 2014-12-25 11:44:24 -05:00
Yuki MIZUNO d5c12a3eb6 Add current host name button
Add re-select host button and show current host name.
2014-12-04 19:54:21 +09:00
Yuki MIZUNO 35dc4a7de3 Fix a very small warning
Change NavigationBarButtonItem style.
2014-12-04 19:04:11 +09:00
Yuki MIZUNO 582dda5727 Update UI theme
* new dark UI
* new app lists
2014-12-04 18:41:01 +09:00
Diego Waxemberg c05949c43b ensured spinner does not appear on top of label 2014-11-27 16:23:06 -05:00
Diego Waxemberg e913d26ca6 no longer allow duplicate hosts 2014-11-27 13:56:39 -05:00
Diego Waxemberg 427e8f67fc Now close the settings pane when starting a stream 2014-11-27 11:36:28 -05:00
Diego Waxemberg 79e51defe1 fixed spinner alignment issue 2014-11-27 00:02:18 -05:00
Diego Waxemberg 5f800b7901 Added scrolling and right click 2014-11-26 23:51:43 -05:00
Diego Waxemberg c3b44a32d5 Created new build 2014-11-26 22:44:10 -05:00
Diego Waxemberg 539e120167 Fixed issue with parsing XML 2014-11-26 22:35:34 -05:00
Diego Waxemberg a924d63750 updated icons 2014-11-26 18:07:05 -05:00
Diego Waxemberg 1affb03b89 Merge branch 'new-ui'
* new-ui:
  finished new ui
  Update common submodule
  Cherry Pick "Update to the new common library"
  Cherry Pick "Fix iOS build with new common"
  added settings menu and persistent storage for settings
  new ui is almost fully functional - add hosts - pair to host - get app list - launch app - resume app
  new ui un-stashed
2014-11-26 18:02:11 -05:00
Diego Waxemberg dae484445b finished new ui 2014-11-26 17:57:16 -05:00
Diego Waxemberg 99d3ac45c3 Merge branch 'new-ui' of github.com:limelight-stream/limelight-ios into new-ui
# By Cameron Gutman
# Via Cameron Gutman
* 'new-ui' of github.com:limelight-stream/limelight-ios:
  Update common submodule
  Cherry Pick "Update to the new common library"
  Cherry Pick "Fix iOS build with new common"
2014-11-26 13:15:00 -05:00
Diego Waxemberg 33d6306359 Created beta 9 2014-11-25 18:35:12 -05:00
Diego Waxemberg 5ee9e285e7 created beta 8 2014-11-18 10:28:12 -05:00
Cameron Gutman 1be97e1c8a Update common submodule 2014-11-11 19:07:02 -08:00
Cameron Gutman 8d360d2266 Cherry Pick "Update to the new common library" 2014-11-11 19:06:01 -08:00
Cameron Gutman 2a49f8901f Cherry Pick "Fix iOS build with new common" 2014-11-11 19:05:13 -08:00
Cameron Gutman d8020a367f Update to the new common library 2014-11-11 19:03:46 -08:00
Cameron Gutman 88c917c103 Fix iOS build with new common 2014-10-31 21:43:13 -07:00
Diego Waxemberg 77b6d304f7 added settings menu and persistent storage for settings 2014-10-29 00:47:51 -04:00
Diego Waxemberg 6273f2bb29 Pulled common and created new build 2014-10-27 19:53:50 -04:00
Diego Waxemberg 412c5c2516 new ui is almost fully functional
- add hosts
- pair to host
- get app list
- launch app
- resume app
2014-10-26 02:15:53 -04:00
Diego Waxemberg 6fbc55f193 new ui un-stashed 2014-10-24 16:02:10 -04:00
Diego Waxemberg fac48ecf42 Created new build and removed beta builds 2014-10-24 15:56:04 -04:00
Cameron Gutman b5bf26bb2d Add busy warning to pairing 2014-10-23 23:46:41 -04:00
Cameron Gutman 00fab87b4c Merge branch 'master' of github.com:limelight-stream/limelight-ios 2014-10-23 23:41:25 -04:00
Cameron Gutman 3554b40962 Display status messages for failed app launch 2014-10-23 23:41:07 -04:00
Diego Waxemberg aa3752a905 Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Cameron Gutman
# Via Cameron Gutman
* 'master' of github.com:limelight-stream/limelight-ios:
  Add better messages to pairing
  Fix missing video issue
2014-10-23 23:17:18 -04:00
Diego Waxemberg c0a3ae9371 updated build and fixed an issue with the analyzer 2014-10-23 23:16:24 -04:00
Cameron Gutman 47850cd658 Add better messages to pairing 2014-10-23 23:11:24 -04:00
Cameron Gutman 1b98870b41 Fix missing video issue 2014-10-23 22:35:59 -04:00
Cameron Gutman ef98976ebf Update common rev 2014-10-23 14:59:24 -04:00
Cameron Gutman ba022da665 Don't attempt to start or resume a game if the device isn't paired 2014-10-23 14:53:31 -04:00
Cameron Gutman ae9abf2911 Add shared workspace data to version control 2014-10-23 13:28:52 -04:00
Cameron Gutman 99e7f59df4 Ignore all xcuserdata directories 2014-10-23 13:27:49 -04:00
Michelle Bergeron 8273173080 Update README.md 2014-10-23 01:29:33 -04:00
Cameron Gutman 3357b3882b Use different bitrates for each stream configuration 2014-10-22 00:04:58 -04:00
Cameron Gutman b7510717c8 Merge branch 'master' of github.com:limelight-stream/limelight-ios 2014-10-21 17:27:08 -04:00
Cameron Gutman 5434542877 Retry service resolution 2014-10-21 17:26:50 -04:00
Diego Waxemberg 4c2f6b269a added spinner and message during stream init 2014-10-21 17:18:30 -04:00
Cameron Gutman 0ccf046c69 Fix inverted if 2014-10-21 16:23:03 -04:00
Diego Waxemberg f0b6602b99 Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Cameron Gutman
# Via Cameron Gutman
* 'master' of github.com:limelight-stream/limelight-ios:
  Add timeouts to HTTP requests
  Change StreamView's background to black
  Display a failure dialog when we fail to launch an app
2014-10-21 16:18:00 -04:00
Diego Waxemberg 72e0da4319 removed my code signing ids 2014-10-21 16:17:36 -04:00
Cameron Gutman d2ad8b12ce Add timeouts to HTTP requests 2014-10-21 16:16:24 -04:00
Cameron Gutman 6ef492662b Change StreamView's background to black 2014-10-21 16:15:59 -04:00
Cameron Gutman 3c7f33a80c Merge branch 'master' of github.com:limelight-stream/limelight-ios 2014-10-21 16:05:59 -04:00
Diego Waxemberg eeec1f1cf5 prepped common for deployment 2014-10-21 16:03:11 -04:00
Cameron Gutman 45545e8f9b Merge branch 'master' of github.com:limelight-stream/limelight-ios 2014-10-21 15:54:47 -04:00
Cameron Gutman 85b65d7112 Display a failure dialog when we fail to launch an app 2014-10-21 15:54:19 -04:00
Diego Waxemberg 26f7a27117 Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Cameron Gutman
# Via Cameron Gutman
* 'master' of github.com:limelight-stream/limelight-ios:
  Enhance the connection callback protocol to include other connection listener callbacks exposed by common. Start handling some HTTP request errors.
  Display a dialog if DNS resolution fails
  Update common
  Fix crash on app termination
  Don't crash if no PC is selected when a button is pressed
  Add a placeholder in the computer list if none are found. Retry service discovery if it fails.

Conflicts:
	limelight-common-c
2014-10-21 15:13:07 -04:00
Diego Waxemberg ea78cbc47e Prepped project for deployment and created a test build 2014-10-21 15:11:18 -04:00
Cameron Gutman ea24b39fbe Enhance the connection callback protocol to include other connection listener callbacks exposed by common. Start handling some HTTP request errors. 2014-10-21 14:54:10 -04:00
Cameron Gutman 01a2853032 Display a dialog if DNS resolution fails 2014-10-21 14:31:03 -04:00
Cameron Gutman bfca061694 Update common 2014-10-21 14:18:41 -04:00
Cameron Gutman 4a9bb00e0d Fix crash on app termination 2014-10-21 14:04:01 -04:00
Cameron Gutman 72271a0c74 Don't crash if no PC is selected when a button is pressed 2014-10-21 13:46:05 -04:00
Cameron Gutman 1ca787822b Add a placeholder in the computer list if none are found. Retry service discovery if it fails. 2014-10-21 13:39:14 -04:00
Cameron Gutman 39186a4edf Properly start and stop mDNS manager 2014-10-21 05:11:51 -04:00
Cameron Gutman 528b44f2f2 Stop using NSLog in internal functions because it seems to acquire a mutex that violates our locking order and causes deadlocks 2014-10-21 05:11:12 -04:00
Cameron Gutman dfe2addca2 Fix copy-pasta in 1080p30 setting 2014-10-21 04:35:06 -04:00
Cameron Gutman 44bbba805f Merge branch 'master' of github.com:limelight-stream/limelight-ios 2014-10-21 04:19:13 -04:00
Cameron Gutman f756451001 Add stop function to MDNSManager 2014-10-21 04:18:50 -04:00
Cameron Gutman b2236b5dad Fix audio corruption after 2nd run by properly cleaning up audio state 2014-10-21 04:18:20 -04:00
Diego Waxemberg 8dd62a8645 Fixed launch screen text color and image location, changed version to 0.1 2014-10-21 04:13:47 -04:00
Diego Waxemberg 29f676a6d1 refactored project directories 2014-10-21 03:50:18 -04:00
Cameron Gutman d83ac48a73 Merge branch 'master' of github.com:limelight-stream/limelight-ios
Conflicts:
	Limelight.xcodeproj/project.pbxproj
2014-10-21 03:20:25 -04:00
Cameron Gutman bf6a2e571f Remove extra files from the Xcode project 2014-10-21 03:16:07 -04:00
Diego Waxemberg 1f19d4de9d recompiled opus for 64bit and added build scripts 2014-10-21 03:15:29 -04:00
Cameron Gutman f4f3d7df50 Update common 2014-10-21 03:06:13 -04:00
Cameron Gutman a3f7aa41a1 Free the decode unit list when terminating the connection. Remove some debug prints. 2014-10-21 02:00:58 -04:00
Cameron Gutman 101096ad80 Merge branch 'master' of github.com:limelight-stream/limelight-ios 2014-10-21 01:54:37 -04:00
Cameron Gutman 34d871403c Properly stop the stream when exiting or switching apps 2014-10-21 01:54:31 -04:00
Diego Waxemberg 05e969221a Added app icon and launch screen 2014-10-21 01:53:59 -04:00
Cameron Gutman c36fb14b15 Select 720p60 by default 2014-10-21 01:51:15 -04:00
Diego Waxemberg c5dc7001f8 fixed size of text box 2014-10-21 01:09:04 -04:00
Diego Waxemberg cd709000d7 Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Cameron Gutman
# Via Cameron Gutman
* 'master' of github.com:limelight-stream/limelight-ios:
  Fix a compilation warning
  Fix a nasty bug that LLVM static analysis caught
  Fix some mostly harmless warnings from LLVM static analysis
2014-10-21 01:02:08 -04:00
Diego Waxemberg a359aee36c now goes back to main frame when connection is terminated 2014-10-21 01:02:04 -04:00
Cameron Gutman 185a4334ca Fix a compilation warning 2014-10-21 00:40:33 -04:00
Cameron Gutman 6b10497e3e Fix a nasty bug that LLVM static analysis caught 2014-10-21 00:37:09 -04:00
Cameron Gutman 97f968fb0d Fix some mostly harmless warnings from LLVM static analysis 2014-10-21 00:36:30 -04:00
Cameron Gutman 127c53e341 Update common-c 2014-10-20 23:29:23 -04:00
Cameron Gutman 3178f87707 Add support for the pause button 2014-10-20 22:08:40 -04:00
Diego Waxemberg 9e8903402b now hide keyboard when enter is pressed 2014-10-20 21:45:37 -04:00
Diego Waxemberg af43539015 fix orientation issues 2014-10-20 21:39:40 -04:00
Diego Waxemberg ca2fe9b0a3 Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Cameron Gutman
# Via Cameron Gutman
* 'master' of github.com:limelight-stream/limelight-ios:
  Add support for game controllers
2014-10-20 21:26:24 -04:00
Diego Waxemberg 84316166eb implemented resuming session 2014-10-20 21:26:08 -04:00
Cameron Gutman 613f82b0ac Merge branch 'master' of github.com:limelight-stream/limelight-ios
Conflicts:
	Limelight/StreamFrameViewController.m
2014-10-20 21:15:07 -04:00
Cameron Gutman f2ae32c45c Add support for game controllers 2014-10-20 21:13:13 -04:00
Diego Waxemberg 4c646e36c7 added support for different resolutions and frame rates 2014-10-20 20:54:03 -04:00
Diego Waxemberg 85ee4f6518 added support for custom host 2014-10-20 20:08:12 -04:00
Diego Waxemberg 37428c8c77 fixed a lot of jank. created a utils file and removed unused files 2014-10-20 19:20:50 -04:00
Diego Waxemberg 283a386b9c Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Cameron Gutman
# Via Cameron Gutman
* 'master' of github.com:limelight-stream/limelight-ios:
  Change video background to black
  Don't try to be clever and stall the audio thread while we await samples. Start audio output earlier to allow it some extra warmup time.
  Revert "Use a semaphore to prevent us from having to busy wait on the audio buffer queue"
  Fix the memory leak in the video decoder
2014-10-20 13:35:46 -04:00
Diego Waxemberg 4d7715565a starting steam and paring work 2014-10-20 13:35:42 -04:00
Cameron Gutman 5ffdc1d2bd Change video background to black 2014-10-20 13:18:53 -04:00
Cameron Gutman 35e2ca1e00 Don't try to be clever and stall the audio thread while we await samples. Start audio output earlier to allow it some extra warmup time. 2014-10-20 13:18:23 -04:00
Cameron Gutman b1938610dd Revert "Use a semaphore to prevent us from having to busy wait on the audio buffer queue"
This reverts commit f3b3d2bd08.
2014-10-20 12:56:37 -04:00
Cameron Gutman f14a2a66dd Fix the memory leak in the video decoder 2014-10-20 12:55:23 -04:00
Diego Waxemberg 44a7494823 joining stream works 2014-10-20 11:31:40 -04:00
Cameron Gutman f909371a90 Append the NAL data by reference instead of copying into a new buffer 2014-10-20 04:48:48 -04:00
Cameron Gutman f3b3d2bd08 Use a semaphore to prevent us from having to busy wait on the audio buffer queue 2014-10-20 04:38:36 -04:00
Cameron Gutman e56923a71d Fix audio lag if the audio player takes a while to start 2014-10-20 03:34:15 -04:00
Cameron Gutman f133f293b8 Fix inverted mouse movement 2014-10-20 03:29:00 -04:00
Diego Waxemberg 42773241c1 Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Cameron Gutman
# Via Cameron Gutman
* 'master' of github.com:limelight-stream/limelight-ios:
  Improve touch input support
  Add some WIP touch input support
  Implement working audio support
  Video fully works now
2014-10-20 02:59:50 -04:00
Diego Waxemberg b8d256b73d pairing works! 2014-10-20 02:59:16 -04:00
Cameron Gutman 0cb4c31d1e Improve touch input support 2014-10-20 02:49:38 -04:00
Cameron Gutman 02fbd5f1d2 Add some WIP touch input support 2014-10-20 02:38:01 -04:00
Cameron Gutman 70f3a91dfb Implement working audio support 2014-10-19 19:33:48 -04:00
Cameron Gutman 93063f5606 Video fully works now 2014-10-19 05:27:21 -04:00
Diego Waxemberg 13f39e30f6 Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Cameron Gutman
# Via Cameron Gutman
* 'master' of github.com:limelight-stream/limelight-ios:
  Video is mostly working now. It's just chopped off in the view now.
  Add connection listener callbacks to fix crash on starting streaming
  Implement code for new video decoder (untested) based on http://stackoverflow.com/questions/25980070/how-to-use-avsamplebufferdisplaylayer-in-ios-8-for-rtp-h264-streams-with-gstream
  Target 8.0 so we can use Metal for decoding
  Rip out the old video renderer and decoder
2014-10-19 04:20:21 -04:00
Diego Waxemberg 8ae0e4a547 initial pairing works 2014-10-19 04:19:54 -04:00
Cameron Gutman 3a6472eb0b Video is mostly working now. It's just chopped off in the view now. 2014-10-19 02:07:13 -04:00
Cameron Gutman 037df87585 Add connection listener callbacks to fix crash on starting streaming 2014-10-19 00:24:47 -04:00
Cameron Gutman 9b6865a53b Implement code for new video decoder (untested) based on http://stackoverflow.com/questions/25980070/how-to-use-avsamplebufferdisplaylayer-in-ios-8-for-rtp-h264-streams-with-gstream 2014-10-19 00:09:47 -04:00
Cameron Gutman 4c3bc16593 Target 8.0 so we can use Metal for decoding 2014-10-18 22:45:54 -04:00
Cameron Gutman 440631fe2f Merge branch 'master' of github.com:limelight-stream/limelight-ios 2014-10-18 22:44:02 -04:00
Cameron Gutman 374caee973 Rip out the old video renderer and decoder 2014-10-18 22:43:52 -04:00
Diego Waxemberg 6225af1e76 more pairing code 2014-10-18 22:26:25 -04:00
Cameron Gutman 2062c4c3e9 Update common rev 2014-10-18 22:04:34 -04:00
Cameron Gutman fbc3d1aa73 Build Limelight-common-c as part of Limelight-iOS build instead of a standalone lib 2014-10-18 22:04:02 -04:00
Cameron Gutman ec6166c232 Add limelight-common-c as a submodule of limelight-ios 2014-10-18 21:53:51 -04:00
Diego Waxemberg ee21c612d5 Merge branch 'master' of github.com:limelight-stream/limelight-ios
* 'master' of github.com:limelight-stream/limelight-ios:
  Look for libxml2 includes in a tree from the SDK root instead of the drive root
2014-10-18 21:14:54 -04:00
Diego Waxemberg 9226a05ad8 implemented crypto and started pairing 2014-10-18 21:13:48 -04:00
Cameron Gutman 31d57de339 Look for libxml2 includes in a tree from the SDK root instead of the drive root 2014-10-18 05:04:37 -04:00
Diego Waxemberg bd91d74de8 implemented cert and keypair gen 2014-10-16 21:20:27 -04:00
Diego Waxemberg fba676c405 added openss 2014-10-16 21:19:36 -04:00
Diego Waxemberg 1b6a558a7c readded ffmpeg 2014-10-14 21:33:01 -04:00
Diego Waxemberg 92d32922ef updated script for xcode 6 2014-10-14 21:30:07 -04:00
Diego Waxemberg 00072a55f9 i have no idea what is going on 2014-10-14 19:28:02 -04:00
Diego Waxemberg fec330b76e Merge branch 'mdns'
* mdns:
  implemented mdns host discovery

Conflicts:
	MainFrame-iPad.storyboard
	MainFrame-iPhone.storyboard
2014-10-14 19:26:37 -04:00
Diego Waxemberg 8b0514d73d ..not sure 2014-10-14 19:24:32 -04:00
Diego Waxemberg f578ee4963 implemented mdns host discovery 2014-10-14 19:21:48 -04:00
Diego Waxemberg b828d5426b fixed some compiler warnings and updated common 2014-10-14 14:19:18 -04:00
Diego Waxemberg 80a4b493ab removed old stuff 2014-09-17 19:39:24 -04:00
Diego Waxemberg 6eed8cb962 Merge branch 'master' of github.com:limelight-stream/limelight-ios
* 'master' of github.com:limelight-stream/limelight-ios:
  Insist that Limelight iOS is still in development
  now send the device name when pairing. also fixed null-terminating buffers that caused all kinds of problems
  fixed a bunch of stuff: - pairing now exists - hostnames are resolved - video rendering is better - some other stuff I’m forgetting
  Update README.md
  Move nv_avc_init into setup
  Delay frame drawing for a 30 FPS target. Change rendering configuration for faster drawing. Perform the segue after the URL request returns.
  added code to launch a stream and decode and render the stream
  Create README.md
  added opus library
  view is now centered and rendering is flipped correctly
  fixed rendering
  added video rendering libraries and renderer code. still not functioning
  added icons
  added simple depacketizer and test h264 file
  added basic UI components and outlets/actions
  Initial Commit

Conflicts:
	README.md
2014-09-17 19:36:17 -04:00
Diego Waxemberg 8722d14048 added build script for ffmpeg 2014-09-17 19:31:13 -04:00
Diego Waxemberg 0987ef0fa8 fixed the ffmpeg build size 2014-09-17 19:30:52 -04:00
Diego Waxemberg 592e5dbe44 forgot the readme 2014-08-31 13:20:11 -04:00
Diego Waxemberg 764f051318 Complete refactor of project.
- now runs universally on iPhone, iPad, and simulator
- all paths should now be relative
2014-08-31 13:13:46 -04:00
Diego Waxemberg 457b6b13cc Initial Commit 2014-08-30 22:46:31 -04:00
Michelle Bergeron 55e0c3c7bf Insist that Limelight iOS is still in development 2014-08-02 21:46:05 -07:00
Diego Waxemberg 26492c5783 now send the device name when pairing. also fixed null-terminating buffers that caused all kinds of problems 2014-02-01 13:30:53 -05:00
Diego Waxemberg 4c6a3b2e43 Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Andrew Hennessy
# Via Andrew Hennessy
* 'master' of github.com:limelight-stream/limelight-ios:
  Update README.md
2014-01-31 15:51:21 -05:00
Diego Waxemberg 45b9f5411e fixed a bunch of stuff:
- pairing now exists
- hostnames are resolved
- video rendering is better
- some other stuff I’m forgetting
2014-01-31 15:50:36 -05:00
Andrew Hennessy 1e76b550e8 Update README.md 2014-01-25 01:39:57 -05:00
Diego Waxemberg ef6909da88 Move nv_avc_init into setup 2014-01-20 23:49:06 -05:00
Cameron Gutman 01f11fc095 Delay frame drawing for a 30 FPS target. Change rendering configuration for faster drawing. Perform the segue after the URL request returns. 2014-01-20 23:48:06 -05:00
Diego Waxemberg 4b9e68950a Merge branch 'master' of github.com:limelight-stream/limelight-ios
# By Michelle
# Via Michelle
* 'master' of github.com:limelight-stream/limelight-ios:
  Create README.md
2014-01-19 20:14:09 -05:00
Diego Waxemberg e0cf044d60 added code to launch a stream and decode and render the stream 2014-01-19 20:13:38 -05:00
Michelle 9387211ce8 Create README.md 2014-01-19 05:35:14 -05:00
Diego Waxemberg 1ef314d3bd added opus library 2014-01-19 01:39:04 -05:00
Diego Waxemberg 72ed023645 view is now centered and rendering is flipped correctly 2014-01-18 21:39:29 -05:00
Diego Waxemberg f97fe7fce2 fixed rendering 2014-01-18 19:14:57 -05:00
Diego Waxemberg 029d3b0a97 added video rendering libraries and renderer code. still not functioning 2014-01-18 14:05:19 -05:00
Diego Waxemberg 87d8d117c1 added icons 2014-01-18 05:01:15 -05:00
Diego Waxemberg d7a703828a added simple depacketizer and test h264 file 2014-01-18 05:00:36 -05:00
Diego Waxemberg 8fdc5ad97b added basic UI components and outlets/actions 2014-01-18 00:56:46 -05:00
Diego Waxemberg 70510f8410 Initial Commit 2014-01-17 22:06:44 -05:00
779 changed files with 221165 additions and 2 deletions

No files matched your search

+21
View File
@@ -0,0 +1,21 @@
BasedOnStyle: Chromium
AlignAfterOpenBracket: true
AlignOperands: false
AllowAllParametersOfDeclarationOnNextLine: true
AlwaysBreakTemplateDeclarations: true
BinPackArguments: false
BinPackParameters: false
BreakBeforeTernaryOperators: true
ColumnLimit: 160
ContinuationIndentWidth: 4
DerivePointerAlignment: false
IndentWidth: 4
ObjCBlockIndentWidth: 4
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
PointerBindsToType: false
PointerAlignment: Right
SpacesInContainerLiterals: true
TabWidth: 4
UseTab: Never
+91
View File
@@ -0,0 +1,91 @@
name: Build VoidLink IPA
on:
push:
branches:
- Integration
workflow_dispatch:
jobs:
build:
name: Build .ipa and publish source
runs-on: macos
env:
# Per-app: change APP_NAME for each app repo. Used everywhere so the
# perlis dir name and file names always match (no hardcoded drift).
APP_NAME: VoidLink
# Point xcodebuild at full Xcode without sudo (sudo hangs in CI).
# DEVELOPER_DIR overrides the active developer directory for all steps.
DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Checkout submodules
run: git submodule update --init --recursive
- name: Select Xcode
run: xcodebuild -version
- name: Build unsigned .ipa
run: |
# Build the app (no signing — SideStore signs on-device).
# VoidLink's scheme is auto-generated from the VoidLink target.
# Release config → bundle id com.voidlink.tf.iOS (Debug uses
# com.voidlink.tf.debug10.iOS), so the .ipa matches the metadata.
xcodebuild \
-scheme VoidLink \
-sdk iphoneos \
-configuration Release \
archive \
-archivePath $PWD/build/VoidLink.xcarchive \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED="NO" \
CODE_SIGN_ENTITLEMENTS="" \
CODE_SIGNING_ALLOWED="NO"
# Package the .app bundle into an .ipa (Payload/App.app structure)
mkdir -p build/IPA/Payload
cp -R build/VoidLink.xcarchive/Products/Applications/VoidLink.app build/IPA/Payload/VoidLink.app
cd build/IPA
zip -r ../../$APP_NAME.ipa Payload
cd ../..
ls -la $APP_NAME.ipa
- name: Generate app metadata
run: |
# Read the version from the built app so it always matches the .ipa
# (no hardcoded drift). CFBundleShortVersionString = MARKETING_VERSION.
VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" \
build/VoidLink.xcarchive/Products/Applications/VoidLink.app/Info.plist)
SIZE=$(stat -f%z $APP_NAME.ipa)
DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Per-app metadata file. The perlis aggregator folds this into the
# root source.json at https://apps.bueso.eu/source.json.
cat > $APP_NAME.json <<EOF
{
"name": "VoidLink",
"bundleIdentifier": "com.voidlink.tf.iOS",
"developerName": "Luis",
"localizedDescription": "VoidLink (Moonlight fork) - stream from your PC. Built via Gitea Actions.",
"iconURL": "https://apps.bueso.eu/$APP_NAME/icon.png",
"downloadURL": "https://apps.bueso.eu/$APP_NAME/$APP_NAME.ipa",
"version": "$VERSION",
"versionDate": "$DATE",
"size": $SIZE,
"permissions": []
}
EOF
cat $APP_NAME.json
- name: Upload to source host (perlis)
run: |
# Upload .ipa + per-app metadata + icon to perlis via SSH.
# PERLIS_SSH_HOST is the Tailscale MagicDNS name (perlis.bueso.loc),
# reachable from the iMac runner over the Tailscale mesh.
ssh -o StrictHostKeyChecking=no \
"${{ secrets.PERLIS_SSH_USER }}@${{ secrets.PERLIS_SSH_HOST }}" \
"mkdir -p /mnt/appdata/ios-apps/$APP_NAME"
scp -o StrictHostKeyChecking=no \
$APP_NAME.ipa $APP_NAME.json icon.png \
"${{ secrets.PERLIS_SSH_USER }}@${{ secrets.PERLIS_SSH_HOST }}:/mnt/appdata/ios-apps/$APP_NAME/"
+48
View File
@@ -0,0 +1,48 @@
---
name: Bug report
about: Follow the troubleshooting guide before reporting a bug
---
**READ ME FIRST!**
If you're here because something basic is not working (like gamepad input, video, or similar), it's probably something specific to your setup, so make sure you've gone through the Troubleshooting Guide first: https://github.com/moonlight-stream/moonlight-docs/wiki/Troubleshooting
If you still have trouble with basic functionality after following the guide, join our Discord server where there are many other volunteers who can help (or direct you back here if it looks like a Moonlight bug after all). https://moonlight-stream.org/discord
**Describe the bug**
A clear and concise description of what the bug is.
**Steps to reproduce**
Any special steps that are required for the bug to appear.
**Screenshots**
If applicable, add screenshots to help explain your problem. If the issue is related to video glitching or poor quality, please include screenshots.
**Affected games**
List the games you've tried that exhibit the issue. To see if the issue is game-specific, try streaming Steam Big Picture with Moonlight and see if the issue persists there.
**Other Moonlight clients**
- Does the issue occur when using Moonlight on PC or Android?
**Moonlight settings (please complete the following information)**
- Have any settings been adjusted from defaults?
- If so, which settings have been changed?
- Does the problem still occur after reverting settings back to default?
**Gamepad-related issues (please complete if problem is gamepad-related)**
- Do you have any gamepads connected to your host PC directly?
- If gamepad input is not working, does it work if you use Moonlight's on-screen controls?
- Does the problem still remain if you stream the desktop and use https://html5gamepad.com to test your gamepad?
- Instructions for streaming the desktop can be found here: https://github.com/moonlight-stream/moonlight-docs/wiki/Setup-Guide
**Device details (please complete the following information)**
- iOS/tvOS version: [e.g. iOS 14.2]
- Device model: [e.g. iPhone 11 Pro]
**Server PC details (please complete the following information)**
- OS: [e.g. Windows 10 1809]
- GeForce Experience version: [e.g. 3.16.0.140]
- Nvidia GPU driver: [e.g. 417.35]
- Antivirus and firewall software: [e.g. Windows Defender and Windows Firewall]
**Additional context**
Anything else you think may be relevant to the issue or special about your specific setup.
+1
View File
@@ -0,0 +1 @@
blank_issues_enabled: false
+17
View File
@@ -0,0 +1,17 @@
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
+4
View File
@@ -0,0 +1,4 @@
issuesOpened: >
If this is a question about Moonlight or you need help troubleshooting a streaming problem, please use the help channels on our [Discord server](https://moonlight-stream.org/discord) instead of GitHub issues. There are many more people available on Discord to help you and answer your questions.<br /><br />
This issue tracker should only be used for specific bugs or feature requests.<br /><br />
Thank you, and happy streaming!
+25
View File
@@ -0,0 +1,25 @@
# Configuration for Lock Threads - https://github.com/dessant/lock-threads-app
# Number of days of inactivity before a closed issue or pull request is locked
daysUntilLock: 60
# Skip issues and pull requests created before a given timestamp. Timestamp must
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
skipCreatedBefore: false
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
exemptLabels:
- enhancement
# Label to add before locking, such as `outdated`. Set to `false` to disable
lockLabel: false
# Comment to post before locking. Set to `false` to disable
lockComment: >
This issue has been automatically locked since there has not been
any recent activity after it was closed. If you experience an issue
that looks similar to this one, please open a new issue with details
about your specific streaming setup.
# Don't lock PRs
only: issues
+8
View File
@@ -0,0 +1,8 @@
# ProBot No Response (https://probot.github.io/apps/no-response/)
daysUntilClose: 7
responseRequiredLabel: 'need more info'
closeComment: >
This issue has been automatically closed because there was no response to a
request for more information from the issue opener. Please leave a comment or
open a new issue if you have additional information related to this issue.
+14
View File
@@ -0,0 +1,14 @@
# ProBot Stale (https://probot.github.io/apps/stale/)
daysUntilStale: 90
daysUntilClose: 7
exemptLabels:
- accepted
- bug
- enhancement
- meta
staleLabel: stale
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs.
closeComment: false
+30
View File
@@ -0,0 +1,30 @@
name: Build VoidLink IPA
on:
push:
branches: [ "feat/frame_pacing_metal" ]
jobs:
build:
name: Build VoidLink IPA
runs-on: macos-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Checkout submodules
run: "git submodule update --init --recursive"
- name: Build VoidLink
run: |
xcodebuild -verbose -scheme VoidLink -sdk iphoneos -configuration Debug archive -archivePath $PWD/build/VoidLink.xcarchive CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED="NO" CODE_SIGN_ENTITLEMENTS="" CODE_SIGNING_ALLOWED="NO"
mkdir -p ./build/IPA && mkdir -p ./build/IPA/Payload
cp -r ./build/VoidLink.xcarchive/Products/Applications/VoidLink.app ./build/IPA/Payload/VoidLink.app
cd ./build/IPA && zip -r ../../build/VoidLink.ipa ./Payload/* && cd ../..
- name: Upload VoidLink IPA to Artifacts
uses: actions/upload-artifact@v4
with:
name: VoidLink.ipa
path: build/VoidLink.ipa
+10
View File
@@ -0,0 +1,10 @@
**/xcuserdata/
**/Moonlight.xcscmblueprint
**/xcschemes/*.xcscheme
.DS_Store
Build
DerivedData
build-home/
*.xccheckout
.github
README.md
+12
View File
@@ -0,0 +1,12 @@
[submodule "moonlight-common/moonlight-common-c"]
path = moonlight-common/moonlight-common-c
url=https://github.com/TrueZhuangJia/voidlink-c.git
[submodule "X1Kit"]
path = X1Kit
url = https://github.com/cgutman/X1Kit.git
[submodule "third_party/imgui"]
path = third_party/imgui
url = https://github.com/ocornut/imgui.git
[submodule "third_party/moonlight-audio-haptics"]
path = third_party/moonlight-audio-haptics
url = https://github.com/TrueZhuangJia/moonlight-audio-haptics.git
+180
View File
@@ -0,0 +1,180 @@
#!/bin/bash
# Builds libopus for iOS or tvOS.
#
# Copyright 2012 Mike Tigas <mike@tig.as>
#
# Based on work by Felix Schulze on 16.12.10.
# Copyright 2010 Felix Schulze. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
###########################################################################
# Choose your libopus version and your currently-installed iOS SDK version:
#
TARGET="AppleTV" # "iPhone"
VERSION="1.3.1"
SDKVERSION="16.1"
MINVERSIONDEF="-mtvos-version-min=12.0" # "-miphoneos-version-min=12.0"
###########################################################################
#
# Don't change anything under this line!
#
###########################################################################
# by default, we won't build for debugging purposes
if [ "${DEBUG}" == "true" ]; then
echo "Compiling for debugging ..."
OPT_CFLAGS="-O0 -fno-inline -g"
OPT_LDFLAGS=""
OPT_CONFIG_ARGS="--enable-assertions --disable-asm"
else
OPT_CFLAGS="-O3 -g"
OPT_LDFLAGS=""
OPT_CONFIG_ARGS=""
fi
# No need to change this since xcode build will only compile in the
# necessary bits from the libraries we create
ARCHS="x86_64 arm64"
DEVELOPER=`xcode-select -print-path`
#DEVELOPER="/Applications/Xcode.app/Contents/Developer"
cd "`dirname \"$0\"`"
REPOROOT=$(pwd)
# Where we'll end up storing things in the end
OUTPUTDIR="${REPOROOT}/dependencies"
mkdir -p ${OUTPUTDIR}/include
mkdir -p ${OUTPUTDIR}/lib
BUILDDIR="${REPOROOT}/build"
# where we will keep our sources and build from.
SRCDIR="${BUILDDIR}/src"
mkdir -p $SRCDIR
# where we will store intermediary builds
INTERDIR="${BUILDDIR}/built"
mkdir -p $INTERDIR
########################################
cd $SRCDIR
# Exit the script if an error happens
set -e
if [ ! -e "${SRCDIR}/opus-${VERSION}.tar.gz" ]; then
echo "Downloading opus-${VERSION}.tar.gz"
curl -LO http://downloads.xiph.org/releases/opus/opus-${VERSION}.tar.gz
fi
echo "Using opus-${VERSION}.tar.gz"
tar zxf opus-${VERSION}.tar.gz -C $SRCDIR
cd "${SRCDIR}/opus-${VERSION}"
set +e # don't bail out of bash script if ccache doesn't exist
CCACHE=`which ccache`
if [ $? == "0" ]; then
echo "Building with ccache: $CCACHE"
CCACHE="${CCACHE} "
else
echo "Building without ccache"
CCACHE=""
fi
set -e # back to regular "bail out on error" mode
export ORIGINALPATH=$PATH
for ARCH in ${ARCHS}
do
if [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ]; then
PLATFORM="${TARGET}Simulator"
EXTRA_CFLAGS="-arch ${ARCH}"
EXTRA_CONFIG="--host=x86_64-apple-darwin"
else
PLATFORM="${TARGET}OS"
EXTRA_CFLAGS="-arch ${ARCH}"
EXTRA_CONFIG="--host=arm-apple-darwin"
fi
mkdir -p "${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk"
./configure --disable-shared --enable-static --with-pic --disable-extra-programs --disable-doc ${EXTRA_CONFIG} \
--prefix="${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk" \
LDFLAGS="$LDFLAGS ${OPT_LDFLAGS} -fPIE ${MINVERSIONDEF} -L${OUTPUTDIR}/lib" \
CFLAGS="$CFLAGS ${EXTRA_CFLAGS} ${OPT_CFLAGS} -fPIE ${MINVERSIONDEF} -I${OUTPUTDIR}/include -isysroot ${DEVELOPER}/Platforms/${PLATFORM}.platform/Developer/SDKs/${PLATFORM}${SDKVERSION}.sdk" \
# Build the application and install it to the fake SDK intermediary dir
# we have set up. Make sure to clean up afterward because we will re-use
# this source tree to cross-compile other targets.
make -j$(nproc)
make install
make clean
done
########################################
echo "Build library..."
# These are the libs that comprise libopus.
OUTPUT_LIBS="libopus.a"
for OUTPUT_LIB in ${OUTPUT_LIBS}; do
INPUT_LIBS=""
for ARCH in ${ARCHS}; do
if [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ];
then
PLATFORM="${TARGET}Simulator"
else
PLATFORM="${TARGET}OS"
fi
INPUT_ARCH_LIB="${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk/lib/${OUTPUT_LIB}"
if [ -e $INPUT_ARCH_LIB ]; then
INPUT_LIBS="${INPUT_LIBS} ${INPUT_ARCH_LIB}"
fi
done
# Combine the three architectures into a universal library.
if [ -n "$INPUT_LIBS" ]; then
lipo -create $INPUT_LIBS \
-output "${OUTPUTDIR}/lib/${OUTPUT_LIB}"
else
echo "$OUTPUT_LIB does not exist, skipping (are the dependencies installed?)"
fi
done
for ARCH in ${ARCHS}; do
if [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ];
then
PLATFORM="${TARGET}Simulator"
else
PLATFORM="${TARGET}OS"
fi
cp -R ${INTERDIR}/${PLATFORM}${SDKVERSION}-${ARCH}.sdk/include/* ${OUTPUTDIR}/include/
if [ $? == "0" ]; then
# We only need to copy the headers over once. (So break out of forloop
# once we get first success.)
break
fi
done
####################
echo "Building done."
echo "Cleaning up..."
rm -fr ${INTERDIR}
rm -fr "${SRCDIR}/opus-${VERSION}"
echo "Done."
+78
View File
@@ -0,0 +1,78 @@
// dear imgui: Renderer Backend for Metal
// This needs to be used along with a Platform Backend (e.g. OSX)
// Implemented features:
// [X] Renderer: User texture binding. Use 'MTLTexture' as texture identifier. Read the FAQ about ImTextureID/ImTextureRef!
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).
// [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures).
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// Learn about Dear ImGui:
// - FAQ https://dearimgui.com/faq
// - Getting Started https://dearimgui.com/getting-started
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
// - Introduction, links and more at the top of imgui.cpp
#pragma once
#include "imgui.h" // IMGUI_IMPL_API
#ifndef IMGUI_DISABLE
//-----------------------------------------------------------------------------
// ObjC API
//-----------------------------------------------------------------------------
#ifdef __OBJC__
@class MTLRenderPassDescriptor;
@protocol MTLDevice, MTLCommandBuffer, MTLRenderCommandEncoder;
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
IMGUI_IMPL_API bool ImGui_ImplMetal_Init(id<MTLDevice> device);
IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown();
IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor);
IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* drawData,
id<MTLCommandBuffer> commandBuffer,
id<MTLRenderCommandEncoder> commandEncoder);
// Called by Init/NewFrame/Shutdown
IMGUI_IMPL_API bool ImGui_ImplMetal_CreateDeviceObjects(id<MTLDevice> device);
IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects();
// (Advanced) Use e.g. if you need to precisely control the timing of texture updates (e.g. for staged rendering), by setting ImDrawData::Textures = NULL to handle this manually.
IMGUI_IMPL_API void ImGui_ImplMetal_UpdateTexture(ImTextureData* tex);
#endif
//-----------------------------------------------------------------------------
// C++ API
//-----------------------------------------------------------------------------
// Enable Metal C++ binding support with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file
// More info about using Metal from C++: https://developer.apple.com/metal/cpp/
#ifdef IMGUI_IMPL_METAL_CPP
#include <Metal/Metal.hpp>
#ifndef __OBJC__
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
IMGUI_IMPL_API bool ImGui_ImplMetal_Init(MTL::Device* device);
IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown();
IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor);
IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data,
MTL::CommandBuffer* commandBuffer,
MTL::RenderCommandEncoder* commandEncoder);
// Called by Init/NewFrame/Shutdown
IMGUI_IMPL_API bool ImGui_ImplMetal_CreateDeviceObjects(MTL::Device* device);
IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects();
// (Advanced) Use e.g. if you need to precisely control the timing of texture updates (e.g. for staged rendering), by setting ImDrawData::Textures = NULL to handle this manually.
IMGUI_IMPL_API void ImGui_ImplMetal_UpdateTexture(ImTextureData* tex);
#endif
#endif
//-----------------------------------------------------------------------------
#endif // #ifndef IMGUI_DISABLE
+657
View File
@@ -0,0 +1,657 @@
// dear imgui: Renderer Backend for Metal
// This needs to be used along with a Platform Backend (e.g. OSX)
// Implemented features:
// [X] Renderer: User texture binding. Use 'MTLTexture' as texture identifier. Read the FAQ about ImTextureID/ImTextureRef!
// [X] Renderer: Large meshes support (64k+ vertices) even with 16-bit indices (ImGuiBackendFlags_RendererHasVtxOffset).
// [X] Renderer: Texture updates support for dynamic font atlas (ImGuiBackendFlags_RendererHasTextures).
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
// Learn about Dear ImGui:
// - FAQ https://dearimgui.com/faq
// - Getting Started https://dearimgui.com/getting-started
// - Documentation https://dearimgui.com/docs (same as your local docs/ folder).
// - Introduction, links and more at the top of imgui.cpp
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2025-06-11: Added support for ImGuiBackendFlags_RendererHasTextures, for dynamic font atlas. Removed ImGui_ImplMetal_CreateFontsTexture() and ImGui_ImplMetal_DestroyFontsTexture().
// 2025-02-03: Metal: Crash fix. (#8367)
// 2024-01-08: Metal: Fixed memory leaks when using metal-cpp (#8276, #8166) or when using multiple contexts (#7419).
// 2022-08-23: Metal: Update deprecated property 'sampleCount'->'rasterSampleCount'.
// 2022-07-05: Metal: Add dispatch synchronization.
// 2022-06-30: Metal: Use __bridge for ARC based systems.
// 2022-06-01: Metal: Fixed null dereference on exit inside command buffer completion handler.
// 2022-04-27: Misc: Store backend data in a per-context struct, allowing to use this backend with multiple contexts.
// 2022-01-03: Metal: Ignore ImDrawCmd where ElemCount == 0 (very rare but can technically be manufactured by user code).
// 2021-12-30: Metal: Added Metal C++ support. Enable with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file.
// 2021-08-24: Metal: Fixed a crash when clipping rect larger than framebuffer is submitted. (#4464)
// 2021-05-19: Metal: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement)
// 2021-02-18: Metal: Change blending equation to preserve alpha in output buffer.
// 2021-01-25: Metal: Fixed texture storage mode when building on Mac Catalyst.
// 2019-05-29: Metal: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag.
// 2019-04-30: Metal: Added support for special ImDrawCallback_ResetRenderState callback to reset render state.
// 2019-02-11: Metal: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display.
// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window.
// 2018-07-05: Metal: Added new Metal backend implementation.
#include "imgui.h"
#ifndef IMGUI_DISABLE
#include "imgui_impl_metal.h"
#import <time.h>
#import <Metal/Metal.h>
#pragma mark - Support classes
// A wrapper around a MTLBuffer object that knows the last time it was reused
@interface MetalBuffer : NSObject
@property (nonatomic, strong) id<MTLBuffer> buffer;
@property (nonatomic, assign) double lastReuseTime;
- (instancetype)initWithBuffer:(id<MTLBuffer>)buffer;
@end
// An object that encapsulates the data necessary to uniquely identify a
// render pipeline state. These are used as cache keys.
@interface FramebufferDescriptor : NSObject<NSCopying>
@property (nonatomic, assign) unsigned long sampleCount;
@property (nonatomic, assign) MTLPixelFormat colorPixelFormat;
@property (nonatomic, assign) MTLPixelFormat depthPixelFormat;
@property (nonatomic, assign) MTLPixelFormat stencilPixelFormat;
- (instancetype)initWithRenderPassDescriptor:(MTLRenderPassDescriptor*)renderPassDescriptor;
@end
@interface MetalTexture : NSObject
@property (nonatomic, strong) id<MTLTexture> metalTexture;
- (instancetype)initWithTexture:(id<MTLTexture>)metalTexture;
@end
// A singleton that stores long-lived objects that are needed by the Metal
// renderer backend. Stores the render pipeline state cache and the default
// font texture, and manages the reusable buffer cache.
@interface MetalContext : NSObject
@property (nonatomic, strong) id<MTLDevice> device;
@property (nonatomic, strong) id<MTLDepthStencilState> depthStencilState;
@property (nonatomic, strong) FramebufferDescriptor* framebufferDescriptor; // framebuffer descriptor for current frame; transient
@property (nonatomic, strong) NSMutableDictionary* renderPipelineStateCache; // pipeline cache; keyed on framebuffer descriptors
@property (nonatomic, strong) NSMutableArray<MetalBuffer*>* bufferCache;
@property (nonatomic, assign) double lastBufferCachePurge;
- (MetalBuffer*)dequeueReusableBufferOfLength:(NSUInteger)length device:(id<MTLDevice>)device;
- (id<MTLRenderPipelineState>)renderPipelineStateForFramebufferDescriptor:(FramebufferDescriptor*)descriptor device:(id<MTLDevice>)device;
@end
struct ImGui_ImplMetal_Data
{
MetalContext* SharedMetalContext;
ImGui_ImplMetal_Data() { memset((void*)this, 0, sizeof(*this)); }
};
static ImGui_ImplMetal_Data* ImGui_ImplMetal_GetBackendData() { return ImGui::GetCurrentContext() ? (ImGui_ImplMetal_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; }
static void ImGui_ImplMetal_DestroyBackendData(){ IM_DELETE(ImGui_ImplMetal_GetBackendData()); }
// XXX Work around missing clock symbols on iOS. The NSDate version is the method this function used previously.
#if defined(CLOCK_UPTIME_RAW)
static inline CFTimeInterval GetMachAbsoluteTimeInSeconds() { return (CFTimeInterval)(double)(clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1e9); }
#else
static inline CFTimeInterval GetMachAbsoluteTimeInSeconds() { return (CFTimeInterval)[NSDate date].timeIntervalSince1970; }
#endif
#ifdef IMGUI_IMPL_METAL_CPP
#pragma mark - Dear ImGui Metal C++ Backend API
bool ImGui_ImplMetal_Init(MTL::Device* device)
{
return ImGui_ImplMetal_Init((__bridge id<MTLDevice>)(device));
}
void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor)
{
ImGui_ImplMetal_NewFrame((__bridge MTLRenderPassDescriptor*)(renderPassDescriptor));
}
void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data,
MTL::CommandBuffer* commandBuffer,
MTL::RenderCommandEncoder* commandEncoder)
{
ImGui_ImplMetal_RenderDrawData(draw_data,
(__bridge id<MTLCommandBuffer>)(commandBuffer),
(__bridge id<MTLRenderCommandEncoder>)(commandEncoder));
}
bool ImGui_ImplMetal_CreateDeviceObjects(MTL::Device* device)
{
return ImGui_ImplMetal_CreateDeviceObjects((__bridge id<MTLDevice>)(device));
}
#endif // #ifdef IMGUI_IMPL_METAL_CPP
#pragma mark - Dear ImGui Metal Backend API
bool ImGui_ImplMetal_Init(id<MTLDevice> device)
{
ImGuiIO& io = ImGui::GetIO();
IMGUI_CHECKVERSION();
IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!");
ImGui_ImplMetal_Data* bd = IM_NEW(ImGui_ImplMetal_Data)();
io.BackendRendererUserData = (void*)bd;
io.BackendRendererName = "imgui_impl_metal";
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures; // We can honor ImGuiPlatformIO::Textures[] requests during render.
bd->SharedMetalContext = [[MetalContext alloc] init];
bd->SharedMetalContext.device = device;
return true;
}
void ImGui_ImplMetal_Shutdown()
{
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
IM_UNUSED(bd);
IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?");
ImGui_ImplMetal_DestroyDeviceObjects();
ImGui_ImplMetal_DestroyBackendData();
ImGuiIO& io = ImGui::GetIO();
io.BackendRendererName = nullptr;
io.BackendRendererUserData = nullptr;
io.BackendFlags &= ~(ImGuiBackendFlags_RendererHasVtxOffset | ImGuiBackendFlags_RendererHasTextures);
}
void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor)
{
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
IM_ASSERT(bd != nil && "Context or backend not initialized! Did you call ImGui_ImplMetal_Init()?");
#ifdef IMGUI_IMPL_METAL_CPP
bd->SharedMetalContext.framebufferDescriptor = [[[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor]autorelease];
#else
bd->SharedMetalContext.framebufferDescriptor = [[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor];
#endif
if (bd->SharedMetalContext.depthStencilState == nil)
ImGui_ImplMetal_CreateDeviceObjects(bd->SharedMetalContext.device);
}
static void ImGui_ImplMetal_SetupRenderState(ImDrawData* draw_data, id<MTLCommandBuffer> commandBuffer,
id<MTLRenderCommandEncoder> commandEncoder, id<MTLRenderPipelineState> renderPipelineState,
MetalBuffer* vertexBuffer, size_t vertexBufferOffset)
{
IM_UNUSED(commandBuffer);
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
[commandEncoder setCullMode:MTLCullModeNone];
[commandEncoder setDepthStencilState:bd->SharedMetalContext.depthStencilState];
// Setup viewport, orthographic projection matrix
// Our visible imgui space lies from draw_data->DisplayPos (top left) to
// draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps.
MTLViewport viewport =
{
.originX = 0.0,
.originY = 0.0,
.width = (double)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x),
.height = (double)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y),
.znear = 0.0,
.zfar = 1.0
};
[commandEncoder setViewport:viewport];
float L = draw_data->DisplayPos.x;
float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x;
float T = draw_data->DisplayPos.y;
float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y;
float N = (float)viewport.znear;
float F = (float)viewport.zfar;
const float ortho_projection[4][4] =
{
{ 2.0f/(R-L), 0.0f, 0.0f, 0.0f },
{ 0.0f, 2.0f/(T-B), 0.0f, 0.0f },
{ 0.0f, 0.0f, 1/(F-N), 0.0f },
{ (R+L)/(L-R), (T+B)/(B-T), N/(F-N), 1.0f },
};
[commandEncoder setVertexBytes:&ortho_projection length:sizeof(ortho_projection) atIndex:1];
[commandEncoder setRenderPipelineState:renderPipelineState];
[commandEncoder setVertexBuffer:vertexBuffer.buffer offset:0 atIndex:0];
[commandEncoder setVertexBufferOffset:vertexBufferOffset atIndex:0];
}
// Metal Render function.
void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data, id<MTLCommandBuffer> commandBuffer, id<MTLRenderCommandEncoder> commandEncoder)
{
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
MetalContext* ctx = bd->SharedMetalContext;
// Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x);
int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y);
if (fb_width <= 0 || fb_height <= 0 || draw_data->CmdListsCount == 0)
return;
// Catch up with texture updates. Most of the times, the list will have 1 element with an OK status, aka nothing to do.
// (This almost always points to ImGui::GetPlatformIO().Textures[] but is part of ImDrawData to allow overriding or disabling texture updates).
if (draw_data->Textures != nullptr)
for (ImTextureData* tex : *draw_data->Textures)
if (tex->Status != ImTextureStatus_OK)
ImGui_ImplMetal_UpdateTexture(tex);
// Try to retrieve a render pipeline state that is compatible with the framebuffer config for this frame
// The hit rate for this cache should be very near 100%.
id<MTLRenderPipelineState> renderPipelineState = ctx.renderPipelineStateCache[ctx.framebufferDescriptor];
if (renderPipelineState == nil)
{
// No luck; make a new render pipeline state
renderPipelineState = [ctx renderPipelineStateForFramebufferDescriptor:ctx.framebufferDescriptor device:commandBuffer.device];
// Cache render pipeline state for later reuse
ctx.renderPipelineStateCache[ctx.framebufferDescriptor] = renderPipelineState;
}
size_t vertexBufferLength = (size_t)draw_data->TotalVtxCount * sizeof(ImDrawVert);
size_t indexBufferLength = (size_t)draw_data->TotalIdxCount * sizeof(ImDrawIdx);
MetalBuffer* vertexBuffer = [ctx dequeueReusableBufferOfLength:vertexBufferLength device:commandBuffer.device];
MetalBuffer* indexBuffer = [ctx dequeueReusableBufferOfLength:indexBufferLength device:commandBuffer.device];
ImGui_ImplMetal_SetupRenderState(draw_data, commandBuffer, commandEncoder, renderPipelineState, vertexBuffer, 0);
// Will project scissor/clipping rectangles into framebuffer space
ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports
ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2)
// Render command lists
size_t vertexBufferOffset = 0;
size_t indexBufferOffset = 0;
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
const ImDrawList* draw_list = draw_data->CmdLists[n];
memcpy((char*)vertexBuffer.buffer.contents + vertexBufferOffset, draw_list->VtxBuffer.Data, (size_t)draw_list->VtxBuffer.Size * sizeof(ImDrawVert));
memcpy((char*)indexBuffer.buffer.contents + indexBufferOffset, draw_list->IdxBuffer.Data, (size_t)draw_list->IdxBuffer.Size * sizeof(ImDrawIdx));
for (int cmd_i = 0; cmd_i < draw_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &draw_list->CmdBuffer[cmd_i];
if (pcmd->UserCallback)
{
// User callback, registered via ImDrawList::AddCallback()
// (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
if (pcmd->UserCallback == ImDrawCallback_ResetRenderState)
ImGui_ImplMetal_SetupRenderState(draw_data, commandBuffer, commandEncoder, renderPipelineState, vertexBuffer, vertexBufferOffset);
else
pcmd->UserCallback(draw_list, pcmd);
}
else
{
// Project scissor/clipping rectangles into framebuffer space
ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y);
ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y);
// Clamp to viewport as setScissorRect() won't accept values that are off bounds
if (clip_min.x < 0.0f) { clip_min.x = 0.0f; }
if (clip_min.y < 0.0f) { clip_min.y = 0.0f; }
if (clip_max.x > fb_width) { clip_max.x = (float)fb_width; }
if (clip_max.y > fb_height) { clip_max.y = (float)fb_height; }
if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y)
continue;
if (pcmd->ElemCount == 0) // drawIndexedPrimitives() validation doesn't accept this
continue;
// Apply scissor/clipping rectangle
MTLScissorRect scissorRect =
{
.x = NSUInteger(clip_min.x),
.y = NSUInteger(clip_min.y),
.width = NSUInteger(clip_max.x - clip_min.x),
.height = NSUInteger(clip_max.y - clip_min.y)
};
[commandEncoder setScissorRect:scissorRect];
// Bind texture, Draw
if (ImTextureID tex_id = pcmd->GetTexID())
[commandEncoder setFragmentTexture:(__bridge id<MTLTexture>)(void*)(intptr_t)(tex_id) atIndex:0];
[commandEncoder setVertexBufferOffset:(vertexBufferOffset + pcmd->VtxOffset * sizeof(ImDrawVert)) atIndex:0];
[commandEncoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle
indexCount:pcmd->ElemCount
indexType:sizeof(ImDrawIdx) == 2 ? MTLIndexTypeUInt16 : MTLIndexTypeUInt32
indexBuffer:indexBuffer.buffer
indexBufferOffset:indexBufferOffset + pcmd->IdxOffset * sizeof(ImDrawIdx)];
}
}
vertexBufferOffset += (size_t)draw_list->VtxBuffer.Size * sizeof(ImDrawVert);
indexBufferOffset += (size_t)draw_list->IdxBuffer.Size * sizeof(ImDrawIdx);
}
MetalContext* sharedMetalContext = bd->SharedMetalContext;
[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer>)
{
dispatch_async(dispatch_get_main_queue(), ^{
@synchronized(sharedMetalContext.bufferCache)
{
[sharedMetalContext.bufferCache addObject:vertexBuffer];
[sharedMetalContext.bufferCache addObject:indexBuffer];
}
});
}];
}
static void ImGui_ImplMetal_DestroyTexture(ImTextureData* tex)
{
MetalTexture* backend_tex = (__bridge_transfer MetalTexture*)(tex->BackendUserData);
if (backend_tex == nullptr)
return;
IM_ASSERT(backend_tex.metalTexture == (__bridge id<MTLTexture>)(void*)(intptr_t)tex->TexID);
backend_tex.metalTexture = nil;
// Clear identifiers and mark as destroyed (in order to allow e.g. calling InvalidateDeviceObjects while running)
tex->SetTexID(ImTextureID_Invalid);
tex->SetStatus(ImTextureStatus_Destroyed);
tex->BackendUserData = nullptr;
}
void ImGui_ImplMetal_UpdateTexture(ImTextureData* tex)
{
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
if (tex->Status == ImTextureStatus_WantCreate)
{
// Create and upload new texture to graphics system
//IMGUI_DEBUG_LOG("UpdateTexture #%03d: WantCreate %dx%d\n", tex->UniqueID, tex->Width, tex->Height);
IM_ASSERT(tex->TexID == ImTextureID_Invalid && tex->BackendUserData == nullptr);
IM_ASSERT(tex->Format == ImTextureFormat_RGBA32);
// We are retrieving and uploading the font atlas as a 4-channels RGBA texture here.
// In theory we could call GetTexDataAsAlpha8() and upload a 1-channel texture to save on memory access bandwidth.
// However, using a shader designed for 1-channel texture would make it less obvious to use the ImTextureID facility to render users own textures.
// You can make that change in your implementation.
MTLTextureDescriptor* textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm
width:(NSUInteger)tex->Width
height:(NSUInteger)tex->Height
mipmapped:NO];
textureDescriptor.usage = MTLTextureUsageShaderRead;
#if TARGET_OS_OSX || TARGET_OS_MACCATALYST
textureDescriptor.storageMode = MTLStorageModeManaged;
#else
textureDescriptor.storageMode = MTLStorageModeShared;
#endif
id <MTLTexture> texture = [bd->SharedMetalContext.device newTextureWithDescriptor:textureDescriptor];
[texture replaceRegion:MTLRegionMake2D(0, 0, (NSUInteger)tex->Width, (NSUInteger)tex->Height) mipmapLevel:0 withBytes:tex->Pixels bytesPerRow:(NSUInteger)tex->Width * 4];
MetalTexture* backend_tex = [[MetalTexture alloc] initWithTexture:texture];
// Store identifiers
tex->SetTexID((ImTextureID)(intptr_t)texture);
tex->SetStatus(ImTextureStatus_OK);
tex->BackendUserData = (__bridge_retained void*)(backend_tex);
}
else if (tex->Status == ImTextureStatus_WantUpdates)
{
// Update selected blocks. We only ever write to textures regions which have never been used before!
// This backend choose to use tex->Updates[] but you can use tex->UpdateRect to upload a single region.
MetalTexture* backend_tex = (__bridge MetalTexture*)(tex->BackendUserData);
for (ImTextureRect& r : tex->Updates)
{
[backend_tex.metalTexture replaceRegion:MTLRegionMake2D((NSUInteger)r.x, (NSUInteger)r.y, (NSUInteger)r.w, (NSUInteger)r.h)
mipmapLevel:0
withBytes:tex->GetPixelsAt(r.x, r.y)
bytesPerRow:(NSUInteger)tex->Width * 4];
}
tex->SetStatus(ImTextureStatus_OK);
}
else if (tex->Status == ImTextureStatus_WantDestroy && tex->UnusedFrames > 0)
{
ImGui_ImplMetal_DestroyTexture(tex);
}
}
bool ImGui_ImplMetal_CreateDeviceObjects(id<MTLDevice> device)
{
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
MTLDepthStencilDescriptor* depthStencilDescriptor = [[MTLDepthStencilDescriptor alloc] init];
depthStencilDescriptor.depthWriteEnabled = NO;
depthStencilDescriptor.depthCompareFunction = MTLCompareFunctionAlways;
bd->SharedMetalContext.depthStencilState = [device newDepthStencilStateWithDescriptor:depthStencilDescriptor];
#ifdef IMGUI_IMPL_METAL_CPP
[depthStencilDescriptor release];
#endif
return true;
}
void ImGui_ImplMetal_DestroyDeviceObjects()
{
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
// Destroy all textures
for (ImTextureData* tex : ImGui::GetPlatformIO().Textures)
if (tex->RefCount == 1)
ImGui_ImplMetal_DestroyTexture(tex);
[bd->SharedMetalContext.renderPipelineStateCache removeAllObjects];
}
#pragma mark - MetalBuffer implementation
@implementation MetalBuffer
- (instancetype)initWithBuffer:(id<MTLBuffer>)buffer
{
if ((self = [super init]))
{
_buffer = buffer;
_lastReuseTime = GetMachAbsoluteTimeInSeconds();
}
return self;
}
@end
#pragma mark - FramebufferDescriptor implementation
@implementation FramebufferDescriptor
- (instancetype)initWithRenderPassDescriptor:(MTLRenderPassDescriptor*)renderPassDescriptor
{
if ((self = [super init]))
{
_sampleCount = renderPassDescriptor.colorAttachments[0].texture.sampleCount;
_colorPixelFormat = renderPassDescriptor.colorAttachments[0].texture.pixelFormat;
_depthPixelFormat = renderPassDescriptor.depthAttachment.texture.pixelFormat;
_stencilPixelFormat = renderPassDescriptor.stencilAttachment.texture.pixelFormat;
}
return self;
}
- (nonnull id)copyWithZone:(nullable NSZone*)zone
{
FramebufferDescriptor* copy = [[FramebufferDescriptor allocWithZone:zone] init];
copy.sampleCount = self.sampleCount;
copy.colorPixelFormat = self.colorPixelFormat;
copy.depthPixelFormat = self.depthPixelFormat;
copy.stencilPixelFormat = self.stencilPixelFormat;
return copy;
}
- (NSUInteger)hash
{
NSUInteger sc = _sampleCount & 0x3;
NSUInteger cf = _colorPixelFormat & 0x3FF;
NSUInteger df = _depthPixelFormat & 0x3FF;
NSUInteger sf = _stencilPixelFormat & 0x3FF;
NSUInteger hash = (sf << 22) | (df << 12) | (cf << 2) | sc;
return hash;
}
- (BOOL)isEqual:(id)object
{
FramebufferDescriptor* other = object;
if (![other isKindOfClass:[FramebufferDescriptor class]])
return NO;
return other.sampleCount == self.sampleCount &&
other.colorPixelFormat == self.colorPixelFormat &&
other.depthPixelFormat == self.depthPixelFormat &&
other.stencilPixelFormat == self.stencilPixelFormat;
}
@end
#pragma mark - MetalTexture implementation
@implementation MetalTexture
- (instancetype)initWithTexture:(id<MTLTexture>)metalTexture
{
if ((self = [super init]))
self.metalTexture = metalTexture;
return self;
}
@end
#pragma mark - MetalContext implementation
@implementation MetalContext
- (instancetype)init
{
if ((self = [super init]))
{
self.renderPipelineStateCache = [NSMutableDictionary dictionary];
self.bufferCache = [NSMutableArray array];
_lastBufferCachePurge = GetMachAbsoluteTimeInSeconds();
}
return self;
}
- (MetalBuffer*)dequeueReusableBufferOfLength:(NSUInteger)length device:(id<MTLDevice>)device
{
uint64_t now = GetMachAbsoluteTimeInSeconds();
@synchronized(self.bufferCache)
{
// Purge old buffers that haven't been useful for a while
if (now - self.lastBufferCachePurge > 1.0)
{
NSMutableArray* survivors = [NSMutableArray array];
for (MetalBuffer* candidate in self.bufferCache)
if (candidate.lastReuseTime > self.lastBufferCachePurge)
[survivors addObject:candidate];
self.bufferCache = [survivors mutableCopy];
self.lastBufferCachePurge = now;
}
// See if we have a buffer we can reuse
MetalBuffer* bestCandidate = nil;
for (MetalBuffer* candidate in self.bufferCache)
if (candidate.buffer.length >= length && (bestCandidate == nil || bestCandidate.lastReuseTime > candidate.lastReuseTime))
bestCandidate = candidate;
if (bestCandidate != nil)
{
[self.bufferCache removeObject:bestCandidate];
bestCandidate.lastReuseTime = now;
return bestCandidate;
}
}
// No luck; make a new buffer
id<MTLBuffer> backing = [device newBufferWithLength:length options:MTLResourceStorageModeShared];
return [[MetalBuffer alloc] initWithBuffer:backing];
}
// Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling.
- (id<MTLRenderPipelineState>)renderPipelineStateForFramebufferDescriptor:(FramebufferDescriptor*)descriptor device:(id<MTLDevice>)device
{
NSError* error = nil;
NSString* shaderSource = @""
"#include <metal_stdlib>\n"
"using namespace metal;\n"
"\n"
"struct Uniforms {\n"
" float4x4 projectionMatrix;\n"
"};\n"
"\n"
"struct VertexIn {\n"
" float2 position [[attribute(0)]];\n"
" float2 texCoords [[attribute(1)]];\n"
" uchar4 color [[attribute(2)]];\n"
"};\n"
"\n"
"struct VertexOut {\n"
" float4 position [[position]];\n"
" float2 texCoords;\n"
" float4 color;\n"
"};\n"
"\n"
"vertex VertexOut vertex_main(VertexIn in [[stage_in]],\n"
" constant Uniforms &uniforms [[buffer(1)]]) {\n"
" VertexOut out;\n"
" out.position = uniforms.projectionMatrix * float4(in.position, 0, 1);\n"
" out.texCoords = in.texCoords;\n"
" out.color = float4(in.color) / float4(255.0);\n"
" return out;\n"
"}\n"
"\n"
"fragment half4 fragment_main(VertexOut in [[stage_in]],\n"
" texture2d<half, access::sample> texture [[texture(0)]]) {\n"
" constexpr sampler linearSampler(coord::normalized, min_filter::linear, mag_filter::linear, mip_filter::linear);\n"
" half4 texColor = texture.sample(linearSampler, in.texCoords);\n"
" return half4(in.color) * texColor;\n"
"}\n";
id<MTLLibrary> library = [device newLibraryWithSource:shaderSource options:nil error:&error];
if (library == nil)
{
NSLog(@"Error: failed to create Metal library: %@", error);
return nil;
}
id<MTLFunction> vertexFunction = [library newFunctionWithName:@"vertex_main"];
id<MTLFunction> fragmentFunction = [library newFunctionWithName:@"fragment_main"];
if (vertexFunction == nil || fragmentFunction == nil)
{
NSLog(@"Error: failed to find Metal shader functions in library: %@", error);
return nil;
}
MTLVertexDescriptor* vertexDescriptor = [MTLVertexDescriptor vertexDescriptor];
vertexDescriptor.attributes[0].offset = offsetof(ImDrawVert, pos);
vertexDescriptor.attributes[0].format = MTLVertexFormatFloat2; // position
vertexDescriptor.attributes[0].bufferIndex = 0;
vertexDescriptor.attributes[1].offset = offsetof(ImDrawVert, uv);
vertexDescriptor.attributes[1].format = MTLVertexFormatFloat2; // texCoords
vertexDescriptor.attributes[1].bufferIndex = 0;
vertexDescriptor.attributes[2].offset = offsetof(ImDrawVert, col);
vertexDescriptor.attributes[2].format = MTLVertexFormatUChar4; // color
vertexDescriptor.attributes[2].bufferIndex = 0;
vertexDescriptor.layouts[0].stepRate = 1;
vertexDescriptor.layouts[0].stepFunction = MTLVertexStepFunctionPerVertex;
vertexDescriptor.layouts[0].stride = sizeof(ImDrawVert);
MTLRenderPipelineDescriptor* pipelineDescriptor = [[MTLRenderPipelineDescriptor alloc] init];
pipelineDescriptor.vertexFunction = vertexFunction;
pipelineDescriptor.fragmentFunction = fragmentFunction;
pipelineDescriptor.vertexDescriptor = vertexDescriptor;
pipelineDescriptor.rasterSampleCount = self.framebufferDescriptor.sampleCount;
pipelineDescriptor.colorAttachments[0].pixelFormat = self.framebufferDescriptor.colorPixelFormat;
pipelineDescriptor.colorAttachments[0].blendingEnabled = YES;
pipelineDescriptor.colorAttachments[0].rgbBlendOperation = MTLBlendOperationAdd;
pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactorSourceAlpha;
pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
pipelineDescriptor.colorAttachments[0].alphaBlendOperation = MTLBlendOperationAdd;
pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = MTLBlendFactorOne;
pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha;
pipelineDescriptor.depthAttachmentPixelFormat = self.framebufferDescriptor.depthPixelFormat;
pipelineDescriptor.stencilAttachmentPixelFormat = self.framebufferDescriptor.stencilPixelFormat;
id<MTLRenderPipelineState> renderPipelineState = [device newRenderPipelineStateWithDescriptor:pipelineDescriptor error:&error];
if (error != nil)
NSLog(@"Error: failed to create Metal pipeline state: %@", error);
return renderPipelineState;
}
@end
//-----------------------------------------------------------------------------
#endif // #ifndef IMGUI_DISABLE
+674
View File
@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+25
View File
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="24506" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina6_1" orientation="landscape" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24504"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view contentMode="scaleToFill" id="VWy-YH-qYj">
<rect key="frame" x="0.0" y="0.0" width="896" height="414"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<point key="canvasLocation" x="33" y="187"/>
</view>
</objects>
<resources>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,79 @@
//
// SettingsViewController.h
// Moonlight
//
// Created by Diego Waxemberg on 10/27/14.
// Copyright (c) 2014 Moonlight Stream. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "CustomOSCViewControl/LayoutOnScreenControlsViewController.h"
#import "MainFrameViewController.h"
#import "CustomEdgeSlideGestureRecognizer.h"
@interface SettingsViewController : UIViewController
@property (strong, nonatomic) IBOutlet UILabel *bitrateLabel;
@property (strong, nonatomic) IBOutlet UISlider *bitrateSlider;
@property (strong, nonatomic) IBOutlet UISegmentedControl *framerateSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *resolutionSelector;
@property (strong, nonatomic) IBOutlet UIView *resolutionDisplayView;
@property (strong, nonatomic) IBOutlet UILabel *touchModeLabel;
@property (strong, nonatomic) IBOutlet UISegmentedControl *touchModeSelector;
@property (strong, nonatomic) IBOutlet UILabel *onscreenControllerLabel;
@property (strong, nonatomic) IBOutlet UISegmentedControl *onscreenControlSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *motionModeSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *largerStickLR1Selector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *optimizeSettingsSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *multiControllerSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *swapABXYButtonsSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *audioOnPCSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *codecSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *yuv444Selector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *pipSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *hdrSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *framePacingSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *btMouseSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *reverseMouseWheelDirectionSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *statsOverlaySelector;
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) IBOutlet UILabel *keyboardToggleFingerNumLabel;
@property (strong, nonatomic) IBOutlet UISlider *keyboardToggleFingerNumSlider;
@property (strong, nonatomic) IBOutlet UISegmentedControl *liftStreamViewForKeyboardSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *showKeyboardToolbarSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *slideToSettingsScreenEdgeSelector;
@property (strong, nonatomic) IBOutlet UILabel *oscTapExlusionAreaSizeLabel;
@property (strong, nonatomic) IBOutlet UISlider *oscTapExlusionAreaSizeSlider;
@property (strong, nonatomic) IBOutlet UILabel *slideToSettingsScreenEdgeUILabel;
@property (strong, nonatomic) IBOutlet UISegmentedControl *cmdToolScreenEdgeSelector;
@property (strong, nonatomic) IBOutlet UILabel *slideToSettingsDistanceUILabel;
@property (strong, nonatomic) IBOutlet UISlider *slideToMenuDistanceSlider;
@property (strong, nonatomic) IBOutlet UISlider *pointerVelocityModeDividerSlider;
@property (strong, nonatomic) IBOutlet UILabel *pointerVelocityModeDividerUILabel;
@property (strong, nonatomic) IBOutlet UISlider *touchPointerVelocityFactorSlider;
@property (strong, nonatomic) IBOutlet UILabel *touchPointerVelocityFactorUILabel;
@property (strong, nonatomic) IBOutlet UISlider *mousePointerVelocityFactorSlider;
@property (strong, nonatomic) IBOutlet UILabel *mousePointerVelocityFactorUILabel;
@property (strong, nonatomic) IBOutlet UISegmentedControl *unlockDisplayOrientationSelector;
@property (strong, nonatomic) IBOutlet UIButton *backToStreamingButton;
@property (strong, nonatomic) LayoutOnScreenControlsViewController *layoutOnScreenControlsVC;
@property (nonatomic, strong) MainFrameViewController *mainFrameViewController;
@property (strong, nonatomic) IBOutlet UISegmentedControl *externalDisplayModeSelector;
@property (strong, nonatomic) IBOutlet UISegmentedControl *localMousePointerModeSelector;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunguarded-availability"
// This is okay because it's just an enum and access uses @available checks
@property(nonatomic) UIUserInterfaceStyle overrideUserInterfaceStyle;
#pragma clang diagnostic pop
- (void) saveSettings;
+ (bool) isLandscapeNow;
- (void)updateResolutionTable;
- (void) widget:(UISlider*)widget setEnabled:(bool)enabled;
@end
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "tv",
"filename" : "bg-app.jpg"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,17 @@
{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,11 @@
{
"images" : [
{
"idiom" : "tv"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,12 @@
{
"images" : [
{
"idiom" : "tv",
"filename" : "wedges-app.png"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,18 @@
{
"images" : [
{
"idiom" : "tv",
"filename" : "bg.jpg",
"scale" : "1x"
},
{
"idiom" : "tv",
"filename" : "bg@2.jpg",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,17 @@
{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,16 @@
{
"images" : [
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,18 @@
{
"images" : [
{
"idiom" : "tv",
"filename" : "Wedges.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"filename" : "Wedges@2.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,32 @@
{
"assets" : [
{
"size" : "1280x768",
"idiom" : "tv",
"filename" : "App Icon - App Store.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "400x240",
"idiom" : "tv",
"filename" : "App Icon.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "2320x720",
"idiom" : "tv",
"filename" : "Top Shelf Image Wide.imageset",
"role" : "top-shelf-image-wide"
},
{
"size" : "1920x720",
"idiom" : "tv",
"filename" : "Top Shelf Image.imageset",
"role" : "top-shelf-image"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,28 @@
{
"images" : [
{
"idiom" : "tv",
"filename" : "topshelf-wide@1.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"filename" : "topshelf-wide@2.png",
"scale" : "2x"
},
{
"idiom" : "tv-marketing",
"filename" : "topshelf-wide@1-1.png",
"scale" : "1x"
},
{
"idiom" : "tv-marketing",
"filename" : "topshelf-wide@2-1.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

@@ -0,0 +1,28 @@
{
"images" : [
{
"idiom" : "tv",
"filename" : "topshelf@1.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"filename" : "topshelf@2.png",
"scale" : "2x"
},
{
"idiom" : "tv-marketing",
"filename" : "topshelf@1-1.png",
"scale" : "1x"
},
{
"idiom" : "tv-marketing",
"filename" : "topshelf@2-1.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
@@ -0,0 +1,23 @@
{
"images" : [
{
"orientation" : "landscape",
"idiom" : "tv",
"filename" : "Simulator Screen Shot - Apple TV 4K - 2019-09-22 at 20.39.12.png",
"extent" : "full-screen",
"minimum-system-version" : "11.0",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "tv",
"extent" : "full-screen",
"minimum-system-version" : "9.0",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
+120
View File
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder.AppleTV.Storyboard" version="3.0" toolsVersion="17156" targetRuntime="AppleTV" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="pui-7y-JNH">
<device id="appleTV" appearance="dark"/>
<dependencies>
<deployment identifier="tvOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17126"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
<scene sceneID="7NP-T1-Ygj">
<objects>
<navigationController id="pui-7y-JNH" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" translucent="NO" id="Lgd-OS-TqA">
<rect key="frame" x="0.0" y="60" width="1920" height="145"/>
<autoresizingMask key="autoresizingMask"/>
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="barTintColor" white="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<textAttributes key="titleTextAttributes">
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="textShadowColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</textAttributes>
</navigationBar>
<connections>
<segue destination="vKn-MI-uG7" kind="relationship" relationship="rootViewController" id="1fT-7B-8G7"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="nZ4-Dr-2C6" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-4555" y="-1581"/>
</scene>
<!--Main Frame View Controller-->
<scene sceneID="duv-ef-Eeh">
<objects>
<collectionViewController id="vKn-MI-uG7" customClass="MainFrameViewController" sceneMemberID="viewController">
<collectionView key="view" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" prefetchingEnabled="YES" id="8P0-wP-bDe">
<rect key="frame" x="0.0" y="0.0" width="1920" height="875"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="75" minimumInteritemSpacing="50" id="m6l-TM-5FZ">
<size key="itemSize" width="300" height="400"/>
<size key="headerReferenceSize" width="0.0" height="0.0"/>
<size key="footerReferenceSize" width="0.0" height="0.0"/>
<inset key="sectionInset" minX="80" minY="80" maxX="80" maxY="80"/>
</collectionViewFlowLayout>
<cells>
<collectionViewCell opaque="NO" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="AppCell" id="gXq-M2-pFh">
<rect key="frame" x="80" y="80" width="300" height="400"/>
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
<rect key="frame" x="0.0" y="0.0" width="300" height="400"/>
<autoresizingMask key="autoresizingMask"/>
</view>
</collectionViewCell>
</cells>
<connections>
<outlet property="dataSource" destination="vKn-MI-uG7" id="BjL-nd-YvU"/>
<outlet property="delegate" destination="vKn-MI-uG7" id="U6n-Uv-2Do"/>
</connections>
</collectionView>
<navigationItem key="navigationItem" id="4ja-Go-cNV">
<barButtonItem key="leftBarButtonItem" title="Settings" id="Iii-CS-fMJ" userLabel="Settings"/>
</navigationItem>
<connections>
<outlet property="settingsButton" destination="Iii-CS-fMJ" id="32S-2R-fU5"/>
<segue destination="YUB-6u-B7f" kind="show" identifier="createStreamFrame" id="7lZ-Tj-a6a"/>
</connections>
</collectionViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="A1O-fY-fMS" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-650" y="-1869"/>
</scene>
<!--Loading Frame View Controller-->
<scene sceneID="lqn-qp-p7w">
<objects>
<viewController storyboardIdentifier="loadingFrame" modalTransitionStyle="crossDissolve" modalPresentationStyle="overCurrentContext" id="Ap5-6u-5Wo" customClass="LoadingFrameViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="AfI-ck-OwD"/>
<viewControllerLayoutGuide type="bottom" id="DNo-dy-ucM"/>
</layoutGuides>
<view key="view" clearsContextBeforeDrawing="NO" contentMode="center" id="TIa-HJ-DIv">
<rect key="frame" x="0.0" y="0.0" width="1920" height="1080"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" animating="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="WZH-wo-LWE" userLabel="Loading Spinner">
<rect key="frame" x="928" y="508" width="64" height="64"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
</activityIndicatorView>
</subviews>
<viewLayoutGuide key="safeArea" id="3xZ-qb-ZmB"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.5" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<connections>
<outlet property="loadingSpinner" destination="WZH-wo-LWE" id="eu5-eD-K5c"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="ArN-ya-eNp" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="66" y="297"/>
</scene>
<!--Stream Frame View Controller-->
<scene sceneID="Y8V-Ah-t3m">
<objects>
<viewController id="YUB-6u-B7f" customClass="StreamFrameViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="a9G-T3-mGR"/>
<viewControllerLayoutGuide type="bottom" id="6Xc-C7-Or1"/>
</layoutGuides>
<view key="view" multipleTouchEnabled="YES" contentMode="scaleToFill" id="CAm-nS-IFz">
<rect key="frame" x="0.0" y="0.0" width="1920" height="875"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<viewLayoutGuide key="safeArea" id="Vnr-7v-hDb"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="IJO-zp-f3d" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2606" y="-1233"/>
</scene>
</scenes>
</document>
+60
View File
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>VoidLink</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>GCSupportedGameControllers</key>
<array>
<dict>
<key>ProfileName</key>
<string>ExtendedGamepad</string>
</dict>
</array>
<key>GCSupportsControllerUserInteraction</key>
<true/>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Bluetooth access allows Moonlight to connect to Citrix X1 mice.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Bluetooth access allows Moonlight to connect to Citrix X1 mice.</string>
<key>NSBonjourServices</key>
<array>
<string>_nvstream._tcp</string>
</array>
<key>NSLocalNetworkUsageDescription</key>
<string>Moonlight uses the local network to connect to your gaming PC for streaming.</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arm64</string>
</array>
<key>UIUserInterfaceStyle</key>
<string>Dark</string>
</dict>
</plist>
+259
View File
@@ -0,0 +1,259 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Basic Configuration</string>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Title</key>
<string>Stream Resolution</string>
<key>Key</key>
<string>streamResolution</string>
<key>DefaultValue</key>
<string>1</string>
<key>Values</key>
<array>
<string>0</string>
<string>1</string>
<string>3</string>
<string>2</string>
</array>
<key>Titles</key>
<array>
<string>720p</string>
<string>1080p</string>
<string>1440p</string>
<string>4K</string>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Title</key>
<string>Frame Rate</string>
<key>Key</key>
<string>framerate</string>
<key>DefaultValue</key>
<string>60</string>
<key>Values</key>
<array>
<string>30</string>
<string>60</string>
</array>
<key>Titles</key>
<array>
<string>30 FPS</string>
<string>60 FPS</string>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Title</key>
<string>Bitrate</string>
<key>Key</key>
<string>bitrate</string>
<key>DefaultValue</key>
<string>20000</string>
<key>Titles</key>
<array>
<string>0.5 Mbps</string>
<string>1 Mbps</string>
<string>2 Mbps</string>
<string>5 Mbps</string>
<string>10 Mbps</string>
<string>20 Mbps</string>
<string>25 Mbps</string>
<string>50 Mbps</string>
<string>70 Mbps</string>
<string>80 Mbps</string>
<string>100 Mbps</string>
<string>150 Mbps</string>
</array>
<key>Values</key>
<array>
<string>500</string>
<string>1000</string>
<string>2000</string>
<string>5000</string>
<string>10000</string>
<string>20000</string>
<string>25000</string>
<string>50000</string>
<string>70000</string>
<string>80000</string>
<string>100000</string>
<string>150000</string>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Title</key>
<string>Audio Configuration</string>
<key>Key</key>
<string>audioConfig</string>
<key>DefaultValue</key>
<string>2</string>
<key>Titles</key>
<array>
<string>Stereo</string>
<string>LPCM 5.1</string>
<string>LPCM 7.1</string>
</array>
<key>Values</key>
<array>
<string>2</string>
<string>6</string>
<string>8</string>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Host Options</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>DefaultValue</key>
<false/>
<key>Title</key>
<string>Play Audio on Host PC</string>
<key>Key</key>
<string>audioOnPC</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Optimize Game Settings</string>
<key>Key</key>
<string>optimizeGames</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Input Options</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Automatic Game Controller Detection</string>
<key>Key</key>
<string>multipleControllers</string>
<key>DefaultValue</key>
<true/>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Swap A/B and X/Y Buttons</string>
<key>Key</key>
<string>swapABXYButtons</string>
<key>DefaultValue</key>
<false/>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Citrix X1 Mouse Support</string>
<key>Key</key>
<string>btMouseSupport</string>
<key>DefaultValue</key>
<false/>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Video Options</string>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Title</key>
<string>Preferred Codec</string>
<key>Key</key>
<string>preferredCodec</string>
<key>DefaultValue</key>
<string>0</string>
<key>Values</key>
<array>
<string>0</string>
<string>1</string>
<string>2</string>
</array>
<key>Titles</key>
<array>
<string>Auto</string>
<string>H.264</string>
<string>HEVC</string>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSMultiValueSpecifier</string>
<key>Title</key>
<string>Frame Pacing Preference</string>
<key>Key</key>
<string>useFramePacing</string>
<key>DefaultValue</key>
<string>0</string>
<key>Values</key>
<array>
<string>0</string>
<string>1</string>
</array>
<key>Titles</key>
<array>
<string>Lowest Latency</string>
<string>Smoothest Video</string>
</array>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Request HDR Video</string>
<key>Key</key>
<string>enableHdr</string>
<key>DefaultValue</key>
<false/>
</dict>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Troubleshooting</string>
</dict>
<dict>
<key>Type</key>
<string>PSToggleSwitchSpecifier</string>
<key>Title</key>
<string>Statistics Overlay</string>
<key>Key</key>
<string>statsOverlay</string>
<key>DefaultValue</key>
<false/>
</dict>
</array>
</dict>
</plist>
Binary file not shown.
+20
View File
@@ -0,0 +1,20 @@
//
// main.m
// Moonlight TV
//
// Created by Diego Waxemberg on 8/25/18.
// Copyright © 2018 Moonlight Game Streaming Project. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#define SDL_MAIN_HANDLED
#import <SDL.h>
int main(int argc, char * argv[]) {
@autoreleasepool {
SDL_SetMainReady();
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
+41 -2
View File
@@ -1,3 +1,42 @@
# VoidLink # VoidLink 已上架App Store.
# VoidLink is available on App Store
### [https://apps.apple.com/app/voidlink/id6747717070](https://apps.apple.com/cn/app/voidlink/id6747717070)
Fork of The-Fried-Fish/VoidLink-previously-moonlight-zwm (moonlight zwm) <br>
# 代码 Coding
- 代码提交在`Integration`分支。
- For latest coding commits, go to branch `Integration`.
<br>
# 关于VoidLink. About VoidLink
- 本项目最初基于开源项目 [moonlight-iOS] fork 而来。在此基础上,True砖家(True Zhuanjia)@ Bilibili 及其他社区开发者对项目进行了大量重构、重新设计与功能扩展,包括全新的用户界面和显著增强的功能特性。<br>我们对 moonlight-iOS 开发者的开创性工作表示衷心感谢。 <br><br>
- VoidLink was originally forked from the open-source project [moonlight-iOS], but has since been extensively reworked, redesigned, and expanded by True砖家 (True Zhuanjia) @ Bilibili and other community developers. These contributions include a completely new user interface and significant enhancements to the application's functionality.<br>We gratefully acknowledge the foundational work of the moonlight-iOS developers.
<br>
# App Store 分发一次性收费声明.
# Statement on One-Time App Store Distribution Fee.
- VoidLink 的 App Store 安装费用用于覆盖通过 Apple 框架进行安全可靠应用分发的成本。同时也支持项目维护者进行持续的开发、维护,以及公众用户访问并下载官方签名版本。感谢您对项目的支持,帮助我们持续改进和优化。<br><br>
- The App Store fee for VoidLink covers the cost of secure and trusted distribution using Apple's infrastructure. It supports ongoing development, maintenance, and access to the official signed build. Thank you for supporting the project and helping sustain ongoing improvements.
<br>
# 开发者B站号. Developer on Bilibili
如果你在用Bilibili, 请关注`True砖家`,了解该fork的最新消息。 <br>
If you are on Bilibili, subscribe `True砖家` to get the latest news of this fork: <br>
https://b23.tv/A0F9v7n
<br>
# 贡献者 Contributors
[@TrueZhuangJia](https://github.com/TrueZhuangJia) <br>
[@All contributors from moonlight-iOS](https://github.com/moonlight-stream/moonlight-ios/graphs/contributors) <br>
[@stefanilijev97](https://github.com/stefanilijev97/stefanilijev97) <br>
[@Acaki](https://github.com/Acaki) <br>
[@seastwood](https://github.com/seastwood) <br>
[@Danos0100](https://github.com/Danos0100) <br>
[@xzzpig](https://github.com/xzzpig) <br>
[@King0fSpace](https://github.com/King0fSpace) <br>
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>
<true/>
</dict>
</plist>
@@ -0,0 +1,51 @@
{
"originHash" : "d1fc50a28d75017e32553df2b233f8a7e2cf1542da32728ce6722b200f745608",
"pins" : [
{
"identity" : "cocoalumberjack",
"kind" : "remoteSourceControl",
"location" : "https://github.com/CocoaLumberjack/CocoaLumberjack.git",
"state" : {
"revision" : "a9ed4b6f9bdedce7d77046f43adfb8ce1fd54114",
"version" : "3.9.0"
}
},
{
"identity" : "openssl-package",
"kind" : "remoteSourceControl",
"location" : "https://github.com/krzyzanowskim/OpenSSL-Package.git",
"state" : {
"revision" : "b9eb055fdf73e595cb4b9f665d13dc85975bf80a",
"version" : "3.3.2000"
}
},
{
"identity" : "svgkit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/SVGKit/SVGKit.git",
"state" : {
"revision" : "58152b9f7c85eab239160b36ffdfd364aa43d666",
"version" : "3.0.0"
}
},
{
"identity" : "swift-collections",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-collections.git",
"state" : {
"revision" : "c1805596154bb3a265fd91b8ac0c4433b4348fb0",
"version" : "1.2.0"
}
},
{
"identity" : "swift-log",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-log",
"state" : {
"revision" : "bc386b95f2a16ccd0150a8235e7c69eab2b866ca",
"version" : "1.8.0"
}
}
],
"version" : 3
}
+173
View File
@@ -0,0 +1,173 @@
//
// AboutView.swift
// VoidLink
//
// Created by True砖家 on 5/18/25.
// Copyright © 2025 True砖家 @ Bilibili. All rights reserved.
//
import SwiftUI
@available(iOS 13.0, *)
public struct AboutView: View {
@Environment(\.presentationMode) var presentationMode
public var aboutVC:UIViewController
public var body: some View {
VStack(spacing: 7) {
// App 图标
Image(uiImage: UIImage(named: "AppIconMedium") ?? UIImage())
// .resizable()
.resizable(capInsets:EdgeInsets(top: 3.5, leading: 3.5, bottom: 3.5, trailing: 3.5))
.frame(width: 90, height: 90)
.clipShape(RoundedRectangle(cornerRadius: 28))
// App 名称
Text(Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? "App Name")
.font(.title)
.bold()
// 版本号
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
Text("Version \(version)")
.font(.subheadline)
.foregroundColor(.gray)
}
if Locale.preferredLanguages.first!.hasPrefix("zh-Hans") {
if #available(iOS 14.0, *) {
Text("闽ICP备17012590号-3A 主办单位:福州创图信息技术有限公司").font(.caption2)
.multilineTextAlignment(.center)
.lineLimit(nil)
.frame(maxWidth: 570) // ✅ 避免 Text 被拉得太宽无法换行
//.padding()
} else {
Text("闽ICP备17012590号-3A 主办单位:福州创图信息技术有限公司").font(.caption)
.multilineTextAlignment(.center)
.lineLimit(nil)
.frame(maxWidth: 570) // ✅ 避免 Text 被拉得太宽无法换行
//.padding()
}
}
// 说明文字
Text(LocalizationHelper.localizedString(forKey: "From the player community, to the player community."))
.multilineTextAlignment(.center)
.font(Font.caption.italic())
.lineLimit(nil)
.frame(maxWidth: 570) // ✅ 避免 Text 被拉得太宽无法换行
.padding()
Text(LocalizationHelper.localizedString(forKey: "VoidLink delivers better performance now!"))
.multilineTextAlignment(.center)
.font(Font.callout.bold())
.lineLimit(nil)
.frame(maxWidth: 570) // ✅ 避免 Text 被拉得太宽无法换行
// 链接按钮
if #available(iOS 14.0, *) {
HStack(spacing: 20) {
Link(LocalizationHelper.localizedString(forKey: "Learn more"), destination: URL(string: LocalizationHelper.localizedString(forKey: "supportLink"))!)
if #available(iOS 16, *) {
let languageCode = Locale.current.language.languageCode?.identifier
if languageCode == "zh" {
Link(LocalizationHelper.localizedString(forKey: "加入QQ群"), destination: URL(string: LocalizationHelper.localizedString(forKey: "https://qm.qq.com/q/uM51CYWLS2"))!)
}
}
if PublicUtils.isIPhone {
Link(LocalizationHelper.localizedString(forKey: "joinCommunity"), destination: URL(string: LocalizationHelper.localizedString(forKey: "communityLink"))!)
}
}
.padding(.top, 10)
if !PublicUtils.isIPhone {
Link(LocalizationHelper.localizedString(forKey: "joinCommunity"), destination: URL(string: LocalizationHelper.localizedString(forKey: "communityLink"))!)
}
HStack(spacing: 15) {
if #available(iOS 15.0, *) {
if PublicUtils.isIPad, PublicUtils.isIAPAddonAvailable {
Button(LocalizationHelper.localizedString(forKey: "I'm an artist")) {
IAPManager.checkPurchaseInfo(.PencilProPack) { info in
if !info.valid {
IAPManager.inAppPurchaseAction(viewController: self.aboutVC, product: .PencilProPack)
}
else {
AlertControllerUtil.showAlert(
in: self.aboutVC,
title: "",
message: LocalizationHelper.localizedString(forKey:"Drawing Toolkit already purchased"),
withCancel: false,
buttonTitle: LocalizationHelper.localizedString(forKey: "OK"),
countdown: 0)
}
}
}
.padding()
.background(Color.blue.opacity(1))
.foregroundColor(.white)
.frame(height: 46)
.cornerRadius(12)
.padding(.top, 10)
}
}
// OK 按钮
Button(LocalizationHelper.localizedString(forKey: "OK")) {
aboutVC.dismiss(animated:true)
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.frame(height: 46)
.cornerRadius(12)
.padding(.top, 10)
}
} else {
HStack(spacing: 20) {
Button(LocalizationHelper.localizedString(forKey: "Join us")) {
// 打开链接
if let url = URL(string: LocalizationHelper.localizedString(forKey: "supportLink")) {
UIApplication.shared.open(url)
}
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(12)
.frame(height: 33)
.frame(minWidth: 100)
/*
Button(LocalizationHelper.localizedString(forKey: "OK")) {
presentationMode.wrappedValue.dismiss()
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(12)
.frame(height: 33)
.frame(minWidth: 100)*/
Button(LocalizationHelper.localizedString(forKey: "OK")) {
aboutVC.dismiss(animated:true)
}
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(12)
.frame(height: 33)
}
.padding(.top, 10)
}
}
.padding()
}
}
+66
View File
@@ -0,0 +1,66 @@
//
// AboutViewController.swift
// VoidLink
//
// Created by Weimin on 2025/7/14.
// Copyright © 2025 True砖家 @ Bilibili. All rights reserved.
//
import SwiftUI
@available(iOS 13.0, *)
@objc class AboutViewController: UIViewController, ControllerUINavigationDelegate {
func getNavigationElements() -> [ControllerNavigationElement] {
var elements: [ControllerNavigationElement] = []
elements.append(ControllerNavigationElement(control:ControllerNavigator.radialMenuButtonPosition == .left ? .dpadRight : .a, action: "ok"))
return elements
}
func navigateByController(forward: Bool) {}
func navigateByController(downward: Bool) {}
func persistControllerNavigationHighlight() {}
func restoreControllerNavigationHighlight() {}
func restoreControllerNavigationHighlightAfterSettingsModeSwitch() {}
func uiWidgetActionForControllerNavigator(forward: Bool, from navigation: ControllerNavigationElement) {}
func uiButtonActionForControllerNavigator(pressed: Bool, from navigation: ControllerNavigationElement) {
if pressed, navigation.action == "ok" {
self.dismiss(animated: true)
}
}
override func viewDidLoad() {
super.viewDidLoad()
let hostingVC = UIHostingController(rootView: AboutView( aboutVC: self))
addChild(hostingVC)
hostingVC.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(hostingVC.view)
hostingVC.didMove(toParent: self)
NSLayoutConstraint.activate([
hostingVC.view.topAnchor.constraint(equalTo: view.topAnchor),
hostingVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
hostingVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
hostingVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
preferredContentSize = CGSize(width: 530, height: 430)
modalPresentationStyle = .formSheet
}
override func viewDidAppear(_ animated: Bool) {
ControllerNavigator.setUINavigationDelegate(self)
}
override func viewDidDisappear(_ animated: Bool) {
ControllerNavigator.restorePreviousUINavigationDelegate(ifCurrentDelegateIs: self)
}
}
func isIPhone() -> Bool {
return UIDevice.current.userInterfaceIdiom == .phone
}
+199
View File
@@ -0,0 +1,199 @@
//
// AlertControllerUtil.swift
// VoidLink
//
// Created by Weimin on 2025/10/6.
// Copyright © 2025 True砖家 @ Bilibili. All rights reserved.
//
import UIKit
@objc class AlertControllerUtil: NSObject {
private enum AlertTextRole {
case title
case message
}
private static func makeCountdownMessage(baseMessage: String?, remainingSeconds: Int) -> String {
let countdownText = "\(remainingSeconds)"
guard let baseMessage, !baseMessage.isEmpty else {
return countdownText
}
return "\(baseMessage)\n\n\(countdownText)"
}
@available(iOS 13.0, *)
private static func makeLeftAlignedAttributedText(_ text: String, role: AlertTextRole) -> NSAttributedString {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .left
paragraphStyle.lineBreakMode = .byWordWrapping
let font: UIFont
let color: UIColor
switch role {
case .title:
font = .preferredFont(forTextStyle: .headline)
color = .label
case .message:
font = .preferredFont(forTextStyle: .footnote)
color = .label
}
return NSAttributedString(
string: text,
attributes: [
.paragraphStyle: paragraphStyle,
.font: font,
.foregroundColor: color
]
)
}
private static func applyLeftAlignment(title: String?, message: String?) {
if #available(iOS 26.0, *) {
return
}
if #available(iOS 13.0, *) {
if let title, !title.isEmpty {
alertController.setValue(makeLeftAlignedAttributedText(title, role: .title), forKey: "attributedTitle")
}
if let message, !message.isEmpty {
alertController.setValue(makeLeftAlignedAttributedText(message, role: .message), forKey: "attributedMessage")
}
}
}
/// 类方法,直接在任何 UIViewController 上显示倒计时弹窗
/// - Parameters:
/// - viewController: 要显示弹窗的控制器
/// - title: 弹窗标题
/// - message: 弹窗内容
/// - buttonTitle: 按钮初始文字(倒计时结束后显示)
/// - countdown: 倒计时秒数
/// - completion: 点击确认或倒计时结束的回调
@objc public static var actionCancelled:Bool = false
@objc public static var alertController:UIAlertController = UIAlertController()
@objc public static var cancelButtonString:String = "Cancel"
@objc static var completion: (() -> Void)? = nil
@objc public static var autoCompletion:Bool = false
@objc public static var isCountingDown:Bool = false
@objc class func showAlert(
in viewController: UIViewController? = nil,
title: String?,
message: String?,
withCancel: Bool,
buttonTitle: String,
countdown: Int,
action: (() -> Void)? = nil,
completion: (() -> Void)? = nil
) {
var remainingSeconds = countdown
let originalMessage = message
var isAlertDismissed = false
AlertControllerUtil.completion = completion
guard let viewController = viewController else {return}
alertController = UIAlertController(
title: title,
message: (countdown > 0 && !autoCompletion) ? makeCountdownMessage(baseMessage: originalMessage, remainingSeconds: remainingSeconds) : message,
preferredStyle: .alert
)
applyLeftAlignment(
title: title,
message: (countdown > 0 && !autoCompletion) ? makeCountdownMessage(baseMessage: originalMessage, remainingSeconds: remainingSeconds) : message
)
let confirmAction = UIAlertAction(title: buttonTitle, style: .default) { _ in
isAlertDismissed = true
actionCancelled = false
completion?()
cancelButtonString = "Cancel"
}
let cancelAction = UIAlertAction(title: LocalizationHelper.localizedString(forKey: cancelButtonString), style: .cancel) { _ in
isAlertDismissed = true
actionCancelled = true
completion?()
cancelButtonString = "Cancel"
}
confirmAction.isEnabled = false
if withCancel {alertController.addAction(cancelAction)}
if buttonTitle != "" && !autoCompletion {alertController.addAction(confirmAction)}
if(countdown == 0) {
confirmAction.isEnabled = buttonTitle != ""
}
viewController.present(alertController, animated: true, completion: action)
isCountingDown = !autoCompletion && countdown > 0
if(countdown == 0) {return}
// 倒计时
let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.main)
timer.schedule(deadline: .now() + (autoCompletion ? 0.5 : 1.0), repeating: autoCompletion ? 0.1: 1.0, leeway: .milliseconds(50))
timer.setEventHandler {
guard !isAlertDismissed else {
timer.cancel()
return
}
remainingSeconds -= 1
if remainingSeconds <= 0 {
isCountingDown = false
isAlertDismissed = true
timer.cancel()
if autoCompletion {
alertController.message = originalMessage
applyLeftAlignment(title: title, message: originalMessage)
autoCompletion = false
completion?()
AlertControllerUtil.completion = nil
alertController.dismiss(animated: false)
return
}
if PublicUtils.isRunningOnMacAsiPadApp && buttonTitle != "" {
AlertControllerUtil.completion = nil
alertController.dismiss(animated: false) {
showAlert(
in: viewController,
title: title,
message: originalMessage,
withCancel: withCancel,
buttonTitle: buttonTitle,
countdown: 0,
action: nil,
completion: completion
)
}
return
}
confirmAction.isEnabled = true
alertController.message = originalMessage
applyLeftAlignment(title: title, message: originalMessage)
if #available(iOS 13.0, *) {
ControllerNavigator.setUINavigationDelegate(alertController)
}
} else {
if !autoCompletion {
let countdownMessage = makeCountdownMessage(baseMessage: originalMessage, remainingSeconds: remainingSeconds)
alertController.message = countdownMessage
applyLeftAlignment(title: title, message: countdownMessage)
}
}
}
timer.resume()
}
}
+13
View File
@@ -0,0 +1,13 @@
//
// AppCollectionView.h
// Moonlight
//
// Created by Diego Waxemberg on 9/30/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface AppCollectionView : UICollectionView
@end
+28
View File
@@ -0,0 +1,28 @@
//
// AppCollectionView.m
// Moonlight
//
// Created by Diego Waxemberg on 9/30/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
#import "AppCollectionView.h"
@implementation AppCollectionView
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
if ([view isKindOfClass:[UIButton class]]) {
return YES;
}
return [super touchesShouldCancelInContentView:view];
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
@end
+26
View File
@@ -0,0 +1,26 @@
//
// AppDelegate.h
// Moonlight
//
// Created by Diego Waxemberg on 1/17/14.
// Copyright (c) 2014 Moonlight Stream. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NSString *pcUuidToLoad;
@property (strong, nonatomic) void (^shortcutCompletionHandler)(BOOL);
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
- (NSURL*) getStoreURL;
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options API_AVAILABLE(ios(13.0));
@end
+268
View File
@@ -0,0 +1,268 @@
//
// AppDelegate.m
// Moonlight
//
// Created by Diego Waxemberg on 1/17/14.
// Copyright (c) 2014 Moonlight Stream. All rights reserved.
//
// Modified by True砖家 since 2024.7.12
// Copyright © 2024 True砖家 @ Bilibili. All rights reserved.
//
#import "AppDelegate.h"
#import "MainFrameViewController.h"
#import "VoidLink-Swift.h"
@implementation AppDelegate
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
static NSOperationQueue* mainQueue;
#if TARGET_OS_TV
static NSString* DB_NAME = @"Moonlight_tvOS.bin";
#else
static NSString* DB_NAME = @"Limelight_iOS.sqlite";
#endif
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options API_AVAILABLE(ios(13.0)){
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions API_AVAILABLE(ios(13.0)){
}
#if !TARGET_OS_TV
/*
// orietation limitatioin test
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
UIViewController *topController = window.rootViewController;
while (topController.presentedViewController) {
topController = topController.presentedViewController;
}
return [topController supportedInterfaceOrientations];
}
*/
/*
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
NSLog(@"orientation limit");
return UIInterfaceOrientationMaskLandscape;
}
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for command tool customization after application launch (works only when user default is nil)
[CommandManager presetDefaultCommands];
[GenericUtils installSegmentedControlPreviousSelectionTracking];
[IAPManager shared];
// For iOS 12 and below, we need to manually create the window
if (@available(iOS 13.0, *)) {
// Scene delegate will handle window creation
} else {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSString *storyboardName;
if (UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
storyboardName = @"iPad";
} else {
storyboardName = @"iPhone";
}
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
UIViewController *initialViewController = [storyboard instantiateInitialViewController];
self.window.rootViewController = initialViewController;
[self.window makeKeyAndVisible];
}
return YES;
}
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL succeeded))completionHandler {
_pcUuidToLoad = (NSString*)[shortcutItem.userInfo objectForKey:@"UUID"];
_shortcutCompletionHandler = completionHandler;
}
#endif
- (void)applicationWillResignActive:(UIApplication *)application
{
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application
{
// Saves changes in the application's managed object context before the application terminates.
[self saveContext];
}
- (void)saveContext
{
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
if (managedObjectContext != nil) {
[managedObjectContext performBlock:^{
if (![managedObjectContext hasChanges]) {
return;
}
NSError *error = nil;
if (![managedObjectContext save:&error]) {
Log(LOG_E, @"Critical database error: %@, %@", error, [error userInfo]);
}
#if TARGET_OS_TV
NSData* dbData = [NSData dataWithContentsOfURL:[[[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:DB_NAME]];
[[NSUserDefaults standardUserDefaults] setObject:dbData forKey:DB_NAME];
#endif
}];
}
}
#pragma mark - Core Data stack
// Returns the managed object context for the application.
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return _managedObjectModel;
}
// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSString* storeType;
#if TARGET_OS_TV
// Use a binary store for tvOS since we will need exclusive access to the file
// to serialize into NSUserDefaults.
storeType = NSBinaryStoreType;
#else
storeType = NSSQLiteStoreType;
#endif
// We must ensure the persistent store is ready to opened
[self preparePersistentStore];
if (![_persistentStoreCoordinator addPersistentStoreWithType:storeType configuration:nil URL:[self getStoreURL] options:options error:&error]) {
// Log the error
Log(LOG_E, @"Critical database error: %@, %@", error, [error userInfo]);
// Drop the database
[self dropDatabase];
// Try again
return [self persistentStoreCoordinator];
}
return _persistentStoreCoordinator;
}
#pragma mark - Application's Documents directory
// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
- (void) dropDatabase
{
// Delete the file on disk
[[NSFileManager defaultManager] removeItemAtURL:[self getStoreURL] error:nil];
#if TARGET_OS_TV
// Also delete the copy in the NSUserDefaults on tvOS
[[NSUserDefaults standardUserDefaults] removeObjectForKey:DB_NAME];
#endif
}
- (void) preparePersistentStore
{
#if TARGET_OS_TV
// On tvOS, we may need to inflate the DB from NSUserDefaults
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cacheDirectory = [paths objectAtIndex:0];
NSString *dbPath = [cacheDirectory stringByAppendingPathComponent:DB_NAME];
// Always prefer the on disk version
if (![[NSFileManager defaultManager] fileExistsAtPath:dbPath]) {
// If that is unavailable, inflate it from NSUserDefaults
NSData* data = [[NSUserDefaults standardUserDefaults] dataForKey:DB_NAME];
if (data != nil) {
Log(LOG_I, @"Inflating database from NSUserDefaults");
[data writeToFile:dbPath atomically:YES];
}
else {
Log(LOG_I, @"No database on disk or in NSUserDefaults");
}
}
else {
Log(LOG_I, @"Using cached database");
}
#endif
}
- (NSURL*) getStoreURL {
#if TARGET_OS_TV
// We use the cache folder to store our database on tvOS
return [[[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:DB_NAME];
#else
return [[self applicationDocumentsDirectory] URLByAppendingPathComponent:DB_NAME];
#endif
}
@end
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+27
View File
@@ -0,0 +1,27 @@
//
// CryptoManager.h
// Moonlight
//
// Created by Diego Waxemberg on 10/14/14.
// Copyright (c) 2014 Moonlight Stream. All rights reserved.
//
@interface CryptoManager : NSObject
+ (void) generateKeyPairUsingSSL;
+ (NSData*) readCertFromFile;
+ (NSData*) readKeyFromFile;
+ (NSData*) readP12FromFile;
+ (NSData*) getSignatureFromCert:(NSData*)cert;
+ (NSData*) pemToDer:(NSData*)pemCertBytes;
- (NSData*) createAESKeyFromSaltSHA1:(NSData*)saltedPIN;
- (NSData*) createAESKeyFromSaltSHA256:(NSData*)saltedPIN;
- (NSData*) SHA1HashData:(NSData*)data;
- (NSData*) SHA256HashData:(NSData*)data;
- (NSData*) aesEncrypt:(NSData*)data withKey:(NSData*)key;
- (NSData*) aesDecrypt:(NSData*)data withKey:(NSData*)key;
- (bool) verifySignature:(NSData *)data withSignature:(NSData*)signature andCert:(NSData*)cert;
- (NSData*) signData:(NSData*)data withKey:(NSData*)key;
@end
+308
View File
@@ -0,0 +1,308 @@
//
// CryptoManager.m
// Moonlight
//
// Created by Diego Waxemberg on 10/14/14.
// Copyright (c) 2014 Moonlight Stream. All rights reserved.
//
#import "CryptoManager.h"
#import "mkcert.h"
#include <openssl/sha.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
@implementation CryptoManager
static const int SHA1_HASH_LENGTH = 20;
static const int SHA256_HASH_LENGTH = 32;
static NSData* key = nil;
static NSData* cert = nil;
static NSData* p12 = nil;
- (NSData*) createAESKeyFromSaltSHA1:(NSData*)saltedPIN {
return [[self SHA1HashData:saltedPIN] subdataWithRange:NSMakeRange(0, 16)];
}
- (NSData*) createAESKeyFromSaltSHA256:(NSData*)saltedPIN {
return [[self SHA256HashData:saltedPIN] subdataWithRange:NSMakeRange(0, 16)];
}
- (NSData*) SHA1HashData:(NSData*)data {
unsigned char sha1[SHA1_HASH_LENGTH];
SHA1([data bytes], [data length], sha1);
NSData* bytes = [NSData dataWithBytes:sha1 length:sizeof(sha1)];
return bytes;
}
- (NSData*) SHA256HashData:(NSData*)data {
unsigned char sha256[SHA256_HASH_LENGTH];
SHA256([data bytes], [data length], sha256);
NSData* bytes = [NSData dataWithBytes:sha256 length:sizeof(sha256)];
return bytes;
}
- (NSData*) aesEncrypt:(NSData*)data withKey:(NSData*)key {
EVP_CIPHER_CTX* cipher;
int ciphertextLen;
cipher = EVP_CIPHER_CTX_new();
EVP_EncryptInit(cipher, EVP_aes_128_ecb(), [key bytes], NULL);
EVP_CIPHER_CTX_set_padding(cipher, 0);
NSMutableData* ciphertext = [NSMutableData dataWithLength:[data length]];
EVP_EncryptUpdate(cipher,
[ciphertext mutableBytes],
&ciphertextLen,
[data bytes],
(int)[data length]);
assert(ciphertextLen == [ciphertext length]);
EVP_CIPHER_CTX_free(cipher);
return ciphertext;
}
- (NSData*) aesDecrypt:(NSData*)data withKey:(NSData*)key {
EVP_CIPHER_CTX* cipher;
int plaintextLen;
cipher = EVP_CIPHER_CTX_new();
EVP_DecryptInit(cipher, EVP_aes_128_ecb(), [key bytes], NULL);
EVP_CIPHER_CTX_set_padding(cipher, 0);
NSMutableData* plaintext = [NSMutableData dataWithLength:[data length]];
EVP_DecryptUpdate(cipher,
[plaintext mutableBytes],
&plaintextLen,
[data bytes],
(int)[data length]);
assert(plaintextLen == [plaintext length]);
EVP_CIPHER_CTX_free(cipher);
return plaintext;
}
+ (NSData*) pemToDer:(NSData*)pemCertBytes {
X509* x509;
BIO* bio = BIO_new_mem_buf([pemCertBytes bytes], (int)[pemCertBytes length]);
x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
BIO_free(bio);
bio = BIO_new(BIO_s_mem());
i2d_X509_bio(bio, x509);
X509_free(x509);
BUF_MEM* mem;
BIO_get_mem_ptr(bio, &mem);
NSData* ret = [[NSData alloc] initWithBytes:mem->data length:mem->length];
BIO_free(bio);
return ret;
}
- (bool) verifySignature:(NSData *)data withSignature:(NSData*)signature andCert:(NSData*)cert {
X509* x509;
BIO* bio = BIO_new_mem_buf([cert bytes], (int)[cert length]);
x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
BIO_free(bio);
if (!x509) {
Log(LOG_E, @"Unable to parse certificate in memory");
return NULL;
}
EVP_PKEY* pubKey = X509_get_pubkey(x509);
EVP_MD_CTX *mdctx = NULL;
mdctx = EVP_MD_CTX_create();
EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, pubKey);
EVP_DigestVerifyUpdate(mdctx, [data bytes], [data length]);
int result = EVP_DigestVerifyFinal(mdctx, (unsigned char*)[signature bytes], [signature length]);
X509_free(x509);
EVP_PKEY_free(pubKey);
EVP_MD_CTX_destroy(mdctx);
return result > 0;
}
- (NSData *)signData:(NSData *)data withKey:(NSData *)key {
BIO* bio = BIO_new_mem_buf([key bytes], (int)[key length]);
EVP_PKEY* pkey;
pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL);
BIO_free(bio);
if (!pkey) {
Log(LOG_E, @"Unable to parse private key in memory!");
return NULL;
}
EVP_MD_CTX *mdctx = NULL;
mdctx = EVP_MD_CTX_create();
EVP_DigestSignInit(mdctx, NULL, EVP_sha256(), NULL, pkey);
EVP_DigestSignUpdate(mdctx, [data bytes], [data length]);
size_t slen;
EVP_DigestSignFinal(mdctx, NULL, &slen);
unsigned char* signature = malloc(slen);
int result = EVP_DigestSignFinal(mdctx, signature, &slen);
EVP_PKEY_free(pkey);
EVP_MD_CTX_destroy(mdctx);
if (result <= 0) {
free(signature);
return NULL;
}
NSData* signedData = [NSData dataWithBytes:signature length:slen];
free(signature);
return signedData;
}
+ (NSData*) readCryptoObject:(NSString*)item {
#if TARGET_OS_TV
return [[NSUserDefaults standardUserDefaults] dataForKey:item];
#else
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *file = [documentsDirectory stringByAppendingPathComponent:item];
return [NSData dataWithContentsOfFile:file];
#endif
}
+ (void) writeCryptoObject:(NSString*)item data:(NSData*)data {
#if TARGET_OS_TV
[[NSUserDefaults standardUserDefaults] setObject:data forKey:item];
#else
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *file = [documentsDirectory stringByAppendingPathComponent:item];
[data writeToFile:file atomically:NO];
#endif
}
+ (NSData*) readCertFromFile {
if (cert == nil) {
cert = [CryptoManager readCryptoObject:@"client.crt"];
}
return cert;
}
+ (NSData*) readP12FromFile {
if (p12 == nil) {
p12 = [CryptoManager readCryptoObject:@"client.p12"];
}
return p12;
}
+ (NSData*) readKeyFromFile {
if (key == nil) {
key = [CryptoManager readCryptoObject:@"client.key"];
}
return key;
}
+ (bool) keyPairExists {
bool keyFileExists = [CryptoManager readCryptoObject:@"client.key"] != nil;
bool p12FileExists = [CryptoManager readCryptoObject:@"client.p12"] != nil;
bool certFileExists = [CryptoManager readCryptoObject:@"client.crt"] != nil;
return keyFileExists && p12FileExists && certFileExists;
}
+ (NSData *)getSignatureFromCert:(NSData *)cert {
BIO* bio = BIO_new_mem_buf([cert bytes], (int)[cert length]);
X509* x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
BIO_free(bio);
if (!x509) {
Log(LOG_E, @"Unable to parse certificate in memory!");
return NULL;
}
#if (OPENSSL_VERSION_NUMBER < 0x10002000L)
ASN1_BIT_STRING *asnSignature = x509->signature;
#elif (OPENSSL_VERSION_NUMBER < 0x10100000L)
ASN1_BIT_STRING *asnSignature;
X509_get0_signature(&asnSignature, NULL, x509);
#else
const ASN1_BIT_STRING *asnSignature;
X509_get0_signature(&asnSignature, NULL, x509);
#endif
NSData* sig = [NSData dataWithBytes:asnSignature->data length:asnSignature->length];
X509_free(x509);
return sig;
}
+ (NSData*)getKeyFromCertKeyPair:(CertKeyPair*)certKeyPair {
BIO* bio = BIO_new(BIO_s_mem());
PEM_write_bio_PrivateKey_traditional(bio, certKeyPair->pkey, NULL, NULL, 0, NULL, NULL);
BUF_MEM* mem;
BIO_get_mem_ptr(bio, &mem);
NSData* data = [NSData dataWithBytes:mem->data length:mem->length];
BIO_free(bio);
return data;
}
+ (NSData*)getP12FromCertKeyPair:(CertKeyPair*)certKeyPair {
BIO* bio = BIO_new(BIO_s_mem());
i2d_PKCS12_bio(bio, certKeyPair->p12);
BUF_MEM* mem;
BIO_get_mem_ptr(bio, &mem);
NSData* data = [NSData dataWithBytes:mem->data length:mem->length];
BIO_free(bio);
return data;
}
+ (NSData*)getCertFromCertKeyPair:(CertKeyPair*)certKeyPair {
BIO* bio = BIO_new(BIO_s_mem());
PEM_write_bio_X509(bio, certKeyPair->x509);
BUF_MEM* mem;
BIO_get_mem_ptr(bio, &mem);
NSData* data = [NSData dataWithBytes:mem->data length:mem->length];
BIO_free(bio);
return data;
}
+ (void) generateKeyPairUsingSSL {
static dispatch_once_t pred;
dispatch_once(&pred, ^{
if (![CryptoManager keyPairExists]) {
Log(LOG_I, @"Generating Certificate... ");
CertKeyPair certKeyPair = generateCertKeyPair();
NSData* certData = [CryptoManager getCertFromCertKeyPair:&certKeyPair];
NSData* p12Data = [CryptoManager getP12FromCertKeyPair:&certKeyPair];
NSData* keyData = [CryptoManager getKeyFromCertKeyPair:&certKeyPair];
freeCertKeyPair(certKeyPair);
[CryptoManager writeCryptoObject:@"client.crt" data:certData];
[CryptoManager writeCryptoObject:@"client.p12" data:p12Data];
[CryptoManager writeCryptoObject:@"client.key" data:keyData];
Log(LOG_I, @"Certificate created");
}
});
}
@end
+13
View File
@@ -0,0 +1,13 @@
//
// IdManager.h
// Moonlight
//
// Created by Diego Waxemberg on 10/31/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
@interface IdManager : NSObject
+ (NSString*) getUniqueId;
@end
+32
View File
@@ -0,0 +1,32 @@
//
// IdManager.m
// Moonlight
//
// Created by Diego Waxemberg on 10/31/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
#import "IdManager.h"
#import "DataManager.h"
@implementation IdManager
+ (NSString*) getUniqueId {
DataManager* dataMan = [[DataManager alloc] init];
NSString* uniqueId = [dataMan getUniqueId];
if (uniqueId == nil) {
uniqueId = [IdManager generateUniqueId];
[dataMan updateUniqueId:uniqueId];
Log(LOG_I, @"No UUID found. Generated new UUID: %@", uniqueId);
}
return uniqueId;
}
+ (NSString*) generateUniqueId {
UInt64 uuidLong = ((UInt64) arc4random() << 32) | arc4random();
return [NSString stringWithFormat:@"%016llx", uuidLong];
}
@end
+97
View File
@@ -0,0 +1,97 @@
#include "mkcert.h"
#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <OpenSSL/provider.h>
#include <OpenSSL/rsa.h>
#include <openssl/x509.h>
#include <OpenSSL/rand.h>
static const int NUM_BITS = 2048;
static const int SERIAL = 0;
static const int NUM_YEARS = 20;
void mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int years) {
X509* cert = X509_new();
EVP_PKEY_CTX* ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
EVP_PKEY_keygen_init(ctx);
EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits);
// pk must be initialized on input
EVP_PKEY* pk = NULL;
EVP_PKEY_keygen(ctx, &pk);
EVP_PKEY_CTX_free(ctx);
X509_set_version(cert, 2);
ASN1_INTEGER_set(X509_get_serialNumber(cert), serial);
#if OPENSSL_VERSION_NUMBER < 0x10100000L
X509_gmtime_adj(X509_get_notBefore(cert), 0);
X509_gmtime_adj(X509_get_notAfter(cert), 60 * 60 * 24 * 365 * years);
#else
ASN1_TIME* before = ASN1_STRING_dup(X509_get0_notBefore(cert));
ASN1_TIME* after = ASN1_STRING_dup(X509_get0_notAfter(cert));
X509_gmtime_adj(before, 0);
X509_gmtime_adj(after, 60 * 60 * 24 * 365 * years);
X509_set1_notBefore(cert, before);
X509_set1_notAfter(cert, after);
ASN1_STRING_free(before);
ASN1_STRING_free(after);
#endif
X509_set_pubkey(cert, pk);
X509_NAME* name = X509_get_subject_name(cert);
X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,
(const unsigned char*)"NVIDIA GameStream Client",
-1, -1, 0);
X509_set_issuer_name(cert, name);
X509_sign(cert, pk, EVP_sha256());
*x509p = cert;
*pkeyp = pk;
}
struct CertKeyPair generateCertKeyPair(void) {
X509 *x509 = NULL;
EVP_PKEY *pkey = NULL;
PKCS12 *p12 = NULL;
mkcert(&x509, &pkey, NUM_BITS, SERIAL, NUM_YEARS);
char* pass = "limelight";
p12 = PKCS12_create(pass,
"GameStream",
pkey,
x509,
NULL,
NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
-1, // disable certificate encryption
2048,
-1, // disable the automatic MAC
0);
// MAC it ourselves with SHA1 since iOS refuses to load anything else.
PKCS12_set_mac(p12, pass, -1, NULL, 0, 1, EVP_sha1());
if (p12 == NULL) {
printf("Error generating a valid PKCS12 certificate.\n");
}
return (CertKeyPair){x509, pkey, p12};
}
void freeCertKeyPair(struct CertKeyPair certKeyPair) {
X509_free(certKeyPair.x509);
EVP_PKEY_free(certKeyPair.pkey);
PKCS12_free(certKeyPair.p12);
}
+25
View File
@@ -0,0 +1,25 @@
//
// mkcert.h
// Moonlight
//
// Created by Diego Waxemberg on 10/16/14.
// Copyright (c) 2014 Moonlight Stream. All rights reserved.
//
#ifndef Limelight_mkcert_h
#define Limelight_mkcert_h
#include <sys/_types/_time_t.h>
#include <openssl/x509v3.h>
#include <openssl/pkcs12.h>
typedef struct CertKeyPair {
X509 *x509;
EVP_PKEY *pkey;
PKCS12 *p12;
} CertKeyPair;
struct CertKeyPair generateCertKeyPair(void);
void freeCertKeyPair(CertKeyPair);
#endif
+177
View File
@@ -0,0 +1,177 @@
//
// DataManager.h
// Moonlight
//
// Created by Diego Waxemberg on 10/28/14.
// Copyright (c) 2014 Moonlight Stream. All rights reserved.
//
// Modified by True砖家 since 2024.6.1
// Copyright © 2024 True砖家 @ Bilibili. All rights reserved.
//
#import "AppDelegate.h"
#import "TemporaryHost.h"
#import "TemporaryApp.h"
#import "TemporarySettings.h"
@interface DataManager : NSObject
typedef NS_ENUM(NSInteger, ControllerGyroSwitchMode) {
ControllerGyroSwitchDisabled,
ControllerGyroSwitchPressToToggle,
ControllerGyroSwitchHoldDown
};
typedef NS_ENUM(NSInteger, TouchMode) {
RelativeTouch,
NativeTouch,
AbsoluteTouch,
TouchDisabled,
NativeTouchOnly
};
typedef NS_ENUM(NSInteger, TouchEventPriorityEnum) {
AsyncNativeTouchOff,
EqualPriority,
TouchDownPriority,// deprecated by GUI
TouchMovePriority// deprecated by GUI
};
typedef NS_ENUM(NSInteger, GyroMode) {
GyroModeOff,
GyroModeAuto,
AlwaysDevice,
AlwaysController
};
typedef NS_ENUM(NSInteger, HapticEnginePreference) {
HapticEngineAuto,
RumbleDevice,
LeftRightSwapped,
RumbleOff
};
typedef NS_ENUM(NSInteger, ControllerMouseStick) {
LeftStickToMouse,
RightStickToMouse,
};
typedef NS_ENUM(NSInteger, FramePacingMode) {
FramePacingModeOff,
FramePacingModeLegacy,
FramePacingModeQueue,
FramePacingModeInterpolation
};
typedef NS_ENUM(NSInteger, SettingsMenuMode) {
AllSettings,
FavoriteSettings,
RemoveSettingItem,
};
typedef NS_ENUM(NSInteger, WidgetSizeTransition) {
keepWidgetSize,
transitionWithOrientation,
};
typedef NS_ENUM(NSInteger, PencilTickMode) {
PencilTickDisabled,
ManualTick
};
- (void) saveSettings:(Settings*)settings
withBitrate:(NSInteger)bitrate
framerate:(NSInteger)framerate
height:(NSInteger)height
width:(NSInteger)width
audioConfig:(NSInteger)audioConfig
onscreenControls:(NSInteger)onscreenControls
gyroMode:(NSInteger)gyroMode
emulatedControllerType:(NSInteger)emulatedControllerType
keyboardToggleFingers:(NSInteger)keyboardToggleFingers
oscLayoutToolFingers:(NSInteger)oscLayoutToolFingers
slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge
slideToSettingsDistance:(CGFloat)slideToSettingsDistance
pointerVelocityModeDivider:(CGFloat)pointerVelocityModeDivider
touchPointerVelocityFactor:(CGFloat)touchPointerVelocityFactor
mousePointerVelocityFactor:(CGFloat)mousePointerVelocityFactor
gyroSensitivity:(CGFloat)gyroSensitivity
localVolume:(CGFloat)localVolume
micVolume:(CGFloat)micVolume
touchMoveEventInterval:(NSInteger)touchMoveEventInterval
reverseMouseWheelDirection:(BOOL)reverseMouseWheelDirection
asyncNativeTouchPriority:(NSInteger)asyncNativeTouchPriority
liftStreamViewForKeyboard:(BOOL)liftStreamViewForKeyboard
showKeyboardToolbar:(BOOL)showKeyboardToolbar
optimizeGames:(BOOL)optimizeGames
multiController:(BOOL)multiController
buttonVisualFeedback:(BOOL)buttonVisualFeedback
touchPointTracking:(BOOL)touchPointTracking
swapABXYButtons:(BOOL)swapABXYButtons
audioOnPC:(BOOL)audioOnPC
redirectMic:(BOOL)redirectMic
useBuiltinMic:(BOOL)useBuiltinMic
preferredCodec:(uint32_t)preferredCodec
enableYUV444:(BOOL)enableYUV444
enablePIP:(BOOL)enablePIP
fullColorRange:(BOOL)fullColorRange
enableHdr:(BOOL)enableHdr
btMouseSupport:(BOOL)btMouseSupport
// absoluteTouchMode:(BOOL)absoluteTouchMode
touchMode:(NSInteger)touchMode
statsOverlayLevel:(NSInteger)statsOverlayLevel
statsOverlayEnabled:(BOOL)statsOverlayEnabled
unlockDisplayOrientation:(BOOL)unlockDisplayOrientation
resolutionSelected:(NSInteger)resolutionSelected
externalDisplayMode:(NSInteger)externalDisplayMode
localMousePointerMode:(NSInteger)localMousePointerMode
frameQueueSize:(NSInteger)frameQueueSize
enableGraphs:(BOOL)enableGraphs
graphOpacity:(NSInteger)graphOpacity
renderingBackend:(NSInteger)renderingBackend
framePacingMode:(NSInteger)framePacingMode
interpolationMaximumDimension:(NSInteger)interpolationMaximumDimension
interpolationMaximumPixelCount:(NSInteger)interpolationMaximumPixelCount
streamDimensionScale:(CGFloat)streamDimensionScale
sendDummyEvent:(BOOL)sendDummyEvent
rememberFoldState:(BOOL)rememberFoldState
singleTapSensitivy:(CGFloat)singleTapSensitivy
hapticEngine:(NSInteger)hapticEngine
edgeSlidingSensitivity:(CGFloat)edgeSlidingSensitivity
audioEngine:(NSInteger)audioEngine
delayLeftClick:(BOOL)delayLeftClick
duckOtherApps:(BOOL)duckOtherApps
muteInBackground:(BOOL)muteInBackground
relativeTouchSlideThreshold:(CGFloat)relativeTouchSlideThreshold
enablePinch:(BOOL)enablePinch
scrollSensitivity:(CGFloat)scrollSensitivity
pinchSensitivity:(CGFloat)pinchSensitivity
ctrlDownForPinch:(BOOL)ctrlDownForPinch
leftClickDelayMs:(CGFloat)leftClickDelayMs
settingsMenuOffset:(CGFloat)settingsMenuOffset
passthroughGestures:(BOOL)passthroughGestures
enableControllerNavigation:(BOOL)mapControllerToMouse
controllerMousePointerVelocity:(CGFloat)controllerMousePointerVelocity
controllerMouseExpo:(CGFloat)controllerMouseExpo
controllerGyroSwitchMode:(NSInteger)controllerGyroSwitchMode
enableFrameTimebase:(BOOL)enableFrameTimebase
asyncFrameDequeue:(BOOL)asyncFrameDequeue
sdrPerformanceWorkaround:(BOOL)sdrPerformanceWorkaround
softKeyboardHeight:(CGFloat)softKeyboardHeight
globeAsEscape:(BOOL)globeAsEscape
streamingRadialMenuDelay:(CGFloat)streamingRadialMenuDelay
backgroundSessionTimer:(NSInteger)backgroundSessionTimer;
- (NSArray*) getHosts;
- (void) updateHost:(TemporaryHost*)host;
- (void) updateAppsForExistingHost:(TemporaryHost *)host;
- (void) removeHost:(TemporaryHost*)host;
- (void) removeApp:(TemporaryApp*)app;
- (Settings*) retrieveSettings;
- (void) saveData;
- (TemporarySettings*) getSettings;
- (void) updateUniqueId:(NSString*)uniqueId;
- (NSString*) getUniqueId;
@end
+378
View File
@@ -0,0 +1,378 @@
//
// DataManager.m
// Moonlight
//
// Created by Diego Waxemberg on 10/28/14.
// Copyright (c) 2014 Moonlight Stream. All rights reserved.
//
// Modified by True砖家 since 2024.6.1
// Copyright © 2024 True砖家 @ Bilibili. All rights reserved.
//
#import "DataManager.h"
#import "TemporaryApp.h"
#import "TemporarySettings.h"
@implementation DataManager {
NSManagedObjectContext *_managedObjectContext;
AppDelegate *_appDelegate;
}
- (id) init {
self = [super init];
// HACK: Avoid calling [UIApplication delegate] off the UI thread to keep
// Main Thread Checker happy.
if ([NSThread isMainThread]) {
_appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
}
else {
dispatch_sync(dispatch_get_main_queue(), ^{
self->_appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
});
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setParentContext:[_appDelegate managedObjectContext]];
return self;
}
- (void) updateUniqueId:(NSString*)uniqueId {
[_managedObjectContext performBlockAndWait:^{
[self retrieveSettings].uniqueId = uniqueId;
[self saveData];
}];
}
- (NSString*) getUniqueId {
__block NSString *uid;
[_managedObjectContext performBlockAndWait:^{
uid = [self retrieveSettings].uniqueId;
}];
return uid;
}
- (void) saveSettings:(Settings*)settings
withBitrate:(NSInteger)bitrate
framerate:(NSInteger)framerate
height:(NSInteger)height
width:(NSInteger)width
audioConfig:(NSInteger)audioConfig
onscreenControls:(NSInteger)onscreenControls
gyroMode:(NSInteger)gyroMode
emulatedControllerType:(NSInteger)emulatedControllerType
keyboardToggleFingers:(NSInteger)keyboardToggleFingers
oscLayoutToolFingers:(NSInteger)oscLayoutToolFingers
slideToSettingsScreenEdge:(NSInteger)slideToSettingsScreenEdge
slideToSettingsDistance:(CGFloat)slideToSettingsDistance
pointerVelocityModeDivider:(CGFloat)pointerVelocityModeDivider
touchPointerVelocityFactor:(CGFloat)touchPointerVelocityFactor
mousePointerVelocityFactor:(CGFloat)mousePointerVelocityFactor
gyroSensitivity:(CGFloat)gyroSensitivity
localVolume:(CGFloat)localVolume
micVolume:(CGFloat)micVolume
touchMoveEventInterval:(NSInteger)touchMoveEventInterval
reverseMouseWheelDirection:(BOOL)reverseMouseWheelDirection
asyncNativeTouchPriority:(NSInteger)asyncNativeTouchPriority
liftStreamViewForKeyboard:(BOOL)liftStreamViewForKeyboard
showKeyboardToolbar:(BOOL)showKeyboardToolbar
optimizeGames:(BOOL)optimizeGames
multiController:(BOOL)multiController
buttonVisualFeedback:(BOOL)buttonVisualFeedback
touchPointTracking:(BOOL)touchPointTracking
swapABXYButtons:(BOOL)swapABXYButtons
audioOnPC:(BOOL)audioOnPC
redirectMic:(BOOL)redirectMic
useBuiltinMic:(BOOL)useBuiltinMic
preferredCodec:(uint32_t)preferredCodec
enableYUV444:(BOOL)enableYUV444
enablePIP:(BOOL)enablePIP
fullColorRange:(BOOL)fullColorRange
enableHdr:(BOOL)enableHdr
btMouseSupport:(BOOL)btMouseSupport
// absoluteTouchMode:(BOOL)absoluteTouchMode
touchMode:(NSInteger)touchMode
statsOverlayLevel:(NSInteger)statsOverlayLevel
statsOverlayEnabled:(BOOL)statsOverlayEnabled
unlockDisplayOrientation:(BOOL)unlockDisplayOrientation
resolutionSelected:(NSInteger)resolutionSelected
externalDisplayMode:(NSInteger)externalDisplayMode
localMousePointerMode:(NSInteger)localMousePointerMode
frameQueueSize:(NSInteger)frameQueueSize
enableGraphs:(BOOL)enableGraphs
graphOpacity:(NSInteger)graphOpacity
renderingBackend:(NSInteger)renderingBackend
framePacingMode:(NSInteger)framePacingMode
interpolationMaximumDimension:(NSInteger)interpolationMaximumDimension
interpolationMaximumPixelCount:(NSInteger)interpolationMaximumPixelCount
streamDimensionScale:(CGFloat)streamDimensionScale
sendDummyEvent:(BOOL)sendDummyEvent
rememberFoldState:(BOOL)rememberFoldState
singleTapSensitivy:(CGFloat)singleTapSensitivy
hapticEngine:(NSInteger)hapticEngine
edgeSlidingSensitivity:(CGFloat)edgeSlidingSensitivity
audioEngine:(NSInteger)audioEngine
delayLeftClick:(BOOL)delayLeftClick
duckOtherApps:(BOOL)duckOtherApps
muteInBackground:(BOOL)muteInBackground
relativeTouchSlideThreshold:(CGFloat)relativeTouchSlideThreshold
enablePinch:(BOOL)enablePinch
scrollSensitivity:(CGFloat)scrollSensitivity
pinchSensitivity:(CGFloat)pinchSensitivity
ctrlDownForPinch:(BOOL)ctrlDownForPinch
leftClickDelayMs:(CGFloat)leftClickDelayMs
settingsMenuOffset:(CGFloat)settingsMenuOffset
passthroughGestures:(BOOL)passthroughGestures
enableControllerNavigation:(BOOL)enableControllerNavigation
controllerMousePointerVelocity:(CGFloat)controllerMousePointerVelocity
controllerMouseExpo:(CGFloat)controllerMouseExpo
controllerGyroSwitchMode:(NSInteger)controllerGyroSwitchMode
enableFrameTimebase:(BOOL)enableFrameTimebase
asyncFrameDequeue:(BOOL)asyncFrameDequeue
sdrPerformanceWorkaround:(BOOL)sdrPerformanceWorkaround
softKeyboardHeight:(CGFloat)softKeyboardHeight
globeAsEscape:(BOOL)globeAsEscape
streamingRadialMenuDelay:(CGFloat)streamingRadialMenuDelay
backgroundSessionTimer:(NSInteger)backgroundSessionTimer{
__block Settings* settingsToSave = settings;
[_managedObjectContext performBlockAndWait:^{
if(!settingsToSave) settingsToSave = [self retrieveSettings];
settingsToSave.framerate = [NSNumber numberWithInteger:framerate];
settingsToSave.bitrate = [NSNumber numberWithInteger:bitrate];
settingsToSave.height = [NSNumber numberWithInteger:height];
settingsToSave.width = [NSNumber numberWithInteger:width];
settingsToSave.audioConfig = [NSNumber numberWithInteger:audioConfig];
settingsToSave.onscreenControls = [NSNumber numberWithInteger:onscreenControls];
settingsToSave.gyroMode = [NSNumber numberWithInteger:gyroMode];
settingsToSave.emulatedControllerType = [NSNumber numberWithInteger:emulatedControllerType];
settingsToSave.keyboardToggleFingers = [NSNumber numberWithInteger:(uint16_t)keyboardToggleFingers];
settingsToSave.oscLayoutToolFingers = [NSNumber numberWithInteger:(uint16_t)oscLayoutToolFingers];
settingsToSave.slideToSettingsScreenEdge = [NSNumber numberWithInteger:(uint32_t)slideToSettingsScreenEdge];
settingsToSave.slideToSettingsDistance = [NSNumber numberWithFloat:slideToSettingsDistance];
settingsToSave.pointerVelocityModeDivider = [NSNumber numberWithFloat:pointerVelocityModeDivider];
settingsToSave.touchPointerVelocityFactor = [NSNumber numberWithFloat:touchPointerVelocityFactor];
settingsToSave.mousePointerVelocityFactor = [NSNumber numberWithFloat:mousePointerVelocityFactor];
settingsToSave.gyroSensitivity = [NSNumber numberWithFloat:gyroSensitivity];
settingsToSave.localVolume = [NSNumber numberWithFloat:localVolume];
settingsToSave.micVolume = [NSNumber numberWithFloat:micVolume];
settingsToSave.touchMoveEventInterval = [NSNumber numberWithInteger:touchMoveEventInterval];
settingsToSave.reverseMouseWheelDirection = reverseMouseWheelDirection;
settingsToSave.asyncNativeTouchPriority = [NSNumber numberWithInteger:asyncNativeTouchPriority];
settingsToSave.liftStreamViewForKeyboard = liftStreamViewForKeyboard;
settingsToSave.showKeyboardToolbar = showKeyboardToolbar;
settingsToSave.optimizeGames = optimizeGames;
settingsToSave.multiController = multiController;
settingsToSave.buttonVisualFeedback = buttonVisualFeedback;
settingsToSave.touchPointTracking = touchPointTracking;
settingsToSave.swapABXYButtons = swapABXYButtons;
settingsToSave.playAudioOnPC = audioOnPC;
settingsToSave.redirectMic = redirectMic;
settingsToSave.useBuiltinMic = useBuiltinMic;
settingsToSave.preferredCodec = preferredCodec;
settingsToSave.enableYUV444 = enableYUV444;
settingsToSave.sdrPerformanceWorkaround = sdrPerformanceWorkaround;
settingsToSave.enablePIP = enablePIP;
settingsToSave.fullColorRange = fullColorRange;
settingsToSave.enableHdr = enableHdr;
settingsToSave.btMouseSupport = btMouseSupport;
// settingsToSave.absoluteTouchMode = absoluteTouchMode;
settingsToSave.touchMode = [NSNumber numberWithInteger:(uint16_t)touchMode];
settingsToSave.statsOverlayEnabled = statsOverlayEnabled;
settingsToSave.statsOverlayLevel = [NSNumber numberWithInteger:(uint16_t)statsOverlayLevel];
settingsToSave.unlockDisplayOrientation = unlockDisplayOrientation;
settingsToSave.resolutionSelected = [NSNumber numberWithInteger:resolutionSelected];
settingsToSave.externalDisplayMode = [NSNumber numberWithInteger:externalDisplayMode];
settingsToSave.localMousePointerMode = [NSNumber numberWithInteger:localMousePointerMode];
settingsToSave.backroundSessionTimer = [NSNumber numberWithInteger:backgroundSessionTimer];
settingsToSave.frameQueueSize = [NSNumber numberWithInteger:frameQueueSize];
settingsToSave.enableFrameTimebase = enableFrameTimebase;
settingsToSave.asyncFrameDequeue = asyncFrameDequeue;
settingsToSave.enableGraphs = enableGraphs;
settingsToSave.graphOpacity = [NSNumber numberWithInteger:graphOpacity];
settingsToSave.renderingBackend = [NSNumber numberWithInteger:renderingBackend];
settingsToSave.framePacingMode = [NSNumber numberWithInteger:framePacingMode];
settingsToSave.interpolationMaximumDimension = [NSNumber numberWithInteger:interpolationMaximumDimension];
settingsToSave.interpolationMaximumPixelCount = [NSNumber numberWithInteger:interpolationMaximumPixelCount];
settingsToSave.streamDimensionScale = [NSNumber numberWithDouble:streamDimensionScale];
settingsToSave.sendDummyEvent = sendDummyEvent;
settingsToSave.singleTapSensitivity = [NSNumber numberWithDouble:singleTapSensitivy];
settingsToSave.hapticEngine = [NSNumber numberWithInteger:hapticEngine];
settingsToSave.edgeSlidingSensitivity = [NSNumber numberWithFloat:edgeSlidingSensitivity];
settingsToSave.audioEngine = [NSNumber numberWithInteger:audioEngine];
settingsToSave.delayLeftClick = delayLeftClick;
settingsToSave.duckOtherApps = duckOtherApps;
settingsToSave.muteInBackground = muteInBackground;
settingsToSave.relativeTouchSlideThreshold = [NSNumber numberWithFloat:relativeTouchSlideThreshold];
settingsToSave.enablePinch = enablePinch;
settingsToSave.scrollSensitivity = [NSNumber numberWithFloat:scrollSensitivity];
settingsToSave.pinchSensitivity = [NSNumber numberWithFloat:pinchSensitivity];
settingsToSave.ctrlDownForPinch = ctrlDownForPinch;
settingsToSave.leftClickDelayMs = [NSNumber numberWithFloat:leftClickDelayMs];
settingsToSave.settingsMenuOffset = [NSNumber numberWithFloat:settingsMenuOffset];
settingsToSave.passthroughGestures = passthroughGestures;
settingsToSave.enableControllerNavigation = enableControllerNavigation;
settingsToSave.controllerMousePointerVelocity = [NSNumber numberWithFloat:controllerMousePointerVelocity];
settingsToSave.controllerMouseExpo = [NSNumber numberWithFloat:controllerMouseExpo];
settingsToSave.softKeyboardHeight = softKeyboardHeight;
settingsToSave.globeAsEscape = globeAsEscape;
settingsToSave.streamingRadialMenuDelay = @(streamingRadialMenuDelay);
settingsToSave.rememberFoldState = rememberFoldState;
[self saveData];
}];
}
- (void) updateHost:(TemporaryHost *)host {
[_managedObjectContext performBlockAndWait:^{
// Add a new persistent managed object if one doesn't exist
Host* parent = [self getHostForTemporaryHost:host withHostRecords:[self fetchRecords:@"Host"]];
if (parent == nil) {
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Host" inManagedObjectContext:self->_managedObjectContext];
parent = [[Host alloc] initWithEntity:entity insertIntoManagedObjectContext:self->_managedObjectContext];
}
// Push changes from the temp host to the persistent one
[host propagateChangesToParent:parent];
[self saveData];
}];
}
- (void) updateAppsForExistingHost:(TemporaryHost *)host {
[_managedObjectContext performBlockAndWait:^{
Host* parent = [self getHostForTemporaryHost:host withHostRecords:[self fetchRecords:@"Host"]];
if (parent == nil) {
// The host must exist to be updated
return;
}
NSMutableSet *applist = [[NSMutableSet alloc] init];
NSArray *appRecords = [self fetchRecords:@"App"];
for (TemporaryApp* app in host.appList) {
// Add a new persistent managed object if one doesn't exist
App* parentApp = [self getAppForTemporaryApp:app withAppRecords:appRecords];
if (parentApp == nil) {
NSEntityDescription* entity = [NSEntityDescription entityForName:@"App" inManagedObjectContext:self->_managedObjectContext];
parentApp = [[App alloc] initWithEntity:entity insertIntoManagedObjectContext:self->_managedObjectContext];
}
[app propagateChangesToParent:parentApp withHost:parent];
[applist addObject:parentApp];
}
parent.appList = applist;
[self saveData];
}];
}
- (TemporarySettings*) getSettings {
__block TemporarySettings *tempSettings;
[_managedObjectContext performBlockAndWait:^{
tempSettings = [[TemporarySettings alloc] initFromSettings:[self retrieveSettings]];
}];
return tempSettings;
}
- (Settings*) retrieveSettings {
NSArray* fetchedRecords = [self fetchRecords:@"Settings"];
if (fetchedRecords.count == 0) {
// create a new settings object with the default values
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Settings" inManagedObjectContext:_managedObjectContext];
Settings* settings = [[Settings alloc] initWithEntity:entity insertIntoManagedObjectContext:_managedObjectContext];
return settings;
} else {
// we should only ever have 1 settings object stored
return [fetchedRecords objectAtIndex:0];
}
}
- (void) removeApp:(TemporaryApp*)app {
[_managedObjectContext performBlockAndWait:^{
App* managedApp = [self getAppForTemporaryApp:app withAppRecords:[self fetchRecords:@"App"]];
if (managedApp != nil) {
[self->_managedObjectContext deleteObject:managedApp];
[self saveData];
}
}];
}
- (void) removeHost:(TemporaryHost*)host {
[_managedObjectContext performBlockAndWait:^{
Host* managedHost = [self getHostForTemporaryHost:host withHostRecords:[self fetchRecords:@"Host"]];
if (managedHost != nil) {
[self->_managedObjectContext deleteObject:managedHost];
[self saveData];
}
}];
}
- (void) saveData {
NSError* error;
if ([_managedObjectContext hasChanges] && ![_managedObjectContext save:&error]) {
Log(LOG_E, @"Unable to save hosts to database: %@", error);
}
[_appDelegate saveContext];
}
- (NSArray*) getHosts {
__block NSMutableArray *tempHosts = [[NSMutableArray alloc] init];
[_managedObjectContext performBlockAndWait:^{
NSArray *hosts = [self fetchRecords:@"Host"];
for (Host* host in hosts) {
[tempHosts addObject:[[TemporaryHost alloc] initFromHost:host]];
}
}];
return tempHosts;
}
// Only call from within performBlockAndWait!!!
- (Host*) getHostForTemporaryHost:(TemporaryHost*)tempHost withHostRecords:(NSArray*)hosts {
for (Host* host in hosts) {
if ([tempHost.uuid isEqualToString:host.uuid]) {
return host;
}
}
return nil;
}
// Only call from within performBlockAndWait!!!
- (App*) getAppForTemporaryApp:(TemporaryApp*)tempApp withAppRecords:(NSArray*)apps {
for (App* app in apps) {
if ([app.id isEqualToString:tempApp.id] &&
[app.host.uuid isEqualToString:tempApp.host.uuid]) {
return app;
}
}
return nil;
}
- (NSArray*) fetchRecords:(NSString*)entityName {
NSArray* fetchedRecords;
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription* entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:_managedObjectContext];
[fetchRequest setEntity:entity];
NSError* error;
fetchedRecords = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];
//TODO: handle errors
return fetchedRecords;
}
@end
+31
View File
@@ -0,0 +1,31 @@
//
// TemporaryApp.h
// Moonlight
//
// Created by Cameron Gutman on 9/30/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
#import "TemporaryHost.h"
#import "App+CoreDataClass.h"
@interface TemporaryApp : NSObject
@property (nullable, nonatomic, retain) NSString *id;
@property (nullable, nonatomic, retain) NSString *name;
@property (nullable, nonatomic, retain) NSString *installPath;
@property (nonatomic) BOOL hdrSupported;
@property (nonatomic) BOOL hidden;
@property (nullable, nonatomic, retain) TemporaryHost *host;
NS_ASSUME_NONNULL_BEGIN
- (id) initFromApp:(App*)app withTempHost:(TemporaryHost*)tempHost;
- (NSComparisonResult)compareName:(TemporaryApp *)other;
- (void) propagateChangesToParent:(App*)parent withHost:(Host*)host;
NS_ASSUME_NONNULL_END
@end
+54
View File
@@ -0,0 +1,54 @@
//
// TemporaryApp.m
// Moonlight
//
// Created by Cameron Gutman on 9/30/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
#import "TemporaryApp.h"
@implementation TemporaryApp
- (id) initFromApp:(App*)app withTempHost:(TemporaryHost*)tempHost {
self = [self init];
self.id = app.id;
self.name = app.name;
self.hdrSupported = app.hdrSupported;
self.hidden = app.hidden;
self.host = tempHost;
return self;
}
- (void) propagateChangesToParent:(App*)parent withHost:(Host*)host {
parent.id = self.id;
parent.name = self.name;
parent.hdrSupported = self.hdrSupported;
parent.hidden = self.hidden;
parent.host = host;
}
- (NSComparisonResult)compareName:(TemporaryApp *)other {
return [self.name caseInsensitiveCompare:other.name];
}
- (NSUInteger)hash {
return [self.host.uuid hash] * 31 + [self.id intValue];
}
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if (![object isKindOfClass:[self class]]) {
return NO;
}
return [self.host.uuid isEqualToString:((App*)object).host.uuid] &&
[self.id isEqualToString:((App*)object).id];
}
@end
+45
View File
@@ -0,0 +1,45 @@
//
// TemporaryHost.h
// Moonlight
//
// Created by Cameron Gutman on 12/1/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
#import "Utils.h"
#import "Host+CoreDataClass.h"
@interface TemporaryHost : NSObject
@property (atomic) State state;
@property (atomic) PairState pairState;
@property (atomic, nullable, retain) NSString * activeAddress;
@property (atomic, nullable, retain) NSString * currentGame;
@property (atomic) unsigned short httpsPort;
@property (atomic) BOOL isNvidiaServerSoftware;
@property (atomic, nullable, retain) NSData *serverCert;
@property (atomic, nullable, retain) NSString *address;
@property (atomic, nullable, retain) NSString *externalAddress;
@property (atomic, nullable, retain) NSString *localAddress;
@property (atomic, nullable, retain) NSString *ipv6Address;
@property (atomic, nullable, retain) NSString *mac;
@property (atomic, nullable, retain) NSString *controllerNavigationHighlightedAppID;
@property (atomic) int serverCodecModeSupport;
NS_ASSUME_NONNULL_BEGIN
@property (atomic, retain) NSString *name;
@property (atomic, retain) NSString *uuid;
@property (atomic, retain) NSSet *appList;
@property (atomic, retain) NSMutableSet * activeAddressPool;
- (id) initFromHost:(Host*)host;
- (NSComparisonResult)compareName:(TemporaryHost *)other;
- (void) propagateChangesToParent:(Host*)host;
NS_ASSUME_NONNULL_END
@end
+130
View File
@@ -0,0 +1,130 @@
//
// TemporaryHost.m
// Moonlight
//
// Created by Cameron Gutman on 12/1/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
// Modified by True砖家 since 2024.8.3
// Copyright © 2024 True砖家 @ Bilibili. All rights reserved.
//
#import "DataManager.h"
#import "TemporaryHost.h"
#import "TemporaryApp.h"
@implementation TemporaryHost
- (id) init {
self = [super init];
self.appList = [[NSMutableSet alloc] init];
self.currentGame = @"0";
self.state = StateUnknown;
return self;
}
- (id) initFromHost:(Host*)host {
self = [self init];
self.address = host.address;
NSSet *classes = [NSSet setWithObjects: [NSMutableSet class], [NSString class], nil];
NSError *error = nil;
self.activeAddressPool = [NSKeyedUnarchiver unarchivedObjectOfClasses:classes fromData:host.activeAddressPool error:&error];
if(self.activeAddressPool){
for(NSString* address in _activeAddressPool){
NSLog(@"%@, persisted addr: %@", host.name, address);
}
}
else self.activeAddressPool = [[NSMutableSet alloc] init];
self.externalAddress = host.externalAddress;
self.localAddress = host.localAddress;
self.ipv6Address = host.ipv6Address;
if(!(host.mac == nil || [host.mac isEqualToString:@"00:00:00:00:00:00"])) self.mac = host.mac; // try to fix invalid mac happens in some cases
self.name = host.name;
self.uuid = host.uuid;
self.controllerNavigationHighlightedAppID = host.controllerNavigationHighlightedAppID;
self.serverCodecModeSupport = host.serverCodecModeSupport;
self.serverCert = host.serverCert;
// Older clients stored a non-URL-escaped IPv6 string. Try to detect that and fix it up.
if (![self.ipv6Address containsString:@"["]) {
self.ipv6Address = [Utils addressAndPortToAddressPortString:self.ipv6Address port:47989];
}
// Ensure we don't use a stale cached pair state if we haven't pinned the cert yet
self.pairState = host.serverCert ? [host.pairState intValue] : PairStateUnpaired;
NSMutableSet *appList = [[NSMutableSet alloc] init];
for (App* app in host.appList) {
TemporaryApp *tempApp = [[TemporaryApp alloc] initFromApp:app withTempHost:self];
[appList addObject:tempApp];
}
self.appList = appList;
return self;
}
- (void) propagateChangesToParent:(Host*)parentHost { // update persisted host data
// Avoid overwriting existing data with nil if
// we don't have everything populated in the temporary
// host.
if (self.address != nil) {
parentHost.address = self.address;
}
if (self.externalAddress != nil) {
parentHost.externalAddress = self.externalAddress;
}
if (self.localAddress != nil) {
parentHost.localAddress = self.localAddress;
}
if (self.ipv6Address != nil) {
parentHost.ipv6Address = self.ipv6Address;
}
if(self.activeAddressPool.count>0){
NSError *error;
parentHost.activeAddressPool = [NSKeyedArchiver archivedDataWithRootObject:self.activeAddressPool requiringSecureCoding:YES error:&error];
}
else if(self.activeAddress) [self.activeAddressPool addObject:self.activeAddress];
// NSLog(@"Persisting activeAddressPool, pool count %lu ... %f, host: %@", (unsigned long)self.activeAddressPool.count, CACurrentMediaTime(), self.name);
// try to fix invalid mac happens in some cases
// 添加主机crash问题重点关注
if (!(self.mac == nil || [self.mac isEqualToString:@"00:00:00:00:00:00"])) parentHost.mac = self.mac;
if (self.serverCert != nil) {
parentHost.serverCert = self.serverCert;
}
parentHost.name = self.name;
parentHost.uuid = self.uuid;
parentHost.controllerNavigationHighlightedAppID = self.controllerNavigationHighlightedAppID;
parentHost.serverCodecModeSupport = self.serverCodecModeSupport;
parentHost.pairState = [NSNumber numberWithInt:self.pairState];
}
- (NSComparisonResult)compareName:(TemporaryHost *)other {
return [self.name caseInsensitiveCompare:other.name];
}
- (NSUInteger)hash {
return [self.uuid hash];
}
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if (![object isKindOfClass:[self class]]) {
return NO;
}
return [self.uuid isEqualToString:((Host*)object).uuid];
}
@end
+130
View File
@@ -0,0 +1,130 @@
//
// TemporarySettings.h
// Moonlight
//
// Created by Cameron Gutman on 12/1/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
// Modified by True砖家 since 2024.6.1
// Copyright © 2024 True砖家 @ Bilibili. All rights reserved.
//
#import "Settings+CoreDataClass.h"
#define OSC_TOOL_FINGERS 4
@interface TemporarySettings : NSObject
@property (nonatomic, retain) Settings * parent;
@property (nonatomic, retain) NSNumber * settingsMenuMode;
@property (nonatomic, retain) NSNumber * settingsMenuWidth;
@property (nonatomic, retain) NSNumber * bitrate;
@property (nonatomic, retain) NSNumber * framerate;
@property (nonatomic, retain) NSNumber * height;
@property (nonatomic, retain) NSNumber * width;
@property (nonatomic, retain) NSNumber * audioConfig;
@property (nonatomic, retain) NSNumber * onscreenControls;
@property (nonatomic, retain) NSNumber * gyroMode;
@property (nonatomic, retain) NSNumber * keyboardToggleFingers;
@property (nonatomic, retain) NSNumber * oscLayoutToolFingers;
@property (nonatomic, retain) NSNumber * slideToSettingsScreenEdge;
@property (nonatomic, retain) NSNumber * slideToSettingsDistance;
@property (nonatomic, retain) NSNumber * touchMoveEventInterval;
@property (nonatomic, retain) NSNumber * touchPointerVelocityFactor;
@property (nonatomic, retain) NSNumber * gyroSensitivity;
@property (nonatomic, retain) NSNumber * localVolume;
@property (nonatomic, retain) NSNumber * micVolume;
@property (nonatomic, retain) NSNumber * emulatedControllerType;
@property (nonatomic, retain) NSNumber * mousePointerVelocityFactor;
@property (nonatomic, retain) NSNumber * pointerVelocityModeDivider;
@property (nonatomic, retain) NSString * uniqueId;
@property (nonatomic, retain) NSNumber * resolutionSelected;
@property (nonatomic, retain) NSNumber * externalDisplayMode;
@property (nonatomic, retain) NSNumber * localMousePointerMode;
@property (nonatomic, retain) NSNumber * gyroBiasX;
@property (nonatomic, retain) NSNumber * gyroBiasY;
@property (nonatomic, retain) NSNumber * gyroBiasZ;
@property (nonatomic, retain) NSNumber * controllerGyroBiasX;
@property (nonatomic, retain) NSNumber * controllerGyroBiasY;
@property (nonatomic, retain) NSNumber * controllerGyroBiasZ;
@property (nonatomic, retain) NSNumber * backgroundSessionTimer;
@property (nonatomic) enum {
CODEC_PREF_AUTO,
CODEC_PREF_H264,
CODEC_PREF_HEVC,
CODEC_PREF_AV1,
} preferredCodec;
@property (nonatomic) BOOL enableYUV444;
@property (nonatomic) BOOL sdrPerformanceWorkaround;
@property (nonatomic) BOOL enablePIP;
@property (nonatomic) BOOL fullColorRange;
@property (nonatomic) BOOL reverseMouseWheelDirection;
@property (nonatomic, retain) NSNumber * asyncNativeTouchPriority;
@property (nonatomic) BOOL multiController;
@property (nonatomic) BOOL buttonVisualFeedback;
@property (nonatomic) BOOL touchPointTracking;
@property (nonatomic) BOOL swapABXYButtons;
@property (nonatomic) BOOL playAudioOnPC;
@property (nonatomic) BOOL redirectMic;
@property (nonatomic) BOOL useBuiltinMic;
@property (nonatomic) BOOL optimizeGames;
@property (nonatomic) BOOL enableHdr;
@property (nonatomic) BOOL btMouseSupport;
// @property (nonatomic) BOOL absoluteTouchMode;
@property (nonatomic, retain) NSNumber * touchMode;
@property (nonatomic, retain) NSNumber * statsOverlayLevel;
@property (nonatomic) BOOL statsOverlayEnabled;
@property (nonatomic) BOOL liftStreamViewForKeyboard;
@property (nonatomic) BOOL showKeyboardToolbar;
@property (nonatomic) CGFloat softKeyboardHeight;
@property (nonatomic) BOOL unlockDisplayOrientation;
@property (nonatomic) BOOL enableGraphs;
@property (nonatomic) BOOL enableFrameTimebase;
@property (nonatomic) BOOL asyncFrameDequeue;
@property (nonatomic, retain) NSNumber * frameQueueSize;
@property (nonatomic, retain) NSNumber * graphOpacity;
@property (nonatomic, retain) NSNumber * renderingBackend;
@property (nonatomic) BOOL sendDummyEvent;
@property (nonatomic) BOOL rememberFoldState;
@property (nonatomic, retain) NSNumber * singleTapSensitivity;
@property (nonatomic, retain) NSNumber * hapticEngine;
@property (nonatomic, retain) NSNumber * appTheme;
@property (nonatomic, retain) NSNumber * edgeSlidingSensitivity;
@property (nonatomic, retain) NSNumber * audioEngine;
@property (nonatomic) BOOL delayLeftClick;
@property (nonatomic) BOOL duckOtherApps;
@property (nonatomic) BOOL muteInBackground;
@property (nonatomic) BOOL enablePinch;
@property (nonatomic) BOOL ctrlDownForPinch;
@property (nonatomic) BOOL passthroughGestures;
@property (nonatomic, retain) NSNumber * framePacingMode;
@property (nonatomic, retain) NSNumber * interpolationMaximumDimension;
@property (nonatomic, retain) NSNumber * interpolationMaximumPixelCount;
@property (nonatomic, retain) NSNumber * streamDimensionScale;
@property (nonatomic, retain) NSNumber * scrollSensitivity;
@property (nonatomic, retain) NSNumber * pinchSensitivity;
@property (nonatomic, retain) NSNumber * relativeTouchSlideThreshold;
@property (nonatomic, retain) NSNumber * leftClickDelayMs;
@property (nonatomic, retain) NSNumber * settingsMenuOffset;
@property (nonatomic, retain) NSNumber * controllerMouseLeftButton;
@property (nonatomic, retain) NSNumber * controllerMouseRightButton;
@property (nonatomic, retain) NSNumber * controllerMouseStick;
@property (nonatomic, retain) NSNumber * localRadialMenuButton;
@property (nonatomic, retain) NSNumber * streamingRadialMenuButton;
@property (nonatomic) BOOL enableControllerNavigation;
@property (nonatomic, retain) NSNumber * controllerMousePointerVelocity;
@property (nonatomic, retain) NSNumber * controllerMouseExpo;
@property (nonatomic, retain) NSNumber * streamingRadialMenuDelay;
@property (nonatomic) BOOL globeAsEscape;
// Pencil settings:
@property (nonatomic, retain) NSNumber * pencilTickMode;
@property (nonatomic, retain) NSNumber * pencilTickIntervalUs;
@property (nonatomic, retain) NSNumber * pencilTipOffsetX;
@property (nonatomic, retain) NSNumber * pencilTipOffsetY;
- (id) initFromSettings:(Settings*)settings;
@end
+192
View File
@@ -0,0 +1,192 @@
//
// TemporarySettings.m
// Moonlight
//
// Created by Cameron Gutman on 12/1/15.
// Copyright © 2015 Moonlight Stream. All rights reserved.
//
// Modified by True砖家 since 2024.6.1
// Copyright © 2024 True砖家 @ Bilibili. All rights reserved.
//
#import "TemporarySettings.h"
#import "OnScreenControls.h"
@implementation TemporarySettings
- (id) initFromSettings:(Settings*)settings {
self = [self init];
self.parent = settings;
#if TARGET_OS_TV
// Apply default values from our Root.plist
NSString* settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
NSDictionary* settingsData = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
NSArray* preferences = [settingsData objectForKey:@"PreferenceSpecifiers"];
NSMutableDictionary* defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
for (NSDictionary* prefSpecification in preferences) {
NSString* key = [prefSpecification objectForKey:@"Key"];
if (key != nil) {
[defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];
}
}
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
self.bitrate = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"bitrate"]];
assert([self.bitrate intValue] != 0);
self.framerate = [NSNumber numberWithDouble:[[NSUserDefaults standardUserDefaults] doubleForKey:@"framerate"]];
assert([self.framerate doubleValue] != 0.0);
self.audioConfig = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"audioConfig"]];
assert([self.audioConfig intValue] != 0);
self.preferredCodec = (typeof(self.preferredCodec))[[NSUserDefaults standardUserDefaults] integerForKey:@"preferredCodec"];
self.enableYUV444 = [[NSUserDefaults standardUserDefaults] boolForKey:@"enableYUV444"];
self.enablePIP = [[NSUserDefaults standardUserDefaults] boolForKey:@"enablePIP"];
self.fullRange = [[NSUserDefaults standardUserDefaults] boolForKey:@"fullRange"];
self.frameQueueSize = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"frameQueueSize"]];
self.playAudioOnPC = [[NSUserDefaults standardUserDefaults] boolForKey:@"audioOnPC"];
self.enableHdr = [[NSUserDefaults standardUserDefaults] boolForKey:@"enableHdr"];
self.optimizeGames = [[NSUserDefaults standardUserDefaults] boolForKey:@"optimizeGames"];
self.multiController = [[NSUserDefaults standardUserDefaults] boolForKey:@"multipleControllers"];
self.swapABXYButtons = [[NSUserDefaults standardUserDefaults] boolForKey:@"swapABXYButtons"];
self.btMouseSupport = [[NSUserDefaults standardUserDefaults] boolForKey:@"btMouseSupport"];
self.statsOverlay = [[NSUserDefaults standardUserDefaults] boolForKey:@"statsOverlay"];
self.enableGraphs = [[NSUserDefaults standardUserDefaults] boolForKey:@"enableGraphs"];
self.graphOpacity = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"graphOpacity"]];
self.renderingBackend = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"renderingBackend"]];
self.framePacingMode = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"framePacingMode"]];
self.interpolationMaximumDimension = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"interpolationMaximumDimension"]];
self.interpolationMaximumPixelCount = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"interpolationMaximumPixelCount"]];
self.streamDimensionScale = [NSNumber numberWithDouble:[[NSUserDefaults standardUserDefaults] doubleForKey:@"streamDimensionScale"]];
NSInteger _screenSize = [[NSUserDefaults standardUserDefaults] integerForKey:@"streamResolution"];
switch (_screenSize) {
case 0:
self.height = [NSNumber numberWithInteger:720];
self.width = [NSNumber numberWithInteger:1280];
break;
case 1:
self.height = [NSNumber numberWithInteger:1080];
self.width = [NSNumber numberWithInteger:1920];
break;
case 2:
self.height = [NSNumber numberWithInteger:2160];
self.width = [NSNumber numberWithInteger:3840];
break;
case 3:
self.height = [NSNumber numberWithInteger:1440];
self.width = [NSNumber numberWithInteger:2560];
break;
default:
abort();
}
self.onscreenControls = [NSNumber numberWithInteger:OnScreenControlsLevelOff];
#else
self.settingsMenuMode = settings.settingsMenuMode;
self.settingsMenuWidth = settings.settingsMenuWidth;
self.bitrate = settings.bitrate;
self.framerate = settings.framerate;
self.height = settings.height;
self.width = settings.width;
self.audioConfig = settings.audioConfig;
self.preferredCodec = settings.preferredCodec;
self.enableYUV444 = settings.enableYUV444;
self.sdrPerformanceWorkaround = settings.sdrPerformanceWorkaround;
self.enablePIP = settings.enablePIP;
self.fullColorRange = settings.fullColorRange;
self.frameQueueSize = settings.frameQueueSize;
self.enableFrameTimebase = settings.enableFrameTimebase;
self.asyncFrameDequeue = settings.asyncFrameDequeue;
self.playAudioOnPC = settings.playAudioOnPC;
self.redirectMic = settings.redirectMic;
self.useBuiltinMic = settings.useBuiltinMic;
self.enableHdr = settings.enableHdr;
self.optimizeGames = settings.optimizeGames;
self.multiController = settings.multiController;
self.buttonVisualFeedback = settings.buttonVisualFeedback;
self.touchPointTracking = settings.touchPointTracking;
self.swapABXYButtons = settings.swapABXYButtons;
self.onscreenControls = settings.onscreenControls;
self.gyroMode = settings.gyroMode;
self.emulatedControllerType = settings.emulatedControllerType;
self.reverseMouseWheelDirection = settings.reverseMouseWheelDirection;
self.asyncNativeTouchPriority = settings.asyncNativeTouchPriority;
self.btMouseSupport = settings.btMouseSupport;
// self.absoluteTouchMode = settings.absoluteTouchMode;
self.touchMode = settings.touchMode;
self.statsOverlayLevel = settings.statsOverlayLevel;
self.statsOverlayEnabled = settings.statsOverlayEnabled;
self.keyboardToggleFingers = settings.keyboardToggleFingers;
self.oscLayoutToolFingers = settings.oscLayoutToolFingers;
self.slideToSettingsScreenEdge = settings.slideToSettingsScreenEdge;
self.slideToSettingsDistance = settings.slideToSettingsDistance;
self.liftStreamViewForKeyboard = settings.liftStreamViewForKeyboard;
self.showKeyboardToolbar = settings.showKeyboardToolbar;
self.softKeyboardHeight = settings.softKeyboardHeight;
self.touchMoveEventInterval = settings.touchMoveEventInterval;
self.touchPointerVelocityFactor = settings.touchPointerVelocityFactor;
self.mousePointerVelocityFactor = settings.mousePointerVelocityFactor;
self.gyroSensitivity = settings.gyroSensitivity;
self.localVolume = settings.localVolume;
self.micVolume = settings.micVolume;
self.pointerVelocityModeDivider = settings.pointerVelocityModeDivider;
self.unlockDisplayOrientation = settings.unlockDisplayOrientation;
self.resolutionSelected = settings.resolutionSelected;
self.externalDisplayMode = settings.externalDisplayMode;
self.localMousePointerMode = settings.localMousePointerMode;
self.enableGraphs = settings.enableGraphs;
self.graphOpacity = settings.graphOpacity;
self.renderingBackend = settings.renderingBackend;
self.framePacingMode = settings.framePacingMode;
self.interpolationMaximumDimension = settings.interpolationMaximumDimension ?: @(0);
self.interpolationMaximumPixelCount = settings.interpolationMaximumPixelCount ?: @(0);
self.streamDimensionScale = settings.streamDimensionScale ?: @(1);
self.sendDummyEvent = settings.sendDummyEvent;
self.rememberFoldState = settings.rememberFoldState;
self.gyroBiasX = settings.gyroBiasX;
self.gyroBiasY = settings.gyroBiasY;
self.gyroBiasZ = settings.gyroBiasZ;
self.controllerGyroBiasX = settings.controllerGyroBiasX;
self.controllerGyroBiasY = settings.controllerGyroBiasY;
self.controllerGyroBiasZ = settings.controllerGyroBiasZ;
self.singleTapSensitivity = settings.singleTapSensitivity;
self.backgroundSessionTimer = settings.backroundSessionTimer;
self.edgeSlidingSensitivity = settings.edgeSlidingSensitivity;
self.appTheme = settings.appTheme;
self.hapticEngine = settings.hapticEngine;
self.uniqueId = settings.uniqueId;
self.audioEngine = settings.audioEngine;
self.delayLeftClick = settings.delayLeftClick;
self.duckOtherApps = settings.duckOtherApps;
self.muteInBackground = settings.muteInBackground;
self.relativeTouchSlideThreshold = settings.relativeTouchSlideThreshold;
self.enablePinch = settings.enablePinch;
self.scrollSensitivity = settings.scrollSensitivity;
self.pinchSensitivity = settings.pinchSensitivity;
self.leftClickDelayMs = settings.leftClickDelayMs;
self.ctrlDownForPinch = settings.ctrlDownForPinch;
self.settingsMenuOffset = settings.settingsMenuOffset;
self.passthroughGestures = settings.passthroughGestures;
self.enableControllerNavigation = settings.enableControllerNavigation;
self.controllerMouseLeftButton = settings.controllerMouseLeftButton;
self.controllerMouseRightButton = settings.controllerMouseRightButton;
self.localRadialMenuButton = settings.localRadialMenuButton;
self.streamingRadialMenuButton = settings.streamingRadialMenuButton;
self.controllerMouseStick = settings.controllerMouseStick;
self.controllerMousePointerVelocity = settings.controllerMousePointerVelocity;
self.controllerMouseExpo = settings.controllerMouseExpo;
self.streamingRadialMenuDelay = settings.streamingRadialMenuDelay;
self.globeAsEscape = settings.globeAsEscape;
// Pencil settings:
self.pencilTickMode = settings.pencilTickMode;
self.pencilTickIntervalUs = settings.pencilTickIntervalUs;
self.pencilTipOffsetX = settings.pencilTipOffsetX;
self.pencilTipOffsetY = settings.pencilTipOffsetY;
#endif
return self;
}
@end
Loaded 100 of 779 files, more files were not shown because too many files have changed in this diff. Show more