Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
c357dff
it launches but server crashes
ImUrX Jun 19, 2023
d1956ec
start iOS support
ImUrX Jun 18, 2023
4e88b42
it launches but server crashes
ImUrX Jun 19, 2023
75ec5d6
apply spotless
ImUrX Jun 19, 2023
a3b6f95
fix some gradle shenanigans
ImUrX Jun 19, 2023
d7086b4
update to new snapshot
ImUrX Jun 20, 2023
9e9a430
make `SerialHandler`'s implementation platform-dependant
ImUrX Jun 22, 2023
fe46352
Use an Android 24 compatible jackson
ImUrX Jun 22, 2023
6110127
make ios look good
ImUrX Jun 22, 2023
113308c
ok no soft link then
ImUrX Jun 22, 2023
beeb454
dont use maven local
ImUrX Jul 8, 2023
c2431ec
oops solarxr
ImUrX Jul 30, 2023
6bf66da
spotless
ImUrX Jul 30, 2023
3bf4e46
include android
ImUrX Jul 30, 2023
6a479f5
Merge branch 'main' into ios-subproject
ImUrX Aug 1, 2023
e5f22fa
Merge branch 'main' into ios-subproject
ImUrX Aug 3, 2023
5eaf628
Merge branch 'main' into ios-subproject
ImUrX Aug 6, 2023
fe2c6a8
fix mixed indentation
ImUrX Aug 9, 2023
f28a356
Merge branch 'main' into ios-subproject
ImUrX Aug 13, 2023
5d79eab
Merge branch 'main' into ios-subproject
ImUrX Aug 15, 2023
3640f0c
Merge branch 'main' into ios-subproject
ImUrX Aug 31, 2023
8325489
Merge branch 'main' into ios-subproject
ImUrX Sep 17, 2023
c52a8b5
Merge branch 'main' into ios-subproject
ImUrX Sep 23, 2023
a264349
Fix problem with new xcode 15
ImUrX Sep 25, 2023
07334c0
Add reflections
ImUrX Sep 25, 2023
36bc4ed
make webview open on root instead of index.html
ImUrX Sep 25, 2023
d37a9ac
spotless apply
ImUrX Sep 25, 2023
5bb8080
Merge branch 'main' into ios-subproject
ImUrX Sep 25, 2023
a229ad9
Merge branch 'main' into ios-subproject
ImUrX Sep 26, 2023
c8b5493
Merge branch 'main' into ios-subproject
ImUrX Apr 5, 2024
e2f2c31
Merge branch 'main' into ios-subproject
ImUrX May 10, 2024
3b8836e
Merge branch 'main' into ios-subproject
ImUrX Nov 20, 2024
0758ab4
Merge branch 'main' into ios-subproject
ImUrX Nov 20, 2024
e514b9e
add ios CI
ImUrX Nov 20, 2024
e9a6789
ls debug
ImUrX Nov 20, 2024
143a72e
fun
ImUrX Nov 20, 2024
4aae409
Update gradle.yaml
ImUrX Nov 20, 2024
cbdb382
upload only the IPA
ImUrX Nov 20, 2024
bec4205
Merge tag 'v0.15.0' into ios-subproject
ImUrX Jun 16, 2025
80b9eae
fix ios bundling
ImUrX Jun 16, 2025
2512ce0
Merge branch 'main' into ios-subproject
ImUrX Sep 4, 2025
2363eb0
change to latest robovm snapshot
ImUrX Sep 5, 2025
c345685
try macos-14 runner instead
ImUrX Sep 5, 2025
23f82b0
update robovm
ImUrX Sep 16, 2025
b178de3
change repo used
ImUrX Sep 16, 2025
fd263a0
try doing edge to edge
ImUrX Sep 16, 2025
01855da
get version and build
ImUrX Sep 16, 2025
dde4c8b
lets see if we can do fullscreen this way
ImUrX Sep 17, 2025
a440a6a
add iOS check on GUI
ImUrX Sep 17, 2025
1bb7061
use window instead of global this
ImUrX Sep 17, 2025
b076ea4
maybe at document end
ImUrX Sep 17, 2025
cb2d909
keep improving layout
ImUrX Sep 17, 2025
9d12c5e
final retouches
ImUrX Sep 17, 2025
68a6dfd
forgot to add mobile breakpoint
ImUrX Sep 17, 2025
2a5c10d
try fixing zoom
ImUrX Sep 17, 2025
7a8beef
disable autolock if there is trackers connected
ImUrX Sep 17, 2025
7ec9f2c
try reinitializing server when in foreground
ImUrX Sep 17, 2025
1d95360
it crashes now
ImUrX Sep 17, 2025
6f914f4
Merge branch 'main' into ios-subproject
ImUrX Sep 17, 2025
6bff095
use dispatchqueue
ImUrX Sep 17, 2025
94134d9
also check for send data
ImUrX Sep 17, 2025
623850e
renew icons
ImUrX Sep 17, 2025
b7cb0f6
fix more gui bugs
ImUrX Sep 17, 2025
92179f6
undo softlink for icons
ImUrX Sep 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/gradle.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,51 @@ jobs:
files: |
./SlimeVR-android.apk

bundle-ios:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive

- name: Get tags
run: git fetch --tags origin --recurse-submodules=no --force

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: "17"
distribution: "adopt"

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- uses: pnpm/action-setup@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.node-version'
cache: 'pnpm'

- run: pnpm i

- name: Build GUI
env:
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
NODE_OPTIONS: --max-old-space-size=4096
run: cd gui && pnpm run build

- name: Build with Gradle
run: ./gradlew :server:ios:createIPA

- name: Upload the iOS Build Artifact
uses: actions/upload-artifact@v4
with:
# Artifact name
name: "SlimeVR-iOS" # optional, default is artifact
# A file, directory or wildcard pattern that describes what to upload
path: server/ios/build/robovmx-build/tmp/Main.ipa

bundle-linux:
strategy:
matrix:
Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ spotlessVersion=7.0.2
shadowJarVersion=8.3.2
buildconfigVersion=5.5.0
grgitVersion=5.2.2
robovmVersion=10.2.2.4-SNAPSHOT
Binary file modified gui/src-tauri/icons/icon.icns
Binary file not shown.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified gui/src-tauri/icons/ios/[email protected]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
116 changes: 116 additions & 0 deletions gui/src-tauri/icons/ios/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
{
"images" : [
{
"filename" : "[email protected]",
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "[email protected]",
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"filename" : "[email protected]",
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "[email protected]",
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"filename" : "[email protected]",
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "[email protected]",
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"filename" : "[email protected]",
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "[email protected]",
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"filename" : "AppIcon-20x20@2x 1.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "[email protected]",
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"filename" : "[email protected]",
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "[email protected]",
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"filename" : "[email protected]",
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "[email protected]",
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"filename" : "[email protected]",
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"filename" : "AppIcon-83.5x83.5@2x 1.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"filename" : "AppIcon-512@2x 1.png",
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
},
{
"filename" : "[email protected]",
"idiom" : "iphone",
"scale" : "1x",
"size" : "20x20"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
6 changes: 5 additions & 1 deletion gui/src/components/EmptyLayout.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import { ReactNode } from 'react';
import { TopBar } from './TopBar';
import './EmptyLayout.scss';
import classNames from 'classnames';

export function EmptyLayout({ children }: { children: ReactNode }) {
return (
<div className="empty-layout h-full">
<div style={{ gridArea: 't' }}>
<div
style={{ gridArea: 't' }}
className={classNames(window.__IOS__ && 'mobile:mt-10')}
>
<TopBar></TopBar>
</div>
<div style={{ gridArea: 'c' }} className="mt-2 relative">
Expand Down
8 changes: 6 additions & 2 deletions gui/src/components/MainLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,10 @@ export function MainLayout({
return (
<div className="">
<div className="main-layout w-full h-screen">
<div style={{ gridArea: 't' }}>
<div
style={{ gridArea: 't' }}
className={classNames(window.__IOS__ && 'mobile:mt-10')}
>
<TopBar></TopBar>
</div>
<div style={{ gridArea: 's' }} className="overflow-y-auto">
Expand All @@ -71,7 +74,8 @@ export function MainLayout({
className={classNames(
'overflow-y-auto mr-2 my-2 mobile:m-0',
'flex flex-col rounded-xl',
background && 'bg-background-70'
background && 'bg-background-70',
window.__IOS__ && 'mobile:mt-10'
)}
>
{children}
Expand Down
23 changes: 13 additions & 10 deletions gui/src/components/TopBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -232,19 +232,22 @@ export function TopBar({
</>
)}

{!isTauri && !showVersionMobile && !config?.decorations && (
<div
className="flex flex-row gap-2"
{...(doesMatchSettings ? showVersionBind : {})}
>
{!isTauri &&
!showVersionMobile &&
!config?.decorations &&
!window.__IOS__ && (
<div
className="flex justify-around flex-col xs:hidden"
data-tauri-drag-region
className="flex flex-row gap-2"
{...(doesMatchSettings ? showVersionBind : {})}
>
<Typography variant="section-title">SlimeVR</Typography>
<div
className="flex justify-around flex-col xs:hidden"
data-tauri-drag-region
>
<Typography variant="section-title">SlimeVR</Typography>
</div>
</div>
</div>
)}
)}
</div>
<div
className="flex justify-end items-center px-2 gap-2 z-50"
Expand Down
6 changes: 3 additions & 3 deletions gui/src/components/WidgetsComponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ export function WidgetsComponent() {
bodyPartsToReset="fingers"
></ResetButton>
<ClearMountingButton></ClearMountingButton>
{(typeof __ANDROID__ === 'undefined' || !__ANDROID__?.isThere()) && (
<BVHButton></BVHButton>
)}
{(!window.__IOS__ ||
typeof __ANDROID__ === 'undefined' ||
!__ANDROID__?.isThere()) && <BVHButton></BVHButton>}
<TrackingPauseButton></TrackingPauseButton>
</div>
<div className="w-full">
Expand Down
14 changes: 12 additions & 2 deletions gui/src/components/onboarding/OnboardingLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { useBreakpoint } from '@/hooks/breakpoint';
import { SkipSetupButton } from './SkipSetupButton';
import { SkipSetupWarningModal } from './SkipSetupWarningModal';
import './OnboardingLayout.scss';
import classNames from 'classnames';

export function OnboardingLayout({ children }: { children: ReactNode }) {
const { isMobile } = useBreakpoint('mobile');
Expand All @@ -14,10 +15,19 @@ export function OnboardingLayout({ children }: { children: ReactNode }) {

return !state.alonePage ? (
<div className="onboarding-layout h-full">
<div style={{ gridArea: 't' }}>
<div
style={{ gridArea: 't' }}
className={classNames(window.__IOS__ && 'mobile:mt-10')}
>
<TopBar progress={state.progress}></TopBar>
</div>
<div style={{ gridArea: 'c' }} className="mt-2 relative">
<div
style={{ gridArea: 'c' }}
className={classNames(
'relative mt-2',
window.__IOS__ && 'mobile:mt-12'
)}
>
<div className="absolute top-12 mobile:top-0 right-2 z-50">
<SkipSetupButton
visible={true}
Expand Down
18 changes: 15 additions & 3 deletions gui/src/components/settings/SettingsLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { useLocalization } from '@fluent/react';
import { useLocation, useNavigate } from 'react-router-dom';
import './SettingsLayout.scss';
import { useVRCConfig } from '@/hooks/vrc-config';
import classNames from 'classnames';

export function SettingSelectorMobile() {
const { l10n } = useLocalization();
Expand Down Expand Up @@ -84,7 +85,12 @@ export function SettingSelectorMobile() {
};

return (
<div className="fixed top-12 z-50 px-4 w-full">
<div
className={classNames(
'fixed top-12 z-50 px-4 w-full',
window.__IOS__ && 'mobile:mt-10'
)}
>
<Dropdown
control={control}
display="block"
Expand All @@ -107,7 +113,10 @@ export function SettingsLayout({ children }: { children: ReactNode }) {
return (
<>
<div className="settings-layout h-full">
<div style={{ gridArea: 't' }}>
<div
style={{ gridArea: 't' }}
className={classNames(window.__IOS__ && 'mobile:mt-10')}
>
<TopBar></TopBar>
</div>
<div style={{ gridArea: 'n' }}>
Expand All @@ -118,7 +127,10 @@ export function SettingsLayout({ children }: { children: ReactNode }) {
</div>
<div
style={{ gridArea: 'c' }}
className="xs:pl-2 xs:pb-2 xs:mt-2 mobile:mt-7 overflow-y-auto"
className={classNames(
'xs:pl-2 xs:pb-2 xs:mt-2 overflow-y-auto',
window.__IOS__ ? 'mobile:mt-[4.25rem]' : 'mobile:mt-7'
)}
>
{isMobile && <SettingSelectorMobile></SettingSelectorMobile>}
{children}
Expand Down
48 changes: 27 additions & 21 deletions gui/src/components/settings/pages/InterfaceSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -248,27 +248,33 @@ export function InterfaceSettings() {
</>
)}

<Typography bold>
{l10n.getString('settings-general-interface-discord_presence')}
</Typography>
<div className="flex flex-col pt-1 pb-2">
<Typography color="secondary">
{l10n.getString(
'settings-general-interface-discord_presence-description'
)}
</Typography>
</div>
<div className="grid sm:grid-cols-2 pb-4">
<CheckBox
variant="toggle"
control={control}
outlined
name="behavior.discordPresence"
label={l10n.getString(
'settings-general-interface-discord_presence-label'
)}
/>
</div>
{isTauri() && (
<>
<Typography bold>
{l10n.getString(
'settings-general-interface-discord_presence'
)}
</Typography>
<div className="flex flex-col pt-1 pb-2">
<Typography color="secondary">
{l10n.getString(
'settings-general-interface-discord_presence-description'
)}
</Typography>
</div>
<div className="grid sm:grid-cols-2 pb-4">
<CheckBox
variant="toggle"
control={control}
outlined
name="behavior.discordPresence"
label={l10n.getString(
'settings-general-interface-discord_presence-label'
)}
/>
</div>
</>
)}

<Typography bold>
{l10n.getString('settings-general-interface-dev_mode')}
Expand Down
1 change: 1 addition & 0 deletions gui/src/vite-env.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ declare const __ANDROID__:

interface Window {
readonly isTauri: boolean;
readonly __IOS__: boolean | undefined;
}

declare module 'tailwind-gradient-mask-image';
Loading
Loading