Rename to termo
This commit is contained in:
parent
e330d751a4
commit
e98d9c0fd1
|
@ -1,4 +1,4 @@
|
||||||
project (termkey2 C)
|
project (termo C)
|
||||||
cmake_minimum_required (VERSION 2.8.5)
|
cmake_minimum_required (VERSION 2.8.5)
|
||||||
|
|
||||||
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUC)
|
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUC)
|
||||||
|
@ -18,9 +18,9 @@ set (project_VERSION ${project_VERSION}.${project_VERSION_PATCH})
|
||||||
set (project_API_VERSION ${project_VERSION_MAJOR})
|
set (project_API_VERSION ${project_VERSION_MAJOR})
|
||||||
|
|
||||||
# Names
|
# Names
|
||||||
set (project_LIB_NAME "termkey2-${project_API_VERSION}")
|
set (project_LIB_NAME "termo-${project_API_VERSION}")
|
||||||
set (project_INCLUDE_NAME "termkey2-${project_API_VERSION}")
|
set (project_INCLUDE_NAME "termo-${project_API_VERSION}")
|
||||||
set (project_CMAKE_NAME "TermKey2")
|
set (project_CMAKE_NAME "Termo")
|
||||||
|
|
||||||
# Dependecies
|
# Dependecies
|
||||||
find_package (Curses)
|
find_package (Curses)
|
||||||
|
@ -29,19 +29,19 @@ pkg_check_modules (glib glib-2.0 gio-2.0)
|
||||||
pkg_check_modules (unibilium unibilium>=0.1.0)
|
pkg_check_modules (unibilium unibilium>=0.1.0)
|
||||||
|
|
||||||
# Header files with configuration
|
# Header files with configuration
|
||||||
configure_file (${PROJECT_SOURCE_DIR}/termkey2-config.h.in
|
configure_file (${PROJECT_SOURCE_DIR}/termo-config.h.in
|
||||||
${PROJECT_BINARY_DIR}/termkey2-config.h)
|
${PROJECT_BINARY_DIR}/termo-config.h)
|
||||||
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
|
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
|
||||||
|
|
||||||
# Project source files
|
# Project source files
|
||||||
set (lib_sources
|
set (lib_sources
|
||||||
termkey2.c
|
termo.c
|
||||||
driver-csi.c
|
driver-csi.c
|
||||||
driver-ti.c)
|
driver-ti.c)
|
||||||
set (lib_headers
|
set (lib_headers
|
||||||
termkey2.h
|
termo.h
|
||||||
termkey2-internal.h
|
termo-internal.h
|
||||||
${PROJECT_BINARY_DIR}/termkey2-config.h)
|
${PROJECT_BINARY_DIR}/termo-config.h)
|
||||||
|
|
||||||
# Project libraries
|
# Project libraries
|
||||||
if (unibilium_FOUND)
|
if (unibilium_FOUND)
|
||||||
|
@ -56,33 +56,33 @@ else (CURSES_FOUND)
|
||||||
endif (unibilium_FOUND)
|
endif (unibilium_FOUND)
|
||||||
|
|
||||||
# Create the library targets
|
# Create the library targets
|
||||||
add_library (termkey2 SHARED ${lib_sources} ${lib_headers})
|
add_library (termo SHARED ${lib_sources} ${lib_headers})
|
||||||
target_link_libraries (termkey2 ${lib_libraries})
|
target_link_libraries (termo ${lib_libraries})
|
||||||
set_target_properties (termkey2 PROPERTIES
|
set_target_properties (termo PROPERTIES
|
||||||
OUTPUT_NAME ${project_LIB_NAME}
|
OUTPUT_NAME ${project_LIB_NAME}
|
||||||
VERSION ${project_VERSION}
|
VERSION ${project_VERSION}
|
||||||
SOVERSION ${project_API_VERSION})
|
SOVERSION ${project_API_VERSION})
|
||||||
|
|
||||||
add_library (termkey2-static STATIC ${lib_sources} ${lib_headers})
|
add_library (termo-static STATIC ${lib_sources} ${lib_headers})
|
||||||
target_link_libraries (termkey2-static ${lib_libraries})
|
target_link_libraries (termo-static ${lib_libraries})
|
||||||
set_target_properties (termkey2-static PROPERTIES
|
set_target_properties (termo-static PROPERTIES
|
||||||
OUTPUT_NAME ${project_LIB_NAME}
|
OUTPUT_NAME ${project_LIB_NAME}
|
||||||
VERSION ${project_VERSION}
|
VERSION ${project_VERSION}
|
||||||
SOVERSION ${project_API_VERSION})
|
SOVERSION ${project_API_VERSION})
|
||||||
|
|
||||||
# Demos
|
# Demos
|
||||||
add_executable (demo-async EXCLUDE_FROM_ALL demo-async.c)
|
add_executable (demo-async EXCLUDE_FROM_ALL demo-async.c)
|
||||||
target_link_libraries (demo-async termkey2-static ${lib_libraries})
|
target_link_libraries (demo-async termo-static ${lib_libraries})
|
||||||
|
|
||||||
add_executable (demo EXCLUDE_FROM_ALL demo.c)
|
add_executable (demo EXCLUDE_FROM_ALL demo.c)
|
||||||
target_link_libraries (demo termkey2-static ${lib_libraries})
|
target_link_libraries (demo termo-static ${lib_libraries})
|
||||||
|
|
||||||
set (demos demo demo-async)
|
set (demos demo demo-async)
|
||||||
if (glib_FOUND)
|
if (glib_FOUND)
|
||||||
include_directories (${glib_INCLUDE_DIRS})
|
include_directories (${glib_INCLUDE_DIRS})
|
||||||
add_executable (demo-glib EXCLUDE_FROM_ALL demo-glib.c)
|
add_executable (demo-glib EXCLUDE_FROM_ALL demo-glib.c)
|
||||||
target_link_libraries (demo
|
target_link_libraries (demo
|
||||||
termkey2-static ${lib_libraries} ${glib_LIBRARIES})
|
termo-static ${lib_libraries} ${glib_LIBRARIES})
|
||||||
list (APPEND demos demo-glib)
|
list (APPEND demos demo-glib)
|
||||||
endif (glib_FOUND)
|
endif (glib_FOUND)
|
||||||
|
|
||||||
|
@ -90,9 +90,9 @@ add_custom_target (demos DEPENDS ${demos})
|
||||||
|
|
||||||
# The files to be installed
|
# The files to be installed
|
||||||
include (GNUInstallDirs)
|
include (GNUInstallDirs)
|
||||||
install (TARGETS termkey2 termkey2-static DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
install (TARGETS termo termo-static DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
||||||
install (FILES termkey2.h ${PROJECT_BINARY_DIR}/termkey2-config.h
|
install (FILES termo.h ${PROJECT_BINARY_DIR}/termo-config.h
|
||||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${project_INCLUDE_NAME})
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${project_INCLUDE_NAME})
|
||||||
|
|
||||||
# Configuration for other CMake projects
|
# Configuration for other CMake projects
|
||||||
|
|
18
README
18
README
|
@ -1,9 +1,9 @@
|
||||||
termkey2
|
termo
|
||||||
========
|
=====
|
||||||
|
|
||||||
`termkey2' is a library providing an alternative to ncurses' handling of
|
`termo' is a library providing an alternative to ncurses' handling of terminal
|
||||||
terminal input. ncurses does a really terrible job at that, mainly wrt. mouse
|
input. ncurses does a really terrible job at that, mainly wrt. mouse support
|
||||||
support which seems to be utterly broken. If you can drag things in a terminal
|
which seems to be utterly broken. If you can drag things in a terminal
|
||||||
application, such as in VIM, I can assure you it's not using ncurses for that.
|
application, such as in VIM, I can assure you it's not using ncurses for that.
|
||||||
|
|
||||||
Since terminal I/O is really complicated and full of special cases, this project
|
Since terminal I/O is really complicated and full of special cases, this project
|
||||||
|
@ -17,7 +17,7 @@ Building and Installing
|
||||||
Build dependencies: GCC/Clang, pkg-config, cmake >= 2.8.5
|
Build dependencies: GCC/Clang, pkg-config, cmake >= 2.8.5
|
||||||
Optional dependencies: Unibilium (alternative for curses), GLib (for the demos)
|
Optional dependencies: Unibilium (alternative for curses), GLib (for the demos)
|
||||||
|
|
||||||
$ git clone https://github.com/pjanouch/termkey2.git
|
$ git clone https://github.com/pjanouch/termo.git
|
||||||
$ mkdir build
|
$ mkdir build
|
||||||
$ cd build
|
$ cd build
|
||||||
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
|
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
|
||||||
|
@ -27,7 +27,7 @@ To install the library, you can do either the usual:
|
||||||
|
|
||||||
Or you can try telling CMake to make a package for you. For Debian it is:
|
Or you can try telling CMake to make a package for you. For Debian it is:
|
||||||
$ cpack -G DEB
|
$ cpack -G DEB
|
||||||
# dpkg -i termkey2-*.deb
|
# dpkg -i termo-*.deb
|
||||||
|
|
||||||
To see the library in action, you can try running the demos, which are
|
To see the library in action, you can try running the demos, which are
|
||||||
statically linked against the library, and hence they can be run as they are:
|
statically linked against the library, and hence they can be run as they are:
|
||||||
|
@ -38,7 +38,7 @@ What's Different From the Original termkey?
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
The main change is throwing away any UTF-8 dependent code, making the library
|
The main change is throwing away any UTF-8 dependent code, making the library
|
||||||
capable of handling all unibyte and multibyte encodings supported by iconv on
|
capable of handling all unibyte and multibyte encodings supported by iconv on
|
||||||
your system. The characters are still presented as Unicode at the end, however,
|
your system. The characters are still presented as Unicode in the end, however,
|
||||||
as the other sensible option is wchar_t and that doesn't really work well, see
|
as the other sensible option is wchar_t and that doesn't really work well, see
|
||||||
http://gnu.org/software/libunistring/manual/libunistring.html#The-wchar_005ft-mess
|
http://gnu.org/software/libunistring/manual/libunistring.html#The-wchar_005ft-mess
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ Oh, and I've deleted the manpages. It needs more Doxygen. :) TBD
|
||||||
|
|
||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
`termkey2' is based on the `termkey' library originally written by Paul Evans
|
`termo' is based on the `termkey' library originally written by Paul Evans
|
||||||
<leonerd@leonerd.org.uk>, with additional changes made by Přemysl Janouch
|
<leonerd@leonerd.org.uk>, with additional changes made by Přemysl Janouch
|
||||||
<p.janouch@gmail.com>.
|
<p.janouch@gmail.com>.
|
||||||
|
|
||||||
|
|
|
@ -4,5 +4,5 @@
|
||||||
# @project_CMAKE_NAME@_LIBRARIES
|
# @project_CMAKE_NAME@_LIBRARIES
|
||||||
|
|
||||||
set (@project_CMAKE_NAME@_INCLUDE_DIRS @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/@project_INCLUDE_NAME@)
|
set (@project_CMAKE_NAME@_INCLUDE_DIRS @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_INCLUDEDIR@/@project_INCLUDE_NAME@)
|
||||||
set (@project_CMAKE_NAME@_LIBRARIES termkey2)
|
set (@project_CMAKE_NAME@_LIBRARIES termo)
|
||||||
|
|
||||||
|
|
34
demo-async.c
34
demo-async.c
|
@ -6,13 +6,13 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
#include "termkey2.h"
|
#include "termo.h"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_key (termkey_t *tk, termkey_key_t *key)
|
on_key (termo_t *tk, termo_key_t *key)
|
||||||
{
|
{
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
termkey_strfkey (tk, buffer, sizeof buffer, key, TERMKEY_FORMAT_VIM);
|
termo_strfkey (tk, buffer, sizeof buffer, key, TERMO_FORMAT_VIM);
|
||||||
printf ("%s\n", buffer);
|
printf ("%s\n", buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,23 +22,23 @@ main (int argc, char *argv[])
|
||||||
(void) argc;
|
(void) argc;
|
||||||
(void) argv;
|
(void) argv;
|
||||||
|
|
||||||
TERMKEY_CHECK_VERSION;
|
TERMO_CHECK_VERSION;
|
||||||
setlocale (LC_CTYPE, "");
|
setlocale (LC_CTYPE, "");
|
||||||
|
|
||||||
termkey_t *tk = termkey_new (STDIN_FILENO, NULL, 0);
|
termo_t *tk = termo_new (STDIN_FILENO, NULL, 0);
|
||||||
|
|
||||||
if (!tk)
|
if (!tk)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "Cannot allocate termkey instance\n");
|
fprintf (stderr, "Cannot allocate termo instance\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pollfd fd;
|
struct pollfd fd;
|
||||||
fd.fd = STDIN_FILENO; /* the file descriptor we passed to termkey_new() */
|
fd.fd = STDIN_FILENO; /* the file descriptor we passed to termo_new() */
|
||||||
fd.events = POLLIN;
|
fd.events = POLLIN;
|
||||||
|
|
||||||
termkey_result_t ret;
|
termo_result_t ret;
|
||||||
termkey_key_t key;
|
termo_key_t key;
|
||||||
|
|
||||||
int running = 1;
|
int running = 1;
|
||||||
int nextwait = -1;
|
int nextwait = -1;
|
||||||
|
@ -47,27 +47,27 @@ main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
if (poll (&fd, 1, nextwait) == 0)
|
if (poll (&fd, 1, nextwait) == 0)
|
||||||
// Timed out
|
// Timed out
|
||||||
if (termkey_getkey_force (tk, &key) == TERMKEY_RES_KEY)
|
if (termo_getkey_force (tk, &key) == TERMO_RES_KEY)
|
||||||
on_key (tk, &key);
|
on_key (tk, &key);
|
||||||
|
|
||||||
if (fd.revents & (POLLIN | POLLHUP | POLLERR))
|
if (fd.revents & (POLLIN | POLLHUP | POLLERR))
|
||||||
termkey_advisereadable (tk);
|
termo_advisereadable (tk);
|
||||||
|
|
||||||
while ((ret = termkey_getkey (tk, &key)) == TERMKEY_RES_KEY)
|
while ((ret = termo_getkey (tk, &key)) == TERMO_RES_KEY)
|
||||||
{
|
{
|
||||||
on_key (tk, &key);
|
on_key (tk, &key);
|
||||||
|
|
||||||
if (key.type == TERMKEY_TYPE_KEY
|
if (key.type == TERMO_TYPE_KEY
|
||||||
&& (key.modifiers & TERMKEY_KEYMOD_CTRL)
|
&& (key.modifiers & TERMO_KEYMOD_CTRL)
|
||||||
&& (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
|
&& (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
|
||||||
running = 0;
|
running = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == TERMKEY_RES_AGAIN)
|
if (ret == TERMO_RES_AGAIN)
|
||||||
nextwait = termkey_get_waittime (tk);
|
nextwait = termo_get_waittime (tk);
|
||||||
else
|
else
|
||||||
nextwait = -1;
|
nextwait = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_destroy (tk);
|
termo_destroy (tk);
|
||||||
}
|
}
|
||||||
|
|
32
demo-glib.c
32
demo-glib.c
|
@ -3,24 +3,24 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
#include "termkey2.h"
|
#include "termo.h"
|
||||||
|
|
||||||
static termkey_t *tk;
|
static termo_t *tk;
|
||||||
static int timeout_id;
|
static int timeout_id;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_key (termkey_t *tk, termkey_key_t *key)
|
on_key (termo_t *tk, termo_key_t *key)
|
||||||
{
|
{
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
termkey_strfkey (tk, buffer, sizeof buffer, key, TERMKEY_FORMAT_VIM);
|
termo_strfkey (tk, buffer, sizeof buffer, key, TERMO_FORMAT_VIM);
|
||||||
printf ("%s\n", buffer);
|
printf ("%s\n", buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
key_timer (gpointer data)
|
key_timer (gpointer data)
|
||||||
{
|
{
|
||||||
termkey_key_t key;
|
termo_key_t key;
|
||||||
if (termkey_getkey_force (tk, &key) == TERMKEY_RES_KEY)
|
if (termo_getkey_force (tk, &key) == TERMO_RES_KEY)
|
||||||
on_key (tk, &key);
|
on_key (tk, &key);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -33,16 +33,16 @@ stdin_io (GIOChannel *source, GIOCondition condition, gpointer data)
|
||||||
if (timeout_id)
|
if (timeout_id)
|
||||||
g_source_remove (timeout_id);
|
g_source_remove (timeout_id);
|
||||||
|
|
||||||
termkey_advisereadable (tk);
|
termo_advisereadable (tk);
|
||||||
|
|
||||||
termkey_result_t ret;
|
termo_result_t ret;
|
||||||
termkey_key_t key;
|
termo_key_t key;
|
||||||
while ((ret = termkey_getkey (tk, &key)) == TERMKEY_RES_KEY)
|
while ((ret = termo_getkey (tk, &key)) == TERMO_RES_KEY)
|
||||||
on_key (tk, &key);
|
on_key (tk, &key);
|
||||||
|
|
||||||
if (ret == TERMKEY_RES_AGAIN)
|
if (ret == TERMO_RES_AGAIN)
|
||||||
timeout_id = g_timeout_add
|
timeout_id = g_timeout_add
|
||||||
(termkey_get_waittime (tk), key_timer, NULL);
|
(termo_get_waittime (tk), key_timer, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -54,13 +54,13 @@ main (int argc, char *argv[])
|
||||||
(void) argc;
|
(void) argc;
|
||||||
(void) argv;
|
(void) argv;
|
||||||
|
|
||||||
TERMKEY_CHECK_VERSION;
|
TERMO_CHECK_VERSION;
|
||||||
setlocale (LC_CTYPE, "");
|
setlocale (LC_CTYPE, "");
|
||||||
|
|
||||||
tk = termkey_new (STDIN_FILENO, NULL, 0);
|
tk = termo_new (STDIN_FILENO, NULL, 0);
|
||||||
if (!tk)
|
if (!tk)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "Cannot allocate termkey instance\n");
|
fprintf (stderr, "Cannot allocate termo instance\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,5 +68,5 @@ main (int argc, char *argv[])
|
||||||
g_io_add_watch (g_io_channel_unix_new (STDIN_FILENO),
|
g_io_add_watch (g_io_channel_unix_new (STDIN_FILENO),
|
||||||
G_IO_IN, stdin_io, NULL);
|
G_IO_IN, stdin_io, NULL);
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
termkey_destroy (tk);
|
termo_destroy (tk);
|
||||||
}
|
}
|
||||||
|
|
54
demo.c
54
demo.c
|
@ -6,20 +6,20 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
|
|
||||||
#include "termkey2.h"
|
#include "termo.h"
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
TERMKEY_CHECK_VERSION;
|
TERMO_CHECK_VERSION;
|
||||||
setlocale (LC_CTYPE, "");
|
setlocale (LC_CTYPE, "");
|
||||||
|
|
||||||
int mouse = 0;
|
int mouse = 0;
|
||||||
int mouse_proto = 0;
|
int mouse_proto = 0;
|
||||||
termkey_format_t format = TERMKEY_FORMAT_VIM;
|
termo_format_t format = TERMO_FORMAT_VIM;
|
||||||
|
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
termkey_t *tk;
|
termo_t *tk;
|
||||||
|
|
||||||
int opt;
|
int opt;
|
||||||
while ((opt = getopt (argc, argv, "m::p:")) != -1)
|
while ((opt = getopt (argc, argv, "m::p:")) != -1)
|
||||||
|
@ -43,21 +43,21 @@ main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tk = termkey_new (STDIN_FILENO, NULL,
|
tk = termo_new (STDIN_FILENO, NULL,
|
||||||
TERMKEY_FLAG_SPACESYMBOL | TERMKEY_FLAG_CTRLC);
|
TERMO_FLAG_SPACESYMBOL | TERMO_FLAG_CTRLC);
|
||||||
if (!tk)
|
if (!tk)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "Cannot allocate termkey instance\n");
|
fprintf (stderr, "Cannot allocate termo instance\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (termkey_get_flags (tk) & TERMKEY_FLAG_RAW)
|
if (termo_get_flags (tk) & TERMO_FLAG_RAW)
|
||||||
printf ("Termkey in RAW mode\n");
|
printf ("Termkey in RAW mode\n");
|
||||||
else
|
else
|
||||||
printf ("Termkey in multibyte mode\n");
|
printf ("Termkey in multibyte mode\n");
|
||||||
|
|
||||||
termkey_result_t ret;
|
termo_result_t ret;
|
||||||
termkey_key_t key;
|
termo_key_t key;
|
||||||
|
|
||||||
if (mouse)
|
if (mouse)
|
||||||
{
|
{
|
||||||
|
@ -66,38 +66,38 @@ main(int argc, char *argv[])
|
||||||
printf ("\033[?%dh", mouse_proto);
|
printf ("\033[?%dh", mouse_proto);
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((ret = termkey_waitkey (tk, &key)) != TERMKEY_RES_EOF)
|
while ((ret = termo_waitkey (tk, &key)) != TERMO_RES_EOF)
|
||||||
{
|
{
|
||||||
if (ret == TERMKEY_RES_KEY)
|
if (ret == TERMO_RES_KEY)
|
||||||
{
|
{
|
||||||
termkey_strfkey (tk, buffer, sizeof buffer, &key, format);
|
termo_strfkey (tk, buffer, sizeof buffer, &key, format);
|
||||||
if (key.type == TERMKEY_TYPE_MOUSE)
|
if (key.type == TERMO_TYPE_MOUSE)
|
||||||
{
|
{
|
||||||
int line, col;
|
int line, col;
|
||||||
termkey_interpret_mouse (tk, &key, NULL, NULL, &line, &col);
|
termo_interpret_mouse (tk, &key, NULL, NULL, &line, &col);
|
||||||
printf ("%s at line=%d, col=%d\n", buffer, line, col);
|
printf ("%s at line=%d, col=%d\n", buffer, line, col);
|
||||||
}
|
}
|
||||||
else if (key.type == TERMKEY_TYPE_POSITION)
|
else if (key.type == TERMO_TYPE_POSITION)
|
||||||
{
|
{
|
||||||
int line, col;
|
int line, col;
|
||||||
termkey_interpret_position (tk, &key, &line, &col);
|
termo_interpret_position (tk, &key, &line, &col);
|
||||||
printf ("Cursor position report at line=%d, col=%d\n",
|
printf ("Cursor position report at line=%d, col=%d\n",
|
||||||
line, col);
|
line, col);
|
||||||
}
|
}
|
||||||
else if (key.type == TERMKEY_TYPE_MODEREPORT)
|
else if (key.type == TERMO_TYPE_MODEREPORT)
|
||||||
{
|
{
|
||||||
int initial, mode, value;
|
int initial, mode, value;
|
||||||
termkey_interpret_modereport
|
termo_interpret_modereport
|
||||||
(tk, &key, &initial, &mode, &value);
|
(tk, &key, &initial, &mode, &value);
|
||||||
printf ("Mode report %s mode %d = %d\n",
|
printf ("Mode report %s mode %d = %d\n",
|
||||||
initial ? "DEC" : "ANSI", mode, value);
|
initial ? "DEC" : "ANSI", mode, value);
|
||||||
}
|
}
|
||||||
else if (key.type == TERMKEY_TYPE_UNKNOWN_CSI)
|
else if (key.type == TERMO_TYPE_UNKNOWN_CSI)
|
||||||
{
|
{
|
||||||
long args[16];
|
long args[16];
|
||||||
size_t nargs = 16;
|
size_t nargs = 16;
|
||||||
unsigned long command;
|
unsigned long command;
|
||||||
termkey_interpret_csi (tk, &key, args, &nargs, &command);
|
termo_interpret_csi (tk, &key, args, &nargs, &command);
|
||||||
printf ("Unrecognised CSI %c %ld;%ld %c%c\n",
|
printf ("Unrecognised CSI %c %ld;%ld %c%c\n",
|
||||||
(char) (command >> 8), args[0], args[1],
|
(char) (command >> 8), args[0], args[1],
|
||||||
(char) (command >> 16), (char) command);
|
(char) (command >> 16), (char) command);
|
||||||
|
@ -105,12 +105,12 @@ main(int argc, char *argv[])
|
||||||
else
|
else
|
||||||
printf ("Key %s\n", buffer);
|
printf ("Key %s\n", buffer);
|
||||||
|
|
||||||
if (key.type == TERMKEY_TYPE_KEY
|
if (key.type == TERMO_TYPE_KEY
|
||||||
&& key.modifiers & TERMKEY_KEYMOD_CTRL
|
&& key.modifiers & TERMO_KEYMOD_CTRL
|
||||||
&& (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
|
&& (key.code.codepoint == 'C' || key.code.codepoint == 'c'))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (key.type == TERMKEY_TYPE_KEY
|
if (key.type == TERMO_TYPE_KEY
|
||||||
&& key.modifiers == 0
|
&& key.modifiers == 0
|
||||||
&& key.code.codepoint == '?')
|
&& key.code.codepoint == '?')
|
||||||
{
|
{
|
||||||
|
@ -119,11 +119,11 @@ main(int argc, char *argv[])
|
||||||
fflush (stdout);
|
fflush (stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ret == TERMKEY_RES_ERROR)
|
else if (ret == TERMO_RES_ERROR)
|
||||||
{
|
{
|
||||||
if (errno != EINTR)
|
if (errno != EINTR)
|
||||||
{
|
{
|
||||||
perror ("termkey_waitkey");
|
perror ("termo_waitkey");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printf ("Interrupted by signal\n");
|
printf ("Interrupted by signal\n");
|
||||||
|
@ -133,5 +133,5 @@ main(int argc, char *argv[])
|
||||||
if (mouse)
|
if (mouse)
|
||||||
printf ("\033[?%dlMouse mode deactivated\n", mouse);
|
printf ("\033[?%dlMouse mode deactivated\n", mouse);
|
||||||
|
|
||||||
termkey_destroy (tk);
|
termo_destroy (tk);
|
||||||
}
|
}
|
||||||
|
|
398
driver-csi.c
398
driver-csi.c
|
@ -1,5 +1,5 @@
|
||||||
#include "termkey2.h"
|
#include "termo.h"
|
||||||
#include "termkey2-internal.h"
|
#include "termo-internal.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -11,12 +11,12 @@ static char ss3_kpalts[64];
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
termkey_t *tk;
|
termo_t *tk;
|
||||||
}
|
}
|
||||||
termkey_csi_t;
|
termo_csi_t;
|
||||||
|
|
||||||
typedef termkey_result_t (*csi_handler_fn)
|
typedef termo_result_t (*csi_handler_fn)
|
||||||
(termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args);
|
(termo_t *tk, termo_key_t *key, int cmd, long *arg, int args);
|
||||||
static csi_handler_fn csi_handlers[64];
|
static csi_handler_fn csi_handlers[64];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -25,9 +25,9 @@ static csi_handler_fn csi_handlers[64];
|
||||||
|
|
||||||
static struct keyinfo csi_ss3s[64];
|
static struct keyinfo csi_ss3s[64];
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
handle_csi_ss3_full (termkey_t *tk,
|
handle_csi_ss3_full (termo_t *tk,
|
||||||
termkey_key_t *key, int cmd, long *arg, int args)
|
termo_key_t *key, int cmd, long *arg, int args)
|
||||||
{
|
{
|
||||||
(void) tk;
|
(void) tk;
|
||||||
|
|
||||||
|
@ -41,13 +41,13 @@ handle_csi_ss3_full (termkey_t *tk,
|
||||||
key->modifiers &= ~(csi_ss3s[cmd - 0x40].modifier_mask);
|
key->modifiers &= ~(csi_ss3s[cmd - 0x40].modifier_mask);
|
||||||
key->modifiers |= csi_ss3s[cmd - 0x40].modifier_set;
|
key->modifiers |= csi_ss3s[cmd - 0x40].modifier_set;
|
||||||
|
|
||||||
if (key->code.sym == TERMKEY_SYM_UNKNOWN)
|
if (key->code.sym == TERMO_SYM_UNKNOWN)
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
register_csi_ss3_full (termkey_type_t type, termkey_sym_t sym,
|
register_csi_ss3_full (termo_type_t type, termo_sym_t sym,
|
||||||
int modifier_set, int modifier_mask, unsigned char cmd)
|
int modifier_set, int modifier_mask, unsigned char cmd)
|
||||||
{
|
{
|
||||||
if (cmd < 0x40 || cmd >= 0x80)
|
if (cmd < 0x40 || cmd >= 0x80)
|
||||||
|
@ -62,7 +62,7 @@ register_csi_ss3_full (termkey_type_t type, termkey_sym_t sym,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
register_csi_ss3 (termkey_type_t type, termkey_sym_t sym, unsigned char cmd)
|
register_csi_ss3 (termo_type_t type, termo_sym_t sym, unsigned char cmd)
|
||||||
{
|
{
|
||||||
register_csi_ss3_full (type, sym, 0, 0, cmd);
|
register_csi_ss3_full (type, sym, 0, 0, cmd);
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ register_csi_ss3 (termkey_type_t type, termkey_sym_t sym, unsigned char cmd)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
register_ss3kpalt (termkey_type_t type, termkey_sym_t sym,
|
register_ss3kpalt (termo_type_t type, termo_sym_t sym,
|
||||||
unsigned char cmd, char kpalt)
|
unsigned char cmd, char kpalt)
|
||||||
{
|
{
|
||||||
if (cmd < 0x40 || cmd >= 0x80)
|
if (cmd < 0x40 || cmd >= 0x80)
|
||||||
|
@ -94,8 +94,8 @@ register_ss3kpalt (termkey_type_t type, termkey_sym_t sym,
|
||||||
static struct keyinfo csifuncs[35];
|
static struct keyinfo csifuncs[35];
|
||||||
#define NCSIFUNCS ((long) (sizeof csifuncs / sizeof csifuncs[0]))
|
#define NCSIFUNCS ((long) (sizeof csifuncs / sizeof csifuncs[0]))
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
handle_csifunc (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
handle_csifunc (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
|
||||||
{
|
{
|
||||||
(void) cmd;
|
(void) cmd;
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ handle_csifunc (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
||||||
key->modifiers = arg[1] - 1;
|
key->modifiers = arg[1] - 1;
|
||||||
else
|
else
|
||||||
key->modifiers = 0;
|
key->modifiers = 0;
|
||||||
key->type = TERMKEY_TYPE_KEYSYM;
|
key->type = TERMO_TYPE_KEYSYM;
|
||||||
|
|
||||||
if (arg[0] == 27)
|
if (arg[0] == 27)
|
||||||
{
|
{
|
||||||
|
@ -119,21 +119,21 @@ handle_csifunc (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
||||||
key->modifiers |= csifuncs[arg[0]].modifier_set;
|
key->modifiers |= csifuncs[arg[0]].modifier_set;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
key->code.sym = TERMKEY_SYM_UNKNOWN;
|
key->code.sym = TERMO_SYM_UNKNOWN;
|
||||||
|
|
||||||
if (key->code.sym == TERMKEY_SYM_UNKNOWN)
|
if (key->code.sym == TERMO_SYM_UNKNOWN)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf (stderr, "CSI: Unknown function key %ld\n", arg[0]);
|
fprintf (stderr, "CSI: Unknown function key %ld\n", arg[0]);
|
||||||
#endif
|
#endif
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
register_csifunc (termkey_type_t type, termkey_sym_t sym, int number)
|
register_csifunc (termo_type_t type, termo_sym_t sym, int number)
|
||||||
{
|
{
|
||||||
if (number >= NCSIFUNCS)
|
if (number >= NCSIFUNCS)
|
||||||
return;
|
return;
|
||||||
|
@ -150,21 +150,21 @@ register_csifunc (termkey_type_t type, termkey_sym_t sym, int number)
|
||||||
* URxvt seems to emit this instead of ~ when holding Ctrl
|
* URxvt seems to emit this instead of ~ when holding Ctrl
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
handle_csi_caret (termkey_t *tk,
|
handle_csi_caret (termo_t *tk,
|
||||||
termkey_key_t *key, int cmd, long *arg, int args)
|
termo_key_t *key, int cmd, long *arg, int args)
|
||||||
{
|
{
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case '^':
|
case '^':
|
||||||
{
|
{
|
||||||
termkey_result_t res = handle_csifunc (tk, key, cmd, arg, args);
|
termo_result_t res = handle_csifunc (tk, key, cmd, arg, args);
|
||||||
if (res == TERMKEY_RES_KEY)
|
if (res == TERMO_RES_KEY)
|
||||||
key->modifiers |= TERMKEY_KEYMOD_CTRL;
|
key->modifiers |= TERMO_KEYMOD_CTRL;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,8 +172,8 @@ handle_csi_caret (termkey_t *tk,
|
||||||
* Handler for CSI u extended Unicode keys
|
* Handler for CSI u extended Unicode keys
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
handle_csi_u (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
handle_csi_u (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
|
||||||
{
|
{
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
|
@ -185,13 +185,13 @@ handle_csi_u (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
||||||
key->modifiers = 0;
|
key->modifiers = 0;
|
||||||
|
|
||||||
int mod = key->modifiers;
|
int mod = key->modifiers;
|
||||||
key->type = TERMKEY_TYPE_KEYSYM;
|
key->type = TERMO_TYPE_KEYSYM;
|
||||||
(*tk->method.emit_codepoint) (tk, arg[0], key);
|
(*tk->method.emit_codepoint) (tk, arg[0], key);
|
||||||
key->modifiers |= mod;
|
key->modifiers |= mod;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,8 +200,8 @@ handle_csi_u (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
||||||
* Note: This does not handle X10 encoding
|
* Note: This does not handle X10 encoding
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
handle_csi_m (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
handle_csi_m (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
|
||||||
{
|
{
|
||||||
(void) tk;
|
(void) tk;
|
||||||
|
|
||||||
|
@ -214,57 +214,57 @@ handle_csi_m (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
||||||
case 'm':
|
case 'm':
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initial && args >= 3)
|
if (!initial && args >= 3)
|
||||||
{
|
{
|
||||||
// rxvt protocol
|
// rxvt protocol
|
||||||
key->type = TERMKEY_TYPE_MOUSE;
|
key->type = TERMO_TYPE_MOUSE;
|
||||||
key->code.mouse.info = arg[0] - 0x20;
|
key->code.mouse.info = arg[0] - 0x20;
|
||||||
|
|
||||||
key->modifiers = (key->code.mouse.info & 0x1c) >> 2;
|
key->modifiers = (key->code.mouse.info & 0x1c) >> 2;
|
||||||
key->code.mouse.info &= ~0x1c;
|
key->code.mouse.info &= ~0x1c;
|
||||||
|
|
||||||
termkey_key_set_linecol (key, arg[2] - 1, arg[1] - 1);
|
termo_key_set_linecol (key, arg[2] - 1, arg[1] - 1);
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (initial == '<' && args >= 3)
|
if (initial == '<' && args >= 3)
|
||||||
{
|
{
|
||||||
// SGR protocol
|
// SGR protocol
|
||||||
key->type = TERMKEY_TYPE_MOUSE;
|
key->type = TERMO_TYPE_MOUSE;
|
||||||
key->code.mouse.info = arg[0];
|
key->code.mouse.info = arg[0];
|
||||||
|
|
||||||
key->modifiers = (key->code.mouse.info & 0x1c) >> 2;
|
key->modifiers = (key->code.mouse.info & 0x1c) >> 2;
|
||||||
key->code.mouse.info &= ~0x1c;
|
key->code.mouse.info &= ~0x1c;
|
||||||
|
|
||||||
termkey_key_set_linecol (key, arg[2] - 1, arg[1] - 1);
|
termo_key_set_linecol (key, arg[2] - 1, arg[1] - 1);
|
||||||
|
|
||||||
if (cmd == 'm') // release
|
if (cmd == 'm') // release
|
||||||
key->code.mouse.info |= 0x8000;
|
key->code.mouse.info |= 0x8000;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_result_t
|
termo_result_t
|
||||||
termkey_interpret_mouse (termkey_t *tk, const termkey_key_t *key,
|
termo_interpret_mouse (termo_t *tk, const termo_key_t *key,
|
||||||
termkey_mouse_event_t *event, int *button, int *line, int *col)
|
termo_mouse_event_t *event, int *button, int *line, int *col)
|
||||||
{
|
{
|
||||||
(void) tk;
|
(void) tk;
|
||||||
|
|
||||||
if (key->type != TERMKEY_TYPE_MOUSE)
|
if (key->type != TERMO_TYPE_MOUSE)
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
|
|
||||||
if (button)
|
if (button)
|
||||||
*button = 0;
|
*button = 0;
|
||||||
|
|
||||||
termkey_key_get_linecol (key, line, col);
|
termo_key_get_linecol (key, line, col);
|
||||||
|
|
||||||
// XXX: WTF is this logic?
|
// XXX: WTF is this logic?
|
||||||
if (!event)
|
if (!event)
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
|
|
||||||
int btn = 0;
|
int btn = 0;
|
||||||
int code = key->code.mouse.info;
|
int code = key->code.mouse.info;
|
||||||
|
@ -276,30 +276,30 @@ termkey_interpret_mouse (termkey_t *tk, const termkey_key_t *key,
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
*event = drag ? TERMKEY_MOUSE_DRAG : TERMKEY_MOUSE_PRESS;
|
*event = drag ? TERMO_MOUSE_DRAG : TERMO_MOUSE_PRESS;
|
||||||
btn = code + 1;
|
btn = code + 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
*event = TERMKEY_MOUSE_RELEASE;
|
*event = TERMO_MOUSE_RELEASE;
|
||||||
// no button hint
|
// no button hint
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 64:
|
case 64:
|
||||||
case 65:
|
case 65:
|
||||||
*event = drag ? TERMKEY_MOUSE_DRAG : TERMKEY_MOUSE_PRESS;
|
*event = drag ? TERMO_MOUSE_DRAG : TERMO_MOUSE_PRESS;
|
||||||
btn = code + 4 - 64;
|
btn = code + 4 - 64;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
*event = TERMKEY_MOUSE_UNKNOWN;
|
*event = TERMO_MOUSE_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button)
|
if (button)
|
||||||
*button = btn;
|
*button = btn;
|
||||||
if (key->code.mouse.info & 0x8000)
|
if (key->code.mouse.info & 0x8000)
|
||||||
*event = TERMKEY_MOUSE_RELEASE;
|
*event = TERMO_MOUSE_RELEASE;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -307,43 +307,43 @@ termkey_interpret_mouse (termkey_t *tk, const termkey_key_t *key,
|
||||||
* A plain CSI R with no arguments is probably actually <F3>
|
* A plain CSI R with no arguments is probably actually <F3>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
handle_csi_R (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
handle_csi_R (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
|
||||||
{
|
{
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case 'R' | '?' << 8:
|
case 'R' | '?' << 8:
|
||||||
if (args < 2)
|
if (args < 2)
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
|
|
||||||
key->type = TERMKEY_TYPE_POSITION;
|
key->type = TERMO_TYPE_POSITION;
|
||||||
termkey_key_set_linecol (key, arg[1], arg[0]);
|
termo_key_set_linecol (key, arg[1], arg[0]);
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return handle_csi_ss3_full (tk, key, cmd, arg, args);
|
return handle_csi_ss3_full (tk, key, cmd, arg, args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_result_t
|
termo_result_t
|
||||||
termkey_interpret_position (termkey_t *tk,
|
termo_interpret_position (termo_t *tk,
|
||||||
const termkey_key_t *key, int *line, int *col)
|
const termo_key_t *key, int *line, int *col)
|
||||||
{
|
{
|
||||||
(void) tk;
|
(void) tk;
|
||||||
|
|
||||||
if (key->type != TERMKEY_TYPE_POSITION)
|
if (key->type != TERMO_TYPE_POSITION)
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
|
|
||||||
termkey_key_get_linecol (key, line, col);
|
termo_key_get_linecol (key, line, col);
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Handler for CSI $y mode status reports
|
* Handler for CSI $y mode status reports
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
handle_csi_y (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
handle_csi_y (termo_t *tk, termo_key_t *key, int cmd, long *arg, int args)
|
||||||
{
|
{
|
||||||
(void) tk;
|
(void) tk;
|
||||||
|
|
||||||
|
@ -352,27 +352,27 @@ handle_csi_y (termkey_t *tk, termkey_key_t *key, int cmd, long *arg, int args)
|
||||||
case 'y' | '$' << 16:
|
case 'y' | '$' << 16:
|
||||||
case 'y' | '$' << 16 | '?' << 8:
|
case 'y' | '$' << 16 | '?' << 8:
|
||||||
if (args < 2)
|
if (args < 2)
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
|
|
||||||
key->type = TERMKEY_TYPE_MODEREPORT;
|
key->type = TERMO_TYPE_MODEREPORT;
|
||||||
key->code.mode.initial = (cmd >> 8);
|
key->code.mode.initial = (cmd >> 8);
|
||||||
key->code.mode.mode = arg[0];
|
key->code.mode.mode = arg[0];
|
||||||
key->code.mode.value = arg[1];
|
key->code.mode.value = arg[1];
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_result_t
|
termo_result_t
|
||||||
termkey_interpret_modereport (termkey_t *tk,
|
termo_interpret_modereport (termo_t *tk,
|
||||||
const termkey_key_t *key, int *initial, int *mode, int *value)
|
const termo_key_t *key, int *initial, int *mode, int *value)
|
||||||
{
|
{
|
||||||
(void) tk;
|
(void) tk;
|
||||||
|
|
||||||
if (key->type != TERMKEY_TYPE_MODEREPORT)
|
if (key->type != TERMO_TYPE_MODEREPORT)
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
|
|
||||||
if (initial)
|
if (initial)
|
||||||
*initial = key->code.mode.initial;
|
*initial = key->code.mode.initial;
|
||||||
|
@ -380,13 +380,13 @@ termkey_interpret_modereport (termkey_t *tk,
|
||||||
*mode = key->code.mode.mode;
|
*mode = key->code.mode.mode;
|
||||||
if (value)
|
if (value)
|
||||||
*value = key->code.mode.value;
|
*value = key->code.mode.value;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CHARAT(i) (tk->buffer[tk->buffstart + (i)])
|
#define CHARAT(i) (tk->buffer[tk->buffstart + (i)])
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
parse_csi (termkey_t *tk, size_t introlen, size_t *csi_len,
|
parse_csi (termo_t *tk, size_t introlen, size_t *csi_len,
|
||||||
long args[], size_t *nargs, unsigned long *commandp)
|
long args[], size_t *nargs, unsigned long *commandp)
|
||||||
{
|
{
|
||||||
size_t csi_end = introlen;
|
size_t csi_end = introlen;
|
||||||
|
@ -398,7 +398,7 @@ parse_csi (termkey_t *tk, size_t introlen, size_t *csi_len,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (csi_end >= tk->buffcount)
|
if (csi_end >= tk->buffcount)
|
||||||
return TERMKEY_RES_AGAIN;
|
return TERMO_RES_AGAIN;
|
||||||
|
|
||||||
unsigned char cmd = CHARAT (csi_end);
|
unsigned char cmd = CHARAT (csi_end);
|
||||||
*commandp = cmd;
|
*commandp = cmd;
|
||||||
|
@ -451,17 +451,17 @@ parse_csi (termkey_t *tk, size_t introlen, size_t *csi_len,
|
||||||
|
|
||||||
*nargs = argi;
|
*nargs = argi;
|
||||||
*csi_len = csi_end + 1;
|
*csi_len = csi_end + 1;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_result_t
|
termo_result_t
|
||||||
termkey_interpret_csi (termkey_t *tk, const termkey_key_t *key,
|
termo_interpret_csi (termo_t *tk, const termo_key_t *key,
|
||||||
long args[], size_t *nargs, unsigned long *cmd)
|
long args[], size_t *nargs, unsigned long *cmd)
|
||||||
{
|
{
|
||||||
if (tk->hightide == 0)
|
if (tk->hightide == 0)
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
if (key->type != TERMKEY_TYPE_UNKNOWN_CSI)
|
if (key->type != TERMO_TYPE_UNKNOWN_CSI)
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
|
|
||||||
size_t dummy;
|
size_t dummy;
|
||||||
return parse_csi (tk, 0, &dummy, args, nargs, cmd);
|
return parse_csi (tk, 0, &dummy, args, nargs, cmd);
|
||||||
|
@ -473,76 +473,76 @@ register_keys (void)
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < 64; i++)
|
for (i = 0; i < 64; i++)
|
||||||
{
|
{
|
||||||
csi_ss3s[i].sym = TERMKEY_SYM_UNKNOWN;
|
csi_ss3s[i].sym = TERMO_SYM_UNKNOWN;
|
||||||
ss3s[i].sym = TERMKEY_SYM_UNKNOWN;
|
ss3s[i].sym = TERMO_SYM_UNKNOWN;
|
||||||
ss3_kpalts[i] = 0;
|
ss3_kpalts[i] = 0;
|
||||||
}
|
}
|
||||||
for (i = 0; i < NCSIFUNCS; i++)
|
for (i = 0; i < NCSIFUNCS; i++)
|
||||||
csifuncs[i].sym = TERMKEY_SYM_UNKNOWN;
|
csifuncs[i].sym = TERMO_SYM_UNKNOWN;
|
||||||
|
|
||||||
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, 'A');
|
register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_UP, 'A');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, 'B');
|
register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_DOWN, 'B');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 'C');
|
register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_RIGHT, 'C');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, 'D');
|
register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_LEFT, 'D');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 'E');
|
register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_BEGIN, 'E');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 'F');
|
register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_END, 'F');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 'H');
|
register_csi_ss3 (TERMO_TYPE_KEYSYM, TERMO_SYM_HOME, 'H');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 1, 'P');
|
register_csi_ss3 (TERMO_TYPE_FUNCTION, 1, 'P');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 2, 'Q');
|
register_csi_ss3 (TERMO_TYPE_FUNCTION, 2, 'Q');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 3, 'R');
|
register_csi_ss3 (TERMO_TYPE_FUNCTION, 3, 'R');
|
||||||
register_csi_ss3 (TERMKEY_TYPE_FUNCTION, 4, 'S');
|
register_csi_ss3 (TERMO_TYPE_FUNCTION, 4, 'S');
|
||||||
|
|
||||||
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB,
|
register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_TAB,
|
||||||
TERMKEY_KEYMOD_SHIFT, TERMKEY_KEYMOD_SHIFT, 'Z');
|
TERMO_KEYMOD_SHIFT, TERMO_KEYMOD_SHIFT, 'Z');
|
||||||
|
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPENTER, 'M', 0);
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPENTER, 'M', 0);
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPEQUALS, 'X', '=');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPEQUALS, 'X', '=');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPMULT, 'j', '*');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPMULT, 'j', '*');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPPLUS, 'k', '+');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPPLUS, 'k', '+');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPCOMMA, 'l', ',');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPCOMMA, 'l', ',');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPMINUS, 'm', '-');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPMINUS, 'm', '-');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPPERIOD, 'n', '.');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPPERIOD, 'n', '.');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KPDIV, 'o', '/');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KPDIV, 'o', '/');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP0, 'p', '0');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP0, 'p', '0');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP1, 'q', '1');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP1, 'q', '1');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP2, 'r', '2');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP2, 'r', '2');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP3, 's', '3');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP3, 's', '3');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP4, 't', '4');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP4, 't', '4');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP5, 'u', '5');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP5, 'u', '5');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP6, 'v', '6');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP6, 'v', '6');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP7, 'w', '7');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP7, 'w', '7');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP8, 'x', '8');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP8, 'x', '8');
|
||||||
register_ss3kpalt (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_KP9, 'y', '9');
|
register_ss3kpalt (TERMO_TYPE_KEYSYM, TERMO_SYM_KP9, 'y', '9');
|
||||||
|
|
||||||
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND, 1);
|
register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_FIND, 1);
|
||||||
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT, 2);
|
register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_INSERT, 2);
|
||||||
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE, 3);
|
register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_DELETE, 3);
|
||||||
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT, 4);
|
register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_SELECT, 4);
|
||||||
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 5);
|
register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEUP, 5);
|
||||||
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 6);
|
register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEDOWN, 6);
|
||||||
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 7);
|
register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_HOME, 7);
|
||||||
register_csifunc (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 8);
|
register_csifunc (TERMO_TYPE_KEYSYM, TERMO_SYM_END, 8);
|
||||||
|
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 1, 11);
|
register_csifunc (TERMO_TYPE_FUNCTION, 1, 11);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 2, 12);
|
register_csifunc (TERMO_TYPE_FUNCTION, 2, 12);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 3, 13);
|
register_csifunc (TERMO_TYPE_FUNCTION, 3, 13);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 4, 14);
|
register_csifunc (TERMO_TYPE_FUNCTION, 4, 14);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 5, 15);
|
register_csifunc (TERMO_TYPE_FUNCTION, 5, 15);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 6, 17);
|
register_csifunc (TERMO_TYPE_FUNCTION, 6, 17);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 7, 18);
|
register_csifunc (TERMO_TYPE_FUNCTION, 7, 18);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 8, 19);
|
register_csifunc (TERMO_TYPE_FUNCTION, 8, 19);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 9, 20);
|
register_csifunc (TERMO_TYPE_FUNCTION, 9, 20);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 10, 21);
|
register_csifunc (TERMO_TYPE_FUNCTION, 10, 21);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 11, 23);
|
register_csifunc (TERMO_TYPE_FUNCTION, 11, 23);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 12, 24);
|
register_csifunc (TERMO_TYPE_FUNCTION, 12, 24);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 13, 25);
|
register_csifunc (TERMO_TYPE_FUNCTION, 13, 25);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 14, 26);
|
register_csifunc (TERMO_TYPE_FUNCTION, 14, 26);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 15, 28);
|
register_csifunc (TERMO_TYPE_FUNCTION, 15, 28);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 16, 29);
|
register_csifunc (TERMO_TYPE_FUNCTION, 16, 29);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 17, 31);
|
register_csifunc (TERMO_TYPE_FUNCTION, 17, 31);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 18, 32);
|
register_csifunc (TERMO_TYPE_FUNCTION, 18, 32);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 19, 33);
|
register_csifunc (TERMO_TYPE_FUNCTION, 19, 33);
|
||||||
register_csifunc (TERMKEY_TYPE_FUNCTION, 20, 34);
|
register_csifunc (TERMO_TYPE_FUNCTION, 20, 34);
|
||||||
|
|
||||||
csi_handlers['u' - 0x40] = &handle_csi_u;
|
csi_handlers['u' - 0x40] = &handle_csi_u;
|
||||||
|
|
||||||
|
@ -554,14 +554,14 @@ register_keys (void)
|
||||||
csi_handlers['y' - 0x40] = &handle_csi_y;
|
csi_handlers['y' - 0x40] = &handle_csi_y;
|
||||||
|
|
||||||
// URxvt
|
// URxvt
|
||||||
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP,
|
register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_UP,
|
||||||
TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'a');
|
TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'a');
|
||||||
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN,
|
register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_DOWN,
|
||||||
TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'b');
|
TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'b');
|
||||||
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT,
|
register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_RIGHT,
|
||||||
TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'c');
|
TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'c');
|
||||||
register_csi_ss3_full (TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT,
|
register_csi_ss3_full (TERMO_TYPE_KEYSYM, TERMO_SYM_LEFT,
|
||||||
TERMKEY_KEYMOD_CTRL, TERMKEY_KEYMOD_CTRL, 'd');
|
TERMO_KEYMOD_CTRL, TERMO_KEYMOD_CTRL, 'd');
|
||||||
|
|
||||||
csi_handlers['^' - 0x40] = &handle_csi_caret;
|
csi_handlers['^' - 0x40] = &handle_csi_caret;
|
||||||
|
|
||||||
|
@ -570,14 +570,14 @@ register_keys (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
new_driver (termkey_t *tk, const char *term)
|
new_driver (termo_t *tk, const char *term)
|
||||||
{
|
{
|
||||||
(void) term;
|
(void) term;
|
||||||
|
|
||||||
if (!keyinfo_initialised && !register_keys ())
|
if (!keyinfo_initialised && !register_keys ())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
termkey_csi_t *csi = malloc (sizeof *csi);
|
termo_csi_t *csi = malloc (sizeof *csi);
|
||||||
if (!csi)
|
if (!csi)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -588,13 +588,13 @@ new_driver (termkey_t *tk, const char *term)
|
||||||
static void
|
static void
|
||||||
free_driver (void *info)
|
free_driver (void *info)
|
||||||
{
|
{
|
||||||
termkey_csi_t *csi = info;
|
termo_csi_t *csi = info;
|
||||||
free (csi);
|
free (csi);
|
||||||
}
|
}
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
|
peekkey_csi (termo_t *tk, termo_csi_t *csi,
|
||||||
size_t introlen, termkey_key_t *key, int force, size_t *nbytep)
|
size_t introlen, termo_key_t *key, int force, size_t *nbytep)
|
||||||
{
|
{
|
||||||
(void) csi;
|
(void) csi;
|
||||||
|
|
||||||
|
@ -603,16 +603,16 @@ peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
|
||||||
long arg[16];
|
long arg[16];
|
||||||
unsigned long cmd;
|
unsigned long cmd;
|
||||||
|
|
||||||
termkey_result_t ret = parse_csi (tk, introlen, &csi_len, arg, &args, &cmd);
|
termo_result_t ret = parse_csi (tk, introlen, &csi_len, arg, &args, &cmd);
|
||||||
if (ret == TERMKEY_RES_AGAIN)
|
if (ret == TERMO_RES_AGAIN)
|
||||||
{
|
{
|
||||||
if (!force)
|
if (!force)
|
||||||
return TERMKEY_RES_AGAIN;
|
return TERMO_RES_AGAIN;
|
||||||
|
|
||||||
(*tk->method.emit_codepoint) (tk, '[', key);
|
(*tk->method.emit_codepoint) (tk, '[', key);
|
||||||
key->modifiers |= TERMKEY_KEYMOD_ALT;
|
key->modifiers |= TERMO_KEYMOD_ALT;
|
||||||
*nbytep = introlen;
|
*nbytep = introlen;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mouse in X10 encoding consumes the next 3 bytes also (or more with 1005)
|
// Mouse in X10 encoding consumes the next 3 bytes also (or more with 1005)
|
||||||
|
@ -621,24 +621,24 @@ peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
|
||||||
tk->buffstart += csi_len;
|
tk->buffstart += csi_len;
|
||||||
tk->buffcount -= csi_len;
|
tk->buffcount -= csi_len;
|
||||||
|
|
||||||
termkey_result_t mouse_result =
|
termo_result_t mouse_result =
|
||||||
(*tk->method.peekkey_mouse) (tk, key, nbytep);
|
(*tk->method.peekkey_mouse) (tk, key, nbytep);
|
||||||
|
|
||||||
tk->buffstart -= csi_len;
|
tk->buffstart -= csi_len;
|
||||||
tk->buffcount += csi_len;
|
tk->buffcount += csi_len;
|
||||||
|
|
||||||
if (mouse_result == TERMKEY_RES_KEY)
|
if (mouse_result == TERMO_RES_KEY)
|
||||||
*nbytep += csi_len;
|
*nbytep += csi_len;
|
||||||
return mouse_result;
|
return mouse_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_result_t result = TERMKEY_RES_NONE;
|
termo_result_t result = TERMO_RES_NONE;
|
||||||
|
|
||||||
// We know from the logic above that cmd must be >= 0x40 and < 0x80
|
// We know from the logic above that cmd must be >= 0x40 and < 0x80
|
||||||
if (csi_handlers[(cmd & 0xff) - 0x40])
|
if (csi_handlers[(cmd & 0xff) - 0x40])
|
||||||
result = (*csi_handlers[(cmd & 0xff) - 0x40]) (tk, key, cmd, arg, args);
|
result = (*csi_handlers[(cmd & 0xff) - 0x40]) (tk, key, cmd, arg, args);
|
||||||
|
|
||||||
if (result == TERMKEY_RES_NONE)
|
if (result == TERMO_RES_NONE)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
switch (args)
|
switch (args)
|
||||||
|
@ -661,49 +661,49 @@ peekkey_csi (termkey_t *tk, termkey_csi_t *csi,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
key->type = TERMKEY_TYPE_UNKNOWN_CSI;
|
key->type = TERMO_TYPE_UNKNOWN_CSI;
|
||||||
key->code.number = cmd;
|
key->code.number = cmd;
|
||||||
|
|
||||||
tk->hightide = csi_len - introlen;
|
tk->hightide = csi_len - introlen;
|
||||||
*nbytep = introlen; // Do not yet eat the data bytes
|
*nbytep = introlen; // Do not yet eat the data bytes
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
*nbytep = csi_len;
|
*nbytep = csi_len;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
peekkey_ss3 (termkey_t *tk, termkey_csi_t *csi, size_t introlen,
|
peekkey_ss3 (termo_t *tk, termo_csi_t *csi, size_t introlen,
|
||||||
termkey_key_t *key, int force, size_t *nbytep)
|
termo_key_t *key, int force, size_t *nbytep)
|
||||||
{
|
{
|
||||||
(void) csi;
|
(void) csi;
|
||||||
|
|
||||||
if (tk->buffcount < introlen + 1)
|
if (tk->buffcount < introlen + 1)
|
||||||
{
|
{
|
||||||
if (!force)
|
if (!force)
|
||||||
return TERMKEY_RES_AGAIN;
|
return TERMO_RES_AGAIN;
|
||||||
|
|
||||||
(*tk->method.emit_codepoint) (tk, 'O', key);
|
(*tk->method.emit_codepoint) (tk, 'O', key);
|
||||||
key->modifiers |= TERMKEY_KEYMOD_ALT;
|
key->modifiers |= TERMO_KEYMOD_ALT;
|
||||||
*nbytep = tk->buffcount;
|
*nbytep = tk->buffcount;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char cmd = CHARAT (introlen);
|
unsigned char cmd = CHARAT (introlen);
|
||||||
|
|
||||||
if (cmd < 0x40 || cmd >= 0x80)
|
if (cmd < 0x40 || cmd >= 0x80)
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
|
|
||||||
key->type = csi_ss3s[cmd - 0x40].type;
|
key->type = csi_ss3s[cmd - 0x40].type;
|
||||||
key->code.sym = csi_ss3s[cmd - 0x40].sym;
|
key->code.sym = csi_ss3s[cmd - 0x40].sym;
|
||||||
key->modifiers = csi_ss3s[cmd - 0x40].modifier_set;
|
key->modifiers = csi_ss3s[cmd - 0x40].modifier_set;
|
||||||
|
|
||||||
if (key->code.sym == TERMKEY_SYM_UNKNOWN)
|
if (key->code.sym == TERMO_SYM_UNKNOWN)
|
||||||
{
|
{
|
||||||
if (tk->flags & TERMKEY_FLAG_CONVERTKP && ss3_kpalts[cmd - 0x40])
|
if (tk->flags & TERMO_FLAG_CONVERTKP && ss3_kpalts[cmd - 0x40])
|
||||||
{
|
{
|
||||||
key->type = TERMKEY_TYPE_KEY;
|
key->type = TERMO_TYPE_KEY;
|
||||||
key->code.codepoint = ss3_kpalts[cmd - 0x40];
|
key->code.codepoint = ss3_kpalts[cmd - 0x40];
|
||||||
key->modifiers = 0;
|
key->modifiers = 0;
|
||||||
|
|
||||||
|
@ -718,26 +718,26 @@ peekkey_ss3 (termkey_t *tk, termkey_csi_t *csi, size_t introlen,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key->code.sym == TERMKEY_SYM_UNKNOWN)
|
if (key->code.sym == TERMO_SYM_UNKNOWN)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf (stderr, "CSI: Unknown SS3 %c (0x%02x)\n", (char) cmd, cmd);
|
fprintf (stderr, "CSI: Unknown SS3 %c (0x%02x)\n", (char) cmd, cmd);
|
||||||
#endif
|
#endif
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
*nbytep = introlen + 1;
|
*nbytep = introlen + 1;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
peekkey (termkey_t *tk, void *info,
|
peekkey (termo_t *tk, void *info,
|
||||||
termkey_key_t *key, int force, size_t *nbytep)
|
termo_key_t *key, int force, size_t *nbytep)
|
||||||
{
|
{
|
||||||
if (tk->buffcount == 0)
|
if (tk->buffcount == 0)
|
||||||
return tk->is_closed ? TERMKEY_RES_EOF : TERMKEY_RES_NONE;
|
return tk->is_closed ? TERMO_RES_EOF : TERMO_RES_NONE;
|
||||||
|
|
||||||
termkey_csi_t *csi = info;
|
termo_csi_t *csi = info;
|
||||||
|
|
||||||
// Now we're sure at least 1 byte is valid
|
// Now we're sure at least 1 byte is valid
|
||||||
unsigned char b0 = CHARAT (0);
|
unsigned char b0 = CHARAT (0);
|
||||||
|
@ -750,10 +750,10 @@ peekkey (termkey_t *tk, void *info,
|
||||||
return peekkey_ss3 (tk, csi, 1, key, force, nbytep);
|
return peekkey_ss3 (tk, csi, 1, key, force, nbytep);
|
||||||
if (b0 == 0x9b)
|
if (b0 == 0x9b)
|
||||||
return peekkey_csi (tk, csi, 1, key, force, nbytep);
|
return peekkey_csi (tk, csi, 1, key, force, nbytep);
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_driver_t termkey_driver_csi =
|
termo_driver_t termo_driver_csi =
|
||||||
{
|
{
|
||||||
.name = "CSI",
|
.name = "CSI",
|
||||||
.new_driver = new_driver,
|
.new_driver = new_driver,
|
||||||
|
|
164
driver-ti.c
164
driver-ti.c
|
@ -1,8 +1,8 @@
|
||||||
// we want strdup()
|
// we want strdup()
|
||||||
#define _XOPEN_SOURCE 600
|
#define _XOPEN_SOURCE 600
|
||||||
|
|
||||||
#include "termkey2.h"
|
#include "termo.h"
|
||||||
#include "termkey2-internal.h"
|
#include "termo-internal.h"
|
||||||
|
|
||||||
#ifdef HAVE_UNIBILIUM
|
#ifdef HAVE_UNIBILIUM
|
||||||
# include <unibilium.h>
|
# include <unibilium.h>
|
||||||
|
@ -53,7 +53,7 @@ trie_node_array_t;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
termkey_t *tk;
|
termo_t *tk;
|
||||||
trie_node_t *root;
|
trie_node_t *root;
|
||||||
|
|
||||||
char *start_string;
|
char *start_string;
|
||||||
|
@ -62,14 +62,14 @@ typedef struct
|
||||||
bool have_mouse;
|
bool have_mouse;
|
||||||
char *set_mouse_string;
|
char *set_mouse_string;
|
||||||
}
|
}
|
||||||
termkey_ti_t;
|
termo_ti_t;
|
||||||
|
|
||||||
static int funcname2keysym (const char *funcname, termkey_type_t *typep,
|
static int funcname2keysym (const char *funcname, termo_type_t *typep,
|
||||||
termkey_sym_t *symp, int *modmask, int *modsetp);
|
termo_sym_t *symp, int *modmask, int *modsetp);
|
||||||
static int insert_seq (termkey_ti_t *ti, const char *seq, trie_node_t *node);
|
static int insert_seq (termo_ti_t *ti, const char *seq, trie_node_t *node);
|
||||||
|
|
||||||
static trie_node_t *
|
static trie_node_t *
|
||||||
new_node_key (termkey_type_t type, termkey_sym_t sym, int modmask, int modset)
|
new_node_key (termo_type_t type, termo_sym_t sym, int modmask, int modset)
|
||||||
{
|
{
|
||||||
trie_node_key_t *n = malloc (sizeof *n);
|
trie_node_key_t *n = malloc (sizeof *n);
|
||||||
if (!n)
|
if (!n)
|
||||||
|
@ -176,7 +176,7 @@ compress_trie (struct trie_node *n)
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
load_terminfo (termkey_ti_t *ti, const char *term)
|
load_terminfo (termo_ti_t *ti, const char *term)
|
||||||
{
|
{
|
||||||
const char *mouse_report_string = NULL;
|
const char *mouse_report_string = NULL;
|
||||||
|
|
||||||
|
@ -212,15 +212,15 @@ load_terminfo (termkey_ti_t *ti, const char *term)
|
||||||
mouse_report_string = value;
|
mouse_report_string = value;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
termkey_type_t type;
|
termo_type_t type;
|
||||||
termkey_sym_t sym;
|
termo_sym_t sym;
|
||||||
int mask = 0;
|
int mask = 0;
|
||||||
int set = 0;
|
int set = 0;
|
||||||
|
|
||||||
if (!funcname2keysym (name + 4, &type, &sym, &mask, &set))
|
if (!funcname2keysym (name + 4, &type, &sym, &mask, &set))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (sym == TERMKEY_SYM_NONE)
|
if (sym == TERMO_SYM_NONE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
node = new_node_key (type, sym, mask, set);
|
node = new_node_key (type, sym, mask, set);
|
||||||
|
@ -262,7 +262,7 @@ load_terminfo (termkey_ti_t *ti, const char *term)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Take copies of these terminfo strings, in case we build multiple termkey
|
/* Take copies of these terminfo strings, in case we build multiple termo
|
||||||
* instances for multiple different termtypes, and it's different by the
|
* instances for multiple different termtypes, and it's different by the
|
||||||
* time we want to use it
|
* time we want to use it
|
||||||
*/
|
*/
|
||||||
|
@ -292,9 +292,9 @@ load_terminfo (termkey_ti_t *ti, const char *term)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
new_driver (termkey_t *tk, const char *term)
|
new_driver (termo_t *tk, const char *term)
|
||||||
{
|
{
|
||||||
termkey_ti_t *ti = calloc (1, sizeof *ti);
|
termo_ti_t *ti = calloc (1, sizeof *ti);
|
||||||
if (!ti)
|
if (!ti)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -318,7 +318,7 @@ abort_free_ti:
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
write_string (termkey_t *tk, char *string)
|
write_string (termo_t *tk, char *string)
|
||||||
{
|
{
|
||||||
if (tk->fd == -1 || !isatty (tk->fd) || !string)
|
if (tk->fd == -1 || !isatty (tk->fd) || !string)
|
||||||
return true;
|
return true;
|
||||||
|
@ -340,7 +340,7 @@ write_string (termkey_t *tk, char *string)
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
set_mouse (termkey_ti_t *ti, bool enable)
|
set_mouse (termo_ti_t *ti, bool enable)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_UNIBILIUM
|
#ifdef HAVE_UNIBILIUM
|
||||||
unibi_var_t params[9] = { enable, 0, 0, 0, 0, 0, 0, 0, 0 };
|
unibi_var_t params[9] = { enable, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||||
|
@ -355,9 +355,9 @@ set_mouse (termkey_ti_t *ti, bool enable)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
start_driver (termkey_t *tk, void *info)
|
start_driver (termo_t *tk, void *info)
|
||||||
{
|
{
|
||||||
termkey_ti_t *ti = info;
|
termo_ti_t *ti = info;
|
||||||
// TODO: Don't start the mouse automatically, find a nice place to put
|
// TODO: Don't start the mouse automatically, find a nice place to put
|
||||||
// a public function to be called by users.
|
// a public function to be called by users.
|
||||||
// TODO: Try to autodetect rxvt and use its protocol instead of mode 1000
|
// TODO: Try to autodetect rxvt and use its protocol instead of mode 1000
|
||||||
|
@ -368,9 +368,9 @@ start_driver (termkey_t *tk, void *info)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
stop_driver (termkey_t *tk, void *info)
|
stop_driver (termo_t *tk, void *info)
|
||||||
{
|
{
|
||||||
termkey_ti_t *ti = info;
|
termo_ti_t *ti = info;
|
||||||
if (ti->have_mouse && !set_mouse (ti, false))
|
if (ti->have_mouse && !set_mouse (ti, false))
|
||||||
return false;
|
return false;
|
||||||
return write_string (tk, ti->stop_string);
|
return write_string (tk, ti->stop_string);
|
||||||
|
@ -379,7 +379,7 @@ stop_driver (termkey_t *tk, void *info)
|
||||||
static void
|
static void
|
||||||
free_driver (void *info)
|
free_driver (void *info)
|
||||||
{
|
{
|
||||||
termkey_ti_t *ti = info;
|
termo_ti_t *ti = info;
|
||||||
free_trie (ti->root);
|
free_trie (ti->root);
|
||||||
free (ti->set_mouse_string);
|
free (ti->set_mouse_string);
|
||||||
free (ti->start_string);
|
free (ti->start_string);
|
||||||
|
@ -389,14 +389,14 @@ free_driver (void *info)
|
||||||
|
|
||||||
#define CHARAT(i) (tk->buffer[tk->buffstart + (i)])
|
#define CHARAT(i) (tk->buffer[tk->buffstart + (i)])
|
||||||
|
|
||||||
static termkey_result_t
|
static termo_result_t
|
||||||
peekkey (termkey_t *tk, void *info,
|
peekkey (termo_t *tk, void *info,
|
||||||
termkey_key_t *key, int force, size_t *nbytep)
|
termo_key_t *key, int force, size_t *nbytep)
|
||||||
{
|
{
|
||||||
termkey_ti_t *ti = info;
|
termo_ti_t *ti = info;
|
||||||
|
|
||||||
if (tk->buffcount == 0)
|
if (tk->buffcount == 0)
|
||||||
return tk->is_closed ? TERMKEY_RES_EOF : TERMKEY_RES_NONE;
|
return tk->is_closed ? TERMO_RES_EOF : TERMO_RES_NONE;
|
||||||
|
|
||||||
trie_node_t *p = ti->root;
|
trie_node_t *p = ti->root;
|
||||||
unsigned int pos = 0;
|
unsigned int pos = 0;
|
||||||
|
@ -415,20 +415,20 @@ peekkey (termkey_t *tk, void *info,
|
||||||
key->code.sym = nk->key.sym;
|
key->code.sym = nk->key.sym;
|
||||||
key->modifiers = nk->key.modifier_set;
|
key->modifiers = nk->key.modifier_set;
|
||||||
*nbytep = pos;
|
*nbytep = pos;
|
||||||
return TERMKEY_RES_KEY;
|
return TERMO_RES_KEY;
|
||||||
}
|
}
|
||||||
else if (p->type == TYPE_MOUSE)
|
else if (p->type == TYPE_MOUSE)
|
||||||
{
|
{
|
||||||
tk->buffstart += pos;
|
tk->buffstart += pos;
|
||||||
tk->buffcount -= pos;
|
tk->buffcount -= pos;
|
||||||
|
|
||||||
termkey_result_t mouse_result =
|
termo_result_t mouse_result =
|
||||||
(*tk->method.peekkey_mouse) (tk, key, nbytep);
|
(*tk->method.peekkey_mouse) (tk, key, nbytep);
|
||||||
|
|
||||||
tk->buffstart -= pos;
|
tk->buffstart -= pos;
|
||||||
tk->buffcount += pos;
|
tk->buffcount += pos;
|
||||||
|
|
||||||
if (mouse_result == TERMKEY_RES_KEY)
|
if (mouse_result == TERMO_RES_KEY)
|
||||||
*nbytep += pos;
|
*nbytep += pos;
|
||||||
|
|
||||||
return mouse_result;
|
return mouse_result;
|
||||||
|
@ -438,65 +438,65 @@ peekkey (termkey_t *tk, void *info,
|
||||||
// If p is not NULL then we hadn't walked off the end yet, so we have a
|
// If p is not NULL then we hadn't walked off the end yet, so we have a
|
||||||
// partial match
|
// partial match
|
||||||
if (p && !force)
|
if (p && !force)
|
||||||
return TERMKEY_RES_AGAIN;
|
return TERMO_RES_AGAIN;
|
||||||
|
|
||||||
return TERMKEY_RES_NONE;
|
return TERMO_RES_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct func
|
static struct func
|
||||||
{
|
{
|
||||||
const char *funcname;
|
const char *funcname;
|
||||||
termkey_type_t type;
|
termo_type_t type;
|
||||||
termkey_sym_t sym;
|
termo_sym_t sym;
|
||||||
int mods;
|
int mods;
|
||||||
}
|
}
|
||||||
funcs[] =
|
funcs[] =
|
||||||
{
|
{
|
||||||
/* THIS LIST MUST REMAIN SORTED! */
|
/* THIS LIST MUST REMAIN SORTED! */
|
||||||
{ "backspace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BACKSPACE, 0 },
|
{ "backspace", TERMO_TYPE_KEYSYM, TERMO_SYM_BACKSPACE, 0 },
|
||||||
{ "begin", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 },
|
{ "begin", TERMO_TYPE_KEYSYM, TERMO_SYM_BEGIN, 0 },
|
||||||
{ "beg", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 },
|
{ "beg", TERMO_TYPE_KEYSYM, TERMO_SYM_BEGIN, 0 },
|
||||||
{ "btab", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, TERMKEY_KEYMOD_SHIFT },
|
{ "btab", TERMO_TYPE_KEYSYM, TERMO_SYM_TAB, TERMO_KEYMOD_SHIFT },
|
||||||
{ "cancel", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CANCEL, 0 },
|
{ "cancel", TERMO_TYPE_KEYSYM, TERMO_SYM_CANCEL, 0 },
|
||||||
{ "clear", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLEAR, 0 },
|
{ "clear", TERMO_TYPE_KEYSYM, TERMO_SYM_CLEAR, 0 },
|
||||||
{ "close", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLOSE, 0 },
|
{ "close", TERMO_TYPE_KEYSYM, TERMO_SYM_CLOSE, 0 },
|
||||||
{ "command", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COMMAND, 0 },
|
{ "command", TERMO_TYPE_KEYSYM, TERMO_SYM_COMMAND, 0 },
|
||||||
{ "copy", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COPY, 0 },
|
{ "copy", TERMO_TYPE_KEYSYM, TERMO_SYM_COPY, 0 },
|
||||||
{ "dc", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE, 0 },
|
{ "dc", TERMO_TYPE_KEYSYM, TERMO_SYM_DELETE, 0 },
|
||||||
{ "down", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, 0 },
|
{ "down", TERMO_TYPE_KEYSYM, TERMO_SYM_DOWN, 0 },
|
||||||
{ "end", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 0 },
|
{ "end", TERMO_TYPE_KEYSYM, TERMO_SYM_END, 0 },
|
||||||
{ "enter", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_ENTER, 0 },
|
{ "enter", TERMO_TYPE_KEYSYM, TERMO_SYM_ENTER, 0 },
|
||||||
{ "exit", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_EXIT, 0 },
|
{ "exit", TERMO_TYPE_KEYSYM, TERMO_SYM_EXIT, 0 },
|
||||||
{ "find", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND, 0 },
|
{ "find", TERMO_TYPE_KEYSYM, TERMO_SYM_FIND, 0 },
|
||||||
{ "help", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HELP, 0 },
|
{ "help", TERMO_TYPE_KEYSYM, TERMO_SYM_HELP, 0 },
|
||||||
{ "home", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 0 },
|
{ "home", TERMO_TYPE_KEYSYM, TERMO_SYM_HOME, 0 },
|
||||||
{ "ic", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT, 0 },
|
{ "ic", TERMO_TYPE_KEYSYM, TERMO_SYM_INSERT, 0 },
|
||||||
{ "left", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, 0 },
|
{ "left", TERMO_TYPE_KEYSYM, TERMO_SYM_LEFT, 0 },
|
||||||
{ "mark", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MARK, 0 },
|
{ "mark", TERMO_TYPE_KEYSYM, TERMO_SYM_MARK, 0 },
|
||||||
{ "message", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MESSAGE, 0 },
|
{ "message", TERMO_TYPE_KEYSYM, TERMO_SYM_MESSAGE, 0 },
|
||||||
{ "mouse", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_NONE, 0 },
|
{ "mouse", TERMO_TYPE_KEYSYM, TERMO_SYM_NONE, 0 },
|
||||||
{ "move", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MOVE, 0 },
|
{ "move", TERMO_TYPE_KEYSYM, TERMO_SYM_MOVE, 0 },
|
||||||
// Not quite, but it's the best we can do
|
// Not quite, but it's the best we can do
|
||||||
{ "next", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 },
|
{ "next", TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEDOWN, 0 },
|
||||||
{ "npage", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 },
|
{ "npage", TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEDOWN, 0 },
|
||||||
{ "open", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPEN, 0 },
|
{ "open", TERMO_TYPE_KEYSYM, TERMO_SYM_OPEN, 0 },
|
||||||
{ "options", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPTIONS, 0 },
|
{ "options", TERMO_TYPE_KEYSYM, TERMO_SYM_OPTIONS, 0 },
|
||||||
{ "ppage", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 },
|
{ "ppage", TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEUP, 0 },
|
||||||
// Not quite, but it's the best we can do
|
// Not quite, but it's the best we can do
|
||||||
{ "previous", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 },
|
{ "previous", TERMO_TYPE_KEYSYM, TERMO_SYM_PAGEUP, 0 },
|
||||||
{ "print", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PRINT, 0 },
|
{ "print", TERMO_TYPE_KEYSYM, TERMO_SYM_PRINT, 0 },
|
||||||
{ "redo", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REDO, 0 },
|
{ "redo", TERMO_TYPE_KEYSYM, TERMO_SYM_REDO, 0 },
|
||||||
{ "reference", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFERENCE, 0 },
|
{ "reference", TERMO_TYPE_KEYSYM, TERMO_SYM_REFERENCE, 0 },
|
||||||
{ "refresh", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFRESH, 0 },
|
{ "refresh", TERMO_TYPE_KEYSYM, TERMO_SYM_REFRESH, 0 },
|
||||||
{ "replace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REPLACE, 0 },
|
{ "replace", TERMO_TYPE_KEYSYM, TERMO_SYM_REPLACE, 0 },
|
||||||
{ "restart", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESTART, 0 },
|
{ "restart", TERMO_TYPE_KEYSYM, TERMO_SYM_RESTART, 0 },
|
||||||
{ "resume", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESUME, 0 },
|
{ "resume", TERMO_TYPE_KEYSYM, TERMO_SYM_RESUME, 0 },
|
||||||
{ "right", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 0 },
|
{ "right", TERMO_TYPE_KEYSYM, TERMO_SYM_RIGHT, 0 },
|
||||||
{ "save", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SAVE, 0 },
|
{ "save", TERMO_TYPE_KEYSYM, TERMO_SYM_SAVE, 0 },
|
||||||
{ "select", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT, 0 },
|
{ "select", TERMO_TYPE_KEYSYM, TERMO_SYM_SELECT, 0 },
|
||||||
{ "suspend", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SUSPEND, 0 },
|
{ "suspend", TERMO_TYPE_KEYSYM, TERMO_SYM_SUSPEND, 0 },
|
||||||
{ "undo", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UNDO, 0 },
|
{ "undo", TERMO_TYPE_KEYSYM, TERMO_SYM_UNDO, 0 },
|
||||||
{ "up", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, 0 },
|
{ "up", TERMO_TYPE_KEYSYM, TERMO_SYM_UP, 0 },
|
||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -508,7 +508,7 @@ func_compare (const void *key, const void *element)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
funcname2keysym (const char *funcname,
|
funcname2keysym (const char *funcname,
|
||||||
termkey_type_t *typep, termkey_sym_t *symp, int *modmaskp, int *modsetp)
|
termo_type_t *typep, termo_sym_t *symp, int *modmaskp, int *modsetp)
|
||||||
{
|
{
|
||||||
struct func *func = bsearch (funcname, funcs,
|
struct func *func = bsearch (funcname, funcs,
|
||||||
sizeof funcs / sizeof funcs[0], sizeof funcs[0], func_compare);
|
sizeof funcs / sizeof funcs[0], sizeof funcs[0], func_compare);
|
||||||
|
@ -523,7 +523,7 @@ funcname2keysym (const char *funcname,
|
||||||
|
|
||||||
if (funcname[0] == 'f' && isdigit (funcname[1]))
|
if (funcname[0] == 'f' && isdigit (funcname[1]))
|
||||||
{
|
{
|
||||||
*typep = TERMKEY_TYPE_FUNCTION;
|
*typep = TERMO_TYPE_FUNCTION;
|
||||||
*symp = atoi (funcname + 1);
|
*symp = atoi (funcname + 1);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -532,8 +532,8 @@ funcname2keysym (const char *funcname,
|
||||||
if (funcname[0] == 's' && funcname2keysym
|
if (funcname[0] == 's' && funcname2keysym
|
||||||
(funcname + 1, typep, symp, modmaskp, modsetp))
|
(funcname + 1, typep, symp, modmaskp, modsetp))
|
||||||
{
|
{
|
||||||
*modmaskp |= TERMKEY_KEYMOD_SHIFT;
|
*modmaskp |= TERMO_KEYMOD_SHIFT;
|
||||||
*modsetp |= TERMKEY_KEYMOD_SHIFT;
|
*modsetp |= TERMO_KEYMOD_SHIFT;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -546,7 +546,7 @@ funcname2keysym (const char *funcname,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
insert_seq (termkey_ti_t *ti, const char *seq, trie_node_t *node)
|
insert_seq (termo_ti_t *ti, const char *seq, trie_node_t *node)
|
||||||
{
|
{
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
trie_node_t *p = ti->root;
|
trie_node_t *p = ti->root;
|
||||||
|
@ -603,7 +603,7 @@ insert_seq (termkey_ti_t *ti, const char *seq, trie_node_t *node)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
termkey_driver_t termkey_driver_ti =
|
termo_driver_t termo_driver_ti =
|
||||||
{
|
{
|
||||||
.name = "terminfo",
|
.name = "terminfo",
|
||||||
.new_driver = new_driver,
|
.new_driver = new_driver,
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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
|
#ifndef TERMO_INTERNAL_H
|
||||||
#define TERMKEY2_INTERNAL_H
|
#define TERMO_INTERNAL_H
|
||||||
|
|
||||||
#include "termkey2.h"
|
#include "termo.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <iconv.h>
|
#include <iconv.h>
|
||||||
|
|
||||||
typedef struct termkey_driver termkey_driver_t;
|
typedef struct termo_driver termo_driver_t;
|
||||||
struct termkey_driver
|
struct termo_driver
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
void *(*new_driver) (termkey_t *tk, const char *term);
|
void *(*new_driver) (termo_t *tk, const char *term);
|
||||||
void (*free_driver) (void *info);
|
void (*free_driver) (void *info);
|
||||||
int (*start_driver) (termkey_t *tk, void *info);
|
int (*start_driver) (termo_t *tk, void *info);
|
||||||
int (*stop_driver) (termkey_t *tk, void *info);
|
int (*stop_driver) (termo_t *tk, void *info);
|
||||||
termkey_result_t (*peekkey) (termkey_t *tk,
|
termo_result_t (*peekkey) (termo_t *tk,
|
||||||
void *info, termkey_key_t *key, int force, size_t *nbytes);
|
void *info, termo_key_t *key, int force, size_t *nbytes);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct keyinfo keyinfo_t;
|
typedef struct keyinfo keyinfo_t;
|
||||||
struct keyinfo
|
struct keyinfo
|
||||||
{
|
{
|
||||||
termkey_type_t type;
|
termo_type_t type;
|
||||||
termkey_sym_t sym;
|
termo_sym_t sym;
|
||||||
int modifier_mask;
|
int modifier_mask;
|
||||||
int modifier_set;
|
int modifier_set;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct termkey_driver_node termkey_driver_node_t;
|
typedef struct termo_driver_node termo_driver_node_t;
|
||||||
struct termkey_driver_node
|
struct termo_driver_node
|
||||||
{
|
{
|
||||||
termkey_driver_t *driver;
|
termo_driver_t *driver;
|
||||||
void *info;
|
void *info;
|
||||||
termkey_driver_node_t *next;
|
termo_driver_node_t *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct termkey
|
struct termo
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
int flags;
|
int flags;
|
||||||
|
@ -49,7 +49,7 @@ struct termkey
|
||||||
size_t buffsize; // Total malloc'ed size
|
size_t buffsize; // Total malloc'ed size
|
||||||
|
|
||||||
// Position beyond buffstart at which peekkey() should next start.
|
// Position beyond buffstart at which peekkey() should next start.
|
||||||
// Normally 0, but see also termkey_interpret_csi().
|
// Normally 0, but see also termo_interpret_csi().
|
||||||
size_t hightide;
|
size_t hightide;
|
||||||
|
|
||||||
struct termios restore_termios;
|
struct termios restore_termios;
|
||||||
|
@ -66,24 +66,24 @@ struct termkey
|
||||||
keyinfo_t c0[32]; // There are 32 C0 codes
|
keyinfo_t c0[32]; // There are 32 C0 codes
|
||||||
iconv_t to_utf32_conv;
|
iconv_t to_utf32_conv;
|
||||||
iconv_t from_utf32_conv;
|
iconv_t from_utf32_conv;
|
||||||
termkey_driver_node_t *drivers;
|
termo_driver_node_t *drivers;
|
||||||
|
|
||||||
// Now some "protected" methods for the driver to call but which we don't
|
// Now some "protected" methods for the driver to call but which we don't
|
||||||
// want exported as real symbols in the library
|
// want exported as real symbols in the library
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
void (*emit_codepoint) (termkey_t *tk,
|
void (*emit_codepoint) (termo_t *tk,
|
||||||
uint32_t codepoint, termkey_key_t *key);
|
uint32_t codepoint, termo_key_t *key);
|
||||||
termkey_result_t (*peekkey_simple) (termkey_t *tk,
|
termo_result_t (*peekkey_simple) (termo_t *tk,
|
||||||
termkey_key_t *key, int force, size_t *nbytes);
|
termo_key_t *key, int force, size_t *nbytes);
|
||||||
termkey_result_t (*peekkey_mouse) (termkey_t *tk,
|
termo_result_t (*peekkey_mouse) (termo_t *tk,
|
||||||
termkey_key_t *key, size_t *nbytes);
|
termo_key_t *key, size_t *nbytes);
|
||||||
}
|
}
|
||||||
method;
|
method;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
termkey_key_get_linecol (const termkey_key_t *key, int *line, int *col)
|
termo_key_get_linecol (const termo_key_t *key, int *line, int *col)
|
||||||
{
|
{
|
||||||
if (col)
|
if (col)
|
||||||
*col = key->code.mouse.x;
|
*col = key->code.mouse.x;
|
||||||
|
@ -93,7 +93,7 @@ termkey_key_get_linecol (const termkey_key_t *key, int *line, int *col)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
termkey_key_set_linecol (termkey_key_t *key, int line, int col)
|
termo_key_set_linecol (termo_key_t *key, int line, int col)
|
||||||
{
|
{
|
||||||
if (line > UINT16_MAX)
|
if (line > UINT16_MAX)
|
||||||
line = UINT16_MAX;
|
line = UINT16_MAX;
|
||||||
|
@ -105,8 +105,8 @@ termkey_key_set_linecol (termkey_key_t *key, int line, int col)
|
||||||
key->code.mouse.y = line;
|
key->code.mouse.y = line;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern termkey_driver_t termkey_driver_csi;
|
extern termo_driver_t termo_driver_csi;
|
||||||
extern termkey_driver_t termkey_driver_ti;
|
extern termo_driver_t termo_driver_ti;
|
||||||
|
|
||||||
#endif // ! TERMKEY2_INTERNAL_H
|
#endif // ! TERMO_INTERNAL_H
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue