GNU bug report logs - #8680
Cocoa Emacs not mapping Clear key on aluminum keyboards.

Previous Next

Packages: emacs, ns;

Reported by: Michael Marchionna <tralfaz <at> pacbell.net>

Date: Tue, 17 May 2011 06:37:01 UTC

Severity: important

Tags: patch

Found in version 24.3

Fixed in version 24.4

Done: Chong Yidong <cyd <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


Message #20 received at 8680 <at> debbugs.gnu.org (full text, mbox):

From: Michael Marchionna <tralfaz <at> pacbell.net>
To: Adrian Robert <adrian.b.robert <at> gmail.com>
Cc: 8680 <at> debbugs.gnu.org, Stefan Monnier <monnier <at> iro.umontreal.ca>
Subject: Re: bug#8680: emacs 24.0 OS X keypad patch
Date: Thu, 7 Jul 2011 07:55:32 -0700
The reason for split between non-keypad keys and keypad keys, was that the code generated by the following code produced coincident values that produced non-unique results.

      code = ([[theEvent charactersIgnoringModifiers] length] == 0) ?
        0 : [[theEvent charactersIgnoringModifiers] characterAtIndex: 0];

Using the first character of key event would not distinguish a "=" on the main keyboard from a "=" on the keypad.  Using the [theEvent keyCode] in the older ns_convert_key function would mean verifying and possibly altering all the translation values in the older table.

It may be the case that this change does not properly toggle between numeric keypad, and movement keypad, but on newer mac keyboards the num-lock key is actually a "Clear" key, and Num-Lock behavior is synthesized.  Not sure what the best solution for making the "Clear" key behave like a physical Num-Lock key is, but this change does allow key event from the keypad to at least be mapped to something.

Michael Marchionna


On Jul 6, 2011, at 8:04 PM, Adrian Robert wrote:

> The code looks reasonable, but could the author explain why [theEvent keyCode] needs to be used in the keypad conversion instead of code?  The code would be more understandable if ns_convert_kaypad() and ns_convert_key() used the same argument.  Also this patch should be tested for correct behavior wrt this issue:
> 
> http://www.cocoabuilder.com/archive/cocoa/73306-workaround-for-broken-numlock-support.html#73306
> 
> 
> thanks,
> Adrian
> 
> 
> On 2011/07/04, at 13:42, Stefan Monnier wrote:
> 
>> reassign 8680 emacs,ns
>> tags 8680 +patch
>> thanks
>> 
>> Could someone familiar with the MacOSX code take a look at this
>> bug report?
>> 
>> 
>>       Stefan
>> 
>> 
>>>>>>> "Michael" == Michael Marchionna <tralfaz <at> pacbell.net> writes:
>> 
>>> Adding keypad keycodes to the existing translation table leads to some keys
>>> being wrongly interpreted as keypad keys.  To avoid that, this patch
>>> uses a separate translation table exclusively for keys that
>>> generate a NSNumericPadKeyMask.
>> 
>> 
>>> diff --git a/src/nsterm.m b/src/nsterm.m
>>> index 91f0cbb..d537ee3 100644
>>> --- a/src/nsterm.m
>>> +++ b/src/nsterm.m
>>> @@ -87,6 +87,7 @@ static unsigned convert_ns_to_X_keysym[] =
>>>  NSBeginFunctionKey,           0x58,
>>>  NSSelectFunctionKey,          0x60,
>>>  NSPrintFunctionKey,           0x61,
>>> +  NSClearLineFunctionKey,       0x0B,
>>>  NSExecuteFunctionKey,         0x62,
>>>  NSInsertFunctionKey,          0x63,
>>>  NSUndoFunctionKey,            0x65,
>>> @@ -134,6 +135,35 @@ static unsigned convert_ns_to_X_keysym[] =
>>>  0x1B,				0x1B   /* escape */
>>> };
>> 
>>> +static unsigned convert_nskeypad_to_X_keysym[] =
>>> +{
>>> +  /* Arrow keys are both function and keypad keys */
>>> +  NSLeftArrowFunctionKey,       0x51,
>>> +  NSUpArrowFunctionKey,         0x52,
>>> +  NSRightArrowFunctionKey,      0x53,
>>> +  NSDownArrowFunctionKey,       0x54,
>>> +
>>> +  0x41,                         0xAE,  /* KP_Decimal */
>>> +  0x43,                         0xAA,  /* KP_Multiply */
>>> +  0x45,                         0xAB,  /* KP_Add */
>>> +  0x4B,                         0xAF,  /* KP_Divide */
>>> +  0x4E,                         0xAD,  /* KP_Subtract */
>>> +  0x51,                         0xBD,  /* KP_Equal */
>>> +  0x52,                         0xB0,  /* KP_0 */
>>> +  0x53,                         0xB1,  /* KP_1 */
>>> +  0x54,                         0xB2,  /* KP_2 */
>>> +  0x55,                         0xB3,  /* KP_3 */
>>> +  0x56,                         0xB4,  /* KP_4 */
>>> +  0x57,                         0xB5,  /* KP_5 */
>>> +  0x58,                         0xB6,  /* KP_6 */
>>> +  0x59,                         0xB7,  /* KP_7 */
>>> +  0x5B,                         0xB8,  /* KP_8 */
>>> +  0x5C,                         0xB9,  /* KP_9 */
>>> +
>>> +  // The enter key is on the keypad but modifier isnt set
>>> +  NSEnterCharacter,		0x8D
>>> +};
>>> +
>> 
>>> static Lisp_Object Qmodifier_value;
>>> Lisp_Object Qalt, Qcontrol, Qhyper, Qmeta, Qsuper, Qnone;
>>> @@ -1924,13 +1954,33 @@ ns_convert_key (unsigned code)
>>>  unsigned keysym;
>>>  /* An array would be faster, but less easy to read. */
>>>  for (keysym = 0; keysym < last_keysym; keysym += 2)
>>> -    if (code == convert_ns_to_X_keysym[keysym])
>>> -      return 0xFF00 | convert_ns_to_X_keysym[keysym+1];
>>> +      
>>> +      if (code == convert_ns_to_X_keysym[keysym]) {
>>> +        return 0xFF00 | convert_ns_to_X_keysym[keysym+1];
>>> +      }
>>>  return 0;
>>> /* if decide to use keyCode and Carbon table, use this line:
>>>     return code > 0xff ? 0 : 0xFF00 | ns_keycode_to_xkeysym_table[code]; */
>>> }
>> 
>>> +static unsigned
>>> +ns_convert_keypad (unsigned code)
>>> +/* --------------------------------------------------------------------------
>>> +    Internal call used by NSView-keyDown.
>>> +   -------------------------------------------------------------------------- */
>>> +{
>>> +  const unsigned last_keysym = (sizeof (convert_nskeypad_to_X_keysym)
>>> +                                / sizeof (convert_nskeypad_to_X_keysym[0]));
>>> +  unsigned keysym;
>>> +  /* An array would be faster, but less easy to read. */
>>> +  for (keysym = 0; keysym < last_keysym; keysym += 2) {
>>> +      if (code == convert_nskeypad_to_X_keysym[keysym]) {
>>> +        return 0xFF00 | convert_nskeypad_to_X_keysym[keysym+1];
>>> +      }
>>> +  }
>>> +  return 0;
>>> +}
>>> +
>> 
>>> char *
>>> x_get_keysym_name (int keysym)
>>> @@ -4503,10 +4553,10 @@ ns_term_shutdown (int sig)
>>>  Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (emacsframe);
>>>  int code;
>>>  unsigned fnKeysym = 0;
>>> -  int flags;
>>>  static NSMutableArray *nsEvArray;
>>>  static BOOL firstTime = YES;
>>>  int left_is_none;
>>> +  unsigned int flags = [theEvent modifierFlags];
>> 
>>>  NSTRACE (keyDown);
>> 
>>> @@ -4550,9 +4600,13 @@ ns_term_shutdown (int sig)
>>>      code = ([[theEvent charactersIgnoringModifiers] length] == 0) ?
>>>        0 : [[theEvent charactersIgnoringModifiers] characterAtIndex: 0];
>>>      /* (Carbon way: [theEvent keyCode]) */
>>> +      
>> 
>>>      /* is it a "function key"? */
>>> -      fnKeysym = ns_convert_key (code);
>>> +      if (code < 0x00ff && (flags & NSNumericPadKeyMask) )
>>> +	fnKeysym = ns_convert_keypad([theEvent keyCode]);
>>> +      else
>>> +	fnKeysym = ns_convert_key(code);
>>>      if (fnKeysym)
>>>        {
>>>          /* COUNTERHACK: map 'Delete' on upper-right main KB to 'Backspace',
>>> @@ -4565,7 +4619,6 @@ ns_term_shutdown (int sig)
>> 
>>>      /* are there modifiers? */
>> emacs_event-> modifiers = 0;
>>> -      flags = [theEvent modifierFlags];
>> 
>>>      if (flags & NSHelpKeyMask)
>> emacs_event-> modifiers |= hyper_modifier;
> 





This bug report was last modified 11 years and 160 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.