]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
add decoration state to the frame struct. make client_configure adjust the frame...
[chaz/openbox] / openbox / client.c
index 249309094209cdab75f6b2d96e6a3c415beb2373..87cdba96973d61b55cef4f8f76bcff33ea6bbcee 100644 (file)
@@ -1027,10 +1027,7 @@ void client_setup_decor_and_functions(Client *self)
         if (self->type == Type_Desktop && self->desktop != DESKTOP_ALL)
             client_set_desktop(self, DESKTOP_ALL, FALSE);
 
-       /* change the decors on the frame, and with more/less decorations,
-           we may also need to be repositioned */
-       frame_adjust_area(self->frame, TRUE, TRUE);
-       /* with new decor, the window's maximized size may change */
+       /* adjust the client's decorations, etc. */
        client_reconfigure(self);
     } else {
         /* this makes sure that these windows appear on all desktops */
@@ -1091,8 +1088,11 @@ static void client_change_allowed_actions(Client *self)
 
 void client_reconfigure(Client *self)
 {
+    /* by making this pass FALSE for user, we avoid the emacs event storm where
+       every configurenotify causes an update in its normal hints, i think this
+       is generally what we want anyways... */
     client_configure(self, Corner_TopLeft, self->area.x, self->area.y,
-                     self->area.width, self->area.height, TRUE, TRUE);
+                     self->area.width, self->area.height, FALSE, TRUE);
 }
 
 void client_update_wmhints(Client *self)
@@ -1333,17 +1333,17 @@ void client_update_icons(Client *self)
 
             if (w*h == 0) continue;
 
-           self->icons[j].data = g_new(pixel32, w * h);
+           self->icons[j].data = g_new(RrPixel32, w * h);
             for (x = 0, y = 0, t = 0; t < w * h; ++t, ++x, ++i) {
                 if (x >= w) {
                     x = 0;
                     ++y;
                 }
                 self->icons[j].data[t] =
-                    (((data[i] >> 24) & 0xff) << default_alpha_offset) +
-                    (((data[i] >> 16) & 0xff) << default_red_offset) +
-                    (((data[i] >> 8) & 0xff) << default_green_offset) +
-                    (((data[i] >> 0) & 0xff) << default_blue_offset);
+                    (((data[i] >> 24) & 0xff) << RrDefaultAlphaOffset) +
+                    (((data[i] >> 16) & 0xff) << RrDefaultRedOffset) +
+                    (((data[i] >> 8) & 0xff) << RrDefaultGreenOffset) +
+                    (((data[i] >> 0) & 0xff) << RrDefaultBlueOffset);
             }
            g_assert(i <= num);
        }
@@ -1355,10 +1355,11 @@ void client_update_icons(Client *self)
             self->nicons++;
             self->icons = g_new(Icon, self->nicons);
             xerror_set_ignore(TRUE);
-            if (!render_pixmap_to_rgba(data[0], data[1],
-                                       &self->icons[self->nicons-1].width,
-                                       &self->icons[self->nicons-1].height,
-                                       &self->icons[self->nicons-1].data)) {
+            if (!RrPixmapToRGBA(ob_rr_inst,
+                                data[0], data[1],
+                                &self->icons[self->nicons-1].width,
+                                &self->icons[self->nicons-1].height,
+                                &self->icons[self->nicons-1].data)) {
                 g_free(&self->icons[self->nicons-1]);
                 self->nicons--;
             }
@@ -1373,12 +1374,13 @@ void client_update_icons(Client *self)
                 self->nicons++;
                 self->icons = g_new(Icon, self->nicons);
                 xerror_set_ignore(TRUE);
-                if (!render_pixmap_to_rgba(hints->icon_pixmap,
-                                           (hints->flags & IconMaskHint ?
-                                            hints->icon_mask : None),
-                                           &self->icons[self->nicons-1].width,
-                                           &self->icons[self->nicons-1].height,
-                                           &self->icons[self->nicons-1].data)){
+                if (!RrPixmapToRGBA(ob_rr_inst,
+                                    hints->icon_pixmap,
+                                    (hints->flags & IconMaskHint ?
+                                     hints->icon_mask : None),
+                                    &self->icons[self->nicons-1].width,
+                                    &self->icons[self->nicons-1].height,
+                                    &self->icons[self->nicons-1].data)){
                     g_free(&self->icons[self->nicons-1]);
                     self->nicons--;
                 }
@@ -1770,6 +1772,9 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h,
 
     /* move/resize the frame to match the request */
     if (self->frame) {
+        if (self->decorations != self->frame->decorations)
+            moved = resized = TRUE;
+
         if (moved || resized)
             frame_adjust_area(self->frame, moved, resized);
 
@@ -1777,7 +1782,7 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h,
            clients (emacs) freaking out, cuz they send back a configure every
            time they receive this event, which resends them this event... etc.
         */
-        if ((moved || resized) && (!user || final)) {
+        if ((!user && moved) || (user && final)) {
             XEvent event;
             event.type = ConfigureNotify;
             event.xconfigure.display = ob_display;
This page took 0.030634 seconds and 4 git commands to generate.