Renumber special keys to negative values, making room for Unicode.

This version should still be interlink compatible with previous ones.

---
commit d25b037cf7e09aff4b0051804355e48d4fcc7460
tree 00672299f4623229a4f490cf80106a0fc2a6baff
parent 0c424d5c8c9e3cdb2b46f6b2e8f95f6a3407707f
author Kalle Olavi Niemitalo <[EMAIL PROTECTED]> Thu, 03 Aug 2006 21:09:29 +0300
committer Kalle Olavi Niemitalo <[EMAIL PROTECTED]> Thu, 03 Aug 2006 21:09:29 +0300

 src/bfu/menu.c       |    2 +-
 src/config/kbdbind.c |    4 ++-
 src/terminal/event.c |    8 +++---
 src/terminal/event.h |    4 +++
 src/terminal/kbd.c   |   19 ++++++++------
 src/terminal/kbd.h   |   66 ++++++++++++++++++++++++++++++--------------------
 6 files changed, 60 insertions(+), 43 deletions(-)

diff --git a/src/bfu/menu.c b/src/bfu/menu.c
index c80bf4c..dfd9a66 100644
--- a/src/bfu/menu.c
+++ b/src/bfu/menu.c
@@ -950,7 +950,7 @@ menu_kbd_handler(struct menu *menu, stru
 		{
 			int key = get_kbd_key(ev);
 
-			if ((key >= KBD_F1 && key <= KBD_F12)
+			if (is_kbd_fkey(key)
 			    || check_kbd_modifier(ev, KBD_MOD_ALT)) {
 				delete_window_ev(win, ev);
 				return;
diff --git a/src/config/kbdbind.c b/src/config/kbdbind.c
index 0e3996e..abc2809 100644
--- a/src/config/kbdbind.c
+++ b/src/config/kbdbind.c
@@ -437,7 +437,7 @@ parse_keystroke(unsigned char *s, int ca
 	}
 
 	kbd->key = read_key(s);
-	return (kbd->key < 0) ? -1 : 0;
+	return (kbd->key == KBD_UNDEF) ? -1 : 0;
 }
 
 void
@@ -449,7 +449,7 @@ add_keystroke_to_string(struct string *s
 	struct key *key;
 	const struct modifier *modp;
 
-	if (kbd->key < 0) return;
+	if (kbd->key == KBD_UNDEF) return;
 
 	for (modp = modifiers; modp->name_and_dash != NULL; ++modp) {
 		if (kbd->modifier & modp->bitmask)
diff --git a/src/terminal/event.c b/src/terminal/event.c
index 58c53d8..5943aea 100644
--- a/src/terminal/event.c
+++ b/src/terminal/event.c
@@ -266,11 +266,11 @@ #endif
 	case EVENT_KBD:
 	{
 		int utf8_io = -1;
-		int key;
+		int key = ilev->info.keyboard.key;
 
-		set_kbd_term_event(&tev, ilev->info.keyboard.key, ilev->info.keyboard.modifier);
-
-		key = get_kbd_key(&tev);
+		if (key >= 0x100)
+			key = -key;
+		set_kbd_term_event(&tev, key, ilev->info.keyboard.modifier);
 
 		reset_timer();
 
diff --git a/src/terminal/event.h b/src/terminal/event.h
index f65a623..7e954af 100644
--- a/src/terminal/event.h
+++ b/src/terminal/event.h
@@ -78,11 +78,15 @@ set_kbd_term_event(struct term_event *ev
 	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.  */
 static inline void
 set_kbd_interlink_event(struct interlink_event *ev, int key, int modifier)
 {
 	memset(ev, 0, sizeof(*ev));
 	ev->ev = EVENT_KBD;
+	if (key <= -0x100)
+		key = -key;
 	kbd_set(&ev->info.keyboard, key, modifier);
 }
 
diff --git a/src/terminal/kbd.c b/src/terminal/kbd.c
index a2a8827..07fd305 100644
--- a/src/terminal/kbd.c
+++ b/src/terminal/kbd.c
@@ -656,7 +656,7 @@ #endif
 static int
 decode_terminal_escape_sequence(struct itrm *itrm, struct interlink_event *ev)
 {
-	struct interlink_event_keyboard kbd = { KBD_UNDEF, KBD_MOD_NONE };
+	struct term_event_keyboard kbd = { KBD_UNDEF, KBD_MOD_NONE };
 	unsigned char c;
 	int v;
 	int el;
@@ -670,8 +670,8 @@ decode_terminal_escape_sequence(struct i
 		if (itrm->in.queue.len >= 4
 		    && itrm->in.queue.data[3] >= 'A'
 		    && itrm->in.queue.data[3] <= 'L') {
-			kbd.key = KBD_F1 + itrm->in.queue.data[3] - 'A';
-			copy_struct(&ev->info.keyboard, &kbd);
+			kbd.key = number_to_kbd_fkey(itrm->in.queue.data[3] - 'A' + 1);
+			set_kbd_interlink_event(ev, kbd.key, kbd.modifier);
 			return 4;
 		}
 
@@ -770,10 +770,9 @@ #endif /* CONFIG_MOUSE */
 		break;
 	}
 
-	/* The event might have been changed to a mouse event */
-	if (ev->ev == EVENT_KBD && kbd.key != KBD_UNDEF) {
-		copy_struct(&ev->info.keyboard, &kbd);
-	}
+	/* KBD_UNDEF here means it was unrecognized or a mouse event.  */
+	if (kbd.key != KBD_UNDEF)
+		set_kbd_interlink_event(ev, kbd.key, kbd.modifier);
 
 	return el;
 }
@@ -995,7 +994,7 @@ #endif /* DEBUG_ITRM_QUEUE */
 		}
 
 	} else if (itrm->in.queue.data[0] == 0) {
-		static const struct interlink_event_keyboard os2xtd[256] = {
+		static const struct term_event_keyboard os2xtd[256] = {
 #include "terminal/key.inc"
 		};
 
@@ -1003,7 +1002,9 @@ #include "terminal/key.inc"
 			el = -1;
 		else {
 			el = 2;
-			copy_struct(&ev.info.keyboard, &os2xtd[itrm->in.queue.data[1]]);
+			set_kbd_interlink_event(&ev,
+						os2xtd[itrm->in.queue.data[1]].key,
+						os2xtd[itrm->in.queue.data[1]].modifier);
 		}
 	}
 
diff --git a/src/terminal/kbd.h b/src/terminal/kbd.h
index d8d5462..fb101cc 100644
--- a/src/terminal/kbd.h
+++ b/src/terminal/kbd.h
@@ -4,46 +4,58 @@ #define EL__TERMINAL_KBD_H
 struct itrm;
 
 struct term_event_keyboard {
+	/* Values <= 0x100 are special; e.g. KBD_ENTER.
+	 * Values between -0xFF and -2 are not used yet; treat as special.
+	 * Value  == -1 is KBD_UNDEF; not sent via socket. 
+	 * Values between 0 and 0xFF are bytes received from the terminal.
+	 * Values >= 0x100 are not used.  */
 	int key;
 	int modifier;
 };
 
 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.  */
 	int key;
 	int modifier;
 };
 
 #define KBD_UNDEF	-1
 
-#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
+#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)
 
-#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
+#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)
+#define is_kbd_fkey(key) ((unsigned long) (KBD_F1 - (key)) <= (unsigned long) (KBD_F1 - 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
+#define KBD_CTRL_C	(-0x200)
 
 #define KBD_MOD_NONE	0
 #define KBD_MOD_SHIFT	1

Attachment: pgpiuQSZdGlMY.pgp
Description: PGP signature

_______________________________________________
elinks-dev mailing list
[email protected]
http://linuxfromscratch.org/mailman/listinfo/elinks-dev

Reply via email to