From: Tim Vaughan Date: Wed, 20 May 2020 07:26:46 +0000 (+0200) Subject: Merge remote-tracking branch 'origin/patch_gus' X-Git-Tag: v2.7.5~2 X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=elpher.git;a=commitdiff_plain;h=ee20acda381ecea47db0d48c8d495bd17f86348e;hp=c93f763bd1cf07f84394119adc1f944c160c64d4 Merge remote-tracking branch 'origin/patch_gus' --- diff --git a/ISSUES.org b/ISSUES.org index 0ce57fd..3ebb22d 100644 --- a/ISSUES.org +++ b/ISSUES.org @@ -41,17 +41,8 @@ Here is the checklist of features required before release: The last few will be made infinitely easier if we factor the gopher "getter" code differently. - ** OPEN Add history browsing -** OPEN Download/rendering progress feedback - Particularly for large files or complicated pages, elpher can - take a few seconds or more to generate a response. Thhis is - frustrating for users, who are left staring at a blinking - cursor. - - A small amount of feedback could help with this. - * Bugs * Completed improvements @@ -132,6 +123,14 @@ occasionally pop up in termal windows. Lets leave it for now. Okay, replacing this really does improve things. Large gemini downloads now seem occur at rates I'd expect. + +** CLOSED Download/rendering progress feedback + Particularly for large files or complicated pages, elpher can + take a few seconds or more to generate a response. Thhis is + frustrating for users, who are left staring at a blinking + cursor. + + A small amount of feedback could help with this. * Closed issues diff --git a/README b/README index 7d6167b..ec02b5c 100644 --- a/README +++ b/README @@ -80,6 +80,17 @@ which should become automatically available if you install Elpher using "M-x package-install". To access it, select it from the root Info directory which can be displayed using "C-h i". +Contributors +------------ + +Besides myself, the following people (in no particular order) have +generously provided assistance/patches for the impovement of elpher: + +* Bradley Thornton +* Roy Koushik +* Simon South +* Vee + Licence ------- diff --git a/elpher.el b/elpher.el index debbddd..b4b62d8 100644 --- a/elpher.el +++ b/elpher.el @@ -2,9 +2,9 @@ ;; Copyright (C) 2019 Tim Vaughan -;; Author: Tim Vaughan +;; Author: Tim Vaughan ;; Created: 11 April 2019 -;; Version: 2.7.1 +;; Version: 2.7.4 ;; Keywords: comm gopher ;; Homepage: http://thelambdalab.xyz/elpher ;; Package-Requires: ((emacs "26")) @@ -70,7 +70,7 @@ ;;; Global constants ;; -(defconst elpher-version "2.7.1" +(defconst elpher-version "2.7.4" "Current version of elpher.") (defconst elpher-margin-width 6 @@ -148,6 +148,10 @@ The actual width used is the minimum of this value and the window width at the time when the text is rendered." :type '(integer)) +(defcustom elpher-bookmarks-file (locate-user-emacs-file "elpher-bookmarks") + "Specify the name of the file where elpher bookmarks will be saved." + :type '(file)) + ;; Face customizations (defgroup elpher-faces nil @@ -208,15 +212,15 @@ the time when the text is rendered." (defface elpher-gemini-heading1 '((t :inherit bold :height 1.8)) - "Face used for brackets around directory margin key.") + "Face used for gemini heading level 1.") (defface elpher-gemini-heading2 '((t :inherit bold :height 1.5)) - "Face used for brackets around directory margin key.") + "Face used for gemini heading level 2.") (defface elpher-gemini-heading3 '((t :inherit bold :height 1.2)) - "Face used for brackets around directory margin key.") + "Face used for gemini heading level 3.") ;;; Model ;; @@ -261,6 +265,7 @@ The basic attributes include: TYPE, SELECTOR, HOST and PORT. If the optional attribute TLS is non-nil, the address will be marked as requiring gopher-over-TLS." (cond + ((equal type ?i) nil) ((and (equal type ?h) (string-prefix-p "URL:" selector)) (elpher-address-from-url (elt (split-string selector "URL:") 1))) @@ -545,6 +550,8 @@ to ADDRESS." (port (elpher-address-port address)) (host (elpher-address-host address)) (selector-string-parts nil) + (bytes-received 0) + (hkbytes-received 0) (proc (open-network-stream "elpher-process" nil (if force-ipv4 (dns-query host) host) @@ -575,7 +582,21 @@ to ADDRESS." (set-process-coding-system proc 'binary) (set-process-filter proc (lambda (_proc string) - (cancel-timer timer) + (when timer + (cancel-timer timer) + (setq timer nil)) + (setq bytes-received (+ bytes-received (length string))) + (let ((new-hkbytes-received (/ bytes-received 102400))) + (when (> new-hkbytes-received hkbytes-received) + (setq hkbytes-received new-hkbytes-received) + (with-current-buffer "*elpher*" + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (beginning-of-line 2) + (delete-region (point) (point-max)) + (insert "(" + (number-to-string (/ hkbytes-received 10.0)) + " MB read)"))))) (setq selector-string-parts (cons string selector-string-parts)))) (set-process-sentinel proc @@ -590,7 +611,9 @@ to ADDRESS." (concat (elpher-gopher-address-selector address) "\r\n")))) (t - (cancel-timer timer) + (when timer + (cancel-timer timer) + (setq timer nil)) (funcall renderer (apply #'concat (reverse selector-string-parts))) (elpher-restore-pos))) @@ -610,7 +633,7 @@ once they are retrieved from the gopher server." (insert content) (elpher-restore-pos)) (elpher-with-clean-buffer - (insert "LOADING... (use 'u' to cancel)")) + (insert "LOADING... (use 'u' to cancel)\n")) (condition-case the-error (elpher-get-selector address renderer) (error @@ -676,7 +699,7 @@ If ADDRESS is not supplied or nil the record is rendered as an 'follow-link t 'help-echo (elpher-page-button-help page))) (pcase type - ((or '(gopher ?i) 'nil) ;; Information + ('nil ;; Information (elpher-insert-margin) (let ((propertized-display-string (propertize display-string 'face 'elpher-info))) @@ -809,7 +832,9 @@ The response is rendered using the rendering function RENDERER." (if (not data) nil (let* ((address (elpher-page-address elpher-current-page)) - (selector (elpher-gopher-address-selector address))) + (selector (if (elpher-address-gopher-p address) + (elpher-gopher-address-selector address) + (elpher-address-filename address)))) (elpher-visit-previous-page) ; Do first in case of non-local exits. (let* ((filename-proposal (file-name-nondirectory selector)) (filename (read-file-name "Download complete. Save file as: " @@ -853,6 +878,8 @@ to ADDRESS." (port (elpher-address-port address)) (host (elpher-address-host address)) (response-string-parts nil) + (bytes-received 0) + (hkbytes-received 0) (proc (open-network-stream "elpher-process" nil (if force-ipv4 (dns-query host) host) @@ -873,6 +900,18 @@ to ADDRESS." (when timer (cancel-timer timer) (setq timer nil)) + (setq bytes-received (+ bytes-received (length string))) + (let ((new-hkbytes-received (/ bytes-received 102400))) + (when (> new-hkbytes-received hkbytes-received) + (setq hkbytes-received new-hkbytes-received) + (with-current-buffer "*elpher*" + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (beginning-of-line 2) + (delete-region (point) (point-max)) + (insert "(" + (number-to-string (/ hkbytes-received 10.0)) + " MB read)"))))) (setq response-string-parts (cons string response-string-parts)))) (set-process-sentinel proc @@ -898,7 +937,7 @@ to ADDRESS." renderer) (elpher-restore-pos))) (error - (elpher-network-error address the-error)))))) + (elpher-network-error address the-error)))))) (error (error "Error initiating connection to server"))))) @@ -969,7 +1008,7 @@ that the response was malformed." (insert content) (elpher-restore-pos)) (elpher-with-clean-buffer - (insert "LOADING GEMINI... (use 'u' to cancel)")) + (insert "LOADING GEMINI... (use 'u' to cancel)\n")) (setq elpher-gemini-redirect-chain nil) (elpher-get-gemini-response address renderer)) (error @@ -1008,7 +1047,7 @@ that the response was malformed." ((pred (string-prefix-p "image/")) (elpher-render-image body)) (_other - (error "Unsupported MIME type %S" mime-type)))))) + (elpher-render-download body)))))) (defun elpher-gemini-get-link-url (link-line) "Extract the url portion of LINK-LINE, a gemini map file link line. @@ -1137,7 +1176,7 @@ by HEADER-LINE." (insert content) (elpher-restore-pos)) (elpher-with-clean-buffer - (insert "LOADING... (use 'u' to cancel)")) + (insert "LOADING... (use 'u' to cancel)\n")) (condition-case the-error (let* ((kill-buffer-query-functions nil) (user (let ((filename (elpher-address-filename address))) @@ -1167,7 +1206,9 @@ by HEADER-LINE." (set-process-coding-system proc 'binary) (set-process-filter proc (lambda (_proc string) - (cancel-timer timer) + (when timer + (cancel-timer timer) + (setq timer nil)) (setq selector-string-parts (cons string selector-string-parts)))) (set-process-sentinel proc @@ -1181,7 +1222,9 @@ by HEADER-LINE." proc (concat user "\r\n")))) (t - (cancel-timer timer) + (when timer + (cancel-timer timer) + (setq timer nil)) (funcall renderer (apply #'concat (reverse selector-string-parts))) (elpher-restore-pos))))))) @@ -1312,7 +1355,7 @@ by HEADER-LINE." "- a: rename selected bookmark\n" "\n" "Bookmarks are stored in the file ") - (let ((filename (locate-user-emacs-file "elpher-bookmarks")) + (let ((filename elpher-bookmarks-file) (help-string "RET,mouse-1: Open bookmarks file in new buffer for editing.")) (insert-text-button filename 'face 'link @@ -1349,7 +1392,7 @@ bookmark list, while URL is the url of the entry." (defun elpher-save-bookmarks (bookmarks) "Record the bookmark list BOOKMARKS to the user's bookmark file. Beware that this completely replaces the existing contents of the file." - (with-temp-file (locate-user-emacs-file "elpher-bookmarks") + (with-temp-file elpher-bookmarks-file (erase-buffer) (insert "; Elpher bookmarks file\n\n" "; Bookmarks are stored as a list of (label URL) items.\n" @@ -1362,7 +1405,7 @@ Beware that this completely replaces the existing contents of the file." (let ((bookmarks (with-temp-buffer (ignore-errors - (insert-file-contents (locate-user-emacs-file "elpher-bookmarks")) + (insert-file-contents elpher-bookmarks-file) (goto-char (point-min)) (read (current-buffer)))))) (if (and bookmarks (listp (cadar bookmarks))) @@ -1652,6 +1695,7 @@ When run interactively HOST-OR-URL is read from the minibuffer." (let ((map (make-sparse-keymap))) (define-key map (kbd "TAB") 'elpher-next-link) (define-key map (kbd "") 'elpher-prev-link) + (define-key map (kbd "C-M-i") 'elpher-prev-link) (define-key map (kbd "u") 'elpher-back) (define-key map [mouse-3] 'elpher-back) (define-key map (kbd "O") 'elpher-root-dir)