X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=wm-wmii.c;h=5a814e3fb4095c10f0d0098604285ff6c0ea2bb4;hb=306672f9422fb3be995152e37abb704a9b568726;hp=e2025188c6e7093229e46e248941fe9a3086305c;hpb=c7b78a6e35dddf23951730bca13f647b7ad1ae85;p=wmpus diff --git a/wm-wmii.c b/wm-wmii.c index e202518..5a814e3 100644 --- a/wm-wmii.c +++ b/wm-wmii.c @@ -6,8 +6,8 @@ #include "wm.h" #define MODKEY alt -#define MARGIN 10 -#define STACK 20 +#define MARGIN 0 +#define STACK 25 /* Loca types */ struct win_wm { @@ -34,6 +34,7 @@ typedef struct { static drag_t move_mode; static win_t *move_win; static ptr_t move_prev; +static struct { int v, h; } move_dir; /* Window management data */ static win_t *wm_focus; @@ -76,7 +77,7 @@ static void set_focus(win_t *win) sys_focus(win); } -static void set_move(drag_t drag, win_t *win, ptr_t ptr) +static void set_move(win_t *win, ptr_t ptr, drag_t drag) { printf("set_move: %d - %p@%d,%d\n", drag, win, ptr.rx, ptr.ry); @@ -84,6 +85,10 @@ static void set_move(drag_t drag, win_t *win, ptr_t ptr) if (drag == move || drag == resize) { move_win = win; move_prev = ptr; + int my = win->y + (win->h/2); + int mx = win->x + (win->w/2); + move_dir.v = ptr.ry < my ? -1 : +1; + move_dir.h = ptr.rx < mx ? -1 : +1; } } @@ -190,28 +195,26 @@ static void shift_window(win_t *win, int col, int row) print_txt(wm_cols); } +static list_t *get_next(list_t *list, int forward) +{ + list_t *next = forward ? list->next : list->prev; + if (next == NULL) + while ((list = forward ? list->prev : list->next)) + next = list; + return next; +} static void shift_focus(win_t *win, int col, int row) { printf("shift_focus: %p - %+d,%+d\n", win, col, row); - list_t *node = NULL; - int update = 0; if (row != 0) { - if (row < 0) node = win->wm->row->prev; - if (row > 0) node = win->wm->row->next; + set_focus(get_next(win->wm->row, row > 0)->data); if (((col_t*)win->wm->col->data)->mode != split) - update = 1; - } else { - if (col < 0) node = win->wm->col->prev; - if (col > 0) node = win->wm->col->next; - if (node) { - col_t *col = node->data; - node = col->focus->wm->row; - } + wm_update(); + } + if (col != 0) { + col_t *next = get_next(win->wm->col, col > 0)->data; + set_focus(next->focus->wm->row->data); } - if (node) - set_focus(node->data); - if (update) - wm_update(); } /* Window management functions */ @@ -270,17 +273,32 @@ void wm_update(void) int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) { if (!win || win == wm_root) return 0; - //printf("wm_handle_key: %p - %x %x\n", win, key, mod); + //printf("wm_handle_key: %p - %x %c%c%c%c%c\n", win, key, + // mod.up ? '^' : 'v', + // mod.alt ? 'a' : '-', + // mod.ctrl ? 'c' : '-', + // mod.shift ? 's' : '-', + // mod.win ? 'w' : '-'); - /* Raise */ - if (key == key_f2) - return set_focus(win), 1; - if (key == key_f4) - return sys_raise(win), 1; - if (key == key_f1 && mod.MODKEY) - sys_raise(win); - if (key == key_f12 && mod.MODKEY) - print_txt(wm_cols); + /* Mouse movement */ + if (key_mouse0 <= key && key <= key_mouse7 && mod.up) + return set_move(win,ptr,none), 1; + else if (key == key_mouse1 && mod.MODKEY) + return set_move(win,ptr,move), 1; + else if (key == key_mouse3 && mod.MODKEY) + return set_move(win,ptr,resize), 1; + + /* Only handle key-down */ + if (mod.up) + return 0; + + /* Misc */ + if (mod.MODKEY) { + if (key == key_f1) return sys_raise(win), 1; + if (key == key_f2) return set_focus(win), 1; + if (key == key_f5) return wm_update(), 1; + if (key == key_f6) return print_txt(wm_cols), 1; + } if (key_mouse0 <= key && key <= key_mouse7) sys_raise(win); @@ -315,14 +333,6 @@ 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(none,win,ptr), 1; - else if (key == key_mouse1 && mod.MODKEY) - return set_move(move,win,ptr), 1; - else if (key == key_mouse3 && mod.MODKEY) - return set_move(resize,win,ptr), 1; - /* Focus change */ if (key == key_enter) return set_focus(win), 1; @@ -352,17 +362,17 @@ int wm_handle_ptr(win_t *cwin, ptr_t ptr) int dy = ptr.ry - move_prev.ry; move_prev = ptr; if (move_mode == resize) { - list_t *row = move_win->wm->row; - list_t *col = move_win->wm->col; - list_t *lower = row->next; - list_t *right = col->next; - if (lower) { - ((win_t*)row->data)->h += dy; - ((win_t*)lower->data)->h -= dy; + list_t *row = move_win->wm->row; + list_t *col = move_win->wm->col; + list_t *vert = move_dir.v < 0 ? row->prev : row->next; + list_t *horz = move_dir.h < 0 ? col->prev : col->next; + if (vert) { + ((win_t*)row->data)->h += move_dir.v * dy; + ((win_t*)vert->data)->h -= move_dir.v * dy; } - if (right) { - ((col_t*)col->data)->width += dx; - ((col_t*)right->data)->width -= dx; + if (horz) { + ((col_t*)col->data)->width += move_dir.h * dx; + ((col_t*)horz->data)->width -= move_dir.h * dx; } wm_update(); } @@ -419,14 +429,12 @@ void wm_init(win_t *root) { printf("wm_init: %p\n", root); wm_root = root; - sys_watch(root, key_f1, MOD(.MODKEY=1)); - sys_watch(root, key_f12, MOD(.MODKEY=1)); - sys_watch(root, key_mouse1, MOD(.MODKEY=1)); - sys_watch(root, key_mouse3, MOD(.MODKEY=1)); - sys_watch(root, key_enter, MOD()); - sys_watch(root, key_focus, MOD()); - Key_t keys_m[] = {'h', 'j', 'k', 'l', 'd', 's', 'm', 't'}; + Key_t keys_e[] = {key_enter, key_focus}; Key_t keys_s[] = {'h', 'j', 'k', 'l'}; + Key_t keys_m[] = {'h', 'j', 'k', 'l', 'd', 's', 'm', 't', + key_f1, key_f2, key_f5, key_f6, key_mouse1, key_mouse3}; + for (int i = 0; i < countof(keys_e); i++) + sys_watch(root, keys_e[i], MOD()); for (int i = 0; i < countof(keys_m); i++) sys_watch(root, keys_m[i], MOD(.MODKEY=1)); for (int i = 0; i < countof(keys_s); i++)