save windows' colormaps rather than querying them from the server every time you focus it

This commit is contained in:
Dana Jansens 2007-04-24 01:29:53 +00:00
parent 3595da62ca
commit 7ae95e4660
4 changed files with 32 additions and 12 deletions

View file

@ -49,7 +49,8 @@
#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 @@ 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;

View file

@ -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);

View file

@ -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

View file

@ -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);
}
}