Merge branch 'backport' into work
authorDana Jansens <danakj@orodu.net>
Fri, 15 Feb 2008 15:02:07 +0000 (10:02 -0500)
committerDana Jansens <danakj@orodu.net>
Fri, 15 Feb 2008 15:03:55 +0000 (10:03 -0500)
Conflicts:

openbox/frame.c
openbox/menuframe.c

1  2 
obt/prop.c
obt/prop.h
openbox/frame.c
openbox/menuframe.c

diff --combined obt/prop.c
index 89d3950,0000000..5fe0f73
mode 100644,000000..100644
--- /dev/null
@@@ -1,495 -1,0 +1,496 @@@
 +/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
 +
 +   obt/prop.c for the Openbox window manager
 +   Copyright (c) 2006        Mikael Magnusson
 +   Copyright (c) 2003-2007   Dana Jansens
 +
 +   This program is free software; you can redistribute it and/or modify
 +   it under the terms of the GNU General Public License as published by
 +   the Free Software Foundation; either version 2 of the License, or
 +   (at your option) any later version.
 +
 +   This program is distributed in the hope that it will be useful,
 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +   GNU General Public License for more details.
 +
 +   See the COPYING file for a copy of the GNU General Public License.
 +*/
 +
 +#include "obt/prop.h"
 +#include "obt/display.h"
 +
 +#include <X11/Xatom.h>
 +#ifdef HAVE_STRING_H
 +#  include <string.h>
 +#endif
 +
 +Atom prop_atoms[OBT_PROP_NUM_ATOMS];
 +gboolean prop_started = FALSE;
 +
 +#define CREATE_NAME(var, name) (prop_atoms[OBT_PROP_##var] = \
 +                                XInternAtom((obt_display), (name), FALSE))
 +#define CREATE(var) CREATE_NAME(var, #var)
 +#define CREATE_(var) CREATE_NAME(var, "_" #var)
 +
 +void obt_prop_startup()
 +{
 +    if (prop_started) return;
 +    prop_started = TRUE;
 +
 +    g_assert(obt_display);
 +
 +    CREATE(CARDINAL);
 +    CREATE(WINDOW);
 +    CREATE(PIXMAP);
 +    CREATE(ATOM);
 +    CREATE(STRING);
 +    CREATE_NAME(UTF8, "UTF8_STRING");
 +
 +    CREATE(MANAGER);
 +
 +    CREATE(WM_COLORMAP_WINDOWS);
 +    CREATE(WM_PROTOCOLS);
 +    CREATE(WM_STATE);
 +    CREATE(WM_CHANGE_STATE);
 +    CREATE(WM_DELETE_WINDOW);
 +    CREATE(WM_TAKE_FOCUS);
 +    CREATE(WM_NAME);
 +    CREATE(WM_ICON_NAME);
 +    CREATE(WM_CLASS);
 +    CREATE(WM_WINDOW_ROLE);
 +    CREATE(WM_CLIENT_MACHINE);
 +    CREATE(WM_COMMAND);
 +    CREATE(WM_CLIENT_LEADER);
 +    CREATE_(MOTIF_WM_HINTS);
 +
 +    CREATE(SM_CLIENT_ID);
 +
 +    CREATE_(NET_WM_FULL_PLACEMENT);
 +
 +    CREATE_(NET_SUPPORTED);
 +    CREATE_(NET_CLIENT_LIST);
 +    CREATE_(NET_CLIENT_LIST_STACKING);
 +    CREATE_(NET_NUMBER_OF_DESKTOPS);
 +    CREATE_(NET_DESKTOP_GEOMETRY);
 +    CREATE_(NET_DESKTOP_VIEWPORT);
 +    CREATE_(NET_CURRENT_DESKTOP);
 +    CREATE_(NET_DESKTOP_NAMES);
 +    CREATE_(NET_ACTIVE_WINDOW);
 +/*    CREATE_(NET_RESTACK_WINDOW);*/
 +    CREATE_(NET_WORKAREA);
 +    CREATE_(NET_SUPPORTING_WM_CHECK);
 +    CREATE_(NET_DESKTOP_LAYOUT);
 +    CREATE_(NET_SHOWING_DESKTOP);
 +
 +    CREATE_(NET_CLOSE_WINDOW);
 +    CREATE_(NET_WM_MOVERESIZE);
 +    CREATE_(NET_MOVERESIZE_WINDOW);
 +    CREATE_(NET_REQUEST_FRAME_EXTENTS);
 +    CREATE_(NET_RESTACK_WINDOW);
 +
 +    CREATE_(NET_STARTUP_ID);
 +
 +    CREATE_(NET_WM_NAME);
 +    CREATE_(NET_WM_VISIBLE_NAME);
 +    CREATE_(NET_WM_ICON_NAME);
 +    CREATE_(NET_WM_VISIBLE_ICON_NAME);
 +    CREATE_(NET_WM_DESKTOP);
 +    CREATE_(NET_WM_WINDOW_TYPE);
 +    CREATE_(NET_WM_STATE);
 +    CREATE_(NET_WM_STRUT);
 +    CREATE_(NET_WM_STRUT_PARTIAL);
 +    CREATE_(NET_WM_ICON);
 +    CREATE_(NET_WM_ICON_GEOMETRY);
 +    CREATE_(NET_WM_PID);
 +    CREATE_(NET_WM_ALLOWED_ACTIONS);
 +    CREATE_(NET_WM_USER_TIME);
 +/*  CREATE_(NET_WM_USER_TIME_WINDOW); */
 +    CREATE_(KDE_NET_WM_FRAME_STRUT);
 +    CREATE_(NET_FRAME_EXTENTS);
 +
 +    CREATE_(NET_WM_PING);
 +#ifdef SYNC
 +    CREATE_(NET_WM_SYNC_REQUEST);
 +    CREATE_(NET_WM_SYNC_REQUEST_COUNTER);
 +#endif
 +
 +    CREATE_(NET_WM_WINDOW_TYPE_DESKTOP);
 +    CREATE_(NET_WM_WINDOW_TYPE_DOCK);
 +    CREATE_(NET_WM_WINDOW_TYPE_TOOLBAR);
 +    CREATE_(NET_WM_WINDOW_TYPE_MENU);
 +    CREATE_(NET_WM_WINDOW_TYPE_UTILITY);
 +    CREATE_(NET_WM_WINDOW_TYPE_SPLASH);
 +    CREATE_(NET_WM_WINDOW_TYPE_DIALOG);
 +    CREATE_(NET_WM_WINDOW_TYPE_NORMAL);
++    CREATE_(NET_WM_WINDOW_TYPE_POPUP_MENU);
 +
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_SIZE_TOPLEFT] = 0;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_SIZE_TOP] = 1;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_SIZE_TOPRIGHT] = 2;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_SIZE_RIGHT] = 3;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT] = 4;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_SIZE_BOTTOM] = 5;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT] = 6;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_SIZE_LEFT] = 7;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_MOVE] = 8;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_SIZE_KEYBOARD] = 9;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_MOVE_KEYBOARD] = 10;
 +    prop_atoms[OBT_PROP_NET_WM_MOVERESIZE_CANCEL] = 11;
 +
 +    CREATE_(NET_WM_ACTION_MOVE);
 +    CREATE_(NET_WM_ACTION_RESIZE);
 +    CREATE_(NET_WM_ACTION_MINIMIZE);
 +    CREATE_(NET_WM_ACTION_SHADE);
 +    CREATE_(NET_WM_ACTION_MAXIMIZE_HORZ);
 +    CREATE_(NET_WM_ACTION_MAXIMIZE_VERT);
 +    CREATE_(NET_WM_ACTION_FULLSCREEN);
 +    CREATE_(NET_WM_ACTION_CHANGE_DESKTOP);
 +    CREATE_(NET_WM_ACTION_CLOSE);
 +    CREATE_(NET_WM_ACTION_ABOVE);
 +    CREATE_(NET_WM_ACTION_BELOW);
 +
 +    CREATE_(NET_WM_STATE_MODAL);
 +/*    CREATE_(NET_WM_STATE_STICKY);*/
 +    CREATE_(NET_WM_STATE_MAXIMIZED_VERT);
 +    CREATE_(NET_WM_STATE_MAXIMIZED_HORZ);
 +    CREATE_(NET_WM_STATE_SHADED);
 +    CREATE_(NET_WM_STATE_SKIP_TASKBAR);
 +    CREATE_(NET_WM_STATE_SKIP_PAGER);
 +    CREATE_(NET_WM_STATE_HIDDEN);
 +    CREATE_(NET_WM_STATE_FULLSCREEN);
 +    CREATE_(NET_WM_STATE_ABOVE);
 +    CREATE_(NET_WM_STATE_BELOW);
 +    CREATE_(NET_WM_STATE_DEMANDS_ATTENTION);
 +
 +    prop_atoms[OBT_PROP_NET_WM_STATE_ADD] = 1;
 +    prop_atoms[OBT_PROP_NET_WM_STATE_REMOVE] = 0;
 +    prop_atoms[OBT_PROP_NET_WM_STATE_TOGGLE] = 2;
 +
 +    prop_atoms[OBT_PROP_NET_WM_ORIENTATION_HORZ] = 0;
 +    prop_atoms[OBT_PROP_NET_WM_ORIENTATION_VERT] = 1;
 +    prop_atoms[OBT_PROP_NET_WM_TOPLEFT] = 0;
 +    prop_atoms[OBT_PROP_NET_WM_TOPRIGHT] = 1;
 +    prop_atoms[OBT_PROP_NET_WM_BOTTOMRIGHT] = 2;
 +    prop_atoms[OBT_PROP_NET_WM_BOTTOMLEFT] = 3;
 +
 +    CREATE_(KDE_WM_CHANGE_STATE);
 +    CREATE_(KDE_NET_WM_WINDOW_TYPE_OVERRIDE);
 +
 +/*
 +    CREATE_NAME(ROOTPMAPId, "_XROOTPMAP_ID");
 +    CREATE_NAME(ESETROOTId, "ESETROOT_PMAP_ID");
 +*/
 +
 +    CREATE_(OPENBOX_PID);
 +    CREATE_(OB_THEME);
 +    CREATE_(OB_CONFIG_FILE);
 +    CREATE_(OB_WM_ACTION_UNDECORATE);
 +    CREATE_(OB_WM_STATE_UNDECORATED);
 +    CREATE_(OB_CONTROL);
 +}
 +
 +Atom obt_prop_atom(ObtPropAtom a)
 +{
 +    g_assert(prop_started);
 +    g_assert(a < OBT_PROP_NUM_ATOMS);
 +    return prop_atoms[a];
 +}
 +
 +static gboolean get_prealloc(Window win, Atom prop, Atom type, gint size,
 +                             guchar *data, gulong num)
 +{
 +    gboolean ret = FALSE;
 +    gint res;
 +    guchar *xdata = NULL;
 +    Atom ret_type;
 +    gint ret_size;
 +    gulong ret_items, bytes_left;
 +    glong num32 = 32 / size * num; /* num in 32-bit elements */
 +
 +    res = XGetWindowProperty(obt_display, win, prop, 0l, num32,
 +                             FALSE, type, &ret_type, &ret_size,
 +                             &ret_items, &bytes_left, &xdata);
 +    if (res == Success && ret_items && xdata) {
 +        if (ret_size == size && ret_items >= num) {
 +            guint i;
 +            for (i = 0; i < num; ++i)
 +                switch (size) {
 +                case 8:
 +                    data[i] = xdata[i];
 +                    break;
 +                case 16:
 +                    ((guint16*)data)[i] = ((gushort*)xdata)[i];
 +                    break;
 +                case 32:
 +                    ((guint32*)data)[i] = ((gulong*)xdata)[i];
 +                    break;
 +                default:
 +                    g_assert_not_reached(); /* unhandled size */
 +                }
 +            ret = TRUE;
 +        }
 +        XFree(xdata);
 +    }
 +    return ret;
 +}
 +
 +static gboolean get_all(Window win, Atom prop, Atom type, gint size,
 +                        guchar **data, guint *num)
 +{
 +    gboolean ret = FALSE;
 +    gint res;
 +    guchar *xdata = NULL;
 +    Atom ret_type;
 +    gint ret_size;
 +    gulong ret_items, bytes_left;
 +
 +    res = XGetWindowProperty(obt_display, win, prop, 0l, G_MAXLONG,
 +                             FALSE, type, &ret_type, &ret_size,
 +                             &ret_items, &bytes_left, &xdata);
 +    if (res == Success) {
 +        if (ret_size == size && ret_items > 0) {
 +            guint i;
 +
 +            *data = g_malloc(ret_items * (size / 8));
 +            for (i = 0; i < ret_items; ++i)
 +                switch (size) {
 +                case 8:
 +                    (*data)[i] = xdata[i];
 +                    break;
 +                case 16:
 +                    ((guint16*)*data)[i] = ((gushort*)xdata)[i];
 +                    break;
 +                case 32:
 +                    ((guint32*)*data)[i] = ((gulong*)xdata)[i];
 +                    break;
 +                default:
 +                    g_assert_not_reached(); /* unhandled size */
 +                }
 +            *num = ret_items;
 +            ret = TRUE;
 +        }
 +        XFree(xdata);
 +    }
 +    return ret;
 +}
 +
 +static gboolean get_stringlist(Window win, Atom prop, gchar ***list, gint *nstr)
 +{
 +    XTextProperty tprop;
 +    gboolean ret = FALSE;
 +
 +    if (XGetTextProperty(obt_display, win, &tprop, prop) && tprop.nitems) {
 +        if (XTextPropertyToStringList(&tprop, list, nstr))
 +            ret = TRUE;
 +        XFree(tprop.value);
 +    }
 +    return ret;
 +}
 +
 +gboolean obt_prop_get32(Window win, Atom prop, Atom type, guint32 *ret)
 +{
 +    return get_prealloc(win, prop, type, 32, (guchar*)ret, 1);
 +}
 +
 +gboolean obt_prop_get_array32(Window win, Atom prop, Atom type, guint32 **ret,
 +                              guint *nret)
 +{
 +    return get_all(win, prop, type, 32, (guchar**)ret, nret);
 +}
 +
 +gboolean obt_prop_get_string_locale(Window win, Atom prop, gchar **ret)
 +{
 +    gchar **list;
 +    gint nstr;
 +    gchar *s;
 +
 +    if (get_stringlist(win, prop, &list, &nstr) && nstr) {
 +        s = g_locale_to_utf8(list[0], -1, NULL, NULL, NULL);
 +        XFreeStringList(list);
 +        if (s) {
 +            *ret = s;
 +            return TRUE;
 +        }
 +    }
 +    return FALSE;
 +}
 +
 +gboolean obt_prop_get_strings_locale(Window win, Atom prop, gchar ***ret)
 +{
 +    GSList *strs = NULL, *it;
 +    gchar *raw, *p;
 +    guint num, i, count = 0;
 +
 +    if (get_all(win, prop, OBT_PROP_ATOM(STRING), 8,
 +                (guchar**)&raw, &num))
 +    {
 +        p = raw;
 +        while (p < raw + num) {
 +            ++count;
 +            strs = g_slist_append(strs, p);
 +            p += strlen(p) + 1; /* next string */
 +        }
 +
 +        *ret = g_new0(gchar*, count + 1);
 +        (*ret)[count] = NULL; /* null terminated list */
 +
 +        for (i = 0, it = strs; it; ++i, it = g_slist_next(it)) {
 +            (*ret)[i] = g_locale_to_utf8(it->data, -1, NULL, NULL, NULL);
 +            /* make sure translation did not fail */
 +            if (!(*ret)[i])
 +                (*ret)[i] = g_strdup("");
 +        }
 +        g_free(raw);
 +        g_slist_free(strs);
 +        return TRUE;
 +    }
 +    return FALSE;
 +}
 +
 +gboolean obt_prop_get_string_utf8(Window win, Atom prop, gchar **ret)
 +{
 +    gchar *raw;
 +    gchar *str;
 +    guint num;
 +
 +    if (get_all(win, prop, OBT_PROP_ATOM(UTF8), 8,
 +                (guchar**)&raw, &num))
 +    {
 +        str = g_strndup(raw, num); /* grab the first string from the list */
 +        g_free(raw);
 +        if (g_utf8_validate(str, -1, NULL)) {
 +            *ret = str;
 +            return TRUE;
 +        }
 +        g_free(str);
 +    }
 +    return FALSE;
 +}
 +
 +gboolean obt_prop_get_strings_utf8(Window win, Atom prop, gchar ***ret)
 +{
 +    GSList *strs = NULL, *it;
 +    gchar *raw, *p;
 +    guint num, i, count = 0;
 +
 +    if (get_all(win, prop, OBT_PROP_ATOM(UTF8), 8,
 +                (guchar**)&raw, &num))
 +    {
 +        p = raw;
 +        while (p < raw + num) {
 +            ++count;
 +            strs = g_slist_append(strs, p);
 +            p += strlen(p) + 1; /* next string */
 +        }
 +
 +        *ret = g_new0(gchar*, count + 1);
 +
 +        for (i = 0, it = strs; it; ++i, it = g_slist_next(it)) {
 +            if (g_utf8_validate(it->data, -1, NULL))
 +                (*ret)[i] = g_strdup(it->data);
 +            else
 +                (*ret)[i] = g_strdup("");
 +        }
 +        g_free(raw);
 +        g_slist_free(strs);
 +        return TRUE;
 +    }
 +    return FALSE;
 +}
 +
 +void obt_prop_set32(Window win, Atom prop, Atom type, gulong val)
 +{
 +    XChangeProperty(obt_display, win, prop, type, 32, PropModeReplace,
 +                    (guchar*)&val, 1);
 +}
 +
 +void obt_prop_set_array32(Window win, Atom prop, Atom type, gulong *val,
 +                      guint num)
 +{
 +    XChangeProperty(obt_display, win, prop, type, 32, PropModeReplace,
 +                    (guchar*)val, num);
 +}
 +
 +void obt_prop_set_string_locale(Window win, Atom prop, const gchar *val)
 +{
 +    gchar const *s[2] = { val, NULL };
 +    obt_prop_set_strings_locale(win, prop, s);
 +}
 +
 +void obt_prop_set_strings_locale(Window win, Atom prop, const gchar **strs)
 +{
 +    gint i, count;
 +    gchar **lstrs;
 +    XTextProperty tprop;
 +
 +    /* count the strings in strs, and convert them to the locale format */
 +    for (count = 0; strs[count]; ++count);
 +    lstrs = g_new0(char*, count);
 +    for (i = 0; i < count; ++i) {
 +        lstrs[i] = g_locale_from_utf8(strs[i], -1, NULL, NULL, NULL);
 +        if (!lstrs[i]) {
 +            lstrs[i] = g_strdup(""); /* make it an empty string */
 +            g_warning("Unable to translate string '%s' from UTF8 to locale "
 +                      "format", strs[i]);
 +        }
 +    }
 +
 +
 +    XStringListToTextProperty(lstrs, count, &tprop);
 +    XSetTextProperty(obt_display, win, &tprop, prop);
 +    XFree(tprop.value);
 +}
 +
 +void obt_prop_set_string_utf8(Window win, Atom prop, const gchar *val)
 +{
 +    XChangeProperty(obt_display, win, prop, OBT_PROP_ATOM(UTF8), 8,
 +                    PropModeReplace, (const guchar*)val, strlen(val));
 +}
 +
 +void obt_prop_set_strings_utf8(Window win, Atom prop, const gchar **strs)
 +{
 +    GString *str;
 +    gchar const **s;
 +
 +    str = g_string_sized_new(0);
 +    for (s = strs; *s; ++s) {
 +        str = g_string_append(str, *s);
 +        str = g_string_append_c(str, '\0');
 +    }
 +    XChangeProperty(obt_display, win, prop, obt_prop_atom(OBT_PROP_UTF8), 8,
 +                    PropModeReplace, (guchar*)str->str, str->len);
 +    g_string_free(str, TRUE);
 +}
 +
 +void obt_prop_erase(Window win, Atom prop)
 +{
 +    XDeleteProperty(obt_display, win, prop);
 +}
 +
 +void obt_prop_message(gint screen, Window about, Atom messagetype,
 +                      glong data0, glong data1, glong data2, glong data3,
 +                      glong data4, glong mask)
 +{
 +    obt_prop_message_to(obt_root(screen), about, messagetype,
 +                        data0, data1, data2, data3, data4, mask);
 +}
 +
 +void obt_prop_message_to(Window to, Window about,
 +                         Atom messagetype,
 +                         glong data0, glong data1, glong data2, glong data3,
 +                         glong data4, glong mask)
 +{
 +    XEvent ce;
 +    ce.xclient.type = ClientMessage;
 +    ce.xclient.message_type = messagetype;
 +    ce.xclient.display = obt_display;
 +    ce.xclient.window = about;
 +    ce.xclient.format = 32;
 +    ce.xclient.data.l[0] = data0;
 +    ce.xclient.data.l[1] = data1;
 +    ce.xclient.data.l[2] = data2;
 +    ce.xclient.data.l[3] = data3;
 +    ce.xclient.data.l[4] = data4;
 +    XSendEvent(obt_display, to, FALSE, mask, &ce);
 +}
diff --combined obt/prop.h
index e123611,0000000..97a2c9f
mode 100644,000000..100644
--- /dev/null
@@@ -1,278 -1,0 +1,280 @@@
 +/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
 +
 +   obt/prop.h for the Openbox window manager
 +   Copyright (c) 2006        Mikael Magnusson
 +   Copyright (c) 2003-2007   Dana Jansens
 +
 +   This program is free software; you can redistribute it and/or modify
 +   it under the terms of the GNU General Public License as published by
 +   the Free Software Foundation; either version 2 of the License, or
 +   (at your option) any later version.
 +
 +   This program is distributed in the hope that it will be useful,
 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +   GNU General Public License for more details.
 +
 +   See the COPYING file for a copy of the GNU General Public License.
 +*/
 +
 +#ifndef __obt_prop_h
 +#define __obt_prop_h
 +
 +#include <X11/Xlib.h>
 +#include <glib.h>
 +
 +G_BEGIN_DECLS
 +
 +typedef enum {
 +    /* types */
 +    OBT_PROP_CARDINAL, /*!< The atom which represents the Cardinal data type */
 +    OBT_PROP_WINDOW,   /*!< The atom which represents window ids */
 +    OBT_PROP_PIXMAP,   /*!< The atom which represents pixmap ids */
 +    OBT_PROP_ATOM,     /*!< The atom which represents atom values */
 +    OBT_PROP_STRING,   /*!< The atom which represents ascii strings */
 +    OBT_PROP_UTF8,     /*!< The atom which represents utf8-encoded strings */
 +
 +    /* selection stuff */
 +    OBT_PROP_MANAGER,
 +
 +    /* window hints */
 +    OBT_PROP_WM_COLORMAP_WINDOWS,
 +    OBT_PROP_WM_PROTOCOLS,
 +    OBT_PROP_WM_STATE,
 +    OBT_PROP_WM_DELETE_WINDOW,
 +    OBT_PROP_WM_TAKE_FOCUS,
 +    OBT_PROP_WM_CHANGE_STATE,
 +    OBT_PROP_WM_NAME,
 +    OBT_PROP_WM_ICON_NAME,
 +    OBT_PROP_WM_CLASS,
 +    OBT_PROP_WM_WINDOW_ROLE,
 +    OBT_PROP_WM_CLIENT_MACHINE,
 +    OBT_PROP_WM_COMMAND,
 +    OBT_PROP_WM_CLIENT_LEADER,
 +    OBT_PROP_MOTIF_WM_HINTS,
 +
 +    /* SM atoms */
 +    OBT_PROP_SM_CLIENT_ID,
 +
 +    /* NETWM atoms */
 +
 +    /* Atoms that are used inside messages - these don't go in net_supported */
 +
 +    OBT_PROP_NET_WM_MOVERESIZE_SIZE_TOPLEFT,
 +    OBT_PROP_NET_WM_MOVERESIZE_SIZE_TOP,
 +    OBT_PROP_NET_WM_MOVERESIZE_SIZE_TOPRIGHT,
 +    OBT_PROP_NET_WM_MOVERESIZE_SIZE_RIGHT,
 +    OBT_PROP_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT,
 +    OBT_PROP_NET_WM_MOVERESIZE_SIZE_BOTTOM,
 +    OBT_PROP_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT,
 +    OBT_PROP_NET_WM_MOVERESIZE_SIZE_LEFT,
 +    OBT_PROP_NET_WM_MOVERESIZE_MOVE,
 +    OBT_PROP_NET_WM_MOVERESIZE_SIZE_KEYBOARD,
 +    OBT_PROP_NET_WM_MOVERESIZE_MOVE_KEYBOARD,
 +    OBT_PROP_NET_WM_MOVERESIZE_CANCEL,
 +
 +    OBT_PROP_NET_WM_STATE_ADD,
 +    OBT_PROP_NET_WM_STATE_REMOVE,
 +    OBT_PROP_NET_WM_STATE_TOGGLE,
 +
 +    OBT_PROP_NET_WM_ORIENTATION_HORZ,
 +    OBT_PROP_NET_WM_ORIENTATION_VERT,
 +    OBT_PROP_NET_WM_TOPLEFT,
 +    OBT_PROP_NET_WM_TOPRIGHT,
 +    OBT_PROP_NET_WM_BOTTOMRIGHT,
 +    OBT_PROP_NET_WM_BOTTOMLEFT,
 +
++    OBT_PROP_NET_WM_WINDOW_TYPE_POPUP_MENU,
++
 +    OBT_PROP_PRIVATE_PADDING1,
 +    OBT_PROP_PRIVATE_PADDING2,
 +    OBT_PROP_PRIVATE_PADDING3,
 +    OBT_PROP_PRIVATE_PADDING4,
 +    OBT_PROP_PRIVATE_PADDING5,
 +    OBT_PROP_PRIVATE_PADDING6,
 +    OBT_PROP_PRIVATE_PADDING7,
 +    OBT_PROP_PRIVATE_PADDING8,
 +    OBT_PROP_PRIVATE_PADDING9,
 +    OBT_PROP_PRIVATE_PADDING10,
 +    OBT_PROP_PRIVATE_PADDING11,
 +    OBT_PROP_PRIVATE_PADDING12,
 +
 +    /* Everything below here must go in net_supported on the root window */
 +
 +    /* root window properties */
 +    OBT_PROP_NET_SUPPORTED,
 +    OBT_PROP_NET_CLIENT_LIST,
 +    OBT_PROP_NET_CLIENT_LIST_STACKING,
 +    OBT_PROP_NET_NUMBER_OF_DESKTOPS,
 +    OBT_PROP_NET_DESKTOP_GEOMETRY,
 +    OBT_PROP_NET_DESKTOP_VIEWPORT,
 +    OBT_PROP_NET_CURRENT_DESKTOP,
 +    OBT_PROP_NET_DESKTOP_NAMES,
 +    OBT_PROP_NET_ACTIVE_WINDOW,
 +/*    Atom net_restack_window;*/
 +    OBT_PROP_NET_WORKAREA,
 +    OBT_PROP_NET_SUPPORTING_WM_CHECK,
 +    OBT_PROP_NET_DESKTOP_LAYOUT,
 +    OBT_PROP_NET_SHOWING_DESKTOP,
 +
 +    /* root window messages */
 +    OBT_PROP_NET_CLOSE_WINDOW,
 +    OBT_PROP_NET_WM_MOVERESIZE,
 +    OBT_PROP_NET_MOVERESIZE_WINDOW,
 +    OBT_PROP_NET_REQUEST_FRAME_EXTENTS,
 +    OBT_PROP_NET_RESTACK_WINDOW,
 +
 +    /* helpful hints to apps that aren't used for anything */
 +    OBT_PROP_NET_WM_FULL_PLACEMENT,
 +
 +    /* startup-notification extension */
 +    OBT_PROP_NET_STARTUP_ID,
 +
 +    /* application window properties */
 +    OBT_PROP_NET_WM_NAME,
 +    OBT_PROP_NET_WM_VISIBLE_NAME,
 +    OBT_PROP_NET_WM_ICON_NAME,
 +    OBT_PROP_NET_WM_VISIBLE_ICON_NAME,
 +    OBT_PROP_NET_WM_DESKTOP,
 +    OBT_PROP_NET_WM_WINDOW_TYPE,
 +    OBT_PROP_NET_WM_STATE,
 +    OBT_PROP_NET_WM_STRUT,
 +    OBT_PROP_NET_WM_STRUT_PARTIAL,
 +    OBT_PROP_NET_WM_ICON,
 +    OBT_PROP_NET_WM_ICON_GEOMETRY,
 +    OBT_PROP_NET_WM_PID,
 +    OBT_PROP_NET_WM_ALLOWED_ACTIONS,
 +    OBT_PROP_NET_WM_USER_TIME,
 +/*  OBT_PROP_NET_WM_USER_TIME_WINDOW, */
 +    OBT_PROP_NET_FRAME_EXTENTS,
 +
 +    /* application protocols */
 +    OBT_PROP_NET_WM_PING,
 +#ifdef SYNC
 +    OBT_PROP_NET_WM_SYNC_REQUEST,
 +    OBT_PROP_NET_WM_SYNC_REQUEST_COUNTER,
 +#endif
 +
 +    OBT_PROP_NET_WM_WINDOW_TYPE_DESKTOP,
 +    OBT_PROP_NET_WM_WINDOW_TYPE_DOCK,
 +    OBT_PROP_NET_WM_WINDOW_TYPE_TOOLBAR,
 +    OBT_PROP_NET_WM_WINDOW_TYPE_MENU,
 +    OBT_PROP_NET_WM_WINDOW_TYPE_UTILITY,
 +    OBT_PROP_NET_WM_WINDOW_TYPE_SPLASH,
 +    OBT_PROP_NET_WM_WINDOW_TYPE_DIALOG,
 +    OBT_PROP_NET_WM_WINDOW_TYPE_NORMAL,
 +
 +    OBT_PROP_NET_WM_ACTION_MOVE,
 +    OBT_PROP_NET_WM_ACTION_RESIZE,
 +    OBT_PROP_NET_WM_ACTION_MINIMIZE,
 +    OBT_PROP_NET_WM_ACTION_SHADE,
 +/*    OBT_PROP_NET_WM_ACTION_STICK,*/
 +    OBT_PROP_NET_WM_ACTION_MAXIMIZE_HORZ,
 +    OBT_PROP_NET_WM_ACTION_MAXIMIZE_VERT,
 +    OBT_PROP_NET_WM_ACTION_FULLSCREEN,
 +    OBT_PROP_NET_WM_ACTION_CHANGE_DESKTOP,
 +    OBT_PROP_NET_WM_ACTION_CLOSE,
 +    OBT_PROP_NET_WM_ACTION_ABOVE,
 +    OBT_PROP_NET_WM_ACTION_BELOW,
 +
 +    OBT_PROP_NET_WM_STATE_MODAL,
 +/*    OBT_PROP_NET_WM_STATE_STICKY,*/
 +    OBT_PROP_NET_WM_STATE_MAXIMIZED_VERT,
 +    OBT_PROP_NET_WM_STATE_MAXIMIZED_HORZ,
 +    OBT_PROP_NET_WM_STATE_SHADED,
 +    OBT_PROP_NET_WM_STATE_SKIP_TASKBAR,
 +    OBT_PROP_NET_WM_STATE_SKIP_PAGER,
 +    OBT_PROP_NET_WM_STATE_HIDDEN,
 +    OBT_PROP_NET_WM_STATE_FULLSCREEN,
 +    OBT_PROP_NET_WM_STATE_ABOVE,
 +    OBT_PROP_NET_WM_STATE_BELOW,
 +    OBT_PROP_NET_WM_STATE_DEMANDS_ATTENTION,
 +
 +    /* KDE atoms */
 +
 +    OBT_PROP_KDE_WM_CHANGE_STATE,
 +    OBT_PROP_KDE_NET_WM_FRAME_STRUT,
 +    OBT_PROP_KDE_NET_WM_WINDOW_TYPE_OVERRIDE,
 +
 +/*
 +    OBT_PROP_ROOTPMAPID,
 +    OBT_PROP_ESETROOTID,
 +*/
 +
 +    /* Openbox specific atoms */
 +
 +    OBT_PROP_OB_WM_ACTION_UNDECORATE,
 +    OBT_PROP_OB_WM_STATE_UNDECORATED,
 +    OBT_PROP_OPENBOX_PID, /* this is depreecated in favour of ob_control */
 +    OBT_PROP_OB_THEME,
 +    OBT_PROP_OB_CONFIG_FILE,
 +    OBT_PROP_OB_CONTROL,
 +
 +    OBT_PROP_NUM_ATOMS
 +} ObtPropAtom;
 +
 +Atom obt_prop_atom(ObtPropAtom a);
 +
 +gboolean obt_prop_get32(Window win, Atom prop, Atom type, guint32 *ret);
 +gboolean obt_prop_get_array32(Window win, Atom prop, Atom type, guint32 **ret,
 +                              guint *nret);
 +gboolean obt_prop_get_string_locale(Window win, Atom prop, gchar **ret);
 +gboolean obt_prop_get_string_utf8(Window win, Atom prop, gchar **ret);
 +gboolean obt_prop_get_strings_locale(Window win, Atom prop, gchar ***ret);
 +gboolean obt_prop_get_strings_utf8(Window win, Atom prop, gchar ***ret);
 +
 +void obt_prop_set32(Window win, Atom prop, Atom type, gulong val);
 +void obt_prop_set_array32(Window win, Atom prop, Atom type, gulong *val,
 +                          guint num);
 +void obt_prop_set_string_locale(Window win, Atom prop, const gchar *val);
 +void obt_prop_set_string_utf8(Window win, Atom prop, const gchar *val);
 +void obt_prop_set_strings_locale(Window win, Atom prop, const gchar **strs);
 +void obt_prop_set_strings_utf8(Window win, Atom prop, const gchar **strs);
 +
 +void obt_prop_erase(Window win, Atom prop);
 +
 +void obt_prop_message(gint screen, Window about, Atom messagetype,
 +                      glong data0, glong data1, glong data2, glong data3,
 +                      glong data4, glong mask);
 +void obt_prop_message_to(Window to, Window about, Atom messagetype,
 +                         glong data0, glong data1, glong data2, glong data3,
 +                         glong data4, glong mask);
 +
 +#define OBT_PROP_ATOM(prop) obt_prop_atom(OBT_PROP_##prop)
 +
 +#define OBT_PROP_GET32(win, prop, type, ret) \
 +    (obt_prop_get32(win, OBT_PROP_ATOM(prop), OBT_PROP_ATOM(type), ret))
 +#define OBT_PROP_GETA32(win, prop, type, ret, nret) \
 +    (obt_prop_get_array32(win, OBT_PROP_ATOM(prop), OBT_PROP_ATOM(type), \
 +                          ret, nret))
 +#define OBT_PROP_GETS(win, prop, type, ret) \
 +    (obt_prop_get_string_##type(win, OBT_PROP_ATOM(prop), ret))
 +#define OBT_PROP_GETSS(win, prop, type, ret) \
 +    (obt_prop_get_strings_##type(win, OBT_PROP_ATOM(prop), ret))
 +
 +#define OBT_PROP_SET32(win, prop, type, val) \
 +    (obt_prop_set32(win, OBT_PROP_ATOM(prop), OBT_PROP_ATOM(type), val))
 +#define OBT_PROP_SETA32(win, prop, type, val, num) \
 +    (obt_prop_set_array32(win, OBT_PROP_ATOM(prop), OBT_PROP_ATOM(type), \
 +                          val, num))
 +#define OBT_PROP_SETS(win, prop, type, val) \
 +    (obt_prop_set_string_##type(win, OBT_PROP_ATOM(prop), val))
 +#define OBT_PROP_SETSS(win, prop, type, strs) \
 +    (obt_prop_set_strings_##type(win, OBT_PROP_ATOM(prop), strs))
 +
 +#define OBT_PROP_ERASE(win, prop) (obt_prop_erase(win, OBT_PROP_ATOM(prop)))
 +
 +#define OBT_PROP_MSG(screen, about, msgtype, data0, data1, data2, data3, \
 +                     data4) \
 +    (obt_prop_message(screen, about, OBT_PROP_ATOM(msgtype), \
 +                      data0, data1, data2, data3, data4, \
 +                      SubstructureNotifyMask | SubstructureRedirectMask))
 +
 +#define OBT_PROP_MSG_TO(to, about, msgtype, data0, data1, data2, data3, \
 +                        data4, mask) \
 +    (obt_prop_message_to(to, about, OBT_PROP_ATOM(msgtype), \
 +                         data0, data1, data2, data3, data4, mask))
 +
 +G_END_DECLS
 +
 +#endif /* __obt_prop_h */
diff --combined openbox/frame.c
  #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);
  }
  
@@@ -224,9 -226,9 +224,9 @@@ 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);
  }
@@@ -240,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);
      }
  }
@@@ -251,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;
      }
  }
@@@ -273,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);
      }
@@@ -380,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);
  
  }
@@@ -875,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);
  }
@@@ -942,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)
@@@ -965,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? */
@@@ -1235,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)
@@@ -1337,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) {
@@@ -1630,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);
  
@@@ -1690,7 -1694,7 +1690,7 @@@ static gboolean frame_animate_iconify(g
      g_get_current_time(&now);
      time = frame_animate_iconify_time_left(self, &now);
  
-     if (time == 0 || iconifying) {
+     if ((time > 0 && iconifying) || (time == 0 && !iconifying)) {
          /* start where the frame is supposed to be */
          x = self->area.x;
          y = self->area.y;
          h = self->size.top; /* just the titlebar */
      }
  
 -    XMoveResizeWindow(ob_display, self->window, x, y, w, h);
 -    XFlush(ob_display);
++    XMoveResizeWindow(obt_display, self->window, x, y, w, h);
++    XFlush(obt_display);
      if (time == 0)
          frame_end_iconify_animation(self);
-     else {
-         XMoveResizeWindow(obt_display, self->window, x, y, w, h);
-         XFlush(obt_display);
-     }
  
      return time > 0; /* repeat until we're out of time */
  }
@@@ -1737,7 -1740,7 +1736,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/menuframe.c
  #include "client.h"
  #include "menu.h"
  #include "screen.h"
 -#include "prop.h"
  #include "actions.h"
  #include "grab.h"
  #include "openbox.h"
 -#include "mainloop.h"
  #include "config.h"
++#include "obt/prop.h"
  #include "render/theme.h"
  
  #define PADDING 2
@@@ -50,7 -52,7 +51,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 -79,7 +78,7 @@@ ObMenuFrame* menu_frame_new(ObMenu *men
      XSetWindowAttributes attr;
  
      self = g_new0(ObMenuFrame, 1);
 -    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);
  
 -    PROP_SET32(self->window, net_wm_window_type, atom,
 -               prop_atoms.net_wm_window_type_popup_menu);
+     /* make it a popup menu type window */
 -    XSetWindowBorderWidth(ob_display, self->window, ob_rr_theme->mbwidth);
 -    XSetWindowBorder(ob_display, self->window,
++    OBT_PROP_SET32(self->window, NET_WM_WINDOW_TYPE, ATOM,
++                   OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_POPUP_MENU));
 +    XSetWindowBorderWidth(obt_display, self->window, ob_rr_theme->mbwidth);
 +    XSetWindowBorder(obt_display, self->window,
                       RrColorPixel(ob_rr_theme->menu_border_color));
  
      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;
  }
@@@ -108,12 -113,11 +113,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);
  
          RrAppearanceFree(self->a_items);
  
 -        XDestroyWindow(ob_display, self->window);
 +        XDestroyWindow(obt_display, self->window);
  
          g_free(self);
      }
@@@ -145,10 -149,8 +150,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);
 +
 +    window_add(&self->window, MENUFRAME_AS_WINDOW(self->frame));
  
      return self;
  }
@@@ -158,18 -160,16 +163,18 @@@ 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);
          }
  
  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)
@@@ -341,7 -341,7 +346,7 @@@ static void menu_entry_frame_render(ObM
      }
  
      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;
  
      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 -
              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);
  
              clear = ob_rr_theme->a_clear_tex;
      {
          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,
                  - 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,
                  - 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,
          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
@@@ -671,10 -671,10 +676,10 @@@ void menu_frame_render(ObMenuFrame *sel
          }
  
          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));
  
  
      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)
@@@ -952,7 -952,7 +957,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);
@@@ -995,7 -995,7 +1000,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);
@@@ -1032,7 -1032,7 +1037,7 @@@ static void menu_frame_hide(ObMenuFram
          ungrab_keyboard();
      }
  
 -    XUnmapWindow(ob_display, self->window);
 +    XUnmapWindow(obt_display, self->window);
  
      menu_frame_free(self);
  }
@@@ -1043,8 -1043,8 +1048,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);
@@@ -1058,8 -1058,8 +1063,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);
          }
@@@ -1125,8 -1125,8 +1130,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);
              }