diff options
Diffstat (limited to 'src/services/configuration_service.py')
| -rw-r--r-- | src/services/configuration_service.py | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/services/configuration_service.py b/src/services/configuration_service.py new file mode 100644 index 0000000..a4975c5 --- /dev/null +++ b/src/services/configuration_service.py @@ -0,0 +1,164 @@ +import os +from typing import Dict, Any +import decky + + +class ConfigurationService: + """Service for managing lsfg script configuration""" + + def __init__(self): + self.user_home = os.path.expanduser("~") + self.lsfg_script_path = os.path.join(self.user_home, "lsfg") + + async def get_config(self) -> Dict[str, Any]: + """Read current lsfg script configuration""" + try: + if not os.path.exists(self.lsfg_script_path): + return { + "success": False, + "error": "lsfg script not found" + } + + with open(self.lsfg_script_path, 'r') as f: + content = f.read() + + # Parse the script content to extract current values + config = { + "enable_lsfg": False, + "multiplier": 2, + "flow_scale": 1.0, + "hdr": False, + "perf_mode": False, + "immediate_mode": False + } + + lines = content.split('\n') + for line in lines: + line = line.strip() + + # Handle ENABLE_LSFG - check if it's commented out or not + if line.startswith('export ENABLE_LSFG='): + try: + value = line.split('=')[1].strip() + config["enable_lsfg"] = value == '1' + except: + pass + elif line.startswith('# export ENABLE_LSFG='): + config["enable_lsfg"] = False + + # Handle LSFG_MULTIPLIER + elif line.startswith('export LSFG_MULTIPLIER='): + try: + value = line.split('=')[1].strip() + config["multiplier"] = int(value) + except: + pass + + # Handle LSFG_FLOW_SCALE + elif line.startswith('export LSFG_FLOW_SCALE='): + try: + value = line.split('=')[1].strip() + config["flow_scale"] = float(value) + except: + pass + + # Handle LSFG_HDR - check if it's commented out or not + elif line.startswith('export LSFG_HDR='): + try: + value = line.split('=')[1].strip() + config["hdr"] = value == '1' + except: + pass + elif line.startswith('# export LSFG_HDR='): + config["hdr"] = False + + # Handle LSFG_PERF_MODE - check if it's commented out or not + elif line.startswith('export LSFG_PERF_MODE='): + try: + value = line.split('=')[1].strip() + config["perf_mode"] = value == '1' + except: + pass + elif line.startswith('# export LSFG_PERF_MODE='): + config["perf_mode"] = False + + # Handle MESA_VK_WSI_PRESENT_MODE - check if it's commented out or not + elif line.startswith('export MESA_VK_WSI_PRESENT_MODE='): + try: + value = line.split('=')[1].strip() + # Remove any comments after the value + value = value.split('#')[0].strip() + config["immediate_mode"] = value == 'immediate' + except: + pass + elif line.startswith('# export MESA_VK_WSI_PRESENT_MODE='): + config["immediate_mode"] = False + + decky.logger.info(f"Parsed lsfg config: {config}") + + return { + "success": True, + "config": config + } + + except Exception as e: + decky.logger.error(f"Error reading lsfg config: {str(e)}") + return { + "success": False, + "error": str(e) + } + + async def update_config(self, enable_lsfg: bool, multiplier: int, flow_scale: float, + hdr: bool, perf_mode: bool, immediate_mode: bool) -> Dict[str, Any]: + """Update lsfg script configuration""" + try: + # Create script content based on parameters + script_content = "#!/bin/bash\n\n" + + if enable_lsfg: + script_content += "export ENABLE_LSFG=1\n" + else: + script_content += "# export ENABLE_LSFG=1\n" + + script_content += f"export LSFG_MULTIPLIER={multiplier}\n" + script_content += f"export LSFG_FLOW_SCALE={flow_scale}\n" + + if hdr: + script_content += "export LSFG_HDR=1\n" + else: + script_content += "# export LSFG_HDR=1\n" + + if perf_mode: + script_content += "export LSFG_PERF_MODE=1\n" + else: + script_content += "# export LSFG_PERF_MODE=1\n" + + if immediate_mode: + script_content += "export MESA_VK_WSI_PRESENT_MODE=immediate # - disable vsync\n" + else: + script_content += "# export MESA_VK_WSI_PRESENT_MODE=immediate # - disable vsync\n" + + # Add the exec line to allow the script to execute passed commands + script_content += "\n# Execute the passed command with the environment variables set\n" + script_content += "exec \"$@\"\n" + + # Write the updated script + with open(self.lsfg_script_path, 'w') as f: + f.write(script_content) + + # Make sure it's executable + os.chmod(self.lsfg_script_path, 0o755) + + decky.logger.info(f"Updated lsfg script configuration: enable={enable_lsfg}, multiplier={multiplier}, flow_scale={flow_scale}, hdr={hdr}, perf_mode={perf_mode}, immediate_mode={immediate_mode}") + + return { + "success": True, + "message": "lsfg configuration updated successfully" + } + + except Exception as e: + decky.logger.error(f"Error updating lsfg config: {str(e)}") + return { + "success": False, + "error": str(e) + } |
