save windows' colormaps rather than querying them from the server every time you...
authorDana Jansens <danakj@orodu.net>
Tue, 24 Apr 2007 01:29:53 +0000 (01:29 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 24 Apr 2007 01:29:53 +0000 (01:29 +0000)
openbox/client.c
openbox/client.h
openbox/event.c
openbox/screen.c

index 08d316c..4dad988 100644 (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;
index 7359679..e9a1304 100644 (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);
 
index 759c2e2..5a2fe05 100644 (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
index 74b8e71..587dc64 100644 (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);
     }
 }