Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 3FE93431FC9 for ; Tue, 17 Apr 2012 01:35:37 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -0.7 X-Spam-Level: X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id E2bfuZbzY3rZ for ; Tue, 17 Apr 2012 01:35:33 -0700 (PDT) Received: from mail-qa0-f43.google.com (mail-qa0-f43.google.com [209.85.216.43]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id 1B453431FAE for ; Tue, 17 Apr 2012 01:35:33 -0700 (PDT) Received: by qadb15 with SMTP id b15so225149qad.2 for ; Tue, 17 Apr 2012 01:35:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:x-gm-message-state; bh=/gOm1MoLmxPhBjAo3zrJUtr8AjeQeBJnV5Sr5grSBYM=; b=BcfrnUdETdLaVrUQDBhO3d1JigVVDH0mVC9SnC246pSFTbCGukrXxp69lB/KSickpB qR4nMTPR1XTTzEZPD0rDYeZXPWGZW7cS82Dk4A+Rj56CReLr6Aq1FX4j4F4VTCwLJlBC UHQKVtTZjpLNNf+49/i3h9YvQF/FIJFzjlVvVopN2M8GeA18LF6v5yyFpqMW81VuY4kW tEz4DhNdfkmHraLBlHEr8kmhfjqIhp4/w+cEwY0SMDC6GembwBt2vJzRC7+y2+y1LHSK OvN687BIkOE/4OxJ3K7l960j38YNdyRmDWJ4nRPPxW23qTIKEwwbAkAJDayvPCn5sOu9 bKFg== Received: by 10.224.185.8 with SMTP id cm8mr19836243qab.72.1334651730094; Tue, 17 Apr 2012 01:35:30 -0700 (PDT) Received: from localhost (nikula.org. [92.243.24.172]) by mx.google.com with ESMTPS id eg9sm39060077qab.19.2012.04.17.01.35.27 (version=SSLv3 cipher=OTHER); Tue, 17 Apr 2012 01:35:28 -0700 (PDT) From: Jani Nikula To: notmuch@notmuchmail.org Subject: [RFC PATCH 1/4] emacs: simplify point placement in notmuch-hello Date: Tue, 17 Apr 2012 08:35:22 +0000 Message-Id: X-Mailer: git-send-email 1.7.1 X-Gm-Message-State: ALoCoQnJkjiNw1vMQDLAfk6qreD+rKSEOCa3gVYZ363xmve9i8H2c9hEMPf5IkH1EvHc4AyH2Kbx X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 17 Apr 2012 08:35:37 -0000 notmuch-hello (called also through notmuch-hello-update, bound to '=' by default) tries to find the widget under or following point before refresh, and put the point back to the widget afterwards. The code has gotten a bit complicated, and has at least the following issues: 1) All the individual section functions have to include code to support point placement. If there is no such support, point is dropped to the search box. Only saved searches and all tags sections support point placement. 2) Point placement is based on widget-value. If there are two widgets with the same widget-value (for example a saved search with the same name as a tag) the point is moved to the earlier one. 3) When first entering notmuch-hello notmuch-hello-target is nil, and point is dropped to the search box. This patch simplifies the code by removing all point placement based on widgets. Point is simply saved before refresh, and put back to where it was. Sometimes, but not very often, this would have the appearance of moving the point relative to the nearest widgets. IMHO this is a minor problem compared to the issues listed above. A downside is that there's no visual cue (point movement) to indicate that refresh has finished. Then again, neither was there before, if point was at the beginning of a widget. --- emacs/notmuch-hello.el | 70 +++++++++++------------------------------------ 1 files changed, 17 insertions(+), 53 deletions(-) diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el index 71d37b8..9cd907a 100644 --- a/emacs/notmuch-hello.el +++ b/emacs/notmuch-hello.el @@ -154,11 +154,6 @@ International Bureau of Weights and Measures." (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")) @@ -209,11 +204,8 @@ function produces a section simply by adding content to the current 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 @@ -240,15 +232,6 @@ supported for \"Customized queries section\" items." 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") @@ -449,8 +432,6 @@ Such a list can be computed with `notmuch-hello-query-counts'." (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 @@ -589,7 +570,6 @@ Complete list of currently available key bindings: (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. @@ -763,13 +743,7 @@ following: (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 ((final-target-pos (point)) (inhibit-read-only t)) ;; Delete all editable widget fields. Editable widget fields are @@ -788,30 +762,20 @@ following: (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) + + (goto-char final-target-pos)) (run-hooks 'notmuch-hello-refresh-hook) (setq notmuch-hello-first-run nil)) -- 1.7.1