mirror of
https://github.com/neovim/neovim.git
synced 2025-11-15 23:01:24 +00:00
refactor(termkey): make termkey use internal terminfo properly
problem: termkey/driver-ti.c had its internal dependency upon unibilium which would completely skip builtin terminfo defs. solution: add termkey info to TerminfoEntry struct NOTE: this disables a lot of named function keys which are present as terminfo "keys" both are mostly unset in terminfo entries for modern terminals, and also not recognized by nvim as mappable keys anyway, except a few ones like `<undo>` which this still will keep. We probably don't want to encode up to F63 keys forever. While only 12 physical keys are available on modern keybords, instead Chords using F-keys are usually encoded as high key numbers, like <C-S-F3> becoming <F39> . But reconsideirg that has implications for configuration that is best done as a separate (breaking) change.
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
-- 3. Use database to generate src/nvim/tui/terminfo_defs.h
|
||||
|
||||
local url = 'https://invisible-island.net/datafiles/current/terminfo.src.gz'
|
||||
local target_gen = 'src/nvim/tui/terminfo_defs.h'
|
||||
local target_gen = 'src/nvim/tui/terminfo_builtin.h'
|
||||
local target_enum = 'src/nvim/tui/terminfo_enum_defs.h'
|
||||
|
||||
local entries = {
|
||||
@@ -84,6 +84,25 @@ local wanted_strings_ext = {
|
||||
{ 'set_underline_style', 'Smulx' },
|
||||
}
|
||||
|
||||
-- Note: these are only consumed by driver-ti via it's table of "funcs" keys.
|
||||
-- Second value is whether there is a "shift" variant in terminfo.
|
||||
local wanted_termkeys = {
|
||||
{ 'backspace', false },
|
||||
{ 'beg', true }, -- sometimes known as: "begin"
|
||||
{ 'btab', false },
|
||||
{ 'clear', false },
|
||||
{ 'dc', true },
|
||||
{ 'end', true },
|
||||
{ 'find', true },
|
||||
{ 'home', true },
|
||||
{ 'ic', true },
|
||||
{ 'npage', false },
|
||||
{ 'ppage', false },
|
||||
{ 'select', false },
|
||||
{ 'suspend', true },
|
||||
{ 'undo', true },
|
||||
}
|
||||
|
||||
local db = '/tmp/nvim_terminfo'
|
||||
if vim.uv.fs_stat(db) == nil then
|
||||
local function sys(cmd)
|
||||
@@ -130,7 +149,23 @@ for _, item in ipairs(wanted_strings_ext) do
|
||||
f_enum:write(' ' .. enumify(item[1]) .. ',\n')
|
||||
end
|
||||
f_enum:write(' kTermCount, // sentinel\n')
|
||||
f_enum:write('} TerminfoDef;\n')
|
||||
f_enum:write('} TerminfoDef;\n\n')
|
||||
|
||||
f_enum:write([[
|
||||
// TODO(bfredl): physical F-keys beyond F12 are uncommon. But terminfo
|
||||
// likes to represent chords with shift and/or ctrl and F keys as high
|
||||
// F-key numbers. The same chords can also be recognized by driver-csi.c
|
||||
// but will then be encoded as chords. We might actually prefer that but it is
|
||||
// potentially breaking change.
|
||||
]])
|
||||
local func_key_max = 63
|
||||
f_enum:write('#define kTerminfoFuncKeyMax ' .. func_key_max .. '\n')
|
||||
f_enum:write('typedef enum {\n')
|
||||
for _, item in ipairs(wanted_termkeys) do
|
||||
f_enum:write(' kTermKey_' .. item[1] .. ',\n')
|
||||
end
|
||||
f_enum:write(' kTermKeyCount,\n')
|
||||
f_enum:write('} TerminfoKey;\n')
|
||||
f_enum:close()
|
||||
|
||||
local f_defs = io.open(target_gen, 'wb')
|
||||
@@ -141,7 +176,7 @@ local version = io.popen('infocmp -V'):read '*a'
|
||||
f_defs:write('// Generated by src/gen/gen_terminfo.lua and ' .. version .. '\n')
|
||||
|
||||
f_defs:write('#pragma once\n\n')
|
||||
f_defs:write('#include "nvim/tui/terminfo.h"\n')
|
||||
f_defs:write('#include "nvim/tui/terminfo_defs.h"\n')
|
||||
|
||||
for _, entry in ipairs(entries) do
|
||||
local term, target = unpack(entry)
|
||||
@@ -186,8 +221,34 @@ for _, entry in ipairs(entries) do
|
||||
for _, item in ipairs(wanted_strings_ext) do
|
||||
f_defs:write(' [' .. enumify(item[1]) .. '] = ' .. quote(strs[item[2]]) .. ',\n')
|
||||
end
|
||||
|
||||
f_defs:write(' },\n')
|
||||
f_defs:write(' .keys = {\n')
|
||||
for _, item in ipairs(wanted_termkeys) do
|
||||
local name = item[1]
|
||||
f_defs:write(
|
||||
' [kTermKey_'
|
||||
.. name
|
||||
.. '] = {'
|
||||
.. quote(strs['key_' .. name])
|
||||
.. ', '
|
||||
.. quote(strs['key_s' .. name])
|
||||
.. '},\n'
|
||||
)
|
||||
end
|
||||
f_defs:write(' },\n')
|
||||
f_defs:write(' .f_keys = {\n')
|
||||
if strs['key_f1'] == nil then
|
||||
f_defs:write(' NULL,\n') -- compiler get sad if list is empty
|
||||
else
|
||||
f_defs:write(' // note: offset by one, f_keys[0] is F1 and so on\n')
|
||||
end
|
||||
for i = 1, func_key_max do
|
||||
if strs['key_f' .. i] ~= nil then
|
||||
f_defs:write(' [' .. i - 1 .. '] = ' .. quote(strs['key_f' .. i]) .. ',\n')
|
||||
end
|
||||
end
|
||||
f_defs:write(' },\n')
|
||||
|
||||
f_defs:write('};\n')
|
||||
end
|
||||
|
||||
@@ -200,5 +261,15 @@ f_defs:write('#define XLIST_TERMINFO_EXT \\\n')
|
||||
for _, item in ipairs(wanted_strings_ext) do
|
||||
f_defs:write(' X(' .. item[1] .. ', ' .. item[2] .. ') \\\n')
|
||||
end
|
||||
f_defs:write('// end of list\n\n')
|
||||
f_defs:write('#define XYLIST_TERMINFO_KEYS \\\n')
|
||||
for _, item in ipairs(wanted_termkeys) do
|
||||
f_defs:write(' ' .. (item[2] and 'Y' or 'X') .. '(' .. item[1] .. ') \\\n')
|
||||
end
|
||||
f_defs:write('// end of list\n\n')
|
||||
f_defs:write('#define XLIST_TERMINFO_FKEYS \\\n')
|
||||
for i = 1, func_key_max do
|
||||
f_defs:write(' X(f' .. i .. ') \\\n')
|
||||
end
|
||||
f_defs:write('// end of list\n')
|
||||
f_defs:close()
|
||||
|
||||
@@ -123,7 +123,7 @@ static PMap(int) kitty_key_map = MAP_INIT;
|
||||
|
||||
#include "tui/input.c.generated.h"
|
||||
|
||||
void tinput_init(TermInput *input, Loop *loop)
|
||||
void tinput_init(TermInput *input, Loop *loop, TerminfoEntry *ti)
|
||||
{
|
||||
input->loop = loop;
|
||||
input->paste = 0;
|
||||
@@ -136,13 +136,7 @@ void tinput_init(TermInput *input, Loop *loop)
|
||||
pmap_put(int)(&kitty_key_map, kitty_key_map_entry[i].key, (ptr_t)kitty_key_map_entry[i].name);
|
||||
}
|
||||
|
||||
const char *term = os_getenv_noalloc("TERM");
|
||||
|
||||
if (!term) {
|
||||
term = ""; // termkey_new_abstract assumes non-null (#2745)
|
||||
}
|
||||
|
||||
input->tk = termkey_new_abstract(term, (TERMKEY_FLAG_UTF8 | TERMKEY_FLAG_NOSTART
|
||||
input->tk = termkey_new_abstract(ti, (TERMKEY_FLAG_UTF8 | TERMKEY_FLAG_NOSTART
|
||||
| TERMKEY_FLAG_KEEPC0));
|
||||
termkey_set_buffer_size(input->tk, INPUT_BUFFER_SIZE);
|
||||
termkey_hook_terminfo_getstr(input->tk, input->tk_ti_hook_fn, input);
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include "nvim/charset.h"
|
||||
#include "nvim/memory.h"
|
||||
#include "nvim/tui/terminfo.h"
|
||||
#include "nvim/tui/terminfo_defs.h"
|
||||
#include "nvim/tui/terminfo_builtin.h"
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
# include "nvim/os/os.h"
|
||||
@@ -180,6 +180,36 @@ bool terminfo_from_unibilium(TerminfoEntry *ti, char *termname, Arena *arena)
|
||||
}
|
||||
}
|
||||
|
||||
#define X(name) { unibi_key_##name, unibi_string_begin_ },
|
||||
#define Y(name) { unibi_key_##name, unibi_key_s##name },
|
||||
static const enum unibi_string uni_keys[][2] = {
|
||||
XYLIST_TERMINFO_KEYS
|
||||
};
|
||||
#undef X
|
||||
#undef Y
|
||||
|
||||
for (size_t i = 0; i < ARRAY_SIZE(uni_keys); i++) {
|
||||
const char *val = unibi_get_str(ut, uni_keys[i][0]);
|
||||
if (val) {
|
||||
ti->keys[i][0] = arena_strdup(arena, val);
|
||||
if (uni_keys[i][1] != unibi_string_begin_) {
|
||||
const char *sval = unibi_get_str(ut, uni_keys[i][1]);
|
||||
ti->keys[i][1] = sval ? arena_strdup(arena, sval) : NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static const enum unibi_string uni_fkeys[] = {
|
||||
#define X(name) unibi_key_##name,
|
||||
XLIST_TERMINFO_FKEYS
|
||||
#undef X
|
||||
};
|
||||
|
||||
for (size_t i = 0; i < ARRAY_SIZE(uni_fkeys); i++) {
|
||||
const char *val = unibi_get_str(ut, uni_fkeys[i]);
|
||||
ti->f_keys[i] = val ? arena_strdup(arena, val) : NULL;
|
||||
}
|
||||
|
||||
unibi_destroy(ut);
|
||||
return true;
|
||||
}
|
||||
@@ -223,7 +253,7 @@ String terminfo_info_msg(const TerminfoEntry *ti, const char *termname)
|
||||
#undef X
|
||||
};
|
||||
|
||||
for (size_t i = 0 + 1; i < ARRAY_SIZE(string_names); i++) {
|
||||
for (size_t i = 0; i < ARRAY_SIZE(string_names); i++) {
|
||||
const char *s = ti->defs[i];
|
||||
if (s) {
|
||||
kv_printf(data, " %-31s = ", string_names[i]);
|
||||
@@ -233,8 +263,44 @@ String terminfo_info_msg(const TerminfoEntry *ti, const char *termname)
|
||||
}
|
||||
}
|
||||
|
||||
kv_push(data, NUL);
|
||||
static const char *key_names[] = {
|
||||
#define X(name) #name,
|
||||
#define Y(name) #name,
|
||||
XYLIST_TERMINFO_KEYS
|
||||
#undef X
|
||||
#undef Y
|
||||
};
|
||||
|
||||
for (size_t i = 0 + 1; i < ARRAY_SIZE(key_names); i++) {
|
||||
const char *s = ti->keys[i][0];
|
||||
if (s) {
|
||||
kv_printf(data, " key_%-27s = ", key_names[i]);
|
||||
kv_transstr(&data, s, false);
|
||||
const char *ss = ti->keys[i][1];
|
||||
if (ss) {
|
||||
kv_printf(data, ", key_s%s = ", key_names[i]);
|
||||
kv_transstr(&data, ss, false);
|
||||
}
|
||||
kv_push(data, '\n');
|
||||
}
|
||||
}
|
||||
|
||||
static const char *fkey_names[] = {
|
||||
#define X(name) #name,
|
||||
XLIST_TERMINFO_FKEYS
|
||||
#undef X
|
||||
};
|
||||
|
||||
for (size_t i = 0 + 1; i < ARRAY_SIZE(fkey_names); i++) {
|
||||
const char *s = ti->f_keys[i];
|
||||
if (s) {
|
||||
kv_printf(data, " key_%-27s = ", fkey_names[i]);
|
||||
kv_transstr(&data, s, false);
|
||||
kv_push(data, '\n');
|
||||
}
|
||||
}
|
||||
|
||||
kv_push(data, NUL);
|
||||
return cbuf_as_string(data.items, data.size - 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,19 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "nvim/api/private/defs.h" // IWYU pragma: keep
|
||||
#include "nvim/tui/terminfo_enum_defs.h"
|
||||
|
||||
typedef struct {
|
||||
bool bce;
|
||||
// these extended booleans indicate likely 24-color support
|
||||
bool has_Tc_or_RGB;
|
||||
bool Su;
|
||||
|
||||
int max_colors;
|
||||
int lines;
|
||||
int columns;
|
||||
const char *defs[kTermCount];
|
||||
} TerminfoEntry;
|
||||
#include "nvim/tui/terminfo_defs.h"
|
||||
|
||||
typedef struct {
|
||||
long num;
|
||||
|
||||
1868
src/nvim/tui/terminfo_builtin.h
Normal file
1868
src/nvim/tui/terminfo_builtin.h
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,914 +1,20 @@
|
||||
// uncrustify:off
|
||||
|
||||
// Generated by src/gen/gen_terminfo.lua and ncurses 6.5.20240427
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "nvim/tui/terminfo.h"
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
static const TerminfoEntry ansi_terminfo = {
|
||||
.bce = false,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 8,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = NULL,
|
||||
[kTerm_clear_screen] = "\033[H\033[J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\033[B",
|
||||
[kTerm_cursor_invisible] = NULL,
|
||||
[kTerm_cursor_left] = "\033[D",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = NULL,
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = NULL,
|
||||
[kTerm_enter_italics_mode] = NULL,
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = "\033[%p1%dX",
|
||||
[kTerm_exit_attribute_mode] = "\033[0;10m",
|
||||
[kTerm_exit_ca_mode] = NULL,
|
||||
[kTerm_from_status_line] = NULL,
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = NULL,
|
||||
[kTerm_keypad_xmit] = NULL,
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[4%p1%dm",
|
||||
[kTerm_set_a_foreground] = "\033[3%p1%dm",
|
||||
[kTerm_set_attributes] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = NULL,
|
||||
[kTerm_reset_cursor_style] = NULL,
|
||||
[kTerm_set_cursor_style] = NULL,
|
||||
[kTerm_enter_strikethrough_mode] = NULL,
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
#include "nvim/tui/terminfo_enum_defs.h"
|
||||
|
||||
static const TerminfoEntry interix_8colour_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 8,
|
||||
.lines = 25,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = NULL,
|
||||
[kTerm_clear_screen] = "\033[2J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\n",
|
||||
[kTerm_cursor_invisible] = NULL,
|
||||
[kTerm_cursor_left] = "\033[D",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = NULL,
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[s\033[1b",
|
||||
[kTerm_enter_italics_mode] = NULL,
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = NULL,
|
||||
[kTerm_exit_attribute_mode] = "\033[0m",
|
||||
[kTerm_exit_ca_mode] = "\033[2b\033[u\r\033[K",
|
||||
[kTerm_from_status_line] = NULL,
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = NULL,
|
||||
[kTerm_keypad_xmit] = NULL,
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[4%p1%dm",
|
||||
[kTerm_set_a_foreground] = "\033[3%p1%dm",
|
||||
[kTerm_set_attributes] = NULL,
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = NULL,
|
||||
[kTerm_reset_cursor_style] = NULL,
|
||||
[kTerm_set_cursor_style] = NULL,
|
||||
[kTerm_enter_strikethrough_mode] = NULL,
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
typedef struct {
|
||||
bool bce;
|
||||
// these extended booleans indicate likely 24-color support
|
||||
bool has_Tc_or_RGB;
|
||||
bool Su;
|
||||
|
||||
static const TerminfoEntry iterm_256colour_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\n",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[?25h",
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[?1049h\033[22;0;0t",
|
||||
[kTerm_enter_italics_mode] = "\033[3m",
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = NULL,
|
||||
[kTerm_exit_attribute_mode] = "\033[m\017",
|
||||
[kTerm_exit_ca_mode] = "\033[?1049l\033[23;0;0t",
|
||||
[kTerm_from_status_line] = "\a",
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = "\033[?1l\033>",
|
||||
[kTerm_keypad_xmit] = "\033[?1h\033=",
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m",
|
||||
[kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m",
|
||||
[kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e\017%;",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = "\033]2;",
|
||||
[kTerm_reset_cursor_style] = NULL,
|
||||
[kTerm_set_cursor_style] = NULL,
|
||||
[kTerm_enter_strikethrough_mode] = "\033[9m",
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = "\033[4\072%p1%dm",
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry linux_16colour_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 8,
|
||||
.lines = -1,
|
||||
.columns = -1,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\n",
|
||||
[kTerm_cursor_invisible] = "\033[?25l\033[?1c",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[?25h\033[?0c",
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = NULL,
|
||||
[kTerm_enter_italics_mode] = NULL,
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = "\033[%p1%dX",
|
||||
[kTerm_exit_attribute_mode] = "\033[m\017",
|
||||
[kTerm_exit_ca_mode] = NULL,
|
||||
[kTerm_from_status_line] = NULL,
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = NULL,
|
||||
[kTerm_keypad_xmit] = NULL,
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[4%p1%dm",
|
||||
[kTerm_set_a_foreground] = "\033[3%p1%dm",
|
||||
[kTerm_set_attributes] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;m%?%p9%t^N%e\017%;",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = NULL,
|
||||
[kTerm_reset_cursor_style] = NULL,
|
||||
[kTerm_set_cursor_style] = NULL,
|
||||
[kTerm_enter_strikethrough_mode] = NULL,
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry putty_256colour_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = -1,
|
||||
.columns = -1,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\033D",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[?25h",
|
||||
[kTerm_cursor_up] = "\033M",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[?1049h",
|
||||
[kTerm_enter_italics_mode] = NULL,
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = "\033[%p1%dX",
|
||||
[kTerm_exit_attribute_mode] = "\033[m\017",
|
||||
[kTerm_exit_ca_mode] = "\033[?1049l",
|
||||
[kTerm_from_status_line] = "\a",
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = "\033[?1l\033>",
|
||||
[kTerm_keypad_xmit] = "\033[?1h\033=",
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m",
|
||||
[kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m",
|
||||
[kTerm_set_attributes] = "\033[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e\017%;",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = "\033]0;",
|
||||
[kTerm_reset_cursor_style] = NULL,
|
||||
[kTerm_set_cursor_style] = NULL,
|
||||
[kTerm_enter_strikethrough_mode] = "\033[9m",
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry rxvt_256colour_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[2J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\n",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[?25h",
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\0337\033[?47h",
|
||||
[kTerm_enter_italics_mode] = NULL,
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = NULL,
|
||||
[kTerm_exit_attribute_mode] = "\033[m\017",
|
||||
[kTerm_exit_ca_mode] = "\033[2J\033[?47l\0338",
|
||||
[kTerm_from_status_line] = NULL,
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = "\033>",
|
||||
[kTerm_keypad_xmit] = "\033=",
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m",
|
||||
[kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m",
|
||||
[kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e\017%;",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = NULL,
|
||||
[kTerm_reset_cursor_style] = NULL,
|
||||
[kTerm_set_cursor_style] = NULL,
|
||||
[kTerm_enter_strikethrough_mode] = NULL,
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry screen_256colour_terminfo = {
|
||||
.bce = false,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\n",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[34h\033[?25h",
|
||||
[kTerm_cursor_up] = "\033M",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[?1049h",
|
||||
[kTerm_enter_italics_mode] = NULL,
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[3m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = NULL,
|
||||
[kTerm_exit_attribute_mode] = "\033[m\017",
|
||||
[kTerm_exit_ca_mode] = "\033[?1049l",
|
||||
[kTerm_from_status_line] = NULL,
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = "\033[?1l\033>",
|
||||
[kTerm_keypad_xmit] = "\033[?1h\033=",
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m",
|
||||
[kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m",
|
||||
[kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;m%?%p9%t^N%e\017%;",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = NULL,
|
||||
[kTerm_reset_cursor_style] = NULL,
|
||||
[kTerm_set_cursor_style] = NULL,
|
||||
[kTerm_enter_strikethrough_mode] = NULL,
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry st_256colour_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[2J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\n",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[?25h",
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[?1049h",
|
||||
[kTerm_enter_italics_mode] = "\033[3m",
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = "\033[%p1%dX",
|
||||
[kTerm_exit_attribute_mode] = "\033[0m",
|
||||
[kTerm_exit_ca_mode] = "\033[?1049l",
|
||||
[kTerm_from_status_line] = "\a",
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = "\033[?1l\033>",
|
||||
[kTerm_keypad_xmit] = "\033[?1h\033=",
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m",
|
||||
[kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m",
|
||||
[kTerm_set_attributes] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = "\033]0;",
|
||||
[kTerm_reset_cursor_style] = "\033[2 q",
|
||||
[kTerm_set_cursor_style] = "\033[%p1%d q",
|
||||
[kTerm_enter_strikethrough_mode] = "\033[9m",
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = "\033]12;%p1%s\a",
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry tmux_256colour_terminfo = {
|
||||
.bce = false,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\n",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[34h\033[?25h",
|
||||
[kTerm_cursor_up] = "\033M",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[?1049h",
|
||||
[kTerm_enter_italics_mode] = "\033[3m",
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = NULL,
|
||||
[kTerm_exit_attribute_mode] = "\033[m\017",
|
||||
[kTerm_exit_ca_mode] = "\033[?1049l",
|
||||
[kTerm_from_status_line] = "\a",
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = "\033[?1l\033>",
|
||||
[kTerm_keypad_xmit] = "\033[?1h\033=",
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m",
|
||||
[kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m",
|
||||
[kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m%?%p9%t^N%e\017%;",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = "\033]0;",
|
||||
[kTerm_reset_cursor_style] = "\033[2 q",
|
||||
[kTerm_set_cursor_style] = "\033[%p1%d q",
|
||||
[kTerm_enter_strikethrough_mode] = "\033[9m",
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = "\033]12;%p1%s\a",
|
||||
[kTerm_reset_cursor_color] = "\033]112\a",
|
||||
[kTerm_set_underline_style] = "\033[4\072%p1%dm",
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry vte_256colour_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[2J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\n",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[?25h",
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[?1049h\033[22;0;0t",
|
||||
[kTerm_enter_italics_mode] = "\033[3m",
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = "\033[%p1%dX",
|
||||
[kTerm_exit_attribute_mode] = "\033[0m\017",
|
||||
[kTerm_exit_ca_mode] = "\033[?1049l\033[23;0;0t",
|
||||
[kTerm_from_status_line] = NULL,
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = "\033[?1l\033>",
|
||||
[kTerm_keypad_xmit] = "\033[?1h\033=",
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m",
|
||||
[kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m",
|
||||
[kTerm_set_attributes] = "\033[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3%|%t;7%;m%?%p9%t^N%e\017%;",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = NULL,
|
||||
[kTerm_reset_cursor_style] = "\033[1 q",
|
||||
[kTerm_set_cursor_style] = "\033[%p1%d q",
|
||||
[kTerm_enter_strikethrough_mode] = "\033[9m",
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = "\033]12;%p1%s\a",
|
||||
[kTerm_reset_cursor_color] = "\033]112\a",
|
||||
[kTerm_set_underline_style] = "\033[4\072%p1%dm",
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry xterm_256colour_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[2J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\n",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[?12l\033[?25h",
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[?1049h\033[22;0;0t",
|
||||
[kTerm_enter_italics_mode] = "\033[3m",
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = "\033[%p1%dX",
|
||||
[kTerm_exit_attribute_mode] = "\033(B\033[m",
|
||||
[kTerm_exit_ca_mode] = "\033[?1049l\033[23;0;0t",
|
||||
[kTerm_from_status_line] = NULL,
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = "\033[?1l\033>",
|
||||
[kTerm_keypad_xmit] = "\033[?1h\033=",
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m",
|
||||
[kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m",
|
||||
[kTerm_set_attributes] = "%?%p9%t\033(0%e\033(B%;\033[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m",
|
||||
[kTerm_set_lr_margin] = "\033[?69h\033[%i%p1%d;%p2%ds",
|
||||
[kTerm_to_status_line] = NULL,
|
||||
[kTerm_reset_cursor_style] = "\033[2 q",
|
||||
[kTerm_set_cursor_style] = "\033[%p1%d q",
|
||||
[kTerm_enter_strikethrough_mode] = "\033[9m",
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = "\033]12;%p1%s\a",
|
||||
[kTerm_reset_cursor_color] = "\033]112\a",
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry cygwin_terminfo = {
|
||||
.bce = false,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 8,
|
||||
.lines = -1,
|
||||
.columns = -1,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = NULL,
|
||||
[kTerm_clear_screen] = "\033[H\033[J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\033[B",
|
||||
[kTerm_cursor_invisible] = NULL,
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = NULL,
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\0337\033[?47h",
|
||||
[kTerm_enter_italics_mode] = NULL,
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = NULL,
|
||||
[kTerm_exit_attribute_mode] = "\033[0;10m",
|
||||
[kTerm_exit_ca_mode] = "\033[2J\033[?47l\0338",
|
||||
[kTerm_from_status_line] = "\a",
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = NULL,
|
||||
[kTerm_keypad_xmit] = NULL,
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[4%p1%dm",
|
||||
[kTerm_set_a_foreground] = "\033[3%p1%dm",
|
||||
[kTerm_set_attributes] = "\033[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = "\033];",
|
||||
[kTerm_reset_cursor_style] = NULL,
|
||||
[kTerm_set_cursor_style] = NULL,
|
||||
[kTerm_enter_strikethrough_mode] = NULL,
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry win32con_terminfo = {
|
||||
.bce = false,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 8,
|
||||
.lines = -1,
|
||||
.columns = -1,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = NULL,
|
||||
[kTerm_clear_screen] = "\033[H\033[J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\033[B",
|
||||
[kTerm_cursor_invisible] = NULL,
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = NULL,
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = NULL,
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\0337\033[?47h",
|
||||
[kTerm_enter_italics_mode] = NULL,
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = NULL,
|
||||
[kTerm_erase_chars] = NULL,
|
||||
[kTerm_exit_attribute_mode] = "\033[0m",
|
||||
[kTerm_exit_ca_mode] = "\033[2J\033[?47l\0338",
|
||||
[kTerm_from_status_line] = NULL,
|
||||
[kTerm_insert_line] = NULL,
|
||||
[kTerm_keypad_local] = NULL,
|
||||
[kTerm_keypad_xmit] = NULL,
|
||||
[kTerm_parm_delete_line] = NULL,
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = NULL,
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[4%p1%dm",
|
||||
[kTerm_set_a_foreground] = "\033[3%p1%dm",
|
||||
[kTerm_set_attributes] = "\033[0%?%p1%t;7%;%?%p3%t;7%;%?%p6%t;1%;m",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = NULL,
|
||||
[kTerm_reset_cursor_style] = "\033[0 q",
|
||||
[kTerm_set_cursor_style] = "\033[%p1%d q",
|
||||
[kTerm_enter_strikethrough_mode] = NULL,
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry conemu_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[2J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\033[B",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[?25h",
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[?1049h",
|
||||
[kTerm_enter_italics_mode] = "\033[3m",
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = "\033[%p1%dX",
|
||||
[kTerm_exit_attribute_mode] = "\033[0m",
|
||||
[kTerm_exit_ca_mode] = "\033[?1049l",
|
||||
[kTerm_from_status_line] = NULL,
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = NULL,
|
||||
[kTerm_keypad_xmit] = NULL,
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[48;5;%p1%dm",
|
||||
[kTerm_set_a_foreground] = "\033[38;5;%p1%dm",
|
||||
[kTerm_set_attributes] = "\033[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = NULL,
|
||||
[kTerm_reset_cursor_style] = "\033[2 q",
|
||||
[kTerm_set_cursor_style] = "\033[%p1%d q",
|
||||
[kTerm_enter_strikethrough_mode] = NULL,
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
static const TerminfoEntry vtpcon_terminfo = {
|
||||
.bce = true,
|
||||
.has_Tc_or_RGB = false,
|
||||
.Su = false,
|
||||
.max_colors = 0x100,
|
||||
.lines = 24,
|
||||
.columns = 80,
|
||||
.defs = {
|
||||
[kTerm_carriage_return] = "\r",
|
||||
[kTerm_change_scroll_region] = "\033[%i%p1%d;%p2%dr",
|
||||
[kTerm_clear_screen] = "\033[H\033[2J",
|
||||
[kTerm_clr_eol] = "\033[K",
|
||||
[kTerm_clr_eos] = "\033[J",
|
||||
[kTerm_cursor_address] = "\033[%i%p1%d;%p2%dH",
|
||||
[kTerm_cursor_down] = "\033[B",
|
||||
[kTerm_cursor_invisible] = "\033[?25l",
|
||||
[kTerm_cursor_left] = "\b",
|
||||
[kTerm_cursor_home] = "\033[H",
|
||||
[kTerm_cursor_normal] = "\033[?12l\033[?25h",
|
||||
[kTerm_cursor_up] = "\033[A",
|
||||
[kTerm_cursor_right] = "\033[C",
|
||||
[kTerm_delete_line] = "\033[M",
|
||||
[kTerm_enter_bold_mode] = "\033[1m",
|
||||
[kTerm_enter_ca_mode] = "\033[?1049h",
|
||||
[kTerm_enter_italics_mode] = "\033[3m",
|
||||
[kTerm_enter_reverse_mode] = "\033[7m",
|
||||
[kTerm_enter_standout_mode] = "\033[7m",
|
||||
[kTerm_enter_underline_mode] = "\033[4m",
|
||||
[kTerm_erase_chars] = "\033[%p1%dX",
|
||||
[kTerm_exit_attribute_mode] = "\033[0m",
|
||||
[kTerm_exit_ca_mode] = "\033[?1049l",
|
||||
[kTerm_from_status_line] = "\a",
|
||||
[kTerm_insert_line] = "\033[L",
|
||||
[kTerm_keypad_local] = NULL,
|
||||
[kTerm_keypad_xmit] = NULL,
|
||||
[kTerm_parm_delete_line] = "\033[%p1%dM",
|
||||
[kTerm_parm_down_cursor] = "\033[%p1%dB",
|
||||
[kTerm_parm_insert_line] = "\033[%p1%dL",
|
||||
[kTerm_parm_left_cursor] = "\033[%p1%dD",
|
||||
[kTerm_parm_right_cursor] = "\033[%p1%dC",
|
||||
[kTerm_parm_up_cursor] = "\033[%p1%dA",
|
||||
[kTerm_set_a_background] = "\033[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m",
|
||||
[kTerm_set_a_foreground] = "\033[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m",
|
||||
[kTerm_set_attributes] = "\033[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p6%t;1%;m",
|
||||
[kTerm_set_lr_margin] = NULL,
|
||||
[kTerm_to_status_line] = "\033]0;",
|
||||
[kTerm_reset_cursor_style] = "\033[2 q",
|
||||
[kTerm_set_cursor_style] = "\033[%p1%d q",
|
||||
[kTerm_enter_strikethrough_mode] = NULL,
|
||||
[kTerm_set_rgb_foreground] = NULL,
|
||||
[kTerm_set_rgb_background] = NULL,
|
||||
[kTerm_set_cursor_color] = NULL,
|
||||
[kTerm_reset_cursor_color] = NULL,
|
||||
[kTerm_set_underline_style] = NULL,
|
||||
},
|
||||
};
|
||||
|
||||
#define XLIST_TERMINFO_BUILTIN \
|
||||
X(carriage_return) \
|
||||
X(change_scroll_region) \
|
||||
X(clear_screen) \
|
||||
X(clr_eol) \
|
||||
X(clr_eos) \
|
||||
X(cursor_address) \
|
||||
X(cursor_down) \
|
||||
X(cursor_invisible) \
|
||||
X(cursor_left) \
|
||||
X(cursor_home) \
|
||||
X(cursor_normal) \
|
||||
X(cursor_up) \
|
||||
X(cursor_right) \
|
||||
X(delete_line) \
|
||||
X(enter_bold_mode) \
|
||||
X(enter_ca_mode) \
|
||||
X(enter_italics_mode) \
|
||||
X(enter_reverse_mode) \
|
||||
X(enter_standout_mode) \
|
||||
X(enter_underline_mode) \
|
||||
X(erase_chars) \
|
||||
X(exit_attribute_mode) \
|
||||
X(exit_ca_mode) \
|
||||
X(from_status_line) \
|
||||
X(insert_line) \
|
||||
X(keypad_local) \
|
||||
X(keypad_xmit) \
|
||||
X(parm_delete_line) \
|
||||
X(parm_down_cursor) \
|
||||
X(parm_insert_line) \
|
||||
X(parm_left_cursor) \
|
||||
X(parm_right_cursor) \
|
||||
X(parm_up_cursor) \
|
||||
X(set_a_background) \
|
||||
X(set_a_foreground) \
|
||||
X(set_attributes) \
|
||||
X(set_lr_margin) \
|
||||
X(to_status_line) \
|
||||
// end of list
|
||||
|
||||
#define XLIST_TERMINFO_EXT \
|
||||
X(reset_cursor_style, Se) \
|
||||
X(set_cursor_style, Ss) \
|
||||
X(enter_strikethrough_mode, smxx) \
|
||||
X(set_rgb_foreground, setrgbf) \
|
||||
X(set_rgb_background, setrgbb) \
|
||||
X(set_cursor_color, Cs) \
|
||||
X(reset_cursor_color, Cr) \
|
||||
X(set_underline_style, Smulx) \
|
||||
// end of list
|
||||
int max_colors;
|
||||
int lines;
|
||||
int columns;
|
||||
const char *defs[kTermCount];
|
||||
const char *keys[kTermKeyCount][2];
|
||||
const char *f_keys[kTerminfoFuncKeyMax];
|
||||
} TerminfoEntry;
|
||||
|
||||
@@ -52,3 +52,27 @@ typedef enum {
|
||||
kTerm_set_underline_style,
|
||||
kTermCount, // sentinel
|
||||
} TerminfoDef;
|
||||
|
||||
// TODO(bfredl): physical F-keys beyond F12 are uncommon. But terminfo
|
||||
// likes to represent chords with shift and/or ctrl and F keys as high
|
||||
// F-key numbers. The same chords can also be recognized by driver-csi.c
|
||||
// but will then be encoded as chords. We might actually prefer that but it is
|
||||
// potentially breaking change.
|
||||
#define kTerminfoFuncKeyMax 63
|
||||
typedef enum {
|
||||
kTermKey_backspace,
|
||||
kTermKey_beg,
|
||||
kTermKey_btab,
|
||||
kTermKey_clear,
|
||||
kTermKey_dc,
|
||||
kTermKey_end,
|
||||
kTermKey_find,
|
||||
kTermKey_home,
|
||||
kTermKey_ic,
|
||||
kTermKey_npage,
|
||||
kTermKey_ppage,
|
||||
kTermKey_select,
|
||||
kTermKey_suspend,
|
||||
kTermKey_undo,
|
||||
kTermKeyCount,
|
||||
} TerminfoKey;
|
||||
|
||||
@@ -683,7 +683,7 @@ static int register_keys(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
void *new_driver_csi(TermKey *tk, const char *term)
|
||||
void *new_driver_csi(TermKey *tk, TerminfoEntry *term)
|
||||
{
|
||||
if (!keyinfo_initialised) {
|
||||
if (!register_keys()) {
|
||||
|
||||
@@ -4,10 +4,11 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unibilium.h>
|
||||
#include <uv.h>
|
||||
|
||||
#include "nvim/charset.h"
|
||||
#include "nvim/memory.h"
|
||||
#include "nvim/tui/terminfo.h"
|
||||
#include "nvim/tui/termkey/driver-ti.h"
|
||||
#include "nvim/tui/termkey/termkey-internal.h"
|
||||
#include "nvim/tui/termkey/termkey_defs.h"
|
||||
@@ -25,77 +26,58 @@
|
||||
#define MAX_FUNCNAME 9
|
||||
|
||||
static struct {
|
||||
TerminfoKey ti_key;
|
||||
const char *funcname;
|
||||
TermKeyType type;
|
||||
TermKeySym sym;
|
||||
int mods;
|
||||
} funcs[] = {
|
||||
// THIS LIST MUST REMAIN SORTED!
|
||||
{ "backspace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BACKSPACE, 0 },
|
||||
{ "begin", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 },
|
||||
{ "beg", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 },
|
||||
{ "btab", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, TERMKEY_KEYMOD_SHIFT },
|
||||
{ "cancel", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CANCEL, 0 },
|
||||
{ "clear", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLEAR, 0 },
|
||||
{ "close", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLOSE, 0 },
|
||||
{ "command", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COMMAND, 0 },
|
||||
{ "copy", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COPY, 0 },
|
||||
{ "dc", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE, 0 },
|
||||
{ "down", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, 0 },
|
||||
{ "end", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 0 },
|
||||
{ "enter", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_ENTER, 0 },
|
||||
{ "exit", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_EXIT, 0 },
|
||||
{ "find", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND, 0 },
|
||||
{ "help", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HELP, 0 },
|
||||
{ "home", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 0 },
|
||||
{ "ic", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT, 0 },
|
||||
{ "left", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, 0 },
|
||||
{ "mark", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MARK, 0 },
|
||||
{ "message", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MESSAGE, 0 },
|
||||
{ "move", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MOVE, 0 },
|
||||
{ "next", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 }, // Not quite, but it's the best we can do
|
||||
{ "npage", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 },
|
||||
{ "open", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPEN, 0 },
|
||||
{ "options", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPTIONS, 0 },
|
||||
{ "ppage", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 },
|
||||
{ "previous", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 }, // Not quite, but it's the best we can do
|
||||
{ "print", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PRINT, 0 },
|
||||
{ "redo", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REDO, 0 },
|
||||
{ "reference", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFERENCE, 0 },
|
||||
{ "refresh", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFRESH, 0 },
|
||||
{ "replace", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REPLACE, 0 },
|
||||
{ "restart", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESTART, 0 },
|
||||
{ "resume", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESUME, 0 },
|
||||
{ "right", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 0 },
|
||||
{ "save", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SAVE, 0 },
|
||||
{ "select", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT, 0 },
|
||||
{ "suspend", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SUSPEND, 0 },
|
||||
{ "undo", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UNDO, 0 },
|
||||
{ "up", TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, 0 },
|
||||
{ NULL, 0, 0, 0 },
|
||||
// nvim note: entries commented out without further note are not recognized by nvim.
|
||||
#define KDEF(x) kTermKey_##x, #x
|
||||
{ KDEF(backspace), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BACKSPACE, 0 },
|
||||
{ KDEF(beg), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_BEGIN, 0 },
|
||||
{ KDEF(btab), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_TAB, TERMKEY_KEYMOD_SHIFT },
|
||||
// { KDEF(cancel), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CANCEL, 0 },
|
||||
{ KDEF(clear), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLEAR, 0 },
|
||||
// { KDEF(close), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_CLOSE, 0 },
|
||||
// { KDEF(command), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COMMAND, 0 },
|
||||
// { KDEF(copy), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_COPY, 0 },
|
||||
{ KDEF(dc), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DELETE, 0 },
|
||||
// { KDEF(down), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_DOWN, 0 }, // redundant, driver-csi
|
||||
{ KDEF(end), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_END, 0 },
|
||||
// { KDEF(enter), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_ENTER, 0 },
|
||||
// { KDEF(exit), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_EXIT, 0 },
|
||||
{ KDEF(find), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_FIND, 0 },
|
||||
// { KDEF(help), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HELP, 0 },
|
||||
{ KDEF(home), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_HOME, 0 },
|
||||
{ KDEF(ic), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_INSERT, 0 },
|
||||
// { KDEF(left), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_LEFT, 0 }, // redundant: driver-csi
|
||||
// { KDEF(mark), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MARK, 0 },
|
||||
// { KDEF(message), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MESSAGE, 0 },
|
||||
// { KDEF(move), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_MOVE, 0 },
|
||||
// { KDEF(next), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 }, // use "npage" right below
|
||||
{ KDEF(npage), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEDOWN, 0 },
|
||||
// { KDEF(open), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPEN, 0 },
|
||||
// { KDEF(options), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_OPTIONS, 0 },
|
||||
{ KDEF(ppage), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 },
|
||||
// { KDEF(previous), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PAGEUP, 0 }, // use "ppage" right above
|
||||
// { KDEF(print), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_PRINT, 0 },
|
||||
// { KDEF(redo), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REDO, 0 },
|
||||
// { KDEF(reference), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFERENCE, 0 },
|
||||
// { KDEF(refresh), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REFRESH, 0 },
|
||||
// { KDEF(replace), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_REPLACE, 0 },
|
||||
// { KDEF(restart), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESTART, 0 },
|
||||
// { KDEF(resume), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RESUME, 0 },
|
||||
// { KDEF(right), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_RIGHT, 0 }, // redundant, driver-csi
|
||||
// { KDEF(save), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SAVE, 0 },
|
||||
{ KDEF(select), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SELECT, 0 },
|
||||
{ KDEF(suspend), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_SUSPEND, 0 },
|
||||
{ KDEF(undo), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UNDO, 0 },
|
||||
// { KDEF(up), TERMKEY_TYPE_KEYSYM, TERMKEY_SYM_UP, 0 }, // redundant, driver-ci
|
||||
{ 0, NULL, 0, 0, 0 },
|
||||
};
|
||||
|
||||
static enum unibi_string unibi_lookup_str(const char *name)
|
||||
{
|
||||
for (enum unibi_string ret = unibi_string_begin_ + 1; ret < unibi_string_end_; ret++) {
|
||||
if (streq(unibi_name_str(ret), name)) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return (enum unibi_string)-1;
|
||||
}
|
||||
|
||||
static const char *unibi_get_str_by_name(const unibi_term *ut, const char *name)
|
||||
{
|
||||
enum unibi_string idx = unibi_lookup_str(name);
|
||||
if (idx == (enum unibi_string)-1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return unibi_get_str(ut, idx);
|
||||
}
|
||||
|
||||
// To be efficient at lookups, we store the byte sequence => keyinfo mapping
|
||||
// in a trie. This avoids a slow linear search through a flat list of
|
||||
// sequences. Because it is likely most nodes will be very sparse, we optimise
|
||||
@@ -226,12 +208,18 @@ static struct trie_node *compress_trie(struct trie_node *n)
|
||||
return n;
|
||||
}
|
||||
|
||||
static bool try_load_terminfo_key(TermKeyTI *ti, const char *name, struct keyinfo *info)
|
||||
static bool try_load_terminfo_key(TermKeyTI *ti, bool fn_nr, int key, bool shift, const char *name,
|
||||
struct keyinfo *info)
|
||||
{
|
||||
const char *value = NULL;
|
||||
|
||||
if (ti->unibi) {
|
||||
value = unibi_get_str_by_name(ti->unibi, name);
|
||||
if (ti->ti) {
|
||||
if (!fn_nr) {
|
||||
value = ti->ti->keys[key][shift ? 1 : 0];
|
||||
} else {
|
||||
assert(!shift);
|
||||
value = ti->ti->f_keys[key];
|
||||
}
|
||||
}
|
||||
|
||||
if (ti->tk->ti_getstr_hook) {
|
||||
@@ -253,8 +241,6 @@ static int load_terminfo(TermKeyTI *ti)
|
||||
{
|
||||
int i;
|
||||
|
||||
unibi_term *unibi = ti->unibi;
|
||||
|
||||
ti->root = new_node_arr(0, 0xff);
|
||||
if (!ti->root) {
|
||||
return 0;
|
||||
@@ -265,7 +251,7 @@ static int load_terminfo(TermKeyTI *ti)
|
||||
char name[MAX_FUNCNAME + 5 + 1];
|
||||
|
||||
sprintf(name, "key_%s", funcs[i].funcname); // NOLINT(runtime/printf)
|
||||
if (!try_load_terminfo_key(ti, name, &(struct keyinfo){
|
||||
if (!try_load_terminfo_key(ti, false, (int)funcs[i].ti_key, false, name, &(struct keyinfo){
|
||||
.type = funcs[i].type,
|
||||
.sym = funcs[i].sym,
|
||||
.modifier_mask = funcs[i].mods,
|
||||
@@ -276,7 +262,7 @@ static int load_terminfo(TermKeyTI *ti)
|
||||
|
||||
// Maybe it has a shifted version
|
||||
sprintf(name, "key_s%s", funcs[i].funcname); // NOLINT(runtime/printf)
|
||||
try_load_terminfo_key(ti, name, &(struct keyinfo){
|
||||
try_load_terminfo_key(ti, false, (int)funcs[i].ti_key, true, name, &(struct keyinfo){
|
||||
.type = funcs[i].type,
|
||||
.sym = funcs[i].sym,
|
||||
.modifier_mask = funcs[i].mods | TERMKEY_KEYMOD_SHIFT,
|
||||
@@ -285,10 +271,10 @@ static int load_terminfo(TermKeyTI *ti)
|
||||
}
|
||||
|
||||
// Now the F<digit> keys
|
||||
for (i = 1; i < 255; i++) {
|
||||
for (i = 1; i <= kTerminfoFuncKeyMax; i++) {
|
||||
char name[9];
|
||||
sprintf(name, "key_f%d", i); // NOLINT(runtime/printf)
|
||||
if (!try_load_terminfo_key(ti, name, &(struct keyinfo){
|
||||
if (!try_load_terminfo_key(ti, true, (i - 1), false, name, &(struct keyinfo){
|
||||
.type = TERMKEY_TYPE_FUNCTION,
|
||||
.sym = i,
|
||||
.modifier_mask = 0,
|
||||
@@ -299,11 +285,12 @@ static int load_terminfo(TermKeyTI *ti)
|
||||
}
|
||||
|
||||
// Finally mouse mode
|
||||
{
|
||||
// This is overriden in nvim: we only want driver-csi mouse support
|
||||
if (false) {
|
||||
const char *value = NULL;
|
||||
|
||||
if (ti->unibi) {
|
||||
value = unibi_get_str_by_name(ti->unibi, "key_mouse");
|
||||
if (ti->ti) {
|
||||
// value = ti->ti->keys[kTermKey_mouse][0];
|
||||
}
|
||||
|
||||
if (ti->tk->ti_getstr_hook) {
|
||||
@@ -321,8 +308,8 @@ static int load_terminfo(TermKeyTI *ti)
|
||||
// Take copies of these terminfo strings, in case we build multiple termkey
|
||||
// instances for multiple different termtypes, and it's different by the
|
||||
// time we want to use it
|
||||
const char *keypad_xmit = unibi
|
||||
? unibi_get_str(unibi, unibi_keypad_xmit)
|
||||
const char *keypad_xmit = ti->ti
|
||||
? ti->ti->defs[kTerm_keypad_xmit]
|
||||
: NULL;
|
||||
|
||||
if (keypad_xmit) {
|
||||
@@ -331,8 +318,8 @@ static int load_terminfo(TermKeyTI *ti)
|
||||
ti->start_string = NULL;
|
||||
}
|
||||
|
||||
const char *keypad_local = unibi
|
||||
? unibi_get_str(unibi, unibi_keypad_local)
|
||||
const char *keypad_local = ti->ti
|
||||
? ti->ti->defs[kTerm_keypad_local]
|
||||
: NULL;
|
||||
|
||||
if (keypad_local) {
|
||||
@@ -341,18 +328,12 @@ static int load_terminfo(TermKeyTI *ti)
|
||||
ti->stop_string = NULL;
|
||||
}
|
||||
|
||||
if (unibi) {
|
||||
unibi_destroy(unibi);
|
||||
}
|
||||
|
||||
ti->unibi = NULL;
|
||||
|
||||
ti->root = compress_trie(ti->root);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void *new_driver_ti(TermKey *tk, const char *term)
|
||||
void *new_driver_ti(TermKey *tk, TerminfoEntry *term)
|
||||
{
|
||||
TermKeyTI *ti = xmalloc(sizeof *ti);
|
||||
|
||||
@@ -361,13 +342,9 @@ void *new_driver_ti(TermKey *tk, const char *term)
|
||||
ti->start_string = NULL;
|
||||
ti->stop_string = NULL;
|
||||
|
||||
ti->unibi = unibi_from_term(term);
|
||||
int saved_errno = errno;
|
||||
if (!ti->unibi && saved_errno != ENOENT) {
|
||||
xfree(ti);
|
||||
return NULL;
|
||||
}
|
||||
// ti->unibi may be NULL if errno == ENOENT. That means the terminal wasn't
|
||||
ti->ti = term;
|
||||
|
||||
// ti->ti may be NULL because reasons. That means the terminal wasn't
|
||||
// known. Lets keep going because if we get getstr hook that might invent
|
||||
// new strings for us
|
||||
|
||||
@@ -472,10 +449,6 @@ void free_driver_ti(void *info)
|
||||
xfree(ti->stop_string);
|
||||
}
|
||||
|
||||
if (ti->unibi) {
|
||||
unibi_destroy(ti->unibi);
|
||||
}
|
||||
|
||||
xfree(ti);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ typedef SSIZE_T ssize_t;
|
||||
|
||||
struct TermKeyDriver {
|
||||
const char *name;
|
||||
void *(*new_driver)(TermKey *tk, const char *term);
|
||||
void *(*new_driver)(TermKey *tk, TerminfoEntry *term);
|
||||
void (*free_driver)(void *info);
|
||||
int (*start_driver)(TermKey *tk, void *info);
|
||||
int (*stop_driver)(TermKey *tk, void *info);
|
||||
|
||||
@@ -357,7 +357,7 @@ static TermKey *termkey_alloc(void)
|
||||
return tk;
|
||||
}
|
||||
|
||||
static int termkey_init(TermKey *tk, const char *term)
|
||||
static int termkey_init(TermKey *tk, TerminfoEntry *term)
|
||||
{
|
||||
tk->buffer = xmalloc(tk->buffsize);
|
||||
tk->keynames = xmalloc(sizeof(tk->keynames[0]) * (size_t)tk->nkeynames);
|
||||
@@ -433,7 +433,7 @@ abort_free_keynames:
|
||||
return 0;
|
||||
}
|
||||
|
||||
TermKey *termkey_new_abstract(const char *term, int flags)
|
||||
TermKey *termkey_new_abstract(TerminfoEntry *term, int flags)
|
||||
{
|
||||
TermKey *tk = termkey_alloc();
|
||||
if (!tk) {
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <uv.h>
|
||||
|
||||
#include "nvim/event/defs.h"
|
||||
#include "nvim/tui/terminfo_defs.h"
|
||||
#include "nvim/tui/tui_defs.h"
|
||||
#include "nvim/types_defs.h"
|
||||
|
||||
@@ -201,7 +202,7 @@ typedef enum {
|
||||
typedef struct {
|
||||
TermKey *tk;
|
||||
|
||||
unibi_term *unibi; // only valid until first 'start' call
|
||||
TerminfoEntry *ti; // not used after first 'start' call
|
||||
|
||||
struct trie_node *root;
|
||||
|
||||
|
||||
@@ -171,7 +171,6 @@ void tui_start(TUIData **tui_p, int *width, int *height, char **term, bool *rgb)
|
||||
kv_push(tui->attrs, HLATTRS_INIT);
|
||||
|
||||
tui->input.tk_ti_hook_fn = tui_tk_ti_getstr;
|
||||
tinput_init(&tui->input, &main_loop);
|
||||
ugrid_init(&tui->grid);
|
||||
tui_terminal_start(tui);
|
||||
|
||||
@@ -597,6 +596,7 @@ static void tui_terminal_start(TUIData *tui)
|
||||
{
|
||||
tui->print_attr_id = -1;
|
||||
terminfo_start(tui);
|
||||
tinput_init(&tui->input, &main_loop, &tui->ti);
|
||||
tui_guess_size(tui);
|
||||
tinput_start(&tui->input);
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ local termkey = t.cimport(
|
||||
|
||||
describe('termkey', function()
|
||||
itp('01base', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
t.neq(tk, nil)
|
||||
|
||||
t.eq(termkey.termkey_get_buffer_size(tk), 256)
|
||||
@@ -85,7 +85,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('02getkey', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey
|
||||
|
||||
t.eq(termkey.termkey_get_buffer_remaining(tk), 256) -- buffer free initially 256
|
||||
@@ -159,7 +159,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('03utf8', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', termkey.TERMKEY_FLAG_UTF8)
|
||||
local tk = termkey.termkey_new_abstract(nil, termkey.TERMKEY_FLAG_UTF8)
|
||||
local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey
|
||||
|
||||
termkey.termkey_push_bytes(tk, 'a', 1)
|
||||
@@ -291,7 +291,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('04flags', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey
|
||||
|
||||
termkey.termkey_push_bytes(tk, ' ', 1)
|
||||
@@ -316,7 +316,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('06buffer', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey
|
||||
|
||||
t.eq(termkey.termkey_get_buffer_remaining(tk), 256) -- buffer free initially 256
|
||||
@@ -347,7 +347,7 @@ describe('termkey', function()
|
||||
end
|
||||
|
||||
itp('10keyname', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
|
||||
local sym = termkey_keyname2sym(tk, 'SomeUnknownKey')
|
||||
t.eq(sym, termkey.TERMKEY_SYM_UNKNOWN) -- keyname2sym SomeUnknownKey
|
||||
@@ -374,7 +374,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('11strfkey', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
---@type TermKeyKey
|
||||
local key = t.ffi.new(
|
||||
'TermKeyKey',
|
||||
@@ -598,7 +598,7 @@ describe('termkey', function()
|
||||
return key1.modifiers - key2.modifiers
|
||||
end
|
||||
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
---@type TermKeyKey
|
||||
local key1 = t.ffi.new('TermKeyKey', {
|
||||
type = termkey.TERMKEY_TYPE_UNICODE,
|
||||
@@ -656,7 +656,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('30mouse', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
local key = t.ffi.new('TermKeyKey', { type = -1 }) ---@type TermKeyKey
|
||||
local ev = t.ffi.new('TermKeyMouseEvent[1]')
|
||||
local button = t.ffi.new('int[1]')
|
||||
@@ -809,7 +809,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('31position', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey
|
||||
local line = t.ffi.new('int[1]')
|
||||
local col = t.ffi.new('int[1]')
|
||||
@@ -839,7 +839,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('32modereport', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey
|
||||
local initial = t.ffi.new('int[1]')
|
||||
local mode = t.ffi.new('int[1]')
|
||||
@@ -879,7 +879,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('38csi', function()
|
||||
local tk = termkey.termkey_new_abstract('vt100', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey
|
||||
local args = t.ffi.new('TermKeyCsiParam[16]')
|
||||
local nargs = t.ffi.new('size_t[1]')
|
||||
@@ -916,7 +916,7 @@ describe('termkey', function()
|
||||
end)
|
||||
|
||||
itp('39dcs', function()
|
||||
local tk = termkey.termkey_new_abstract('xterm', 0)
|
||||
local tk = termkey.termkey_new_abstract(nil, 0)
|
||||
local key = t.ffi.new('TermKeyKey') ---@type TermKeyKey
|
||||
|
||||
-- 7bit DCS
|
||||
|
||||
Reference in New Issue
Block a user