termo/demo.c

135 lines
3.1 KiB
C

// We want optarg
#define _XOPEN_SOURCE 600
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <locale.h>
#include <strings.h>
#include "termo.h"
int
main(int argc, char *argv[])
{
TERMO_CHECK_VERSION;
setlocale (LC_CTYPE, "");
termo_mouse_tracking_t mouse = TERMO_MOUSE_TRACKING_OFF;
termo_format_t format = TERMO_FORMAT_VIM;
char buffer[50];
termo_t *tk;
int opt;
while ((opt = getopt (argc, argv, "m::")) != -1)
{
switch (opt)
{
case 'm':
if (!optarg)
mouse = TERMO_MOUSE_TRACKING_DRAG;
else if (!strcasecmp (optarg, "off"))
mouse = TERMO_MOUSE_TRACKING_OFF;
else if (!strcasecmp (optarg, "click"))
mouse = TERMO_MOUSE_TRACKING_CLICK;
else if (!strcasecmp (optarg, "drag"))
mouse = TERMO_MOUSE_TRACKING_DRAG;
else if (!strcasecmp (optarg, "move"))
mouse = TERMO_MOUSE_TRACKING_MOVE;
break;
default:
fprintf (stderr,
"Usage: %s [ -m [ off | click | drag | move ]]\n", argv[0]);
return 1;
}
}
tk = termo_new (STDIN_FILENO, NULL,
TERMO_FLAG_SPACESYMBOL | TERMO_FLAG_CTRLC);
if (!tk)
{
fprintf (stderr, "Cannot allocate termo instance\n");
exit (1);
}
if (termo_get_flags (tk) & TERMO_FLAG_RAW)
printf ("Termkey in RAW mode\n");
else
printf ("Termkey in multibyte mode\n");
termo_result_t ret;
termo_key_t key;
termo_set_mouse_tracking_mode (tk, mouse);
if (mouse != TERMO_MOUSE_TRACKING_OFF)
printf ("Mouse mode active\n");
while ((ret = termo_waitkey (tk, &key)) != TERMO_RES_EOF)
{
if (ret == TERMO_RES_KEY)
{
termo_strfkey (tk, buffer, sizeof buffer, &key, format);
if (key.type == TERMO_TYPE_MOUSE)
{
int line, col;
termo_interpret_mouse (tk, &key, NULL, NULL, &line, &col);
printf ("%s at line=%d, col=%d\n", buffer, line, col);
}
else if (key.type == TERMO_TYPE_POSITION)
{
int line, col;
termo_interpret_position (tk, &key, &line, &col);
printf ("Cursor position report at line=%d, col=%d\n",
line, col);
}
else if (key.type == TERMO_TYPE_MODEREPORT)
{
int initial, mode, value;
termo_interpret_modereport
(tk, &key, &initial, &mode, &value);
printf ("Mode report %s mode %d = %d\n",
initial ? "DEC" : "ANSI", mode, value);
}
else if (key.type == TERMO_TYPE_UNKNOWN_CSI)
{
long args[16];
size_t nargs = 16;
unsigned long command;
termo_interpret_csi (tk, &key, args, &nargs, &command);
printf ("Unrecognised CSI %c %ld;%ld %c%c\n",
(char) (command >> 8), args[0], args[1],
(char) (command >> 16), (char) command);
}
else
printf ("Key %s\n", buffer);
if (key.type == TERMO_TYPE_KEY
&& key.modifiers & TERMO_KEYMOD_CTRL
&& (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
break;
if (key.type == TERMO_TYPE_KEY
&& key.modifiers == 0
&& key.code.codepoint == '?')
{
// printf("\033[?6n"); // DECDSR 6 == request cursor position
printf ("\033[?1$p"); // DECRQM == request mode, DEC origin mode
fflush (stdout);
}
}
else if (ret == TERMO_RES_ERROR)
{
if (errno != EINTR)
{
perror ("termo_waitkey");
break;
}
printf ("Interrupted by signal\n");
}
}
termo_destroy (tk);
}