1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-05-28 23:34:49 -05:00

Support ALT + numeric keypad for typing in strange character codes.

[originally from svn r2071]
This commit is contained in:
Simon Tatham 2002-10-15 17:18:24 +00:00
parent 5b061e20cf
commit 3584334835

View File

@ -41,6 +41,7 @@ struct gui_data {
int mouseptr_visible;
guint term_paste_idle_id;
GdkAtom compound_text_atom;
int alt_keycode;
char wintitle[sizeof(((Config *)0)->wintitle)];
char icontitle[sizeof(((Config *)0)->wintitle)];
};
@ -317,6 +318,25 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
char output[32];
int start, end;
/* By default, nothing is generated. */
end = start = 0;
/*
* If Alt is being released after typing an Alt+numberpad
* sequence, we should generate the code that was typed.
*/
if (event->type == GDK_KEY_RELEASE &&
(event->keyval == GDK_Meta_L || event->keyval == GDK_Alt_L ||
event->keyval == GDK_Meta_R || event->keyval == GDK_Alt_R) &&
inst->alt_keycode >= 0) {
#ifdef KEY_DEBUGGING
printf("Alt key up, keycode = %d\n", inst->alt_keycode);
#endif
output[0] = inst->alt_keycode;
end = 1;
goto done;
}
if (event->type == GDK_KEY_PRESS) {
#ifdef KEY_DEBUGGING
{
@ -330,11 +350,59 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
#endif
/*
* NYI:
* - alt+numpad
* - Compose key (!!! requires Unicode faff before even trying)
* NYI: Compose key (!!! requires Unicode faff before even trying)
*/
/*
* If Alt has just been pressed, we start potentially
* accumulating an Alt+numberpad code. We do this by
* setting alt_keycode to -1 (nothing yet but plausible).
*/
if ((event->keyval == GDK_Meta_L || event->keyval == GDK_Alt_L ||
event->keyval == GDK_Meta_R || event->keyval == GDK_Alt_R)) {
inst->alt_keycode = -1;
goto done; /* this generates nothing else */
}
/*
* If we're seeing a numberpad key press with Mod1 down,
* consider adding it to alt_keycode if that's sensible.
* Anything _else_ with Mod1 down cancels any possibility
* of an ALT keycode: we set alt_keycode to -2.
*/
if ((event->state & GDK_MOD1_MASK) && inst->alt_keycode != -2) {
int digit = -1;
switch (event->keyval) {
case GDK_KP_0: case GDK_KP_Insert: digit = 0; break;
case GDK_KP_1: case GDK_KP_End: digit = 1; break;
case GDK_KP_2: case GDK_KP_Down: digit = 2; break;
case GDK_KP_3: case GDK_KP_Page_Down: digit = 3; break;
case GDK_KP_4: case GDK_KP_Left: digit = 4; break;
case GDK_KP_5: case GDK_KP_Begin: digit = 5; break;
case GDK_KP_6: case GDK_KP_Right: digit = 6; break;
case GDK_KP_7: case GDK_KP_Home: digit = 7; break;
case GDK_KP_8: case GDK_KP_Up: digit = 8; break;
case GDK_KP_9: case GDK_KP_Page_Up: digit = 9; break;
}
if (digit < 0)
inst->alt_keycode = -2; /* it's invalid */
else {
#ifdef KEY_DEBUGGING
printf("Adding digit %d to keycode %d", digit,
inst->alt_keycode);
#endif
if (inst->alt_keycode == -1)
inst->alt_keycode = digit; /* one-digit code */
else
inst->alt_keycode = inst->alt_keycode * 10 + digit;
#ifdef KEY_DEBUGGING
printf(" gives new code %d\n", inst->alt_keycode);
#endif
/* Having used this digit, we now do nothing more with it. */
goto done;
}
}
/*
* Shift-PgUp and Shift-PgDn don't even generate keystrokes
* at all.
@ -693,23 +761,23 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
goto done;
}
}
goto done;
}
done:
done:
if (end-start > 0) {
#ifdef KEY_DEBUGGING
{
int i;
printf("generating sequence:");
for (i = start; i < end; i++)
printf(" %02x", (unsigned char) output[i]);
printf("\n");
}
int i;
printf("generating sequence:");
for (i = start; i < end; i++)
printf(" %02x", (unsigned char) output[i]);
printf("\n");
#endif
if (end-start > 0) {
ldisc_send(output+start, end-start, 1);
show_mouseptr(0);
term_out();
}
ldisc_send(output+start, end-start, 1);
show_mouseptr(0);
term_out();
}
return TRUE;
@ -1528,6 +1596,8 @@ int main(int argc, char **argv)
GTK_SIGNAL_FUNC(delete_window), inst);
gtk_signal_connect(GTK_OBJECT(inst->window), "key_press_event",
GTK_SIGNAL_FUNC(key_event), inst);
gtk_signal_connect(GTK_OBJECT(inst->window), "key_release_event",
GTK_SIGNAL_FUNC(key_event), inst);
gtk_signal_connect(GTK_OBJECT(inst->window), "focus_in_event",
GTK_SIGNAL_FUNC(focus_event), inst);
gtk_signal_connect(GTK_OBJECT(inst->window), "focus_out_event",