137 lines
4.2 KiB
C
137 lines
4.2 KiB
C
#if 0
|
||
/*─────────────────────────────────────────────────────────────────╗
|
||
│ To the extent possible under law, Justine Tunney has waived │
|
||
│ all copyright and related or neighboring rights to this file, │
|
||
│ as it is written in the following disclaimers: │
|
||
│ • http://unlicense.org/ │
|
||
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
||
╚─────────────────────────────────────────────────────────────────*/
|
||
#endif
|
||
#include "libc/calls/calls.h"
|
||
#include "libc/calls/ioctl.h"
|
||
#include "libc/calls/struct/termios.h"
|
||
#include "libc/fmt/fmt.h"
|
||
#include "libc/stdio/stdio.h"
|
||
#include "libc/str/str.h"
|
||
#include "libc/sysv/consts/termios.h"
|
||
|
||
int yn2, xn2;
|
||
int yn3, xn3;
|
||
char b[128], inbuf[128];
|
||
int y, x, yn, xn, my, mx;
|
||
struct termios term, oldterm;
|
||
|
||
int main(int argc, char *argv[]) {
|
||
int i;
|
||
setvbuf(stdout, inbuf, _IONBF, 128); /* make things slower */
|
||
|
||
/* raw mode */
|
||
ioctl(1, TCGETS, &oldterm);
|
||
memcpy(&term, &oldterm, sizeof(term));
|
||
term.c_cc[VMIN] = 1;
|
||
term.c_cc[VTIME] = 1;
|
||
term.c_iflag &= ~(INPCK | ISTRIP | PARMRK | INLCR | IGNCR | ICRNL | IXON);
|
||
term.c_lflag &= ~(IEXTEN | ICANON | ECHO | ECHONL);
|
||
term.c_cflag &= ~(CSIZE | PARENB);
|
||
term.c_oflag &= ~OPOST;
|
||
term.c_cflag |= CS8;
|
||
term.c_iflag |= IUTF8;
|
||
ioctl(1, TCSETSF, &term);
|
||
|
||
/* get cursor position and display dimensions */
|
||
printf("\e7\e[6n\e[9979;9979H\e[6n\e8");
|
||
read(0, b, sizeof(b));
|
||
sscanf(b, "\e[%d;%dR\e[%d;%dR", &y, &x, &yn, &xn);
|
||
|
||
printf("\e[1q"); /* turn on led one */
|
||
printf("\e[2J"); /* clear display */
|
||
printf("\e#8"); /* fill display with E's */
|
||
printf("\e[H");
|
||
|
||
/* clear display again */
|
||
printf("\e[2q"); /* turn on led two */
|
||
for (i = 0; i < yn; ++i) {
|
||
if (i) printf("\n");
|
||
printf(" ");
|
||
printf("\e[0K");
|
||
}
|
||
for (i = 0; i < yn - 1; ++i) {
|
||
if (i) printf("\eM");
|
||
printf("\e[1K");
|
||
}
|
||
|
||
printf("\e(0"); /* line drawing mode */
|
||
printf("\e[3q"); /* turn on led three */
|
||
printf("\e[H");
|
||
|
||
/* move to center */
|
||
my = yn / 2;
|
||
mx = xn / 2 - 7;
|
||
if (y > my) {
|
||
printf("\e[%dA", y - my);
|
||
} else if (y < my) {
|
||
printf("\e[%dB", my - y);
|
||
}
|
||
if (x > mx) {
|
||
printf("\e[%dD", x - mx);
|
||
} else if (x < mx) {
|
||
printf("\e[%dC", mx - x);
|
||
}
|
||
|
||
printf("\e[90;103m"); /* black on yellow */
|
||
printf("\e[90;103ma ` a"); /* draw nose */
|
||
|
||
printf("\e[0m"); /* reset style */
|
||
printf("\e(B"); /* ascii mode */
|
||
|
||
/* draw corners */
|
||
printf("\e[H"); /* top left */
|
||
printf("A");
|
||
printf("\e[9979C"); /* rightmost */
|
||
printf("B");
|
||
printf("\e[9979;9979H"); /* bottom right corner */
|
||
printf("\e[C"); /* move right gets clamped */
|
||
printf("D"); /* write, set redzone flag */
|
||
printf("\e[2A"); /* move up, unsets redzone */
|
||
|
||
/* gnu screen now reports out of bounds position */
|
||
/* kitty hasnt got a redzone reporting next line */
|
||
printf("\e[6n");
|
||
read(0, b, sizeof(b));
|
||
sscanf(b, "\e[%d;%dR", &yn2, &xn2);
|
||
|
||
/* writes to (yn-3,xn-1) normally and (yn-2,0) in gnu screen */
|
||
printf("!");
|
||
|
||
/* draw ruler on top */
|
||
printf("\e[H");
|
||
for (i = 8; i + 1 < xn; i += 8) {
|
||
printf("\e[%dG%d", i + 1, i); /* set column */
|
||
}
|
||
|
||
printf("\e[9979;9979H"); /* bottom right */
|
||
printf("\e[9979D"); /* leftmost */
|
||
printf("C");
|
||
|
||
/* let's break gnu screen again with multimonospace redzone */
|
||
printf("\e[%d;9979H", yn / 2); /* right middle */
|
||
printf("\e[D"); /* left */
|
||
printf("A");
|
||
printf("\e[6n");
|
||
read(0, b, sizeof(b));
|
||
sscanf(b, "\e[%d;%dR", &yn2, &xn2);
|
||
|
||
printf("\e[%dH", yn / 2);
|
||
printf("%d %d vs. %d %d\r\n", yn, xn, yn2, xn2);
|
||
printf("%d %d vs. %d %d\r\n", yn / 2, xn, yn2, xn2);
|
||
printf("\e#6double width\e#5\r\n");
|
||
printf("\e[3mthis text is so \e[1mitalic\e[0m\r\n");
|
||
printf("\e[1;20mpress any fraktur exit\e[0m");
|
||
printf("\a");
|
||
|
||
read(0, b, sizeof(b));
|
||
printf("\r\n");
|
||
ioctl(1, TCSETS, &oldterm);
|
||
return 0;
|
||
}
|