diff --git a/src/client.c b/src/client.c index 4da8c8f..170f42b 100644 --- a/src/client.c +++ b/src/client.c @@ -147,7 +147,7 @@ client_get_next_with_direction(Client *bc, Position pos) { 0, -1 }, { 0, 1 } /* Top, Bottom */ }; - if(!bc || ishide(bc, selscreen)) + if(!bc) return NULL; /* Start place of pointer for faster scanning */ @@ -519,12 +519,13 @@ client_urgent(Client *c, Bool u) { Client *cc; - if(x < 0 || x > spgeo[selscreen].x + spgeo[selscreen].width - || y < 0 || y > spgeo[selscreen].y + spgeo[selscreen].height) + if(x < 0 || x > spgeo[c->screen].x + spgeo[c->screen].width + || y < 0 || y > spgeo[c->screen].y + spgeo[c->screen].height) return NULL; for(cc = clients; cc; cc = cc->next) - if(!ishide(cc, selscreen) && (cc->flags & TileFlag) && cc != c) + if(cc != c && cc->screen == c->screen && cc->tag == c->tag + && (cc->flags & TileFlag)) if(cc->frame_geo.x < x && cc->frame_geo.x + cc->frame_geo.width > x && cc->frame_geo.y < y && cc->frame_geo.y + cc->frame_geo.height > y) return cc; @@ -1038,6 +1039,7 @@ client_maximize(Client *c) if(!c || c->flags & FSSFlag) return; + cfactor_clean(c); c->screen = screen_get_with_geo(c->geo.x, c->geo.y); c->geo.x = sgeo[c->screen].x; @@ -1045,7 +1047,7 @@ client_maximize(Client *c) c->geo.width = sgeo[c->screen].width - BORDH * 2; c->geo.height = sgeo[c->screen].height - BORDH; - client_moveresize(c, c->geo, tags[c->screen][c->tag].resizehint); + client_moveresize(c, (c->pgeo = c->geo), tags[c->screen][c->tag].resizehint); return; } diff --git a/src/split.c b/src/split.c index 4ff03ff..0860e2c 100644 --- a/src/split.c +++ b/src/split.c @@ -104,8 +104,9 @@ split_arrange_closed(Client *ghost) XRectangle cgeo; Client *c, *cc; int screen = ghost->screen; + int tag = (ghost->tag ? ghost->tag : seltag[screen]); - if(tags[screen][seltag[screen]].layout.func != split) + if(tags[screen][tag].layout.func != split) return; /* Use ghost client properties to fix holes in tile @@ -133,7 +134,7 @@ split_arrange_closed(Client *ghost) { _split_arrange_size(ghost->wrgeo, &c->wrgeo, p); cfactor_clean(c); - client_moveresize(c, (c->pgeo = c->wrgeo), tags[screen][c->tag].resizehint); + client_moveresize(c, (c->pgeo = c->wrgeo), tags[screen][tag].resizehint); return; } @@ -249,7 +250,7 @@ split_client_integrate(Client *c, Client *sc, int screen, int tag) /* Looking for first client on wanted tag */ for(b = False, sc = clients; sc; sc = sc->next) if(sc->screen == screen && sc->tag == tag - && (c->flags & TileFlag)) + && (c->flags & (TileFlag | SplitFlag))) { b = True; break; @@ -258,16 +259,12 @@ split_client_integrate(Client *c, Client *sc, int screen, int tag) /* No client on wanted tag to integrate */ if(!b) { - g.x = sgeo[c->screen].x; - g.y = sgeo[c->screen].y ; - g.width = sgeo[c->screen].width - BORDH * 2; - g.height = sgeo[c->screen].height - BORDH; + client_maximize(c); + return; } } - if(b) - g = split_client(sc, (sc->frame_geo.height < sc->frame_geo.width)); - + g = split_client(sc, (sc->frame_geo.height < sc->frame_geo.width)); split_client_fill(c, g); return; diff --git a/src/tag.c b/src/tag.c index fcc1558..55184fa 100644 --- a/src/tag.c +++ b/src/tag.c @@ -133,6 +133,8 @@ tag_set(int tag) void tag_transfert(Client *c, int tag) { + int s; + screen_get_sel(); CHECK(c); @@ -140,9 +142,12 @@ tag_transfert(Client *c, int tag) if(tag <= 0) tag = 1; - if(tag > conf.ntag[selscreen]) + if(tag > conf.ntag[selscreen] + || (c->screen == selscreen && c->tag == tag)) return; + s = c->screen; + if(c->flags & SplitFlag) { split_arrange_closed(c); @@ -156,6 +161,9 @@ tag_transfert(Client *c, int tag) arrange(c->screen, True); + if(s != c->screen) + arrange(s, True); + client_focus_next(c); client_update_attributes(c);