#include #include #include enum { move, snap, select }; struct foo { int width; int height; int x; int y; }; int main() { int c; int mode; struct termios tbuf, obuf; if (tcgetattr(STDIN_FILENO, &obuf) < 0 || tcgetattr(STDIN_FILENO, &tbuf) < 0) perror("tcgetattr()"); tbuf.c_lflag &= ~ICANON; tbuf.c_cc[VMIN] = 1; tbuf.c_cc[VTIME] = 0; tcsetattr(STDIN_FILENO, TCSANOW, &tbuf); int table[10][10]; int colspan[10]; int rowspan[10]; int current_row = 0; int current_col = 0; int current = -1; int created_terms = 0; for (c = 0; c < 10; c++) { int i; for (i = 0; i < 10; i++) table[c][i] = -1; colspan[c] = 1; rowspan[c] = 1; } mode = select; while (printf("%s> ", (mode == move ? "move" : (mode == select ? "select" : "snap"))), c = getchar()) { printf("char %c, %d\n", c, c); if (c == 'm') mode = move; else if (c == 's') mode = snap; else if (c == 'u') { /* insert new 'terminal' below current one */ int i; printf("current row = %d\n", current_row); printf("current col = %d\n", current_col); for (i = current_row; i < 10; i++) { if (table[current_col][i] == -1) { printf("found empty entry at %d\n", i); created_terms++; table[current_col][i] = created_terms; current_row = i; printf("created terminal %d\n", created_terms); printf("current_row = %d\n", current_row); break; } } } else if (c == 'n') { if (mode == move) { printf("move window left\n"); table[current_col-1][current_row] = table[current_col][current_row]; table[current_col][current_row] = -1; } else if (mode == snap) { printf("snap window left\n"); } else if (mode == select) { printf("go to left window\n"); if (current_col > 0) current_col--; printf("col now: %d\n", current_col); } mode = select; } else if (c == 'r') { if (mode == move) { printf("move window down\n"); table[current_col][current_row+1] = table[current_col][current_row]; table[current_col][current_row] = -1; } else if (mode == snap) { printf("snap window down\n"); } else if (mode == select) { printf("go to window below\n"); if (current_row < 9) current_row++; printf("row now: %d\n", current_row); } mode = select; } else if (c == 't') { if (mode == move) { printf("move window up\n"); table[current_col][current_row-1] = table[current_col][current_row]; table[current_col][current_row] = -1; } else if (mode == snap) { printf("snap window up\n"); } else if (mode == select) { printf("go to upper window\n"); if (current_row > 0) current_row--; printf("row now: %d\n", current_row); } mode = select; } else if (c == 'd') { if (mode == move) { printf("move window right\n"); table[current_col+1][current_row] = table[current_col][current_row]; table[current_col][current_row] = -1; current_col++; } else if (mode == snap) { printf("snap window right\n"); colspan[table[current_col][current_row]]++; printf("colspan now is: %d\n", colspan[table[current_col][current_row]]++); } else if (mode == select) { printf("go to right window\n"); if (current_col < 9) current_col++; printf("col now: %d\n", current_col); } mode = select; } int rows, cols; printf("your windows are as following:\n"); system("/tmp/killgeom.sh"); for (rows = 0; rows < 10; rows++) for (cols = 0; cols < 10; cols++) { if (table[cols][rows] != -1) { printf("client %d, x = %d, y = %d, width = %d, height = %d", table[cols][rows], cols * 60, rows * 60, 15 * 1, 15 * 1); if (cols == current_col && rows == current_row) printf(" < ===== YOU ARE HERE\n"); else printf("\n"); char *buffer; asprintf(&buffer, "/bin/sh -c \"urxvt -geometry %dx%d+%d+%d %s&\"", 15 * colspan[table[cols][rows]], 15, cols * 200, rows * 200, (cols == current_col && rows == current_row ? "-bg white" : "-bg gray")); printf("executing %s\n", buffer); system(buffer); free(buffer); } } printf("that's all\n"); } }