x_push_changes(croot);
return 1;
}
-#if 0
+
/*
* Configure requests are received when the application wants to resize windows on their own.
*
*
*/
int handle_configure_request(void *prophs, xcb_connection_t *conn, xcb_configure_request_event_t *event) {
- DLOG("window 0x%08x wants to be at %dx%d with %dx%d\n",
- event->window, event->x, event->y, event->width, event->height);
+ Con *con;
- Client *client = table_get(&by_child, event->window);
- if (client == NULL) {
- uint32_t mask = 0;
- uint32_t values[7];
- int c = 0;
-#define COPY_MASK_MEMBER(mask_member, event_member) do { \
- if (event->value_mask & mask_member) { \
- mask |= mask_member; \
- values[c++] = event->event_member; \
- } \
-} while (0)
+ DLOG("window 0x%08x wants to be at %dx%d with %dx%d\n",
+ event->window, event->x, event->y, event->width, event->height);
- COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_X, x);
- COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_Y, y);
- COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_WIDTH, width);
- COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_HEIGHT, height);
- COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_BORDER_WIDTH, border_width);
- COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_SIBLING, sibling);
- COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_STACK_MODE, stack_mode);
+ /* For unmanaged windows, we just execute the configure request. As soon as
+ * it gets mapped, we will take over anyways. */
+ if ((con = con_by_window_id(event->window)) == NULL) {
+ DLOG("Configure request for unmanaged window, can do that.\n");
- xcb_configure_window(conn, event->window, mask, values);
- xcb_flush(conn);
+ uint32_t mask = 0;
+ uint32_t values[7];
+ int c = 0;
+#define COPY_MASK_MEMBER(mask_member, event_member) do { \
+ if (event->value_mask & mask_member) { \
+ mask |= mask_member; \
+ values[c++] = event->event_member; \
+ } \
+} while (0)
- return 1;
- }
+ COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_X, x);
+ COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_Y, y);
+ COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_WIDTH, width);
+ COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_HEIGHT, height);
+ COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_BORDER_WIDTH, border_width);
+ COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_SIBLING, sibling);
+ COPY_MASK_MEMBER(XCB_CONFIG_WINDOW_STACK_MODE, stack_mode);
- if (client->fullscreen) {
- DLOG("Client is in fullscreen mode\n");
+ xcb_configure_window(conn, event->window, mask, values);
+ xcb_flush(conn);
- Rect child_rect = client->workspace->rect;
- child_rect.x = child_rect.y = 0;
- fake_configure_notify(conn, child_rect, client->child);
+ return 1;
+ }
- return 1;
+ DLOG("Configure request!\n");
+ if (con_is_floating(con) && con_is_leaf(con)) {
+ /* we actually need to apply the size/position changes to the *parent*
+ * container */
+ Rect bsr = con_border_style_rect(con);
+ if (con->border_style == BS_NORMAL)
+ bsr.height -= 17;
+ con = con->parent;
+ DLOG("Container is a floating leaf node, will do that.\n");
+ if (event->value_mask & XCB_CONFIG_WINDOW_X) {
+ con->rect.x = event->x + (-1) * bsr.x;
+ DLOG("proposed x = %d, new x is %d\n", event->x, con->rect.x);
}
-
- /* Floating clients can be reconfigured */
- 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) {
- 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;
- } else {
- if (client->titlebar_position == TITLEBAR_OFF && client->borderless)
- client->rect.width = event->width;
- else if (client->titlebar_position == TITLEBAR_OFF && !client->borderless)
- client->rect.width = event->width + (1 + 1);
- else client->rect.width = event->width + (2 + 2);
- }
- }
- if (event->value_mask & XCB_CONFIG_WINDOW_HEIGHT) {
- if (mode == MODE_STACK || mode == MODE_TABBED) {
- client->rect.height = event->height + 2;
- } else {
- if (client->titlebar_position == TITLEBAR_OFF && client->borderless)
- client->rect.height = event->height;
- else if (client->titlebar_position == TITLEBAR_OFF && !client->borderless)
- client->rect.height = event->height + (1 + 1);
- else client->rect.height = event->height + (font->height + 2 + 2) + 2;
- }
- }
-
- DLOG("Accepted new position/size for floating client: (%d, %d) size %d x %d\n",
- client->rect.x, client->rect.y, client->rect.width, client->rect.height);
-
- /* Push the new position/size to X11 */
- reposition_client(conn, client);
- resize_client(conn, client);
- xcb_flush(conn);
-
- return 1;
+ if (event->value_mask & XCB_CONFIG_WINDOW_Y) {
+ con->rect.y = event->y + (-1) * bsr.y;
+ DLOG("proposed y = %d, new y is %d\n", event->y, con->rect.y);
+ }
+ if (event->value_mask & XCB_CONFIG_WINDOW_WIDTH) {
+ con->rect.width = event->width + (-1) * bsr.width;
+ DLOG("proposed width = %d, new width is %d\n", event->width, con->rect.width);
+ }
+ if (event->value_mask & XCB_CONFIG_WINDOW_HEIGHT) {
+ con->rect.height = event->height + (-1) * bsr.height;
+ DLOG("proposed height = %d, new height is %d\n", event->height, con->rect.height);
}
+ tree_render();
+ }
+ return 1;
+#if 0
/* Dock clients can be reconfigured in their height */
if (client->dock) {
DLOG("Reconfiguring height of this dock client\n");
fake_absolute_configure_notify(conn, client);
return 1;
+#endif
}
+#if 0
/*
* Configuration notifies are only handled because we need to set up ignore for
#!perl
# vim:ts=4:sw=4:expandtab
-use i3test tests => 10;
+use i3test tests => 11;
use X11::XCB qw(:all);
use Time::HiRes qw(sleep);
my ($absolute, $top) = $window->rect;
ok($window->mapped, 'Window is mapped');
-ok($absolute->{width} >= 75, 'i3 raised the width to 75');
-ok($absolute->{height} >= 50, 'i3 raised the height to 50');
+cmp_ok($absolute->{width}, '>=', 75, 'i3 raised the width to 75');
+cmp_ok($absolute->{height}, '>=', 50, 'i3 raised the height to 50');
ok($absolute->{x} != 0 && $absolute->{y} != 0, 'i3 did not map it to (0x0)');
($absolute, $top) = $window->rect;
-ok($absolute->{width} == 80, "i3 let the width at 80");
-ok($absolute->{height} == 90, "i3 let the height at 90");
+cmp_ok($absolute->{width}, '==', 80, "i3 let the width at 80");
+cmp_ok($absolute->{height}, '==', 90, "i3 let the height at 90");
-ok($top->{x} == 1 && $top->{y} == 1, "i3 mapped it to (1,1)");
+cmp_ok($top->{x}, '==', 1, 'i3 mapped it to x=1');
+cmp_ok($top->{y}, '==', 1, 'i3 mapped it to y=1');
$window->unmap;