;; nsterm.m
(defvar ns-version-string)
(defvar ns-alternate-modifier)
+(defvar ns-right-alternate-modifier)
;;;; Command line argument handling.
(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)
;; 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)
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;
/* 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) \
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)
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.");