fixed the flicker in shape
authorDerek Foreman <manmower@gmail.com>
Tue, 27 May 2003 21:50:09 +0000 (21:50 +0000)
committerDerek Foreman <manmower@gmail.com>
Tue, 27 May 2003 21:50:09 +0000 (21:50 +0000)
(we use a shapewindow now.  it rules, I rule, fuck X, blah blah MOOOOOOO)

openbox/frame.c
openbox/frame.h

index a08fecf605b9867977e770994d435d3718e4da7c..fd0d402f1c2c683f5259cce1cd3ba0014643912d 100644 (file)
@@ -42,12 +42,12 @@ Frame *frame_new()
     attrib.event_mask = FRAME_EVENTMASK;
     attrib.override_redirect = TRUE;
     self->window = createWindow(ob_root, mask, &attrib);
-
-    self->surface = RrSurfaceNew(ob_render_inst, RR_SURFACE_PLANAR,
+/* never map shapewindow */
+    self->shapewindow = createWindow(ob_root, mask, &attrib);
+    self->surface = RrSurfaceNew(ob_render_inst, RR_SURFACE_NONE,
                                  self->window, 0);
     RrColorSet(&pri, 1, 0, 0, 0);
     RrColorSet(&sec, 1, 0, 1, 0);
-    RrPlanarSet(self->surface, RR_PLANAR_VERTICAL, &pri, &sec);
 
     mask = 0;
     self->plate = createWindow(self->window, mask, &attrib);
@@ -146,6 +146,7 @@ static void frame_free(Frame *self)
     RrSurfaceFree(self->surface);
     XDestroyWindow(ob_display, self->plate);
     XDestroyWindow(ob_display, self->window);
+    XDestroyWindow(ob_display, self->shapewindow);
     g_free(self->framedecor);
     g_free(self);
 }
@@ -174,8 +175,11 @@ void frame_adjust_shape(Frame *self)
     int i;
     FrameDecor *dec;
 
-    /* make the frame's shape match the clients */
-    XShapeCombineShape(ob_display, self->window, ShapeBounding,
+    /* make the pixmap's shape match the clients */
+printf("resize shape window to %x, %x\n", self->area.width, self->area.height);
+    XResizeWindow(ob_display, self->shapewindow, self->area.width,
+                      self->area.height);
+    XShapeCombineShape(ob_display, self->shapewindow, ShapeBounding,
                        self->size.left,
                        self->size.top,
                        self->client->window,
@@ -183,13 +187,19 @@ void frame_adjust_shape(Frame *self)
     for (i = 0; i < self->framedecors; i++) {
         dec = &self->framedecor[i];
         if (dec->type & self->client->decorations)
-            XShapeCombineShape(ob_display, self->window, ShapeBounding,
+            XShapeCombineShape(ob_display, self->shapewindow, ShapeBounding,
                               dec->xoff,
                               dec->yoff,
                               dec->window,
                               ShapeBounding, ShapeUnion);
     }
 
+    XShapeCombineShape(ob_display, self->window, ShapeBounding,
+                       0,
+                       0,
+                       self->shapewindow,
+                       ShapeBounding, ShapeSet);
+
 #endif
 }
 
index 928262d1137f05389dc3fa245eed7da8e6109c59..36b8a94825bed11d036281363ebe43432c5cb049 100644 (file)
@@ -64,6 +64,7 @@ typedef struct Frame {
     Client *client;
 
     Window window;
+    Window shapewindow;
 
     Strut  size;
     Rect   area;