From fe8eba8c54f31e665a3967a4e9114f170a64b6d4 Mon Sep 17 00:00:00 2001 From: Martin Duquesnoy Date: Tue, 14 Jul 2009 18:45:56 +0200 Subject: [PATCH] Client: Add client_set_screen() and fix some bugs. --- src/client.c | 77 +++++++++++++++++++++++++++++++++------------------- src/mouse.c | 14 ++++++---- 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/src/client.c b/src/client.c index 736db5e..48c50d9 100644 --- a/src/client.c +++ b/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; } diff --git a/src/mouse.c b/src/mouse.c index b8fb085..cdcafe9 100644 --- a/src/mouse.c +++ b/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);