emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master a38096f: Undo the effect of CapsLock when other mod


From: Eli Zaretskii
Subject: [Emacs-diffs] master a38096f: Undo the effect of CapsLock when other modifiers are present
Date: Sat, 15 Oct 2016 14:19:46 +0000 (UTC)

branch: master
commit a38096f8e2978a14f3bc8fa0dc3e0c9d0f753c3c
Author: Dima Kogan <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    Undo the effect of CapsLock when other modifiers are present
    
    * src/keyboard.c (make_lispy_event): Effectively undo the effect
    of CapsLock if any modifiers other than Shift are present in a key.
    (Bug#24456)
---
 src/keyboard.c |   30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/src/keyboard.c b/src/keyboard.c
index ca40c6e..87a6851 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -5417,6 +5417,36 @@ make_lispy_event (struct input_event *event)
          {
            c &= 0377;
            eassert (c == event->code);
+          }
+
+        /* Caps-lock shouldn't affect interpretation of key chords:
+           Control+s should produce C-s whether caps-lock is on or
+           not.  And Control+Shift+s should produce C-S-s whether
+           caps-lock is on or not. */
+        if (event->modifiers & ~shift_modifier)
+        {
+            /* this is a key chord: some non-shift modifier is
+               depressed */
+
+            if (uppercasep (c) &&
+                !(event->modifiers & shift_modifier))
+            {
+                /* Got a capital letter without a shift.  The caps
+                   lock is on.   Un-capitalize the letter */
+                c = downcase(c);
+            }
+            else if (lowercasep (c) &&
+                     (event->modifiers & shift_modifier))
+            {
+                /* Got a lower-case letter even though shift is
+                   depressed.  The caps lock is on.  Capitalize the
+                   letter */
+                c = upcase(c);
+            }
+        }
+
+       if (event->kind == ASCII_KEYSTROKE_EVENT)
+         {
            /* Turn ASCII characters into control characters
               when proper.  */
            if (event->modifiers & ctrl_modifier)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]