[Top][All Lists]
[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
- Re: capslock changes control characters?, Richard Stallman, 2008/03/03
- Re: capslock changes control characters?, Kenichi Handa, 2008/03/05
- Re: capslock changes control characters?,
Stefan Monnier <=
- Re: capslock changes control characters?, Andreas Schwab, 2008/03/05
- Re: capslock changes control characters?, Kenichi Handa, 2008/03/06
- Re: capslock changes control characters?, Stefan Monnier, 2008/03/07
- Re: capslock changes control characters?, Kenichi Handa, 2008/03/09
- Re: capslock changes control characters?, Stefan Monnier, 2008/03/09
Re: capslock changes control characters?, Andreas Schwab, 2008/03/16