]> git.sur5r.net Git - i3/i3/blobdiff - src/floating.c
Merge pull request #1620 from Airblader/bug-1614
[i3/i3] / src / floating.c
index f9935952ad72f8dfa16581015681a11a59e734ed..d01cb43dfec887257d5e842e477583ba1e572513 100644 (file)
@@ -246,12 +246,10 @@ void floating_enable(Con *con, bool automatic) {
         if (con->window && con->window->leader != XCB_NONE &&
             (leader = con_by_window_id(con->window->leader)) != NULL) {
             DLOG("Centering above leader\n");
-            nc->rect.x = leader->rect.x + (leader->rect.width / 2) - (nc->rect.width / 2);
-            nc->rect.y = leader->rect.y + (leader->rect.height / 2) - (nc->rect.height / 2);
+            floating_center(nc, leader->rect);
         } else {
             /* center the window on workspace as fallback */
-            nc->rect.x = ws->rect.x + (ws->rect.width / 2) - (nc->rect.width / 2);
-            nc->rect.y = ws->rect.y + (ws->rect.height / 2) - (nc->rect.height / 2);
+            floating_center(nc, ws->rect);
         }
     }
 
@@ -298,16 +296,21 @@ void floating_enable(Con *con, bool automatic) {
 
     /* Check if we need to re-assign it to a different workspace because of its
      * coordinates and exit if that was done successfully. */
-    if (floating_maybe_reassign_ws(nc))
+    if (floating_maybe_reassign_ws(nc)) {
+        ipc_send_window_event("floating", con);
         return;
+    }
 
     /* Sanitize coordinates: Check if they are on any output */
-    if (get_output_containing(nc->rect.x, nc->rect.y) != NULL)
+    if (get_output_containing(nc->rect.x, nc->rect.y) != NULL) {
+        ipc_send_window_event("floating", con);
         return;
+    }
 
     ELOG("No output found at destination coordinates, centering floating window on current ws\n");
-    nc->rect.x = ws->rect.x + (ws->rect.width / 2) - (nc->rect.width / 2);
-    nc->rect.y = ws->rect.y + (ws->rect.height / 2) - (nc->rect.height / 2);
+    floating_center(nc, ws->rect);
+
+    ipc_send_window_event("floating", con);
 }
 
 void floating_disable(Con *con, bool automatic) {
@@ -351,6 +354,8 @@ void floating_disable(Con *con, bool automatic) {
 
     if (set_focus)
         con_focus(con);
+
+    ipc_send_window_event("floating", con);
 }
 
 /*
@@ -412,6 +417,15 @@ bool floating_maybe_reassign_ws(Con *con) {
     return true;
 }
 
+/*
+ * Centers a floating con above the specified rect.
+ *
+ */
+void floating_center(Con *con, Rect rect) {
+    con->rect.x = rect.x + (rect.width / 2) - (con->rect.width / 2);
+    con->rect.y = rect.y + (rect.height / 2) - (con->rect.height / 2);
+}
+
 DRAGGING_CB(drag_window_callback) {
     const struct xcb_button_press_event_t *event = extra;
 
@@ -503,7 +517,7 @@ DRAGGING_CB(resize_window_callback) {
         dest_height = max(dest_height, (int)(dest_width / ratio));
     }
 
-    con->rect = (Rect) {dest_x, dest_y, dest_width, dest_height};
+    con->rect = (Rect){dest_x, dest_y, dest_width, dest_height};
 
     /* Obey window size */
     floating_check_size(con);