]> Dogcows Code - chaz/openbox/blobdiff - scripts/config.py
defn vars at the top of funcs
[chaz/openbox] / scripts / config.py
index c3c43754b180139d7164e023159d13c98f6fe25e..97a455966121f6adc787c046bec1bebb066ebfdd 100644 (file)
-#############################################################################
-### Options that can be defined on startup that affect the behavior of    ###
-### openbox.                                                              ###
-#############################################################################
+# Openbox's config system. Please use the defined functions instead of
+# accessing the internal data structures directly, for the sake of us all.
+
+import ob
+
+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.
+           ];
+  
+
+
+
+
+
+
+
+
+
+
+
+
 
-# client_buttons - a list of the modifier(s) and buttons which are grabbed on
-#                  client windows (for interactive move/resize, etc).
-#  examples: "A-2", "C-A-2", "W-1"
-client_buttons = ["A-1", "A-2", "A-3"]
 
-# theme - the theme used to decorate everything.
-theme = "/usr/local/share/openbox/styles/nyz"
 
 
 #############################################################################
-### Options that can be modified by the user to change the default hooks' ###
-### behaviors.                                                            ###
+### Options that can be changed to adjust the behavior of Openbox.        ###
 #############################################################################
 
-# click_focus - '1' if clicking in a client will cause it to focus in the
-#               default hook functions; else '0'.
-click_focus = 0
-# click_raise - '1' if clicking in a client will cause it to raise to the
-#               top of its stacking layer; else '0'.
-click_raise = 0
-# enter_focus - '1' if entering a client window will cause it to focus in the
-#               default hook functions; else '0'.
-enter_focus = 1
-# leave_unfocus - '1' if leaving a client window will cause it to unfocus in
-#                 the default hook functions; else '0'.
-leave_unfocus = 1
+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"
This page took 0.029875 seconds and 4 git commands to generate.