Merge branch 'backport' into work
authorMikael Magnusson <mikachu@gmail.com>
Sun, 5 Jul 2009 20:27:25 +0000 (22:27 +0200)
committerMikael Magnusson <mikachu@gmail.com>
Sat, 19 Sep 2009 13:03:12 +0000 (15:03 +0200)
Conflicts:
openbox/actions/desktop.c
openbox/client.c
openbox/event.c
openbox/extensions.c
openbox/popup.c
openbox/screen.c
parser/parse.c

51 files changed:
configure.ac
data/menu.xsd
data/rc.xsd
obt/paths.c
openbox/actions/desktop.c
openbox/actions/moveresizeto.c
openbox/client.c
openbox/event.c
openbox/frame.c
openbox/menu.c
openbox/popup.c
openbox/screen.c
openbox/startupnotify.c
po/LINGUAS
po/ar.po
po/bn_IN.po
po/ca.po
po/cs.po
po/da.po
po/de.po
po/en@boldquot.po
po/en@quot.po
po/es.po
po/et.po
po/eu.po
po/fi.po
po/fr.po
po/hr.po
po/hu.po
po/it.po
po/ja.po
po/lt.po
po/lv.po [new file with mode: 0644]
po/nl.po
po/no.po
po/openbox.pot
po/pl.po
po/pt.po
po/pt_BR.po
po/ru.po
po/sk.po
po/sr.po
po/sr@latin.po
po/sv.po
po/tr.po
po/uk.po [moved from po/ua.po with 69% similarity]
po/vi.po
po/zh_CN.po
po/zh_TW.po
render/gradient.c
render/theme.c

index 9f8f26f..78d0753 100644 (file)
@@ -94,7 +94,7 @@ if test "$SED" = "no"; then
   AC_MSG_ERROR([The program "sed" is not available. This program is required to build Openbox.])
 fi
 
-PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.6.0])
+PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.14.0])
 AC_SUBST(GLIB_CFLAGS)
 AC_SUBST(GLIB_LIBS)
 
index e3e1e17..2ff76b7 100644 (file)
 
 <!-- XML Schema for the Openbox window manager menu file -->
 
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+<!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/3.4/menu"
     xmlns:ob="http://openbox.org/3.4/menu"
-    elementFormDefault="qualified">
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
     <!--
          root node
       -->
-    <xs:element name="openbox_menu">
-        <xs:complexType mixed="false">
-            <xs:sequence maxOccurs="unbounded" minOccurs="1">
-                <xs:element name="menu" type="ob:menu"/>
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
+    <xsd:element name="openbox_menu">
+        <xsd:complexType mixed="false">
+            <xsd:sequence maxOccurs="unbounded" minOccurs="1">
+                <xsd:element name="menu" type="ob:menu"/>
+            </xsd:sequence>
+        </xsd:complexType>
+    </xsd:element>
     <!--
          complex types
       -->
-    <xs:complexType name="menu">
-        <xs:choice maxOccurs="unbounded" minOccurs="0">
-            <xs:element maxOccurs="unbounded" minOccurs="0" name="menu" type="ob:menu"/>
-            <xs:element maxOccurs="unbounded" minOccurs="0" name="item" type="ob:item"/>
-            <xs:element maxOccurs="unbounded" minOccurs="0" name="separator" type="ob:empty"/>
-        </xs:choice>
-        <xs:attribute name="label" type="xs:string" use="optional"/>
-        <xs:attribute name="execute" type="xs:string" use="optional"/>
-        <xs:attribute name="id" type="xs:string" use="required"/>
-    </xs:complexType>
-    <xs:complexType name="empty">
-        <xs:complexContent>
-            <xs:restriction base="xs:anyType"/>
-        </xs:complexContent>
-    </xs:complexType>
-    <xs:complexType name="item">
-        <xs:sequence>
-            <xs:element minOccurs="0" name="action">
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element minOccurs="0" name="execute" type="xs:string"/>
-                    </xs:sequence>
-                    <xs:attribute name="name" type="ob:actionname" use="required"/>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-        <xs:attribute name="label" type="xs:string" use="required"/>
-    </xs:complexType>
+    <!-- menu -->
+    <xsd:complexType name="menu">
+        <xsd:choice maxOccurs="unbounded" minOccurs="0">
+            <xsd:element name="menu" type="ob:menu"/>
+            <xsd:element name="item" type="ob:item"/>
+               <xsd:element name="separator" type="ob:separator"/>
+        </xsd:choice>
+        <xsd:attribute name="label" type="xsd:string" use="optional"/>
+        <xsd:attribute name="execute" type="xsd:string" use="optional"/>
+        <xsd:attribute name="id" type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <!-- separator -->
+    <xsd:complexType name="separator">
+        <xsd:attribute name="label" type="xsd:string" use="optional"/>
+    </xsd:complexType>
+
+    <!-- empty -->
+    <xsd:complexType name="empty">
+        <xsd:complexContent>
+            <xsd:restriction base="xsd:anyType"/>
+        </xsd:complexContent>
+    </xsd:complexType>
+
+    <!-- item -->
+    <xsd:complexType name="item">
+        <xsd:sequence>
+            <xsd:element name="action">
+                <xsd:complexType>
+                    <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:bool"/>
+                        <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:element>
+        </xsd:sequence>
+        <xsd:attribute name="label" type="xsd:string" use="required"/>
+    </xsd:complexType>
+
+    <!-- startupnotify -->
+    <xsd:complexType name="startupnotify">
+        <xsd:all>
+            <xsd:element minOccurs="1" name="enabled" type="xsd:string"/>
+            <xsd:element minOccurs="0" name="icon" type="xsd:string"/>
+            <xsd:element minOccurs="0" name="wmclass" type="xsd:string"/>
+        </xsd:all>
+    </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="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
       -->
-    <xs:simpleType name="actionname">
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="Execute"/>
-            <xs:enumeration value="Restart"/>
-            <xs:enumeration value="Reconfigure"/>
-            <xs:enumeration value="Exit"/>
-        </xs:restriction>
-    </xs:simpleType>
-</xs:schema>
+    <xsd:simpleType name="actionname">
+        <xsd:restriction base="xsd:string">
+            <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:schema>
index de227ea..499b81c 100644 (file)
@@ -2,10 +2,18 @@
 
 <!-- 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">
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
     <!--
          root node
       -->
             <xsd:documentation>all these elements are expected in a openbox config file</xsd:documentation>
         </xsd:annotation>
         <xsd:complexType>
-            <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 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: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>
     <!--
         <xsd:annotation>
             <xsd:documentation>defines behaviour of windows when close to each other or the screen edge</xsd:documentation>
         </xsd:annotation>
-        <xsd:element minOccurs="0" name="strength" type="xsd:integer"/>
-        <xsd:element minOccurs="0" name="screen_edge_strength" type="xsd:integer"/>
+        <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: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: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:all>
     </xsd:complexType>
     <xsd:complexType name="placement">
         <xsd:annotation>
             <xsd:documentation>defines how new windows are placed</xsd:documentation>
         </xsd:annotation>
-        <xsd:element name="policy" type="ob:placementpolicy"/>
-        <xsd:element name="center" type="ob:bool"/>
-        <xsd:element name="monitor" type="ob:placementmonitor"/>
+        <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:sequence>
     </xsd:complexType>
     <xsd:complexType name="margins">
         <xsd:annotation>
             <xsd:documentation>defines desktop margins</xsd:documentation>
         </xsd:annotation>
-        <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: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: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" name="font" type="ob:font"/>
+        <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: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: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: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:element maxOccurs="unbounded" name="name" type="xsd:string"/>
-            </xsd:complexType>
-        </xsd:element>
-        <xsd:element minOccurs="0" name="popupTime" type="xsd:integer"/>
+        <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: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="popupPosition" type="ob:popupfixedposition"/>
+        <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:element minOccurs="0" name="x" type="ob:center_or_int"/>
-        <xsd:element minOccurs="0" name="y" type="ob:center_or_int"/>
+        <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: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: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:element minOccurs="0" name="execute" type="xsd:string"/>
-        <xsd:element minOccurs="0" name="command" type="xsd:string"/>
-        <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" type="xsd:integer"/>
-        <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:bool"/>
-        <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: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:bool"/>
+            <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:attribute name="key" type="ob:keyname" use="required"/>
     </xsd:complexType>
     <xsd:complexType name="keyboard">
-        <xsd:element minOccurs="0" name="chainQuitKey" type="ob:keyname"/>
-        <xsd:element maxOccurs="unbounded" name="keybind" type="ob:keybind"/>
+        <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:element maxOccurs="unbounded" name="action" type="ob:action"/>
+        <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:element maxOccurs="unbounded" name="mousebind" type="ob:mousebind"/>
+        <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: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 maxOccurs="unbounded" name="context" type="ob:context"/>
+        <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 maxOccurs="unbounded" name="context" type="ob:context"/>
+        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="menu">
-        <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="applicationIcons" type="ob:bool"/>
-        <xsd:element minOccurs="0" name="manageDesktops" type="ob:bool"/>
+        <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="applicationIcons" type="ob:bool"/>
+            <xsd:element minOccurs="0" name="manageDesktops" type="ob:bool"/>
+        </xsd:sequence>
     </xsd:complexType>
     <xsd:complexType name="window_position">
-        <xsd:element name="x" type="ob:center_or_int"/>
-        <xsd:element name="y" type="ob:center_or_int"/>
-       <xsd:element name="monitor" type="ob:mouse_or_int"/>    
-        <xsd:element minOccurs="0" name="head" type="xsd:string"/>
+        <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:element minOccurs="0" name="decor" type="xsd: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>
+            <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>
         <xsd:attribute name="role" type="xsd:string"/>
         <xsd:attribute name="type" type="ob:clienttype"/>
         <!-- at least one of these must be present -->
         <xsd:attribute name="class" type="xsd:string"/>
     </xsd:complexType>
     <xsd:complexType name="applications">
-        <xsd:element minOccurs="0" maxOccurs="unbounded" name="application" type="ob:application"/>
+        <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:enumeration value="AddDesktop"/>
-            <xsd:enumeration value="BreakChroot"/>
-            <xsd:enumeration value="Close"/>
-            <xsd:enumeration value="Debug"/>
-            <xsd:enumeration value="Decorate"/>
-            <xsd:enumeration value="DirectionalCycleWindows"/>
-            <xsd:enumeration value="DirectionalTargetWindow"/>
-            <xsd:enumeration value="Execute"/>
-            <xsd:enumeration value="Exit"/>
-            <xsd:enumeration value="Focus"/>
-            <xsd:enumeration value="FocusToBottom"/>
-            <xsd:enumeration value="GoToDesktop"/>
-            <xsd:enumeration value="GrowToEdge"/>
-            <xsd:enumeration value="Iconify"/>
-            <xsd:enumeration value="If"/>
-            <xsd:enumeration value="Kill"/>
-            <xsd:enumeration value="Lower"/>
-            <xsd:enumeration value="Maximize"/>
-            <xsd:enumeration value="Move"/>
-            <xsd:enumeration value="MoveRelative"/>
-            <xsd:enumeration value="MoveResizeTo"/>
-            <xsd:enumeration value="MoveToEdge"/>
-            <xsd:enumeration value="NextWindow"/>
-            <xsd:enumeration value="PreviousWindow"/>
-            <xsd:enumeration value="Raise"/>
-            <xsd:enumeration value="RaiseLower"/>
-            <xsd:enumeration value="Reconfigure"/>
-            <xsd:enumeration value="RemoveDesktop"/>
-            <xsd:enumeration value="Resize"/>
-            <xsd:enumeration value="ResizeRelative"/>
-            <xsd:enumeration value="Restart"/>
-            <xsd:enumeration value="SendToDesktop"/>
-            <xsd:enumeration value="SendToLayer"/>
-            <xsd:enumeration value="Shade"/>
-            <xsd:enumeration value="ShowMenu"/>
-            <xsd:enumeration value="ToggleAlwaysOnBottom"/>
-            <xsd:enumeration value="ToggleAlwaysOnTop"/>
-            <xsd:enumeration value="ToggleDecorations"/>
-            <xsd:enumeration value="ToggleDockAutoHide"/>
-            <xsd:enumeration value="ToggleFullscreen"/>
-            <xsd:enumeration value="ToggleMaximize"/>
-            <xsd:enumeration value="ToggleOmnipresent"/>
-            <xsd:enumeration value="ToggleShade"/>
-            <xsd:enumeration value="ToggleShowDesktop"/>
-            <xsd:enumeration value="Undecorate"/>
-            <xsd:enumeration value="Unfocus"/>
-            <xsd:enumeration value="Unmaximize"/>
-            <xsd:enumeration value="Unshade"/>
+            <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:simpleType>
     <xsd:simpleType name="button">
         <xsd:restriction base="xsd:string">
-            <!-- FIXME what??? -->
-            <xsd:enumeration value="Left"/>
-            <xsd:enumeration value="Middle"/>
-            <xsd:enumeration value="Right"/>
-            <xsd:enumeration value="Up"/>
-            <xsd:enumeration value="Down"/>
-            <xsd:enumeration value="A-Left"/>
-            <xsd:enumeration value="A-Middle"/>
-            <xsd:enumeration value="A-Right"/>
-            <xsd:enumeration value="A-Up"/>
-            <xsd:enumeration value="A-Down"/>
-            <xsd:enumeration value="C-A-Left"/>
-            <xsd:enumeration value="C-A-Middle"/>
-            <xsd:enumeration value="C-A-Right"/>
-            <xsd:enumeration value="C-A-Up"/>
-            <xsd:enumeration value="C-A-Down"/>
+            <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:pattern value="center|-?(0|[1-9][0-9]*)"/>
         </xsd:restriction>
     </xsd:simpleType>
     <xsd:simpleType name="mouse_or_int">
         <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="(A-)?(S-)?(A-)?(C-)?(A-)?(S-)?(A-)?[a-zA-Z0-9]*"/>
+            <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:enumeration value="Above"/>
-            <xsd:enumeration value="Normal"/>
-            <xsd:enumeration value="Below"/>
+            <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">
index 6100499..6861543 100644 (file)
@@ -169,14 +169,16 @@ void obt_paths_unref(ObtPaths *p)
 
 gchar *obt_paths_expand_tilde(const gchar *f)
 {
-    gchar **spl;
     gchar *ret;
+    GRegex *regex;
 
     if (!f)
         return NULL;
-    spl = g_strsplit(f, "~", 0);
-    ret = g_strjoinv(g_get_home_dir(), spl);
-    g_strfreev(spl);
+
+    regex = g_regex_new("(?:^|(?<=[ \\t]))~(?=[/ \\t$])", G_REGEX_MULTILINE | G_REGEX_RAW, 0, NULL);
+    ret = g_regex_replace_literal(regex, f, -1, 0, g_get_home_dir(), 0, NULL);
+    g_regex_unref(regex);
+
     return ret;
 }
 
index e352aa2..edd22aa 100644 (file)
@@ -21,7 +21,7 @@ typedef struct {
             gboolean wrap;
             ObDirection dir;
         } rel;
-    };
+    } u;
     gboolean send;
     gboolean follow;
 } Options;
@@ -46,9 +46,9 @@ static gpointer setup_go_func(xmlNodePtr node)
     o = g_new0(Options, 1);
     /* don't go anywhere if theres no options given */
     o->type = ABSOLUTE;
-    o->abs.desktop = screen_desktop;
+    o->u.abs.desktop = screen_desktop;
     /* wrap by default - it's handy! */
-    o->rel.wrap = TRUE;
+    o->u.rel.wrap = TRUE;
 
     if ((n = obt_parse_find_node(node, "to"))) {
         gchar *s = obt_parse_node_string(n);
@@ -56,43 +56,43 @@ static gpointer setup_go_func(xmlNodePtr node)
             o->type = LAST;
         else if (!g_ascii_strcasecmp(s, "next")) {
             o->type = RELATIVE;
-            o->rel.linear = TRUE;
-            o->rel.dir = OB_DIRECTION_EAST;
+            o->u.rel.linear = TRUE;
+            o->u.rel.dir = OB_DIRECTION_EAST;
         }
         else if (!g_ascii_strcasecmp(s, "previous")) {
             o->type = RELATIVE;
-            o->rel.linear = TRUE;
-            o->rel.dir = OB_DIRECTION_WEST;
+            o->u.rel.linear = TRUE;
+            o->u.rel.dir = OB_DIRECTION_WEST;
         }
         else if (!g_ascii_strcasecmp(s, "north") ||
                  !g_ascii_strcasecmp(s, "up")) {
             o->type = RELATIVE;
-            o->rel.dir = OB_DIRECTION_NORTH;
+            o->u.rel.dir = OB_DIRECTION_NORTH;
         }
         else if (!g_ascii_strcasecmp(s, "south") ||
                  !g_ascii_strcasecmp(s, "down")) {
             o->type = RELATIVE;
-            o->rel.dir = OB_DIRECTION_SOUTH;
+            o->u.rel.dir = OB_DIRECTION_SOUTH;
         }
         else if (!g_ascii_strcasecmp(s, "west") ||
                  !g_ascii_strcasecmp(s, "left")) {
             o->type = RELATIVE;
-            o->rel.dir = OB_DIRECTION_WEST;
+            o->u.rel.dir = OB_DIRECTION_WEST;
         }
         else if (!g_ascii_strcasecmp(s, "east") ||
                  !g_ascii_strcasecmp(s, "right")) {
             o->type = RELATIVE;
-            o->rel.dir = OB_DIRECTION_EAST;
+            o->u.rel.dir = OB_DIRECTION_EAST;
         }
         else {
             o->type = ABSOLUTE;
-            o->abs.desktop = atoi(s) - 1;
+            o->u.abs.desktop = atoi(s) - 1;
         }
         g_free(s);
     }
 
     if ((n = obt_parse_find_node(node, "wrap")))
-        o->rel.wrap = obt_parse_node_bool(n);
+        o->u.rel.wrap = obt_parse_node_bool(n);
 
     return o;
 }
@@ -123,11 +123,11 @@ static gboolean run_func(ObActionsData *data, gpointer options)
         d = screen_last_desktop;
         break;
     case ABSOLUTE:
-        d = o->abs.desktop;
+        d = o->u.abs.desktop;
         break;
     case RELATIVE:
         d = screen_find_desktop(screen_desktop,
-                                o->rel.dir, o->rel.wrap, o->rel.linear);
+                                o->u.rel.dir, o->u.rel.wrap, o->u.rel.linear);
         break;
     }
 
index 357c731..3ee3498 100644 (file)
@@ -6,7 +6,9 @@
 
 enum {
     CURRENT_MONITOR = -1,
-    ALL_MONITORS = -2
+    ALL_MONITORS = -2,
+    NEXT_MONITOR = -3,
+    PREV_MONITOR = -4
 };
 
 typedef struct {
@@ -84,6 +86,10 @@ static gpointer setup_func(xmlNodePtr node)
         if (g_ascii_strcasecmp(s, "current") != 0) {
             if (!g_ascii_strcasecmp(s, "all"))
                 o->monitor = ALL_MONITORS;
+            else if(!g_ascii_strcasecmp(s, "next"))
+                o->monitor = NEXT_MONITOR;
+            else if(!g_ascii_strcasecmp(s, "prev"))
+                o->monitor = PREV_MONITOR;
             else
                 o->monitor = obt_parse_node_int(n) - 1;
         }
@@ -109,6 +115,9 @@ static gboolean run_func(ObActionsData *data, gpointer options)
         cmon = client_monitor(c);
         if (mon == CURRENT_MONITOR) mon = cmon;
         else if (mon == ALL_MONITORS) mon = SCREEN_AREA_ALL_MONITORS;
+        else if (mon == NEXT_MONITOR) mon = (cmon + 1 > screen_num_monitors - 1) ? 0 : (cmon + 1);
+        else if (mon == PREV_MONITOR) mon = (cmon == 0) ? (screen_num_monitors - 1) : (cmon - 1);
+
         area = screen_area(c->desktop, mon, NULL);
         carea = screen_area(c->desktop, cmon, NULL);
 
index d98ce64..38dc7c1 100644 (file)
@@ -233,7 +233,12 @@ void client_manage(Window window, ObPrompt *prompt)
 
     ob_debug("Window type: %d", self->type);
     ob_debug("Window group: 0x%x", self->group?self->group->leader:0);
-    ob_debug("Window name: %s class: %s", self->name, self->class);
+    ob_debug("Window name: %s class: %s role: %s", self->name, self->class, self->role);
+
+    /* per-app settings override stuff from client_get_all, and return the
+       settings for other uses too. the returned settings is a shallow copy,
+       that needs to be freed with g_free(). */
+    settings = client_get_settings_state(self);
 
     /* now we have all of the window's information so we can set this up.
        do this before creating the frame, so it can tell that we are still
@@ -255,10 +260,6 @@ void client_manage(Window window, ObPrompt *prompt)
        time now */
     grab_server(FALSE);
 
-    /* per-app settings override stuff from client_get_all, and return the
-       settings for other uses too. the returned settings is a shallow copy,
-       that needs to be freed with g_free(). */
-    settings = client_get_settings_state(self);
     /* the session should get the last say though */
     client_restore_session_state(self);
 
@@ -3538,19 +3539,38 @@ ObClient *client_search_modal_child(ObClient *self)
     return NULL;
 }
 
+static gboolean client_validate_unmap(ObClient *self, int n)
+{
+    XEvent e;
+    gboolean ret = TRUE;
+
+    if (XCheckTypedWindowEvent(obt_display, self->window, UnmapNotify, &e)) {
+        if (n < self->ignore_unmaps) // ignore this one, but look for more
+            ret = client_validate_unmap(self, n+1);
+        else
+            ret = FALSE; // the window is going to become unmanaged
+
+        /* put them back on the event stack so they end up in the same order */
+        XPutBackEvent(obt_display, &e);
+    }
+
+    return ret;
+}
+
 gboolean client_validate(ObClient *self)
 {
     XEvent e;
 
     XSync(obt_display, FALSE); /* get all events on the server */
 
-    if (XCheckTypedWindowEvent(obt_display, self->window, DestroyNotify, &e) ||
-        XCheckTypedWindowEvent(obt_display, self->window, UnmapNotify, &e))
-    {
+    if (XCheckTypedWindowEvent(obt_display, self->window, DestroyNotify, &e)) {
         XPutBackEvent(obt_display, &e);
         return FALSE;
     }
 
+    if (!client_validate_unmap(self, 0))
+        return FALSE;
+
     return TRUE;
 }
 
index f69267d..e2fd411 100644 (file)
@@ -656,7 +656,7 @@ static void event_process(const XEvent *ec, gpointer data)
     else if (e->type == MappingNotify) {
         /* keyboard layout changes for modifier mapping changes. reload the
            modifier map, and rebind all the key bindings as appropriate */
-        ob_debug("Kepboard map changed. Reloading keyboard bindings.");
+        ob_debug("Keyboard map changed. Reloading keyboard bindings.");
         ob_set_state(OB_STATE_RECONFIGURING);
         obt_keyboard_reload();
         keyboard_rebind();
index c633fa6..ab5a14a 100644 (file)
@@ -339,7 +339,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
         self->shaded = self->client->shaded;
 
         if (self->decorations & OB_FRAME_DECOR_BORDER ||
-            (self->client->undecorated && config_theme_keepborder))
+            (self->client->undecorated && config_theme_keepborder
+             && !self->client->fullscreen))
             self->bwidth = ob_rr_theme->fbwidth;
         else
             self->bwidth = 0;
index f7d50e3..3e45fb9 100644 (file)
@@ -232,10 +232,13 @@ static gunichar parse_shortcut(const gchar *label, gboolean allow_shortcut,
             /* you have to use a printable ascii character for shortcuts
                don't allow space either, so you can have like "a _ b"
             */
-            if (VALID_SHORTCUT(*(i+1))) {
-                shortcut = g_unichar_tolower(g_utf8_get_char(i+1));
-                *position = i - *strippedlabel;
-                *always_show = TRUE;
+            if (VALID_SHORTCUT(*(i+1)) || *(i+1) == '_') {
+                /* Allow you to escape the first _ by putting __ */
+                if (*(i+1) != '_') {
+                    shortcut = g_unichar_tolower(g_utf8_get_char(i+1));
+                    *position = i - *strippedlabel;
+                    *always_show = TRUE;
+                }
 
                 /* remove the '_' from the string */
                 for (; *i != '\0'; ++i)
index fd31846..bddf137 100644 (file)
@@ -319,7 +319,7 @@ void popup_hide(ObPopup *self)
 
         event_end_ignore_all_enters(ignore_start);
     } else if (self->delay_mapped) {
-        obt_main_loop_timeout_remove(ob_main_loop, popup_show_timeout);
+        obt_main_loop_timeout_remove_data(ob_main_loop, popup_show_timeout, self, FALSE);
         self->delay_mapped = FALSE;
     }
 }
index 74d073c..09d5003 100644 (file)
@@ -77,7 +77,7 @@ static GSList *struts_left = NULL;
 static GSList *struts_right = NULL;
 static GSList *struts_bottom = NULL;
 
-static ObPagerPopup *desktop_popup;
+static ObPagerPopup **desktop_popup;
 
 /*! The number of microseconds that you need to be on a desktop before it will
   replace the remembered "last desktop" */
@@ -344,15 +344,22 @@ void screen_startup(gboolean reconfig)
     guint32 d;
     gboolean namesexist = FALSE;
 
-    desktop_popup = pager_popup_new();
-    pager_popup_height(desktop_popup, POPUP_HEIGHT);
-
     if (reconfig) {
-        /* update the pager popup's width */
-        pager_popup_text_width_to_strings(desktop_popup,
-                                          screen_desktop_names,
-                                          screen_num_desktops);
+        guint i;
+        desktop_popup = g_new(ObPagerPopup*, screen_num_monitors);
+        for (i = 0; i < screen_num_monitors; i++) {
+            desktop_popup[i] = pager_popup_new();
+            pager_popup_height(desktop_popup[i], POPUP_HEIGHT);
+
+            /* update the pager popup's width */
+            pager_popup_text_width_to_strings(desktop_popup[i],
+                                              screen_desktop_names,
+                                              screen_num_desktops);
+        }
+
         return;
+    } else {
+        desktop_popup = NULL;
     }
 
     /* get the initial size */
@@ -441,7 +448,12 @@ void screen_startup(gboolean reconfig)
 
 void screen_shutdown(gboolean reconfig)
 {
-    pager_popup_free(desktop_popup);
+    guint i;
+
+    for (i = 0; i < screen_num_monitors; i++) {
+        pager_popup_free(desktop_popup[i]);
+    }
+    g_free(desktop_popup);
 
     if (reconfig)
         return;
@@ -911,39 +923,52 @@ static guint translate_row_col(guint r, guint c)
 
 static gboolean hide_desktop_popup_func(gpointer data)
 {
-    pager_popup_hide(desktop_popup);
+    guint i;
+
+    for (i = 0; i < screen_num_monitors; i++) {
+        pager_popup_hide(desktop_popup[i]);
+    }
     return FALSE; /* don't repeat */
 }
 
 void screen_show_desktop_popup(guint d)
 {
     Rect *a;
+    guint i;
 
     /* 0 means don't show the popup */
     if (!config_desktop_popup_time) return;
 
-    a = screen_physical_area_active();
-    pager_popup_position(desktop_popup, CenterGravity,
-                         a->x + a->width / 2, a->y + a->height / 2);
-    pager_popup_icon_size_multiplier(desktop_popup,
-                                     (screen_desktop_layout.columns /
-                                      screen_desktop_layout.rows) / 2,
-                                     (screen_desktop_layout.rows/
-                                      screen_desktop_layout.columns) / 2);
-    pager_popup_max_width(desktop_popup,
-                          MAX(a->width/3, POPUP_WIDTH));
-    pager_popup_show(desktop_popup, screen_desktop_names[d], d);
-
-    obt_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
-    obt_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000,
-                              hide_desktop_popup_func, NULL, NULL, NULL);
-    g_free(a);
+    for (i = 0; i < screen_num_monitors; i++) {
+        a = screen_physical_area_monitor(i);
+        pager_popup_position(desktop_popup[i], CenterGravity,
+                             a->x + a->width / 2, a->y + a->height / 2);
+        pager_popup_icon_size_multiplier(desktop_popup[i],
+                                         (screen_desktop_layout.columns /
+                                          screen_desktop_layout.rows) / 2,
+                                         (screen_desktop_layout.rows/
+                                          screen_desktop_layout.columns) / 2);
+        pager_popup_max_width(desktop_popup[i],
+                              MAX(a->width/3, POPUP_WIDTH));
+        pager_popup_show(desktop_popup[i], screen_desktop_names[d], d);
+
+        obt_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
+        obt_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000,
+                                  hide_desktop_popup_func, desktop_popup[i],
+                                  g_direct_equal, NULL);
+        g_free(a);
+    }
 }
 
 void screen_hide_desktop_popup(void)
 {
-    obt_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
-    pager_popup_hide(desktop_popup);
+    guint i;
+
+    for (i = 0; i < screen_num_monitors; i++) {
+        obt_main_loop_timeout_remove_data(ob_main_loop, hide_desktop_popup_func,
+                                          desktop_popup[i], FALSE);
+        pager_popup_hide(desktop_popup[i]);
+    }
 }
 
 guint screen_find_desktop(guint from, ObDirection dir,
@@ -1178,9 +1203,11 @@ void screen_update_desktop_names(void)
     }
 
     /* resize the pager for these names */
-    pager_popup_text_width_to_strings(desktop_popup,
-                                      screen_desktop_names,
-                                      screen_num_desktops);
+    for (i = 0; i < screen_num_monitors; i++) {
+        pager_popup_text_width_to_strings(desktop_popup[i],
+                                          screen_desktop_names,
+                                          screen_num_desktops);
+    }
 }
 
 void screen_show_desktop(gboolean show, ObClient *show_only)
@@ -1302,7 +1329,10 @@ typedef struct {
 static void get_xinerama_screens(Rect **xin_areas, guint *nxin)
 {
     guint i;
-    gint l, r, t, b;
+    gint n, l, r, t, b;
+#ifdef XINERAMA
+    XineramaScreenInfo *info;
+#endif
 
     if (ob_debug_xinerama) {
         gint w = WidthOfScreen(ScreenOfDisplay(obt_display, ob_screen));
@@ -1313,10 +1343,8 @@ static void get_xinerama_screens(Rect **xin_areas, guint *nxin)
         RECT_SET((*xin_areas)[1], w/2, 0, w-(w/2), h);
     }
 #ifdef XINERAMA
-    else if (obt_display_extension_xinerama) {
-        guint i;
-        gint n;
-        XineramaScreenInfo *info = XineramaQueryScreens(obt_display, &n);
+    else if (obt_display_extension_xinerama &&
+             (info = XineramaQueryScreens(obt_display, &n))) {
         *nxin = n;
         *xin_areas = g_new(Rect, *nxin + 1);
         for (i = 0; i < *nxin; ++i)
@@ -1357,6 +1385,20 @@ void screen_update_areas(void)
     g_free(monitor_area);
     get_xinerama_screens(&monitor_area, &screen_num_monitors);
 
+    if (!desktop_popup) {
+        desktop_popup = g_new(ObPagerPopup*, screen_num_monitors);
+        for (i = 0; i < screen_num_monitors; i++) {
+            desktop_popup[i] = pager_popup_new();
+            pager_popup_height(desktop_popup[i], POPUP_HEIGHT);
+
+            if (screen_desktop_names)
+                /* update the pager popup's width */
+                pager_popup_text_width_to_strings(desktop_popup[i],
+                                                  screen_desktop_names,
+                                                  screen_num_desktops);
+        }
+    }
+
     /* set up the user-specified margins */
     config_margins.top_start = RECT_LEFT(monitor_area[screen_num_monitors]);
     config_margins.top_end = RECT_RIGHT(monitor_area[screen_num_monitors]);
@@ -1454,6 +1496,15 @@ void screen_update_areas(void)
                     b = MAX(b, s->strut->bottom);
             }
 
+            if (l) l += RECT_LEFT  (monitor_area[screen_num_monitors])
+                        - RECT_LEFT  (monitor_area[i]);
+            if (t) t += RECT_TOP   (monitor_area[screen_num_monitors])
+                        - RECT_TOP   (monitor_area[i]);
+            if (r) r -= RECT_RIGHT (monitor_area[screen_num_monitors])
+                        - RECT_RIGHT (monitor_area[i]);
+            if (b) b -= RECT_BOTTOM(monitor_area[screen_num_monitors])
+                        - RECT_BOTTOM(monitor_area[i]);
+
             /* based on these margins, set the work area for the
                monitor/desktop */
             dims[(i * screen_num_desktops + j) * 4 + 0] += l;
@@ -1594,28 +1645,32 @@ Rect* screen_area(guint desktop, guint head, Rect *search)
                 if ((s->desktop == d || s->desktop == DESKTOP_ALL) &&
                     STRUT_LEFT_IN_SEARCH(s->strut, search) &&
                     !STRUT_LEFT_IGNORE(s->strut, us, search))
-                    l = MAX(l, al + s->strut->left);
+                    l = MAX(l, RECT_LEFT(monitor_area[screen_num_monitors])
+                               + s->strut->left);
             }
             for (it = struts_top; it; it = g_slist_next(it)) {
                 ObScreenStrut *s = it->data;
                 if ((s->desktop == d || s->desktop == DESKTOP_ALL) &&
                     STRUT_TOP_IN_SEARCH(s->strut, search) &&
                     !STRUT_TOP_IGNORE(s->strut, us, search))
-                    t = MAX(t, at + s->strut->top);
+                    t = MAX(t, RECT_TOP(monitor_area[screen_num_monitors])
+                               + s->strut->top);
             }
             for (it = struts_right; it; it = g_slist_next(it)) {
                 ObScreenStrut *s = it->data;
                 if ((s->desktop == d || s->desktop == DESKTOP_ALL) &&
                     STRUT_RIGHT_IN_SEARCH(s->strut, search) &&
                     !STRUT_RIGHT_IGNORE(s->strut, us, search))
-                    r = MIN(r, ar - s->strut->right);
+                    r = MIN(r, RECT_RIGHT(monitor_area[screen_num_monitors])
+                               - s->strut->right);
             }
             for (it = struts_bottom; it; it = g_slist_next(it)) {
                 ObScreenStrut *s = it->data;
                 if ((s->desktop == d || s->desktop == DESKTOP_ALL) &&
                     STRUT_BOTTOM_IN_SEARCH(s->strut, search) &&
                     !STRUT_BOTTOM_IGNORE(s->strut, us, search))
-                    b = MIN(b, ab - s->strut->bottom);
+                    b = MIN(b, RECT_BOTTOM(monitor_area[screen_num_monitors])
+                               - s->strut->bottom);
             }
 
             /* limit to this monitor */
index 3e8799f..aa6db7e 100644 (file)
@@ -239,7 +239,7 @@ void sn_setup_spawn_environment(const gchar *program, const gchar *name,
     gchar *desc;
     const char *id;
 
-    desc = g_strdup_printf(_("Running %s\n"), program);
+    desc = g_strdup_printf(_("Running %s"), program);
 
     if (sn_launcher_context_get_initiated(sn_launcher)) {
         sn_launcher_context_unref(sn_launcher);
index 149afe4..0db7a85 100644 (file)
@@ -23,10 +23,10 @@ bn_IN
 it
 vi
 ja
-ua
+uk
 hu
 lt
+lv
 tr
 da
-
-#hr
+hr
index bb8af25..6ecf08e 100644 (file)
--- a/po/ar.po
+++ b/po/ar.po
@@ -443,8 +443,8 @@ msgstr ""
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "تشغيل %s\n"
+msgid "Running %s"
+msgstr "تشغيل %s"
 
 #: openbox/translate.c:59
 #, c-format
index c89217b..b7c898c 100644 (file)
@@ -444,8 +444,8 @@ msgstr ""
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "%s সঞ্চালিত হচ্ছে\n"
+msgid "Running %s"
+msgstr "%s সঞ্চালিত হচ্ছে"
 
 #: openbox/translate.c:59
 #, c-format
index 50d5a24..287af4f 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -468,8 +468,8 @@ msgstr "No esteu connectats al gestor de sessions"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Executant %s\n"
+msgid "Running %s"
+msgstr "Executant %s"
 
 #: openbox/translate.c:59
 #, c-format
index 6c195cc..49ad300 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -450,8 +450,8 @@ msgstr "Nepřipojen k session manageru"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Spouštím %s\n"
+msgid "Running %s"
+msgstr "Spouštím %s"
 
 #: openbox/translate.c:59
 #, c-format
index 351e1c4..3fa8ed9 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -458,8 +458,8 @@ msgstr "Ikke forbundet til en sessionsbehandler"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Kører %s\n"
+msgid "Running %s"
+msgstr "Kører %s"
 
 #: openbox/translate.c:59
 #, c-format
index 758a06c..9a78c71 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -463,8 +463,8 @@ msgstr "Nicht mit einem Sitzungsmanager verbunden"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Starte %s\n"
+msgid "Running %s"
+msgstr "Starte %s"
 
 #: openbox/translate.c:59
 #, c-format
index 33856fd..cdd30d2 100644 (file)
@@ -477,8 +477,8 @@ msgstr "Not connected to a session manager"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Running %s\n"
+msgid "Running %s"
+msgstr "Running %s"
 
 #: openbox/translate.c:59
 #, c-format
index adfbd9e..ab18182 100644 (file)
@@ -474,8 +474,8 @@ msgstr "Not connected to a session manager"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Running %s\n"
+msgid "Running %s"
+msgstr "Running %s"
 
 #: openbox/translate.c:59
 #, c-format
index 8dfe06a..d4d9f94 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -468,8 +468,8 @@ msgstr "Sin conexión a un manejador de sesiones"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Ejecutando %s\n"
+msgid "Running %s"
+msgstr "Ejecutando %s"
 
 #: openbox/translate.c:59
 #, c-format
index 209f378..9c9c9f3 100644 (file)
--- a/po/et.po
+++ b/po/et.po
@@ -441,8 +441,8 @@ msgstr ""
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Jooksev %s\n"
+msgid "Running %s"
+msgstr "Jooksev %s"
 
 #: openbox/translate.c:59
 #, c-format
index 7257436..8b3a52f 100644 (file)
--- a/po/eu.po
+++ b/po/eu.po
@@ -458,8 +458,8 @@ msgstr "Saio kudeatzaile batera ez konektatua"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Egikaritzen %s\n"
+msgid "Running %s"
+msgstr "Egikaritzen %s"
 
 #: openbox/translate.c:59
 #, c-format
index fc2d4be..0c5b344 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -457,8 +457,8 @@ msgstr "Ei yhteyttä istunnon hallintaan"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Suoritetaan %s\n"
+msgid "Running %s"
+msgstr "Suoritetaan %s"
 
 #: openbox/translate.c:59
 #, c-format
index a32e61c..036d78e 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -474,8 +474,8 @@ msgstr "Non connect
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Exécution de %s\n"
+msgid "Running %s"
+msgstr "Exécution de %s"
 
 #: openbox/translate.c:59
 #, c-format
index 3c943ef..13af7ef 100644 (file)
--- a/po/hr.po
+++ b/po/hr.po
 # Croatian messages for openbox.
-# Copyright (C) 2006 Mikael Magnusson
+# Copyright (C) 2009 Mikael Magnusson
 # This file is distributed under the same license as the openbox package.
-# Daniel Radetic <drade@boobah.info>, 2006.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Openbox 3.3\n"
+"Project-Id-Version: Openbox 3.4.7.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2008-03-03 02:10+0100\n"
-"PO-Revision-Date: 2006-09-05 16:45+0100\n"
-"Last-Translator: Daniel Radetic <drade@boobah.info>\n"
-"Language-Team: None\n"
+"POT-Creation-Date: 2009-03-31 19:16+0200\n"
+"PO-Revision-Date: 2009-04-05 16:53+0200\n"
+"Last-Translator: boljsa <asjlob AT vip.hr>\n"
+"Language-Team:  <asjlob AT vip.hr>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: openbox/actions.c:150
+#: openbox/actions.c:149
 #, c-format
 msgid "Invalid action \"%s\" requested. No such action exists."
-msgstr ""
+msgstr "Nevažeća akcija \"%s\" zatražena. Takva akcija ne postoji."
 
 #: openbox/actions/execute.c:128
 msgid "No"
-msgstr ""
+msgstr "Ne"
 
 #: openbox/actions/execute.c:129
 msgid "Yes"
-msgstr ""
+msgstr "Da"
 
 #: openbox/actions/execute.c:133
 msgid "Execute"
-msgstr ""
+msgstr "Izvrši"
 
 #: openbox/actions/execute.c:142
 #, c-format
 msgid "Failed to convert the path \"%s\" from utf8"
-msgstr ""
+msgstr "Neuspio pokušaj pretvorbe putanje \"%s\" iz utf8"
 
-#: openbox/actions/exit.c:52 openbox/actions/session.c:62
-#: openbox/client.c:3460
+#: openbox/actions/exit.c:52 openbox/actions/session.c:64
+#: openbox/client.c:3465
 msgid "Cancel"
-msgstr ""
+msgstr "Odustani"
 
 #: openbox/actions/exit.c:53
 msgid "Exit"
-msgstr ""
+msgstr "Izađi"
 
 #: openbox/actions/exit.c:56
 msgid "Are you sure you want to exit Openbox?"
-msgstr ""
+msgstr "Jeste li sigurni da želite zatvoriti Openbox?"
 
 #: openbox/actions/exit.c:57
 msgid "Exit Openbox"
-msgstr ""
+msgstr "Zatvori Openbox"
 
-#: openbox/actions/session.c:41
+#. TRANSLATORS: Don't translate the word "SessionLogout" as it's the
+#. name of the action you write in rc.xml
+#: openbox/actions/session.c:43
 msgid ""
 "The SessionLogout action is not available since Openbox was built without "
 "session management support"
 msgstr ""
+"Akcija SessionLogout nije dostupna otkad je Openbox izgrađen bez podrške "
+"upravljanja sesijama"
 
-#: openbox/actions/session.c:63 openbox/actions/session.c:68
+#: openbox/actions/session.c:65 openbox/actions/session.c:70
 msgid "Log Out"
-msgstr ""
+msgstr "Odjava"
 
-#: openbox/actions/session.c:67
+#: openbox/actions/session.c:69
 msgid "Are you sure you want to log out?"
-msgstr ""
+msgstr "Jeste li sigurni da se želite odjaviti?"
 
-#: openbox/client.c:2004
+#: openbox/client.c:2012
 msgid "Unnamed Window"
-msgstr ""
+msgstr "Neimenovan Prozor"
 
-#: openbox/client.c:2018 openbox/client.c:2050
+#: openbox/client.c:2026 openbox/client.c:2058
 msgid "Killing..."
-msgstr ""
+msgstr "Ubijanje..."
 
-#: openbox/client.c:2020 openbox/client.c:2052
+#: openbox/client.c:2028 openbox/client.c:2060
 msgid "Not Responding"
-msgstr ""
+msgstr "Ne Odgovara"
 
-#: openbox/client.c:3449
+#: openbox/client.c:3454
 #, c-format
 msgid ""
 "The window \"%s\" does not seem to be responding.  Do you want to force it "
 "to exit by sending the %s signal?"
 msgstr ""
+"Prozor \"%s\" ne reagira. Želite li forsirati izlaženje šaljući %s signal?"
 
-#: openbox/client.c:3451
+#: openbox/client.c:3456
 msgid "End Process"
-msgstr ""
+msgstr "Završetak Procesa"
 
-#: openbox/client.c:3455
+#: openbox/client.c:3460
 #, c-format
 msgid ""
 "The window \"%s\" does not seem to be responding.  Do you want to disconnect "
 "it from the X server?"
 msgstr ""
+"Prozor \"%s\" ne reagira. Želite li prekinuti njegovu vezu sa X serverom?"
 
-#: openbox/client.c:3457
+#: openbox/client.c:3462
 msgid "Disconnect"
-msgstr ""
+msgstr "Prekid veze"
 
 #: openbox/client_list_combined_menu.c:87 openbox/client_list_menu.c:91
 msgid "Go there..."
-msgstr "Odi na..."
+msgstr "Idi tamo..."
 
 #: openbox/client_list_combined_menu.c:94
-#, fuzzy
 msgid "Manage desktops"
-msgstr "Sve radne površine"
+msgstr "Upravljanje radnim površinama"
 
 #: openbox/client_list_combined_menu.c:95 openbox/client_list_menu.c:155
-#, fuzzy
 msgid "_Add new desktop"
-msgstr "_Pošalji na radnu površinu"
+msgstr "_Dodaj novu radnu površinu"
 
 #: openbox/client_list_combined_menu.c:96 openbox/client_list_menu.c:156
-#, fuzzy
 msgid "_Remove last desktop"
-msgstr "_Pošalji na radnu površinu"
+msgstr "_Ukloni zadnju radnu površinu"
 
 #: openbox/client_list_combined_menu.c:149
 msgid "Windows"
-msgstr ""
+msgstr "Prozori"
 
 #: openbox/client_list_menu.c:203
 msgid "Desktops"
-msgstr "Radne površine"
+msgstr "Radne Površine"
 
 #: openbox/client_menu.c:258
 msgid "All desktops"
@@ -135,7 +137,7 @@ msgstr "Sve radne površine"
 
 #: openbox/client_menu.c:370
 msgid "_Layer"
-msgstr ""
+msgstr "_Sloj"
 
 #: openbox/client_menu.c:375
 msgid "Always on _top"
@@ -151,311 +153,336 @@ msgstr "Uvijek na _dnu"
 
 #: openbox/client_menu.c:379
 msgid "_Send to desktop"
-msgstr "_Pošalji na radnu površinu"
+msgstr "Pošalji na _radnu površinu"
 
 #: openbox/client_menu.c:383
 msgid "Client menu"
-msgstr "Meni klijenta"
+msgstr "Izbornik klijenta"
 
 #: openbox/client_menu.c:393
 msgid "R_estore"
-msgstr "Ponovno uspostav_i"
+msgstr "O_bnovi"
 
 #: openbox/client_menu.c:397
 msgid "_Move"
-msgstr "Po_makni"
+msgstr "_Pomicanje"
 
 #: openbox/client_menu.c:399
 msgid "Resi_ze"
-msgstr "Prom_jeni veličinu"
+msgstr "Prom_jena veličine"
 
 #: openbox/client_menu.c:401
 msgid "Ico_nify"
-msgstr "Iko_nificiraj"
+msgstr "Mi_nimizacija"
 
 #: openbox/client_menu.c:405
 msgid "Ma_ximize"
-msgstr "M_aksimiziraj"
+msgstr "M_aksimizacija"
 
 #: openbox/client_menu.c:409
 msgid "_Roll up/down"
-msgstr ""
+msgstr "_Okretanje gore/dolje"
 
 #: openbox/client_menu.c:411
 msgid "Un/_Decorate"
-msgstr ""
+msgstr "Ne/_Dekoriranje"
 
 #: openbox/client_menu.c:415
 msgid "_Close"
 msgstr "_Zatvori"
 
-#: openbox/config.c:781
+#: openbox/config.c:782
 #, c-format
 msgid "Invalid button \"%s\" specified in config file"
-msgstr ""
+msgstr "Nevažeće dugme \"%s\" specificirano u konfiguracijskoj datoteci"
 
 #: openbox/keyboard.c:157
 msgid "Conflict with key binding in config file"
-msgstr ""
+msgstr "Konflikt sa povezivanjem tipki u konfiguracijskoj datoteci"
 
-#: openbox/menu.c:103 openbox/menu.c:111
+#: openbox/menu.c:102 openbox/menu.c:110
 #, c-format
 msgid "Unable to find a valid menu file \"%s\""
-msgstr ""
+msgstr "Ne mogu pronaći važeću datoteku izbornika \"%s\""
 
-#: openbox/menu.c:171
+#: openbox/menu.c:170
 #, c-format
 msgid "Failed to execute command for pipe-menu \"%s\": %s"
-msgstr ""
+msgstr "Neuspio pokušaj izvršavanja naredbe za cijev-izbornik \"%s\": %s"
 
-#: openbox/menu.c:185
+#: openbox/menu.c:184
 #, c-format
 msgid "Invalid output from pipe-menu \"%s\""
-msgstr ""
+msgstr "Nevažeći izlaz za cijev-izbornik \"%s\""
 
-#: openbox/menu.c:198
+#: openbox/menu.c:197
 #, c-format
 msgid "Attempted to access menu \"%s\" but it does not exist"
-msgstr ""
+msgstr "Pokušavam pristupiti izborniku \"%s\" ali on ne postoji"
 
-#: openbox/menu.c:368 openbox/menu.c:369
+#: openbox/menu.c:367 openbox/menu.c:368
 msgid "More..."
-msgstr ""
+msgstr "Više..."
 
 #: openbox/mouse.c:373
 #, c-format
 msgid "Invalid button \"%s\" in mouse binding"
-msgstr ""
+msgstr "Nevažeće dugme \"%s\" u povezivanju miša"
 
 #: openbox/mouse.c:379
 #, c-format
 msgid "Invalid context \"%s\" in mouse binding"
-msgstr ""
+msgstr "Nevažeći kontekst \"%s\" u povezivanju miša"
 
-#: openbox/openbox.c:134
+#: openbox/openbox.c:133
 #, c-format
 msgid "Unable to change to home directory \"%s\": %s"
-msgstr ""
+msgstr "Ne mogu doći u home direktorij \"%s\": %s"
 
-#: openbox/openbox.c:154
+#: openbox/openbox.c:152
 msgid "Failed to open the display from the DISPLAY environment variable."
-msgstr ""
+msgstr "Neuspio pokušaj otvaranja zaslona iz DISPLAY varijable okruženja."
 
-#: openbox/openbox.c:185
+#: openbox/openbox.c:183
 msgid "Failed to initialize the obrender library."
-msgstr ""
+msgstr "Neuspio pokušaj inicijalizacije obrender biblioteke."
 
-#: openbox/openbox.c:196
+#: openbox/openbox.c:194
 msgid "X server does not support locale."
-msgstr ""
+msgstr "X server ne podržava lokalno."
 
-#: openbox/openbox.c:198
+#: openbox/openbox.c:196
 msgid "Cannot set locale modifiers for the X server."
-msgstr ""
+msgstr "Ne mogu postaviti lokalne modifikatore za X server."
 
-#: openbox/openbox.c:266
+#: openbox/openbox.c:263
 msgid "Unable to find a valid config file, using some simple defaults"
 msgstr ""
+"Ne mogu pronaći važeću konfiguracijsku datoteku, koriteći neke jednostavne "
+"standarde"
 
-#: openbox/openbox.c:300
+#: openbox/openbox.c:297
 msgid "Unable to load a theme."
-msgstr ""
+msgstr "Ne mogu pokrenuti temu."
 
-#: openbox/openbox.c:380
+#: openbox/openbox.c:377
 #, c-format
 msgid ""
 "One or more XML syntax errors were found while parsing the Openbox "
 "configuration files.  See stdout for more information.  The last error seen "
 "was in file \"%s\" line %d, with message: %s"
 msgstr ""
+"Jedna ili više XML pogreški u sintaksi su pronađene prilikom analize Openbox "
+"konfiguracijskih datoteka. Pogledajte stdout za više informacija. Zadnja "
+"pogreška je u datoteci \"%s\" u liniji %d, sa porukom: %s"
 
-#: openbox/openbox.c:382
+#: openbox/openbox.c:379
 msgid "Openbox Syntax Error"
-msgstr ""
+msgstr "Openbox Pogreška u Sintaksi"
 
-#: openbox/openbox.c:382
-#, fuzzy
+#: openbox/openbox.c:379
 msgid "Close"
-msgstr "_Zatvori"
+msgstr "Zatvori"
 
-#: openbox/openbox.c:451
+#: openbox/openbox.c:448
 #, c-format
 msgid "Restart failed to execute new executable \"%s\": %s"
-msgstr ""
+msgstr "Restart je bio neusješan za izvršenje novog izvršnog \"%s\": %s"
 
-#: openbox/openbox.c:521 openbox/openbox.c:523
+#: openbox/openbox.c:518 openbox/openbox.c:520
 msgid "Copyright (c)"
-msgstr ""
+msgstr "Copyright (c)"
 
-#: openbox/openbox.c:532
+#: openbox/openbox.c:529
 msgid "Syntax: openbox [options]\n"
-msgstr ""
+msgstr "Sintaksa: openbox [opcije]\n"
 
-#: openbox/openbox.c:533
+#: openbox/openbox.c:530
 msgid ""
 "\n"
 "Options:\n"
 msgstr ""
+"\n"
+"Opcije:\n"
 
-#: openbox/openbox.c:534
+#: openbox/openbox.c:531
 msgid "  --help              Display this help and exit\n"
-msgstr ""
+msgstr "  --help              Prikazuje ovu pomoć i izlazi\n"
 
-#: openbox/openbox.c:535
+#: openbox/openbox.c:532
 msgid "  --version           Display the version and exit\n"
-msgstr ""
+msgstr "  --version           Prikazuje verziju i izlazi\n"
 
-#: openbox/openbox.c:536
+#: openbox/openbox.c:533
 msgid "  --replace           Replace the currently running window manager\n"
 msgstr ""
+"  --replace           Zamjenjuje trenutno pokrenut upravitelj prozora\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.
-#: openbox/openbox.c:540
+#: openbox/openbox.c:537
 msgid "  --config-file FILE  Specify the path to the config file to use\n"
 msgstr ""
+"  --config-file FILE  Specificira putanju do konfiguracijske datoteke koja "
+"se koristi\n"
 
-#: openbox/openbox.c:541
+#: openbox/openbox.c:538
 msgid "  --sm-disable        Disable connection to the session manager\n"
-msgstr ""
+msgstr "  --sm-disable        Onemogućuje vezu sa upraviteljom sesija\n"
 
-#: openbox/openbox.c:542
+#: openbox/openbox.c:539
 msgid ""
 "\n"
 "Passing messages to a running Openbox instance:\n"
 msgstr ""
+"\n"
+"Prosljeđuje poruke pokrenutoj Openbox instanci:\n"
 
-#: openbox/openbox.c:543
+#: openbox/openbox.c:540
 msgid "  --reconfigure       Reload Openbox's configuration\n"
-msgstr ""
+msgstr "  --reconfigure       Osvježava Openbox konfiguraciju\n"
 
-#: openbox/openbox.c:544
+#: openbox/openbox.c:541
 msgid "  --restart           Restart Openbox\n"
-msgstr ""
+msgstr "  --restart           Restartira Openbox\n"
 
-#: openbox/openbox.c:545
+#: openbox/openbox.c:542
 msgid "  --exit              Exit Openbox\n"
-msgstr ""
+msgstr "  --exit              Izlazi iz Openbox-a\n"
 
-#: openbox/openbox.c:546
+#: openbox/openbox.c:543
 msgid ""
 "\n"
 "Debugging options:\n"
 msgstr ""
+"\n"
+"Opcije traženja pogrešaka:\n"
 
-#: openbox/openbox.c:547
+#: openbox/openbox.c:544
 msgid "  --sync              Run in synchronous mode\n"
-msgstr ""
+msgstr "  --sync              Pokretanje u sinkronizacijskom modu\n"
 
-#: openbox/openbox.c:548
+#: openbox/openbox.c:545
 msgid "  --debug             Display debugging output\n"
-msgstr ""
+msgstr "  --debug             Prikazuje izlaz traženja pogrešaka\n"
 
-#: openbox/openbox.c:549
+#: openbox/openbox.c:546
 msgid "  --debug-focus       Display debugging output for focus handling\n"
 msgstr ""
+"  --debug-focus       Prikazuje izlaz traženja pogrešaka za rukovanje "
+"fokusom\n"
 
-#: openbox/openbox.c:550
+#: openbox/openbox.c:547
 msgid "  --debug-xinerama    Split the display into fake xinerama screens\n"
-msgstr ""
+msgstr "  --debug-xinerama    Podijeli zaslon u lažne xinerama zaslone\n"
 
-#: openbox/openbox.c:551
+#: openbox/openbox.c:548
 #, c-format
 msgid ""
 "\n"
 "Please report bugs at %s\n"
 msgstr ""
+"\n"
+"Molimo prijavite pogrešku na %s\n"
 
-#: openbox/openbox.c:620
+#: openbox/openbox.c:617
 msgid "--config-file requires an argument\n"
-msgstr ""
+msgstr "--config-file zahtjeva argument\n"
 
-#: openbox/openbox.c:663
+#: openbox/openbox.c:660
 #, c-format
 msgid "Invalid command line argument \"%s\"\n"
-msgstr ""
+msgstr "Nevažeći argument komandne linije \"%s\"\n"
 
 #: openbox/screen.c:102 openbox/screen.c:190
 #, c-format
 msgid "A window manager is already running on screen %d"
-msgstr ""
+msgstr "Upravitelj prozora je već pokrenut na zaslonu %d"
 
 #: openbox/screen.c:124
 #, c-format
 msgid "Could not acquire window manager selection on screen %d"
-msgstr ""
+msgstr "Ne mogu ostvariti odabir upravitelja prozora na zaslonu %d"
 
 #: openbox/screen.c:145
 #, c-format
 msgid "The WM on screen %d is not exiting"
-msgstr ""
+msgstr "Upravitelj prozora na zaslonu %d ne izlazi"
 
 #. TRANSLATORS: If you need to specify a different order of the
 #. arguments, you can use %1$d for the first one and %2$d for the
 #. second one. For example,
 #. "The current session has %2$d desktops, but Openbox is configured for %1$d ..."
 #: openbox/screen.c:412
-#, c-format
+#, fuzzy, c-format
 msgid ""
+"Openbox is configured for %d desktop, but the current session has %d.  "
+"Overriding the Openbox configuration."
+msgid_plural ""
 "Openbox is configured for %d desktops, but the current session has %d.  "
 "Overriding the Openbox configuration."
-msgstr ""
+msgstr[0] ""
+"Openbox je konfiguriran za %d radnu površinu, ali trenutna sesija ima %d. "
+"Prepisujem preko Openbox konfiguracije."
+msgstr[1] ""
+"Openbox je konfiguriran za %d radnu površinu, ali trenutna sesija ima %d. "
+"Prepisujem preko Openbox konfiguracije."
 
 #: openbox/screen.c:1180
 #, c-format
 msgid "desktop %i"
-msgstr ""
+msgstr "radna površina %i"
 
 #: openbox/session.c:104
 #, c-format
 msgid "Unable to make directory \"%s\": %s"
-msgstr "Nemogu napraviti direktorij \"%s\": %s"
+msgstr "Ne mogu stvoriti direktorij \"%s\": %s"
 
-#: openbox/session.c:452
+#: openbox/session.c:466
 #, c-format
 msgid "Unable to save the session to \"%s\": %s"
-msgstr ""
+msgstr "Ne mogu spremiti sesiju u \"%s\": %s"
 
-#: openbox/session.c:584
+#: openbox/session.c:605
 #, c-format
 msgid "Error while saving the session to \"%s\": %s"
-msgstr ""
+msgstr "Pogreška prilokom spremanja sesije u \"%s\": %s"
 
-#: openbox/session.c:821
+#: openbox/session.c:842
 msgid "Not connected to a session manager"
-msgstr ""
+msgstr "Nije povezan sa upraviteljem sesija"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr ""
+msgid "Running %s"
+msgstr "Pokrenuto %s"
 
 #: openbox/translate.c:59
 #, c-format
 msgid "Invalid modifier key \"%s\" in key/mouse binding"
-msgstr ""
+msgstr "Nevažeći modifikacijski ključ \"%s\" u povezivanju tipke/miš"
 
 #: openbox/translate.c:138
 #, c-format
 msgid "Invalid key code \"%s\" in key binding"
-msgstr ""
+msgstr "Nevažeći kod ključa \"%s\" u povezivanju tipki"
 
 #: openbox/translate.c:145
 #, c-format
 msgid "Invalid key name \"%s\" in key binding"
-msgstr ""
+msgstr "Nevažeće ime tipke \"%s\" u povezivanju tipki"
 
 #: openbox/translate.c:151
 #, c-format
 msgid "Requested key \"%s\" does not exist on the display"
-msgstr ""
+msgstr "Traženi ključ \"%s\" ne postoji na zaslonu"
 
 #: openbox/xerror.c:40
 #, c-format
 msgid "X Error: %s"
-msgstr ""
+msgstr "X Pogreška: %s"
 
 #: openbox/prompt.c:200
 msgid "OK"
-msgstr ""
+msgstr "OK"
index 3aba08e..ffa5201 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -452,8 +452,8 @@ msgstr "Nem kapcsolódunk a szekciókezelőhöz"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Futtatás %s\n"
+msgid "Running %s"
+msgstr "Futtatás %s"
 
 #: openbox/translate.c:59
 #, c-format
index 263e6ae..27d3d81 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -1,8 +1,8 @@
 # Italian translation for Openbox
-# Copyright (C) 2007 Davide Truffa
+# Copyright (C) 2007-2009 Davide Truffa
 # Copyright (C) 2008 Andrea Scarpino
 # This file is distributed under the same license as the openbox package.
-# Davide Truffa <davide@catoblepa.org>, 2007.
+# Davide Truffa <davide@catoblepa.org>, 2007-2009.
 # Andrea Scarpino <bash.lnx@gmail.com>, 2008.
 #
 #
@@ -10,9 +10,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4.7.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2008-11-15 22:28+0100\n"
-"PO-Revision-Date: 2008-05-15 13:09+0200\n"
-"Last-Translator: Andrea Scarpino <bash.lnx@gmail.com>\n"
+"POT-Creation-Date: 2009-02-25 23:51+0100\n"
+"PO-Revision-Date: 2009-02-25 11:29+0100\n"
+"Last-Translator: Davide Truffa <davide@catoblepa.org>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -65,7 +65,7 @@ msgid ""
 "The SessionLogout action is not available since Openbox was built without "
 "session management support"
 msgstr ""
-"L'azione SessionLogout non è disponibile se Openbox è compilato senzail "
+"L'azione SessionLogout non è disponibile se Openbox è compilato senza il "
 "supporto del gestore delle sessioni."
 
 #: openbox/actions/session.c:65 openbox/actions/session.c:70
@@ -95,7 +95,7 @@ msgid ""
 "to exit by sending the %s signal?"
 msgstr ""
 "La finestra \"%s\" sembra non rispondere. Vuoi terminarne l'esecuzione "
-"inviando un segnale %s?"
+"inviando il segnale %s?"
 
 #: openbox/client.c:3456
 msgid "End Process"
@@ -107,8 +107,8 @@ msgid ""
 "The window \"%s\" does not seem to be responding.  Do you want to disconnect "
 "it from the X server?"
 msgstr ""
-"La finestra \"%s\" non sembra rispondere.  Vuoi terminarne l'esecuzione dal "
-"server X?"
+"La finestra \"%s\" non sembra rispondere.  Vuoi terminarne l'esecuzione "
+"tramite il server X?"
 
 #: openbox/client.c:3462
 msgid "Disconnect"
@@ -198,7 +198,7 @@ msgstr "Si/No _Decorazioni"
 msgid "_Close"
 msgstr "_Chiudi"
 
-#: openbox/config.c:781
+#: openbox/config.c:782
 #, c-format
 msgid "Invalid button \"%s\" specified in config file"
 msgstr "Il pulsante \"%s\" specificato nel file di configurazione non è valido"
@@ -263,8 +263,7 @@ msgstr "Il server X non ha il supporto per la localizzazione."
 #: openbox/openbox.c:196
 msgid "Cannot set locale modifiers for the X server."
 msgstr ""
-"Impossibile impostare la localizzazione dei tasti modificatori per il server "
-"X."
+"Impossibile impostare i tasti modificatori localizzati per il server X."
 
 #: openbox/openbox.c:263
 msgid "Unable to find a valid config file, using some simple defaults"
@@ -284,7 +283,7 @@ msgid ""
 "was in file \"%s\" line %d, with message: %s"
 msgstr ""
 "Sono stati trovati uno o più errori nel file di configurazione di Openbox.  "
-"Vedi stdout per ulteriori informazioni.  L'ultimo errore era in \"%s\" alla "
+"Vedi stdout per ulteriori informazioni. L'ultimo errore era in \"%s\" alla "
 "linea %d, con il messaggio: %s"
 
 #: openbox/openbox.c:379
@@ -460,12 +459,12 @@ msgstr "Errore durante il salvataggio della sessione in \"%s\": %s"
 
 #: openbox/session.c:842
 msgid "Not connected to a session manager"
-msgstr "Non sei connesso al gestore di sessioni"
+msgstr "Non connesso al gestore di sessioni"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Sto eseguendo %s\n"
+msgid "Running %s"
+msgstr "Sto eseguendo %s"
 
 #: openbox/translate.c:59
 #, c-format
index 7b30619..4af2e9b 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -449,8 +449,8 @@ msgstr "セッションマネージャに接続されていません。"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "起動中 %s\n"
+msgid "Running %s"
+msgstr "起動中 %s"
 
 #: openbox/translate.c:59
 #, c-format
index 5b2aaf8..854c4c3 100644 (file)
--- a/po/lt.po
+++ b/po/lt.po
@@ -450,8 +450,8 @@ msgstr "Neprisijungta prie sesijų sesijos tvarkyklė"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Veikia %s\n"
+msgid "Running %s"
+msgstr "Veikia %s"
 
 #: openbox/translate.c:59
 #, c-format
diff --git a/po/lv.po b/po/lv.po
new file mode 100644 (file)
index 0000000..f1a3ae1
--- /dev/null
+++ b/po/lv.po
@@ -0,0 +1,488 @@
+# Latvian translations for openbox.
+# Copyright (C) 2009 Dana Jansens
+# This file is distributed under the same license as the openbox package.
+# Einars Sprugis  <einars8@gmail.com>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Openbox 3.4.7\n"
+"Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
+"POT-Creation-Date: 2009-03-31 19:16+0200\n"
+"PO-Revision-Date: 2009-03-30 19:14+0300\n"
+"Last-Translator: Einars Sprugis <einars8@gmail.com>\n"
+"Language-Team: Latvian <lv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
+"2);\n"
+
+#: openbox/actions.c:149
+#, c-format
+msgid "Invalid action \"%s\" requested. No such action exists."
+msgstr "Neatļauta darbība \"%s\". Šāda darbība neeksistē."
+
+#: openbox/actions/execute.c:128
+msgid "No"
+msgstr "Nē"
+
+#: openbox/actions/execute.c:129
+msgid "Yes"
+msgstr "Jā"
+
+#: openbox/actions/execute.c:133
+msgid "Execute"
+msgstr "Izpildīt"
+
+#: openbox/actions/execute.c:142
+#, c-format
+msgid "Failed to convert the path \"%s\" from utf8"
+msgstr "Neizdevās pārveidot ceļu \"%s\" no utf8"
+
+#: openbox/actions/exit.c:52 openbox/actions/session.c:64
+#: openbox/client.c:3465
+msgid "Cancel"
+msgstr "Atcelt"
+
+#: openbox/actions/exit.c:53
+msgid "Exit"
+msgstr "Iziet"
+
+#: openbox/actions/exit.c:56
+msgid "Are you sure you want to exit Openbox?"
+msgstr "Vai tiešām vēlaties iziet no Openbox?"
+
+#: openbox/actions/exit.c:57
+msgid "Exit Openbox"
+msgstr "Iziet no Openbox"
+
+#. TRANSLATORS: Don't translate the word "SessionLogout" as it's the
+#. name of the action you write in rc.xml
+#: openbox/actions/session.c:43
+msgid ""
+"The SessionLogout action is not available since Openbox was built without "
+"session management support"
+msgstr ""
+"SessionLogout darbība nav pieejama, jo Openbox tika kompilēts bez sesijas "
+"pārvaldes atbalsta"
+
+#: openbox/actions/session.c:65 openbox/actions/session.c:70
+msgid "Log Out"
+msgstr "Atteikties"
+
+#: openbox/actions/session.c:69
+msgid "Are you sure you want to log out?"
+msgstr "Vai tiešām vēlaties atteikties?"
+
+#: openbox/client.c:2012
+msgid "Unnamed Window"
+msgstr "Logs bez nosaukuma"
+
+#: openbox/client.c:2026 openbox/client.c:2058
+msgid "Killing..."
+msgstr "Nogalina..."
+
+#: openbox/client.c:2028 openbox/client.c:2060
+msgid "Not Responding"
+msgstr "Neatbild"
+
+#: openbox/client.c:3454
+#, c-format
+msgid ""
+"The window \"%s\" does not seem to be responding.  Do you want to force it "
+"to exit by sending the %s signal?"
+msgstr "Logs \"%s\" neatbild. Vai vēlieties to piespiest, nosūtot signālu %s?"
+
+#: openbox/client.c:3456
+msgid "End Process"
+msgstr "Nobeigt procesu"
+
+#: openbox/client.c:3460
+#, c-format
+msgid ""
+"The window \"%s\" does not seem to be responding.  Do you want to disconnect "
+"it from the X server?"
+msgstr "Logs \"%s\" neatbild. Vai vēlaties to atvienot no X servera?"
+
+#: openbox/client.c:3462
+msgid "Disconnect"
+msgstr "Atvienot"
+
+#: openbox/client_list_combined_menu.c:87 openbox/client_list_menu.c:91
+msgid "Go there..."
+msgstr "Iet uz turieni..."
+
+#: openbox/client_list_combined_menu.c:94
+msgid "Manage desktops"
+msgstr "Pārvaldīt darbvirsmas"
+
+#: openbox/client_list_combined_menu.c:95 openbox/client_list_menu.c:155
+msgid "_Add new desktop"
+msgstr "Pievienot j_aunu darbvirsmu"
+
+#: openbox/client_list_combined_menu.c:96 openbox/client_list_menu.c:156
+msgid "_Remove last desktop"
+msgstr "Aizvākt pēdējo da_rbvirsmu"
+
+#: openbox/client_list_combined_menu.c:149
+msgid "Windows"
+msgstr "Logi"
+
+#: openbox/client_list_menu.c:203
+msgid "Desktops"
+msgstr "Darbvirsmas"
+
+#: openbox/client_menu.c:258
+msgid "All desktops"
+msgstr "Visas darbvirsmas"
+
+#: openbox/client_menu.c:370
+msgid "_Layer"
+msgstr "S_lānis"
+
+#: openbox/client_menu.c:375
+msgid "Always on _top"
+msgstr "Vienmēr augšā"
+
+#: openbox/client_menu.c:376
+msgid "_Normal"
+msgstr "_Normāli"
+
+#: openbox/client_menu.c:377
+msgid "Always on _bottom"
+msgstr "Vienmēr a_pakšā"
+
+#: openbox/client_menu.c:379
+msgid "_Send to desktop"
+msgstr "No_sūtīt uz darbvirsmu"
+
+#: openbox/client_menu.c:383
+msgid "Client menu"
+msgstr "Klientizvēlne"
+
+#: openbox/client_menu.c:393
+msgid "R_estore"
+msgstr "Atja_unot"
+
+#: openbox/client_menu.c:397
+msgid "_Move"
+msgstr "Pārviet_ot"
+
+#: openbox/client_menu.c:399
+msgid "Resi_ze"
+msgstr "Mainīt i_zmēru"
+
+#: openbox/client_menu.c:401
+msgid "Ico_nify"
+msgstr "Mi_nimizēt"
+
+#: openbox/client_menu.c:405
+msgid "Ma_ximize"
+msgstr "Maksimizē_t"
+
+#: openbox/client_menu.c:409
+msgid "_Roll up/down"
+msgstr "Sa_ritināt/Atritināt"
+
+#: openbox/client_menu.c:411
+msgid "Un/_Decorate"
+msgstr "Bez/Ar _dekorācijām"
+
+#: openbox/client_menu.c:415
+msgid "_Close"
+msgstr "Ai_zvērt"
+
+#: openbox/config.c:782
+#, c-format
+msgid "Invalid button \"%s\" specified in config file"
+msgstr "Konfigurācijas failā \"%s\" norādīts neatļauts taustiņš"
+
+#: openbox/keyboard.c:157
+msgid "Conflict with key binding in config file"
+msgstr "Konfliktē ar tastatūras saīsnēm konfigurācijas failā"
+
+#: openbox/menu.c:102 openbox/menu.c:110
+#, c-format
+msgid "Unable to find a valid menu file \"%s\""
+msgstr "Nav atrasts atļauts izvēlnes fails \"%s\""
+
+#: openbox/menu.c:170
+#, c-format
+msgid "Failed to execute command for pipe-menu \"%s\": %s"
+msgstr "Nevarēja izpildīt skriptētās izvēlnes komandu \"%s\": %s"
+
+#: openbox/menu.c:184
+#, c-format
+msgid "Invalid output from pipe-menu \"%s\""
+msgstr "Neatļauta izvade no skriptētās izvēlnes \"%s\""
+
+#: openbox/menu.c:197
+#, c-format
+msgid "Attempted to access menu \"%s\" but it does not exist"
+msgstr "Mēģināja piekļūt izvēlnei \"%s\", bet tā neeksistē"
+
+#: openbox/menu.c:367 openbox/menu.c:368
+msgid "More..."
+msgstr "Vairāk..."
+
+#: openbox/mouse.c:373
+#, c-format
+msgid "Invalid button \"%s\" in mouse binding"
+msgstr "Neatļauts taustiņš \"%s\" peles saīsnē"
+
+#: openbox/mouse.c:379
+#, c-format
+msgid "Invalid context \"%s\" in mouse binding"
+msgstr "Neatļauts konteksts \"%s\" peles saīsnē"
+
+#: openbox/openbox.c:133
+#, c-format
+msgid "Unable to change to home directory \"%s\": %s"
+msgstr "Nevarēja pāriet uz mājas mapi \"%s\": %s"
+
+#: openbox/openbox.c:152
+msgid "Failed to open the display from the DISPLAY environment variable."
+msgstr "Neizdevās atvēŗt displeju no DISPLAY vides mainīgā."
+
+#: openbox/openbox.c:183
+msgid "Failed to initialize the obrender library."
+msgstr "Neizdevās inicializēt obrender bibliotēku."
+
+#: openbox/openbox.c:194
+msgid "X server does not support locale."
+msgstr "X serveris neatbalsta lokāli."
+
+#: openbox/openbox.c:196
+msgid "Cannot set locale modifiers for the X server."
+msgstr "Nevar uzstādīt lokāles modificētājus X serverim."
+
+#: openbox/openbox.c:263
+msgid "Unable to find a valid config file, using some simple defaults"
+msgstr ""
+"Nevarēja atrast atļautu konfigurācijas failu, tiek izmantoti noklusējumi"
+
+#: openbox/openbox.c:297
+msgid "Unable to load a theme."
+msgstr "Nebija iespējams ielādēt tēmu."
+
+#: openbox/openbox.c:377
+#, c-format
+msgid ""
+"One or more XML syntax errors were found while parsing the Openbox "
+"configuration files.  See stdout for more information.  The last error seen "
+"was in file \"%s\" line %d, with message: %s"
+msgstr ""
+"Analizējot Openbox konfigurācijas datnes, tika atrastas viena vai vairākas "
+"XML sintakses kļūdas. Aplūkojiet standarta izvadi, lai noskaidrotu vairāk. "
+"Pēdējā kļūda bija failā \"%s\" - %d rinda, kļūdas ziņojums: %s"
+
+#: openbox/openbox.c:379
+msgid "Openbox Syntax Error"
+msgstr "Openbox sintakses kļūda"
+
+#: openbox/openbox.c:379
+msgid "Close"
+msgstr "Aizvērt"
+
+#: openbox/openbox.c:448
+#, c-format
+msgid "Restart failed to execute new executable \"%s\": %s"
+msgstr ""
+
+#: openbox/openbox.c:518 openbox/openbox.c:520
+msgid "Copyright (c)"
+msgstr "Copyright (c)"
+
+#: openbox/openbox.c:529
+msgid "Syntax: openbox [options]\n"
+msgstr "Sintakse: openbox [iespējas]\n"
+
+#: openbox/openbox.c:530
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Iespējas:\n"
+
+#: openbox/openbox.c:531
+msgid "  --help              Display this help and exit\n"
+msgstr "  --help              Parāda šo palīdzības tekstu un iziet\n"
+
+#: openbox/openbox.c:532
+msgid "  --version           Display the version and exit\n"
+msgstr "  --version           Parāda versiju un iziet\n"
+
+#: openbox/openbox.c:533
+msgid "  --replace           Replace the currently running window manager\n"
+msgstr "  --replace           Aizvieto pašreiz palaisto logu pārvaldnieku\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.
+#: openbox/openbox.c:537
+msgid "  --config-file FILE  Specify the path to the config file to use\n"
+msgstr ""
+"  --config-file FAILS Norāda ceļu uz izmantojamo konfigurācijas failu\n"
+
+#: openbox/openbox.c:538
+msgid "  --sm-disable        Disable connection to the session manager\n"
+msgstr "  --sm-disable        Atspējo savienojumu ar sesiju pārvaldnieku\n"
+
+#: openbox/openbox.c:539
+msgid ""
+"\n"
+"Passing messages to a running Openbox instance:\n"
+msgstr ""
+"\n"
+"Nodod ziņojumus esošai Openbox instancei:\n"
+
+#: openbox/openbox.c:540
+msgid "  --reconfigure       Reload Openbox's configuration\n"
+msgstr "  --reconfigure       Pārlādē Openbox konfigurācijas failus\n"
+
+#: openbox/openbox.c:541
+msgid "  --restart           Restart Openbox\n"
+msgstr "  --restart           Pārstartē Openbox\n"
+
+#: openbox/openbox.c:542
+msgid "  --exit              Exit Openbox\n"
+msgstr "  --exit              Iziet no Openbox\n"
+
+#: openbox/openbox.c:543
+msgid ""
+"\n"
+"Debugging options:\n"
+msgstr ""
+"\n"
+"Atkļūdošanas iespējas:\n"
+
+#: openbox/openbox.c:544
+msgid "  --sync              Run in synchronous mode\n"
+msgstr "  --sync              Palaist sinhronajā režīmā\n"
+
+#: openbox/openbox.c:545
+msgid "  --debug             Display debugging output\n"
+msgstr "  --debug             Rādīt atkļūdošanas izvadi\n"
+
+#: openbox/openbox.c:546
+msgid "  --debug-focus       Display debugging output for focus handling\n"
+msgstr "  --debug-focus       Rādīt atkļūdošanas izvadi fokusēšanas darbībām\n"
+
+#: openbox/openbox.c:547
+msgid "  --debug-xinerama    Split the display into fake xinerama screens\n"
+msgstr ""
+"  --debug-xinerama    Sadalīt displeju vairākos viltus xinerama ekrānos\n"
+
+#: openbox/openbox.c:548
+#, c-format
+msgid ""
+"\n"
+"Please report bugs at %s\n"
+msgstr ""
+"\n"
+"Lūdzu, ziņojiet kļūdas %s\n"
+
+#: openbox/openbox.c:617
+msgid "--config-file requires an argument\n"
+msgstr "--config-file vajadzīgs arguments\n"
+
+#: openbox/openbox.c:660
+#, c-format
+msgid "Invalid command line argument \"%s\"\n"
+msgstr "Neatļauts komandrindas arguments \"%s\"\n"
+
+#: openbox/screen.c:102 openbox/screen.c:190
+#, c-format
+msgid "A window manager is already running on screen %d"
+msgstr "Logu pārvaldnieks jau eksistē uz %d. ekrāna"
+
+#: openbox/screen.c:124
+#, c-format
+msgid "Could not acquire window manager selection on screen %d"
+msgstr "Nevarēja iegūt logu pārvaldnieka izvēli uz %d. ekrāna"
+
+#: openbox/screen.c:145
+#, c-format
+msgid "The WM on screen %d is not exiting"
+msgstr "Logu pārvaldnieks uz %d. ekrāna nebeidz darbību"
+
+#. TRANSLATORS: If you need to specify a different order of the
+#. arguments, you can use %1$d for the first one and %2$d for the
+#. second one. For example,
+#. "The current session has %2$d desktops, but Openbox is configured for %1$d ..."
+#: openbox/screen.c:412
+#, c-format
+msgid ""
+"Openbox is configured for %d desktop, but the current session has %d.  "
+"Overriding the Openbox configuration."
+msgid_plural ""
+"Openbox is configured for %d desktops, but the current session has %d.  "
+"Overriding the Openbox configuration."
+msgstr[0] ""
+"Openbox ir konfigurēts %d darbvirsmai, bet pašreizējai sesijai tādu ir %d.  "
+"Šī Openbox konfigurācijas opcija tiks ignorēta."
+msgstr[1] ""
+"Openbox ir konfigurēts %d darbvirsmām, bet pašreizējai sesijai tādu ir %d.  "
+"Šī Openbox konfigurācijas opcija tiks ignorēta."
+msgstr[2] ""
+"Openbox ir konfigurēts %d darbvirsmām, bet pašreizējai sesijai tādu ir %d.  "
+"Šī Openbox konfigurācijas opcija tiks ignorēta."
+
+#: openbox/screen.c:1180
+#, c-format
+msgid "desktop %i"
+msgstr "darbvirsma %i"
+
+#: openbox/session.c:104
+#, c-format
+msgid "Unable to make directory \"%s\": %s"
+msgstr "Nav iespējams izveidot mapi \"%s\": %s"
+
+#: openbox/session.c:466
+#, c-format
+msgid "Unable to save the session to \"%s\": %s"
+msgstr "Nav iespējams saglabāt sesiju \"%s\": %s"
+
+#: openbox/session.c:605
+#, c-format
+msgid "Error while saving the session to \"%s\": %s"
+msgstr "Kļūda saglabājot sesiju \"%s\": %s"
+
+#: openbox/session.c:842
+msgid "Not connected to a session manager"
+msgstr "Nav savienots ar sesiju pārvaldnieku"
+
+#: openbox/startupnotify.c:243
+#, c-format
+msgid "Running %s"
+msgstr "Palaiž %s"
+
+#: openbox/translate.c:59
+#, c-format
+msgid "Invalid modifier key \"%s\" in key/mouse binding"
+msgstr "Neatļauts modificētājtaustiņš \"%s\" tastatūras/peles saīsnē"
+
+#: openbox/translate.c:138
+#, c-format
+msgid "Invalid key code \"%s\" in key binding"
+msgstr "Neatļauts taustiņa kods \"%s\" tastatūras saīsnē"
+
+#: openbox/translate.c:145
+#, c-format
+msgid "Invalid key name \"%s\" in key binding"
+msgstr "Neatļauts taustiņa nosaukums \"%s\" tastatūras saīsnē"
+
+#: openbox/translate.c:151
+#, c-format
+msgid "Requested key \"%s\" does not exist on the display"
+msgstr "Pieprasītais taustiņš \"%s\" uz displeja neeksistē"
+
+#: openbox/xerror.c:40
+#, c-format
+msgid "X Error: %s"
+msgstr "X kļūda: %s"
+
+#: openbox/prompt.c:200
+msgid "OK"
+msgstr "Labi"
index e2e5efa..b635c23 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -459,8 +459,8 @@ msgstr "Niet met een sessiebeheerder verbonden"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Starten van %s\n"
+msgid "Running %s"
+msgstr "Starten van %s"
 
 #: openbox/translate.c:59
 #, c-format
index 5fe220d..a702caa 100644 (file)
--- a/po/no.po
+++ b/po/no.po
@@ -453,8 +453,8 @@ msgstr "Ikke tilknyttet en sesjonsbehandler"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Kjører %s\n"
+msgid "Running %s"
+msgstr "Kjører %s"
 
 #: openbox/translate.c:59
 #, c-format
index 02a9ad5..0450394 100644 (file)
@@ -432,7 +432,7 @@ msgstr ""
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
+msgid "Running %s"
 msgstr ""
 
 #: openbox/translate.c:59
index 5e92036..b0f5d52 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -445,8 +445,8 @@ msgstr ""
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Uruchamianie %s\n"
+msgid "Running %s"
+msgstr "Uruchamianie %s"
 
 #: openbox/translate.c:59
 #, c-format
index 0a98580..f962756 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
@@ -460,8 +460,8 @@ msgstr "Desligado do gestor de sess
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Executando %s\n"
+msgid "Running %s"
+msgstr "Executando %s"
 
 #: openbox/translate.c:59
 #, c-format
index 39852f6..fe44888 100644 (file)
@@ -463,8 +463,8 @@ msgstr "Não está conectado à um gerente de sessões"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Executando %s\n"
+msgid "Running %s"
+msgstr "Executando %s"
 
 #: openbox/translate.c:59
 #, c-format
index 7436980..dfbb425 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -453,8 +453,8 @@ msgstr "Не подключен к менеджеру сессии"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Запуск %s\n"
+msgid "Running %s"
+msgstr "Запуск %s"
 
 #: openbox/translate.c:59
 #, c-format
index 8ad1e60..6f16c94 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -442,8 +442,8 @@ msgstr ""
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Spúšťam %s\n"
+msgid "Running %s"
+msgstr "Spúšťam %s"
 
 #: openbox/translate.c:59
 #, c-format
index a590d4d..5702c78 100644 (file)
--- a/po/sr.po
+++ b/po/sr.po
@@ -463,8 +463,8 @@ msgstr "Није повезан са управником сесија"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Извршавам %s\n"
+msgid "Running %s"
+msgstr "Извршавам %s"
 
 #: openbox/translate.c:59
 #, c-format
index 0a6fff2..bf5fcdc 100644 (file)
@@ -463,8 +463,8 @@ msgstr "Nije povezan sa upravnikom sesija"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Izvršavam %s\n"
+msgid "Running %s"
+msgstr "Izvršavam %s"
 
 #: openbox/translate.c:59
 #, c-format
index 5040d2f..96be734 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -454,8 +454,8 @@ msgstr "Inte ansluten till en sessionshanterare"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Kör %s\n"
+msgid "Running %s"
+msgstr "Kör %s"
 
 #: openbox/translate.c:59
 #, c-format
index a0d9aea..122e3bd 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -458,8 +458,8 @@ msgstr "Oturum yöneticisine bağlı değil"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "%s çalışıyor\n"
+msgid "Running %s"
+msgstr "%s çalışıyor"
 
 #: openbox/translate.c:59
 #, c-format
similarity index 69%
rename from po/ua.po
rename to po/uk.po
index b051694..602f9fe 100644 (file)
--- a/po/ua.po
+++ b/po/uk.po
@@ -1,5 +1,6 @@
 # Ukrainian translation for Openbox.
 # Copyright (C) 2007 Dmitriy Moroz
+# Copyright (C) 2008 Serhiy Lysovenko
 # This file is distributed under the same license as the openbox package.
 # Dmitriy Moroz <zux@dimaka.org.ua>, 2007.
 #
@@ -7,10 +8,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Openbox 3.4.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.icculus.org\n"
-"POT-Creation-Date: 2008-11-15 22:28+0100\n"
-"PO-Revision-Date: 2007-06-16 13:02+0200\n"
-"Last-Translator: Dmitriy Moroz <zux@dimaka.org.ua>\n"
-"Language-Team: Ukrainian <root@archlinux.org.ua>\n"
+"POT-Creation-Date: 2009-07-05 13:50+0200\n"
+"PO-Revision-Date: 2008-12-09 20:12+0200\n"
+"Last-Translator: Serhiy Lysovenko <lisovenko.s[at]gmail[dot]com>\n"
+"Language-Team: Ukrainian <linux.org.ua>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -18,41 +19,41 @@ msgstr ""
 #: openbox/actions.c:149
 #, c-format
 msgid "Invalid action \"%s\" requested. No such action exists."
-msgstr "Здійснено запит на некоректну дію \"%s\". Нема такої дії."
+msgstr "Здійснено запит на неіснуючу дію \"%s\"."
 
 #: openbox/actions/execute.c:128
 msgid "No"
-msgstr ""
+msgstr "Ні"
 
 #: openbox/actions/execute.c:129
 msgid "Yes"
-msgstr ""
+msgstr "Так"
 
 #: openbox/actions/execute.c:133
 msgid "Execute"
-msgstr ""
+msgstr "Виконати"
 
 #: openbox/actions/execute.c:142
 #, c-format
 msgid "Failed to convert the path \"%s\" from utf8"
-msgstr "Не вдалося сконвертувати шлях \"%s\" з utf8"
+msgstr "Не вдалося конвертувати шлях \"%s\" з utf8"
 
 #: openbox/actions/exit.c:52 openbox/actions/session.c:64
-#: openbox/client.c:3465
+#: openbox/client.c:3466
 msgid "Cancel"
-msgstr ""
+msgstr "Скасувати"
 
 #: openbox/actions/exit.c:53
 msgid "Exit"
-msgstr ""
+msgstr "Вихід"
 
 #: openbox/actions/exit.c:56
 msgid "Are you sure you want to exit Openbox?"
-msgstr ""
+msgstr "Ви дійсно хочете вийти з Openbox?"
 
 #: openbox/actions/exit.c:57
 msgid "Exit Openbox"
-msgstr ""
+msgstr "Вийти з Openbox"
 
 #. TRANSLATORS: Don't translate the word "SessionLogout" as it's the
 #. name of the action you write in rc.xml
@@ -64,61 +65,63 @@ msgstr ""
 
 #: openbox/actions/session.c:65 openbox/actions/session.c:70
 msgid "Log Out"
-msgstr ""
+msgstr "Вийти"
 
 #: openbox/actions/session.c:69
 msgid "Are you sure you want to log out?"
-msgstr ""
+msgstr "Ви дійсно бажаєте завершити сеанс?"
 
-#: openbox/client.c:2012
+#: openbox/client.c:2013
 msgid "Unnamed Window"
-msgstr ""
+msgstr "Неназване вікно"
 
-#: openbox/client.c:2026 openbox/client.c:2058
+#: openbox/client.c:2027 openbox/client.c:2059
 msgid "Killing..."
-msgstr ""
+msgstr "Знищення..."
 
-#: openbox/client.c:2028 openbox/client.c:2060
+#: openbox/client.c:2029 openbox/client.c:2061
 msgid "Not Responding"
-msgstr ""
+msgstr "Не відповідає"
 
-#: openbox/client.c:3454
+#: openbox/client.c:3455
 #, c-format
 msgid ""
 "The window \"%s\" does not seem to be responding.  Do you want to force it "
 "to exit by sending the %s signal?"
 msgstr ""
+"Схоже, вікно \"%s\" не відповідає. Чи бажаєте примусово завершити програму, "
+"пославши сигнал \"%s\"?"
 
-#: openbox/client.c:3456
+#: openbox/client.c:3457
 msgid "End Process"
-msgstr ""
+msgstr "Примусове завершення"
 
-#: openbox/client.c:3460
+#: openbox/client.c:3461
 #, c-format
 msgid ""
 "The window \"%s\" does not seem to be responding.  Do you want to disconnect "
 "it from the X server?"
-msgstr ""
+msgstr "Вікно \"%s\" не відповідає. Чи бажаєте його від'єднати від X сервера?"
 
-#: openbox/client.c:3462
+#: openbox/client.c:3463
 msgid "Disconnect"
-msgstr ""
+msgstr "Від'єднати"
 
 #: openbox/client_list_combined_menu.c:87 openbox/client_list_menu.c:91
 msgid "Go there..."
-msgstr "Перейти...."
+msgstr "Перейти..."
 
 #: openbox/client_list_combined_menu.c:94
 msgid "Manage desktops"
-msgstr ""
+msgstr "Керування стільницями"
 
 #: openbox/client_list_combined_menu.c:95 openbox/client_list_menu.c:155
 msgid "_Add new desktop"
-msgstr ""
+msgstr "Додати нову стільницю (_A)"
 
 #: openbox/client_list_combined_menu.c:96 openbox/client_list_menu.c:156
 msgid "_Remove last desktop"
-msgstr ""
+msgstr "Видалити останню стільницю (_R)"
 
 #: openbox/client_list_combined_menu.c:149
 msgid "Windows"
@@ -130,68 +133,68 @@ msgstr "Стільниці"
 
 #: openbox/client_menu.c:258
 msgid "All desktops"
-msgstr "Ð\92Ñ\81Ñ\96 Ñ\81Ñ\82Ñ\96лÑ\8cниÑ\86Ñ\96"
+msgstr "Ð\9dа Ð²Ñ\81Ñ\96Ñ\85 Ñ\81Ñ\82Ñ\96лÑ\8cниÑ\86Ñ\8fÑ\85"
 
 #: openbox/client_menu.c:370
 msgid "_Layer"
-msgstr "Шар(_L)"
+msgstr "Шар (_L)"
 
 #: openbox/client_menu.c:375
 msgid "Always on _top"
-msgstr "Ð\97веÑ\80Ñ\85Ñ\83 Ð²Ñ\81Ñ\96Ñ\85 Ð²Ñ\96кон(_T)"
+msgstr "Ð\9dад Ñ\83Ñ\81Ñ\96ма Ð²Ñ\96кнами (_T)"
 
 #: openbox/client_menu.c:376
 msgid "_Normal"
-msgstr "Звичайне положення(_N)"
+msgstr "Звичайне положення (_N)"
 
 #: openbox/client_menu.c:377
 msgid "Always on _bottom"
-msgstr "Ð\97низÑ\83 Ð²Ñ\81Ñ\96Ñ\85 Ð²Ñ\96кон(_B)"
+msgstr "Ð\9fÑ\96д Ð²Ñ\96кнами (_B)"
 
 #: openbox/client_menu.c:379
 msgid "_Send to desktop"
-msgstr "Відправити на стільницю(_S)"
+msgstr "Відправити на стільницю (_S)"
 
 #: openbox/client_menu.c:383
 msgid "Client menu"
-msgstr "Меню клієнтів"
+msgstr "Меню клієнта"
 
 #: openbox/client_menu.c:393
 msgid "R_estore"
-msgstr "Відновити(_E)"
+msgstr "Відновити (_E)"
 
 #: openbox/client_menu.c:397
 msgid "_Move"
-msgstr "Перемістити(_M)"
+msgstr "Перемістити (_M)"
 
 #: openbox/client_menu.c:399
 msgid "Resi_ze"
-msgstr "Змінити розмір(_Z)"
+msgstr "Змінити розмір (_Z)"
 
 #: openbox/client_menu.c:401
 msgid "Ico_nify"
-msgstr "Згорнути(_N)"
+msgstr "Згорнути (_N)"
 
 #: openbox/client_menu.c:405
 msgid "Ma_ximize"
-msgstr "Розгорнути(_X)"
+msgstr "Розгорнути (_X)"
 
 #: openbox/client_menu.c:409
 msgid "_Roll up/down"
-msgstr "Скрутити/Розкрутити(_R)"
+msgstr "Скрутити/Розкрутити (_R)"
 
 #: openbox/client_menu.c:411
 msgid "Un/_Decorate"
-msgstr "(Від)декорувати(_D)"
+msgstr "Перемкнути декорацію (_D)"
 
 #: openbox/client_menu.c:415
 msgid "_Close"
-msgstr "Закрити(_C)"
+msgstr "Закрити (_C)"
 
-#: openbox/config.c:781
+#: openbox/config.c:782
 #, c-format
 msgid "Invalid button \"%s\" specified in config file"
-msgstr "Ð\9dекоÑ\80екÑ\82на ÐºÐ»Ð°Ð²Ñ\96Ñ\88а \"%s\" вказана у файлі конфігурації"
+msgstr "Ð\9dекоÑ\80екÑ\82на ÐºÐ½Ð¾Ð¿Ðºа \"%s\" вказана у файлі конфігурації"
 
 #: openbox/keyboard.c:157
 msgid "Conflict with key binding in config file"
@@ -215,7 +218,7 @@ msgstr "Некоректний вивід з pipe-меню \"%s\""
 #: openbox/menu.c:197
 #, c-format
 msgid "Attempted to access menu \"%s\" but it does not exist"
-msgstr "Спроба доступа до меню \"%s\" якого не існує"
+msgstr "Спроба доступу до неіснуючого меню \"%s\""
 
 #: openbox/menu.c:367 openbox/menu.c:368
 msgid "More..."
@@ -229,12 +232,12 @@ msgstr "Некоректна клавіша \"%s\" в прив'язці клав
 #: openbox/mouse.c:379
 #, c-format
 msgid "Invalid context \"%s\" in mouse binding"
-msgstr "Некоректний контекст \"%s\" в прив'зці клавіш мишки"
+msgstr "Некоректний контекст \"%s\" в прив'язці клавіш мишки"
 
 #: openbox/openbox.c:133
 #, c-format
 msgid "Unable to change to home directory \"%s\": %s"
-msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð¿ÐµÑ\80ейÑ\82и Ð² Ð´Ð¾Ð¼Ð°Ñ\88нÑ\8e Ð´Ð¸Ñ\80екÑ\82оÑ\80Ñ\96Ñ\8e \"%s\": %s"
+msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð¿ÐµÑ\80ейÑ\82и Ð´Ð¾ Ð´Ð¾Ð¼Ð°Ñ\88нÑ\8cого ÐºÐ°Ñ\82алогÑ\83 \"%s\": %s"
 
 #: openbox/openbox.c:152
 msgid "Failed to open the display from the DISPLAY environment variable."
@@ -260,7 +263,7 @@ msgstr ""
 
 #: openbox/openbox.c:297
 msgid "Unable to load a theme."
-msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð·Ð°Ð³Ñ\80Ñ\83зиÑ\82и Ñ\81Ñ\82илÑ\8c"
+msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ð·Ð°Ð²Ð°Ð½Ñ\82ажиÑ\82и Ñ\82емÑ\83"
 
 #: openbox/openbox.c:377
 #, c-format
@@ -269,10 +272,13 @@ msgid ""
 "configuration files.  See stdout for more information.  The last error seen "
 "was in file \"%s\" line %d, with message: %s"
 msgstr ""
+"Виявлено одну або більше синтаксичних помилок XML під час сканування "
+"конфігураційних файлів Openbox. Щоб дізнатись більше - перегляньте stdout. "
+"Остання помічена помилка була в файлі \"%s\", стрічка %d, повідомлення: %s"
 
 #: openbox/openbox.c:379
 msgid "Openbox Syntax Error"
-msgstr ""
+msgstr "синтаксична помилка Openbox"
 
 #: openbox/openbox.c:379
 msgid "Close"
@@ -302,7 +308,7 @@ msgstr ""
 
 #: openbox/openbox.c:531
 msgid "  --help              Display this help and exit\n"
-msgstr "  --help              Показати цю справку і вийти\n"
+msgstr "  --help              Показати цю довідку і вийти\n"
 
 #: openbox/openbox.c:532
 msgid "  --version           Display the version and exit\n"
@@ -310,18 +316,18 @@ msgstr "  --vesrion           Показати версію і вийти\n"
 
 #: openbox/openbox.c:533
 msgid "  --replace           Replace the currently running window manager\n"
-msgstr "  --replace           Ð\97амÑ\96ниÑ\82и Ð¿Ð¾Ñ\82оÑ\87ний менеджер вікон\n"
+msgstr "  --replace           Ð\97амÑ\96ниÑ\82и Ð·Ð°Ð¿Ñ\83Ñ\89ений менеджер вікон\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.
 #: openbox/openbox.c:537
 msgid "  --config-file FILE  Specify the path to the config file to use\n"
-msgstr ""
+msgstr "  --config-file ФАЙЛ  Вказати шлях до конфігураційного файлу\n"
 
 #: openbox/openbox.c:538
 msgid "  --sm-disable        Disable connection to the session manager\n"
-msgstr "  --sm-disable        Ð\9dе Ð·'Ñ\94днÑ\83ваÑ\82иÑ\81Ñ\8f Ð· Ñ\81еÑ\81Ñ\96йним Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ\80ом\n"
+msgstr "  --sm-disable        Ð\92имкнÑ\83Ñ\82и Ð·'Ñ\94днаннÑ\8f Ð· Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ\80ом Ñ\81еанÑ\81Ñ\83\n"
 
 #: openbox/openbox.c:539
 msgid ""
@@ -329,7 +335,7 @@ msgid ""
 "Passing messages to a running Openbox instance:\n"
 msgstr ""
 "\n"
-"Ð\9fеÑ\80едаÑ\8e Ð¿Ð¾Ð²Ñ\96домленнÑ\8f Ð¿Ñ\80оÑ\86еÑ\81Ñ\83 Openbox що виконується\n"
+"Ð\9fеÑ\80едаÑ\87а Ð¿Ð¾Ð²Ñ\96домленÑ\8c Ð¿Ñ\80оÑ\86еÑ\81Ñ\83 Openbox, що виконується\n"
 
 #: openbox/openbox.c:540
 msgid "  --reconfigure       Reload Openbox's configuration\n"
@@ -341,7 +347,7 @@ msgstr "  --restart           Перезапустити Openbox\n"
 
 #: openbox/openbox.c:542
 msgid "  --exit              Exit Openbox\n"
-msgstr ""
+msgstr "  --exit              Вийти з Openbox\n"
 
 #: openbox/openbox.c:543
 msgid ""
@@ -362,7 +368,8 @@ msgstr "  --debug             Показувати інформацію нала
 #: openbox/openbox.c:546
 msgid "  --debug-focus       Display debugging output for focus handling\n"
 msgstr ""
-"  --debug-focus       Показувати інформацію налагоджування для уравління\n"
+"  --debug-focus       Показувати відлагоджувальний вивід для керування "
+"фокусом\n"
 
 #: openbox/openbox.c:547
 msgid "  --debug-xinerama    Split the display into fake xinerama screens\n"
@@ -379,12 +386,12 @@ msgstr ""
 
 #: openbox/openbox.c:617
 msgid "--config-file requires an argument\n"
-msgstr ""
+msgstr "--config-file потребує аргументу\n"
 
 #: openbox/openbox.c:660
 #, c-format
 msgid "Invalid command line argument \"%s\"\n"
-msgstr "Ð\9dекоÑ\80екÑ\82ний ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ð¹ Ð°Ñ\80гÑ\83менÑ\82 \"%s\"\n"
+msgstr "Некоректний аргумент \"%s\"\n"
 
 #: openbox/screen.c:102 openbox/screen.c:190
 #, c-format
@@ -394,19 +401,19 @@ msgstr "На дисплеї %d вже запущений менеджер вік
 #: openbox/screen.c:124
 #, c-format
 msgid "Could not acquire window manager selection on screen %d"
-msgstr "Ð\9dе Ð¼Ð¾Ð¶Ñ\83 Ð¾Ñ\82Ñ\80имаÑ\82и Ð²Ð¸Ð±Ñ\96Ñ\80 менеджера вікон на дисплеї %d"
+msgstr "Ð\9dе Ð¼Ð¾Ð¶Ñ\83 Ð·Ð°Ð¿Ñ\83Ñ\81Ñ\82иÑ\82и менеджера вікон на дисплеї %d"
 
 #: openbox/screen.c:145
 #, c-format
 msgid "The WM on screen %d is not exiting"
-msgstr "Менеджео вікон на дисплеї %d не завершується"
+msgstr "Менеджер вікон на дисплеї %d не завершається"
 
 #. TRANSLATORS: If you need to specify a different order of the
 #. arguments, you can use %1$d for the first one and %2$d for the
 #. second one. For example,
 #. "The current session has %2$d desktops, but Openbox is configured for %1$d ..."
-#: openbox/screen.c:412
-#, c-format
+#: openbox/screen.c:419
+#, fuzzy, c-format
 msgid ""
 "Openbox is configured for %d desktop, but the current session has %d.  "
 "Overriding the Openbox configuration."
@@ -414,9 +421,13 @@ msgid_plural ""
 "Openbox is configured for %d desktops, but the current session has %d.  "
 "Overriding the Openbox configuration."
 msgstr[0] ""
+"Openbox сконфігуровано на %d дисплеїв, але в поточній сесії використовується "
+"%d.  Перевищення конфігурації Openbox."
 msgstr[1] ""
+"Openbox сконфігуровано на %d дисплеїв, але в поточній сесії використовується "
+"%d.  Перевищення конфігурації Openbox."
 
-#: openbox/screen.c:1180
+#: openbox/screen.c:1205
 #, c-format
 msgid "desktop %i"
 msgstr "стільниця %i"
@@ -424,7 +435,7 @@ msgstr "стільниця %i"
 #: openbox/session.c:104
 #, c-format
 msgid "Unable to make directory \"%s\": %s"
-msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ñ\81Ñ\82воÑ\80иÑ\82и Ð´Ð¸Ñ\80екÑ\82оÑ\80Ñ\96Ñ\8e \"%s\": %s"
+msgstr "Ð\9dе Ð²Ð´Ð°Ð»Ð¾Ñ\81Ñ\8f Ñ\81Ñ\82воÑ\80иÑ\82и ÐºÐ°Ñ\82алог \"%s\": %s"
 
 #: openbox/session.c:466
 #, c-format
@@ -438,12 +449,12 @@ msgstr "Помилка при збереженні сесії в \"%s\": %s"
 
 #: openbox/session.c:842
 msgid "Not connected to a session manager"
-msgstr ""
+msgstr "Не під'єднано до керівника сесіями"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Виконується %s\n"
+msgid "Running %s"
+msgstr "Виконується %s"
 
 #: openbox/translate.c:59
 #, c-format
@@ -454,17 +465,17 @@ msgstr ""
 #: openbox/translate.c:138
 #, c-format
 msgid "Invalid key code \"%s\" in key binding"
-msgstr "Некоректний код клавіши \"%s\" у прив'зці клавіш"
+msgstr "Некоректний код клавіші \"%s\" у прив'язці клавіш"
 
 #: openbox/translate.c:145
 #, c-format
 msgid "Invalid key name \"%s\" in key binding"
-msgstr "Некоректна назва клавіши \"%s\" у прив'язці клавіш"
+msgstr "Некоректна назва клавіші \"%s\" у прив'язці клавіш"
 
 #: openbox/translate.c:151
 #, c-format
 msgid "Requested key \"%s\" does not exist on the display"
-msgstr "Ð\9aлавÑ\96Ñ\88а \"%s\" Ð½Ð° Ñ\8fкÑ\83 Ð·Ð´Ñ\96йÑ\81нено Ð·Ð°Ð¿Ð¸Ñ\82 - Ð½Ðµ Ñ\96Ñ\81нÑ\83Ñ\94 Ð½Ð° Ð´Ð¸Ñ\81плеÑ\97"
+msgstr "Ð\9fоÑ\82Ñ\80Ñ\96бноÑ\97 ÐºÐ½Ð¾Ð¿ÐºÐ¸ \"%s\" Ð½ÐµÐ¼Ð° Ð½Ð° ÐµÐºÑ\80анÑ\96"
 
 #: openbox/xerror.c:40
 #, c-format
@@ -473,7 +484,7 @@ msgstr "Помилка X-серверу: %s"
 
 #: openbox/prompt.c:200
 msgid "OK"
-msgstr ""
+msgstr "Гаразд"
 
 #~ msgid "Failed to execute \"%s\": %s"
 #~ msgstr "Невдалося виконати \"%s\": %s"
index 8341486..49dd347 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -452,8 +452,8 @@ msgstr "Không hàng với session quản lý"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "Đan Chạy %s\n"
+msgid "Running %s"
+msgstr "Đan Chạy %s"
 
 #: openbox/translate.c:59
 #, c-format
index 89a6585..61058af 100644 (file)
@@ -444,8 +444,8 @@ msgstr "未连接到会话管理器"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "运行 %s\n"
+msgid "Running %s"
+msgstr "运行 %s"
 
 #: openbox/translate.c:59
 #, c-format
index ccaa229..72e6285 100644 (file)
@@ -444,8 +444,8 @@ msgstr "沒有連接到作業階段管理員"
 
 #: openbox/startupnotify.c:243
 #, c-format
-msgid "Running %s\n"
-msgstr "正在運行 %s\n"
+msgid "Running %s"
+msgstr "正在運行 %s"
 
 #: openbox/translate.c:59
 #, c-format
index 8b6850f..60a0a55 100644 (file)
@@ -507,11 +507,11 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h)
     */
     if (h <= 5) {
         y1sz = MAX(h/2, 0);
-        y2sz = (h < 3 ? 0 : h % 2);
+        y2sz = (h < 3) ? 0 : (h & 1);
         y3sz = MAX(h/2, 1);
     }
     else {
-        y1sz = h/2 - (1 - (h % 2));
+        y1sz = h/2 - (1 - (h & 1));
         y2sz = 1;
         y3sz = h/2;
     }
@@ -534,13 +534,15 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h)
     }
     *data = COLOR(y1);
     data += w;
-    for (y2 = y2sz-1; y2 > 0; --y2) {
+    if (y2sz) {
+        for (y2 = y2sz-1; y2 > 0; --y2) {
+            *data = COLOR(y2);
+            data += w;
+            NEXT(y2);
+        }
         *data = COLOR(y2);
         data += w;
-        NEXT(y2);
     }
-    *data = COLOR(y2);
-    data += w;
     for (y3 = y3sz-1; y3 > 0; --y3) {
         *data = COLOR(y3);
         data += w;
index 47c8a9c..8ead967 100644 (file)
@@ -46,6 +46,22 @@ static int parse_inline_number(const char *p);
 static RrPixel32* read_c_image(gint width, gint height, const guint8 *data);
 static void set_default_appearance(RrAppearance *a);
 
+static RrFont *get_font(RrFont *target, RrFont **default_font, const RrInstance *inst)
+{
+    if (target) {
+        RrFontRef(target);
+        return target;
+    } else {
+        /* Only load the default font once */
+        if (*default_font) {
+            RrFontRef(*default_font);
+        } else {
+            *default_font = RrFontOpenDefault(inst);
+        }
+        return *default_font;
+    }
+}
+
 RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
                     gboolean allow_fallback,
                     RrFont *active_window_font, RrFont *inactive_window_font,
@@ -56,6 +72,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
     RrJustify winjust, mtitlejust;
     gchar *str;
     RrTheme *theme;
+    RrFont *default_font = NULL;
     gchar *path;
     gboolean userdef;
 
@@ -130,17 +147,8 @@ RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
     theme->osd_unhilite_fg = RrAppearanceNew(inst, 0);
 
     /* load the font stuff */
-    if (active_window_font) {
-        theme->win_font_focused = active_window_font;
-        RrFontRef(active_window_font);
-    } else
-        theme->win_font_focused = RrFontOpenDefault(inst);
-
-    if (inactive_window_font) {
-        theme->win_font_unfocused = inactive_window_font;
-        RrFontRef(inactive_window_font);
-    } else
-        theme->win_font_unfocused = RrFontOpenDefault(inst);
+    theme->win_font_focused = get_font(active_window_font, &default_font, inst);
+    theme->win_font_unfocused = get_font(inactive_window_font, &default_font, inst);
 
     winjust = RR_JUSTIFY_LEFT;
     if (read_string(db, "window.label.text.justify", &str)) {
@@ -150,11 +158,7 @@ RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
             winjust = RR_JUSTIFY_CENTER;
     }
 
-    if (menu_title_font) {
-        theme->menu_title_font = menu_title_font;
-        RrFontRef(menu_title_font);
-    } else
-        theme->menu_title_font = RrFontOpenDefault(inst);
+    theme->menu_title_font = get_font(menu_title_font, &default_font, inst);
 
     mtitlejust = RR_JUSTIFY_LEFT;
     if (read_string(db, "menu.title.text.justify", &str)) {
@@ -164,17 +168,9 @@ RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
             mtitlejust = RR_JUSTIFY_CENTER;
     }
 
-    if (menu_item_font) {
-        theme->menu_font = menu_item_font;
-        RrFontRef(menu_item_font);
-    } else
-        theme->menu_font = RrFontOpenDefault(inst);
-
-    if (osd_font) {
-        theme->osd_font = osd_font;
-        RrFontRef(osd_font);
-    } else
-        theme->osd_font = RrFontOpenDefault(inst);
+    theme->menu_font = get_font(menu_item_font, &default_font, inst);
+
+    theme->osd_font = get_font(osd_font, &default_font, inst);
 
     /* load direct dimensions */
     if ((!read_int(db, "menu.overlap.x", &theme->menu_overlap_x) &&