]> git.eshelyaron.com Git - emacs.git/commitdiff
Use C-mouse-1 for context menu on NS
authorMattias Engdegård <mattiase@acm.org>
Fri, 20 Aug 2021 10:03:20 +0000 (12:03 +0200)
committerMattias Engdegård <mattiase@acm.org>
Fri, 20 Aug 2021 10:34:34 +0000 (12:34 +0200)
The Mac platform convention is to use control-left-click for context
menus (as a synonym to right-click).

* lisp/mouse.el (context-menu--old-bindings): Remove.
(context-menu--saved-bindings)
(context-menu--bind-mouse, context-menu--reset-bindings): New.
(context-menu-mode): Use new functions, with C-mouse-1 as extra
binding on NS.

lisp/mouse.el

index d2a5200d8de3d437797ed3b517c5d7ff5b26e883..4dcc2f28f4a6d37d0a16da1f3fc345e243365475 100644 (file)
@@ -440,8 +440,28 @@ the same menu with changes such as added new menu items."
   `(menu-item ,(purecopy "Context Menu") ignore
               :filter (lambda (_) (context-menu-map))))
 
-(defvar context-menu--old-down-mouse-3 nil)
-(defvar context-menu--old-mouse-3 nil)
+(defvar context-menu--saved-bindings nil
+  "Alist of bindings to restore when `context-menu-mode' is disabled.")
+
+(defun context-menu--bind-mouse (click-sym down-sym)
+  "Enable `context-menu-mode' mouse bindings.
+CLICK-SYM and DOWN-SYM are the mouse click and down key symbols to use."
+  (let ((click (vector click-sym))
+        (down (vector down-sym)))
+    (push (cons click-sym (global-key-binding click))
+          context-menu--saved-bindings)
+    (global-unset-key click)
+    (push (cons down-sym (global-key-binding down))
+          context-menu--saved-bindings)
+    (global-set-key down context-menu-entry)))
+
+(defun context-menu--reset-bindings ()
+  "Restore saved `context-menu-mode' bindings."
+  (pcase-dolist (`(sym . binding) context-menu--saved-bindings)
+    (let ((key (vector sym)))
+      (if binding
+          (global-set-key key binding)
+        (global-unset-key key)))))
 
 (define-minor-mode context-menu-mode
   "Toggle Context Menu mode.
@@ -449,20 +469,13 @@ the same menu with changes such as added new menu items."
 When Context Menu mode is enabled, clicking the mouse button down-mouse-3
 activates the menu whose contents depends on its surrounding context."
   :global t :group 'mouse
-  (cond
-   (context-menu-mode
-    (setq context-menu--old-mouse-3 (global-key-binding [mouse-3]))
-    (global-unset-key [mouse-3])
-    (setq context-menu--old-down-mouse-3 (global-key-binding [down-mouse-3]))
-    (global-set-key [down-mouse-3] context-menu-entry))
-   (t
-    (if (not context-menu--old-down-mouse-3)
-        (global-unset-key [down-mouse-3])
-      (global-set-key [down-mouse-3] context-menu--old-down-mouse-3)
-      (setq context-menu--old-down-mouse-3 nil))
-    (when context-menu--old-mouse-3
-      (global-set-key [mouse-3] context-menu--old-mouse-3)
-      (setq context-menu--old-mouse-3 nil)))))
+  (if context-menu-mode
+      (progn
+        (setq context-menu--saved-bindings nil)
+        (context-menu--bind-mouse 'mouse-3 'down-mouse-3)
+        (when (featurep 'ns)
+          (context-menu--bind-mouse 'C-mouse-1 'C-down-mouse-1)))
+    (context-menu--restore-bindings)))
 
 \f
 ;; Commands that operate on windows.