]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Check if a floating window’s coordinates are within a different workspace...
authorMichael Stapelberg <michael@stapelberg.de>
Mon, 18 Apr 2011 17:28:03 +0000 (19:28 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Mon, 18 Apr 2011 17:28:03 +0000 (19:28 +0200)
Fixes: #297
include/floating.h
src/floating.c

index c3935252dc0d17f4ebe23ccdd21173cb25d5640a..6ab4cf2e1621597e191d57f2a8ecff4091ade4f6 100644 (file)
@@ -59,6 +59,13 @@ void toggle_floating_mode(Con *con, bool automatic);
  */
 void floating_raise_con(Con *con);
 
+/**
+ * Checks if con’s coordinates are within its workspace and re-assigns it to
+ * the actual workspace if not.
+ *
+ */
+bool floating_maybe_reassign_ws(Con *con);
+
 #if 0
 /**
  * Removes the floating client from its workspace and attaches it to the new
index 0f65343044143abcfdfe4df5ad1f1620cb1736b7..78804c8e11a1b6e91b368ae0a26f2260ac771d65 100644 (file)
@@ -156,6 +156,8 @@ void floating_enable(Con *con, bool automatic) {
     // TODO: don’t influence focus handling when Con was not focused before.
     if (set_focus)
         con_focus(con);
+
+    floating_maybe_reassign_ws(nc);
 }
 
 void floating_disable(Con *con, bool automatic) {
@@ -225,30 +227,24 @@ void floating_raise_con(Con *con) {
     TAILQ_INSERT_TAIL(&(con->parent->floating_head), con, floating_windows);
 }
 
-DRAGGING_CB(drag_window_callback) {
-    struct xcb_button_press_event_t *event = extra;
-
-    /* Reposition the client correctly while moving */
-    con->rect.x = old_rect->x + (new_x - event->root_x);
-    con->rect.y = old_rect->y + (new_y - event->root_y);
-
-    render_con(con, false);
-    x_push_node(con, true);
-    xcb_flush(conn);
-
-    /* Check if we cross workspace boundaries while moving */
+/*
+ * Checks if con’s coordinates are within its workspace and re-assigns it to
+ * the actual workspace if not.
+ *
+ */
+bool floating_maybe_reassign_ws(Con *con) {
     Output *output = get_output_containing(
         con->rect.x + (con->rect.width / 2),
         con->rect.y + (con->rect.height / 2));
 
     if (!output) {
         ELOG("No output found at destination coordinates?\n");
-        return;
+        return false;
     }
 
     if (con_get_output(con) == output->con) {
         DLOG("still the same ws\n");
-        return;
+        return false;
     }
 
     DLOG("Need to re-assign!\n");
@@ -258,6 +254,23 @@ DRAGGING_CB(drag_window_callback) {
     DLOG("Moving con %p / %s to workspace %p / %s\n", con, con->name, ws, ws->name);
     con_move_to_workspace(con, ws);
     con_focus(con_descend_focused(con));
+    return true;
+}
+
+DRAGGING_CB(drag_window_callback) {
+    struct xcb_button_press_event_t *event = extra;
+
+    /* Reposition the client correctly while moving */
+    con->rect.x = old_rect->x + (new_x - event->root_x);
+    con->rect.y = old_rect->y + (new_y - event->root_y);
+
+    render_con(con, false);
+    x_push_node(con, true);
+    xcb_flush(conn);
+
+    /* Check if we cross workspace boundaries while moving */
+    if (!floating_maybe_reassign_ws(con))
+        return;
     tree_render();
 }