emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: artist-mouse-choose-operation


From: Tomas Abrahamsson
Subject: Re: artist-mouse-choose-operation
Date: Mon, 09 Nov 2009 23:22:11 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1 (usg-unix-v)

Eli Zaretskii <address@hidden> writes:

> The function in the Subject calls x-popup-menu, evidently under the
> assumption that if Emacs can use a mouse, it also supports menus.  But
> that assumption is false: Emacs configured --without-x can have mouse
> support, e.g. via gpm-mouse, but does not have x-popup-menu.

Yes, I agree this is a bug. Below is a patch for fixing the bug and a
proposal for a ChangeLog entry.

        * textmodes/artist.el (artist-mouse-choose-operation) call
        `tmm-prompt' instead of `x-popup-menu' if we cannot popup
        menus. Bug noticed by Eli Zaretskii <address@hidden>.

        * textmodes/artist.el (artist-mouse-choose-operation)
        (artist-down-mouse-1): call (new) function
        `artist-compute-up-event-key'.

The patch is against the latest from the git/cvs repository as of
yesterday (Sunday).  The patch is made by me.

BRs
Tomas



diff --git a/lisp/textmodes/artist.el b/lisp/textmodes/artist.el
index c69e3bc..03cb77b 100644
--- a/lisp/textmodes/artist.el
+++ b/lisp/textmodes/artist.el
@@ -4750,6 +4750,15 @@ If optional argument STATE is positive, turn borders on."
   "Function that does nothing."
   (interactive))
 
+(defun artist-compute-up-event-key (ev)
+  "Compute the corresponding up key sequence for event EV."
+ (let* ((basic (event-basic-type ev))
+       (unshifted basic)
+       (shifted (make-symbol (concat "S-" (symbol-name basic)))))
+   (if (artist-event-is-shifted ev)
+       (make-vector 1 shifted)
+     (make-vector 1 unshifted))))
+
 (defun artist-down-mouse-1 (ev)
   "Perform drawing action for event EV."
   (interactive "@e")
@@ -4761,15 +4770,10 @@ If optional argument STATE is positive, turn borders 
on."
         (orig-draw-region-min-y artist-draw-region-min-y)
         (orig-draw-region-max-y artist-draw-region-max-y)
         (orig-pointer-shape (if (eq window-system 'x) x-pointer-shape nil))
-        (echo-keystrokes 10000)        ; a lot of seconds
+        (echoq-keystrokes 10000)       ; a lot of seconds
         ;; Remember original binding for the button-up event to this
         ;; button-down event.
-        (key (let* ((basic (event-basic-type ev))
-                    (unshifted basic)
-                    (shifted (make-symbol (concat "S-" (symbol-name basic)))))
-               (if (artist-event-is-shifted ev)
-                   (make-vector 1 shifted)
-                 (make-vector 1 unshifted))))
+        (key (artist-compute-up-event-key ev))
         (orig-button-up-binding (lookup-key (current-global-map) key)))
 
     (unwind-protect
@@ -4835,7 +4839,21 @@ If optional argument STATE is positive, turn borders on."
    (progn
      (select-window (posn-window (event-start last-input-event)))
      (list last-input-event
-           (x-popup-menu last-nonmenu-event artist-popup-menu-table))))
+          (if (display-popup-menus-p)
+              (x-popup-menu last-nonmenu-event artist-popup-menu-table)
+            'no-popup-menus))))
+
+  (if (eq op 'no-popup-menus)
+      ;; No popup menus. Call `tmm-prompt' instead, but with the
+      ;; up-mouse-button, if any, temporarily disabled, otherwise
+      ;; it'll interfere.
+      (let* ((key (artist-compute-up-event-key ev))
+            (orig-button-up-binding (lookup-key (current-global-map) key)))
+       (unwind-protect
+           (define-key (current-global-map) key 'artist-do-nothing)
+           (setq op (tmm-prompt artist-popup-menu-table))
+         (if orig-button-up-binding
+             (define-key (current-global-map) key orig-button-up-binding)))))
 
   (let ((draw-fn (artist-go-get-draw-fn-from-symbol (car op)))
        (set-fn (artist-fc-get-fn-from-symbol (car op))))




reply via email to

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