summaryrefslogtreecommitdiff
path: root/py_modules
diff options
context:
space:
mode:
Diffstat (limited to 'py_modules')
-rw-r--r--py_modules/lsfg_vk/config_schema.py54
-rw-r--r--py_modules/lsfg_vk/configuration.py55
-rw-r--r--py_modules/lsfg_vk/plugin.py17
3 files changed, 73 insertions, 53 deletions
diff --git a/py_modules/lsfg_vk/config_schema.py b/py_modules/lsfg_vk/config_schema.py
index 6a68db1..eac5a91 100644
--- a/py_modules/lsfg_vk/config_schema.py
+++ b/py_modules/lsfg_vk/config_schema.py
@@ -52,42 +52,16 @@ CONFIG_SCHEMA["dll"] = ConfigField(
description="specify where Lossless.dll is stored"
)
-# Fields that should ONLY be in the lsfg script, not in TOML config
+# Get script-only fields dynamically from shared config
SCRIPT_ONLY_FIELDS = {
- "dxvk_frame_rate": ConfigField(
- name="dxvk_frame_rate",
- field_type=ConfigFieldType.INTEGER,
- default=0,
- description="base framerate cap for DirectX games, before frame multiplier (0 = disabled, requires game re-launch)"
- ),
-
- "enable_wow64": ConfigField(
- name="enable_wow64",
- field_type=ConfigFieldType.BOOLEAN,
- default=False,
- description="enable PROTON_USE_WOW64=1 for 32-bit games (use with ProtonGE to fix crashing)"
- ),
-
- "disable_steamdeck_mode": ConfigField(
- name="disable_steamdeck_mode",
- field_type=ConfigFieldType.BOOLEAN,
- default=False,
- description="disable Steam Deck mode (unlocks hidden settings in some games)"
- ),
-
- "mangohud_workaround": ConfigField(
- name="mangohud_workaround",
- field_type=ConfigFieldType.BOOLEAN,
- default=False,
- description="Enables a transparent mangohud overlay, sometimes fixes issues with 2X multiplier in game mode"
- ),
-
- "disable_vkbasalt": ConfigField(
- name="disable_vkbasalt",
- field_type=ConfigFieldType.BOOLEAN,
- default=False,
- description="Disables vkBasalt layer which can conflict with LSFG (Reshade, some Decky plugins)"
+ field_name: ConfigField(
+ name=field_def["name"],
+ field_type=ConfigFieldType(field_def["fieldType"]),
+ default=field_def["default"],
+ description=field_def["description"]
)
+ for field_name, field_def in CONFIG_SCHEMA_DEF.items()
+ if field_def.get("location") == "script"
}
# Complete configuration schema (TOML + script-only fields)
@@ -107,6 +81,8 @@ class ConfigurationData(TypedDict):
disable_steamdeck_mode: bool
mangohud_workaround: bool
disable_vkbasalt: bool
+ foobar_toggle: bool
+ test_config_only: str
class ConfigurationManager:
@@ -355,6 +331,8 @@ class ConfigurationManager:
script_values["mangohud_workaround"] = value == "1"
elif key == "DISABLE_VKBASALT":
script_values["disable_vkbasalt"] = value == "1"
+ elif key == "FOOBAR":
+ script_values["foobar_toggle"] = value == "1"
except (ValueError, KeyError, IndexError) as e:
# If parsing fails, log the error and return empty dict (will use defaults)
@@ -390,7 +368,9 @@ class ConfigurationManager:
enable_wow64: bool = False,
disable_steamdeck_mode: bool = False,
mangohud_workaround: bool = False,
- disable_vkbasalt: bool = False) -> ConfigurationData:
+ disable_vkbasalt: bool = False,
+ foobar_toggle: bool = False,
+ test_config_only: str = "default_value") -> ConfigurationData:
"""Create configuration from individual arguments"""
return cast(ConfigurationData, {
"dll": dll,
@@ -403,5 +383,7 @@ class ConfigurationManager:
"enable_wow64": enable_wow64,
"disable_steamdeck_mode": disable_steamdeck_mode,
"mangohud_workaround": mangohud_workaround,
- "disable_vkbasalt": disable_vkbasalt
+ "disable_vkbasalt": disable_vkbasalt,
+ "foobar_toggle": foobar_toggle,
+ "test_config_only": test_config_only
})
diff --git a/py_modules/lsfg_vk/configuration.py b/py_modules/lsfg_vk/configuration.py
index 68ff577..b4c7994 100644
--- a/py_modules/lsfg_vk/configuration.py
+++ b/py_modules/lsfg_vk/configuration.py
@@ -60,6 +60,47 @@ class ConfigurationService(BaseService):
f"Using default configuration due to parse error: {str(e)}",
config=config)
+ def update_config_from_dict(self, config: ConfigurationData) -> ConfigurationResponse:
+ """Update TOML configuration from configuration dictionary (eliminates parameter duplication)
+
+ Args:
+ config: Complete configuration data dictionary
+
+ Returns:
+ ConfigurationResponse with success status
+ """
+ try:
+ # Generate TOML content using centralized manager
+ toml_content = ConfigurationManager.generate_toml_content(config)
+
+ # Ensure config directory exists
+ self.config_dir.mkdir(parents=True, exist_ok=True)
+
+ # Write the updated config directly to preserve inode for file watchers
+ self._write_file(self.config_file_path, toml_content, 0o644)
+
+ # Update the launch script with the new configuration
+ script_result = self.update_lsfg_script(config)
+ if not script_result["success"]:
+ self.log.warning(f"Failed to update launch script: {script_result['error']}")
+
+ # Log with dynamic field listing
+ field_values = ", ".join(f"{k}={repr(v)}" for k, v in config.items())
+ self.log.info(f"Updated lsfg configuration: {field_values}")
+
+ return self._success_response(ConfigurationResponse,
+ "lsfg configuration updated successfully",
+ config=config)
+
+ except (OSError, IOError) as e:
+ error_msg = f"Error updating lsfg config: {str(e)}"
+ self.log.error(error_msg)
+ return self._error_response(ConfigurationResponse, str(e), config=None)
+ except ValueError as e:
+ error_msg = f"Invalid configuration arguments: {str(e)}"
+ self.log.error(error_msg)
+ return self._error_response(ConfigurationResponse, str(e), config=None)
+
def update_config(self, dll: str, multiplier: int, flow_scale: float,
performance_mode: bool, hdr_mode: bool,
experimental_present_mode: str = "fifo",
@@ -67,7 +108,9 @@ class ConfigurationService(BaseService):
enable_wow64: bool = False,
disable_steamdeck_mode: bool = False,
mangohud_workaround: bool = False,
- disable_vkbasalt: bool = False) -> ConfigurationResponse:
+ disable_vkbasalt: bool = False,
+ foobar_toggle: bool = False,
+ test_config_only: str = "default_value") -> ConfigurationResponse:
"""Update TOML configuration
Args:
@@ -82,6 +125,8 @@ class ConfigurationService(BaseService):
disable_steamdeck_mode: Whether to disable Steam Deck mode
mangohud_workaround: Whether to enable MangoHud workaround with transparent overlay
disable_vkbasalt: Whether to disable vkBasalt layer
+ foobar_toggle: Test script-only toggle that exports FOOBAR=1
+ test_config_only: Test TOML-only configuration field
Returns:
ConfigurationResponse with success status
@@ -91,7 +136,7 @@ class ConfigurationService(BaseService):
config = ConfigurationManager.create_config_from_args(
dll, multiplier, flow_scale, performance_mode, hdr_mode,
experimental_present_mode, dxvk_frame_rate, enable_wow64, disable_steamdeck_mode,
- mangohud_workaround, disable_vkbasalt
+ mangohud_workaround, disable_vkbasalt, foobar_toggle, test_config_only
)
# Generate TOML content using centralized manager
@@ -114,7 +159,8 @@ class ConfigurationService(BaseService):
f"experimental_present_mode='{experimental_present_mode}', "
f"dxvk_frame_rate={dxvk_frame_rate}, "
f"enable_wow64={enable_wow64}, disable_steamdeck_mode={disable_steamdeck_mode}, "
- f"mangohud_workaround={mangohud_workaround}, disable_vkbasalt={disable_vkbasalt}")
+ f"mangohud_workaround={mangohud_workaround}, disable_vkbasalt={disable_vkbasalt}, "
+ f"foobar_toggle={foobar_toggle}, test_config_only='{test_config_only}'")
return self._success_response(ConfigurationResponse,
"lsfg configuration updated successfully",
@@ -227,6 +273,9 @@ class ConfigurationService(BaseService):
if config.get("disable_vkbasalt", False):
lines.append("export DISABLE_VKBASALT=1")
+ if config.get("foobar_toggle", False):
+ lines.append("export FOOBAR=1")
+
# Add DXVK_FRAME_RATE if dxvk_frame_rate is set
dxvk_frame_rate = config.get("dxvk_frame_rate", 0)
if dxvk_frame_rate > 0:
diff --git a/py_modules/lsfg_vk/plugin.py b/py_modules/lsfg_vk/plugin.py
index d126d84..8fa2435 100644
--- a/py_modules/lsfg_vk/plugin.py
+++ b/py_modules/lsfg_vk/plugin.py
@@ -185,7 +185,7 @@ class Plugin:
}
async def update_lsfg_config(self, config: Dict[str, Any]) -> Dict[str, Any]:
- """Update lsfg TOML configuration using object-based API
+ """Update lsfg TOML configuration using object-based API (single source of truth)
Args:
config: Configuration data dictionary containing all settings
@@ -196,19 +196,8 @@ class Plugin:
# Validate and extract configuration from the config dict
validated_config = ConfigurationManager.validate_config(config)
- return self.configuration_service.update_config(
- dll=validated_config["dll"],
- multiplier=validated_config["multiplier"],
- flow_scale=validated_config["flow_scale"],
- performance_mode=validated_config["performance_mode"],
- hdr_mode=validated_config["hdr_mode"],
- experimental_present_mode=validated_config["experimental_present_mode"],
- dxvk_frame_rate=validated_config["dxvk_frame_rate"],
- enable_wow64=validated_config["enable_wow64"],
- disable_steamdeck_mode=validated_config["disable_steamdeck_mode"],
- mangohud_workaround=validated_config["mangohud_workaround"],
- disable_vkbasalt=validated_config["disable_vkbasalt"]
- )
+ # Use dynamic parameter passing based on schema
+ return self.configuration_service.update_config_from_dict(validated_config)
async def update_dll_path(self, dll_path: str) -> Dict[str, Any]:
"""Update the DLL path in the configuration when detected