From: David Reitter <david.reitter@gmail.com>
Subject: Mac: modifier key remapping revised [patch]
Date: Mon, 18 Apr 2005 18:02:59 +0100 [thread overview]
Message-ID: <622c88af84f92a1149662bd6ba5bf4e1@gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1695 bytes --]
Hi,
the current state of affairs makes it difficult to map the standard Mac
modifier keys (Ctrl, Option, Command) to Emacs modifiers.
At this point, the default is that the command key is Meta, but by
setting mac-command-key-is-meta to nil, one can map Option to Meta.
An additional variable, mac-reverse-ctrl-meta, allows to swap Ctrl and
(whatever is) Meta.
Finally, a patch introduced in November last year allows us to map
Option to whatever (e.g. Hyper or Meta) via the variable
mac-option-modifier.
This is complicated, and in effect does not allow me to map, for
example Command to Hyper, which makes a lot of sense if you want to
assign something to Command-X, without overriding M-x (or A-x) and
without consequences for the choice of Option.
Therefore I suggest to a) deprecate mac-command-key-is-meta and
mac-reverse-ctrl-meta, and b) introduce mac-control-modifier and
mac-command-modifier which allow, analogous to the recent
mac-option-modifier, free mapping of the modifier keys.
All of a sudden, the modifier key business becomes simple and
straightforward:
(setq mac-option-modifier 'meta)
(setq mac-control-modifier 'ctrl)
(setq mac-command-modifier 'hyper)
In order to preserve backwards-compatibility, the two deprecated
variables remain in effect unless at least one of the above
mac-*-modifier variables is set to non-nil.
Problems should only occur if somebody uses the old mac-option-modifier
in combination with the deprecated variables; but the option variable
has been introduced only recently and hasn't seen significant uptake
yet (google it!).
The attached patch implements this behavior, it applies against today's
catch (of macterm.c).
[-- Attachment #2: mac-modifier-keys.new.patch --]
[-- Type: application/octet-stream, Size: 7917 bytes --]
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;
[-- Attachment #3: Type: text/plain, Size: 142 bytes --]
_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel
next reply other threads:[~2005-04-18 17:02 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-04-18 17:02 David Reitter [this message]
2005-05-02 17:56 ` Mac: modifier key remapping revised [patch] Daniel Brockman
2005-05-02 21:25 ` David Reitter
2005-05-03 4:56 ` Harald Maier
2005-05-03 6:50 ` David Reitter
2005-05-03 17:19 ` Harald Maier
2005-05-03 15:28 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=622c88af84f92a1149662bd6ba5bf4e1@gmail.com \
--to=david.reitter@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.