emacs-devel
[Top][All Lists]
Advanced

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

Re: capslock changes control characters?


From: Stefan Monnier
Subject: Re: capslock changes control characters?
Date: Wed, 05 Mar 2008 11:18:36 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux)

> 2008-03-05  Kenichi Handa  <address@hidden>

>       * lread.c (Fread_char): Resolve modifiers.
>       (Fread_char_exclusive): Likewise.

> Previously (read-char) returned 33554441 when you type C-I
> (i.e. C-S-i).  I changed it to return 9 (i.e. C-i).  It is
> also changed to return 233 upon M-i instead of 134217833.
> They still return a code containing unresolvable modifiers.

It looks ok, but I have some comments/questions:

1 - Why both with the mapping of meta?  AFAIK this is only ever used
    when manipulating keymaps using keysequences represented as strings
    rather than vectors.  So I don't think it's needed here.

2 - why is this needed now.  It seems like this was already working fine
    before the unicode merge without this function, so what is the change
    that caused the problem in the first place (or in other words, how
    did it work before)?


-- Stefan


> The algorithm of resolving modifiers is implemented in
> char_resolve_modifier_mask as below:

> int
> char_resolve_modifier_mask (c)
>      int c;
> {
>   /* A non-ASCII character can't reflect modifier bits to the code.  */
>   if (! ASCII_CHAR_P ((c & ~CHAR_MODIFIER_MASK)))
>     return c;

>   /* For Meta, Shift, and Control modifiers, we need special care.  */
>   if (c & CHAR_SHIFT)
>     {
>       /* Shift modifier is valid only with [A-Za-z].  */
>       if ((c & 0377) >= 'A' && (c & 0377) <= 'Z')
>       c &= ~CHAR_SHIFT;
>       else if ((c & 0377) >= 'a' && (c & 0377) <= 'z')
>       c = (c & ~CHAR_SHIFT) - ('a' - 'A');
>       /* Shift modifier for control characters and SPC is ignored.  */
>       else if ((c & ~CHAR_MODIFIER_MASK) <= 0x20)
>       c &= ~CHAR_SHIFT;
>     }
>   if (c & CHAR_CTL)
>     {
>       /* Simulate the code in lread.c.  */
>       /* Allow `\C- ' and `\C-?'.  */
>       if ((c & 0377) == ' ')
>       c &= ~0177 & ~ CHAR_CTL;
>       else if ((c & 0377) == '?')
>       c = 0177 | (c & ~0177 & ~CHAR_CTL);
>       /* ASCII control chars are made from letters (both cases),
>        as well as the non-letters within 0100...0137.  */
>       else if ((c & 0137) >= 0101 && (c & 0137) <= 0132)
>       c &= (037 | (~0177 & ~CHAR_CTL));
>       else if ((c & 0177) >= 0100 && (c & 0177) <= 0137)
>       c &= (037 | (~0177 & ~CHAR_CTL));
>     }
>   if (c & CHAR_META)
>     {
>       /* Move the meta bit to the right place for a string.  */
>       c = (c & ~CHAR_META) | 0x80;
>     }

>   return c;
> }

> ---
> Kenichi Handa
> address@hidden





reply via email to

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