From: Dana Jansens Date: Tue, 24 Apr 2007 01:29:53 +0000 (+0000) Subject: save windows' colormaps rather than querying them from the server every time you... X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=7ae95e46606a1fa22e302fd2c1ea99cb23acbd81;p=chaz%2Fopenbox save windows' colormaps rather than querying them from the server every time you focus it --- diff --git a/openbox/client.c b/openbox/client.c index 08d316c4..4dad9882 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -49,7 +49,8 @@ #include /*! 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 @@ static void client_get_all(ObClient *self) 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); @@ -1310,6 +1313,19 @@ static void client_get_gravity(ObClient *self) 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) { XSizeHints size; diff --git a/openbox/client.h b/openbox/client.h index 73596790..e9a13041 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -193,6 +193,9 @@ struct _ObClient /*! 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); diff --git a/openbox/event.c b/openbox/event.c index 759c2e22..5a2fe05b 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -1175,6 +1175,9 @@ static void event_handle_client(ObClient *client, XEvent *e) 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 diff --git a/openbox/screen.c b/openbox/screen.c index 74b8e71d..587dc647 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -907,23 +907,19 @@ void screen_show_desktop(gboolean show) 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); } }