--- /dev/null
+Return-Path: <jani@nikula.org>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+ by olra.theworths.org (Postfix) with ESMTP id 3FE93431FC9\r
+ for <notmuch@notmuchmail.org>; Tue, 17 Apr 2012 01:35:37 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.7\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5\r
+ tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+ by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id E2bfuZbzY3rZ for <notmuch@notmuchmail.org>;\r
+ Tue, 17 Apr 2012 01:35:33 -0700 (PDT)\r
+Received: from mail-qa0-f43.google.com (mail-qa0-f43.google.com\r
+ [209.85.216.43]) (using TLSv1 with cipher RC4-SHA (128/128 bits))\r
+ (No client certificate requested)\r
+ by olra.theworths.org (Postfix) with ESMTPS id 1B453431FAE\r
+ for <notmuch@notmuchmail.org>; Tue, 17 Apr 2012 01:35:33 -0700 (PDT)\r
+Received: by qadb15 with SMTP id b15so225149qad.2\r
+ for <notmuch@notmuchmail.org>; Tue, 17 Apr 2012 01:35:31 -0700 (PDT)\r
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r
+ d=google.com; s=20120113;\r
+ h=from:to:cc:subject:date:message-id:x-mailer:x-gm-message-state;\r
+ bh=/gOm1MoLmxPhBjAo3zrJUtr8AjeQeBJnV5Sr5grSBYM=;\r
+ b=BcfrnUdETdLaVrUQDBhO3d1JigVVDH0mVC9SnC246pSFTbCGukrXxp69lB/KSickpB\r
+ qR4nMTPR1XTTzEZPD0rDYeZXPWGZW7cS82Dk4A+Rj56CReLr6Aq1FX4j4F4VTCwLJlBC\r
+ UHQKVtTZjpLNNf+49/i3h9YvQF/FIJFzjlVvVopN2M8GeA18LF6v5yyFpqMW81VuY4kW\r
+ tEz4DhNdfkmHraLBlHEr8kmhfjqIhp4/w+cEwY0SMDC6GembwBt2vJzRC7+y2+y1LHSK\r
+ OvN687BIkOE/4OxJ3K7l960j38YNdyRmDWJ4nRPPxW23qTIKEwwbAkAJDayvPCn5sOu9\r
+ bKFg==\r
+Received: by 10.224.185.8 with SMTP id cm8mr19836243qab.72.1334651730094;\r
+ Tue, 17 Apr 2012 01:35:30 -0700 (PDT)\r
+Received: from localhost (nikula.org. [92.243.24.172])\r
+ by mx.google.com with ESMTPS id eg9sm39060077qab.19.2012.04.17.01.35.27\r
+ (version=SSLv3 cipher=OTHER); Tue, 17 Apr 2012 01:35:28 -0700 (PDT)\r
+From: Jani Nikula <jani@nikula.org>\r
+To: notmuch@notmuchmail.org\r
+Subject: [RFC PATCH 1/4] emacs: simplify point placement in notmuch-hello\r
+Date: Tue, 17 Apr 2012 08:35:22 +0000\r
+Message-Id:\r
+ <bcfdc0d1969997e89e5abe0b320d77ee2109796a.1334651669.git.jani@nikula.org>\r
+X-Mailer: git-send-email 1.7.1\r
+X-Gm-Message-State:\r
+ ALoCoQnJkjiNw1vMQDLAfk6qreD+rKSEOCa3gVYZ363xmve9i8H2c9hEMPf5IkH1EvHc4AyH2Kbx\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Tue, 17 Apr 2012 08:35:37 -0000\r
+\r
+notmuch-hello (called also through notmuch-hello-update, bound to '='\r
+by default) tries to find the widget under or following point before\r
+refresh, and put the point back to the widget afterwards. The code has\r
+gotten a bit complicated, and has at least the following issues:\r
+\r
+1) All the individual section functions have to include code to\r
+ support point placement. If there is no such support, point is\r
+ dropped to the search box. Only saved searches and all tags\r
+ sections support point placement.\r
+\r
+2) Point placement is based on widget-value. If there are two widgets\r
+ with the same widget-value (for example a saved search with the\r
+ same name as a tag) the point is moved to the earlier one.\r
+\r
+3) When first entering notmuch-hello notmuch-hello-target is nil, and\r
+ point is dropped to the search box.\r
+\r
+This patch simplifies the code by removing all point placement based\r
+on widgets. Point is simply saved before refresh, and put back to\r
+where it was. Sometimes, but not very often, this would have the\r
+appearance of moving the point relative to the nearest widgets. IMHO\r
+this is a minor problem compared to the issues listed above.\r
+\r
+A downside is that there's no visual cue (point movement) to indicate\r
+that refresh has finished. Then again, neither was there before, if\r
+point was at the beginning of a widget.\r
+---\r
+ emacs/notmuch-hello.el | 70 +++++++++++------------------------------------\r
+ 1 files changed, 17 insertions(+), 53 deletions(-)\r
+\r
+diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el\r
+index 71d37b8..9cd907a 100644\r
+--- a/emacs/notmuch-hello.el\r
++++ b/emacs/notmuch-hello.el\r
+@@ -154,11 +154,6 @@ International Bureau of Weights and Measures."\r
+ (defvar notmuch-hello-url "http://notmuchmail.org"\r
+ "The `notmuch' web site.")\r
+ \r
+-(defvar notmuch-hello-search-pos nil\r
+- "Position of search widget, if any.\r
+-\r
+-This should only be set by `notmuch-hello-insert-search'.")\r
+-\r
+ (defvar notmuch-hello-custom-section-options\r
+ '((:filter (string :tag "Filter for each tag"))\r
+ (:filter-count (string :tag "Different filter to generate message counts"))\r
+@@ -209,11 +204,8 @@ function produces a section simply by adding content to the current\r
+ buffer. A section should not end with an empty line, because a\r
+ newline will be inserted after each section by `notmuch-hello'.\r
+ \r
+-Each function should take no arguments. If the produced section\r
+-includes `notmuch-hello-target' (i.e. cursor should be positioned\r
+-inside this section), the function should return this element's\r
+-position.\r
+-Otherwise, it should return nil.\r
++Each function should take no arguments. The return value is\r
++ignored.\r
+ \r
+ For convenience an element can also be a list of the form (FUNC ARG1\r
+ ARG2 .. ARGN) in which case FUNC will be applied to the rest of the\r
+@@ -240,15 +232,6 @@ supported for \"Customized queries section\" items."\r
+ notmuch-hello-query-section\r
+ (function :tag "Custom section"))))\r
+ \r
+-(defvar notmuch-hello-target nil\r
+- "Button text at position of point before rebuilding the notmuch-buffer.\r
+-\r
+-This variable contains the text of the button, if any, the\r
+-point was positioned at before the notmuch-hello buffer was\r
+-rebuilt. This should never actually be global and is defined as a\r
+-defvar only for documentation purposes and to avoid a compiler\r
+-warning about it occurring as a free variable.")\r
+-\r
+ (defvar notmuch-hello-hidden-sections nil\r
+ "List of sections titles whose contents are hidden")\r
+ \r
+@@ -449,8 +432,6 @@ Such a list can be computed with `notmuch-hello-query-counts'."\r
+ (msg-count (third elem)))\r
+ (widget-insert (format "%8s "\r
+ (notmuch-hello-nice-number msg-count)))\r
+- (if (string= name notmuch-hello-target)\r
+- (setq found-target-pos (point-marker)))\r
+ (widget-create 'push-button\r
+ :notify #'notmuch-hello-widget-search\r
+ :notmuch-search-terms query\r
+@@ -589,7 +570,6 @@ Complete list of currently available key bindings:\r
+ (defun notmuch-hello-insert-search ()\r
+ "Insert a search widget."\r
+ (widget-insert "Search: ")\r
+- (setq notmuch-hello-search-pos (point-marker))\r
+ (widget-create 'editable-field\r
+ ;; Leave some space at the start and end of the\r
+ ;; search boxes.\r
+@@ -763,13 +743,7 @@ following:\r
+ (set-buffer "*notmuch-hello*")\r
+ (switch-to-buffer "*notmuch-hello*"))\r
+ \r
+- (let ((notmuch-hello-target (if (widget-at)\r
+- (widget-value (widget-at))\r
+- (condition-case nil\r
+- (progn\r
+- (widget-forward 1)\r
+- (widget-value (widget-at)))\r
+- (error nil))))\r
++ (let ((final-target-pos (point))\r
+ (inhibit-read-only t))\r
+ \r
+ ;; Delete all editable widget fields. Editable widget fields are\r
+@@ -788,30 +762,20 @@ following:\r
+ (mapc 'delete-overlay (car all))\r
+ (mapc 'delete-overlay (cdr all)))\r
+ \r
+- (let (final-target-pos)\r
+- (mapc\r
+- (lambda (section)\r
+- (let ((point-before (point))\r
+- (result (if (functionp section)\r
+- (funcall section)\r
+- (apply (car section) (cdr section)))))\r
+- (if (and (not final-target-pos) (integer-or-marker-p result))\r
+- (setq final-target-pos result))\r
+- ;; don't insert a newline when the previous section didn't show\r
+- ;; anything.\r
+- (unless (eq (point) point-before)\r
+- (widget-insert "\n"))))\r
+- notmuch-hello-sections)\r
+- (widget-setup)\r
+-\r
+- (when final-target-pos\r
+- (goto-char final-target-pos)\r
+- (unless (widget-at)\r
+- (widget-forward 1)))\r
+-\r
+- (unless (widget-at)\r
+- (when notmuch-hello-search-pos\r
+- (goto-char notmuch-hello-search-pos)))))\r
++ (mapc\r
++ (lambda (section)\r
++ (let ((point-before (point)))\r
++ (if (functionp section)\r
++ (funcall section)\r
++ (apply (car section) (cdr section)))\r
++ ;; don't insert a newline when the previous section didn't\r
++ ;; show anything.\r
++ (unless (eq (point) point-before)\r
++ (widget-insert "\n"))))\r
++ notmuch-hello-sections)\r
++ (widget-setup)\r
++\r
++ (goto-char final-target-pos))\r
+ (run-hooks 'notmuch-hello-refresh-hook)\r
+ (setq notmuch-hello-first-run nil))\r
+ \r
+-- \r
+1.7.1\r
+\r