X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=wm-wmii.c;h=82363ef01620aba24d7880b6cc20e2c68b0976ec;hb=68b7ef11fe9910511d223bd80ac9bbd38456536c;hp=4a6c0245e1fb789644f856dc297cce3caa1253a4;hpb=9b4ab92753e6e9ff8cdf96c20c6c0a2c8b5f1d33;p=wmpus diff --git a/wm-wmii.c b/wm-wmii.c index 4a6c024..82363ef 100644 --- a/wm-wmii.c +++ b/wm-wmii.c @@ -5,9 +5,15 @@ #include "sys.h" #include "wm.h" +#ifndef MODKEY #define MODKEY alt +#endif +#ifndef MARGIN #define MARGIN 0 +#endif +#ifndef STACK #define STACK 25 +#endif /* Enums */ typedef enum { @@ -69,19 +75,23 @@ static wm_t *wm; #define wm_tag wm->tag #define wm_focus (wm_tag && wm_dpy && wm_col && wm_row ? wm_win : NULL) +#define WIN(l) ((win_t*)(l)->data) #define ROW(l) ((row_t*)(l)->data) #define COL(l) ((col_t*)(l)->data) #define DPY(l) ((dpy_t*)(l)->data) #define TAG(l) ((tag_t*)(l)->data) +#define tag_foreach(tag, dpy, col, row, win) \ + for (list_t *dpy = tag ->dpys; dpy; dpy = dpy->next) \ + for (list_t *col = DPY(dpy)->cols; col; col = col->next) \ + for (list_t *row = COL(col)->rows; row; row = row->next) \ + for (win_t *win = ROW(row)->win; win; win = NULL) \ + /* Helper functions */ static int searchl(tag_t *tag, win_t *target, list_t **_dpy, list_t **_col, list_t **_row) { - for (list_t *dpy = tag ->dpys; dpy; dpy = dpy->next) - for (list_t *col = DPY(dpy)->cols; col; col = col->next) - for (list_t *row = COL(col)->rows; row; row = row->next) { - win_t *win = ROW(row)->win; + tag_foreach(tag, dpy, col, row, win) { if (win == target) { if (_dpy) *_dpy = dpy; if (_col) *_col = col; @@ -108,7 +118,8 @@ static int search(tag_t *tag, win_t *target, static void set_mode(win_t *win, mode_t mode) { col_t *col; - search(wm_tag, win, NULL, &col, NULL); + if (!search(wm_tag, win, NULL, &col, NULL)) + return; printf("set_mode: %p, %d -> %d\n", col, col->mode, mode); col->mode = mode; @@ -122,6 +133,11 @@ static void set_mode(win_t *win, mode_t mode) static void set_focus(win_t *win) { + if (win == NULL || win == wm->root) { + sys_focus(wm->root); + return; + } + /* - Only grab mouse button on unfocused window, * this prevents stealing all mouse clicks from client windows, * - A better way may be to re-send mouse clicks to client windows @@ -160,25 +176,26 @@ static void print_txt(void) { for (list_t *ltag = wm->tags; ltag; ltag = ltag->next) { tag_t *tag = ltag->data; - printf("tag: <%-9p [%p->%p] >%-9p - %d\n", - ltag->prev, ltag, ltag->data, ltag->next, tag->name); + printf("tag: <%-9p [%p->%p] >%-9p !%-9p - %d\n", + ltag->prev, ltag, ltag->data, ltag->next, + tag->dpy, tag->name); for (list_t *ldpy = tag->dpys; ldpy; ldpy = ldpy->next) { dpy_t *dpy = ldpy->data; win_t *geom = dpy->geom; - printf(" dpy: <%-9p [%p->%p] >%-9p - %d,%d %dx%d\n", + printf(" dpy: <%-9p [%p->%p] >%-9p !%-9p - %d,%d %dx%d\n", ldpy->prev, ldpy, ldpy->data, ldpy->next, - geom->x, geom->y, geom->h, geom->w); + dpy->col, geom->x, geom->y, geom->h, geom->w); for (list_t *lcol = dpy->cols; lcol; lcol = lcol->next) { col_t *col = lcol->data; - printf(" col: <%-9p [%p->%p] >%-9p - %dpx @ %d !!%p\n", + printf(" col: <%-9p [%p->%p] >%-9p !%-9p - %dpx @ %d\n", lcol->prev, lcol, lcol->data, lcol->next, - col->width, col->mode, col->row); + col->row, col->width, col->mode); for (list_t *lrow = col->rows; lrow; lrow = lrow->next) { row_t *row = lrow->data; win_t *win = row->win; - printf(" win: <%-9p [%p>>%p] >%-9p - %4dpx focus=%d%d\n", + printf(" win: <%-9p [%p>>%p] >%-9p !%-9p - %4dpx focus=%d%d\n", lrow->prev, lrow, win, lrow->next, - win->h, col->row == row, wm_focus == win); + win, win->h, col->row == row, wm_focus == win); } } } } } @@ -201,7 +218,7 @@ static void cut_win(tag_t *tag, win_t *win) } } -static void put_win(win_t *win, dpy_t *dpy, col_t *col) +static void put_win(win_t *win, tag_t *tag, dpy_t *dpy, col_t *col) { row_t *row = new0(row_t); row->win = win; @@ -218,9 +235,9 @@ static void put_win(win_t *win, dpy_t *dpy, col_t *col) } else { col->rows = list_insert(col->rows, row); } - wm_tag->dpy = dpy; - wm_tag->dpy->col = col; - wm_tag->dpy->col->row = row; + tag->dpy = dpy; + tag->dpy->col = col; + tag->dpy->col->row = row; row->height = dpy->geom->h / MAX(nrows,1); if (nrows == 0) { @@ -236,7 +253,8 @@ static void shift_window(win_t *win, int col, int row) print_txt(); printf("shift_window: >>>\n"); list_t *ldpy, *lcol, *lrow; - searchl(wm_tag, win, &ldpy, &lcol, &lrow); + if (!searchl(wm_tag, win, &ldpy, &lcol, &lrow)) + return; dpy_t *dpy = ldpy->data; if (row != 0) { list_t *src = lrow, *dst = NULL; @@ -279,7 +297,7 @@ static void shift_window(win_t *win, int col, int row) } } cut_win(wm_tag, win); - put_win(win, dpy, dst ? dst->data : NULL); + put_win(win, wm_tag, dpy, dst ? dst->data : NULL); goto update; } update: @@ -302,7 +320,8 @@ static void shift_focus(int cols, int rows) printf("shift_focus: %+d,%+d\n", cols, rows); if (rows != 0 && wm_focus) { list_t *dpy, *col, *row; - searchl(wm_tag, wm_focus, &dpy, &col, &row); + if (!searchl(wm_tag, wm_focus, &dpy, &col, &row)) + return; row_t *next = get_next(row, rows > 0)->data; set_focus(next->win); if (COL(col)->mode != split) @@ -311,7 +330,8 @@ static void shift_focus(int cols, int rows) if (cols != 0) { list_t *dpy, *col, *row, *ndpy, *ncol = NULL; if (wm_focus) { - searchl(wm_tag, wm_focus, &dpy, &col, &row); + if (!searchl(wm_tag, wm_focus, &dpy, &col, &row)) + return; ncol = cols > 0 ? col->next : col->prev; } else { dpy = list_find(wm_tag->dpys, wm_dpy); @@ -352,7 +372,7 @@ static tag_t *tag_find(int name) } if (!tag) { tag = tag_new(wm->screens, name); - wm->tags = list_insert(wm->tags, tag); + wm->tags = list_append(wm->tags, tag); } return tag; } @@ -362,12 +382,19 @@ static void tag_set(win_t *win, int name) printf("tag_set: %p %d\n", win, name); if (wm_tag->name == name) return; + tag_t *tag = tag_find(name); cut_win(wm_tag, win); - win_t *focus = wm_focus; + put_win(win, tag, tag->dpy, tag->dpy->col); + set_focus(wm_focus); +} - tag_t *tag = tag_find(name); - put_win(win, tag->dpy, tag->dpy->col); - set_focus(focus); +static void tag_switch(int name) +{ + printf("tag_switch: %d\n", name); + if (wm_col == NULL || wm_row == NULL) + wm->tags = list_remove(wm->tags, + list_find(wm->tags, wm_tag)); + wm_tag = tag_find(name); } /* Window management functions */ @@ -381,23 +408,23 @@ void wm_update_dpy(dpy_t *dpy) /* Scale horizontally */ x = dpy->geom->x; mx = dpy->geom->w - (list_length(dpy->cols)+1)*MARGIN; - for (list_t *lx = dpy->cols; lx; lx = lx->next) - tx += COL(lx)->width; - for (list_t *lx = dpy->cols; lx; lx = lx->next) - COL(lx)->width *= (float)mx / tx; + for (list_t *lcol = dpy->cols; lcol; lcol = lcol->next) + tx += COL(lcol)->width; + for (list_t *lcol = dpy->cols; lcol; lcol = lcol->next) + COL(lcol)->width *= (float)mx / tx; /* Scale each column vertically */ - for (list_t *lx = dpy->cols; lx; lx = lx->next) { - col_t *col = lx->data; + for (list_t *lcol = dpy->cols; lcol; lcol = lcol->next) { + col_t *col = lcol->data; ty = 0; - for (list_t *ly = col->rows; ly; ly = ly->next) - ty += ROW(ly)->height; + for (list_t *lrow = col->rows; lrow; lrow = lrow->next) + ty += ROW(lrow)->height; y = dpy->geom->y; my = dpy->geom->h - (list_length(col->rows)+1)*MARGIN; - sy = my - (list_length(col->rows)-1)*STACK; - for (list_t *ly = col->rows; ly; ly = ly->next) { - win_t *win = ROW(ly)->win; - win->h = ROW(ly)->height; + sy = my - (list_length(col->rows)-1)*STACK; + for (list_t *lrow = col->rows; lrow; lrow = lrow->next) { + win_t *win = ROW(lrow)->win; + win->h = ROW(lrow)->height; int height = 0; switch (col->mode) { case split: @@ -406,7 +433,13 @@ void wm_update_dpy(dpy_t *dpy) height = win->h; break; case stack: - height = col->row->win == win ? sy : STACK; + if (lrow->next && ROW(lrow->next)->win == col->row->win) { + /* Hack to prevent flashing */ + win_t *next = ROW(lrow->next)->win; + sys_move(next, x+MARGIN, y+MARGIN+STACK+MARGIN, + col->width, sy); + } + height = win == col->row->win ? sy : STACK; sys_move(win, x+MARGIN, y+MARGIN, col->width, height); break; @@ -419,7 +452,7 @@ void wm_update_dpy(dpy_t *dpy) break; } y += height + MARGIN; - ROW(ly)->height = win->h; + ROW(lrow)->height = win->h; } x += col->width + MARGIN; } @@ -428,12 +461,12 @@ void wm_update_dpy(dpy_t *dpy) void wm_update(void) { /* Show/hide tags */ - for (list_t *ltag = wm ->tags; ltag; ltag = ltag->next) - for (list_t *ldpy = TAG(ltag)->dpys; ldpy; ldpy = ldpy->next) - for (list_t *lcol = DPY(ldpy)->cols; lcol; lcol = lcol->next) - for (list_t *lrow = COL(lcol)->rows; lrow; lrow = lrow->next) - sys_show(ROW(lrow)->win, - ltag->data == wm_tag ? st_show : st_hide); + tag_foreach(wm_tag, dpy, col, row, win) + sys_show(win, st_show); + for (list_t *tag = wm ->tags; tag; tag = tag->next) + tag_foreach(TAG(tag), dpy, col, row, win) + if (tag->data != wm_tag) + sys_show(win, st_hide); /* Refrsh the display */ for (list_t *ldpy = wm_tag->dpys; ldpy; ldpy = ldpy->next) @@ -454,9 +487,9 @@ int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) /* Mouse movement */ if (key_mouse0 <= key && key <= key_mouse7 && mod.up) - return set_move(win,ptr,none), 1; + return set_move(win,ptr,none), 0; else if (key == key_mouse1 && mod.MODKEY) - return set_move(win,ptr,move), 1; + return set_move(win,ptr,move), 1; else if (key == key_mouse3 && mod.MODKEY) return set_move(win,ptr,resize), 1; @@ -466,12 +499,14 @@ int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) /* Misc */ if (mod.MODKEY) { +#ifdef DEBUG if (key == key_f1) return sys_raise(win), 1; if (key == key_f2) return set_focus(win), 1; if (key == key_f3) return sys_show(win, st_show), 1; if (key == key_f4) return sys_show(win, st_hide), 1; +#endif if (key == key_f5) return wm_update(), 1; - if (key == key_f6) return print_txt(), 1; + if (key == key_f6) return print_txt(), 1; } if (key_mouse0 <= key && key <= key_mouse7) sys_raise(win); @@ -510,12 +545,10 @@ int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) /* Tag switching */ if (mod.MODKEY && '0' <= key && key <= '9') { int name = key - '0'; - if (mod.shift) { + if (mod.shift) tag_set(win, name); - } else { - printf("tag_switch: %d\n", name); - wm_tag = tag_find(name); - } + else + tag_switch(name); wm_update(); } @@ -585,11 +618,11 @@ void wm_insert(win_t *win) sys_watch(win, key_focus, MOD()); /* Add to screen */ - put_win(win, wm_dpy, wm_col); + put_win(win, wm_tag, wm_dpy, wm_col); /* Arrange */ wm_update(); - sys_focus(wm_focus); + set_focus(wm_focus); print_txt(); } @@ -599,10 +632,7 @@ void wm_remove(win_t *win) print_txt(); for (list_t *tag = wm->tags; tag; tag = tag->next) cut_win(tag->data, win); - if (wm_focus) - sys_focus(wm_focus); - else - sys_focus(wm->root); + set_focus(wm_focus); wm_update(); print_txt(); } @@ -611,9 +641,19 @@ void wm_init(win_t *root) { printf("wm_init: %p\n", root); + /* Hack, fix screen order */ + list_t *screens = sys_info(root); + list_t *left = screens; + list_t *right = screens->next; + if (left && right && WIN(left)->x > WIN(right)->x) { + void *tmp = left->data; + left->data = right->data; + right->data = tmp; + } + wm = new0(wm_t); wm->root = root; - wm->screens = sys_info(root); + wm->screens = screens; wm->tag = tag_new(wm->screens, 1); wm->tags = list_insert(NULL, wm->tag);