# Openbox's config system. Please use the defined functions instead of # accessing the internal data structures directly, for the sake of us all. def add(modulename, name, friendlyname, description, type, default, **keywords): """Add a variable to the configuration system. Add a variable to the configuration system for a module. modulename - The name of the module, e.g. 'focus' name - The name of the variable, e.g. 'my_variable' friendlyname - The user-friendly name of the variable, e.g. 'My Variable' description - The detailed destription of the variable, e.g. 'Does Things' type - The type of the variable, one of: - 'boolean' - 'enum' - 'integer' - 'string' - 'file' - 'function' - 'object' default - The default value for the variable, e.g. 300 keywords - Extra keyword=value pairs to further define the variable. These can be: - For 'enum' types: - options : A list of possible options for the variable. This *must* be set for all enum variables. - For 'integer' types: - min : The minimum value for the variable. - max : The maximum value for the variable. """ modulename = str(modulename).lower() name = str(name).lower() friendlyname = str(friendlyname) description = str(description) type = str(type).lower() # make sure the sub-dicts exist try: _settings[modulename] try: _settings[modulename][name] except KeyError: _settings[modulename][name] = {} except KeyError: _settings[modulename] = {} _settings[modulename][name] = {} # add the keywords first as they are used for the tests in set() for key,value in zip(keywords.keys(), keywords.values()): _settings[modulename][name][key] = value _settings[modulename][name]['name'] = friendlyname _settings[modulename][name]['description'] = description _settings[modulename][name]['type'] = type _settings[modulename][name]['default'] = default # put it through the tests try: set(modulename, name, default) except: del _settings[modulename][name] import sys raise sys.exc_info()[0], sys.exc_info()[1] # re-raise it def set(modulename, name, value): """Set a variable's value. Sets the value for a variable of the specified module. modulename - The name of the module, e.g. 'focus' name - The name of the variable, e.g. 'my_variable' value - The new value for the variable. """ modulename = str(modulename).lower() name = str(name).lower() # proper value checking for 'boolean's if _settings[modulename][name]['type'] == 'boolean': if not (value == 0 or value == 1): raise ValueError, 'Attempted to set ' + name + ' to a value of '+\ str(value) + ' but boolean variables can only contain 0 or'+\ ' 1.' # proper value checking for 'enum's elif _settings[modulename][name]['type'] == 'enum': options = _settings[modulename][name]['options'] if not value in options: raise ValueError, 'Attempted to set ' + name + ' to a value of '+\ str(value) + ' but this is not one of the possible values '+\ 'for this enum variable. Possible values are: ' +\ str(options) + "." # min/max checking for 'integer's elif _settings[modulename][name]['type'] == 'integer': try: min = _settings[modulename][name]['min'] if value < min: raise ValueError, 'Attempted to set ' + name + ' to a value '+\ ' of ' + str(value) + ' but it has a minimum value ' +\ ' of ' + str(min) + '.' except KeyError: pass try: max = _settings[modulename][name]['max'] if value > max: raise ValueError, 'Attempted to set ' + name + ' to a value '+\ ' of ' + str(value) + ' but it has a maximum value ' +\ ' of ' + str(min) + '.' except KeyError: pass _settings[modulename][name]['value'] = value def reset(modulename, name): """Reset a variable to its default value. Resets the value for a variable in the specified module back to its original (default) value. modulename - The name of the module, e.g. 'focus' name - The name of the variable, e.g. 'my_variable' """ modulename = str(modulename).lower() name = str(name).lower() _settings[modulename][name]['value'] = \ _settings[modulename][name]['default'] def get(modulename, name): """Returns the value of a variable. Returns the current value for a variable in the specified module. modulename - The name of the module, e.g. 'focus' name - The name of the variable, e.g. 'my variable' """ modulename = str(modulename).lower() name = str(name).lower() return _settings[modulename][name]['value'] #---------------------------- Internals --------------------------- """The main configuration dictionary, which holds sub-dictionaries for each module. The format for entries in here like this (for a string): _settings['modulename']['varname']['name'] = 'Text Label' _settings['modulename']['varname']['description'] = 'Does this' _settings['modulename']['varname']['type'] = 'string' _settings['modulename']['varname']['default'] = 'Foo' _settings['modulename']['varname']['value'] = 'Foo' # 'value' should always be initialized to the same # value as the 'default' field! Here's an example of an enum: _settings['modulename']['varname']['name'] = 'My Enum Variable' _settings['modulename']['varname']['description'] = 'Does Enum-like things.' _settings['modulename']['varname']['type'] = 'enum' _settings['modulename']['varname']['default'] = \ _settings['modulename']['varname']['value'] = [ 'Blue', 'Green', 'Pink' ] And Here's an example of an integer with bounds: _settings['modulename']['varname']['name'] = 'A Bounded Integer' _settings['modulename']['varname']['description'] = 'A fierce party animal!' _settings['modulename']['varname']['type'] = 'integer' _settings['modulename']['varname']['default'] = \ _settings['modulename']['varname']['value'] = 0 _settings['modulename']['varname']['min'] = 0 _settings['modulename']['varname']['max'] = 49 Hopefully you get the idea. """ _settings = {} """Valid values for a variable's type.""" _types = [ 'boolean', # Boolean types can only hold a value of 0 or 1. 'enum', # Enum types hold a value from a list of possible values. # An 'options' field *must* be provided for enums, # containing a list of possible values for the variable. 'integer', # Integer types hold a single number, as well as a 'min' # and 'max' property. # If the 'min' or 'max' is ignore then bounds checking # will not be performed in that direction. 'string', # String types hold a text string. 'file', # File types hold a file object. 'function',# Function types hold any callable object. 'object' # Object types can hold any python object. ]; ############################################################################# ### Options that can be changed to adjust the behavior of Openbox. ### ############################################################################# THEME = "/usr/local/share/openbox/styles/fieron2" """The theme used to decorate everything.""" #TITLEBAR_LAYOUT = [ "icon", "title", "alldesktops", "iconify", "maximize", "close" ] TITLEBAR_LAYOUT = "DITMC" """The layout of the buttons/label on client titlebars, can be made up of the following: I - iconify button L - text label M - maximize button, D - all-desktops button C - close button If no 'L' is included in the string, one will be added to the end by Openbox.""" DOUBLE_CLICK_DELAY = 300 """The number of milliseconds in which 2 clicks are perceived as a double-click.""" DRAG_THRESHOLD = 3 """The amount of pixels that you have to drag the mouse before motion events will start occuring.""" DESKTOP_NAMES = ["one", "two", "three", "four", "five", "six", "seven", \ "eight", "nine", "ten", "eleven", "twelve"] """The name of each desktop.""" NUMBER_OF_DESKTOPS = 4 """The number of desktops/workspaces which can be scrolled between.""" ############################################################################# print "Loaded config.py"