wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit 64a8931b132a13c49cab0ab89de2493f3af753fc
parent e02d9ae205b359c8ff3e7e2c6008bd93fa83d6aa
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Mon,  8 May 2006 20:06:36 +0200

some drop_move related changes, still not finished with issues


Diffstat:
TODO.wmii-4 | 5+++++
cmd/wm/column.c | 82++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
cmd/wm/frame.c | 36+++++++++++++++++++++++++++++++++++-
cmd/wm/wm.h | 3+++
4 files changed, 97 insertions(+), 29 deletions(-)

diff --git a/TODO.wmii-4 b/TODO.wmii-4 @@ -54,3 +54,8 @@ ad new column mode: > clients are visible. --Doug Bell + +13:12 < Neptun> when present (like -T "Enter view name") it would create a +label with that text on the left part of the menu. what do you think? + +- /def/ncol defines num of columns which should be created by default if possible. diff --git a/cmd/wm/column.c b/cmd/wm/column.c @@ -326,12 +326,36 @@ AfterVertical: relax_column(a); } +static Frame * +frame_of_point(XPoint *pt) +{ + unsigned int i, j; + Frame *f = nil; + View *v = view.size ? view.data[sel] : nil; + + if(!v) + return nil; + + for(i = 1; (i < v->area.size) && + !blitz_ispointinrect(pt->x, pt->y, &v->area.data[i]->rect); i++); + if(i < v->area.size) { + Area *a = v->area.data[i]; + for(j = 0; j < a->frame.size && + !blitz_ispointinrect(pt->x, pt->y, &a->frame.data[j]->rect); j++); + if(j < a->frame.size) + f = a->frame.data[j]; + } + return f; +} + static void drop_move(Frame *f, XRectangle *new, XPoint *pt) { Area *tgt = nil, *src = f->area; View *v = src->view; unsigned int i; + int fidx; + Frame *ft; if(!pt) return; @@ -339,26 +363,40 @@ drop_move(Frame *f, XRectangle *new, XPoint *pt) for(i = 1; (i < v->area.size) && !blitz_ispointinrect(pt->x, pt->y, &v->area.data[i]->rect); i++); if((tgt = ((i < v->area.size) ? v->area.data[i] : nil))) { - if(src->frame.size > 1 || src != tgt) { + if(src != tgt) { int x = new->x + (new->width / 2); - if(x < 0) + Bool new; + if(x < 0) { tgt = new_left_column(v); - else if(x > rect.width) + new = True; + } + else if(x > rect.width) { tgt = new_right_column(v); + new = True; + } + if(new) + send_to_area(tgt, src, f->client); + else { + if(!(ft = frame_of_point(pt)) || (f == ft)) + return; + send_to_area(tgt, src, f->client); + goto InsertAtPointer; + } } - if(tgt != src) - send_to_area(tgt, src, f->client); else { - for(i = 0; (i < src->frame.size) && - !blitz_ispointinrect(pt->x, pt->y, &src->frame.data[i]->rect); i++); - if((i < src->frame.size) && (f != src->frame.data[i])) { - unsigned int j = idx_of_frame(f); - Frame *tmp = src->frame.data[j]; - src->frame.data[j] = src->frame.data[i]; - src->frame.data[i] = tmp; - arrange_column(src, False); - focus_client(f->client, True); - } + if(!(ft = frame_of_point(pt)) || (f == ft)) + return; +InsertAtPointer: + cext_vdetach(vector_of_frames(&tgt->frame), f); + fidx = idx_of_frame(ft); + + if(pt->y < (ft->rect.y + ft->rect.height / 2)) + insert_before_idx(&tgt->frame, f, fidx); + else + insert_after_idx(&tgt->frame, f, fidx); + + tgt->sel = idx_of_frame(f); + arrange_column(tgt, False); } } } @@ -367,19 +405,7 @@ void drop_swap(Client *c, XPoint *pt) { - unsigned int i, j; - Frame *f1 = c->frame.data[c->sel], *f2 = nil; - View *v = view.data[sel]; - - for(i = 1; (i < v->area.size) && - !blitz_ispointinrect(pt->x, pt->y, &v->area.data[i]->rect); i++); - if(i < v->area.size) { - Area *a = v->area.data[i]; - for(j = 0; j < a->frame.size && - !blitz_ispointinrect(pt->x, pt->y, &a->frame.data[j]->rect); j++); - if(j < a->frame.size) - f2 = a->frame.data[j]; - } + Frame *f1 = c->frame.data[c->sel], *f2 = frame_of_point(pt); if(!f2 || f1 == f2 || !idx_of_area(f1->area)) return; diff --git a/cmd/wm/frame.c b/cmd/wm/frame.c @@ -7,7 +7,7 @@ #include "wm.h" -static Vector * +Vector * vector_of_frames(FrameVector *fv) { return (Vector *) fv; @@ -78,3 +78,37 @@ frame_of_win(Window w) return client.data[i]; return nil; } + +static void +xinsert(FrameVector *fv, Frame *f, unsigned int idx, Bool before) +{ + FrameVector tmp = {0}; + unsigned int i; + + for(i = 0; i < fv->size; i++) { + if(before && (i == idx)) + cext_vattach(vector_of_frames(&tmp), f); + cext_vattach(vector_of_frames(&tmp), fv->data[i]); + if(!before && (i == idx)) + cext_vattach(vector_of_frames(&tmp), f); + } + + while(fv->size) + cext_vdetach(vector_of_frames(fv), fv->data[0]); + for(i = 0; i < tmp.size; i++) + cext_vattach(vector_of_frames(fv), tmp.data[i]); + while(tmp.size) + cext_vdetach(vector_of_frames(&tmp), tmp.data[0]); +} + +void +insert_before_idx(FrameVector *fv, Frame *f, unsigned int idx) +{ + xinsert(fv, f, idx, True); +} + +void +insert_after_idx(FrameVector *fv, Frame *f, unsigned int idx) +{ + xinsert(fv, f, idx, False); +} diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -251,11 +251,14 @@ void check_x_event(IXPConn *c); unsigned int flush_masked_events(long even_mask); /* frame.c */ +Vector *vector_of_frames(FrameVector *fv); Frame *create_frame(Area *a, Client *c); void destroy_frame(Frame *f); int idx_of_frame_id(Area *a, unsigned short id); int idx_of_frame(Frame *f); Client *frame_of_win(Window w); +void insert_before_idx(FrameVector *fv, Frame *f, unsigned int idx); +void insert_after_idx(FrameVector *fv, Frame *f, unsigned int idx); /* fs.c */ unsigned long long pack_qpath(unsigned char type, unsigned short i1,