--- gnus-art.el~ 2010-04-18 23:04:00 +0000 +++ gnus-art.el 2010-04-21 06:07:17 +0000 @@ -7781,15 +7781,17 @@ (push from gnus-button-marker-list) (unless (and (eq (car entry) 'gnus-button-url-regexp) (gnus-article-extend-url-button from start end)) - (gnus-article-add-button start end - 'gnus-button-push from))))))))) + (gnus-article-add-button + start end 'gnus-button-push from + (and (eq (car entry) 'gnus-button-url-regexp) + (buffer-substring start end))))))))))) (defun gnus-article-extend-url-button (beg start end) "Extend url button if url is folded into two or more lines. Return non-nil if button is extended. BEG is a marker that points to the beginning position of a text containing url. START and END are the endpoints of a url button before it is extended. The concatenated -url is put as the `gnus-button-url' overlay property on the button." +url is put as the `gnus-button-url' text property on the button." (let ((opoint (point)) (points (list start end)) url delim regexp) @@ -7829,14 +7831,13 @@ (match-beginning 1)) points))))) (match-beginning 2))) + (setq url (mapconcat 'identity (nreverse url) "")) (let (gnus-article-mouse-face widget-mouse-face) (while points (gnus-article-add-button (pop points) (pop points) - 'gnus-button-push beg))) + 'gnus-button-push beg url))) (let ((overlay (gnus-make-overlay start end))) (gnus-overlay-put overlay 'evaporate t) - (gnus-overlay-put overlay 'gnus-button-url - (list (mapconcat 'identity (nreverse url) ""))) (when gnus-article-mouse-face (gnus-overlay-put overlay 'mouse-face gnus-article-mouse-face))) t) @@ -7874,8 +7875,45 @@ ;;; External functions: -(defun gnus-article-add-button (from to fun &optional data) - "Create a button between FROM and TO with callback FUN and data DATA." +(defvar gnus-article-link-map nil) + +(unless gnus-article-link-map + (let ((map (make-sparse-keymap))) + (setq gnus-article-link-map map) + (cond ((featurep 'xemacs) + (define-key map [(button3)] 'gnus-article-link-menu)) + ;; Don't use [mouse-3], which gets submenus not working in GTK Emacs. + ((featurep 'gtk) + (define-key map [down-mouse-3] 'gnus-article-link-menu) + (define-key map [drag-mouse-3] 'undefined) + (define-key map [mouse-3] 'undefined)) + (t + (define-key map [mouse-3] 'gnus-article-link-menu))))) + +(defun gnus-article-open-link-with-browse-url () + (interactive) + (browse-url (get-text-property (point) 'gnus-button-url))) + +(defun gnus-article-open-link-with-emacs-w3m () + (interactive) + (w3m (get-text-property (point) 'gnus-button-url) t t)) + +(easy-menu-define gnus-article-link-menu gnus-article-link-map + "Link menu." + '("Open this link with" + ["browse-url" gnus-article-open-link-with-browse-url] + ["emacs-w3m" gnus-article-open-link-with-emacs-w3m])) + +(defun gnus-article-link-menu (event) + "Pop up a link menu." + (interactive "e") + (mouse-set-point event) + (popup-menu gnus-article-link-menu)) + +(defun gnus-article-add-button (from to fun &optional data url) + "Create a button between FROM and TO with callback FUN and data DATA. +The optional URL is a string that will be put as the `gnus-button-url' +text property on the button." (when gnus-article-button-face (gnus-overlay-put (gnus-make-overlay from to nil t) 'face gnus-article-button-face)) @@ -7884,7 +7922,9 @@ (nconc (and gnus-article-mouse-face (list gnus-mouse-face-prop gnus-article-mouse-face)) (list 'gnus-callback fun) - (and data (list 'gnus-data data)))) + (and data (list 'gnus-data data)) + (and url (list 'gnus-button-url url + 'keymap gnus-article-link-map)))) (widget-convert-button 'link from to :action 'gnus-widget-press-button :button-keymap gnus-widget-button-keymap)) @@ -7931,13 +7971,14 @@ (inhibit-point-motion-hooks t) (fun (nth 3 entry)) (args (or (and (eq (car entry) 'gnus-button-url-regexp) - (get-char-property marker 'gnus-button-url)) + (get-text-property marker 'gnus-button-url)) (mapcar (lambda (group) (let ((string (match-string group))) (set-text-properties 0 (length string) nil string) string)) (nthcdr 4 entry))))) + (unless (consp args) (setq args (list args))) (cond ((fboundp fun) (apply fun args))