I've had two complaints that Solo ought to recognise the numeric

keypad. The reason it doesn't is because front ends were carefully
translating the numeric keypad into 8-way directional keys for the
benefit of Cube. Therefore, a policy change:
 - front ends process the numeric keypad by sending MOD_NUM_KEYPAD |
   '3' and similar
 - front ends running on a platform with Num Lock SHOULD do this
   _irrespective_ of the state of Num Lock
 - back ends do whatever they see fit with numeric keypad keys.
Result: the numeric keypad now works in Solo, and also works in OS X
Cube (which it previously didn't because I forgot to implement that
bit of the front end!).

[originally from svn r5774]
This commit is contained in:
Simon Tatham
2005-05-12 18:25:57 +00:00
parent 8f1c713735
commit 68d27f0526
6 changed files with 82 additions and 43 deletions

36
gtk.c
View File

@ -321,28 +321,36 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
if (!fe->pixmap)
return TRUE;
if (event->string[0] && !event->string[1])
keyval = (unsigned char)event->string[0];
else if (event->keyval == GDK_Up || event->keyval == GDK_KP_Up ||
event->keyval == GDK_KP_8)
if (event->keyval == GDK_Up)
keyval = CURSOR_UP;
else if (event->keyval == GDK_Down || event->keyval == GDK_KP_Down ||
event->keyval == GDK_KP_2)
else if (event->keyval == GDK_KP_Up || event->keyval == GDK_KP_8)
keyval = MOD_NUM_KEYPAD | '8';
else if (event->keyval == GDK_Down)
keyval = CURSOR_DOWN;
else if (event->keyval == GDK_Left || event->keyval == GDK_KP_Left ||
event->keyval == GDK_KP_4)
else if (event->keyval == GDK_KP_Down || event->keyval == GDK_KP_2)
keyval = MOD_NUM_KEYPAD | '2';
else if (event->keyval == GDK_Left)
keyval = CURSOR_LEFT;
else if (event->keyval == GDK_Right || event->keyval == GDK_KP_Right ||
event->keyval == GDK_KP_6)
else if (event->keyval == GDK_KP_Left || event->keyval == GDK_KP_4)
keyval = MOD_NUM_KEYPAD | '4';
else if (event->keyval == GDK_Right)
keyval = CURSOR_RIGHT;
else if (event->keyval == GDK_KP_Right || event->keyval == GDK_KP_6)
keyval = MOD_NUM_KEYPAD | '6';
else if (event->keyval == GDK_KP_Home || event->keyval == GDK_KP_7)
keyval = CURSOR_UP_LEFT;
keyval = MOD_NUM_KEYPAD | '7';
else if (event->keyval == GDK_KP_End || event->keyval == GDK_KP_1)
keyval = CURSOR_DOWN_LEFT;
keyval = MOD_NUM_KEYPAD | '1';
else if (event->keyval == GDK_KP_Page_Up || event->keyval == GDK_KP_9)
keyval = CURSOR_UP_RIGHT;
keyval = MOD_NUM_KEYPAD | '9';
else if (event->keyval == GDK_KP_Page_Down || event->keyval == GDK_KP_3)
keyval = CURSOR_DOWN_RIGHT;
keyval = MOD_NUM_KEYPAD | '3';
else if (event->keyval == GDK_KP_Insert || event->keyval == GDK_KP_0)
keyval = MOD_NUM_KEYPAD | '0';
else if (event->keyval == GDK_KP_Begin || event->keyval == GDK_KP_5)
keyval = MOD_NUM_KEYPAD | '5';
else if (event->string[0] && !event->string[1])
keyval = (unsigned char)event->string[0];
else
keyval = -1;