version 1.14, 2009/11/05 08:45:08 |
version 1.15, 2009/11/05 10:44:36 |
|
|
* Handle keys input from the outside terminal. |
* Handle keys input from the outside terminal. |
*/ |
*/ |
|
|
void tty_keys_add(struct tty *, const char *, int, int); |
void tty_keys_add(struct tty *, const char *, int); |
void tty_keys_callback(int, short, void *); |
void tty_keys_callback(int, short, void *); |
int tty_keys_mouse(char *, size_t, size_t *, struct mouse_event *); |
int tty_keys_mouse(char *, size_t, size_t *, struct mouse_event *); |
|
|
|
|
|
|
int key; |
int key; |
int flags; |
int flags; |
|
#define TTYKEY_CTRL 0x1 |
|
#define TTYKEY_RAW 0x2 |
}; |
}; |
|
|
struct tty_key_ent tty_keys[] = { |
struct tty_key_ent tty_keys[] = { |
|
|
} |
} |
|
|
void |
void |
tty_keys_add(struct tty *tty, const char *s, int key, int flags) |
tty_keys_add(struct tty *tty, const char *s, int key) |
{ |
{ |
struct tty_key *tk, *tl; |
struct tty_key *tk, *tl; |
|
|
tk = xmalloc(sizeof *tk); |
tk = xmalloc(sizeof *tk); |
tk->string = xstrdup(s); |
tk->string = xstrdup(s); |
tk->key = key; |
tk->key = key; |
tk->flags = flags; |
|
|
|
if ((tl = RB_INSERT(tty_keys, &tty->ktree, tk)) != NULL) { |
if ((tl = RB_INSERT(tty_keys, &tty->ktree, tk)) != NULL) { |
xfree(tk->string); |
xfree(tk->string); |
|
|
continue; |
continue; |
} |
} |
|
|
tty_keys_add(tty, s + 1, tke->key, tke->flags); |
tty_keys_add(tty, s + 1, tke->key); |
if (tke->flags & TTYKEY_CTRL) { |
if (tke->flags & TTYKEY_CTRL) { |
if (strlcpy(tmp, s, sizeof tmp) >= sizeof tmp) |
if (strlcpy(tmp, s, sizeof tmp) >= sizeof tmp) |
continue; |
continue; |
tmp[strlen(tmp) - 1] ^= 0x20; |
tmp[strlen(tmp) - 1] ^= 0x20; |
tty_keys_add(tty, tmp + 1, tke->key | KEYC_CTRL, 0); |
tty_keys_add(tty, tmp + 1, tke->key | KEYC_CTRL); |
} |
} |
} |
} |
} |
} |