+/* Refresh the window layout */
+void wm_update(void)
+{
+ /* Updates window sizes */
+ for (list_t *ldpy = wm_tag->dpys; ldpy; ldpy = ldpy->next)
+ wm_update_cols(ldpy->data);
+ tag_foreach_flt(wm_tag, ldpy, lflt, win) {
+ flt_t *flt = lflt->data;
+ sys_move(win, flt->x, flt->y, flt->w, flt->h);
+ sys_raise(flt->win);
+ sys_show(flt->win, flt->state);
+ }
+
+ /* Hide other tags */
+ for (list_t *tag = wm ->tags; tag; tag = tag->next)
+ if (tag->data != wm_tag) {
+ tag_foreach_col(TAG(tag), dpy, col, row, win)
+ sys_show(win, ST_HIDE);
+ tag_foreach_flt(TAG(tag), dpy, flt, win)
+ sys_show(win, ST_HIDE);
+ }
+
+ /* Set focused window */
+ if (wm_focus)
+ 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;
+ //printf("wm_handle_event: %p - %x %c%c%c%c%c\n", win, ev,
+ // mod.up ? '^' : 'v',
+ // mod.alt ? 'a' : '-',
+ // mod.ctrl ? 'c' : '-',
+ // mod.shift ? 's' : '-',
+ // mod.win ? 'w' : '-');
+
+ /* Mouse events */
+ if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7) {
+ if (ev == EV_MOUSE1 && !mod.MODKEY && !mod.up)
+ return raise_float(win), 0;
+ if ((ev == EV_MOUSE3 && mod.MODKEY && !mod.up) ||
+ (ev == EV_MOUSE1 && mod.MODKEY && !mod.up && mod.shift))
+ return set_move(win,ptr,RESIZE), 1;
+ if (ev == EV_MOUSE1 && mod.MODKEY && !mod.up)
+ return set_move(win,ptr,MOVE), 1;
+ if (move_mode != NONE && mod.up)
+ return set_move(win,ptr,NONE), 1;
+ if (ev == EV_MOUSE1 && !mod.up && win->state == ST_SHADE)
+ return set_focus(win), wm_update(), 0;
+ return 0;
+ }
+
+ /* Only handle key-down */
+ if (mod.up)
+ return 0;
+
+ /* Misc */
+ if (mod.MODKEY) {
+#ifdef DEBUG
+ if (ev == EV_F1) return raise_float(win), 1;
+ if (ev == EV_F2) return set_focus(win), 1;
+ if (ev == EV_F3) return sys_show(win, ST_SHOW), 1;
+ if (ev == EV_F4) return sys_show(win, ST_HIDE), 1;
+ if (ev == EV_F7) return sys_show(win, ST_SHADE), 1;
+#endif
+ if (ev == EV_F5) return wm_update(), 1;
+ if (ev == EV_F6) return print_txt(), 1;
+ if (ev == 'q') return sys_exit(), 1;
+ if (ev == 'f') return wm_handle_state(win, win->state,
+ win->state == ST_FULL ? ST_SHOW : ST_FULL);
+ }