Really do not create con pixmap when not needed

The pixmap of a borderless leaf container will not be used except
for the titlebar in a stack or tabs.

Make sure these containers do not (really) have a pixmap because it can
only get in the way.

fixes #1013
This commit is contained in:
Tony Crisci 2014-02-04 13:36:20 -05:00 committed by Michael Stapelberg
parent f891a8a9af
commit d6b32971df
1 changed files with 18 additions and 3 deletions

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 leaf container will not be used except
* for the titlebar in a stack or tabs (issue #1013). */
bool is_pixmap_needed = (con->border_style != BS_NONE ||
!con_is_leaf(con) ||
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);