Skip to content

Commit 89cc276

Browse files
android UI update for swap eyes
2 parents 068fec0 + e481003 commit 89cc276

File tree

29 files changed

+455
-197
lines changed

29 files changed

+455
-197
lines changed

dist/compatibility_list

src/android/app/src/main/java/org/citra/citra_emu/display/ScreenAdjustmentUtil.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,13 @@ class ScreenAdjustmentUtil(
6262
NativeLibrary.updateFramebuffer(NativeLibrary.isPortraitMode)
6363
}
6464

65+
fun changeSecondaryOrientation(layoutOption: Int) {
66+
IntSetting.SECONDARY_DISPLAY_LAYOUT.int = layoutOption
67+
settings.saveSetting(IntSetting.SECONDARY_DISPLAY_LAYOUT,SettingsFile.FILE_NAME_CONFIG)
68+
NativeLibrary.reloadSettings()
69+
NativeLibrary.updateFramebuffer(NativeLibrary.isPortraitMode)
70+
}
71+
6572
fun changeActivityOrientation(orientationOption: Int) {
6673
val activity = context as? Activity ?: return
6774
IntSetting.ORIENTATION_OPTION.int = orientationOption
@@ -77,4 +84,15 @@ class ScreenAdjustmentUtil(
7784
NativeLibrary.updateFramebuffer(NativeLibrary.isPortraitMode)
7885

7986
}
87+
88+
fun toggleSecondaryScreenUpright() {
89+
val uprightBoolean = BooleanSetting.SECONDARY_UPRIGHT_SCREEN.boolean
90+
BooleanSetting.SECONDARY_UPRIGHT_SCREEN.boolean = !uprightBoolean
91+
settings.saveSetting(
92+
BooleanSetting.SECONDARY_UPRIGHT_SCREEN,
93+
SettingsFile.FILE_NAME_CONFIG
94+
)
95+
NativeLibrary.reloadSettings()
96+
NativeLibrary.updateFramebuffer(NativeLibrary.isPortraitMode)
97+
}
8098
}

src/android/app/src/main/java/org/citra/citra_emu/display/ScreenLayout.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ enum class SecondaryDisplayLayout(val int: Int) {
5656
NONE(0),
5757
TOP_SCREEN(1),
5858
BOTTOM_SCREEN(2),
59-
SIDE_BY_SIDE(3);
59+
SIDE_BY_SIDE(3),
60+
61+
REVERSE_PRIMARY(4);
6062

6163
companion object {
6264
fun from(int: Int): SecondaryDisplayLayout {

src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ enum class BooleanSetting(
1919
INSTANT_DEBUG_LOG("instant_debug_log", Settings.SECTION_DEBUG, false),
2020
ENABLE_RPC_SERVER("enable_rpc_server", Settings.SECTION_DEBUG, false),
2121
CUSTOM_LAYOUT("custom_layout",Settings.SECTION_LAYOUT,false),
22+
SWAP_EYES_3D("swap_eyes_3d",Settings.SECTION_RENDERER,false),
23+
24+
RENDER_3D_SECONDARY_ONLY("render_3d_secondary_only",Settings.SECTION_RENDERER,false),
2225
PERF_OVERLAY_ENABLE("performance_overlay_enable", Settings.SECTION_LAYOUT, false),
2326
PERF_OVERLAY_SHOW_FPS("performance_overlay_show_fps", Settings.SECTION_LAYOUT, true),
2427
PERF_OVERLAY_SHOW_FRAMETIME("performance_overlay_show_frame_time", Settings.SECTION_LAYOUT, false),
@@ -50,6 +53,7 @@ enum class BooleanSetting(
5053
DISABLE_RIGHT_EYE_RENDER("disable_right_eye_render", Settings.SECTION_RENDERER, false),
5154
USE_ARTIC_BASE_CONTROLLER("use_artic_base_controller", Settings.SECTION_CONTROLS, false),
5255
UPRIGHT_SCREEN("upright_screen", Settings.SECTION_LAYOUT, false),
56+
SECONDARY_UPRIGHT_SCREEN("upright_secondary_screen", Settings.SECTION_LAYOUT, false),
5357
COMPRESS_INSTALLED_CIA_CONTENT("compress_cia_installs", Settings.SECTION_STORAGE, false),
5458
ANDROID_HIDE_IMAGES("android_hide_images", Settings.SECTION_CORE, false);
5559

src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
947947
IntSetting.STEREOSCOPIC_3D_MODE.defaultValue
948948
)
949949
)
950+
add(
951+
SwitchSetting(
952+
BooleanSetting.RENDER_3D_SECONDARY_ONLY,
953+
R.string.render_3d_secondary_only,
954+
R.string.render_3d_secondary_only_description,
955+
BooleanSetting.RENDER_3D_SECONDARY_ONLY.key,
956+
BooleanSetting.RENDER_3D_SECONDARY_ONLY.defaultValue
957+
)
958+
)
950959
add(
951960
SliderSetting(
952961
IntSetting.STEREOSCOPIC_3D_DEPTH,
@@ -969,6 +978,16 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
969978
)
970979
)
971980

981+
add(
982+
SwitchSetting(
983+
BooleanSetting.SWAP_EYES_3D,
984+
R.string.swap_eyes_3d,
985+
R.string.swap_eyes_3d_description,
986+
BooleanSetting.SWAP_EYES_3D.key,
987+
BooleanSetting.SWAP_EYES_3D.defaultValue
988+
)
989+
)
990+
972991
add(HeaderSetting(R.string.cardboard_vr))
973992
add(
974993
SliderSetting(
@@ -1106,6 +1125,15 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView)
11061125
BooleanSetting.UPRIGHT_SCREEN.defaultValue
11071126
)
11081127
)
1128+
add(
1129+
SwitchSetting(
1130+
BooleanSetting.SECONDARY_UPRIGHT_SCREEN,
1131+
R.string.emulation_rotate_external_left,
1132+
0,
1133+
BooleanSetting.SECONDARY_UPRIGHT_SCREEN.key,
1134+
BooleanSetting.SECONDARY_UPRIGHT_SCREEN.defaultValue
1135+
)
1136+
)
11091137
add(
11101138
SingleChoiceSetting(
11111139
IntSetting.PORTRAIT_SCREEN_LAYOUT,

src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.kt

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import org.citra.citra_emu.databinding.FragmentEmulationBinding
6464
import org.citra.citra_emu.display.PortraitScreenLayout
6565
import org.citra.citra_emu.display.ScreenAdjustmentUtil
6666
import org.citra.citra_emu.display.ScreenLayout
67+
import org.citra.citra_emu.display.SecondaryDisplayLayout
6768
import org.citra.citra_emu.features.settings.model.BooleanSetting
6869
import org.citra.citra_emu.features.settings.model.IntSetting
6970
import org.citra.citra_emu.features.settings.model.Settings
@@ -306,6 +307,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
306307
true
307308
}
308309

310+
R.id.menu_secondary_screen_layout -> {
311+
showSecondaryScreenLayoutMenu()
312+
true
313+
}
314+
309315
R.id.menu_swap_screens -> {
310316
screenAdjustmentUtil.swapScreen()
311317
true
@@ -316,6 +322,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
316322
true
317323
}
318324

325+
R.id.menu_rotate_external_upright -> {
326+
screenAdjustmentUtil.toggleSecondaryScreenUpright()
327+
true
328+
}
329+
319330
R.id.menu_lock_drawer -> {
320331
when (EmulationMenuSettings.drawerLockMode) {
321332
DrawerLayout.LOCK_MODE_UNLOCKED -> {
@@ -1002,6 +1013,61 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback, Choreographer.Fram
10021013
popupMenu.show()
10031014
}
10041015

1016+
private fun showSecondaryScreenLayoutMenu() {
1017+
val popupMenu = PopupMenu(
1018+
requireContext(),
1019+
binding.inGameMenu.findViewById(R.id.menu_secondary_screen_layout)
1020+
)
1021+
1022+
popupMenu.menuInflater.inflate(R.menu.menu_secondary_screen_layout, popupMenu.menu)
1023+
1024+
val layoutOptionMenuItem = when (IntSetting.SECONDARY_DISPLAY_LAYOUT.int) {
1025+
SecondaryDisplayLayout.NONE.int ->
1026+
R.id.menu_secondary_layout_none
1027+
SecondaryDisplayLayout.REVERSE_PRIMARY.int ->
1028+
R.id.menu_secondary_layout_reverse_primary
1029+
SecondaryDisplayLayout.TOP_SCREEN.int ->
1030+
R.id.menu_secondary_layout_top
1031+
SecondaryDisplayLayout.BOTTOM_SCREEN.int ->
1032+
R.id.menu_secondary_layout_bottom
1033+
else ->
1034+
R.id.menu_secondary_layout_side_by_side
1035+
1036+
}
1037+
1038+
popupMenu.menu.findItem(layoutOptionMenuItem).setChecked(true)
1039+
1040+
popupMenu.setOnMenuItemClickListener {
1041+
when (it.itemId) {
1042+
R.id.menu_secondary_layout_none -> {
1043+
screenAdjustmentUtil.changeSecondaryOrientation(SecondaryDisplayLayout.NONE.int)
1044+
true
1045+
}
1046+
1047+
R.id.menu_secondary_layout_reverse_primary -> {
1048+
screenAdjustmentUtil.changeSecondaryOrientation(SecondaryDisplayLayout.REVERSE_PRIMARY.int)
1049+
true
1050+
}
1051+
R.id.menu_secondary_layout_top -> {
1052+
screenAdjustmentUtil.changeSecondaryOrientation(SecondaryDisplayLayout.TOP_SCREEN.int)
1053+
true
1054+
}
1055+
R.id.menu_secondary_layout_bottom -> {
1056+
screenAdjustmentUtil.changeSecondaryOrientation(SecondaryDisplayLayout.BOTTOM_SCREEN.int)
1057+
true
1058+
}
1059+
R.id.menu_secondary_layout_side_by_side -> {
1060+
screenAdjustmentUtil.changeSecondaryOrientation(SecondaryDisplayLayout.SIDE_BY_SIDE.int)
1061+
true
1062+
}
1063+
1064+
1065+
else -> true
1066+
}
1067+
}
1068+
1069+
popupMenu.show()
1070+
}
10051071
private fun editControlsPlacement() {
10061072
if (binding.surfaceInputOverlay.isInEditMode) {
10071073
binding.doneControlConfig.visibility = View.GONE

src/android/app/src/main/jni/config.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ void Config::ReadValues() {
175175
ReadSetting("Renderer", Settings::values.custom_second_layer_opacity);
176176
ReadSetting("Renderer", Settings::values.delay_game_render_thread_us);
177177
ReadSetting("Renderer", Settings::values.disable_right_eye_render);
178-
178+
ReadSetting("Renderer", Settings::values.swap_eyes_3d);
179+
ReadSetting("Renderer", Settings::values.render_3d_secondary_only);
179180
// Layout
180181
// Somewhat inelegant solution to ensure layout value is between 0 and 5 on read
181182
// since older config files may have other values
@@ -205,6 +206,7 @@ void Config::ReadValues() {
205206
ReadSetting("Layout", Settings::values.cardboard_x_shift);
206207
ReadSetting("Layout", Settings::values.cardboard_y_shift);
207208
ReadSetting("Layout", Settings::values.upright_screen);
209+
ReadSetting("Layout", Settings::values.upright_secondary_screen);
208210

209211
Settings::values.portrait_layout_option =
210212
static_cast<Settings::PortraitLayoutOption>(sdl2_config->GetInteger(

src/android/app/src/main/jni/default_ini.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,14 @@ render_3d =
181181
# 0 - 255: Intensity. 0 (default)
182182
factor_3d =
183183
184+
# Swap Eyes in 3d
185+
# true or false (default)
186+
swap_eyes_3d =
187+
188+
# Render 3D To Secondary Display
189+
# true or false (default)
190+
render_3d_secondary_only =
191+
184192
# The name of the post processing shader to apply.
185193
# Loaded from shaders if render_3d is off or side by side.
186194
pp_shader_name =
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:width="24dp"
4+
android:height="24dp"
5+
android:viewportWidth="24"
6+
android:viewportHeight="24"
7+
android:tint="?attr/colorOnSurface">
8+
<path
9+
android:fillColor="@android:color/black"
10+
android:fillType="evenOdd"
11+
android:pathData="M17 4h3c1.1 0 2 0.9 2 2v2h-2V6h-3ZM4 8V6h3V4H4C2.9 4 2 4.9 2 6v2z m16 8v2h-3v2h3c1.1 0 2-0.9 2-2v-2ZM7 18H4v-2H2v2c0 1.1 0.9 2 2 2h3ZM18 8H6v8h12z M12.6 10.23q-0.07-0.17-0.21-0.28-0.13-0.12-0.26-0.14-0.42 0-0.77 0.23-0.35 0.22-0.64 0.53-0.13 0.1-0.29 0.1-0.16 0-0.27-0.1-0.1-0.12-0.1-0.3 0-0.15 0.1-0.3 0.18-0.19 0.39-0.37 0.21-0.2 0.45-0.34 0.24-0.14 0.5-0.23 0.25-0.09 0.52-0.09 0.31 0 0.58 0.14 0.27 0.12 0.47 0.36 0.2 0.24 0.31 0.56 0.12 0.33 0.12 0.72 0 0.12-0.03 0.26-0.1 0.44-0.33 0.72-0.21 0.28-0.48 0.48-0.26 0.2-0.55 0.36-0.28 0.15-0.53 0.35-0.24 0.2-0.42 0.47-0.19 0.27-0.25 0.7h1.84q0.11 0 0.17-0.03l0.09-0.06 0.1-0.12q0.08-0.1 0.12-0.11l0.1-0.04 0.12-0.01q0.18 0 0.28 0.12 0.1 0.12 0.1 0.28 0 0.11-0.02 0.17l-0.04 0.08q-0.18 0.26-0.43 0.42-0.25 0.15-0.56 0.15h-2.3q-0.38-0.03-0.42-0.45 0.03-0.32 0.1-0.62 0.05-0.3 0.16-0.59 0.1-0.28 0.27-0.53 0.16-0.25 0.41-0.45 0.22-0.17 0.51-0.33 0.3-0.15 0.55-0.34 0.26-0.19 0.45-0.44 0.18-0.25 0.18-0.6 0-0.1-0.04-0.21l-0.05-0.12z"/>
12+
</vector>

src/android/app/src/main/res/menu/menu_in_game.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232
android:icon="@drawable/ic_portrait_fit_screen"
3333
android:title="@string/emulation_switch_portrait_layout" />
3434

35+
<item
36+
android:id="@+id/menu_secondary_screen_layout"
37+
android:icon="@drawable/ic_secondary_fit_screen"
38+
android:title="@string/emulation_switch_secondary_layout" />
39+
3540
<item
3641
android:id="@+id/menu_swap_screens"
3742
android:icon="@drawable/ic_splitscreen"
@@ -42,6 +47,11 @@
4247
android:icon="@drawable/ic_rotate_up_right"
4348
android:title="@string/emulation_rotate_upright" />
4449

50+
<item
51+
android:id="@+id/menu_rotate_external_upright"
52+
android:icon="@drawable/ic_rotate_up_right"
53+
android:title="@string/emulation_rotate_external_left" />
54+
4555
<item
4656
android:id="@+id/menu_lock_drawer"
4757
android:icon="@drawable/ic_unlocked"

0 commit comments

Comments
 (0)