+ print_txt(wm_cols);
+ printf("shift_window: >>>\n");
+ if (row != 0) {
+ list_t *src = win->wm->row, *dst = NULL;
+ if (row < 0) dst = src->prev;
+ if (row > 0) dst = src->next;
+ if (src && dst) {
+ printf("swap: %p <-> %p\n", src->data, dst->data);
+ src->data = dst->data;
+ dst->data = win;
+ ((win_t*)src->data)->wm->row = src;
+ ((win_t*)dst->data)->wm->row = dst;
+ arrange(wm_cols);
+ }
+ } else {
+ int onlyrow = !win->wm->row->prev && !win->wm->row->next;
+ list_t *src = win->wm->col, *dst = NULL;
+ if (col < 0) {
+ if (!src->prev && !onlyrow)
+ wm_cols = list_insert(wm_cols, new0(col_t));
+ dst = src->prev;
+ }
+ if (col > 0) {
+ if (!src->next && !onlyrow)
+ wm_cols = list_append(wm_cols, new0(col_t));
+ dst = src->next;
+ }
+ if (src && dst) {
+ col_t *scol = src->data;
+ col_t *dcol = dst->data;
+ scol->rows = list_remove(scol->rows, win->wm->row);
+ dcol->rows = list_insert(dcol->rows, win);
+ win->wm->row = dcol->rows;
+ win->wm->col = dst;
+ if (onlyrow) // delete column
+ wm_cols = list_remove(wm_cols, src);
+ if (dcol->width == 0) // new column
+ dcol->width = wm_root->w / (list_length(wm_cols)-1);
+ else
+ win->h = wm_root->h / (list_length(dcol->rows)-1);
+ arrange(wm_cols);
+ }
+ }
+ print_txt(wm_cols);