From f290ff560840de430b2c3536bca43aafec4b49b2 Mon Sep 17 00:00:00 2001 From: Kalle Olavi Niemitalo Date: Sun, 13 Aug 2006 19:03:09 +0300 Subject: [PATCH] terminal: New enum term_event_special_key. This makes constants like KBD_ENTER visible to the debugger, at least when compiled with GCC. --- src/terminal/event.h | 6 ++-- src/terminal/kbd.c | 8 +++++ src/terminal/kbd.h | 72 ++++++++++++++++++++++++-------------------- 3 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/terminal/event.h b/src/terminal/event.h index 8125b1b02..a3bfab4f4 100644 --- a/src/terminal/event.h +++ b/src/terminal/event.h @@ -78,8 +78,10 @@ set_kbd_term_event(struct term_event *ev, int key, int modifier) kbd_set(&ev->info.keyboard, key, modifier); } -/* @key can be e.g. KBD_ENTER as in term_event_keyboard.key. - * This function then sets ev->info.keyboard.key = -KBD_ENTER. */ +/* @key can be either a 8-bit byte or a value from enum term_event_special_key. + * In the latter case, this function negates the value, unless it is KBD_UNDEF. + * For example, key == KBD_ENTER results in ev->info.keyboard.key = -KBD_ENTER. + * This mapping keeps the interlink protocol compatible with ELinks 0.11. */ static inline void set_kbd_interlink_event(struct interlink_event *ev, int key, int modifier) { diff --git a/src/terminal/kbd.c b/src/terminal/kbd.c index 07fd30564..87c892456 100644 --- a/src/terminal/kbd.c +++ b/src/terminal/kbd.c @@ -48,6 +48,14 @@ static int process_queue(struct itrm *); static void handle_itrm_stdin(struct itrm *); static void unhandle_itrm_stdin(struct itrm *); +#ifdef CONFIG_DEBUG +/* This hack makes GCC put enum term_event_special_key in the debug + * information even though it is not otherwise used. The const + * prevents an unused-variable warning. */ +static const enum term_event_special_key dummy_term_event_special_key; +#endif + + int is_blocked(void) { diff --git a/src/terminal/kbd.h b/src/terminal/kbd.h index 4bea29925..fbda0eb03 100644 --- a/src/terminal/kbd.h +++ b/src/terminal/kbd.h @@ -3,11 +3,11 @@ struct itrm; -/* Values <= -0x100 are special; e.g. KBD_ENTER. +/* Values <= -0x100 are special; from enum term_event_special_key. * Values between -0xFF and -2 are not used yet; treat as special. * Value == -1 is KBD_UNDEF; not sent via socket. * Values >= 0 are characters received from the terminal; - * in UCS-4 #ifdef CONFIG_UTF_8. + * in UCS-4 #ifdef CONFIG_UTF_8. Test with is_kbd_character(). * * Any at least 32-bit signed integer type would work here; using an * exact-width type hurts portability in principle, but some other @@ -23,48 +23,54 @@ struct interlink_event_keyboard { /* Values <= -2 are not used, for ELinks 0.11 compatibility. * Value == -1 is KBD_UNDEF; not sent via socket. * Values between 0 and 0xFF are bytes received from the terminal. - * Values >= 0x100 are special; e.g. -KBD_ENTER. */ + * Values >= 0x100 are special; absolute values of constants + * from enum term_event_special_key, e.g. -KBD_ENTER. */ int key; int modifier; }; -/* Values for term_event_key_T */ +/* Codes of special keys, for use in term_event_key_T. + * The enum has a tag mainly to let you cast numbers to it in GDB and see + * their names. ELinks doesn't use this enum type as term_event_key_T, + * because it might be 16-bit and Unicode characters wouldn't then fit. */ +enum term_event_special_key { + KBD_UNDEF = -1, -#define KBD_UNDEF -1 + KBD_ENTER = -0x100, + KBD_BS = -0x101, + KBD_TAB = -0x102, + KBD_ESC = -0x103, + KBD_LEFT = -0x104, + KBD_RIGHT = -0x105, + KBD_UP = -0x106, + KBD_DOWN = -0x107, + KBD_INS = -0x108, + KBD_DEL = -0x109, + KBD_HOME = -0x10a, + KBD_END = -0x10b, + KBD_PAGE_UP = -0x10c, + KBD_PAGE_DOWN = -0x10d, -#define KBD_ENTER (-0x100) -#define KBD_BS (-0x101) -#define KBD_TAB (-0x102) -#define KBD_ESC (-0x103) -#define KBD_LEFT (-0x104) -#define KBD_RIGHT (-0x105) -#define KBD_UP (-0x106) -#define KBD_DOWN (-0x107) -#define KBD_INS (-0x108) -#define KBD_DEL (-0x109) -#define KBD_HOME (-0x10a) -#define KBD_END (-0x10b) -#define KBD_PAGE_UP (-0x10c) -#define KBD_PAGE_DOWN (-0x10d) + KBD_F1 = -0x120, + KBD_F2 = -0x121, + KBD_F3 = -0x122, + KBD_F4 = -0x123, + KBD_F5 = -0x124, + KBD_F6 = -0x125, + KBD_F7 = -0x126, + KBD_F8 = -0x127, + KBD_F9 = -0x128, + KBD_F10 = -0x129, + KBD_F11 = -0x12a, + KBD_F12 = -0x12b, + + KBD_CTRL_C = -0x200 +}; -#define KBD_F1 (-0x120) -#define KBD_F2 (-0x121) -#define KBD_F3 (-0x122) -#define KBD_F4 (-0x123) -#define KBD_F5 (-0x124) -#define KBD_F6 (-0x125) -#define KBD_F7 (-0x126) -#define KBD_F8 (-0x127) -#define KBD_F9 (-0x128) -#define KBD_F10 (-0x129) -#define KBD_F11 (-0x12a) -#define KBD_F12 (-0x12b) static inline int is_kbd_fkey(term_event_key_T key) { return key <= KBD_F1 && key >= KBD_F12; } #define number_to_kbd_fkey(num) (KBD_F1 - (num) + 1) #define kbd_fkey_to_number(key) (KBD_F1 - (key) + 1) -#define KBD_CTRL_C (-0x200) - /* int is_kbd_character(term_event_key_T key); * Return true if @key is a character in some charset, rather than a * special key. The character is not necessarily printable. As for