[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#18010: eww: desktop support
From: |
Ivan Shmakov |
Subject: |
bug#18010: eww: desktop support |
Date: |
Wed, 19 Nov 2014 10:24:26 +0000 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) |
>>>>> Lars Magne Ingebrigtsen <larsi@gnus.org> writes:
> Ivan, if you could respin this patch to apply to eww now, I'll apply
> it.
Please consider the patch MIMEd. Albeit I’ve tested it only
somewhat superficially, it does seem to work as intended.
Beware of the line numbers being slightly offset, for I also
have other patches applied to eww.el locally.
--
FSF associate member #7257 http://boycottsystemd.org/ … 3013 B6A0 230E 334A
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -65,6 +65,36 @@
:group 'eww
:type 'string)
+(defcustom eww-desktop-remove-duplicates t
+ "Whether to remove duplicates from the history when saving desktop data.
+If non-nil, repetitive EWW history entries (comprising of the URI, the
+title, and the point position) will not be saved as part of the Emacs
+desktop. Otherwise, such entries will be retained."
+ :version "24.4"
+ :group 'eww
+ :type 'boolean)
+
+(defcustom eww-restore-desktop nil
+ "How to restore EWW buffers on `desktop-restore'.
+If t or 'auto, the buffers will be reloaded automatically.
+If nil, buffers will require manual reload, and will contain the text
+specified in `eww-restore-reload-prompt' instead of the actual Web
+page contents."
+ :version "24.4"
+ :group 'eww
+ :type '(choice (const :tag "Restore all automatically" t)
+ (const :tag "Require manual reload" nil)))
+
+(defcustom eww-restore-reload-prompt
+ "\n\n *** Use \\[eww-reload] to reload this buffer. ***\n"
+ "The string to put in the buffers not reloaded on `desktop-restore'.
+This prompt will be used if `eww-restore-desktop' is nil.
+
+The string will be passed through `substitute-command-keys'."
+ :version "24.4"
+ :group 'eww
+ :type 'string)
+
(defcustom eww-use-external-browser-for-content-type
"\\`\\(video/\\|audio/\\|application/ogg\\)"
"Always use external browser for specified content-type."
@@ -583,6 +633,8 @@ define-derived-mode eww-mode nil "eww"
(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))
@@ -611,12 +660,15 @@
(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))
- (goto-char (plist-get elem :point))
+ (let ((inhibit-read-only t)
+ (text (plist-get elem :text)))
(setq eww-data elem)
- (eww-update-header-line-format)))
+ (if (null text)
+ (eww-reload) ; FIXME: restore :point?
+ (erase-buffer)
+ (insert text)
+ (goto-char (plist-get elem :point))
+ (eww-update-header-line-format))))
(defun eww-next-url ()
"Go to the page marked `next'.
@@ -1518,6 +1585,82 @@
(setq buffer-read-only t
truncate-lines t))
+;;; Desktop support
+
+(defvar eww-desktop-data-save
+ '(:url :title :point)
+ "List of `eww-data' properties to preserve in the desktop file.
+Also used when saving `eww-history'.")
+
+(defun eww-desktop-data-1 (alist)
+ (let ((acc nil)
+ (tail alist))
+ (while tail
+ (let ((k (car tail))
+ (v (cadr tail)))
+ (when (memq k eww-desktop-data-save)
+ (setq acc (cons k (cons v acc)))))
+ (setq tail (cddr tail)))
+ acc))
+
+(defun eww-desktop-history-duplicate (a b)
+ (let ((tail a) (r t))
+ (while tail
+ (if (or (memq (car tail) '(:point)) ; ignore :point
+ (equal (cadr tail)
+ (plist-get b (car tail))))
+ (setq tail (cddr tail))
+ (setq tail nil
+ r nil)))
+ ;; .
+ r))
+
+(defun eww-desktop-misc-data (directory)
+ "Return a property list with data used to restore eww buffers.
+This list will contain, as :history, the list, whose first element is
+the value of `eww-data', and the tail is `eww-history'.
+
+If `eww-desktop-remove-duplicates' is non-nil, duplicate
+entries (if any) will be removed from the list.
+
+Only the properties listed in `eww-desktop-data-save' are included.
+Generally, the list should not include the (usually overly large)
+:dom, :source and :text properties."
+ (let ((history (mapcar 'eww-desktop-data-1
+ (cons eww-data eww-history))))
+ (list :history (if eww-desktop-remove-duplicates
+ (remove-duplicates
+ history :test 'eww-desktop-history-duplicate)
+ history))))
+
+(defun eww-restore-desktop (file-name buffer-name misc-data)
+ "Restore an eww buffer from its desktop file record.
+If `eww-restore-desktop' is t or 'auto, this function will also
+initiate the retrieval of the respective URI in the background.
+Otherwise, the restored buffer will contain a prompt to do so by using
+\\[eww-reload]."
+ (with-current-buffer (get-buffer-create buffer-name)
+ (eww-mode)
+ ;; NB: eww-history, eww-data are buffer-local per (eww-mode)
+ (setq eww-history (cdr (plist-get misc-data :history))
+ eww-data (or (car (plist-get misc-data :history))
+ ;; backwards compatibility
+ (list :url (plist-get misc-data :uri))))
+ (unless file-name
+ (when (plist-get eww-data :url)
+ (case eww-restore-desktop
+ ((t auto) (eww (plist-get eww-data :url)))
+ ((zerop (buffer-size))
+ (insert (substitute-command-keys
+ eww-restore-reload-prompt))))))
+ ;; .
+ (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
- bug#18010: eww: desktop support, Ted Zlatanov, 2014/11/04
- bug#18010: eww: desktop support, Lars Magne Ingebrigtsen, 2014/11/10
- bug#18010: eww: desktop support, Glenn Morris, 2014/11/10
- bug#18010: eww: desktop support, Lars Magne Ingebrigtsen, 2014/11/10
- bug#18010: eww: desktop support,
Ivan Shmakov <=
- bug#18010: eww: desktop support, Lars Magne Ingebrigtsen, 2014/11/19
- bug#18010: eww: desktop support, Ivan Shmakov, 2014/11/19
- bug#18010: eww: desktop support, Ivan Shmakov, 2014/11/23
- bug#18010: eww: desktop support, Lars Magne Ingebrigtsen, 2014/11/23
- bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only, Ivan Shmakov, 2014/11/30
- bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only, Glenn Morris, 2014/11/30
- bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only, Ivan Shmakov, 2014/11/30
- bug#19226: eww.el desktop support fixes: autoload eww-mode, use inhibit-read-only, Glenn Morris, 2014/11/30