/* adjust the frame to the client's size before showing or placing
the window */
frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
+ frame_adjust_client_area(self->frame);
/* where the frame was placed is where the window was originally */
placex = self->area.x;
XConfigureWindow(ob_display, self->window,
CWX|CWY|CWWidth|CWHeight|CWBorderWidth,
&changes);
+
+ frame_adjust_client_area(self->frame);
}
/* find the frame's dimensions and move/resize it */
/* if the client is shrinking, then resize the frame before the client */
if (send_resize_client && (w <= oldw && h <= oldh)) {
- if (send_resize_client) {
- XWindowChanges changes;
- changes.x = self->frame->size.left - self->border_width;
- changes.y = self->frame->size.top -self->border_width;
- changes.width = w;
- changes.height = h;
- changes.border_width = self->border_width;
- XConfigureWindow(ob_display, self->window,
- CWX|CWY|CWWidth|CWHeight|CWBorderWidth,
- &changes);
- }
+ XWindowChanges changes;
+
+ frame_adjust_client_area(self->frame);
+
+ changes.x = self->frame->size.left - self->border_width;
+ changes.y = self->frame->size.top -self->border_width;
+ changes.width = w;
+ changes.height = h;
+ changes.border_width = self->border_width;
+ XConfigureWindow(ob_display, self->window,
+ CWX|CWY|CWWidth|CWHeight|CWBorderWidth,
+ &changes);
}
XFlush(ob_display);
/* create the visible decor windows */
- mask = CWEventMask;
+ mask = 0;
if (visual) {
/* client has a 32-bit visual */
mask |= CWColormap | CWBackPixel | CWBorderPixel;
attrib.colormap = RrColormap(ob_rr_inst);
}
+
+ self->backback = createWindow(self->window, NULL, mask, &attrib);
+ self->backfront = createWindow(self->backback, NULL, mask, &attrib);
+
+ mask |= CWEventMask;
attrib.event_mask = ELEMENT_EVENTMASK;
self->title = createWindow(self->window, NULL, mask, &attrib);
self->titleleft = createWindow(self->window, NULL, mask, &attrib);
/* the other stuff is shown based on decor settings */
XMapWindow(ob_display, self->label);
+ XMapWindow(ob_display, self->backback);
+ XMapWindow(ob_display, self->backfront);
self->max_press = self->close_press = self->desk_press =
self->iconify_press = self->shade_press = FALSE;
} else
XUnmapWindow(ob_display, self->right);
+ XMoveResizeWindow(ob_display, self->backback,
+ self->size.left, self->size.top,
+ self->client->area.width,
+ self->client->area.height);
+
/* when the client has StaticGravity, it likes to move around. */
XMoveWindow(ob_display, self->client->window,
self->size.left - self->client->border_width,
}
}
+void frame_adjust_client_area(ObFrame *self)
+{
+ /* adjust the window which is there to prevent flashing on unmap */
+ XMoveResizeWindow(ob_display, self->backfront, 0, 0,
+ self->client->area.width,
+ self->client->area.height);
+}
+
void frame_adjust_state(ObFrame *self)
{
framerender_frame(self);
/* set all the windows for the frame in the window_map */
g_hash_table_insert(window_map, &self->window, self->client);
+ g_hash_table_insert(window_map, &self->backback, self->client);
+ g_hash_table_insert(window_map, &self->backfront, self->client);
g_hash_table_insert(window_map, &self->innerleft, self->client);
g_hash_table_insert(window_map, &self->innertop, self->client);
g_hash_table_insert(window_map, &self->innerright, self->client);
/* remove all the windows for the frame from the window_map */
g_hash_table_remove(window_map, &self->window);
+ g_hash_table_remove(window_map, &self->backback);
+ g_hash_table_remove(window_map, &self->backfront);
g_hash_table_remove(window_map, &self->innerleft);
g_hash_table_remove(window_map, &self->innertop);
g_hash_table_remove(window_map, &self->innerright);
Window innertop; /*!< For drawing the inner client border */
Window innerright; /*!< For drawing the inner client border */
Window innerbottom; /*!< For drawing the inner client border */
+ Window backback; /*!< A colored window shown while resizing */
+ Window backfront; /*!< An undrawn-in window, to prevent flashing on
+ unmap */
/* These are resize handles inside the titlebar */
Window topresize;
void frame_adjust_shape(ObFrame *self);
void frame_adjust_area(ObFrame *self, gboolean moved,
gboolean resized, gboolean fake);
+void frame_adjust_client_area(ObFrame *self);
void frame_adjust_state(ObFrame *self);
void frame_adjust_focus(ObFrame *self, gboolean hilite);
void frame_adjust_title(ObFrame *self);