mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
vt: implement DECCKM (cursor key sends either SS3 or CSI escapes)
This commit is contained in:
parent
9e47c89880
commit
35e5fa1f76
4 changed files with 44 additions and 34 deletions
4
csi.c
4
csi.c
|
|
@ -319,7 +319,7 @@ csi_dispatch(struct terminal *term, uint8_t final)
|
|||
for (size_t i = 0; i < term->vt.params.idx; i++) {
|
||||
switch (term->vt.params.v[i].value) {
|
||||
case 1:
|
||||
LOG_WARN("unimplemented: smkx");
|
||||
term->decckm = DECCKM_SS3;
|
||||
break;
|
||||
|
||||
case 1049:
|
||||
|
|
@ -344,7 +344,7 @@ csi_dispatch(struct terminal *term, uint8_t final)
|
|||
for (size_t i = 0; i < term->vt.params.idx; i++) {
|
||||
switch (term->vt.params.v[i].value) {
|
||||
case 1:
|
||||
LOG_WARN("unimplemented: rmkx");
|
||||
term->decckm = DECCKM_CSI;
|
||||
break;
|
||||
|
||||
case 1049:
|
||||
|
|
|
|||
49
input.c
49
input.c
|
|
@ -76,70 +76,70 @@ struct keymap {
|
|||
static const struct keymap key_map[][2] = {
|
||||
[XKB_KEY_Up] = {
|
||||
{"[A", "[1;2A", "[1;3A", "[1;4A", "[1;5A", "[1;6A", "[1;7A", "[1;8A"},
|
||||
{}},
|
||||
{"OA", "[1;2A", "[1;3A", "[1;4A", "[1;5A", "[1;6A", "[1;7A", "[1;8A"}},
|
||||
[XKB_KEY_Down] = {
|
||||
{"[B", "[1;2B", "[1;3B", "[1;4B", "[1;5B", "[1;6B", "[1;7B", "[1;8B"},
|
||||
{}},
|
||||
{"OB", "[1;2B", "[1;3B", "[1;4B", "[1;5B", "[1;6B", "[1;7B", "[1;8B"}},
|
||||
[XKB_KEY_Right] = {
|
||||
{"[C", "[1;2C", "[1;3C", "[1;4C", "[1;5C", "[1;6C", "[1;7C", "[1;8C"},
|
||||
{}},
|
||||
{"OC", "[1;2C", "[1;3C", "[1;4C", "[1;5C", "[1;6C", "[1;7C", "[1;8C"}},
|
||||
[XKB_KEY_Left] = {
|
||||
{"[D", "[1;2D", "[1;3D", "[1;4D", "[1;5D", "[1;6D", "[1;7D", "[1;8D"},
|
||||
{}},
|
||||
{"OD", "[1;2D", "[1;3D", "[1;4D", "[1;5D", "[1;6D", "[1;7D", "[1;8D"}},
|
||||
[XKB_KEY_Home] = {
|
||||
{"[H", "[1;2H", "[1;3H", "[1;4H", "[1;5H", "[1;6H", "[1;7H", "[1;8H"},
|
||||
{}},
|
||||
{"OH", "[1;2H", "[1;3H", "[1;4H", "[1;5H", "[1;6H", "[1;7H", "[1;8H"}},
|
||||
[XKB_KEY_End] = {
|
||||
{"[F", "[1;2F", "[1;3F", "[1;4F", "[1;5F", "[1;6F", "[1;7F", "[1;8F"},
|
||||
{}},
|
||||
{"OF", "[1;2F", "[1;3F", "[1;4F", "[1;5F", "[1;6F", "[1;7F", "[1;8F"}},
|
||||
[XKB_KEY_Insert] = {
|
||||
{"[2~", "[2;2~", "[2;3~", "[2;4~", "[2;5~", "[2;6~", "[2;7~", "[2;8~"},
|
||||
{}},
|
||||
{"[2~", "[2;2~", "[2;3~", "[2;4~", "[2;5~", "[2;6~", "[2;7~", "[2;8~"}},
|
||||
[XKB_KEY_Delete] = {
|
||||
{"[3~", "[3;2~", "[3;3~", "[3;4~", "[3;5~", "[3;6~", "[3;7~", "[3;8~"},
|
||||
{}},
|
||||
{"[3~", "[3;2~", "[3;3~", "[3;4~", "[3;5~", "[3;6~", "[3;7~", "[3;8~"}},
|
||||
[XKB_KEY_Page_Up] = {
|
||||
{"[5~", "[5;2~", "[5;3~", "[5;4~", "[5;5~", "[5;6~", "[5;7~", "[5;8~"},
|
||||
{}},
|
||||
{"[5~", "[5;2~", "[5;3~", "[5;4~", "[5;5~", "[5;6~", "[5;7~", "[5;8~"}},
|
||||
[XKB_KEY_Page_Down] = {
|
||||
{"[6~", "[6;2~", "[6;3~", "[6;4~", "[6;5~", "[6;6~", "[6;7~", "[6;8~"},
|
||||
{}},
|
||||
{"[6~", "[6;2~", "[6;3~", "[6;4~", "[6;5~", "[6;6~", "[6;7~", "[6;8~"}},
|
||||
[XKB_KEY_F1] = {
|
||||
{"OP", "[1;2P", "[1;3P", "[1;4P", "[1;5P", "[1;6P", "[1;7P", "[1;8P"},
|
||||
{}},
|
||||
{"OP", "[1;2P", "[1;3P", "[1;4P", "[1;5P", "[1;6P", "[1;7P", "[1;8P"}},
|
||||
[XKB_KEY_F2] = {
|
||||
{"OQ", "[1;2Q", "[1;3Q", "[1;4Q", "[1;5Q", "[1;6Q", "[1;7Q", "[1;8Q"},
|
||||
{}},
|
||||
{"OQ", "[1;2Q", "[1;3Q", "[1;4Q", "[1;5Q", "[1;6Q", "[1;7Q", "[1;8Q"}},
|
||||
[XKB_KEY_F3] = {
|
||||
{"OR", "[1;2R", "[1;3R", "[1;4R", "[1;5R", "[1;6R", "[1;7R", "[1;8R"},
|
||||
{}},
|
||||
{"OR", "[1;2R", "[1;3R", "[1;4R", "[1;5R", "[1;6R", "[1;7R", "[1;8R"}},
|
||||
[XKB_KEY_F4] = {
|
||||
{"OS", "[1;2S", "[1;3S", "[1;4S", "[1;5S", "[1;6S", "[1;7S", "[1;8S"},
|
||||
{}},
|
||||
{"OS", "[1;2S", "[1;3S", "[1;4S", "[1;5S", "[1;6S", "[1;7S", "[1;8S"}},
|
||||
[XKB_KEY_F5] = {
|
||||
{"[15~", "[15;2~", "[15;3~", "[15;4~", "[15;5~", "[15;6~", "[15;7~", "[15;8~"},
|
||||
{}},
|
||||
{"[15~", "[15;2~", "[15;3~", "[15;4~", "[15;5~", "[15;6~", "[15;7~", "[15;8~"}},
|
||||
[XKB_KEY_F6] = {
|
||||
{"[17~", "[17;2~", "[17;3~", "[17;4~", "[17;5~", "[17;6~", "[17;7~", "[17;8~"},
|
||||
{}},
|
||||
{"[17~", "[17;2~", "[17;3~", "[17;4~", "[17;5~", "[17;6~", "[17;7~", "[17;8~"}},
|
||||
[XKB_KEY_F7] = {
|
||||
{"[18~", "[18;2~", "[18;3~", "[18;4~", "[18;5~", "[18;6~", "[18;7~", "[18;8~"},
|
||||
{}},
|
||||
{"[18~", "[18;2~", "[18;3~", "[18;4~", "[18;5~", "[18;6~", "[18;7~", "[18;8~"}},
|
||||
[XKB_KEY_F8] = {
|
||||
{"[19~", "[19;2~", "[19;3~", "[19;4~", "[19;5~", "[19;6~", "[19;7~", "[19;8~"},
|
||||
{}},
|
||||
{"[19~", "[19;2~", "[19;3~", "[19;4~", "[19;5~", "[19;6~", "[19;7~", "[19;8~"}},
|
||||
[XKB_KEY_F9] = {
|
||||
{"[20~", "[20;2~", "[20;3~", "[20;4~", "[20;5~", "[20;6~", "[20;7~", "[20;8~"},
|
||||
{}},
|
||||
{"[20~", "[20;2~", "[20;3~", "[20;4~", "[20;5~", "[20;6~", "[20;7~", "[20;8~"}},
|
||||
[XKB_KEY_F10] = {
|
||||
{"[21~", "[21;2~", "[21;3~", "[21;4~", "[21;5~", "[21;6~", "[21;7~", "[21;8~"},
|
||||
{}},
|
||||
{"[21~", "[21;2~", "[21;3~", "[21;4~", "[21;5~", "[21;6~", "[21;7~", "[21;8~"}},
|
||||
[XKB_KEY_F11] = {
|
||||
{"[23~", "[23;2~", "[23;3~", "[23;4~", "[23;5~", "[23;6~", "[23;7~", "[23;8~"},
|
||||
{}},
|
||||
{"[23~", "[23;2~", "[23;3~", "[23;4~", "[23;5~", "[23;6~", "[23;7~", "[23;8~"}},
|
||||
[XKB_KEY_F12] = {
|
||||
{"[24~", "[24;2~", "[24;3~", "[24;4~", "[24;5~", "[24;6~", "[24;7~", "[24;8~"},
|
||||
{}},
|
||||
{"[24~", "[24;2~", "[24;3~", "[24;4~", "[24;5~", "[24;6~", "[24;7~", "[24;8~"}},
|
||||
};
|
||||
|
||||
static void
|
||||
|
|
@ -194,11 +194,10 @@ keyboard_key(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial,
|
|||
"effective=0x%08x",
|
||||
sym, mods, consumed, significant, effective_mods);
|
||||
|
||||
const int mode = 0; /* ~App */
|
||||
if (sym < sizeof(key_map) / sizeof(key_map[0]) &&
|
||||
key_map[sym][mode].normal != NULL)
|
||||
key_map[sym][term->decckm].normal != NULL)
|
||||
{
|
||||
const struct keymap *key = &key_map[sym][mode];
|
||||
const struct keymap *key = &key_map[sym][term->decckm];
|
||||
const char *esc = NULL;
|
||||
|
||||
if (effective_mods == 0)
|
||||
|
|
|
|||
2
main.c
2
main.c
|
|
@ -666,6 +666,8 @@ main(int argc, const char *const *argv)
|
|||
.quit = false,
|
||||
.term = {
|
||||
.ptmx = posix_openpt(O_RDWR | O_NOCTTY),
|
||||
.decckm = DECCKM_CSI,
|
||||
.keypad_mode = KEYPAD_NUMERICAL, /* TODO: verify */
|
||||
.vt = {
|
||||
.state = 1, /* STATE_GROUND */
|
||||
},
|
||||
|
|
|
|||
23
terminal.h
23
terminal.h
|
|
@ -68,16 +68,20 @@ struct grid {
|
|||
tll(struct damage) damage;
|
||||
};
|
||||
|
||||
struct vt_subparams {
|
||||
unsigned value[16];
|
||||
size_t idx;
|
||||
};
|
||||
|
||||
struct vt_param {
|
||||
unsigned value;
|
||||
struct vt_subparams sub;
|
||||
};
|
||||
|
||||
struct vt {
|
||||
int state; /* enum state */
|
||||
struct {
|
||||
struct {
|
||||
unsigned value;
|
||||
struct {
|
||||
unsigned value[16];
|
||||
size_t idx;
|
||||
} sub;
|
||||
} v[16];
|
||||
struct vt_param v[16];
|
||||
size_t idx;
|
||||
} params;
|
||||
struct {
|
||||
|
|
@ -116,9 +120,14 @@ struct kbd {
|
|||
} repeat;
|
||||
};
|
||||
|
||||
enum decckm { DECCKM_CSI, DECCKM_SS3 };
|
||||
enum keypad_mode { KEYPAD_NUMERICAL, KEYPAD_APPLICATION };
|
||||
|
||||
struct terminal {
|
||||
pid_t slave;
|
||||
int ptmx;
|
||||
enum decckm decckm;
|
||||
enum keypad_mode keypad_mode;
|
||||
bool bracketed_paste;
|
||||
struct vt vt;
|
||||
struct grid grid;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue