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;
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 */
#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
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);
}
* 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);
}
/*
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);
}