Index: macterm.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/macterm.c,v
retrieving revision 1.111
diff -r1.111 macterm.c
89,91c89,99
< /* Set of macros that handle mapping of Mac modifier keys to emacs.  */
< #define macCtrlKey     (NILP (Vmac_reverse_ctrl_meta) ? controlKey :	\
< 			(NILP (Vmac_command_key_is_meta) ? optionKey : cmdKey))
---
> /* Set of macros that handle mapping of Mac modifier keys to emacs.  
>    If any of the newer-style mac_*_modifier variables is set, these macros are basically out of function,
>    they just map to the normal keys - except for Meta, which is then (ESC or) command-control-option.
> */
> 
> #define macOldModifierSetting   (  NILP(Vmac_control_modifier) && NILP(Vmac_option_modifier) && NILP(Vmac_command_modifier)   )
> 
> #define macCtrlKey     (macOldModifierSetting ? \
> 			(NILP(Vmac_reverse_ctrl_meta) ? controlKey :	\
> 			       (NILP(Vmac_command_key_is_meta) ? optionKey : cmdKey)) : \
> 			controlKey)
93,96c101,109
< #define macMetaKey     (NILP (Vmac_reverse_ctrl_meta) ?			\
< 			(NILP (Vmac_command_key_is_meta) ? optionKey : cmdKey) \
< 			: controlKey)
< #define macAltKey      (NILP (Vmac_command_key_is_meta) ? cmdKey : optionKey)
---
> 
> #define macMetaKey     (macOldModifierSetting ? \
> 			(NILP(Vmac_reverse_ctrl_meta) ?		\
> 			 (NILP(Vmac_command_key_is_meta) ? optionKey : cmdKey) : controlKey) : \
> 			(cmdKey | controlKey | optionKey))
> 
> #define macAltKey     (macOldModifierSetting ?  (NILP(Vmac_command_key_is_meta) ? cmdKey : optionKey) : optionKey)
> 
> #define macCmdKey (cmdKey)
98a112
> 
241c255
< static Lisp_Object Qalt, Qhyper, Qsuper, Qmodifier_value;
---
> static Lisp_Object Qalt, Qhyper, Qsuper, Qctrl, Qmeta, Qmodifier_value;
7195c7209,7210
< /* True if using command key as meta key.  */
---
> /* True if using command key as meta key.  
>    Deprecated; only use if macOldModifierSetting evaluates to true. */
7197a7213,7215
> /* Modifier associated with the control key, or nil for normal behavior. */
> Lisp_Object Vmac_control_modifier;
> 
7201c7219,7223
< /* True if the ctrl and meta keys should be reversed.  */
---
> /* Modifier associated with the command key, or nil for normal behavior. */
> Lisp_Object Vmac_command_modifier;
> 
> /* True if the ctrl and meta keys should be reversed. 
> 	Deprecated; only use if macOldModifierSetting evaluates to true. */
7276,7284c7298,7313
<   if (mods & macCtrlKey)
<     result |= ctrl_modifier;
<   if (mods & macMetaKey)
<     result |= meta_modifier;
<   if (NILP (Vmac_command_key_is_meta) && (mods & macAltKey))
<     result |= alt_modifier;
<   if (!NILP (Vmac_option_modifier) && (mods & optionKey)) {
<       Lisp_Object val = Fget(Vmac_option_modifier, Qmodifier_value);
<       if (!NILP(val))
---
> 
>  if (macOldModifierSetting)     /* compatibility with old-style modifier keys */
>     {
>       if (mods & macCtrlKey)
> 	result |= ctrl_modifier;
>       if (mods & macMetaKey)
> 	result |= meta_modifier;
> 
>       if ( NILP (Vmac_command_key_is_meta) && (mods & macAltKey) )
> 	result |= alt_modifier;
>     } else
>     {
>       /* new-style modifier keys */ 
>       if (!NILP (Vmac_option_modifier) && (mods & optionKey)) {
> 	Lisp_Object val = Fget(Vmac_option_modifier, Qmodifier_value);
> 	if (!NILP(val))
7286c7315,7335
<   }
---
>       } else { /* default behavior if modifier variable is not set */
> 	if (mods & macAltKey)
> 	  result |= alt_modifier;
>       }
>       if (!NILP (Vmac_command_modifier) && (mods & cmdKey)) {
> 	Lisp_Object val = Fget(Vmac_command_modifier, Qmodifier_value);
> 	if (!NILP(val))
>           result |= XUINT(val);
>       } else { /* default behavior if modifier variable is not set: assign hyper*/
> 	if (mods & macCmdKey)
> 	  result |= hyper_modifier;
>       }
>       if (!NILP (Vmac_control_modifier) && (mods & controlKey)) {
> 	Lisp_Object val = Fget(Vmac_control_modifier, Qmodifier_value);
> 	if (!NILP(val))
>           result |= XUINT(val);
>       } else { /* default behavior if modifier variable is not set */
> 	if (mods & macCtrlKey)
> 	  result |= ctrl_modifier;
>       }
>     }
9059,9061c9108,9110
< 		if (er.modifiers & (controlKey |
< 				    (NILP (Vmac_command_key_is_meta) ? optionKey
< 				     : cmdKey)))
---
> 		if  (er.modifiers & (controlKey |
> 		      ((macOldModifierSetting && NILP (Vmac_command_key_is_meta)) ? 
>                                          optionKey : cmdKey)))
9078,9079c9127,9128
< 		else if (!NILP (Vmac_option_modifier)
< 			 && (er.modifiers & optionKey))
---
> 		else if (!macOldModifierSetting
> 			 && (er.modifiers & (optionKey | controlKey | cmdKey)  ))
9081c9130
< 		    /* When using the option key as an emacs modifier,
---
> 		    /* When using a key as an emacs modifier,
9083,9084c9132,9138
< 		       without the Mac option modifier applied. */
< 		    int new_modifiers = er.modifiers & ~optionKey;
---
> 		       without the Mac  modifier applied. 
> 
> 		       Could we do something like 
> 		       new_modifiers = er.modifiers & shiftKey 
> 		       instead?
> 		    */
> 		    int new_modifiers = er.modifiers & ~controlKey & ~optionKey & ~cmdKey;
9090,9092c9144,9146
< 		  }
< 		else
< 		  inev.code = er.message & charCodeMask;
---
> 		  } else
> 		     inev.code = er.message & charCodeMask;
> 
9096c9150
< 
---
> 	  
9789a9844,9847
>   Qctrl = intern ("ctrl");
>   Fput (Qctrl, Qmodifier_value, make_number (ctrl_modifier));
>   Qmeta = intern ("meta");
>   Fput (Qmeta, Qmodifier_value, make_number (meta_modifier)); 
9839a9898,9900
> /* Deprecated variables to configure modifier key assignment.
> 	Retained for backward-compatibility. */
> 	
9842c9903,9904
< Otherwise the option key is used.  */);
---
> Otherwise the option key is used. This variable is DEPRECATED. 
> It is only in effect if all of the variables mac-*-modifier are nil. */);
9843a9906,9923
>   
>   DEFVAR_LISP ("mac-reverse-ctrl-meta", &Vmac_reverse_ctrl_meta,
>     doc: /* Non-nil means that the control and meta keys are reversed.  This is
> useful for non-standard keyboard layouts. This variable is DEPRECATED. 
> It is only in effect if none of the variables mac-*-modifier is non-nil. */);
>   Vmac_reverse_ctrl_meta = Qnil;
> 
> 
> /* Variables to configure modifier key assignment.  */
> 	
>   DEFVAR_LISP ("mac-control-modifier", &Vmac_control_modifier,
>     doc: /* Modifier to use for the Mac control key.  The value can
> be alt, hyper, or super for the respective modifier.  If the value is
> nil then the key will act as the normal Mac control modifier.  However, if all
> values of mac-{command|control|option}-modifier are nil, the deprecated
> default assignment determined by mac-command-key-is-meta and
> mac-reverse-ctrl-meta is used. */);
>   Vmac_control_modifier = Qnil;
9848c9928,9931
< nil then the key will act as the normal Mac option modifier.  */);
---
> nil then the key will act as the normal Mac option modifier. However, if all
> values of mac-{command|control|option}-modifier are nil, the deprecated
> default assignment determined by mac-command-key-is-meta and
> mac-reverse-ctrl-meta is used.  */);
9851,9854c9934,9941
<   DEFVAR_LISP ("mac-reverse-ctrl-meta", &Vmac_reverse_ctrl_meta,
<     doc: /* Non-nil means that the control and meta keys are reversed.  This is
< useful for non-standard keyboard layouts.  */);
<   Vmac_reverse_ctrl_meta = Qnil;
---
>   DEFVAR_LISP ("mac-command-modifier", &Vmac_command_modifier,
>     doc: /* Modifier to use for the Mac command key.  The value can
> be alt, hyper, or super for the respective modifier. If the value is
> nil then the key will act as the normal Mac option modifier. However, if all
> values of mac-{command|control|option}-modifier are nil, the deprecated
> default assignment determined by mac-command-key-is-meta and
> mac-reverse-ctrl-meta is used.  */);
>   Vmac_command_modifier = Qnil;
