unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* Hiding hidden image
@ 2023-08-10 23:25 Jon Fineman
  2023-08-13 12:12 ` David Bremner
  0 siblings, 1 reply; 5+ messages in thread
From: Jon Fineman @ 2023-08-10 23:25 UTC (permalink / raw)
  To: notmuch

This occurs using either:

notmuch version 0.37 and emacs version 29.1 on Debian trixie/sid X11/XFCE

or

OpenBSD OpenBSD 7.3-current (GENERIC.MP) #1327 X11/awsomewm.

I received an email with a hidden image/png. When I click on it, the
image displays fine. However when I click on it again to hide it the
email body text following it moves up as expected, but the picture
doesn't hide (go away). So I am left with the image overlaying the
email text. When I hide it the status of the attach line does change
to (hidden).

In past emacs/notmuch releases the picture would expand/shrink and the
email would adjust.

What else might I do to debug this?

Jon

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Hiding hidden image
  2023-08-10 23:25 Hiding hidden image Jon Fineman
@ 2023-08-13 12:12 ` David Bremner
  2023-08-14 10:56   ` David Bremner
  0 siblings, 1 reply; 5+ messages in thread
From: David Bremner @ 2023-08-13 12:12 UTC (permalink / raw)
  To: Jon Fineman, notmuch

Jon Fineman <jon@fineman.me> writes:

> This occurs using either:
>
> notmuch version 0.37 and emacs version 29.1 on Debian trixie/sid X11/XFCE
>
> or
>
> OpenBSD OpenBSD 7.3-current (GENERIC.MP) #1327 X11/awsomewm.
>
> I received an email with a hidden image/png. When I click on it, the
> image displays fine. However when I click on it again to hide it the
> email body text following it moves up as expected, but the picture
> doesn't hide (go away). So I am left with the image overlaying the
> email text. When I hide it the status of the attach line does change
> to (hidden).

Hi Jon;

Thanks for the report. I suspect this has to do with the new overlay
handling code in 29.1, but I haven't managed to isolate what exactly is
going on yet. I did verify that the problem does not occur with Emacs
28.2 on Debian testing. I


I also noticed that it does not happen for all png image parts, but the
pattern of what works and what does not is also unclear to me so far. I
observed that the following function

(defun hideit ()
  (interactive)
  (overlay-put (car (last (overlays-at (point)))) 'invisible t))

exhibits the same behaviour as toggling the button: i.e. one works iff
the other does. The fact that the overlay in question is the last one is
a I think a notmuch specific hack.

I don't have much to suggest, but I guess a start would be to identify
some distinguishing characteristics for the messages where the part
visibility fails to toggle. The problem does seem to manifest in more
cases than not. 

d

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Hiding hidden image
  2023-08-13 12:12 ` David Bremner
@ 2023-08-14 10:56   ` David Bremner
  2023-08-31 13:17     ` David Bremner
  0 siblings, 1 reply; 5+ messages in thread
From: David Bremner @ 2023-08-14 10:56 UTC (permalink / raw)
  To: Jon Fineman, notmuch

David Bremner <david@tethera.net> writes:

> I also noticed that it does not happen for all png image parts, but the
> pattern of what works and what does not is also unclear to me so far. I
> observed that the following function
>
> (defun hideit ()
>   (interactive)
>   (overlay-put (car (last (overlays-at (point)))) 'invisible t))

I think I'm missing something about overlays. The following code
does not work (i.e. hide the image) unless I extend the overlay to the
left.

(let ((buf (get-buffer-create "image-buffer"))
      (img (find-image '((:type xpm :file "attach.xpm"))))
      (overlay nil))
  (switch-to-buffer buf)
  (insert "0123456789")
  (insert-image img "x")
  (insert "0123456789")
  (insert "\n")
  (setq overlay (make-overlay 11 12))
  (overlay-put overlay 'invisible t)
  (message "props=%s" (overlay-properties overlay)))

This behaviour is the same in Emacs 28.2, unlike the problem Jon
describes with notmuch-emacs.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Hiding hidden image
  2023-08-14 10:56   ` David Bremner
@ 2023-08-31 13:17     ` David Bremner
  2023-09-03 11:42       ` [PATCH] WIP: use gnus supplied undisplay function to hide images David Bremner
  0 siblings, 1 reply; 5+ messages in thread
From: David Bremner @ 2023-08-31 13:17 UTC (permalink / raw)
  To: Jon Fineman, notmuch@notmuchmail.org

David Bremner <david@tethera.net> writes:

> David Bremner <david@tethera.net> writes:
>
>> I also noticed that it does not happen for all png image parts, but the
>> pattern of what works and what does not is also unclear to me so far. I
>> observed that the following function
>>
>> (defun hideit ()
>>   (interactive)
>>   (overlay-put (car (last (overlays-at (point)))) 'invisible t))
>
> I think I'm missing something about overlays. The following code
> does not work (i.e. hide the image) unless I extend the overlay to the
> left.
>
> (let ((buf (get-buffer-create "image-buffer"))
>       (img (find-image '((:type xpm :file "attach.xpm"))))
>       (overlay nil))
>   (switch-to-buffer buf)
>   (insert "0123456789")
>   (insert-image img "x")
>   (insert "0123456789")
>   (insert "\n")
>   (setq overlay (make-overlay 11 12))
>   (overlay-put overlay 'invisible t)
>   (message "props=%s" (overlay-properties overlay)))
>
> This behaviour is the same in Emacs 28.2, unlike the problem Jon
> describes with notmuch-emacs.

If I understand the comment from Emacs developer Eli Zaretskii [1]
correctly, the way that notmuch has been hiding images for the last
decade or so was never really supposed to work.

I have started to investigate an alternative strategy of using the
"undisplayer" functions provided by gnus (see the end of
mm-inline-image). I got as far as (permanently) removing the image, but
not restoring it yet. I suspect this method will be more resource
intensive, but it should not matter much since toggling images is not
something that happens for multiple images at a time.


[1]: https://lists.gnu.org/archive/html/emacs-devel/2023-08/msg00593.html

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH] WIP: use gnus supplied undisplay function to hide images
  2023-08-31 13:17     ` David Bremner
@ 2023-09-03 11:42       ` David Bremner
  0 siblings, 0 replies; 5+ messages in thread
From: David Bremner @ 2023-09-03 11:42 UTC (permalink / raw)
  To: David Bremner, Jon Fineman, notmuch@notmuchmail.org

According to emacs upstream [1], we can't expect overlay invisibilityy
and images to get along. This is a first attempt to use the
"undisplayer" functions saved by gnus (specificially mm-insert-image)
to do the hiding.

There are some potential efficiency concerns. A second copy of all
parts is saved. That could (perhaps?) be optimized to only be done for
the toggled ones. Profile / test first, optimize later

[1]: https://lists.gnu.org/archive/html/emacs-devel/2023-08/msg00593.html
---
 emacs/notmuch-lib.el  |  1 +
 emacs/notmuch-show.el | 38 ++++++++++++++++++++++++++++++--------
 2 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el
index 84ba8c5e..a09f4ab8 100644
--- a/emacs/notmuch-lib.el
+++ b/emacs/notmuch-lib.el
@@ -703,6 +703,7 @@ current buffer, if possible."
 	  (when (mm-inlinable-p handle)
 	    (set-buffer display-buffer)
 	    (mm-display-part handle)
+	    (plist-put part :undisplayer (mm-handle-undisplayer handle))
 	    t))))))
 
 ;;; Generic Utilities
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 36cce619..7911be5d 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -618,7 +618,7 @@ message at DEPTH in the current thread."
   (let ((button (or button (button-at (point)))))
     (when button
       (let ((overlay (button-get button 'overlay))
-	    (lazy-part (button-get button :notmuch-lazy-part)))
+	    (lazy-part 	(button-get button :notmuch-lazy-part)))
 	;; We have a part to toggle if there is an overlay or if there
 	;; is a lazy part.  If neither is present we cannot toggle the
 	;; part so we just return nil.
@@ -644,8 +644,25 @@ message at DEPTH in the current thread."
 		(when show
 		  (button-put button :notmuch-lazy-part nil)
 		  (notmuch-show-lazy-part lazy-part button))
-	      ;; else there must be an overlay.
-	      (overlay-put overlay 'invisible (not show))
+	      (let* ((part (plist-get properties :notmuch-part))
+		     (undisplayer (plist-get part :undisplayer))
+		     (mime-type (plist-get part :content-type))
+		     (redisplay-data (button-get button
+						 :notmuch-redisplay-data))
+		     ;; XXX FIXME use computed content type
+		     (imagep (string-match "^image/" mime-type)))
+		(cond
+		 ((and imagep (not show) undisplayer)
+		  ;; call undisplayer thunk created by gnus.
+		  (funcall undisplayer)
+		  ;; there is an extra newline left
+		  (delete-region
+		   (+ 1 (button-end button))
+		   (+ 2 (button-end button))))
+		 ((and imagep show redisplay-data)
+		  (notmuch-show-lazy-part redisplay-data button))
+		 (t
+		  (overlay-put overlay 'invisible (not show)))))
 	      t)))))))
 
 ;;; Part content ID handling
@@ -1023,6 +1040,7 @@ will return nil if the CID is unknown or cannot be retrieved."
       (save-restriction
 	(narrow-to-region part-beg part-end)
 	(delete-region part-beg part-end)
+	(button-put button :notmuch-redisplay-data part-args)
 	(apply #'notmuch-show-insert-bodypart-internal part-args)
 	(indent-rigidly part-beg
 			part-end
@@ -1106,14 +1124,18 @@ is t, hide the part initially and show the button."
 			     (and deep button)
 			     (and high button)
 			     (and long button))))
-	 (content-beg (point)))
+	 (content-beg (point))
+	 (part-data (list msg part mime-type nth depth button)))
     ;; Store the computed mime-type for later use (e.g. by attachment handlers).
     (plist-put part :computed-type mime-type)
-    (if show-part
-	(notmuch-show-insert-bodypart-internal msg part mime-type nth depth button)
+    (cond
+     (show-part
+      (notmuch-show-insert-bodypart-internal msg part mime-type nth depth button)
+      (when button
+	(button-put button :notmuch-redisplay-data part-data)))
+     (t
       (when button
-	(button-put button :notmuch-lazy-part
-		    (list msg part mime-type nth depth button))))
+	(button-put button :notmuch-lazy-part part-data))))
     ;; Some of the body part handlers leave point somewhere up in the
     ;; part, so we make sure that we're down at the end.
     (goto-char (point-max))
-- 
2.40.1

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-09-03 11:42 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-10 23:25 Hiding hidden image Jon Fineman
2023-08-13 12:12 ` David Bremner
2023-08-14 10:56   ` David Bremner
2023-08-31 13:17     ` David Bremner
2023-09-03 11:42       ` [PATCH] WIP: use gnus supplied undisplay function to hide images David Bremner

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).