static Workspace* pickws(Monitor* mon, int wsid);
static void client_visibility(Workspace* wspace, int show);
static Client* client_find(Client* clients, Window win);
+static void add_client(Monitor* mon, Client* c, int ptrx);
+static void remove_client(Location* loc, Client* c);
Monitor* Monitors = NULL;
int ptrx = 0, ptry = 0, winx = 0, winy = 0, mask = 0;
XQueryPointer(X.disp, X.root, &root, &child, &ptrx, &ptry, &winx, &winy, (unsigned int*)&mask);
Monitor* mon = pickmon(ptrx, ptry);
- if (X.mode == M_INIT || c->flags & F_DIALOG)
- {
- c->next = mon->cspace->floating;
- mon->cspace->floating = c;
- c->x = mon->midx - c->w/2;
- c->y = mon->midy - c->h/2;
- client_adjust(c);
- }
- else
- {
- Column* col = pickcol(mon->cspace->columns, ptrx - mon->x);
- if (col->focused)
- {
- monocled_add(mon, col, c);
- }
- else
- {
- stacked_add(mon, col, c);
- }
- }
- mons_layer(mon);
- XSync(X.disp, False);
+ add_client(mon, c, ptrx);
}
void mons_delclient(Client* c)
Location loc = {0};
if (mons_find(c->win, &loc))
{
- if (!loc.column)
- {
- loc.workspace->floating = delclient(loc.workspace->floating, c);
- }
- else if (loc.column->focused)
- {
- monocled_del(loc.monitor, loc.column, loc.client);
- }
- else
- {
- stacked_del(loc.monitor, loc.column, loc.client);
- }
+ remove_client(&loc, c);
xfree(c->name);
XDestroyWindow(X.disp, c->frame);
free(c);
void mons_towspace(Client* c, int wsid)
{
- Location loc;
+ Location loc = {0};
if (mons_find(c->win, &loc))
{
+ Window root = 0, child = 0;
+ int ptrx = 0, ptry = 0, winx = 0, winy = 0, mask = 0;
+ XQueryPointer(X.disp, X.root, &root, &child, &ptrx, &ptry, &winx, &winy, (unsigned int*)&mask);
Workspace* wspace = pickws(loc.monitor, wsid);
if (wspace != loc.workspace)
{
+ remove_client(&loc, c);
client_show(c, 0);
- loc.workspace->floating = delclient(loc.workspace->floating, c);
- c->next = wspace->floating;
- wspace->floating = c;
+ Workspace* prev = loc.monitor->cspace;
+ loc.monitor->cspace = wspace;
+ add_client(loc.monitor, c, ptrx);
+ loc.monitor->cspace = prev;
}
}
}
}
return client;
}
+
+static void add_client(Monitor* mon, Client* c, int ptrx)
+{
+ if (X.mode == M_INIT || c->flags & F_DIALOG)
+ {
+ c->next = mon->cspace->floating;
+ mon->cspace->floating = c;
+ c->x = mon->midx - c->w/2;
+ c->y = mon->midy - c->h/2;
+ client_adjust(c);
+ }
+ else
+ {
+ Column* col = pickcol(mon->cspace->columns, ptrx - mon->x);
+ if (col->focused)
+ {
+ monocled_add(mon, col, c);
+ }
+ else
+ {
+ stacked_add(mon, col, c);
+ }
+ }
+ mons_layer(mon);
+ XSync(X.disp, False);
+}
+
+static void remove_client(Location* loc, Client* c)
+{
+ if (!loc->column)
+ {
+ loc->workspace->floating = delclient(loc->workspace->floating, c);
+ }
+ else if (loc->column->focused)
+ {
+ monocled_del(loc->monitor, loc->column, loc->client);
+ }
+ else
+ {
+ stacked_del(loc->monitor, loc->column, loc->client);
+ }
+}
+