X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=wm-wmii.c;h=df88527fccb137dc057f4a4b991d3078f445088e;hb=d447b5fbe067f469132cc8e02b583a55789ccb16;hp=06b71f67694830210204c2a374b23dd23c8d6f03;hpb=776ac6910ee9db701c1cfe2ab234ae5fb96ce9db;p=wmpus diff --git a/wm-wmii.c b/wm-wmii.c index 06b71f6..df88527 100644 --- a/wm-wmii.c +++ b/wm-wmii.c @@ -17,18 +17,16 @@ #include #include "util.h" +#include "conf.h" #include "sys.h" #include "wm.h" +/* Configuration */ #ifndef MODKEY #define MODKEY alt #endif -#ifndef MARGIN -#define MARGIN 0 -#endif -#ifndef STACK -#define STACK 25 -#endif +static int MARGIN = 0; +static int STACK = 25; /* Enums */ typedef enum { @@ -590,15 +588,14 @@ static void tag_switch(int name) printf("tag_switch: %d\n", name); tag_t *old = wm_tag; if ((wm_col == NULL || wm_row == NULL) && wm_flt == NULL) { - list_t *ltag = list_find(wm->tags, old); - wm->tags = list_remove(wm->tags, ltag, 1); while (old->dpys) { dpy_t *dpy = old->dpys->data; while (dpy->cols) dpy->cols = list_remove(dpy->cols, dpy->cols, 1); old->dpys = list_remove(old->dpys, old->dpys, 1); } - free(old); + list_t *ltag = list_find(wm->tags, old); + wm->tags = list_remove(wm->tags, ltag, 1); } wm_tag = tag_find(name); } @@ -660,10 +657,10 @@ static void wm_update_cols(dpy_t *dpy) case tab: sys_move(win, x+MARGIN, 0+MARGIN, col->width, dpy->geom->h-2*MARGIN); - if (focus == win) - sys_raise(win); break; } + if (focus == win) + sys_raise(win); ROW(lrow)->height = win->h; } x += col->width + MARGIN; @@ -721,7 +718,7 @@ int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) if (move_mode != none && mod.up) return set_move(win,ptr,none), 1; if (key == key_mouse1 && !mod.up && win->h == STACK) - return wm_update(), 0; + return set_focus(win), wm_update(), 0; return 0; } @@ -739,6 +736,7 @@ int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) #endif if (key == key_f5) return wm_update(), 1; if (key == key_f6) return print_txt(), 1; + if (key == 'q') return sys_exit(), 1; } /* Floating layer */ @@ -791,7 +789,7 @@ int wm_handle_key(win_t *win, Key_t key, mod_t mod, ptr_t ptr) } /* Focus change */ - if (key == key_enter) + if (key == key_enter && win->h != STACK) return set_focus(win), 1; if (key_mouse0 <= key && key <= key_mouse7) @@ -885,6 +883,10 @@ void wm_init(win_t *root) { printf("wm_init: %p\n", root); + /* Load configuration */ + MARGIN = conf_get_int("main.margin", MARGIN); + STACK = conf_get_int("main.stack", STACK); + /* Hack, fix screen order */ list_t *screens = sys_info(root); list_t *left = screens; @@ -902,7 +904,7 @@ void wm_init(win_t *root) wm->tags = list_insert(NULL, wm->tag); Key_t keys_e[] = {key_enter, key_focus}; - Key_t keys_s[] = {'h', 'j', 'k', 'l', ' ', + Key_t keys_s[] = {'h', 'j', 'k', 'l', 'q', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; Key_t keys_m[] = {'h', 'j', 'k', 'l', 'd', 's', 'm', 't', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', @@ -915,3 +917,25 @@ void wm_init(win_t *root) for (int i = 0; i < countof(keys_s); i++) sys_watch(root, keys_s[i], MOD(.MODKEY=1,.shift=1)); } + +void wm_free(win_t *root) +{ + /* Re-show and free all windows */ + while ( wm->tags) { tag_t *tag = wm->tags->data; + while (tag->dpys) { dpy_t *dpy = tag->dpys->data; + while (dpy->cols) { col_t *col = dpy->cols->data; + while (col->rows) { row_t *row = col->rows->data; + sys_show(row->win, st_show); + free(row->win->wm); + col->rows = list_remove(col->rows, col->rows, 1); } + dpy->cols = list_remove(dpy->cols, dpy->cols, 1); } + while (dpy->flts) { flt_t *flt = dpy->flts->data; + sys_show(flt->win, st_show); + free(flt->win->wm); + dpy->flts = list_remove(dpy->flts, dpy->flts, 1); } + tag->dpys = list_remove(tag->dpys, tag->dpys, 1); } + wm->tags = list_remove( wm->tags, wm->tags, 1); } + + /* Free remaining data */ + free(wm); +}