+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;
+ if (win == target) {
+ if (_dpy) *_dpy = dpy;
+ if (_col) *_col = col;
+ if (_row) *_row = row;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static int search(tag_t *tag, win_t *target,
+ dpy_t **_dpy, col_t **_col, row_t **_row)
+{
+ list_t *dpy, *col, *row;
+ if (searchl(tag, target, &dpy, &col, &row)) {
+ if (_dpy) *_dpy = DPY(dpy);
+ if (_col) *_col = COL(col);
+ if (_row) *_row = ROW(row);
+ return 1;
+ }
+ return 0;
+}
+
+static void set_mode(win_t *win, mode_t mode)
+{
+ col_t *col;
+ if (!search(wm_tag, win, NULL, &col, NULL))
+ return;
+ printf("set_mode: %p, %d -> %d\n",
+ col, col->mode, mode);
+ col->mode = mode;
+ if (col->mode == split)
+ for (list_t *cur = col->rows; cur; cur = cur->next) {
+ row_t *row = cur->data;
+ row->height = wm_dpy->geom->h;
+ }
+ wm_update();
+}
+
+static void set_focus(win_t *win)
+{
+ /* - 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
+ * using the return value from wm_handle_key */
+ for (int i = key_mouse1; i < key_mouse7; i++) {
+ if (wm_focus)
+ sys_watch(wm_focus, i, MOD());
+ sys_unwatch(win, i, MOD());
+ }
+
+ dpy_t *dpy; col_t *col; row_t *row;
+ if (search(wm_tag, win, &dpy, &col, &row)) {
+ wm_dpy = dpy;
+ wm_col = col;
+ wm_row = row;
+ }
+ sys_focus(win);
+}
+
+static void set_move(win_t *win, ptr_t ptr, drag_t drag)