From: Michael Stapelberg Date: Sun, 23 Aug 2009 19:49:38 +0000 (+0200) Subject: Bugfix: Correctly use base_width/base_height and size increment hints, correctly... X-Git-Tag: 3.d~121 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=55b1bf458271d5b1657d2d6fbb6592acdd80dfb6;p=i3%2Fi3 Bugfix: Correctly use base_width/base_height and size increment hints, correctly send fake configure notify events --- diff --git a/include/data.h b/include/data.h index 50d8349a..c942a96a 100644 --- a/include/data.h +++ b/include/data.h @@ -346,6 +346,9 @@ struct Client { int proportional_height; int proportional_width; + int base_height; + int base_width; + /** contains the minimum increment size as specified for the window * (in pixels). */ int width_increment; diff --git a/src/handlers.c b/src/handlers.c index 4aa46fc9..b8725c1b 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -1030,13 +1030,9 @@ int handle_normal_hints(void *data, xcb_connection_t *conn, uint8_t state, xcb_w client->width_increment = size_hints.width_inc; if (size_hints.height_inc > 0) client->height_increment = size_hints.height_inc; - } - /* If no aspect ratio was set or if it was invalid, we ignore the hints */ - if (!(size_hints.flags & XCB_SIZE_HINT_P_ASPECT) || - (size_hints.min_aspect_num <= 0) || - (size_hints.min_aspect_den <= 0)) { - return 1; + resize_client(conn, client); + xcb_flush(conn); } int base_width = 0, base_height = 0; @@ -1052,6 +1048,16 @@ int handle_normal_hints(void *data, xcb_connection_t *conn, uint8_t state, xcb_w base_height = size_hints.min_height; } + client->base_width = base_width; + client->base_height = base_height; + + /* If no aspect ratio was set or if it was invalid, we ignore the hints */ + if (!(size_hints.flags & XCB_SIZE_HINT_P_ASPECT) || + (size_hints.min_aspect_num <= 0) || + (size_hints.min_aspect_den <= 0)) { + return 1; + } + double width = client->rect.width - base_width; double height = client->rect.height - base_height; /* Convert numerator/denominator to a double */ diff --git a/src/layout.c b/src/layout.c index acb20128..047cbccc 100644 --- a/src/layout.c +++ b/src/layout.c @@ -26,6 +26,7 @@ #include "layout.h" #include "client.h" #include "floating.h" +#include "handlers.h" /* * Updates *destination with new_value and returns true if it was changed or false @@ -298,21 +299,14 @@ void resize_client(xcb_connection_t *conn, Client *client) { if (client->height_increment > 1) { int old_height = rect->height; - rect->height = ((int)(rect->height / client->height_increment) * client->height_increment); - /* We round up if the height was changed */ - if (rect->height != old_height) - rect->height++; + rect->height -= (rect->height - client->base_height) % client->height_increment; LOG("Lost %d pixel due to client's height_increment (%d px)\n", old_height - rect->height, client->height_increment); } if (client->width_increment > 1) { int old_width = rect->width; - rect->width = ((int)(rect->width / client->width_increment) * client->width_increment); - /* We round up if the height was changed */ - if (rect->width != old_width) - rect->width++; - + rect->width -= (rect->width - client->base_width) % client->width_increment; LOG("Lost %d pixel due to client's width_increment (%d px)\n", old_width - rect->width, client->width_increment); } @@ -325,6 +319,13 @@ void resize_client(xcb_connection_t *conn, Client *client) { * This is necessary to inform the client of its position relative to the root window, * not relative to its frame (as done in the configure_notify_event by the x server). */ fake_absolute_configure_notify(conn, client); + + /* Force redrawing after resizing the window because any now lost + * pixels could contain old garbage. */ + xcb_expose_event_t generated; + generated.window = client->frame; + generated.count = 0; + handle_expose_event(NULL, conn, &generated); } /* diff --git a/src/xcb.c b/src/xcb.c index 4ed2f1aa..7ec4aa2c 100644 --- a/src/xcb.c +++ b/src/xcb.c @@ -193,8 +193,8 @@ void fake_absolute_configure_notify(xcb_connection_t *conn, Client *client) { absolute.x = client->rect.x + client->child_rect.x; absolute.y = client->rect.y + client->child_rect.y; - absolute.width = client->rect.width - (2 * client->child_rect.x); - absolute.height = client->rect.height - client->child_rect.y - 1; + absolute.width = client->child_rect.width; + absolute.height = client->child_rect.height; fake_configure_notify(conn, absolute, client->child); }