diff --git a/csi.c b/csi.c index 3b6f8896..daecba47 100644 --- a/csi.c +++ b/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: diff --git a/input.c b/input.c index 34b8cf73..5e61d49b 100644 --- a/input.c +++ b/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) diff --git a/main.c b/main.c index f773d428..b0db319a 100644 --- a/main.c +++ b/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 */ }, diff --git a/terminal.h b/terminal.h index fa6623ef..002739f1 100644 --- a/terminal.h +++ b/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;