From 853b20d942c746cc8ebb5e6fe33386e1ed9f3525 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Sat, 11 Aug 2012 07:16:58 +0000 Subject: [PATCH] Add TYPE_TOOLBAR instead of hiding them in sys This hopefully makes things a little cleaner because it avoids having a global wm_update function and gives the wm a little more control. However, it now needs some special code to handle toolbars. --- sys-x11.c | 19 +++++++++---------- sys.h | 1 + wm-wmii.c | 16 +++++++++++++--- wm.h | 3 --- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/sys-x11.c b/sys-x11.c index 68baaee..1a7c7e0 100644 --- a/sys-x11.c +++ b/sys-x11.c @@ -404,10 +404,8 @@ static void process_event(int type, XEvent *xe, win_t *root) else if (type == UnmapNotify) { if ((win = win_find(dpy,xe->xunmap.window,0)) && win->state != ST_HIDE) { - if (!strut_del(root, win)) - wm_remove(win); - else - wm_update(); + strut_del(root, win); + wm_remove(win); win->state = ST_HIDE; } } @@ -444,10 +442,9 @@ static void process_event(int type, XEvent *xe, win_t *root) if (win_prop(win, NET_STATE) == atoms[NET_FULL]) win->state = ST_FULL; XSelectInput(win->sys->dpy, win->sys->xid, PropertyChangeMask); - if (!strut_add(root, win)) - wm_insert(win); - else - wm_update(); + if (strut_add(root, win)) + win->type = TYPE_TOOLBAR; + wm_insert(win); } sys_show(win, win->state); } @@ -712,12 +709,14 @@ void sys_run(win_t *root) &par, &xid, &kids, &nkids)) { for(int i = 0; i < nkids; i++) { win_t *win = win_find(root->sys->dpy, kids[i], 1); - if (win && win_viewable(win) && !strut_add(root,win)) + if (win && win_viewable(win)) { + if (strut_add(root,win)) + win->type = TYPE_TOOLBAR; wm_insert(win); + } } XFree(kids); } - wm_update(); // For struts } /* Main loop */ diff --git a/sys.h b/sys.h index 3599c3d..adc0247 100644 --- a/sys.h +++ b/sys.h @@ -39,6 +39,7 @@ typedef enum { typedef enum { TYPE_NORMAL, TYPE_DIALOG, + TYPE_TOOLBAR, } type_t; /* Basic window type */ diff --git a/wm-wmii.c b/wm-wmii.c index 1cc43af..ef54d6b 100644 --- a/wm-wmii.c +++ b/wm-wmii.c @@ -124,6 +124,9 @@ static ptr_t move_prev; static layer_t move_layer; static struct { int v, h; } move_dir; +/* Prototypes */ +void wm_update(void); + /******************** * Helper functions * ********************/ @@ -679,9 +682,7 @@ static void wm_update_cols(dpy_t *dpy) } } -/******************************* - * Window management functions * - *******************************/ +/* Refresh the window layout */ void wm_update(void) { /* Updates window sizes */ @@ -708,6 +709,9 @@ void wm_update(void) set_focus(wm_focus); } +/******************************* + * Window management functions * + *******************************/ int wm_handle_event(win_t *win, event_t ev, mod_t mod, ptr_t ptr) { if (!win || win == wm_dpy->geom) return 0; @@ -885,6 +889,10 @@ void wm_insert(win_t *win) printf("wm_insert: %p\n", win); print_txt(); + /* Check for toolbars */ + if (win->type == TYPE_TOOLBAR) + return wm_update(); + /* Initialize window */ win->wm = new0(win_wm_t); sys_watch(win, EV_ENTER, MOD()); @@ -905,6 +913,8 @@ void wm_remove(win_t *win) { printf("wm_remove: %p\n", win); print_txt(); + if (win->type == TYPE_TOOLBAR) + return wm_update(); for (list_t *tag = wm->tags; tag; tag = tag->next) cut_win(win, tag->data); free(win->wm); diff --git a/wm.h b/wm.h index 57d79a3..0f776f9 100644 --- a/wm.h +++ b/wm.h @@ -22,9 +22,6 @@ * The window provided to these function is generally the * window with the keyboard or mouse focus. */ -/* Refresh the window layout */ -void wm_update(void); - /* Called for each watched event */ int wm_handle_event(win_t *win, event_t ev, mod_t mod, ptr_t ptr); -- 2.43.2