if (client_is_floating(client)) {
i3Font *font = load_font(conn, config.font);
int mode = (client->container != NULL ? client->container->mode : MODE_DEFAULT);
+ /* TODO: refactor this code. we need a function to translate
+ * coordinates of child_rect/rect. */
- if (event->value_mask & XCB_CONFIG_WINDOW_X)
- client->rect.x = event->x;
- if (event->value_mask & XCB_CONFIG_WINDOW_Y)
- client->rect.y = event->y;
+ if (event->value_mask & XCB_CONFIG_WINDOW_X) {
+ if (mode == MODE_STACK || mode == MODE_TABBED) {
+ client->rect.x = event->x - 2;
+ } else {
+ if (client->titlebar_position == TITLEBAR_OFF && client->borderless)
+ client->rect.x = event->x;
+ else if (client->titlebar_position == TITLEBAR_OFF && !client->borderless)
+ client->rect.x = event->x - 1;
+ else client->rect.x = event->x - 2;
+ }
+ }
+ if (event->value_mask & XCB_CONFIG_WINDOW_Y) {
+ if (mode == MODE_STACK || mode == MODE_TABBED) {
+ client->rect.y = event->y - 2;
+ } else {
+ if (client->titlebar_position == TITLEBAR_OFF && client->borderless)
+ client->rect.y = event->y;
+ else if (client->titlebar_position == TITLEBAR_OFF && !client->borderless)
+ client->rect.y = event->y - 1;
+ else client->rect.y = event->y - font->height - 2 - 2;
+ }
+ }
if (event->value_mask & XCB_CONFIG_WINDOW_WIDTH) {
if (mode == MODE_STACK || mode == MODE_TABBED) {
client->rect.width = event->width + 2 + 2;
# the workspace to be empty).
# TODO: skip it by default?
-use Test::More tests => 16;
+use Test::More tests => 17;
use Test::Deep;
use X11::XCB qw(:all);
use Data::Dumper;
$window->map;
sleep 0.25;
+# See if configurerequests cause window movements (they should not)
+my ($a, $t) = $window->rect;
+$window->rect(X11::XCB::Rect->new(x => $a->x, y => $a->y, width => $a->width, height => $a->height));
+
+sleep 0.25;
+my ($na, $nt) = $window->rect;
+is_deeply($na, $a, 'Rects are equal after configurerequest');
sub test_resize {
$window->rect(X11::XCB::Rect->new(x => 0, y => 0, width => 100, height => 100));