*
* i3 - an improved dynamic tiling window manager
*
- * (c) 2009 Michael Stapelberg and contributors
+ * © 2009 Michael Stapelberg and contributors
*
* See file LICENSE for license information.
*
*/
void toggle_floating_mode(xcb_connection_t *conn, Client *client, bool automatic);
+/**
+ * Removes the floating client from its workspace and attaches it to the new workspace.
+ * This is centralized here because it may happen if you move it via keyboard and
+ * if you move it using your mouse.
+ *
+ */
+void floating_assign_to_workspace(Client *client, Workspace *new_workspace);
+
/**
* Called whenever the user clicks on a border (not the titlebar!) of a floating window.
* Determines on which border the user clicked and launches the drag_pointer function
}
}
- /* Remove from focus stack and list of floating clients */
- SLIST_REMOVE(&(client->workspace->focus_stack), client, Client, focus_clients);
- TAILQ_REMOVE(&(client->workspace->floating_clients), client, floating_clients);
-
- if (client->workspace->fullscreen_client == client)
- client->workspace->fullscreen_client = NULL;
-
- /* Insert into destination focus stack and list of floating clients */
- client->workspace = t_ws;
- SLIST_INSERT_HEAD(&(t_ws->focus_stack), client, focus_clients);
- TAILQ_INSERT_TAIL(&(t_ws->floating_clients), client, floating_clients);
- if (client->fullscreen)
- t_ws->fullscreen_client = client;
+ floating_assign_to_workspace(client, t_ws);
/* If we’re moving it to an invisible screen, we need to unmap it */
if (t_ws->screen->current_workspace != t_ws->num) {
xcb_flush(conn);
}
+/*
+ * Removes the floating client from its workspace and attaches it to the new workspace.
+ * This is centralized here because it may happen if you move it via keyboard and
+ * if you move it using your mouse.
+ *
+ */
+void floating_assign_to_workspace(Client *client, Workspace *new_workspace) {
+ /* Remove from focus stack and list of floating clients */
+ SLIST_REMOVE(&(client->workspace->focus_stack), client, Client, focus_clients);
+ TAILQ_REMOVE(&(client->workspace->floating_clients), client, floating_clients);
+
+ if (client->workspace->fullscreen_client == client)
+ client->workspace->fullscreen_client = NULL;
+
+ /* Insert into destination focus stack and list of floating clients */
+ client->workspace = new_workspace;
+ SLIST_INSERT_HEAD(&(client->workspace->focus_stack), client, focus_clients);
+ TAILQ_INSERT_TAIL(&(client->workspace->floating_clients), client, floating_clients);
+ if (client->fullscreen)
+ client->workspace->fullscreen_client = client;
+
+}
/*
* Called whenever the user clicks on a border (not the titlebar!) of a floating window.
#include "xinerama.h"
#include "layout.h"
#include "client.h"
+#include "floating.h"
/*
* Updates *destination with new_value and returns true if it was changed or false
*
*/
void reposition_client(xcb_connection_t *conn, Client *client) {
+ i3Screen *screen;
+
LOG("frame 0x%08x needs to be pushed to %dx%d\n", client->frame, client->rect.x, client->rect.y);
/* Note: We can use a pointer to client->x like an array of uint32_ts
because it is followed by client->y by definition */
xcb_configure_window(conn, client->frame, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, &(client->rect.x));
+
+ if (!client_is_floating(client))
+ return;
+
+ /* If the client is floating, we need to check if we moved it to a different workspace */
+ if (client->workspace->screen == (screen = get_screen_containing(client->rect.x, client->rect.y)))
+ return;
+
+ LOG("Client is on workspace %p with screen %p\n", client->workspace, client->workspace->screen);
+ LOG("but screen at %d, %d is %p\n", client->rect.x, client->rect.y, screen);
+ floating_assign_to_workspace(client, &workspaces[screen->current_workspace]);
+ LOG("fixed that\n");
}
/*