diff options
| author | Jan Djärv | 2010-11-24 08:50:08 +0100 |
|---|---|---|
| committer | Jan Djärv | 2010-11-24 08:50:08 +0100 |
| commit | 50795d1ff3bb9affaae8247dd39b86e43b4af47c (patch) | |
| tree | 89ad4d4ea8b19a2b70be63e4753047a676b62f61 | |
| parent | 69881db0cbcf68001165a44b2ab2595c23e035e3 (diff) | |
| download | emacs-50795d1ff3bb9affaae8247dd39b86e43b4af47c.tar.gz emacs-50795d1ff3bb9affaae8247dd39b86e43b4af47c.zip | |
Bug 7458: Make key press like Left + right ctrl work when right is not control.
Ditto Alt and Command.
* src/nsterm.m (NSLeftControlKeyMask, NSLeftCommandKeyMask)
(NSLeftAlternateKeyMask): New defines.
(keyDown): Parse left and right keys separatly.
| -rw-r--r-- | src/ChangeLog | 6 | ||||
| -rw-r--r-- | src/nsterm.m | 73 |
2 files changed, 51 insertions, 28 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index c18c84a42cb..4fe2d8864ae 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | 2010-11-24 Jan Djärv <jan.h.d@swipnet.se> | ||
| 2 | |||
| 3 | * nsterm.m (NSLeftControlKeyMask, NSLeftCommandKeyMask) | ||
| 4 | (NSLeftAlternateKeyMask): New defines. | ||
| 5 | (keyDown): Parse left and right keys separatly (Bug#7458). | ||
| 6 | |||
| 1 | 2010-11-23 Eli Zaretskii <eliz@gnu.org> | 7 | 2010-11-23 Eli Zaretskii <eliz@gnu.org> |
| 2 | 8 | ||
| 3 | * intervals.c (temp_set_point_both): Define before calling, to | 9 | * intervals.c (temp_set_point_both): Define before calling, to |
diff --git a/src/nsterm.m b/src/nsterm.m index 06d7354873d..04951bb5068 100644 --- a/src/nsterm.m +++ b/src/nsterm.m | |||
| @@ -233,9 +233,12 @@ static BOOL inNsSelect = 0; | |||
| 233 | 233 | ||
| 234 | /* Convert modifiers in a NeXTSTEP event to emacs style modifiers. */ | 234 | /* Convert modifiers in a NeXTSTEP event to emacs style modifiers. */ |
| 235 | #define NS_FUNCTION_KEY_MASK 0x800000 | 235 | #define NS_FUNCTION_KEY_MASK 0x800000 |
| 236 | #define NSRightAlternateKeyMask (0x000040 | NSAlternateKeyMask) | 236 | #define NSLeftControlKeyMask (0x000001 | NSControlKeyMask) |
| 237 | #define NSRightControlKeyMask (0x002000 | NSControlKeyMask) | 237 | #define NSRightControlKeyMask (0x002000 | NSControlKeyMask) |
| 238 | #define NSLeftCommandKeyMask (0x000008 | NSCommandKeyMask) | ||
| 238 | #define NSRightCommandKeyMask (0x000010 | NSCommandKeyMask) | 239 | #define NSRightCommandKeyMask (0x000010 | NSCommandKeyMask) |
| 240 | #define NSLeftAlternateKeyMask (0x000020 | NSAlternateKeyMask) | ||
| 241 | #define NSRightAlternateKeyMask (0x000040 | NSAlternateKeyMask) | ||
| 239 | #define EV_MODIFIERS(e) \ | 242 | #define EV_MODIFIERS(e) \ |
| 240 | ((([e modifierFlags] & NSHelpKeyMask) ? \ | 243 | ((([e modifierFlags] & NSHelpKeyMask) ? \ |
| 241 | hyper_modifier : 0) \ | 244 | hyper_modifier : 0) \ |
| @@ -4419,7 +4422,7 @@ ns_term_shutdown (int sig) | |||
| 4419 | code = ([[theEvent charactersIgnoringModifiers] length] == 0) ? | 4422 | code = ([[theEvent charactersIgnoringModifiers] length] == 0) ? |
| 4420 | 0 : [[theEvent charactersIgnoringModifiers] characterAtIndex: 0]; | 4423 | 0 : [[theEvent charactersIgnoringModifiers] characterAtIndex: 0]; |
| 4421 | /* (Carbon way: [theEvent keyCode]) */ | 4424 | /* (Carbon way: [theEvent keyCode]) */ |
| 4422 | 4425 | ||
| 4423 | /* is it a "function key"? */ | 4426 | /* is it a "function key"? */ |
| 4424 | fnKeysym = ns_convert_key (code); | 4427 | fnKeysym = ns_convert_key (code); |
| 4425 | if (fnKeysym) | 4428 | if (fnKeysym) |
| @@ -4442,15 +4445,16 @@ ns_term_shutdown (int sig) | |||
| 4442 | if (flags & NSShiftKeyMask) | 4445 | if (flags & NSShiftKeyMask) |
| 4443 | emacs_event->modifiers |= shift_modifier; | 4446 | emacs_event->modifiers |= shift_modifier; |
| 4444 | 4447 | ||
| 4445 | if (flags & NSCommandKeyMask) | 4448 | if ((flags & NSRightCommandKeyMask) == NSRightCommandKeyMask) |
| 4449 | emacs_event->modifiers |= parse_solitary_modifier | ||
| 4450 | (EQ (ns_right_command_modifier, Qleft) | ||
| 4451 | ? ns_command_modifier | ||
| 4452 | : ns_right_command_modifier); | ||
| 4453 | |||
| 4454 | if (flags & NSLeftCommandKeyMask) | ||
| 4446 | { | 4455 | { |
| 4447 | if ((flags & NSRightCommandKeyMask) == NSRightCommandKeyMask | 4456 | emacs_event->modifiers |= parse_solitary_modifier |
| 4448 | && !EQ (ns_right_command_modifier, Qleft)) | 4457 | (ns_command_modifier); |
| 4449 | emacs_event->modifiers |= parse_solitary_modifier | ||
| 4450 | (ns_right_command_modifier); | ||
| 4451 | else | ||
| 4452 | emacs_event->modifiers |= parse_solitary_modifier | ||
| 4453 | (ns_command_modifier); | ||
| 4454 | 4458 | ||
| 4455 | /* if super (default), take input manager's word so things like | 4459 | /* if super (default), take input manager's word so things like |
| 4456 | dvorak / qwerty layout work */ | 4460 | dvorak / qwerty layout work */ |
| @@ -4484,30 +4488,43 @@ ns_term_shutdown (int sig) | |||
| 4484 | } | 4488 | } |
| 4485 | } | 4489 | } |
| 4486 | 4490 | ||
| 4487 | if (flags & NSControlKeyMask) | 4491 | if ((flags & NSRightControlKeyMask) == NSRightControlKeyMask) |
| 4488 | { | 4492 | emacs_event->modifiers |= parse_solitary_modifier |
| 4489 | if ((flags & NSRightControlKeyMask) == NSRightControlKeyMask | 4493 | (EQ (ns_right_control_modifier, Qleft) |
| 4490 | && !EQ (ns_right_control_modifier, Qleft)) | 4494 | ? ns_control_modifier |
| 4491 | emacs_event->modifiers |= parse_solitary_modifier | 4495 | : ns_right_control_modifier); |
| 4492 | (ns_right_control_modifier); | 4496 | |
| 4493 | else | 4497 | if (flags & NSLeftControlKeyMask) |
| 4494 | emacs_event->modifiers |= parse_solitary_modifier | 4498 | emacs_event->modifiers |= parse_solitary_modifier |
| 4495 | (ns_control_modifier); | 4499 | (ns_control_modifier); |
| 4496 | } | ||
| 4497 | 4500 | ||
| 4498 | if (flags & NS_FUNCTION_KEY_MASK && !fnKeysym) | 4501 | if (flags & NS_FUNCTION_KEY_MASK && !fnKeysym) |
| 4499 | emacs_event->modifiers |= | 4502 | emacs_event->modifiers |= |
| 4500 | parse_solitary_modifier (ns_function_modifier); | 4503 | parse_solitary_modifier (ns_function_modifier); |
| 4501 | 4504 | ||
| 4502 | if (!EQ (ns_right_alternate_modifier, Qleft) | 4505 | if ((flags & NSRightAlternateKeyMask) == NSRightAlternateKeyMask) |
| 4503 | && ((flags & NSRightAlternateKeyMask) == NSRightAlternateKeyMask)) | 4506 | { |
| 4504 | { | 4507 | if ((NILP (ns_right_alternate_modifier) |
| 4505 | emacs_event->modifiers |= parse_solitary_modifier | 4508 | || EQ (ns_right_alternate_modifier, Qnone)) |
| 4506 | (ns_right_alternate_modifier); | 4509 | && !fnKeysym) |
| 4507 | } | 4510 | { /* accept pre-interp alt comb */ |
| 4508 | else if (flags & NSAlternateKeyMask) /* default = meta */ | 4511 | if ([[theEvent characters] length] > 0) |
| 4512 | code = [[theEvent characters] characterAtIndex: 0]; | ||
| 4513 | /*HACK: clear lone shift modifier to stop next if from firing */ | ||
| 4514 | if (emacs_event->modifiers == shift_modifier) | ||
| 4515 | emacs_event->modifiers = 0; | ||
| 4516 | } | ||
| 4517 | else | ||
| 4518 | emacs_event->modifiers |= parse_solitary_modifier | ||
| 4519 | (EQ (ns_right_alternate_modifier, Qleft) | ||
| 4520 | ? ns_alternate_modifier | ||
| 4521 | : ns_right_alternate_modifier); | ||
| 4522 | } | ||
| 4523 | |||
| 4524 | if (flags & NSLeftAlternateKeyMask) /* default = meta */ | ||
| 4509 | { | 4525 | { |
| 4510 | if ((NILP (ns_alternate_modifier) || EQ (ns_alternate_modifier, Qnone)) | 4526 | if ((NILP (ns_alternate_modifier) |
| 4527 | || EQ (ns_alternate_modifier, Qnone)) | ||
| 4511 | && !fnKeysym) | 4528 | && !fnKeysym) |
| 4512 | { /* accept pre-interp alt comb */ | 4529 | { /* accept pre-interp alt comb */ |
| 4513 | if ([[theEvent characters] length] > 0) | 4530 | if ([[theEvent characters] length] > 0) |