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
next
Tony Crisci 2013-10-09 12:49:15 -04:00 committed by Michael Stapelberg
parent 04847eeb1f
commit 05e46848f0
1 changed files with 17 additions and 26 deletions

View File

@ -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, its 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, its 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,