Change where config settings, key and mouse bindings, and perapp settings are loaded...
authorDana Jansens <danakj@orodu.net>
Mon, 8 Aug 2011 20:40:09 +0000 (16:40 -0400)
committerDana Jansens <danakj@orodu.net>
Mon, 8 Aug 2011 21:27:00 +0000 (17:27 -0400)
Load settings from ~/.cache/openbox/config
Load key binds from ~/.config/openbox/keys
Load mouse binds from ~/.config/openbox/mouse
Load per app rules from ~/.config/openbox/applications

Split the rc.xsd file into keys.xsd, mouse.xsd and windows.xsd.

Didn't keep the stuff for "config" since that will be written by openbox, not by people.

14 files changed:
Makefile.am
data/applications [new file with mode: 0644]
data/applications.xsd [new file with mode: 0644]
data/keys [new file with mode: 0644]
data/keys.xsd [new file with mode: 0644]
data/menu [moved from data/menu.xml with 100% similarity]
data/mouse [new file with mode: 0644]
data/mouse.xsd [new file with mode: 0644]
data/rc.xml [deleted file]
data/rc.xsd [deleted file]
openbox/config.c
openbox/config.h
openbox/menu.c
openbox/openbox.c

index 082016b3988dfc633133d10a7419187e27cd82b4..961f4066dc9da199cf5f672f82c0e525c82643e7 100644 (file)
@@ -492,8 +492,10 @@ dist_pixmap_DATA = \
        data/openbox.png
 
 dist_rc_DATA = \
-       data/rc.xml \
-       data/menu.xml
+       data/keys \
+       data/mouse \
+       data/applications \
+       data/menu
 
 edit = $(SED) \
        -e 's!@version\@!$(VERSION)!' \
@@ -539,8 +541,6 @@ nodist_xsessions_DATA = \
        data/xsession/openbox-kde.desktop
 
 dist_noinst_DATA = \
-       data/rc.xsd \
-       data/menu.xsd \
        data/autostart/autostart.in \
        data/autostart/openbox-autostart.in \
        data/xsession/openbox.desktop.in \
@@ -587,7 +587,9 @@ dist_doc_DATA = \
        AUTHORS \
        CHANGELOG \
        COPYING \
-       data/rc.xsd \
+       data/keys.xsd \
+       data/mouse.xsd \
+       data/applications.xsd \
        data/menu.xsd \
        doc/rc-mouse-focus.xml
 
diff --git a/data/applications b/data/applications
new file mode 100644 (file)
index 0000000..08ed70a
--- /dev/null
@@ -0,0 +1,83 @@
+<applications>
+<!--
+  # this is an example with comments through out. use these to make your
+  # own rules, but without the comments of course.
+  # you may use one or more of the name/class/role/title/type rules to specify
+  # windows to match
+
+  <application name="the window's _OB_APP_NAME property (see obxprop)"
+              class="the window's _OB_APP_CLASS property (see obxprop)"
+               role="the window's _OB_APP_ROLE property (see obxprop)"
+              title="the window's _OB_APP_TITLE property (see obxprop)"
+               type="the window's _OB_APP_TYPE property (see obxprob)..
+                      (if unspecified, then it is 'dialog' for child windows)">
+  # you may set only one of name/class/role/title/type, or you may use more
+  # than one together to restrict your matches.
+
+  # the name, class, role, and title use simple wildcard matching such as those
+  # used by a shell. you can use * to match any characters and ? to match
+  # any single character.
+
+  # the type is one of: normal, dialog, splash, utility, menu, toolbar, dock,
+  #    or desktop
+
+  # when multiple rules match a window, they will all be applied, in the
+  # order that they appear in this list
+
+
+    # each rule element can be left out or set to 'default' to specify to not 
+    # change that attribute of the window
+
+    <decor>yes</decor>
+    # enable or disable window decorations
+
+    <shade>no</shade>
+    # make the window shaded when it appears, or not
+
+    <position force="no">
+      # the position is only used if both an x and y coordinate are provided
+      # (and not set to 'default')
+      # when force is "yes", then the window will be placed here even if it
+      # says you want it placed elsewhere.  this is to override buggy
+      # applications who refuse to behave
+      <x>center</x>
+      # a number like 50, or 'center' to center on screen. use a negative number
+      # to start from the right (or bottom for <y>), ie -50 is 50 pixels from the
+      # right edge (or bottom).
+      <y>200</y>
+      <monitor>1</monitor>
+      # specifies the monitor in a xinerama setup.
+      # 1 is the first head, or 'mouse' for wherever the mouse is
+    </position>
+
+    <focus>yes</focus>
+    # if the window should try be given focus when it appears. if this is set
+    # to yes it doesn't guarantee the window will be given focus. some
+    # restrictions may apply, but Openbox will try to
+
+    <desktop>1</desktop>
+    # 1 is the first desktop, 'all' for all desktops
+
+    <layer>normal</layer>
+    # 'above', 'normal', or 'below'
+
+    <iconic>no</iconic>
+    # make the window iconified when it appears, or not
+
+    <skip_pager>no</skip_pager>
+    # asks to not be shown in pagers
+
+    <skip_taskbar>no</skip_taskbar>
+    # asks to not be shown in taskbars. window cycling actions will also
+    # skip past such windows
+
+    <fullscreen>yes</fullscreen>
+    # make the window in fullscreen mode when it appears
+
+    <maximized>true</maximized>
+    # 'Horizontal', 'Vertical' or boolean (yes/no)
+  </application>
+
+  # end of the example
+-->
+</applications>
diff --git a/data/applications.xsd b/data/applications.xsd
new file mode 100644 (file)
index 0000000..6030c4a
--- /dev/null
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- -*- nxml -*- -->
+
+<!-- XML Schema for the Openbox window manager configuration file -->
+
+<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN"
+                               "http://www.w3.org/2001/XMLSchema.dtd" [
+<!ATTLIST schema xmlns:ob CDATA #IMPLIED>
+<!ENTITY % p "xsd:">
+<!ENTITY % s ":xsd">
+]>
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://openbox.org/4.0/rc"
+    xmlns:ob="http://openbox.org/4.0/rc"
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
+    <!--
+         root node
+      -->
+    <xsd:element name="applications">
+        <xsd:complexType>
+         <xsd:sequence>
+           <xsd:element maxOccurs="unbounded" name="application" type="ob:application"/>
+         </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:complexType name="application">
+        <xsd:all>
+            <xsd:element minOccurs="0" name="decor" type="ob:bool"/>
+            <xsd:element minOccurs="0" name="shade" type="ob:bool"/>
+            <xsd:element minOccurs="0" name="position" type="ob:window_position"/>
+            <xsd:element minOccurs="0" name="focus" type="xsd:string"/>
+            <xsd:element minOccurs="0" name="desktop" type="xsd:integer"/>
+            <xsd:element minOccurs="0" name="layer" type="ob:layer"/>
+            <xsd:element minOccurs="0" name="iconic" type="ob:bool"/>
+            <xsd:element minOccurs="0" name="skip_pager" type="ob:bool"/>
+            <xsd:element minOccurs="0" name="skip_taskbar" type="ob:bool"/>
+            <xsd:element minOccurs="0" name="fullscreen" type="ob:bool"/>
+            <xsd:element minOccurs="0" name="maximized" type="ob:maximization"/>
+        </xsd:all>
+        <!-- at least one of these must be present -->
+        <xsd:attribute name="role" type="xsd:string"/>
+        <xsd:attribute name="title" type="xsd:string"/>
+        <xsd:attribute name="type" type="ob:clienttype"/>
+        <xsd:attribute name="name" type="xsd:string"/>
+        <xsd:attribute name="class" type="xsd:string"/>
+    </xsd:complexType>
+    <xsd:simpleType name="bool">
+        <!-- this is copied to maximization.  Keep that in sync. -->
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="yes"/>
+            <xsd:enumeration value="no"/>
+            <xsd:enumeration value="true"/>
+            <xsd:enumeration value="false"/>
+            <xsd:enumeration value="on"/>
+            <xsd:enumeration value="off"/>
+        </xsd:restriction>
+    </xsd:simpleType>
+    <xsd:complexType name="window_position">
+        <xsd:all>
+            <xsd:element name="x" type="ob:center_or_int"/>
+            <xsd:element name="y" type="ob:center_or_int"/>
+            <xsd:element minOccurs="0" name="monitor" type="ob:mouse_or_int"/>    
+            <xsd:element minOccurs="0" name="head" type="xsd:string"/>
+        </xsd:all>
+        <xsd:attribute name="force" type="ob:bool"/>
+    </xsd:complexType>
+    <xsd:simpleType name="layer">
+        <xsd:restriction base="xsd:string">
+            <xsd:pattern value="[Aa][Bb][Oo][Vv][Ee]"/>
+            <xsd:pattern value="[Nn][Oo][Rr][Mm][Aa][Ll]"/>
+            <xsd:pattern value="[Bb][Ee][Ll][Oo][Ww]"/>
+        </xsd:restriction>
+    </xsd:simpleType>
+    <xsd:simpleType name="maximization">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="Horizontal"/>
+            <xsd:enumeration value="Vertical"/>
+            <!-- this is a copy of ob:bool.  Keep it in sync. -->
+            <xsd:enumeration value="yes"/>
+            <xsd:enumeration value="no"/>
+            <xsd:enumeration value="true"/>
+            <xsd:enumeration value="false"/>
+            <xsd:enumeration value="on"/>
+            <xsd:enumeration value="off"/>
+        </xsd:restriction>
+    </xsd:simpleType>
+    <xsd:simpleType name="clienttype">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="desktop"/>
+            <xsd:enumeration value="dock"/>
+            <xsd:enumeration value="toolbar"/>
+            <xsd:enumeration value="menu"/>
+            <xsd:enumeration value="splash"/>
+            <xsd:enumeration value="utility"/>
+            <xsd:enumeration value="dialog"/>
+            <xsd:enumeration value="normal"/>
+        </xsd:restriction>
+    </xsd:simpleType>
+</xsd:schema>
diff --git a/data/keys b/data/keys
new file mode 100644 (file)
index 0000000..ed5ae84
--- /dev/null
+++ b/data/keys
@@ -0,0 +1,118 @@
+<keys>
+  <!-- Keybindings for desktop switching -->
+  <keybind key="C-A-Left">
+    <action name="GoToDesktop"><to>left</to><wrap>no</wrap></action>
+  </keybind>
+  <keybind key="C-A-Right">
+    <action name="GoToDesktop"><to>right</to><wrap>no</wrap></action>
+  </keybind>
+  <keybind key="C-A-Up">
+    <action name="GoToDesktop"><to>up</to><wrap>no</wrap></action>
+  </keybind>
+  <keybind key="C-A-Down">
+    <action name="GoToDesktop"><to>down</to><wrap>no</wrap></action>
+  </keybind>
+  <keybind key="S-A-Left">
+    <action name="SendToDesktop"><to>left</to><wrap>no</wrap></action>
+  </keybind>
+  <keybind key="S-A-Right">
+    <action name="SendToDesktop"><to>right</to><wrap>no</wrap></action>
+  </keybind>
+  <keybind key="S-A-Up">
+    <action name="SendToDesktop"><to>up</to><wrap>no</wrap></action>
+  </keybind>
+  <keybind key="S-A-Down">
+    <action name="SendToDesktop"><to>down</to><wrap>no</wrap></action>
+  </keybind>
+  <keybind key="W-F1">
+    <action name="GoToDesktop"><to>1</to></action>
+  </keybind>
+  <keybind key="W-F2">
+    <action name="GoToDesktop"><to>2</to></action>
+  </keybind>
+  <keybind key="W-F3">
+    <action name="GoToDesktop"><to>3</to></action>
+  </keybind>
+  <keybind key="W-F4">
+    <action name="GoToDesktop"><to>4</to></action>
+  </keybind>
+  <keybind key="W-d">
+    <action name="ToggleShowDesktop"/>
+  </keybind>
+
+  <!-- Keybindings for windows -->
+  <keybind key="A-F4">
+    <action name="Close"/>
+  </keybind>
+  <keybind key="A-Escape">
+    <action name="Lower"/>
+    <action name="FocusToBottom"/>
+    <action name="Unfocus"/>
+  </keybind>
+  <keybind key="A-space">
+    <action name="ShowMenu"><menu>client-menu</menu></action>
+  </keybind>
+
+  <!-- Keybindings for window switching -->
+  <keybind key="A-Tab">
+    <action name="NextWindow">
+      <finalactions>
+        <action name="Focus"/>
+        <action name="Raise"/>
+        <action name="Unshade"/>
+      </finalactions>
+    </action>
+  </keybind>
+  <keybind key="A-S-Tab">
+    <action name="PreviousWindow">
+      <finalactions>
+        <action name="Focus"/>
+        <action name="Raise"/>
+        <action name="Unshade"/>
+      </finalactions>
+    </action>
+  </keybind>
+  <keybind key="C-A-Tab">
+    <action name="NextWindow">
+      <panels>yes</panels><desktop>yes</desktop>
+      <finalactions>
+        <action name="Focus"/>
+        <action name="Raise"/>
+        <action name="Unshade"/>
+      </finalactions>
+    </action>
+  </keybind>
+
+  <!-- Keybindings for window switching with the arrow keys -->
+  <keybind key="W-S-Right">
+    <action name="DirectionalCycleWindows">
+      <direction>right</direction>
+    </action>
+  </keybind>
+  <keybind key="W-S-Left">
+    <action name="DirectionalCycleWindows">
+      <direction>left</direction>
+    </action>
+  </keybind>
+  <keybind key="W-S-Up">
+    <action name="DirectionalCycleWindows">
+      <direction>up</direction>
+    </action>
+  </keybind>
+  <keybind key="W-S-Down">
+    <action name="DirectionalCycleWindows">
+      <direction>down</direction>
+    </action>
+  </keybind>
+
+  <!-- Keybindings for running applications -->
+  <keybind key="W-e">
+    <action name="Execute">
+      <startupnotify>
+        <enabled>true</enabled>
+        <name>Konqueror</name>
+      </startupnotify>
+      <command>kfmclient openProfile filemanagement</command>
+    </action>
+  </keybind>
+</keys>
diff --git a/data/keys.xsd b/data/keys.xsd
new file mode 100644 (file)
index 0000000..289adaa
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- -*- nxml -*- -->
+
+<!-- XML Schema for the Openbox window manager configuration file -->
+
+<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN"
+                               "http://www.w3.org/2001/XMLSchema.dtd" [
+<!ATTLIST schema xmlns:ob CDATA #IMPLIED>
+<!ENTITY % p "xsd:">
+<!ENTITY % s ":xsd">
+]>
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://openbox.org/4.0/rc"
+    xmlns:ob="http://openbox.org/4.0/rc"
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
+    <!--
+         root node
+      -->
+    <xsd:element name="keys">
+        <xsd:complexType>
+         <xsd:sequence>
+           <xsd:element maxOccurs="unbounded" name="keybind" type="ob:keybind"/>
+         </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:complexType name="keybind">
+        <xsd:choice>
+            <xsd:element maxOccurs="unbounded" name="action" type="xsd:string"/>
+            <xsd:element maxOccurs="unbounded" name="keybind" type="ob:keybind"/>
+        </xsd:choice>
+        <xsd:attribute name="chroot" type="ob:bool"/>
+        <xsd:attribute name="key" type="ob:keyname" use="required"/>
+    </xsd:complexType>
+</xsd:schema>
similarity index 100%
rename from data/menu.xml
rename to data/menu
diff --git a/data/mouse b/data/mouse
new file mode 100644 (file)
index 0000000..a512aed
--- /dev/null
@@ -0,0 +1,293 @@
+<mouse>
+  <context name="Frame">
+    <mousebind button="A-Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+    </mousebind>
+    <mousebind button="A-Left" action="Click">
+      <action name="Unshade"/>
+    </mousebind>
+    <mousebind button="A-Left" action="Drag">
+      <action name="Move"/>
+    </mousebind>
+
+    <mousebind button="A-Right" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="Unshade"/>
+    </mousebind>
+    <mousebind button="A-Right" action="Drag">
+      <action name="Resize"/>
+    </mousebind> 
+
+    <mousebind button="A-Middle" action="Press">
+      <action name="Lower"/>
+      <action name="FocusToBottom"/>
+      <action name="Unfocus"/>
+    </mousebind>
+
+    <mousebind button="A-Up" action="Click">
+      <action name="GoToDesktop"><to>previous</to></action>
+    </mousebind>
+    <mousebind button="A-Down" action="Click">
+      <action name="GoToDesktop"><to>next</to></action>
+    </mousebind>
+    <mousebind button="C-A-Up" action="Click">
+      <action name="GoToDesktop"><to>previous</to></action>
+    </mousebind>
+    <mousebind button="C-A-Down" action="Click">
+      <action name="GoToDesktop"><to>next</to></action>
+    </mousebind>
+    <mousebind button="A-S-Up" action="Click">
+      <action name="SendToDesktop"><to>previous</to></action>
+    </mousebind>
+    <mousebind button="A-S-Down" action="Click">
+      <action name="SendToDesktop"><to>next</to></action>
+    </mousebind>
+  </context>
+
+  <context name="Titlebar">
+    <mousebind button="Left" action="Drag">
+      <action name="Move"/>
+    </mousebind>
+    <mousebind button="Left" action="DoubleClick">
+      <action name="ToggleMaximize"/>
+    </mousebind>
+
+    <mousebind button="Up" action="Click">
+      <action name="if">
+        <shaded>no</shaded>
+        <then>
+          <action name="Shade"/>
+          <action name="FocusToBottom"/>
+          <action name="Unfocus"/>
+          <action name="Lower"/>
+        </then>
+      </action>
+    </mousebind>
+    <mousebind button="Down" action="Click">
+      <action name="if">
+        <shaded>yes</shaded>
+        <then>
+          <action name="Unshade"/>
+          <action name="Raise"/>
+        </then>
+      </action>
+    </mousebind>
+  </context>
+
+  <context name="Titlebar Top Right Bottom Left TLCorner TRCorner BRCorner BLCorner">
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="Unshade"/>
+    </mousebind>
+
+    <mousebind button="Middle" action="Press">
+      <action name="Lower"/>
+      <action name="FocusToBottom"/>
+      <action name="Unfocus"/>
+    </mousebind>
+
+    <mousebind button="Right" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="ShowMenu"><menu>client-menu</menu></action>
+    </mousebind>
+  </context>
+
+  <context name="Top">
+    <mousebind button="Left" action="Drag">
+      <action name="Resize"><edge>top</edge></action>
+    </mousebind>
+  </context>
+
+  <context name="Left">
+    <mousebind button="Left" action="Drag">
+      <action name="Resize"><edge>left</edge></action>
+    </mousebind>
+  </context>
+
+  <context name="Right">
+    <mousebind button="Left" action="Drag">
+      <action name="Resize"><edge>right</edge></action>
+    </mousebind>
+  </context>
+
+  <context name="Bottom">
+    <mousebind button="Left" action="Drag">
+      <action name="Resize"><edge>bottom</edge></action>
+    </mousebind>
+
+    <mousebind button="Right" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="ShowMenu"><menu>client-menu</menu></action>
+    </mousebind>
+  </context>
+
+  <context name="TRCorner BRCorner TLCorner BLCorner">
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="Unshade"/>
+    </mousebind>
+    <mousebind button="Left" action="Drag">
+      <action name="Resize"/>
+    </mousebind>
+  </context>
+
+  <context name="Client">
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+    </mousebind>
+    <mousebind button="Middle" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+    </mousebind>
+    <mousebind button="Right" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+    </mousebind>
+  </context>
+
+  <context name="Icon">
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="Unshade"/>
+      <action name="ShowMenu"><menu>client-menu</menu></action>
+    </mousebind>
+    <mousebind button="Right" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="ShowMenu"><menu>client-menu</menu></action>
+    </mousebind>
+  </context>
+
+  <context name="AllDesktops">
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="Unshade"/>
+    </mousebind>
+    <mousebind button="Left" action="Click">
+      <action name="ToggleOmnipresent"/>
+    </mousebind>
+  </context>
+
+  <context name="Shade">
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+    </mousebind>
+    <mousebind button="Left" action="Click">
+      <action name="ToggleShade"/>
+    </mousebind>
+  </context>
+
+  <context name="Iconify">
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+    </mousebind>
+    <mousebind button="Left" action="Click">
+      <action name="Iconify"/>
+    </mousebind>
+  </context>
+
+  <context name="Maximize">
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="Unshade"/>
+    </mousebind>
+    <mousebind button="Middle" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="Unshade"/>
+    </mousebind>
+    <mousebind button="Right" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="Unshade"/>
+    </mousebind>
+    <mousebind button="Left" action="Click">
+      <action name="ToggleMaximize"/>
+    </mousebind>
+    <mousebind button="Middle" action="Click">
+      <action name="ToggleMaximize"><direction>vertical</direction></action>
+    </mousebind>
+    <mousebind button="Right" action="Click">
+      <action name="ToggleMaximize"><direction>horizontal</direction></action>
+    </mousebind>
+  </context>
+
+  <context name="Close">
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+      <action name="Unshade"/>
+    </mousebind>
+    <mousebind button="Left" action="Click">
+      <action name="Close"/>
+    </mousebind>
+  </context>
+
+  <context name="Desktop">
+    <mousebind button="Up" action="Click">
+      <action name="GoToDesktop"><to>previous</to></action>
+    </mousebind>
+    <mousebind button="Down" action="Click">
+      <action name="GoToDesktop"><to>next</to></action>
+    </mousebind>
+
+    <mousebind button="A-Up" action="Click">
+      <action name="GoToDesktop"><to>previous</to></action>
+    </mousebind>
+    <mousebind button="A-Down" action="Click">
+      <action name="GoToDesktop"><to>next</to></action>
+    </mousebind>
+    <mousebind button="C-A-Up" action="Click">
+      <action name="GoToDesktop"><to>previous</to></action>
+    </mousebind>
+    <mousebind button="C-A-Down" action="Click">
+      <action name="GoToDesktop"><to>next</to></action>
+    </mousebind>
+
+    <mousebind button="Left" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+    </mousebind>
+    <mousebind button="Right" action="Press">
+      <action name="Focus"/>
+      <action name="Raise"/>
+    </mousebind>
+  </context>
+
+  <context name="Root">
+    <!-- Menus -->
+    <mousebind button="Middle" action="Press">
+      <action name="ShowMenu"><menu>client-list-combined-menu</menu></action>
+    </mousebind> 
+    <mousebind button="Right" action="Press">
+      <action name="ShowMenu"><menu>root-menu</menu></action>
+    </mousebind>
+  </context>
+
+  <context name="MoveResize">
+    <mousebind button="Up" action="Click">
+      <action name="GoToDesktop"><to>previous</to></action>
+    </mousebind>
+    <mousebind button="Down" action="Click">
+      <action name="GoToDesktop"><to>next</to></action>
+    </mousebind>
+    <mousebind button="A-Up" action="Click">
+      <action name="GoToDesktop"><to>previous</to></action>
+    </mousebind>
+    <mousebind button="A-Down" action="Click">
+      <action name="GoToDesktop"><to>next</to></action>
+    </mousebind>
+  </context>
+</mouse>
diff --git a/data/mouse.xsd b/data/mouse.xsd
new file mode 100644 (file)
index 0000000..9918a65
--- /dev/null
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?> <!-- -*- nxml -*- -->
+
+<!-- XML Schema for the Openbox window manager configuration file -->
+
+<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN"
+                               "http://www.w3.org/2001/XMLSchema.dtd" [
+<!ATTLIST schema xmlns:ob CDATA #IMPLIED>
+<!ENTITY % p "xsd:">
+<!ENTITY % s ":xsd">
+]>
+
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://openbox.org/4.0/rc"
+    xmlns:ob="http://openbox.org/4.0/rc"
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
+    <!--
+         root node
+      -->
+    <xsd:element name="mouse">
+        <xsd:complexType>
+         <xsd:sequence>
+           <xsd:element maxOccurs="unbounded" name="context" type="ob:context"/>
+         </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
+
+    <xsd:complexType name="context">
+        <xsd:sequence>
+            <xsd:element maxOccurs="unbounded" name="mousebind" type="ob:mousebind"/>
+        </xsd:sequence>
+        <xsd:attribute name="name" type="ob:contextname" use="required"/>
+    </xsd:complexType>
+    <xsd:complexType name="mousebind">
+        <xsd:sequence>
+            <xsd:element maxOccurs="unbounded" name="action" type="xsd:string"/>
+        </xsd:sequence>
+        <xsd:attribute name="action" type="ob:mouseaction" use="required"/>
+        <xsd:attribute name="button" type="ob:button" use="required"/>
+    </xsd:complexType>
+    <xsd:simpleType name="mouseaction">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="Click"/>
+            <xsd:enumeration value="DoubleClick"/>
+            <xsd:enumeration value="Drag"/>
+            <xsd:enumeration value="Press"/>
+            <xsd:enumeration value="Release"/>
+        </xsd:restriction>
+    </xsd:simpleType>
+    <xsd:simpleType name="button">
+        <xsd:restriction base="xsd:string">
+            <xsd:pattern value="(([ACMSW]|Mod[1-5])-){,5}(Left|Middle|Right|Up|Down|Button[0-9]+)"/>
+        </xsd:restriction>
+    </xsd:simpleType>
+    <xsd:simpleType name="contextname">
+        <xsd:restriction base="xsd:string">
+            <xsd:enumeration value="Desktop"/>
+            <xsd:enumeration value="Root"/>
+            <xsd:enumeration value="Client"/>
+            <xsd:enumeration value="Titlebar"/>
+            <xsd:enumeration value="Frame"/>
+            <xsd:enumeration value="TLCorner"/>
+            <xsd:enumeration value="TRCorner"/>
+            <xsd:enumeration value="BLCorner"/>
+            <xsd:enumeration value="BRCorner"/>
+            <xsd:enumeration value="Top"/>
+            <xsd:enumeration value="Left"/>
+            <xsd:enumeration value="Right"/>
+            <xsd:enumeration value="Bottom"/>
+            <xsd:enumeration value="Maximize"/>
+            <xsd:enumeration value="AllDesktops"/>
+            <xsd:enumeration value="Shade"/>
+            <xsd:enumeration value="Iconify"/>
+            <xsd:enumeration value="Icon"/>
+            <xsd:enumeration value="Close"/>
+            <xsd:enumeration value="MoveResize"/>
+        </xsd:restriction>
+    </xsd:simpleType>
+</xsd:schema>
diff --git a/data/rc.xml b/data/rc.xml
deleted file mode 100644 (file)
index 7598a72..0000000
+++ /dev/null
@@ -1,730 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- Do not edit this file, it will be overwritten on install.
-        Copy the file to $HOME/.config/openbox/ instead. -->
-
-<openbox_config xmlns="http://openbox.org/3.4/rc"
-               xmlns:xi="http://www.w3.org/2001/XInclude">
-
-<resistance>
-  <strength>10</strength>
-  <screen_edge_strength>20</screen_edge_strength>
-</resistance>
-
-<focus>
-  <focusNew>yes</focusNew>
-  <!-- always try to focus new windows when they appear. other rules do
-       apply -->
-  <followMouse>no</followMouse>
-  <!-- move focus to a window when you move the mouse into it -->
-  <focusLast>yes</focusLast>
-  <!-- focus the last used window when changing desktops, instead of the one
-       under the mouse pointer. when followMouse is enabled -->
-  <underMouse>no</underMouse>
-  <!-- move focus under the mouse, even when the mouse is not moving -->
-  <focusDelay>200</focusDelay>
-  <!-- when followMouse is enabled, the mouse must be inside the window for
-       this many milliseconds (1000 = 1 sec) before moving focus to it -->
-  <raiseOnFocus>no</raiseOnFocus>
-  <!-- when followMouse is enabled, and a window is given focus by moving the
-       mouse into it, also raise the window -->
-</focus>
-
-<placement>
-  <policy>Smart</policy>
-  <!-- 'Smart' or 'UnderMouse' -->
-  <center>yes</center>
-  <!-- whether to place windows in the center of the free area found or
-       the top left corner -->
-  <monitor>Primary</monitor>
-  <!-- with Smart placement on a multi-monitor system, try to place new windows
-       on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where
-       the active window is, 'Primary' - only on the primary monitor -->
-  <primaryMonitor>1</primaryMonitor>
-  <!-- The monitor where Openbox should place popup dialogs such as the
-       focus cycling popup, or the desktop switch popup.  It can be an index
-       from 1, specifying a particular monitor.  Or it can be one of the
-       following: 'Mouse' - where the mouse is, or
-                  'Active' - where the active window is -->
-</placement>
-
-<theme>
-  <name>Clearlooks</name>
-  <titleLayout>NLIMC</titleLayout>
-  <!--
-      available characters are NDSLIMC, each can occur at most once.
-      N: window icon
-      L: window label (AKA title).
-      I: iconify
-      M: maximize
-      C: close
-      S: shade (roll up/down)
-      D: omnipresent (on all desktops).
-  -->
-  <keepBorder>yes</keepBorder>
-  <animateIconify>yes</animateIconify>
-  <font place="ActiveWindow">
-    <name>sans</name>
-    <size>8</size>
-    <!-- font size in points -->
-    <weight>bold</weight>
-    <!-- 'bold' or 'normal' -->
-    <slant>normal</slant>
-    <!-- 'italic' or 'normal' -->
-  </font>
-  <font place="InactiveWindow">
-    <name>sans</name>
-    <size>8</size>
-    <!-- font size in points -->
-    <weight>bold</weight>
-    <!-- 'bold' or 'normal' -->
-    <slant>normal</slant>
-    <!-- 'italic' or 'normal' -->
-  </font>
-  <font place="MenuHeader">
-    <name>sans</name>
-    <size>9</size>
-    <!-- font size in points -->
-    <weight>normal</weight>
-    <!-- 'bold' or 'normal' -->
-    <slant>normal</slant>
-    <!-- 'italic' or 'normal' -->
-  </font>
-  <font place="MenuItem">
-    <name>sans</name>
-    <size>9</size>
-    <!-- font size in points -->
-    <weight>normal</weight>
-    <!-- 'bold' or 'normal' -->
-    <slant>normal</slant>
-    <!-- 'italic' or 'normal' -->
-  </font>
-  <font place="ActiveOnScreenDisplay">
-    <name>sans</name>
-    <size>9</size>
-    <!-- font size in points -->
-    <weight>bold</weight>
-    <!-- 'bold' or 'normal' -->
-    <slant>normal</slant>
-    <!-- 'italic' or 'normal' -->
-  </font>
-  <font place="InactiveOnScreenDisplay">
-    <name>sans</name>
-    <size>9</size>
-    <!-- font size in points -->
-    <weight>bold</weight>
-    <!-- 'bold' or 'normal' -->
-    <slant>normal</slant>
-    <!-- 'italic' or 'normal' -->
-  </font>
-</theme>
-
-<desktops>
-  <!-- this stuff is only used at startup, pagers allow you to change them
-       during a session
-
-       these are default values to use when other ones are not already set
-       by other applications, or saved in your session
-
-       use obconf if you want to change these without having to log out
-       and back in -->
-  <number>4</number>
-  <firstdesk>1</firstdesk>
-  <names>
-    <!-- set names up here if you want to, like this:
-    <name>desktop 1</name>
-    <name>desktop 2</name>
-    -->
-  </names>
-  <popupTime>875</popupTime>
-  <!-- The number of milliseconds to show the popup for when switching
-       desktops.  Set this to 0 to disable the popup. -->
-</desktops>
-
-<resize>
-  <drawContents>yes</drawContents>
-  <popupShow>Nonpixel</popupShow>
-  <!-- 'Always', 'Never', or 'Nonpixel' (xterms and such) -->
-  <popupPosition>Center</popupPosition>
-  <!-- 'Center', 'Top', or 'Fixed' -->
-  <popupFixedPosition>
-    <!-- these are used if popupPosition is set to 'Fixed' -->
-
-    <x>10</x>
-    <!-- positive number for distance from left edge, negative number for
-         distance from right edge, or 'Center' -->
-    <y>10</y>
-    <!-- positive number for distance from top edge, negative number for
-         distance from bottom edge, or 'Center' -->
-  </popupFixedPosition>
-</resize>
-
-<!-- You can reserve a portion of your screen where windows will not cover when
-     they are maximized, or when they are initially placed.
-     Many programs reserve space automatically, but you can use this in other
-     cases. -->
-<margins>
-  <top>0</top>
-  <bottom>0</bottom>
-  <left>0</left>
-  <right>0</right>
-</margins>
-
-<dock>
-  <position>TopLeft</position>
-  <!-- (Top|Bottom)(Left|Right|)|Top|Bottom|Left|Right|Floating -->
-  <floatingX>0</floatingX>
-  <floatingY>0</floatingY>
-  <noStrut>no</noStrut>
-  <stacking>Above</stacking>
-  <!-- 'Above', 'Normal', or 'Below' -->
-  <direction>Vertical</direction>
-  <!-- 'Vertical' or 'Horizontal' -->
-  <autoHide>no</autoHide>
-  <hideDelay>300</hideDelay>
-  <!-- in milliseconds (1000 = 1 second) -->
-  <showDelay>300</showDelay>
-  <!-- in milliseconds (1000 = 1 second) -->
-  <moveButton>Middle</moveButton>
-  <!-- 'Left', 'Middle', 'Right' -->
-</dock>
-
-<keyboard>
-  <chainQuitKey>C-g</chainQuitKey>
-
-  <!-- Keybindings for desktop switching -->
-  <keybind key="C-A-Left">
-    <action name="GoToDesktop"><to>left</to><wrap>no</wrap></action>
-  </keybind>
-  <keybind key="C-A-Right">
-    <action name="GoToDesktop"><to>right</to><wrap>no</wrap></action>
-  </keybind>
-  <keybind key="C-A-Up">
-    <action name="GoToDesktop"><to>up</to><wrap>no</wrap></action>
-  </keybind>
-  <keybind key="C-A-Down">
-    <action name="GoToDesktop"><to>down</to><wrap>no</wrap></action>
-  </keybind>
-  <keybind key="S-A-Left">
-    <action name="SendToDesktop"><to>left</to><wrap>no</wrap></action>
-  </keybind>
-  <keybind key="S-A-Right">
-    <action name="SendToDesktop"><to>right</to><wrap>no</wrap></action>
-  </keybind>
-  <keybind key="S-A-Up">
-    <action name="SendToDesktop"><to>up</to><wrap>no</wrap></action>
-  </keybind>
-  <keybind key="S-A-Down">
-    <action name="SendToDesktop"><to>down</to><wrap>no</wrap></action>
-  </keybind>
-  <keybind key="W-F1">
-    <action name="GoToDesktop"><to>1</to></action>
-  </keybind>
-  <keybind key="W-F2">
-    <action name="GoToDesktop"><to>2</to></action>
-  </keybind>
-  <keybind key="W-F3">
-    <action name="GoToDesktop"><to>3</to></action>
-  </keybind>
-  <keybind key="W-F4">
-    <action name="GoToDesktop"><to>4</to></action>
-  </keybind>
-  <keybind key="W-d">
-    <action name="ToggleShowDesktop"/>
-  </keybind>
-
-  <!-- Keybindings for windows -->
-  <keybind key="A-F4">
-    <action name="Close"/>
-  </keybind>
-  <keybind key="A-Escape">
-    <action name="Lower"/>
-    <action name="FocusToBottom"/>
-    <action name="Unfocus"/>
-  </keybind>
-  <keybind key="A-space">
-    <action name="ShowMenu"><menu>client-menu</menu></action>
-  </keybind>
-
-  <!-- Keybindings for window switching -->
-  <keybind key="A-Tab">
-    <action name="NextWindow">
-      <finalactions>
-        <action name="Focus"/>
-        <action name="Raise"/>
-        <action name="Unshade"/>
-      </finalactions>
-    </action>
-  </keybind>
-  <keybind key="A-S-Tab">
-    <action name="PreviousWindow">
-      <finalactions>
-        <action name="Focus"/>
-        <action name="Raise"/>
-        <action name="Unshade"/>
-      </finalactions>
-    </action>
-  </keybind>
-  <keybind key="C-A-Tab">
-    <action name="NextWindow">
-      <panels>yes</panels><desktop>yes</desktop>
-      <finalactions>
-        <action name="Focus"/>
-        <action name="Raise"/>
-        <action name="Unshade"/>
-      </finalactions>
-    </action>
-  </keybind>
-
-  <!-- Keybindings for window switching with the arrow keys -->
-  <keybind key="W-S-Right">
-    <action name="DirectionalCycleWindows">
-      <direction>right</direction>
-    </action>
-  </keybind>
-  <keybind key="W-S-Left">
-    <action name="DirectionalCycleWindows">
-      <direction>left</direction>
-    </action>
-  </keybind>
-  <keybind key="W-S-Up">
-    <action name="DirectionalCycleWindows">
-      <direction>up</direction>
-    </action>
-  </keybind>
-  <keybind key="W-S-Down">
-    <action name="DirectionalCycleWindows">
-      <direction>down</direction>
-    </action>
-  </keybind>
-
-  <!-- Keybindings for running applications -->
-  <keybind key="W-e">
-    <action name="Execute">
-      <startupnotify>
-        <enabled>true</enabled>
-        <name>Konqueror</name>
-      </startupnotify>
-      <command>kfmclient openProfile filemanagement</command>
-    </action>
-  </keybind>
-</keyboard>
-
-<mouse>
-  <dragThreshold>1</dragThreshold>
-  <!-- number of pixels the mouse must move before a drag begins -->
-  <doubleClickTime>200</doubleClickTime>
-  <!-- in milliseconds (1000 = 1 second) -->
-  <screenEdgeWarpTime>400</screenEdgeWarpTime>
-  <!-- Time before changing desktops when the pointer touches the edge of the
-       screen while moving a window, in milliseconds (1000 = 1 second).
-       Set this to 0 to disable warping -->
-  <screenEdgeWarpMouse>false</screenEdgeWarpMouse>
-  <!-- Set this to TRUE to move the mouse pointer across the desktop when
-       switching due to hitting the edge of the screen -->
-
-  <context name="Frame">
-    <mousebind button="A-Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-    </mousebind>
-    <mousebind button="A-Left" action="Click">
-      <action name="Unshade"/>
-    </mousebind>
-    <mousebind button="A-Left" action="Drag">
-      <action name="Move"/>
-    </mousebind>
-
-    <mousebind button="A-Right" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="Unshade"/>
-    </mousebind>
-    <mousebind button="A-Right" action="Drag">
-      <action name="Resize"/>
-    </mousebind> 
-
-    <mousebind button="A-Middle" action="Press">
-      <action name="Lower"/>
-      <action name="FocusToBottom"/>
-      <action name="Unfocus"/>
-    </mousebind>
-
-    <mousebind button="A-Up" action="Click">
-      <action name="GoToDesktop"><to>previous</to></action>
-    </mousebind>
-    <mousebind button="A-Down" action="Click">
-      <action name="GoToDesktop"><to>next</to></action>
-    </mousebind>
-    <mousebind button="C-A-Up" action="Click">
-      <action name="GoToDesktop"><to>previous</to></action>
-    </mousebind>
-    <mousebind button="C-A-Down" action="Click">
-      <action name="GoToDesktop"><to>next</to></action>
-    </mousebind>
-    <mousebind button="A-S-Up" action="Click">
-      <action name="SendToDesktop"><to>previous</to></action>
-    </mousebind>
-    <mousebind button="A-S-Down" action="Click">
-      <action name="SendToDesktop"><to>next</to></action>
-    </mousebind>
-  </context>
-
-  <context name="Titlebar">
-    <mousebind button="Left" action="Drag">
-      <action name="Move"/>
-    </mousebind>
-    <mousebind button="Left" action="DoubleClick">
-      <action name="ToggleMaximize"/>
-    </mousebind>
-
-    <mousebind button="Up" action="Click">
-      <action name="if">
-        <shaded>no</shaded>
-        <then>
-          <action name="Shade"/>
-          <action name="FocusToBottom"/>
-          <action name="Unfocus"/>
-          <action name="Lower"/>
-        </then>
-      </action>
-    </mousebind>
-    <mousebind button="Down" action="Click">
-      <action name="if">
-        <shaded>yes</shaded>
-        <then>
-          <action name="Unshade"/>
-          <action name="Raise"/>
-        </then>
-      </action>
-    </mousebind>
-  </context>
-
-  <context name="Titlebar Top Right Bottom Left TLCorner TRCorner BRCorner BLCorner">
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="Unshade"/>
-    </mousebind>
-
-    <mousebind button="Middle" action="Press">
-      <action name="Lower"/>
-      <action name="FocusToBottom"/>
-      <action name="Unfocus"/>
-    </mousebind>
-
-    <mousebind button="Right" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="ShowMenu"><menu>client-menu</menu></action>
-    </mousebind>
-  </context>
-
-  <context name="Top">
-    <mousebind button="Left" action="Drag">
-      <action name="Resize"><edge>top</edge></action>
-    </mousebind>
-  </context>
-
-  <context name="Left">
-    <mousebind button="Left" action="Drag">
-      <action name="Resize"><edge>left</edge></action>
-    </mousebind>
-  </context>
-
-  <context name="Right">
-    <mousebind button="Left" action="Drag">
-      <action name="Resize"><edge>right</edge></action>
-    </mousebind>
-  </context>
-
-  <context name="Bottom">
-    <mousebind button="Left" action="Drag">
-      <action name="Resize"><edge>bottom</edge></action>
-    </mousebind>
-
-    <mousebind button="Right" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="ShowMenu"><menu>client-menu</menu></action>
-    </mousebind>
-  </context>
-
-  <context name="TRCorner BRCorner TLCorner BLCorner">
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="Unshade"/>
-    </mousebind>
-    <mousebind button="Left" action="Drag">
-      <action name="Resize"/>
-    </mousebind>
-  </context>
-
-  <context name="Client">
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-    </mousebind>
-    <mousebind button="Middle" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-    </mousebind>
-    <mousebind button="Right" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-    </mousebind>
-  </context>
-
-  <context name="Icon">
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="Unshade"/>
-      <action name="ShowMenu"><menu>client-menu</menu></action>
-    </mousebind>
-    <mousebind button="Right" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="ShowMenu"><menu>client-menu</menu></action>
-    </mousebind>
-  </context>
-
-  <context name="AllDesktops">
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="Unshade"/>
-    </mousebind>
-    <mousebind button="Left" action="Click">
-      <action name="ToggleOmnipresent"/>
-    </mousebind>
-  </context>
-
-  <context name="Shade">
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-    </mousebind>
-    <mousebind button="Left" action="Click">
-      <action name="ToggleShade"/>
-    </mousebind>
-  </context>
-
-  <context name="Iconify">
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-    </mousebind>
-    <mousebind button="Left" action="Click">
-      <action name="Iconify"/>
-    </mousebind>
-  </context>
-
-  <context name="Maximize">
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="Unshade"/>
-    </mousebind>
-    <mousebind button="Middle" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="Unshade"/>
-    </mousebind>
-    <mousebind button="Right" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="Unshade"/>
-    </mousebind>
-    <mousebind button="Left" action="Click">
-      <action name="ToggleMaximize"/>
-    </mousebind>
-    <mousebind button="Middle" action="Click">
-      <action name="ToggleMaximize"><direction>vertical</direction></action>
-    </mousebind>
-    <mousebind button="Right" action="Click">
-      <action name="ToggleMaximize"><direction>horizontal</direction></action>
-    </mousebind>
-  </context>
-
-  <context name="Close">
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-      <action name="Unshade"/>
-    </mousebind>
-    <mousebind button="Left" action="Click">
-      <action name="Close"/>
-    </mousebind>
-  </context>
-
-  <context name="Desktop">
-    <mousebind button="Up" action="Click">
-      <action name="GoToDesktop"><to>previous</to></action>
-    </mousebind>
-    <mousebind button="Down" action="Click">
-      <action name="GoToDesktop"><to>next</to></action>
-    </mousebind>
-
-    <mousebind button="A-Up" action="Click">
-      <action name="GoToDesktop"><to>previous</to></action>
-    </mousebind>
-    <mousebind button="A-Down" action="Click">
-      <action name="GoToDesktop"><to>next</to></action>
-    </mousebind>
-    <mousebind button="C-A-Up" action="Click">
-      <action name="GoToDesktop"><to>previous</to></action>
-    </mousebind>
-    <mousebind button="C-A-Down" action="Click">
-      <action name="GoToDesktop"><to>next</to></action>
-    </mousebind>
-
-    <mousebind button="Left" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-    </mousebind>
-    <mousebind button="Right" action="Press">
-      <action name="Focus"/>
-      <action name="Raise"/>
-    </mousebind>
-  </context>
-
-  <context name="Root">
-    <!-- Menus -->
-    <mousebind button="Middle" action="Press">
-      <action name="ShowMenu"><menu>client-list-combined-menu</menu></action>
-    </mousebind> 
-    <mousebind button="Right" action="Press">
-      <action name="ShowMenu"><menu>root-menu</menu></action>
-    </mousebind>
-  </context>
-
-  <context name="MoveResize">
-    <mousebind button="Up" action="Click">
-      <action name="GoToDesktop"><to>previous</to></action>
-    </mousebind>
-    <mousebind button="Down" action="Click">
-      <action name="GoToDesktop"><to>next</to></action>
-    </mousebind>
-    <mousebind button="A-Up" action="Click">
-      <action name="GoToDesktop"><to>previous</to></action>
-    </mousebind>
-    <mousebind button="A-Down" action="Click">
-      <action name="GoToDesktop"><to>next</to></action>
-    </mousebind>
-  </context>
-</mouse>
-
-<menu>
-  <!-- You can specify more than one menu file in here and they are all loaded,
-       just don't make menu ids clash or, well, it'll be kind of pointless -->
-
-  <!-- default menu file (or custom one in $HOME/.config/openbox/) -->
-  <file>menu.xml</file>
-  <hideDelay>200</hideDelay>
-  <!-- if a press-release lasts longer than this setting (in milliseconds), the
-       menu is hidden again -->
-  <middle>no</middle>
-  <!-- center submenus vertically about the parent entry -->
-  <submenuShowDelay>100</submenuShowDelay>
-  <!-- time to delay before showing a submenu after hovering over the parent
-       entry.
-       if this is a negative value, then the delay is infinite and the
-       submenu will not be shown until it is clicked on -->
-  <submenuHideDelay>400</submenuHideDelay>
-  <!-- time to delay before hiding a submenu when selecting another
-       entry in parent menu -->
-       if this is a negative value, then the delay is infinite and the
-       submenu will not be hidden until a different submenu is opened -->
-  <applicationIcons>yes</applicationIcons>
-  <!-- controls if icons appear in the client-list-(combined-)menu -->
-  <manageDesktops>yes</manageDesktops>
-  <!-- show the manage desktops section in the client-list-(combined-)menu -->
-</menu>
-
-<applications>
-<!--
-  # this is an example with comments through out. use these to make your
-  # own rules, but without the comments of course.
-  # you may use one or more of the name/class/role/title/type rules to specify
-  # windows to match
-
-  <application name="the window's _OB_APP_NAME property (see obxprop)"
-              class="the window's _OB_APP_CLASS property (see obxprop)"
-               role="the window's _OB_APP_ROLE property (see obxprop)"
-              title="the window's _OB_APP_TITLE property (see obxprop)"
-               type="the window's _OB_APP_TYPE property (see obxprob)..
-                      (if unspecified, then it is 'dialog' for child windows)">
-  # you may set only one of name/class/role/title/type, or you may use more
-  # than one together to restrict your matches.
-
-  # the name, class, role, and title use simple wildcard matching such as those
-  # used by a shell. you can use * to match any characters and ? to match
-  # any single character.
-
-  # the type is one of: normal, dialog, splash, utility, menu, toolbar, dock,
-  #    or desktop
-
-  # when multiple rules match a window, they will all be applied, in the
-  # order that they appear in this list
-
-
-    # each rule element can be left out or set to 'default' to specify to not 
-    # change that attribute of the window
-
-    <decor>yes</decor>
-    # enable or disable window decorations
-
-    <shade>no</shade>
-    # make the window shaded when it appears, or not
-
-    <position force="no">
-      # the position is only used if both an x and y coordinate are provided
-      # (and not set to 'default')
-      # when force is "yes", then the window will be placed here even if it
-      # says you want it placed elsewhere.  this is to override buggy
-      # applications who refuse to behave
-      <x>center</x>
-      # a number like 50, or 'center' to center on screen. use a negative number
-      # to start from the right (or bottom for <y>), ie -50 is 50 pixels from the
-      # right edge (or bottom).
-      <y>200</y>
-      <monitor>1</monitor>
-      # specifies the monitor in a xinerama setup.
-      # 1 is the first head, or 'mouse' for wherever the mouse is
-    </position>
-
-    <focus>yes</focus>
-    # if the window should try be given focus when it appears. if this is set
-    # to yes it doesn't guarantee the window will be given focus. some
-    # restrictions may apply, but Openbox will try to
-
-    <desktop>1</desktop>
-    # 1 is the first desktop, 'all' for all desktops
-
-    <layer>normal</layer>
-    # 'above', 'normal', or 'below'
-
-    <iconic>no</iconic>
-    # make the window iconified when it appears, or not
-
-    <skip_pager>no</skip_pager>
-    # asks to not be shown in pagers
-
-    <skip_taskbar>no</skip_taskbar>
-    # asks to not be shown in taskbars. window cycling actions will also
-    # skip past such windows
-
-    <fullscreen>yes</fullscreen>
-    # make the window in fullscreen mode when it appears
-
-    <maximized>true</maximized>
-    # 'Horizontal', 'Vertical' or boolean (yes/no)
-  </application>
-
-  # end of the example
--->
-</applications>
-
-</openbox_config>
diff --git a/data/rc.xsd b/data/rc.xsd
deleted file mode 100644 (file)
index ad96994..0000000
+++ /dev/null
@@ -1,551 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?> <!-- -*- nxml -*- -->
-
-<!-- XML Schema for the Openbox window manager configuration file -->
-
-<!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN"
-                               "http://www.w3.org/2001/XMLSchema.dtd" [
-<!ATTLIST schema xmlns:ob CDATA #IMPLIED>
-<!ENTITY % p "xsd:">
-<!ENTITY % s ":xsd">
-]>
-
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
-    targetNamespace="http://openbox.org/4.0/rc"
-    xmlns:ob="http://openbox.org/4.0/rc"
-    elementFormDefault="qualified"
-    attributeFormDefault="unqualified">
-    <!--
-         root node
-      -->
-    <xsd:element name="openbox_config">
-        <xsd:annotation>
-            <xsd:documentation>all these elements are expected in a openbox config file</xsd:documentation>
-        </xsd:annotation>
-        <xsd:complexType>
-            <xsd:all>
-                <xsd:element name="resistance" type="ob:resistance"/>
-                <xsd:element name="focus" type="ob:focus"/>
-                <xsd:element name="placement" type="ob:placement"/>
-                <xsd:element name="theme" type="ob:theme"/>
-                <xsd:element name="desktops" type="ob:desktops"/>
-                <xsd:element name="resize" type="ob:resize"/>
-                <xsd:element minOccurs="0" name="margins" type="ob:margins"/>
-                <xsd:element name="dock" type="ob:dock"/>
-                <xsd:element name="keyboard" type="ob:keyboard"/>
-                <xsd:element name="mouse" type="ob:mouse"/>
-                <xsd:element name="menu" type="ob:menu"/>
-                <xsd:element name="applications" type="ob:applications"/>
-            </xsd:all>
-        </xsd:complexType>
-    </xsd:element>
-    <!--
-         complex types
-      -->
-    <xsd:complexType name="resistance">
-        <xsd:annotation>
-            <xsd:documentation>defines behaviour of windows when close to each other or the screen edge</xsd:documentation>
-        </xsd:annotation>
-        <xsd:all>
-            <xsd:element minOccurs="0" name="strength" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="screen_edge_strength" type="xsd:integer"/>
-        </xsd:all>
-    </xsd:complexType>
-    <xsd:complexType name="focus">
-        <xsd:annotation>
-            <xsd:documentation>defines aspects of window focus</xsd:documentation>
-        </xsd:annotation>
-        <xsd:all>
-            <xsd:element minOccurs="0" name="focusNew" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="focusLast" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="followMouse" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="underMouse" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="focusDelay" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="raiseOnFocus" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="unfocusOnLeave" type="ob:bool"/>
-        </xsd:all>
-    </xsd:complexType>
-    <xsd:complexType name="placement">
-        <xsd:annotation>
-            <xsd:documentation>defines how new windows are placed</xsd:documentation>
-        </xsd:annotation>
-        <xsd:sequence>
-            <xsd:element minOccurs="0" name="policy" type="ob:placementpolicy"/>
-            <xsd:element minOccurs="0" name="center" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="monitor" type="ob:placementmonitor"/>
-            <xsd:element minOccurs="0" name="monitor" type="ob:primarymonitor"/>
-        </xsd:sequence>
-    </xsd:complexType>
-    <xsd:complexType name="margins">
-        <xsd:annotation>
-            <xsd:documentation>defines desktop margins</xsd:documentation>
-        </xsd:annotation>
-        <xsd:all>
-            <xsd:element minOccurs="0" name="top" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="left" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="right" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="bottom" type="xsd:integer"/>
-        </xsd:all>
-    </xsd:complexType>              
-    <xsd:complexType name="theme">
-        <xsd:sequence>
-            <xsd:element minOccurs="0" name="name" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="titleLayout" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="keepBorder" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="animateIconify" type="ob:bool"/>
-            <xsd:element minOccurs="0" maxOccurs="unbounded" name="font" type="ob:font"/>
-        </xsd:sequence>
-    </xsd:complexType>
-    <xsd:complexType name="font">
-        <xsd:all>
-            <xsd:element minOccurs="0" name="name" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="size" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="weight" type="ob:fontweight"/>
-            <xsd:element minOccurs="0" name="slant" type="ob:fontslant"/>
-        </xsd:all>
-        <xsd:attribute name="place" type="ob:fontplace" use="required"/>
-    </xsd:complexType>
-    <xsd:complexType name="desktops">
-        <xsd:annotation>
-            <xsd:documentation>defines the number and names of desktops</xsd:documentation>
-        </xsd:annotation>
-        <xsd:all>
-            <xsd:element minOccurs="0" name="number" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="firstdesk" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="names">
-                <xsd:complexType>
-                    <xsd:sequence>
-                        <xsd:element minOccurs="0" maxOccurs="unbounded" name="name" type="xsd:string"/>
-                    </xsd:sequence>
-                </xsd:complexType>
-            </xsd:element>
-            <xsd:element minOccurs="0" name="popupTime" type="xsd:integer"/>
-        </xsd:all>
-    </xsd:complexType>
-    <xsd:complexType name="resize">
-        <xsd:all>
-            <xsd:element minOccurs="0" name="drawContents" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="popupShow" type="ob:popupshow"/>
-            <xsd:element minOccurs="0" name="popupPosition" type="ob:popupposition"/>
-            <xsd:element minOccurs="0" name="popupFixedPosition" type="ob:popupfixedposition"/>
-        </xsd:all>
-    </xsd:complexType>
-    <xsd:complexType name="popupfixedposition">
-        <xsd:all>
-            <xsd:element minOccurs="0" name="x" type="ob:center_or_int"/>
-            <xsd:element minOccurs="0" name="y" type="ob:center_or_int"/>
-        </xsd:all>
-    </xsd:complexType>
-    <xsd:complexType name="dock">
-        <xsd:all>
-            <xsd:element minOccurs="0" name="position" type="ob:dock_position"/>
-            <xsd:element minOccurs="0" name="floatingX" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="floatingY" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="noStrut" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="stacking" type="ob:layer"/>
-            <xsd:element minOccurs="0" name="direction" type="ob:direction"/>
-            <xsd:element minOccurs="0" name="autoHide" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="hideDelay" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="showDelay" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="moveButton" type="ob:button"/>
-        </xsd:all>
-    </xsd:complexType>
-    <xsd:complexType name="action">
-        <xsd:all>
-            <xsd:element minOccurs="0" name="execute" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="startupnotify" type="ob:notify"/>
-            <xsd:element minOccurs="0" name="command" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="allDesktops" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="menu" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="delta" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="x" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="y" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="left" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="right" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="up" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="down" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="desktop">
-                <xsd:simpleType>
-                    <xsd:union memberTypes="xsd:integer ob:bool"/>
-                </xsd:simpleType>
-            </xsd:element>
-            <xsd:element minOccurs="0" name="edge" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="wrap" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="follow" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="dialog" type="ob:dialogtype"/>
-            <xsd:element minOccurs="0" name="panels" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="here" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="linear" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="group" type="ob:bool"/>
-        </xsd:all>
-        <xsd:attribute name="name" type="ob:actionname" use="required"/>
-    </xsd:complexType>
-    <xsd:complexType name="keybind">
-        <xsd:choice>
-            <xsd:element maxOccurs="unbounded" name="action" type="ob:action"/>
-            <xsd:element maxOccurs="unbounded" name="keybind" type="ob:keybind"/>
-        </xsd:choice>
-        <xsd:attribute name="chroot" type="ob:bool"/>
-        <xsd:attribute name="key" type="ob:keyname" use="required"/>
-    </xsd:complexType>
-    <xsd:complexType name="keyboard">
-        <xsd:sequence>
-            <xsd:element minOccurs="0" name="chainQuitKey" type="ob:keyname"/>
-            <xsd:element maxOccurs="unbounded" name="keybind" type="ob:keybind"/>
-        </xsd:sequence>
-    </xsd:complexType>
-    <xsd:complexType name="mousebind">
-        <xsd:sequence>
-            <xsd:element maxOccurs="unbounded" name="action" type="ob:action"/>
-        </xsd:sequence>
-        <xsd:attribute name="action" type="ob:mouseaction" use="required"/>
-        <xsd:attribute name="button" type="ob:button" use="required"/>
-    </xsd:complexType>
-    <xsd:complexType name="context">
-        <xsd:sequence>
-            <xsd:element maxOccurs="unbounded" name="mousebind" type="ob:mousebind"/>
-        </xsd:sequence>
-        <xsd:attribute name="name" type="ob:contextname" use="required"/>
-    </xsd:complexType>
-    <xsd:complexType name="mouse">
-        <xsd:sequence>
-            <xsd:element minOccurs="0" name="dragThreshold" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="doubleClickTime" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="screenEdgeWarpTime" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="screenEdgeWarpMouse" type="ob:bool"/>
-            <xsd:element maxOccurs="unbounded" name="context" type="ob:context"/>
-        </xsd:sequence>
-    </xsd:complexType>
-    <xsd:complexType name="menu">
-        <xsd:sequence>
-            <xsd:element maxOccurs="unbounded" name="file" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="hideDelay" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="middle" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="submenuShowDelay" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="showIcons" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="manageDesktops" type="ob:bool"/>
-        </xsd:sequence>
-    </xsd:complexType>
-    <xsd:complexType name="window_position">
-        <xsd:all>
-            <xsd:element name="x" type="ob:center_or_int"/>
-            <xsd:element name="y" type="ob:center_or_int"/>
-            <xsd:element minOccurs="0" name="monitor" type="ob:mouse_or_int"/>    
-            <xsd:element minOccurs="0" name="head" type="xsd:string"/>
-        </xsd:all>
-        <xsd:attribute name="force" type="ob:bool"/>
-    </xsd:complexType>
-    <xsd:complexType name="application">
-        <xsd:all>
-            <xsd:element minOccurs="0" name="decor" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="shade" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="position" type="ob:window_position"/>
-            <xsd:element minOccurs="0" name="focus" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="desktop" type="xsd:integer"/>
-            <xsd:element minOccurs="0" name="layer" type="ob:layer"/>
-            <xsd:element minOccurs="0" name="iconic" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="skip_pager" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="skip_taskbar" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="fullscreen" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="maximized" type="ob:maximization"/>
-        </xsd:all>
-        <!-- at least one of these must be present -->
-        <xsd:attribute name="role" type="xsd:string"/>
-        <xsd:attribute name="title" type="xsd:string"/>
-        <xsd:attribute name="type" type="ob:clienttype"/>
-        <xsd:attribute name="name" type="xsd:string"/>
-        <xsd:attribute name="class" type="xsd:string"/>
-    </xsd:complexType>
-    <xsd:complexType name="applications">
-        <xsd:sequence>
-            <xsd:element minOccurs="0" maxOccurs="unbounded" name="application" type="ob:application"/>
-        </xsd:sequence>
-    </xsd:complexType>
-    <xsd:complexType name="notify">
-        <xsd:all>
-            <xsd:element minOccurs="0" name="enabled" type="ob:bool"/>
-            <xsd:element minOccurs="0" name="name" type="xsd:string"/>
-            <xsd:element minOccurs="0" name="icon" type="xsd:string"/>
-        </xsd:all>
-    </xsd:complexType>
-    <!--
-         simple types / restrictions
-      -->
-    <xsd:simpleType name="actionname">
-        <xsd:restriction base="xsd:string">
-            <xsd:pattern value="[Ii][Ff]"/>
-            <xsd:pattern value="[Aa][Cc][Tt][Ii][Vv][Aa][Tt][Ee]"/>
-            <xsd:pattern value="[Bb][Rr][Ee][Aa][Kk][Cc][Hh][Rr][Oo][Oo][Tt]"/>
-            <xsd:pattern value="[Cc][Ll][Oo][Ss][Ee]"/>
-            <xsd:pattern value="[Dd][Ee][Ss][Kk][Tt][Oo][Pp]"/>
-            <xsd:pattern value="[Dd][Ee][Ss][Kk][Tt][Oo][Pp][Dd][Oo][Ww][Nn]"/>
-            <xsd:pattern value="[Dd][Ee][Ss][Kk][Tt][Oo][Pp][Ll][Aa][Ss][Tt]"/>
-            <xsd:pattern value="[Dd][Ee][Ss][Kk][Tt][Oo][Pp][Ll][Ee][Ff][Tt]"/>
-            <xsd:pattern value="[Dd][Ee][Ss][Kk][Tt][Oo][Pp][Nn][Ee][Xx][Tt]"/>
-            <xsd:pattern value="[Dd][Ee][Ss][Kk][Tt][Oo][Pp][Pp][Rr][Ee][Vv][Ii][Oo][Uu][Ss]"/>
-            <xsd:pattern value="[Dd][Ee][Ss][Kk][Tt][Oo][Pp][Rr][Ii][Gg][Hh][Tt]"/>
-            <xsd:pattern value="[Dd][Ee][Ss][Kk][Tt][Oo][Pp][Uu][Pp]"/>
-            <xsd:pattern value="[Dd][Ii][Rr][Ee][Cc][Tt][Ii][Oo][Nn][Aa][Ll][Ff][Oo][Cc][Uu][Ss][Ee][Aa][Ss][Tt]"/>
-            <xsd:pattern value="[Dd][Ii][Rr][Ee][Cc][Tt][Ii][Oo][Nn][Aa][Ll][Ff][Oo][Cc][Uu][Ss][Nn][Oo][Rr][Tt][Hh]"/>
-            <xsd:pattern value="[Dd][Ii][Rr][Ee][Cc][Tt][Ii][Oo][Nn][Aa][Ll][Ff][Oo][Cc][Uu][Ss][Nn][Oo][Rr][Tt][Hh][Ee][Aa][Ss][Tt]"/>
-            <xsd:pattern value="[Dd][Ii][Rr][Ee][Cc][Tt][Ii][Oo][Nn][Aa][Ll][Ff][Oo][Cc][Uu][Ss][Nn][Oo][Rr][Tt][Hh][Ww][Ee][Ss][Tt]"/>
-            <xsd:pattern value="[Dd][Ii][Rr][Ee][Cc][Tt][Ii][Oo][Nn][Aa][Ll][Ff][Oo][Cc][Uu][Ss][Ss][Oo][Uu][Tt][Hh]"/>
-            <xsd:pattern value="[Dd][Ii][Rr][Ee][Cc][Tt][Ii][Oo][Nn][Aa][Ll][Ff][Oo][Cc][Uu][Ss][Ss][Oo][Uu][Tt][Hh][Ee][Aa][Ss][Tt]"/>
-            <xsd:pattern value="[Dd][Ii][Rr][Ee][Cc][Tt][Ii][Oo][Nn][Aa][Ll][Ff][Oo][Cc][Uu][Ss][Ss][Oo][Uu][Tt][Hh][Ww][Ee][Ss][Tt]"/>
-            <xsd:pattern value="[Dd][Ii][Rr][Ee][Cc][Tt][Ii][Oo][Nn][Aa][Ll][Ff][Oo][Cc][Uu][Ss][Ww][Ee][Ss][Tt]"/>
-            <xsd:pattern value="[Ee][Xx][Ee][Cc][Uu][Tt][Ee]"/>
-            <xsd:pattern value="[Ee][Xx][Ii][Tt]"/>
-            <xsd:pattern value="[Ss][Ee][Ss][Ss][Ii][Oo][Nn][Ll][Oo][Gg][Oo][Uu][Tt]"/>
-            <xsd:pattern value="[Ff][Oo][Cc][Uu][Ss]"/>
-            <xsd:pattern value="[Ff][Oo][Cc][Uu][Ss][Tt][Oo][Bb][Oo][Tt][Tt][Oo][Mm]"/>
-            <xsd:pattern value="[Gg][Rr][Oo][Ww][Tt][Oo][Ee][Dd][Gg][Ee][Ee][Aa][Ss][Tt]"/>
-            <xsd:pattern value="[Gg][Rr][Oo][Ww][Tt][Oo][Ee][Dd][Gg][Ee][Nn][Oo][Rr][Tt][Hh]"/>
-            <xsd:pattern value="[Gg][Rr][Oo][Ww][Tt][Oo][Ee][Dd][Gg][Ee][Ss][Oo][Uu][Tt][Hh]"/>
-            <xsd:pattern value="[Gg][Rr][Oo][Ww][Tt][Oo][Ee][Dd][Gg][Ee][Ww][Ee][Ss][Tt]"/>
-            <xsd:pattern value="[Ii][Cc][Oo][Nn][Ii][Ff][Yy]"/>
-            <xsd:pattern value="[Kk][Ii][Ll][Ll]"/>
-            <xsd:pattern value="[Ll][Oo][Ww][Ee][Rr]"/>
-            <xsd:pattern value="[Mm][Aa][Xx][Ii][Mm][Ii][Zz][Ee][Ff][Uu][Ll][Ll]"/>
-            <xsd:pattern value="[Mm][Aa][Xx][Ii][Mm][Ii][Zz][Ee][Hh][Oo][Rr][Zz]"/>
-            <xsd:pattern value="[Mm][Aa][Xx][Ii][Mm][Ii][Zz][Ee][Vv][Ee][Rr][Tt]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Rr][Ee][Ll][Aa][Tt][Ii][Vv][Ee]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Rr][Ee][Ll][Aa][Tt][Ii][Vv][Ee][Hh][Oo][Rr][Zz]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Rr][Ee][Ll][Aa][Tt][Ii][Vv][Ee][Vv][Ee][Rr][Tt]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Tt][Oo][Cc][Ee][Nn][Tt][Ee][Rr]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Ff][Rr][Oo][Mm][Ee][Dd][Gg][Ee][Ee][Aa][Ss][Tt]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Ff][Rr][Oo][Mm][Ee][Dd][Gg][Ee][Nn][Oo][Rr][Tt][Hh]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Ff][Rr][Oo][Mm][Ee][Dd][Gg][Ee][Ss][Oo][Uu][Tt][Hh]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Ff][Rr][Oo][Mm][Ee][Dd][Gg][Ee][Ww][Ee][Ss][Tt]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Tt][Oo][Ee][Dd][Gg][Ee][Ee][Aa][Ss][Tt]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Tt][Oo][Ee][Dd][Gg][Ee][Nn][Oo][Rr][Tt][Hh]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Tt][Oo][Ee][Dd][Gg][Ee][Ss][Oo][Uu][Tt][Hh]"/>
-            <xsd:pattern value="[Mm][Oo][Vv][Ee][Tt][Oo][Ee][Dd][Gg][Ee][Ww][Ee][Ss][Tt]"/>
-            <xsd:pattern value="[Nn][Ee][Xx][Tt][Ww][Ii][Nn][Dd][Oo][Ww]"/>
-            <xsd:pattern value="[Pp][Rr][Ee][Vv][Ii][Oo][Uu][Ss][Ww][Ii][Nn][Dd][Oo][Ww]"/>
-            <xsd:pattern value="[Rr][Aa][Ii][Ss][Ee]"/>
-            <xsd:pattern value="[Rr][Aa][Ii][Ss][Ee][Ll][Oo][Ww][Ee][Rr]"/>
-            <xsd:pattern value="[Rr][Ee][Cc][Oo][Nn][Ff][Ii][Gg][Uu][Rr][Ee]"/>
-            <xsd:pattern value="[Rr][Ee][Ss][Ii][Zz][Ee]"/>
-            <xsd:pattern value="[Rr][Ee][Ss][Ii][Zz][Ee][Rr][Ee][Ll][Aa][Tt][Ii][Vv][Ee]"/>
-            <xsd:pattern value="[Rr][Ee][Ss][Ii][Zz][Ee][Rr][Ee][Ll][Aa][Tt][Ii][Vv][Ee][Hh][Oo][Rr][Zz]"/>
-            <xsd:pattern value="[Rr][Ee][Ss][Ii][Zz][Ee][Rr][Ee][Ll][Aa][Tt][Ii][Vv][Ee][Vv][Ee][Rr][Tt]"/>
-            <xsd:pattern value="[Rr][Ee][Ss][Tt][Aa][Rr][Tt]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Bb][Oo][Tt][Tt][Oo][Mm][Ll][Aa][Yy][Ee][Rr]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Dd][Ee][Ss][Kk][Tt][Oo][Pp]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Dd][Ee][Ss][Kk][Tt][Oo][Pp][Dd][Oo][Ww][Nn]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Dd][Ee][Ss][Kk][Tt][Oo][Pp][Ll][Ee][Ff][Tt]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Dd][Ee][Ss][Kk][Tt][Oo][Pp][Nn][Ee][Xx][Tt]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Dd][Ee][Ss][Kk][Tt][Oo][Pp][Pp][Rr][Ee][Vv][Ii][Oo][Uu][Ss]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Dd][Ee][Ss][Kk][Tt][Oo][Pp][Rr][Ii][Gg][Hh][Tt]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Dd][Ee][Ss][Kk][Tt][Oo][Pp][Uu][Pp]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Nn][Oo][Rr][Mm][Aa][Ll][Ll][Aa][Yy][Ee][Rr]"/>
-            <xsd:pattern value="[Ss][Ee][Nn][Dd][Tt][Oo][Tt][Oo][Pp][Ll][Aa][Yy][Ee][Rr]"/>
-            <xsd:pattern value="[Ss][Hh][Aa][Dd][Ee]"/>
-            <xsd:pattern value="[Ss][Hh][Aa][Dd][Ee][Ll][Oo][Ww][Ee][Rr]"/>
-            <xsd:pattern value="[Ss][Hh][Oo][Ww][Dd][Ee][Ss][Kk][Tt][Oo][Pp]"/>
-            <xsd:pattern value="[Ss][Hh][Oo][Ww][Mm][Ee][Nn][Uu]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Aa][Ll][Ww][Aa][Yy][Ss][Oo][Nn][Bb][Oo][Tt][Tt][Oo][Mm]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Aa][Ll][Ww][Aa][Yy][Ss][Oo][Nn][Tt][Oo][Pp]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Dd][Ee][Cc][Oo][Rr][Aa][Tt][Ii][Oo][Nn][Ss]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Dd][Oo][Cc][Kk][Aa][Uu][Tt][Oo][Hh][Ii][Dd][Ee]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Ff][Uu][Ll][Ll][Ss][Cc][Rr][Ee][Ee][Nn]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Mm][Aa][Xx][Ii][Mm][Ii][Zz][Ee][Ff][Uu][Ll][Ll]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Mm][Aa][Xx][Ii][Mm][Ii][Zz][Ee][Hh][Oo][Rr][Zz]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Mm][Aa][Xx][Ii][Mm][Ii][Zz][Ee][Vv][Ee][Rr][Tt]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Oo][Mm][Nn][Ii][Pp][Rr][Ee][Ss][Ee][Nn][Tt]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Ss][Hh][Aa][Dd][Ee]"/>
-            <xsd:pattern value="[Tt][Oo][Gg][Gg][Ll][Ee][Ss][Hh][Oo][Ww][Dd][Ee][Ss][Kk][Tt][Oo][Pp]"/>
-            <xsd:pattern value="[Uu][Nn][Ff][Oo][Cc][Uu][Ss]"/>
-            <xsd:pattern value="[Uu][Nn][Mm][Aa][Xx][Ii][Mm][Ii][Zz][Ee][Ff][Uu][Ll][Ll]"/>
-            <xsd:pattern value="[Uu][Nn][Mm][Aa][Xx][Ii][Mm][Ii][Zz][Ee][Hh][Oo][Rr][Zz]"/>
-            <xsd:pattern value="[Uu][Nn][Mm][Aa][Xx][Ii][Mm][Ii][Zz][Ee][Vv][Ee][Rr][Tt]"/>
-            <xsd:pattern value="[Uu][Nn][Ss][Hh][Aa][Dd][Ee]"/>
-            <xsd:pattern value="[Uu][Nn][Ss][Hh][Aa][Dd][Ee][Rr][Aa][Ii][Ss][Ee]"/>
-            <xsd:pattern value="[Uu][Nn][Ss][Hh][Oo][Ww][Dd][Ee][Ss][Kk][Tt][Oo][Pp]"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="clienttype">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="desktop"/>
-            <xsd:enumeration value="dock"/>
-            <xsd:enumeration value="toolbar"/>
-            <xsd:enumeration value="menu"/>
-            <xsd:enumeration value="splash"/>
-            <xsd:enumeration value="utility"/>
-            <xsd:enumeration value="dialog"/>
-            <xsd:enumeration value="normal"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="bool">
-        <!-- this is copied to maximization.  Keep that in sync. -->
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="yes"/>
-            <xsd:enumeration value="no"/>
-            <xsd:enumeration value="true"/>
-            <xsd:enumeration value="false"/>
-            <xsd:enumeration value="on"/>
-            <xsd:enumeration value="off"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="fontplace">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="ActiveWindow"/>
-            <xsd:enumeration value="InactiveWindow"/>
-            <xsd:enumeration value="MenuHeader"/>
-            <xsd:enumeration value="MenuItem"/>
-            <xsd:enumeration value="OnScreenDisplay"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="fontweight">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="normal"/>
-            <xsd:enumeration value="bold"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="fontslant">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="normal"/>
-            <xsd:enumeration value="italic"/>
-            <xsd:enumeration value="opaque"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="button">
-        <xsd:restriction base="xsd:string">
-            <xsd:pattern value="(([ACMSW]|Mod[1-5])-){,5}(Left|Middle|Right|Up|Down|Button[0-9]+)"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="center_or_int">
-        <xsd:restriction base="xsd:string">
-            <!-- ob: atoi($_) unless $_ eq 'center'; -->
-            <!-- I think the regexp DTRT WRT atoi. -->
-            <xsd:pattern value="center|-?(0|[1-9][0-9]*)"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="mouse_or_int">
-        <xsd:restriction base="xsd:string">
-            <!-- ob: atoi($_) unless $_ eq 'center'; -->
-            <!-- I think the regexp DTRT WRT atoi. -->
-            <xsd:pattern value="mouse|0|[1-9][0-9]*"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="contextname">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="Desktop"/>
-            <xsd:enumeration value="Root"/>
-            <xsd:enumeration value="Client"/>
-            <xsd:enumeration value="Titlebar"/>
-            <xsd:enumeration value="Frame"/>
-            <xsd:enumeration value="TLCorner"/>
-            <xsd:enumeration value="TRCorner"/>
-            <xsd:enumeration value="BLCorner"/>
-            <xsd:enumeration value="BRCorner"/>
-            <xsd:enumeration value="Top"/>
-            <xsd:enumeration value="Left"/>
-            <xsd:enumeration value="Right"/>
-            <xsd:enumeration value="Bottom"/>
-            <xsd:enumeration value="Maximize"/>
-            <xsd:enumeration value="AllDesktops"/>
-            <xsd:enumeration value="Shade"/>
-            <xsd:enumeration value="Iconify"/>
-            <xsd:enumeration value="Icon"/>
-            <xsd:enumeration value="Close"/>
-            <xsd:enumeration value="MoveResize"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="direction">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="Horizontal"/>
-            <xsd:enumeration value="Vertical"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="dock_position">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="TopLeft"/>
-            <xsd:enumeration value="Top"/>
-            <xsd:enumeration value="TopRight"/>
-            <xsd:enumeration value="Right"/>
-            <xsd:enumeration value="BottomRight"/>
-            <xsd:enumeration value="Bottom"/>
-            <xsd:enumeration value="BottomLeft"/>
-            <xsd:enumeration value="Left"/>
-            <xsd:enumeration value="Floating"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="keyname">
-        <xsd:restriction base="xsd:string">
-            <!-- FIXME: M, Mod2, Mod5 in addition to S, A, C -->
-            <!-- how do we do all substrings and permutations? -->
-            <xsd:pattern value="(([ACMSW]|Mod[1-5])-){,5}[a-zA-Z0-9]*"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="layer">
-        <xsd:restriction base="xsd:string">
-            <xsd:pattern value="[Aa][Bb][Oo][Vv][Ee]"/>
-            <xsd:pattern value="[Nn][Oo][Rr][Mm][Aa][Ll]"/>
-            <xsd:pattern value="[Bb][Ee][Ll][Oo][Ww]"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="maximization">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="Horizontal"/>
-            <xsd:enumeration value="Vertical"/>
-            <!-- this is a copy of ob:bool.  Keep it in sync. -->
-            <xsd:enumeration value="yes"/>
-            <xsd:enumeration value="no"/>
-            <xsd:enumeration value="true"/>
-            <xsd:enumeration value="false"/>
-            <xsd:enumeration value="on"/>
-            <xsd:enumeration value="off"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="mouseaction">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="Click"/>
-            <xsd:enumeration value="DoubleClick"/>
-            <xsd:enumeration value="Drag"/>
-            <xsd:enumeration value="Press"/>
-            <xsd:enumeration value="Release"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="placementpolicy">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="Smart"/>
-            <xsd:enumeration value="UnderMouse"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="placementmonitor">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="Any"/>
-            <xsd:enumeration value="Mouse"/>
-            <xsd:enumeration value="Active"/>
-            <xsd:enumeration value="Primary"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="primarymonitor">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="Mouse"/>
-            <xsd:enumeration value="Active"/>
-            <xsd:enumeration value="[0-9][0-9][0-9][0-9][0-9]"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="popupposition">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="Top"/>
-            <xsd:enumeration value="Center"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="popupshow">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="Always"/>
-            <xsd:enumeration value="Never"/>
-            <xsd:enumeration value="Nonpixel"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-    <xsd:simpleType name="dialogtype">
-        <xsd:restriction base="xsd:string">
-            <xsd:enumeration value="None"/>
-            <xsd:enumeration value="Icons"/>
-            <xsd:enumeration value="List"/>
-        </xsd:restriction>
-    </xsd:simpleType>
-</xsd:schema>
index 9dd803beb6a4f7eaaf5fd017d19dfa30bcee6ecf..5f4d9c1eb19d56957efe702e1113e85de39e9a16 100644 (file)
@@ -370,7 +370,7 @@ static void parse_per_app_settings(xmlNodePtr node, gpointer d)
 
 */
 
-static void parse_key(xmlNodePtr node, GList *keylist)
+static void parse_keybind(xmlNodePtr node, GList *keylist)
 {
     gchar *keystring, **keys, **key;
     xmlNodePtr n;
@@ -387,7 +387,7 @@ static void parse_key(xmlNodePtr node, GList *keylist)
 
         if ((n = obt_xml_find_sibling(node->children, "keybind"))) {
             while (n) {
-                parse_key(n, keylist);
+                parse_keybind(n, keylist);
                 n = obt_xml_find_sibling(n->next, "keybind");
             }
         }
@@ -426,20 +426,12 @@ static void parse_keyboard(xmlNodePtr node, gpointer d)
     xmlNodePtr n;
     gchar *key;
 
-    keyboard_unbind_all();
-
     if ((n = obt_xml_find_sibling(node->children, "chainQuitKey"))) {
         key = obt_xml_node_string(n);
         translate_key(key, &config_keyboard_reset_state,
                       &config_keyboard_reset_keycode);
         g_free(key);
     }
-
-    if ((n = obt_xml_find_sibling(node->children, "keybind")))
-        while (n) {
-            parse_key(n, NULL);
-            n = obt_xml_find_sibling(n->next, "keybind");
-        }
 }
 
 /*
@@ -454,10 +446,7 @@ static void parse_keyboard(xmlNodePtr node, gpointer d)
 
 static void parse_mouse(xmlNodePtr node, gpointer d)
 {
-    xmlNodePtr n, nbut, nact;
-    gchar *buttonstr;
-    gchar *cxstr;
-    ObMouseAction mact;
+    xmlNodePtr n;
 
     mouse_unbind_all();
 
@@ -476,70 +465,72 @@ static void parse_mouse(xmlNodePtr node, gpointer d)
     }
     if ((n = obt_xml_find_sibling(node, "screenEdgeWarpMouse")))
         config_mouse_screenedgewarp = obt_xml_node_bool(n);
+}
 
-    n = obt_xml_find_sibling(node, "context");
-    while (n) {
-        gchar *modcxstr;
-        ObFrameContext cx;
-
-        if (!obt_xml_attr_string(n, "name", &cxstr))
-            goto next_n;
-
-        modcxstr = g_strdup(cxstr); /* make a copy to mutilate */
-        while (frame_next_context_from_string(modcxstr, &cx)) {
-            if (!cx) {
-                gchar *s = strchr(modcxstr, ' ');
-                if (s) {
-                    *s = '\0';
-                    g_message(_("Invalid context \"%s\" in mouse binding"),
-                              modcxstr);
-                    *s = ' ';
-                }
-                continue;
+static void parse_context(xmlNodePtr n, gpointer d)
+{
+    xmlNodePtr nbut, nact;
+    gchar *buttonstr;
+    gchar *cxstr;
+    ObMouseAction mact;
+    gchar *modcxstr;
+    ObFrameContext cx;
+
+    if (!obt_xml_attr_string(n, "name", &cxstr))
+        return;
+
+    modcxstr = g_strdup(cxstr); /* make a copy to mutilate */
+    while (frame_next_context_from_string(modcxstr, &cx)) {
+        if (!cx) {
+            gchar *s = strchr(modcxstr, ' ');
+            if (s) {
+                *s = '\0';
+                g_message(_("Invalid context \"%s\" in mouse binding"),
+                          modcxstr);
+                *s = ' ';
             }
+            continue;
+        }
 
-            nbut = obt_xml_find_sibling(n->children, "mousebind");
-            while (nbut) {
-                if (!obt_xml_attr_string(nbut, "button", &buttonstr))
-                    goto next_nbut;
-                if (obt_xml_attr_contains(nbut, "action", "press"))
-                    mact = OB_MOUSE_ACTION_PRESS;
-                else if (obt_xml_attr_contains(nbut, "action", "release"))
-                    mact = OB_MOUSE_ACTION_RELEASE;
-                else if (obt_xml_attr_contains(nbut, "action", "click"))
-                    mact = OB_MOUSE_ACTION_CLICK;
-                else if (obt_xml_attr_contains(nbut, "action","doubleclick"))
-                    mact = OB_MOUSE_ACTION_DOUBLE_CLICK;
-                else if (obt_xml_attr_contains(nbut, "action", "drag"))
-                    mact = OB_MOUSE_ACTION_MOTION;
-                else
-                    goto next_nbut;
-
-                nact = obt_xml_find_sibling(nbut->children, "action");
-                while (nact) {
-                    ObActionList *actions;
-                    ObActionParser *p;
-                    xmlChar *c;
-
-                    c = xmlNodeGetContent(nact);
-                    p = action_parser_new();
-                    if ((actions = action_parser_read_string(p, (gchar*)c)))
-                        mouse_bind(buttonstr, cx, mact, actions);
-                    nact = obt_xml_find_sibling(nact->next, "action");
-                    action_list_unref(actions);
-                    xmlFree(c);
-                    action_parser_unref(p);
-                }
+        nbut = obt_xml_find_sibling(n->children, "mousebind");
+        while (nbut) {
+            if (!obt_xml_attr_string(nbut, "button", &buttonstr))
+                goto next_nbut;
+            if (obt_xml_attr_contains(nbut, "action", "press"))
+                mact = OB_MOUSE_ACTION_PRESS;
+            else if (obt_xml_attr_contains(nbut, "action", "release"))
+                mact = OB_MOUSE_ACTION_RELEASE;
+            else if (obt_xml_attr_contains(nbut, "action", "click"))
+                mact = OB_MOUSE_ACTION_CLICK;
+            else if (obt_xml_attr_contains(nbut, "action","doubleclick"))
+                mact = OB_MOUSE_ACTION_DOUBLE_CLICK;
+            else if (obt_xml_attr_contains(nbut, "action", "drag"))
+                mact = OB_MOUSE_ACTION_MOTION;
+            else
+                goto next_nbut;
+
+            nact = obt_xml_find_sibling(nbut->children, "action");
+            while (nact) {
+                ObActionList *actions;
+                ObActionParser *p;
+                xmlChar *c;
+
+                c = xmlNodeGetContent(nact);
+                p = action_parser_new();
+                if ((actions = action_parser_read_string(p, (gchar*)c)))
+                    mouse_bind(buttonstr, cx, mact, actions);
+                nact = obt_xml_find_sibling(nact->next, "action");
+                action_list_unref(actions);
+                xmlFree(c);
+                action_parser_unref(p);
+            }
             g_free(buttonstr);
-            next_nbut:
+        next_nbut:
             nbut = obt_xml_find_sibling(nbut->next, "mousebind");
-            }
         }
-        g_free(modcxstr);
-        g_free(cxstr);
-    next_n:
-        n = obt_xml_find_sibling(n->next, "context");
     }
+    g_free(modcxstr);
+    g_free(cxstr);
 }
 
 static void parse_focus(xmlNodePtr node, gpointer d)
@@ -919,9 +910,6 @@ static void bind_default_keyboard(void)
 {
     ObDefKeyBind *it;
     ObDefKeyBind binds[] = {
-        { "Left",
-          "Execute startupnotify:yes name:Konqueror              \\\n"
-          "  command:(kfmclient openProfile filemanagement)" },
         { "A-Tab", "NextWindow" },
         { "S-A-Tab", "PreviousWindow" },
         { "A-F4", "Close" },
@@ -1013,8 +1001,37 @@ static void bind_default_mouse(void)
     action_parser_unref(p);
 }
 
-void config_startup(ObtXmlInst *i)
+void config_startup()
+{
+}
+
+enum ObConfigType {
+    CONFIG_FILE,
+    CACHE_FILE
+};
+
+static gboolean load_file(ObtXmlInst *i, enum ObConfigType type,
+                          const gchar *domain, const gchar *file)
 {
+    gboolean load = FALSE;
+
+    switch (type) {
+    case CONFIG_FILE:
+        load = obt_xml_load_config_file(i, domain, file, file);
+        break;
+    case CACHE_FILE:
+        load = obt_xml_load_cache_file(i, domain, file, file);
+        break;
+    }
+
+    return load;
+}
+
+gboolean config_load_config(void)
+{
+    ObtXmlInst *i = obt_xml_instance_new();
+    gboolean ok;
+
     config_focus_new = TRUE;
     config_focus_follow = FALSE;
     config_focus_delay = 0;
@@ -1087,8 +1104,6 @@ void config_startup(ObtXmlInst *i)
     translate_key("C-g", &config_keyboard_reset_state,
                   &config_keyboard_reset_keycode);
 
-    bind_default_keyboard();
-
     obt_xml_register(i, "keyboard", parse_keyboard, NULL);
 
     config_mouse_threshold = 8;
@@ -1096,8 +1111,6 @@ void config_startup(ObtXmlInst *i)
     config_mouse_screenedgetime = 400;
     config_mouse_screenedgewarp = FALSE;
 
-    bind_default_mouse();
-
     obt_xml_register(i, "mouse", parse_mouse, NULL);
 
     config_resist_win = 10;
@@ -1115,9 +1128,70 @@ void config_startup(ObtXmlInst *i)
 
     obt_xml_register(i, "menu", parse_menu, NULL);
 
-    config_per_app_settings = NULL;
+    ok = load_file(i, CACHE_FILE, "openbox", "config");
+    if (ok) {
+        obt_xml_tree_from_root(i);
+        obt_xml_close(i);
+    }
+    obt_xml_instance_unref(i);
+    return ok;
+}
 
+gboolean config_load_keys(void)
+{
+    ObtXmlInst *i = obt_xml_instance_new();
+    gboolean ok;
+
+    ok = load_file(i, CONFIG_FILE, "openbox", "keys");
+    if (!ok)
+        bind_default_keyboard();
+    else {
+        xmlNodePtr n, r;
+
+        r = obt_xml_root(i);
+        if ((n = obt_xml_find_sibling(r->children, "keybind")))
+            while (n) {
+                parse_keybind(n, NULL);
+                n = obt_xml_find_sibling(n->next, "keybind");
+            }
+    }
+    obt_xml_instance_unref(i);
+    return ok;
+}
+
+gboolean config_load_mouse(void)
+{
+    ObtXmlInst *i = obt_xml_instance_new();
+    gboolean ok;
+
+    obt_xml_register(i, "context", parse_context, NULL);
+
+    ok = load_file(i, CONFIG_FILE, "openbox", "mouse");
+    if (!ok)
+        bind_default_mouse();
+    else {
+        obt_xml_tree_from_root(i);
+        obt_xml_close(i);
+    }
+    obt_xml_instance_unref(i);
+    return ok;
+}
+
+gboolean config_load_windows(void)
+{
+    ObtXmlInst *i = obt_xml_instance_new();
+    gboolean ok;
+
+    config_per_app_settings = NULL;
     obt_xml_register(i, "applications", parse_per_app_settings, NULL);
+
+    ok = load_file(i, CONFIG_FILE, "openbox", "applications");
+    if (ok) {
+        obt_xml_tree_from_root(i);
+        obt_xml_close(i);
+    }
+    obt_xml_instance_unref(i);
+    return ok;
 }
 
 void config_shutdown(void)
index 90b6581a0229de8550debf6582aa7254dc5c6f4e..aef0f06b4396e2415ceb289f0f716f7ae8d56d9e 100644 (file)
@@ -206,9 +206,14 @@ extern GSList *config_menu_files;
 /*! Per app settings */
 extern GSList *config_per_app_settings;
 
-void config_startup(ObtXmlInst *i);
+void config_startup(void);
 void config_shutdown(void);
 
+gboolean config_load_config(void);
+gboolean config_load_keys(void);
+gboolean config_load_mouse(void);
+gboolean config_load_windows(void);
+
 /*! Create an ObAppSettings structure with the default values */
 ObAppSettings* config_create_app_settings(void);
 /*! Copies any settings in src to dest, if they are their default value in
index 54875d85e5a59326abf95e23430ec5450350d876..16e8448bf44525afbc0e7d12b3b7e5dcf1496304 100644 (file)
@@ -101,14 +101,14 @@ void menu_startup(gboolean reconfig)
     if (!loaded) {
         if (obt_xml_load_config_file(menu_parse_inst,
                                      "openbox",
-                                     "menu.xml",
+                                     "menu",
                                      "openbox_menu"))
         {
             obt_xml_tree_from_root(menu_parse_inst);
             obt_xml_close(menu_parse_inst);
         } else
             g_message(_("Unable to find a valid menu file \"%s\""),
-                      "menu.xml");
+                      "menu");
     }
 
     g_assert(menu_parse_state.parent == NULL);
index 14d0bd279a0d5067121448ea177a4dfee2622ed1..8cd9c878916ee7fe9af57181fb9e55f900d0c6a7 100644 (file)
@@ -105,7 +105,6 @@ static Cursor    cursors[OB_NUM_CURSORS];
 static gint      exitcode = 0;
 static guint     remote_control = 0;
 static gboolean  being_replaced = FALSE;
-static gchar    *config_file = NULL;
 static gchar    *startup_cmd = NULL;
 
 static void signal_handler(gint signal, gpointer data);
@@ -229,45 +228,22 @@ gint main(gint argc, gchar **argv)
 
             if (reconfigure) obt_keyboard_reload();
 
-            {
-                ObtXmlInst *i;
-
-                /* startup the parsing so everything can register sections
-                   of the rc */
-                i = obt_xml_instance_new();
+            config_startup();
 
+            {
                 /* register all the available actions and filters */
                 action_startup(reconfigure);
                 action_filter_startup(reconfigure);
-                /* start up config which sets up with the parser */
-                config_startup(i);
-
-                /* parse/load user options */
-                if ((config_file &&
-                     obt_xml_load_file(i, config_file, "openbox_config")) ||
-                    obt_xml_load_config_file(i, "openbox", "rc",
-                                             "openbox_config"))
-                {
-                    obt_xml_tree_from_root(i);
-                    obt_xml_close(i);
-                }
-                else {
-                    g_message(_("Unable to find a valid config file, using some simple defaults"));
-                    config_file = NULL;
-                }
-
-                if (config_file) {
-                    gchar *p = g_filename_to_utf8(config_file, -1,
-                                                  NULL, NULL, NULL);
-                    if (p)
-                        OBT_PROP_SETS(obt_root(ob_screen), OB_CONFIG_FILE, p);
-                    g_free(p);
-                }
-                else
-                    OBT_PROP_ERASE(obt_root(ob_screen), OB_CONFIG_FILE);
 
-                /* we're done with parsing now, kill it */
-                obt_xml_instance_unref(i);
+                /* set up the various file loaders */
+                config_load_config();
+                if (!config_load_keys())
+                    g_message(_("Unable to find a valid \"%s\" file, using some simple defaults"), "keys");
+                if (!config_load_mouse())
+                    g_message(_("Unable to find a valid \"%s\" file, using some simple defaults"), "mouse");
+                if (!config_load_windows())
+                    g_message(_("No \"%s\" file found, not using any rules"),
+                              "windows");
             }
 
             /* load the theme specified in the rc file */
@@ -533,10 +509,6 @@ static void print_help(void)
     g_print(_("  --help              Display this help and exit\n"));
     g_print(_("  --version           Display the version and exit\n"));
     g_print(_("  --replace           Replace the currently running window manager\n"));
-    /* TRANSLATORS: if you translate "FILE" here, make sure to keep the "Specify..."
-       aligned still, if you have to, make a new line with \n and 22 spaces. It's
-       fine to leave it as FILE though. */
-    g_print(_("  --config-file FILE  Specify the path to the config file to use\n"));
     g_print(_("  --sm-disable        Disable connection to the session manager\n"));
     g_print(_("\nPassing messages to a running Openbox instance:\n"));
     g_print(_("  --reconfigure       Reload Openbox's configuration\n"));
@@ -664,17 +636,6 @@ static void parse_args(gint *argc, gchar **argv)
         else if (!strcmp(argv[i], "--exit")) {
             remote_control = 3;
         }
-        else if (!strcmp(argv[i], "--config-file")) {
-            if (i == *argc - 1) /* no args left */
-                g_printerr(_("%s requires an argument\n"), "--config-file");
-            else {
-                /* this will be in the current locale encoding, which is
-                   what we want */
-                config_file = argv[i+1];
-                ++i; /* skip the argument */
-                ob_debug("--config-file %s", config_file);
-            }
-        }
         else if (!strcmp(argv[i], "--sm-save-file")) {
             if (i == *argc - 1) /* no args left */
                 /* not translated cuz it's sekret */