From 05e46848f07460f18574d51eba0b182b177ab2d2 Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Wed, 9 Oct 2013 12:49:15 -0400 Subject: [PATCH] Reply to _NET_REQUEST_FRAME_EXTENTS correctly Reply to _NET_REQUEST_FRAME_EXTENTS by settings _NET_FRAME_EXTENTS property of the window to widths of the respective borders added by i3. fixes #1093 fixes #1069 --- src/handlers.c | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/src/handlers.c b/src/handlers.c index 084a7285..72ef291c 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -706,35 +706,26 @@ static void handle_client_message(xcb_client_message_event_t *event) { xcb_flush(conn); free(reply); } else if (event->type == A__NET_REQUEST_FRAME_EXTENTS) { - // A client can request an estimate for the frame size which the window - // manager will put around it before actually mapping its window. Java - // does this (as of openjdk-7). - // - // Note that the calculation below is not entirely accurate — once you - // set a different border type, it’s off. We _could_ request all the - // window properties (which have to be set up at this point according - // to EWMH), but that seems rather elaborate. The standard explicitly - // says the application must cope with an estimate that is not entirely - // accurate. + /* + * A client can request an estimate for the frame size which the window + * manager will put around it before actually mapping its window. Java + * does this (as of openjdk-7). + * + * Note that the calculation below is not entirely accurate — once you + * set a different border type, it’s off. We _could_ request all the + * window properties (which have to be set up at this point according + * to EWMH), but that seems rather elaborate. The standard explicitly + * says the application must cope with an estimate that is not entirely + * accurate. + */ DLOG("_NET_REQUEST_FRAME_EXTENTS for window 0x%08x\n", event->window); - xcb_get_geometry_reply_t *geometry; - xcb_get_geometry_cookie_t cookie = xcb_get_geometry(conn, event->window); - - if (!(geometry = xcb_get_geometry_reply(conn, cookie, NULL))) { - ELOG("Could not get geometry of X11 window 0x%08x while handling " - "the _NET_REQUEST_FRAME_EXTENTS ClientMessage\n", - event->window); - return; - } - - DLOG("Current geometry = x=%d, y=%d, width=%d, height=%d\n", - geometry->x, geometry->y, geometry->width, geometry->height); + /* The reply data: approximate frame size */ Rect r = { - 0, // left - geometry->width + 4, // right - 0, // top - geometry->height + config.font.height + 5, // bottom + config.default_border_width, /* left */ + config.default_border_width, /* right */ + config.font.height + 5, /* top */ + config.default_border_width /* bottom */ }; xcb_change_property( conn,