emacs-devel
[Top][All Lists]
Advanced

[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,





reply via email to

[Prev in Thread] Current Thread [Next in Thread]