wmii

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

commit 7d1811da8fcbf0c60568166f1da8b1d70f6d07fa
parent 0af8de3e858ffcebf56a318b14f8a5a94708b390
Author: garbeam <garbeam@mmv.wmii.de>
Date:   Tue, 13 Dec 2005 20:45:56 +0200

added M-Enter for swap west and M-S-Enter for swap east (column layout),
beside several fixes of mouse based movements/resizals


Diffstat:
cmd/wm/layout_column.c | 184++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
cmd/wm/mouse.c | 8+++-----
liblitz/blitz.h | 2+-
liblitz/geometry.c | 5++---
rc/wmiirc | 4++--
5 files changed, 121 insertions(+), 82 deletions(-)

diff --git a/cmd/wm/layout_column.c b/cmd/wm/layout_column.c @@ -36,13 +36,11 @@ static Action *get_actions_col(Area *a); static void select_frame(void *obj, char *arg); static void swap_frame(void *obj, char *arg); static void new_col(void *obj, char *arg); -static void destroy_col(void *obj, char *arg); static Action lcol_acttbl[] = { {"select", select_frame}, {"swap", swap_frame}, {"new", new_col}, - {"destroy", destroy_col}, {0, 0} }; @@ -169,6 +167,7 @@ static void update_column_width(Area *a) width = area_rect.width / size; for (i = 0; i < size; i++) { Column *col = cext_list_get_item(&acme->columns, i); + col->rect = area_rect; col->rect.x = i * width; col->rect.width = width; } @@ -226,53 +225,55 @@ static void drop_resize(Frame *f, XRectangle *new) south = cext_list_get_item(&col->frames, fidx + 1); /* horizontal resize */ - if (new->x < f->rect.x) { - if (west && new->x > west->rect.x) { - west->rect.width = new->x - west->rect.x; - col->rect.width += f->rect.x - new->x; - col->rect.x = new->x; - cext_list_iterate(&west->frames, &west->rect, iter_match_frame_horiz); - cext_list_iterate(&col->frames, &col->rect, iter_match_frame_horiz); - } + if (west && (new->x != f->rect.x)) { + west->rect.width = new->x - west->rect.x; + col->rect.width += f->rect.x - new->x; + col->rect.x = new->x; + cext_list_iterate(&west->frames, &west->rect, iter_match_frame_horiz); + cext_list_iterate(&col->frames, &col->rect, iter_match_frame_horiz); } - if (new->x + new->width > f->rect.x + f->rect.width) { - if (east && (new->x + new->width < east->rect.x + east->rect.width)) { - east->rect.width -= new->x + new->width - east->rect.x; - east->rect.x = new->x + new->width; - col->rect.x = new->x; - col->rect.width = new->width; - cext_list_iterate(&col->frames, &col->rect, iter_match_frame_horiz); - cext_list_iterate(&east->frames, &east->rect, iter_match_frame_horiz); - } + if (east && (new->x + new->width != f->rect.x + f->rect.width)) { + east->rect.width -= new->x + new->width - east->rect.x; + east->rect.x = new->x + new->width; + col->rect.x = new->x; + col->rect.width = new->width; + cext_list_iterate(&col->frames, &col->rect, iter_match_frame_horiz); + cext_list_iterate(&east->frames, &east->rect, iter_match_frame_horiz); } /* vertical resize */ - if (new->y < f->rect.y) { - if (north && new->y > north->rect.y) { - north->rect.height = new->y - north->rect.y; - f->rect.height += new->y - north->rect.y; - f->rect.y = new->y; - resize_frame(north, &north->rect, nil); - resize_frame(f, &f->rect, nil); - } + if (north && (new->y != f->rect.y)) { + north->rect.height = new->y - north->rect.y; + f->rect.height += f->rect.y - new->y; + f->rect.y = new->y; + resize_frame(north, &north->rect, nil); + resize_frame(f, &f->rect, nil); } - if (new->y + new->height > f->rect.y + f->rect.height) { - if (south && (new->y + new->height < south->rect.y + south->rect.height)) { - south->rect.height -= new->y + new->height - south->rect.y; - south->rect.y = new->y + new->height; - f->rect.y = new->y; - f->rect.height = new->height; - resize_frame(f, &f->rect, nil); - resize_frame(south, &south->rect, nil); - } + if (south && (new->y + new->height > f->rect.y + f->rect.height)) { + south->rect.height -= new->y + new->height - south->rect.y; + south->rect.y = new->y + new->height; + f->rect.y = new->y; + f->rect.height = new->height; + resize_frame(f, &f->rect, nil); + resize_frame(south, &south->rect, nil); } } -static int comp_pointer(void *point, void *column) +static int comp_pointer_frame(void *point, void *frame) +{ + Frame *f = frame; + XPoint *pt = point; + + fprintf(stderr, "frame: %d,%d in %d,%d,%d,%d ?\n", pt->x, pt->y, f->rect.x, f->rect.y, f->rect.width, f->rect.height); + return blitz_ispointinrect(pt->x, pt->y, &f->rect); +} + +static int comp_pointer_col(void *point, void *column) { Column *col = column; XPoint *pt = point; + fprintf(stderr, "col: %d,%d in %d,%d,%d,%d ?\n", pt->x, pt->y, col->rect.x, col->rect.y, col->rect.width, col->rect.height); return blitz_ispointinrect(pt->x, pt->y, &col->rect); } @@ -284,16 +285,25 @@ static void drop_moving(Frame *f, XRectangle *new, XPoint *pt) if (!pt) return; - tgt = cext_find_item(&acme->columns, pt, comp_pointer); - - if (tgt && tgt != src) - { - cext_detach_item(&src->frames, f); - cext_attach_item(&tgt->frames, f); - f->aux = tgt; - cext_stack_top_item(&acme->columns, tgt); - iter_arrange_column(tgt, f->area); - iter_arrange_column(src, f->area); + if ((tgt = cext_find_item(&acme->columns, pt, comp_pointer_col))) { + if (tgt != src) { + if (cext_sizeof_container(&src->frames) < 2) + return; + cext_detach_item(&src->frames, f); + cext_attach_item(&tgt->frames, f); + f->aux = tgt; + iter_arrange_column(tgt, f->area); + iter_arrange_column(src, f->area); + select_col(f, True); + } + else { + Frame *other = cext_find_item(&tgt->frames, pt, comp_pointer_frame); + if (other != f) { + cext_swap_items(&tgt->frames, f, other); + iter_arrange_column(tgt, f->area); + select_col(f, True); + } + } } } @@ -369,10 +379,62 @@ static void swap_frame(void *obj, char *arg) { Area *a = obj; Acme *acme = a->aux; - Column *col = get_sel_column(acme); - Frame *f = cext_stack_get_top_item(&col->frames); + Column *west = 0, *east = 0, *col = get_sel_column(acme); + Frame *north = 0, *south = 0, *f = cext_stack_get_top_item(&col->frames); + size_t ncol, nfr; + int colidx, fidx; + if (!f || !arg) return; + + ncol = cext_sizeof_container(&acme->columns); + nfr = cext_sizeof_container(&col->frames); + colidx = cext_list_get_item_index(&acme->columns, col); + fidx = cext_list_get_item_index(&col->frames, f); + + if (colidx > 0) + west = cext_list_get_item(&acme->columns, colidx - 1); + if (colidx + 1 < ncol) + east = cext_list_get_item(&acme->columns, colidx + 1); + if (fidx > 0) + north = cext_list_get_item(&col->frames, fidx - 1); + if (fidx + 1 < nfr) + south = cext_list_get_item(&col->frames, fidx + 1); + + if (!strncmp(arg, "north", 6) && north) { + cext_swap_items(&col->frames, f, north); + iter_arrange_column(col, f->area); + select_col(f, True); + } + else if (!strncmp(arg, "south", 6) && south) { + cext_swap_items(&col->frames, f, south); + iter_arrange_column(col, f->area); + select_col(f, True); + } + else if (!strncmp(arg, "west", 5) && west && (ncol > 1)) { + Frame *other = cext_stack_get_top_item(&west->frames); + cext_detach_item(&col->frames, f); + cext_detach_item(&west->frames, other); + cext_attach_item(&west->frames, f); + cext_attach_item(&col->frames, other); + f->aux = west; + other->aux = col; + iter_arrange_column(west, f->area); + iter_arrange_column(col, other->area); + select_col(f, True); + } + else if (!strncmp(arg, "east", 5) && east && (ncol > 1)) { + Frame *other = cext_stack_get_top_item(&east->frames); + cext_detach_item(&col->frames, f); + cext_detach_item(&east->frames, other); + cext_attach_item(&east->frames, f); + cext_attach_item(&col->frames, other); + f->aux = east; + other->aux = col; + iter_arrange_column(east, f->area); + iter_arrange_column(col, other->area); + select_col(f, True); + } } static void new_col(void *obj, char *arg) @@ -390,26 +452,6 @@ static void new_col(void *obj, char *arg) cext_attach_item(&col->frames, f); cext_attach_item(&acme->columns, col); update_column_width(a); -} - -static void destroy_col(void *obj, char *arg) -{ - Area *a = obj; - Acme *acme = a->aux; - Column *col = get_sel_column(acme); - size_t size; - - if (cext_sizeof_container(&acme->columns) > 1) { - while (cext_sizeof_container(&col->frames)) { - Frame *f = cext_stack_get_top_item(&col->frames); - while ((size = cext_sizeof_container(&f->clients))) { - detach_col(a, cext_stack_get_top_item(&f->clients), a->page != get_sel_page()); - if (size == 1) - break; - } - } - cext_detach_item(&acme->columns, col); - free(col); - update_column_width(a); - } + select_col(f, True); + draw_frame(f, nil); } diff --git a/cmd/wm/mouse.c b/cmd/wm/mouse.c @@ -601,12 +601,10 @@ void center_pointer(Frame * f) return; XQueryPointer(dpy, f->win, &dummy, &dummy, &i, &i, &wex, &wey, &dmask); XTranslateCoordinates(dpy, f->win, root, wex, wey, &ex, &ey, &dummy); - if (blitz_ispointinrect(ex, ey, &f->rect)) - return; /* suppress EnterNotify's while mouse warping */ - XSelectInput(dpy, root, ROOT_MASK & ~StructureNotifyMask); - XWarpPointer(dpy, None, f->win, 0, 0, 0, 0, f->rect.width / 2, - f->rect.height / 2); + XSelectInput(dpy, root, ROOT_MASK & ~EnterWindowMask); + XSync(dpy, False); + XWarpPointer(dpy, None, f->win, 0, 0, 0, 0, f->rect.width / 2, f->rect.height / 2); XSync(dpy, False); XSelectInput(dpy, root, ROOT_MASK); } diff --git a/liblitz/blitz.h b/liblitz/blitz.h @@ -43,7 +43,7 @@ void blitz_drawlabelnoborder(Display * dpy, Draw * r); /* geometry.c */ int blitz_strtorect(XRectangle * root, XRectangle * r, char *val); -int blitz_ispointinrect(int x, int y, XRectangle * r); +Bool blitz_ispointinrect(int x, int y, XRectangle * r); int blitz_distance(XRectangle * origin, XRectangle * target); void blitz_getbasegeometry(Container *c, unsigned int *size, unsigned int *cols, unsigned int *rows); diff --git a/liblitz/geometry.c b/liblitz/geometry.c @@ -183,10 +183,9 @@ int blitz_strtorect(XRectangle * root, XRectangle * r, char *val) return TRUE; } -int blitz_ispointinrect(int x, int y, XRectangle * r) +Bool blitz_ispointinrect(int x, int y, XRectangle * r) { - return (x >= r->x) && (x <= r->x + r->width) - && (y >= r->y) && (y <= r->y + r->height); + return (x >= r->x) && (x <= r->x + r->width) && (y >= r->y) && (y <= r->y + r->height); } int blitz_distance(XRectangle * origin, XRectangle * target) diff --git a/rc/wmiirc b/rc/wmiirc @@ -144,9 +144,9 @@ kbind normal $MODKEY-a 'wmiir write /wm/ctl attach' kbind normal $MODKEY-S-a 'wmiir write /wm/ctl detached_clients' kbind normal $MODKEY-S-c 'wmiir write /wm/sel/layout/1/name column' kbind normal $MODKEY-S-n 'wmiir write /wm/sel/layout/sel/ctl new' -kbind normal $MODKEY-S-d 'wmiir write /wm/sel/layout/sel/ctl destroy' kbind normal $MODKEY-S-f 'wmiir write /wm/sel/layout/sel/name float' -kbind normal $MODKEY-Return 'wmiir write /wm/sel/ctl ''select zoomed''' +kbind normal $MODKEY-Return 'wmiir write /wm/sel/layout/sel/ctl ''swap west''' +kbind normal $MODKEY-S-Return 'wmiir write /wm/sel/layout/sel/ctl ''swap east''' kbind normal $MODKEY-C-y 'wmiir write /wm/ctl new' kbind normal $MODKEY-u 'wmiir write /wm/sel/layout/sel/frame/sel/locked 0' kbind normal $MODKEY-S-u 'wmiir write /wm/sel/layout/sel/frame/sel/locked 1'