Check selection get/set and tmux tinfo extensions
This commit is contained in:
parent
e4bd94f79e
commit
e43e9ebeca
52
termtest.c
52
termtest.c
|
@ -32,6 +32,9 @@
|
||||||
#include <term.h>
|
#include <term.h>
|
||||||
|
|
||||||
#define CSI "\x1b["
|
#define CSI "\x1b["
|
||||||
|
#define OSC "\x1b]"
|
||||||
|
#define BEL "\x07"
|
||||||
|
#define ST "\x9c"
|
||||||
|
|
||||||
extern char **environ;
|
extern char **environ;
|
||||||
static struct termios saved_termios;
|
static struct termios saved_termios;
|
||||||
|
@ -70,7 +73,7 @@ static char *comm(const char *req, bool wait_first) {
|
||||||
char buf[1000] = ""; size_t buf_len = 0; int n = 0;
|
char buf[1000] = ""; size_t buf_len = 0; int n = 0;
|
||||||
struct pollfd pfd = { .fd = STDIN_FILENO, .events = POLLIN };
|
struct pollfd pfd = { .fd = STDIN_FILENO, .events = POLLIN };
|
||||||
if (wait_first) poll(&pfd, 1, -1);
|
if (wait_first) poll(&pfd, 1, -1);
|
||||||
while ((n = poll(&pfd, 1, 15 /* unreliable, timing-dependent */))) {
|
while ((n = poll(&pfd, 1, 50 /* unreliable, timing-dependent */))) {
|
||||||
if (n < 0) return NULL;
|
if (n < 0) return NULL;
|
||||||
len = read(STDIN_FILENO, buf + buf_len, sizeof buf - buf_len - 1);
|
len = read(STDIN_FILENO, buf + buf_len, sizeof buf - buf_len - 1);
|
||||||
if (len <= 0) return NULL;
|
if (len <= 0) return NULL;
|
||||||
|
@ -182,6 +185,12 @@ int main(int argc, char *argv[]) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See tmux(1), TERMINFO EXTENSIONS. These are somewhat unusual,
|
||||||
|
// including them out of curiosity.
|
||||||
|
const char *Tc = tigetstr("Tc");
|
||||||
|
if (Tc && Tc != (char *)-1)
|
||||||
|
printf("Terminfo: tmux extension claims direct color.\n");
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// - terminfo
|
// - terminfo
|
||||||
// - hardcoded visual check
|
// - hardcoded visual check
|
||||||
|
@ -212,11 +221,11 @@ int main(int argc, char *argv[]) {
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\x1b[0;32;44m" "SGR" "\x1b[m ");
|
printf(CSI "0;32;44m" "SGR" CSI "m ");
|
||||||
printf("\x1b[1;32;44m" "Bold" "\x1b[m ");
|
printf(CSI "1;32;44m" "Bold" CSI "m ");
|
||||||
printf("\x1b[5;32;44m" "Blink" "\x1b[m ");
|
printf(CSI "5;32;44m" "Blink" CSI "m ");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("\x1b[0;5m" "Blink with default colours." "\x1b[m");
|
printf(CSI "0;5m" "Blink with default colours." CSI "m");
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
printf("-- Italic attribute\n");
|
printf("-- Italic attribute\n");
|
||||||
|
@ -227,6 +236,13 @@ int main(int argc, char *argv[]) {
|
||||||
printf(CSI "3m" "SGR test.\n" CSI "0m");
|
printf(CSI "3m" "SGR test.\n" CSI "0m");
|
||||||
|
|
||||||
printf("-- Bar cursor\n");
|
printf("-- Bar cursor\n");
|
||||||
|
const char *Ss = tigetstr("Ss");
|
||||||
|
const char *Se = tigetstr("Se");
|
||||||
|
if (Ss && Ss != (char*)-1)
|
||||||
|
printf("Terminfo: found tmux extension for setting.\n");
|
||||||
|
if (Se && Se != (char*)-1)
|
||||||
|
printf("Terminfo: found tmux extension for resetting.\n");
|
||||||
|
|
||||||
comm(CSI "5 q" "Blinking (press a key): ", true);
|
comm(CSI "5 q" "Blinking (press a key): ", true);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
comm(CSI "6 q" "Steady (press a key): ", true);
|
comm(CSI "6 q" "Steady (press a key): ", true);
|
||||||
|
@ -271,8 +287,24 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
comm(CSI "?1000l", false);
|
comm(CSI "?1000l", false);
|
||||||
|
|
||||||
// TODO: Should test the ability to copy arbitrary text to clipboard,
|
printf("-- Selection\n");
|
||||||
// see ctlseqs: Manipulate Selection Data
|
const char *Ms = tigetstr("Ms");
|
||||||
|
if (Ms && Ms != (char *)-1)
|
||||||
|
printf("Terminfo: found tmux extension for selections.\n");
|
||||||
|
|
||||||
|
char *selection = comm(OSC "52;pc;?" BEL, false);
|
||||||
|
if (!strncmp(selection, OSC "52;", 5)) {
|
||||||
|
printf("We have received the selection from the terminal!" CSI "1m\n");
|
||||||
|
char *semi = strrchr(selection, ';');
|
||||||
|
*strpbrk(semi, BEL ST) = 0;
|
||||||
|
FILE *fp = popen("base64 -d", "w");
|
||||||
|
fprintf(fp, "%s", semi + 1);
|
||||||
|
fclose(fp);
|
||||||
|
printf(CSI "m\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
comm(OSC "52;pc;VGVzdA==" BEL /* ST didn't work, UTF-8 issues? */, false);
|
||||||
|
comm("Check if the selection now contains 'Test' and press a key.\n", true);
|
||||||
|
|
||||||
printf("-- Bracketed paste\n");
|
printf("-- Bracketed paste\n");
|
||||||
if (decrqm_supported)
|
if (decrqm_supported)
|
||||||
|
@ -285,11 +317,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
// Let the user see the results when run outside an interactive shell.
|
// Let the user see the results when run outside an interactive shell.
|
||||||
comm("-- Finished\n", true);
|
comm("-- Finished\n", true);
|
||||||
|
// TODO: Look further than tmux(1) for unusual terminfo entries.
|
||||||
// TODO: see about unusual (new) terminfo entries.
|
|
||||||
// - see man tmux, TERMINFO EXTENSIONS
|
|
||||||
// - none of the terminfos seem to include these,
|
|
||||||
// though I can look for them
|
|
||||||
|
|
||||||
// atexit is broken in tcc -run, see https://savannah.nongnu.org/bugs/?56495
|
// atexit is broken in tcc -run, see https://savannah.nongnu.org/bugs/?56495
|
||||||
tty_atexit();
|
tty_atexit();
|
||||||
|
|
Loading…
Reference in New Issue