]> code.delx.au - gnu-emacs/commitdiff
Re-implement popup menu for flymake
authorLeo Liu <sdl.web@gmail.com>
Sun, 8 Dec 2013 07:18:46 +0000 (15:18 +0800)
committerLeo Liu <sdl.web@gmail.com>
Sun, 8 Dec 2013 07:18:46 +0000 (15:18 +0800)
* progmodes/flymake.el (flymake-popup-current-error-menu): Rename
from flymake-display-err-menu-for-current-line. Reimplement.
(flymake-posn-at-point-as-event, flymake-popup-menu)
(flymake-make-emacs-menu): Remove.

Fixes: debbugs:16077
lisp/ChangeLog
lisp/progmodes/flymake.el

index 1e384f255790c6a09e8efc12cf33ff9a1d5b21b8..1b4606a0d2793220ca3fd4642f746242fb7ff0c3 100644 (file)
@@ -1,3 +1,10 @@
+2013-12-08  Leo Liu  <sdl.web@gmail.com>
+
+       * progmodes/flymake.el (flymake-popup-current-error-menu): Rename
+       from flymake-display-err-menu-for-current-line. Reimplement.
+       (flymake-posn-at-point-as-event, flymake-popup-menu)
+       (flymake-make-emacs-menu): Remove.  (Bug#16077)
+
 2013-12-08  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * emulation/cua-rect.el (cua--rectangle-region-extract): New function.
index 48ff486a9e54f1770748cc86e37e6891b6785868..b5e33ff2574db7dea8b22a46fad8af26946c752a 100644 (file)
@@ -192,55 +192,6 @@ NAME is the file name function to use, default `flymake-get-real-file-name'."
 (defvar-local flymake-new-err-info nil
   "Same as `flymake-err-info', effective when a syntax check is in progress.")
 
-(defun flymake-posn-at-point-as-event (&optional position window dx dy)
-  "Return pixel position of top left corner of glyph at POSITION.
-
-The position is relative to top left corner of WINDOW, as a
-mouse-1 click event (identical to the event that would be
-triggered by clicking mouse button 1 at the top left corner of
-the glyph).
-
-POSITION and WINDOW default to the position of point in the
-selected window.
-
-DX and DY specify optional offsets from the top left of the glyph."
-  (let* ((window (or window (selected-window)))
-        (position (or position (window-point window)))
-        (dx (or dx 0))
-        (dy (or dy 0))
-        (pos (posn-at-point position window))
-         (x-y (posn-x-y pos))
-         (edges (window-inside-pixel-edges window))
-         (win-x-y (window-pixel-edges window)))
-    ;; adjust for window edges
-    (setcar (nthcdr 2 pos)
-            (cons (+ (car x-y) (car  edges) (- (car win-x-y))  dx)
-                  (+ (cdr x-y) (cadr edges) (- (cadr win-x-y)) dy)))
-    (list 'mouse-1 pos)))
-
-;;; XXX: get rid of the following two functions
-
-(defun flymake-popup-menu (menu-data)
-  "Pop up the flymake menu at point, using the data MENU-DATA.
-POS is a list of the form ((X Y) WINDOW), where X and Y are
-pixels positions from the top left corner of WINDOW's frame.
-MENU-DATA is a list of error and warning messages returned by
-`flymake-make-err-menu-data'."
-  (x-popup-menu (flymake-posn-at-point-as-event)
-               (flymake-make-emacs-menu menu-data)))
-
-(defun flymake-make-emacs-menu (menu-data)
-  "Return a menu specifier using MENU-DATA.
-MENU-DATA is a list of error and warning messages returned by
-`flymake-make-err-menu-data'.
-See `x-popup-menu' for the menu specifier format."
-  (let* ((menu-title     (nth 0 menu-data))
-        (menu-items     (nth 1 menu-data))
-        (menu-commands  (mapcar (lambda (foo)
-                                   (cons (nth 0 foo) (nth 1 foo)))
-                                 menu-items)))
-    (list menu-title (cons "" menu-commands))))
-
 (defun flymake-log (level text &rest args)
   "Log a message at level LEVEL.
 If LEVEL is higher than `flymake-log-level', the message is
@@ -1223,45 +1174,36 @@ For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'."
        (flymake-log 3 "starting syntax check as more than 1 second passed since last change")
        (flymake-start-syntax-check)))))
 
-(defun flymake-display-err-menu-for-current-line ()
-  "Display a menu with errors/warnings for current line if it has errors and/or warnings."
-  (interactive)
-  (let* ((line-no             (line-number-at-pos))
-        (line-err-info-list  (nth 0 (flymake-find-err-info flymake-err-info line-no)))
-        (menu-data           (flymake-make-err-menu-data line-no line-err-info-list))
-        (choice              nil))
-    (if menu-data
-       (progn
-         (setq choice (flymake-popup-menu menu-data))
-         (flymake-log 3 "choice=%s" choice)
-         (when choice
-           (eval choice)))
-      (flymake-log 1 "no errors for line %d" line-no))))
-
-(defun flymake-make-err-menu-data (line-no line-err-info-list)
-  "Make a (menu-title (item-title item-action)*) list with errors/warnings from LINE-ERR-INFO-LIST."
-  (let* ((menu-items  nil))
-    (when line-err-info-list
-      (let* ((count           (length line-err-info-list))
-            (menu-item-text  nil))
-       (while (> count 0)
-         (setq menu-item-text (flymake-ler-text (nth (1- count) line-err-info-list)))
-         (let* ((file       (flymake-ler-file (nth (1- count) line-err-info-list)))
-                (full-file  (flymake-ler-full-file (nth (1- count) line-err-info-list)))
-                (line       (flymake-ler-line (nth (1- count) line-err-info-list))))
-           (if file
-               (setq menu-item-text (concat menu-item-text " - " file "(" (format "%d" line) ")")))
-           (setq menu-items (cons (list menu-item-text
-                                        (if file (list 'flymake-goto-file-and-line full-file line) nil))
-                                  menu-items)))
-         (setq count (1- count)))
-       (flymake-log 3 "created menu-items with %d item(s)" (length menu-items))))
-    (if menu-items
-       (let* ((menu-title  (format "Line %d: %d error(s), %d warning(s)" line-no
-                                   (flymake-get-line-err-count line-err-info-list "e")
-                                   (flymake-get-line-err-count line-err-info-list "w"))))
-         (list menu-title menu-items))
-      nil)))
+(define-obsolete-function-alias 'flymake-display-err-menu-for-current-line
+  'flymake-popup-current-error-menu "24.4")
+
+(defun flymake-popup-current-error-menu (&optional event)
+  "Pop up a menu with errors/warnings for current line."
+  (interactive (list last-nonmenu-event))
+  (let* ((line-no (line-number-at-pos))
+         (errors (or (car (flymake-find-err-info flymake-err-info line-no))
+                     (user-error "No errors for current line")))
+         (menu (mapcar (lambda (x)
+                         (if (flymake-ler-file x)
+                             (cons (format "%s - %s(%d)"
+                                           (flymake-ler-text x)
+                                           (flymake-ler-file x)
+                                           (flymake-ler-line x))
+                                   x)
+                           (list (flymake-ler-text x))))
+                       errors))
+         (event (if (mouse-event-p event)
+                    event
+                  (list 'mouse-1 (posn-at-point))))
+         (title (format "Line %d: %d error(s), %d warning(s)"
+                        line-no
+                        (flymake-get-line-err-count errors "e")
+                        (flymake-get-line-err-count errors "w")))
+         (choice (x-popup-menu event (list title (cons "" menu)))))
+    (flymake-log 3 "choice=%s" choice)
+    (when choice
+      (flymake-goto-file-and-line (flymake-ler-full-file choice)
+                                  (flymake-ler-line choice)))))
 
 (defun flymake-goto-file-and-line (file line)
   "Try to get buffer for FILE and goto line LINE in it."