Rename to termo
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
			
		||||
project (termkey2 C)
 | 
			
		||||
project (termo C)
 | 
			
		||||
cmake_minimum_required (VERSION 2.8.5)
 | 
			
		||||
 | 
			
		||||
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})
 | 
			
		||||
 | 
			
		||||
# Names
 | 
			
		||||
set (project_LIB_NAME "termkey2-${project_API_VERSION}")
 | 
			
		||||
set (project_INCLUDE_NAME "termkey2-${project_API_VERSION}")
 | 
			
		||||
set (project_CMAKE_NAME "TermKey2")
 | 
			
		||||
set (project_LIB_NAME "termo-${project_API_VERSION}")
 | 
			
		||||
set (project_INCLUDE_NAME "termo-${project_API_VERSION}")
 | 
			
		||||
set (project_CMAKE_NAME "Termo")
 | 
			
		||||
 | 
			
		||||
# Dependecies
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
# Header files with configuration
 | 
			
		||||
configure_file (${PROJECT_SOURCE_DIR}/termkey2-config.h.in
 | 
			
		||||
	${PROJECT_BINARY_DIR}/termkey2-config.h)
 | 
			
		||||
configure_file (${PROJECT_SOURCE_DIR}/termo-config.h.in
 | 
			
		||||
	${PROJECT_BINARY_DIR}/termo-config.h)
 | 
			
		||||
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
 | 
			
		||||
 | 
			
		||||
# Project source files
 | 
			
		||||
set (lib_sources
 | 
			
		||||
	termkey2.c
 | 
			
		||||
	termo.c
 | 
			
		||||
	driver-csi.c
 | 
			
		||||
	driver-ti.c)
 | 
			
		||||
set (lib_headers
 | 
			
		||||
	termkey2.h
 | 
			
		||||
	termkey2-internal.h
 | 
			
		||||
	${PROJECT_BINARY_DIR}/termkey2-config.h)
 | 
			
		||||
	termo.h
 | 
			
		||||
	termo-internal.h
 | 
			
		||||
	${PROJECT_BINARY_DIR}/termo-config.h)
 | 
			
		||||
 | 
			
		||||
# Project libraries
 | 
			
		||||
if (unibilium_FOUND)
 | 
			
		||||
@@ -56,33 +56,33 @@ else (CURSES_FOUND)
 | 
			
		||||
endif (unibilium_FOUND)
 | 
			
		||||
 | 
			
		||||
# Create the library targets
 | 
			
		||||
add_library (termkey2 SHARED ${lib_sources} ${lib_headers})
 | 
			
		||||
target_link_libraries (termkey2 ${lib_libraries})
 | 
			
		||||
set_target_properties (termkey2 PROPERTIES
 | 
			
		||||
add_library (termo SHARED ${lib_sources} ${lib_headers})
 | 
			
		||||
target_link_libraries (termo ${lib_libraries})
 | 
			
		||||
set_target_properties (termo PROPERTIES
 | 
			
		||||
	OUTPUT_NAME ${project_LIB_NAME}
 | 
			
		||||
	VERSION ${project_VERSION}
 | 
			
		||||
	SOVERSION ${project_API_VERSION})
 | 
			
		||||
 | 
			
		||||
add_library (termkey2-static STATIC ${lib_sources} ${lib_headers})
 | 
			
		||||
target_link_libraries (termkey2-static ${lib_libraries})
 | 
			
		||||
set_target_properties (termkey2-static PROPERTIES
 | 
			
		||||
add_library (termo-static STATIC ${lib_sources} ${lib_headers})
 | 
			
		||||
target_link_libraries (termo-static ${lib_libraries})
 | 
			
		||||
set_target_properties (termo-static PROPERTIES
 | 
			
		||||
	OUTPUT_NAME ${project_LIB_NAME}
 | 
			
		||||
	VERSION ${project_VERSION}
 | 
			
		||||
	SOVERSION ${project_API_VERSION})
 | 
			
		||||
 | 
			
		||||
# Demos
 | 
			
		||||
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)
 | 
			
		||||
target_link_libraries (demo termkey2-static ${lib_libraries})
 | 
			
		||||
target_link_libraries (demo termo-static ${lib_libraries})
 | 
			
		||||
 | 
			
		||||
set (demos demo demo-async)
 | 
			
		||||
if (glib_FOUND)
 | 
			
		||||
	include_directories (${glib_INCLUDE_DIRS})
 | 
			
		||||
	add_executable (demo-glib EXCLUDE_FROM_ALL demo-glib.c)
 | 
			
		||||
	target_link_libraries (demo
 | 
			
		||||
		termkey2-static ${lib_libraries} ${glib_LIBRARIES})
 | 
			
		||||
		termo-static ${lib_libraries} ${glib_LIBRARIES})
 | 
			
		||||
	list (APPEND demos demo-glib)
 | 
			
		||||
endif (glib_FOUND)
 | 
			
		||||
 | 
			
		||||
@@ -90,9 +90,9 @@ add_custom_target (demos DEPENDS ${demos})
 | 
			
		||||
 | 
			
		||||
# The files to be installed
 | 
			
		||||
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 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})
 | 
			
		||||
 | 
			
		||||
# Configuration for other CMake projects
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								README
									
									
									
									
									
								
							@@ -1,9 +1,9 @@
 | 
			
		||||
termkey2
 | 
			
		||||
========
 | 
			
		||||
termo
 | 
			
		||||
=====
 | 
			
		||||
 | 
			
		||||
`termkey2' is a library providing an alternative to ncurses' handling of
 | 
			
		||||
terminal input.  ncurses does a really terrible job at that, mainly wrt. mouse
 | 
			
		||||
support which seems to be utterly broken.  If you can drag things in a terminal
 | 
			
		||||
`termo' is a library providing an alternative to ncurses' handling of terminal
 | 
			
		||||
input.  ncurses does a really terrible job at that, mainly wrt. mouse support
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
 $ cd build
 | 
			
		||||
 $ 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:
 | 
			
		||||
 $ 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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
-------
 | 
			
		||||
`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
 | 
			
		||||
<p.janouch@gmail.com>.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,5 +4,5 @@
 | 
			
		||||
#    @project_CMAKE_NAME@_LIBRARIES
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								demo-async.c
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								demo-async.c
									
									
									
									
									
								
							@@ -6,13 +6,13 @@
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
 | 
			
		||||
#include "termkey2.h"
 | 
			
		||||
#include "termo.h"
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_key (termkey_t *tk, termkey_key_t *key)
 | 
			
		||||
on_key (termo_t *tk, termo_key_t *key)
 | 
			
		||||
{
 | 
			
		||||
	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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -22,23 +22,23 @@ main (int argc, char *argv[])
 | 
			
		||||
	(void) argc;
 | 
			
		||||
	(void) argv;
 | 
			
		||||
 | 
			
		||||
	TERMKEY_CHECK_VERSION;
 | 
			
		||||
	TERMO_CHECK_VERSION;
 | 
			
		||||
	setlocale (LC_CTYPE, "");
 | 
			
		||||
 | 
			
		||||
	termkey_t *tk = termkey_new (STDIN_FILENO, NULL, 0);
 | 
			
		||||
	termo_t *tk = termo_new (STDIN_FILENO, NULL, 0);
 | 
			
		||||
 | 
			
		||||
	if (!tk)
 | 
			
		||||
	{
 | 
			
		||||
		fprintf (stderr, "Cannot allocate termkey instance\n");
 | 
			
		||||
		fprintf (stderr, "Cannot allocate termo instance\n");
 | 
			
		||||
		exit (1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
	termkey_result_t ret;
 | 
			
		||||
	termkey_key_t key;
 | 
			
		||||
	termo_result_t ret;
 | 
			
		||||
	termo_key_t key;
 | 
			
		||||
 | 
			
		||||
	int running = 1;
 | 
			
		||||
	int nextwait = -1;
 | 
			
		||||
@@ -47,27 +47,27 @@ main (int argc, char *argv[])
 | 
			
		||||
	{
 | 
			
		||||
		if (poll (&fd, 1, nextwait) == 0)
 | 
			
		||||
			// Timed out
 | 
			
		||||
			if (termkey_getkey_force (tk, &key) == TERMKEY_RES_KEY)
 | 
			
		||||
			if (termo_getkey_force (tk, &key) == TERMO_RES_KEY)
 | 
			
		||||
				on_key (tk, &key);
 | 
			
		||||
 | 
			
		||||
		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);
 | 
			
		||||
 | 
			
		||||
			if (key.type == TERMKEY_TYPE_KEY
 | 
			
		||||
			 && (key.modifiers & TERMKEY_KEYMOD_CTRL)
 | 
			
		||||
			if (key.type == TERMO_TYPE_KEY
 | 
			
		||||
			 && (key.modifiers & TERMO_KEYMOD_CTRL)
 | 
			
		||||
			 && (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
 | 
			
		||||
				running = 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (ret == TERMKEY_RES_AGAIN)
 | 
			
		||||
			nextwait = termkey_get_waittime (tk);
 | 
			
		||||
		if (ret == TERMO_RES_AGAIN)
 | 
			
		||||
			nextwait = termo_get_waittime (tk);
 | 
			
		||||
		else
 | 
			
		||||
			nextwait = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	termkey_destroy (tk);
 | 
			
		||||
	termo_destroy (tk);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								demo-glib.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								demo-glib.c
									
									
									
									
									
								
							@@ -3,24 +3,24 @@
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
 | 
			
		||||
#include "termkey2.h"
 | 
			
		||||
#include "termo.h"
 | 
			
		||||
 | 
			
		||||
static termkey_t *tk;
 | 
			
		||||
static termo_t *tk;
 | 
			
		||||
static int timeout_id;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_key (termkey_t *tk, termkey_key_t *key)
 | 
			
		||||
on_key (termo_t *tk, termo_key_t *key)
 | 
			
		||||
{
 | 
			
		||||
	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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
key_timer (gpointer data)
 | 
			
		||||
{
 | 
			
		||||
	termkey_key_t key;
 | 
			
		||||
	if (termkey_getkey_force (tk, &key) == TERMKEY_RES_KEY)
 | 
			
		||||
	termo_key_t key;
 | 
			
		||||
	if (termo_getkey_force (tk, &key) == TERMO_RES_KEY)
 | 
			
		||||
		on_key (tk, &key);
 | 
			
		||||
	return FALSE;
 | 
			
		||||
}
 | 
			
		||||
@@ -33,16 +33,16 @@ stdin_io (GIOChannel *source, GIOCondition condition, gpointer data)
 | 
			
		||||
		if (timeout_id)
 | 
			
		||||
			g_source_remove (timeout_id);
 | 
			
		||||
 | 
			
		||||
		termkey_advisereadable (tk);
 | 
			
		||||
		termo_advisereadable (tk);
 | 
			
		||||
 | 
			
		||||
		termkey_result_t ret;
 | 
			
		||||
		termkey_key_t key;
 | 
			
		||||
		while ((ret = termkey_getkey (tk, &key)) == TERMKEY_RES_KEY)
 | 
			
		||||
		termo_result_t ret;
 | 
			
		||||
		termo_key_t key;
 | 
			
		||||
		while ((ret = termo_getkey (tk, &key)) == TERMO_RES_KEY)
 | 
			
		||||
			on_key (tk, &key);
 | 
			
		||||
 | 
			
		||||
		if (ret == TERMKEY_RES_AGAIN)
 | 
			
		||||
		if (ret == TERMO_RES_AGAIN)
 | 
			
		||||
			timeout_id = g_timeout_add
 | 
			
		||||
				(termkey_get_waittime (tk), key_timer, NULL);
 | 
			
		||||
				(termo_get_waittime (tk), key_timer, NULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return TRUE;
 | 
			
		||||
@@ -54,13 +54,13 @@ main (int argc, char *argv[])
 | 
			
		||||
	(void) argc;
 | 
			
		||||
	(void) argv;
 | 
			
		||||
 | 
			
		||||
	TERMKEY_CHECK_VERSION;
 | 
			
		||||
	TERMO_CHECK_VERSION;
 | 
			
		||||
	setlocale (LC_CTYPE, "");
 | 
			
		||||
 | 
			
		||||
	tk = termkey_new (STDIN_FILENO, NULL, 0);
 | 
			
		||||
	tk = termo_new (STDIN_FILENO, NULL, 0);
 | 
			
		||||
	if (!tk)
 | 
			
		||||
	{
 | 
			
		||||
		fprintf (stderr, "Cannot allocate termkey instance\n");
 | 
			
		||||
		fprintf (stderr, "Cannot allocate termo instance\n");
 | 
			
		||||
		exit (1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -68,5 +68,5 @@ main (int argc, char *argv[])
 | 
			
		||||
	g_io_add_watch (g_io_channel_unix_new (STDIN_FILENO),
 | 
			
		||||
		G_IO_IN, stdin_io, NULL);
 | 
			
		||||
	g_main_loop_run (loop);
 | 
			
		||||
	termkey_destroy (tk);
 | 
			
		||||
	termo_destroy (tk);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										54
									
								
								demo.c
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								demo.c
									
									
									
									
									
								
							@@ -6,20 +6,20 @@
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
 | 
			
		||||
#include "termkey2.h"
 | 
			
		||||
#include "termo.h"
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
	TERMKEY_CHECK_VERSION;
 | 
			
		||||
	TERMO_CHECK_VERSION;
 | 
			
		||||
	setlocale (LC_CTYPE, "");
 | 
			
		||||
 | 
			
		||||
	int mouse = 0;
 | 
			
		||||
	int mouse_proto = 0;
 | 
			
		||||
	termkey_format_t format = TERMKEY_FORMAT_VIM;
 | 
			
		||||
	termo_format_t format = TERMO_FORMAT_VIM;
 | 
			
		||||
 | 
			
		||||
	char buffer[50];
 | 
			
		||||
	termkey_t *tk;
 | 
			
		||||
	termo_t *tk;
 | 
			
		||||
 | 
			
		||||
	int opt;
 | 
			
		||||
	while ((opt = getopt (argc, argv, "m::p:")) != -1)
 | 
			
		||||
@@ -43,21 +43,21 @@ main(int argc, char *argv[])
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tk = termkey_new (STDIN_FILENO, NULL,
 | 
			
		||||
		TERMKEY_FLAG_SPACESYMBOL | TERMKEY_FLAG_CTRLC);
 | 
			
		||||
	tk = termo_new (STDIN_FILENO, NULL,
 | 
			
		||||
		TERMO_FLAG_SPACESYMBOL | TERMO_FLAG_CTRLC);
 | 
			
		||||
	if (!tk)
 | 
			
		||||
	{
 | 
			
		||||
		fprintf (stderr, "Cannot allocate termkey instance\n");
 | 
			
		||||
		fprintf (stderr, "Cannot allocate termo instance\n");
 | 
			
		||||
		exit (1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (termkey_get_flags (tk) & TERMKEY_FLAG_RAW)
 | 
			
		||||
	if (termo_get_flags (tk) & TERMO_FLAG_RAW)
 | 
			
		||||
		printf ("Termkey in RAW mode\n");
 | 
			
		||||
	else
 | 
			
		||||
		printf ("Termkey in multibyte mode\n");
 | 
			
		||||
 | 
			
		||||
	termkey_result_t ret;
 | 
			
		||||
	termkey_key_t key;
 | 
			
		||||
	termo_result_t ret;
 | 
			
		||||
	termo_key_t key;
 | 
			
		||||
 | 
			
		||||
	if (mouse)
 | 
			
		||||
	{
 | 
			
		||||
@@ -66,38 +66,38 @@ main(int argc, char *argv[])
 | 
			
		||||
			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);
 | 
			
		||||
			if (key.type == TERMKEY_TYPE_MOUSE)
 | 
			
		||||
			termo_strfkey (tk, buffer, sizeof buffer, &key, format);
 | 
			
		||||
			if (key.type == TERMO_TYPE_MOUSE)
 | 
			
		||||
			{
 | 
			
		||||
				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);
 | 
			
		||||
			}
 | 
			
		||||
			else if (key.type == TERMKEY_TYPE_POSITION)
 | 
			
		||||
			else if (key.type == TERMO_TYPE_POSITION)
 | 
			
		||||
			{
 | 
			
		||||
				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",
 | 
			
		||||
					line, col);
 | 
			
		||||
			}
 | 
			
		||||
			else if (key.type == TERMKEY_TYPE_MODEREPORT)
 | 
			
		||||
			else if (key.type == TERMO_TYPE_MODEREPORT)
 | 
			
		||||
			{
 | 
			
		||||
				int initial, mode, value;
 | 
			
		||||
				termkey_interpret_modereport
 | 
			
		||||
				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 == TERMKEY_TYPE_UNKNOWN_CSI)
 | 
			
		||||
			else if (key.type == TERMO_TYPE_UNKNOWN_CSI)
 | 
			
		||||
			{
 | 
			
		||||
				long args[16];
 | 
			
		||||
				size_t nargs = 16;
 | 
			
		||||
				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",
 | 
			
		||||
					(char) (command >> 8), args[0], args[1],
 | 
			
		||||
					(char) (command >> 16), (char) command);
 | 
			
		||||
@@ -105,12 +105,12 @@ main(int argc, char *argv[])
 | 
			
		||||
			else
 | 
			
		||||
				printf ("Key %s\n", buffer);
 | 
			
		||||
 | 
			
		||||
			if (key.type == TERMKEY_TYPE_KEY
 | 
			
		||||
			 && key.modifiers & TERMKEY_KEYMOD_CTRL
 | 
			
		||||
			if (key.type == TERMO_TYPE_KEY
 | 
			
		||||
			 && key.modifiers & TERMO_KEYMOD_CTRL
 | 
			
		||||
			 && (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			if (key.type == TERMKEY_TYPE_KEY
 | 
			
		||||
			if (key.type == TERMO_TYPE_KEY
 | 
			
		||||
			 && key.modifiers == 0
 | 
			
		||||
			 && key.code.codepoint == '?')
 | 
			
		||||
			{
 | 
			
		||||
@@ -119,11 +119,11 @@ main(int argc, char *argv[])
 | 
			
		||||
				fflush (stdout);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else if (ret == TERMKEY_RES_ERROR)
 | 
			
		||||
		else if (ret == TERMO_RES_ERROR)
 | 
			
		||||
		{
 | 
			
		||||
			if (errno != EINTR)
 | 
			
		||||
			{
 | 
			
		||||
				perror ("termkey_waitkey");
 | 
			
		||||
				perror ("termo_waitkey");
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
			printf ("Interrupted by signal\n");
 | 
			
		||||
@@ -133,5 +133,5 @@ main(int argc, char *argv[])
 | 
			
		||||
	if (mouse)
 | 
			
		||||
		printf ("\033[?%dlMouse mode deactivated\n", mouse);
 | 
			
		||||
 | 
			
		||||
	termkey_destroy (tk);
 | 
			
		||||
	termo_destroy (tk);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										398
									
								
								driver-csi.c
									
									
									
									
									
								
							
							
						
						
									
										398
									
								
								driver-csi.c
									
									
									
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
#include "termkey2.h"
 | 
			
		||||
#include "termkey2-internal.h"
 | 
			
		||||
#include "termo.h"
 | 
			
		||||
#include "termo-internal.h"
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
@@ -11,12 +11,12 @@ static char ss3_kpalts[64];
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	termkey_t *tk;
 | 
			
		||||
	termo_t *tk;
 | 
			
		||||
}
 | 
			
		||||
termkey_csi_t;
 | 
			
		||||
termo_csi_t;
 | 
			
		||||
 | 
			
		||||
typedef termkey_result_t (*csi_handler_fn)
 | 
			
		||||
	(termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args);
 | 
			
		||||
typedef termo_result_t (*csi_handler_fn)
 | 
			
		||||
	(termo_t *tk, termo_key_t *key, int cmd, long *arg, int args);
 | 
			
		||||
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 termkey_result_t
 | 
			
		||||
handle_csi_ss3_full (termkey_t *tk,
 | 
			
		||||
	termkey_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
handle_csi_ss3_full (termo_t *tk,
 | 
			
		||||
	termo_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
{
 | 
			
		||||
	(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_set;
 | 
			
		||||
 | 
			
		||||
	if (key->code.sym == TERMKEY_SYM_UNKNOWN)
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
	return TERMKEY_RES_KEY;
 | 
			
		||||
	if (key->code.sym == TERMO_SYM_UNKNOWN)
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
	return TERMO_RES_KEY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
	if (cmd < 0x40 || cmd >= 0x80)
 | 
			
		||||
@@ -62,7 +62,7 @@ register_csi_ss3_full (termkey_type_t type, termkey_sym_t sym,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
@@ -72,7 +72,7 @@ register_csi_ss3 (termkey_type_t type, termkey_sym_t sym, unsigned char cmd)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
	if (cmd < 0x40 || cmd >= 0x80)
 | 
			
		||||
@@ -94,8 +94,8 @@ register_ss3kpalt (termkey_type_t type, termkey_sym_t sym,
 | 
			
		||||
static struct keyinfo csifuncs[35];
 | 
			
		||||
#define NCSIFUNCS ((long) (sizeof csifuncs / sizeof csifuncs[0]))
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
handle_csifunc (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
handle_csifunc (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
{
 | 
			
		||||
	(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;
 | 
			
		||||
	else
 | 
			
		||||
		key->modifiers = 0;
 | 
			
		||||
	key->type = TERMKEY_TYPE_KEYSYM;
 | 
			
		||||
	key->type = TERMO_TYPE_KEYSYM;
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
	}
 | 
			
		||||
	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
 | 
			
		||||
		fprintf (stderr, "CSI: Unknown function key %ld\n", arg[0]);
 | 
			
		||||
#endif
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return TERMKEY_RES_KEY;
 | 
			
		||||
	return TERMO_RES_KEY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
		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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
handle_csi_caret (termkey_t *tk,
 | 
			
		||||
	termkey_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
handle_csi_caret (termo_t *tk,
 | 
			
		||||
	termo_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
{
 | 
			
		||||
	switch (cmd)
 | 
			
		||||
	{
 | 
			
		||||
	case '^':
 | 
			
		||||
	{
 | 
			
		||||
		termkey_result_t res = handle_csifunc (tk, key, cmd, arg, args);
 | 
			
		||||
		if (res == TERMKEY_RES_KEY)
 | 
			
		||||
			key->modifiers |= TERMKEY_KEYMOD_CTRL;
 | 
			
		||||
		termo_result_t res = handle_csifunc (tk, key, cmd, arg, args);
 | 
			
		||||
		if (res == TERMO_RES_KEY)
 | 
			
		||||
			key->modifiers |= TERMO_KEYMOD_CTRL;
 | 
			
		||||
		return res;
 | 
			
		||||
	}
 | 
			
		||||
	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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
handle_csi_u (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
handle_csi_u (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
{
 | 
			
		||||
	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;
 | 
			
		||||
 | 
			
		||||
		int mod = key->modifiers;
 | 
			
		||||
		key->type = TERMKEY_TYPE_KEYSYM;
 | 
			
		||||
		key->type = TERMO_TYPE_KEYSYM;
 | 
			
		||||
		(*tk->method.emit_codepoint) (tk, arg[0], key);
 | 
			
		||||
		key->modifiers |= mod;
 | 
			
		||||
		return TERMKEY_RES_KEY;
 | 
			
		||||
		return TERMO_RES_KEY;
 | 
			
		||||
	}
 | 
			
		||||
	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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
handle_csi_m (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
handle_csi_m (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
{
 | 
			
		||||
	(void) tk;
 | 
			
		||||
 | 
			
		||||
@@ -214,57 +214,57 @@ handle_csi_m (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
	case 'm':
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!initial && args >= 3)
 | 
			
		||||
	{
 | 
			
		||||
		// rxvt protocol
 | 
			
		||||
		key->type = TERMKEY_TYPE_MOUSE;
 | 
			
		||||
		key->type = TERMO_TYPE_MOUSE;
 | 
			
		||||
		key->code.mouse.info = arg[0] - 0x20;
 | 
			
		||||
 | 
			
		||||
		key->modifiers = (key->code.mouse.info & 0x1c) >> 2;
 | 
			
		||||
		key->code.mouse.info &= ~0x1c;
 | 
			
		||||
 | 
			
		||||
		termkey_key_set_linecol (key, arg[2] - 1, arg[1] - 1);
 | 
			
		||||
		return TERMKEY_RES_KEY;
 | 
			
		||||
		termo_key_set_linecol (key, arg[2] - 1, arg[1] - 1);
 | 
			
		||||
		return TERMO_RES_KEY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (initial == '<' && args >= 3)
 | 
			
		||||
	{
 | 
			
		||||
		// SGR protocol
 | 
			
		||||
		key->type = TERMKEY_TYPE_MOUSE;
 | 
			
		||||
		key->type = TERMO_TYPE_MOUSE;
 | 
			
		||||
		key->code.mouse.info = arg[0];
 | 
			
		||||
 | 
			
		||||
		key->modifiers = (key->code.mouse.info & 0x1c) >> 2;
 | 
			
		||||
		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
 | 
			
		||||
			key->code.mouse.info |= 0x8000;
 | 
			
		||||
		return TERMKEY_RES_KEY;
 | 
			
		||||
		return TERMO_RES_KEY;
 | 
			
		||||
	}
 | 
			
		||||
	return TERMKEY_RES_NONE;
 | 
			
		||||
	return TERMO_RES_NONE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
	(void) tk;
 | 
			
		||||
 | 
			
		||||
	if (key->type != TERMKEY_TYPE_MOUSE)
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
	if (key->type != TERMO_TYPE_MOUSE)
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
 | 
			
		||||
	if (button)
 | 
			
		||||
		*button = 0;
 | 
			
		||||
 | 
			
		||||
	termkey_key_get_linecol (key, line, col);
 | 
			
		||||
	termo_key_get_linecol (key, line, col);
 | 
			
		||||
 | 
			
		||||
	// XXX: WTF is this logic?
 | 
			
		||||
	if (!event)
 | 
			
		||||
		return TERMKEY_RES_KEY;
 | 
			
		||||
		return TERMO_RES_KEY;
 | 
			
		||||
 | 
			
		||||
	int btn = 0;
 | 
			
		||||
	int code = key->code.mouse.info;
 | 
			
		||||
@@ -276,30 +276,30 @@ termkey_interpret_mouse (termkey_t *tk, const termkey_key_t *key,
 | 
			
		||||
	case 0:
 | 
			
		||||
	case 1:
 | 
			
		||||
	case 2:
 | 
			
		||||
		*event = drag ? TERMKEY_MOUSE_DRAG : TERMKEY_MOUSE_PRESS;
 | 
			
		||||
		*event = drag ? TERMO_MOUSE_DRAG : TERMO_MOUSE_PRESS;
 | 
			
		||||
		btn = code + 1;
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case 3:
 | 
			
		||||
		*event = TERMKEY_MOUSE_RELEASE;
 | 
			
		||||
		*event = TERMO_MOUSE_RELEASE;
 | 
			
		||||
		// no button hint
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case 64:
 | 
			
		||||
	case 65:
 | 
			
		||||
		*event = drag ? TERMKEY_MOUSE_DRAG : TERMKEY_MOUSE_PRESS;
 | 
			
		||||
		*event = drag ? TERMO_MOUSE_DRAG : TERMO_MOUSE_PRESS;
 | 
			
		||||
		btn = code + 4 - 64;
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		*event = TERMKEY_MOUSE_UNKNOWN;
 | 
			
		||||
		*event = TERMO_MOUSE_UNKNOWN;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (button)
 | 
			
		||||
		*button = btn;
 | 
			
		||||
	if (key->code.mouse.info & 0x8000)
 | 
			
		||||
		*event = TERMKEY_MOUSE_RELEASE;
 | 
			
		||||
	return TERMKEY_RES_KEY;
 | 
			
		||||
		*event = TERMO_MOUSE_RELEASE;
 | 
			
		||||
	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>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
handle_csi_R (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
handle_csi_R (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
{
 | 
			
		||||
	switch (cmd)
 | 
			
		||||
	{
 | 
			
		||||
	case 'R' | '?' << 8:
 | 
			
		||||
		if (args < 2)
 | 
			
		||||
			return TERMKEY_RES_NONE;
 | 
			
		||||
			return TERMO_RES_NONE;
 | 
			
		||||
 | 
			
		||||
		key->type = TERMKEY_TYPE_POSITION;
 | 
			
		||||
		termkey_key_set_linecol (key, arg[1], arg[0]);
 | 
			
		||||
		return TERMKEY_RES_KEY;
 | 
			
		||||
		key->type = TERMO_TYPE_POSITION;
 | 
			
		||||
		termo_key_set_linecol (key, arg[1], arg[0]);
 | 
			
		||||
		return TERMO_RES_KEY;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		return handle_csi_ss3_full (tk, key, cmd, arg, args);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
termkey_result_t
 | 
			
		||||
termkey_interpret_position (termkey_t *tk,
 | 
			
		||||
	const termkey_key_t *key, int *line, int *col)
 | 
			
		||||
termo_result_t
 | 
			
		||||
termo_interpret_position (termo_t *tk,
 | 
			
		||||
	const termo_key_t *key, int *line, int *col)
 | 
			
		||||
{
 | 
			
		||||
	(void) tk;
 | 
			
		||||
 | 
			
		||||
	if (key->type != TERMKEY_TYPE_POSITION)
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
	if (key->type != TERMO_TYPE_POSITION)
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
 | 
			
		||||
	termkey_key_get_linecol (key, line, col);
 | 
			
		||||
	return TERMKEY_RES_KEY;
 | 
			
		||||
	termo_key_get_linecol (key, line, col);
 | 
			
		||||
	return TERMO_RES_KEY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Handler for CSI $y mode status reports
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
handle_csi_y (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
handle_csi_y (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
 | 
			
		||||
{
 | 
			
		||||
	(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 | '?' << 8:
 | 
			
		||||
		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.mode = arg[0];
 | 
			
		||||
		key->code.mode.value = arg[1];
 | 
			
		||||
		return TERMKEY_RES_KEY;
 | 
			
		||||
		return TERMO_RES_KEY;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
termkey_result_t
 | 
			
		||||
termkey_interpret_modereport (termkey_t *tk,
 | 
			
		||||
	const termkey_key_t *key, int *initial, int *mode, int *value)
 | 
			
		||||
termo_result_t
 | 
			
		||||
termo_interpret_modereport (termo_t *tk,
 | 
			
		||||
	const termo_key_t *key, int *initial, int *mode, int *value)
 | 
			
		||||
{
 | 
			
		||||
	(void) tk;
 | 
			
		||||
 | 
			
		||||
	if (key->type != TERMKEY_TYPE_MODEREPORT)
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
	if (key->type != TERMO_TYPE_MODEREPORT)
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
 | 
			
		||||
	if (initial)
 | 
			
		||||
		*initial = key->code.mode.initial;
 | 
			
		||||
@@ -380,13 +380,13 @@ termkey_interpret_modereport (termkey_t *tk,
 | 
			
		||||
		*mode = key->code.mode.mode;
 | 
			
		||||
	if (value)
 | 
			
		||||
		*value = key->code.mode.value;
 | 
			
		||||
	return TERMKEY_RES_KEY;
 | 
			
		||||
	return TERMO_RES_KEY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define CHARAT(i) (tk->buffer[tk->buffstart + (i)])
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
parse_csi (termkey_t *tk, size_t introlen, size_t *csi_len,
 | 
			
		||||
static termo_result_t
 | 
			
		||||
parse_csi (termo_t *tk, size_t introlen, size_t *csi_len,
 | 
			
		||||
	long args[], size_t *nargs, unsigned long *commandp)
 | 
			
		||||
{
 | 
			
		||||
	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)
 | 
			
		||||
		return TERMKEY_RES_AGAIN;
 | 
			
		||||
		return TERMO_RES_AGAIN;
 | 
			
		||||
 | 
			
		||||
	unsigned char cmd = CHARAT (csi_end);
 | 
			
		||||
	*commandp = cmd;
 | 
			
		||||
@@ -451,17 +451,17 @@ parse_csi (termkey_t *tk, size_t introlen, size_t *csi_len,
 | 
			
		||||
 | 
			
		||||
	*nargs = argi;
 | 
			
		||||
	*csi_len = csi_end + 1;
 | 
			
		||||
	return TERMKEY_RES_KEY;
 | 
			
		||||
	return TERMO_RES_KEY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
termkey_result_t
 | 
			
		||||
termkey_interpret_csi (termkey_t *tk, const termkey_key_t *key,
 | 
			
		||||
termo_result_t
 | 
			
		||||
termo_interpret_csi (termo_t *tk, const termo_key_t *key,
 | 
			
		||||
	long args[], size_t *nargs, unsigned long *cmd)
 | 
			
		||||
{
 | 
			
		||||
	if (tk->hightide == 0)
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
	if (key->type != TERMKEY_TYPE_UNKNOWN_CSI)
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
	if (key->type != TERMO_TYPE_UNKNOWN_CSI)
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
 | 
			
		||||
	size_t dummy;
 | 
			
		||||
	return parse_csi (tk, 0, &dummy, args, nargs, cmd);
 | 
			
		||||
@@ -473,76 +473,76 @@ register_keys (void)
 | 
			
		||||
	int i;
 | 
			
		||||
	for (i = 0; i < 64; i++)
 | 
			
		||||
	{
 | 
			
		||||
		csi_ss3s[i].sym = TERMKEY_SYM_UNKNOWN;
 | 
			
		||||
		ss3s[i].sym     = TERMKEY_SYM_UNKNOWN;
 | 
			
		||||
		csi_ss3s[i].sym = TERMO_SYM_UNKNOWN;
 | 
			
		||||
		ss3s[i].sym     = TERMO_SYM_UNKNOWN;
 | 
			
		||||
		ss3_kpalts[i] = 0;
 | 
			
		||||
	}
 | 
			
		||||
	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 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN,  'B');
 | 
			
		||||
	register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 'C');
 | 
			
		||||
	register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT,  'D');
 | 
			
		||||
	register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 'E');
 | 
			
		||||
	register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END,   'F');
 | 
			
		||||
	register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME,  'H');
 | 
			
		||||
	register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 1, 'P');
 | 
			
		||||
	register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 2, 'Q');
 | 
			
		||||
	register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 3, 'R');
 | 
			
		||||
	register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 4, 'S');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_UP,    'A');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_DOWN,  'B');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_RIGHT, 'C');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_LEFT,  'D');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_BEGIN, 'E');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_END,   'F');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_HOME,  'H');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_FUNCTION, 1, 'P');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_FUNCTION, 2, 'Q');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_FUNCTION, 3, 'R');
 | 
			
		||||
	register_csi_ss3 (TERMO_TYPE_FUNCTION, 4, 'S');
 | 
			
		||||
 | 
			
		||||
	register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB,
 | 
			
		||||
		TERMKEY_KEYMOD_SHIFT, TERMKEY_KEYMOD_SHIFT, 'Z');
 | 
			
		||||
	register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_TAB,
 | 
			
		||||
		TERMO_KEYMOD_SHIFT, TERMO_KEYMOD_SHIFT, 'Z');
 | 
			
		||||
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPENTER,  'M', 0);
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPEQUALS, 'X', '=');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPMULT,   'j', '*');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPPLUS,   'k', '+');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPCOMMA,  'l', ',');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPMINUS,  'm', '-');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPPERIOD, 'n', '.');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPDIV,    'o', '/');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP0,      'p', '0');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP1,      'q', '1');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP2,      'r', '2');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP3,      's', '3');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP4,      't', '4');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP5,      'u', '5');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP6,      'v', '6');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP7,      'w', '7');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP8,      'x', '8');
 | 
			
		||||
	register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP9,      'y', '9');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPENTER,  'M', 0);
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPEQUALS, 'X', '=');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPMULT,   'j', '*');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPPLUS,   'k', '+');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPCOMMA,  'l', ',');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPMINUS,  'm', '-');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPPERIOD, 'n', '.');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPDIV,    'o', '/');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP0,      'p', '0');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP1,      'q', '1');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP2,      'r', '2');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP3,      's', '3');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP4,      't', '4');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP5,      'u', '5');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP6,      'v', '6');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP7,      'w', '7');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP8,      'x', '8');
 | 
			
		||||
	register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP9,      'y', '9');
 | 
			
		||||
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND,      1);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT,    2);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE,    3);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT,    4);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP,    5);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN,  6);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME,      7);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END,       8);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_FIND,      1);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_INSERT,    2);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_DELETE,    3);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_SELECT,    4);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEUP,    5);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEDOWN,  6);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_HOME,      7);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_END,       8);
 | 
			
		||||
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 1,  11);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 2,  12);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 3,  13);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 4,  14);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 5,  15);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 6,  17);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 7,  18);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 8,  19);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 9,  20);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 10, 21);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 11, 23);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 12, 24);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 13, 25);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 14, 26);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 15, 28);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 16, 29);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 17, 31);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 18, 32);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 19, 33);
 | 
			
		||||
	register_csifunc (TERMKEY_TYPE_FUNCTION, 20, 34);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 1,  11);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 2,  12);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 3,  13);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 4,  14);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 5,  15);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 6,  17);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 7,  18);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 8,  19);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 9,  20);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 10, 21);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 11, 23);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 12, 24);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 13, 25);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 14, 26);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 15, 28);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 16, 29);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 17, 31);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 18, 32);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 19, 33);
 | 
			
		||||
	register_csifunc (TERMO_TYPE_FUNCTION, 20, 34);
 | 
			
		||||
 | 
			
		||||
	csi_handlers['u' - 0x40] = &handle_csi_u;
 | 
			
		||||
 | 
			
		||||
@@ -554,14 +554,14 @@ register_keys (void)
 | 
			
		||||
	csi_handlers['y' - 0x40] = &handle_csi_y;
 | 
			
		||||
 | 
			
		||||
	// URxvt
 | 
			
		||||
	register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP,
 | 
			
		||||
		TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'a');
 | 
			
		||||
	register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN,
 | 
			
		||||
		TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'b');
 | 
			
		||||
	register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT,
 | 
			
		||||
		TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'c');
 | 
			
		||||
	register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT,
 | 
			
		||||
		TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'd');
 | 
			
		||||
	register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_UP,
 | 
			
		||||
		TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'a');
 | 
			
		||||
	register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_DOWN,
 | 
			
		||||
		TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'b');
 | 
			
		||||
	register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_RIGHT,
 | 
			
		||||
		TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'c');
 | 
			
		||||
	register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_LEFT,
 | 
			
		||||
		TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'd');
 | 
			
		||||
 | 
			
		||||
	csi_handlers['^' - 0x40] = &handle_csi_caret;
 | 
			
		||||
 | 
			
		||||
@@ -570,14 +570,14 @@ register_keys (void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void *
 | 
			
		||||
new_driver (termkey_t *tk, const char *term)
 | 
			
		||||
new_driver (termo_t *tk, const char *term)
 | 
			
		||||
{
 | 
			
		||||
	(void) term;
 | 
			
		||||
 | 
			
		||||
	if (!keyinfo_initialised && !register_keys ())
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	termkey_csi_t *csi = malloc (sizeof *csi);
 | 
			
		||||
	termo_csi_t *csi = malloc (sizeof *csi);
 | 
			
		||||
	if (!csi)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -588,13 +588,13 @@ new_driver (termkey_t *tk, const char *term)
 | 
			
		||||
static void
 | 
			
		||||
free_driver (void *info)
 | 
			
		||||
{
 | 
			
		||||
	termkey_csi_t *csi = info;
 | 
			
		||||
	termo_csi_t *csi = info;
 | 
			
		||||
	free (csi);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
 | 
			
		||||
	size_t introlen, termkey_key_t *key, int force, size_t *nbytep)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
peekkey_csi (termo_t *tk, termo_csi_t *csi,
 | 
			
		||||
	size_t introlen, termo_key_t *key, int force, size_t *nbytep)
 | 
			
		||||
{
 | 
			
		||||
	(void) csi;
 | 
			
		||||
 | 
			
		||||
@@ -603,16 +603,16 @@ peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
 | 
			
		||||
	long arg[16];
 | 
			
		||||
	unsigned long cmd;
 | 
			
		||||
 | 
			
		||||
	termkey_result_t ret = parse_csi (tk, introlen, &csi_len, arg, &args, &cmd);
 | 
			
		||||
	if (ret == TERMKEY_RES_AGAIN)
 | 
			
		||||
	termo_result_t ret = parse_csi (tk, introlen, &csi_len, arg, &args, &cmd);
 | 
			
		||||
	if (ret == TERMO_RES_AGAIN)
 | 
			
		||||
	{
 | 
			
		||||
		if (!force)
 | 
			
		||||
			return TERMKEY_RES_AGAIN;
 | 
			
		||||
			return TERMO_RES_AGAIN;
 | 
			
		||||
 | 
			
		||||
		(*tk->method.emit_codepoint) (tk, '[', key);
 | 
			
		||||
		key->modifiers |= TERMKEY_KEYMOD_ALT;
 | 
			
		||||
		key->modifiers |= TERMO_KEYMOD_ALT;
 | 
			
		||||
		*nbytep = introlen;
 | 
			
		||||
		return TERMKEY_RES_KEY;
 | 
			
		||||
		return TERMO_RES_KEY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 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->buffcount -= csi_len;
 | 
			
		||||
 | 
			
		||||
		termkey_result_t mouse_result =
 | 
			
		||||
		termo_result_t mouse_result =
 | 
			
		||||
			(*tk->method.peekkey_mouse) (tk, key, nbytep);
 | 
			
		||||
 | 
			
		||||
		tk->buffstart -= csi_len;
 | 
			
		||||
		tk->buffcount += csi_len;
 | 
			
		||||
 | 
			
		||||
		if (mouse_result == TERMKEY_RES_KEY)
 | 
			
		||||
		if (mouse_result == TERMO_RES_KEY)
 | 
			
		||||
			*nbytep += csi_len;
 | 
			
		||||
		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
 | 
			
		||||
	if (csi_handlers[(cmd & 0xff) - 0x40])
 | 
			
		||||
		result = (*csi_handlers[(cmd & 0xff) - 0x40]) (tk, key, cmd, arg, args);
 | 
			
		||||
 | 
			
		||||
	if (result == TERMKEY_RES_NONE)
 | 
			
		||||
	if (result == TERMO_RES_NONE)
 | 
			
		||||
	{
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
		switch (args)
 | 
			
		||||
@@ -661,49 +661,49 @@ peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
#endif
 | 
			
		||||
		key->type = TERMKEY_TYPE_UNKNOWN_CSI;
 | 
			
		||||
		key->type = TERMO_TYPE_UNKNOWN_CSI;
 | 
			
		||||
		key->code.number = cmd;
 | 
			
		||||
 | 
			
		||||
		tk->hightide = csi_len - introlen;
 | 
			
		||||
		*nbytep = introlen; // Do not yet eat the data bytes
 | 
			
		||||
		return TERMKEY_RES_KEY;
 | 
			
		||||
		return TERMO_RES_KEY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	*nbytep = csi_len;
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
peekkey_ss3 (termkey_t *tk, termkey_csi_t *csi, size_t introlen,
 | 
			
		||||
	termkey_key_t *key, int force, size_t *nbytep)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
peekkey_ss3 (termo_t *tk, termo_csi_t *csi, size_t introlen,
 | 
			
		||||
	termo_key_t *key, int force, size_t *nbytep)
 | 
			
		||||
{
 | 
			
		||||
	(void) csi;
 | 
			
		||||
 | 
			
		||||
	if (tk->buffcount < introlen + 1)
 | 
			
		||||
	{
 | 
			
		||||
		if (!force)
 | 
			
		||||
			return TERMKEY_RES_AGAIN;
 | 
			
		||||
			return TERMO_RES_AGAIN;
 | 
			
		||||
 | 
			
		||||
		(*tk->method.emit_codepoint) (tk, 'O', key);
 | 
			
		||||
		key->modifiers |= TERMKEY_KEYMOD_ALT;
 | 
			
		||||
		key->modifiers |= TERMO_KEYMOD_ALT;
 | 
			
		||||
		*nbytep = tk->buffcount;
 | 
			
		||||
		return TERMKEY_RES_KEY;
 | 
			
		||||
		return TERMO_RES_KEY;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	unsigned char cmd = CHARAT (introlen);
 | 
			
		||||
 | 
			
		||||
	if (cmd < 0x40 || cmd >= 0x80)
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
 | 
			
		||||
	key->type      = csi_ss3s[cmd - 0x40].type;
 | 
			
		||||
	key->code.sym  = csi_ss3s[cmd - 0x40].sym;
 | 
			
		||||
	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->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
 | 
			
		||||
		fprintf (stderr, "CSI: Unknown SS3 %c (0x%02x)\n", (char) cmd, cmd);
 | 
			
		||||
#endif
 | 
			
		||||
		return TERMKEY_RES_NONE;
 | 
			
		||||
		return TERMO_RES_NONE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	*nbytep = introlen + 1;
 | 
			
		||||
	return TERMKEY_RES_KEY;
 | 
			
		||||
	return TERMO_RES_KEY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
peekkey (termkey_t *tk, void *info,
 | 
			
		||||
	termkey_key_t *key, int force, size_t *nbytep)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
peekkey (termo_t *tk, void *info,
 | 
			
		||||
	termo_key_t *key, int force, size_t *nbytep)
 | 
			
		||||
{
 | 
			
		||||
	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
 | 
			
		||||
	unsigned char b0 = CHARAT (0);
 | 
			
		||||
@@ -750,10 +750,10 @@ peekkey (termkey_t *tk, void *info,
 | 
			
		||||
		return peekkey_ss3 (tk, csi, 1, key, force, nbytep);
 | 
			
		||||
	if (b0 == 0x9b)
 | 
			
		||||
		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",
 | 
			
		||||
	.new_driver  = new_driver,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										164
									
								
								driver-ti.c
									
									
									
									
									
								
							
							
						
						
									
										164
									
								
								driver-ti.c
									
									
									
									
									
								
							@@ -1,8 +1,8 @@
 | 
			
		||||
// we want strdup()
 | 
			
		||||
#define _XOPEN_SOURCE 600
 | 
			
		||||
 | 
			
		||||
#include "termkey2.h"
 | 
			
		||||
#include "termkey2-internal.h"
 | 
			
		||||
#include "termo.h"
 | 
			
		||||
#include "termo-internal.h"
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_UNIBILIUM
 | 
			
		||||
# include <unibilium.h>
 | 
			
		||||
@@ -53,7 +53,7 @@ trie_node_array_t;
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	termkey_t *tk;
 | 
			
		||||
	termo_t *tk;
 | 
			
		||||
	trie_node_t *root;
 | 
			
		||||
 | 
			
		||||
	char *start_string;
 | 
			
		||||
@@ -62,14 +62,14 @@ typedef struct
 | 
			
		||||
	bool have_mouse;
 | 
			
		||||
	char *set_mouse_string;
 | 
			
		||||
}
 | 
			
		||||
termkey_ti_t;
 | 
			
		||||
termo_ti_t;
 | 
			
		||||
 | 
			
		||||
static int funcname2keysym (const char *funcname, termkey_type_t *typep,
 | 
			
		||||
	termkey_sym_t *symp, int *modmask, int *modsetp);
 | 
			
		||||
static int insert_seq (termkey_ti_t *ti, const char *seq, trie_node_t *node);
 | 
			
		||||
static int funcname2keysym (const char *funcname, termo_type_t *typep,
 | 
			
		||||
	termo_sym_t *symp, int *modmask, int *modsetp);
 | 
			
		||||
static int insert_seq (termo_ti_t *ti, const char *seq, trie_node_t *node);
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
	if (!n)
 | 
			
		||||
@@ -176,7 +176,7 @@ compress_trie (struct trie_node *n)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
@@ -212,15 +212,15 @@ load_terminfo (termkey_ti_t *ti, const char *term)
 | 
			
		||||
			mouse_report_string = value;
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			termkey_type_t type;
 | 
			
		||||
			termkey_sym_t sym;
 | 
			
		||||
			termo_type_t type;
 | 
			
		||||
			termo_sym_t sym;
 | 
			
		||||
			int mask = 0;
 | 
			
		||||
			int set = 0;
 | 
			
		||||
 | 
			
		||||
			if (!funcname2keysym (name + 4, &type, &sym, &mask, &set))
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
			if (sym == TERMKEY_SYM_NONE)
 | 
			
		||||
			if (sym == TERMO_SYM_NONE)
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
			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
 | 
			
		||||
	 * time we want to use it
 | 
			
		||||
	 */
 | 
			
		||||
@@ -292,9 +292,9 @@ load_terminfo (termkey_ti_t *ti, const char *term)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
@@ -318,7 +318,7 @@ abort_free_ti:
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
write_string (termkey_t *tk, char *string)
 | 
			
		||||
write_string (termo_t *tk, char *string)
 | 
			
		||||
{
 | 
			
		||||
	if (tk->fd == -1 || !isatty (tk->fd) || !string)
 | 
			
		||||
		return true;
 | 
			
		||||
@@ -340,7 +340,7 @@ write_string (termkey_t *tk, char *string)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
set_mouse (termkey_ti_t *ti, bool enable)
 | 
			
		||||
set_mouse (termo_ti_t *ti, bool enable)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_UNIBILIUM
 | 
			
		||||
	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
 | 
			
		||||
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
 | 
			
		||||
	//   a public function to be called by users.
 | 
			
		||||
	// 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
 | 
			
		||||
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))
 | 
			
		||||
		return false;
 | 
			
		||||
	return write_string (tk, ti->stop_string);
 | 
			
		||||
@@ -379,7 +379,7 @@ stop_driver (termkey_t *tk, void *info)
 | 
			
		||||
static void
 | 
			
		||||
free_driver (void *info)
 | 
			
		||||
{
 | 
			
		||||
	termkey_ti_t *ti = info;
 | 
			
		||||
	termo_ti_t *ti = info;
 | 
			
		||||
	free_trie (ti->root);
 | 
			
		||||
	free (ti->set_mouse_string);
 | 
			
		||||
	free (ti->start_string);
 | 
			
		||||
@@ -389,14 +389,14 @@ free_driver (void *info)
 | 
			
		||||
 | 
			
		||||
#define CHARAT(i) (tk->buffer[tk->buffstart + (i)])
 | 
			
		||||
 | 
			
		||||
static termkey_result_t
 | 
			
		||||
peekkey (termkey_t *tk, void *info,
 | 
			
		||||
	termkey_key_t *key, int force, size_t *nbytep)
 | 
			
		||||
static termo_result_t
 | 
			
		||||
peekkey (termo_t *tk, void *info,
 | 
			
		||||
	termo_key_t *key, int force, size_t *nbytep)
 | 
			
		||||
{
 | 
			
		||||
	termkey_ti_t *ti = info;
 | 
			
		||||
	termo_ti_t *ti = info;
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
	unsigned int pos = 0;
 | 
			
		||||
@@ -415,20 +415,20 @@ peekkey (termkey_t *tk, void *info,
 | 
			
		||||
			key->code.sym  = nk->key.sym;
 | 
			
		||||
			key->modifiers = nk->key.modifier_set;
 | 
			
		||||
			*nbytep = pos;
 | 
			
		||||
			return TERMKEY_RES_KEY;
 | 
			
		||||
			return TERMO_RES_KEY;
 | 
			
		||||
		}
 | 
			
		||||
		else if (p->type == TYPE_MOUSE)
 | 
			
		||||
		{
 | 
			
		||||
			tk->buffstart += pos;
 | 
			
		||||
			tk->buffcount -= pos;
 | 
			
		||||
 | 
			
		||||
			termkey_result_t mouse_result =
 | 
			
		||||
			termo_result_t mouse_result =
 | 
			
		||||
				(*tk->method.peekkey_mouse) (tk, key, nbytep);
 | 
			
		||||
 | 
			
		||||
			tk->buffstart -= pos;
 | 
			
		||||
			tk->buffcount += pos;
 | 
			
		||||
 | 
			
		||||
			if (mouse_result == TERMKEY_RES_KEY)
 | 
			
		||||
			if (mouse_result == TERMO_RES_KEY)
 | 
			
		||||
				*nbytep += pos;
 | 
			
		||||
 | 
			
		||||
			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
 | 
			
		||||
	// partial match
 | 
			
		||||
	if (p && !force)
 | 
			
		||||
		return TERMKEY_RES_AGAIN;
 | 
			
		||||
		return TERMO_RES_AGAIN;
 | 
			
		||||
 | 
			
		||||
	return TERMKEY_RES_NONE;
 | 
			
		||||
	return TERMO_RES_NONE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct func
 | 
			
		||||
{
 | 
			
		||||
	const char *funcname;
 | 
			
		||||
	termkey_type_t type;
 | 
			
		||||
	termkey_sym_t sym;
 | 
			
		||||
	termo_type_t type;
 | 
			
		||||
	termo_sym_t sym;
 | 
			
		||||
	int mods;
 | 
			
		||||
}
 | 
			
		||||
funcs[] =
 | 
			
		||||
{
 | 
			
		||||
	/* THIS LIST MUST REMAIN SORTED! */
 | 
			
		||||
	{ "backspace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BACKSPACE, 0 },
 | 
			
		||||
	{ "begin",     TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN,     0 },
 | 
			
		||||
	{ "beg",       TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN,     0 },
 | 
			
		||||
	{ "btab",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB,       TERMKEY_KEYMOD_SHIFT },
 | 
			
		||||
	{ "cancel",    TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CANCEL,    0 },
 | 
			
		||||
	{ "clear",     TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLEAR,     0 },
 | 
			
		||||
	{ "close",     TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLOSE,     0 },
 | 
			
		||||
	{ "command",   TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COMMAND,   0 },
 | 
			
		||||
	{ "copy",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COPY,      0 },
 | 
			
		||||
	{ "dc",        TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE,    0 },
 | 
			
		||||
	{ "down",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN,      0 },
 | 
			
		||||
	{ "end",       TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END,       0 },
 | 
			
		||||
	{ "enter",     TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_ENTER,     0 },
 | 
			
		||||
	{ "exit",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_EXIT,      0 },
 | 
			
		||||
	{ "find",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND,      0 },
 | 
			
		||||
	{ "help",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HELP,      0 },
 | 
			
		||||
	{ "home",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME,      0 },
 | 
			
		||||
	{ "ic",        TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT,    0 },
 | 
			
		||||
	{ "left",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT,      0 },
 | 
			
		||||
	{ "mark",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MARK,      0 },
 | 
			
		||||
	{ "message",   TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MESSAGE,   0 },
 | 
			
		||||
	{ "mouse",     TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_NONE,      0 },
 | 
			
		||||
	{ "move",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MOVE,      0 },
 | 
			
		||||
	{ "backspace", TERMO_TYPE_KEYSYM, TERMO_SYM_BACKSPACE, 0 },
 | 
			
		||||
	{ "begin",     TERMO_TYPE_KEYSYM, TERMO_SYM_BEGIN,     0 },
 | 
			
		||||
	{ "beg",       TERMO_TYPE_KEYSYM, TERMO_SYM_BEGIN,     0 },
 | 
			
		||||
	{ "btab",      TERMO_TYPE_KEYSYM, TERMO_SYM_TAB,       TERMO_KEYMOD_SHIFT },
 | 
			
		||||
	{ "cancel",    TERMO_TYPE_KEYSYM, TERMO_SYM_CANCEL,    0 },
 | 
			
		||||
	{ "clear",     TERMO_TYPE_KEYSYM, TERMO_SYM_CLEAR,     0 },
 | 
			
		||||
	{ "close",     TERMO_TYPE_KEYSYM, TERMO_SYM_CLOSE,     0 },
 | 
			
		||||
	{ "command",   TERMO_TYPE_KEYSYM, TERMO_SYM_COMMAND,   0 },
 | 
			
		||||
	{ "copy",      TERMO_TYPE_KEYSYM, TERMO_SYM_COPY,      0 },
 | 
			
		||||
	{ "dc",        TERMO_TYPE_KEYSYM, TERMO_SYM_DELETE,    0 },
 | 
			
		||||
	{ "down",      TERMO_TYPE_KEYSYM, TERMO_SYM_DOWN,      0 },
 | 
			
		||||
	{ "end",       TERMO_TYPE_KEYSYM, TERMO_SYM_END,       0 },
 | 
			
		||||
	{ "enter",     TERMO_TYPE_KEYSYM, TERMO_SYM_ENTER,     0 },
 | 
			
		||||
	{ "exit",      TERMO_TYPE_KEYSYM, TERMO_SYM_EXIT,      0 },
 | 
			
		||||
	{ "find",      TERMO_TYPE_KEYSYM, TERMO_SYM_FIND,      0 },
 | 
			
		||||
	{ "help",      TERMO_TYPE_KEYSYM, TERMO_SYM_HELP,      0 },
 | 
			
		||||
	{ "home",      TERMO_TYPE_KEYSYM, TERMO_SYM_HOME,      0 },
 | 
			
		||||
	{ "ic",        TERMO_TYPE_KEYSYM, TERMO_SYM_INSERT,    0 },
 | 
			
		||||
	{ "left",      TERMO_TYPE_KEYSYM, TERMO_SYM_LEFT,      0 },
 | 
			
		||||
	{ "mark",      TERMO_TYPE_KEYSYM, TERMO_SYM_MARK,      0 },
 | 
			
		||||
	{ "message",   TERMO_TYPE_KEYSYM, TERMO_SYM_MESSAGE,   0 },
 | 
			
		||||
	{ "mouse",     TERMO_TYPE_KEYSYM, TERMO_SYM_NONE,      0 },
 | 
			
		||||
	{ "move",      TERMO_TYPE_KEYSYM, TERMO_SYM_MOVE,      0 },
 | 
			
		||||
	// Not quite, but it's the best we can do
 | 
			
		||||
	{ "next",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN,  0 },
 | 
			
		||||
	{ "npage",     TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN,  0 },
 | 
			
		||||
	{ "open",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPEN,      0 },
 | 
			
		||||
	{ "options",   TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPTIONS,   0 },
 | 
			
		||||
	{ "ppage",     TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP,    0 },
 | 
			
		||||
	{ "next",      TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEDOWN,  0 },
 | 
			
		||||
	{ "npage",     TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEDOWN,  0 },
 | 
			
		||||
	{ "open",      TERMO_TYPE_KEYSYM, TERMO_SYM_OPEN,      0 },
 | 
			
		||||
	{ "options",   TERMO_TYPE_KEYSYM, TERMO_SYM_OPTIONS,   0 },
 | 
			
		||||
	{ "ppage",     TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEUP,    0 },
 | 
			
		||||
	// Not quite, but it's the best we can do
 | 
			
		||||
	{ "previous",  TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP,    0 },
 | 
			
		||||
	{ "print",     TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PRINT,     0 },
 | 
			
		||||
	{ "redo",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REDO,      0 },
 | 
			
		||||
	{ "reference", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFERENCE, 0 },
 | 
			
		||||
	{ "refresh",   TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFRESH,   0 },
 | 
			
		||||
	{ "replace",   TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REPLACE,   0 },
 | 
			
		||||
	{ "restart",   TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESTART,   0 },
 | 
			
		||||
	{ "resume",    TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESUME,    0 },
 | 
			
		||||
	{ "right",     TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT,     0 },
 | 
			
		||||
	{ "save",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SAVE,      0 },
 | 
			
		||||
	{ "select",    TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT,    0 },
 | 
			
		||||
	{ "suspend",   TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SUSPEND,   0 },
 | 
			
		||||
	{ "undo",      TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UNDO,      0 },
 | 
			
		||||
	{ "up",        TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP,        0 },
 | 
			
		||||
	{ "previous",  TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEUP,    0 },
 | 
			
		||||
	{ "print",     TERMO_TYPE_KEYSYM, TERMO_SYM_PRINT,     0 },
 | 
			
		||||
	{ "redo",      TERMO_TYPE_KEYSYM, TERMO_SYM_REDO,      0 },
 | 
			
		||||
	{ "reference", TERMO_TYPE_KEYSYM, TERMO_SYM_REFERENCE, 0 },
 | 
			
		||||
	{ "refresh",   TERMO_TYPE_KEYSYM, TERMO_SYM_REFRESH,   0 },
 | 
			
		||||
	{ "replace",   TERMO_TYPE_KEYSYM, TERMO_SYM_REPLACE,   0 },
 | 
			
		||||
	{ "restart",   TERMO_TYPE_KEYSYM, TERMO_SYM_RESTART,   0 },
 | 
			
		||||
	{ "resume",    TERMO_TYPE_KEYSYM, TERMO_SYM_RESUME,    0 },
 | 
			
		||||
	{ "right",     TERMO_TYPE_KEYSYM, TERMO_SYM_RIGHT,     0 },
 | 
			
		||||
	{ "save",      TERMO_TYPE_KEYSYM, TERMO_SYM_SAVE,      0 },
 | 
			
		||||
	{ "select",    TERMO_TYPE_KEYSYM, TERMO_SYM_SELECT,    0 },
 | 
			
		||||
	{ "suspend",   TERMO_TYPE_KEYSYM, TERMO_SYM_SUSPEND,   0 },
 | 
			
		||||
	{ "undo",      TERMO_TYPE_KEYSYM, TERMO_SYM_UNDO,      0 },
 | 
			
		||||
	{ "up",        TERMO_TYPE_KEYSYM, TERMO_SYM_UP,        0 },
 | 
			
		||||
	{ NULL },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -508,7 +508,7 @@ func_compare (const void *key, const void *element)
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
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,
 | 
			
		||||
		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]))
 | 
			
		||||
	{
 | 
			
		||||
		*typep = TERMKEY_TYPE_FUNCTION;
 | 
			
		||||
		*typep = TERMO_TYPE_FUNCTION;
 | 
			
		||||
		*symp  = atoi (funcname + 1);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
@@ -532,8 +532,8 @@ funcname2keysym (const char *funcname,
 | 
			
		||||
	if (funcname[0] == 's' && funcname2keysym
 | 
			
		||||
		(funcname + 1, typep, symp, modmaskp, modsetp))
 | 
			
		||||
	{
 | 
			
		||||
		*modmaskp |= TERMKEY_KEYMOD_SHIFT;
 | 
			
		||||
		*modsetp  |= TERMKEY_KEYMOD_SHIFT;
 | 
			
		||||
		*modmaskp |= TERMO_KEYMOD_SHIFT;
 | 
			
		||||
		*modsetp  |= TERMO_KEYMOD_SHIFT;
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -546,7 +546,7 @@ funcname2keysym (const char *funcname,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
	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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
termkey_driver_t termkey_driver_ti =
 | 
			
		||||
termo_driver_t termo_driver_ti =
 | 
			
		||||
{
 | 
			
		||||
	.name         = "terminfo",
 | 
			
		||||
	.new_driver   = new_driver,
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										277
									
								
								termkey2.h
									
									
									
									
									
								
							
							
						
						
									
										277
									
								
								termkey2.h
									
									
									
									
									
								
							@@ -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
									
								
							
							
						
						
									
										8
									
								
								termo-config.h.in
									
									
									
									
									
										Normal 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
 | 
			
		||||
 | 
			
		||||
@@ -1,43 +1,43 @@
 | 
			
		||||
#ifndef TERMKEY2_INTERNAL_H
 | 
			
		||||
#define TERMKEY2_INTERNAL_H
 | 
			
		||||
#ifndef TERMO_INTERNAL_H
 | 
			
		||||
#define TERMO_INTERNAL_H
 | 
			
		||||
 | 
			
		||||
#include "termkey2.h"
 | 
			
		||||
#include "termo.h"
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <termios.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <iconv.h>
 | 
			
		||||
 | 
			
		||||
typedef struct termkey_driver termkey_driver_t;
 | 
			
		||||
struct termkey_driver
 | 
			
		||||
typedef struct termo_driver termo_driver_t;
 | 
			
		||||
struct termo_driver
 | 
			
		||||
{
 | 
			
		||||
	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);
 | 
			
		||||
	int (*start_driver) (termkey_t *tk, void *info);
 | 
			
		||||
	int (*stop_driver) (termkey_t *tk, void *info);
 | 
			
		||||
	termkey_result_t (*peekkey) (termkey_t *tk,
 | 
			
		||||
		void *info, termkey_key_t *key, int force, size_t *nbytes);
 | 
			
		||||
	int (*start_driver) (termo_t *tk, void *info);
 | 
			
		||||
	int (*stop_driver) (termo_t *tk, void *info);
 | 
			
		||||
	termo_result_t (*peekkey) (termo_t *tk,
 | 
			
		||||
		void *info, termo_key_t *key, int force, size_t *nbytes);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct keyinfo keyinfo_t;
 | 
			
		||||
struct keyinfo
 | 
			
		||||
{
 | 
			
		||||
	termkey_type_t type;
 | 
			
		||||
	termkey_sym_t sym;
 | 
			
		||||
	termo_type_t type;
 | 
			
		||||
	termo_sym_t sym;
 | 
			
		||||
	int modifier_mask;
 | 
			
		||||
	int modifier_set;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct termkey_driver_node termkey_driver_node_t;
 | 
			
		||||
struct termkey_driver_node
 | 
			
		||||
typedef struct termo_driver_node termo_driver_node_t;
 | 
			
		||||
struct termo_driver_node
 | 
			
		||||
{
 | 
			
		||||
	termkey_driver_t *driver;
 | 
			
		||||
	termo_driver_t *driver;
 | 
			
		||||
	void *info;
 | 
			
		||||
	termkey_driver_node_t *next;
 | 
			
		||||
	termo_driver_node_t *next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct termkey
 | 
			
		||||
struct termo
 | 
			
		||||
{
 | 
			
		||||
	int fd;
 | 
			
		||||
	int flags;
 | 
			
		||||
@@ -49,7 +49,7 @@ struct termkey
 | 
			
		||||
	size_t buffsize; // Total malloc'ed size
 | 
			
		||||
 | 
			
		||||
	// 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;
 | 
			
		||||
 | 
			
		||||
	struct termios restore_termios;
 | 
			
		||||
@@ -66,24 +66,24 @@ struct termkey
 | 
			
		||||
	keyinfo_t c0[32]; // There are 32 C0 codes
 | 
			
		||||
	iconv_t to_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
 | 
			
		||||
	// want exported as real symbols in the library
 | 
			
		||||
	struct
 | 
			
		||||
	{
 | 
			
		||||
		void (*emit_codepoint) (termkey_t *tk,
 | 
			
		||||
			uint32_t codepoint, termkey_key_t *key);
 | 
			
		||||
		termkey_result_t (*peekkey_simple) (termkey_t *tk,
 | 
			
		||||
			termkey_key_t *key, int force, size_t *nbytes);
 | 
			
		||||
		termkey_result_t (*peekkey_mouse) (termkey_t *tk,
 | 
			
		||||
			termkey_key_t *key, size_t *nbytes);
 | 
			
		||||
		void (*emit_codepoint) (termo_t *tk,
 | 
			
		||||
			uint32_t codepoint, termo_key_t *key);
 | 
			
		||||
		termo_result_t (*peekkey_simple) (termo_t *tk,
 | 
			
		||||
			termo_key_t *key, int force, size_t *nbytes);
 | 
			
		||||
		termo_result_t (*peekkey_mouse) (termo_t *tk,
 | 
			
		||||
			termo_key_t *key, size_t *nbytes);
 | 
			
		||||
	}
 | 
			
		||||
	method;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
		*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
 | 
			
		||||
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)
 | 
			
		||||
		line = UINT16_MAX;
 | 
			
		||||
@@ -105,8 +105,8 @@ termkey_key_set_linecol (termkey_key_t *key, int line, int col)
 | 
			
		||||
	key->code.mouse.y = line;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extern termkey_driver_t termkey_driver_csi;
 | 
			
		||||
extern termkey_driver_t termkey_driver_ti;
 | 
			
		||||
extern termo_driver_t termo_driver_csi;
 | 
			
		||||
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
									
								
							
							
						
						
									
										277
									
								
								termo.h
									
									
									
									
									
										Normal 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
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user