diff --git a/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/config_base.py b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/config_base.py new file mode 100644 index 00000000..02f9d2bb --- /dev/null +++ b/src/fenrirscreenreader/commands/vmenu-profiles/KEY/fenrir/config_base.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# Fenrir TTY screen reader +# By Chrys, Storm Dragon, and contributers. + +import os +import shutil +import tempfile +import configparser +from datetime import datetime + +class ConfigCommand(): + """Base class for configuration management commands""" + + def __init__(self): + self.env = None + self.settingsFile = None + self.config = None + + def initialize(self, environment): + self.env = environment + self.settingsFile = self.env['runtime']['settingsManager'].settingsFile + self.config = self.env['runtime']['settingsManager'].settings + + def shutdown(self): + pass + + def setCallback(self, callback): + pass + + def presentText(self, text, interrupt=True, flush=True): + """Present text to user with proper speech handling""" + self.env['runtime']['outputManager'].presentText(text, interrupt=interrupt, flush=flush) + + def playSound(self, soundName): + """Play system sound""" + soundIcon = '' + if soundName == 'Accept': + soundIcon = 'Accept' + elif soundName == 'Error': + soundIcon = 'ErrorSound' + elif soundName == 'Cancel': + soundIcon = 'Cancel' + + if soundIcon: + self.env['runtime']['outputManager'].presentText('', soundIcon=soundIcon, interrupt=False) + + def backupConfig(self, announce=True): + """Create backup of current configuration file""" + try: + if not os.path.exists(self.settingsFile): + message = "Configuration file not found" + if announce: + self.presentText(message) + return False, message + + # Create backup with timestamp + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + backup_path = f"{self.settingsFile}.backup_{timestamp}" + + shutil.copy2(self.settingsFile, backup_path) + + message = f"Configuration backed up to {backup_path}" + if announce: + self.presentText("Configuration backup created successfully") + return True, message + + except Exception as e: + message = f"Failed to backup configuration: {str(e)}" + if announce: + self.presentText(message) + return False, message + + def reloadConfig(self): + """Reload configuration from file""" + try: + # Force settings manager to reload from file + self.env['runtime']['settingsManager'].loadSettings() + self.config = self.env['runtime']['settingsManager'].settings + return True + + except Exception as e: + self.presentText(f"Failed to reload configuration: {str(e)}") + return False + + def findDefaultConfig(self): + """Find default configuration file path""" + # Look for default config in multiple locations + default_paths = [ + '/etc/fenrir/settings/settings.conf.default', + '/usr/share/fenrir/settings/settings.conf', + os.path.join(os.path.dirname(self.settingsFile), 'settings.conf.default'), + os.path.join(os.path.dirname(os.path.dirname(self.settingsFile)), 'settings', 'settings.conf.default') + ] + + for path in default_paths: + if os.path.exists(path): + return path + + return None + + def createBasicDefaults(self): + """Create basic default configuration manually""" + try: + # Create a new config with basic defaults + self.config = configparser.ConfigParser() + + # Add basic sections and settings + self.config.add_section('speech') + self.config.set('speech', 'driver', 'speechdDriver') + self.config.set('speech', 'rate', '0.75') + self.config.set('speech', 'pitch', '0.5') + self.config.set('speech', 'volume', '1.0') + + self.config.add_section('sound') + self.config.set('sound', 'driver', 'genericDriver') + self.config.set('sound', 'volume', '0.7') + + self.config.add_section('keyboard') + self.config.set('keyboard', 'driver', 'evdevDriver') + self.config.set('keyboard', 'keyboardLayout', 'desktop') + + self.config.add_section('screen') + self.config.set('screen', 'driver', 'vcsaDriver') + + self.config.add_section('general') + self.config.set('general', 'debugMode', 'Off') + + return True + + except Exception as e: + self.presentText(f"Failed to create basic defaults: {str(e)}") + return False \ No newline at end of file diff --git a/src/fenrirscreenreader/core/commandManager.py b/src/fenrirscreenreader/core/commandManager.py index 588fb996..c23af755 100644 --- a/src/fenrirscreenreader/core/commandManager.py +++ b/src/fenrirscreenreader/core/commandManager.py @@ -84,6 +84,9 @@ class commandManager(): fileName = fileName.split('/')[-1] if fileName.startswith('__'): continue + # Skip base classes that shouldn't be loaded as commands + if fileName.endswith('_base'): + continue # Check if command already exists to prevent duplicate loading if fileName.upper() in self.env['commands'][section] and self.env['commands'][section][fileName.upper()] is not None: continue diff --git a/src/fenrirscreenreader/core/settingsManager.py b/src/fenrirscreenreader/core/settingsManager.py index ab2eb055..0cad86b5 100644 --- a/src/fenrirscreenreader/core/settingsManager.py +++ b/src/fenrirscreenreader/core/settingsManager.py @@ -174,7 +174,8 @@ class settingsManager(): def loadDriver(self, driverName, driverType): try: - self.env['runtime'][driverType].shutdown(self.env) + if self.env['runtime'][driverType] is not None: + self.env['runtime'][driverType].shutdown(self.env) except Exception as e: self.env['runtime']['debug'].writeDebugOut('settingsManager loadDriver: Error shutting down driver: ' + str(e), debug.debugLevel.ERROR) try: diff --git a/src/fenrirscreenreader/core/vmenuManager.py b/src/fenrirscreenreader/core/vmenuManager.py index 74bd8d84..bf7fef43 100755 --- a/src/fenrirscreenreader/core/vmenuManager.py +++ b/src/fenrirscreenreader/core/vmenuManager.py @@ -269,6 +269,9 @@ class vmenuManager(): fileName = fileName.split('/')[-1] if fileName.startswith('__'): continue + # Skip base classes that shouldn't be loaded as commands + if fileName.endswith('_base'): + continue command = self.env['runtime']['commandManager'].loadFile(root + '/' + f) tree.update({fileName + ' ' + _('Action'): command}) except Exception as e: diff --git a/src/fenrirscreenreader/fenrirVersion.py b/src/fenrirscreenreader/fenrirVersion.py index 3490898f..85085a53 100644 --- a/src/fenrirscreenreader/fenrirVersion.py +++ b/src/fenrirscreenreader/fenrirVersion.py @@ -4,5 +4,5 @@ # Fenrir TTY screen reader # By Chrys, Storm Dragon, and contributers. -version = "2025.06.20" +version = "2025.06.25" codeName = "testing"