GNU bug report logs -
#18010
eww: desktop support
Previous Next
Reported by: Ivan Shmakov <ivan <at> siamics.net>
Date: Sun, 13 Jul 2014 12:20:02 UTC
Severity: wishlist
Tags: fixed, patch
Fixed in version 25.1
Done: Lars Magne Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
Full log
Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
Package: emacs
Severity: wishlist
Tags: patch
Control: block -1 by 16211
Control: tags 16211 + patch
Assuming that #16211 is resolved, adding desktop support to EWW
seems pretty natural. (Why, Info already has one.)
One thing to save is, obviously, eww-current-url. The other is
eww-history, but that has to be filtered for the overly bulky
:text, :dom, and :source properties.
The last part poses a problem, as eww-restore-history does /not/
currently handle the case where :text is missing. A possible
solution is to use (eww-reload) if :text is nil. As a side
effect, eww-current-source and eww-current-dom will also be set.
Also, AIUI, for the EWW history facility to work properly,
eww-history-position is also to be saved, which is possible via
desktop-locals-to-save.
For anyone eager to try, the patch I suggest is MIMEd.
This change looks quite substantial to be copyrightable, so I’d
like to explicitly disclaim copyright on it, as per
CC0 Public Domain Dedication [0].
For the most part, eww-desktop-history-1 function is a kind of
‘reduce’ or ‘remove-if’ for property lists. Alas, I didn’t find
any existing function for that, so I coded it the explicit way.
--
FSF associate member #7257 http://boycottsystemd.org/
[Message part 2 (text/x-diff, inline)]
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index 02fc575..f6ee185 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -479,6 +495,8 @@ word(s) will be searched for via `eww-search-prefix'."
(setq-local eww-history-position 0)
(when (boundp 'tool-bar-map)
(setq-local tool-bar-map eww-tool-bar-map))
+ ;; desktop support
+ (setq-local desktop-save-buffer 'eww-desktop-misc-data)
(buffer-disable-undo)
;;(setq buffer-read-only t)
)
@@ -514,15 +533,22 @@ word(s) will be searched for via `eww-search-prefix'."
(eww-restore-history (elt eww-history (1- eww-history-position))))
(defun eww-restore-history (elem)
- (let ((inhibit-read-only t))
- (erase-buffer)
- (insert (plist-get elem :text))
- (setq eww-current-source (plist-get elem :source))
- (setq eww-current-dom (plist-get elem :dom))
- (goto-char (plist-get elem :point))
- (setq eww-current-url (plist-get elem :url)
- eww-current-title (plist-get elem :title))
- (eww-update-header-line-format)))
+ (let ((inhibit-read-only t)
+ (text (plist-get elem :text))
+ (pos (plist-get elem :point)))
+ (setq eww-current-source (plist-get elem :source)
+ eww-current-dom (plist-get elem :dom)
+ eww-current-url (plist-get elem :url))
+ (if (null text)
+ (eww-reload)
+ (erase-buffer)
+ (insert text)
+ (setq eww-current-title
+ (plist-get elem :title))
+ (eww-update-header-line-format))
+ ;; FIXME: pos may no longer match the contents if the page gets reloaded
+ (when pos
+ (goto-char pos))))
(defun eww-next-url ()
"Go to the page marked `next'.
@@ -1343,6 +1371,48 @@ Differences in #targets are ignored."
(setq buffer-read-only t
truncate-lines t))
+;;; Desktop support
+
+(defvar eww-desktop-history-save
+ '(:url :title :point)
+ "List of `eww-history' values to preserve in the desktop file.")
+
+(defun eww-desktop-history-1 (alist)
+ (let ((acc nil)
+ (tail alist))
+ (while tail
+ (let ((k (car tail))
+ (v (cadr tail)))
+ (when (memq k eww-desktop-history-save)
+ (setq acc (cons k (cons v acc)))))
+ (setq tail (cddr tail)))
+ acc))
+
+(defun eww-desktop-misc-data (directory)
+ "Return a property list with data used to restore eww buffers.
+This list will contain the URI to browse as the :uri property, and, as
+:history, a copy of eww-history with the (usually overly large) :dom,
+:source and :text properties removed."
+ (list :history (mapcar 'eww-desktop-history-1 eww-history)
+ :uri eww-current-url))
+
+(defun eww-restore-desktop (file-name buffer-name misc-data)
+ "Restore an eww buffer from its desktop file record."
+ (with-current-buffer (get-buffer-create buffer-name)
+ (eww-mode)
+ ;; NB: eww-history is buffer-local per (eww-mode)
+ (setq eww-history (plist-get :history misc-data))
+ (unless file-name
+ (let ((uri (plist-get :uri misc-data)))
+ (when uri
+ (eww uri))))
+ (current-buffer)))
+
+(add-to-list 'desktop-locals-to-save
+ 'eww-history-position)
+(add-to-list 'desktop-buffer-mode-handlers
+ '(eww-mode . eww-restore-desktop))
+
(provide 'eww)
;;; eww.el ends here
This bug report was last modified 10 years and 243 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.