mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-05-30 16:30:29 -05:00
Support ALT + numeric keypad for typing in strange character codes.
[originally from svn r2071]
This commit is contained in:
parent
5b061e20cf
commit
3584334835
102
unix/pterm.c
102
unix/pterm.c
@ -41,6 +41,7 @@ struct gui_data {
|
|||||||
int mouseptr_visible;
|
int mouseptr_visible;
|
||||||
guint term_paste_idle_id;
|
guint term_paste_idle_id;
|
||||||
GdkAtom compound_text_atom;
|
GdkAtom compound_text_atom;
|
||||||
|
int alt_keycode;
|
||||||
char wintitle[sizeof(((Config *)0)->wintitle)];
|
char wintitle[sizeof(((Config *)0)->wintitle)];
|
||||||
char icontitle[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];
|
char output[32];
|
||||||
int start, end;
|
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) {
|
if (event->type == GDK_KEY_PRESS) {
|
||||||
#ifdef KEY_DEBUGGING
|
#ifdef KEY_DEBUGGING
|
||||||
{
|
{
|
||||||
@ -330,11 +350,59 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NYI:
|
* NYI: Compose key (!!! requires Unicode faff before even trying)
|
||||||
* - alt+numpad
|
|
||||||
* - 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
|
* Shift-PgUp and Shift-PgDn don't even generate keystrokes
|
||||||
* at all.
|
* at all.
|
||||||
@ -693,23 +761,23 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
||||||
|
if (end-start > 0) {
|
||||||
#ifdef KEY_DEBUGGING
|
#ifdef KEY_DEBUGGING
|
||||||
{
|
int i;
|
||||||
int i;
|
printf("generating sequence:");
|
||||||
printf("generating sequence:");
|
for (i = start; i < end; i++)
|
||||||
for (i = start; i < end; i++)
|
printf(" %02x", (unsigned char) output[i]);
|
||||||
printf(" %02x", (unsigned char) output[i]);
|
printf("\n");
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
if (end-start > 0) {
|
|
||||||
ldisc_send(output+start, end-start, 1);
|
ldisc_send(output+start, end-start, 1);
|
||||||
show_mouseptr(0);
|
show_mouseptr(0);
|
||||||
term_out();
|
term_out();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -1528,6 +1596,8 @@ int main(int argc, char **argv)
|
|||||||
GTK_SIGNAL_FUNC(delete_window), inst);
|
GTK_SIGNAL_FUNC(delete_window), inst);
|
||||||
gtk_signal_connect(GTK_OBJECT(inst->window), "key_press_event",
|
gtk_signal_connect(GTK_OBJECT(inst->window), "key_press_event",
|
||||||
GTK_SIGNAL_FUNC(key_event), inst);
|
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_connect(GTK_OBJECT(inst->window), "focus_in_event",
|
||||||
GTK_SIGNAL_FUNC(focus_event), inst);
|
GTK_SIGNAL_FUNC(focus_event), inst);
|
||||||
gtk_signal_connect(GTK_OBJECT(inst->window), "focus_out_event",
|
gtk_signal_connect(GTK_OBJECT(inst->window), "focus_out_event",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user