summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com>2025-07-22 13:33:13 -0400
committerGitHub <noreply@github.com>2025-07-22 13:33:13 -0400
commit42668d412105b972e0cc7440b64e8e24aeef4587 (patch)
treec8f20ccbe508ac6684a38c115d63602476575493 /src
parent97bb41947bd44a712ad26905771a9d2cc4692878 (diff)
parent43def41747d3b75bb547b649a00f12653c3ae537 (diff)
downloaddecky-lsfg-vk-42668d412105b972e0cc7440b64e8e24aeef4587.tar.gz
decky-lsfg-vk-42668d412105b972e0cc7440b64e8e24aeef4587.zip
Merge pull request #67 from xXJSONDeruloXx/workaround-envs
add workaround env vars, rm old tests
Diffstat (limited to 'src')
-rw-r--r--src/api/lsfgApi.ts11
-rw-r--r--src/components/ConfigurationSection.tsx63
-rw-r--r--src/config/configSchema.ts27
-rw-r--r--src/config/generatedConfigSchema.ts31
4 files changed, 91 insertions, 41 deletions
diff --git a/src/api/lsfgApi.ts b/src/api/lsfgApi.ts
index 74caa57..8d14da6 100644
--- a/src/api/lsfgApi.ts
+++ b/src/api/lsfgApi.ts
@@ -1,5 +1,5 @@
import { callable } from "@decky/api";
-import { ConfigurationData, ConfigurationManager } from "../config/configSchema";
+import { ConfigurationData } from "../config/configSchema";
// Type definitions for API responses
export interface InstallationResult {
@@ -99,16 +99,15 @@ export const getLaunchOption = callable<[], LaunchOptionResult>("get_launch_opti
export const getConfigFileContent = callable<[], FileContentResult>("get_config_file_content");
export const getLaunchScriptContent = callable<[], FileContentResult>("get_launch_script_content");
-// Updated config function using centralized configuration
+// Updated config function using object-based configuration (single source of truth)
export const updateLsfgConfig = callable<
- [string, number, number, boolean, boolean, string, number, boolean, boolean],
+ [ConfigurationData],
ConfigUpdateResult
>("update_lsfg_config");
-// Helper function to create config update from configuration object
+// Legacy helper function for backward compatibility
export const updateLsfgConfigFromObject = async (config: ConfigurationData): Promise<ConfigUpdateResult> => {
- const args = ConfigurationManager.createArgsFromConfig(config);
- return updateLsfgConfig(...args as [string, number, number, boolean, boolean, string, number, boolean, boolean]);
+ return updateLsfgConfig(config);
};
// Self-updater API functions
diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx
index 59ad880..c0b67fd 100644
--- a/src/components/ConfigurationSection.tsx
+++ b/src/components/ConfigurationSection.tsx
@@ -1,5 +1,10 @@
import { PanelSectionRow, ToggleField, SliderField, DropdownItem } from "@decky/ui";
import { ConfigurationData } from "../config/configSchema";
+import {
+ MULTIPLIER, FLOW_SCALE, PERFORMANCE_MODE, HDR_MODE,
+ EXPERIMENTAL_PRESENT_MODE, DXVK_FRAME_RATE, DISABLE_STEAMDECK_MODE,
+ MANGOHUD_WORKAROUND, DISABLE_VKBASALT
+} from "../config/generatedConfigSchema";
interface ConfigurationSectionProps {
config: ConfigurationData;
@@ -45,7 +50,7 @@ export function ConfigurationSection({
]}
showValue={false}
notchTicksVisible={true}
- onChange={(value) => onConfigChange('multiplier', value)}
+ onChange={(value) => onConfigChange(MULTIPLIER, value)}
/>
</PanelSectionRow>
@@ -57,7 +62,7 @@ export function ConfigurationSection({
min={0.25}
max={1.0}
step={0.01}
- onChange={(value) => onConfigChange('flow_scale', value)}
+ onChange={(value) => onConfigChange(FLOW_SCALE, value)}
/>
</PanelSectionRow>
@@ -66,7 +71,7 @@ export function ConfigurationSection({
label="Performance Mode"
description="Uses a lighter model for FG (Recommended for most games)"
checked={config.performance_mode}
- onChange={(value) => onConfigChange('performance_mode', value)}
+ onChange={(value) => onConfigChange(PERFORMANCE_MODE, value)}
/>
</PanelSectionRow>
@@ -75,7 +80,7 @@ export function ConfigurationSection({
label="HDR Mode"
description="Enables HDR mode (only for games that support HDR)"
checked={config.hdr_mode}
- onChange={(value) => onConfigChange('hdr_mode', value)}
+ onChange={(value) => onConfigChange(HDR_MODE, value)}
/>
</PanelSectionRow>
@@ -101,7 +106,7 @@ export function ConfigurationSection({
description="Select a specific Vulkan presentation mode for better performance or compatibility (May cause crashes)"
menuLabel="Select presentation mode"
selectedOption={config.experimental_present_mode || "fifo"}
- onChange={(value) => onConfigChange('experimental_present_mode', value.data)}
+ onChange={(value) => onConfigChange(EXPERIMENTAL_PRESENT_MODE, value.data)}
rgOptions={[
{ data: "fifo", label: "FIFO (VSync) - Default" },
{ data: "mailbox", label: "Mailbox" }
@@ -112,16 +117,26 @@ export function ConfigurationSection({
<PanelSectionRow>
<div
style={{
- fontSize: "14px",
- fontWeight: "bold",
- marginTop: "16px",
- marginBottom: "8px",
- borderBottom: "1px solid rgba(255, 255, 255, 0.2)",
- paddingBottom: "4px",
- color: "white"
+ fontSize: "14px",
+ fontWeight: "bold",
+ marginTop: "16px",
+ marginBottom: "2px",
+ borderBottom: "1px solid rgba(255, 255, 255, 0.2)",
+ paddingBottom: "2px",
+ color: "white"
+ }}
+ >
+ Environment Variables
+ </div>
+ <div
+ style={{
+ fontSize: "12px",
+ color: "#cccccc",
+ marginTop: "2px",
+ marginBottom: "8px"
}}
>
- Environment Variables (Requires re-launch)
+ Must be toggled before game start or restart game to take effect
</div>
</PanelSectionRow>
@@ -133,7 +148,7 @@ export function ConfigurationSection({
min={0}
max={60}
step={1}
- onChange={(value) => onConfigChange('dxvk_frame_rate', value)}
+ onChange={(value) => onConfigChange(DXVK_FRAME_RATE, value)}
/>
</PanelSectionRow>
@@ -151,7 +166,25 @@ export function ConfigurationSection({
label="Disable Steam Deck Mode"
description="Disables Steam Deck mode (Unlocks hidden settings in some games)"
checked={config.disable_steamdeck_mode}
- onChange={(value) => onConfigChange('disable_steamdeck_mode', value)}
+ onChange={(value) => onConfigChange(DISABLE_STEAMDECK_MODE, value)}
+ />
+ </PanelSectionRow>
+
+ <PanelSectionRow>
+ <ToggleField
+ label="MangoHud Workaround"
+ description="Enables a transparent mangohud overlay, sometimes fixes issues with 2X multiplier in game mode"
+ checked={config.mangohud_workaround}
+ onChange={(value) => onConfigChange(MANGOHUD_WORKAROUND, value)}
+ />
+ </PanelSectionRow>
+
+ <PanelSectionRow>
+ <ToggleField
+ label="Disable vkBasalt"
+ description="Disables vkBasalt layer which can conflict with LSFG (Reshade, some Decky plugins)"
+ checked={config.disable_vkbasalt}
+ onChange={(value) => onConfigChange(DISABLE_VKBASALT, value)}
/>
</PanelSectionRow>
</>
diff --git a/src/config/configSchema.ts b/src/config/configSchema.ts
index 4ab0d25..9568fd8 100644
--- a/src/config/configSchema.ts
+++ b/src/config/configSchema.ts
@@ -8,6 +8,7 @@
import { callable } from "@decky/api";
import type { ConfigurationData } from './generatedConfigSchema';
import { getDefaults } from './generatedConfigSchema';
+import { updateLsfgConfig } from "../api/lsfgApi";
// Re-export all auto-generated configuration constants
export {
@@ -17,7 +18,11 @@ export {
ConfigurationData,
getFieldNames,
getDefaults,
- getFieldTypes
+ getFieldTypes,
+ // Field name constants for type-safe access
+ DLL, MULTIPLIER, FLOW_SCALE, PERFORMANCE_MODE, HDR_MODE,
+ EXPERIMENTAL_PRESENT_MODE, DXVK_FRAME_RATE, ENABLE_WOW64,
+ DISABLE_STEAMDECK_MODE, MANGOHUD_WORKAROUND, DISABLE_VKBASALT
} from './generatedConfigSchema';
/**
@@ -30,7 +35,6 @@ export class ConfigurationManager {
// Callable methods for backend communication
private getConfiguration = callable<[], { success: boolean; data?: ConfigurationData; error?: string }>("get_configuration");
- private setConfiguration = callable<[{ config_data: ConfigurationData }], { success: boolean; error?: string }>("set_configuration");
private resetConfiguration = callable<[], { success: boolean; data?: ConfigurationData; error?: string }>("reset_configuration");
private constructor() {}
@@ -50,23 +54,6 @@ export class ConfigurationManager {
}
/**
- * Create args array from config object for lsfg API calls
- */
- static createArgsFromConfig(config: ConfigurationData): [string, number, number, boolean, boolean, string, number, boolean, boolean] {
- return [
- config.dll,
- config.multiplier,
- config.flow_scale,
- config.performance_mode,
- config.hdr_mode,
- config.experimental_present_mode,
- config.dxvk_frame_rate,
- config.enable_wow64,
- config.disable_steamdeck_mode
- ];
- }
-
- /**
* Load configuration from backend
*/
async loadConfig(): Promise<ConfigurationData> {
@@ -89,7 +76,7 @@ export class ConfigurationManager {
*/
async saveConfig(config: ConfigurationData): Promise<void> {
try {
- const result = await this.setConfiguration({ config_data: config });
+ const result = await updateLsfgConfig(config);
if (result.success) {
this._config = config;
} else {
diff --git a/src/config/generatedConfigSchema.ts b/src/config/generatedConfigSchema.ts
index 5f0e368..4a301a1 100644
--- a/src/config/generatedConfigSchema.ts
+++ b/src/config/generatedConfigSchema.ts
@@ -7,6 +7,19 @@ export enum ConfigFieldType {
STRING = "string"
}
+// Field name constants for type-safe access
+export const DLL = "dll" as const;
+export const MULTIPLIER = "multiplier" as const;
+export const FLOW_SCALE = "flow_scale" as const;
+export const PERFORMANCE_MODE = "performance_mode" as const;
+export const HDR_MODE = "hdr_mode" as const;
+export const EXPERIMENTAL_PRESENT_MODE = "experimental_present_mode" as const;
+export const DXVK_FRAME_RATE = "dxvk_frame_rate" as const;
+export const ENABLE_WOW64 = "enable_wow64" as const;
+export const DISABLE_STEAMDECK_MODE = "disable_steamdeck_mode" as const;
+export const MANGOHUD_WORKAROUND = "mangohud_workaround" as const;
+export const DISABLE_VKBASALT = "disable_vkbasalt" as const;
+
// Configuration field definition
export interface ConfigField {
name: string;
@@ -71,6 +84,18 @@ export const CONFIG_SCHEMA: Record<string, ConfigField> = {
default: false,
description: "disable Steam Deck mode (unlocks hidden settings in some games)"
},
+ mangohud_workaround: {
+ name: "mangohud_workaround",
+ fieldType: ConfigFieldType.BOOLEAN,
+ default: false,
+ description: "Enables a transparent mangohud overlay, sometimes fixes issues with 2X multiplier in game mode"
+ },
+ disable_vkbasalt: {
+ name: "disable_vkbasalt",
+ fieldType: ConfigFieldType.BOOLEAN,
+ default: false,
+ description: "Disables vkBasalt layer which can conflict with LSFG (Reshade, some Decky plugins)"
+ },
};
// Type-safe configuration data structure
@@ -84,6 +109,8 @@ export interface ConfigurationData {
dxvk_frame_rate: number;
enable_wow64: boolean;
disable_steamdeck_mode: boolean;
+ mangohud_workaround: boolean;
+ disable_vkbasalt: boolean;
}
// Helper functions
@@ -102,6 +129,8 @@ export function getDefaults(): ConfigurationData {
dxvk_frame_rate: 0,
enable_wow64: false,
disable_steamdeck_mode: false,
+ mangohud_workaround: false,
+ disable_vkbasalt: false,
};
}
@@ -116,6 +145,8 @@ export function getFieldTypes(): Record<string, ConfigFieldType> {
dxvk_frame_rate: ConfigFieldType.INTEGER,
enable_wow64: ConfigFieldType.BOOLEAN,
disable_steamdeck_mode: ConfigFieldType.BOOLEAN,
+ mangohud_workaround: ConfigFieldType.BOOLEAN,
+ disable_vkbasalt: ConfigFieldType.BOOLEAN,
};
}