[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Mac: modifier key remapping revised [patch]
From: |
David Reitter |
Subject: |
Re: Mac: modifier key remapping revised [patch] |
Date: |
Mon, 2 May 2005 22:25:12 +0100 |
Since Daniel Brockman suggested that I repost this patch in context
format, there we go. It applies to the current version. Steven Tamm
suggested a while ago that the 'fn' key (on Powerbook keyboards left of
the ctrl key) be included, and I think this would be a very neat idea
for someone to do.
Index: macterm.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/macterm.c,v
retrieving revision 1.113
diff -c -r1.113 macterm.c
*** macterm.c 24 Apr 2005 06:06:39 -0000 1.113
--- macterm.c 2 May 2005 20:47:24 -0000
***************
*** 86,101 ****
#include "composite.h"
#include "coding.h"
! /* 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))
#define macShiftKey (shiftKey)
! #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 mac_window_to_frame(wp) (((mac_output *) GetWRefCon
(wp))->mFP)
/* Non-nil means Emacs uses toolkit scroll bars. */
--- 86,115 ----
#include "composite.h"
#include "coding.h"
! /* 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)
#define macShiftKey (shiftKey)
!
! #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)
#define mac_window_to_frame(wp) (((mac_output *) GetWRefCon
(wp))->mFP)
+
/* Non-nil means Emacs uses toolkit scroll bars. */
***************
*** 238,244 ****
/* The keysyms to use for the various modifiers. */
! static Lisp_Object Qalt, Qhyper, Qsuper, Qmodifier_value;
static Lisp_Object Qvendor_specific_keysyms;
--- 252,258 ----
/* The keysyms to use for the various modifiers. */
! static Lisp_Object Qalt, Qhyper, Qsuper, Qctrl, Qmeta,
Qmodifier_value;
static Lisp_Object Qvendor_specific_keysyms;
***************
*** 7113,7125 ****
/* Contains the string "reverse", which is a constant for mouse
button emu.*/
Lisp_Object Qreverse;
! /* True if using command key as meta key. */
Lisp_Object Vmac_command_key_is_meta;
/* Modifier associated with the option key, or nil for normal
behavior. */
Lisp_Object Vmac_option_modifier;
! /* True if the ctrl and meta keys should be reversed. */
Lisp_Object Vmac_reverse_ctrl_meta;
/* True if the option and command modifiers should be used to emulate
--- 7127,7147 ----
/* Contains the string "reverse", which is a constant for mouse
button emu.*/
Lisp_Object Qreverse;
! /* True if using command key as meta key.
! Deprecated; only use if macOldModifierSetting evaluates to true. */
Lisp_Object Vmac_command_key_is_meta;
+ /* Modifier associated with the control key, or nil for normal
behavior. */
+ Lisp_Object Vmac_control_modifier;
+
/* Modifier associated with the option key, or nil for normal
behavior. */
Lisp_Object Vmac_option_modifier;
! /* 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. */
Lisp_Object Vmac_reverse_ctrl_meta;
/* True if the option and command modifiers should be used to emulate
***************
*** 7194,7210 ****
unsigned int result = 0;
if (mods & macShiftKey)
result |= shift_modifier;
! 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))
result |= XUINT(val);
! }
return result;
}
--- 7216,7259 ----
unsigned int result = 0;
if (mods & macShiftKey)
result |= shift_modifier;
!
! 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))
result |= XUINT(val);
! } 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;
! }
! }
return result;
}
***************
*** 9029,9037 ****
}
else
{
! if (er.modifiers & (controlKey |
! (NILP (Vmac_command_key_is_meta) ? optionKey
! : cmdKey)))
{
/* This code comes from Keyboard Resource,
Appendix C of IM - Text. This is necessary
--- 9078,9087 ----
}
else
{
! if (er.modifiers & (controlKey |
! ((macOldModifierSetting &&
! NILP (Vmac_command_key_is_meta)) ?
! optionKey : cmdKey)))
{
/* This code comes from Keyboard Resource,
Appendix C of IM - Text. This is necessary
***************
*** 9048,9072 ****
inev.code = KeyTranslate (kchr_ptr, new_keycode,
&some_state) & 0xff;
}
! else if (!NILP (Vmac_option_modifier)
! && (er.modifiers & optionKey))
{
! /* When using the option key as an emacs modifier,
convert the pressed key code back to one
! without the Mac option modifier applied. */
! int new_modifiers = er.modifiers & ~optionKey;
int new_keycode = keycode | new_modifiers;
Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache);
unsigned long some_state = 0;
inev.code = KeyTranslate (kchr_ptr, new_keycode,
&some_state) & 0xff;
! }
! else
inev.code = er.message & charCodeMask;
inev.kind = ASCII_KEYSTROKE_EVENT;
}
}
!
#if USE_CARBON_EVENTS
inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
#else
--- 9098,9127 ----
inev.code = KeyTranslate (kchr_ptr, new_keycode,
&some_state) & 0xff;
}
! else if (!macOldModifierSetting
! && (er.modifiers & (optionKey | controlKey | cmdKey)
))
{
! /* When using a key as an emacs modifier,
convert the pressed key code back to one
! without the Mac modifier applied.
!
! Could we do something like
! new_modifiers = er.modifiers & shiftKey
! instead?
! */
! int new_modifiers = er.modifiers & ~controlKey & ~optionKey &
~cmdKey;
int new_keycode = keycode | new_modifiers;
Ptr kchr_ptr = (Ptr) GetScriptManagerVariable (smKCHRCache);
unsigned long some_state = 0;
inev.code = KeyTranslate (kchr_ptr, new_keycode,
&some_state) & 0xff;
! } else
inev.code = er.message & charCodeMask;
+
inev.kind = ASCII_KEYSTROKE_EVENT;
}
}
!
#if USE_CARBON_EVENTS
inev.modifiers = mac_event_to_emacs_modifiers (eventRef);
#else
***************
*** 9760,9765 ****
--- 9815,9824 ----
#if TARGET_API_MAC_CARBON
init_required_apple_events ();
+ Qctrl = intern ("ctrl");
+ Fput (Qctrl, Qmodifier_value, make_number (ctrl_modifier));
+ Qmeta = intern ("meta");
+ Fput (Qmeta, Qmodifier_value, make_number (meta_modifier));
#if USE_CARBON_EVENTS
#ifdef MAC_OSX
init_service_handler ();
***************
*** 9810,9815 ****
--- 9869,9877 ----
#ifdef MAC_OSX
Fprovide (intern ("mac-carbon"), Qnil);
#endif
+ /* Deprecated variables to configure modifier key assignment.
+ Retained for backward-compatibility. */
+
staticpro (&Qreverse);
Qreverse = intern ("reverse");
***************
*** 9846,9864 ****
DEFVAR_LISP ("mac-command-key-is-meta", &Vmac_command_key_is_meta,
doc: /* Non-nil means that the command key is used as the Emacs
meta key.
! Otherwise the option key is used. */);
Vmac_command_key_is_meta = Qt;
DEFVAR_LISP ("mac-option-modifier", &Vmac_option_modifier,
doc: /* Modifier to use for the Mac alt/option 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. */);
Vmac_option_modifier = Qnil;
! 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-emulate-three-button-mouse",
&Vmac_emulate_three_button_mouse,
--- 9908,9952 ----
DEFVAR_LISP ("mac-command-key-is-meta", &Vmac_command_key_is_meta,
doc: /* Non-nil means that the command key is used as the Emacs
meta key.
! Otherwise the option key is used. This variable is DEPRECATED.
! It is only in effect if all of the variables mac-*-modifier are nil.
*/);
Vmac_command_key_is_meta = Qt;
+
+ 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;
DEFVAR_LISP ("mac-option-modifier", &Vmac_option_modifier,
doc: /* Modifier to use for the Mac alt/option 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_option_modifier = 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;
DEFVAR_LISP ("mac-emulate-three-button-mouse",
&Vmac_emulate_three_button_mouse,