diff options
Diffstat (limited to 'py_modules')
| -rw-r--r-- | py_modules/lsfg_vk/config_schema.py | 67 | ||||
| -rw-r--r-- | py_modules/lsfg_vk/configuration.py | 30 |
2 files changed, 86 insertions, 11 deletions
diff --git a/py_modules/lsfg_vk/config_schema.py b/py_modules/lsfg_vk/config_schema.py index 54e414f..1098248 100644 --- a/py_modules/lsfg_vk/config_schema.py +++ b/py_modules/lsfg_vk/config_schema.py @@ -316,6 +316,73 @@ class ConfigurationManager: return ConfigurationManager.get_defaults() @staticmethod + def parse_script_content(script_content: str) -> Dict[str, Union[bool, int, str]]: + """Parse launch script content to extract environment variable values + + Args: + script_content: Content of the launch script file + + Returns: + Dict containing parsed script-only field values + """ + script_values = {} + + try: + lines = script_content.split('\n') + + for line in lines: + line = line.strip() + + # Skip comments, empty lines, and non-export lines + if not line or line.startswith('#') or not line.startswith('export '): + continue + + # Parse export statements: export VAR=value + if '=' in line: + # Remove 'export ' prefix + export_line = line[7:] # len('export ') = 7 + key, value = export_line.split('=', 1) + key = key.strip() + value = value.strip() + + # Map environment variables to config field names + if key == "DXVK_FRAME_RATE": + try: + script_values["dxvk_frame_rate"] = int(value) + except ValueError: + pass + elif key == "PROTON_USE_WOW64": + script_values["enable_wow64"] = value == "1" + elif key == "SteamDeck": + script_values["disable_steamdeck_mode"] = value == "0" + + except Exception: + # If parsing fails, return empty dict (will use defaults) + pass + + return script_values + + @staticmethod + def merge_config_with_script(toml_config: ConfigurationData, script_values: Dict[str, Union[bool, int, str]]) -> ConfigurationData: + """Merge TOML configuration with script environment variable values + + Args: + toml_config: Configuration loaded from TOML file + script_values: Environment variable values parsed from script + + Returns: + Complete configuration with script values overlaid on TOML config + """ + merged_config = dict(toml_config) + + # Update script-only fields with values from script + for field_name in SCRIPT_ONLY_FIELDS.keys(): + if field_name in script_values: + merged_config[field_name] = script_values[field_name] + + return cast(ConfigurationData, merged_config) + + @staticmethod def create_config_from_args(dll: str, multiplier: int, flow_scale: float, performance_mode: bool, hdr_mode: bool, experimental_present_mode: str = "fifo", diff --git a/py_modules/lsfg_vk/configuration.py b/py_modules/lsfg_vk/configuration.py index 1336f21..da765e0 100644 --- a/py_modules/lsfg_vk/configuration.py +++ b/py_modules/lsfg_vk/configuration.py @@ -14,26 +14,34 @@ class ConfigurationService(BaseService): """Service for managing TOML-based lsfg configuration""" def get_config(self) -> ConfigurationResponse: - """Read current TOML configuration + """Read current TOML configuration merged with launch script environment variables Returns: ConfigurationResponse with current configuration or error """ try: + # Get TOML configuration (with defaults if file doesn't exist) if not self.config_file_path.exists(): # Return default configuration with DLL detection if file doesn't exist from .dll_detection import DllDetectionService dll_service = DllDetectionService(self.log) - config = ConfigurationManager.get_defaults_with_dll_detection(dll_service) - return { - "success": True, - "config": config, - "message": "Using default configuration (config file not found)", - "error": None - } + toml_config = ConfigurationManager.get_defaults_with_dll_detection(dll_service) + else: + content = self.config_file_path.read_text(encoding='utf-8') + toml_config = ConfigurationManager.parse_toml_content(content) + + # Get script environment variables (if script exists) + script_values = {} + if self.lsfg_script_path.exists(): + try: + script_content = self.lsfg_script_path.read_text(encoding='utf-8') + script_values = ConfigurationManager.parse_script_content(script_content) + self.log.info(f"Parsed script values: {script_values}") + except Exception as e: + self.log.warning(f"Failed to parse launch script: {str(e)}") - content = self.config_file_path.read_text(encoding='utf-8') - config = ConfigurationManager.parse_toml_content(content) + # Merge TOML config with script values + config = ConfigurationManager.merge_config_with_script(toml_config, script_values) return { "success": True, @@ -151,7 +159,7 @@ class ConfigurationService(BaseService): ConfigurationResponse with success status """ try: - # Get current config + # Get current merged config (TOML + script) current_response = self.get_config() if not current_response["success"] or current_response["config"] is None: # If we can't read current config, use defaults with DLL detection |
