Bugfix: Send clients their absolute position/size in generated configure events, not relative
This fixes ticket #26.
This commit is contained in:
parent
b7e8a63474
commit
a2d20b6848
|
@ -110,6 +110,13 @@ void xcb_draw_rect(xcb_connection_t *conn, xcb_drawable_t drawable, xcb_gcontext
|
||||||
*/
|
*/
|
||||||
void fake_configure_notify(xcb_connection_t *conn, Rect r, xcb_window_t window);
|
void fake_configure_notify(xcb_connection_t *conn, Rect r, xcb_window_t window);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a configure_notify_event with absolute coordinates (relative to the X root
|
||||||
|
* window, not to the client’s frame) for the given client.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void fake_absolute_configure_notify(xcb_connection_t *conn, Client *client);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds out which modifier mask is the one for numlock, as the user may change this.
|
* Finds out which modifier mask is the one for numlock, as the user may change this.
|
||||||
*
|
*
|
||||||
|
|
|
@ -542,7 +542,7 @@ int handle_configure_request(void *prophs, xcb_connection_t *conn, xcb_configure
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fake_configure_notify(conn, client->child_rect, client->child);
|
fake_absolute_configure_notify(conn, client);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -261,10 +261,10 @@ static void resize_client(xcb_connection_t *conn, Client *client) {
|
||||||
|
|
||||||
xcb_configure_window(conn, client->child, mask, &(rect->x));
|
xcb_configure_window(conn, client->child, mask, &(rect->x));
|
||||||
|
|
||||||
/* After configuring a child window we need to fake a configure_notify_event according
|
/* After configuring a child window we need to fake a configure_notify_event (see ICCCM 4.2.3).
|
||||||
to ICCCM 4.2.3. This seems rather broken, especially since X sends exactly the same
|
* This is necessary to inform the client of its position relative to the root window,
|
||||||
configure_notify_event automatically according to xtrace. Anyone knows details? */
|
* not relative to its frame (as done in the configure_notify_event by the x server). */
|
||||||
fake_configure_notify(conn, *rect, client->child);
|
fake_absolute_configure_notify(conn, client);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -396,7 +396,7 @@ void toggle_fullscreen(xcb_connection_t *conn, Client *client) {
|
||||||
|
|
||||||
Rect child_rect = workspace->rect;
|
Rect child_rect = workspace->rect;
|
||||||
child_rect.x = child_rect.y = 0;
|
child_rect.x = child_rect.y = 0;
|
||||||
fake_configure_notify(conn, child_rect, client->child);
|
fake_absolute_configure_notify(conn, client);
|
||||||
} else {
|
} else {
|
||||||
LOG("leaving fullscreen mode\n");
|
LOG("leaving fullscreen mode\n");
|
||||||
/* Because the coordinates of the window haven’t changed, it would not be
|
/* Because the coordinates of the window haven’t changed, it would not be
|
||||||
|
|
16
src/xcb.c
16
src/xcb.c
|
@ -212,6 +212,22 @@ void fake_configure_notify(xcb_connection_t *conn, Rect r, xcb_window_t window)
|
||||||
LOG("Told the client it is at %dx%d with %dx%d\n", r.x, r.y, r.width, r.height);
|
LOG("Told the client it is at %dx%d with %dx%d\n", r.x, r.y, r.width, r.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generates a configure_notify_event with absolute coordinates (relative to the X root
|
||||||
|
* window, not to the client’s frame) for the given client.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void fake_absolute_configure_notify(xcb_connection_t *conn, Client *client) {
|
||||||
|
Rect absolute;
|
||||||
|
|
||||||
|
absolute.x = client->rect.x;
|
||||||
|
absolute.y = client->rect.y;
|
||||||
|
absolute.width = client->rect.width - client->child_rect.x;
|
||||||
|
absolute.height = client->rect.height - client->child_rect.y;
|
||||||
|
|
||||||
|
fake_configure_notify(conn, absolute, client->child);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Finds out which modifier mask is the one for numlock, as the user may change this.
|
* Finds out which modifier mask is the one for numlock, as the user may change this.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue