Rename to termo

This commit is contained in:
Přemysl Eric Janouch 2014-10-14 00:08:15 +02:00
parent e330d751a4
commit e98d9c0fd1
14 changed files with 1048 additions and 1048 deletions

View File

@ -1,4 +1,4 @@
project (termkey2 C) project (termo C)
cmake_minimum_required (VERSION 2.8.5) cmake_minimum_required (VERSION 2.8.5)
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUC) if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUC)
@ -18,9 +18,9 @@ set (project_VERSION ${project_VERSION}.${project_VERSION_PATCH})
set (project_API_VERSION ${project_VERSION_MAJOR}) set (project_API_VERSION ${project_VERSION_MAJOR})
# Names # Names
set (project_LIB_NAME "termkey2-${project_API_VERSION}") set (project_LIB_NAME "termo-${project_API_VERSION}")
set (project_INCLUDE_NAME "termkey2-${project_API_VERSION}") set (project_INCLUDE_NAME "termo-${project_API_VERSION}")
set (project_CMAKE_NAME "TermKey2") set (project_CMAKE_NAME "Termo")
# Dependecies # Dependecies
find_package (Curses) find_package (Curses)
@ -29,19 +29,19 @@ pkg_check_modules (glib glib-2.0 gio-2.0)
pkg_check_modules (unibilium unibilium>=0.1.0) pkg_check_modules (unibilium unibilium>=0.1.0)
# Header files with configuration # Header files with configuration
configure_file (${PROJECT_SOURCE_DIR}/termkey2-config.h.in configure_file (${PROJECT_SOURCE_DIR}/termo-config.h.in
${PROJECT_BINARY_DIR}/termkey2-config.h) ${PROJECT_BINARY_DIR}/termo-config.h)
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR}) include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
# Project source files # Project source files
set (lib_sources set (lib_sources
termkey2.c termo.c
driver-csi.c driver-csi.c
driver-ti.c) driver-ti.c)
set (lib_headers set (lib_headers
termkey2.h termo.h
termkey2-internal.h termo-internal.h
${PROJECT_BINARY_DIR}/termkey2-config.h) ${PROJECT_BINARY_DIR}/termo-config.h)
# Project libraries # Project libraries
if (unibilium_FOUND) if (unibilium_FOUND)
@ -56,33 +56,33 @@ else (CURSES_FOUND)
endif (unibilium_FOUND) endif (unibilium_FOUND)
# Create the library targets # Create the library targets
add_library (termkey2 SHARED ${lib_sources} ${lib_headers}) add_library (termo SHARED ${lib_sources} ${lib_headers})
target_link_libraries (termkey2 ${lib_libraries}) target_link_libraries (termo ${lib_libraries})
set_target_properties (termkey2 PROPERTIES set_target_properties (termo PROPERTIES
OUTPUT_NAME ${project_LIB_NAME} OUTPUT_NAME ${project_LIB_NAME}
VERSION ${project_VERSION} VERSION ${project_VERSION}
SOVERSION ${project_API_VERSION}) SOVERSION ${project_API_VERSION})
add_library (termkey2-static STATIC ${lib_sources} ${lib_headers}) add_library (termo-static STATIC ${lib_sources} ${lib_headers})
target_link_libraries (termkey2-static ${lib_libraries}) target_link_libraries (termo-static ${lib_libraries})
set_target_properties (termkey2-static PROPERTIES set_target_properties (termo-static PROPERTIES
OUTPUT_NAME ${project_LIB_NAME} OUTPUT_NAME ${project_LIB_NAME}
VERSION ${project_VERSION} VERSION ${project_VERSION}
SOVERSION ${project_API_VERSION}) SOVERSION ${project_API_VERSION})
# Demos # Demos
add_executable (demo-async EXCLUDE_FROM_ALL demo-async.c) add_executable (demo-async EXCLUDE_FROM_ALL demo-async.c)
target_link_libraries (demo-async termkey2-static ${lib_libraries}) target_link_libraries (demo-async termo-static ${lib_libraries})
add_executable (demo EXCLUDE_FROM_ALL demo.c) add_executable (demo EXCLUDE_FROM_ALL demo.c)
target_link_libraries (demo termkey2-static ${lib_libraries}) target_link_libraries (demo termo-static ${lib_libraries})
set (demos demo demo-async) set (demos demo demo-async)
if (glib_FOUND) if (glib_FOUND)
include_directories (${glib_INCLUDE_DIRS}) include_directories (${glib_INCLUDE_DIRS})
add_executable (demo-glib EXCLUDE_FROM_ALL demo-glib.c) add_executable (demo-glib EXCLUDE_FROM_ALL demo-glib.c)
target_link_libraries (demo target_link_libraries (demo
termkey2-static ${lib_libraries} ${glib_LIBRARIES}) termo-static ${lib_libraries} ${glib_LIBRARIES})
list (APPEND demos demo-glib) list (APPEND demos demo-glib)
endif (glib_FOUND) endif (glib_FOUND)
@ -90,9 +90,9 @@ add_custom_target (demos DEPENDS ${demos})
# The files to be installed # The files to be installed
include (GNUInstallDirs) include (GNUInstallDirs)
install (TARGETS termkey2 termkey2-static DESTINATION ${CMAKE_INSTALL_LIBDIR}) install (TARGETS termo termo-static DESTINATION ${CMAKE_INSTALL_LIBDIR})
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR}) install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
install (FILES termkey2.h ${PROJECT_BINARY_DIR}/termkey2-config.h install (FILES termo.h ${PROJECT_BINARY_DIR}/termo-config.h
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${project_INCLUDE_NAME}) DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${project_INCLUDE_NAME})
# Configuration for other CMake projects # Configuration for other CMake projects

18
README
View File

@ -1,9 +1,9 @@
termkey2 termo
======== =====
`termkey2' is a library providing an alternative to ncurses' handling of `termo' is a library providing an alternative to ncurses' handling of terminal
terminal input. ncurses does a really terrible job at that, mainly wrt. mouse input. ncurses does a really terrible job at that, mainly wrt. mouse support
support which seems to be utterly broken. If you can drag things in a terminal which seems to be utterly broken. If you can drag things in a terminal
application, such as in VIM, I can assure you it's not using ncurses for that. application, such as in VIM, I can assure you it's not using ncurses for that.
Since terminal I/O is really complicated and full of special cases, this project Since terminal I/O is really complicated and full of special cases, this project
@ -17,7 +17,7 @@ Building and Installing
Build dependencies: GCC/Clang, pkg-config, cmake >= 2.8.5 Build dependencies: GCC/Clang, pkg-config, cmake >= 2.8.5
Optional dependencies: Unibilium (alternative for curses), GLib (for the demos) Optional dependencies: Unibilium (alternative for curses), GLib (for the demos)
$ git clone https://github.com/pjanouch/termkey2.git $ git clone https://github.com/pjanouch/termo.git
$ mkdir build $ mkdir build
$ cd build $ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local $ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
@ -27,7 +27,7 @@ To install the library, you can do either the usual:
Or you can try telling CMake to make a package for you. For Debian it is: Or you can try telling CMake to make a package for you. For Debian it is:
$ cpack -G DEB $ cpack -G DEB
# dpkg -i termkey2-*.deb # dpkg -i termo-*.deb
To see the library in action, you can try running the demos, which are To see the library in action, you can try running the demos, which are
statically linked against the library, and hence they can be run as they are: statically linked against the library, and hence they can be run as they are:
@ -38,7 +38,7 @@ What's Different From the Original termkey?
------------------------------------------- -------------------------------------------
The main change is throwing away any UTF-8 dependent code, making the library The main change is throwing away any UTF-8 dependent code, making the library
capable of handling all unibyte and multibyte encodings supported by iconv on capable of handling all unibyte and multibyte encodings supported by iconv on
your system. The characters are still presented as Unicode at the end, however, your system. The characters are still presented as Unicode in the end, however,
as the other sensible option is wchar_t and that doesn't really work well, see as the other sensible option is wchar_t and that doesn't really work well, see
http://gnu.org/software/libunistring/manual/libunistring.html#The-wchar_005ft-mess http://gnu.org/software/libunistring/manual/libunistring.html#The-wchar_005ft-mess
@ -52,7 +52,7 @@ Oh, and I've deleted the manpages. It needs more Doxygen. :) TBD
License License
------- -------
`termkey2' is based on the `termkey' library originally written by Paul Evans `termo' is based on the `termkey' library originally written by Paul Evans
<leonerd@leonerd.org.uk>, with additional changes made by Přemysl Janouch <leonerd@leonerd.org.uk>, with additional changes made by Přemysl Janouch
<p.janouch@gmail.com>. <p.janouch@gmail.com>.

View File

@ -4,5 +4,5 @@
# @project_CMAKE_NAME@_LIBRARIES # @project_CMAKE_NAME@_LIBRARIES
set (@project_CMAKE_NAME@_INCLUDE_DIRS @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/@project_INCLUDE_NAME@) set (@project_CMAKE_NAME@_INCLUDE_DIRS @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/@project_INCLUDE_NAME@)
set (@project_CMAKE_NAME@_LIBRARIES termkey2) set (@project_CMAKE_NAME@_LIBRARIES termo)

View File

@ -6,13 +6,13 @@
#include <unistd.h> #include <unistd.h>
#include <locale.h> #include <locale.h>
#include "termkey2.h" #include "termo.h"
static void static void
on_key (termkey_t *tk, termkey_key_t *key) on_key (termo_t *tk, termo_key_t *key)
{ {
char buffer[50]; char buffer[50];
termkey_strfkey (tk, buffer, sizeof buffer, key, TERMKEY_FORMAT_VIM); termo_strfkey (tk, buffer, sizeof buffer, key, TERMO_FORMAT_VIM);
printf ("%s\n", buffer); printf ("%s\n", buffer);
} }
@ -22,23 +22,23 @@ main (int argc, char *argv[])
(void) argc; (void) argc;
(void) argv; (void) argv;
TERMKEY_CHECK_VERSION; TERMO_CHECK_VERSION;
setlocale (LC_CTYPE, ""); setlocale (LC_CTYPE, "");
termkey_t *tk = termkey_new (STDIN_FILENO, NULL, 0); termo_t *tk = termo_new (STDIN_FILENO, NULL, 0);
if (!tk) if (!tk)
{ {
fprintf (stderr, "Cannot allocate termkey instance\n"); fprintf (stderr, "Cannot allocate termo instance\n");
exit (1); exit (1);
} }
struct pollfd fd; struct pollfd fd;
fd.fd = STDIN_FILENO; /* the file descriptor we passed to termkey_new() */ fd.fd = STDIN_FILENO; /* the file descriptor we passed to termo_new() */
fd.events = POLLIN; fd.events = POLLIN;
termkey_result_t ret; termo_result_t ret;
termkey_key_t key; termo_key_t key;
int running = 1; int running = 1;
int nextwait = -1; int nextwait = -1;
@ -47,27 +47,27 @@ main (int argc, char *argv[])
{ {
if (poll (&fd, 1, nextwait) == 0) if (poll (&fd, 1, nextwait) == 0)
// Timed out // Timed out
if (termkey_getkey_force (tk, &key) == TERMKEY_RES_KEY) if (termo_getkey_force (tk, &key) == TERMO_RES_KEY)
on_key (tk, &key); on_key (tk, &key);
if (fd.revents & (POLLIN | POLLHUP | POLLERR)) if (fd.revents & (POLLIN | POLLHUP | POLLERR))
termkey_advisereadable (tk); termo_advisereadable (tk);
while ((ret = termkey_getkey (tk, &key)) == TERMKEY_RES_KEY) while ((ret = termo_getkey (tk, &key)) == TERMO_RES_KEY)
{ {
on_key (tk, &key); on_key (tk, &key);
if (key.type == TERMKEY_TYPE_KEY if (key.type == TERMO_TYPE_KEY
&& (key.modifiers & TERMKEY_KEYMOD_CTRL) && (key.modifiers & TERMO_KEYMOD_CTRL)
&& (key.code.codepoint == 'C' || key.code.codepoint == 'c')) && (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
running = 0; running = 0;
} }
if (ret == TERMKEY_RES_AGAIN) if (ret == TERMO_RES_AGAIN)
nextwait = termkey_get_waittime (tk); nextwait = termo_get_waittime (tk);
else else
nextwait = -1; nextwait = -1;
} }
termkey_destroy (tk); termo_destroy (tk);
} }

View File

@ -3,24 +3,24 @@
#include <unistd.h> #include <unistd.h>
#include <locale.h> #include <locale.h>
#include "termkey2.h" #include "termo.h"
static termkey_t *tk; static termo_t *tk;
static int timeout_id; static int timeout_id;
static void static void
on_key (termkey_t *tk, termkey_key_t *key) on_key (termo_t *tk, termo_key_t *key)
{ {
char buffer[50]; char buffer[50];
termkey_strfkey (tk, buffer, sizeof buffer, key, TERMKEY_FORMAT_VIM); termo_strfkey (tk, buffer, sizeof buffer, key, TERMO_FORMAT_VIM);
printf ("%s\n", buffer); printf ("%s\n", buffer);
} }
static gboolean static gboolean
key_timer (gpointer data) key_timer (gpointer data)
{ {
termkey_key_t key; termo_key_t key;
if (termkey_getkey_force (tk, &key) == TERMKEY_RES_KEY) if (termo_getkey_force (tk, &key) == TERMO_RES_KEY)
on_key (tk, &key); on_key (tk, &key);
return FALSE; return FALSE;
} }
@ -33,16 +33,16 @@ stdin_io (GIOChannel *source, GIOCondition condition, gpointer data)
if (timeout_id) if (timeout_id)
g_source_remove (timeout_id); g_source_remove (timeout_id);
termkey_advisereadable (tk); termo_advisereadable (tk);
termkey_result_t ret; termo_result_t ret;
termkey_key_t key; termo_key_t key;
while ((ret = termkey_getkey (tk, &key)) == TERMKEY_RES_KEY) while ((ret = termo_getkey (tk, &key)) == TERMO_RES_KEY)
on_key (tk, &key); on_key (tk, &key);
if (ret == TERMKEY_RES_AGAIN) if (ret == TERMO_RES_AGAIN)
timeout_id = g_timeout_add timeout_id = g_timeout_add
(termkey_get_waittime (tk), key_timer, NULL); (termo_get_waittime (tk), key_timer, NULL);
} }
return TRUE; return TRUE;
@ -54,13 +54,13 @@ main (int argc, char *argv[])
(void) argc; (void) argc;
(void) argv; (void) argv;
TERMKEY_CHECK_VERSION; TERMO_CHECK_VERSION;
setlocale (LC_CTYPE, ""); setlocale (LC_CTYPE, "");
tk = termkey_new (STDIN_FILENO, NULL, 0); tk = termo_new (STDIN_FILENO, NULL, 0);
if (!tk) if (!tk)
{ {
fprintf (stderr, "Cannot allocate termkey instance\n"); fprintf (stderr, "Cannot allocate termo instance\n");
exit (1); exit (1);
} }
@ -68,5 +68,5 @@ main (int argc, char *argv[])
g_io_add_watch (g_io_channel_unix_new (STDIN_FILENO), g_io_add_watch (g_io_channel_unix_new (STDIN_FILENO),
G_IO_IN, stdin_io, NULL); G_IO_IN, stdin_io, NULL);
g_main_loop_run (loop); g_main_loop_run (loop);
termkey_destroy (tk); termo_destroy (tk);
} }

54
demo.c
View File

@ -6,20 +6,20 @@
#include <errno.h> #include <errno.h>
#include <locale.h> #include <locale.h>
#include "termkey2.h" #include "termo.h"
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
TERMKEY_CHECK_VERSION; TERMO_CHECK_VERSION;
setlocale (LC_CTYPE, ""); setlocale (LC_CTYPE, "");
int mouse = 0; int mouse = 0;
int mouse_proto = 0; int mouse_proto = 0;
termkey_format_t format = TERMKEY_FORMAT_VIM; termo_format_t format = TERMO_FORMAT_VIM;
char buffer[50]; char buffer[50];
termkey_t *tk; termo_t *tk;
int opt; int opt;
while ((opt = getopt (argc, argv, "m::p:")) != -1) while ((opt = getopt (argc, argv, "m::p:")) != -1)
@ -43,21 +43,21 @@ main(int argc, char *argv[])
} }
} }
tk = termkey_new (STDIN_FILENO, NULL, tk = termo_new (STDIN_FILENO, NULL,
TERMKEY_FLAG_SPACESYMBOL | TERMKEY_FLAG_CTRLC); TERMO_FLAG_SPACESYMBOL | TERMO_FLAG_CTRLC);
if (!tk) if (!tk)
{ {
fprintf (stderr, "Cannot allocate termkey instance\n"); fprintf (stderr, "Cannot allocate termo instance\n");
exit (1); exit (1);
} }
if (termkey_get_flags (tk) & TERMKEY_FLAG_RAW) if (termo_get_flags (tk) & TERMO_FLAG_RAW)
printf ("Termkey in RAW mode\n"); printf ("Termkey in RAW mode\n");
else else
printf ("Termkey in multibyte mode\n"); printf ("Termkey in multibyte mode\n");
termkey_result_t ret; termo_result_t ret;
termkey_key_t key; termo_key_t key;
if (mouse) if (mouse)
{ {
@ -66,38 +66,38 @@ main(int argc, char *argv[])
printf ("\033[?%dh", mouse_proto); printf ("\033[?%dh", mouse_proto);
} }
while ((ret = termkey_waitkey (tk, &key)) != TERMKEY_RES_EOF) while ((ret = termo_waitkey (tk, &key)) != TERMO_RES_EOF)
{ {
if (ret == TERMKEY_RES_KEY) if (ret == TERMO_RES_KEY)
{ {
termkey_strfkey (tk, buffer, sizeof buffer, &key, format); termo_strfkey (tk, buffer, sizeof buffer, &key, format);
if (key.type == TERMKEY_TYPE_MOUSE) if (key.type == TERMO_TYPE_MOUSE)
{ {
int line, col; int line, col;
termkey_interpret_mouse (tk, &key, NULL, NULL, &line, &col); termo_interpret_mouse (tk, &key, NULL, NULL, &line, &col);
printf ("%s at line=%d, col=%d\n", buffer, line, col); printf ("%s at line=%d, col=%d\n", buffer, line, col);
} }
else if (key.type == TERMKEY_TYPE_POSITION) else if (key.type == TERMO_TYPE_POSITION)
{ {
int line, col; int line, col;
termkey_interpret_position (tk, &key, &line, &col); termo_interpret_position (tk, &key, &line, &col);
printf ("Cursor position report at line=%d, col=%d\n", printf ("Cursor position report at line=%d, col=%d\n",
line, col); line, col);
} }
else if (key.type == TERMKEY_TYPE_MODEREPORT) else if (key.type == TERMO_TYPE_MODEREPORT)
{ {
int initial, mode, value; int initial, mode, value;
termkey_interpret_modereport termo_interpret_modereport
(tk, &key, &initial, &mode, &value); (tk, &key, &initial, &mode, &value);
printf ("Mode report %s mode %d = %d\n", printf ("Mode report %s mode %d = %d\n",
initial ? "DEC" : "ANSI", mode, value); initial ? "DEC" : "ANSI", mode, value);
} }
else if (key.type == TERMKEY_TYPE_UNKNOWN_CSI) else if (key.type == TERMO_TYPE_UNKNOWN_CSI)
{ {
long args[16]; long args[16];
size_t nargs = 16; size_t nargs = 16;
unsigned long command; unsigned long command;
termkey_interpret_csi (tk, &key, args, &nargs, &command); termo_interpret_csi (tk, &key, args, &nargs, &command);
printf ("Unrecognised CSI %c %ld;%ld %c%c\n", printf ("Unrecognised CSI %c %ld;%ld %c%c\n",
(char) (command >> 8), args[0], args[1], (char) (command >> 8), args[0], args[1],
(char) (command >> 16), (char) command); (char) (command >> 16), (char) command);
@ -105,12 +105,12 @@ main(int argc, char *argv[])
else else
printf ("Key %s\n", buffer); printf ("Key %s\n", buffer);
if (key.type == TERMKEY_TYPE_KEY if (key.type == TERMO_TYPE_KEY
&& key.modifiers & TERMKEY_KEYMOD_CTRL && key.modifiers & TERMO_KEYMOD_CTRL
&& (key.code.codepoint == 'C' || key.code.codepoint == 'c')) && (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
break; break;
if (key.type == TERMKEY_TYPE_KEY if (key.type == TERMO_TYPE_KEY
&& key.modifiers == 0 && key.modifiers == 0
&& key.code.codepoint == '?') && key.code.codepoint == '?')
{ {
@ -119,11 +119,11 @@ main(int argc, char *argv[])
fflush (stdout); fflush (stdout);
} }
} }
else if (ret == TERMKEY_RES_ERROR) else if (ret == TERMO_RES_ERROR)
{ {
if (errno != EINTR) if (errno != EINTR)
{ {
perror ("termkey_waitkey"); perror ("termo_waitkey");
break; break;
} }
printf ("Interrupted by signal\n"); printf ("Interrupted by signal\n");
@ -133,5 +133,5 @@ main(int argc, char *argv[])
if (mouse) if (mouse)
printf ("\033[?%dlMouse mode deactivated\n", mouse); printf ("\033[?%dlMouse mode deactivated\n", mouse);
termkey_destroy (tk); termo_destroy (tk);
} }

View File

@ -1,5 +1,5 @@
#include "termkey2.h" #include "termo.h"
#include "termkey2-internal.h" #include "termo-internal.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -11,12 +11,12 @@ static char ss3_kpalts[64];
typedef struct typedef struct
{ {
termkey_t *tk; termo_t *tk;
} }
termkey_csi_t; termo_csi_t;
typedef termkey_result_t (*csi_handler_fn) typedef termo_result_t (*csi_handler_fn)
(termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args); (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args);
static csi_handler_fn csi_handlers[64]; static csi_handler_fn csi_handlers[64];
/* /*
@ -25,9 +25,9 @@ static csi_handler_fn csi_handlers[64];
static struct keyinfo csi_ss3s[64]; static struct keyinfo csi_ss3s[64];
static termkey_result_t static termo_result_t
handle_csi_ss3_full (termkey_t *tk, handle_csi_ss3_full (termo_t *tk,
termkey_key_t *key, int cmd, long *arg, int args) termo_key_t *key, int cmd, long *arg, int args)
{ {
(void) tk; (void) tk;
@ -41,13 +41,13 @@ handle_csi_ss3_full (termkey_t *tk,
key->modifiers &= ~(csi_ss3s[cmd - 0x40].modifier_mask); key->modifiers &= ~(csi_ss3s[cmd - 0x40].modifier_mask);
key->modifiers |= csi_ss3s[cmd - 0x40].modifier_set; key->modifiers |= csi_ss3s[cmd - 0x40].modifier_set;
if (key->code.sym == TERMKEY_SYM_UNKNOWN) if (key->code.sym == TERMO_SYM_UNKNOWN)
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
static void static void
register_csi_ss3_full (termkey_type_t type, termkey_sym_t sym, register_csi_ss3_full (termo_type_t type, termo_sym_t sym,
int modifier_set, int modifier_mask, unsigned char cmd) int modifier_set, int modifier_mask, unsigned char cmd)
{ {
if (cmd < 0x40 || cmd >= 0x80) if (cmd < 0x40 || cmd >= 0x80)
@ -62,7 +62,7 @@ register_csi_ss3_full (termkey_type_t type, termkey_sym_t sym,
} }
static void static void
register_csi_ss3 (termkey_type_t type, termkey_sym_t sym, unsigned char cmd) register_csi_ss3 (termo_type_t type, termo_sym_t sym, unsigned char cmd)
{ {
register_csi_ss3_full (type, sym, 0, 0, cmd); register_csi_ss3_full (type, sym, 0, 0, cmd);
} }
@ -72,7 +72,7 @@ register_csi_ss3 (termkey_type_t type, termkey_sym_t sym, unsigned char cmd)
*/ */
static void static void
register_ss3kpalt (termkey_type_t type, termkey_sym_t sym, register_ss3kpalt (termo_type_t type, termo_sym_t sym,
unsigned char cmd, char kpalt) unsigned char cmd, char kpalt)
{ {
if (cmd < 0x40 || cmd >= 0x80) if (cmd < 0x40 || cmd >= 0x80)
@ -94,8 +94,8 @@ register_ss3kpalt (termkey_type_t type, termkey_sym_t sym,
static struct keyinfo csifuncs[35]; static struct keyinfo csifuncs[35];
#define NCSIFUNCS ((long) (sizeof csifuncs / sizeof csifuncs[0])) #define NCSIFUNCS ((long) (sizeof csifuncs / sizeof csifuncs[0]))
static termkey_result_t static termo_result_t
handle_csifunc (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args) handle_csifunc (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
{ {
(void) cmd; (void) cmd;
@ -103,7 +103,7 @@ handle_csifunc (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
key->modifiers = arg[1] - 1; key->modifiers = arg[1] - 1;
else else
key->modifiers = 0; key->modifiers = 0;
key->type = TERMKEY_TYPE_KEYSYM; key->type = TERMO_TYPE_KEYSYM;
if (arg[0] == 27) if (arg[0] == 27)
{ {
@ -119,21 +119,21 @@ handle_csifunc (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
key->modifiers |= csifuncs[arg[0]].modifier_set; key->modifiers |= csifuncs[arg[0]].modifier_set;
} }
else else
key->code.sym = TERMKEY_SYM_UNKNOWN; key->code.sym = TERMO_SYM_UNKNOWN;
if (key->code.sym == TERMKEY_SYM_UNKNOWN) if (key->code.sym == TERMO_SYM_UNKNOWN)
{ {
#ifdef DEBUG #ifdef DEBUG
fprintf (stderr, "CSI: Unknown function key %ld\n", arg[0]); fprintf (stderr, "CSI: Unknown function key %ld\n", arg[0]);
#endif #endif
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
} }
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
static void static void
register_csifunc (termkey_type_t type, termkey_sym_t sym, int number) register_csifunc (termo_type_t type, termo_sym_t sym, int number)
{ {
if (number >= NCSIFUNCS) if (number >= NCSIFUNCS)
return; return;
@ -150,21 +150,21 @@ register_csifunc (termkey_type_t type, termkey_sym_t sym, int number)
* URxvt seems to emit this instead of ~ when holding Ctrl * URxvt seems to emit this instead of ~ when holding Ctrl
*/ */
static termkey_result_t static termo_result_t
handle_csi_caret (termkey_t *tk, handle_csi_caret (termo_t *tk,
termkey_key_t *key, int cmd, long *arg, int args) termo_key_t *key, int cmd, long *arg, int args)
{ {
switch (cmd) switch (cmd)
{ {
case '^': case '^':
{ {
termkey_result_t res = handle_csifunc (tk, key, cmd, arg, args); termo_result_t res = handle_csifunc (tk, key, cmd, arg, args);
if (res == TERMKEY_RES_KEY) if (res == TERMO_RES_KEY)
key->modifiers |= TERMKEY_KEYMOD_CTRL; key->modifiers |= TERMO_KEYMOD_CTRL;
return res; return res;
} }
default: default:
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
} }
} }
@ -172,8 +172,8 @@ handle_csi_caret (termkey_t *tk,
* Handler for CSI u extended Unicode keys * Handler for CSI u extended Unicode keys
*/ */
static termkey_result_t static termo_result_t
handle_csi_u (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args) handle_csi_u (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
{ {
switch (cmd) switch (cmd)
{ {
@ -185,13 +185,13 @@ handle_csi_u (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
key->modifiers = 0; key->modifiers = 0;
int mod = key->modifiers; int mod = key->modifiers;
key->type = TERMKEY_TYPE_KEYSYM; key->type = TERMO_TYPE_KEYSYM;
(*tk->method.emit_codepoint) (tk, arg[0], key); (*tk->method.emit_codepoint) (tk, arg[0], key);
key->modifiers |= mod; key->modifiers |= mod;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
default: default:
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
} }
} }
@ -200,8 +200,8 @@ handle_csi_u (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
* Note: This does not handle X10 encoding * Note: This does not handle X10 encoding
*/ */
static termkey_result_t static termo_result_t
handle_csi_m (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args) handle_csi_m (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
{ {
(void) tk; (void) tk;
@ -214,57 +214,57 @@ handle_csi_m (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
case 'm': case 'm':
break; break;
default: default:
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
} }
if (!initial && args >= 3) if (!initial && args >= 3)
{ {
// rxvt protocol // rxvt protocol
key->type = TERMKEY_TYPE_MOUSE; key->type = TERMO_TYPE_MOUSE;
key->code.mouse.info = arg[0] - 0x20; key->code.mouse.info = arg[0] - 0x20;
key->modifiers = (key->code.mouse.info & 0x1c) >> 2; key->modifiers = (key->code.mouse.info & 0x1c) >> 2;
key->code.mouse.info &= ~0x1c; key->code.mouse.info &= ~0x1c;
termkey_key_set_linecol (key, arg[2] - 1, arg[1] - 1); termo_key_set_linecol (key, arg[2] - 1, arg[1] - 1);
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
if (initial == '<' && args >= 3) if (initial == '<' && args >= 3)
{ {
// SGR protocol // SGR protocol
key->type = TERMKEY_TYPE_MOUSE; key->type = TERMO_TYPE_MOUSE;
key->code.mouse.info = arg[0]; key->code.mouse.info = arg[0];
key->modifiers = (key->code.mouse.info & 0x1c) >> 2; key->modifiers = (key->code.mouse.info & 0x1c) >> 2;
key->code.mouse.info &= ~0x1c; key->code.mouse.info &= ~0x1c;
termkey_key_set_linecol (key, arg[2] - 1, arg[1] - 1); termo_key_set_linecol (key, arg[2] - 1, arg[1] - 1);
if (cmd == 'm') // release if (cmd == 'm') // release
key->code.mouse.info |= 0x8000; key->code.mouse.info |= 0x8000;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
} }
termkey_result_t termo_result_t
termkey_interpret_mouse (termkey_t *tk, const termkey_key_t *key, termo_interpret_mouse (termo_t *tk, const termo_key_t *key,
termkey_mouse_event_t *event, int *button, int *line, int *col) termo_mouse_event_t *event, int *button, int *line, int *col)
{ {
(void) tk; (void) tk;
if (key->type != TERMKEY_TYPE_MOUSE) if (key->type != TERMO_TYPE_MOUSE)
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
if (button) if (button)
*button = 0; *button = 0;
termkey_key_get_linecol (key, line, col); termo_key_get_linecol (key, line, col);
// XXX: WTF is this logic? // XXX: WTF is this logic?
if (!event) if (!event)
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
int btn = 0; int btn = 0;
int code = key->code.mouse.info; int code = key->code.mouse.info;
@ -276,30 +276,30 @@ termkey_interpret_mouse (termkey_t *tk, const termkey_key_t *key,
case 0: case 0:
case 1: case 1:
case 2: case 2:
*event = drag ? TERMKEY_MOUSE_DRAG : TERMKEY_MOUSE_PRESS; *event = drag ? TERMO_MOUSE_DRAG : TERMO_MOUSE_PRESS;
btn = code + 1; btn = code + 1;
break; break;
case 3: case 3:
*event = TERMKEY_MOUSE_RELEASE; *event = TERMO_MOUSE_RELEASE;
// no button hint // no button hint
break; break;
case 64: case 64:
case 65: case 65:
*event = drag ? TERMKEY_MOUSE_DRAG : TERMKEY_MOUSE_PRESS; *event = drag ? TERMO_MOUSE_DRAG : TERMO_MOUSE_PRESS;
btn = code + 4 - 64; btn = code + 4 - 64;
break; break;
default: default:
*event = TERMKEY_MOUSE_UNKNOWN; *event = TERMO_MOUSE_UNKNOWN;
} }
if (button) if (button)
*button = btn; *button = btn;
if (key->code.mouse.info & 0x8000) if (key->code.mouse.info & 0x8000)
*event = TERMKEY_MOUSE_RELEASE; *event = TERMO_MOUSE_RELEASE;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
/* /*
@ -307,43 +307,43 @@ termkey_interpret_mouse (termkey_t *tk, const termkey_key_t *key,
* A plain CSI R with no arguments is probably actually <F3> * A plain CSI R with no arguments is probably actually <F3>
*/ */
static termkey_result_t static termo_result_t
handle_csi_R (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args) handle_csi_R (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
{ {
switch (cmd) switch (cmd)
{ {
case 'R' | '?' << 8: case 'R' | '?' << 8:
if (args < 2) if (args < 2)
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
key->type = TERMKEY_TYPE_POSITION; key->type = TERMO_TYPE_POSITION;
termkey_key_set_linecol (key, arg[1], arg[0]); termo_key_set_linecol (key, arg[1], arg[0]);
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
default: default:
return handle_csi_ss3_full (tk, key, cmd, arg, args); return handle_csi_ss3_full (tk, key, cmd, arg, args);
} }
} }
termkey_result_t termo_result_t
termkey_interpret_position (termkey_t *tk, termo_interpret_position (termo_t *tk,
const termkey_key_t *key, int *line, int *col) const termo_key_t *key, int *line, int *col)
{ {
(void) tk; (void) tk;
if (key->type != TERMKEY_TYPE_POSITION) if (key->type != TERMO_TYPE_POSITION)
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
termkey_key_get_linecol (key, line, col); termo_key_get_linecol (key, line, col);
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
/* /*
* Handler for CSI $y mode status reports * Handler for CSI $y mode status reports
*/ */
static termkey_result_t static termo_result_t
handle_csi_y (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args) handle_csi_y (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
{ {
(void) tk; (void) tk;
@ -352,27 +352,27 @@ handle_csi_y (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
case 'y' | '$' << 16: case 'y' | '$' << 16:
case 'y' | '$' << 16 | '?' << 8: case 'y' | '$' << 16 | '?' << 8:
if (args < 2) if (args < 2)
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
key->type = TERMKEY_TYPE_MODEREPORT; key->type = TERMO_TYPE_MODEREPORT;
key->code.mode.initial = (cmd >> 8); key->code.mode.initial = (cmd >> 8);
key->code.mode.mode = arg[0]; key->code.mode.mode = arg[0];
key->code.mode.value = arg[1]; key->code.mode.value = arg[1];
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
default: default:
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
} }
} }
termkey_result_t termo_result_t
termkey_interpret_modereport (termkey_t *tk, termo_interpret_modereport (termo_t *tk,
const termkey_key_t *key, int *initial, int *mode, int *value) const termo_key_t *key, int *initial, int *mode, int *value)
{ {
(void) tk; (void) tk;
if (key->type != TERMKEY_TYPE_MODEREPORT) if (key->type != TERMO_TYPE_MODEREPORT)
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
if (initial) if (initial)
*initial = key->code.mode.initial; *initial = key->code.mode.initial;
@ -380,13 +380,13 @@ termkey_interpret_modereport (termkey_t *tk,
*mode = key->code.mode.mode; *mode = key->code.mode.mode;
if (value) if (value)
*value = key->code.mode.value; *value = key->code.mode.value;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
#define CHARAT(i) (tk->buffer[tk->buffstart + (i)]) #define CHARAT(i) (tk->buffer[tk->buffstart + (i)])
static termkey_result_t static termo_result_t
parse_csi (termkey_t *tk, size_t introlen, size_t *csi_len, parse_csi (termo_t *tk, size_t introlen, size_t *csi_len,
long args[], size_t *nargs, unsigned long *commandp) long args[], size_t *nargs, unsigned long *commandp)
{ {
size_t csi_end = introlen; size_t csi_end = introlen;
@ -398,7 +398,7 @@ parse_csi (termkey_t *tk, size_t introlen, size_t *csi_len,
} }
if (csi_end >= tk->buffcount) if (csi_end >= tk->buffcount)
return TERMKEY_RES_AGAIN; return TERMO_RES_AGAIN;
unsigned char cmd = CHARAT (csi_end); unsigned char cmd = CHARAT (csi_end);
*commandp = cmd; *commandp = cmd;
@ -451,17 +451,17 @@ parse_csi (termkey_t *tk, size_t introlen, size_t *csi_len,
*nargs = argi; *nargs = argi;
*csi_len = csi_end + 1; *csi_len = csi_end + 1;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
termkey_result_t termo_result_t
termkey_interpret_csi (termkey_t *tk, const termkey_key_t *key, termo_interpret_csi (termo_t *tk, const termo_key_t *key,
long args[], size_t *nargs, unsigned long *cmd) long args[], size_t *nargs, unsigned long *cmd)
{ {
if (tk->hightide == 0) if (tk->hightide == 0)
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
if (key->type != TERMKEY_TYPE_UNKNOWN_CSI) if (key->type != TERMO_TYPE_UNKNOWN_CSI)
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
size_t dummy; size_t dummy;
return parse_csi (tk, 0, &dummy, args, nargs, cmd); return parse_csi (tk, 0, &dummy, args, nargs, cmd);
@ -473,76 +473,76 @@ register_keys (void)
int i; int i;
for (i = 0; i < 64; i++) for (i = 0; i < 64; i++)
{ {
csi_ss3s[i].sym = TERMKEY_SYM_UNKNOWN; csi_ss3s[i].sym = TERMO_SYM_UNKNOWN;
ss3s[i].sym = TERMKEY_SYM_UNKNOWN; ss3s[i].sym = TERMO_SYM_UNKNOWN;
ss3_kpalts[i] = 0; ss3_kpalts[i] = 0;
} }
for (i = 0; i < NCSIFUNCS; i++) for (i = 0; i < NCSIFUNCS; i++)
csifuncs[i].sym = TERMKEY_SYM_UNKNOWN; csifuncs[i].sym = TERMO_SYM_UNKNOWN;
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, 'A'); register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_UP, 'A');
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, 'B'); register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_DOWN, 'B');
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 'C'); register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_RIGHT, 'C');
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, 'D'); register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_LEFT, 'D');
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 'E'); register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_BEGIN, 'E');
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 'F'); register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_END, 'F');
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 'H'); register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_HOME, 'H');
register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 1, 'P'); register_csi_ss3 (TERMO_TYPE_FUNCTION, 1, 'P');
register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 2, 'Q'); register_csi_ss3 (TERMO_TYPE_FUNCTION, 2, 'Q');
register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 3, 'R'); register_csi_ss3 (TERMO_TYPE_FUNCTION, 3, 'R');
register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 4, 'S'); register_csi_ss3 (TERMO_TYPE_FUNCTION, 4, 'S');
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_TAB,
TERMKEY_KEYMOD_SHIFT, TERMKEY_KEYMOD_SHIFT, 'Z'); TERMO_KEYMOD_SHIFT, TERMO_KEYMOD_SHIFT, 'Z');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPENTER, 'M', 0); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPENTER, 'M', 0);
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPEQUALS, 'X', '='); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPEQUALS, 'X', '=');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPMULT, 'j', '*'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPMULT, 'j', '*');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPPLUS, 'k', '+'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPPLUS, 'k', '+');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPCOMMA, 'l', ','); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPCOMMA, 'l', ',');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPMINUS, 'm', '-'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPMINUS, 'm', '-');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPPERIOD, 'n', '.'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPPERIOD, 'n', '.');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPDIV, 'o', '/'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPDIV, 'o', '/');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP0, 'p', '0'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP0, 'p', '0');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP1, 'q', '1'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP1, 'q', '1');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP2, 'r', '2'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP2, 'r', '2');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP3, 's', '3'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP3, 's', '3');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP4, 't', '4'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP4, 't', '4');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP5, 'u', '5'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP5, 'u', '5');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP6, 'v', '6'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP6, 'v', '6');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP7, 'w', '7'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP7, 'w', '7');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP8, 'x', '8'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP8, 'x', '8');
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP9, 'y', '9'); register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP9, 'y', '9');
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND, 1); register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_FIND, 1);
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT, 2); register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_INSERT, 2);
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE, 3); register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_DELETE, 3);
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT, 4); register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_SELECT, 4);
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 5); register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEUP, 5);
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 6); register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEDOWN, 6);
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 7); register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_HOME, 7);
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 8); register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_END, 8);
register_csifunc (TERMKEY_TYPE_FUNCTION, 1, 11); register_csifunc (TERMO_TYPE_FUNCTION, 1, 11);
register_csifunc (TERMKEY_TYPE_FUNCTION, 2, 12); register_csifunc (TERMO_TYPE_FUNCTION, 2, 12);
register_csifunc (TERMKEY_TYPE_FUNCTION, 3, 13); register_csifunc (TERMO_TYPE_FUNCTION, 3, 13);
register_csifunc (TERMKEY_TYPE_FUNCTION, 4, 14); register_csifunc (TERMO_TYPE_FUNCTION, 4, 14);
register_csifunc (TERMKEY_TYPE_FUNCTION, 5, 15); register_csifunc (TERMO_TYPE_FUNCTION, 5, 15);
register_csifunc (TERMKEY_TYPE_FUNCTION, 6, 17); register_csifunc (TERMO_TYPE_FUNCTION, 6, 17);
register_csifunc (TERMKEY_TYPE_FUNCTION, 7, 18); register_csifunc (TERMO_TYPE_FUNCTION, 7, 18);
register_csifunc (TERMKEY_TYPE_FUNCTION, 8, 19); register_csifunc (TERMO_TYPE_FUNCTION, 8, 19);
register_csifunc (TERMKEY_TYPE_FUNCTION, 9, 20); register_csifunc (TERMO_TYPE_FUNCTION, 9, 20);
register_csifunc (TERMKEY_TYPE_FUNCTION, 10, 21); register_csifunc (TERMO_TYPE_FUNCTION, 10, 21);
register_csifunc (TERMKEY_TYPE_FUNCTION, 11, 23); register_csifunc (TERMO_TYPE_FUNCTION, 11, 23);
register_csifunc (TERMKEY_TYPE_FUNCTION, 12, 24); register_csifunc (TERMO_TYPE_FUNCTION, 12, 24);
register_csifunc (TERMKEY_TYPE_FUNCTION, 13, 25); register_csifunc (TERMO_TYPE_FUNCTION, 13, 25);
register_csifunc (TERMKEY_TYPE_FUNCTION, 14, 26); register_csifunc (TERMO_TYPE_FUNCTION, 14, 26);
register_csifunc (TERMKEY_TYPE_FUNCTION, 15, 28); register_csifunc (TERMO_TYPE_FUNCTION, 15, 28);
register_csifunc (TERMKEY_TYPE_FUNCTION, 16, 29); register_csifunc (TERMO_TYPE_FUNCTION, 16, 29);
register_csifunc (TERMKEY_TYPE_FUNCTION, 17, 31); register_csifunc (TERMO_TYPE_FUNCTION, 17, 31);
register_csifunc (TERMKEY_TYPE_FUNCTION, 18, 32); register_csifunc (TERMO_TYPE_FUNCTION, 18, 32);
register_csifunc (TERMKEY_TYPE_FUNCTION, 19, 33); register_csifunc (TERMO_TYPE_FUNCTION, 19, 33);
register_csifunc (TERMKEY_TYPE_FUNCTION, 20, 34); register_csifunc (TERMO_TYPE_FUNCTION, 20, 34);
csi_handlers['u' - 0x40] = &handle_csi_u; csi_handlers['u' - 0x40] = &handle_csi_u;
@ -554,14 +554,14 @@ register_keys (void)
csi_handlers['y' - 0x40] = &handle_csi_y; csi_handlers['y' - 0x40] = &handle_csi_y;
// URxvt // URxvt
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_UP,
TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'a'); TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'a');
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_DOWN,
TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'b'); TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'b');
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_RIGHT,
TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'c'); TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'c');
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_LEFT,
TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'd'); TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'd');
csi_handlers['^' - 0x40] = &handle_csi_caret; csi_handlers['^' - 0x40] = &handle_csi_caret;
@ -570,14 +570,14 @@ register_keys (void)
} }
static void * static void *
new_driver (termkey_t *tk, const char *term) new_driver (termo_t *tk, const char *term)
{ {
(void) term; (void) term;
if (!keyinfo_initialised && !register_keys ()) if (!keyinfo_initialised && !register_keys ())
return NULL; return NULL;
termkey_csi_t *csi = malloc (sizeof *csi); termo_csi_t *csi = malloc (sizeof *csi);
if (!csi) if (!csi)
return NULL; return NULL;
@ -588,13 +588,13 @@ new_driver (termkey_t *tk, const char *term)
static void static void
free_driver (void *info) free_driver (void *info)
{ {
termkey_csi_t *csi = info; termo_csi_t *csi = info;
free (csi); free (csi);
} }
static termkey_result_t static termo_result_t
peekkey_csi (termkey_t *tk, termkey_csi_t *csi, peekkey_csi (termo_t *tk, termo_csi_t *csi,
size_t introlen, termkey_key_t *key, int force, size_t *nbytep) size_t introlen, termo_key_t *key, int force, size_t *nbytep)
{ {
(void) csi; (void) csi;
@ -603,16 +603,16 @@ peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
long arg[16]; long arg[16];
unsigned long cmd; unsigned long cmd;
termkey_result_t ret = parse_csi (tk, introlen, &csi_len, arg, &args, &cmd); termo_result_t ret = parse_csi (tk, introlen, &csi_len, arg, &args, &cmd);
if (ret == TERMKEY_RES_AGAIN) if (ret == TERMO_RES_AGAIN)
{ {
if (!force) if (!force)
return TERMKEY_RES_AGAIN; return TERMO_RES_AGAIN;
(*tk->method.emit_codepoint) (tk, '[', key); (*tk->method.emit_codepoint) (tk, '[', key);
key->modifiers |= TERMKEY_KEYMOD_ALT; key->modifiers |= TERMO_KEYMOD_ALT;
*nbytep = introlen; *nbytep = introlen;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
// Mouse in X10 encoding consumes the next 3 bytes also (or more with 1005) // Mouse in X10 encoding consumes the next 3 bytes also (or more with 1005)
@ -621,24 +621,24 @@ peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
tk->buffstart += csi_len; tk->buffstart += csi_len;
tk->buffcount -= csi_len; tk->buffcount -= csi_len;
termkey_result_t mouse_result = termo_result_t mouse_result =
(*tk->method.peekkey_mouse) (tk, key, nbytep); (*tk->method.peekkey_mouse) (tk, key, nbytep);
tk->buffstart -= csi_len; tk->buffstart -= csi_len;
tk->buffcount += csi_len; tk->buffcount += csi_len;
if (mouse_result == TERMKEY_RES_KEY) if (mouse_result == TERMO_RES_KEY)
*nbytep += csi_len; *nbytep += csi_len;
return mouse_result; return mouse_result;
} }
termkey_result_t result = TERMKEY_RES_NONE; termo_result_t result = TERMO_RES_NONE;
// We know from the logic above that cmd must be >= 0x40 and < 0x80 // We know from the logic above that cmd must be >= 0x40 and < 0x80
if (csi_handlers[(cmd & 0xff) - 0x40]) if (csi_handlers[(cmd & 0xff) - 0x40])
result = (*csi_handlers[(cmd & 0xff) - 0x40]) (tk, key, cmd, arg, args); result = (*csi_handlers[(cmd & 0xff) - 0x40]) (tk, key, cmd, arg, args);
if (result == TERMKEY_RES_NONE) if (result == TERMO_RES_NONE)
{ {
#ifdef DEBUG #ifdef DEBUG
switch (args) switch (args)
@ -661,49 +661,49 @@ peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
break; break;
} }
#endif #endif
key->type = TERMKEY_TYPE_UNKNOWN_CSI; key->type = TERMO_TYPE_UNKNOWN_CSI;
key->code.number = cmd; key->code.number = cmd;
tk->hightide = csi_len - introlen; tk->hightide = csi_len - introlen;
*nbytep = introlen; // Do not yet eat the data bytes *nbytep = introlen; // Do not yet eat the data bytes
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
*nbytep = csi_len; *nbytep = csi_len;
return result; return result;
} }
static termkey_result_t static termo_result_t
peekkey_ss3 (termkey_t *tk, termkey_csi_t *csi, size_t introlen, peekkey_ss3 (termo_t *tk, termo_csi_t *csi, size_t introlen,
termkey_key_t *key, int force, size_t *nbytep) termo_key_t *key, int force, size_t *nbytep)
{ {
(void) csi; (void) csi;
if (tk->buffcount < introlen + 1) if (tk->buffcount < introlen + 1)
{ {
if (!force) if (!force)
return TERMKEY_RES_AGAIN; return TERMO_RES_AGAIN;
(*tk->method.emit_codepoint) (tk, 'O', key); (*tk->method.emit_codepoint) (tk, 'O', key);
key->modifiers |= TERMKEY_KEYMOD_ALT; key->modifiers |= TERMO_KEYMOD_ALT;
*nbytep = tk->buffcount; *nbytep = tk->buffcount;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
unsigned char cmd = CHARAT (introlen); unsigned char cmd = CHARAT (introlen);
if (cmd < 0x40 || cmd >= 0x80) if (cmd < 0x40 || cmd >= 0x80)
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
key->type = csi_ss3s[cmd - 0x40].type; key->type = csi_ss3s[cmd - 0x40].type;
key->code.sym = csi_ss3s[cmd - 0x40].sym; key->code.sym = csi_ss3s[cmd - 0x40].sym;
key->modifiers = csi_ss3s[cmd - 0x40].modifier_set; key->modifiers = csi_ss3s[cmd - 0x40].modifier_set;
if (key->code.sym == TERMKEY_SYM_UNKNOWN) if (key->code.sym == TERMO_SYM_UNKNOWN)
{ {
if (tk->flags & TERMKEY_FLAG_CONVERTKP && ss3_kpalts[cmd - 0x40]) if (tk->flags & TERMO_FLAG_CONVERTKP && ss3_kpalts[cmd - 0x40])
{ {
key->type = TERMKEY_TYPE_KEY; key->type = TERMO_TYPE_KEY;
key->code.codepoint = ss3_kpalts[cmd - 0x40]; key->code.codepoint = ss3_kpalts[cmd - 0x40];
key->modifiers = 0; key->modifiers = 0;
@ -718,26 +718,26 @@ peekkey_ss3 (termkey_t *tk, termkey_csi_t *csi, size_t introlen,
} }
} }
if (key->code.sym == TERMKEY_SYM_UNKNOWN) if (key->code.sym == TERMO_SYM_UNKNOWN)
{ {
#ifdef DEBUG #ifdef DEBUG
fprintf (stderr, "CSI: Unknown SS3 %c (0x%02x)\n", (char) cmd, cmd); fprintf (stderr, "CSI: Unknown SS3 %c (0x%02x)\n", (char) cmd, cmd);
#endif #endif
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
} }
*nbytep = introlen + 1; *nbytep = introlen + 1;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
static termkey_result_t static termo_result_t
peekkey (termkey_t *tk, void *info, peekkey (termo_t *tk, void *info,
termkey_key_t *key, int force, size_t *nbytep) termo_key_t *key, int force, size_t *nbytep)
{ {
if (tk->buffcount == 0) if (tk->buffcount == 0)
return tk->is_closed ? TERMKEY_RES_EOF : TERMKEY_RES_NONE; return tk->is_closed ? TERMO_RES_EOF : TERMO_RES_NONE;
termkey_csi_t *csi = info; termo_csi_t *csi = info;
// Now we're sure at least 1 byte is valid // Now we're sure at least 1 byte is valid
unsigned char b0 = CHARAT (0); unsigned char b0 = CHARAT (0);
@ -750,10 +750,10 @@ peekkey (termkey_t *tk, void *info,
return peekkey_ss3 (tk, csi, 1, key, force, nbytep); return peekkey_ss3 (tk, csi, 1, key, force, nbytep);
if (b0 == 0x9b) if (b0 == 0x9b)
return peekkey_csi (tk, csi, 1, key, force, nbytep); return peekkey_csi (tk, csi, 1, key, force, nbytep);
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
} }
termkey_driver_t termkey_driver_csi = termo_driver_t termo_driver_csi =
{ {
.name = "CSI", .name = "CSI",
.new_driver = new_driver, .new_driver = new_driver,

View File

@ -1,8 +1,8 @@
// we want strdup() // we want strdup()
#define _XOPEN_SOURCE 600 #define _XOPEN_SOURCE 600
#include "termkey2.h" #include "termo.h"
#include "termkey2-internal.h" #include "termo-internal.h"
#ifdef HAVE_UNIBILIUM #ifdef HAVE_UNIBILIUM
# include <unibilium.h> # include <unibilium.h>
@ -53,7 +53,7 @@ trie_node_array_t;
typedef struct typedef struct
{ {
termkey_t *tk; termo_t *tk;
trie_node_t *root; trie_node_t *root;
char *start_string; char *start_string;
@ -62,14 +62,14 @@ typedef struct
bool have_mouse; bool have_mouse;
char *set_mouse_string; char *set_mouse_string;
} }
termkey_ti_t; termo_ti_t;
static int funcname2keysym (const char *funcname, termkey_type_t *typep, static int funcname2keysym (const char *funcname, termo_type_t *typep,
termkey_sym_t *symp, int *modmask, int *modsetp); termo_sym_t *symp, int *modmask, int *modsetp);
static int insert_seq (termkey_ti_t *ti, const char *seq, trie_node_t *node); static int insert_seq (termo_ti_t *ti, const char *seq, trie_node_t *node);
static trie_node_t * static trie_node_t *
new_node_key (termkey_type_t type, termkey_sym_t sym, int modmask, int modset) new_node_key (termo_type_t type, termo_sym_t sym, int modmask, int modset)
{ {
trie_node_key_t *n = malloc (sizeof *n); trie_node_key_t *n = malloc (sizeof *n);
if (!n) if (!n)
@ -176,7 +176,7 @@ compress_trie (struct trie_node *n)
} }
static bool static bool
load_terminfo (termkey_ti_t *ti, const char *term) load_terminfo (termo_ti_t *ti, const char *term)
{ {
const char *mouse_report_string = NULL; const char *mouse_report_string = NULL;
@ -212,15 +212,15 @@ load_terminfo (termkey_ti_t *ti, const char *term)
mouse_report_string = value; mouse_report_string = value;
else else
{ {
termkey_type_t type; termo_type_t type;
termkey_sym_t sym; termo_sym_t sym;
int mask = 0; int mask = 0;
int set = 0; int set = 0;
if (!funcname2keysym (name + 4, &type, &sym, &mask, &set)) if (!funcname2keysym (name + 4, &type, &sym, &mask, &set))
continue; continue;
if (sym == TERMKEY_SYM_NONE) if (sym == TERMO_SYM_NONE)
continue; continue;
node = new_node_key (type, sym, mask, set); node = new_node_key (type, sym, mask, set);
@ -262,7 +262,7 @@ load_terminfo (termkey_ti_t *ti, const char *term)
} }
} }
/* Take copies of these terminfo strings, in case we build multiple termkey /* Take copies of these terminfo strings, in case we build multiple termo
* instances for multiple different termtypes, and it's different by the * instances for multiple different termtypes, and it's different by the
* time we want to use it * time we want to use it
*/ */
@ -292,9 +292,9 @@ load_terminfo (termkey_ti_t *ti, const char *term)
} }
static void * static void *
new_driver (termkey_t *tk, const char *term) new_driver (termo_t *tk, const char *term)
{ {
termkey_ti_t *ti = calloc (1, sizeof *ti); termo_ti_t *ti = calloc (1, sizeof *ti);
if (!ti) if (!ti)
return NULL; return NULL;
@ -318,7 +318,7 @@ abort_free_ti:
} }
static bool static bool
write_string (termkey_t *tk, char *string) write_string (termo_t *tk, char *string)
{ {
if (tk->fd == -1 || !isatty (tk->fd) || !string) if (tk->fd == -1 || !isatty (tk->fd) || !string)
return true; return true;
@ -340,7 +340,7 @@ write_string (termkey_t *tk, char *string)
} }
static bool static bool
set_mouse (termkey_ti_t *ti, bool enable) set_mouse (termo_ti_t *ti, bool enable)
{ {
#ifdef HAVE_UNIBILIUM #ifdef HAVE_UNIBILIUM
unibi_var_t params[9] = { enable, 0, 0, 0, 0, 0, 0, 0, 0 }; unibi_var_t params[9] = { enable, 0, 0, 0, 0, 0, 0, 0, 0 };
@ -355,9 +355,9 @@ set_mouse (termkey_ti_t *ti, bool enable)
} }
static int static int
start_driver (termkey_t *tk, void *info) start_driver (termo_t *tk, void *info)
{ {
termkey_ti_t *ti = info; termo_ti_t *ti = info;
// TODO: Don't start the mouse automatically, find a nice place to put // TODO: Don't start the mouse automatically, find a nice place to put
// a public function to be called by users. // a public function to be called by users.
// TODO: Try to autodetect rxvt and use its protocol instead of mode 1000 // TODO: Try to autodetect rxvt and use its protocol instead of mode 1000
@ -368,9 +368,9 @@ start_driver (termkey_t *tk, void *info)
} }
static int static int
stop_driver (termkey_t *tk, void *info) stop_driver (termo_t *tk, void *info)
{ {
termkey_ti_t *ti = info; termo_ti_t *ti = info;
if (ti->have_mouse && !set_mouse (ti, false)) if (ti->have_mouse && !set_mouse (ti, false))
return false; return false;
return write_string (tk, ti->stop_string); return write_string (tk, ti->stop_string);
@ -379,7 +379,7 @@ stop_driver (termkey_t *tk, void *info)
static void static void
free_driver (void *info) free_driver (void *info)
{ {
termkey_ti_t *ti = info; termo_ti_t *ti = info;
free_trie (ti->root); free_trie (ti->root);
free (ti->set_mouse_string); free (ti->set_mouse_string);
free (ti->start_string); free (ti->start_string);
@ -389,14 +389,14 @@ free_driver (void *info)
#define CHARAT(i) (tk->buffer[tk->buffstart + (i)]) #define CHARAT(i) (tk->buffer[tk->buffstart + (i)])
static termkey_result_t static termo_result_t
peekkey (termkey_t *tk, void *info, peekkey (termo_t *tk, void *info,
termkey_key_t *key, int force, size_t *nbytep) termo_key_t *key, int force, size_t *nbytep)
{ {
termkey_ti_t *ti = info; termo_ti_t *ti = info;
if (tk->buffcount == 0) if (tk->buffcount == 0)
return tk->is_closed ? TERMKEY_RES_EOF : TERMKEY_RES_NONE; return tk->is_closed ? TERMO_RES_EOF : TERMO_RES_NONE;
trie_node_t *p = ti->root; trie_node_t *p = ti->root;
unsigned int pos = 0; unsigned int pos = 0;
@ -415,20 +415,20 @@ peekkey (termkey_t *tk, void *info,
key->code.sym = nk->key.sym; key->code.sym = nk->key.sym;
key->modifiers = nk->key.modifier_set; key->modifiers = nk->key.modifier_set;
*nbytep = pos; *nbytep = pos;
return TERMKEY_RES_KEY; return TERMO_RES_KEY;
} }
else if (p->type == TYPE_MOUSE) else if (p->type == TYPE_MOUSE)
{ {
tk->buffstart += pos; tk->buffstart += pos;
tk->buffcount -= pos; tk->buffcount -= pos;
termkey_result_t mouse_result = termo_result_t mouse_result =
(*tk->method.peekkey_mouse) (tk, key, nbytep); (*tk->method.peekkey_mouse) (tk, key, nbytep);
tk->buffstart -= pos; tk->buffstart -= pos;
tk->buffcount += pos; tk->buffcount += pos;
if (mouse_result == TERMKEY_RES_KEY) if (mouse_result == TERMO_RES_KEY)
*nbytep += pos; *nbytep += pos;
return mouse_result; return mouse_result;
@ -438,65 +438,65 @@ peekkey (termkey_t *tk, void *info,
// If p is not NULL then we hadn't walked off the end yet, so we have a // If p is not NULL then we hadn't walked off the end yet, so we have a
// partial match // partial match
if (p && !force) if (p && !force)
return TERMKEY_RES_AGAIN; return TERMO_RES_AGAIN;
return TERMKEY_RES_NONE; return TERMO_RES_NONE;
} }
static struct func static struct func
{ {
const char *funcname; const char *funcname;
termkey_type_t type; termo_type_t type;
termkey_sym_t sym; termo_sym_t sym;
int mods; int mods;
} }
funcs[] = funcs[] =
{ {
/* THIS LIST MUST REMAIN SORTED! */ /* THIS LIST MUST REMAIN SORTED! */
{ "backspace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BACKSPACE, 0 }, { "backspace", TERMO_TYPE_KEYSYM, TERMO_SYM_BACKSPACE, 0 },
{ "begin", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 }, { "begin", TERMO_TYPE_KEYSYM, TERMO_SYM_BEGIN, 0 },
{ "beg", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 }, { "beg", TERMO_TYPE_KEYSYM, TERMO_SYM_BEGIN, 0 },
{ "btab", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, TERMKEY_KEYMOD_SHIFT }, { "btab", TERMO_TYPE_KEYSYM, TERMO_SYM_TAB, TERMO_KEYMOD_SHIFT },
{ "cancel", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CANCEL, 0 }, { "cancel", TERMO_TYPE_KEYSYM, TERMO_SYM_CANCEL, 0 },
{ "clear", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLEAR, 0 }, { "clear", TERMO_TYPE_KEYSYM, TERMO_SYM_CLEAR, 0 },
{ "close", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLOSE, 0 }, { "close", TERMO_TYPE_KEYSYM, TERMO_SYM_CLOSE, 0 },
{ "command", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COMMAND, 0 }, { "command", TERMO_TYPE_KEYSYM, TERMO_SYM_COMMAND, 0 },
{ "copy", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COPY, 0 }, { "copy", TERMO_TYPE_KEYSYM, TERMO_SYM_COPY, 0 },
{ "dc", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE, 0 }, { "dc", TERMO_TYPE_KEYSYM, TERMO_SYM_DELETE, 0 },
{ "down", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, 0 }, { "down", TERMO_TYPE_KEYSYM, TERMO_SYM_DOWN, 0 },
{ "end", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 0 }, { "end", TERMO_TYPE_KEYSYM, TERMO_SYM_END, 0 },
{ "enter", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_ENTER, 0 }, { "enter", TERMO_TYPE_KEYSYM, TERMO_SYM_ENTER, 0 },
{ "exit", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_EXIT, 0 }, { "exit", TERMO_TYPE_KEYSYM, TERMO_SYM_EXIT, 0 },
{ "find", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND, 0 }, { "find", TERMO_TYPE_KEYSYM, TERMO_SYM_FIND, 0 },
{ "help", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HELP, 0 }, { "help", TERMO_TYPE_KEYSYM, TERMO_SYM_HELP, 0 },
{ "home", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 0 }, { "home", TERMO_TYPE_KEYSYM, TERMO_SYM_HOME, 0 },
{ "ic", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT, 0 }, { "ic", TERMO_TYPE_KEYSYM, TERMO_SYM_INSERT, 0 },
{ "left", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, 0 }, { "left", TERMO_TYPE_KEYSYM, TERMO_SYM_LEFT, 0 },
{ "mark", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MARK, 0 }, { "mark", TERMO_TYPE_KEYSYM, TERMO_SYM_MARK, 0 },
{ "message", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MESSAGE, 0 }, { "message", TERMO_TYPE_KEYSYM, TERMO_SYM_MESSAGE, 0 },
{ "mouse", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_NONE, 0 }, { "mouse", TERMO_TYPE_KEYSYM, TERMO_SYM_NONE, 0 },
{ "move", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MOVE, 0 }, { "move", TERMO_TYPE_KEYSYM, TERMO_SYM_MOVE, 0 },
// Not quite, but it's the best we can do // Not quite, but it's the best we can do
{ "next", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 }, { "next", TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEDOWN, 0 },
{ "npage", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 }, { "npage", TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEDOWN, 0 },
{ "open", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPEN, 0 }, { "open", TERMO_TYPE_KEYSYM, TERMO_SYM_OPEN, 0 },
{ "options", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPTIONS, 0 }, { "options", TERMO_TYPE_KEYSYM, TERMO_SYM_OPTIONS, 0 },
{ "ppage", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 }, { "ppage", TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEUP, 0 },
// Not quite, but it's the best we can do // Not quite, but it's the best we can do
{ "previous", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 }, { "previous", TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEUP, 0 },
{ "print", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PRINT, 0 }, { "print", TERMO_TYPE_KEYSYM, TERMO_SYM_PRINT, 0 },
{ "redo", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REDO, 0 }, { "redo", TERMO_TYPE_KEYSYM, TERMO_SYM_REDO, 0 },
{ "reference", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFERENCE, 0 }, { "reference", TERMO_TYPE_KEYSYM, TERMO_SYM_REFERENCE, 0 },
{ "refresh", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFRESH, 0 }, { "refresh", TERMO_TYPE_KEYSYM, TERMO_SYM_REFRESH, 0 },
{ "replace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REPLACE, 0 }, { "replace", TERMO_TYPE_KEYSYM, TERMO_SYM_REPLACE, 0 },
{ "restart", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESTART, 0 }, { "restart", TERMO_TYPE_KEYSYM, TERMO_SYM_RESTART, 0 },
{ "resume", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESUME, 0 }, { "resume", TERMO_TYPE_KEYSYM, TERMO_SYM_RESUME, 0 },
{ "right", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 0 }, { "right", TERMO_TYPE_KEYSYM, TERMO_SYM_RIGHT, 0 },
{ "save", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SAVE, 0 }, { "save", TERMO_TYPE_KEYSYM, TERMO_SYM_SAVE, 0 },
{ "select", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT, 0 }, { "select", TERMO_TYPE_KEYSYM, TERMO_SYM_SELECT, 0 },
{ "suspend", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SUSPEND, 0 }, { "suspend", TERMO_TYPE_KEYSYM, TERMO_SYM_SUSPEND, 0 },
{ "undo", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UNDO, 0 }, { "undo", TERMO_TYPE_KEYSYM, TERMO_SYM_UNDO, 0 },
{ "up", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, 0 }, { "up", TERMO_TYPE_KEYSYM, TERMO_SYM_UP, 0 },
{ NULL }, { NULL },
}; };
@ -508,7 +508,7 @@ func_compare (const void *key, const void *element)
static int static int
funcname2keysym (const char *funcname, funcname2keysym (const char *funcname,
termkey_type_t *typep, termkey_sym_t *symp, int *modmaskp, int *modsetp) termo_type_t *typep, termo_sym_t *symp, int *modmaskp, int *modsetp)
{ {
struct func *func = bsearch (funcname, funcs, struct func *func = bsearch (funcname, funcs,
sizeof funcs / sizeof funcs[0], sizeof funcs[0], func_compare); sizeof funcs / sizeof funcs[0], sizeof funcs[0], func_compare);
@ -523,7 +523,7 @@ funcname2keysym (const char *funcname,
if (funcname[0] == 'f' && isdigit (funcname[1])) if (funcname[0] == 'f' && isdigit (funcname[1]))
{ {
*typep = TERMKEY_TYPE_FUNCTION; *typep = TERMO_TYPE_FUNCTION;
*symp = atoi (funcname + 1); *symp = atoi (funcname + 1);
return 1; return 1;
} }
@ -532,8 +532,8 @@ funcname2keysym (const char *funcname,
if (funcname[0] == 's' && funcname2keysym if (funcname[0] == 's' && funcname2keysym
(funcname + 1, typep, symp, modmaskp, modsetp)) (funcname + 1, typep, symp, modmaskp, modsetp))
{ {
*modmaskp |= TERMKEY_KEYMOD_SHIFT; *modmaskp |= TERMO_KEYMOD_SHIFT;
*modsetp |= TERMKEY_KEYMOD_SHIFT; *modsetp |= TERMO_KEYMOD_SHIFT;
return 1; return 1;
} }
@ -546,7 +546,7 @@ funcname2keysym (const char *funcname,
} }
static int static int
insert_seq (termkey_ti_t *ti, const char *seq, trie_node_t *node) insert_seq (termo_ti_t *ti, const char *seq, trie_node_t *node)
{ {
int pos = 0; int pos = 0;
trie_node_t *p = ti->root; trie_node_t *p = ti->root;
@ -603,7 +603,7 @@ insert_seq (termkey_ti_t *ti, const char *seq, trie_node_t *node)
return 1; return 1;
} }
termkey_driver_t termkey_driver_ti = termo_driver_t termo_driver_ti =
{ {
.name = "terminfo", .name = "terminfo",
.new_driver = new_driver, .new_driver = new_driver,

View File

@ -1,8 +0,0 @@
#ifndef TERMKEY2_CONFIG_H
#define TERMKEY2_CONFIG_H
#define TERMKEY_VERSION_MAJOR @project_VERSION_MAJOR@
#define TERMKEY_VERSION_MINOR @project_VERSION_MINOR@
#endif // ! TERMKEY2_CONFIG_H

View File

@ -1,277 +0,0 @@
#ifndef TERMKEY2_H
#define TERMKEY2_H
#include <stdint.h>
#include <stdlib.h>
#include <limits.h>
#include "termkey2-config.h"
#define TERMKEY_CHECK_VERSION \
termkey_check_version (TERMKEY_VERSION_MAJOR, TERMKEY_VERSION_MINOR)
typedef enum termkey_sym termkey_sym_t;
enum termkey_sym
{
TERMKEY_SYM_UNKNOWN = -1,
TERMKEY_SYM_NONE = 0,
/* Special names in C0 */
TERMKEY_SYM_BACKSPACE,
TERMKEY_SYM_TAB,
TERMKEY_SYM_ENTER,
TERMKEY_SYM_ESCAPE,
/* Special names in G0 */
TERMKEY_SYM_SPACE,
TERMKEY_SYM_DEL,
/* Special keys */
TERMKEY_SYM_UP,
TERMKEY_SYM_DOWN,
TERMKEY_SYM_LEFT,
TERMKEY_SYM_RIGHT,
TERMKEY_SYM_BEGIN,
TERMKEY_SYM_FIND,
TERMKEY_SYM_INSERT,
TERMKEY_SYM_DELETE,
TERMKEY_SYM_SELECT,
TERMKEY_SYM_PAGEUP,
TERMKEY_SYM_PAGEDOWN,
TERMKEY_SYM_HOME,
TERMKEY_SYM_END,
/* Special keys from terminfo */
TERMKEY_SYM_CANCEL,
TERMKEY_SYM_CLEAR,
TERMKEY_SYM_CLOSE,
TERMKEY_SYM_COMMAND,
TERMKEY_SYM_COPY,
TERMKEY_SYM_EXIT,
TERMKEY_SYM_HELP,
TERMKEY_SYM_MARK,
TERMKEY_SYM_MESSAGE,
TERMKEY_SYM_MOVE,
TERMKEY_SYM_OPEN,
TERMKEY_SYM_OPTIONS,
TERMKEY_SYM_PRINT,
TERMKEY_SYM_REDO,
TERMKEY_SYM_REFERENCE,
TERMKEY_SYM_REFRESH,
TERMKEY_SYM_REPLACE,
TERMKEY_SYM_RESTART,
TERMKEY_SYM_RESUME,
TERMKEY_SYM_SAVE,
TERMKEY_SYM_SUSPEND,
TERMKEY_SYM_UNDO,
/* Numeric keypad special keys */
TERMKEY_SYM_KP0,
TERMKEY_SYM_KP1,
TERMKEY_SYM_KP2,
TERMKEY_SYM_KP3,
TERMKEY_SYM_KP4,
TERMKEY_SYM_KP5,
TERMKEY_SYM_KP6,
TERMKEY_SYM_KP7,
TERMKEY_SYM_KP8,
TERMKEY_SYM_KP9,
TERMKEY_SYM_KPENTER,
TERMKEY_SYM_KPPLUS,
TERMKEY_SYM_KPMINUS,
TERMKEY_SYM_KPMULT,
TERMKEY_SYM_KPDIV,
TERMKEY_SYM_KPCOMMA,
TERMKEY_SYM_KPPERIOD,
TERMKEY_SYM_KPEQUALS,
TERMKEY_N_SYMS
};
typedef enum termkey_type termkey_type_t;
enum termkey_type
{
TERMKEY_TYPE_KEY,
TERMKEY_TYPE_FUNCTION,
TERMKEY_TYPE_KEYSYM,
TERMKEY_TYPE_MOUSE,
TERMKEY_TYPE_POSITION,
TERMKEY_TYPE_MODEREPORT,
/* add other recognised types here */
TERMKEY_TYPE_UNKNOWN_CSI = -1
};
typedef enum termkey_result termkey_result_t;
enum termkey_result
{
TERMKEY_RES_NONE,
TERMKEY_RES_KEY,
TERMKEY_RES_EOF,
TERMKEY_RES_AGAIN,
TERMKEY_RES_ERROR
};
typedef enum termkey_mouse_event termkey_mouse_event_t;
enum termkey_mouse_event
{
TERMKEY_MOUSE_UNKNOWN,
TERMKEY_MOUSE_PRESS,
TERMKEY_MOUSE_DRAG,
TERMKEY_MOUSE_RELEASE
};
enum
{
TERMKEY_KEYMOD_SHIFT = 1 << 0,
TERMKEY_KEYMOD_ALT = 1 << 1,
TERMKEY_KEYMOD_CTRL = 1 << 2
};
typedef struct termkey_key termkey_key_t;
struct termkey_key
{
termkey_type_t type;
union
{
uint32_t codepoint; /* TERMKEY_TYPE_KEY */
int number; /* TERMKEY_TYPE_FUNCTION */
termkey_sym_t sym; /* TERMKEY_TYPE_KEYSYM */
/* TERMKEY_TYPE_MODEREPORT */
/* opaque, see termkey_interpret_modereport() */
struct { char initial; int mode, value; } mode;
/* TERMKEY_TYPE_MOUSE */
/* opaque, see termkey_interpret_mouse() */
struct { uint16_t x, y, info; } mouse;
} code;
int modifiers;
/* The raw multibyte sequence for the key */
char multibyte[MB_LEN_MAX + 1];
};
typedef struct termkey termkey_t;
enum
{
/* Do not interpret C0//DEL codes if possible */
TERMKEY_FLAG_NOINTERPRET = 1 << 0,
/* Convert KP codes to regular keypresses */
TERMKEY_FLAG_CONVERTKP = 1 << 1,
/* Don't try to decode the input characters */
TERMKEY_FLAG_RAW = 1 << 2,
/* Do not make initial termios calls on construction */
TERMKEY_FLAG_NOTERMIOS = 1 << 4,
/* Sets TERMKEY_CANON_SPACESYMBOL */
TERMKEY_FLAG_SPACESYMBOL = 1 << 5,
/* Allow Ctrl-C to be read as normal, disabling SIGINT */
TERMKEY_FLAG_CTRLC = 1 << 6,
/* Return ERROR on signal (EINTR) rather than retry */
TERMKEY_FLAG_EINTR = 1 << 7
};
enum
{
TERMKEY_CANON_SPACESYMBOL = 1 << 0, /* Space is symbolic rather than Unicode */
TERMKEY_CANON_DELBS = 1 << 1 /* Del is converted to Backspace */
};
void termkey_check_version (int major, int minor);
termkey_t *termkey_new (int fd, const char *encoding, int flags);
termkey_t *termkey_new_abstract (const char *term,
const char *encoding, int flags);
void termkey_free (termkey_t *tk);
void termkey_destroy (termkey_t *tk);
int termkey_start (termkey_t *tk);
int termkey_stop (termkey_t *tk);
int termkey_is_started (termkey_t *tk);
int termkey_get_fd (termkey_t *tk);
int termkey_get_flags (termkey_t *tk);
void termkey_set_flags (termkey_t *tk, int newflags);
int termkey_get_waittime (termkey_t *tk);
void termkey_set_waittime (termkey_t *tk, int msec);
int termkey_get_canonflags (termkey_t *tk);
void termkey_set_canonflags (termkey_t *tk, int flags);
size_t termkey_get_buffer_size (termkey_t *tk);
int termkey_set_buffer_size (termkey_t *tk, size_t size);
size_t termkey_get_buffer_remaining (termkey_t *tk);
void termkey_canonicalise (termkey_t *tk, termkey_key_t *key);
termkey_result_t termkey_getkey (termkey_t *tk, termkey_key_t *key);
termkey_result_t termkey_getkey_force (termkey_t *tk, termkey_key_t *key);
termkey_result_t termkey_waitkey (termkey_t *tk, termkey_key_t *key);
termkey_result_t termkey_advisereadable (termkey_t *tk);
size_t termkey_push_bytes (termkey_t *tk, const char *bytes, size_t len);
termkey_sym_t termkey_register_keyname (termkey_t *tk,
termkey_sym_t sym, const char *name);
const char *termkey_get_keyname (termkey_t *tk, termkey_sym_t sym);
const char *termkey_lookup_keyname (termkey_t *tk,
const char *str, termkey_sym_t *sym);
termkey_sym_t termkey_keyname2sym (termkey_t *tk, const char *keyname);
termkey_result_t termkey_interpret_mouse (termkey_t *tk,
const termkey_key_t *key, termkey_mouse_event_t *event,
int *button, int *line, int *col);
termkey_result_t termkey_interpret_position (termkey_t *tk,
const termkey_key_t *key, int *line, int *col);
termkey_result_t termkey_interpret_modereport (termkey_t *tk,
const termkey_key_t *key, int *initial, int *mode, int *value);
termkey_result_t termkey_interpret_csi (termkey_t *tk,
const termkey_key_t *key, long args[], size_t *nargs, unsigned long *cmd);
typedef enum termkey_format termkey_format_t;
enum termkey_format
{
/* Shift-... instead of S-... */
TERMKEY_FORMAT_LONGMOD = 1 << 0,
/* ^X instead of C-X */
TERMKEY_FORMAT_CARETCTRL = 1 << 1,
/* Meta- or M- instead of Alt- or A- */
TERMKEY_FORMAT_ALTISMETA = 1 << 2,
/* Wrap special keys in brackets like <Escape> */
TERMKEY_FORMAT_WRAPBRACKET = 1 << 3,
/* M Foo instead of M-Foo */
TERMKEY_FORMAT_SPACEMOD = 1 << 4,
/* meta or m instead of Meta or M */
TERMKEY_FORMAT_LOWERMOD = 1 << 5,
/* page down instead of PageDown */
TERMKEY_FORMAT_LOWERSPACE = 1 << 6,
/* Include mouse position if relevant; @ col,line */
TERMKEY_FORMAT_MOUSE_POS = 1 << 8
};
/* Some useful combinations */
#define TERMKEY_FORMAT_VIM (termkey_format_t) \
(TERMKEY_FORMAT_ALTISMETA | TERMKEY_FORMAT_WRAPBRACKET)
#define TERMKEY_FORMAT_URWID (termkey_format_t) \
(TERMKEY_FORMAT_LONGMOD | TERMKEY_FORMAT_ALTISMETA | \
TERMKEY_FORMAT_LOWERMOD | TERMKEY_FORMAT_SPACEMOD | \
TERMKEY_FORMAT_LOWERSPACE)
size_t termkey_strfkey (termkey_t *tk, char *buffer, size_t len,
termkey_key_t *key, termkey_format_t format);
const char *termkey_strpkey (termkey_t *tk, const char *str,
termkey_key_t *key, termkey_format_t format);
int termkey_keycmp (termkey_t *tk,
const termkey_key_t *key1, const termkey_key_t *key2);
#endif // ! TERMKEY2_H

8
termo-config.h.in Normal file
View File

@ -0,0 +1,8 @@
#ifndef TERMO_CONFIG_H
#define TERMO_CONFIG_H
#define TERMO_VERSION_MAJOR @project_VERSION_MAJOR@
#define TERMO_VERSION_MINOR @project_VERSION_MINOR@
#endif // ! TERMO_CONFIG_H

View File

@ -1,43 +1,43 @@
#ifndef TERMKEY2_INTERNAL_H #ifndef TERMO_INTERNAL_H
#define TERMKEY2_INTERNAL_H #define TERMO_INTERNAL_H
#include "termkey2.h" #include "termo.h"
#include <stdint.h> #include <stdint.h>
#include <termios.h> #include <termios.h>
#include <stdbool.h> #include <stdbool.h>
#include <iconv.h> #include <iconv.h>
typedef struct termkey_driver termkey_driver_t; typedef struct termo_driver termo_driver_t;
struct termkey_driver struct termo_driver
{ {
const char *name; const char *name;
void *(*new_driver) (termkey_t *tk, const char *term); void *(*new_driver) (termo_t *tk, const char *term);
void (*free_driver) (void *info); void (*free_driver) (void *info);
int (*start_driver) (termkey_t *tk, void *info); int (*start_driver) (termo_t *tk, void *info);
int (*stop_driver) (termkey_t *tk, void *info); int (*stop_driver) (termo_t *tk, void *info);
termkey_result_t (*peekkey) (termkey_t *tk, termo_result_t (*peekkey) (termo_t *tk,
void *info, termkey_key_t *key, int force, size_t *nbytes); void *info, termo_key_t *key, int force, size_t *nbytes);
}; };
typedef struct keyinfo keyinfo_t; typedef struct keyinfo keyinfo_t;
struct keyinfo struct keyinfo
{ {
termkey_type_t type; termo_type_t type;
termkey_sym_t sym; termo_sym_t sym;
int modifier_mask; int modifier_mask;
int modifier_set; int modifier_set;
}; };
typedef struct termkey_driver_node termkey_driver_node_t; typedef struct termo_driver_node termo_driver_node_t;
struct termkey_driver_node struct termo_driver_node
{ {
termkey_driver_t *driver; termo_driver_t *driver;
void *info; void *info;
termkey_driver_node_t *next; termo_driver_node_t *next;
}; };
struct termkey struct termo
{ {
int fd; int fd;
int flags; int flags;
@ -49,7 +49,7 @@ struct termkey
size_t buffsize; // Total malloc'ed size size_t buffsize; // Total malloc'ed size
// Position beyond buffstart at which peekkey() should next start. // Position beyond buffstart at which peekkey() should next start.
// Normally 0, but see also termkey_interpret_csi(). // Normally 0, but see also termo_interpret_csi().
size_t hightide; size_t hightide;
struct termios restore_termios; struct termios restore_termios;
@ -66,24 +66,24 @@ struct termkey
keyinfo_t c0[32]; // There are 32 C0 codes keyinfo_t c0[32]; // There are 32 C0 codes
iconv_t to_utf32_conv; iconv_t to_utf32_conv;
iconv_t from_utf32_conv; iconv_t from_utf32_conv;
termkey_driver_node_t *drivers; termo_driver_node_t *drivers;
// Now some "protected" methods for the driver to call but which we don't // Now some "protected" methods for the driver to call but which we don't
// want exported as real symbols in the library // want exported as real symbols in the library
struct struct
{ {
void (*emit_codepoint) (termkey_t *tk, void (*emit_codepoint) (termo_t *tk,
uint32_t codepoint, termkey_key_t *key); uint32_t codepoint, termo_key_t *key);
termkey_result_t (*peekkey_simple) (termkey_t *tk, termo_result_t (*peekkey_simple) (termo_t *tk,
termkey_key_t *key, int force, size_t *nbytes); termo_key_t *key, int force, size_t *nbytes);
termkey_result_t (*peekkey_mouse) (termkey_t *tk, termo_result_t (*peekkey_mouse) (termo_t *tk,
termkey_key_t *key, size_t *nbytes); termo_key_t *key, size_t *nbytes);
} }
method; method;
}; };
static inline void static inline void
termkey_key_get_linecol (const termkey_key_t *key, int *line, int *col) termo_key_get_linecol (const termo_key_t *key, int *line, int *col)
{ {
if (col) if (col)
*col = key->code.mouse.x; *col = key->code.mouse.x;
@ -93,7 +93,7 @@ termkey_key_get_linecol (const termkey_key_t *key, int *line, int *col)
} }
static inline void static inline void
termkey_key_set_linecol (termkey_key_t *key, int line, int col) termo_key_set_linecol (termo_key_t *key, int line, int col)
{ {
if (line > UINT16_MAX) if (line > UINT16_MAX)
line = UINT16_MAX; line = UINT16_MAX;
@ -105,8 +105,8 @@ termkey_key_set_linecol (termkey_key_t *key, int line, int col)
key->code.mouse.y = line; key->code.mouse.y = line;
} }
extern termkey_driver_t termkey_driver_csi; extern termo_driver_t termo_driver_csi;
extern termkey_driver_t termkey_driver_ti; extern termo_driver_t termo_driver_ti;
#endif // ! TERMKEY2_INTERNAL_H #endif // ! TERMO_INTERNAL_H

File diff suppressed because it is too large Load Diff

277
termo.h Normal file
View File

@ -0,0 +1,277 @@
#ifndef TERMO_H
#define TERMO_H
#include <stdint.h>
#include <stdlib.h>
#include <limits.h>
#include "termo-config.h"
#define TERMO_CHECK_VERSION \
termo_check_version (TERMO_VERSION_MAJOR, TERMO_VERSION_MINOR)
typedef enum termo_sym termo_sym_t;
enum termo_sym
{
TERMO_SYM_UNKNOWN = -1,
TERMO_SYM_NONE = 0,
/* Special names in C0 */
TERMO_SYM_BACKSPACE,
TERMO_SYM_TAB,
TERMO_SYM_ENTER,
TERMO_SYM_ESCAPE,
/* Special names in G0 */
TERMO_SYM_SPACE,
TERMO_SYM_DEL,
/* Special keys */
TERMO_SYM_UP,
TERMO_SYM_DOWN,
TERMO_SYM_LEFT,
TERMO_SYM_RIGHT,
TERMO_SYM_BEGIN,
TERMO_SYM_FIND,
TERMO_SYM_INSERT,
TERMO_SYM_DELETE,
TERMO_SYM_SELECT,
TERMO_SYM_PAGEUP,
TERMO_SYM_PAGEDOWN,
TERMO_SYM_HOME,
TERMO_SYM_END,
/* Special keys from terminfo */
TERMO_SYM_CANCEL,
TERMO_SYM_CLEAR,
TERMO_SYM_CLOSE,
TERMO_SYM_COMMAND,
TERMO_SYM_COPY,
TERMO_SYM_EXIT,
TERMO_SYM_HELP,
TERMO_SYM_MARK,
TERMO_SYM_MESSAGE,
TERMO_SYM_MOVE,
TERMO_SYM_OPEN,
TERMO_SYM_OPTIONS,
TERMO_SYM_PRINT,
TERMO_SYM_REDO,
TERMO_SYM_REFERENCE,
TERMO_SYM_REFRESH,
TERMO_SYM_REPLACE,
TERMO_SYM_RESTART,
TERMO_SYM_RESUME,
TERMO_SYM_SAVE,
TERMO_SYM_SUSPEND,
TERMO_SYM_UNDO,
/* Numeric keypad special keys */
TERMO_SYM_KP0,
TERMO_SYM_KP1,
TERMO_SYM_KP2,
TERMO_SYM_KP3,
TERMO_SYM_KP4,
TERMO_SYM_KP5,
TERMO_SYM_KP6,
TERMO_SYM_KP7,
TERMO_SYM_KP8,
TERMO_SYM_KP9,
TERMO_SYM_KPENTER,
TERMO_SYM_KPPLUS,
TERMO_SYM_KPMINUS,
TERMO_SYM_KPMULT,
TERMO_SYM_KPDIV,
TERMO_SYM_KPCOMMA,
TERMO_SYM_KPPERIOD,
TERMO_SYM_KPEQUALS,
TERMO_N_SYMS
};
typedef enum termo_type termo_type_t;
enum termo_type
{
TERMO_TYPE_KEY,
TERMO_TYPE_FUNCTION,
TERMO_TYPE_KEYSYM,
TERMO_TYPE_MOUSE,
TERMO_TYPE_POSITION,
TERMO_TYPE_MODEREPORT,
/* add other recognised types here */
TERMO_TYPE_UNKNOWN_CSI = -1
};
typedef enum termo_result termo_result_t;
enum termo_result
{
TERMO_RES_NONE,
TERMO_RES_KEY,
TERMO_RES_EOF,
TERMO_RES_AGAIN,
TERMO_RES_ERROR
};
typedef enum termo_mouse_event termo_mouse_event_t;
enum termo_mouse_event
{
TERMO_MOUSE_UNKNOWN,
TERMO_MOUSE_PRESS,
TERMO_MOUSE_DRAG,
TERMO_MOUSE_RELEASE
};
enum
{
TERMO_KEYMOD_SHIFT = 1 << 0,
TERMO_KEYMOD_ALT = 1 << 1,
TERMO_KEYMOD_CTRL = 1 << 2
};
typedef struct termo_key termo_key_t;
struct termo_key
{
termo_type_t type;
union
{
uint32_t codepoint; /* TERMO_TYPE_KEY */
int number; /* TERMO_TYPE_FUNCTION */
termo_sym_t sym; /* TERMO_TYPE_KEYSYM */
/* TERMO_TYPE_MODEREPORT */
/* opaque, see termo_interpret_modereport() */
struct { char initial; int mode, value; } mode;
/* TERMO_TYPE_MOUSE */
/* opaque, see termo_interpret_mouse() */
struct { uint16_t x, y, info; } mouse;
} code;
int modifiers;
/* The raw multibyte sequence for the key */
char multibyte[MB_LEN_MAX + 1];
};
typedef struct termo termo_t;
enum
{
/* Do not interpret C0//DEL codes if possible */
TERMO_FLAG_NOINTERPRET = 1 << 0,
/* Convert KP codes to regular keypresses */
TERMO_FLAG_CONVERTKP = 1 << 1,
/* Don't try to decode the input characters */
TERMO_FLAG_RAW = 1 << 2,
/* Do not make initial termios calls on construction */
TERMO_FLAG_NOTERMIOS = 1 << 4,
/* Sets TERMO_CANON_SPACESYMBOL */
TERMO_FLAG_SPACESYMBOL = 1 << 5,
/* Allow Ctrl-C to be read as normal, disabling SIGINT */
TERMO_FLAG_CTRLC = 1 << 6,
/* Return ERROR on signal (EINTR) rather than retry */
TERMO_FLAG_EINTR = 1 << 7
};
enum
{
TERMO_CANON_SPACESYMBOL = 1 << 0, /* Space is symbolic rather than Unicode */
TERMO_CANON_DELBS = 1 << 1 /* Del is converted to Backspace */
};
void termo_check_version (int major, int minor);
termo_t *termo_new (int fd, const char *encoding, int flags);
termo_t *termo_new_abstract (const char *term,
const char *encoding, int flags);
void termo_free (termo_t *tk);
void termo_destroy (termo_t *tk);
int termo_start (termo_t *tk);
int termo_stop (termo_t *tk);
int termo_is_started (termo_t *tk);
int termo_get_fd (termo_t *tk);
int termo_get_flags (termo_t *tk);
void termo_set_flags (termo_t *tk, int newflags);
int termo_get_waittime (termo_t *tk);
void termo_set_waittime (termo_t *tk, int msec);
int termo_get_canonflags (termo_t *tk);
void termo_set_canonflags (termo_t *tk, int flags);
size_t termo_get_buffer_size (termo_t *tk);
int termo_set_buffer_size (termo_t *tk, size_t size);
size_t termo_get_buffer_remaining (termo_t *tk);
void termo_canonicalise (termo_t *tk, termo_key_t *key);
termo_result_t termo_getkey (termo_t *tk, termo_key_t *key);
termo_result_t termo_getkey_force (termo_t *tk, termo_key_t *key);
termo_result_t termo_waitkey (termo_t *tk, termo_key_t *key);
termo_result_t termo_advisereadable (termo_t *tk);
size_t termo_push_bytes (termo_t *tk, const char *bytes, size_t len);
termo_sym_t termo_register_keyname (termo_t *tk,
termo_sym_t sym, const char *name);
const char *termo_get_keyname (termo_t *tk, termo_sym_t sym);
const char *termo_lookup_keyname (termo_t *tk,
const char *str, termo_sym_t *sym);
termo_sym_t termo_keyname2sym (termo_t *tk, const char *keyname);
termo_result_t termo_interpret_mouse (termo_t *tk,
const termo_key_t *key, termo_mouse_event_t *event,
int *button, int *line, int *col);
termo_result_t termo_interpret_position (termo_t *tk,
const termo_key_t *key, int *line, int *col);
termo_result_t termo_interpret_modereport (termo_t *tk,
const termo_key_t *key, int *initial, int *mode, int *value);
termo_result_t termo_interpret_csi (termo_t *tk,
const termo_key_t *key, long args[], size_t *nargs, unsigned long *cmd);
typedef enum termo_format termo_format_t;
enum termo_format
{
/* Shift-... instead of S-... */
TERMO_FORMAT_LONGMOD = 1 << 0,
/* ^X instead of C-X */
TERMO_FORMAT_CARETCTRL = 1 << 1,
/* Meta- or M- instead of Alt- or A- */
TERMO_FORMAT_ALTISMETA = 1 << 2,
/* Wrap special keys in brackets like <Escape> */
TERMO_FORMAT_WRAPBRACKET = 1 << 3,
/* M Foo instead of M-Foo */
TERMO_FORMAT_SPACEMOD = 1 << 4,
/* meta or m instead of Meta or M */
TERMO_FORMAT_LOWERMOD = 1 << 5,
/* page down instead of PageDown */
TERMO_FORMAT_LOWERSPACE = 1 << 6,
/* Include mouse position if relevant; @ col,line */
TERMO_FORMAT_MOUSE_POS = 1 << 8
};
/* Some useful combinations */
#define TERMO_FORMAT_VIM (termo_format_t) \
(TERMO_FORMAT_ALTISMETA | TERMO_FORMAT_WRAPBRACKET)
#define TERMO_FORMAT_URWID (termo_format_t) \
(TERMO_FORMAT_LONGMOD | TERMO_FORMAT_ALTISMETA | \
TERMO_FORMAT_LOWERMOD | TERMO_FORMAT_SPACEMOD | \
TERMO_FORMAT_LOWERSPACE)
size_t termo_strfkey (termo_t *tk, char *buffer, size_t len,
termo_key_t *key, termo_format_t format);
const char *termo_strpkey (termo_t *tk, const char *str,
termo_key_t *key, termo_format_t format);
int termo_keycmp (termo_t *tk,
const termo_key_t *key1, const termo_key_t *key2);
#endif // ! TERMO_H