+ if (key_mouse0 <= key && key <= key_mouse7)
+ sys_raise(win);
+
+ /* Key commands */
+ if (mod.MODKEY && mod.shift) {
+ switch (key) {
+ case 'h': return shift_window(win,-1, 0), 1;
+ case 'j': return shift_window(win, 0,+1), 1;
+ case 'k': return shift_window(win, 0,-1), 1;
+ case 'l': return shift_window(win,+1, 0), 1;
+ default: break;
+ }
+ }
+ else if (mod.MODKEY) {
+ switch (key) {
+ case 'h': return shift_focus(win,-1, 0), 1;
+ case 'j': return shift_focus(win, 0,+1), 1;
+ case 'k': return shift_focus(win, 0,-1), 1;
+ case 'l': return shift_focus(win,+1, 0), 1;
+ default: break;
+ }
+ }
+
+ /* Mouse movement */
+ if (key_mouse0 <= key && key <= key_mouse7 && mod.up)
+ return set_mode(none,win,ptr), 1;
+ else if (key == key_mouse1 && mod.MODKEY)
+ return set_mode(move,win,ptr), 1;
+ else if (key == key_mouse3 && mod.MODKEY)
+ return set_mode(resize,win,ptr), 1;
+
+ /* Focus change */
+ if (key == key_enter)
+ sys_focus(win);
+
+ return 0;
+}
+
+int wm_handle_ptr(win_t *cwin, ptr_t ptr)
+{
+ //printf("wm_handle_ptr: %p - %d,%d %d,%d (%d) -- \n",
+ // cwin, ptr.x, ptr.y, ptr.rx, ptr.ry, move_mode);
+
+ if (move_mode == none)
+ return 0;
+
+ /* Tiling */
+ int dx = ptr.rx - move_prev.rx;
+ 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;
+ }
+ if (right) {
+ ((col_t*)col->data)->width += dx;
+ ((col_t*)right->data)->width -= dx;
+ }
+ arrange(wm_cols);
+ }
+
+ /* Floating */
+ //win_t *mwin = move_win;
+ //int dx = ptr.rx - move_prev.rx;
+ //int dy = ptr.ry - move_prev.ry;
+ //move_prev = ptr;
+ //if (move_mode == move)
+ // sys_move(mwin, mwin->x+dx, mwin->y+dy, mwin->w, mwin->h);
+ //else if (move_mode == resize)
+ // sys_move(mwin, mwin->x, mwin->y, mwin->w+dx, mwin->h+dy);
+
+ return 0;
+}
+
+void wm_insert(win_t *win)
+{
+ printf("wm_insert: %p\n", win);
+ print_txt(wm_cols);
+
+ /* Watch enter/leave */
+ sys_watch(win, key_enter, MOD());
+
+ /* Add to screen */
+ col_t *col = wm_cols->data;
+ int nrows = list_length(col->rows);
+ col->rows = list_insert(col->rows, win);
+
+ /* Setup window */
+ win->wm = new0(win_wm_t);
+ win->wm->col = wm_cols;
+ win->wm->row = col->rows;
+ if (nrows) win->h = wm_root->h / nrows;
+
+ /* Arrange */
+ arrange(wm_cols);
+ print_txt(wm_cols);