changeset 2954:0dfd1927264e

(make_ctrl_char): New function. (make_lispy_event): Call it.
author Jim Blandy <jimb@redhat.com>
date Sat, 22 May 1993 17:57:17 +0000
parents 5440f00480e6
children f34f9e634b81
files src/keyboard.c
diffstat 1 files changed, 33 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/src/keyboard.c	Sat May 22 09:13:57 1993 +0000
+++ b/src/keyboard.c	Sat May 22 17:57:17 1993 +0000
@@ -1236,24 +1236,34 @@
 make_ctrl_char (c)
      int c;
 {
-  /* If it's already a control character, don't mess with it.  */
-  if ((c & 0160) == 0)
-    ;
-  /* Making ? a control character should result in DEL.  */
-
-  else if ((c & 0177) == '?')
-    c |= 0177;
-
-  /* ASCII control chars are made from letters (both cases),
-     as well as the non-letters within 0100...0137.  */
-  else if ((c & 0137) >= 'A' && (c & 0137) <= 'Z')
-    c = (c & (037 | ~0177));
-  else if ((c & 0177) >= 0100 && (c & 0177) <= 0137)
-    c = (c & (037 | ~0177));
-
-  /* Anything else must get its high control bit set.  */
-  else
-    c = c | ctrl_modifier;
+  /* Save the upper bits here.  */
+  int upper = c & ~0177;
+
+  c &= 0177;
+
+  /* Everything in the columns containing the upper-case letters
+     denotes a control character.  */
+  if (c >= 0100 && c < 0140)
+    {
+      int oc = c;
+      c &= ~0140;
+      /* Set the shift modifier for a control char
+	 made from a shifted letter.  But only for letters!  */
+      if (oc >= 'A' && oc <= 'Z')
+	c |= shift_modifier;
+    }
+
+  /* The lower-case letters denote control characters too.  */
+  else if (c >= 'a' && c <= 'z')
+    c &= ~0140;
+
+  /* Include the bits for control and shift
+     only if the basic ASCII code can't indicate them.  */
+  else if (c >= ' ')
+    c |= ctrl_modifier;
+
+  /* Replace the high bits.  */
+  c |= (upper & ~ctrl_modifier);
 
   return c;
 }
@@ -2106,23 +2116,11 @@
 	/* Turn ASCII characters into control characters
 	   when proper.  */
 	if (event->modifiers & ctrl_modifier)
-	  {
-	    if (c >= 0100 && c < 0140)
-	      {
-		int oc = c;
-		c &= ~0140;
-		/* Set the shift modifier for a control char
-		   made from a shifted letter.  But only for letters!  */
-		if (oc >= 'A' && oc <= 'Z')
-		  c |= shift_modifier;
-	      }
-	    else if (c >= 'a' && c <= 'z')
-	      c &= ~0140;
-	    /* Include the bits for control and shift
-	       only if the basic ASCII code can't indicate them.  */
-	    else
-	      c |= ctrl_modifier;
-	  }
+	  c = make_ctrl_char (c);
+
+	/* Add in the other modifier bits.  We took care of ctrl_modifier
+	   just above, and the shift key was taken care of by the X code,
+	   and applied to control characters by make_ctrl_char.  */
 	c |= (event->modifiers
 	      & (meta_modifier | alt_modifier
 		 | hyper_modifier | super_modifier));