summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxXJSONDeruloXx <danielhimebauch@gmail.com>2026-08-03 14:32:35 -0400
committerxXJSONDeruloXx <danielhimebauch@gmail.com>2026-08-03 14:32:35 -0400
commite0681b06efdee3dcacb6ddfca515d947b802faff (patch)
tree52c1cad716b92c784d2946d063cc36b34255ea5e /src
parent8df4d48cd89d636940982e60bb51b688226e630c (diff)
parentb936baab13b026d4355844d94616a622753a7370 (diff)
downloaddecky-lsfg-vk-e0681b06efdee3dcacb6ddfca515d947b802faff.tar.gz
decky-lsfg-vk-e0681b06efdee3dcacb6ddfca515d947b802faff.zip
Merge main and normalize translation locale handling
Diffstat (limited to 'src')
-rw-r--r--src/components/ConfigurationSection.tsx11
-rw-r--r--src/components/Content.tsx2
-rw-r--r--src/components/UsageInstructions.tsx7
-rw-r--r--src/config/configSchema.ts118
-rw-r--r--src/hooks/useLsfgHooks.ts8
-rw-r--r--src/i18n/i18n.ts12
-rw-r--r--src/i18n/languages.json2
7 files changed, 27 insertions, 133 deletions
diff --git a/src/components/ConfigurationSection.tsx b/src/components/ConfigurationSection.tsx
index c988f9f..a10aab2 100644
--- a/src/components/ConfigurationSection.tsx
+++ b/src/components/ConfigurationSection.tsx
@@ -3,7 +3,7 @@ import { useState, useEffect } from "react";
import { RiArrowDownSFill, RiArrowUpSFill } from "react-icons/ri";
import { ConfigurationData } from "../config/configSchema";
import {
- FLOW_SCALE, PERFORMANCE_MODE, HDR_MODE,
+ FLOW_SCALE, NO_FP16, PERFORMANCE_MODE, HDR_MODE,
EXPERIMENTAL_PRESENT_MODE, DXVK_FRAME_RATE, DISABLE_STEAMDECK_MODE,
MANGOHUD_WORKAROUND, DISABLE_VKBASALT, FORCE_ENABLE_VKBASALT, ENABLE_WSI, ENABLE_ZINK
} from "../config/generatedConfigSchema";
@@ -127,6 +127,15 @@ export function ConfigurationSection({
</PanelSectionRow>
<PanelSectionRow>
+ <ToggleField
+ label="FP16 Acceleration"
+ description="Use FP16 shaders when supported"
+ checked={!config.no_fp16}
+ onChange={(value) => onConfigChange(NO_FP16, !value)}
+ />
+ </PanelSectionRow>
+
+ <PanelSectionRow>
<SliderField
label={`${t('CONFIG_BASE_FPS_CAP', 'Base FPS Cap')}${config.dxvk_frame_rate > 0 ? ` (${config.dxvk_frame_rate} FPS)` : ` (${t('CONFIG_BASE_FPS_CAP_OFF', 'Off')})`}`}
description={t('CONFIG_BASE_FPS_CAP_DESC', 'Base framerate cap for DirectX games, before frame multiplier. (Requires game restart to apply)')}
diff --git a/src/components/Content.tsx b/src/components/Content.tsx
index c785a50..5988e79 100644
--- a/src/components/Content.tsx
+++ b/src/components/Content.tsx
@@ -144,7 +144,7 @@ export function Content() {
</>
)}
- <UsageInstructions config={config} />
+ <UsageInstructions />
<PanelSectionRow>
<ButtonItem
diff --git a/src/components/UsageInstructions.tsx b/src/components/UsageInstructions.tsx
index 6d32506..36e31cf 100644
--- a/src/components/UsageInstructions.tsx
+++ b/src/components/UsageInstructions.tsx
@@ -1,12 +1,7 @@
import { PanelSectionRow } from "@decky/ui";
-import { ConfigurationData } from "../config/configSchema";
import t from '../i18n/i18n';
-interface UsageInstructionsProps {
- config: ConfigurationData;
-}
-
-export function UsageInstructions({ config: _config }: UsageInstructionsProps) {
+export function UsageInstructions() {
return (
<>
<PanelSectionRow>
diff --git a/src/config/configSchema.ts b/src/config/configSchema.ts
index 6c6cf19..8b4fc1e 100644
--- a/src/config/configSchema.ts
+++ b/src/config/configSchema.ts
@@ -1,15 +1,3 @@
-/**
- * Configuration schema and management for LSFG VK plugin
- *
- * This file re-exports auto-generated configuration constants from generatedConfigSchema.ts
- * and provides the ConfigurationManager class for handling configuration operations.
- */
-
-import { callable } from "@decky/api";
-import type { ConfigurationData } from './generatedConfigSchema';
-import { getDefaults } from './generatedConfigSchema';
-import { updateLsfgConfig } from "../api/lsfgApi";
-
export {
ConfigFieldType,
ConfigField,
@@ -23,109 +11,3 @@ export {
DISABLE_STEAMDECK_MODE, MANGOHUD_WORKAROUND, DISABLE_VKBASALT,
FORCE_ENABLE_VKBASALT, ENABLE_WSI, ENABLE_ZINK
} from './generatedConfigSchema';
-
-/**
- * Configuration management class
- * Handles CRUD operations for plugin configuration
- */
-export class ConfigurationManager {
- private static instance: ConfigurationManager;
- private _config: ConfigurationData | null = null;
-
- private getConfiguration = callable<[], { success: boolean; data?: ConfigurationData; error?: string }>("get_configuration");
- private resetConfiguration = callable<[], { success: boolean; data?: ConfigurationData; error?: string }>("reset_configuration");
-
- private constructor() {}
-
- static getInstance(): ConfigurationManager {
- if (!ConfigurationManager.instance) {
- ConfigurationManager.instance = new ConfigurationManager();
- }
- return ConfigurationManager.instance;
- }
-
- /**
- * Get default configuration values
- */
- static getDefaults(): ConfigurationData {
- return getDefaults();
- }
-
- /**
- * Load configuration from backend
- */
- async loadConfig(): Promise<ConfigurationData> {
- try {
- const result = await this.getConfiguration();
- if (result.success && result.data) {
- this._config = result.data;
- return this._config;
- } else {
- throw new Error(result.error || 'Failed to load configuration');
- }
- } catch (error) {
- console.error('Error loading configuration:', error);
- throw error;
- }
- }
-
- /**
- * Save configuration to backend
- */
- async saveConfig(config: ConfigurationData): Promise<void> {
- try {
- const result = await updateLsfgConfig(config);
- if (result.success) {
- this._config = config;
- } else {
- throw new Error(result.error || 'Failed to save configuration');
- }
- } catch (error) {
- console.error('Error saving configuration:', error);
- throw error;
- }
- }
-
- /**
- * Update a single configuration field
- */
- async updateField(fieldName: keyof ConfigurationData, value: any): Promise<void> {
- if (!this._config) {
- await this.loadConfig();
- }
-
- const updatedConfig = {
- ...this._config!,
- [fieldName]: value
- };
-
- await this.saveConfig(updatedConfig);
- }
-
- /**
- * Get current configuration (cached)
- */
- getConfig(): ConfigurationData | null {
- return this._config;
- }
-
- /**
- * Reset configuration to defaults
- */
- async resetToDefaults(): Promise<ConfigurationData> {
- try {
- const result = await this.resetConfiguration();
- if (result.success && result.data) {
- this._config = result.data;
- return this._config;
- } else {
- throw new Error(result.error || 'Failed to reset configuration');
- }
- } catch (error) {
- console.error('Error resetting configuration:', error);
- throw error;
- }
- }
-}
-
-export const configManager = ConfigurationManager.getInstance();
diff --git a/src/hooks/useLsfgHooks.ts b/src/hooks/useLsfgHooks.ts
index adc18ba..d9bbe3e 100644
--- a/src/hooks/useLsfgHooks.ts
+++ b/src/hooks/useLsfgHooks.ts
@@ -6,7 +6,7 @@ import {
updateLsfgConfigFromObject,
type ConfigUpdateResult
} from "../api/lsfgApi";
-import { ConfigurationData, ConfigurationManager } from "../config/configSchema";
+import { ConfigurationData, getDefaults } from "../config/configSchema";
import { showErrorToast, ToastMessages } from "../utils/toastUtils";
export function useInstallationStatus() {
@@ -71,7 +71,7 @@ export function useDllDetection() {
}
export function useLsfgConfig() {
- const [config, setConfig] = useState<ConfigurationData>(() => ConfigurationManager.getDefaults());
+ const [config, setConfig] = useState<ConfigurationData>(() => getDefaults());
const loadLsfgConfig = useCallback(async () => {
try {
@@ -80,11 +80,11 @@ export function useLsfgConfig() {
setConfig(result.config);
} else {
console.log("lsfg config not available, using defaults:", result.error);
- setConfig(ConfigurationManager.getDefaults());
+ setConfig(getDefaults());
}
} catch (error) {
console.error("Error loading lsfg config:", error);
- setConfig(ConfigurationManager.getDefaults());
+ setConfig(getDefaults());
}
}, []);
diff --git a/src/i18n/i18n.ts b/src/i18n/i18n.ts
index 83ed3da..dc8de8b 100644
--- a/src/i18n/i18n.ts
+++ b/src/i18n/i18n.ts
@@ -2,6 +2,14 @@
// to generate for localhost/dev, run `build_i18n_json.sh` script
import * as languages from "./languages.json";
+const steamLanguageMap: Record<string, string> =
+ languages.steam_language_map as Record<string, string>;
+
+const normalizeLanguage = (language: string): string => {
+ const normalized = language.trim().toLowerCase();
+ return steamLanguageMap[normalized] ?? normalized;
+};
+
function getLangs() {
const langs = languages.language_metadata;
@@ -32,13 +40,13 @@ let cachedLang: string | undefined;
export const getCurrentLanguage = (): string => {
if (cachedLang) return cachedLang;
- const lang = window.LocalizationManager.m_rgLocalesToUse[0];
+ const lang = normalizeLanguage(window.LocalizationManager.m_rgLocalesToUse[0]);
cachedLang = lang;
return lang;
};
export const getLanguageName = (lang?: string): string => {
- const targetLang = lang || getCurrentLanguage();
+ const targetLang = normalizeLanguage(lang || getCurrentLanguage());
return LANGS[targetLang]?.name || targetLang;
};
diff --git a/src/i18n/languages.json b/src/i18n/languages.json
index 004d71c..c1a49b8 100644
--- a/src/i18n/languages.json
+++ b/src/i18n/languages.json
@@ -348,4 +348,4 @@
"CLIPBOARD_COPY_LAUNCH": "Copy Launch Option",
"CLIPBOARD_LSFG_FGMOD": "LSFG + DeckyFG"
}
-} \ No newline at end of file
+}