Client: Add client_set_screen() and fix some bugs.

This commit is contained in:
Martin Duquesnoy 2009-07-14 18:45:56 +02:00
parent 11bc12f72a
commit fe8eba8c54
2 changed files with 57 additions and 34 deletions

View File

@ -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;
}

View File

@ -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);