]> git.sur5r.net Git - i3/i3/blobdiff - src/handlers.c
Merge branch 'master' into next
[i3/i3] / src / handlers.c
index 89a6bd0a1891f121472b948e8671529f7f9cadd3..267159ecf515a7bb0a59b52b388066df1a96e1c7 100644 (file)
@@ -112,7 +112,8 @@ static int handle_key_press(xcb_key_press_event_t *event) {
         }
     }
 
-    parse_cmd(bind->command);
+    char *json_result = parse_cmd(bind->command);
+    FREE(json_result);
     return 1;
 }
 
@@ -352,61 +353,44 @@ static int handle_configure_request(xcb_configure_request_event_t *event) {
             bsr.y += deco_height;
             bsr.height -= deco_height;
         }
-        con = con->parent;
+        Con *floatingcon = 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);
+            floatingcon->rect.x = event->x + (-1) * bsr.x;
+            DLOG("proposed x = %d, new x is %d\n", event->x, floatingcon->rect.x);
         }
         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);
+            floatingcon->rect.y = event->y + (-1) * bsr.y;
+            DLOG("proposed y = %d, new y is %d\n", event->y, floatingcon->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);
+            floatingcon->rect.width = event->width + (-1) * bsr.width;
+            floatingcon->rect.width += con->border_width * 2;
+            DLOG("proposed width = %d, new width is %d (x11 border %d)\n", event->width, floatingcon->rect.width, con->border_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);
+            floatingcon->rect.height = event->height + (-1) * bsr.height;
+            floatingcon->rect.height += con->border_width * 2;
+            DLOG("proposed height = %d, new height is %d (x11 border %d)\n", event->height, floatingcon->rect.height, con->border_width);
         }
+        floating_maybe_reassign_ws(floatingcon);
         tree_render();
     }
 
-    fake_absolute_configure_notify(con);
-
-    return 1;
-#if 0
-        /* Dock clients can be reconfigured in their height */
-        if (client->dock) {
-                DLOG("Reconfiguring height of this dock client\n");
-
-                if (!(event->value_mask & XCB_CONFIG_WINDOW_HEIGHT)) {
-                        DLOG("Ignoring configure request, no height given\n");
-                        return 1;
-                }
-
-                client->desired_height = event->height;
-                render_workspace(conn, c_ws->output, c_ws);
-                xcb_flush(conn);
-
-                return 1;
-        }
-
-        if (client->fullscreen) {
-                DLOG("Client is in fullscreen mode\n");
-
-                Rect child_rect = client->container->workspace->rect;
-                child_rect.x = child_rect.y = 0;
-                fake_configure_notify(conn, child_rect, client->child);
+    /* Dock windows can be reconfigured in their height */
+    if (con->parent && con->parent->type == CT_DOCKAREA) {
+        DLOG("Dock window, only height reconfiguration allowed\n");
+        if (event->value_mask & XCB_CONFIG_WINDOW_HEIGHT) {
+            DLOG("Height given, changing\n");
 
-                return 1;
+            con->geometry.height = event->height;
+            tree_render();
         }
+    }
 
-        fake_absolute_configure_notify(conn, client);
+    fake_absolute_configure_notify(con);
 
-        return 1;
-#endif
+    return 1;
 }
 #if 0
 
@@ -473,7 +457,7 @@ static int handle_unmap_notify_event(xcb_unmap_notify_event_t *event) {
         return 1;
     }
 
-    tree_close(con, DONT_KILL_WINDOW, false);
+    tree_close(con, DONT_KILL_WINDOW, false, false);
     tree_render();
     x_push_changes(croot);
     return 1;
@@ -573,6 +557,21 @@ static bool handle_windowname_change_legacy(void *data, xcb_connection_t *conn,
     return true;
 }
 
+/*
+ * Called when a window changes its WM_WINDOW_ROLE.
+ *
+ */
+static bool handle_windowrole_change(void *data, xcb_connection_t *conn, uint8_t state,
+                                     xcb_window_t window, xcb_atom_t atom, xcb_get_property_reply_t *prop) {
+    Con *con;
+    if ((con = con_by_window_id(window)) == NULL || con->window == NULL)
+        return false;
+
+    window_update_role(con->window, prop, false);
+
+    return true;
+}
+
 #if 0
 /*
  * Updates the client’s WM_CLASS property
@@ -855,7 +854,7 @@ static bool handle_transient_for(void *data, xcb_connection_t *conn, uint8_t sta
 
     if (prop == NULL) {
         prop = xcb_get_property_reply(conn, xcb_get_property_unchecked(conn,
-                                false, window, A_WM_TRANSIENT_FOR, A_WINDOW, 0, 32), NULL);
+                                false, window, XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 0, 32), NULL);
         if (prop == NULL)
             return false;
     }
@@ -886,7 +885,7 @@ static bool handle_clientleader_change(void *data, xcb_connection_t *conn, uint8
 
     if (prop == NULL) {
         prop = xcb_get_property_reply(conn, xcb_get_property_unchecked(conn,
-                                false, window, A_WM_CLIENT_LEADER, A_WINDOW, 0, 32), NULL);
+                                false, window, A_WM_CLIENT_LEADER, XCB_ATOM_WINDOW, 0, 32), NULL);
         if (prop == NULL)
             return false;
     }
@@ -949,7 +948,8 @@ static struct property_handler_t property_handlers[] = {
     { 0, 128, handle_windowname_change_legacy },
     { 0, UINT_MAX, handle_normal_hints },
     { 0, UINT_MAX, handle_clientleader_change },
-    { 0, UINT_MAX, handle_transient_for }
+    { 0, UINT_MAX, handle_transient_for },
+    { 0, 128, handle_windowrole_change }
 };
 #define NUM_HANDLERS (sizeof(property_handlers) / sizeof(struct property_handler_t))
 
@@ -960,11 +960,12 @@ static struct property_handler_t property_handlers[] = {
  */
 void property_handlers_init() {
     property_handlers[0].atom = A__NET_WM_NAME;
-    property_handlers[1].atom = A_WM_HINTS;
-    property_handlers[2].atom = A_WM_NAME;
-    property_handlers[3].atom = A_WM_NORMAL_HINTS;
+    property_handlers[1].atom = XCB_ATOM_WM_HINTS;
+    property_handlers[2].atom = XCB_ATOM_WM_NAME;
+    property_handlers[3].atom = XCB_ATOM_WM_NORMAL_HINTS;
     property_handlers[4].atom = A_WM_CLIENT_LEADER;
-    property_handlers[5].atom = A_WM_TRANSIENT_FOR;
+    property_handlers[5].atom = XCB_ATOM_WM_TRANSIENT_FOR;
+    property_handlers[6].atom = A_WM_WINDOW_ROLE;
 }
 
 static void property_notify(uint8_t state, xcb_window_t window, xcb_atom_t atom) {