]> code.delx.au - gnu-emacs/commitdiff
Bug#7150: Distinguishing between left and right Alt keys on NextStep/OSX.
authorJan Djärv <jan.h.d@swipnet.se>
Mon, 11 Oct 2010 19:18:08 +0000 (21:18 +0200)
committerJan Djärv <jan.h.d@swipnet.se>
Mon, 11 Oct 2010 19:18:08 +0000 (21:18 +0200)
* lisp/cus-start.el (all): ns-right-alternate-modifier is new.

* lisp/term/ns-win.el (ns-right-alternate-modifier): New defvar.
(ns-right-option-modifier): New alias for ns-right-alternate-modifier.
(mac-right-option-modifier): New alias for ns-right-option-modifier.

* src/nsterm.m (Qleft): Declare.
(ns_right_alternate_modifier): New variable
(NSRightAlternateKeyMask): New define.
(EV_MODIFIERS): Parse NSRightAlternateKeyMask if
ns_right_alternate_modifier isn't Qleft.
(keyDown): If ns_right_alternate_modifier isn't Qleft, use it
as emacs modifier for NSRightAlternateKeyMask.
(syms_of_nsterm): DEFVAR_LISP ns-right-alternate-modifier.

etc/NEWS
lisp/ChangeLog
lisp/cus-start.el
lisp/term/ns-win.el
src/ChangeLog
src/nsterm.m

index bee89d368b53e7eb96195b1adb50a99d5a48330e..25236d0f3d25bf6531709182fdf9aee9e5ed6cc7 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -21,6 +21,9 @@ with a prefix argument or by typing C-u C-h C-n.
 
 * Changes in Emacs 23.3
 
+** The nextstep port can have different modifiers for the left and right
+alt/option key by customizing the value for ns-right-alternate-modifier.
+
 \f
 * Editing Changes in Emacs 23.3
 
index 867972ed1409339d3cb3802c248e3da575bcb95b..f3275116a9b560aeb8d3cffe0965802a0002c95e 100644 (file)
@@ -1,3 +1,11 @@
+ 2010-10-10  Jan Djärv  <jan.h.d@swipnet.se>
+       * term/ns-win.el (ns-right-alternate-modifier): New defvar.
+       (ns-right-option-modifier): New alias for ns-right-alternate-modifier.
+       (mac-right-option-modifier): New alias for ns-right-option-modifier.
+       * cus-start.el (all): ns-right-alternate-modifier is new.
 2010-10-10  Andreas Schwab  <schwab@linux-m68k.org>
 
        * Makefile.in (ELCFILES): Update.
index 30678a09bb83a5ffc207af0027eef2fd849def72..0f686a434e0df4139c0a7e20dbb479497c4e511c 100644 (file)
@@ -266,6 +266,14 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
                      (const control) (const meta)
                      (const alt) (const hyper)
                      (const super)) "23.1")
+            (ns-right-alternate-modifier
+             ns
+             (choice (const :tag "No modifier (work as alternate/option)" none)
+                     (const :tag "Use the value of ns-alternate-modifier"
+                            left)
+                     (const control) (const meta)
+                     (const alt) (const hyper)
+                     (const super)) "23.3")
             (ns-function-modifier
              ns
              (choice (const :tag "No modifier (work as function)" none)
index a53d0346d94359f75bdfdac3884989797a0b7971..b9177b2b432dc7290d99f2e006bda8841917fba7 100644 (file)
@@ -66,6 +66,7 @@
 ;; nsterm.m
 (defvar ns-version-string)
 (defvar ns-alternate-modifier)
+(defvar ns-right-alternate-modifier)
 
 ;;;; Command line argument handling.
 
@@ -286,6 +287,7 @@ The properties returned may include `top', `left', `height', and `width'."
 (defvaralias 'mac-command-modifier 'ns-command-modifier)
 (defvaralias 'mac-control-modifier 'ns-control-modifier)
 (defvaralias 'mac-option-modifier 'ns-option-modifier)
+(defvaralias 'mac-right-option-modifier 'ns-right-option-modifier)
 (defvaralias 'mac-function-modifier 'ns-function-modifier)
 (declare-function ns-do-applescript "nsfns.m" (script))
 (defalias 'do-applescript 'ns-do-applescript)
@@ -817,6 +819,7 @@ unless the current buffer is a scratch buffer."
 
 ;; You say tomAYto, I say tomAHto..
 (defvaralias 'ns-option-modifier 'ns-alternate-modifier)
+(defvaralias 'ns-right-option-modifier 'ns-right-alternate-modifier)
 
 (defun ns-do-hide-emacs ()
   (interactive)
index d63f417ed42025cd87368e2d62a2910e54f7f9f2..9ce5007d3b3f9a7ed793dd75a98209db01760a8c 100644 (file)
@@ -1,3 +1,14 @@
+2010-10-10  Jan Djärv  <jan.h.d@swipnet.se>
+
+       * nsterm.m (Qleft): Declare.
+       (ns_right_alternate_modifier): New variable
+       (NSRightAlternateKeyMask): New define.
+       (EV_MODIFIERS): Parse NSRightAlternateKeyMask if
+       ns_right_alternate_modifier isn't Qleft.
+       (keyDown): If ns_right_alternate_modifier isn't Qleft, use it
+       as emacs modifier for NSRightAlternateKeyMask.
+       (syms_of_nsterm): DEFVAR_LISP ns-right-alternate-modifier.
+
 2010-10-08  Michael Albinus  <michael.albinus@gmx.de>
 
        * dbusbind.c (xd_get_dispatch_status): Return a Lisp_Object.
index 7c70b2ae69832c727a5bccf840beabbcaf06ec2e..fc933c099e8eb67a88758887e6c257d8a4ea0e9f 100644 (file)
@@ -142,12 +142,17 @@ Lisp_Object ns_input_spi_name, ns_input_spi_arg;
 Lisp_Object Vx_toolkit_scroll_bars;
 static Lisp_Object Qmodifier_value;
 Lisp_Object Qalt, Qcontrol, Qhyper, Qmeta, Qsuper, Qnone;
-extern Lisp_Object Qcursor_color, Qcursor_type, Qns;
+extern Lisp_Object Qcursor_color, Qcursor_type, Qns, Qleft;
 
 /* Specifies which emacs modifier should be generated when NS receives
    the Alternate modifer.  May be Qnone or any of the modifier lisp symbols. */
 Lisp_Object ns_alternate_modifier;
 
+/* Specifies which emacs modifier should be generated when NS receives
+   the right Alternate modifer.  Has same values as ns_alternate_modifier plus
+   the value Qleft which means whatever value ns_alternate_modifier has.  */
+Lisp_Object ns_right_alternate_modifier;
+
 /* Specifies which emacs modifier should be generated when NS receives
    the Command modifer.  May be any of the modifier lisp symbols. */
 Lisp_Object ns_command_modifier;
@@ -218,12 +223,17 @@ static BOOL inNsSelect = 0;
 
 /* Convert modifiers in a NeXTSTEP event to emacs style modifiers.  */
 #define NS_FUNCTION_KEY_MASK 0x800000
+#define NSRightAlternateKeyMask (0x000040 | NSAlternateKeyMask)
 #define EV_MODIFIERS(e)                               \
     ((([e modifierFlags] & NSHelpKeyMask) ?           \
            hyper_modifier : 0)                        \
-     | (([e modifierFlags] & NSAlternateKeyMask) ?    \
+     | (!EQ (ns_right_alternate_modifier, Qleft) && \
+        (([e modifierFlags] & NSRightAlternateKeyMask) \
+         == NSRightAlternateKeyMask) ? \
+           parse_solitary_modifier (ns_right_alternate_modifier) : 0) \
+     | (([e modifierFlags] & NSAlternateKeyMask) ?                 \
            parse_solitary_modifier (ns_alternate_modifier) : 0)   \
-     | (([e modifierFlags] & NSShiftKeyMask) ?        \
+     | (([e modifierFlags] & NSShiftKeyMask) ?     \
            shift_modifier : 0)                        \
      | (([e modifierFlags] & NSControlKeyMask) ?      \
            parse_solitary_modifier (ns_control_modifier) : 0)     \
@@ -4423,7 +4433,13 @@ ns_term_shutdown (int sig)
           emacs_event->modifiers |=
             parse_solitary_modifier (ns_function_modifier);
 
-      if (flags & NSAlternateKeyMask) /* default = meta */
+      if (!EQ (ns_right_alternate_modifier, Qleft)
+          && ((flags & NSRightAlternateKeyMask) == NSRightAlternateKeyMask)) 
+       {
+         emacs_event->modifiers |= parse_solitary_modifier
+            (ns_right_alternate_modifier);
+       }
+      else if (flags & NSAlternateKeyMask) /* default = meta */
         {
           if ((NILP (ns_alternate_modifier) || EQ (ns_alternate_modifier, Qnone))
               && !fnKeysym)
@@ -6185,6 +6201,14 @@ Set to none means that the alternate / option key is not interpreted by Emacs\n\
 at all, allowing it to be used at a lower level for accented character entry.");
   ns_alternate_modifier = Qmeta;
 
+  DEFVAR_LISP ("ns-right-alternate-modifier", &ns_right_alternate_modifier,
+               "This variable describes the behavior of the right alternate or option key.\n\
+Set to control, meta, alt, super, or hyper means it is taken to be that key.\n\
+Set to left means be the same key as `ns-alternate-modifier'.\n\
+Set to none means that the alternate / option key is not interpreted by Emacs\n\
+at all, allowing it to be used at a lower level for accented character entry.");
+  ns_right_alternate_modifier = Qleft;
+
   DEFVAR_LISP ("ns-command-modifier", &ns_command_modifier,
                "This variable describes the behavior of the command key.\n\
 Set to control, meta, alt, super, or hyper means it is taken to be that key.");