27 changed files with 1209 additions and 847 deletions
-
6src/android/app/src/main/java/org/yuzu/yuzu_emu/activities/EmulationActivity.kt
-
8src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
-
4src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/IntSetting.kt
-
39src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/Settings.kt
-
89src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/EmulationFragment.kt
-
984src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
-
3src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableButton.kt
-
4src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlayDrawableJoystick.kt
-
188src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControl.kt
-
19src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControlData.kt
-
13src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayControlDefault.kt
-
10src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/model/OverlayLayout.kt
-
142src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt
-
50src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/EmulationMenuSettings.kt
-
18src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/NativeConfig.kt
-
9src/android/app/src/main/jni/android_common/android_common.cpp
-
3src/android/app/src/main/jni/android_common/android_common.h
-
62src/android/app/src/main/jni/android_config.cpp
-
2src/android/app/src/main/jni/android_config.h
-
25src/android/app/src/main/jni/android_settings.h
-
79src/android/app/src/main/jni/id_cache.cpp
-
12src/android/app/src/main/jni/id_cache.h
-
70src/android/app/src/main/jni/native_config.cpp
-
10src/android/app/src/main/res/values/arrays.xml
-
204src/android/app/src/main/res/values/integers.xml
-
2src/common/settings.cpp
-
1src/common/settings_common.h
984
src/android/app/src/main/java/org/yuzu/yuzu_emu/overlay/InputOverlay.kt
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,188 @@ |
|||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
package org.yuzu.yuzu_emu.overlay.model |
||||
|
|
||||
|
import androidx.annotation.IntegerRes |
||||
|
import org.yuzu.yuzu_emu.R |
||||
|
import org.yuzu.yuzu_emu.YuzuApplication |
||||
|
|
||||
|
enum class OverlayControl( |
||||
|
val id: String, |
||||
|
val defaultVisibility: Boolean, |
||||
|
@IntegerRes val defaultLandscapePositionResources: Pair<Int, Int>, |
||||
|
@IntegerRes val defaultPortraitPositionResources: Pair<Int, Int>, |
||||
|
@IntegerRes val defaultFoldablePositionResources: Pair<Int, Int> |
||||
|
) { |
||||
|
BUTTON_A( |
||||
|
"button_a", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_A_X, R.integer.BUTTON_A_Y), |
||||
|
Pair(R.integer.BUTTON_A_X_PORTRAIT, R.integer.BUTTON_A_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_A_X_FOLDABLE, R.integer.BUTTON_A_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_B( |
||||
|
"button_b", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_B_X, R.integer.BUTTON_B_Y), |
||||
|
Pair(R.integer.BUTTON_B_X_PORTRAIT, R.integer.BUTTON_B_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_B_X_FOLDABLE, R.integer.BUTTON_B_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_X( |
||||
|
"button_x", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_X_X, R.integer.BUTTON_X_Y), |
||||
|
Pair(R.integer.BUTTON_X_X_PORTRAIT, R.integer.BUTTON_X_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_X_X_FOLDABLE, R.integer.BUTTON_X_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_Y( |
||||
|
"button_y", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_Y_X, R.integer.BUTTON_Y_Y), |
||||
|
Pair(R.integer.BUTTON_Y_X_PORTRAIT, R.integer.BUTTON_Y_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_Y_X_FOLDABLE, R.integer.BUTTON_Y_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_PLUS( |
||||
|
"button_plus", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_PLUS_X, R.integer.BUTTON_PLUS_Y), |
||||
|
Pair(R.integer.BUTTON_PLUS_X_PORTRAIT, R.integer.BUTTON_PLUS_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_PLUS_X_FOLDABLE, R.integer.BUTTON_PLUS_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_MINUS( |
||||
|
"button_minus", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_MINUS_X, R.integer.BUTTON_MINUS_Y), |
||||
|
Pair(R.integer.BUTTON_MINUS_X_PORTRAIT, R.integer.BUTTON_MINUS_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_MINUS_X_FOLDABLE, R.integer.BUTTON_MINUS_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_HOME( |
||||
|
"button_home", |
||||
|
false, |
||||
|
Pair(R.integer.BUTTON_HOME_X, R.integer.BUTTON_HOME_Y), |
||||
|
Pair(R.integer.BUTTON_HOME_X_PORTRAIT, R.integer.BUTTON_HOME_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_HOME_X_FOLDABLE, R.integer.BUTTON_HOME_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_CAPTURE( |
||||
|
"button_capture", |
||||
|
false, |
||||
|
Pair(R.integer.BUTTON_CAPTURE_X, R.integer.BUTTON_CAPTURE_Y), |
||||
|
Pair(R.integer.BUTTON_CAPTURE_X_PORTRAIT, R.integer.BUTTON_CAPTURE_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_CAPTURE_X_FOLDABLE, R.integer.BUTTON_CAPTURE_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_L( |
||||
|
"button_l", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_L_X, R.integer.BUTTON_L_Y), |
||||
|
Pair(R.integer.BUTTON_L_X_PORTRAIT, R.integer.BUTTON_L_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_L_X_FOLDABLE, R.integer.BUTTON_L_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_R( |
||||
|
"button_r", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_R_X, R.integer.BUTTON_R_Y), |
||||
|
Pair(R.integer.BUTTON_R_X_PORTRAIT, R.integer.BUTTON_R_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_R_X_FOLDABLE, R.integer.BUTTON_R_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_ZL( |
||||
|
"button_zl", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_ZL_X, R.integer.BUTTON_ZL_Y), |
||||
|
Pair(R.integer.BUTTON_ZL_X_PORTRAIT, R.integer.BUTTON_ZL_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_ZL_X_FOLDABLE, R.integer.BUTTON_ZL_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_ZR( |
||||
|
"button_zr", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_ZR_X, R.integer.BUTTON_ZR_Y), |
||||
|
Pair(R.integer.BUTTON_ZR_X_PORTRAIT, R.integer.BUTTON_ZR_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_ZR_X_FOLDABLE, R.integer.BUTTON_ZR_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_STICK_L( |
||||
|
"button_stick_l", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_STICK_L_X, R.integer.BUTTON_STICK_L_Y), |
||||
|
Pair(R.integer.BUTTON_STICK_L_X_PORTRAIT, R.integer.BUTTON_STICK_L_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_STICK_L_X_FOLDABLE, R.integer.BUTTON_STICK_L_Y_FOLDABLE) |
||||
|
), |
||||
|
BUTTON_STICK_R( |
||||
|
"button_stick_r", |
||||
|
true, |
||||
|
Pair(R.integer.BUTTON_STICK_R_X, R.integer.BUTTON_STICK_R_Y), |
||||
|
Pair(R.integer.BUTTON_STICK_R_X_PORTRAIT, R.integer.BUTTON_STICK_R_Y_PORTRAIT), |
||||
|
Pair(R.integer.BUTTON_STICK_R_X_FOLDABLE, R.integer.BUTTON_STICK_R_Y_FOLDABLE) |
||||
|
), |
||||
|
STICK_L( |
||||
|
"stick_l", |
||||
|
true, |
||||
|
Pair(R.integer.STICK_L_X, R.integer.STICK_L_Y), |
||||
|
Pair(R.integer.STICK_L_X_PORTRAIT, R.integer.STICK_L_Y_PORTRAIT), |
||||
|
Pair(R.integer.STICK_L_X_FOLDABLE, R.integer.STICK_L_Y_FOLDABLE) |
||||
|
), |
||||
|
STICK_R( |
||||
|
"stick_r", |
||||
|
true, |
||||
|
Pair(R.integer.STICK_R_X, R.integer.STICK_R_Y), |
||||
|
Pair(R.integer.STICK_R_X_PORTRAIT, R.integer.STICK_R_Y_PORTRAIT), |
||||
|
Pair(R.integer.STICK_R_X_FOLDABLE, R.integer.STICK_R_Y_FOLDABLE) |
||||
|
), |
||||
|
COMBINED_DPAD( |
||||
|
"combined_dpad", |
||||
|
true, |
||||
|
Pair(R.integer.COMBINED_DPAD_X, R.integer.COMBINED_DPAD_Y), |
||||
|
Pair(R.integer.COMBINED_DPAD_X_PORTRAIT, R.integer.COMBINED_DPAD_Y_PORTRAIT), |
||||
|
Pair(R.integer.COMBINED_DPAD_X_FOLDABLE, R.integer.COMBINED_DPAD_Y_FOLDABLE) |
||||
|
); |
||||
|
|
||||
|
fun getDefaultPositionForLayout(layout: OverlayLayout): Pair<Double, Double> { |
||||
|
val rawResourcePair: Pair<Int, Int> |
||||
|
YuzuApplication.appContext.resources.apply { |
||||
|
rawResourcePair = when (layout) { |
||||
|
OverlayLayout.Landscape -> { |
||||
|
Pair( |
||||
|
getInteger(this@OverlayControl.defaultLandscapePositionResources.first), |
||||
|
getInteger(this@OverlayControl.defaultLandscapePositionResources.second) |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
OverlayLayout.Portrait -> { |
||||
|
Pair( |
||||
|
getInteger(this@OverlayControl.defaultPortraitPositionResources.first), |
||||
|
getInteger(this@OverlayControl.defaultPortraitPositionResources.second) |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
OverlayLayout.Foldable -> { |
||||
|
Pair( |
||||
|
getInteger(this@OverlayControl.defaultFoldablePositionResources.first), |
||||
|
getInteger(this@OverlayControl.defaultFoldablePositionResources.second) |
||||
|
) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return Pair( |
||||
|
rawResourcePair.first.toDouble() / 1000, |
||||
|
rawResourcePair.second.toDouble() / 1000 |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
fun toOverlayControlData(): OverlayControlData = |
||||
|
OverlayControlData( |
||||
|
id, |
||||
|
defaultVisibility, |
||||
|
getDefaultPositionForLayout(OverlayLayout.Landscape), |
||||
|
getDefaultPositionForLayout(OverlayLayout.Portrait), |
||||
|
getDefaultPositionForLayout(OverlayLayout.Foldable) |
||||
|
) |
||||
|
|
||||
|
companion object { |
||||
|
val map: HashMap<String, OverlayControl> by lazy { |
||||
|
val hashMap = hashMapOf<String, OverlayControl>() |
||||
|
entries.forEach { hashMap[it.id] = it } |
||||
|
hashMap |
||||
|
} |
||||
|
|
||||
|
fun from(id: String): OverlayControl? = map[id] |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
package org.yuzu.yuzu_emu.overlay.model |
||||
|
|
||||
|
data class OverlayControlData( |
||||
|
val id: String, |
||||
|
var enabled: Boolean, |
||||
|
var landscapePosition: Pair<Double, Double>, |
||||
|
var portraitPosition: Pair<Double, Double>, |
||||
|
var foldablePosition: Pair<Double, Double> |
||||
|
) { |
||||
|
fun positionFromLayout(layout: OverlayLayout): Pair<Double, Double> = |
||||
|
when (layout) { |
||||
|
OverlayLayout.Landscape -> landscapePosition |
||||
|
OverlayLayout.Portrait -> portraitPosition |
||||
|
OverlayLayout.Foldable -> foldablePosition |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,13 @@ |
|||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
package org.yuzu.yuzu_emu.overlay.model |
||||
|
|
||||
|
import androidx.annotation.IntegerRes |
||||
|
|
||||
|
data class OverlayControlDefault( |
||||
|
val buttonId: String, |
||||
|
@IntegerRes val landscapePositionResource: Pair<Int, Int>, |
||||
|
@IntegerRes val portraitPositionResource: Pair<Int, Int>, |
||||
|
@IntegerRes val foldablePositionResource: Pair<Int, Int> |
||||
|
) |
||||
@ -0,0 +1,10 @@ |
|||||
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
package org.yuzu.yuzu_emu.overlay.model |
||||
|
|
||||
|
enum class OverlayLayout(val id: String) { |
||||
|
Landscape("Landscape"), |
||||
|
Portrait("Portrait"), |
||||
|
Foldable("Foldable") |
||||
|
} |
||||
@ -1,50 +0,0 @@ |
|||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project |
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later |
|
||||
|
|
||||
package org.yuzu.yuzu_emu.utils |
|
||||
|
|
||||
import androidx.preference.PreferenceManager |
|
||||
import org.yuzu.yuzu_emu.YuzuApplication |
|
||||
import org.yuzu.yuzu_emu.features.settings.model.Settings |
|
||||
|
|
||||
object EmulationMenuSettings { |
|
||||
private val preferences = |
|
||||
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext) |
|
||||
|
|
||||
var joystickRelCenter: Boolean |
|
||||
get() = preferences.getBoolean(Settings.PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER, true) |
|
||||
set(value) { |
|
||||
preferences.edit() |
|
||||
.putBoolean(Settings.PREF_MENU_SETTINGS_JOYSTICK_REL_CENTER, value) |
|
||||
.apply() |
|
||||
} |
|
||||
var dpadSlide: Boolean |
|
||||
get() = preferences.getBoolean(Settings.PREF_MENU_SETTINGS_DPAD_SLIDE, true) |
|
||||
set(value) { |
|
||||
preferences.edit() |
|
||||
.putBoolean(Settings.PREF_MENU_SETTINGS_DPAD_SLIDE, value) |
|
||||
.apply() |
|
||||
} |
|
||||
var hapticFeedback: Boolean |
|
||||
get() = preferences.getBoolean(Settings.PREF_MENU_SETTINGS_HAPTICS, false) |
|
||||
set(value) { |
|
||||
preferences.edit() |
|
||||
.putBoolean(Settings.PREF_MENU_SETTINGS_HAPTICS, value) |
|
||||
.apply() |
|
||||
} |
|
||||
|
|
||||
var showFps: Boolean |
|
||||
get() = preferences.getBoolean(Settings.PREF_MENU_SETTINGS_SHOW_FPS, false) |
|
||||
set(value) { |
|
||||
preferences.edit() |
|
||||
.putBoolean(Settings.PREF_MENU_SETTINGS_SHOW_FPS, value) |
|
||||
.apply() |
|
||||
} |
|
||||
var showOverlay: Boolean |
|
||||
get() = preferences.getBoolean(Settings.PREF_MENU_SETTINGS_SHOW_OVERLAY, true) |
|
||||
set(value) { |
|
||||
preferences.edit() |
|
||||
.putBoolean(Settings.PREF_MENU_SETTINGS_SHOW_OVERLAY, value) |
|
||||
.apply() |
|
||||
} |
|
||||
} |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue