gri3-wm/main.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");
}
}