* 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).