162 lines
4.1 KiB
C
162 lines
4.1 KiB
C
#include <termios.h>
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
|
|
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");
|
|
}
|
|
}
|