Do not create container pixmap when not needed

The pixmap of a borderless container will not be used (except for the
titlebar in a stack or tabs). Make sure these containers do not have a
pixmap because it can only get in the way.

fixes #1013
This commit is contained in:
Tony Crisci 2014-01-19 10:22:50 -05:00 committed by Michael Stapelberg
parent ae555386b7
commit 6578976b61

21
src/x.c
View File

@ -667,9 +667,24 @@ void x_push_node(Con *con) {
/* As the pixmap only depends on the size and not on the position, it /* As the pixmap only depends on the size and not on the position, it
* is enough to check if width/height have changed. Also, we dont * is enough to check if width/height have changed. Also, we dont
* create a pixmap at all when the window is actually not visible * create a pixmap at all when the window is actually not visible
* (height == 0). */ * (height == 0) or when it is not needed. */
if ((state->rect.width != rect.width || bool has_rect_changed = (state->rect.width != rect.width || state->rect.height != rect.height);
state->rect.height != rect.height)) {
/* The pixmap of a borderless container will not be used (except for
* the titlebar in a stack or tabs). It can only get in the way. (bug
* #1013). */
bool is_pixmap_needed = (con->border_style != BS_NONE ||
con->parent->layout == L_STACKED ||
con->parent->layout == L_TABBED);
/* Check if the container has an unneeded pixmap left over from
* previously having a border or titlebar. */
if (!is_pixmap_needed && con->pixmap != XCB_NONE) {
xcb_free_pixmap(conn, con->pixmap);
con->pixmap = XCB_NONE;
}
if (has_rect_changed && is_pixmap_needed) {
if (con->pixmap == 0) { if (con->pixmap == 0) {
con->pixmap = xcb_generate_id(conn); con->pixmap = xcb_generate_id(conn);
con->pm_gc = xcb_generate_id(conn); con->pm_gc = xcb_generate_id(conn);