]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Send clients their absolute position/size in generated configure events,...
authorMichael Stapelberg <michael+x200@stapelberg.de>
Sat, 11 Apr 2009 20:37:48 +0000 (22:37 +0200)
committerMichael Stapelberg <michael+x200@stapelberg.de>
Sat, 11 Apr 2009 20:37:48 +0000 (22:37 +0200)
This fixes ticket #26.

include/xcb.h
src/handlers.c
src/layout.c
src/util.c
src/xcb.c

index 83069e451d7087bc3adc9b417a01316ca067d023..bcdd19a144268f567cd47a87cb154001092ca39d 100644 (file)
@@ -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);
 
+/**
+ * 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.
  *
index 7ca0568684efd62cb6afbf0d19fc53d16a31fbbc..a9aaf8c3380d255d1a535b0ee269c48de06c62ab 100644 (file)
@@ -542,7 +542,7 @@ int handle_configure_request(void *prophs, xcb_connection_t *conn, xcb_configure
                 return 1;
         }
 
-        fake_configure_notify(conn, client->child_rect, client->child);
+        fake_absolute_configure_notify(conn, client);
 
         return 1;
 }
index 23f47cfd656a0df9bf140717b33b528519ea726e..a3690ad6d2a9aad4284b4f38a34d9e69bc0376a3 100644 (file)
@@ -261,10 +261,10 @@ static void resize_client(xcb_connection_t *conn, Client *client) {
 
         xcb_configure_window(conn, client->child, mask, &(rect->x));
 
-        /* After configuring a child window we need to fake a configure_notify_event according
-           to ICCCM 4.2.3. This seems rather broken, especially since X sends exactly the same
-           configure_notify_event automatically according to xtrace. Anyone knows details? */
-        fake_configure_notify(conn, *rect, client->child);
+        /* After configuring a child window we need to fake a configure_notify_event (see ICCCM 4.2.3).
+         * This is necessary to inform the client of its position relative to the root window,
+         * not relative to its frame (as done in the configure_notify_event by the x server). */
+        fake_absolute_configure_notify(conn, client);
 }
 
 /*
index 1ac3357d048e28daa75c14cbd7e6759cee6433f9..63b929c0e527c69fe7b5c9222b7033fcffd5cded 100644 (file)
@@ -396,7 +396,7 @@ void toggle_fullscreen(xcb_connection_t *conn, Client *client) {
 
                 Rect child_rect = workspace->rect;
                 child_rect.x = child_rect.y = 0;
-                fake_configure_notify(conn, child_rect, client->child);
+                fake_absolute_configure_notify(conn, client);
         } else {
                 LOG("leaving fullscreen mode\n");
                 /* Because the coordinates of the window haven’t changed, it would not be
index 383500c71de0fa2d41ab5deb6abde3777a8ae86a..0b4531c9cec71be9182bbc0961e1696a94e121a7 100644 (file)
--- a/src/xcb.c
+++ b/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);
 }
 
+/*
+ * 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.
  *