292
292
(mouse-scroll-subr start-window
293
293
(1+ (- mouse-row bottom)))))))))))
294
294
(when (consp event)
295
(let ((fun (key-binding (vector (car event)))))
295
(let (;; (fun (key-binding (vector (car event))))
296
297
;; Run the binding of the terminating up-event, if possible.
297
;; In the case of a multiple click, it gives the wrong results,
298
;; In the case of a multiple click, it gives the wrong results,
298
299
;; because it would fail to set up a region.
300
;; (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun))
301
;; In this case, we can just let the up-event execute normally.
301
;; (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun))
302
;; In this case, we can just let the up-event execute normally.
302
303
(let ((end (event-end event)))
303
304
;; Set the position in the event before we replay it,
304
305
;; because otherwise it may have a position in the wrong
306
307
(setcar (cdr end) end-of-range)
307
308
;; Delete the overlay before calling the function,
308
;; because delete-overlay increases buffer-modified-tick.
309
;; because delete-overlay increases buffer-modified-tick.
309
310
(push event unread-command-events))))))))
312
(defvar scroll-in-place)
311
314
(defun gnus-pick-next-page ()
312
315
"Go to the next page. If at the end of the buffer, start reading articles."
356
359
(when (gnus-visual-p 'binary-menu 'menu)
357
360
(gnus-binary-make-menu-bar)))))
359
(defun gnus-binary-display-article (article &optional all-header)
362
(defun gnus-binary-display-article (article &optional _all-header)
360
363
"Run ARTICLE through the binary decode functions."
361
364
(when (gnus-summary-goto-subject article)
362
365
(let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
442
452
(defvar gnus-tree-displayed-thread nil)
443
453
(defvar gnus-tree-inhibit nil)
445
(defvar gnus-tree-mode-map nil)
455
(defvar gnus-tree-mode-map
456
(let ((map (make-keymap)))
457
(suppress-keymap map)
460
"\r" gnus-tree-select-article
461
gnus-mouse-2 gnus-tree-pick-article
462
"\C-?" gnus-tree-read-summary-keys
463
"h" gnus-tree-show-summary
465
"\C-c\C-i" gnus-info-find-node)
467
(substitute-key-definition
468
'undefined 'gnus-tree-read-summary-keys map)
446
471
(put 'gnus-tree-mode 'mode-class 'special)
448
(unless gnus-tree-mode-map
449
(setq gnus-tree-mode-map (make-keymap))
450
(suppress-keymap gnus-tree-mode-map)
453
"\r" gnus-tree-select-article
454
gnus-mouse-2 gnus-tree-pick-article
455
"\C-?" gnus-tree-read-summary-keys
456
"h" gnus-tree-show-summary
458
"\C-c\C-i" gnus-info-find-node)
460
(substitute-key-definition
461
'undefined 'gnus-tree-read-summary-keys gnus-tree-mode-map))
463
473
(defun gnus-tree-make-menu-bar ()
464
474
(unless (boundp 'gnus-tree-menu)
465
475
(easy-menu-define
468
478
["Select article" gnus-tree-select-article t]))))
470
(defun gnus-tree-mode ()
480
(define-derived-mode gnus-tree-mode fundamental-mode "Tree"
471
481
"Major mode for displaying thread trees."
473
482
(gnus-set-format 'tree-mode)
474
483
(gnus-set-format 'tree t)
475
484
(when (gnus-visual-p 'tree-menu 'menu)
476
485
(gnus-tree-make-menu-bar))
477
(kill-all-local-variables)
478
486
(gnus-simplify-mode-line)
479
(setq mode-name "Tree")
480
(setq major-mode 'gnus-tree-mode)
481
(use-local-map gnus-tree-mode-map)
482
487
(buffer-disable-undo)
483
488
(setq buffer-read-only t)
484
489
(setq truncate-lines t)
486
491
(gnus-set-work-buffer)
487
492
(gnus-tree-node-insert (make-mail-header "") nil)
488
(setq gnus-tree-node-length (1- (point))))
489
(gnus-run-mode-hooks 'gnus-tree-mode-hook))
493
(setq gnus-tree-node-length (1- (point)))))
491
495
(defun gnus-tree-read-summary-keys (&optional arg)
492
496
"Read a summary buffer key sequence and execute it."
642
646
(when (or t (gnus-visual-p 'tree-highlight 'highlight))
643
647
(gnus-tree-highlight-node gnus-tmp-number beg end))))
649
(defmacro gnus--let-eval (bindings evalsym &rest body)
650
"Build an environment in which to evaluate expressions.
651
BINDINGS is a `let'-style list of bindings to use for the environment.
652
EVALSYM is then bound in BODY to a function that takes a sexp and evaluates
653
it in the environment specified by BINDINGS."
654
(declare (indent 2) (debug ((&rest (sym form)) sym body)))
655
(if (ignore-errors (let ((x 3)) (eq (eval '(- x 1) '((x . 4))) x)))
656
;; Use lexical vars if possible.
657
`(let* ((env (list ,@(mapcar (lambda (binding)
658
`(cons ',(car binding) ,(cadr binding)))
660
(,evalsym (lambda (exp) (eval exp env))))
662
`(let (,@bindings (,evalsym #'eval)) ,@body)))
645
664
(defun gnus-tree-highlight-node (article beg end)
646
665
"Highlight current line according to `gnus-summary-highlight'."
647
666
(let ((list gnus-summary-highlight)
649
668
(with-current-buffer gnus-summary-buffer
650
(let* ((score (or (cdr (assq article gnus-newsgroup-scored))
669
(let ((uncached (memq article gnus-newsgroup-undownloaded)))
671
((score (or (cdr (assq article gnus-newsgroup-scored))
651
672
gnus-summary-default-score 0))
652
673
(default gnus-summary-default-score)
653
674
(default-high gnus-summary-default-high-score)
654
675
(default-low gnus-summary-default-low-score)
655
(uncached (memq article gnus-newsgroup-undownloaded))
656
677
(downloaded (not uncached))
657
678
(mark (or (gnus-summary-article-mark article) gnus-unread-mark)))
658
;; Eval the cars of the lists until we find a match.
660
(not (eval (caar list))))
661
(setq list (cdr list)))))
662
(unless (eq (setq face (cdar list)) (get-text-property beg 'face))
680
;; Eval the cars of the lists until we find a match.
682
(not (funcall evalfun (caar list))))
683
(setq list (cdr list))))))
684
(unless (eq (setq face (cdar list)) (gnus-get-text-property-excluding-characters-with-faces beg 'face))
663
685
(gnus-put-text-property-excluding-characters-with-faces
665
687
(if (boundp face) (symbol-value face) face)))))
829
851
(defun gnus-highlight-selected-tree (article)
830
852
"Highlight the selected article in the tree."
831
(let ((buf (current-buffer))
833
(set-buffer gnus-tree-buffer)
834
(when (setq region (gnus-tree-article-region article))
835
(when (or (not gnus-selected-tree-overlay)
836
(gnus-extent-detached-p gnus-selected-tree-overlay))
837
;; Create a new overlay.
839
(setq gnus-selected-tree-overlay
840
(gnus-make-overlay (point-min) (1+ (point-min))))
841
'face gnus-selected-tree-face))
842
;; Move the overlay to the article.
844
gnus-selected-tree-overlay (goto-char (car region)) (cdr region))
847
(let ((selected (selected-window)))
848
(when (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t)
849
(select-window (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t))
850
(gnus-horizontal-recenter)
851
(select-window selected))))
852
;; If we remove this save-excursion, it updates the wrong mode lines?!?
853
(with-current-buffer gnus-tree-buffer
854
(gnus-set-mode-line 'tree))
853
(when (buffer-live-p gnus-tree-buffer)
854
(let ((buf (current-buffer))
856
(set-buffer gnus-tree-buffer)
857
(when (setq region (gnus-tree-article-region article))
858
(when (or (not gnus-selected-tree-overlay)
859
(gnus-extent-detached-p gnus-selected-tree-overlay))
860
;; Create a new overlay.
862
(setq gnus-selected-tree-overlay
863
(gnus-make-overlay (point-min) (1+ (point-min))))
864
'face gnus-selected-tree-face))
865
;; Move the overlay to the article.
867
gnus-selected-tree-overlay (goto-char (car region)) (cdr region))
870
(let ((selected (selected-window)))
871
(when (gnus-get-buffer-window (set-buffer gnus-tree-buffer) t)
873
(gnus-get-buffer-window (set-buffer gnus-tree-buffer) t))
874
(gnus-horizontal-recenter)
875
(select-window selected))))
876
;; If we remove this save-excursion, it updates the wrong mode lines?!?
877
(with-current-buffer gnus-tree-buffer
878
(gnus-set-mode-line 'tree))
857
881
(defun gnus-tree-highlight-article (article face)
858
(with-current-buffer (gnus-get-tree-buffer)
860
(when (setq region (gnus-tree-article-region article))
861
(gnus-put-text-property (car region) (cdr region) 'face face)
863
(gnus-get-buffer-window (current-buffer) t) (cdr region))))))
882
;; The save-excursion here is apparently necessary because
883
;; `set-window-point' somehow manages to alter the buffer position.
885
(with-current-buffer (gnus-get-tree-buffer)
887
(when (setq region (gnus-tree-article-region article))
888
(gnus-put-text-property (car region) (cdr region) 'face face)
890
(gnus-get-buffer-window (current-buffer) t) (cdr region)))))))
865
892
;;; Allow redefinition of functions.
866
893
(gnus-ems-redefine)