version 1.73, 2020/05/16 16:33:16 |
version 1.74, 2020/05/16 16:35:13 |
|
|
}, |
}, |
|
|
/* Keys with an embedded modifier. */ |
/* Keys with an embedded modifier. */ |
{ .key = KEYC_F1|KEYC_XTERM, |
{ .key = KEYC_F1|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_P" |
.data = "\033[1;_P" |
}, |
}, |
{ .key = KEYC_F2|KEYC_XTERM, |
{ .key = KEYC_F2|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_Q" |
.data = "\033[1;_Q" |
}, |
}, |
{ .key = KEYC_F3|KEYC_XTERM, |
{ .key = KEYC_F3|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_R" |
.data = "\033[1;_R" |
}, |
}, |
{ .key = KEYC_F4|KEYC_XTERM, |
{ .key = KEYC_F4|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_S" |
.data = "\033[1;_S" |
}, |
}, |
{ .key = KEYC_F5|KEYC_XTERM, |
{ .key = KEYC_F5|KEYC_BUILD_MODIFIERS, |
.data = "\033[15;_~" |
.data = "\033[15;_~" |
}, |
}, |
{ .key = KEYC_F6|KEYC_XTERM, |
{ .key = KEYC_F6|KEYC_BUILD_MODIFIERS, |
.data = "\033[17;_~" |
.data = "\033[17;_~" |
}, |
}, |
{ .key = KEYC_F7|KEYC_XTERM, |
{ .key = KEYC_F7|KEYC_BUILD_MODIFIERS, |
.data = "\033[18;_~" |
.data = "\033[18;_~" |
}, |
}, |
{ .key = KEYC_F8|KEYC_XTERM, |
{ .key = KEYC_F8|KEYC_BUILD_MODIFIERS, |
.data = "\033[19;_~" |
.data = "\033[19;_~" |
}, |
}, |
{ .key = KEYC_F9|KEYC_XTERM, |
{ .key = KEYC_F9|KEYC_BUILD_MODIFIERS, |
.data = "\033[20;_~" |
.data = "\033[20;_~" |
}, |
}, |
{ .key = KEYC_F10|KEYC_XTERM, |
{ .key = KEYC_F10|KEYC_BUILD_MODIFIERS, |
.data = "\033[21;_~" |
.data = "\033[21;_~" |
}, |
}, |
{ .key = KEYC_F11|KEYC_XTERM, |
{ .key = KEYC_F11|KEYC_BUILD_MODIFIERS, |
.data = "\033[23;_~" |
.data = "\033[23;_~" |
}, |
}, |
{ .key = KEYC_F12|KEYC_XTERM, |
{ .key = KEYC_F12|KEYC_BUILD_MODIFIERS, |
.data = "\033[24;_~" |
.data = "\033[24;_~" |
}, |
}, |
{ .key = KEYC_UP|KEYC_XTERM, |
{ .key = KEYC_UP|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_A" |
.data = "\033[1;_A" |
}, |
}, |
{ .key = KEYC_DOWN|KEYC_XTERM, |
{ .key = KEYC_DOWN|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_B" |
.data = "\033[1;_B" |
}, |
}, |
{ .key = KEYC_RIGHT|KEYC_XTERM, |
{ .key = KEYC_RIGHT|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_C" |
.data = "\033[1;_C" |
}, |
}, |
{ .key = KEYC_LEFT|KEYC_XTERM, |
{ .key = KEYC_LEFT|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_D" |
.data = "\033[1;_D" |
}, |
}, |
{ .key = KEYC_HOME|KEYC_XTERM, |
{ .key = KEYC_HOME|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_H" |
.data = "\033[1;_H" |
}, |
}, |
{ .key = KEYC_END|KEYC_XTERM, |
{ .key = KEYC_END|KEYC_BUILD_MODIFIERS, |
.data = "\033[1;_F" |
.data = "\033[1;_F" |
}, |
}, |
{ .key = KEYC_PPAGE|KEYC_XTERM, |
{ .key = KEYC_PPAGE|KEYC_BUILD_MODIFIERS, |
.data = "\033[5;_~" |
.data = "\033[5;_~" |
}, |
}, |
{ .key = KEYC_NPAGE|KEYC_XTERM, |
{ .key = KEYC_NPAGE|KEYC_BUILD_MODIFIERS, |
.data = "\033[6;_~" |
.data = "\033[6;_~" |
}, |
}, |
{ .key = KEYC_IC|KEYC_XTERM, |
{ .key = KEYC_IC|KEYC_BUILD_MODIFIERS, |
.data = "\033[2;_~" |
.data = "\033[2;_~" |
}, |
}, |
{ .key = KEYC_DC|KEYC_XTERM, |
{ .key = KEYC_DC|KEYC_BUILD_MODIFIERS, |
.data = "\033[3;_~" } |
.data = "\033[3;_~" } |
}; |
}; |
static const key_code input_key_modifiers[] = { |
static const key_code input_key_modifiers[] = { |
0, |
0, |
0, |
0, |
KEYC_SHIFT|KEYC_XTERM, |
KEYC_SHIFT, |
KEYC_META|KEYC_XTERM, |
KEYC_META|KEYC_IMPLIED_META, |
KEYC_SHIFT|KEYC_META|KEYC_XTERM, |
KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META, |
KEYC_CTRL|KEYC_XTERM, |
KEYC_CTRL, |
KEYC_SHIFT|KEYC_CTRL|KEYC_XTERM, |
KEYC_SHIFT|KEYC_CTRL, |
KEYC_META|KEYC_CTRL|KEYC_XTERM, |
KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL, |
KEYC_SHIFT|KEYC_META|KEYC_CTRL|KEYC_XTERM |
KEYC_SHIFT|KEYC_META|KEYC_IMPLIED_META|KEYC_CTRL |
}; |
}; |
|
|
/* Input key comparison function. */ |
/* Input key comparison function. */ |
|
|
return (0); |
return (0); |
} |
} |
|
|
|
/* Look for key in tree. */ |
|
static struct input_key_entry * |
|
input_key_get (key_code key) |
|
{ |
|
struct input_key_entry entry = { .key = key }; |
|
|
|
return (RB_FIND(input_key_tree, &input_key_tree, &entry)); |
|
} |
|
|
/* Split a character into two UTF-8 bytes. */ |
/* Split a character into two UTF-8 bytes. */ |
static size_t |
static size_t |
input_key_split2(u_int c, u_char *dst) |
input_key_split2(u_int c, u_char *dst) |
|
|
struct input_key_entry *ike, *new; |
struct input_key_entry *ike, *new; |
u_int i, j; |
u_int i, j; |
char *data; |
char *data; |
|
key_code key; |
|
|
for (i = 0; i < nitems(input_key_defaults); i++) { |
for (i = 0; i < nitems(input_key_defaults); i++) { |
ike = &input_key_defaults[i]; |
ike = &input_key_defaults[i]; |
if (~ike->key & KEYC_XTERM) { |
if (~ike->key & KEYC_BUILD_MODIFIERS) { |
RB_INSERT(input_key_tree, &input_key_tree, ike); |
RB_INSERT(input_key_tree, &input_key_tree, ike); |
continue; |
continue; |
} |
} |
|
|
for (j = 2; j < nitems(input_key_modifiers); j++) { |
for (j = 2; j < nitems(input_key_modifiers); j++) { |
|
key = (ike->key & ~KEYC_BUILD_MODIFIERS); |
data = xstrdup(ike->data); |
data = xstrdup(ike->data); |
data[strcspn(data, "_")] = '0' + j; |
data[strcspn(data, "_")] = '0' + j; |
|
|
new = xcalloc(1, sizeof *new); |
new = xcalloc(1, sizeof *new); |
new->key = ike->key|input_key_modifiers[j]; |
new->key = key|input_key_modifiers[j]; |
new->data = data; |
new->data = data; |
RB_INSERT(input_key_tree, &input_key_tree, new); |
RB_INSERT(input_key_tree, &input_key_tree, new); |
} |
} |
|
|
|
|
RB_FOREACH(ike, input_key_tree, &input_key_tree) { |
RB_FOREACH(ike, input_key_tree, &input_key_tree) { |
log_debug("%s: 0x%llx (%s) is %s", __func__, ike->key, |
log_debug("%s: 0x%llx (%s) is %s", __func__, ike->key, |
key_string_lookup_key(ike->key), ike->data); |
key_string_lookup_key(ike->key, 1), ike->data); |
} |
} |
} |
} |
|
|
|
|
{ |
{ |
if (log_get_level() != 0) { |
if (log_get_level() != 0) { |
log_debug("writing key 0x%llx (%s) to %%%u", key, |
log_debug("writing key 0x%llx (%s) to %%%u", key, |
key_string_lookup_key(key), wp->id); |
key_string_lookup_key(key, 1), wp->id); |
} |
} |
|
|
if (KEYC_IS_MOUSE(key)) { |
if (KEYC_IS_MOUSE(key)) { |
|
|
int |
int |
input_key(struct screen *s, struct bufferevent *bev, key_code key) |
input_key(struct screen *s, struct bufferevent *bev, key_code key) |
{ |
{ |
struct input_key_entry *ike, entry; |
struct input_key_entry *ike; |
size_t datalen; |
size_t datalen; |
key_code justkey, newkey; |
key_code justkey, newkey; |
struct utf8_data ud; |
struct utf8_data ud; |
|
|
newkey = options_get_number(global_options, "backspace"); |
newkey = options_get_number(global_options, "backspace"); |
if (newkey >= 0x7f) |
if (newkey >= 0x7f) |
newkey = '\177'; |
newkey = '\177'; |
key = newkey|(key & KEYC_MASK_MOD); |
key = newkey|(key & (KEYC_MASK_MODIFIERS|KEYC_MASK_FLAGS)); |
} |
} |
|
|
/* |
/* |
* If this is a normal 7-bit key, just send it, with a leading escape |
* If this is a normal 7-bit key, just send it, with a leading escape |
* if necessary. If it is a UTF-8 key, split it and send it. |
* if necessary. If it is a UTF-8 key, split it and send it. |
*/ |
*/ |
justkey = (key & ~(KEYC_XTERM|KEYC_META)); |
justkey = (key & ~KEYC_META); |
if (justkey <= 0x7f) { |
if (justkey <= 0x7f) { |
if (key & KEYC_META) |
if (key & KEYC_META) |
bufferevent_write(bev, "\033", 1); |
bufferevent_write(bev, "\033", 1); |
|
|
key &= ~KEYC_KEYPAD; |
key &= ~KEYC_KEYPAD; |
if (~s->mode & MODE_KCURSOR) |
if (~s->mode & MODE_KCURSOR) |
key &= ~KEYC_CURSOR; |
key &= ~KEYC_CURSOR; |
entry.key = key; |
ike = input_key_get(key); |
if ((ike = RB_FIND(input_key_tree, &input_key_tree, &entry)) == NULL) { |
if (ike == NULL && (key & KEYC_META) && (~key & KEYC_IMPLIED_META)) |
|
ike = input_key_get(key & ~KEYC_META); |
|
if (ike == NULL) { |
log_debug("key 0x%llx missing", key); |
log_debug("key 0x%llx missing", key); |
return (-1); |
return (-1); |
} |
} |
|
|
log_debug("found key 0x%llx: \"%s\"", key, ike->data); |
log_debug("found key 0x%llx: \"%s\"", key, ike->data); |
|
|
/* Prefix a \033 for escape. */ |
/* Prefix a \033 for escape. */ |
if (key & KEYC_META) |
if (key & KEYC_META && (~key & KEYC_IMPLIED_META)) |
bufferevent_write(bev, "\033", 1); |
bufferevent_write(bev, "\033", 1); |
bufferevent_write(bev, ike->data, datalen); |
bufferevent_write(bev, ike->data, datalen); |
return (0); |
return (0); |