(defvar notmuch-hello-url "http://notmuchmail.org"
"The `notmuch' web site.")
-(defvar notmuch-hello-search-pos nil
- "Position of search widget, if any.
-
-This should only be set by `notmuch-hello-insert-search'.")
-
(defvar notmuch-hello-custom-section-options
'((:filter (string :tag "Filter for each tag"))
(:filter-count (string :tag "Different filter to generate message counts"))
buffer. A section should not end with an empty line, because a
newline will be inserted after each section by `notmuch-hello'.
-Each function should take no arguments. If the produced section
-includes `notmuch-hello-target' (i.e. cursor should be positioned
-inside this section), the function should return this element's
-position.
-Otherwise, it should return nil.
+Each function should take no arguments. The return value is
+ignored.
For convenience an element can also be a list of the form (FUNC ARG1
ARG2 .. ARGN) in which case FUNC will be applied to the rest of the
notmuch-hello-query-section
(function :tag "Custom section"))))
-(defvar notmuch-hello-target nil
- "Button text at position of point before rebuilding the notmuch-buffer.
-
-This variable contains the text of the button, if any, the
-point was positioned at before the notmuch-hello buffer was
-rebuilt. This should never actually be global and is defined as a
-defvar only for documentation purposes and to avoid a compiler
-warning about it occurring as a free variable.")
-
(defvar notmuch-hello-hidden-sections nil
"List of sections titles whose contents are hidden")
(reordered-list (notmuch-hello-reflect searches tags-per-line))
;; Hack the display of the buttons used.
(widget-push-button-prefix "")
- (widget-push-button-suffix "")
- (found-target-pos nil))
+ (widget-push-button-suffix ""))
;; dme: It feels as though there should be a better way to
;; implement this loop than using an incrementing counter.
(mapc (lambda (elem)
(msg-count (third elem)))
(widget-insert (format "%8s "
(notmuch-hello-nice-number msg-count)))
- (if (string= name notmuch-hello-target)
- (setq found-target-pos (point-marker)))
(widget-create 'push-button
:notify #'notmuch-hello-widget-search
:notmuch-search-terms query
;; If the last line was not full (and hence did not include a
;; carriage return), insert one now.
(unless (eq (% count tags-per-line) 0)
- (widget-insert "\n"))
- found-target-pos))
+ (widget-insert "\n"))))
(defimage notmuch-hello-logo ((:type png :file "notmuch-logo.png")))
(funcall notmuch-saved-search-sort-function
notmuch-saved-searches)
notmuch-saved-searches)
- :show-empty-searches notmuch-show-empty-saved-searches))
- found-target-pos)
+ :show-empty-searches notmuch-show-empty-saved-searches)))
(when searches
(widget-insert "Saved searches: ")
(widget-create 'push-button
"edit")
(widget-insert "\n\n")
(let ((start (point)))
- (setq found-target-pos
- (notmuch-hello-insert-buttons searches))
- (indent-rigidly start (point) notmuch-hello-indent)
- found-target-pos))))
+ (notmuch-hello-insert-buttons searches)
+ (indent-rigidly start (point) notmuch-hello-indent)))))
(defun notmuch-hello-insert-search ()
"Insert a search widget."
(widget-insert "Search: ")
- (setq notmuch-hello-search-pos (point-marker))
(widget-create 'editable-field
;; Leave some space at the start and end of the
;; search boxes.
(notmuch-hello-update))
"hide"))
(widget-insert "\n")
- (let (target-pos)
- (when (not is-hidden)
- (let ((searches (apply 'notmuch-hello-query-counts query-alist options)))
- (when (or (not (plist-get options :hide-if-empty))
- searches)
- (widget-insert "\n")
- (setq target-pos
- (notmuch-hello-insert-buttons searches))
- (indent-rigidly start (point) notmuch-hello-indent))))
- target-pos)))
+ (when (not is-hidden)
+ (let ((searches (apply 'notmuch-hello-query-counts query-alist options)))
+ (when (or (not (plist-get options :hide-if-empty))
+ searches)
+ (widget-insert "\n")
+ (notmuch-hello-insert-buttons searches)
+ (indent-rigidly start (point) notmuch-hello-indent))))))
(defun notmuch-hello-insert-tags-section (&optional title &rest options)
"Insert a section displaying all tags with message counts.
(set-buffer "*notmuch-hello*")
(switch-to-buffer "*notmuch-hello*"))
- (let ((notmuch-hello-target (if (widget-at)
- (widget-value (widget-at))
- (condition-case nil
- (progn
- (widget-forward 1)
- (widget-value (widget-at)))
- (error nil))))
+ (let ((target-line (line-number-at-pos))
+ (target-column (current-column))
(inhibit-read-only t))
;; Delete all editable widget fields. Editable widget fields are
(mapc 'delete-overlay (car all))
(mapc 'delete-overlay (cdr all)))
- (let (final-target-pos)
- (mapc
- (lambda (section)
- (let ((point-before (point))
- (result (if (functionp section)
- (funcall section)
- (apply (car section) (cdr section)))))
- (if (and (not final-target-pos) (integer-or-marker-p result))
- (setq final-target-pos result))
- ;; don't insert a newline when the previous section didn't show
- ;; anything.
- (unless (eq (point) point-before)
- (widget-insert "\n"))))
- notmuch-hello-sections)
- (widget-setup)
-
- (when final-target-pos
- (goto-char final-target-pos)
- (unless (widget-at)
- (widget-forward 1)))
-
- (unless (widget-at)
- (when notmuch-hello-search-pos
- (goto-char notmuch-hello-search-pos)))))
+ (mapc
+ (lambda (section)
+ (let ((point-before (point)))
+ (if (functionp section)
+ (funcall section)
+ (apply (car section) (cdr section)))
+ ;; don't insert a newline when the previous section didn't
+ ;; show anything.
+ (unless (eq (point) point-before)
+ (widget-insert "\n"))))
+ notmuch-hello-sections)
+ (widget-setup)
+
+ ;; Move point back to where it was before refresh. Use line and
+ ;; column instead of point directly to be insensitive to additions
+ ;; and removals of text within earlier lines.
+ (goto-char (point-min))
+ (forward-line (1- target-line))
+ (move-to-column target-column))
(run-hooks 'notmuch-hello-refresh-hook)
(setq notmuch-hello-first-run nil))