all repos — openbox @ 7ae95e46606a1fa22e302fd2c1ea99cb23acbd81

openbox fork - make it a bit more like ryudo

save windows' colormaps rather than querying them from the server every time you focus it
Dana Jansens danakj@orodu.net
commit

7ae95e46606a1fa22e302fd2c1ea99cb23acbd81

parent

3595da62ca70f494f3341af744da627af414cb18

4 files changed, 32 insertions(+), 12 deletions(-)

jump to
M openbox/client.copenbox/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.hopenbox/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.copenbox/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.copenbox/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); } }