save windows' colormaps rather than querying them from the server every time you focus it
Dana Jansens danakj@orodu.net
4 files changed,
32 insertions(+),
12 deletions(-)
M
openbox/client.c
→
openbox/client.c
@@ -49,7 +49,8 @@ #include <glib.h>
#include <X11/Xutil.h> /*! The event mask to grab on client windows */ -#define CLIENT_EVENTMASK (PropertyChangeMask | StructureNotifyMask) +#define CLIENT_EVENTMASK (PropertyChangeMask | StructureNotifyMask | \ + ColormapChangeMask) #define CLIENT_NOPROPAGATEMASK (ButtonPressMask | ButtonReleaseMask | \ ButtonMotionMask)@@ -75,6 +76,7 @@ static void client_get_shaped(ObClient *self);
static void client_get_mwm_hints(ObClient *self); static void client_get_gravity(ObClient *self); static void client_get_client_machine(ObClient *self); +static void client_get_colormap(ObClient *self); static void client_change_allowed_actions(ObClient *self); static void client_change_state(ObClient *self); static void client_change_wm_state(ObClient *self);@@ -939,6 +941,7 @@ (min/max sizes), so we're ready to set up the decorations/functions */
client_setup_decor_and_functions(self); client_get_client_machine(self); + client_get_colormap(self); client_update_title(self); client_update_class(self); client_update_sm_client_id(self);@@ -1308,6 +1311,19 @@
ret = XGetWindowAttributes(ob_display, self->window, &wattrib); g_assert(ret != BadWindow); self->gravity = wattrib.win_gravity; +} + +void client_get_colormap(ObClient *self) +{ + XWindowAttributes wa; + + if (XGetWindowAttributes(ob_display, self->window, &wa)) + client_update_colormap(self, wa.colormap); +} + +void client_update_colormap(ObClient *self, Colormap colormap) +{ + self->colormap = colormap; } void client_update_normal_hints(ObClient *self)
M
openbox/client.h
→
openbox/client.h
@@ -193,6 +193,9 @@ Size base_size;
/*! Window decoration and functionality hints */ ObMwmHints mwmhints; + + /*! The client's specified colormap */ + Colormap colormap; /*! Where to place the decorated window in relation to the undecorated window */@@ -543,6 +546,8 @@ void client_update_transient_for(ObClient *self);
/*! Update the protocols that the window supports and adjusts things if they change */ void client_update_protocols(ObClient *self); +/*! Updates the window's colormap */ +void client_update_colormap(ObClient *self, Colormap colormap); /*! Updates the WMNormalHints and adjusts things if they change */ void client_update_normal_hints(ObClient *self);
M
openbox/event.c
→
openbox/event.c
@@ -1175,6 +1175,9 @@ }
else if (msgtype == prop_atoms.sm_client_id) { client_update_sm_client_id(client); } + case ColormapNotify: + client_update_colormap(client, e->xcolormap.colormap); + break; default: ; #ifdef SHAPE
M
openbox/screen.c
→
openbox/screen.c
@@ -907,23 +907,19 @@ }
void screen_install_colormap(ObClient *client, gboolean install) { - XWindowAttributes wa; - if (client == NULL) { if (install) XInstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst)); else XUninstallColormap(RrDisplay(ob_rr_inst), RrColormap(ob_rr_inst)); } else { - if (XGetWindowAttributes(ob_display, client->window, &wa) && - wa.colormap != None) { - xerror_set_ignore(TRUE); - if (install) - XInstallColormap(RrDisplay(ob_rr_inst), wa.colormap); - else - XUninstallColormap(RrDisplay(ob_rr_inst), wa.colormap); - xerror_set_ignore(FALSE); - } + xerror_set_ignore(TRUE); + if (install) { + if (client->colormap != None) + XInstallColormap(RrDisplay(ob_rr_inst), client->colormap); + } else + XUninstallColormap(RrDisplay(ob_rr_inst), client->colormap); + xerror_set_ignore(FALSE); } }