Client: Add client_set_screen() and fix some bugs.
This commit is contained in:
parent
11bc12f72a
commit
fe8eba8c54
77
src/client.c
77
src/client.c
@ -690,8 +690,8 @@ client_swap(Client *c1, Client *c2)
|
||||
CHECK(!c1->free);
|
||||
CHECK(!c2->free);
|
||||
|
||||
if(c1->screen == c2->screen
|
||||
&& c1->tag != c2->tag)
|
||||
if((c1->screen == c2->screen
|
||||
&& c1->tag != c2->tag))
|
||||
return;
|
||||
|
||||
/* Swap only the windows */
|
||||
@ -875,50 +875,71 @@ client_unmap(Client *c)
|
||||
return;
|
||||
}
|
||||
|
||||
/** Set the client screen
|
||||
*\param c Client pointer
|
||||
*\param s Screen id
|
||||
*/
|
||||
void
|
||||
client_set_screen(Client *c, int s)
|
||||
{
|
||||
int os;
|
||||
XRectangle geo;
|
||||
|
||||
if(!c || s < 0 || s > screen_count() - 1 || s == c->screen)
|
||||
return;
|
||||
|
||||
/* Save old client screen/geo to arrange */
|
||||
geo = c->geo;
|
||||
os = c->screen;
|
||||
|
||||
c->screen = s;
|
||||
c->tag = seltag[s];
|
||||
|
||||
/* Arrange */
|
||||
if(tags[s][seltag[s]].layout.func == freelayout
|
||||
|| tags[s][seltag[s]].layout.func == maxlayout
|
||||
|| tags[os][seltag[os]].layout.func == freelayout
|
||||
|| tags[os][seltag[os]].layout.func == maxlayout)
|
||||
{
|
||||
geo.x = (sgeo[s].x + sgeo[s].width / 2) - (c->geo.width / 2);
|
||||
geo.y = (sgeo[s].y + sgeo[s].height / 2) - (c->geo.height / 2);
|
||||
client_moveresize(c, geo, False);
|
||||
}
|
||||
|
||||
arrange(s, True);
|
||||
arrange(os, True);
|
||||
|
||||
if(!c->tile)
|
||||
{
|
||||
client_focus(c);
|
||||
client_raise(c);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/** Change client of screen to next screen
|
||||
* \cmd uicb_t type unused
|
||||
* \param cmd uicb_t type unused
|
||||
*/
|
||||
void
|
||||
uicb_client_screen_next(uicb_t cmd)
|
||||
{
|
||||
int os;
|
||||
|
||||
CHECK(sel);
|
||||
|
||||
/* Save old client screen to arrange */
|
||||
os = sel->screen;
|
||||
|
||||
/* Set the new client screen */
|
||||
sel->screen = (sel->screen + 1 > screen_count() - 1) ? 0 : sel->screen + 1;
|
||||
sel->tag = seltag[sel->screen];
|
||||
|
||||
/* Arrange */
|
||||
arrange(os, True);
|
||||
arrange(sel->screen, True);
|
||||
client_set_screen(sel, (sel->screen + 1 > screen_count() - 1) ? 0 : sel->screen + 1);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/** Change client of screen to prev screen
|
||||
* \cmd uicb_t type unused
|
||||
* \param cmd uicb_t type unused
|
||||
*/
|
||||
void
|
||||
uicb_client_screen_prev(uicb_t cmd)
|
||||
{
|
||||
int os;
|
||||
|
||||
CHECK(sel);
|
||||
|
||||
/* Save old client screen to arrange */
|
||||
os = sel->screen;
|
||||
|
||||
/* Set the new client screen */
|
||||
sel->screen = (sel->screen - 1 < 0) ? screen_count() - 1 : sel->screen - 1;
|
||||
sel->tag = seltag[sel->screen];
|
||||
|
||||
/* Arrange */
|
||||
arrange(os, True);
|
||||
arrange(sel->screen, True);
|
||||
client_set_screen(sel, (sel->screen - 1 < 0) ? screen_count() - 1 : sel->screen - 1);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
14
src/mouse.c
14
src/mouse.c
@ -62,7 +62,7 @@ mouse_move(Client *c)
|
||||
GC gci;
|
||||
XEvent ev;
|
||||
|
||||
if(c->max || c->lmax || c->state_fullscreen || c->state_dock)
|
||||
if(c->max || c->state_fullscreen || c->state_dock)
|
||||
return;
|
||||
|
||||
ocx = c->geo.x;
|
||||
@ -72,7 +72,7 @@ mouse_move(Client *c)
|
||||
None, cursor[CurMove], CurrentTime) != GrabSuccess)
|
||||
return;
|
||||
|
||||
if(!c->tile)
|
||||
if(!c->tile && !c->lmax)
|
||||
XGrabServer(dpy);
|
||||
|
||||
/* Set the GC for the rectangle */
|
||||
@ -81,7 +81,7 @@ mouse_move(Client *c)
|
||||
xgc.line_width = BORDH;
|
||||
gci = XCreateGC(dpy, ROOT, GCFunction|GCSubwindowMode|GCLineWidth, &xgc);
|
||||
|
||||
if(!c->tile)
|
||||
if(!c->tile && !c->lmax)
|
||||
mouse_dragborder(c->geo, gci);
|
||||
|
||||
XQueryPointer(dpy, ROOT, &dw, &dw, &mx, &my, &dint, &dint, &duint);
|
||||
@ -93,7 +93,7 @@ mouse_move(Client *c)
|
||||
|
||||
if(ev.type == MotionNotify)
|
||||
{
|
||||
if(c->tile)
|
||||
if(c->tile || c->lmax)
|
||||
{
|
||||
XQueryPointer(dpy, ROOT, &dw, &sw, &mx, &my, &dint, &dint, &duint);
|
||||
|
||||
@ -113,7 +113,9 @@ mouse_move(Client *c)
|
||||
XQueryPointer(dpy, infobar[selscreen].bar->win, &dw, &sw, &mx, &my, &dint, &dint, &duint);
|
||||
|
||||
for(i = 1; i < conf.ntag[selscreen] + 1; ++i)
|
||||
if(infobar[selscreen].tags[i]->win == sw)
|
||||
if(infobar[selscreen].tags[i]->win == sw
|
||||
&& tags[selscreen][i].layout.func != freelayout
|
||||
&& tags[selscreen][i].layout.func != maxlayout)
|
||||
{
|
||||
c->screen = selscreen;
|
||||
c->tag = i;
|
||||
@ -146,7 +148,7 @@ mouse_move(Client *c)
|
||||
while(ev.type != ButtonRelease);
|
||||
|
||||
/* One time again to delete all the trace on the window */
|
||||
if(!c->tile)
|
||||
if(!c->tile && !c->lmax)
|
||||
{
|
||||
mouse_dragborder(geo, gci);
|
||||
client_moveresize(c, geo, False);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user