From 045f707bf479ce03fc35f76ae397b1f5d93d9fda Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 28 Oct 2002 17:34:45 +0000 Subject: [PATCH] Fix Alt+numberpad in pterm. For a start, there was a bug whereby if a pterm came up while Alt was down, then releasing it would cause a ^@ to be generated. Also, though, I've decided that Alt plus a single numberpad key should not generate a low-numbered control code, because that's too easy to do by mistake and the codes are too powerful. Anyone who really _wants_ to create a ^C or ^D from the numberpad can do Alt-03 or Alt-04 easily enough; two-digit codes and more such as Alt-65 are unaffected. git-svn-id: svn://svn.tartarus.org/sgt/putty@2153 cda61777-01e9-0310-a592-d414129be87e --- unix/pterm.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/unix/pterm.c b/unix/pterm.c index 74418ab9..947e4411 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -50,6 +50,7 @@ struct gui_data { guint term_paste_idle_id; GdkAtom compound_text_atom; int alt_keycode; + int alt_digits; char wintitle[sizeof(((Config *)0)->wintitle)]; char icontitle[sizeof(((Config *)0)->wintitle)]; int master_fd, master_func_id, exited; @@ -354,11 +355,17 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) /* * If Alt is being released after typing an Alt+numberpad * sequence, we should generate the code that was typed. + * + * Note that we only do this if more than one key was actually + * pressed - I don't think Alt+NumPad4 should be ^D or that + * Alt+NumPad3 should be ^C, for example. There's no serious + * inconvenience in having to type a zero before a single-digit + * character code. */ 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) { + inst->alt_keycode >= 0 && inst->alt_digits > 1) { #ifdef KEY_DEBUGGING printf("Alt key up, keycode = %d\n", inst->alt_keycode); #endif @@ -391,6 +398,7 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) 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; + inst->alt_digits = 0; goto done; /* this generates nothing else */ } @@ -425,6 +433,7 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) inst->alt_keycode = digit; /* one-digit code */ else inst->alt_keycode = inst->alt_keycode * 10 + digit; + inst->alt_digits++; #ifdef KEY_DEBUGGING printf(" gives new code %d\n", inst->alt_keycode); #endif @@ -1895,6 +1904,7 @@ int main(int argc, char **argv) */ inst = smalloc(sizeof(*inst)); memset(inst, 0, sizeof(*inst)); + inst->alt_keycode = -1; /* this one needs _not_ to be zero */ inst->fonts[0] = gdk_font_load(cfg.font); if (!inst->fonts[0]) { -- 2.11.0