From e0042e87b94c69b923e001a773cbb0cead9fc4c3 Mon Sep 17 00:00:00 2001
From: Ben Wiley Sittler <bsittler@gmail.com>
Date: Fri, 31 Oct 2008 18:39:16 +0000
Subject: [PATCH] now arrow keys, function keys, etc. work

---
 caca/driver/win32.c | 73 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/caca/driver/win32.c b/caca/driver/win32.c
index 78b7935..cdcb34b 100644
--- a/caca/driver/win32.c
+++ b/caca/driver/win32.c
@@ -275,6 +275,79 @@ static int win32_get_event(caca_display_t *dp, caca_privevent_t *ev)
                 ev->data.key.utf8[0] = ev->data.key.ch;
                 ev->data.key.utf8[1] = '\0';
 
+                return 1;
+            }
+            else
+            {
+                switch (rec.Event.KeyEvent.wVirtualKeyCode)
+                {
+                case VK_TAB:        ev->data.key.ch = '\t';              break;
+                case VK_RETURN:     ev->data.key.ch = '\r';              break;
+                case VK_ESCAPE:     ev->data.key.ch = '\x1b';            break;
+                case VK_SPACE:      ev->data.key.ch = ' ';               break;
+                case VK_DELETE:     ev->data.key.ch = '\x7f';            break;
+
+                case VK_LEFT:       ev->data.key.ch = CACA_KEY_LEFT;     break;
+                case VK_RIGHT:      ev->data.key.ch = CACA_KEY_RIGHT;    break;
+                case VK_UP:         ev->data.key.ch = CACA_KEY_UP;       break;
+                case VK_DOWN:       ev->data.key.ch = CACA_KEY_DOWN;     break;
+
+                case VK_INSERT:     ev->data.key.ch = CACA_KEY_INSERT;   break;
+                case VK_HOME:       ev->data.key.ch = CACA_KEY_HOME;     break;
+                case VK_END:        ev->data.key.ch = CACA_KEY_END;      break;
+                case VK_PRIOR:      ev->data.key.ch = CACA_KEY_PAGEUP;   break;
+                case VK_NEXT:       ev->data.key.ch = CACA_KEY_PAGEDOWN; break;
+
+                case VK_F1:         ev->data.key.ch = CACA_KEY_F1;       break;
+                case VK_F2:         ev->data.key.ch = CACA_KEY_F2;       break;
+                case VK_F3:         ev->data.key.ch = CACA_KEY_F3;       break;
+                case VK_F4:         ev->data.key.ch = CACA_KEY_F4;       break;
+                case VK_F5:         ev->data.key.ch = CACA_KEY_F5;       break;
+                case VK_F6:         ev->data.key.ch = CACA_KEY_F6;       break;
+                case VK_F7:         ev->data.key.ch = CACA_KEY_F7;       break;
+                case VK_F8:         ev->data.key.ch = CACA_KEY_F8;       break;
+                case VK_F9:         ev->data.key.ch = CACA_KEY_F9;       break;
+                case VK_F10:        ev->data.key.ch = CACA_KEY_F10;      break;
+                case VK_F11:        ev->data.key.ch = CACA_KEY_F11;      break;
+                case VK_F12:        ev->data.key.ch = CACA_KEY_F12;      break;
+                case VK_F13:        ev->data.key.ch = CACA_KEY_F13;      break;
+                case VK_F14:        ev->data.key.ch = CACA_KEY_F14;      break;
+                case VK_F15:        ev->data.key.ch = CACA_KEY_F15;      break;
+
+                case VK_NUMPAD0:    ev->data.key.ch = '0';               break;
+                case VK_NUMPAD1:    ev->data.key.ch = '1';               break;
+                case VK_NUMPAD2:    ev->data.key.ch = '2';               break;
+                case VK_NUMPAD3:    ev->data.key.ch = '3';               break;
+                case VK_NUMPAD4:    ev->data.key.ch = '4';               break;
+                case VK_NUMPAD5:    ev->data.key.ch = '5';               break;
+                case VK_NUMPAD6:    ev->data.key.ch = '6';               break;
+                case VK_NUMPAD7:    ev->data.key.ch = '7';               break;
+                case VK_NUMPAD8:    ev->data.key.ch = '8';               break;
+                case VK_NUMPAD9:    ev->data.key.ch = '9';               break;
+                case VK_MULTIPLY:   ev->data.key.ch = '*';               break;
+                case VK_ADD:        ev->data.key.ch = '+';               break;
+                case VK_SEPARATOR:  ev->data.key.ch = ',';               break;
+                case VK_SUBTRACT:   ev->data.key.ch = '-';               break;
+                case VK_DECIMAL:    ev->data.key.ch = '.';               break;
+                case VK_DIVIDE:     ev->data.key.ch = '/';               break;
+
+                default: ev->type = CACA_EVENT_NONE; return 0;
+                }
+
+                if ((ev->data.key.ch > 0)
+                    &&
+                    (ev->data.key.ch <= 0x7f))
+                {
+                    ev->data.key.utf32 = (uint32_t)ev->data.key.ch;
+                    ev->data.key.utf8[0] = ev->data.key.ch;
+                    ev->data.key.utf8[1] = '\0';
+                }
+                else
+                {
+                    ev->data.key.utf32 = 0;
+                    ev->data.key.utf8[0] = '\0';
+                }
+
                 return 1;
             }
         }