]> Dogcows Code - chaz/openbox/commitdiff
Merge branch 'backport' into work
authorDana Jansens <danakj@orodu.net>
Thu, 31 Jan 2008 17:36:06 +0000 (12:36 -0500)
committerDana Jansens <danakj@orodu.net>
Thu, 31 Jan 2008 17:51:38 +0000 (12:51 -0500)
Conflicts:

openbox/client.c
openbox/config.c
openbox/event.c
openbox/extensions.c
openbox/focus_cycle_indicator.c
openbox/focus_cycle_popup.c
openbox/menuframe.c
openbox/moveresize.c
openbox/openbox.c
openbox/screen.c
openbox/stacking.c
openbox/startupnotify.c

24 files changed:
1  2 
.gitignore
Makefile.am
data/rc.xml
openbox/actions.c
openbox/actions/execute.c
openbox/client.c
openbox/client_menu.c
openbox/config.c
openbox/config.h
openbox/dock.c
openbox/event.c
openbox/focus_cycle_indicator.c
openbox/focus_cycle_popup.c
openbox/frame.c
openbox/framerender.c
openbox/menuframe.c
openbox/menuframe.h
openbox/moveresize.c
openbox/openbox.c
openbox/popup.c
openbox/screen.c
openbox/stacking.c
openbox/startupnotify.c
render/theme.c

diff --combined .gitignore
index df5b623ca015f2bc72e759bf2eb19ebe55e19054,3baae1438b16b13785bf0bea7382c9c7fabdf0d5..e9374053e4bf091c737920b249a17535a55e6d46
@@@ -32,7 -32,7 +32,7 @@@ m4/*.m
  missing
  .dirstamp
  openbox/openbox
 -parser/obparser-3.0.pc
 +parser/obparser-4.0.pc
  po/Makefile.in.in
  po/Makevars.template
  po/POTFILES
@@@ -44,10 -44,48 +44,49 @@@ po/insert-header.si
  po/quot.sed
  po/remove-potcdate.sin
  po/stamp-po
+ po/en@boldquot.insert-header
+ po/en@quot.insert-header
+ po/remove-potcdate.sed
  *.gmo
 -render/obrender-3.0.pc
 +render/obrender-4.0.pc
 +obt/obt-4.0.pc
  tools/gnome-panel-control/gnome-panel-control
  version.h
  .libs
  .deps
+ tests/aspect
+ tests/big
+ tests/borderchange
+ tests/confignotify
+ tests/confignotifymax
+ tests/duplicatesession
+ tests/extentsrequest
+ tests/fakeunmap
+ tests/fallback
+ tests/focusout
+ tests/fullscreen
+ tests/grav
+ tests/groupmodal
+ tests/grouptran
+ tests/grouptran2
+ tests/grouptrancircular
+ tests/grouptrancircular2
+ tests/icons
+ tests/mapiconic
+ tests/modal
+ tests/modal2
+ tests/modal3
+ tests/noresize
+ tests/override
+ tests/positioned
+ tests/resize
+ tests/restack
+ tests/shape
+ tests/showhide
+ tests/skiptaskbar
+ tests/skiptaskbar2
+ tests/stacking
+ tests/strut
+ tests/title
+ tests/urgent
+ tests/usertimewin
diff --combined Makefile.am
index 3025686d2b63b1088e5d07b2950c060cbef76bd9,b7710247d3f11b5c99375b259f9137b26af9333b..9b3140c3fb19e6656f45758658c526cd90208642
@@@ -8,7 -8,7 +8,7 @@@ rcdir           = $(configdir)/openbo
  xsessionsdir    = $(datadir)/xsessions
  gnomewmfilesdir = $(datadir)/gnome/wm-properties
  pkgconfigdir    = $(libdir)/pkgconfig
 -pubincludedir   = $(includedir)/openbox/@OB_VERSION@/openbox
 +pubincludedir   = $(includedir)/openbox/@OBT_VERSION@/openbox
  pixmapdir       = $(datadir)/pixmaps
  xsddir          = $(datadir)/openbox
  
@@@ -24,8 -24,8 +24,8 @@@ check_PROGRAMS = 
        render/rendertest
  
  lib_LTLIBRARIES = \
 -      parser/libobparser.la \
 -      render/libobrender.la
 +      render/libobrender.la \
 +      obt/libobt.la
  
  bin_PROGRAMS = \
        openbox/openbox \
@@@ -44,7 -44,7 +44,7 @@@ render_rendertest_CPPFLAGS = 
        $(GLIB_CFLAGS) \
        -DG_LOG_DOMAIN=\"RenderTest\"
  render_rendertest_LDADD = \
 -      parser/libobparser.la \
 +      obt/libobt.la \
        render/libobrender.la \
        $(GLIB_LIBS) \
        $(PANGO_LIBS) \
@@@ -62,9 -62,9 +62,9 @@@ render_libobrender_la_CPPFLAGS = 
        -DG_LOG_DOMAIN=\"ObRender\" \
        -DDEFAULT_THEME=\"$(theme)\"
  render_libobrender_la_LDFLAGS = \
 -      -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
 +      -version-info $(RR_CURRENT):$(RR_REVISION):$(RR_AGE)
  render_libobrender_la_LIBADD = \
 -      parser/libobparser.la \
 +      obt/libobt.la \
        $(X_LIBS) \
        $(PANGO_LIBS) \
        $(XFT_LIBS) \
@@@ -91,52 -91,33 +91,52 @@@ render_libobrender_la_SOURCES = 
        render/theme.h \
        render/theme.c
  
 -## parser ##
 +## obt ##
  
 -parser_libobparser_la_CPPFLAGS = \
 +obt_libobt_la_CPPFLAGS = \
 +      $(XINERAMA_CFLAGS) \
 +      $(XKB_CFLAGS) \
 +      $(XRANDR_CFLAGS) \
 +      $(XSHAPE_CFLAGS) \
 +      $(XSYNC_CFLAGS) \
        $(GLIB_CFLAGS) \
        $(XML_CFLAGS) \
 -      -DG_LOG_DOMAIN=\"ObParser\" \
 +      -DG_LOG_DOMAIN=\"Obt\" \
        -DLOCALEDIR=\"$(localedir)\" \
        -DDATADIR=\"$(datadir)\" \
        -DCONFIGDIR=\"$(configdir)\"
 -parser_libobparser_la_LDFLAGS = \
 -      -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE)
 -parser_libobparser_la_LIBADD = \
 +obt_libobt_la_LDFLAGS = \
 +      -version-info $(OBT_CURRENT):$(OBT_REVISION):$(OBT_AGE)
 +obt_libobt_la_LIBADD = \
 +      $(XINERAMA_LIBS) \
 +      $(XKB_LIBS) \
 +      $(XRANDR_LIBS) \
 +      $(XSHAPE_LIBS) \
 +      $(XSYNC_LIBS) \
        $(GLIB_LIBS) \
 -      $(XML_LIBS) 
 -parser_libobparser_la_SOURCES = \
 -      parser/parse.h \
 -      parser/parse.c
 +      $(XML_LIBS)
 +obt_libobt_la_SOURCES = \
 +      obt/display.h \
 +      obt/display.c \
 +      obt/internal.h \
 +      obt/keyboard.h \
 +      obt/keyboard.c \
 +      obt/mainloop.h \
 +      obt/mainloop.c \
 +      obt/parse.h \
 +      obt/parse.c \
 +      obt/paths.h \
 +      obt/paths.c \
 +      obt/prop.h \
 +      obt/prop.c \
 +      obt/util.h \
 +      obt/xevent.h \
 +      obt/xevent.c
  
  ## openbox ##
  
  openbox_openbox_CPPFLAGS = \
        $(SM_CFLAGS) \
 -      $(XINERAMA_CFLAGS) \
 -      $(XKB_CFLAGS) \
 -      $(XRANDR_CFLAGS) \
 -      $(XSHAPE_CFLAGS) \
 -      $(XSYNC_CFLAGS) \
        $(X_CFLAGS) \
        $(XCURSOR_CFLAGS) \
        $(SM_CFLAGS) \
        -DG_LOG_DOMAIN=\"Openbox\"
  openbox_openbox_LDADD = \
        $(SM_LIBS) \
 -      $(XINERAMA_LIBS) \
 -      $(XKB_LIBS) \
 -      $(XRANDR_LIBS) \
 -      $(XSHAPE_LIBS) \
 -      $(XSYNC_LIBS) \
        $(GLIB_LIBS) \
        $(X_LIBS) \
        $(XCURSOR_LIBS) \
        $(EFENCE_LIBS) \
        $(LIBINTL) \
        render/libobrender.la \
 -      parser/libobparser.la
 +      obt/libobt.la
  openbox_openbox_LDFLAGS = -export-dynamic
  openbox_openbox_SOURCES = \
        gettext.h \
        openbox/dock.h \
        openbox/event.c \
        openbox/event.h \
 -      openbox/extensions.c \
 -      openbox/extensions.h \
        openbox/focus.c \
        openbox/focus.h \
        openbox/focus_cycle.c \
        openbox/keyboard.h \
        openbox/keytree.c \
        openbox/keytree.h \
 -      openbox/mainloop.c \
 -      openbox/mainloop.h \
        openbox/menuframe.c \
        openbox/menuframe.h \
        openbox/menu.c \
        openbox/menu.h \
        openbox/misc.h \
 -      openbox/modkeys.c \
 -      openbox/modkeys.h \
        openbox/mouse.c \
        openbox/mouse.h \
        openbox/moveresize.c \
        openbox/place.h \
        openbox/popup.c \
        openbox/popup.h \
 -      openbox/prop.c \
 -      openbox/prop.h \
        openbox/resist.c \
        openbox/resist.h \
        openbox/screen.c \
        openbox/translate.c \
        openbox/translate.h \
        openbox/window.c \
 -      openbox/window.h \
 -      openbox/xerror.c \
 -      openbox/xerror.h
 -
 +      openbox/window.h
  
  ## gnome-panel-control ##
  
@@@ -301,6 -298,10 +301,10 @@@ clearlooks_themedir = $(themedir)/Clear
  dist_clearlooks_theme_DATA= \
        themes/Clearlooks/openbox-3/themerc
  
+ clearlooks34_themedir = $(themedir)/Clearlooks/openbox-3
+ dist_clearlooks34_theme_DATA= \
+       themes/Clearlooks-3.4/openbox-3/themerc
  clearlooksolive_themedir = $(themedir)/Clearlooks-Olive/openbox-3
  dist_clearlooksolive_theme_DATA= \
        themes/Clearlooks-Olive/openbox-3/themerc
@@@ -382,28 -383,14 +386,28 @@@ pubinclude_HEADERS = 
        render/mask.h \
        render/render.h \
        render/theme.h \
 -      parser/parse.h
 +      obt/display.h \
 +      obt/display.c \
 +      obt/keyboard.h \
 +      obt/keyboard.c \
 +      obt/mainloop.h \
 +      obt/mainloop.c \
 +      obt/parse.h \
 +      obt/parse.c \
 +      obt/paths.h \
 +      obt/paths.c \
 +      obt/prop.h \
 +      obt/prop.c \
 +      obt/util.h \
 +      obt/xevent.h \
 +      obt/xevent.c
  
  nodist_pubinclude_HEADERS = \
        version.h
  
  nodist_pkgconfig_DATA = \
 -      render/obrender-3.0.pc \
 -      parser/obparser-3.0.pc
 +      render/obrender-4.0.pc \
 +      obt/obt-4.0.pc
  
  ## data ##
  
@@@ -462,8 -449,8 +466,8 @@@ dist_noinst_DATA = 
        doc/openbox-gnome-session.1.in \
        doc/openbox-kde-session.1.sgml \
        doc/openbox-kde-session.1.in \
 -      render/obrender-3.0.pc.in \
 -      parser/obparser-3.0.pc.in \
 +      render/obrender-4.0.pc.in \
 +      obt/obt-4.0.pc.in \
        tools/themeupdate/themeupdate.py \
        tests/hideshow.py \
        tests/Makefile \
@@@ -519,7 -506,7 +523,7 @@@ CLEANFILES = 
  #       $(MAKE) -$(MAKEFLAGS) -C doc/doxygen doc
  
  distclean-local:
 -      for d in . m4 po render; do \
 +      for d in . m4 po render parser obt openbox; do \
                for p in core core.* gmon.out *\~ *.orig *.rej .\#*; do \
                        rm -f "$$d/$$p"; \
                done \
diff --combined data/rc.xml
index 567ca28bdc9119113832de5215791a86ead481e4,d164660d3ec2760bd10e951417c5ceb1e9d18071..86e0d9d691967bfca2fbeb30f4d34e6e8dcd401c
    <center>yes</center>
    <!-- whether to place windows in the center of the free area found or
         the top left corner -->
-   <active>no</active>
-   <!-- force new windows ont the active monitor on a multi-head system, unless
-        they are part of an application already on another monitor -->
+   <monitor>Any</monitor>
+   <!-- with Smart placement on a multi-monitor system, try to place new windows
+        on: 'Any' - any monitor, 'Mouse' - where the mouse is, 'Active' - where
+        the active window is -->
  </placement>
  
  <theme>
    <name>Clearlooks</name>
    <titleLayout>NLIMC</titleLayout>
    <!--
-       avaible characters are NDSLIMC, each can occur at most once.
+       available characters are NDSLIMC, each can occur at most once.
        N: window icon
        L: window label (AKA title).
        I: iconify
      </mousebind>
  
      <mousebind button="Up" action="Click">
 -      <action name="Shade"/>
 -      <action name="FocusToBottom"/>
 -      <action name="Unfocus"/>
 -      <action name="Lower"/>
 +      <action name="if">
 +        <shaded>no</shaded>
 +        <then>
 +          <action name="Shade"/>
 +          <action name="FocusToBottom"/>
 +          <action name="Unfocus"/>
 +          <action name="Lower"/>
 +        </then>
 +      </action>
      </mousebind>
      <mousebind button="Down" action="Click">
 -      <action name="Unshade"/>
 -      <action name="Raise"/>
 +      <action name="if">
 +        <shaded>yes</shaded>
 +        <then>
 +          <action name="Unshade"/>
 +          <action name="Raise"/>
 +        </then>
 +      </action>
      </mousebind>
  
      <mousebind button="Right" action="Press">
    </context>
  
    <context name="Desktop">
 -    <mousebind button="Up" action="Press">
 +    <mousebind button="Up" action="Click">
        <action name="GoToDesktop"><to>previous</to></action>
      </mousebind>
 -    <mousebind button="Down" action="Press">
 +    <mousebind button="Down" action="Click">
        <action name="GoToDesktop"><to>next</to></action>
      </mousebind>
  
 -    <mousebind button="A-Up" action="Press">
 +    <mousebind button="A-Up" action="Click">
        <action name="GoToDesktop"><to>previous</to></action>
      </mousebind>
 -    <mousebind button="A-Down" action="Press">
 +    <mousebind button="A-Down" action="Click">
        <action name="GoToDesktop"><to>next</to></action>
      </mousebind>
 -    <mousebind button="C-A-Up" action="Press">
 +    <mousebind button="C-A-Up" action="Click">
        <action name="GoToDesktop"><to>previous</to></action>
      </mousebind>
 -    <mousebind button="C-A-Down" action="Press">
 +    <mousebind button="C-A-Down" action="Click">
        <action name="GoToDesktop"><to>next</to></action>
      </mousebind>
  
    </context>
  
    <context name="MoveResize">
 -    <mousebind button="Up" action="Press">
 +    <mousebind button="Up" action="Click">
        <action name="GoToDesktop"><to>previous</to></action>
      </mousebind>
 -    <mousebind button="Down" action="Press">
 +    <mousebind button="Down" action="Click">
        <action name="GoToDesktop"><to>next</to></action>
      </mousebind>
 -    <mousebind button="A-Up" action="Press">
 +    <mousebind button="A-Up" action="Click">
        <action name="GoToDesktop"><to>previous</to></action>
      </mousebind>
 -    <mousebind button="A-Down" action="Press">
 +    <mousebind button="A-Down" action="Click">
        <action name="GoToDesktop"><to>next</to></action>
      </mousebind>
    </context>
diff --combined openbox/actions.c
index 0db82e014b29bdf81bce9c4864d5a2c18069c465,a236b581d60359328f645f4fe1a3765be4f258a4..10bf929a43de987f002a578c10526df5856f4469
@@@ -158,21 -158,23 +158,21 @@@ ObActionsAct* actions_parse_string(cons
  
      if ((act = actions_build_act_from_string(name)))
          if (act->def->setup)
 -            act->options = act->def->setup(NULL, NULL, NULL);
 +            act->options = act->def->setup(NULL);
  
      return act;
  }
  
 -ObActionsAct* actions_parse(ObParseInst *i,
 -                            xmlDocPtr doc,
 -                            xmlNodePtr node)
 +ObActionsAct* actions_parse(xmlNodePtr node)
  {
      gchar *name;
      ObActionsAct *act = NULL;
  
 -    if (parse_attr_string("name", node, &name)) {
 +    if (obt_parse_attr_string(node, "name", &name)) {
          if ((act = actions_build_act_from_string(name)))
              /* there is more stuff to parse here */
              if (act->def->setup)
 -                act->options = act->def->setup(i, doc, node->xmlChildrenNode);
 +                act->options = act->def->setup(node->children);
  
          g_free(name);
      }
@@@ -337,9 -339,7 +337,7 @@@ void actions_client_move(ObActionsData 
      else if (config_focus_follow &&
               data->context != OB_FRAME_CONTEXT_CLIENT)
      {
-         if (!data->button && data->client && !config_focus_under_mouse)
-             event_end_ignore_all_enters(ignore_start);
-         else {
+         if (data->uact == OB_USER_ACTION_MOUSE_PRESS) {
              struct _ObClient *c;
  
              /* usually this is sorta redundant, but with a press action
                  event_enter_client(c);
              }
          }
+         else if (!data->button && !config_focus_under_mouse)
+             event_end_ignore_all_enters(ignore_start);
      }
  }
index 5a7472706bc99b2a58ee48a4430e9a85ef4e3732,a857b1b83e45e242d5c411872b289e5b0722b9ce..c534ba8b3de5b5fc629658b592a8c1aee161e7dc
@@@ -2,9 -2,12 +2,13 @@@
  #include "openbox/event.h"
  #include "openbox/startupnotify.h"
  #include "openbox/screen.h"
 +#include "obt/paths.h"
  #include "gettext.h"
  
+ #ifdef HAVE_STDLIB_H
+ #  include <stdlib.h>
+ #endif
  typedef struct {
      gchar   *cmd;
      gboolean sn;
@@@ -13,7 -16,7 +17,7 @@@
      gchar   *sn_wmclass;
  } Options;
  
 -static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
 +static gpointer setup_func(xmlNodePtr node);
  static void     free_func(gpointer options);
  static gboolean run_func(ObActionsData *data, gpointer options);
  /*
@@@ -26,34 -29,38 +30,34 @@@ static void     i_cancel_func(gpointer 
  
  void action_execute_startup(void)
  {
 -    actions_register("Execute",
 -                     setup_func,
 -                     free_func,
 -                     run_func,
 -                     NULL, NULL);
 +    actions_register("Execute", setup_func, free_func, run_func, NULL, NULL);
  }
  
 -static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
 +static gpointer setup_func(xmlNodePtr node)
  {
      xmlNodePtr n;
      Options *o;
  
      o = g_new0(Options, 1);
  
 -    if ((n = parse_find_node("command", node)) ||
 -        (n = parse_find_node("execute", node)))
 +    if ((n = obt_parse_find_node(node, "command")) ||
 +        (n = obt_parse_find_node(node, "execute")))
      {
 -        gchar *s = parse_string(doc, n);
 -        o->cmd = parse_expand_tilde(s);
 +        gchar *s = obt_parse_node_string(n);
 +        o->cmd = obt_paths_expand_tilde(s);
          g_free(s);
      }
  
 -    if ((n = parse_find_node("startupnotify", node))) {
 +    if ((n = obt_parse_find_node(node, "startupnotify"))) {
          xmlNodePtr m;
 -        if ((m = parse_find_node("enabled", n->xmlChildrenNode)))
 -            o->sn = parse_bool(doc, m);
 -        if ((m = parse_find_node("name", n->xmlChildrenNode)))
 -            o->sn_name = parse_string(doc, m);
 -        if ((m = parse_find_node("icon", n->xmlChildrenNode)))
 -            o->sn_icon = parse_string(doc, m);
 -        if ((m = parse_find_node("wmclass", n->xmlChildrenNode)))
 -            o->sn_wmclass = parse_string(doc, m);
 +        if ((m = obt_parse_find_node(n->children, "enabled")))
 +            o->sn = obt_parse_node_bool(m);
 +        if ((m = obt_parse_find_node(n->children, "name")))
 +            o->sn_name = obt_parse_node_string(m);
 +        if ((m = obt_parse_find_node(n->children, "icon")))
 +            o->sn_icon = obt_parse_node_string(m);
 +        if ((m = obt_parse_find_node(n->children, "wmclass")))
 +            o->sn_wmclass = obt_parse_node_string(m);
      }
      return o;
  }
@@@ -101,6 -108,7 +105,7 @@@ static gboolean run_func(ObActionsData 
              program = g_path_get_basename(argv[0]);
              /* sets up the environment */
              sn_setup_spawn_environment(program, o->sn_name, o->sn_icon,
+                                        o->sn_wmclass,
                                         /* launch it on the current desktop */
                                         screen_desktop);
          }
diff --combined openbox/client.c
index ffbe73b045f248a162dae0efd922cc650213bd4d,8169048fb35f691b027350bac88d44c7d1807c9f..4b0aea2f4e3d375c81333bc589956c048e7a68a4
  #include "debug.h"
  #include "startupnotify.h"
  #include "dock.h"
 -#include "xerror.h"
  #include "screen.h"
  #include "moveresize.h"
  #include "ping.h"
  #include "place.h"
 -#include "prop.h"
 -#include "extensions.h"
  #include "frame.h"
  #include "session.h"
  #include "event.h"
@@@ -39,8 -42,6 +39,8 @@@
  #include "mouse.h"
  #include "render/render.h"
  #include "gettext.h"
 +#include "obt/display.h"
 +#include "obt/prop.h"
  
  #ifdef HAVE_UNISTD_H
  #  include <unistd.h>
@@@ -165,8 -166,8 +165,8 @@@ void client_set_list(void
      } else
          windows = NULL;
  
 -    PROP_SETA32(RootWindow(ob_display, ob_screen),
 -                net_client_list, window, (gulong*)windows, size);
 +    OBT_PROP_SETA32(obt_root(ob_screen), NET_CLIENT_LIST, WINDOW,
 +                    (gulong*)windows, size);
  
      if (windows)
          g_free(windows);
@@@ -181,13 -182,13 +181,13 @@@ void client_manage_all(void
      XWMHints *wmhints;
      XWindowAttributes attrib;
  
 -    XQueryTree(ob_display, RootWindow(ob_display, ob_screen),
 +    XQueryTree(obt_display, RootWindow(obt_display, ob_screen),
                 &w, &w, &children, &nchild);
  
      /* remove all icon windows from the list */
      for (i = 0; i < nchild; i++) {
          if (children[i] == None) continue;
 -        wmhints = XGetWMHints(ob_display, children[i]);
 +        wmhints = XGetWMHints(obt_display, children[i]);
          if (wmhints) {
              if ((wmhints->flags & IconWindowHint) &&
                  (wmhints->icon_window != children[i]))
          }
      }
  
+     /* manage windows in reverse order from how they were originally mapped.
+        this is an attempt to manage children windows before their parents, so
+        that when the parent is mapped, it can find the child */
      for (i = 0; i < nchild; ++i) {
          if (children[i] == None)
              continue;
 -        if (XGetWindowAttributes(ob_display, children[i], &attrib)) {
 +        if (XGetWindowAttributes(obt_display, children[i], &attrib)) {
              if (attrib.override_redirect) continue;
  
              if (attrib.map_state != IsUnmapped)
@@@ -230,10 -234,10 +233,10 @@@ void client_manage(Window window
  
      /* check if it has already been unmapped by the time we started
         mapping. the grab does a sync so we don't have to here */
 -    if (XCheckTypedWindowEvent(ob_display, window, DestroyNotify, &e) ||
 -        XCheckTypedWindowEvent(ob_display, window, UnmapNotify, &e))
 +    if (XCheckTypedWindowEvent(obt_display, window, DestroyNotify, &e) ||
 +        XCheckTypedWindowEvent(obt_display, window, UnmapNotify, &e))
      {
 -        XPutBackEvent(ob_display, &e);
 +        XPutBackEvent(obt_display, &e);
  
          ob_debug("Trying to manage unmapped window. Aborting that.\n");
          grab_server(FALSE);
      }
  
      /* make sure it isn't an override-redirect window */
 -    if (!XGetWindowAttributes(ob_display, window, &attrib) ||
 +    if (!XGetWindowAttributes(obt_display, window, &attrib) ||
          attrib.override_redirect)
      {
          grab_server(FALSE);
      }
  
      /* is the window a docking app */
 -    if ((wmhint = XGetWMHints(ob_display, window))) {
 +    if ((wmhint = XGetWMHints(obt_display, window))) {
          if ((wmhint->flags & StateHint) &&
              wmhint->initial_state == WithdrawnState)
          {
      /* choose the events we want to receive on the CLIENT window */
      attrib_set.event_mask = CLIENT_EVENTMASK;
      attrib_set.do_not_propagate_mask = CLIENT_NOPROPAGATEMASK;
 -    XChangeWindowAttributes(ob_display, window,
 +    XChangeWindowAttributes(obt_display, window,
                              CWEventMask|CWDontPropagate, &attrib_set);
  
      /* create the ObClient struct, and populate it from the hints on the
         window */
      self = g_new0(ObClient, 1);
 -    self->obwin.type = Window_Client;
 +    self->obwin.type = OB_WINDOW_CLASS_CLIENT;
      self->window = window;
  
      /* non-zero defaults */
      ob_debug("Window type: %d\n", self->type);
      ob_debug("Window group: 0x%x\n", self->group?self->group->leader:0);
  
+     /* 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
+        mapping and doesn't go applying things right away */
+     client_setup_decor_and_functions(self, FALSE);
      /* specify that if we exit, the window should not be destroyed and
         should be reparented back to root automatically */
 -    XChangeSaveSet(ob_display, window, SetModeInsert);
 +    XChangeSaveSet(obt_display, window, SetModeInsert);
  
      /* create the decoration frame for the client window */
      self->frame = frame_new(self);
      /* the session should get the last say though */
      client_restore_session_state(self);
  
-     /* now we have all of the window's information so we can set this up */
-     client_setup_decor_and_functions(self, FALSE);
      /* tell startup notification that this app started */
-     launch_time = sn_app_started(self->startup_id, self->class);
+     launch_time = sn_app_started(self->startup_id, self->class, self->name);
  
      /* do this after we have a frame.. it uses the frame to help determine the
         WM_STATE to apply. */
      }
  
      /* remove the client's border */
 -    XSetWindowBorderWidth(ob_display, self->window, 0);
 +    XSetWindowBorderWidth(obt_display, self->window, 0);
  
      /* adjust the frame to the client's size before showing or placing
         the window */
  
      /* add to client list/map */
      client_list = g_list_append(client_list, self);
 -    g_hash_table_insert(window_map, &self->window, self);
 +    window_add(&self->window, CLIENT_AS_WINDOW(self));
  
      /* this has to happen after we're in the client_list */
      if (STRUT_EXISTS(self->strut))
@@@ -678,7 -684,7 +683,7 @@@ void client_unmanage(ObClient *self
  
      /* we dont want events no more. do this before hiding the frame so we
         don't generate more events */
 -    XSelectInput(ob_display, self->window, NoEventMask);
 +    XSelectInput(obt_display, self->window, NoEventMask);
  
      /* ignore enter events from the unmap so it doesnt mess with the focus */
      if (!config_focus_under_mouse)
  
      frame_hide(self->frame);
      /* flush to send the hide to the server quickly */
 -    XFlush(ob_display);
 +    XFlush(obt_display);
  
      if (!config_focus_under_mouse)
          event_end_ignore_all_enters(ignore_start);
      mouse_grab_for_client(self, FALSE);
  
      /* remove the window from our save set */
 -    XChangeSaveSet(ob_display, self->window, SetModeDelete);
 +    XChangeSaveSet(obt_display, self->window, SetModeDelete);
  
      /* update the focus lists */
      focus_order_remove(self);
  
      client_list = g_list_remove(client_list, self);
      stacking_remove(self);
 -    g_hash_table_remove(window_map, &self->window);
 +    window_remove(self->window);
  
      /* once the client is out of the list, update the struts to remove its
         influence */
          self->decorations = 0; /* unmanaged windows have no decor */
  
          /* give the client its border back */
 -        XSetWindowBorderWidth(ob_display, self->window, self->border_width);
 +        XSetWindowBorderWidth(obt_display, self->window, self->border_width);
  
          client_move_resize(self, a.x, a.y, a.width, a.height);
      }
      if (ob_state() != OB_STATE_EXITING) {
          /* these values should not be persisted across a window
             unmapping/mapping */
 -        PROP_ERASE(self->window, net_wm_desktop);
 -        PROP_ERASE(self->window, net_wm_state);
 -        PROP_ERASE(self->window, wm_state);
 +        OBT_PROP_ERASE(self->window, NET_WM_DESKTOP);
 +        OBT_PROP_ERASE(self->window, NET_WM_STATE);
 +        OBT_PROP_ERASE(self->window, WM_STATE);
      } else {
          /* if we're left in an unmapped state, the client wont be mapped.
             this is bad, since we will no longer be managing the window on
             restart */
 -        XMapWindow(ob_display, self->window);
 +        XMapWindow(obt_display, self->window);
      }
  
      /* these should not be left on the window ever.  other window managers
         don't necessarily use them and it will mess them up (like compiz) */
 -    PROP_ERASE(self->window, net_wm_visible_name);
 -    PROP_ERASE(self->window, net_wm_visible_icon_name);
 +    OBT_PROP_ERASE(self->window, NET_WM_VISIBLE_NAME);
 +    OBT_PROP_ERASE(self->window, NET_WM_VISIBLE_ICON_NAME);
  
      /* update the list hints */
      client_set_list();
          g_free(self->icons[j].data);
      if (self->nicons > 0)
          g_free(self->icons);
+     g_free(self->startup_id);
      g_free(self->wm_command);
      g_free(self->title);
      g_free(self->icon_title);
@@@ -921,13 -928,13 +927,13 @@@ static void client_restore_session_stat
          self->area.width = self->session->w;
      if (self->session->h > 0)
          self->area.height = self->session->h;
 -    XResizeWindow(ob_display, self->window,
 +    XResizeWindow(obt_display, self->window,
                    self->area.width, self->area.height);
  
      self->desktop = (self->session->desktop == DESKTOP_ALL ?
                       self->session->desktop :
                       MIN(screen_num_desktops - 1, self->session->desktop));
 -    PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop);
 +    OBT_PROP_SET32(self->window, NET_WM_DESKTOP, CARDINAL, self->desktop);
  
      self->shaded = self->session->shaded;
      self->iconic = self->session->iconic;
@@@ -1145,11 -1152,10 +1151,11 @@@ static void client_get_all(ObClient *se
  
  static void client_get_startup_id(ObClient *self)
  {
 -    if (!(PROP_GETS(self->window, net_startup_id, utf8, &self->startup_id)))
 +    if (!(OBT_PROP_GETS(self->window, NET_STARTUP_ID, utf8,
 +                        &self->startup_id)))
          if (self->group)
 -            PROP_GETS(self->group->leader,
 -                      net_startup_id, utf8, &self->startup_id);
 +            OBT_PROP_GETS(self->group->leader,
 +                          NET_STARTUP_ID, utf8, &self->startup_id);
  }
  
  static void client_get_area(ObClient *self)
      XWindowAttributes wattrib;
      Status ret;
  
 -    ret = XGetWindowAttributes(ob_display, self->window, &wattrib);
 +    ret = XGetWindowAttributes(obt_display, self->window, &wattrib);
      g_assert(ret != BadWindow);
  
      RECT_SET(self->area, wattrib.x, wattrib.y, wattrib.width, wattrib.height);
@@@ -1172,7 -1178,7 +1178,7 @@@ static void client_get_desktop(ObClien
  {
      guint32 d = screen_num_desktops; /* an always-invalid value */
  
 -    if (PROP_GET32(self->window, net_wm_desktop, cardinal, &d)) {
 +    if (OBT_PROP_GET32(self->window, NET_WM_DESKTOP, CARDINAL, &d)) {
          if (d >= screen_num_desktops && d != DESKTOP_ALL)
              self->desktop = screen_num_desktops - 1;
          else
@@@ -1225,32 -1231,32 +1231,32 @@@ static void client_get_state(ObClient *
      guint32 *state;
      guint num;
  
 -    if (PROP_GETA32(self->window, net_wm_state, atom, &state, &num)) {
 +    if (OBT_PROP_GETA32(self->window, NET_WM_STATE, ATOM, &state, &num)) {
          gulong i;
          for (i = 0; i < num; ++i) {
 -            if (state[i] == prop_atoms.net_wm_state_modal)
 +            if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_MODAL))
                  self->modal = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_shaded)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_SHADED))
                  self->shaded = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_hidden)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_HIDDEN))
                  self->iconic = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_skip_taskbar)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_SKIP_TASKBAR))
                  self->skip_taskbar = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_skip_pager)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_SKIP_PAGER))
                  self->skip_pager = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_fullscreen)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_FULLSCREEN))
                  self->fullscreen = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_maximized_vert)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_VERT))
                  self->max_vert = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_maximized_horz)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_HORZ))
                  self->max_horz = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_above)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_ABOVE))
                  self->above = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_below)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_BELOW))
                  self->below = TRUE;
 -            else if (state[i] == prop_atoms.net_wm_state_demands_attention)
 +            else if (state[i] == OBT_PROP_ATOM(NET_WM_STATE_DEMANDS_ATTENTION))
                  self->demands_attention = TRUE;
 -            else if (state[i] == prop_atoms.ob_wm_state_undecorated)
 +            else if (state[i] == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED))
                  self->undecorated = TRUE;
          }
  
@@@ -1262,14 -1268,14 +1268,14 @@@ static void client_get_shaped(ObClient 
  {
      self->shaped = FALSE;
  #ifdef   SHAPE
 -    if (extensions_shape) {
 +    if (obt_display_extension_shape) {
          gint foo;
          guint ufoo;
          gint s;
  
 -        XShapeSelectInput(ob_display, self->window, ShapeNotifyMask);
 +        XShapeSelectInput(obt_display, self->window, ShapeNotifyMask);
  
 -        XShapeQueryExtents(ob_display, self->window, &s, &foo,
 +        XShapeQueryExtents(obt_display, self->window, &s, &foo,
                             &foo, &ufoo, &ufoo, &foo, &foo, &foo, &ufoo,
                             &ufoo);
          self->shaped = (s != 0);
@@@ -1283,22 -1289,22 +1289,22 @@@ void client_update_transient_for(ObClie
      ObClient *target = NULL;
      gboolean trangroup = FALSE;
  
 -    if (XGetTransientForHint(ob_display, self->window, &t)) {
 +    if (XGetTransientForHint(obt_display, self->window, &t)) {
          if (t != self->window) { /* cant be transient to itself! */
 -            target = g_hash_table_lookup(window_map, &t);
 +            ObWindow *tw = window_find(t);
              /* if this happens then we need to check for it*/
 -            g_assert(target != self);
 -            if (target && !WINDOW_IS_CLIENT(target)) {
 -                /* this can happen when a dialog is a child of
 -                   a dockapp, for example */
 -                target = NULL;
 +            g_assert(tw != CLIENT_AS_WINDOW(self));
 +            if (tw && WINDOW_IS_CLIENT(tw)) {
 +                /* watch out for windows with a parent that is something
 +                   different, like a dockapp for example */
 +                target = WINDOW_AS_CLIENT(tw);
              }
          }
  
          /* Setting the transient_for to Root is actually illegal, however
             applications from time have done this to specify transient for
             their group */
 -        if (!target && self->group && t == RootWindow(ob_display, ob_screen))
 +        if (!target && self->group && t == obt_root(ob_screen))
              trangroup = TRUE;
      } else if (self->group && self->transient)
          trangroup = TRUE;
@@@ -1434,8 -1440,8 +1440,8 @@@ static void client_get_mwm_hints(ObClie
  
      self->mwmhints.flags = 0; /* default to none */
  
 -    if (PROP_GETA32(self->window, motif_wm_hints, motif_wm_hints,
 -                    &hints, &num)) {
 +    if (OBT_PROP_GETA32(self->window, MOTIF_WM_HINTS, MOTIF_WM_HINTS,
 +                        &hints, &num)) {
          if (num >= OB_MWM_ELEMENTS) {
              self->mwmhints.flags = hints[0];
              self->mwmhints.functions = hints[1];
@@@ -1454,27 -1460,26 +1460,27 @@@ void client_get_type_and_transientness(
      self->type = -1;
      self->transient = FALSE;
  
 -    if (PROP_GETA32(self->window, net_wm_window_type, atom, &val, &num)) {
 +    if (OBT_PROP_GETA32(self->window, NET_WM_WINDOW_TYPE, ATOM, &val, &num)) {
          /* use the first value that we know about in the array */
          for (i = 0; i < num; ++i) {
 -            if (val[i] == prop_atoms.net_wm_window_type_desktop)
 +            if (val[i] == OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DESKTOP))
                  self->type = OB_CLIENT_TYPE_DESKTOP;
 -            else if (val[i] == prop_atoms.net_wm_window_type_dock)
 +            else if (val[i] == OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DOCK))
                  self->type = OB_CLIENT_TYPE_DOCK;
 -            else if (val[i] == prop_atoms.net_wm_window_type_toolbar)
 +            else if (val[i] == OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_TOOLBAR))
                  self->type = OB_CLIENT_TYPE_TOOLBAR;
 -            else if (val[i] == prop_atoms.net_wm_window_type_menu)
 +            else if (val[i] == OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_MENU))
                  self->type = OB_CLIENT_TYPE_MENU;
 -            else if (val[i] == prop_atoms.net_wm_window_type_utility)
 +            else if (val[i] == OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_UTILITY))
                  self->type = OB_CLIENT_TYPE_UTILITY;
 -            else if (val[i] == prop_atoms.net_wm_window_type_splash)
 +            else if (val[i] == OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_SPLASH))
                  self->type = OB_CLIENT_TYPE_SPLASH;
 -            else if (val[i] == prop_atoms.net_wm_window_type_dialog)
 +            else if (val[i] == OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DIALOG))
                  self->type = OB_CLIENT_TYPE_DIALOG;
 -            else if (val[i] == prop_atoms.net_wm_window_type_normal)
 +            else if (val[i] == OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_NORMAL))
                  self->type = OB_CLIENT_TYPE_NORMAL;
 -            else if (val[i] == prop_atoms.kde_net_wm_window_type_override) {
 +            else if (val[i] == OBT_PROP_ATOM(KDE_NET_WM_WINDOW_TYPE_OVERRIDE))
 +            {
                  /* prevent this window from getting any decor or
                     functionality */
                  self->mwmhints.flags &= (OB_MWM_FLAG_FUNCTIONS |
          g_free(val);
      }
  
 -    if (XGetTransientForHint(ob_display, self->window, &t))
 +    if (XGetTransientForHint(obt_display, self->window, &t))
          self->transient = TRUE;
  
      if (self->type == (ObClientType) -1) {
  void client_update_protocols(ObClient *self)
  {
      guint32 *proto;
 -    guint num_return, i;
 +    guint num_ret, i;
  
      self->focus_notify = FALSE;
      self->delete_window = FALSE;
  
 -    if (PROP_GETA32(self->window, wm_protocols, atom, &proto, &num_return)) {
 -        for (i = 0; i < num_return; ++i) {
 -            if (proto[i] == prop_atoms.wm_delete_window)
 +    if (OBT_PROP_GETA32(self->window, WM_PROTOCOLS, ATOM, &proto, &num_ret)) {
 +        for (i = 0; i < num_ret; ++i) {
 +            if (proto[i] == OBT_PROP_ATOM(WM_DELETE_WINDOW))
                  /* this means we can request the window to close */
                  self->delete_window = TRUE;
 -            else if (proto[i] == prop_atoms.wm_take_focus)
 +            else if (proto[i] == OBT_PROP_ATOM(WM_TAKE_FOCUS))
                  /* if this protocol is requested, then the window will be
                     notified whenever we want it to receive focus */
                  self->focus_notify = TRUE;
 -            else if (proto[i] == prop_atoms.net_wm_ping)
 +            else if (proto[i] == OBT_PROP_ATOM(NET_WM_PING))
                  /* if this protocol is requested, then the window will allow
                     pings to determine if it is still alive */
                  self->ping = TRUE;
  #ifdef SYNC
 -            else if (proto[i] == prop_atoms.net_wm_sync_request)
 +            else if (proto[i] == OBT_PROP_ATOM(NET_WM_SYNC_REQUEST))
                  /* if this protocol is requested, then resizing the
                     window will be synchronized between the frame and the
                     client */
@@@ -1549,8 -1554,7 +1555,8 @@@ void client_update_sync_request_counter
  {
      guint32 i;
  
 -    if (PROP_GET32(self->window, net_wm_sync_request_counter, cardinal, &i)) {
 +    if (OBT_PROP_GET32(self->window, NET_WM_SYNC_REQUEST_COUNTER, CARDINAL,&i))
 +    {
          self->sync_counter = i;
      } else
          self->sync_counter = None;
@@@ -1561,7 -1565,7 +1567,7 @@@ static void client_get_colormap(ObClien
  {
      XWindowAttributes wa;
  
 -    if (XGetWindowAttributes(ob_display, self->window, &wa))
 +    if (XGetWindowAttributes(obt_display, self->window, &wa))
          client_update_colormap(self, wa.colormap);
  }
  
@@@ -1593,7 -1597,7 +1599,7 @@@ void client_update_normal_hints(ObClien
      SIZE_SET(self->max_size, G_MAXINT, G_MAXINT);
  
      /* get the hints from the window */
 -    if (XGetWMNormalHints(ob_display, self->window, &size, &ret)) {
 +    if (XGetWMNormalHints(obt_display, self->window, &size, &ret)) {
          /* normal windows can't request placement! har har
          if (!client_normal(self))
          */
@@@ -1805,38 -1809,38 +1811,38 @@@ static void client_change_allowed_actio
  
      /* desktop windows are kept on all desktops */
      if (self->type != OB_CLIENT_TYPE_DESKTOP)
 -        actions[num++] = prop_atoms.net_wm_action_change_desktop;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_CHANGE_DESKTOP);
  
      if (self->functions & OB_CLIENT_FUNC_SHADE)
 -        actions[num++] = prop_atoms.net_wm_action_shade;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_SHADE);
      if (self->functions & OB_CLIENT_FUNC_CLOSE)
 -        actions[num++] = prop_atoms.net_wm_action_close;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_CLOSE);
      if (self->functions & OB_CLIENT_FUNC_MOVE)
 -        actions[num++] = prop_atoms.net_wm_action_move;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_MOVE);
      if (self->functions & OB_CLIENT_FUNC_ICONIFY)
 -        actions[num++] = prop_atoms.net_wm_action_minimize;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_MINIMIZE);
      if (self->functions & OB_CLIENT_FUNC_RESIZE)
 -        actions[num++] = prop_atoms.net_wm_action_resize;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_RESIZE);
      if (self->functions & OB_CLIENT_FUNC_FULLSCREEN)
 -        actions[num++] = prop_atoms.net_wm_action_fullscreen;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_FULLSCREEN);
      if (self->functions & OB_CLIENT_FUNC_MAXIMIZE) {
 -        actions[num++] = prop_atoms.net_wm_action_maximize_horz;
 -        actions[num++] = prop_atoms.net_wm_action_maximize_vert;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_MAXIMIZE_HORZ);
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_MAXIMIZE_VERT);
      }
      if (self->functions & OB_CLIENT_FUNC_ABOVE)
 -        actions[num++] = prop_atoms.net_wm_action_above;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_ABOVE);
      if (self->functions & OB_CLIENT_FUNC_BELOW)
 -        actions[num++] = prop_atoms.net_wm_action_below;
 +        actions[num++] = OBT_PROP_ATOM(NET_WM_ACTION_BELOW);
      if (self->functions & OB_CLIENT_FUNC_UNDECORATE)
 -        actions[num++] = prop_atoms.ob_wm_action_undecorate;
 +        actions[num++] = OBT_PROP_ATOM(OB_WM_ACTION_UNDECORATE);
  
 -    PROP_SETA32(self->window, net_wm_allowed_actions, atom, actions, num);
 +    OBT_PROP_SETA32(self->window, NET_WM_ALLOWED_ACTIONS, ATOM, actions, num);
  
--   /* make sure the window isn't breaking any rules now
++    /* make sure the window isn't breaking any rules now
  
--   don't check ICONIFY here.  just cuz a window can't iconify doesnt mean
--   it can't be iconified with its parent
--   */
++       don't check ICONIFY here.  just cuz a window can't iconify doesnt mean
++       it can't be iconified with its parent
++    */
  
      if (!(self->functions & OB_CLIENT_FUNC_SHADE) && self->shaded) {
          if (self->frame) client_shade(self, FALSE);
@@@ -1860,7 -1864,7 +1866,7 @@@ void client_update_wmhints(ObClient *se
      /* assume a window takes input if it doesnt specify */
      self->can_focus = TRUE;
  
 -    if ((hints = XGetWMHints(ob_display, self->window)) != NULL) {
 +    if ((hints = XGetWMHints(obt_display, self->window)) != NULL) {
          gboolean ur;
  
          if (hints->flags & InputHint)
@@@ -1948,10 -1952,10 +1954,10 @@@ void client_update_title(ObClient *self
      g_free(self->title);
  
      /* try netwm */
 -    if (!PROP_GETS(self->window, net_wm_name, utf8, &data)) {
 +    if (!OBT_PROP_GETS(self->window, NET_WM_NAME, utf8, &data)) {
          /* try old x stuff */
 -        if (!(PROP_GETS(self->window, wm_name, locale, &data)
 -              || PROP_GETS(self->window, wm_name, utf8, &data))) {
 +        if (!(OBT_PROP_GETS(self->window, WM_NAME, locale, &data)
 +              || OBT_PROP_GETS(self->window, WM_NAME, utf8, &data))) {
              if (self->transient) {
      /*
      GNOME alert windows are not given titles:
          g_free(data);
      }
  
 -    PROP_SETS(self->window, net_wm_visible_name, visible);
 +    OBT_PROP_SETS(self->window, NET_WM_VISIBLE_NAME, utf8, visible);
      self->title = visible;
  
      if (self->frame)
      g_free(self->icon_title);
  
      /* try netwm */
 -    if (!PROP_GETS(self->window, net_wm_icon_name, utf8, &data))
 +    if (!OBT_PROP_GETS(self->window, NET_WM_ICON_NAME, utf8, &data))
          /* try old x stuff */
 -        if (!(PROP_GETS(self->window, wm_icon_name, locale, &data) ||
 -              PROP_GETS(self->window, wm_icon_name, utf8, &data)))
 +        if (!(OBT_PROP_GETS(self->window, WM_ICON_NAME, locale, &data) ||
 +              OBT_PROP_GETS(self->window, WM_ICON_NAME, utf8, &data)))
              data = g_strdup(self->title);
  
      if (self->client_machine) {
          g_free(data);
      }
  
 -    PROP_SETS(self->window, net_wm_visible_icon_name, visible);
 +    OBT_PROP_SETS(self->window, NET_WM_VISIBLE_ICON_NAME, utf8, visible);
      self->icon_title = visible;
  }
  
@@@ -2021,9 -2025,8 +2027,9 @@@ void client_update_strut(ObClient *self
      gboolean got = FALSE;
      StrutPartial strut;
  
 -    if (PROP_GETA32(self->window, net_wm_strut_partial, cardinal,
 -                    &data, &num)) {
 +    if (OBT_PROP_GETA32(self->window, NET_WM_STRUT_PARTIAL, CARDINAL,
 +                        &data, &num))
 +    {
          if (num == 12) {
              got = TRUE;
              STRUT_PARTIAL_SET(strut,
      }
  
      if (!got &&
 -        PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) {
 +        OBT_PROP_GETA32(self->window, NET_WM_STRUT, CARDINAL, &data, &num)) {
          if (num == 4) {
              Rect *a;
  
      }
  }
  
+ /* Avoid storing icons above this size if possible */
+ #define AVOID_ABOVE 64
  void client_update_icons(ObClient *self)
  {
      guint num;
      guint32 *data;
      guint w, h, i, j;
+     guint num_seen;  /* number of icons present */
+     guint num_small_seen;  /* number of icons small enough present */
+     guint smallest, smallest_area;
  
      for (i = 0; i < self->nicons; ++i)
          g_free(self->icons[i].data);
          g_free(self->icons);
      self->nicons = 0;
  
 -    if (PROP_GETA32(self->window, net_wm_icon, cardinal, &data, &num)) {
 +    if (OBT_PROP_GETA32(self->window, NET_WM_ICON, CARDINAL, &data, &num)) {
          /* figure out how many valid icons are in here */
          i = 0;
-         while (num - i > 2) {
-             w = data[i++];
-             h = data[i++];
-             i += w * h;
-             if (i > num || w*h == 0) break;
-             ++self->nicons;
-         }
+         num_seen = num_small_seen = 0;
+         smallest = smallest_area = 0;
+         if (num > 2)
+             while (i < num) {
+                 w = data[i++];
+                 h = data[i++];
+                 i += w * h;
+                 /* watch for it being too small for the specified size, or for
+                    zero sized icons. */
+                 if (i > num || w == 0 || h == 0) break;
+                 if (!smallest_area || w*h < smallest_area) {
+                     smallest = num_seen;
+                     smallest_area = w*h;
+                 }
+                 ++num_seen;
+                 if (w <= AVOID_ABOVE && h <= AVOID_ABOVE)
+                     ++num_small_seen;
+             }
+         if (num_small_seen > 0)
+             self->nicons = num_small_seen;
+         else if (num_seen)
+             self->nicons = 1;
  
          self->icons = g_new(ObClientIcon, self->nicons);
  
          /* store the icons */
          i = 0;
-         for (j = 0; j < self->nicons; ++j) {
+         for (j = 0; j < self->nicons;) {
              guint x, y, t;
  
              w = self->icons[j].width = data[i++];
              h = self->icons[j].height = data[i++];
  
-             if (w*h == 0) continue;
+             /* if there are some icons smaller than the threshold, we're
+                skipping all the ones above */
+             if (num_small_seen > 0) {
+                 if (w > AVOID_ABOVE || h > AVOID_ABOVE) {
+                     i += w*h;
+                     continue;
+                 }
+             }
+             /* if there were no icons smaller than the threshold, then we are
+                only taking the smallest available one we saw */
+             else if (j != smallest) {
+                 i += w*h;
+                 continue;
+             }
  
              self->icons[j].data = g_new(RrPixel32, w * h);
              for (x = 0, y = 0, t = 0; t < w * h; ++t, ++x, ++i) {
                      (((data[i] >> 0) & 0xff) << RrDefaultBlueOffset);
              }
              g_assert(i <= num);
+             ++j;
          }
  
          g_free(data);
      } else {
          XWMHints *hints;
  
 -        if ((hints = XGetWMHints(ob_display, self->window))) {
 +        if ((hints = XGetWMHints(obt_display, self->window))) {
              if (hints->flags & IconPixmapHint) {
                  self->nicons = 1;
                  self->icons = g_new(ObClientIcon, self->nicons);
 -                xerror_set_ignore(TRUE);
 +                obt_display_ignore_errors(TRUE);
                  if (!RrPixmapToRGBA(ob_rr_inst,
                                      hints->icon_pixmap,
                                      (hints->flags & IconMaskHint ?
                      g_free(self->icons);
                      self->nicons = 0;
                  }
 -                xerror_set_ignore(FALSE);
 +                obt_display_ignore_errors(FALSE);
              }
              XFree(hints);
          }
                  (((icon[i] >> RrDefaultRedOffset) & 0xff) << 16) +
                  (((icon[i] >> RrDefaultGreenOffset) & 0xff) << 8) +
                  (((icon[i] >> RrDefaultBlueOffset) & 0xff) << 0);
 -        PROP_SETA32(self->window, net_wm_icon, cardinal, data, 48*48+2);
 +        OBT_PROP_SETA32(self->window, NET_WM_ICON, CARDINAL, data, 48*48+2);
          g_free(data);
      } else if (self->frame)
          /* don't draw the icon empty if we're just setting one now anyways,
@@@ -2178,12 -2218,13 +2221,14 @@@ void client_update_icon_geometry(ObClie
  
      RECT_SET(self->icon_geometry, 0, 0, 0, 0);
  
 -    if (PROP_GETA32(self->window, net_wm_icon_geometry, cardinal, &data, &num))
 +    if (OBT_PROP_GETA32(self->window, NET_WM_ICON_GEOMETRY, CARDINAL,
-                         &data, &num) && num == 4)
++                        &data, &num))
      {
-         /* don't let them set it with an area < 0 */
-         RECT_SET(self->icon_geometry, data[0], data[1],
-                  MAX(data[2],0), MAX(data[3],0));
+         if (num == 4)
+             /* don't let them set it with an area < 0 */
+             RECT_SET(self->icon_geometry, data[0], data[1],
+                      MAX(data[2],0), MAX(data[3],0));
+         g_free(data);
      }
  }
  
@@@ -2194,23 -2235,23 +2239,23 @@@ static void client_get_session_ids(ObCl
      gchar *s;
      gchar **ss;
  
 -    if (!PROP_GET32(self->window, wm_client_leader, window, &leader))
 +    if (!OBT_PROP_GET32(self->window, WM_CLIENT_LEADER, WINDOW, &leader))
          leader = None;
  
      /* get the SM_CLIENT_ID */
      got = FALSE;
      if (leader)
 -        got = PROP_GETS(leader, sm_client_id, locale, &self->sm_client_id);
 +        got = OBT_PROP_GETS(leader, SM_CLIENT_ID, locale, &self->sm_client_id);
      if (!got)
 -        PROP_GETS(self->window, sm_client_id, locale, &self->sm_client_id);
 +        OBT_PROP_GETS(self->window, SM_CLIENT_ID, locale, &self->sm_client_id);
  
      /* get the WM_CLASS (name and class). make them "" if they are not
         provided */
      got = FALSE;
      if (leader)
 -        got = PROP_GETSS(leader, wm_class, locale, &ss);
 +        got = OBT_PROP_GETSS(leader, WM_CLASS, locale, &ss);
      if (!got)
 -        got = PROP_GETSS(self->window, wm_class, locale, &ss);
 +        got = OBT_PROP_GETSS(self->window, WM_CLASS, locale, &ss);
  
      if (got) {
          if (ss[0]) {
      /* get the WM_WINDOW_ROLE. make it "" if it is not provided */
      got = FALSE;
      if (leader)
 -        got = PROP_GETS(leader, wm_window_role, locale, &s);
 +        got = OBT_PROP_GETS(leader, WM_WINDOW_ROLE, locale, &s);
      if (!got)
 -        got = PROP_GETS(self->window, wm_window_role, locale, &s);
 +        got = OBT_PROP_GETS(self->window, WM_WINDOW_ROLE, locale, &s);
  
      if (got)
          self->role = s;
      got = FALSE;
  
      if (leader)
 -        got = PROP_GETSS(leader, wm_command, locale, &ss);
 +        got = OBT_PROP_GETSS(leader, WM_COMMAND, locale, &ss);
      if (!got)
 -        got = PROP_GETSS(self->window, wm_command, locale, &ss);
 +        got = OBT_PROP_GETSS(self->window, WM_COMMAND, locale, &ss);
  
      if (got) {
          /* merge/mash them all together */
      /* get the WM_CLIENT_MACHINE */
      got = FALSE;
      if (leader)
 -        got = PROP_GETS(leader, wm_client_machine, locale, &s);
 +        got = OBT_PROP_GETS(leader, WM_CLIENT_MACHINE, locale, &s);
      if (!got)
 -        got = PROP_GETS(self->window, wm_client_machine, locale, &s);
 +        got = OBT_PROP_GETS(self->window, WM_CLIENT_MACHINE, locale, &s);
  
      if (got) {
          gchar localhost[128];
  
          /* see if it has the PID set too (the PID requires that the
             WM_CLIENT_MACHINE be set) */
 -        if (PROP_GET32(self->window, net_wm_pid, cardinal, &pid))
 +        if (OBT_PROP_GET32(self->window, NET_WM_PID, CARDINAL, &pid))
              self->pid = pid;
      }
  }
@@@ -2302,12 -2343,12 +2347,12 @@@ static void client_change_wm_state(ObCl
          self->wmstate = NormalState;
  
      if (old != self->wmstate) {
 -        PROP_MSG(self->window, kde_wm_change_state,
 -                 self->wmstate, 1, 0, 0);
 +        OBT_PROP_MSG(ob_screen, self->window, KDE_WM_CHANGE_STATE,
 +                     self->wmstate, 1, 0, 0, 0);
  
          state[0] = self->wmstate;
          state[1] = None;
 -        PROP_SETA32(self->window, wm_state, wm_state, state, 2);
 +        OBT_PROP_SETA32(self->window, WM_STATE, WM_STATE, state, 2);
      }
  }
  
@@@ -2318,30 -2359,30 +2363,30 @@@ static void client_change_state(ObClien
  
      num = 0;
      if (self->modal)
 -        netstate[num++] = prop_atoms.net_wm_state_modal;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_MODAL);
      if (self->shaded)
 -        netstate[num++] = prop_atoms.net_wm_state_shaded;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_SHADED);
      if (self->iconic)
 -        netstate[num++] = prop_atoms.net_wm_state_hidden;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_HIDDEN);
      if (self->skip_taskbar)
 -        netstate[num++] = prop_atoms.net_wm_state_skip_taskbar;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_SKIP_TASKBAR);
      if (self->skip_pager)
 -        netstate[num++] = prop_atoms.net_wm_state_skip_pager;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_SKIP_PAGER);
      if (self->fullscreen)
 -        netstate[num++] = prop_atoms.net_wm_state_fullscreen;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_FULLSCREEN);
      if (self->max_vert)
 -        netstate[num++] = prop_atoms.net_wm_state_maximized_vert;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_VERT);
      if (self->max_horz)
 -        netstate[num++] = prop_atoms.net_wm_state_maximized_horz;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_HORZ);
      if (self->above)
 -        netstate[num++] = prop_atoms.net_wm_state_above;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_ABOVE);
      if (self->below)
 -        netstate[num++] = prop_atoms.net_wm_state_below;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_BELOW);
      if (self->demands_attention)
 -        netstate[num++] = prop_atoms.net_wm_state_demands_attention;
 +        netstate[num++] = OBT_PROP_ATOM(NET_WM_STATE_DEMANDS_ATTENTION);
      if (self->undecorated)
 -        netstate[num++] = prop_atoms.ob_wm_state_undecorated;
 -    PROP_SETA32(self->window, net_wm_state, atom, netstate, num);
 +        netstate[num++] = OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED);
 +    OBT_PROP_SETA32(self->window, NET_WM_STATE, ATOM, netstate, num);
  
      if (self->frame)
          frame_adjust_state(self->frame);
@@@ -2640,7 -2681,7 +2685,7 @@@ static void client_apply_startup_state(
      client_configure(self, x, y, w, h, FALSE, TRUE, FALSE);
  
      /* set the desktop hint, to make sure that it always exists */
 -    PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop);
 +    OBT_PROP_SET32(self->window, NET_WM_DESKTOP, CARDINAL, self->desktop);
  
      /* nothing to do for the other states:
         skip_taskbar
@@@ -2914,7 -2955,7 +2959,7 @@@ void client_configure(ObClient *self, g
  
      /* if the client is enlarging, then resize the client before the frame */
      if (send_resize_client && (w > oldw || h > oldh)) {
 -        XMoveResizeWindow(ob_display, self->window,
 +        XMoveResizeWindow(obt_display, self->window,
                            self->frame->size.left, self->frame->size.top,
                            MAX(w, oldw), MAX(h, oldh));
          frame_adjust_client_area(self->frame);
          XEvent event;
  
          event.type = ConfigureNotify;
 -        event.xconfigure.display = ob_display;
 +        event.xconfigure.display = obt_display;
          event.xconfigure.event = self->window;
          event.xconfigure.window = self->window;
  
       */
      if (send_resize_client && (w <= oldw || h <= oldh)) {
          frame_adjust_client_area(self->frame);
 -        XMoveResizeWindow(ob_display, self->window,
 +        XMoveResizeWindow(obt_display, self->window,
                            self->frame->size.left, self->frame->size.top, w, h);
      }
  
 -    XFlush(ob_display);
 +    XFlush(obt_display);
  }
  
  void client_fullscreen(ObClient *self, gboolean fs)
@@@ -3234,14 -3275,14 +3279,14 @@@ void client_close(ObClient *self
      if (!self->delete_window)
          /* don't use client_kill(), we should only kill based on PID in
             response to a lack of PING replies */
 -        XKillClient(ob_display, self->window);
 +        XKillClient(obt_display, self->window);
      else if (self->not_responding)
          client_kill(self);
      else
          /* request the client to close with WM_DELETE_WINDOW */
 -        PROP_MSG_TO(self->window, self->window, wm_protocols,
 -                    prop_atoms.wm_delete_window, event_curtime, 0, 0, 0,
 -                    NoEventMask);
 +        OBT_PROP_MSG_TO(self->window, self->window, WM_PROTOCOLS,
 +                        OBT_PROP_ATOM(WM_DELETE_WINDOW), event_curtime,
 +                        0, 0, 0, NoEventMask);
  }
  
  void client_kill(ObClient *self)
          }
      }
      else
 -        XKillClient(ob_display, self->window);
 +        XKillClient(obt_display, self->window);
  }
  
  void client_hilite(ObClient *self, gboolean hilite)
@@@ -3299,7 -3340,7 +3344,7 @@@ static void client_set_desktop_recursiv
  
          old = self->desktop;
          self->desktop = target;
 -        PROP_SET32(self->window, net_wm_desktop, cardinal, target);
 +        OBT_PROP_SET32(self->window, NET_WM_DESKTOP, CARDINAL, target);
          /* the frame can display the current desktop state */
          frame_adjust_state(self->frame);
          /* 'move' the window to the new desktop */
@@@ -3355,12 -3396,11 +3400,12 @@@ gboolean client_validate(ObClient *self
  {
      XEvent e;
  
 -    XSync(ob_display, FALSE); /* get all events on the server */
 +    XSync(obt_display, FALSE); /* get all events on the server */
  
 -    if (XCheckTypedWindowEvent(ob_display, self->window, DestroyNotify, &e) ||
 -        XCheckTypedWindowEvent(ob_display, self->window, UnmapNotify, &e)) {
 -        XPutBackEvent(ob_display, &e);
 +    if (XCheckTypedWindowEvent(obt_display, self->window, DestroyNotify, &e) ||
 +        XCheckTypedWindowEvent(obt_display, self->window, UnmapNotify, &e))
 +    {
 +        XPutBackEvent(obt_display, &e);
          return FALSE;
      }
  
@@@ -3395,9 -3435,9 +3440,9 @@@ void client_set_state(ObClient *self, A
      gboolean below = self->below;
      gint i;
  
 -    if (!(action == prop_atoms.net_wm_state_add ||
 -          action == prop_atoms.net_wm_state_remove ||
 -          action == prop_atoms.net_wm_state_toggle))
 +    if (!(action == OBT_PROP_ATOM(NET_WM_STATE_ADD) ||
 +          action == OBT_PROP_ATOM(NET_WM_STATE_REMOVE) ||
 +          action == OBT_PROP_ATOM(NET_WM_STATE_TOGGLE)))
          /* an invalid action was passed to the client message, ignore it */
          return;
  
          if (!state) continue;
  
          /* if toggling, then pick whether we're adding or removing */
 -        if (action == prop_atoms.net_wm_state_toggle) {
 -            if (state == prop_atoms.net_wm_state_modal)
 -                action = modal ? prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_maximized_vert)
 -                action = self->max_vert ? prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_maximized_horz)
 -                action = self->max_horz ? prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_shaded)
 -                action = shaded ? prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_skip_taskbar)
 +        if (action == OBT_PROP_ATOM(NET_WM_STATE_TOGGLE)) {
 +            if (state == OBT_PROP_ATOM(NET_WM_STATE_MODAL))
 +                action = modal ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_VERT))
 +                action = self->max_vert ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_HORZ))
 +                action = self->max_horz ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_SHADED))
 +                action = shaded ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_SKIP_TASKBAR))
                  action = self->skip_taskbar ?
 -                    prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_skip_pager)
 +                    OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_SKIP_PAGER))
                  action = self->skip_pager ?
 -                    prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_hidden)
 +                    OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_HIDDEN))
                  action = self->iconic ?
 -                    prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_fullscreen)
 +                    OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_FULLSCREEN))
                  action = fullscreen ?
 -                    prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_above)
 -                action = self->above ? prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_below)
 -                action = self->below ? prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.net_wm_state_demands_attention)
 +                    OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_ABOVE))
 +                action = self->above ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_BELOW))
 +                action = self->below ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(NET_WM_STATE_DEMANDS_ATTENTION))
                  action = self->demands_attention ?
 -                    prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 -            else if (state == prop_atoms.ob_wm_state_undecorated)
 -                action = undecorated ? prop_atoms.net_wm_state_remove :
 -                    prop_atoms.net_wm_state_add;
 +                    OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
 +            else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED))
 +                action = undecorated ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) :
 +                    OBT_PROP_ATOM(NET_WM_STATE_ADD);
          }
  
 -        if (action == prop_atoms.net_wm_state_add) {
 -            if (state == prop_atoms.net_wm_state_modal) {
 +        if (action == OBT_PROP_ATOM(NET_WM_STATE_ADD)) {
 +            if (state == OBT_PROP_ATOM(NET_WM_STATE_MODAL)) {
                  modal = TRUE;
 -            } else if (state == prop_atoms.net_wm_state_maximized_vert) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_VERT)) {
                  max_vert = TRUE;
 -            } else if (state == prop_atoms.net_wm_state_maximized_horz) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_HORZ)) {
                  max_horz = TRUE;
 -            } else if (state == prop_atoms.net_wm_state_shaded) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_SHADED)) {
                  shaded = TRUE;
 -            } else if (state == prop_atoms.net_wm_state_skip_taskbar) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_SKIP_TASKBAR)) {
                  self->skip_taskbar = TRUE;
 -            } else if (state == prop_atoms.net_wm_state_skip_pager) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_SKIP_PAGER)) {
                  self->skip_pager = TRUE;
 -            } else if (state == prop_atoms.net_wm_state_hidden) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_HIDDEN)) {
                  iconic = TRUE;
 -            } else if (state == prop_atoms.net_wm_state_fullscreen) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_FULLSCREEN)) {
                  fullscreen = TRUE;
 -            } else if (state == prop_atoms.net_wm_state_above) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_ABOVE)) {
                  above = TRUE;
                  below = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_below) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_BELOW)) {
                  above = FALSE;
                  below = TRUE;
 -            } else if (state == prop_atoms.net_wm_state_demands_attention) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_DEMANDS_ATTENTION)){
                  demands_attention = TRUE;
 -            } else if (state == prop_atoms.ob_wm_state_undecorated) {
 +            } else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED)) {
                  undecorated = TRUE;
              }
  
 -        } else { /* action == prop_atoms.net_wm_state_remove */
 -            if (state == prop_atoms.net_wm_state_modal) {
 +        } else { /* action == OBT_PROP_ATOM(NET_WM_STATE_REMOVE) */
 +            if (state == OBT_PROP_ATOM(NET_WM_STATE_MODAL)) {
                  modal = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_maximized_vert) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_VERT)) {
                  max_vert = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_maximized_horz) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_HORZ)) {
                  max_horz = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_shaded) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_SHADED)) {
                  shaded = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_skip_taskbar) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_SKIP_TASKBAR)) {
                  self->skip_taskbar = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_skip_pager) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_SKIP_PAGER)) {
                  self->skip_pager = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_hidden) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_HIDDEN)) {
                  iconic = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_fullscreen) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_FULLSCREEN)) {
                  fullscreen = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_above) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_ABOVE)) {
                  above = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_below) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_BELOW)) {
                  below = FALSE;
 -            } else if (state == prop_atoms.net_wm_state_demands_attention) {
 +            } else if (state == OBT_PROP_ATOM(NET_WM_STATE_DEMANDS_ATTENTION)){
                  demands_attention = FALSE;
 -            } else if (state == prop_atoms.ob_wm_state_undecorated) {
 +            } else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED)) {
                  undecorated = FALSE;
              }
          }
@@@ -3616,35 -3656,35 +3661,35 @@@ gboolean client_focus(ObClient *self
      */
      event_cancel_all_key_grabs();
  
 -    xerror_set_ignore(TRUE);
 -    xerror_occured = FALSE;
 +    obt_display_ignore_errors(TRUE);
  
      if (self->can_focus) {
          /* This can cause a BadMatch error with CurrentTime, or if an app
             passed in a bad time for _NET_WM_ACTIVE_WINDOW. */
 -        XSetInputFocus(ob_display, self->window, RevertToPointerRoot,
 +        XSetInputFocus(obt_display, self->window, RevertToPointerRoot,
                         event_curtime);
      }
  
      if (self->focus_notify) {
          XEvent ce;
          ce.xclient.type = ClientMessage;
 -        ce.xclient.message_type = prop_atoms.wm_protocols;
 -        ce.xclient.display = ob_display;
 +        ce.xclient.message_type = OBT_PROP_ATOM(WM_PROTOCOLS);
 +        ce.xclient.display = obt_display;
          ce.xclient.window = self->window;
          ce.xclient.format = 32;
 -        ce.xclient.data.l[0] = prop_atoms.wm_take_focus;
 +        ce.xclient.data.l[0] = OBT_PROP_ATOM(WM_TAKE_FOCUS);
          ce.xclient.data.l[1] = event_curtime;
          ce.xclient.data.l[2] = 0l;
          ce.xclient.data.l[3] = 0l;
          ce.xclient.data.l[4] = 0l;
 -        XSendEvent(ob_display, self->window, FALSE, NoEventMask, &ce);
 +        XSendEvent(obt_display, self->window, FALSE, NoEventMask, &ce);
      }
  
 -    xerror_set_ignore(FALSE);
 +    obt_display_ignore_errors(FALSE);
  
 -    ob_debug_type(OB_DEBUG_FOCUS, "Error focusing? %d\n", xerror_occured);
 -    return !xerror_occured;
 +    ob_debug_type(OB_DEBUG_FOCUS, "Error focusing? %d\n",
 +                  obt_display_error_occured);
 +    return !obt_display_error_occured;
  }
  
  static void client_present(ObClient *self, gboolean here, gboolean raise,
diff --combined openbox/client_menu.c
index 969703524c9f71f5775e65ecd19556e7a5191bf0,f35b5bd312d138326ddeb8b7f6397112ec7eafc2..04f50e857fb31d6e34fe0d0c8cfbe989ec3ec473
  #include "config.h"
  #include "screen.h"
  #include "client.h"
+ #include "client_menu.h"
  #include "openbox.h"
  #include "frame.h"
  #include "moveresize.h"
  #include "event.h"
 -#include "prop.h"
  #include "gettext.h"
 +#include "obt/prop.h"
  
  #include <glib.h>
  
@@@ -140,7 -141,7 +141,7 @@@ static void client_menu_execute(ObMenuE
  
          screen_pointer_pos(&x, &y);
          moveresize_start(c, x, y, 0,
 -                         prop_atoms.net_wm_moveresize_move_keyboard);
 +                         OBT_PROP_ATOM(NET_WM_MOVERESIZE_MOVE_KEYBOARD));
          break;
      case CLIENT_RESIZE:
          /* this needs to grab the keyboard so hide the menu */
  
          screen_pointer_pos(&x, &y);
          moveresize_start(c, x, y, 0,
 -                         prop_atoms.net_wm_moveresize_size_keyboard);
 +                         OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_KEYBOARD));
          break;
      case CLIENT_CLOSE:
          client_close(c);
diff --combined openbox/config.c
index ce3649d914e829618cd1a8bff8b5fbcbe558fcb9,69904d85d5b8cd9b5e39988e1fa9dc8f6cef55ea..eaaab5368ee2d65fba0b1617425bae380b1ebc92
  #include "keyboard.h"
  #include "mouse.h"
  #include "actions.h"
 -#include "prop.h"
  #include "translate.h"
  #include "client.h"
  #include "screen.h"
 -#include "parser/parse.h"
  #include "openbox.h"
  #include "gettext.h"
 +#include "obt/paths.h"
  
  gboolean config_focus_new;
  gboolean config_focus_follow;
@@@ -35,9 -36,9 +35,9 @@@ gboolean config_focus_raise
  gboolean config_focus_last;
  gboolean config_focus_under_mouse;
  
- ObPlacePolicy config_place_policy;
- gboolean      config_place_center;
gboolean      config_place_active;
+ ObPlacePolicy  config_place_policy;
+ gboolean       config_place_center;
ObPlaceMonitor config_place_monitor;
  
  StrutPartial config_margins;
  
@@@ -54,7 -55,7 +54,7 @@@ RrFont *config_font_menuitem
  RrFont *config_font_menutitle;
  RrFont *config_font_osd;
  
- gint    config_desktops_num;
+ guint   config_desktops_num;
  GSList *config_desktops_names;
  guint   config_screen_firstdesk;
  guint   config_desktop_popup_time;
@@@ -141,9 -142,10 +141,9 @@@ void config_app_settings_copy_non_defau
      }
  }
  
 -static void config_parse_gravity_coord(xmlDocPtr doc, xmlNodePtr node,
 -                                       GravityCoord *c)
 +static void config_parse_gravity_coord(xmlNodePtr node, GravityCoord *c)
  {
 -    gchar *s = parse_string(doc, node);
 +    gchar *s = obt_parse_node_string(node);
      if (!g_ascii_strcasecmp(s, "center"))
          c->center = TRUE;
      else {
     the monitor, so <position><x>center</x></position><monitor>2</monitor>
     will center the window on the second monitor.
  */
 -static void parse_per_app_settings(ObParseInst *inst, xmlDocPtr doc,
 -                                   xmlNodePtr node, gpointer data)
 +static void parse_per_app_settings(xmlNodePtr node, gpointer d)
  {
 -    xmlNodePtr app = parse_find_node("application", node->children);
 +    xmlNodePtr app = obt_parse_find_node(node->children, "application");
      gchar *name = NULL, *class = NULL, *role = NULL;
      gboolean name_set, class_set;
      gboolean x_pos_given;
      while (app) {
          name_set = class_set = x_pos_given = FALSE;
  
 -        class_set = parse_attr_string("class", app, &class);
 -        name_set = parse_attr_string("name", app, &name);
 +        class_set = obt_parse_attr_string(app, "class", &class);
 +        name_set = obt_parse_attr_string(app, "name", &name);
          if (class_set || name_set) {
              xmlNodePtr n, c;
              ObAppSettings *settings = config_create_app_settings();;
              if (class_set)
                  settings->class = g_pattern_spec_new(class);
  
 -            if (parse_attr_string("role", app, &role))
 +            if (obt_parse_attr_string(app, "role", &role))
                  settings->role = g_pattern_spec_new(role);
  
 -            if ((n = parse_find_node("decor", app->children)))
 -                if (!parse_contains("default", doc, n))
 -                    settings->decor = parse_bool(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "decor")))
 +                if (!obt_parse_node_contains(n, "default"))
 +                    settings->decor = obt_parse_node_bool(n);
  
 -            if ((n = parse_find_node("shade", app->children)))
 -                if (!parse_contains("default", doc, n))
 -                    settings->shade = parse_bool(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "shade")))
 +                if (!obt_parse_node_contains(n, "default"))
 +                    settings->shade = obt_parse_node_bool(n);
  
 -            if ((n = parse_find_node("position", app->children))) {
 -                if ((c = parse_find_node("x", n->children)))
 -                    if (!parse_contains("default", doc, c)) {
 -                        config_parse_gravity_coord(doc, c,
 -                                                   &settings->position.x);
 +            if ((n = obt_parse_find_node(app->children, "position"))) {
 +                if ((c = obt_parse_find_node(n->children, "x")))
 +                    if (!obt_parse_node_contains(c, "default")) {
 +                        config_parse_gravity_coord(c, &settings->position.x);
                          x_pos_given = TRUE;
                      }
  
 -                if (x_pos_given && (c = parse_find_node("y", n->children)))
 -                    if (!parse_contains("default", doc, c)) {
 -                        config_parse_gravity_coord(doc, c,
 -                                                   &settings->position.y);
 +                if (x_pos_given && (c = obt_parse_find_node(n->children, "y")))
 +                    if (!obt_parse_node_contains(c, "default")) {
 +                        config_parse_gravity_coord(c, &settings->position.y);
                          settings->pos_given = TRUE;
                      }
  
                  if (settings->pos_given &&
 -                    (c = parse_find_node("monitor", n->children)))
 -                    if (!parse_contains("default", doc, c)) {
 -                        gchar *s = parse_string(doc, c);
 +                    (c = obt_parse_find_node(n->children, "monitor")))
 +                    if (!obt_parse_node_contains(c, "default")) {
 +                        gchar *s = obt_parse_node_string(c);
                          if (!g_ascii_strcasecmp(s, "mouse"))
                              settings->monitor = 0;
                          else
 -                            settings->monitor = parse_int(doc, c) + 1;
 +                            settings->monitor = obt_parse_node_int(c) + 1;
                          g_free(s);
                      }
              }
  
 -            if ((n = parse_find_node("focus", app->children)))
 -                if (!parse_contains("default", doc, n))
 -                    settings->focus = parse_bool(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "focus")))
 +                if (!obt_parse_node_contains(n, "default"))
 +                    settings->focus = obt_parse_node_bool(n);
  
 -            if ((n = parse_find_node("desktop", app->children))) {
 -                if (!parse_contains("default", doc, n)) {
 -                    gchar *s = parse_string(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "desktop"))) {
 +                if (!obt_parse_node_contains(n, "default")) {
 +                    gchar *s = obt_parse_node_string(n);
                      if (!g_ascii_strcasecmp(s, "all"))
                          settings->desktop = DESKTOP_ALL;
                      else {
 -                        gint i = parse_int(doc, n);
 +                        gint i = obt_parse_node_int(n);
                          if (i > 0)
                              settings->desktop = i;
                      }
                  }
              }
  
 -            if ((n = parse_find_node("layer", app->children)))
 -                if (!parse_contains("default", doc, n)) {
 -                    gchar *s = parse_string(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "layer")))
 +                if (!obt_parse_node_contains(n, "default")) {
 +                    gchar *s = obt_parse_node_string(n);
                      if (!g_ascii_strcasecmp(s, "above"))
                          settings->layer = 1;
                      else if (!g_ascii_strcasecmp(s, "below"))
                      g_free(s);
                  }
  
 -            if ((n = parse_find_node("iconic", app->children)))
 -                if (!parse_contains("default", doc, n))
 -                    settings->iconic = parse_bool(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "iconic")))
 +                if (!obt_parse_node_contains(n, "default"))
 +                    settings->iconic = obt_parse_node_bool(n);
  
 -            if ((n = parse_find_node("skip_pager", app->children)))
 -                if (!parse_contains("default", doc, n))
 -                    settings->skip_pager = parse_bool(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "skip_pager")))
 +                if (!obt_parse_node_contains(n, "default"))
 +                    settings->skip_pager = obt_parse_node_bool(n);
  
 -            if ((n = parse_find_node("skip_taskbar", app->children)))
 -                if (!parse_contains("default", doc, n))
 -                    settings->skip_taskbar = parse_bool(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "skip_taskbar")))
 +                if (!obt_parse_node_contains(n, "default"))
 +                    settings->skip_taskbar = obt_parse_node_bool(n);
  
 -            if ((n = parse_find_node("fullscreen", app->children)))
 -                if (!parse_contains("default", doc, n))
 -                    settings->fullscreen = parse_bool(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "fullscreen")))
 +                if (!obt_parse_node_contains(n, "default"))
 +                    settings->fullscreen = obt_parse_node_bool(n);
  
 -            if ((n = parse_find_node("maximized", app->children)))
 -                if (!parse_contains("default", doc, n)) {
 -                    gchar *s = parse_string(doc, n);
 +            if ((n = obt_parse_find_node(app->children, "maximized")))
 +                if (!obt_parse_node_contains(n, "default")) {
 +                    gchar *s = obt_parse_node_string(n);
                      if (!g_ascii_strcasecmp(s, "horizontal")) {
                          settings->max_horz = TRUE;
                          settings->max_vert = FALSE;
                          settings->max_vert = TRUE;
                      } else
                          settings->max_horz = settings->max_vert =
 -                            parse_bool(doc, n);
 +                            obt_parse_node_bool(n);
                      g_free(s);
                  }
  
              name = class = role = NULL;
          }
  
 -        app = parse_find_node("application", app->next);
 +        app = obt_parse_find_node(app->next, "application");
      }
  }
  
  
  */
  
 -static void parse_key(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                      GList *keylist)
 +static void parse_key(xmlNodePtr node, GList *keylist)
  {
      gchar *key;
      xmlNodePtr n;
      gboolean is_chroot = FALSE;
  
 -    if (!parse_attr_string("key", node, &key))
 +    if (!obt_parse_attr_string(node, "key", &key))
          return;
  
 -    parse_attr_bool("chroot", node, &is_chroot);
 +    obt_parse_attr_bool(node, "chroot", &is_chroot);
  
      keylist = g_list_append(keylist, key);
  
 -    if ((n = parse_find_node("keybind", node->children))) {
 +    if ((n = obt_parse_find_node(node->children, "keybind"))) {
          while (n) {
 -            parse_key(i, doc, n, keylist);
 -            n = parse_find_node("keybind", n->next);
 +            parse_key(n, keylist);
 +            n = obt_parse_find_node(n->next, "keybind");
          }
      }
 -    else if ((n = parse_find_node("action", node->children))) {
 +    else if ((n = obt_parse_find_node(node->children, "action"))) {
          while (n) {
              ObActionsAct *action;
  
 -            action = actions_parse(i, doc, n);
 +            action = actions_parse(n);
              if (action)
                  keyboard_bind(keylist, action);
 -            n = parse_find_node("action", n->next);
 +            n = obt_parse_find_node(n->next, "action");
          }
      }
  
      keylist = g_list_delete_link(keylist, g_list_last(keylist));
  }
  
 -static void parse_keyboard(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                           gpointer data)
 +static void parse_keyboard(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
      gchar *key;
  
      keyboard_unbind_all();
  
 -    if ((n = parse_find_node("chainQuitKey", node->children))) {
 -        key = parse_string(doc, n);
 +    if ((n = obt_parse_find_node(node->children, "chainQuitKey"))) {
 +        key = obt_parse_node_string(n);
          translate_key(key, &config_keyboard_reset_state,
                        &config_keyboard_reset_keycode);
          g_free(key);
      }
  
 -    if ((n = parse_find_node("keybind", node->children)))
 +    if ((n = obt_parse_find_node(node->children, "keybind")))
          while (n) {
 -            parse_key(i, doc, n, NULL);
 -            n = parse_find_node("keybind", n->next);
 +            parse_key(n, NULL);
 +            n = obt_parse_find_node(n->next, "keybind");
          }
  }
  
  
  */
  
 -static void parse_mouse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                        gpointer data)
 +static void parse_mouse(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n, nbut, nact;
      gchar *buttonstr;
  
      node = node->children;
  
 -    if ((n = parse_find_node("dragThreshold", node)))
 -        config_mouse_threshold = parse_int(doc, n);
 -    if ((n = parse_find_node("doubleClickTime", node)))
 -        config_mouse_dclicktime = parse_int(doc, n);
 -    if ((n = parse_find_node("screenEdgeWarpTime", node)))
 -        config_mouse_screenedgetime = parse_int(doc, n);
 +    if ((n = obt_parse_find_node(node, "dragThreshold")))
 +        config_mouse_threshold = obt_parse_node_int(n);
 +    if ((n = obt_parse_find_node(node, "doubleClickTime")))
 +        config_mouse_dclicktime = obt_parse_node_int(n);
 +    if ((n = obt_parse_find_node(node, "screenEdgeWarpTime")))
 +        config_mouse_screenedgetime = obt_parse_node_int(n);
  
 -    n = parse_find_node("context", node);
 +    n = obt_parse_find_node(node, "context");
      while (n) {
 -        if (!parse_attr_string("name", n, &contextstr))
 +        if (!obt_parse_attr_string(n, "name", &contextstr))
              goto next_n;
 -        nbut = parse_find_node("mousebind", n->children);
 +        nbut = obt_parse_find_node(n->children, "mousebind");
          while (nbut) {
 -            if (!parse_attr_string("button", nbut, &buttonstr))
 +            if (!obt_parse_attr_string(nbut, "button", &buttonstr))
                  goto next_nbut;
 -            if (parse_attr_contains("press", nbut, "action")) {
 +            if (obt_parse_attr_contains(nbut, "action", "press")) {
                  mact = OB_MOUSE_ACTION_PRESS;
 -            } else if (parse_attr_contains("release", nbut, "action")) {
 +            } else if (obt_parse_attr_contains(nbut, "action", "release")) {
                  mact = OB_MOUSE_ACTION_RELEASE;
 -            } else if (parse_attr_contains("click", nbut, "action")) {
 +            } else if (obt_parse_attr_contains(nbut, "action", "click")) {
                  mact = OB_MOUSE_ACTION_CLICK;
 -            } else if (parse_attr_contains("doubleclick", nbut,"action")) {
 +            } else if (obt_parse_attr_contains(nbut, "action","doubleclick")) {
                  mact = OB_MOUSE_ACTION_DOUBLE_CLICK;
 -            } else if (parse_attr_contains("drag", nbut, "action")) {
 +            } else if (obt_parse_attr_contains(nbut, "action", "drag")) {
                  mact = OB_MOUSE_ACTION_MOTION;
              } else
                  goto next_nbut;
 -            nact = parse_find_node("action", nbut->children);
 +            nact = obt_parse_find_node(nbut->children, "action");
              while (nact) {
                  ObActionsAct *action;
  
 -                if ((action = actions_parse(i, doc, nact)))
 +                if ((action = actions_parse(nact)))
                      mouse_bind(buttonstr, contextstr, mact, action);
 -                nact = parse_find_node("action", nact->next);
 +                nact = obt_parse_find_node(nact->next, "action");
              }
              g_free(buttonstr);
          next_nbut:
 -            nbut = parse_find_node("mousebind", nbut->next);
 +            nbut = obt_parse_find_node(nbut->next, "mousebind");
          }
          g_free(contextstr);
      next_n:
 -        n = parse_find_node("context", n->next);
 +        n = obt_parse_find_node(n->next, "context");
      }
  }
  
 -static void parse_focus(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                        gpointer data)
 +static void parse_focus(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
  
      node = node->children;
  
 -    if ((n = parse_find_node("focusNew", node)))
 -        config_focus_new = parse_bool(doc, n);
 -    if ((n = parse_find_node("followMouse", node)))
 -        config_focus_follow = parse_bool(doc, n);
 -    if ((n = parse_find_node("focusDelay", node)))
 -        config_focus_delay = parse_int(doc, n);
 -    if ((n = parse_find_node("raiseOnFocus", node)))
 -        config_focus_raise = parse_bool(doc, n);
 -    if ((n = parse_find_node("focusLast", node)))
 -        config_focus_last = parse_bool(doc, n);
 -    if ((n = parse_find_node("underMouse", node)))
 -        config_focus_under_mouse = parse_bool(doc, n);
 +    if ((n = obt_parse_find_node(node, "focusNew")))
 +        config_focus_new = obt_parse_node_bool(n);
 +    if ((n = obt_parse_find_node(node, "followMouse")))
 +        config_focus_follow = obt_parse_node_bool(n);
 +    if ((n = obt_parse_find_node(node, "focusDelay")))
 +        config_focus_delay = obt_parse_node_int(n);
 +    if ((n = obt_parse_find_node(node, "raiseOnFocus")))
 +        config_focus_raise = obt_parse_node_bool(n);
 +    if ((n = obt_parse_find_node(node, "focusLast")))
 +        config_focus_last = obt_parse_node_bool(n);
 +    if ((n = obt_parse_find_node(node, "underMouse")))
 +        config_focus_under_mouse = obt_parse_node_bool(n);
  }
  
 -static void parse_placement(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                            gpointer data)
 +static void parse_placement(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
  
      node = node->children;
  
 -    if ((n = parse_find_node("policy", node)))
 -        if (parse_contains("UnderMouse", doc, n))
 +    if ((n = obt_parse_find_node(node, "policy")))
 +        if (obt_parse_node_contains(n, "UnderMouse"))
              config_place_policy = OB_PLACE_POLICY_MOUSE;
 -    if ((n = parse_find_node("center", node)))
 -        config_place_center = parse_bool(doc, n);
 -    if ((n = parse_find_node("monitor", node))) {
 -        if (parse_contains("active", doc, n))
 +    if ((n = obt_parse_find_node(node, "center")))
 +        config_place_center = obt_parse_node_bool(n);
-     if ((n = obt_parse_find_node(node, "active")))
-         config_place_active = obt_parse_node_bool(n);
++    if ((n = obt_parse_find_node(node, "monitor"))) {
++        if (obt_parse_node_contains(n, "active"))
+             config_place_monitor = OB_PLACE_MONITOR_ACTIVE;
 -        else if (parse_contains("mouse", doc, n))
++        else if (obt_parse_node_contains(n, "mouse"))
+             config_place_monitor = OB_PLACE_MONITOR_MOUSE;
+     }
  }
  
 -static void parse_margins(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                          gpointer data)
 +static void parse_margins(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
  
      node = node->children;
  
 -    if ((n = parse_find_node("top", node)))
 -        config_margins.top = MAX(0, parse_int(doc, n));
 -    if ((n = parse_find_node("left", node)))
 -        config_margins.left = MAX(0, parse_int(doc, n));
 -    if ((n = parse_find_node("right", node)))
 -        config_margins.right = MAX(0, parse_int(doc, n));
 -    if ((n = parse_find_node("bottom", node)))
 -        config_margins.bottom = MAX(0, parse_int(doc, n));
 +    if ((n = obt_parse_find_node(node, "top")))
 +        config_margins.top = MAX(0, obt_parse_node_int(n));
 +    if ((n = obt_parse_find_node(node, "left")))
 +        config_margins.left = MAX(0, obt_parse_node_int(n));
 +    if ((n = obt_parse_find_node(node, "right")))
 +        config_margins.right = MAX(0, obt_parse_node_int(n));
 +    if ((n = obt_parse_find_node(node, "bottom")))
 +        config_margins.bottom = MAX(0, obt_parse_node_int(n));
  }
  
 -static void parse_theme(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                        gpointer data)
 +static void parse_theme(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
  
      node = node->children;
  
 -    if ((n = parse_find_node("name", node))) {
 +    if ((n = obt_parse_find_node(node, "name"))) {
          gchar *c;
  
          g_free(config_theme);
 -        c = parse_string(doc, n);
 -        config_theme = parse_expand_tilde(c);
 +        c = obt_parse_node_string(n);
 +        config_theme = obt_paths_expand_tilde(c);
          g_free(c);
      }
 -    if ((n = parse_find_node("titleLayout", node))) {
 +    if ((n = obt_parse_find_node(node, "titleLayout"))) {
          gchar *c, *d;
  
          g_free(config_title_layout);
 -        config_title_layout = parse_string(doc, n);
 +        config_title_layout = obt_parse_node_string(n);
  
          /* replace duplicates with spaces */
          for (c = config_title_layout; *c != '\0'; ++c)
              for (d = c+1; *d != '\0'; ++d)
                  if (*c == *d) *d = ' ';
      }
 -    if ((n = parse_find_node("keepBorder", node)))
 -        config_theme_keepborder = parse_bool(doc, n);
 -    if ((n = parse_find_node("animateIconify", node)))
 -        config_animate_iconify = parse_bool(doc, n);
 +    if ((n = obt_parse_find_node(node, "keepBorder")))
 +        config_theme_keepborder = obt_parse_node_bool(n);
 +    if ((n = obt_parse_find_node(node, "animateIconify")))
 +        config_animate_iconify = obt_parse_node_bool(n);
  
 -    n = parse_find_node("font", node);
 +    n = obt_parse_find_node(node, "font");
      while (n) {
          xmlNodePtr   fnode;
          RrFont     **font;
          RrFontWeight weight = RrDefaultFontWeight;
          RrFontSlant  slant = RrDefaultFontSlant;
  
 -        if (parse_attr_contains("ActiveWindow", n, "place"))
 +        if (obt_parse_attr_contains(n, "place", "ActiveWindow"))
              font = &config_font_activewindow;
 -        else if (parse_attr_contains("InactiveWindow", n, "place"))
 +        else if (obt_parse_attr_contains(n, "place", "InactiveWindow"))
              font = &config_font_inactivewindow;
 -        else if (parse_attr_contains("MenuHeader", n, "place"))
 +        else if (obt_parse_attr_contains(n, "place", "MenuHeader"))
              font = &config_font_menutitle;
 -        else if (parse_attr_contains("MenuItem", n, "place"))
 +        else if (obt_parse_attr_contains(n, "place", "MenuItem"))
              font = &config_font_menuitem;
 -        else if (parse_attr_contains("OnScreenDisplay", n, "place"))
 +        else if (obt_parse_attr_contains(n, "place", "OnScreenDisplay"))
              font = &config_font_osd;
          else
              goto next_font;
  
 -        if ((fnode = parse_find_node("name", n->children))) {
 +        if ((fnode = obt_parse_find_node(n->children, "name"))) {
              g_free(name);
 -            name = parse_string(doc, fnode);
 +            name = obt_parse_node_string(fnode);
          }
 -        if ((fnode = parse_find_node("size", n->children))) {
 -            int s = parse_int(doc, fnode);
 +        if ((fnode = obt_parse_find_node(n->children, "size"))) {
 +            int s = obt_parse_node_int(fnode);
              if (s > 0) size = s;
          }
 -        if ((fnode = parse_find_node("weight", n->children))) {
 -            gchar *w = parse_string(doc, fnode);
 +        if ((fnode = obt_parse_find_node(n->children, "weight"))) {
 +            gchar *w = obt_parse_node_string(fnode);
              if (!g_ascii_strcasecmp(w, "Bold"))
                  weight = RR_FONTWEIGHT_BOLD;
              g_free(w);
          }
 -        if ((fnode = parse_find_node("slant", n->children))) {
 -            gchar *s = parse_string(doc, fnode);
 +        if ((fnode = obt_parse_find_node(n->children, "slant"))) {
 +            gchar *s = obt_parse_node_string(fnode);
              if (!g_ascii_strcasecmp(s, "Italic"))
                  slant = RR_FONTSLANT_ITALIC;
              if (!g_ascii_strcasecmp(s, "Oblique"))
          *font = RrFontOpen(ob_rr_inst, name, size, weight, slant);
          g_free(name);
      next_font:
 -        n = parse_find_node("font", n->next);
 +        n = obt_parse_find_node(n->next, "font");
      }
  }
  
 -static void parse_desktops(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                           gpointer data)
 +static void parse_desktops(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
  
      node = node->children;
  
 -    if ((n = parse_find_node("number", node))) {
 -        gint d = parse_int(doc, n);
 +    if ((n = obt_parse_find_node(node, "number"))) {
 +        gint d = obt_parse_node_int(n);
          if (d > 0)
-             config_desktops_num = d;
+             config_desktops_num = (unsigned) d;
      }
 -    if ((n = parse_find_node("firstdesk", node))) {
 -        gint d = parse_int(doc, n);
 +    if ((n = obt_parse_find_node(node, "firstdesk"))) {
 +        gint d = obt_parse_node_int(n);
          if (d > 0)
              config_screen_firstdesk = (unsigned) d;
      }
 -    if ((n = parse_find_node("names", node))) {
 +    if ((n = obt_parse_find_node(node, "names"))) {
          GSList *it;
          xmlNodePtr nname;
  
          g_slist_free(config_desktops_names);
          config_desktops_names = NULL;
  
 -        nname = parse_find_node("name", n->children);
 +        nname = obt_parse_find_node(n->children, "name");
          while (nname) {
 -            config_desktops_names = g_slist_append(config_desktops_names,
 -                                                   parse_string(doc, nname));
 -            nname = parse_find_node("name", nname->next);
 +            config_desktops_names =
 +                g_slist_append(config_desktops_names,
 +                               obt_parse_node_string(nname));
 +            nname = obt_parse_find_node(nname->next, "name");
          }
      }
 -    if ((n = parse_find_node("popupTime", node)))
 -        config_desktop_popup_time = parse_int(doc, n);
 +    if ((n = obt_parse_find_node(node, "popupTime")))
 +        config_desktop_popup_time = obt_parse_node_int(n);
  }
  
 -static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                         gpointer data)
 +static void parse_resize(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
  
      node = node->children;
  
 -    if ((n = parse_find_node("drawContents", node)))
 -        config_resize_redraw = parse_bool(doc, n);
 -    if ((n = parse_find_node("popupShow", node))) {
 -        config_resize_popup_show = parse_int(doc, n);
 -        if (parse_contains("Always", doc, n))
 +    if ((n = obt_parse_find_node(node, "drawContents")))
 +        config_resize_redraw = obt_parse_node_bool(n);
 +    if ((n = obt_parse_find_node(node, "popupShow"))) {
 +        config_resize_popup_show = obt_parse_node_int(n);
 +        if (obt_parse_node_contains(n, "Always"))
              config_resize_popup_show = 2;
 -        else if (parse_contains("Never", doc, n))
 +        else if (obt_parse_node_contains(n, "Never"))
              config_resize_popup_show = 0;
 -        else if (parse_contains("Nonpixel", doc, n))
 +        else if (obt_parse_node_contains(n, "Nonpixel"))
              config_resize_popup_show = 1;
      }
 -    if ((n = parse_find_node("popupPosition", node))) {
 -        if (parse_contains("Top", doc, n))
 +    if ((n = obt_parse_find_node(node, "popupPosition"))) {
 +        if (obt_parse_node_contains(n, "Top"))
              config_resize_popup_pos = OB_RESIZE_POS_TOP;
 -        else if (parse_contains("Center", doc, n))
 +        else if (obt_parse_node_contains(n, "Center"))
              config_resize_popup_pos = OB_RESIZE_POS_CENTER;
 -        else if (parse_contains("Fixed", doc, n)) {
 +        else if (obt_parse_node_contains(n, "Fixed")) {
              config_resize_popup_pos = OB_RESIZE_POS_FIXED;
  
 -            if ((n = parse_find_node("popupFixedPosition", node))) {
 +            if ((n = obt_parse_find_node(node, "popupFixedPosition"))) {
                  xmlNodePtr n2;
  
 -                if ((n2 = parse_find_node("x", n->children)))
 -                    config_parse_gravity_coord(doc, n2,
 +                if ((n2 = obt_parse_find_node(n->children, "x")))
 +                    config_parse_gravity_coord(n2,
                                                 &config_resize_popup_fixed.x);
 -                if ((n2 = parse_find_node("y", n->children)))
 -                    config_parse_gravity_coord(doc, n2,
 +                if ((n2 = obt_parse_find_node(n->children, "y")))
 +                    config_parse_gravity_coord(n2,
                                                 &config_resize_popup_fixed.y);
              }
          }
      }
  }
  
 -static void parse_dock(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                       gpointer data)
 +static void parse_dock(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
  
      node = node->children;
  
 -    if ((n = parse_find_node("position", node))) {
 -        if (parse_contains("TopLeft", doc, n))
 +    if ((n = obt_parse_find_node(node, "position"))) {
 +        if (obt_parse_node_contains(n, "TopLeft"))
              config_dock_floating = FALSE,
              config_dock_pos = OB_DIRECTION_NORTHWEST;
 -        else if (parse_contains("Top", doc, n))
 +        else if (obt_parse_node_contains(n, "Top"))
              config_dock_floating = FALSE,
              config_dock_pos = OB_DIRECTION_NORTH;
 -        else if (parse_contains("TopRight", doc, n))
 +        else if (obt_parse_node_contains(n, "TopRight"))
              config_dock_floating = FALSE,
              config_dock_pos = OB_DIRECTION_NORTHEAST;
 -        else if (parse_contains("Right", doc, n))
 +        else if (obt_parse_node_contains(n, "Right"))
              config_dock_floating = FALSE,
              config_dock_pos = OB_DIRECTION_EAST;
 -        else if (parse_contains("BottomRight", doc, n))
 +        else if (obt_parse_node_contains(n, "BottomRight"))
              config_dock_floating = FALSE,
              config_dock_pos = OB_DIRECTION_SOUTHEAST;
 -        else if (parse_contains("Bottom", doc, n))
 +        else if (obt_parse_node_contains(n, "Bottom"))
              config_dock_floating = FALSE,
              config_dock_pos = OB_DIRECTION_SOUTH;
 -        else if (parse_contains("BottomLeft", doc, n))
 +        else if (obt_parse_node_contains(n, "BottomLeft"))
              config_dock_floating = FALSE,
              config_dock_pos = OB_DIRECTION_SOUTHWEST;
 -        else if (parse_contains("Left", doc, n))
 +        else if (obt_parse_node_contains(n, "Left"))
              config_dock_floating = FALSE,
              config_dock_pos = OB_DIRECTION_WEST;
 -        else if (parse_contains("Floating", doc, n))
 +        else if (obt_parse_node_contains(n, "Floating"))
              config_dock_floating = TRUE;
      }
      if (config_dock_floating) {
 -        if ((n = parse_find_node("floatingX", node)))
 -            config_dock_x = parse_int(doc, n);
 -        if ((n = parse_find_node("floatingY", node)))
 -            config_dock_y = parse_int(doc, n);
 +        if ((n = obt_parse_find_node(node, "floatingX")))
 +            config_dock_x = obt_parse_node_int(n);
 +        if ((n = obt_parse_find_node(node, "floatingY")))
 +            config_dock_y = obt_parse_node_int(n);
      } else {
 -        if ((n = parse_find_node("noStrut", node)))
 -            config_dock_nostrut = parse_bool(doc, n);
 +        if ((n = obt_parse_find_node(node, "noStrut")))
 +            config_dock_nostrut = obt_parse_node_bool(n);
      }
 -    if ((n = parse_find_node("stacking", node))) {
 -        if (parse_contains("above", doc, n))
 -            config_dock_layer = OB_STACKING_LAYER_ABOVE;
 -        else if (parse_contains("normal", doc, n))
 +    if ((n = obt_parse_find_node(node, "stacking"))) {
 +        if (obt_parse_node_contains(n, "normal"))
              config_dock_layer = OB_STACKING_LAYER_NORMAL;
 -        else if (parse_contains("below", doc, n))
 +        else if (obt_parse_node_contains(n, "below"))
              config_dock_layer = OB_STACKING_LAYER_BELOW;
 +        else if (obt_parse_node_contains(n, "above"))
 +            config_dock_layer = OB_STACKING_LAYER_ABOVE;
      }
 -    if ((n = parse_find_node("direction", node))) {
 -        if (parse_contains("horizontal", doc, n))
 +    if ((n = obt_parse_find_node(node, "direction"))) {
 +        if (obt_parse_node_contains(n, "horizontal"))
              config_dock_orient = OB_ORIENTATION_HORZ;
 -        else if (parse_contains("vertical", doc, n))
 +        else if (obt_parse_node_contains(n, "vertical"))
              config_dock_orient = OB_ORIENTATION_VERT;
      }
 -    if ((n = parse_find_node("autoHide", node)))
 -        config_dock_hide = parse_bool(doc, n);
 -    if ((n = parse_find_node("hideDelay", node)))
 -        config_dock_hide_delay = parse_int(doc, n);
 -    if ((n = parse_find_node("showDelay", node)))
 -        config_dock_show_delay = parse_int(doc, n);
 -    if ((n = parse_find_node("moveButton", node))) {
 -        gchar *str = parse_string(doc, n);
 +    if ((n = obt_parse_find_node(node, "autoHide")))
 +        config_dock_hide = obt_parse_node_bool(n);
 +    if ((n = obt_parse_find_node(node, "hideDelay")))
 +        config_dock_hide_delay = obt_parse_node_int(n);
 +    if ((n = obt_parse_find_node(node, "showDelay")))
 +        config_dock_show_delay = obt_parse_node_int(n);
 +    if ((n = obt_parse_find_node(node, "moveButton"))) {
 +        gchar *str = obt_parse_node_string(n);
          guint b, s;
          if (translate_button(str, &s, &b)) {
              config_dock_app_move_button = b;
      }
  }
  
 -static void parse_menu(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                       gpointer data)
 +static void parse_menu(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
      for (node = node->children; node; node = node->next) {
          if (!xmlStrcasecmp(node->name, (const xmlChar*) "file")) {
              gchar *c;
  
 -            c = parse_string(doc, node);
 +            c = obt_parse_node_string(node);
              config_menu_files = g_slist_append(config_menu_files,
 -                                               parse_expand_tilde(c));
 +                                               obt_paths_expand_tilde(c));
              g_free(c);
          }
 -        if ((n = parse_find_node("hideDelay", node)))
 -            config_menu_hide_delay = parse_int(doc, n);
 -        if ((n = parse_find_node("middle", node)))
 -            config_menu_middle = parse_bool(doc, n);
 -        if ((n = parse_find_node("submenuShowDelay", node)))
 -            config_submenu_show_delay = parse_int(doc, n);
 -        if ((n = parse_find_node("applicationIcons", node)))
 -            config_menu_client_list_icons = parse_bool(doc, n);
 +        if ((n = obt_parse_find_node(node, "hideDelay")))
 +            config_menu_hide_delay = obt_parse_node_int(n);
 +        if ((n = obt_parse_find_node(node, "middle")))
 +            config_menu_middle = obt_parse_node_bool(n);
 +        if ((n = obt_parse_find_node(node, "submenuShowDelay")))
 +            config_submenu_show_delay = obt_parse_node_int(n);
 +        if ((n = obt_parse_find_node(node, "applicationIcons")))
 +            config_menu_client_list_icons = obt_parse_node_bool(n);
      }
  }
  
 -static void parse_resistance(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
 -                             gpointer data)
 +static void parse_resistance(xmlNodePtr node, gpointer d)
  {
      xmlNodePtr n;
  
      node = node->children;
 -    if ((n = parse_find_node("strength", node)))
 -        config_resist_win = parse_int(doc, n);
 -    if ((n = parse_find_node("screen_edge_strength", node)))
 -        config_resist_edge = parse_int(doc, n);
 +    if ((n = obt_parse_find_node(node, "strength")))
 +        config_resist_win = obt_parse_node_int(n);
 +    if ((n = obt_parse_find_node(node, "screen_edge_strength")))
 +        config_resist_edge = obt_parse_node_int(n);
  }
  
  typedef struct
@@@ -857,7 -877,7 +861,7 @@@ static void bind_default_mouse(void
                     actions_parse_string(it->actname));
  }
  
 -void config_startup(ObParseInst *i)
 +void config_startup(ObtParseInst *i)
  {
      config_focus_new = TRUE;
      config_focus_follow = FALSE;
      config_focus_last = TRUE;
      config_focus_under_mouse = FALSE;
  
 -    parse_register(i, "focus", parse_focus, NULL);
 +    obt_parse_register(i, "focus", parse_focus, NULL);
  
      config_place_policy = OB_PLACE_POLICY_SMART;
      config_place_center = TRUE;
-     config_place_active = FALSE;
+     config_place_monitor = OB_PLACE_MONITOR_ANY;
  
 -    parse_register(i, "placement", parse_placement, NULL);
 +    obt_parse_register(i, "placement", parse_placement, NULL);
  
      STRUT_PARTIAL_SET(config_margins, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
  
 -    parse_register(i, "margins", parse_margins, NULL);
 +    obt_parse_register(i, "margins", parse_margins, NULL);
  
      config_theme = NULL;
  
      config_font_menuitem = NULL;
      config_font_menutitle = NULL;
  
 -    parse_register(i, "theme", parse_theme, NULL);
 +    obt_parse_register(i, "theme", parse_theme, NULL);
  
      config_desktops_num = 4;
      config_screen_firstdesk = 1;
      config_desktops_names = NULL;
      config_desktop_popup_time = 875;
  
 -    parse_register(i, "desktops", parse_desktops, NULL);
 +    obt_parse_register(i, "desktops", parse_desktops, NULL);
  
      config_resize_redraw = TRUE;
      config_resize_popup_show = 1; /* nonpixel increments */
      GRAVITY_COORD_SET(config_resize_popup_fixed.x, 0, FALSE, FALSE);
      GRAVITY_COORD_SET(config_resize_popup_fixed.y, 0, FALSE, FALSE);
  
 -    parse_register(i, "resize", parse_resize, NULL);
 +    obt_parse_register(i, "resize", parse_resize, NULL);
  
      config_dock_layer = OB_STACKING_LAYER_ABOVE;
      config_dock_pos = OB_DIRECTION_NORTHEAST;
      config_dock_app_move_button = 2; /* middle */
      config_dock_app_move_modifiers = 0;
  
 -    parse_register(i, "dock", parse_dock, NULL);
 +    obt_parse_register(i, "dock", parse_dock, NULL);
  
      translate_key("C-g", &config_keyboard_reset_state,
                    &config_keyboard_reset_keycode);
  
      bind_default_keyboard();
  
 -    parse_register(i, "keyboard", parse_keyboard, NULL);
 +    obt_parse_register(i, "keyboard", parse_keyboard, NULL);
  
      config_mouse_threshold = 8;
      config_mouse_dclicktime = 200;
  
      bind_default_mouse();
  
 -    parse_register(i, "mouse", parse_mouse, NULL);
 +    obt_parse_register(i, "mouse", parse_mouse, NULL);
  
      config_resist_win = 10;
      config_resist_edge = 20;
  
 -    parse_register(i, "resistance", parse_resistance, NULL);
 +    obt_parse_register(i, "resistance", parse_resistance, NULL);
  
      config_menu_hide_delay = 250;
      config_menu_middle = FALSE;
      config_menu_client_list_icons = TRUE;
      config_menu_files = NULL;
  
 -    parse_register(i, "menu", parse_menu, NULL);
 +    obt_parse_register(i, "menu", parse_menu, NULL);
  
      config_per_app_settings = NULL;
  
 -    parse_register(i, "applications", parse_per_app_settings, NULL);
 +    obt_parse_register(i, "applications", parse_per_app_settings, NULL);
  }
  
  void config_shutdown(void)
      RrFontClose(config_font_inactivewindow);
      RrFontClose(config_font_menuitem);
      RrFontClose(config_font_menutitle);
+     RrFontClose(config_font_osd);
  
      for (it = config_desktops_names; it; it = g_slist_next(it))
          g_free(it->data);
diff --combined openbox/config.h
index ac188e3135ebacec0952ba792a24810198c21c9b,75275a8b675b323bba5948e34c70949d2131df37..1a60ee0f75b8e604d5c23f3027ee337752218cb4
  #include "geom.h"
  #include "moveresize.h"
  #include "render/render.h"
 +#include "obt/parse.h"
  
  #include <glib.h>
  
 -struct _ObParseInst;
 -
  typedef struct _ObAppSettings ObAppSettings;
  
  struct _ObAppSettings
@@@ -77,7 -78,7 +77,7 @@@ extern ObPlacePolicy config_place_polic
  extern gboolean config_place_center;
  /*! Place windows on the active monitor (unless they are part of an application
    already on another monitor) */
- extern gboolean config_place_active;
+ extern ObPlaceMonitor config_place_monitor;
  
  /*! User-specified margins around the edge of the screen(s) */
  extern StrutPartial config_margins;
@@@ -142,7 -143,7 +142,7 @@@ extern RrFont *config_font_menuitem
  extern RrFont *config_font_osd;
  
  /*! The number of desktops */
- extern gint config_desktops_num;
+ extern guint config_desktops_num;
  /*! Desktop to start on, put 5 to start in the center of a 3x3 grid */
  extern guint config_screen_firstdesk;
  /*! Names for the desktops */
@@@ -182,7 -183,7 +182,7 @@@ extern GSList *config_menu_files
  /*! Per app settings */
  extern GSList *config_per_app_settings;
  
 -void config_startup(struct _ObParseInst *i);
 +void config_startup(ObtParseInst *i);
  void config_shutdown();
  
  /*! Create an ObAppSettings structure with the default values */
diff --combined openbox/dock.c
index adf61e849888c524a3dbfce389a6e64fd82022bc,4c183e2c755f11793b94f5f1a3cbc38dcbc6a512..f36fca8249e10199d4dc41d6a24f85f5f460ff57
  
  #include "debug.h"
  #include "dock.h"
 -#include "mainloop.h"
  #include "screen.h"
 -#include "prop.h"
  #include "config.h"
  #include "grab.h"
  #include "openbox.h"
  #include "render/theme.h"
 +#include "obt/prop.h"
  
  #define DOCK_EVENT_MASK (ButtonPressMask | ButtonReleaseMask | \
                           EnterWindowMask | LeaveWindowMask)
@@@ -57,9 -58,9 +57,9 @@@ void dock_startup(gboolean reconfig
      if (reconfig) {
          GList *it;
  
 -        XSetWindowBorder(ob_display, dock->frame,
 +        XSetWindowBorder(obt_display, dock->frame,
                           RrColorPixel(ob_rr_theme->osd_border_color));
 -        XSetWindowBorderWidth(ob_display, dock->frame, ob_rr_theme->obwidth);
 +        XSetWindowBorderWidth(obt_display, dock->frame, ob_rr_theme->obwidth);
  
          RrAppearanceFree(dock->a_frame);
          dock->a_frame = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
                        0, 0, 0, 0, 0, 0, 0, 0);
  
      dock = g_new0(ObDock, 1);
 -    dock->obwin.type = Window_Dock;
 +    dock->obwin.type = OB_WINDOW_CLASS_DOCK;
  
      dock->hidden = TRUE;
  
      attrib.event_mask = DOCK_EVENT_MASK;
      attrib.override_redirect = True;
      attrib.do_not_propagate_mask = DOCK_NOPROPAGATEMASK;
 -    dock->frame = XCreateWindow(ob_display, RootWindow(ob_display, ob_screen),
 +    dock->frame = XCreateWindow(obt_display, obt_root(ob_screen),
                                  0, 0, 1, 1, 0,
                                  RrDepth(ob_rr_inst), InputOutput,
                                  RrVisual(ob_rr_inst),
                                  CWDontPropagate,
                                  &attrib);
      dock->a_frame = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
 -    XSetWindowBorder(ob_display, dock->frame,
 +    XSetWindowBorder(obt_display, dock->frame,
                       RrColorPixel(ob_rr_theme->osd_border_color));
 -    XSetWindowBorderWidth(ob_display, dock->frame, ob_rr_theme->obwidth);
 +    XSetWindowBorderWidth(obt_display, dock->frame, ob_rr_theme->obwidth);
  
      /* Setting the window type so xcompmgr can tell what it is */
 -    PROP_SET32(dock->frame, net_wm_window_type, atom,
 -               prop_atoms.net_wm_window_type_dock);
 +    OBT_PROP_SET32(dock->frame, NET_WM_WINDOW_TYPE, ATOM,
 +                   OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DOCK));
  
 -    g_hash_table_insert(window_map, &dock->frame, dock);
 +    window_add(&dock->frame, DOCK_AS_WINDOW(dock));
      stacking_add(DOCK_AS_WINDOW(dock));
  }
  
@@@ -117,9 -118,9 +117,9 @@@ void dock_shutdown(gboolean reconfig
          return;
      }
  
 -    XDestroyWindow(ob_display, dock->frame);
 +    XDestroyWindow(obt_display, dock->frame);
      RrAppearanceFree(dock->a_frame);
 -    g_hash_table_remove(window_map, &dock->frame);
 +    window_remove(dock->frame);
      stacking_remove(dock);
  }
  
@@@ -130,11 -131,12 +130,11 @@@ void dock_add(Window win, XWMHints *wmh
      gchar **data;
  
      app = g_new0(ObDockApp, 1);
 -    app->obwin.type = Window_DockApp;
      app->win = win;
      app->icon_win = (wmhints->flags & IconWindowHint) ?
          wmhints->icon_window : win;
  
 -    if (PROP_GETSS(app->win, wm_class, locale, &data)) {
 +    if (OBT_PROP_GETSS(app->win, WM_CLASS, locale, &data)) {
          if (data[0]) {
              app->name = g_strdup(data[0]);
              if (data[1])
      if (app->name == NULL) app->name = g_strdup("");
      if (app->class == NULL) app->class = g_strdup("");
  
 -    if (XGetWindowAttributes(ob_display, app->icon_win, &attrib)) {
 +    if (XGetWindowAttributes(obt_display, app->icon_win, &attrib)) {
          app->w = attrib.width;
          app->h = attrib.height;
      } else {
      dock->dock_apps = g_list_append(dock->dock_apps, app);
      dock_configure();
  
 -    XReparentWindow(ob_display, app->icon_win, dock->frame, app->x, app->y);
 +    XReparentWindow(obt_display, app->icon_win, dock->frame, app->x, app->y);
      /*
        This is the same case as in frame.c for client windows. When Openbox is
        starting, the window is already mapped so we see unmap events occur for
  
      if (app->win != app->icon_win) {
          /* have to map it so that it can be re-managed on a restart */
 -        XMoveWindow(ob_display, app->win, -1000, -1000);
 -        XMapWindow(ob_display, app->win);
 +        XMoveWindow(obt_display, app->win, -1000, -1000);
 +        XMapWindow(obt_display, app->win);
      }
 -    XMapWindow(ob_display, app->icon_win);
 -    XSync(ob_display, False);
 +    XMapWindow(obt_display, app->icon_win);
 +    XSync(obt_display, False);
  
      /* specify that if we exit, the window should not be destroyed and should
         be reparented back to root automatically */
 -    XChangeSaveSet(ob_display, app->icon_win, SetModeInsert);
 -    XSelectInput(ob_display, app->icon_win, DOCKAPP_EVENT_MASK);
 +    XChangeSaveSet(obt_display, app->icon_win, SetModeInsert);
 +    XSelectInput(obt_display, app->icon_win, DOCKAPP_EVENT_MASK);
  
      dock_app_grab_button(app, TRUE);
  
 -    g_hash_table_insert(window_map, &app->icon_win, app);
 -
      ob_debug("Managed Dock App: 0x%lx (%s)\n", app->icon_win, app->class);
  }
  
@@@ -194,14 -198,16 +194,14 @@@ void dock_remove_all(void
  void dock_remove(ObDockApp *app, gboolean reparent)
  {
      dock_app_grab_button(app, FALSE);
 -    XSelectInput(ob_display, app->icon_win, NoEventMask);
 +    XSelectInput(obt_display, app->icon_win, NoEventMask);
      /* remove the window from our save set */
 -    XChangeSaveSet(ob_display, app->icon_win, SetModeDelete);
 -    XSync(ob_display, False);
 -
 -    g_hash_table_remove(window_map, &app->icon_win);
 +    XChangeSaveSet(obt_display, app->icon_win, SetModeDelete);
 +    XSync(obt_display, False);
  
      if (reparent)
 -        XReparentWindow(ob_display, app->icon_win,
 -                        RootWindow(ob_display, ob_screen), app->x, app->y);
 +        XReparentWindow(obt_display, app->icon_win,
 +                        obt_root(ob_screen), app->x, app->y);
  
      dock->dock_apps = g_list_remove(dock->dock_apps, app);
      dock_configure();
@@@ -243,8 -249,10 +243,10 @@@ void dock_configure(void
          }
      }
  
-     dock->area.width += l + r;
-     dock->area.height += t + b;
+     if (dock->dock_apps) {
+         dock->area.width += l + r;
+         dock->area.height += t + b;
+     }
  
      hspot = l;
      vspot = t;
              break;
          }
  
 -        XMoveWindow(ob_display, app->icon_win, app->x, app->y);
 +        XMoveWindow(obt_display, app->icon_win, app->x, app->y);
      }
  
      /* used for calculating offsets */
      if (!dock->dock_apps) {
          STRUT_PARTIAL_SET(dock_strut, 0, 0, 0, 0,
                            0, 0, 0, 0, 0, 0, 0, 0);
-     } else if (config_dock_floating || config_dock_nostrut)
-     {
+     }
+     else if (config_dock_floating || config_dock_nostrut) {
          STRUT_PARTIAL_SET(dock_strut, 0, 0, 0, 0,
                            0, 0, 0, 0, 0, 0, 0, 0);
-     } else {
+     }
+     else {
          switch (config_dock_pos) {
          case OB_DIRECTION_NORTHWEST:
              switch (config_dock_orient) {
          g_assert(dock->area.width > 0);
          g_assert(dock->area.height > 0);
  
 -        XMoveResizeWindow(ob_display, dock->frame, dock->area.x, dock->area.y,
 +        XMoveResizeWindow(obt_display, dock->frame, dock->area.x, dock->area.y,
                            dock->area.width, dock->area.height);
  
          RrPaint(dock->a_frame, dock->frame, dock->area.width,
                  dock->area.height);
 -        XMapWindow(ob_display, dock->frame);
 +        XMapWindow(obt_display, dock->frame);
      } else
 -        XUnmapWindow(ob_display, dock->frame);
 +        XUnmapWindow(obt_display, dock->frame);
  
-     /* but they are useful outside of this function! */
-     dock->area.width += ob_rr_theme->obwidth * 2;
-     dock->area.height += ob_rr_theme->obwidth * 2;
+     /* but they are useful outside of this function! but don't add it if the
+        dock is actually not visible */
+     if (dock->dock_apps) {
+         dock->area.width += ob_rr_theme->obwidth * 2;
+         dock->area.height += ob_rr_theme->obwidth * 2;
+     }
  
      screen_update_areas();
  
@@@ -624,21 -636,19 +630,21 @@@ void dock_hide(gboolean hide
  {
      if (!hide) {
          if (dock->hidden && config_dock_hide) {
 -            ob_main_loop_timeout_add(ob_main_loop,
 -                                     config_dock_show_delay * 1000,
 -                                     show_timeout, NULL, g_direct_equal, NULL);
 +            obt_main_loop_timeout_add(ob_main_loop,
 +                                      config_dock_show_delay * 1000,
 +                                      show_timeout, NULL,
 +                                      g_direct_equal, NULL);
          } else if (!dock->hidden && config_dock_hide) {
 -            ob_main_loop_timeout_remove(ob_main_loop, hide_timeout);
 +            obt_main_loop_timeout_remove(ob_main_loop, hide_timeout);
          }
      } else {
          if (!dock->hidden && config_dock_hide) {
 -            ob_main_loop_timeout_add(ob_main_loop,
 -                                     config_dock_hide_delay * 1000,
 -                                     hide_timeout, NULL, g_direct_equal, NULL);
 +            obt_main_loop_timeout_add(ob_main_loop,
 +                                      config_dock_hide_delay * 1000,
 +                                      hide_timeout, NULL,
 +                                      g_direct_equal, NULL);
          } else if (dock->hidden && config_dock_hide) {
 -            ob_main_loop_timeout_remove(ob_main_loop, show_timeout);
 +            obt_main_loop_timeout_remove(ob_main_loop, show_timeout);
          }
      }
  }
@@@ -648,16 -658,3 +654,16 @@@ void dock_get_area(Rect *a
      RECT_SET(*a, dock->area.x, dock->area.y,
               dock->area.width, dock->area.height);
  }
 +
 +ObDockApp* dock_find_dockapp(Window xwin)
 +{
 +    GList *it;
 +    /* there are never that many dock apps, so we can use a list here instead
 +       of a hash table */
 +    for (it = dock->dock_apps; it; it = g_list_next(it)) {
 +        ObDockApp *app = it->data;
 +        if (app->icon_win == xwin)
 +            return app;
 +    }
 +    return NULL;
 +}
diff --combined openbox/event.c
index 8443e08c3253dd1e14866b8bbd3685224ec2e091,535e9f14d3ad98cf1ba5ecec88750ca506197f5f..9377214bbe70015e846a4e8ee3e1f01d53fa4f37
@@@ -24,6 -24,8 +24,6 @@@
  #include "dock.h"
  #include "actions.h"
  #include "client.h"
 -#include "xerror.h"
 -#include "prop.h"
  #include "config.h"
  #include "screen.h"
  #include "frame.h"
  #include "menu.h"
  #include "menuframe.h"
  #include "keyboard.h"
 -#include "modkeys.h"
  #include "mouse.h"
 -#include "mainloop.h"
  #include "focus.h"
  #include "focus_cycle.h"
  #include "moveresize.h"
  #include "group.h"
  #include "stacking.h"
 -#include "extensions.h"
 -#include "translate.h"
  #include "ping.h"
 +#include "obt/display.h"
 +#include "obt/prop.h"
 +#include "obt/keyboard.h"
  
  #include <X11/Xlib.h>
  #include <X11/Xatom.h>
@@@ -83,8 -86,8 +83,8 @@@ typedef struc
  
  static void event_process(const XEvent *e, gpointer data);
  static void event_handle_root(XEvent *e);
 -static gboolean event_handle_menu_keyboard(XEvent *e);
 -static gboolean event_handle_menu(XEvent *e);
 +static gboolean event_handle_menu_input(XEvent *e);
 +static void event_handle_menu(ObMenuFrame *frame, XEvent *e);
  static void event_handle_dock(ObDock *s, XEvent *e);
  static void event_handle_dockapp(ObDockApp *app, XEvent *e);
  static void event_handle_client(ObClient *c, XEvent *e);
@@@ -120,9 -123,9 +120,9 @@@ static void ice_watch(IceConn conn, Ice
  
      if (opening) {
          fd = IceConnectionNumber(conn);
 -        ob_main_loop_fd_add(ob_main_loop, fd, ice_handler, conn, NULL);
 +        obt_main_loop_fd_add(ob_main_loop, fd, ice_handler, conn, NULL);
      } else {
 -        ob_main_loop_fd_remove(ob_main_loop, fd);
 +        obt_main_loop_fd_remove(ob_main_loop, fd);
          fd = -1;
      }
  }
@@@ -132,7 -135,7 +132,7 @@@ void event_startup(gboolean reconfig
  {
      if (reconfig) return;
  
 -    ob_main_loop_x_add(ob_main_loop, event_process, NULL, NULL);
 +    obt_main_loop_x_add(ob_main_loop, event_process, NULL, NULL);
  
  #ifdef USE_SM
      IceAddConnectionWatch(ice_watch, NULL);
@@@ -159,7 -162,7 +159,7 @@@ static Window event_get_window(XEvent *
      /* pick a window */
      switch (e->type) {
      case SelectionClear:
 -        window = RootWindow(ob_display, ob_screen);
 +        window = obt_root(ob_screen);
          break;
      case MapRequest:
          window = e->xmap.window;
          break;
      default:
  #ifdef XKB
 -        if (extensions_xkb && e->type == extensions_xkb_event_basep) {
 +        if (obt_display_extension_xkb &&
 +            e->type == obt_display_extension_xkb_basep)
 +        {
              switch (((XkbAnyEvent*)e)->xkb_type) {
              case XkbBellNotify:
                  window = ((XkbBellNotifyEvent*)e)->window;
          } else
  #endif
  #ifdef SYNC
 -        if (extensions_sync &&
 -            e->type == extensions_sync_event_basep + XSyncAlarmNotify)
 +        if (obt_display_extension_sync &&
 +            e->type == obt_display_extension_sync_basep + XSyncAlarmNotify)
          {
              window = None;
          } else
@@@ -229,8 -230,8 +229,8 @@@ static void event_set_curtime(XEvent *e
          break;
      default:
  #ifdef SYNC
 -        if (extensions_sync &&
 -            e->type == extensions_sync_event_basep + XSyncAlarmNotify)
 +        if (obt_display_extension_sync &&
 +            e->type == obt_display_extension_sync_basep + XSyncAlarmNotify)
          {
              t = ((XSyncAlarmNotifyEvent*)e)->time;
          }
@@@ -258,33 -259,34 +258,34 @@@ static void event_hack_mods(XEvent *e
      switch (e->type) {
      case ButtonPress:
      case ButtonRelease:
 -        e->xbutton.state = modkeys_only_modifier_masks(e->xbutton.state);
 +        e->xbutton.state = obt_keyboard_only_modmasks(e->xbutton.state);
          break;
      case KeyPress:
 -        e->xkey.state = modkeys_only_modifier_masks(e->xkey.state);
 +        e->xkey.state = obt_keyboard_only_modmasks(e->xkey.state);
          break;
      case KeyRelease:
  #ifdef XKB
          /* If XKB is present, then the modifiers are all strange from its
             magic.  Our X core protocol stuff won't work, so we use this to
             find what the modifier state is instead. */
 -        if (XkbGetState(ob_display, XkbUseCoreKbd, &xkb_state) == Success)
 +        if (XkbGetState(obt_display, XkbUseCoreKbd, &xkb_state) == Success)
-             e->xkey.state = xkb_state.compat_state;
+             e->xkey.state =
 -                modkeys_only_modifier_masks(xkb_state.compat_state);
++                obt_keyboard_only_modmasks(xkb_state.compat_state);
          else
  #endif
          {
 -            e->xkey.state = modkeys_only_modifier_masks(e->xkey.state);
 +            e->xkey.state = obt_keyboard_only_modmasks(e->xkey.state);
              /* remove from the state the mask of the modifier key being
                 released, if it is a modifier key being released that is */
 -            e->xkey.state &= ~modkeys_keycode_to_mask(e->xkey.keycode);
 +            e->xkey.state &= ~obt_keyboard_keycode_to_modmask(e->xkey.keycode);
          }
          break;
      case MotionNotify:
 -        e->xmotion.state = modkeys_only_modifier_masks(e->xmotion.state);
 +        e->xmotion.state = obt_keyboard_only_modmasks(e->xmotion.state);
          /* compress events */
          {
              XEvent ce;
 -            while (XCheckTypedWindowEvent(ob_display, e->xmotion.window,
 +            while (XCheckTypedWindowEvent(obt_display, e->xmotion.window,
                                            e->type, &ce)) {
                  e->xmotion.x = ce.xmotion.x;
                  e->xmotion.y = ce.xmotion.y;
@@@ -314,7 -316,7 +315,7 @@@ static gboolean wanted_focusevent(XEven
  
          /* These are the ones we want.. */
  
 -        if (win == RootWindow(ob_display, ob_screen)) {
 +        if (win == obt_root(ob_screen)) {
              /* If looking for a focus in on a client, then always return
                 FALSE for focus in's to the root window */
              if (in_client_only)
             but has disappeared.
          */
          if (in_client_only) {
 -            ObWindow *w = g_hash_table_lookup(window_map, &e->xfocus.window);
 +            ObWindow *w = window_find(e->xfocus.window);
              if (!w || !WINDOW_IS_CLIENT(w))
                  return FALSE;
          }
              return FALSE;
  
          /* Focus left the root window revertedto state */
 -        if (win == RootWindow(ob_display, ob_screen))
 +        if (win == obt_root(ob_screen))
              return FALSE;
  
          /* These are the ones we want.. */
@@@ -450,41 -452,39 +451,41 @@@ static gboolean event_ignore(XEvent *e
  
  static void event_process(const XEvent *ec, gpointer data)
  {
 +    XEvent ee, *e;
 +    ObEventData *ed = data;
 +
      Window window;
      ObClient *client = NULL;
      ObDock *dock = NULL;
      ObDockApp *dockapp = NULL;
      ObWindow *obwin = NULL;
 -    XEvent ee, *e;
 -    ObEventData *ed = data;
 +    ObMenuFrame *menu = NULL;
  
      /* make a copy we can mangle */
      ee = *ec;
      e = &ee;
  
      window = event_get_window(e);
 -    if ((obwin = g_hash_table_lookup(window_map, &window))) {
 +    if (window == obt_root(ob_screen))
 +        /* don't do any lookups, waste of cpu */;
 +    else if ((obwin = window_find(window))) {
          switch (obwin->type) {
 -        case Window_Dock:
 +        case OB_WINDOW_CLASS_DOCK:
              dock = WINDOW_AS_DOCK(obwin);
              break;
 -        case Window_DockApp:
 -            dockapp = WINDOW_AS_DOCKAPP(obwin);
 -            break;
 -        case Window_Client:
 +        case OB_WINDOW_CLASS_CLIENT:
              client = WINDOW_AS_CLIENT(obwin);
              break;
 -        case Window_Menu:
 -            /* not to be used for events */
 -            g_assert_not_reached();
 +        case OB_WINDOW_CLASS_MENUFRAME:
 +            menu = WINDOW_AS_MENUFRAME(obwin);
              break;
 -        case Window_Internal:
 +        case OB_WINDOW_CLASS_INTERNAL:
              /* we don't do anything with events directly on these windows */
              break;
          }
      }
 +    else
 +        dockapp = dock_find_dockapp(window);
  
      event_set_curtime(e);
      event_curserial = e->xany.serial;
  
      /* deal with it in the kernel */
  
 -    if (menu_frame_visible &&
 -        (e->type == EnterNotify || e->type == LeaveNotify))
 -    {
 -        /* crossing events for menu */
 -        event_handle_menu(e);
 -    } else if (e->type == FocusIn) {
 +    if (e->type == FocusIn) {
          if (client &&
              e->xfocus.detail == NotifyInferior)
          {
                 But if the other focus in is something like PointerRoot then we
                 still want to fall back.
              */
 -            if (XCheckIfEvent(ob_display, &ce, event_look_for_focusin_client,
 +            if (XCheckIfEvent(obt_display, &ce, event_look_for_focusin_client,
                                NULL))
              {
 -                XPutBackEvent(ob_display, &ce);
 +                XPutBackEvent(obt_display, &ce);
                  ob_debug_type(OB_DEBUG_FOCUS,
                                "  but another FocusIn is coming\n");
              } else {
          XEvent ce;
  
          /* Look for the followup FocusIn */
 -        if (!XCheckIfEvent(ob_display, &ce, event_look_for_focusin, NULL)) {
 +        if (!XCheckIfEvent(obt_display, &ce, event_look_for_focusin, NULL)) {
              /* There is no FocusIn, this means focus went to a window that
                 is not being managed, or a window on another screen. */
              Window win, root;
              gint i;
              guint u;
 -            xerror_set_ignore(TRUE);
 -            if (XGetInputFocus(ob_display, &win, &i) != 0 &&
 -                XGetGeometry(ob_display, win, &root, &i,&i,&u,&u,&u,&u) != 0 &&
 -                root != RootWindow(ob_display, ob_screen))
 +            obt_display_ignore_errors(TRUE);
 +            if (XGetInputFocus(obt_display, &win, &i) &&
 +                XGetGeometry(obt_display, win, &root, &i,&i,&u,&u,&u,&u) &&
 +                root != obt_root(ob_screen))
              {
                  ob_debug_type(OB_DEBUG_FOCUS,
                                "Focus went to another screen !\n");
              else
                  ob_debug_type(OB_DEBUG_FOCUS,
                                "Focus went to a black hole !\n");
 -            xerror_set_ignore(FALSE);
 +            obt_display_ignore_errors(FALSE);
              /* nothing is focused */
              focus_set_client(NULL);
          } else {
          event_handle_dockapp(dockapp, e);
      else if (dock)
          event_handle_dock(dock, e);
 -    else if (window == RootWindow(ob_display, ob_screen))
 +    else if (menu)
 +        event_handle_menu(menu, e);
 +    else if (window == obt_root(ob_screen))
          event_handle_root(e);
      else if (e->type == MapRequest)
          client_manage(window);
          /* 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.\n");
 -        modkeys_shutdown(TRUE);
 -        modkeys_startup(TRUE);
 +        obt_keyboard_reload();
          keyboard_rebind();
      }
      else if (e->type == ClientMessage) {
          /* This is for _NET_WM_REQUEST_FRAME_EXTENTS messages. They come for
             windows that are not managed yet. */
 -        if (e->xclient.message_type == prop_atoms.net_request_frame_extents) {
 +        if (e->xclient.message_type ==
 +            OBT_PROP_ATOM(NET_REQUEST_FRAME_EXTENTS))
 +        {
              /* Pretend to manage the client, getting information used to
                 determine its decorations */
              ObClient *c = client_fake_manage(e->xclient.window);
              vals[1] = c->frame->size.right;
              vals[2] = c->frame->size.top;
              vals[3] = c->frame->size.bottom;
 -            PROP_SETA32(e->xclient.window, net_frame_extents,
 -                        cardinal, vals, 4);
 +            OBT_PROP_SETA32(e->xclient.window, NET_FRAME_EXTENTS,
 +                            CARDINAL, vals, 4);
  
              /* Free the pretend client */
              client_fake_unmanage(c);
  
          /* we are not to be held responsible if someone sends us an
             invalid request! */
 -        xerror_set_ignore(TRUE);
 -        XConfigureWindow(ob_display, window,
 +        obt_display_ignore_errors(TRUE);
 +        XConfigureWindow(obt_display, window,
                           e->xconfigurerequest.value_mask, &xwc);
 -        xerror_set_ignore(FALSE);
 +        obt_display_ignore_errors(FALSE);
      }
  #ifdef SYNC
 -    else if (extensions_sync &&
 -        e->type == extensions_sync_event_basep + XSyncAlarmNotify)
 +    else if (obt_display_extension_sync &&
 +             e->type == obt_display_extension_sync_basep + XSyncAlarmNotify)
      {
          XSyncAlarmNotifyEvent *se = (XSyncAlarmNotifyEvent*)e;
          if (se->alarm == moveresize_alarm && moveresize_in_progress)
      if (e->type == ButtonPress || e->type == ButtonRelease) {
          /* If the button press was on some non-root window, or was physically
             on the root window, the process it */
 -        if (window != RootWindow(ob_display, ob_screen) ||
 +        if (window != obt_root(ob_screen) ||
              e->xbutton.subwindow == None)
          {
              event_handle_user_input(client, e);
          else {
              ObWindow *w;
  
 -            if ((w = g_hash_table_lookup(window_map, &e->xbutton.subwindow)) &&
 +            if ((w = window_find(e->xbutton.subwindow)) &&
                  WINDOW_IS_INTERNAL(w))
              {
                  event_handle_user_input(client, e);
@@@ -743,7 -745,7 +744,7 @@@ static void event_handle_root(XEvent *e
          if (e->xclient.format != 32) break;
  
          msgtype = e->xclient.message_type;
 -        if (msgtype == prop_atoms.net_current_desktop) {
 +        if (msgtype == OBT_PROP_ATOM(NET_CURRENT_DESKTOP)) {
              guint d = e->xclient.data.l[0];
              if (d < screen_num_desktops) {
                  event_curtime = e->xclient.data.l[1];
                                    "a timestamp\n");
                  screen_set_desktop(d, TRUE);
              }
 -        } else if (msgtype == prop_atoms.net_number_of_desktops) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_NUMBER_OF_DESKTOPS)) {
              guint d = e->xclient.data.l[0];
              if (d > 0 && d <= 1000)
                  screen_set_num_desktops(d);
 -        } else if (msgtype == prop_atoms.net_showing_desktop) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_SHOWING_DESKTOP)) {
              screen_show_desktop(e->xclient.data.l[0] != 0, NULL);
 -        } else if (msgtype == prop_atoms.ob_control) {
 +        } else if (msgtype == OBT_PROP_ATOM(OB_CONTROL)) {
              ob_debug("OB_CONTROL: %d\n", e->xclient.data.l[0]);
              if (e->xclient.data.l[0] == 1)
                  ob_reconfigure();
                  ob_restart();
              else if (e->xclient.data.l[0] == 3)
                  ob_exit(0);
 -        } else if (msgtype == prop_atoms.wm_protocols) {
 -            if ((Atom)e->xclient.data.l[0] == prop_atoms.net_wm_ping)
 +        } else if (msgtype == OBT_PROP_ATOM(WM_PROTOCOLS)) {
 +            if ((Atom)e->xclient.data.l[0] == OBT_PROP_ATOM(NET_WM_PING))
                  ping_got_pong(e->xclient.data.l[1]);
          }
          break;
      case PropertyNotify:
 -        if (e->xproperty.atom == prop_atoms.net_desktop_names) {
 +        if (e->xproperty.atom == OBT_PROP_ATOM(NET_DESKTOP_NAMES)) {
              ob_debug("UPDATE DESKTOP NAMES\n");
              screen_update_desktop_names();
          }
 -        else if (e->xproperty.atom == prop_atoms.net_desktop_layout)
 +        else if (e->xproperty.atom == OBT_PROP_ATOM(NET_DESKTOP_LAYOUT))
              screen_update_layout();
          break;
      case ConfigureNotify:
@@@ -799,17 -801,17 +800,17 @@@ void event_enter_client(ObClient *clien
          if (config_focus_delay) {
              ObFocusDelayData *data;
  
 -            ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
 +            obt_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
  
              data = g_new(ObFocusDelayData, 1);
              data->client = client;
              data->time = event_curtime;
              data->serial = event_curserial;
  
 -            ob_main_loop_timeout_add(ob_main_loop,
 -                                     config_focus_delay * 1000,
 -                                     focus_delay_func,
 -                                     data, focus_delay_cmp, focus_delay_dest);
 +            obt_main_loop_timeout_add(ob_main_loop,
 +                                      config_focus_delay * 1000,
 +                                      focus_delay_func,
 +                                      data, focus_delay_cmp, focus_delay_dest);
          } else {
              ObFocusDelayData data;
              data.client = client;
@@@ -999,9 -1001,9 +1000,9 @@@ static void event_handle_client(ObClien
                     delay is up */
                  e->xcrossing.detail != NotifyInferior)
              {
 -                ob_main_loop_timeout_remove_data(ob_main_loop,
 -                                                 focus_delay_func,
 -                                                 client, FALSE);
 +                obt_main_loop_timeout_remove_data(ob_main_loop,
 +                                                  focus_delay_func,
 +                                                  client, FALSE);
              }
              break;
          default:
              /* get the sibling */
              if (e->xconfigurerequest.value_mask & CWSibling) {
                  ObWindow *win;
 -                win = g_hash_table_lookup(window_map,
 -                                          &e->xconfigurerequest.above);
 +                win = window_find(e->xconfigurerequest.above);
                  if (win && WINDOW_IS_CLIENT(win) &&
                      WINDOW_AS_CLIENT(win) != client)
                  {
          break;
      }
      case UnmapNotify:
 -        if (client->ignore_unmaps) {
 -            client->ignore_unmaps--;
 -            break;
 -        }
          ob_debug("UnmapNotify for window 0x%x eventwin 0x%x sendevent %d "
                   "ignores left %d\n",
                   client->window, e->xunmap.event, e->xunmap.from_configure,
                   client->ignore_unmaps);
 +        if (client->ignore_unmaps) {
 +            client->ignore_unmaps--;
 +            break;
 +        }
          client_unmanage(client);
          break;
      case DestroyNotify:
  
          /* we don't want the reparent event, put it back on the stack for the
             X server to deal with after we unmanage the window */
 -        XPutBackEvent(ob_display, e);
 +        XPutBackEvent(obt_display, e);
  
          ob_debug("ReparentNotify for window 0x%x\n", client->window);
          client_unmanage(client);
          if (e->xclient.format != 32) return;
  
          msgtype = e->xclient.message_type;
 -        if (msgtype == prop_atoms.wm_change_state) {
 +        if (msgtype == OBT_PROP_ATOM(WM_CHANGE_STATE)) {
              /* compress changes into a single change */
 -            while (XCheckTypedWindowEvent(ob_display, client->window,
 +            while (XCheckTypedWindowEvent(obt_display, client->window,
                                            e->type, &ce)) {
                  /* XXX: it would be nice to compress ALL messages of a
                     type, not just messages in a row without other
                     message types between. */
                  if (ce.xclient.message_type != msgtype) {
 -                    XPutBackEvent(ob_display, &ce);
 +                    XPutBackEvent(obt_display, &ce);
                      break;
                  }
                  e->xclient = ce.xclient;
              }
              client_set_wm_state(client, e->xclient.data.l[0]);
 -        } else if (msgtype == prop_atoms.net_wm_desktop) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_WM_DESKTOP)) {
              /* compress changes into a single change */
 -            while (XCheckTypedWindowEvent(ob_display, client->window,
 +            while (XCheckTypedWindowEvent(obt_display, client->window,
                                            e->type, &ce)) {
                  /* XXX: it would be nice to compress ALL messages of a
                     type, not just messages in a row without other
                     message types between. */
                  if (ce.xclient.message_type != msgtype) {
 -                    XPutBackEvent(ob_display, &ce);
 +                    XPutBackEvent(obt_display, &ce);
                      break;
                  }
                  e->xclient = ce.xclient;
                  (unsigned)e->xclient.data.l[0] == DESKTOP_ALL)
                  client_set_desktop(client, (unsigned)e->xclient.data.l[0],
                                     FALSE, FALSE);
 -        } else if (msgtype == prop_atoms.net_wm_state) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_WM_STATE)) {
              gulong ignore_start;
  
              /* can't compress these */
                               e->xclient.data.l[1], e->xclient.data.l[2]);
              if (!config_focus_under_mouse)
                  event_end_ignore_all_enters(ignore_start);
 -        } else if (msgtype == prop_atoms.net_close_window) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_CLOSE_WINDOW)) {
              ob_debug("net_close_window for 0x%lx\n", client->window);
              client_close(client);
 -        } else if (msgtype == prop_atoms.net_active_window) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_ACTIVE_WINDOW)) {
              ob_debug("net_active_window for 0x%lx source=%s\n",
                       client->window,
                       (e->xclient.data.l[0] == 0 ? "unknown" :
              client_activate(client, FALSE, TRUE, TRUE,
                              (e->xclient.data.l[0] == 0 ||
                               e->xclient.data.l[0] == 2));
 -        } else if (msgtype == prop_atoms.net_wm_moveresize) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_WM_MOVERESIZE)) {
              ob_debug("net_wm_moveresize for 0x%lx direction %d\n",
                       client->window, e->xclient.data.l[2]);
              if ((Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_topleft ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOPLEFT) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_top ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOP) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_topright ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOPRIGHT) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_right ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_RIGHT) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_right ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_RIGHT) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_bottomright ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_bottom ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOM) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_bottomleft ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_left ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_LEFT) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_move ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_MOVE) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_size_keyboard ||
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_KEYBOARD) ||
                  (Atom)e->xclient.data.l[2] ==
 -                prop_atoms.net_wm_moveresize_move_keyboard) {
 -
 +                OBT_PROP_ATOM(NET_WM_MOVERESIZE_MOVE_KEYBOARD))
 +            {
                  moveresize_start(client, e->xclient.data.l[0],
                                   e->xclient.data.l[1], e->xclient.data.l[3],
                                   e->xclient.data.l[2]);
              }
              else if ((Atom)e->xclient.data.l[2] ==
 -                     prop_atoms.net_wm_moveresize_cancel)
 +                     OBT_PROP_ATOM(NET_WM_MOVERESIZE_CANCEL))
                  moveresize_end(TRUE);
 -        } else if (msgtype == prop_atoms.net_moveresize_window) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_MOVERESIZE_WINDOW)) {
              gint ograv, x, y, w, h;
  
              ograv = client->gravity;
              client_configure(client, x, y, w, h, FALSE, TRUE, FALSE);
  
              client->gravity = ograv;
 -        } else if (msgtype == prop_atoms.net_restack_window) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_RESTACK_WINDOW)) {
              if (e->xclient.data.l[0] != 2) {
                  ob_debug_type(OB_DEBUG_APP_BUGS,
                                "_NET_RESTACK_WINDOW sent for window %s with "
              } else {
                  ObClient *sibling = NULL;
                  if (e->xclient.data.l[1]) {
 -                    ObWindow *win = g_hash_table_lookup
 -                        (window_map, &e->xclient.data.l[1]);
 +                    ObWindow *win = window_find(e->xclient.data.l[1]);
                      if (WINDOW_IS_CLIENT(win) &&
                          WINDOW_AS_CLIENT(win) != client)
                      {
          if (!client_validate(client)) break;
  
          /* compress changes to a single property into a single change */
 -        while (XCheckTypedWindowEvent(ob_display, client->window,
 +        while (XCheckTypedWindowEvent(obt_display, client->window,
                                        e->type, &ce)) {
              Atom a, b;
  
  
              if (a == b)
                  continue;
 -            if ((a == prop_atoms.net_wm_name ||
 -                 a == prop_atoms.wm_name ||
 -                 a == prop_atoms.net_wm_icon_name ||
 -                 a == prop_atoms.wm_icon_name)
 +            if ((a == OBT_PROP_ATOM(NET_WM_NAME) ||
 +                 a == OBT_PROP_ATOM(WM_NAME) ||
 +                 a == OBT_PROP_ATOM(NET_WM_ICON_NAME) ||
 +                 a == OBT_PROP_ATOM(WM_ICON_NAME))
                  &&
 -                (b == prop_atoms.net_wm_name ||
 -                 b == prop_atoms.wm_name ||
 -                 b == prop_atoms.net_wm_icon_name ||
 -                 b == prop_atoms.wm_icon_name)) {
 +                (b == OBT_PROP_ATOM(NET_WM_NAME) ||
 +                 b == OBT_PROP_ATOM(WM_NAME) ||
 +                 b == OBT_PROP_ATOM(NET_WM_ICON_NAME) ||
 +                 b == OBT_PROP_ATOM(WM_ICON_NAME))) {
                  continue;
              }
 -            if (a == prop_atoms.net_wm_icon &&
 -                b == prop_atoms.net_wm_icon)
 +            if (a == OBT_PROP_ATOM(NET_WM_ICON) &&
 +                b == OBT_PROP_ATOM(NET_WM_ICON))
                  continue;
  
 -            XPutBackEvent(ob_display, &ce);
 +            XPutBackEvent(obt_display, &ce);
              break;
          }
  
              /* type may have changed, so update the layer */
              client_calc_layer(client);
              client_setup_decor_and_functions(client, TRUE);
 -        } else if (msgtype == prop_atoms.net_wm_name ||
 -                   msgtype == prop_atoms.wm_name ||
 -                   msgtype == prop_atoms.net_wm_icon_name ||
 -                   msgtype == prop_atoms.wm_icon_name) {
 +        } else if (msgtype == OBT_PROP_ATOM(NET_WM_NAME) ||
 +                   msgtype == OBT_PROP_ATOM(WM_NAME) ||
 +                   msgtype == OBT_PROP_ATOM(NET_WM_ICON_NAME) ||
 +                   msgtype == OBT_PROP_ATOM(WM_ICON_NAME)) {
              client_update_title(client);
 -        } else if (msgtype == prop_atoms.wm_protocols) {
 +        } else if (msgtype == OBT_PROP_ATOM(WM_PROTOCOLS)) {
              client_update_protocols(client);
              client_setup_decor_and_functions(client, TRUE);
          }
 -        else if (msgtype == prop_atoms.net_wm_strut) {
 +        else if (msgtype == OBT_PROP_ATOM(NET_WM_STRUT)) {
              client_update_strut(client);
          }
 -        else if (msgtype == prop_atoms.net_wm_strut_partial) {
 +        else if (msgtype == OBT_PROP_ATOM(NET_WM_STRUT_PARTIAL)) {
              client_update_strut(client);
          }
 -        else if (msgtype == prop_atoms.net_wm_icon) {
 +        else if (msgtype == OBT_PROP_ATOM(NET_WM_ICON)) {
              client_update_icons(client);
          }
 -        else if (msgtype == prop_atoms.net_wm_icon_geometry) {
 +        else if (msgtype == OBT_PROP_ATOM(NET_WM_ICON_GEOMETRY)) {
              client_update_icon_geometry(client);
          }
 -        else if (msgtype == prop_atoms.net_wm_user_time) {
 +        else if (msgtype == OBT_PROP_ATOM(NET_WM_USER_TIME)) {
              guint32 t;
              if (client == focus_client &&
 -                PROP_GET32(client->window, net_wm_user_time, cardinal, &t) &&
 -                t && !event_time_after(t, e->xproperty.time) &&
 +                OBT_PROP_GET32(client->window, NET_WM_USER_TIME, CARDINAL, &t)
 +                && t && !event_time_after(t, e->xproperty.time) &&
                  (!event_last_user_time ||
                   event_time_after(t, event_last_user_time)))
              {
              }
          }
  #ifdef SYNC
 -        else if (msgtype == prop_atoms.net_wm_sync_request_counter) {
 +        else if (msgtype == OBT_PROP_ATOM(NET_WM_SYNC_REQUEST_COUNTER)) {
              client_update_sync_request_counter(client);
          }
  #endif
      default:
          ;
  #ifdef SHAPE
 -        if (extensions_shape && e->type == extensions_shape_event_basep) {
 +        if (obt_display_extension_shape &&
 +            e->type == obt_display_extension_shape_basep)
 +        {
              client->shaped = ((XShapeEvent*)e)->shaped;
              frame_adjust_shape(client->frame);
          }
@@@ -1662,156 -1664,124 +1663,156 @@@ static ObMenuFrame* find_active_or_last
      return ret;
  }
  
 -static gboolean event_handle_menu_keyboard(XEvent *ev)
 +static gboolean event_handle_menu_input(XEvent *ev)
  {
 -    guint keycode, state;
 -    gunichar unikey;
 -    ObMenuFrame *frame;
      gboolean ret = FALSE;
  
 -    keycode = ev->xkey.keycode;
 -    state = ev->xkey.state;
 -    unikey = translate_unichar(keycode);
 +    if (ev->type == ButtonRelease) {
 +        ObMenuEntryFrame *e;
  
 -    frame = find_active_or_last_menu();
 -    if (frame == NULL)
 -        g_assert_not_reached(); /* there is no active menu */
 +        if (menu_hide_delay_reached() &&
 +            (ev->xbutton.button < 4 || ev->xbutton.button > 5))
 +        {
 +            if ((e = menu_entry_frame_under(ev->xbutton.x_root,
 +                                            ev->xbutton.y_root)))
 +            {
 +                menu_frame_select(e->frame, e, TRUE);
 +                menu_entry_frame_execute(e, ev->xbutton.state);
 +            }
 +            else
 +                menu_frame_hide_all();
 +        }
 +        ret = TRUE;
 +    }
 +    else if (ev->type == MotionNotify) {
 +        ObMenuFrame *f;
 +        ObMenuEntryFrame *e;
  
 -    /* Allow control while going thru the menu */
 -    else if (ev->type == KeyPress && (state & ~ControlMask) == 0) {
 -        frame->got_press = TRUE;
 +        if ((e = menu_entry_frame_under(ev->xmotion.x_root,
 +                                        ev->xmotion.y_root)))
 +            if (!(f = find_active_menu()) ||
 +                f == e->frame ||
 +                f->parent == e->frame ||
 +                f->child == e->frame)
 +                menu_frame_select(e->frame, e, FALSE);
 +    }
 +    else if (ev->type == KeyPress || ev->type == KeyRelease) {
 +        guint keycode, state;
 +        gunichar unikey;
 +        ObMenuFrame *frame;
  
 -        if (keycode == ob_keycode(OB_KEY_ESCAPE)) {
 -            menu_frame_hide_all();
 -            ret = TRUE;
 -        }
 +        keycode = ev->xkey.keycode;
 +        state = ev->xkey.state;
 +        unikey = obt_keyboard_keycode_to_unichar(keycode);
  
 -        else if (keycode == ob_keycode(OB_KEY_LEFT)) {
 -            /* Left goes to the parent menu */
 -            menu_frame_select(frame, NULL, TRUE);
 -            ret = TRUE;
 -        }
 +        frame = find_active_or_last_menu();
 +        if (frame == NULL)
 +            g_assert_not_reached(); /* there is no active menu */
  
 -        else if (keycode == ob_keycode(OB_KEY_RIGHT)) {
 -            /* Right goes to the selected submenu */
 -            if (frame->child) menu_frame_select_next(frame->child);
 -            ret = TRUE;
 -        }
 +        /* Allow control while going thru the menu */
 +        else if (ev->type == KeyPress && (state & ~ControlMask) == 0) {
 +            frame->got_press = TRUE;
  
 -        else if (keycode == ob_keycode(OB_KEY_UP)) {
 -            menu_frame_select_previous(frame);
 -            ret = TRUE;
 -        }
 +            if (keycode == ob_keycode(OB_KEY_ESCAPE)) {
 +                menu_frame_hide_all();
 +                ret = TRUE;
 +            }
  
 -        else if (keycode == ob_keycode(OB_KEY_DOWN)) {
 -            menu_frame_select_next(frame);
 -            ret = TRUE;
 -        }
 -    }
 +            else if (keycode == ob_keycode(OB_KEY_LEFT)) {
 +                /* Left goes to the parent menu */
 +                menu_frame_select(frame, NULL, TRUE);
 +                ret = TRUE;
 +            }
  
 -    /* Use KeyRelease events for running things so that the key release doesn't
 -       get sent to the focused application.
 +            else if (keycode == ob_keycode(OB_KEY_RIGHT)) {
 +                /* Right goes to the selected submenu */
 +                if (frame->child) menu_frame_select_next(frame->child);
 +                ret = TRUE;
 +            }
  
 -       Allow ControlMask only, and don't bother if the menu is empty */
 -    else if (ev->type == KeyRelease && (state & ~ControlMask) == 0 &&
 -             frame->entries && frame->got_press)
 -    {
 -        if (keycode == ob_keycode(OB_KEY_RETURN)) {
 -            /* Enter runs the active item or goes into the submenu.
 -               Control-Enter runs it without closing the menu. */
 -            if (frame->child)
 -                menu_frame_select_next(frame->child);
 -            else if (frame->selected)
 -                menu_entry_frame_execute(frame->selected, state);
 -
 -            ret = TRUE;
 -        }
 +            else if (keycode == ob_keycode(OB_KEY_UP)) {
 +                menu_frame_select_previous(frame);
 +                ret = TRUE;
 +            }
  
 -        /* keyboard accelerator shortcuts. (if it was a valid key) */
 -        else if (unikey != 0) {
 -            GList *start;
 -            GList *it;
 -            ObMenuEntryFrame *found = NULL;
 -            guint num_found = 0;
 -
 -            /* start after the selected one */
 -            start = frame->entries;
 -            if (frame->selected) {
 -                for (it = start; frame->selected != it->data;
 -                     it = g_list_next(it))
 -                    g_assert(it != NULL); /* nothing was selected? */
 -                /* next with wraparound */
 -                start = g_list_next(it);
 -                if (start == NULL) start = frame->entries;
 +            else if (keycode == ob_keycode(OB_KEY_DOWN)) {
 +                menu_frame_select_next(frame);
 +                ret = TRUE;
              }
 +        }
  
 -            it = start;
 -            do {
 -                ObMenuEntryFrame *e = it->data;
 -                gunichar entrykey = 0;
 +        /* Use KeyRelease events for running things so that the key release
 +           doesn't get sent to the focused application.
  
 -                if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL)
 -                    entrykey = e->entry->data.normal.shortcut;
 -                else if (e->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
 -                    entrykey = e->entry->data.submenu.submenu->shortcut;
 +           Allow ControlMask only, and don't bother if the menu is empty */
 +        else if (ev->type == KeyRelease && (state & ~ControlMask) == 0 &&
 +                 frame->entries && frame->got_press)
 +        {
 +            if (keycode == ob_keycode(OB_KEY_RETURN)) {
 +                /* Enter runs the active item or goes into the submenu.
 +                   Control-Enter runs it without closing the menu. */
 +                if (frame->child)
 +                    menu_frame_select_next(frame->child);
 +                else if (frame->selected)
 +                    menu_entry_frame_execute(frame->selected, state);
 +
 +                ret = TRUE;
 +            }
  
 -                if (unikey == entrykey) {
 -                    if (found == NULL) found = e;
 -                    ++num_found;
 +            /* keyboard accelerator shortcuts. (if it was a valid key) */
 +            else if (unikey != 0) {
 +                GList *start;
 +                GList *it;
 +                ObMenuEntryFrame *found = NULL;
 +                guint num_found = 0;
 +
 +                /* start after the selected one */
 +                start = frame->entries;
 +                if (frame->selected) {
 +                    for (it = start; frame->selected != it->data;
 +                         it = g_list_next(it))
 +                        g_assert(it != NULL); /* nothing was selected? */
 +                    /* next with wraparound */
 +                    start = g_list_next(it);
 +                    if (start == NULL) start = frame->entries;
                  }
  
 -                /* next with wraparound */
 -                it = g_list_next(it);
 -                if (it == NULL) it = frame->entries;
 -            } while (it != start);
 +                it = start;
 +                do {
 +                    ObMenuEntryFrame *e = it->data;
 +                    gunichar entrykey = 0;
  
 -            if (found) {
 -                if (found->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
 -                    num_found == 1)
 -                {
 -                    menu_frame_select(frame, found, TRUE);
 -                    usleep(50000); /* highlight the item for a short bit so the
 -                                      user can see what happened */
 -                    menu_entry_frame_execute(found, state);
 -                } else {
 -                    menu_frame_select(frame, found, TRUE);
 -                    if (num_found == 1)
 -                        menu_frame_select_next(frame->child);
 -                }
 +                    if (e->entry->type == OB_MENU_ENTRY_TYPE_NORMAL)
 +                        entrykey = e->entry->data.normal.shortcut;
 +                    else if (e->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU)
 +                        entrykey = e->entry->data.submenu.submenu->shortcut;
  
 -                ret = TRUE;
 +                    if (unikey == entrykey) {
 +                        if (found == NULL) found = e;
 +                        ++num_found;
 +                    }
 +
 +                    /* next with wraparound */
 +                    it = g_list_next(it);
 +                    if (it == NULL) it = frame->entries;
 +                } while (it != start);
 +
 +                if (found) {
 +                    if (found->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
 +                        num_found == 1)
 +                    {
 +                        menu_frame_select(frame, found, TRUE);
 +                        usleep(50000); /* highlight the item for a short bit so
 +                                          the user can see what happened */
 +                        menu_entry_frame_execute(found, state);
 +                    } else {
 +                        menu_frame_select(frame, found, TRUE);
 +                        if (num_found == 1)
 +                            menu_frame_select_next(frame->child);
 +                    }
 +
 +                    ret = TRUE;
 +                }
              }
          }
      }
      return ret;
  }
  
 -static gboolean event_handle_menu(XEvent *ev)
 +static void event_handle_menu(ObMenuFrame *frame, XEvent *ev)
  {
      ObMenuFrame *f;
      ObMenuEntryFrame *e;
 -    gboolean ret = TRUE;
  
      switch (ev->type) {
 -    case ButtonRelease:
 -        if (menu_hide_delay_reached() &&
 -            (ev->xbutton.button < 4 || ev->xbutton.button > 5))
 -        {
 -            if ((e = menu_entry_frame_under(ev->xbutton.x_root,
 -                                            ev->xbutton.y_root)))
 -            {
 -                menu_frame_select(e->frame, e, TRUE);
 -                menu_entry_frame_execute(e, ev->xbutton.state);
 -            }
 -            else
 -                menu_frame_hide_all();
 -        }
 -        break;
      case EnterNotify:
          if ((e = g_hash_table_lookup(menu_frame_map, &ev->xcrossing.window))) {
              if (e->ignore_enters)
              menu_frame_select(e->frame, NULL, FALSE);
          }
          break;
 -    case MotionNotify:
 -        if ((e = menu_entry_frame_under(ev->xmotion.x_root,
 -                                        ev->xmotion.y_root)))
 -            if (!(f = find_active_menu()) ||
 -                f == e->frame ||
 -                f->parent == e->frame ||
 -                f->child == e->frame)
 -                menu_frame_select(e->frame, e, FALSE);
 -        break;
 -    case KeyPress:
 -    case KeyRelease:
 -        ret = event_handle_menu_keyboard(ev);
 -        break;
      }
 -    return ret;
  }
  
  static void event_handle_user_input(ObClient *client, XEvent *e)
               e->type == KeyRelease);
  
      if (menu_frame_visible) {
 -        if (event_handle_menu(e))
 +        if (event_handle_menu_input(e))
              /* don't use the event if the menu used it, but if the menu
                 didn't use it and it's a keypress that is bound, it will
                 close the menu and be used */
@@@ -1916,21 -1915,20 +1917,20 @@@ static gboolean focus_delay_func(gpoint
  
  static void focus_delay_client_dest(ObClient *client, gpointer data)
  {
 -    ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func,
 -                                     client, FALSE);
 +    obt_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func,
 +                                      client, FALSE);
  }
  
  void event_halt_focus_delay(void)
  {
      /* ignore all enter events up till the event which caused this to occur */
      if (event_curserial) event_ignore_enter_range(1, event_curserial);
 -    ob_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
 +    obt_main_loop_timeout_remove(ob_main_loop, focus_delay_func);
  }
  
  gulong event_start_ignore_all_enters(void)
  {
-     XSync(obt_display, FALSE);
-     return LastKnownRequestProcessed(obt_display);
 -    return NextRequest(ob_display);
++    return NextRequest(obt_display);
  }
  
  static void event_ignore_enter_range(gulong start, gulong end)
                    r->start, r->end);
  
      /* increment the serial so we don't ignore events we weren't meant to */
-     XSync(obt_display, FALSE);
 -    PROP_ERASE(screen_support_win, motif_wm_hints);
++    OBT_PROP_ERASE(screen_support_win, MOTIF_WM_HINTS);
  }
  
  void event_end_ignore_all_enters(gulong start)
  {
-     XSync(obt_display, FALSE);
-     event_ignore_enter_range(start, LastKnownRequestProcessed(obt_display));
+     /* Use (NextRequest-1) so that we ignore up to the current serial only.
+        Inside event_ignore_enter_range, we increment the serial by one, but if
+        we ignore that serial too, then any enter events generated by mouse
+        movement will be ignored until we create some further network traffic.
+        Instead ignore up to NextRequest-1, then when we increment the serial,
+        we will be *past* the range of ignored serials */
 -    event_ignore_enter_range(start, NextRequest(ob_display)-1);
++    event_ignore_enter_range(start, NextRequest(obt_display)-1);
  }
  
  static gboolean is_enter_focus_event_ignored(XEvent *e)
@@@ -2004,7 -2007,7 +2009,7 @@@ void event_cancel_all_key_grabs(void
      else
          ungrab_passive_key();
  
 -    XSync(ob_display, FALSE);
 +    XSync(obt_display, FALSE);
  }
  
  gboolean event_time_after(Time t1, Time t2)
@@@ -2037,9 -2040,9 +2042,9 @@@ Time event_get_server_time(void
      /* Generate a timestamp */
      XEvent event;
  
 -    XChangeProperty(ob_display, screen_support_win,
 -                    prop_atoms.wm_class, prop_atoms.string,
 +    XChangeProperty(obt_display, screen_support_win,
 +                    OBT_PROP_ATOM(WM_CLASS), OBT_PROP_ATOM(STRING),
                      8, PropModeAppend, NULL, 0);
 -    XWindowEvent(ob_display, screen_support_win, PropertyChangeMask, &event);
 +    XWindowEvent(obt_display, screen_support_win, PropertyChangeMask, &event);
      return event.xproperty.time;
  }
index 79c76e2fd29cb54268af1e2a316603f63d26eded,7c5d5290539cb46c38d1bd95760e0ad59d3c7671..da5efa563be5157af4e382ac5cad5410798a650c
  
  static struct
  {
 -    InternalWindow top;
 -    InternalWindow left;
 -    InternalWindow right;
 -    InternalWindow bottom;
 +    ObInternalWindow top;
 +    ObInternalWindow left;
 +    ObInternalWindow right;
 +    ObInternalWindow bottom;
  } focus_indicator;
  
  static RrAppearance *a_focus_indicator;
@@@ -45,7 -45,7 +45,7 @@@ static gboolean      visible
  static Window create_window(Window parent, gulong mask,
                              XSetWindowAttributes *attrib)
  {
 -    return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0,
 +    return XCreateWindow(obt_display, parent, 0, 0, 1, 1, 0,
                           RrDepth(ob_rr_inst), InputOutput,
                           RrVisual(ob_rr_inst), mask, attrib);
  
@@@ -59,38 -59,38 +59,38 @@@ void focus_cycle_indicator_startup(gboo
  
      if (reconfig) return;
  
 -    focus_indicator.top.obwin.type = Window_Internal;
 -    focus_indicator.left.obwin.type = Window_Internal;
 -    focus_indicator.right.obwin.type = Window_Internal;
 -    focus_indicator.bottom.obwin.type = Window_Internal;
 +    focus_indicator.top.obwin.type = OB_WINDOW_CLASS_INTERNAL;
 +    focus_indicator.left.obwin.type = OB_WINDOW_CLASS_INTERNAL;
 +    focus_indicator.right.obwin.type = OB_WINDOW_CLASS_INTERNAL;
 +    focus_indicator.bottom.obwin.type = OB_WINDOW_CLASS_INTERNAL;
  
      attr.override_redirect = True;
 -    attr.background_pixel = BlackPixel(ob_display, ob_screen);
 -    focus_indicator.top.win =
 -        create_window(RootWindow(ob_display, ob_screen),
 +    attr.background_pixel = BlackPixel(obt_display, ob_screen);
 +    focus_indicator.top.window =
 +        create_window(obt_root(ob_screen),
                        CWOverrideRedirect | CWBackPixel, &attr);
 -    focus_indicator.left.win =
 -        create_window(RootWindow(ob_display, ob_screen),
 +    focus_indicator.left.window =
 +        create_window(obt_root(ob_screen),
                        CWOverrideRedirect | CWBackPixel, &attr);
 -    focus_indicator.right.win =
 -        create_window(RootWindow(ob_display, ob_screen),
 +    focus_indicator.right.window =
 +        create_window(obt_root(ob_screen),
                        CWOverrideRedirect | CWBackPixel, &attr);
 -    focus_indicator.bottom.win =
 -        create_window(RootWindow(ob_display, ob_screen),
 +    focus_indicator.bottom.window =
 +        create_window(obt_root(ob_screen),
                        CWOverrideRedirect | CWBackPixel, &attr);
  
      stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.top));
      stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.left));
      stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.right));
      stacking_add(INTERNAL_AS_WINDOW(&focus_indicator.bottom));
 -    g_hash_table_insert(window_map, &focus_indicator.top.win,
 -                        &focus_indicator.top);
 -    g_hash_table_insert(window_map, &focus_indicator.left.win,
 -                        &focus_indicator.left);
 -    g_hash_table_insert(window_map, &focus_indicator.right.win,
 -                        &focus_indicator.right);
 -    g_hash_table_insert(window_map, &focus_indicator.bottom.win,
 -                        &focus_indicator.bottom);
 +    window_add(&focus_indicator.top.window,
 +               INTERNAL_AS_WINDOW(&focus_indicator.top));
 +    window_add(&focus_indicator.left.window,
 +               INTERNAL_AS_WINDOW(&focus_indicator.left));
 +    window_add(&focus_indicator.right.window,
 +               INTERNAL_AS_WINDOW(&focus_indicator.right));
 +    window_add(&focus_indicator.bottom.window,
 +               INTERNAL_AS_WINDOW(&focus_indicator.bottom));
  
      color_white = RrColorNew(ob_rr_inst, 0xff, 0xff, 0xff);
  
@@@ -117,20 -117,20 +117,20 @@@ void focus_cycle_indicator_shutdown(gbo
  
      RrAppearanceFree(a_focus_indicator);
  
 -    g_hash_table_remove(window_map, &focus_indicator.top.win);
 -    g_hash_table_remove(window_map, &focus_indicator.left.win);
 -    g_hash_table_remove(window_map, &focus_indicator.right.win);
 -    g_hash_table_remove(window_map, &focus_indicator.bottom.win);
 +    window_remove(focus_indicator.top.window);
 +    window_remove(focus_indicator.left.window);
 +    window_remove(focus_indicator.right.window);
 +    window_remove(focus_indicator.bottom.window);
  
      stacking_remove(INTERNAL_AS_WINDOW(&focus_indicator.top));
      stacking_remove(INTERNAL_AS_WINDOW(&focus_indicator.left));
      stacking_remove(INTERNAL_AS_WINDOW(&focus_indicator.right));
      stacking_remove(INTERNAL_AS_WINDOW(&focus_indicator.bottom));
  
 -    XDestroyWindow(ob_display, focus_indicator.top.win);
 -    XDestroyWindow(ob_display, focus_indicator.left.win);
 -    XDestroyWindow(ob_display, focus_indicator.right.win);
 -    XDestroyWindow(ob_display, focus_indicator.bottom.win);
 +    XDestroyWindow(obt_display, focus_indicator.top.window);
 +    XDestroyWindow(obt_display, focus_indicator.left.window);
 +    XDestroyWindow(obt_display, focus_indicator.right.window);
 +    XDestroyWindow(obt_display, focus_indicator.bottom.window);
  }
  
  void focus_cycle_draw_indicator(ObClient *c)
          /* kill enter events cause by this unmapping */
          ignore_start = event_start_ignore_all_enters();
  
 -        XUnmapWindow(ob_display, focus_indicator.top.win);
 -        XUnmapWindow(ob_display, focus_indicator.left.win);
 -        XUnmapWindow(ob_display, focus_indicator.right.win);
 -        XUnmapWindow(ob_display, focus_indicator.bottom.win);
 +        XUnmapWindow(obt_display, focus_indicator.top.window);
 +        XUnmapWindow(obt_display, focus_indicator.left.window);
 +        XUnmapWindow(obt_display, focus_indicator.right.window);
 +        XUnmapWindow(obt_display, focus_indicator.bottom.window);
  
          event_end_ignore_all_enters(ignore_start);
  
          */
          gint x, y, w, h;
          gint wt, wl, wr, wb;
+         gulong ignore_start;
  
          wt = wl = wr = wb = FOCUS_INDICATOR_WIDTH;
  
          w = c->frame->area.width;
          h = wt;
  
 -        XMoveResizeWindow(ob_display, focus_indicator.top.win,
+         /* kill enter events cause by this moving */
+         ignore_start = event_start_ignore_all_enters();
 +        XMoveResizeWindow(obt_display, focus_indicator.top.window,
                            x, y, w, h);
          a_focus_indicator->texture[0].data.lineart.x1 = 0;
          a_focus_indicator->texture[0].data.lineart.y1 = h-1;
          a_focus_indicator->texture[3].data.lineart.y1 = h-1;
          a_focus_indicator->texture[3].data.lineart.x2 = w - wr;
          a_focus_indicator->texture[3].data.lineart.y2 = h-1;
 -        RrPaint(a_focus_indicator, focus_indicator.top.win,
 +        RrPaint(a_focus_indicator, focus_indicator.top.window,
                  w, h);
  
          x = c->frame->area.x;
          w = wl;
          h = c->frame->area.height;
  
 -        XMoveResizeWindow(ob_display, focus_indicator.left.win,
 +        XMoveResizeWindow(obt_display, focus_indicator.left.window,
                            x, y, w, h);
          a_focus_indicator->texture[0].data.lineart.x1 = w-1;
          a_focus_indicator->texture[0].data.lineart.y1 = 0;
          a_focus_indicator->texture[3].data.lineart.y1 = wt-1;
          a_focus_indicator->texture[3].data.lineart.x2 = w-1;
          a_focus_indicator->texture[3].data.lineart.y2 = h - wb;
 -        RrPaint(a_focus_indicator, focus_indicator.left.win,
 +        RrPaint(a_focus_indicator, focus_indicator.left.window,
                  w, h);
  
          x = c->frame->area.x + c->frame->area.width - wr;
          w = wr;
          h = c->frame->area.height ;
  
 -        XMoveResizeWindow(ob_display, focus_indicator.right.win,
 +        XMoveResizeWindow(obt_display, focus_indicator.right.window,
                            x, y, w, h);
          a_focus_indicator->texture[0].data.lineart.x1 = 0;
          a_focus_indicator->texture[0].data.lineart.y1 = 0;
          a_focus_indicator->texture[3].data.lineart.y1 = wt-1;
          a_focus_indicator->texture[3].data.lineart.x2 = 0;
          a_focus_indicator->texture[3].data.lineart.y2 = h - wb;
 -        RrPaint(a_focus_indicator, focus_indicator.right.win,
 +        RrPaint(a_focus_indicator, focus_indicator.right.window,
                  w, h);
  
          x = c->frame->area.x;
          w = c->frame->area.width;
          h = wb;
  
 -        XMoveResizeWindow(ob_display, focus_indicator.bottom.win,
 +        XMoveResizeWindow(obt_display, focus_indicator.bottom.window,
                            x, y, w, h);
          a_focus_indicator->texture[0].data.lineart.x1 = 0;
          a_focus_indicator->texture[0].data.lineart.y1 = 0;
          a_focus_indicator->texture[3].data.lineart.y1 = 0;
          a_focus_indicator->texture[3].data.lineart.x2 = w - wr;
          a_focus_indicator->texture[3].data.lineart.y2 = 0;
 -        RrPaint(a_focus_indicator, focus_indicator.bottom.win,
 +        RrPaint(a_focus_indicator, focus_indicator.bottom.window,
                  w, h);
  
 -        XMapWindow(ob_display, focus_indicator.top.win);
 -        XMapWindow(ob_display, focus_indicator.left.win);
 -        XMapWindow(ob_display, focus_indicator.right.win);
 -        XMapWindow(ob_display, focus_indicator.bottom.win);
 +        XMapWindow(obt_display, focus_indicator.top.window);
 +        XMapWindow(obt_display, focus_indicator.left.window);
 +        XMapWindow(obt_display, focus_indicator.right.window);
 +        XMapWindow(obt_display, focus_indicator.bottom.window);
  
+         event_end_ignore_all_enters(ignore_start);
          visible = TRUE;
      }
  }
index cb1af4813b18a5e391329dffb3c594b7cf0be68d,f0cf25e2e3cd9e908c13bb89f1eff91c53c94d4b..096f5c6375077ce4591a034d7c964a07d0da9b8c
@@@ -87,7 -87,7 +87,7 @@@ static void   popup_render   (ObFocusCy
  static Window create_window(Window parent, guint bwidth, gulong mask,
                              XSetWindowAttributes *attr)
  {
 -    return XCreateWindow(ob_display, parent, 0, 0, 1, 1, bwidth,
 +    return XCreateWindow(obt_display, parent, 0, 0, 1, 1, bwidth,
                           RrDepth(ob_rr_inst), InputOutput,
                           RrVisual(ob_rr_inst), mask, attr);
  }
@@@ -98,7 -98,7 +98,7 @@@ void focus_cycle_popup_startup(gboolea
  
      single_popup = icon_popup_new();
  
 -    popup.obwin.type = Window_Internal;
 +    popup.obwin.type = OB_WINDOW_CLASS_INTERNAL;
      popup.a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
      popup.a_text = RrAppearanceCopy(ob_rr_theme->osd_hilite_label);
      popup.a_icon = RrAppearanceCopy(ob_rr_theme->a_clear_tex);
  
      attrib.override_redirect = True;
      attrib.border_pixel=RrColorPixel(ob_rr_theme->osd_border_color);
 -    popup.bg = create_window(RootWindow(ob_display, ob_screen),
 -                             ob_rr_theme->obwidth,
 +    popup.bg = create_window(obt_root(ob_screen), ob_rr_theme->obwidth,
                               CWOverrideRedirect | CWBorderPixel, &attrib);
  
      popup.text = create_window(popup.bg, 0, 0, NULL);
  
      popup.hilite_rgba = NULL;
  
 -    XMapWindow(ob_display, popup.text);
 +    XMapWindow(obt_display, popup.text);
  
      stacking_add(INTERNAL_AS_WINDOW(&popup));
 -    g_hash_table_insert(window_map, &popup.bg, &popup);
 +    window_add(&popup.bg, INTERNAL_AS_WINDOW(&popup));
  }
  
  void focus_cycle_popup_shutdown(gboolean reconfig)
  {
      icon_popup_free(single_popup);
  
 -    g_hash_table_remove(window_map, &popup.bg);
 +    window_remove(popup.bg);
      stacking_remove(INTERNAL_AS_WINDOW(&popup));
  
      while(popup.targets) {
          ObFocusCyclePopupTarget *t = popup.targets->data;
  
          g_free(t->text);
 -        XDestroyWindow(ob_display, t->win);
 +        XDestroyWindow(obt_display, t->win);
  
          popup.targets = g_list_delete_link(popup.targets, popup.targets);
      }
      g_free(popup.hilite_rgba);
      popup.hilite_rgba = NULL;
  
 -    XDestroyWindow(ob_display, popup.text);
 -    XDestroyWindow(ob_display, popup.bg);
 +    XDestroyWindow(obt_display, popup.text);
 +    XDestroyWindow(obt_display, popup.bg);
  
      RrAppearanceFree(popup.a_icon);
      RrAppearanceFree(popup.a_text);
@@@ -197,7 -198,7 +197,7 @@@ static void popup_setup(ObFocusCyclePop
                  t->text = text;
                  t->win = create_window(p->bg, 0, 0, NULL);
  
 -                XMapWindow(ob_display, t->win);
 +                XMapWindow(obt_display, t->win);
  
                  p->targets = g_list_prepend(p->targets, t);
                  ++n;
@@@ -312,7 -313,7 +312,7 @@@ static void popup_render(ObFocusCyclePo
  
      if (!p->mapped) {
          /* position the background but don't draw it*/
 -        XMoveResizeWindow(ob_display, p->bg, x, y, w, h);
 +        XMoveResizeWindow(obt_display, p->bg, x, y, w, h);
  
          /* set up the hilite texture for the background */
          p->a_bg->texture[0].data.rgba.width = rgbaw;
          p->a_bg->texture[0].data.rgba.data = p->hilite_rgba;
  
          /* position the text, but don't draw it */
 -        XMoveResizeWindow(ob_display, p->text, textx, texty, textw, texth);
 +        XMoveResizeWindow(obt_display, p->text, textx, texty, textw, texth);
          p->a_text->surface.parentx = textx;
          p->a_text->surface.parenty = texty;
      }
              innery += ICON_HILITE_WIDTH + ICON_HILITE_MARGIN;
  
              /* move the icon */
 -            XMoveResizeWindow(ob_display, target->win,
 +            XMoveResizeWindow(obt_display, target->win,
                                innerx, innery, innerw, innerh);
  
              /* get the icon from the client */
@@@ -455,8 -456,8 +455,8 @@@ void focus_cycle_popup_show(ObClient *c
  
      if (!popup.mapped) {
          /* show the dialog */
 -        XMapWindow(ob_display, popup.bg);
 -        XFlush(ob_display);
 +        XMapWindow(obt_display, popup.bg);
 +        XFlush(obt_display);
          popup.mapped = TRUE;
          screen_hide_desktop_popup();
      }
@@@ -468,8 -469,8 +468,8 @@@ void focus_cycle_popup_hide(void
  
      ignore_start = event_start_ignore_all_enters();
  
 -    XUnmapWindow(ob_display, popup.bg);
 -    XFlush(ob_display);
 +    XUnmapWindow(obt_display, popup.bg);
 +    XFlush(obt_display);
  
      event_end_ignore_all_enters(ignore_start);
  
          ObFocusCyclePopupTarget *t = popup.targets->data;
  
          g_free(t->text);
 -        XDestroyWindow(ob_display, t->win);
 +        XDestroyWindow(obt_display, t->win);
+         g_free(t);
  
          popup.targets = g_list_delete_link(popup.targets, popup.targets);
      }
diff --combined openbox/frame.c
index 5767351bc477e5c6ea72aaca7217c0375592c790,8fee3b69e439bcb6f8a354d9d0f83ea21cb3050f..0975214cbf4ddef804dc7e849d49a9c171b4fec8
  #include "frame.h"
  #include "client.h"
  #include "openbox.h"
 -#include "extensions.h"
 -#include "prop.h"
  #include "grab.h"
  #include "config.h"
  #include "framerender.h"
 -#include "mainloop.h"
  #include "focus_cycle.h"
  #include "focus_cycle_indicator.h"
  #include "moveresize.h"
  #include "screen.h"
  #include "render/theme.h"
 +#include "obt/display.h"
 +#include "obt/prop.h"
  
  #define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
                           ButtonPressMask | ButtonReleaseMask | \
@@@ -55,7 -56,7 +55,7 @@@ static void frame_adjust_cursors(ObFram
  static Window createWindow(Window parent, Visual *visual,
                             gulong mask, XSetWindowAttributes *attrib)
  {
 -    return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0,
 +    return XCreateWindow(obt_display, parent, 0, 0, 1, 1, 0,
                           (visual ? 32 : RrDepth(ob_rr_inst)), InputOutput,
                           (visual ? visual : RrVisual(ob_rr_inst)),
                           mask, attrib);
@@@ -72,7 -73,7 +72,7 @@@ static Visual *check_32bit_client(ObCli
      if (RrDepth(ob_rr_inst) == 32)
          return NULL;
  
 -    ret = XGetWindowAttributes(ob_display, c->window, &wattrib);
 +    ret = XGetWindowAttributes(obt_display, c->window, &wattrib);
      g_assert(ret != BadDrawable);
      g_assert(ret != BadWindow);
  
@@@ -101,12 -102,13 +101,12 @@@ ObFrame *frame_new(ObClient *client
          mask |= CWColormap | CWBackPixel | CWBorderPixel;
          /* create a colormap with the visual */
          self->colormap = attrib.colormap =
 -            XCreateColormap(ob_display,
 -                            RootWindow(ob_display, ob_screen),
 +            XCreateColormap(obt_display, obt_root(ob_screen),
                              visual, AllocNone);
 -        attrib.background_pixel = BlackPixel(ob_display, ob_screen);
 -        attrib.border_pixel = BlackPixel(ob_display, ob_screen);
 +        attrib.background_pixel = BlackPixel(obt_display, ob_screen);
 +        attrib.border_pixel = BlackPixel(obt_display, ob_screen);
      }
 -    self->window = createWindow(RootWindow(ob_display, ob_screen), visual,
 +    self->window = createWindow(obt_root(ob_screen), visual,
                                  mask, &attrib);
  
      /* create the visible decor windows */
      self->focused = FALSE;
  
      /* the other stuff is shown based on decor settings */
 -    XMapWindow(ob_display, self->label);
 -    XMapWindow(ob_display, self->backback);
 -    XMapWindow(ob_display, self->backfront);
 +    XMapWindow(obt_display, self->label);
 +    XMapWindow(obt_display, self->backback);
 +    XMapWindow(obt_display, self->backfront);
  
      self->max_press = self->close_press = self->desk_press =
          self->iconify_press = self->shade_press = FALSE;
  static void set_theme_statics(ObFrame *self)
  {
      /* set colors/appearance/sizes for stuff that doesn't change */
 -    XResizeWindow(ob_display, self->max,
 +    XResizeWindow(obt_display, self->max,
                    ob_rr_theme->button_size, ob_rr_theme->button_size);
 -    XResizeWindow(ob_display, self->iconify,
 +    XResizeWindow(obt_display, self->iconify,
                    ob_rr_theme->button_size, ob_rr_theme->button_size);
 -    XResizeWindow(ob_display, self->icon,
 +    XResizeWindow(obt_display, self->icon,
                    ob_rr_theme->button_size + 2, ob_rr_theme->button_size + 2);
 -    XResizeWindow(ob_display, self->close,
 +    XResizeWindow(obt_display, self->close,
                    ob_rr_theme->button_size, ob_rr_theme->button_size);
 -    XResizeWindow(ob_display, self->desk,
 +    XResizeWindow(obt_display, self->desk,
                    ob_rr_theme->button_size, ob_rr_theme->button_size);
 -    XResizeWindow(ob_display, self->shade,
 +    XResizeWindow(obt_display, self->shade,
                    ob_rr_theme->button_size, ob_rr_theme->button_size);
 -    XResizeWindow(ob_display, self->tltresize,
 +    XResizeWindow(obt_display, self->tltresize,
                    ob_rr_theme->grip_width, ob_rr_theme->paddingy + 1);
 -    XResizeWindow(ob_display, self->trtresize,
 +    XResizeWindow(obt_display, self->trtresize,
                    ob_rr_theme->grip_width, ob_rr_theme->paddingy + 1);
 -    XResizeWindow(ob_display, self->tllresize,
 +    XResizeWindow(obt_display, self->tllresize,
                    ob_rr_theme->paddingx + 1, ob_rr_theme->title_height);
 -    XResizeWindow(ob_display, self->trrresize,
 +    XResizeWindow(obt_display, self->trrresize,
                    ob_rr_theme->paddingx + 1, ob_rr_theme->title_height);
-     /* set up the dynamic appearances */
-     self->a_unfocused_title = RrAppearanceCopy(ob_rr_theme->a_unfocused_title);
-     self->a_focused_title = RrAppearanceCopy(ob_rr_theme->a_focused_title);
-     self->a_unfocused_label = RrAppearanceCopy(ob_rr_theme->a_unfocused_label);
-     self->a_focused_label = RrAppearanceCopy(ob_rr_theme->a_focused_label);
-     self->a_unfocused_handle =
-         RrAppearanceCopy(ob_rr_theme->a_unfocused_handle);
-     self->a_focused_handle = RrAppearanceCopy(ob_rr_theme->a_focused_handle);
-     self->a_icon = RrAppearanceCopy(ob_rr_theme->a_icon);
  }
  
  static void free_theme_statics(ObFrame *self)
  {
-     RrAppearanceFree(self->a_unfocused_title);
-     RrAppearanceFree(self->a_focused_title);
-     RrAppearanceFree(self->a_unfocused_label);
-     RrAppearanceFree(self->a_focused_label);
-     RrAppearanceFree(self->a_unfocused_handle);
-     RrAppearanceFree(self->a_focused_handle);
-     RrAppearanceFree(self->a_icon);
  }
  
  void frame_free(ObFrame *self)
  {
      free_theme_statics(self);
  
 -    XDestroyWindow(ob_display, self->window);
 +    XDestroyWindow(obt_display, self->window);
      if (self->colormap)
 -        XFreeColormap(ob_display, self->colormap);
 +        XFreeColormap(obt_display, self->colormap);
  
      g_free(self);
  }
@@@ -257,8 -242,8 +240,8 @@@ void frame_show(ObFrame *self
             the client gets its MapNotify, i.e. to make sure the client is
             _visible_ when it gets MapNotify. */
          grab_server(TRUE);
 -        XMapWindow(ob_display, self->client->window);
 -        XMapWindow(ob_display, self->window);
 +        XMapWindow(obt_display, self->client->window);
 +        XMapWindow(obt_display, self->window);
          grab_server(FALSE);
      }
  }
@@@ -268,10 -253,10 +251,10 @@@ void frame_hide(ObFrame *self
      if (self->visible) {
          self->visible = FALSE;
          if (!frame_iconify_animating(self))
 -            XUnmapWindow(ob_display, self->window);
 +            XUnmapWindow(obt_display, self->window);
          /* we unmap the client itself so that we can get MapRequest
             events, and because the ICCCM tells us to! */
 -        XUnmapWindow(ob_display, self->client->window);
 +        XUnmapWindow(obt_display, self->client->window);
          self->client->ignore_unmaps += 1;
      }
  }
@@@ -290,13 -275,13 +273,13 @@@ void frame_adjust_shape(ObFrame *self
  
      if (!self->client->shaped) {
          /* clear the shape on the frame window */
 -        XShapeCombineMask(ob_display, self->window, ShapeBounding,
 +        XShapeCombineMask(obt_display, self->window, ShapeBounding,
                            self->size.left,
                            self->size.top,
                            None, ShapeSet);
      } else {
          /* make the frame's shape match the clients */
 -        XShapeCombineShape(ob_display, self->window, ShapeBounding,
 +        XShapeCombineShape(obt_display, self->window, ShapeBounding,
                             self->size.left,
                             self->size.top,
                             self->client->window,
              ++num;
          }
  
 -        XShapeCombineRectangles(ob_display, self->window,
 +        XShapeCombineRectangles(obt_display, self->window,
                                  ShapeBounding, 0, 0, xrect, num,
                                  ShapeUnion, Unsorted);
      }
@@@ -397,17 -382,17 +380,17 @@@ void frame_adjust_area(ObFrame *self, g
                  ob_rr_theme->grip_width - self->size.bottom;
  
              if (self->cbwidth_l) {
 -                XMoveResizeWindow(ob_display, self->innerleft,
 +                XMoveResizeWindow(obt_display, self->innerleft,
                                    self->size.left - self->cbwidth_l,
                                    self->size.top,
                                    self->cbwidth_l, self->client->area.height);
  
 -                XMapWindow(ob_display, self->innerleft);
 +                XMapWindow(obt_display, self->innerleft);
              } else
 -                XUnmapWindow(ob_display, self->innerleft);
 +                XUnmapWindow(obt_display, self->innerleft);
  
              if (self->cbwidth_l && innercornerheight > 0) {
 -                XMoveResizeWindow(ob_display, self->innerbll,
 +                XMoveResizeWindow(obt_display, self->innerbll,
                                    0,
                                    self->client->area.height - 
                                    (ob_rr_theme->grip_width -
                                    self->cbwidth_l,
                                    ob_rr_theme->grip_width - self->size.bottom);
  
 -                XMapWindow(ob_display, self->innerbll);
 +                XMapWindow(obt_display, self->innerbll);
              } else
 -                XUnmapWindow(ob_display, self->innerbll);
 +                XUnmapWindow(obt_display, self->innerbll);
  
              if (self->cbwidth_r) {
 -                XMoveResizeWindow(ob_display, self->innerright,
 +                XMoveResizeWindow(obt_display, self->innerright,
                                    self->size.left + self->client->area.width,
                                    self->size.top,
                                    self->cbwidth_r, self->client->area.height);
  
 -                XMapWindow(ob_display, self->innerright);
 +                XMapWindow(obt_display, self->innerright);
              } else
 -                XUnmapWindow(ob_display, self->innerright);
 +                XUnmapWindow(obt_display, self->innerright);
  
              if (self->cbwidth_r && innercornerheight > 0) {
 -                XMoveResizeWindow(ob_display, self->innerbrr,
 +                XMoveResizeWindow(obt_display, self->innerbrr,
                                    0,
                                    self->client->area.height - 
                                    (ob_rr_theme->grip_width -
                                    self->cbwidth_r,
                                    ob_rr_theme->grip_width - self->size.bottom);
  
 -                XMapWindow(ob_display, self->innerbrr);
 +                XMapWindow(obt_display, self->innerbrr);
              } else
 -                XUnmapWindow(ob_display, self->innerbrr);
 +                XUnmapWindow(obt_display, self->innerbrr);
  
              if (self->cbwidth_t) {
 -                XMoveResizeWindow(ob_display, self->innertop,
 +                XMoveResizeWindow(obt_display, self->innertop,
                                    self->size.left - self->cbwidth_l,
                                    self->size.top - self->cbwidth_t,
                                    self->client->area.width +
                                    self->cbwidth_l + self->cbwidth_r,
                                    self->cbwidth_t);
  
 -                XMapWindow(ob_display, self->innertop);
 +                XMapWindow(obt_display, self->innertop);
              } else
 -                XUnmapWindow(ob_display, self->innertop);
 +                XUnmapWindow(obt_display, self->innertop);
  
              if (self->cbwidth_b) {
 -                XMoveResizeWindow(ob_display, self->innerbottom,
 +                XMoveResizeWindow(obt_display, self->innerbottom,
                                    self->size.left - self->cbwidth_l,
                                    self->size.top + self->client->area.height,
                                    self->client->area.width +
                                    self->cbwidth_l + self->cbwidth_r,
                                    self->cbwidth_b);
  
 -                XMoveResizeWindow(ob_display, self->innerblb,
 +                XMoveResizeWindow(obt_display, self->innerblb,
                                    0, 0,
                                    ob_rr_theme->grip_width + self->bwidth,
                                    self->cbwidth_b);
 -                XMoveResizeWindow(ob_display, self->innerbrb,
 +                XMoveResizeWindow(obt_display, self->innerbrb,
                                    self->client->area.width +
                                    self->cbwidth_l + self->cbwidth_r -
                                    (ob_rr_theme->grip_width + self->bwidth),
                                    ob_rr_theme->grip_width + self->bwidth,
                                    self->cbwidth_b);
  
 -                XMapWindow(ob_display, self->innerbottom);
 -                XMapWindow(ob_display, self->innerblb);
 -                XMapWindow(ob_display, self->innerbrb);
 +                XMapWindow(obt_display, self->innerbottom);
 +                XMapWindow(obt_display, self->innerblb);
 +                XMapWindow(obt_display, self->innerbrb);
              } else {
 -                XUnmapWindow(ob_display, self->innerbottom);
 -                XUnmapWindow(ob_display, self->innerblb);
 -                XUnmapWindow(ob_display, self->innerbrb);
 +                XUnmapWindow(obt_display, self->innerbottom);
 +                XUnmapWindow(obt_display, self->innerblb);
 +                XUnmapWindow(obt_display, self->innerbrb);
              }
  
              if (self->bwidth) {
                  /* height of titleleft and titleright */
                  titlesides = (!self->max_horz ? ob_rr_theme->grip_width : 0);
  
 -                XMoveResizeWindow(ob_display, self->titletop,
 +                XMoveResizeWindow(obt_display, self->titletop,
                                    ob_rr_theme->grip_width + self->bwidth, 0,
                                    /* width + bwidth*2 - bwidth*2 - grips*2 */
                                    self->width - ob_rr_theme->grip_width * 2,
                                    self->bwidth);
 -                XMoveResizeWindow(ob_display, self->titletopleft,
 +                XMoveResizeWindow(obt_display, self->titletopleft,
                                    0, 0,
                                    ob_rr_theme->grip_width + self->bwidth,
                                    self->bwidth);
 -                XMoveResizeWindow(ob_display, self->titletopright,
 +                XMoveResizeWindow(obt_display, self->titletopright,
                                    self->client->area.width +
                                    self->size.left + self->size.right -
                                    ob_rr_theme->grip_width - self->bwidth,
                                    self->bwidth);
  
                  if (titlesides > 0) {
 -                    XMoveResizeWindow(ob_display, self->titleleft,
 +                    XMoveResizeWindow(obt_display, self->titleleft,
                                        0, self->bwidth,
                                        self->bwidth,
                                        titlesides);
 -                    XMoveResizeWindow(ob_display, self->titleright,
 +                    XMoveResizeWindow(obt_display, self->titleright,
                                        self->client->area.width +
                                        self->size.left + self->size.right -
                                        self->bwidth,
                                        self->bwidth,
                                        titlesides);
  
 -                    XMapWindow(ob_display, self->titleleft);
 -                    XMapWindow(ob_display, self->titleright);
 +                    XMapWindow(obt_display, self->titleleft);
 +                    XMapWindow(obt_display, self->titleright);
                  } else {
 -                    XUnmapWindow(ob_display, self->titleleft);
 -                    XUnmapWindow(ob_display, self->titleright);
 +                    XUnmapWindow(obt_display, self->titleleft);
 +                    XUnmapWindow(obt_display, self->titleright);
                  }
  
 -                XMapWindow(ob_display, self->titletop);
 -                XMapWindow(ob_display, self->titletopleft);
 -                XMapWindow(ob_display, self->titletopright);
 +                XMapWindow(obt_display, self->titletop);
 +                XMapWindow(obt_display, self->titletopleft);
 +                XMapWindow(obt_display, self->titletopright);
  
                  if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
 -                    XMoveResizeWindow(ob_display, self->titlebottom,
 +                    XMoveResizeWindow(obt_display, self->titlebottom,
                                        (self->max_horz ? 0 : self->bwidth),
                                        ob_rr_theme->title_height + self->bwidth,
                                        self->width,
                                        self->bwidth);
  
 -                    XMapWindow(ob_display, self->titlebottom);
 +                    XMapWindow(obt_display, self->titlebottom);
                  } else
 -                    XUnmapWindow(ob_display, self->titlebottom);
 +                    XUnmapWindow(obt_display, self->titlebottom);
              } else {
 -                XUnmapWindow(ob_display, self->titlebottom);
 +                XUnmapWindow(obt_display, self->titlebottom);
  
 -                XUnmapWindow(ob_display, self->titletop);
 -                XUnmapWindow(ob_display, self->titletopleft);
 -                XUnmapWindow(ob_display, self->titletopright);
 -                XUnmapWindow(ob_display, self->titleleft);
 -                XUnmapWindow(ob_display, self->titleright);
 +                XUnmapWindow(obt_display, self->titletop);
 +                XUnmapWindow(obt_display, self->titletopleft);
 +                XUnmapWindow(obt_display, self->titletopright);
 +                XUnmapWindow(obt_display, self->titleleft);
 +                XUnmapWindow(obt_display, self->titleright);
              }
  
              if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
 -                XMoveResizeWindow(ob_display, self->title,
 +                XMoveResizeWindow(obt_display, self->title,
                                    (self->max_horz ? 0 : self->bwidth),
                                    self->bwidth,
                                    self->width, ob_rr_theme->title_height);
  
 -                XMapWindow(ob_display, self->title);
 +                XMapWindow(obt_display, self->title);
  
                  if (self->decorations & OB_FRAME_DECOR_GRIPS) {
 -                    XMoveResizeWindow(ob_display, self->topresize,
 +                    XMoveResizeWindow(obt_display, self->topresize,
                                        ob_rr_theme->grip_width,
                                        0,
                                        self->width - ob_rr_theme->grip_width *2,
                                        ob_rr_theme->paddingy + 1);
  
 -                    XMoveWindow(ob_display, self->tltresize, 0, 0);
 -                    XMoveWindow(ob_display, self->tllresize, 0, 0);
 -                    XMoveWindow(ob_display, self->trtresize,
 +                    XMoveWindow(obt_display, self->tltresize, 0, 0);
 +                    XMoveWindow(obt_display, self->tllresize, 0, 0);
 +                    XMoveWindow(obt_display, self->trtresize,
                                  self->width - ob_rr_theme->grip_width, 0);
 -                    XMoveWindow(ob_display, self->trrresize,
 +                    XMoveWindow(obt_display, self->trrresize,
                                  self->width - ob_rr_theme->paddingx - 1, 0);
  
 -                    XMapWindow(ob_display, self->topresize);
 -                    XMapWindow(ob_display, self->tltresize);
 -                    XMapWindow(ob_display, self->tllresize);
 -                    XMapWindow(ob_display, self->trtresize);
 -                    XMapWindow(ob_display, self->trrresize);
 +                    XMapWindow(obt_display, self->topresize);
 +                    XMapWindow(obt_display, self->tltresize);
 +                    XMapWindow(obt_display, self->tllresize);
 +                    XMapWindow(obt_display, self->trtresize);
 +                    XMapWindow(obt_display, self->trrresize);
                  } else {
 -                    XUnmapWindow(ob_display, self->topresize);
 -                    XUnmapWindow(ob_display, self->tltresize);
 -                    XUnmapWindow(ob_display, self->tllresize);
 -                    XUnmapWindow(ob_display, self->trtresize);
 -                    XUnmapWindow(ob_display, self->trrresize);
 +                    XUnmapWindow(obt_display, self->topresize);
 +                    XUnmapWindow(obt_display, self->tltresize);
 +                    XUnmapWindow(obt_display, self->tllresize);
 +                    XUnmapWindow(obt_display, self->trtresize);
 +                    XUnmapWindow(obt_display, self->trrresize);
                  }
              } else
 -                XUnmapWindow(ob_display, self->title);
 +                XUnmapWindow(obt_display, self->title);
          }
  
          if ((self->decorations & OB_FRAME_DECOR_TITLEBAR))
              gint sidebwidth = self->max_horz ? 0 : self->bwidth;
  
              if (self->bwidth && self->size.bottom) {
 -                XMoveResizeWindow(ob_display, self->handlebottom,
 +                XMoveResizeWindow(obt_display, self->handlebottom,
                                    ob_rr_theme->grip_width +
                                    self->bwidth + sidebwidth,
                                    self->size.top + self->client->area.height +
  
  
                  if (sidebwidth) {
 -                    XMoveResizeWindow(ob_display, self->lgripleft,
 +                    XMoveResizeWindow(obt_display, self->lgripleft,
                                        0,
                                        self->size.top +
                                        self->client->area.height +
                                        (!self->max_horz ?
                                         ob_rr_theme->grip_width :
                                         self->size.bottom - self->cbwidth_b));
 -                    XMoveResizeWindow(ob_display, self->rgripright,
 +                    XMoveResizeWindow(obt_display, self->rgripright,
                                    self->size.left +
                                        self->client->area.width +
                                        self->size.right - self->bwidth,
                                         ob_rr_theme->grip_width :
                                         self->size.bottom - self->cbwidth_b));
  
 -                    XMapWindow(ob_display, self->lgripleft);
 -                    XMapWindow(ob_display, self->rgripright);
 +                    XMapWindow(obt_display, self->lgripleft);
 +                    XMapWindow(obt_display, self->rgripright);
                  } else {
 -                    XUnmapWindow(ob_display, self->lgripleft);
 -                    XUnmapWindow(ob_display, self->rgripright);
 +                    XUnmapWindow(obt_display, self->lgripleft);
 +                    XUnmapWindow(obt_display, self->rgripright);
                  }
  
 -                XMoveResizeWindow(ob_display, self->lgripbottom,
 +                XMoveResizeWindow(obt_display, self->lgripbottom,
                                    sidebwidth,
                                    self->size.top + self->client->area.height +
                                    self->size.bottom - self->bwidth,
                                    ob_rr_theme->grip_width + self->bwidth,
                                    self->bwidth);
 -                XMoveResizeWindow(ob_display, self->rgripbottom,
 +                XMoveResizeWindow(obt_display, self->rgripbottom,
                                    self->size.left + self->client->area.width +
                                    self->size.right - self->bwidth - sidebwidth-
                                    ob_rr_theme->grip_width,
                                    ob_rr_theme->grip_width + self->bwidth,
                                    self->bwidth);
  
 -                XMapWindow(ob_display, self->handlebottom);
 -                XMapWindow(ob_display, self->lgripbottom);
 -                XMapWindow(ob_display, self->rgripbottom);
 +                XMapWindow(obt_display, self->handlebottom);
 +                XMapWindow(obt_display, self->lgripbottom);
 +                XMapWindow(obt_display, self->rgripbottom);
  
                  if (self->decorations & OB_FRAME_DECOR_HANDLE &&
                      ob_rr_theme->handle_height > 0)
                  {
 -                    XMoveResizeWindow(ob_display, self->handletop,
 +                    XMoveResizeWindow(obt_display, self->handletop,
                                        ob_rr_theme->grip_width +
                                        self->bwidth + sidebwidth,
                                        FRAME_HANDLE_Y(self),
                                        self->width - (ob_rr_theme->grip_width +
                                                       sidebwidth) * 2,
                                        self->bwidth);
 -                    XMapWindow(ob_display, self->handletop);
 +                    XMapWindow(obt_display, self->handletop);
  
                      if (self->decorations & OB_FRAME_DECOR_GRIPS) {
 -                        XMoveResizeWindow(ob_display, self->handleleft,
 +                        XMoveResizeWindow(obt_display, self->handleleft,
                                            ob_rr_theme->grip_width,
                                            0,
                                            self->bwidth,
                                            ob_rr_theme->handle_height);
 -                        XMoveResizeWindow(ob_display, self->handleright,
 +                        XMoveResizeWindow(obt_display, self->handleright,
                                            self->width -
                                            ob_rr_theme->grip_width -
                                            self->bwidth,
                                            self->bwidth,
                                            ob_rr_theme->handle_height);
  
 -                        XMoveResizeWindow(ob_display, self->lgriptop,
 +                        XMoveResizeWindow(obt_display, self->lgriptop,
                                            sidebwidth,
                                            FRAME_HANDLE_Y(self),
                                            ob_rr_theme->grip_width +
                                            self->bwidth,
                                            self->bwidth);
 -                        XMoveResizeWindow(ob_display, self->rgriptop,
 +                        XMoveResizeWindow(obt_display, self->rgriptop,
                                            self->size.left +
                                            self->client->area.width +
                                            self->size.right - self->bwidth -
                                            self->bwidth,
                                            self->bwidth);
  
 -                        XMapWindow(ob_display, self->handleleft);
 -                        XMapWindow(ob_display, self->handleright);
 -                        XMapWindow(ob_display, self->lgriptop);
 -                        XMapWindow(ob_display, self->rgriptop);
 +                        XMapWindow(obt_display, self->handleleft);
 +                        XMapWindow(obt_display, self->handleright);
 +                        XMapWindow(obt_display, self->lgriptop);
 +                        XMapWindow(obt_display, self->rgriptop);
                      } else {
 -                        XUnmapWindow(ob_display, self->handleleft);
 -                        XUnmapWindow(ob_display, self->handleright);
 -                        XUnmapWindow(ob_display, self->lgriptop);
 -                        XUnmapWindow(ob_display, self->rgriptop);
 +                        XUnmapWindow(obt_display, self->handleleft);
 +                        XUnmapWindow(obt_display, self->handleright);
 +                        XUnmapWindow(obt_display, self->lgriptop);
 +                        XUnmapWindow(obt_display, self->rgriptop);
                      }
                  } else {
 -                    XUnmapWindow(ob_display, self->handleleft);
 -                    XUnmapWindow(ob_display, self->handleright);
 -                    XUnmapWindow(ob_display, self->lgriptop);
 -                    XUnmapWindow(ob_display, self->rgriptop);
 +                    XUnmapWindow(obt_display, self->handleleft);
 +                    XUnmapWindow(obt_display, self->handleright);
 +                    XUnmapWindow(obt_display, self->lgriptop);
 +                    XUnmapWindow(obt_display, self->rgriptop);
  
 -                    XUnmapWindow(ob_display, self->handletop);
 +                    XUnmapWindow(obt_display, self->handletop);
                  }
              } else {
 -                XUnmapWindow(ob_display, self->handleleft);
 -                XUnmapWindow(ob_display, self->handleright);
 -                XUnmapWindow(ob_display, self->lgriptop);
 -                XUnmapWindow(ob_display, self->rgriptop);
 -
 -                XUnmapWindow(ob_display, self->handletop);
 -
 -                XUnmapWindow(ob_display, self->handlebottom);
 -                XUnmapWindow(ob_display, self->lgripleft);
 -                XUnmapWindow(ob_display, self->rgripright);
 -                XUnmapWindow(ob_display, self->lgripbottom);
 -                XUnmapWindow(ob_display, self->rgripbottom);
 +                XUnmapWindow(obt_display, self->handleleft);
 +                XUnmapWindow(obt_display, self->handleright);
 +                XUnmapWindow(obt_display, self->lgriptop);
 +                XUnmapWindow(obt_display, self->rgriptop);
 +
 +                XUnmapWindow(obt_display, self->handletop);
 +
 +                XUnmapWindow(obt_display, self->handlebottom);
 +                XUnmapWindow(obt_display, self->lgripleft);
 +                XUnmapWindow(obt_display, self->rgripright);
 +                XUnmapWindow(obt_display, self->lgripbottom);
 +                XUnmapWindow(obt_display, self->rgripbottom);
              }
  
              if (self->decorations & OB_FRAME_DECOR_HANDLE &&
                  ob_rr_theme->handle_height > 0)
              {
 -                XMoveResizeWindow(ob_display, self->handle,
 +                XMoveResizeWindow(obt_display, self->handle,
                                    sidebwidth,
                                    FRAME_HANDLE_Y(self) + self->bwidth,
                                    self->width, ob_rr_theme->handle_height);
 -                XMapWindow(ob_display, self->handle);
 +                XMapWindow(obt_display, self->handle);
  
                  if (self->decorations & OB_FRAME_DECOR_GRIPS) {
 -                    XMoveResizeWindow(ob_display, self->lgrip,
 +                    XMoveResizeWindow(obt_display, self->lgrip,
                                        0, 0,
                                        ob_rr_theme->grip_width,
                                        ob_rr_theme->handle_height);
 -                    XMoveResizeWindow(ob_display, self->rgrip,
 +                    XMoveResizeWindow(obt_display, self->rgrip,
                                        self->width - ob_rr_theme->grip_width,
                                        0,
                                        ob_rr_theme->grip_width,
                                        ob_rr_theme->handle_height);
  
 -                    XMapWindow(ob_display, self->lgrip);
 -                    XMapWindow(ob_display, self->rgrip);
 +                    XMapWindow(obt_display, self->lgrip);
 +                    XMapWindow(obt_display, self->rgrip);
                  } else {
 -                    XUnmapWindow(ob_display, self->lgrip);
 -                    XUnmapWindow(ob_display, self->rgrip);
 +                    XUnmapWindow(obt_display, self->lgrip);
 +                    XUnmapWindow(obt_display, self->rgrip);
                  }
              } else {
 -                XUnmapWindow(ob_display, self->lgrip);
 -                XUnmapWindow(ob_display, self->rgrip);
 +                XUnmapWindow(obt_display, self->lgrip);
 +                XUnmapWindow(obt_display, self->rgrip);
  
 -                XUnmapWindow(ob_display, self->handle);
 +                XUnmapWindow(obt_display, self->handle);
              }
  
              if (self->bwidth && !self->max_horz &&
                  (self->client->area.height + self->size.top +
                   self->size.bottom) > ob_rr_theme->grip_width * 2)
              {
 -                XMoveResizeWindow(ob_display, self->left,
 +                XMoveResizeWindow(obt_display, self->left,
                                    0,
                                    self->bwidth + ob_rr_theme->grip_width,
                                    self->bwidth,
                                    self->size.top + self->size.bottom -
                                    ob_rr_theme->grip_width * 2);
  
 -                XMapWindow(ob_display, self->left);
 +                XMapWindow(obt_display, self->left);
              } else
 -                XUnmapWindow(ob_display, self->left);
 +                XUnmapWindow(obt_display, self->left);
  
              if (self->bwidth && !self->max_horz &&
                  (self->client->area.height + self->size.top +
                   self->size.bottom) > ob_rr_theme->grip_width * 2)
              {
 -                XMoveResizeWindow(ob_display, self->right,
 +                XMoveResizeWindow(obt_display, self->right,
                                    self->client->area.width + self->cbwidth_l +
                                    self->cbwidth_r + self->bwidth,
                                    self->bwidth + ob_rr_theme->grip_width,
                                    self->size.top + self->size.bottom -
                                    ob_rr_theme->grip_width * 2);
  
 -                XMapWindow(ob_display, self->right);
 +                XMapWindow(obt_display, self->right);
              } else
 -                XUnmapWindow(ob_display, self->right);
 +                XUnmapWindow(obt_display, self->right);
  
 -            XMoveResizeWindow(ob_display, self->backback,
 +            XMoveResizeWindow(obt_display, self->backback,
                                self->size.left, self->size.top,
                                self->client->area.width,
                                self->client->area.height);
                 but don't do this during an iconify animation. it will be
                 reflected afterwards.
              */
 -            XMoveResizeWindow(ob_display, self->window,
 +            XMoveResizeWindow(obt_display, self->window,
                                self->area.x,
                                self->area.y,
                                self->area.width,
             also this correctly positions the client when it maps.
             this also needs to be run when the frame's decorations sizes change!
          */
 -        XMoveWindow(ob_display, self->client->window,
 +        XMoveWindow(obt_display, self->client->window,
                      self->size.left, self->size.top);
  
          if (resized) {
              vals[1] = self->size.right;
              vals[2] = self->size.top;
              vals[3] = self->size.bottom;
 -            PROP_SETA32(self->client->window, net_frame_extents,
 -                        cardinal, vals, 4);
 -            PROP_SETA32(self->client->window, kde_net_wm_frame_strut,
 -                        cardinal, vals, 4);
 +            OBT_PROP_SETA32(self->client->window, NET_FRAME_EXTENTS,
 +                            CARDINAL, vals, 4);
 +            OBT_PROP_SETA32(self->client->window, KDE_NET_WM_FRAME_STRUT,
 +                            CARDINAL, vals, 4);
          }
  
          /* if this occurs while we are focus cycling, the indicator needs to
              focus_cycle_draw_indicator(self->client);
      }
      if (resized && (self->decorations & OB_FRAME_DECOR_TITLEBAR))
 -        XResizeWindow(ob_display, self->label, self->label_width,
 +        XResizeWindow(obt_display, self->label, self->label_width,
                        ob_rr_theme->label_height);
  
  }
@@@ -892,58 -877,58 +875,58 @@@ static void frame_adjust_cursors(ObFram
          /* these ones turn off when max vert, and some when shaded */
          a.cursor = ob_cursor(r && topbot && !sh ?
                               OB_CURSOR_NORTH : OB_CURSOR_NONE);
 -        XChangeWindowAttributes(ob_display, self->topresize, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->titletop, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->topresize, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->titletop, CWCursor, &a);
          a.cursor = ob_cursor(r && topbot ? OB_CURSOR_SOUTH : OB_CURSOR_NONE);
 -        XChangeWindowAttributes(ob_display, self->handle, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->handletop, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->handlebottom, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->innerbottom, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->handle, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->handletop, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->handlebottom, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->innerbottom, CWCursor, &a);
  
          /* these ones change when shaded */
          a.cursor = ob_cursor(r ? (sh ? OB_CURSOR_WEST : OB_CURSOR_NORTHWEST) :
                               OB_CURSOR_NONE);
 -        XChangeWindowAttributes(ob_display, self->titleleft, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->tltresize, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->tllresize, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->titletopleft, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->titleleft, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->tltresize, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->tllresize, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->titletopleft, CWCursor, &a);
          a.cursor = ob_cursor(r ? (sh ? OB_CURSOR_EAST : OB_CURSOR_NORTHEAST) :
                               OB_CURSOR_NONE);
 -        XChangeWindowAttributes(ob_display, self->titleright, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->trtresize, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->trrresize, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->titletopright, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->titleright, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->trtresize, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->trrresize, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->titletopright, CWCursor,&a);
  
          /* these ones are pretty static */
          a.cursor = ob_cursor(r ? OB_CURSOR_WEST : OB_CURSOR_NONE);
 -        XChangeWindowAttributes(ob_display, self->left, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->innerleft, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->left, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->innerleft, CWCursor, &a);
          a.cursor = ob_cursor(r ? OB_CURSOR_EAST : OB_CURSOR_NONE);
 -        XChangeWindowAttributes(ob_display, self->right, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->innerright, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->right, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->innerright, CWCursor, &a);
          a.cursor = ob_cursor(r ? OB_CURSOR_SOUTHWEST : OB_CURSOR_NONE);
 -        XChangeWindowAttributes(ob_display, self->lgrip, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->handleleft, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->lgripleft, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->lgriptop, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->lgripbottom, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->innerbll, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->innerblb, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->lgrip, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->handleleft, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->lgripleft, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->lgriptop, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->lgripbottom, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->innerbll, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->innerblb, CWCursor, &a);
          a.cursor = ob_cursor(r ? OB_CURSOR_SOUTHEAST : OB_CURSOR_NONE);
 -        XChangeWindowAttributes(ob_display, self->rgrip, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->handleright, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->rgripright, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->rgriptop, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->rgripbottom, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->innerbrr, CWCursor, &a);
 -        XChangeWindowAttributes(ob_display, self->innerbrb, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->rgrip, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->handleright, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->rgripright, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->rgriptop, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->rgripbottom, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->innerbrr, CWCursor, &a);
 +        XChangeWindowAttributes(obt_display, self->innerbrb, CWCursor, &a);
      }
  }
  
  void frame_adjust_client_area(ObFrame *self)
  {
      /* adjust the window which is there to prevent flashing on unmap */
 -    XMoveResizeWindow(ob_display, self->backfront, 0, 0,
 +    XMoveResizeWindow(obt_display, self->backfront, 0, 0,
                        self->client->area.width,
                        self->client->area.height);
  }
@@@ -959,7 -944,7 +942,7 @@@ void frame_adjust_focus(ObFrame *self, 
      self->focused = hilite;
      self->need_render = TRUE;
      framerender_frame(self);
 -    XFlush(ob_display);
 +    XFlush(obt_display);
  }
  
  void frame_adjust_title(ObFrame *self)
@@@ -982,7 -967,7 +965,7 @@@ void frame_grab_client(ObFrame *self
      */
  
      /* reparent the client to the frame */
 -    XReparentWindow(ob_display, self->client->window, self->window, 0, 0);
 +    XReparentWindow(obt_display, self->client->window, self->window, 0, 0);
  
      /*
        When reparenting the client window, it is usually not mapped yet, since
  
      /* select the event mask on the client's parent (to receive config/map
         req's) the ButtonPress is to catch clicks on the client border */
 -    XSelectInput(ob_display, self->window, FRAME_EVENTMASK);
 +    XSelectInput(obt_display, self->window, FRAME_EVENTMASK);
  
      /* set all the windows for the frame in the window_map */
 -    g_hash_table_insert(window_map, &self->window, self->client);
 -    g_hash_table_insert(window_map, &self->backback, self->client);
 -    g_hash_table_insert(window_map, &self->backfront, self->client);
 -    g_hash_table_insert(window_map, &self->innerleft, self->client);
 -    g_hash_table_insert(window_map, &self->innertop, self->client);
 -    g_hash_table_insert(window_map, &self->innerright, self->client);
 -    g_hash_table_insert(window_map, &self->innerbottom, self->client);
 -    g_hash_table_insert(window_map, &self->innerblb, self->client);
 -    g_hash_table_insert(window_map, &self->innerbll, self->client);
 -    g_hash_table_insert(window_map, &self->innerbrb, self->client);
 -    g_hash_table_insert(window_map, &self->innerbrr, self->client);
 -    g_hash_table_insert(window_map, &self->title, self->client);
 -    g_hash_table_insert(window_map, &self->label, self->client);
 -    g_hash_table_insert(window_map, &self->max, self->client);
 -    g_hash_table_insert(window_map, &self->close, self->client);
 -    g_hash_table_insert(window_map, &self->desk, self->client);
 -    g_hash_table_insert(window_map, &self->shade, self->client);
 -    g_hash_table_insert(window_map, &self->icon, self->client);
 -    g_hash_table_insert(window_map, &self->iconify, self->client);
 -    g_hash_table_insert(window_map, &self->handle, self->client);
 -    g_hash_table_insert(window_map, &self->lgrip, self->client);
 -    g_hash_table_insert(window_map, &self->rgrip, self->client);
 -    g_hash_table_insert(window_map, &self->topresize, self->client);
 -    g_hash_table_insert(window_map, &self->tltresize, self->client);
 -    g_hash_table_insert(window_map, &self->tllresize, self->client);
 -    g_hash_table_insert(window_map, &self->trtresize, self->client);
 -    g_hash_table_insert(window_map, &self->trrresize, self->client);
 -    g_hash_table_insert(window_map, &self->left, self->client);
 -    g_hash_table_insert(window_map, &self->right, self->client);
 -    g_hash_table_insert(window_map, &self->titleleft, self->client);
 -    g_hash_table_insert(window_map, &self->titletop, self->client);
 -    g_hash_table_insert(window_map, &self->titletopleft, self->client);
 -    g_hash_table_insert(window_map, &self->titletopright, self->client);
 -    g_hash_table_insert(window_map, &self->titleright, self->client);
 -    g_hash_table_insert(window_map, &self->titlebottom, self->client);
 -    g_hash_table_insert(window_map, &self->handleleft, self->client);
 -    g_hash_table_insert(window_map, &self->handletop, self->client);
 -    g_hash_table_insert(window_map, &self->handleright, self->client);
 -    g_hash_table_insert(window_map, &self->handlebottom, self->client);
 -    g_hash_table_insert(window_map, &self->lgripleft, self->client);
 -    g_hash_table_insert(window_map, &self->lgriptop, self->client);
 -    g_hash_table_insert(window_map, &self->lgripbottom, self->client);
 -    g_hash_table_insert(window_map, &self->rgripright, self->client);
 -    g_hash_table_insert(window_map, &self->rgriptop, self->client);
 -    g_hash_table_insert(window_map, &self->rgripbottom, self->client);
 +    window_add(&self->window, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->backback, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->backfront, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->innerleft, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->innertop, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->innerright, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->innerbottom, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->innerblb, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->innerbll, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->innerbrb, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->innerbrr, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->title, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->label, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->max, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->close, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->desk, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->shade, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->icon, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->iconify, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->handle, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->lgrip, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->rgrip, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->topresize, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->tltresize, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->tllresize, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->trtresize, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->trrresize, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->left, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->right, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->titleleft, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->titletop, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->titletopleft, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->titletopright, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->titleright, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->titlebottom, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->handleleft, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->handletop, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->handleright, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->handlebottom, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->lgripleft, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->lgriptop, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->lgripbottom, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->rgripright, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->rgriptop, CLIENT_AS_WINDOW(self->client));
 +    window_add(&self->rgripbottom, CLIENT_AS_WINDOW(self->client));
  }
  
  void frame_release_client(ObFrame *self)
      gboolean reparent = TRUE;
  
      /* if there was any animation going on, kill it */
 -    ob_main_loop_timeout_remove_data(ob_main_loop, frame_animate_iconify,
 -                                     self, FALSE);
 +    obt_main_loop_timeout_remove_data(ob_main_loop, frame_animate_iconify,
 +                                      self, FALSE);
  
      /* check if the app has already reparented its window away */
 -    while (XCheckTypedWindowEvent(ob_display, self->client->window,
 +    while (XCheckTypedWindowEvent(obt_display, self->client->window,
                                    ReparentNotify, &ev))
      {
          /* This check makes sure we don't catch our own reparent action to
          */
          if (ev.xreparent.parent != self->window) {
              reparent = FALSE;
 -            XPutBackEvent(ob_display, &ev);
 +            XPutBackEvent(obt_display, &ev);
              break;
          }
      }
      if (reparent) {
          /* according to the ICCCM - if the client doesn't reparent itself,
             then we will reparent the window to root for them */
 -        XReparentWindow(ob_display, self->client->window,
 -                        RootWindow(ob_display, ob_screen),
 -                        self->client->area.x,
 -                        self->client->area.y);
 +        XReparentWindow(obt_display, self->client->window, obt_root(ob_screen),
 +                        self->client->area.x, self->client->area.y);
      }
  
      /* remove all the windows for the frame from the window_map */
 -    g_hash_table_remove(window_map, &self->window);
 -    g_hash_table_remove(window_map, &self->backback);
 -    g_hash_table_remove(window_map, &self->backfront);
 -    g_hash_table_remove(window_map, &self->innerleft);
 -    g_hash_table_remove(window_map, &self->innertop);
 -    g_hash_table_remove(window_map, &self->innerright);
 -    g_hash_table_remove(window_map, &self->innerbottom);
 -    g_hash_table_remove(window_map, &self->innerblb);
 -    g_hash_table_remove(window_map, &self->innerbll);
 -    g_hash_table_remove(window_map, &self->innerbrb);
 -    g_hash_table_remove(window_map, &self->innerbrr);
 -    g_hash_table_remove(window_map, &self->title);
 -    g_hash_table_remove(window_map, &self->label);
 -    g_hash_table_remove(window_map, &self->max);
 -    g_hash_table_remove(window_map, &self->close);
 -    g_hash_table_remove(window_map, &self->desk);
 -    g_hash_table_remove(window_map, &self->shade);
 -    g_hash_table_remove(window_map, &self->icon);
 -    g_hash_table_remove(window_map, &self->iconify);
 -    g_hash_table_remove(window_map, &self->handle);
 -    g_hash_table_remove(window_map, &self->lgrip);
 -    g_hash_table_remove(window_map, &self->rgrip);
 -    g_hash_table_remove(window_map, &self->topresize);
 -    g_hash_table_remove(window_map, &self->tltresize);
 -    g_hash_table_remove(window_map, &self->tllresize);
 -    g_hash_table_remove(window_map, &self->trtresize);
 -    g_hash_table_remove(window_map, &self->trrresize);
 -    g_hash_table_remove(window_map, &self->left);
 -    g_hash_table_remove(window_map, &self->right);
 -    g_hash_table_remove(window_map, &self->titleleft);
 -    g_hash_table_remove(window_map, &self->titletop);
 -    g_hash_table_remove(window_map, &self->titletopleft);
 -    g_hash_table_remove(window_map, &self->titletopright);
 -    g_hash_table_remove(window_map, &self->titleright);
 -    g_hash_table_remove(window_map, &self->titlebottom);
 -    g_hash_table_remove(window_map, &self->handleleft);
 -    g_hash_table_remove(window_map, &self->handletop);
 -    g_hash_table_remove(window_map, &self->handleright);
 -    g_hash_table_remove(window_map, &self->handlebottom);
 -    g_hash_table_remove(window_map, &self->lgripleft);
 -    g_hash_table_remove(window_map, &self->lgriptop);
 -    g_hash_table_remove(window_map, &self->lgripbottom);
 -    g_hash_table_remove(window_map, &self->rgripright);
 -    g_hash_table_remove(window_map, &self->rgriptop);
 -    g_hash_table_remove(window_map, &self->rgripbottom);
 -
 -    ob_main_loop_timeout_remove_data(ob_main_loop, flash_timeout, self, TRUE);
 +    window_remove(self->window);
 +    window_remove(self->backback);
 +    window_remove(self->backfront);
 +    window_remove(self->innerleft);
 +    window_remove(self->innertop);
 +    window_remove(self->innerright);
 +    window_remove(self->innerbottom);
 +    window_remove(self->innerblb);
 +    window_remove(self->innerbll);
 +    window_remove(self->innerbrb);
 +    window_remove(self->innerbrr);
 +    window_remove(self->title);
 +    window_remove(self->label);
 +    window_remove(self->max);
 +    window_remove(self->close);
 +    window_remove(self->desk);
 +    window_remove(self->shade);
 +    window_remove(self->icon);
 +    window_remove(self->iconify);
 +    window_remove(self->handle);
 +    window_remove(self->lgrip);
 +    window_remove(self->rgrip);
 +    window_remove(self->topresize);
 +    window_remove(self->tltresize);
 +    window_remove(self->tllresize);
 +    window_remove(self->trtresize);
 +    window_remove(self->trrresize);
 +    window_remove(self->left);
 +    window_remove(self->right);
 +    window_remove(self->titleleft);
 +    window_remove(self->titletop);
 +    window_remove(self->titletopleft);
 +    window_remove(self->titletopright);
 +    window_remove(self->titleright);
 +    window_remove(self->titlebottom);
 +    window_remove(self->handleleft);
 +    window_remove(self->handletop);
 +    window_remove(self->handleright);
 +    window_remove(self->handlebottom);
 +    window_remove(self->lgripleft);
 +    window_remove(self->lgriptop);
 +    window_remove(self->lgripbottom);
 +    window_remove(self->rgripright);
 +    window_remove(self->rgriptop);
 +    window_remove(self->rgripbottom);
 +
 +    obt_main_loop_timeout_remove_data(ob_main_loop, flash_timeout, self, TRUE);
  }
  
  /* is there anything present between us and the label? */
@@@ -1252,54 -1239,54 +1235,54 @@@ static void layout_title(ObFrame *self
  
      /* position and map the elements */
      if (self->icon_on) {
 -        XMapWindow(ob_display, self->icon);
 -        XMoveWindow(ob_display, self->icon, self->icon_x,
 +        XMapWindow(obt_display, self->icon);
 +        XMoveWindow(obt_display, self->icon, self->icon_x,
                      ob_rr_theme->paddingy);
      } else
 -        XUnmapWindow(ob_display, self->icon);
 +        XUnmapWindow(obt_display, self->icon);
  
      if (self->desk_on) {
 -        XMapWindow(ob_display, self->desk);
 -        XMoveWindow(ob_display, self->desk, self->desk_x,
 +        XMapWindow(obt_display, self->desk);
 +        XMoveWindow(obt_display, self->desk, self->desk_x,
                      ob_rr_theme->paddingy + 1);
      } else
 -        XUnmapWindow(ob_display, self->desk);
 +        XUnmapWindow(obt_display, self->desk);
  
      if (self->shade_on) {
 -        XMapWindow(ob_display, self->shade);
 -        XMoveWindow(ob_display, self->shade, self->shade_x,
 +        XMapWindow(obt_display, self->shade);
 +        XMoveWindow(obt_display, self->shade, self->shade_x,
                      ob_rr_theme->paddingy + 1);
      } else
 -        XUnmapWindow(ob_display, self->shade);
 +        XUnmapWindow(obt_display, self->shade);
  
      if (self->iconify_on) {
 -        XMapWindow(ob_display, self->iconify);
 -        XMoveWindow(ob_display, self->iconify, self->iconify_x,
 +        XMapWindow(obt_display, self->iconify);
 +        XMoveWindow(obt_display, self->iconify, self->iconify_x,
                      ob_rr_theme->paddingy + 1);
      } else
 -        XUnmapWindow(ob_display, self->iconify);
 +        XUnmapWindow(obt_display, self->iconify);
  
      if (self->max_on) {
 -        XMapWindow(ob_display, self->max);
 -        XMoveWindow(ob_display, self->max, self->max_x,
 +        XMapWindow(obt_display, self->max);
 +        XMoveWindow(obt_display, self->max, self->max_x,
                      ob_rr_theme->paddingy + 1);
      } else
 -        XUnmapWindow(ob_display, self->max);
 +        XUnmapWindow(obt_display, self->max);
  
      if (self->close_on) {
 -        XMapWindow(ob_display, self->close);
 -        XMoveWindow(ob_display, self->close, self->close_x,
 +        XMapWindow(obt_display, self->close);
 +        XMoveWindow(obt_display, self->close, self->close_x,
                      ob_rr_theme->paddingy + 1);
      } else
 -        XUnmapWindow(ob_display, self->close);
 +        XUnmapWindow(obt_display, self->close);
  
      if (self->label_on) {
          self->label_width = MAX(1, self->label_width); /* no lower than 1 */
 -        XMapWindow(ob_display, self->label);
 -        XMoveWindow(ob_display, self->label, self->label_x,
 +        XMapWindow(obt_display, self->label);
 +        XMoveWindow(obt_display, self->label, self->label_x,
                      ob_rr_theme->paddingy);
      } else
 -        XUnmapWindow(ob_display, self->label);
 +        XUnmapWindow(obt_display, self->label);
  }
  
  ObFrameContext frame_context_from_string(const gchar *name)
@@@ -1354,7 -1341,7 +1337,7 @@@ ObFrameContext frame_context(ObClient *
      if (moveresize_in_progress)
          return OB_FRAME_CONTEXT_MOVE_RESIZE;
  
 -    if (win == RootWindow(ob_display, ob_screen))
 +    if (win == obt_root(ob_screen))
          return OB_FRAME_CONTEXT_ROOT ;
      if (client == NULL) return OB_FRAME_CONTEXT_NONE;
      if (win == client->window) {
@@@ -1647,12 -1634,12 +1630,12 @@@ void frame_flash_start(ObFrame *self
      self->flash_on = self->focused;
  
      if (!self->flashing)
 -        ob_main_loop_timeout_add(ob_main_loop,
 -                                 G_USEC_PER_SEC * 0.6,
 -                                 flash_timeout,
 -                                 self,
 -                                 g_direct_equal,
 -                                 flash_done);
 +        obt_main_loop_timeout_add(ob_main_loop,
 +                                  G_USEC_PER_SEC * 0.6,
 +                                  flash_timeout,
 +                                  self,
 +                                  g_direct_equal,
 +                                  flash_done);
      g_get_current_time(&self->flash_end);
      g_time_val_add(&self->flash_end, G_USEC_PER_SEC * 5);
  
@@@ -1741,8 -1728,8 +1724,8 @@@ static gboolean frame_animate_iconify(g
      if (time == 0)
          frame_end_iconify_animation(self);
      else {
 -        XMoveResizeWindow(ob_display, self->window, x, y, w, h);
 -        XFlush(ob_display);
 +        XMoveResizeWindow(obt_display, self->window, x, y, w, h);
 +        XFlush(obt_display);
      }
  
      return time > 0; /* repeat until we're out of time */
@@@ -1754,7 -1741,7 +1737,7 @@@ void frame_end_iconify_animation(ObFram
      if (self->iconify_animation_going == 0) return;
  
      if (!self->visible)
 -        XUnmapWindow(ob_display, self->window);
 +        XUnmapWindow(obt_display, self->window);
      else {
          /* Send a ConfigureNotify when the animation is done, this fixes
             KDE's pager showing the window in the wrong place.  since the
      /* we're not animating any more ! */
      self->iconify_animation_going = 0;
  
 -    XMoveResizeWindow(ob_display, self->window,
 +    XMoveResizeWindow(obt_display, self->window,
                        self->area.x, self->area.y,
                        self->area.width, self->area.height);
      /* we delay re-rendering until after we're done animating */
      framerender_frame(self);
 -    XFlush(ob_display);
 +    XFlush(obt_display);
  }
  
  void frame_begin_iconify_animation(ObFrame *self, gboolean iconifying)
      }
  
      if (new_anim) {
 -        ob_main_loop_timeout_remove_data(ob_main_loop, frame_animate_iconify,
 -                                         self, FALSE);
 -        ob_main_loop_timeout_add(ob_main_loop,
 -                                 FRAME_ANIMATE_ICONIFY_STEP_TIME,
 -                                 frame_animate_iconify, self,
 -                                 g_direct_equal, NULL);
 +        obt_main_loop_timeout_remove_data(ob_main_loop, frame_animate_iconify,
 +                                          self, FALSE);
 +        obt_main_loop_timeout_add(ob_main_loop,
 +                                  FRAME_ANIMATE_ICONIFY_STEP_TIME,
 +                                  frame_animate_iconify, self,
 +                                  g_direct_equal, NULL);
  
          /* do the first step */
          frame_animate_iconify(self);
  
          /* show it during the animation even if it is not "visible" */
          if (!self->visible)
 -            XMapWindow(ob_display, self->window);
 +            XMapWindow(obt_display, self->window);
      }
  }
diff --combined openbox/framerender.c
index 0b2363cd1811e195f06da0cda495a8c4ac3f15e2,e4db2a06e6734812a8cfbcc60c0e038490a4bf80..87706b2b2921d84ea6eb7a3fa35085f16143bb2f
@@@ -49,67 -49,67 +49,67 @@@ void framerender_frame(ObFrame *self
                RrColorPixel(ob_rr_theme->cb_focused_color) :
                RrColorPixel(ob_rr_theme->cb_unfocused_color));
  
 -        XSetWindowBackground(ob_display, self->backback, px);
 -        XClearWindow(ob_display, self->backback);
 -        XSetWindowBackground(ob_display, self->innerleft, px);
 -        XClearWindow(ob_display, self->innerleft);
 -        XSetWindowBackground(ob_display, self->innertop, px);
 -        XClearWindow(ob_display, self->innertop);
 -        XSetWindowBackground(ob_display, self->innerright, px);
 -        XClearWindow(ob_display, self->innerright);
 -        XSetWindowBackground(ob_display, self->innerbottom, px);
 -        XClearWindow(ob_display, self->innerbottom);
 -        XSetWindowBackground(ob_display, self->innerbll, px);
 -        XClearWindow(ob_display, self->innerbll);
 -        XSetWindowBackground(ob_display, self->innerbrr, px);
 -        XClearWindow(ob_display, self->innerbrr);
 -        XSetWindowBackground(ob_display, self->innerblb, px);
 -        XClearWindow(ob_display, self->innerblb);
 -        XSetWindowBackground(ob_display, self->innerbrb, px);
 -        XClearWindow(ob_display, self->innerbrb);
 +        XSetWindowBackground(obt_display, self->backback, px);
 +        XClearWindow(obt_display, self->backback);
 +        XSetWindowBackground(obt_display, self->innerleft, px);
 +        XClearWindow(obt_display, self->innerleft);
 +        XSetWindowBackground(obt_display, self->innertop, px);
 +        XClearWindow(obt_display, self->innertop);
 +        XSetWindowBackground(obt_display, self->innerright, px);
 +        XClearWindow(obt_display, self->innerright);
 +        XSetWindowBackground(obt_display, self->innerbottom, px);
 +        XClearWindow(obt_display, self->innerbottom);
 +        XSetWindowBackground(obt_display, self->innerbll, px);
 +        XClearWindow(obt_display, self->innerbll);
 +        XSetWindowBackground(obt_display, self->innerbrr, px);
 +        XClearWindow(obt_display, self->innerbrr);
 +        XSetWindowBackground(obt_display, self->innerblb, px);
 +        XClearWindow(obt_display, self->innerblb);
 +        XSetWindowBackground(obt_display, self->innerbrb, px);
 +        XClearWindow(obt_display, self->innerbrb);
  
          px = (self->focused ?
                RrColorPixel(ob_rr_theme->frame_focused_border_color) :
                RrColorPixel(ob_rr_theme->frame_unfocused_border_color));
  
 -        XSetWindowBackground(ob_display, self->left, px);
 -        XClearWindow(ob_display, self->left);
 -        XSetWindowBackground(ob_display, self->right, px);
 -        XClearWindow(ob_display, self->right);
 -
 -        XSetWindowBackground(ob_display, self->titleleft, px);
 -        XClearWindow(ob_display, self->titleleft);
 -        XSetWindowBackground(ob_display, self->titletop, px);
 -        XClearWindow(ob_display, self->titletop);
 -        XSetWindowBackground(ob_display, self->titletopleft, px);
 -        XClearWindow(ob_display, self->titletopleft);
 -        XSetWindowBackground(ob_display, self->titletopright, px);
 -        XClearWindow(ob_display, self->titletopright);
 -        XSetWindowBackground(ob_display, self->titleright, px);
 -        XClearWindow(ob_display, self->titleright);
 -
 -        XSetWindowBackground(ob_display, self->handleleft, px);
 -        XClearWindow(ob_display, self->handleleft);
 -        XSetWindowBackground(ob_display, self->handletop, px);
 -        XClearWindow(ob_display, self->handletop);
 -        XSetWindowBackground(ob_display, self->handleright, px);
 -        XClearWindow(ob_display, self->handleright);
 -        XSetWindowBackground(ob_display, self->handlebottom, px);
 -        XClearWindow(ob_display, self->handlebottom);
 -
 -        XSetWindowBackground(ob_display, self->lgripleft, px);
 -        XClearWindow(ob_display, self->lgripleft);
 -        XSetWindowBackground(ob_display, self->lgriptop, px);
 -        XClearWindow(ob_display, self->lgriptop);
 -        XSetWindowBackground(ob_display, self->lgripbottom, px);
 -        XClearWindow(ob_display, self->lgripbottom);
 -
 -        XSetWindowBackground(ob_display, self->rgripright, px);
 -        XClearWindow(ob_display, self->rgripright);
 -        XSetWindowBackground(ob_display, self->rgriptop, px);
 -        XClearWindow(ob_display, self->rgriptop);
 -        XSetWindowBackground(ob_display, self->rgripbottom, px);
 -        XClearWindow(ob_display, self->rgripbottom);
 +        XSetWindowBackground(obt_display, self->left, px);
 +        XClearWindow(obt_display, self->left);
 +        XSetWindowBackground(obt_display, self->right, px);
 +        XClearWindow(obt_display, self->right);
 +
 +        XSetWindowBackground(obt_display, self->titleleft, px);
 +        XClearWindow(obt_display, self->titleleft);
 +        XSetWindowBackground(obt_display, self->titletop, px);
 +        XClearWindow(obt_display, self->titletop);
 +        XSetWindowBackground(obt_display, self->titletopleft, px);
 +        XClearWindow(obt_display, self->titletopleft);
 +        XSetWindowBackground(obt_display, self->titletopright, px);
 +        XClearWindow(obt_display, self->titletopright);
 +        XSetWindowBackground(obt_display, self->titleright, px);
 +        XClearWindow(obt_display, self->titleright);
 +
 +        XSetWindowBackground(obt_display, self->handleleft, px);
 +        XClearWindow(obt_display, self->handleleft);
 +        XSetWindowBackground(obt_display, self->handletop, px);
 +        XClearWindow(obt_display, self->handletop);
 +        XSetWindowBackground(obt_display, self->handleright, px);
 +        XClearWindow(obt_display, self->handleright);
 +        XSetWindowBackground(obt_display, self->handlebottom, px);
 +        XClearWindow(obt_display, self->handlebottom);
 +
 +        XSetWindowBackground(obt_display, self->lgripleft, px);
 +        XClearWindow(obt_display, self->lgripleft);
 +        XSetWindowBackground(obt_display, self->lgriptop, px);
 +        XClearWindow(obt_display, self->lgriptop);
 +        XSetWindowBackground(obt_display, self->lgripbottom, px);
 +        XClearWindow(obt_display, self->lgripbottom);
 +
 +        XSetWindowBackground(obt_display, self->rgripright, px);
 +        XClearWindow(obt_display, self->rgripright);
 +        XSetWindowBackground(obt_display, self->rgriptop, px);
 +        XClearWindow(obt_display, self->rgriptop);
 +        XSetWindowBackground(obt_display, self->rgripbottom, px);
 +        XClearWindow(obt_display, self->rgripbottom);
  
          /* don't use the separator color for shaded windows */
          if (!self->client->shaded)
                    RrColorPixel(ob_rr_theme->title_separator_focused_color) :
                    RrColorPixel(ob_rr_theme->title_separator_unfocused_color));
  
 -        XSetWindowBackground(ob_display, self->titlebottom, px);
 -        XClearWindow(ob_display, self->titlebottom);
 +        XSetWindowBackground(obt_display, self->titlebottom, px);
 +        XClearWindow(obt_display, self->titlebottom);
      }
  
      if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {
          RrAppearance *t, *l, *m, *n, *i, *d, *s, *c, *clear;
          if (self->focused) {
-             t = self->a_focused_title;
-             l = self->a_focused_label;
+             t = ob_rr_theme->a_focused_title;
+             l = ob_rr_theme->a_focused_label;
              m = (!(self->decorations & OB_FRAME_DECOR_MAXIMIZE) ?
                   ob_rr_theme->a_disabled_focused_max :
                   (self->client->max_vert || self->client->max_horz ?
                     (self->max_hover ?
                      ob_rr_theme->a_hover_focused_max :
                      ob_rr_theme->a_focused_unpressed_max))));
-             n = self->a_icon;
+             n = ob_rr_theme->a_icon;
              i = (!(self->decorations & OB_FRAME_DECOR_ICONIFY) ?
                   ob_rr_theme->a_disabled_focused_iconify :
                   (self->iconify_press ?
                     ob_rr_theme->a_hover_focused_close :
                     ob_rr_theme->a_focused_unpressed_close)));
          } else {
-             t = self->a_unfocused_title;
-             l = self->a_unfocused_label;
+             t = ob_rr_theme->a_unfocused_title;
+             l = ob_rr_theme->a_unfocused_label;
              m = (!(self->decorations & OB_FRAME_DECOR_MAXIMIZE) ?
                   ob_rr_theme->a_disabled_unfocused_max :
                   (self->client->max_vert || self->client->max_horz ?
                     (self->max_hover ?
                      ob_rr_theme->a_hover_unfocused_max :
                      ob_rr_theme->a_unfocused_unpressed_max))));
-             n = self->a_icon;
+             n = ob_rr_theme->a_icon;
              i = (!(self->decorations & OB_FRAME_DECOR_ICONIFY) ?
                   ob_rr_theme->a_disabled_unfocused_iconify :
                   (self->iconify_press ?
          RrAppearance *h, *g;
  
          h = (self->focused ?
-              self->a_focused_handle : self->a_unfocused_handle);
+              ob_rr_theme->a_focused_handle : ob_rr_theme->a_unfocused_handle);
  
          RrPaint(h, self->handle, self->width, ob_rr_theme->handle_height);
  
          }
      }
  
 -    XFlush(ob_display);
 +    XFlush(obt_display);
  }
  
  static void framerender_label(ObFrame *self, RrAppearance *a)
diff --combined openbox/menuframe.c
index 83d0e718ce36659da275181df66745d94d74f46c,5ffaaf2fe3ff8fbaa1c8f233463684ed6dea5d53..b48b9280dd8698fd3d1fe190eef2c67b016b161a
@@@ -24,6 -24,7 +24,6 @@@
  #include "actions.h"
  #include "grab.h"
  #include "openbox.h"
 -#include "mainloop.h"
  #include "config.h"
  #include "render/theme.h"
  
@@@ -50,7 -51,7 +50,7 @@@ static void menu_frame_hide(ObMenuFram
  static Window createWindow(Window parent, gulong mask,
                             XSetWindowAttributes *attrib)
  {
 -    return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0,
 +    return XCreateWindow(obt_display, parent, 0, 0, 1, 1, 0,
                           RrDepth(ob_rr_inst), InputOutput,
                           RrVisual(ob_rr_inst), mask, attrib);
  }
@@@ -77,7 -78,7 +77,7 @@@ ObMenuFrame* menu_frame_new(ObMenu *men
      XSetWindowAttributes attr;
  
      self = g_new0(ObMenuFrame, 1);
-     self->type = OB_WINDOW_CLASS_MENUFRAME;
 -    self->type = Window_Menu;
++    self->obwin.type = OB_WINDOW_CLASS_MENUFRAME;
      self->menu = menu;
      self->selected = NULL;
      self->client = client;
      self->show_from = show_from;
  
      attr.event_mask = FRAME_EVENTMASK;
 -    self->window = createWindow(RootWindow(ob_display, ob_screen),
 +    self->window = createWindow(obt_root(ob_screen),
                                  CWEventMask, &attr);
  
 -    XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->mbwidth);
 -    XSetWindowBorder(ob_display, self->window,
 +    XSetWindowBorderWidth(obt_display, self->window, ob_rr_theme->mbwidth);
 +    XSetWindowBorder(obt_display, self->window,
                       RrColorPixel(ob_rr_theme->menu_border_color));
  
-     self->a_title = RrAppearanceCopy(ob_rr_theme->a_menu_title);
      self->a_items = RrAppearanceCopy(ob_rr_theme->a_menu);
  
 -    stacking_add(MENU_AS_WINDOW(self));
 +    window_add(&self->window, MENUFRAME_AS_WINDOW(self));
 +    stacking_add(MENUFRAME_AS_WINDOW(self));
  
      return self;
  }
@@@ -109,13 -108,11 +108,12 @@@ void menu_frame_free(ObMenuFrame *self
              self->entries = g_list_delete_link(self->entries, self->entries);
          }
  
 -        stacking_remove(MENU_AS_WINDOW(self));
 +        stacking_remove(MENUFRAME_AS_WINDOW(self));
 +        window_remove(self->window);
  
-         XDestroyWindow(obt_display, self->window);
          RrAppearanceFree(self->a_items);
-         RrAppearanceFree(self->a_title);
 -        XDestroyWindow(ob_display, self->window);
++        XDestroyWindow(obt_display, self->window);
  
          g_free(self);
      }
@@@ -147,41 -144,8 +145,10 @@@ static ObMenuEntryFrame* menu_entry_fra
          g_hash_table_insert(menu_frame_map, &self->bullet, self);
      }
  
 -    XMapWindow(ob_display, self->window);
 -    XMapWindow(ob_display, self->text);
 +    XMapWindow(obt_display, self->window);
 +    XMapWindow(obt_display, self->text);
 +
-     self->a_normal = RrAppearanceCopy(ob_rr_theme->a_menu_normal);
-     self->a_selected = RrAppearanceCopy(ob_rr_theme->a_menu_selected);
-     self->a_disabled = RrAppearanceCopy(ob_rr_theme->a_menu_disabled);
-     self->a_disabled_selected =
-         RrAppearanceCopy(ob_rr_theme->a_menu_disabled_selected);
-     if (entry->type == OB_MENU_ENTRY_TYPE_SEPARATOR) {
-         self->a_separator = RrAppearanceCopy(ob_rr_theme->a_clear_tex);
-         self->a_separator->texture[0].type = RR_TEXTURE_LINE_ART;
-     } else {
-         self->a_icon = RrAppearanceCopy(ob_rr_theme->a_clear_tex);
-         self->a_icon->texture[0].type = RR_TEXTURE_RGBA;
-         self->a_mask = RrAppearanceCopy(ob_rr_theme->a_clear_tex);
-         self->a_mask->texture[0].type = RR_TEXTURE_MASK;
-         self->a_bullet_normal =
-             RrAppearanceCopy(ob_rr_theme->a_menu_bullet_normal);
-         self->a_bullet_selected =
-             RrAppearanceCopy(ob_rr_theme->a_menu_bullet_selected);
-     }
-     self->a_text_normal =
-         RrAppearanceCopy(ob_rr_theme->a_menu_text_normal);
-     self->a_text_selected =
-         RrAppearanceCopy(ob_rr_theme->a_menu_text_selected);
-     self->a_text_disabled =
-         RrAppearanceCopy(ob_rr_theme->a_menu_text_disabled);
-     self->a_text_disabled_selected =
-         RrAppearanceCopy(ob_rr_theme->a_menu_text_disabled_selected);
-     self->a_text_title =
-         RrAppearanceCopy(ob_rr_theme->a_menu_text_title);
 +    window_add(&self->window, MENUFRAME_AS_WINDOW(self->frame));
  
      return self;
  }
@@@ -191,37 -155,19 +158,21 @@@ static void menu_entry_frame_free(ObMen
      if (self) {
          menu_entry_unref(self->entry);
  
 -        XDestroyWindow(ob_display, self->text);
 -        XDestroyWindow(ob_display, self->window);
 +        window_remove(self->window);
 +
 +        XDestroyWindow(obt_display, self->text);
 +        XDestroyWindow(obt_display, self->window);
          g_hash_table_remove(menu_frame_map, &self->text);
          g_hash_table_remove(menu_frame_map, &self->window);
          if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL) {
 -            XDestroyWindow(ob_display, self->icon);
 +            XDestroyWindow(obt_display, self->icon);
              g_hash_table_remove(menu_frame_map, &self->icon);
          }
          if (self->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) {
 -            XDestroyWindow(ob_display, self->bullet);
 +            XDestroyWindow(obt_display, self->bullet);
              g_hash_table_remove(menu_frame_map, &self->bullet);
          }
  
-         RrAppearanceFree(self->a_normal);
-         RrAppearanceFree(self->a_selected);
-         RrAppearanceFree(self->a_disabled);
-         RrAppearanceFree(self->a_disabled_selected);
-         RrAppearanceFree(self->a_separator);
-         RrAppearanceFree(self->a_icon);
-         RrAppearanceFree(self->a_mask);
-         RrAppearanceFree(self->a_text_normal);
-         RrAppearanceFree(self->a_text_selected);
-         RrAppearanceFree(self->a_text_disabled);
-         RrAppearanceFree(self->a_text_disabled_selected);
-         RrAppearanceFree(self->a_text_title);
-         RrAppearanceFree(self->a_bullet_normal);
-         RrAppearanceFree(self->a_bullet_selected);
          g_free(self);
      }
  }
  void menu_frame_move(ObMenuFrame *self, gint x, gint y)
  {
      RECT_SET_POINT(self->area, x, y);
 -    XMoveWindow(ob_display, self->window, self->area.x, self->area.y);
 +    XMoveWindow(obt_display, self->window, self->area.x, self->area.y);
  }
  
  static void menu_frame_place_topmenu(ObMenuFrame *self, gint *x, gint *y)
@@@ -367,18 -313,20 +318,20 @@@ static void menu_entry_frame_render(ObM
                    !self->entry->data.normal.enabled ?
                    /* disabled */
                    (self == self->frame->selected ?
-                    self->a_disabled_selected : self->a_disabled) :
+                    ob_rr_theme->a_menu_disabled_selected :
+                    ob_rr_theme->a_menu_disabled) :
                    /* enabled */
                    (self == self->frame->selected ?
-                    self->a_selected : self->a_normal));
+                    ob_rr_theme->a_menu_selected :
+                    ob_rr_theme->a_menu_normal));
          th = ITEM_HEIGHT;
          break;
      case OB_MENU_ENTRY_TYPE_SEPARATOR:
          if (self->entry->data.separator.label) {
-             item_a = self->frame->a_title;
+             item_a = ob_rr_theme->a_menu_title;
              th = ob_rr_theme->menu_title_height;
          } else {
-             item_a = self->a_normal;
+             item_a = ob_rr_theme->a_menu_normal;
              th = SEPARATOR_HEIGHT + 2*PADDING;
          }
          break;
          g_assert_not_reached();
      }
      RECT_SET_SIZE(self->area, self->frame->inner_w, th);
 -    XResizeWindow(ob_display, self->window,
 +    XResizeWindow(obt_display, self->window,
                    self->area.width, self->area.height);
      item_a->surface.parent = self->frame->a_items;
      item_a->surface.parentx = self->area.x;
                    !self->entry->data.normal.enabled ?
                    /* disabled */
                    (self == self->frame->selected ?
-                    self->a_text_disabled_selected : self->a_text_disabled) :
+                    ob_rr_theme->a_menu_text_disabled_selected :
+                    ob_rr_theme->a_menu_text_disabled) :
                    /* enabled */
                    (self == self->frame->selected ?
-                    self->a_text_selected : self->a_text_normal));
+                    ob_rr_theme->a_menu_text_selected :
+                    ob_rr_theme->a_menu_text_normal));
          text_a->texture[0].data.text.string = self->entry->data.normal.label;
          if (self->entry->data.normal.shortcut &&
              (self->frame->menu->show_all_shortcuts ||
          break;
      case OB_MENU_ENTRY_TYPE_SUBMENU:
          text_a = (self == self->frame->selected ?
-                   self->a_text_selected :
-                   self->a_text_normal);
+                   ob_rr_theme->a_menu_text_selected :
+                   ob_rr_theme->a_menu_text_normal);
          sub = self->entry->data.submenu.submenu;
          text_a->texture[0].data.text.string = sub ? sub->title : "";
          if (sub->shortcut && (self->frame->menu->show_all_shortcuts ||
          break;
      case OB_MENU_ENTRY_TYPE_SEPARATOR:
          if (self->entry->data.separator.label != NULL)
-             text_a = self->a_text_title;
+             text_a = ob_rr_theme->a_menu_text_title;
          else
-             text_a = self->a_text_normal;
+             text_a = ob_rr_theme->a_menu_text_normal;
          break;
      }
  
      switch (self->entry->type) {
      case OB_MENU_ENTRY_TYPE_NORMAL:
 -        XMoveResizeWindow(ob_display, self->text,
 +        XMoveResizeWindow(obt_display, self->text,
                            self->frame->text_x, PADDING,
                            self->frame->text_w,
                            ITEM_HEIGHT - 2*PADDING);
                  ITEM_HEIGHT - 2*PADDING);
          break;
      case OB_MENU_ENTRY_TYPE_SUBMENU:
 -        XMoveResizeWindow(ob_display, self->text,
 +        XMoveResizeWindow(obt_display, self->text,
                            self->frame->text_x, PADDING,
                            self->frame->text_w - ITEM_HEIGHT,
                            ITEM_HEIGHT - 2*PADDING);
      case OB_MENU_ENTRY_TYPE_SEPARATOR:
          if (self->entry->data.separator.label != NULL) {
              /* labeled separator */
 -            XMoveResizeWindow(ob_display, self->text,
 +            XMoveResizeWindow(obt_display, self->text,
                                ob_rr_theme->paddingx, ob_rr_theme->paddingy,
                                self->area.width - 2*ob_rr_theme->paddingx,
                                ob_rr_theme->menu_title_height -
                      ob_rr_theme->menu_title_height -
                      2*ob_rr_theme->paddingy);
          } else {
+             RrAppearance *clear;
              /* unlabeled separaator */
 -            XMoveResizeWindow(ob_display, self->text, PADDING, PADDING,
 +            XMoveResizeWindow(obt_display, self->text, PADDING, PADDING,
                                self->area.width - 2*PADDING, SEPARATOR_HEIGHT);
-             self->a_separator->surface.parent = item_a;
-             self->a_separator->surface.parentx = PADDING;
-             self->a_separator->surface.parenty = PADDING;
-             self->a_separator->texture[0].data.lineart.color =
+             clear = ob_rr_theme->a_clear_tex;
+             clear->texture[0].type = RR_TEXTURE_LINE_ART;
+             clear->surface.parent = item_a;
+             clear->surface.parentx = PADDING;
+             clear->surface.parenty = PADDING;
+             clear->texture[0].data.lineart.color =
                  text_a->texture[0].data.text.color;
-             self->a_separator->texture[0].data.lineart.x1 = 2*PADDING;
-             self->a_separator->texture[0].data.lineart.y1 = SEPARATOR_HEIGHT/2;
-             self->a_separator->texture[0].data.lineart.x2 =
-                 self->area.width - 4*PADDING;
-             self->a_separator->texture[0].data.lineart.y2 = SEPARATOR_HEIGHT/2;
-             RrPaint(self->a_separator, self->text,
+             clear->texture[0].data.lineart.x1 = 2*PADDING;
+             clear->texture[0].data.lineart.y1 = SEPARATOR_HEIGHT/2;
+             clear->texture[0].data.lineart.x2 = self->area.width - 4*PADDING;
+             clear->texture[0].data.lineart.y2 = SEPARATOR_HEIGHT/2;
+             RrPaint(clear, self->text,
                      self->area.width - 2*PADDING, SEPARATOR_HEIGHT);
          }
          break;
      if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
          self->entry->data.normal.icon_data)
      {
 -        XMoveResizeWindow(ob_display, self->icon,
+         RrAppearance *clear;
 +        XMoveResizeWindow(obt_display, self->icon,
                            PADDING, frame->item_margin.top,
                            ITEM_HEIGHT - frame->item_margin.top
                            - frame->item_margin.bottom,
                            ITEM_HEIGHT - frame->item_margin.top
                            - frame->item_margin.bottom);
-         self->a_icon->texture[0].data.rgba.width =
+         clear = ob_rr_theme->a_clear_tex;
+         clear->texture[0].type = RR_TEXTURE_RGBA;
+         clear->texture[0].data.rgba.width =
              self->entry->data.normal.icon_width;
-         self->a_icon->texture[0].data.rgba.height =
+         clear->texture[0].data.rgba.height =
              self->entry->data.normal.icon_height;
-         self->a_icon->texture[0].data.rgba.alpha =
+         clear->texture[0].data.rgba.alpha =
              self->entry->data.normal.icon_alpha;
-         self->a_icon->texture[0].data.rgba.data =
+         clear->texture[0].data.rgba.data =
              self->entry->data.normal.icon_data;
-         self->a_icon->surface.parent = item_a;
-         self->a_icon->surface.parentx = PADDING;
-         self->a_icon->surface.parenty = frame->item_margin.top;
-         RrPaint(self->a_icon, self->icon,
+         clear->surface.parent = item_a;
+         clear->surface.parentx = PADDING;
+         clear->surface.parenty = frame->item_margin.top;
+         RrPaint(clear, self->icon,
                  ITEM_HEIGHT - frame->item_margin.top
                  - frame->item_margin.bottom,
                  ITEM_HEIGHT - frame->item_margin.top
                  - frame->item_margin.bottom);
 -        XMapWindow(ob_display, self->icon);
 +        XMapWindow(obt_display, self->icon);
      } else if (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
                 self->entry->data.normal.mask)
      {
          RrColor *c;
+         RrAppearance *clear;
  
 -        XMoveResizeWindow(ob_display, self->icon,
 +        XMoveResizeWindow(obt_display, self->icon,
                            PADDING, frame->item_margin.top,
                            ITEM_HEIGHT - frame->item_margin.top
                            - frame->item_margin.bottom,
                            ITEM_HEIGHT - frame->item_margin.top
                            - frame->item_margin.bottom);
-         self->a_mask->texture[0].data.mask.mask =
+         clear = ob_rr_theme->a_clear_tex;
+         clear->texture[0].type = RR_TEXTURE_MASK;
+         clear->texture[0].data.mask.mask =
              self->entry->data.normal.mask;
  
          c = (self->entry->type == OB_MENU_ENTRY_TYPE_NORMAL &&
               (self == self->frame->selected ?
                self->entry->data.normal.mask_selected_color :
                self->entry->data.normal.mask_normal_color));
-         self->a_mask->texture[0].data.mask.color = c;
+         clear->texture[0].data.mask.color = c;
  
-         self->a_mask->surface.parent = item_a;
-         self->a_mask->surface.parentx = PADDING;
-         self->a_mask->surface.parenty = frame->item_margin.top;
-         RrPaint(self->a_mask, self->icon,
+         clear->surface.parent = item_a;
+         clear->surface.parentx = PADDING;
+         clear->surface.parenty = frame->item_margin.top;
+         RrPaint(clear, self->icon,
                  ITEM_HEIGHT - frame->item_margin.top
                  - frame->item_margin.bottom,
                  ITEM_HEIGHT - frame->item_margin.top
                  - frame->item_margin.bottom);
 -        XMapWindow(ob_display, self->icon);
 +        XMapWindow(obt_display, self->icon);
      } else
 -        XUnmapWindow(ob_display, self->icon);
 +        XUnmapWindow(obt_display, self->icon);
  
      if (self->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) {
          RrAppearance *bullet_a;
 -        XMoveResizeWindow(ob_display, self->bullet,
 +        XMoveResizeWindow(obt_display, self->bullet,
                            self->frame->text_x + self->frame->text_w -
                            ITEM_HEIGHT + PADDING, PADDING,
                            ITEM_HEIGHT - 2*PADDING,
                            ITEM_HEIGHT - 2*PADDING);
          bullet_a = (self == self->frame->selected ?
-                     self->a_bullet_selected :
-                     self->a_bullet_normal);
+                     ob_rr_theme->a_menu_bullet_selected :
+                     ob_rr_theme->a_menu_bullet_normal);
          bullet_a->surface.parent = item_a;
          bullet_a->surface.parentx =
              self->frame->text_x + self->frame->text_w - ITEM_HEIGHT + PADDING;
          RrPaint(bullet_a, self->bullet,
                  ITEM_HEIGHT - 2*PADDING,
                  ITEM_HEIGHT - 2*PADDING);
 -        XMapWindow(ob_display, self->bullet);
 +        XMapWindow(obt_display, self->bullet);
      } else
 -        XUnmapWindow(ob_display, self->bullet);
 +        XUnmapWindow(obt_display, self->bullet);
  
 -    XFlush(ob_display);
 +    XFlush(obt_display);
  }
  
  /*! this code is taken from the menu_frame_render. if that changes, this won't
@@@ -645,31 -608,31 +613,31 @@@ void menu_frame_render(ObMenuFrame *sel
          gint l, t, r, b;
  
          e = self->entries->data;
-         e->a_text_normal->texture[0].data.text.string = "";
-         tw = RrMinWidth(e->a_text_normal);
+         ob_rr_theme->a_menu_text_normal->texture[0].data.text.string = "";
+         tw = RrMinWidth(ob_rr_theme->a_menu_text_normal);
          tw += 2*PADDING;
  
          th = ITEM_HEIGHT;
  
-         RrMargins(e->a_normal, &l, &t, &r, &b);
+         RrMargins(ob_rr_theme->a_menu_normal, &l, &t, &r, &b);
          STRUT_SET(self->item_margin,
                    MAX(self->item_margin.left, l),
                    MAX(self->item_margin.top, t),
                    MAX(self->item_margin.right, r),
                    MAX(self->item_margin.bottom, b));
-         RrMargins(e->a_selected, &l, &t, &r, &b);
+         RrMargins(ob_rr_theme->a_menu_selected, &l, &t, &r, &b);
          STRUT_SET(self->item_margin,
                    MAX(self->item_margin.left, l),
                    MAX(self->item_margin.top, t),
                    MAX(self->item_margin.right, r),
                    MAX(self->item_margin.bottom, b));
-         RrMargins(e->a_disabled, &l, &t, &r, &b);
+         RrMargins(ob_rr_theme->a_menu_disabled, &l, &t, &r, &b);
          STRUT_SET(self->item_margin,
                    MAX(self->item_margin.left, l),
                    MAX(self->item_margin.top, t),
                    MAX(self->item_margin.right, r),
                    MAX(self->item_margin.bottom, b));
-         RrMargins(e->a_disabled_selected, &l, &t, &r, &b);
+         RrMargins(ob_rr_theme->a_menu_disabled_selected, &l, &t, &r, &b);
          STRUT_SET(self->item_margin,
                    MAX(self->item_margin.left, l),
                    MAX(self->item_margin.top, t),
          }
  
          RECT_SET_POINT(e->area, 0, h+e->border);
 -        XMoveWindow(ob_display, e->window,
 +        XMoveWindow(obt_display, e->window,
                      e->area.x-e->border, e->area.y-e->border);
 -        XSetWindowBorderWidth(ob_display, e->window, e->border);
 -        XSetWindowBorder(ob_display, e->window,
 +        XSetWindowBorderWidth(obt_display, e->window, e->border);
 +        XSetWindowBorder(obt_display, e->window,
                           RrColorPixel(ob_rr_theme->menu_border_color));
  
  
                    !e->entry->data.normal.enabled ?
                    /* disabled */
                    (e == self->selected ?
-                    e->a_text_disabled_selected : e->a_text_disabled) :
+                    ob_rr_theme->a_menu_text_disabled_selected :
+                    ob_rr_theme->a_menu_text_disabled) :
                    /* enabled */
                    (e == self->selected ?
-                    e->a_text_selected : e->a_text_normal));
+                    ob_rr_theme->a_menu_text_selected : 
+                    ob_rr_theme->a_menu_text_normal));
          switch (e->entry->type) {
          case OB_MENU_ENTRY_TYPE_NORMAL:
              text_a->texture[0].data.text.string = e->entry->data.normal.label;
              break;
          case OB_MENU_ENTRY_TYPE_SEPARATOR:
              if (e->entry->data.separator.label != NULL) {
-                 e->a_text_title->texture[0].data.text.string =
+                 ob_rr_theme->a_menu_text_title->texture[0].data.text.string =
                      e->entry->data.separator.label;
-                 tw = RrMinWidth(e->a_text_title) + 2*ob_rr_theme->paddingx;
+                 tw = RrMinWidth(ob_rr_theme->a_menu_text_title) +
+                     2*ob_rr_theme->paddingx;
                  tw = MIN(tw, MAX_MENU_WIDTH);
                  th = ob_rr_theme->menu_title_height +
                      (ob_rr_theme->mbwidth - PADDING) *2;
      if (!w) w = 10;
      if (!h) h = 3;
  
 -    XResizeWindow(ob_display, self->window, w, h);
 +    XResizeWindow(obt_display, self->window, w, h);
  
      self->inner_w = w;
  
  
      RECT_SET_SIZE(self->area, w, h);
  
 -    XFlush(ob_display);
 +    XFlush(obt_display);
  }
  
  static void menu_frame_update(ObMenuFrame *self)
@@@ -977,7 -943,7 +948,7 @@@ gboolean menu_frame_show_topmenu(ObMenu
  
      menu_frame_move(self, x, y);
  
 -    XMapWindow(ob_display, self->window);
 +    XMapWindow(obt_display, self->window);
  
      if (screen_pointer_pos(&px, &py)) {
          ObMenuEntryFrame *e = menu_entry_frame_under(px, py);
@@@ -1020,7 -986,7 +991,7 @@@ gboolean menu_frame_show_submenu(ObMenu
      }
      menu_frame_move(self, x + dx, y + dy);
  
 -    XMapWindow(ob_display, self->window);
 +    XMapWindow(obt_display, self->window);
  
      if (screen_pointer_pos(&px, &py)) {
          ObMenuEntryFrame *e = menu_entry_frame_under(px, py);
@@@ -1057,7 -1023,7 +1028,7 @@@ static void menu_frame_hide(ObMenuFram
          ungrab_keyboard();
      }
  
 -    XUnmapWindow(ob_display, self->window);
 +    XUnmapWindow(obt_display, self->window);
  
      menu_frame_free(self);
  }
@@@ -1068,8 -1034,8 +1039,8 @@@ void menu_frame_hide_all(void
  
      if (config_submenu_show_delay) {
          /* remove any submenu open requests */
 -        ob_main_loop_timeout_remove(ob_main_loop,
 -                                    menu_entry_frame_submenu_timeout);
 +        obt_main_loop_timeout_remove(ob_main_loop,
 +                                     menu_entry_frame_submenu_timeout);
      }
      if ((it = g_list_last(menu_frame_visible)))
          menu_frame_hide(it->data);
@@@ -1083,8 -1049,8 +1054,8 @@@ void menu_frame_hide_all_client(ObClien
          if (f->client == client) {
              if (config_submenu_show_delay) {
                  /* remove any submenu open requests */
 -                ob_main_loop_timeout_remove(ob_main_loop,
 -                                            menu_entry_frame_submenu_timeout);
 +                obt_main_loop_timeout_remove(ob_main_loop,
 +                                             menu_entry_frame_submenu_timeout);
              }
              menu_frame_hide(f);
          }
@@@ -1150,8 -1116,8 +1121,8 @@@ void menu_frame_select(ObMenuFrame *sel
  
      if (config_submenu_show_delay) {
          /* remove any submenu open requests */
 -        ob_main_loop_timeout_remove(ob_main_loop,
 -                                    menu_entry_frame_submenu_timeout);
 +        obt_main_loop_timeout_remove(ob_main_loop,
 +                                     menu_entry_frame_submenu_timeout);
      }
  
      self->selected = entry;
          if (self->selected->entry->type == OB_MENU_ENTRY_TYPE_SUBMENU) {
              if (config_submenu_show_delay && !immediate) {
                  /* initiate a new submenu open request */
 -                ob_main_loop_timeout_add(ob_main_loop,
 -                                         config_submenu_show_delay * 1000,
 -                                         menu_entry_frame_submenu_timeout,
 -                                         self->selected, g_direct_equal,
 -                                         NULL);
 +                obt_main_loop_timeout_add(ob_main_loop,
 +                                          config_submenu_show_delay * 1000,
 +                                          menu_entry_frame_submenu_timeout,
 +                                          self->selected, g_direct_equal,
 +                                          NULL);
              } else {
                  menu_entry_frame_show_submenu(self->selected);
              }
diff --combined openbox/menuframe.h
index ea1003dedd7c119fe8a05ef673205591a1db0360,1b1dcc703f73eebffffdb03f0a6f9aff0c6ec1bd..daac34d2d2803860be63baa8094a23eba106b8f0
@@@ -38,7 -38,7 +38,7 @@@ extern GList *menu_frame_visible
  struct _ObMenuFrame
  {
      /* stuff to be an ObWindow */
-     ObWindow type;
 -    Window_InternalType type;
++    ObWindow obwin;
      Window window;
  
      struct _ObMenu *menu;
@@@ -71,7 -71,9 +71,9 @@@
  
      gint monitor; /* monitor on which to show the menu in xinerama */
  
-     RrAppearance *a_title;
+     /* We make a copy of this for each menu, so that we don't have to re-render
+        the background of the entire menu each time we render an item inside it.
+     */
      RrAppearance *a_items;
  
      gboolean got_press; /* don't allow a KeyRelease event to run things in the
@@@ -94,22 -96,6 +96,6 @@@ struct _ObMenuEntryFram
      Window icon;
      Window text;
      Window bullet;
-     RrAppearance *a_normal;
-     RrAppearance *a_selected;
-     RrAppearance *a_disabled;
-     RrAppearance *a_disabled_selected;
-     RrAppearance *a_icon;
-     RrAppearance *a_mask;
-     RrAppearance *a_bullet_normal;
-     RrAppearance *a_bullet_selected;
-     RrAppearance *a_separator;
-     RrAppearance *a_text_normal;
-     RrAppearance *a_text_selected;
-     RrAppearance *a_text_disabled;
-     RrAppearance *a_text_disabled_selected;
-     RrAppearance *a_text_title;
  };
  
  extern GHashTable *menu_frame_map;
diff --combined openbox/moveresize.c
index 38963dfc5d8de51769193a841dea4554c8870342,9374f8b5f77930e96eb37828540a2d9daf2181ee..ddc518adbb299d905ffc0f3bde9c12808362e761
  #include "grab.h"
  #include "framerender.h"
  #include "screen.h"
 -#include "prop.h"
  #include "client.h"
  #include "frame.h"
  #include "openbox.h"
  #include "resist.h"
 -#include "mainloop.h"
 -#include "modkeys.h"
  #include "popup.h"
  #include "moveresize.h"
  #include "config.h"
  #include "event.h"
  #include "debug.h"
 -#include "extensions.h"
  #include "render/render.h"
  #include "render/theme.h"
 +#include "obt/display.h"
 +#include "obt/prop.h"
 +#include "obt/keyboard.h"
  
  #include <X11/Xlib.h>
  #include <glib.h>
@@@ -167,8 -168,8 +167,8 @@@ static void popup_coords(ObClient *c, c
  void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr)
  {
      ObCursor cur;
 -    gboolean mv = (cnr == prop_atoms.net_wm_moveresize_move ||
 -                   cnr == prop_atoms.net_wm_moveresize_move_keyboard);
 +    gboolean mv = (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_MOVE) ||
 +                   cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_MOVE_KEYBOARD));
      gint up = 1;
      gint left = 1;
  
            (c->functions & OB_CLIENT_FUNC_RESIZE)))
          return;
  
 -    if (cnr == prop_atoms.net_wm_moveresize_size_topleft) {
 +    if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOPLEFT)) {
          cur = OB_CURSOR_NORTHWEST;
          up = left = -1;
 -    } else if (cnr == prop_atoms.net_wm_moveresize_size_top) {
 +    }
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOP)) {
          cur = OB_CURSOR_NORTH;
          up = -1;
 -    } else if (cnr == prop_atoms.net_wm_moveresize_size_topright) {
 +    }
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOPRIGHT)) {
          cur = OB_CURSOR_NORTHEAST;
          up = -1;
 -    } else if (cnr == prop_atoms.net_wm_moveresize_size_right)
 +    }
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_RIGHT))
          cur = OB_CURSOR_EAST;
 -    else if (cnr == prop_atoms.net_wm_moveresize_size_bottomright)
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT))
          cur = OB_CURSOR_SOUTHEAST;
 -    else if (cnr == prop_atoms.net_wm_moveresize_size_bottom)
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOM))
          cur = OB_CURSOR_SOUTH;
 -    else if (cnr == prop_atoms.net_wm_moveresize_size_bottomleft) {
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT)) {
          cur = OB_CURSOR_SOUTHWEST;
          left = -1;
 -    } else if (cnr == prop_atoms.net_wm_moveresize_size_left) {
 +    }
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_LEFT)) {
          cur = OB_CURSOR_WEST;
          left = -1;
 -    } else if (cnr == prop_atoms.net_wm_moveresize_size_keyboard)
 +    }
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_KEYBOARD))
          cur = OB_CURSOR_SOUTHEAST;
 -    else if (cnr == prop_atoms.net_wm_moveresize_move)
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_MOVE))
          cur = OB_CURSOR_MOVE;
 -    else if (cnr == prop_atoms.net_wm_moveresize_move_keyboard)
 +    else if (cnr == OBT_PROP_ATOM(NET_WM_MOVERESIZE_MOVE_KEYBOARD))
          cur = OB_CURSOR_MOVE;
      else
          g_assert_not_reached();
      moveresize_in_progress = TRUE;
  
  #ifdef SYNC
 -    if (config_resize_redraw && !moving && extensions_sync &&
 +    if (config_resize_redraw && !moving && obt_display_extension_sync &&
-         moveresize_client->sync_request && moveresize_client->sync_counter)
+         moveresize_client->sync_request && moveresize_client->sync_counter &&
+         !moveresize_client->not_responding)
      {
          /* Initialize values for the resize syncing, and create an alarm for
             the client's xsync counter */
  
          /* set the counter to an initial value */
          XSyncIntToValue(&val, 0);
 -        XSyncSetCounter(ob_display, moveresize_client->sync_counter, val);
 +        XSyncSetCounter(obt_display, moveresize_client->sync_counter, val);
  
          /* this will be incremented when we tell the client what we're
             looking for */
          aa.trigger.test_type = XSyncPositiveTransition;
          aa.events = True;
          XSyncIntToValue(&aa.delta, 1);
 -        moveresize_alarm = XSyncCreateAlarm(ob_display,
 +        moveresize_alarm = XSyncCreateAlarm(obt_display,
                                              XSyncCACounter |
                                              XSyncCAValue |
                                              XSyncCAValueType |
@@@ -311,11 -308,11 +312,11 @@@ void moveresize_end(gboolean cancel
  #ifdef SYNC
          /* turn off the alarm */
          if (moveresize_alarm != None) {
 -            XSyncDestroyAlarm(ob_display, moveresize_alarm);
 +            XSyncDestroyAlarm(obt_display, moveresize_alarm);
              moveresize_alarm = None;
          }
  
 -        ob_main_loop_timeout_remove(ob_main_loop, sync_timeout_func);
 +        obt_main_loop_timeout_remove(ob_main_loop, sync_timeout_func);
  #endif
  
          client_configure(moveresize_client,
@@@ -370,8 -367,9 +371,9 @@@ static void do_resize(void
      }
  
  #ifdef SYNC
 -    if (config_resize_redraw && extensions_sync &&
 +    if (config_resize_redraw && obt_display_extension_sync &&
-         moveresize_client->sync_request && moveresize_client->sync_counter)
+         moveresize_client->sync_request && moveresize_client->sync_counter &&
+         !moveresize_client->not_responding)
      {
          XEvent ce;
          XSyncValue val;
  
          /* tell the client what we're waiting for */
          ce.xclient.type = ClientMessage;
 -        ce.xclient.message_type = prop_atoms.wm_protocols;
 -        ce.xclient.display = ob_display;
 +        ce.xclient.message_type = OBT_PROP_ATOM(WM_PROTOCOLS);
 +        ce.xclient.display = obt_display;
          ce.xclient.window = moveresize_client->window;
          ce.xclient.format = 32;
 -        ce.xclient.data.l[0] = prop_atoms.net_wm_sync_request;
 +        ce.xclient.data.l[0] = OBT_PROP_ATOM(NET_WM_SYNC_REQUEST);
          ce.xclient.data.l[1] = event_curtime;
          ce.xclient.data.l[2] = XSyncValueLow32(val);
          ce.xclient.data.l[3] = XSyncValueHigh32(val);
          ce.xclient.data.l[4] = 0l;
 -        XSendEvent(ob_display, moveresize_client->window, FALSE,
 +        XSendEvent(obt_display, moveresize_client->window, FALSE,
                     NoEventMask, &ce);
  
          waiting_for_sync = TRUE;
  
 -        ob_main_loop_timeout_remove(ob_main_loop, sync_timeout_func);
 -        ob_main_loop_timeout_add(ob_main_loop, G_USEC_PER_SEC * 2,
 -                                 sync_timeout_func,
 -                                 NULL, NULL, NULL);
 +        obt_main_loop_timeout_remove(ob_main_loop, sync_timeout_func);
 +        obt_main_loop_timeout_add(ob_main_loop, G_USEC_PER_SEC * 2,
 +                                  sync_timeout_func,
 +                                  NULL, NULL, NULL);
      }
  #endif
  
@@@ -582,10 -580,10 +584,10 @@@ static void do_edge_warp(gint x, gint y
          cancel_edge_warp();
          if (dir != (ObDirection)-1) {
              edge_warp_odd = TRUE; /* switch on the first timeout */
 -            ob_main_loop_timeout_add(ob_main_loop,
 -                                     config_mouse_screenedgetime * 1000,
 -                                     edge_warp_delay_func,
 -                                     NULL, NULL, NULL);
 +            obt_main_loop_timeout_add(ob_main_loop,
 +                                      config_mouse_screenedgetime * 1000,
 +                                      edge_warp_delay_func,
 +                                      NULL, NULL, NULL);
          }
          edge_warp_dir = dir;
      }
  
  static void cancel_edge_warp(void)
  {
 -    ob_main_loop_timeout_remove(ob_main_loop, edge_warp_delay_func);
 +    obt_main_loop_timeout_remove(ob_main_loop, edge_warp_delay_func);
  }
  
  static void move_with_keys(gint keycode, gint state)
      gint dist = 0;
  
      /* shift means jump to edge */
 -    if (state & modkeys_key_to_mask(OB_MODKEY_KEY_SHIFT)) {
 +    if (state & obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SHIFT)) {
          gint x, y;
          ObDirection dir;
  
          dy = y - moveresize_client->area.y;
      } else {
          /* control means fine grained */
 -        if (state & modkeys_key_to_mask(OB_MODKEY_KEY_CONTROL))
 +        if (state &
 +            obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_CONTROL))
 +        {
              dist = 1;
 +        }
          else
              dist = KEY_DIST;
  
      }
  
      screen_pointer_pos(&opx, &opy);
 -    XWarpPointer(ob_display, None, None, 0, 0, 0, 0, dx, dy);
 +    XWarpPointer(obt_display, None, None, 0, 0, 0, 0, dx, dy);
      /* steal the motion events this causes */
 -    XSync(ob_display, FALSE);
 +    XSync(obt_display, FALSE);
      {
          XEvent ce;
 -        while (XCheckTypedEvent(ob_display, MotionNotify, &ce));
 +        while (XCheckTypedEvent(obt_display, MotionNotify, &ce));
      }
      screen_pointer_pos(&px, &py);
  
@@@ -706,7 -701,7 +708,7 @@@ static void resize_with_keys(gint keyco
      }
  
      /* shift means jump to edge */
 -    if (state & modkeys_key_to_mask(OB_MODKEY_KEY_SHIFT)) {
 +    if (state & obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SHIFT)) {
          gint x, y, w, h;
  
          if (keycode == ob_keycode(OB_KEY_RIGHT))
              distw = moveresize_client->size_inc.width;
              resist = 1;
          }
 -        else if (state & modkeys_key_to_mask(OB_MODKEY_KEY_CONTROL)) {
 +        else if (state &
 +                 obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_CONTROL))
 +        {
              distw = 1;
              resist = 1;
          }
              disth = moveresize_client->size_inc.height;
              resist = 1;
          }
 -        else if (state & modkeys_key_to_mask(OB_MODKEY_KEY_CONTROL)) {
 +        else if (state &
 +                 obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_CONTROL))
 +        {
              disth = 1;
              resist = 1;
          }
          pdy = dh;
  
      screen_pointer_pos(&opx, &opy);
 -    XWarpPointer(ob_display, None, None, 0, 0, 0, 0, pdx, pdy);
 +    XWarpPointer(obt_display, None, None, 0, 0, 0, 0, pdx, pdy);
      /* steal the motion events this causes */
 -    XSync(ob_display, FALSE);
 +    XSync(obt_display, FALSE);
      {
          XEvent ce;
 -        while (XCheckTypedEvent(ob_display, MotionNotify, &ce));
 +        while (XCheckTypedEvent(obt_display, MotionNotify, &ce));
      }
      screen_pointer_pos(&px, &py);
  
@@@ -849,44 -840,41 +851,44 @@@ gboolean moveresize_event(XEvent *e
              gint dw, dh;
              ObDirection dir;
  
 -            if (corner == prop_atoms.net_wm_moveresize_size_topleft) {
 +            if (corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOPLEFT)) {
                  dw = -(e->xmotion.x_root - start_x);
                  dh = -(e->xmotion.y_root - start_y);
                  dir = OB_DIRECTION_NORTHWEST;
 -            } else if (corner == prop_atoms.net_wm_moveresize_size_top) {
 +            } else if (corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOP)) {
                  dw = 0;
                  dh = -(e->xmotion.y_root - start_y);
                  dir = OB_DIRECTION_NORTH;
 -            } else if (corner == prop_atoms.net_wm_moveresize_size_topright) {
 +            } else if (corner ==
 +                       OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOPRIGHT)) {
                  dw = (e->xmotion.x_root - start_x);
                  dh = -(e->xmotion.y_root - start_y);
                  dir = OB_DIRECTION_NORTHEAST;
 -            } else if (corner == prop_atoms.net_wm_moveresize_size_right) {
 +            } else if (corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_RIGHT)) {
                  dw = (e->xmotion.x_root - start_x);
                  dh = 0;
                  dir = OB_DIRECTION_EAST;
              } else if (corner ==
 -                       prop_atoms.net_wm_moveresize_size_bottomright) {
 +                       OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT)) {
                  dw = (e->xmotion.x_root - start_x);
                  dh = (e->xmotion.y_root - start_y);
                  dir = OB_DIRECTION_SOUTHEAST;
 -            } else if (corner == prop_atoms.net_wm_moveresize_size_bottom) {
 +            } else if (corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOM))
 +            {
                  dw = 0;
                  dh = (e->xmotion.y_root - start_y);
                  dir = OB_DIRECTION_SOUTH;
              } else if (corner ==
 -                       prop_atoms.net_wm_moveresize_size_bottomleft) {
 +                       OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT)) {
                  dw = -(e->xmotion.x_root - start_x);
                  dh = (e->xmotion.y_root - start_y);
                  dir = OB_DIRECTION_SOUTHWEST;
 -            } else if (corner == prop_atoms.net_wm_moveresize_size_left) {
 +            } else if (corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_LEFT)) {
                  dw = -(e->xmotion.x_root - start_x);
                  dh = 0;
                  dir = OB_DIRECTION_WEST;
 -            } else if (corner == prop_atoms.net_wm_moveresize_size_keyboard) {
 +            } else if (corner ==
 +                       OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_KEYBOARD)) {
                  dw = (e->xmotion.x_root - start_x);
                  dh = (e->xmotion.y_root - start_y);
                  dir = OB_DIRECTION_SOUTHEAST;
              cur_w += dw;
              cur_h += dh;
  
 -            if (corner == prop_atoms.net_wm_moveresize_size_topleft ||
 -                corner == prop_atoms.net_wm_moveresize_size_left ||
 -                corner == prop_atoms.net_wm_moveresize_size_bottomleft)
 +            if (corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOPLEFT) ||
 +                corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_LEFT) ||
 +                corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT))
              {
                  cur_x -= dw;
              }
 -            if (corner == prop_atoms.net_wm_moveresize_size_topleft ||
 -                corner == prop_atoms.net_wm_moveresize_size_top ||
 -                corner == prop_atoms.net_wm_moveresize_size_topright)
 +            if (corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOPLEFT) ||
 +                corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOP) ||
 +                corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_TOPRIGHT))
              {
                  cur_y -= dh;
              }
                     e->xkey.keycode == ob_keycode(OB_KEY_DOWN) ||
                     e->xkey.keycode == ob_keycode(OB_KEY_UP))
          {
 -            if (corner == prop_atoms.net_wm_moveresize_size_keyboard) {
 +            if (corner == OBT_PROP_ATOM(NET_WM_MOVERESIZE_SIZE_KEYBOARD)) {
                  resize_with_keys(e->xkey.keycode, e->xkey.state);
                  used = TRUE;
 -            } else if (corner == prop_atoms.net_wm_moveresize_move_keyboard) {
 +            } else if (corner ==
 +                       OBT_PROP_ATOM(NET_WM_MOVERESIZE_MOVE_KEYBOARD))
 +            {
                  move_with_keys(e->xkey.keycode, e->xkey.state);
                  used = TRUE;
              }
          }
      }
  #ifdef SYNC
 -    else if (e->type == extensions_sync_event_basep + XSyncAlarmNotify)
 +    else if (e->type == obt_display_extension_sync_basep + XSyncAlarmNotify)
      {
          waiting_for_sync = FALSE; /* we got our sync... */
          do_resize(); /* ...so try resize if there is more change pending */
diff --combined openbox/openbox.c
index 6a58cca6e5b667825dfd43c51fc25ef0aa5930f7,18c34d2f9c47427ba67e6753f986a9ddc41006b8..9ec47bc09d2b86ade7a646d8b06dd6ba3656bc71
  #include "openbox.h"
  #include "session.h"
  #include "dock.h"
 -#include "modkeys.h"
  #include "event.h"
  #include "menu.h"
  #include "client.h"
 -#include "xerror.h"
 -#include "prop.h"
  #include "screen.h"
  #include "actions.h"
  #include "startupnotify.h"
  #include "focus_cycle_popup.h"
  #include "moveresize.h"
  #include "frame.h"
+ #include "framerender.h"
  #include "keyboard.h"
  #include "mouse.h"
 -#include "extensions.h"
  #include "menuframe.h"
  #include "grab.h"
  #include "group.h"
  #include "config.h"
  #include "ping.h"
 -#include "mainloop.h"
  #include "gettext.h"
 -#include "parser/parse.h"
  #include "render/render.h"
  #include "render/theme.h"
 +#include "obt/display.h"
 +#include "obt/prop.h"
 +#include "obt/keyboard.h"
 +#include "obt/parse.h"
  
  #ifdef HAVE_FCNTL_H
  #  include <fcntl.h>
  #include <X11/Xlib.h>
  #include <X11/keysym.h>
  
 -
 -RrInstance *ob_rr_inst;
 -RrTheme    *ob_rr_theme;
 -ObMainLoop *ob_main_loop;
 -Display    *ob_display;
 -gint        ob_screen;
 -gboolean    ob_replace_wm = FALSE;
 -gboolean    ob_sm_use = TRUE;
 -gchar      *ob_sm_id = NULL;
 -gchar      *ob_sm_save_file = NULL;
 -gboolean    ob_sm_restore = TRUE;
 -gboolean    ob_debug_xinerama = FALSE;
 +RrInstance  *ob_rr_inst;
 +RrTheme     *ob_rr_theme;
 +ObtMainLoop *ob_main_loop;
 +gint         ob_screen;
 +gboolean     ob_replace_wm = FALSE;
 +gboolean     ob_sm_use = TRUE;
 +gchar       *ob_sm_id = NULL;
 +gchar       *ob_sm_save_file = NULL;
 +gboolean     ob_sm_restore = TRUE;
 +gboolean     ob_debug_xinerama = FALSE;
  
  static ObState   state;
  static gboolean  xsync = FALSE;
@@@ -134,40 -139,49 +135,40 @@@ gint main(gint argc, gchar **argv
      program_name = g_path_get_basename(argv[0]);
      g_set_prgname(program_name);
  
 -    if (!remote_control) {
 -        parse_paths_startup();
 -
 +    if (!remote_control)
          session_startup(argc, argv);
 -    }
  
 -
 -    ob_display = XOpenDisplay(NULL);
 -    if (ob_display == NULL)
 +    if (!obt_display_open(NULL))
          ob_exit_with_error(_("Failed to open the display from the DISPLAY environment variable."));
 -    if (fcntl(ConnectionNumber(ob_display), F_SETFD, 1) == -1)
 -        ob_exit_with_error("Failed to set display as close-on-exec");
  
      if (remote_control) {
 -        prop_startup();
 -
          /* Send client message telling the OB process to:
           * remote_control = 1 -> reconfigure
           * remote_control = 2 -> restart */
 -        PROP_MSG(RootWindow(ob_display, ob_screen),
 -                 ob_control, remote_control, 0, 0, 0);
 -        XCloseDisplay(ob_display);
 +        OBT_PROP_MSG(ob_screen, obt_root(ob_screen),
 +                     OB_CONTROL, remote_control, 0, 0, 0, 0);
 +        obt_display_close(obt_display);
          exit(EXIT_SUCCESS);
      }
  
 -    ob_main_loop = ob_main_loop_new(ob_display);
 +    ob_main_loop = obt_main_loop_new();
  
      /* set up signal handler */
 -    ob_main_loop_signal_add(ob_main_loop, SIGUSR1, signal_handler, NULL, NULL);
 -    ob_main_loop_signal_add(ob_main_loop, SIGUSR2, signal_handler, NULL, NULL);
 -    ob_main_loop_signal_add(ob_main_loop, SIGTERM, signal_handler, NULL, NULL);
 -    ob_main_loop_signal_add(ob_main_loop, SIGINT, signal_handler, NULL, NULL);
 -    ob_main_loop_signal_add(ob_main_loop, SIGHUP, signal_handler, NULL, NULL);
 -    ob_main_loop_signal_add(ob_main_loop, SIGPIPE, signal_handler, NULL, NULL);
 -    ob_main_loop_signal_add(ob_main_loop, SIGCHLD, signal_handler, NULL, NULL);
 +    obt_main_loop_signal_add(ob_main_loop, SIGUSR1, signal_handler, NULL,NULL);
 +    obt_main_loop_signal_add(ob_main_loop, SIGUSR2, signal_handler, NULL,NULL);
 +    obt_main_loop_signal_add(ob_main_loop, SIGTERM, signal_handler, NULL,NULL);
 +    obt_main_loop_signal_add(ob_main_loop, SIGINT, signal_handler,  NULL,NULL);
 +    obt_main_loop_signal_add(ob_main_loop, SIGHUP, signal_handler,  NULL,NULL);
 +    obt_main_loop_signal_add(ob_main_loop, SIGPIPE, signal_handler, NULL,NULL);
 +    obt_main_loop_signal_add(ob_main_loop, SIGCHLD, signal_handler, NULL,NULL);
  
 -    ob_screen = DefaultScreen(ob_display);
 +    ob_screen = DefaultScreen(obt_display);
  
 -    ob_rr_inst = RrInstanceNew(ob_display, ob_screen);
 +    ob_rr_inst = RrInstanceNew(obt_display, ob_screen);
      if (ob_rr_inst == NULL)
          ob_exit_with_error(_("Failed to initialize the obrender library."));
  
 -    XSynchronize(ob_display, xsync);
 +    XSynchronize(obt_display, xsync);
  
      /* check for locale support */
      if (!XSupportsLocale())
      if (!XSetLocaleModifiers(""))
          g_message(_("Cannot set locale modifiers for the X server."));
  
 -    /* set our error handler */
 -    XSetErrorHandler(xerror_handler);
 -
      /* set the DISPLAY environment variable for any lauched children, to the
         display we're using, so they open in the right place. */
-     putenv(g_strdup_printf("DISPLAY=%s", DisplayString(obt_display)));
 -    setenv("DISPLAY", DisplayString(ob_display), TRUE);
++    setenv("DISPLAY", DisplayString(obt_display), TRUE);
  
      /* create available cursors */
      cursors[OB_CURSOR_NONE] = None;
      cursors[OB_CURSOR_NORTHWEST] = load_cursor("top_left_corner",
                                                 XC_top_left_corner);
  
 -
 -    prop_startup(); /* get atoms values for the display */
 -    extensions_query_all(); /* find which extensions are present */
 -
      if (screen_annex()) { /* it will be ours! */
          do {
 -            modkeys_startup(reconfigure);
 +            if (reconfigure) obt_keyboard_reload();
  
              /* get the keycodes for keys we use */
 -            keys[OB_KEY_RETURN] = modkeys_sym_to_code(XK_Return);
 -            keys[OB_KEY_ESCAPE] = modkeys_sym_to_code(XK_Escape);
 -            keys[OB_KEY_LEFT] = modkeys_sym_to_code(XK_Left);
 -            keys[OB_KEY_RIGHT] = modkeys_sym_to_code(XK_Right);
 -            keys[OB_KEY_UP] = modkeys_sym_to_code(XK_Up);
 -            keys[OB_KEY_DOWN] = modkeys_sym_to_code(XK_Down);
 +            keys[OB_KEY_RETURN] = obt_keyboard_keysym_to_keycode(XK_Return);
 +            keys[OB_KEY_ESCAPE] = obt_keyboard_keysym_to_keycode(XK_Escape);
 +            keys[OB_KEY_LEFT] = obt_keyboard_keysym_to_keycode(XK_Left);
 +            keys[OB_KEY_RIGHT] = obt_keyboard_keysym_to_keycode(XK_Right);
 +            keys[OB_KEY_UP] = obt_keyboard_keysym_to_keycode(XK_Up);
 +            keys[OB_KEY_DOWN] = obt_keyboard_keysym_to_keycode(XK_Down);
  
              {
 -                ObParseInst *i;
 -                xmlDocPtr doc;
 -                xmlNodePtr node;
 +                ObtParseInst *i;
  
                  /* startup the parsing so everything can register sections
                     of the rc */
 -                i = parse_startup();
 +                i = obt_parse_instance_new();
  
                  /* register all the available actions */
                  actions_startup(reconfigure);
                  config_startup(i);
  
                  /* parse/load user options */
 -                if (parse_load_rc(NULL, &doc, &node)) {
 -                    parse_tree(i, doc, node->xmlChildrenNode);
 -                    parse_close(doc);
 +                if (obt_parse_load_config_file(i, "openbox", "rc.xml",
 +                                               "openbox_config"))
 +                {
 +                    obt_parse_tree_from_root(i);
 +                    obt_parse_close(i);
                  } else
                      g_message(_("Unable to find a valid config file, using some simple defaults"));
  
  /*
                  if (config_type != NULL)
 -                    PROP_SETS(RootWindow(ob_display, ob_screen),
 -                              ob_config, config_type);
 +                    PROP_SETS(obt_root(ob_screen), ob_config, config_type);
  */
  
                  /* we're done with parsing now, kill it */
 -                parse_shutdown(i);
 +                obt_parse_instance_unref(i);
              }
  
              /* load the theme specified in the rc file */
                  if (ob_rr_theme == NULL)
                      ob_exit_with_error(_("Unable to load a theme."));
  
 -                PROP_SETS(RootWindow(ob_display, ob_screen),
 -                          ob_theme, ob_rr_theme->name);
 +                OBT_PROP_SETS(obt_root(ob_screen),
 +                              OB_THEME, utf8, ob_rr_theme->name);
              }
  
              if (reconfigure) {
                  focus_nothing();
  
                  /* focus what was focused if a wm was already running */
 -                if (PROP_GET32(RootWindow(ob_display, ob_screen),
 -                               net_active_window, window, &xid) &&
 -                    (w = g_hash_table_lookup(window_map, &xid)) &&
 -                    WINDOW_IS_CLIENT(w))
 +                if (OBT_PROP_GET32(obt_root(ob_screen),
 +                                   NET_ACTIVE_WINDOW, WINDOW, &xid) &&
 +                    (w = window_find(xid)) && WINDOW_IS_CLIENT(w))
                  {
                      client_focus(WINDOW_AS_CLIENT(w));
                  }
              reconfigure = FALSE;
  
              state = OB_STATE_RUNNING;
 -            ob_main_loop_run(ob_main_loop);
 +            obt_main_loop_run(ob_main_loop);
              state = OB_STATE_EXITING;
  
              if (!reconfigure) {
              event_shutdown(reconfigure);
              config_shutdown();
              actions_shutdown(reconfigure);
 -            modkeys_shutdown(reconfigure);
          } while (reconfigure);
      }
  
 -    XSync(ob_display, FALSE);
 +    XSync(obt_display, FALSE);
  
      RrThemeFree(ob_rr_theme);
      RrInstanceFree(ob_rr_inst);
  
      session_shutdown(being_replaced);
  
 -    XCloseDisplay(ob_display);
 -
 -    parse_paths_shutdown();
 +    obt_display_close(obt_display);
  
      if (restart) {
          if (restart_path != NULL) {
@@@ -490,9 -516,7 +491,7 @@@ static void remove_args(gint *argc, gch
  static void parse_env()
  {
      /* unset this so we don't pass it on unknowingly */
-     gchar *s = g_strdup("DESKTOP_STARTUP_ID");
-     putenv(s);
-     g_free(s);
+     unsetenv("DESKTOP_STARTUP_ID");
  }
  
  static void parse_args(gint *argc, gchar **argv)
@@@ -587,10 -611,10 +586,10 @@@ static Cursor load_cursor(const gchar *
      Cursor c = None;
  
  #if USE_XCURSOR
 -    c = XcursorLibraryLoadCursor(ob_display, name);
 +    c = XcursorLibraryLoadCursor(obt_display, name);
  #endif
      if (c == None)
 -        c = XCreateFontCursor(ob_display, fontval);
 +        c = XCreateFontCursor(obt_display, fontval);
      return c;
  }
  
@@@ -622,14 -646,14 +621,14 @@@ void ob_reconfigure(
  void ob_exit(gint code)
  {
      exitcode = code;
 -    ob_main_loop_exit(ob_main_loop);
 +    obt_main_loop_exit(ob_main_loop);
  }
  
  void ob_exit_replace()
  {
      exitcode = 0;
      being_replaced = TRUE;
 -    ob_main_loop_exit(ob_main_loop);
 +    obt_main_loop_exit(ob_main_loop);
  }
  
  Cursor ob_cursor(ObCursor cursor)
diff --combined openbox/popup.c
index 8176b6bf4e166512081b8d2b345e73bafd4510a4,15d1bf52bed291cb342b3ffee40263003e407468..02c87848675c3b30fe5f455d716c1a48510b0797
@@@ -25,6 -25,7 +25,6 @@@
  #include "stacking.h"
  #include "event.h"
  #include "screen.h"
 -#include "mainloop.h"
  #include "render/render.h"
  #include "render/theme.h"
  
@@@ -33,7 -34,7 +33,7 @@@ ObPopup *popup_new(void
      XSetWindowAttributes attrib;
      ObPopup *self = g_new0(ObPopup, 1);
  
 -    self->obwin.type = Window_Internal;
 +    self->obwin.type = OB_WINDOW_CLASS_INTERNAL;
      self->gravity = NorthWestGravity;
      self->x = self->y = self->textw = self->h = 0;
      self->a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
      self->iconwm = self->iconhm = 1;
  
      attrib.override_redirect = True;
 -    self->bg = XCreateWindow(ob_display, RootWindow(ob_display, ob_screen),
 +    self->bg = XCreateWindow(obt_display, obt_root(ob_screen),
                               0, 0, 1, 1, 0, RrDepth(ob_rr_inst),
                               InputOutput, RrVisual(ob_rr_inst),
                               CWOverrideRedirect, &attrib);
  
 -    self->text = XCreateWindow(ob_display, self->bg,
 +    self->text = XCreateWindow(obt_display, self->bg,
                                 0, 0, 1, 1, 0, RrDepth(ob_rr_inst),
                                 InputOutput, RrVisual(ob_rr_inst), 0, NULL);
  
 -    XSetWindowBorderWidth(ob_display, self->bg, ob_rr_theme->obwidth);
 -    XSetWindowBorder(ob_display, self->bg,
 +    XSetWindowBorderWidth(obt_display, self->bg, ob_rr_theme->obwidth);
 +    XSetWindowBorder(obt_display, self->bg,
                       RrColorPixel(ob_rr_theme->osd_border_color));
  
 -    XMapWindow(ob_display, self->text);
 +    XMapWindow(obt_display, self->text);
  
      stacking_add(INTERNAL_AS_WINDOW(self));
 -    g_hash_table_insert(window_map, &self->bg, self);
 +    window_add(&self->bg, INTERNAL_AS_WINDOW(self));
      return self;
  }
  
  void popup_free(ObPopup *self)
  {
      if (self) {
 -        XDestroyWindow(ob_display, self->bg);
 -        XDestroyWindow(ob_display, self->text);
 +        XDestroyWindow(obt_display, self->bg);
 +        XDestroyWindow(obt_display, self->text);
          RrAppearanceFree(self->a_bg);
          RrAppearanceFree(self->a_text);
 -        g_hash_table_remove(window_map, &self->bg);
 +        window_remove(self->bg);
          stacking_remove(self);
          g_free(self);
      }
@@@ -140,7 -141,7 +140,7 @@@ static gboolean popup_show_timeout(gpoi
  {
      ObPopup *self = data;
  
 -    XMapWindow(ob_display, self->bg);
 +    XMapWindow(obt_display, self->bg);
      stacking_raise(INTERNAL_AS_WINDOW(self));
      self->mapped = TRUE;
      self->delay_mapped = FALSE;
@@@ -256,6 -257,8 +256,8 @@@ void popup_delay_show(ObPopup *self, gu
      x=MAX(MIN(x, area->x+area->width-w),area->x);
      y=MAX(MIN(y, area->y+area->height-h),area->y);
  
+     g_free(area);
      if (m == screen_num_monitors) {
          RECT_SET(mon, x, y, w, h);
          m = screen_find_monitor(&mon);
  
          x=MAX(MIN(x, area->x+area->width-w),area->x);
          y=MAX(MIN(y, area->y+area->height-h),area->y);
+         g_free(area);
      }
  
      /* set the windows/appearances up */
 -    XMoveResizeWindow(ob_display, self->bg, x, y, w, h);
 +    XMoveResizeWindow(obt_display, self->bg, x, y, w, h);
      /* when there is no icon and the text is not parent relative, then
         fill the whole dialog with the text appearance, don't use the bg at all
      */
          self->a_text->surface.parent = self->a_bg;
          self->a_text->surface.parentx = textx;
          self->a_text->surface.parenty = texty;
 -        XMoveResizeWindow(ob_display, self->text, textx, texty, textw, texth);
 +        XMoveResizeWindow(obt_display, self->text, textx, texty, textw, texth);
          RrPaint(self->a_text, self->text, textw, texth);
      }
  
          if (usec) {
              /* don't kill previous show timers */
              if (!self->delay_mapped) {
 -                ob_main_loop_timeout_add(ob_main_loop, usec,
 -                                         popup_show_timeout, self,
 -                                         g_direct_equal, NULL);
 +                obt_main_loop_timeout_add(ob_main_loop, usec,
 +                                          popup_show_timeout, self,
 +                                          g_direct_equal, NULL);
                  self->delay_mapped = TRUE;
              }
          } else {
              popup_show_timeout(self);
          }
      }
-     g_free(area);
  }
  
  void popup_hide(ObPopup *self)
          /* kill enter events cause by this unmapping */
          ignore_start = event_start_ignore_all_enters();
  
 -        XUnmapWindow(ob_display, self->bg);
 +        XUnmapWindow(obt_display, self->bg);
          self->mapped = FALSE;
  
          event_end_ignore_all_enters(ignore_start);
      } else if (self->delay_mapped) {
 -        ob_main_loop_timeout_remove(ob_main_loop, popup_show_timeout);
 +        obt_main_loop_timeout_remove(ob_main_loop, popup_show_timeout);
          self->delay_mapped = FALSE;
      }
  }
@@@ -329,7 -332,7 +331,7 @@@ static void icon_popup_draw_icon(gint x
      self->a_icon->surface.parent = self->popup->a_bg;
      self->a_icon->surface.parentx = x;
      self->a_icon->surface.parenty = y;
 -    XMoveResizeWindow(ob_display, self->icon, x, y, w, h);
 +    XMoveResizeWindow(obt_display, self->icon, x, y, w, h);
      RrPaint(self->a_icon, self->icon, w, h);
  }
  
@@@ -340,11 -343,11 +342,11 @@@ ObIconPopup *icon_popup_new(void
      self = g_new0(ObIconPopup, 1);
      self->popup = popup_new();
      self->a_icon = RrAppearanceCopy(ob_rr_theme->a_clear_tex);
 -    self->icon = XCreateWindow(ob_display, self->popup->bg,
 +    self->icon = XCreateWindow(obt_display, self->popup->bg,
                                 0, 0, 1, 1, 0,
                                 RrDepth(ob_rr_inst), InputOutput,
                                 RrVisual(ob_rr_inst), 0, NULL);
 -    XMapWindow(ob_display, self->icon);
 +    XMapWindow(obt_display, self->icon);
  
      self->popup->hasicon = TRUE;
      self->popup->draw_icon = icon_popup_draw_icon;
  void icon_popup_free(ObIconPopup *self)
  {
      if (self) {
 -        XDestroyWindow(ob_display, self->icon);
 +        XDestroyWindow(obt_display, self->icon);
          RrAppearanceFree(self->a_icon);
          popup_free(self->popup);
          g_free(self);
@@@ -481,7 -484,7 +483,7 @@@ static void pager_popup_draw_icon(gint 
                  a->surface.parent = self->popup->a_bg;
                  a->surface.parentx = x + px;
                  a->surface.parenty = y + py;
 -                XMoveResizeWindow(ob_display, self->wins[n],
 +                XMoveResizeWindow(obt_display, self->wins[n],
                                    x + px, y + py, eachw, eachh);
                  RrPaint(a, self->wins[n], eachw, eachh);
              }
@@@ -516,7 -519,7 +518,7 @@@ void pager_popup_free(ObPagerPopup *sel
          guint i;
  
          for (i = 0; i < self->desks; ++i)
 -            XDestroyWindow(ob_display, self->wins[i]);
 +            XDestroyWindow(obt_display, self->wins[i]);
          g_free(self->wins);
          RrAppearanceFree(self->hilight);
          RrAppearanceFree(self->unhilight);
@@@ -532,7 -535,7 +534,7 @@@ void pager_popup_delay_show(ObPagerPopu
  
      if (screen_num_desktops < self->desks)
          for (i = screen_num_desktops; i < self->desks; ++i)
 -            XDestroyWindow(ob_display, self->wins[i]);
 +            XDestroyWindow(obt_display, self->wins[i]);
  
      if (screen_num_desktops != self->desks)
          self->wins = g_renew(Window, self->wins, screen_num_desktops);
  
              attr.border_pixel =
                  RrColorPixel(ob_rr_theme->osd_border_color);
 -            self->wins[i] = XCreateWindow(ob_display, self->popup->bg,
 +            self->wins[i] = XCreateWindow(obt_display, self->popup->bg,
                                            0, 0, 1, 1, ob_rr_theme->obwidth,
                                            RrDepth(ob_rr_inst), InputOutput,
                                            RrVisual(ob_rr_inst), CWBorderPixel,
                                            &attr);
 -            XMapWindow(ob_display, self->wins[i]);
 +            XMapWindow(obt_display, self->wins[i]);
          }
  
      self->desks = screen_num_desktops;
diff --combined openbox/screen.c
index dde0443ec63d7335cbc80d15cb6874c47e825afd,932b157e1cf54add2dab54b01feb749d0c951643..9a37e686271dc125b2da7f60b764cd331746f152
  #include "debug.h"
  #include "openbox.h"
  #include "dock.h"
 -#include "xerror.h"
 -#include "prop.h"
  #include "grab.h"
  #include "startupnotify.h"
  #include "moveresize.h"
  #include "config.h"
 -#include "mainloop.h"
  #include "screen.h"
  #include "client.h"
  #include "session.h"
  #include "event.h"
  #include "focus.h"
  #include "popup.h"
 -#include "extensions.h"
  #include "render/render.h"
  #include "gettext.h"
 +#include "obt/display.h"
 +#include "obt/prop.h"
 +#include "obt/mainloop.h"
  
  #include <X11/Xlib.h>
  #ifdef HAVE_UNISTD_H
@@@ -90,10 -91,10 +90,10 @@@ static gboolean replace_wm(void
      Time timestamp;
  
      wm_sn = g_strdup_printf("WM_S%d", ob_screen);
 -    wm_sn_atom = XInternAtom(ob_display, wm_sn, FALSE);
 +    wm_sn_atom = XInternAtom(obt_display, wm_sn, FALSE);
      g_free(wm_sn);
  
 -    current_wm_sn_owner = XGetSelectionOwner(ob_display, wm_sn_atom);
 +    current_wm_sn_owner = XGetSelectionOwner(obt_display, wm_sn_atom);
      if (current_wm_sn_owner == screen_support_win)
          current_wm_sn_owner = None;
      if (current_wm_sn_owner) {
                        ob_screen);
              return FALSE;
          }
 -        xerror_set_ignore(TRUE);
 -        xerror_occured = FALSE;
 +        obt_display_ignore_errors(TRUE);
  
          /* We want to find out when the current selection owner dies */
 -        XSelectInput(ob_display, current_wm_sn_owner, StructureNotifyMask);
 -        XSync(ob_display, FALSE);
 +        XSelectInput(obt_display, current_wm_sn_owner, StructureNotifyMask);
 +        XSync(obt_display, FALSE);
  
 -        xerror_set_ignore(FALSE);
 -        if (xerror_occured)
 +        obt_display_ignore_errors(FALSE);
 +        if (obt_display_error_occured)
              current_wm_sn_owner = None;
      }
  
      timestamp = event_get_server_time();
  
 -    XSetSelectionOwner(ob_display, wm_sn_atom, screen_support_win,
 +    XSetSelectionOwner(obt_display, wm_sn_atom, screen_support_win,
                         timestamp);
  
 -    if (XGetSelectionOwner(ob_display, wm_sn_atom) != screen_support_win) {
 +    if (XGetSelectionOwner(obt_display, wm_sn_atom) != screen_support_win) {
          g_message(_("Could not acquire window manager selection on screen %d"),
                    ob_screen);
          return FALSE;
        const gulong timeout = G_USEC_PER_SEC * 15; /* wait for 15s max */
  
        while (wait < timeout) {
 -          if (XCheckWindowEvent(ob_display, current_wm_sn_owner,
 +          if (XCheckWindowEvent(obt_display, current_wm_sn_owner,
                                  StructureNotifyMask, &event) &&
                event.type == DestroyNotify)
                break;
      }
  
      /* Send client message indicating that we are now the WM */
 -    prop_message(RootWindow(ob_display, ob_screen), prop_atoms.manager,
 -                 timestamp, wm_sn_atom, screen_support_win, 0,
 -                 SubstructureNotifyMask);
 +    obt_prop_message(ob_screen, obt_root(ob_screen), OBT_PROP_ATOM(MANAGER),
 +                     timestamp, wm_sn_atom, screen_support_win, 0, 0,
 +                     SubstructureNotifyMask);
  
      return TRUE;
  }
@@@ -158,33 -160,37 +158,33 @@@ gboolean screen_annex(void
      XSetWindowAttributes attrib;
      pid_t pid;
      gint i, num_support;
 -    Atom *prop_atoms_start, *wm_supported_pos;
      gulong *supported;
  
      /* create the netwm support window */
      attrib.override_redirect = TRUE;
      attrib.event_mask = PropertyChangeMask;
 -    screen_support_win = XCreateWindow(ob_display,
 -                                       RootWindow(ob_display, ob_screen),
 +    screen_support_win = XCreateWindow(obt_display, obt_root(ob_screen),
                                         -100, -100, 1, 1, 0,
                                         CopyFromParent, InputOutput,
                                         CopyFromParent,
                                         CWEventMask | CWOverrideRedirect,
                                         &attrib);
 -    XMapWindow(ob_display, screen_support_win);
 -    XLowerWindow(ob_display, screen_support_win);
 +    XMapWindow(obt_display, screen_support_win);
 +    XLowerWindow(obt_display, screen_support_win);
  
      if (!replace_wm()) {
 -        XDestroyWindow(ob_display, screen_support_win);
 +        XDestroyWindow(obt_display, screen_support_win);
          return FALSE;
      }
  
 -    xerror_set_ignore(TRUE);
 -    xerror_occured = FALSE;
 -    XSelectInput(ob_display, RootWindow(ob_display, ob_screen),
 -                 ROOT_EVENTMASK);
 -    xerror_set_ignore(FALSE);
 -    if (xerror_occured) {
 +    obt_display_ignore_errors(TRUE);
 +    XSelectInput(obt_display, obt_root(ob_screen), ROOT_EVENTMASK);
 +    obt_display_ignore_errors(FALSE);
 +    if (obt_display_error_occured) {
          g_message(_("A window manager is already running on screen %d"),
                    ob_screen);
  
 -        XDestroyWindow(ob_display, screen_support_win);
 +        XDestroyWindow(obt_display, screen_support_win);
          return FALSE;
      }
  
  
      /* set the OPENBOX_PID hint */
      pid = getpid();
 -    PROP_SET32(RootWindow(ob_display, ob_screen),
 -               openbox_pid, cardinal, pid);
 +    OBT_PROP_SET32(obt_root(ob_screen), OPENBOX_PID, CARDINAL, pid);
  
      /* set supporting window */
 -    PROP_SET32(RootWindow(ob_display, ob_screen),
 -               net_supporting_wm_check, window, screen_support_win);
 +    OBT_PROP_SET32(obt_root(ob_screen),
 +                   NET_SUPPORTING_WM_CHECK, WINDOW, screen_support_win);
  
      /* set properties on the supporting window */
 -    PROP_SETS(screen_support_win, net_wm_name, "Openbox");
 -    PROP_SET32(screen_support_win, net_supporting_wm_check,
 -               window, screen_support_win);
 +    OBT_PROP_SETS(screen_support_win, NET_WM_NAME, utf8, "Openbox");
 +    OBT_PROP_SET32(screen_support_win, NET_SUPPORTING_WM_CHECK,
 +                   WINDOW, screen_support_win);
  
      /* set the _NET_SUPPORTED_ATOMS hint */
  
 -    /* this is all the atoms after net_supported in the prop_atoms struct */
 -    prop_atoms_start = (Atom*)&prop_atoms;
 -    wm_supported_pos = (Atom*)&(prop_atoms.net_supported);
 -    num_support = sizeof(prop_atoms) / sizeof(Atom) -
 -        (wm_supported_pos - prop_atoms_start) - 1;
 +    /* this is all the atoms after NET_SUPPORTED in the ObtPropAtoms enum */
 +    num_support = OBT_PROP_NUM_ATOMS - OBT_PROP_NET_SUPPORTED - 1;
      i = 0;
      supported = g_new(gulong, num_support);
 -    supported[i++] = prop_atoms.net_supporting_wm_check;
 -    supported[i++] = prop_atoms.net_wm_full_placement;
 -    supported[i++] = prop_atoms.net_current_desktop;
 -    supported[i++] = prop_atoms.net_number_of_desktops;
 -    supported[i++] = prop_atoms.net_desktop_geometry;
 -    supported[i++] = prop_atoms.net_desktop_viewport;
 -    supported[i++] = prop_atoms.net_active_window;
 -    supported[i++] = prop_atoms.net_workarea;
 -    supported[i++] = prop_atoms.net_client_list;
 -    supported[i++] = prop_atoms.net_client_list_stacking;
 -    supported[i++] = prop_atoms.net_desktop_names;
 -    supported[i++] = prop_atoms.net_close_window;
 -    supported[i++] = prop_atoms.net_desktop_layout;
 -    supported[i++] = prop_atoms.net_showing_desktop;
 -    supported[i++] = prop_atoms.net_wm_name;
 -    supported[i++] = prop_atoms.net_wm_visible_name;
 -    supported[i++] = prop_atoms.net_wm_icon_name;
 -    supported[i++] = prop_atoms.net_wm_visible_icon_name;
 -    supported[i++] = prop_atoms.net_wm_desktop;
 -    supported[i++] = prop_atoms.net_wm_strut;
 -    supported[i++] = prop_atoms.net_wm_strut_partial;
 -    supported[i++] = prop_atoms.net_wm_icon;
 -    supported[i++] = prop_atoms.net_wm_icon_geometry;
 -    supported[i++] = prop_atoms.net_wm_window_type;
 -    supported[i++] = prop_atoms.net_wm_window_type_desktop;
 -    supported[i++] = prop_atoms.net_wm_window_type_dock;
 -    supported[i++] = prop_atoms.net_wm_window_type_toolbar;
 -    supported[i++] = prop_atoms.net_wm_window_type_menu;
 -    supported[i++] = prop_atoms.net_wm_window_type_utility;
 -    supported[i++] = prop_atoms.net_wm_window_type_splash;
 -    supported[i++] = prop_atoms.net_wm_window_type_dialog;
 -    supported[i++] = prop_atoms.net_wm_window_type_normal;
 -    supported[i++] = prop_atoms.net_wm_allowed_actions;
 -    supported[i++] = prop_atoms.net_wm_action_move;
 -    supported[i++] = prop_atoms.net_wm_action_resize;
 -    supported[i++] = prop_atoms.net_wm_action_minimize;
 -    supported[i++] = prop_atoms.net_wm_action_shade;
 -    supported[i++] = prop_atoms.net_wm_action_maximize_horz;
 -    supported[i++] = prop_atoms.net_wm_action_maximize_vert;
 -    supported[i++] = prop_atoms.net_wm_action_fullscreen;
 -    supported[i++] = prop_atoms.net_wm_action_change_desktop;
 -    supported[i++] = prop_atoms.net_wm_action_close;
 -    supported[i++] = prop_atoms.net_wm_action_above;
 -    supported[i++] = prop_atoms.net_wm_action_below;
 -    supported[i++] = prop_atoms.net_wm_state;
 -    supported[i++] = prop_atoms.net_wm_state_modal;
 -    supported[i++] = prop_atoms.net_wm_state_maximized_vert;
 -    supported[i++] = prop_atoms.net_wm_state_maximized_horz;
 -    supported[i++] = prop_atoms.net_wm_state_shaded;
 -    supported[i++] = prop_atoms.net_wm_state_skip_taskbar;
 -    supported[i++] = prop_atoms.net_wm_state_skip_pager;
 -    supported[i++] = prop_atoms.net_wm_state_hidden;
 -    supported[i++] = prop_atoms.net_wm_state_fullscreen;
 -    supported[i++] = prop_atoms.net_wm_state_above;
 -    supported[i++] = prop_atoms.net_wm_state_below;
 -    supported[i++] = prop_atoms.net_wm_state_demands_attention;
 -    supported[i++] = prop_atoms.net_moveresize_window;
 -    supported[i++] = prop_atoms.net_wm_moveresize;
 -    supported[i++] = prop_atoms.net_wm_user_time;
 +    supported[i++] = OBT_PROP_ATOM(NET_SUPPORTING_WM_CHECK);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_FULL_PLACEMENT);
 +    supported[i++] = OBT_PROP_ATOM(NET_CURRENT_DESKTOP);
 +    supported[i++] = OBT_PROP_ATOM(NET_NUMBER_OF_DESKTOPS);
 +    supported[i++] = OBT_PROP_ATOM(NET_DESKTOP_GEOMETRY);
 +    supported[i++] = OBT_PROP_ATOM(NET_DESKTOP_VIEWPORT);
 +    supported[i++] = OBT_PROP_ATOM(NET_ACTIVE_WINDOW);
 +    supported[i++] = OBT_PROP_ATOM(NET_WORKAREA);
 +    supported[i++] = OBT_PROP_ATOM(NET_CLIENT_LIST);
 +    supported[i++] = OBT_PROP_ATOM(NET_CLIENT_LIST_STACKING);
 +    supported[i++] = OBT_PROP_ATOM(NET_DESKTOP_NAMES);
 +    supported[i++] = OBT_PROP_ATOM(NET_CLOSE_WINDOW);
 +    supported[i++] = OBT_PROP_ATOM(NET_DESKTOP_LAYOUT);
 +    supported[i++] = OBT_PROP_ATOM(NET_SHOWING_DESKTOP);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_NAME);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_VISIBLE_NAME);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ICON_NAME);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_VISIBLE_ICON_NAME);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_DESKTOP);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STRUT);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STRUT_PARTIAL);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ICON);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ICON_GEOMETRY);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DESKTOP);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DOCK);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_TOOLBAR);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_MENU);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_UTILITY);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_SPLASH);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DIALOG);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_NORMAL);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ALLOWED_ACTIONS);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_MOVE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_RESIZE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_MINIMIZE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_SHADE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_MAXIMIZE_HORZ);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_MAXIMIZE_VERT);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_FULLSCREEN);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_CHANGE_DESKTOP);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_CLOSE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_ABOVE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_BELOW);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_MODAL);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_VERT);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_HORZ);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_SHADED);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_SKIP_TASKBAR);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_SKIP_PAGER);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_HIDDEN);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_FULLSCREEN);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_ABOVE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_BELOW);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_DEMANDS_ATTENTION);
 +    supported[i++] = OBT_PROP_ATOM(NET_MOVERESIZE_WINDOW);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_MOVERESIZE);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_USER_TIME);
  /*
 -    supported[i++] = prop_atoms.net_wm_user_time_window;
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_USER_TIME_WINDOW);
  */
 -    supported[i++] = prop_atoms.net_frame_extents;
 -    supported[i++] = prop_atoms.net_request_frame_extents;
 -    supported[i++] = prop_atoms.net_restack_window;
 -    supported[i++] = prop_atoms.net_startup_id;
 +    supported[i++] = OBT_PROP_ATOM(NET_FRAME_EXTENTS);
 +    supported[i++] = OBT_PROP_ATOM(NET_REQUEST_FRAME_EXTENTS);
 +    supported[i++] = OBT_PROP_ATOM(NET_RESTACK_WINDOW);
 +    supported[i++] = OBT_PROP_ATOM(NET_STARTUP_ID);
  #ifdef SYNC
 -    supported[i++] = prop_atoms.net_wm_sync_request;
 -    supported[i++] = prop_atoms.net_wm_sync_request_counter;
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_SYNC_REQUEST);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_SYNC_REQUEST_COUNTER);
  #endif
 -    supported[i++] = prop_atoms.net_wm_pid;
 -    supported[i++] = prop_atoms.net_wm_ping;
 -
 -    supported[i++] = prop_atoms.kde_wm_change_state;
 -    supported[i++] = prop_atoms.kde_net_wm_frame_strut;
 -    supported[i++] = prop_atoms.kde_net_wm_window_type_override;
 -
 -    supported[i++] = prop_atoms.ob_wm_action_undecorate;
 -    supported[i++] = prop_atoms.ob_wm_state_undecorated;
 -    supported[i++] = prop_atoms.openbox_pid;
 -    supported[i++] = prop_atoms.ob_theme;
 -    supported[i++] = prop_atoms.ob_control;
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_PID);
 +    supported[i++] = OBT_PROP_ATOM(NET_WM_PING);
 +
 +    supported[i++] = OBT_PROP_ATOM(KDE_WM_CHANGE_STATE);
 +    supported[i++] = OBT_PROP_ATOM(KDE_NET_WM_FRAME_STRUT);
 +    supported[i++] = OBT_PROP_ATOM(KDE_NET_WM_WINDOW_TYPE_OVERRIDE);
 +
 +    supported[i++] = OBT_PROP_ATOM(OB_WM_ACTION_UNDECORATE);
 +    supported[i++] = OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED);
 +    supported[i++] = OBT_PROP_ATOM(OPENBOX_PID);
 +    supported[i++] = OBT_PROP_ATOM(OB_THEME);
 +    supported[i++] = OBT_PROP_ATOM(OB_CONTROL);
      g_assert(i == num_support);
  
 -    PROP_SETA32(RootWindow(ob_display, ob_screen),
 -                net_supported, atom, supported, num_support);
 +    OBT_PROP_SETA32(obt_root(ob_screen),
 +                    NET_SUPPORTED, ATOM, supported, num_support);
      g_free(supported);
  
      screen_tell_ksplash();
@@@ -326,14 -336,14 +326,14 @@@ static void screen_tell_ksplash(void
         hear it anyways. perhaps it is for old ksplash. or new ksplash. or
         something. oh well. */
      e.xclient.type = ClientMessage;
 -    e.xclient.display = ob_display;
 -    e.xclient.window = RootWindow(ob_display, ob_screen);
 +    e.xclient.display = obt_display;
 +    e.xclient.window = obt_root(ob_screen);
      e.xclient.message_type =
 -        XInternAtom(ob_display, "_KDE_SPLASH_PROGRESS", False );
 +        XInternAtom(obt_display, "_KDE_SPLASH_PROGRESS", False );
      e.xclient.format = 8;
      strcpy(e.xclient.data.b, "wm started");
 -    XSendEvent(ob_display, RootWindow(ob_display, ob_screen),
 -               False, SubstructureNotifyMask, &e );
 +    XSendEvent(obt_display, obt_root(ob_screen),
 +               False, SubstructureNotifyMask, &e);
  }
  
  void screen_startup(gboolean reconfig)
      screen_resize();
  
      /* have names already been set for the desktops? */
 -    if (PROP_GETSS(RootWindow(ob_display, ob_screen),
 -                   net_desktop_names, utf8, &names))
 -    {
 +    if (OBT_PROP_GETSS(obt_root(ob_screen), NET_DESKTOP_NAMES, utf8, &names)) {
          g_strfreev(names);
          namesexist = TRUE;
      }
              names[i] = g_strdup(it->data);
  
          /* set the root window property */
 -        PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,names);
 +        OBT_PROP_SETSS(obt_root(ob_screen),
 +                       NET_DESKTOP_NAMES, utf8, (const gchar**)names);
  
          g_strfreev(names);
      }
         this will also set the default names from the config file up for
         desktops that don't have names yet */
      screen_num_desktops = 0;
 -    if (PROP_GET32(RootWindow(ob_display, ob_screen),
 -                   net_number_of_desktops, cardinal, &d))
 +    if (OBT_PROP_GET32(obt_root(ob_screen),
 +                       NET_NUMBER_OF_DESKTOPS, CARDINAL, &d))
+     {
+         if (d != config_desktops_num) {
+             g_warning(_("Openbox is configured for %d desktops, but the current session has %d.  Overriding the Openbox configuration."),
+                       config_desktops_num, d);
+         }
          screen_set_num_desktops(d);
+     }
      /* restore from session if possible */
      else if (session_num_desktops)
          screen_set_num_desktops(session_num_desktops);
  
      screen_desktop = screen_num_desktops;  /* something invalid */
      /* start on the current desktop when a wm was already running */
 -    if (PROP_GET32(RootWindow(ob_display, ob_screen),
 -                   net_current_desktop, cardinal, &d) &&
 +    if (OBT_PROP_GET32(obt_root(ob_screen),
 +                       NET_CURRENT_DESKTOP, CARDINAL, &d) &&
          d < screen_num_desktops)
      {
          screen_set_desktop(d, FALSE);
  
      /* don't start in showing-desktop mode */
      screen_showing_desktop = FALSE;
 -    PROP_SET32(RootWindow(ob_display, ob_screen),
 -               net_showing_desktop, cardinal, screen_showing_desktop);
 +    OBT_PROP_SET32(obt_root(ob_screen),
 +                   NET_SHOWING_DESKTOP, CARDINAL, screen_showing_desktop);
  
      if (session_desktop_layout_present &&
          screen_validate_layout(&session_desktop_layout))
@@@ -434,16 -451,17 +440,16 @@@ void screen_shutdown(gboolean reconfig
      if (reconfig)
          return;
  
 -    XSelectInput(ob_display, RootWindow(ob_display, ob_screen),
 -                 NoEventMask);
 +    XSelectInput(obt_display, obt_root(ob_screen), NoEventMask);
  
      /* we're not running here no more! */
 -    PROP_ERASE(RootWindow(ob_display, ob_screen), openbox_pid);
 +    OBT_PROP_ERASE(obt_root(ob_screen), OPENBOX_PID);
      /* not without us */
 -    PROP_ERASE(RootWindow(ob_display, ob_screen), net_supported);
 +    OBT_PROP_ERASE(obt_root(ob_screen), NET_SUPPORTED);
      /* don't keep this mode */
 -    PROP_ERASE(RootWindow(ob_display, ob_screen), net_showing_desktop);
 +    OBT_PROP_ERASE(obt_root(ob_screen), NET_SHOWING_DESKTOP);
  
 -    XDestroyWindow(ob_display, screen_support_win);
 +    XDestroyWindow(obt_display, screen_support_win);
  
      g_strfreev(screen_desktop_names);
      screen_desktop_names = NULL;
@@@ -456,8 -474,8 +462,8 @@@ void screen_resize(void
      GList *it;
      gulong geometry[2];
  
 -    w = WidthOfScreen(ScreenOfDisplay(ob_display, ob_screen));
 -    h = HeightOfScreen(ScreenOfDisplay(ob_display, ob_screen));
 +    w = WidthOfScreen(ScreenOfDisplay(obt_display, ob_screen));
 +    h = HeightOfScreen(ScreenOfDisplay(obt_display, ob_screen));
  
      if (w == oldw && h == oldh) return;
  
      /* Set the _NET_DESKTOP_GEOMETRY hint */
      screen_physical_size.width = geometry[0] = w;
      screen_physical_size.height = geometry[1] = h;
 -    PROP_SETA32(RootWindow(ob_display, ob_screen),
 -                net_desktop_geometry, cardinal, geometry, 2);
 +    OBT_PROP_SETA32(obt_root(ob_screen),
 +                    NET_DESKTOP_GEOMETRY, CARDINAL, geometry, 2);
  
      if (ob_state() == OB_STATE_STARTING)
          return;
@@@ -491,12 -509,13 +497,12 @@@ void screen_set_num_desktops(guint num
  
      old = screen_num_desktops;
      screen_num_desktops = num;
 -    PROP_SET32(RootWindow(ob_display, ob_screen),
 -               net_number_of_desktops, cardinal, num);
 +    OBT_PROP_SET32(obt_root(ob_screen), NET_NUMBER_OF_DESKTOPS, CARDINAL, num);
  
      /* set the viewport hint */
      viewport = g_new0(gulong, num * 2);
 -    PROP_SETA32(RootWindow(ob_display, ob_screen),
 -                net_desktop_viewport, cardinal, viewport, num * 2);
 +    OBT_PROP_SETA32(obt_root(ob_screen),
 +                    NET_DESKTOP_VIEWPORT, CARDINAL, viewport, num * 2);
      g_free(viewport);
  
      /* the number of rows/columns will differ */
@@@ -591,7 -610,8 +597,7 @@@ void screen_set_desktop(guint num, gboo
  
      if (previous == num) return;
  
 -    PROP_SET32(RootWindow(ob_display, ob_screen),
 -               net_current_desktop, cardinal, num);
 +    OBT_PROP_SET32(obt_root(ob_screen), NET_CURRENT_DESKTOP, CARDINAL, num);
  
      /* This whole thing decides when/how to save the screen_last_desktop so
         that it can be restored later if you want */
          }
      }
      screen_desktop_timeout = FALSE;
 -    ob_main_loop_timeout_remove(ob_main_loop, last_desktop_func);
 -    ob_main_loop_timeout_add(ob_main_loop, REMEMBER_LAST_DESKTOP_TIME,
 -                             last_desktop_func, NULL, NULL, NULL);
 +    obt_main_loop_timeout_remove(ob_main_loop, last_desktop_func);
 +    obt_main_loop_timeout_add(ob_main_loop, REMEMBER_LAST_DESKTOP_TIME,
 +                              last_desktop_func, NULL, NULL, NULL);
  
      ob_debug("Moving to desktop %d\n", num+1);
  
@@@ -913,15 -933,15 +919,15 @@@ void screen_show_desktop_popup(guint d
                            MAX(a->width/3, POPUP_WIDTH));
      pager_popup_show(desktop_popup, screen_desktop_names[d], d);
  
 -    ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
 -    ob_main_loop_timeout_add(ob_main_loop, config_desktop_popup_time * 1000,
 -                             hide_desktop_popup_func, NULL, NULL, NULL);
 +    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);
  }
  
  void screen_hide_desktop_popup(void)
  {
 -    ob_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
 +    obt_main_loop_timeout_remove(ob_main_loop, hide_desktop_popup_func);
      pager_popup_hide(desktop_popup);
  }
  
@@@ -1080,13 -1100,13 +1086,13 @@@ void screen_update_layout(void
      screen_desktop_layout.rows = 1;
      screen_desktop_layout.columns = screen_num_desktops;
  
 -    if (PROP_GETA32(RootWindow(ob_display, ob_screen),
 -                    net_desktop_layout, cardinal, &data, &num)) {
 +    if (OBT_PROP_GETA32(obt_root(ob_screen),
 +                        NET_DESKTOP_LAYOUT, CARDINAL, &data, &num)) {
          if (num == 3 || num == 4) {
  
 -            if (data[0] == prop_atoms.net_wm_orientation_vert)
 +            if (data[0] == OBT_PROP_ATOM(NET_WM_ORIENTATION_VERT))
                  l.orientation = OB_ORIENTATION_VERT;
 -            else if (data[0] == prop_atoms.net_wm_orientation_horz)
 +            else if (data[0] == OBT_PROP_ATOM(NET_WM_ORIENTATION_HORZ))
                  l.orientation = OB_ORIENTATION_HORZ;
              else
                  return;
              if (num < 4)
                  l.start_corner = OB_CORNER_TOPLEFT;
              else {
 -                if (data[3] == prop_atoms.net_wm_topleft)
 +                if (data[3] == OBT_PROP_ATOM(NET_WM_TOPLEFT))
                      l.start_corner = OB_CORNER_TOPLEFT;
 -                else if (data[3] == prop_atoms.net_wm_topright)
 +                else if (data[3] == OBT_PROP_ATOM(NET_WM_TOPRIGHT))
                      l.start_corner = OB_CORNER_TOPRIGHT;
 -                else if (data[3] == prop_atoms.net_wm_bottomright)
 +                else if (data[3] == OBT_PROP_ATOM(NET_WM_BOTTOMRIGHT))
                      l.start_corner = OB_CORNER_BOTTOMRIGHT;
 -                else if (data[3] == prop_atoms.net_wm_bottomleft)
 +                else if (data[3] == OBT_PROP_ATOM(NET_WM_BOTTOMLEFT))
                      l.start_corner = OB_CORNER_BOTTOMLEFT;
                  else
                      return;
@@@ -1125,8 -1145,8 +1131,8 @@@ void screen_update_desktop_names(void
      g_strfreev(screen_desktop_names);
      screen_desktop_names = NULL;
  
 -    if (PROP_GETSS(RootWindow(ob_display, ob_screen),
 -                   net_desktop_names, utf8, &screen_desktop_names))
 +    if (OBT_PROP_GETSS(obt_root(ob_screen),
 +                       NET_DESKTOP_NAMES, utf8, &screen_desktop_names))
          for (i = 0; screen_desktop_names[i] && i < screen_num_desktops; ++i);
      else
          i = 0;
  
          /* if we changed any names, then set the root property so we can
             all agree on the names */
 -        PROP_SETSS(RootWindow(ob_display, ob_screen), net_desktop_names,
 -                   screen_desktop_names);
 +        OBT_PROP_SETSS(obt_root(ob_screen), NET_DESKTOP_NAMES,
 +                       utf8, (const gchar**)screen_desktop_names);
      }
  
      /* resize the pager for these names */
@@@ -1220,23 -1240,24 +1226,23 @@@ void screen_show_desktop(gboolean show
      }
  
      show = !!show; /* make it boolean */
 -    PROP_SET32(RootWindow(ob_display, ob_screen),
 -               net_showing_desktop, cardinal, show);
 +    OBT_PROP_SET32(obt_root(ob_screen), NET_SHOWING_DESKTOP, CARDINAL, show);
  }
  
  void screen_install_colormap(ObClient *client, gboolean install)
  {
      if (client == NULL || client->colormap == None) {
          if (install)
 -            XInstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst));
 +            XInstallColormap(obt_display, RrColormap(ob_rr_inst));
          else
 -            XUninstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst));
 +            XUninstallColormap(obt_display, RrColormap(ob_rr_inst));
      } else {
 -        xerror_set_ignore(TRUE);
 +        obt_display_ignore_errors(TRUE);
          if (install)
 -            XInstallColormap(RrDisplay(ob_rr_inst), client->colormap);
 +            XInstallColormap(obt_display, client->colormap);
          else
 -            XUninstallColormap(RrDisplay(ob_rr_inst), client->colormap);
 -        xerror_set_ignore(FALSE);
 +            XUninstallColormap(obt_display, client->colormap);
 +        obt_display_ignore_errors(FALSE);
      }
  }
  
@@@ -1278,55 -1299,6 +1284,54 @@@ typedef struct 
      } \
  }
  
-         g_print("Using fake xinerama !\n");
 +static void get_xinerama_screens(Rect **xin_areas, guint *nxin)
 +{
 +    guint i;
 +    gint l, r, t, b;
 +
 +    if (ob_debug_xinerama) {
 +        gint w = WidthOfScreen(ScreenOfDisplay(obt_display, ob_screen));
 +        gint h = HeightOfScreen(ScreenOfDisplay(obt_display, ob_screen));
 +        *nxin = 2;
 +        *xin_areas = g_new(Rect, *nxin + 1);
 +        RECT_SET((*xin_areas)[0], 0, 0, w/2, h);
 +        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);
 +        *nxin = n;
 +        *xin_areas = g_new(Rect, *nxin + 1);
 +        for (i = 0; i < *nxin; ++i)
 +            RECT_SET((*xin_areas)[i], info[i].x_org, info[i].y_org,
 +                     info[i].width, info[i].height);
 +        XFree(info);
 +    }
 +#endif
 +    else {
 +        *nxin = 1;
 +        *xin_areas = g_new(Rect, *nxin + 1);
 +        RECT_SET((*xin_areas)[0], 0, 0,
 +                 WidthOfScreen(ScreenOfDisplay(obt_display, ob_screen)),
 +                 HeightOfScreen(ScreenOfDisplay(obt_display, ob_screen)));
 +    }
 +
 +    /* returns one extra with the total area in it */
 +    l = (*xin_areas)[0].x;
 +    t = (*xin_areas)[0].y;
 +    r = (*xin_areas)[0].x + (*xin_areas)[0].width - 1;
 +    b = (*xin_areas)[0].y + (*xin_areas)[0].height - 1;
 +    for (i = 1; i < *nxin; ++i) {
 +        l = MIN(l, (*xin_areas)[i].x);
 +        t = MIN(l, (*xin_areas)[i].y);
 +        r = MAX(r, (*xin_areas)[i].x + (*xin_areas)[i].width - 1);
 +        b = MAX(b, (*xin_areas)[i].y + (*xin_areas)[i].height - 1);
 +    }
 +    RECT_SET((*xin_areas)[*nxin], l, t, r - l + 1, b - t + 1);
 +}
 +
  void screen_update_areas(void)
  {
      guint i, j;
      GSList *sit;
  
      g_free(monitor_area);
 -    extensions_xinerama_screens(&monitor_area, &screen_num_monitors);
 +    get_xinerama_screens(&monitor_area, &screen_num_monitors);
  
      /* set up the user-specified margins */
      config_margins.top_start = RECT_LEFT(monitor_area[screen_num_monitors]);
  
      /* all the work areas are not used here, only the ones for the first
         monitor are */
 -    PROP_SETA32(RootWindow(ob_display, ob_screen), net_workarea, cardinal,
 -                dims, 4 * screen_num_desktops);
 +    OBT_PROP_SETA32(obt_root(ob_screen), NET_WORKAREA, CARDINAL,
 +                    dims, 4 * screen_num_desktops);
  
      /* the area has changed, adjust all the windows if they need it */
      for (it = client_list; it; it = g_list_next(it))
@@@ -1686,10 -1658,10 +1691,10 @@@ Rect* screen_physical_area_active(void
  void screen_set_root_cursor(void)
  {
      if (sn_app_starting())
 -        XDefineCursor(ob_display, RootWindow(ob_display, ob_screen),
 +        XDefineCursor(obt_display, obt_root(ob_screen),
                        ob_cursor(OB_CURSOR_BUSYPOINTER));
      else
 -        XDefineCursor(ob_display, RootWindow(ob_display, ob_screen),
 +        XDefineCursor(obt_display, obt_root(ob_screen),
                        ob_cursor(OB_CURSOR_POINTER));
  }
  
@@@ -1700,12 -1672,12 +1705,12 @@@ gboolean screen_pointer_pos(gint *x, gi
      guint u;
      gboolean ret;
  
 -    ret = !!XQueryPointer(ob_display, RootWindow(ob_display, ob_screen),
 +    ret = !!XQueryPointer(obt_display, obt_root(ob_screen),
                            &w, &w, x, y, &i, &i, &u);
      if (!ret) {
 -        for (i = 0; i < ScreenCount(ob_display); ++i)
 +        for (i = 0; i < ScreenCount(obt_display); ++i)
              if (i != ob_screen)
 -                if (XQueryPointer(ob_display, RootWindow(ob_display, i),
 +                if (XQueryPointer(obt_display, obt_root(i),
                                    &w, &w, x, y, &i, &i, &u))
                      break;
      }
diff --combined openbox/stacking.c
index 6b3c955a713c71866efa737ebb4d294e69ca93b4,92a5285d79f3a1ec22882868bbccd136fa5a7675..4d581966bd117e04602a86a7bbc7f136391f8da6
  */
  
  #include "openbox.h"
 -#include "prop.h"
  #include "screen.h"
  #include "focus.h"
  #include "client.h"
  #include "group.h"
  #include "frame.h"
  #include "window.h"
+ #include "event.h"
  #include "debug.h"
 +#include "obt/prop.h"
  
  GList  *stacking_list = NULL;
  /*! When true, stacking changes will not be reflected on the screen.  This is
@@@ -54,8 -55,8 +55,8 @@@ void stacking_set_list(void
          }
      }
  
 -    PROP_SETA32(RootWindow(ob_display, ob_screen),
 -                net_client_list_stacking, window, (gulong*)windows, i);
 +    OBT_PROP_SETA32(obt_root(ob_screen), NET_CLIENT_LIST_STACKING, WINDOW,
 +                    (gulong*)windows, i);
  
      g_free(windows);
  }
@@@ -104,7 -105,7 +105,7 @@@ static void do_restack(GList *wins, GLi
  #endif
  
      if (!pause_changes)
 -        XRestackWindows(ob_display, win, i);
 +        XRestackWindows(obt_display, win, i);
      g_free(win);
  
      stacking_set_list();
@@@ -114,6 -115,7 +115,7 @@@ void stacking_temp_raise(ObWindow *wind
  {
      Window win[2];
      GList *it;
+     gulong start;
  
      /* don't use this for internal windows..! it would lower them.. */
      g_assert(window_layer(window) < OB_STACKING_LAYER_INTERNAL);
      }
  
      win[1] = window_top(window);
 -    XRestackWindows(ob_display, win, 2);
+     start = event_start_ignore_all_enters();
 +    XRestackWindows(obt_display, win, 2);
+     event_end_ignore_all_enters(start);
  
      pause_changes = TRUE;
  }
@@@ -139,12 -143,15 +143,15 @@@ void stacking_restore(void
      Window *win;
      GList *it;
      gint i;
+     gulong start;
  
      win = g_new(Window, g_list_length(stacking_list) + 1);
      win[0] = screen_support_win;
      for (i = 1, it = stacking_list; it; ++i, it = g_list_next(it))
          win[i] = window_top(it->data);
 -    XRestackWindows(ob_display, win, i);
+     start = event_start_ignore_all_enters();
 +    XRestackWindows(obt_display, win, i);
+     event_end_ignore_all_enters(start);
      g_free(win);
  
      pause_changes = FALSE;
diff --combined openbox/startupnotify.c
index 1542be06f641b70a5361ee02a701acfe2dfab5eb,e13aa55c688a55f84f50a66d6ebaa9392c389a34..3e8799f8dd9ea7f4a9bc4b0e5d6fda66cdca2e3e
  #include "gettext.h"
  #include "event.h"
  
- #include <stdlib.h>
+ #ifdef HAVE_STDLIB_H
+ #  include <stdlib.h>
+ #endif
  
  #ifndef USE_LIBSN
  
  void sn_startup(gboolean reconfig) {}
  void sn_shutdown(gboolean reconfig) {}
  gboolean sn_app_starting() { return FALSE; }
- Time sn_app_started(const gchar *id, const gchar *wmclass)
+ Time sn_app_started(const gchar *id, const gchar *wmclass, const gchar *name)
  {
      return CurrentTime;
  }
  gboolean sn_get_desktop(gchar *id, guint *desktop) { return FALSE; }
- void sn_setup_spawn_environment(gchar *program, gchar *name,
-                                 gchar *icon_name, gint desktop) {}
+ void sn_setup_spawn_environment(const gchar *program, const gchar *name,
+                                 const gchar *icon_name, const gchar *wmclass,
+                                 gint desktop) {}
  void sn_spawn_cancel() {}
  
  #else
  
  #include "openbox.h"
 -#include "mainloop.h"
  #include "screen.h"
  
  #define SN_API_NOT_YET_FROZEN
@@@ -57,21 -61,14 +60,14 @@@ static void sn_event_func(SnMonitorEven
  
  void sn_startup(gboolean reconfig)
  {
-     gchar *s;
      if (reconfig) return;
  
-     /* unset this so we don't pass it on unknowingly */
-     s = g_strdup("DESKTOP_STARTUP_ID");
-     putenv(s);
-     g_free(s);
 -    sn_display = sn_display_new(ob_display, NULL, NULL);
 +    sn_display = sn_display_new(obt_display, NULL, NULL);
      sn_context = sn_monitor_context_new(sn_display, ob_screen,
                                          sn_event_func, NULL, NULL);
      sn_launcher = sn_launcher_context_new(sn_display, ob_screen);
  
 -    ob_main_loop_x_add(ob_main_loop, sn_handler, NULL, NULL);
 +    obt_main_loop_x_add(ob_main_loop, sn_handler, NULL, NULL);
  }
  
  void sn_shutdown(gboolean reconfig)
@@@ -80,7 -77,7 +76,7 @@@
  
      if (reconfig) return;
  
 -    ob_main_loop_x_remove(ob_main_loop, sn_handler);
 +    obt_main_loop_x_remove(ob_main_loop, sn_handler);
  
      for (it = sn_waits; it; it = g_slist_next(it))
          sn_startup_sequence_unref((SnStartupSequence*)it->data);
@@@ -143,10 -140,10 +139,10 @@@ static void sn_event_func(SnMonitorEven
          sn_waits = g_slist_prepend(sn_waits, seq);
          /* 20 second timeout for apps to start if the launcher doesn't
             have a timeout */
 -        ob_main_loop_timeout_add(ob_main_loop, 20 * G_USEC_PER_SEC,
 -                                 sn_wait_timeout, seq,
 -                                 g_direct_equal,
 -                                 (GDestroyNotify)sn_startup_sequence_unref);
 +        obt_main_loop_timeout_add(ob_main_loop, 20 * G_USEC_PER_SEC,
 +                                  sn_wait_timeout, seq,
 +                                  g_direct_equal,
 +                                  (GDestroyNotify)sn_startup_sequence_unref);
          change = TRUE;
          break;
      case SN_MONITOR_EVENT_CHANGED:
      case SN_MONITOR_EVENT_CANCELED:
          if ((seq = sequence_find(sn_startup_sequence_get_id(seq)))) {
              sn_waits = g_slist_remove(sn_waits, seq);
 -            ob_main_loop_timeout_remove_data(ob_main_loop, sn_wait_timeout,
 -                                             seq, FALSE);
 +            obt_main_loop_timeout_remove_data(ob_main_loop, sn_wait_timeout,
 +                                              seq, FALSE);
              change = TRUE;
          }
          break;
          screen_set_root_cursor();
  }
  
- Time sn_app_started(const gchar *id, const gchar *wmclass)
+ Time sn_app_started(const gchar *id, const gchar *wmclass, const gchar *name)
  {
      GSList *it;
      Time t = CurrentTime;
      for (it = sn_waits; it; it = g_slist_next(it)) {
          SnStartupSequence *seq = it->data;
          gboolean found = FALSE;
-         const gchar *seqid, *seqclass, *seqname, *seqbin;
+         const gchar *seqid, *seqclass, *seqbin;
          seqid = sn_startup_sequence_get_id(seq);
          seqclass = sn_startup_sequence_get_wmclass(seq);
-         seqname = sn_startup_sequence_get_name(seq);
          seqbin = sn_startup_sequence_get_binary_name(seq);
  
          if (id && seqid) {
                 accuracy */
              if (!strcmp(seqid, id))
                  found = TRUE;
-         } else {
-             seqclass = sn_startup_sequence_get_wmclass(seq);
-             seqname = sn_startup_sequence_get_name(seq);
-             seqbin = sn_startup_sequence_get_binary_name(seq);
-             if ((seqname && !g_ascii_strcasecmp(seqname, wmclass)) ||
-                 (seqbin && !g_ascii_strcasecmp(seqbin, wmclass)) ||
-                 (seqclass && !strcmp(seqclass, wmclass)))
-                 found = TRUE;
+         }
+         else if (seqclass) {
+             /* seqclass = "a string to match against the "resource name" or
+                "resource class" hints.  These are WM_CLASS[0] and WM_CLASS[1]"
+                - from the startup-notification spec
+             */
+             found = (seqclass && !strcmp(seqclass, wmclass)) ||
+                 (seqclass && !strcmp(seqclass, name));
+         }
+         else if (seqbin) {
+             /* Check the binary name against the class and name hints
+                as well, to help apps that don't have the class set
+                correctly */
+             found = (seqbin && !g_ascii_strcasecmp(seqbin, wmclass)) ||
+                 (seqbin && !g_ascii_strcasecmp(seqbin, name));
          }
  
          if (found) {
@@@ -231,8 -233,9 +232,9 @@@ static gboolean sn_launch_wait_timeout(
      return FALSE; /* don't repeat */
  }
  
- void sn_setup_spawn_environment(gchar *program, gchar *name,
-                                 gchar *icon_name, gint desktop)
+ void sn_setup_spawn_environment(const gchar *program, const gchar *name,
+                                 const gchar *icon_name, const gchar *wmclass,
+                                 gint desktop)
  {
      gchar *desc;
      const char *id;
      sn_launcher_context_set_icon_name(sn_launcher, icon_name ?
                                        icon_name : program);
      sn_launcher_context_set_binary_name(sn_launcher, program);
+     if (wmclass) sn_launcher_context_set_wmclass(sn_launcher, wmclass);
      if (desktop >= 0 && (unsigned) desktop < screen_num_desktops)
          sn_launcher_context_set_workspace(sn_launcher, (signed) desktop);
      sn_launcher_context_initiate(sn_launcher, "openbox", program,
  
      /* 20 second timeout for apps to start */
      sn_launcher_context_ref(sn_launcher);
 -    ob_main_loop_timeout_add(ob_main_loop, 20 * G_USEC_PER_SEC,
 -                             sn_launch_wait_timeout, sn_launcher,
 -                             g_direct_equal,
 -                             (GDestroyNotify)sn_launcher_context_unref);
 +    obt_main_loop_timeout_add(ob_main_loop, 20 * G_USEC_PER_SEC,
 +                              sn_launch_wait_timeout, sn_launcher,
 +                              g_direct_equal,
 +                              (GDestroyNotify)sn_launcher_context_unref);
  
-     putenv(g_strdup_printf("DESKTOP_STARTUP_ID=%s", id));
+     setenv("DESKTOP_STARTUP_ID", id, TRUE);
  
      g_free(desc);
  }
diff --combined render/theme.c
index 87f264d131411ab7f87ec9efeee113e80003eb82,a57269dd2cbbea98ab130642fb11017b916b4063..d644a92f22799e811dfd31d6063b073b78504a31
@@@ -23,7 -23,7 +23,7 @@@
  #include "mask.h"
  #include "theme.h"
  #include "icon.h"
 -#include "parser/parse.h"
 +#include "obt/paths.h"
  
  #include <X11/Xlib.h>
  #include <X11/Xresource.h>
@@@ -1455,6 -1455,7 +1455,7 @@@ void RrThemeFree(RrTheme *theme
          RrFontClose(theme->win_font_unfocused);
          RrFontClose(theme->menu_title_font);
          RrFontClose(theme->menu_font);
+         RrFontClose(theme->osd_font);
  
          RrAppearanceFree(theme->a_disabled_focused_max);
          RrAppearanceFree(theme->a_disabled_unfocused_max);
@@@ -1559,10 -1560,6 +1560,10 @@@ static XrmDatabase loaddb(const gchar *
              *path = g_path_get_dirname(s);
          g_free(s);
      } else {
 +        ObtPaths *p;
 +
 +        p = obt_paths_new();
 +
          /* XXX backwards compatibility, remove me sometime later */
          s = g_build_filename(g_get_home_dir(), ".themes", name,
                               "openbox-3", "themerc", NULL);
              *path = g_path_get_dirname(s);
          g_free(s);
  
 -        for (it = parse_xdg_data_dir_paths(); !db && it;
 -             it = g_slist_next(it))
 +        for (it = obt_paths_data_dirs(p); !db && it; it = g_slist_next(it))
          {
              s = g_build_filename(it->data, "themes", name,
                                   "openbox-3", "themerc", NULL);
                  *path = g_path_get_dirname(s);
              g_free(s);
          }
 +
 +        obt_paths_unref(p);
      }
  
      if (db == NULL) {
This page took 0.390351 seconds and 4 git commands to generate.