From 8e9e19dd82000a1d67ee3bca80acbea422a08b68 Mon Sep 17 00:00:00 2001 From: cage Date: Fri, 25 Feb 2022 16:37:43 +0100 Subject: [PATCH] - added command 'gemini-jump-to-link'; - fixed layout in gemini full screen mode. --- etc/init.lisp | 2 ++ etc/shared.conf | 7 ++++++- po/it.po | 4 ++-- src/gemini-viewer.lisp | 9 ++++++++- src/message-window.lisp | 9 +++++++-- src/open-attach-window.lisp | 20 ++++++++++++++------ src/package.lisp | 4 ++++ src/program-events.lisp | 1 + src/software-configuration.lisp | 9 +++++++++ src/ui-goodies.lisp | 27 ++++++++++++++++++++++++--- 10 files changed, 77 insertions(+), 15 deletions(-) diff --git a/etc/init.lisp b/etc/init.lisp index cd5f22d..5731a59 100644 --- a/etc/init.lisp +++ b/etc/init.lisp @@ -617,6 +617,8 @@ (define-key "end" #'open-message-link-window-scroll-end *open-message-link-keymap*) +(define-key "]" #'gemini-jump-to-link *open-message-link-keymap*) + ;; chats list window (define-key "r" #'refresh-chat-messages *chats-list-keymap*) diff --git a/etc/shared.conf b/etc/shared.conf index 3d0743f..9474571 100644 --- a/etc/shared.conf +++ b/etc/shared.conf @@ -158,7 +158,12 @@ color-regexp = ":rendering" cyan # The width of the generated table of contents for gemini pages when # tinmop is ran as exclusive gemini client (command line option "-G") -gemini.exclusive.mode.toc.width = 1/5 +gemini.exclusive.mode.toc.width = 1/5 + +# The height of the links window for gemini pages when tinmop is ran as +# exclusive gemini client (command line option "-G") + +gemini.exclusive.mode.links.height = 1/4 # the signature file path relative to $HOME diff --git a/po/it.po b/po/it.po index 995ac8f..b347373 100644 --- a/po/it.po +++ b/po/it.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: tinmop 0.0.1\n" "Report-Msgid-Bugs-To: https://notabug.org/cage/tinmop/\n" "POT-Creation-Date: 2022-02-25 12:44+0100\n" -"PO-Revision-Date: 2022-02-25 12:45+0100\n" +"PO-Revision-Date: 2022-02-25 14:01+0100\n" "Last-Translator: cage \n" "Language-Team: Italian\n" "Language: it\n" @@ -869,7 +869,7 @@ msgstr[1] "Cancella ~a file temporanei? [s/N] " #: src/ui-goodies.lisp:93 #, lisp-format msgid "Quit ~a? [y/N] " -msgstr "Chiudere ~a? [s/N] " +msgstr "Chiudere ~a? [s/N] " #: src/ui-goodies.lisp:112 #, lisp-format diff --git a/src/gemini-viewer.lisp b/src/gemini-viewer.lisp index 44a25ce..5571cd4 100644 --- a/src/gemini-viewer.lisp +++ b/src/gemini-viewer.lisp @@ -94,7 +94,9 @@ (ensure-just-one-stream-rendering) (force-rendering-of-cached-file stream-object) (setf (stream-status stream-object) :completed) - (ui:open-gemini-toc)) + (ui:open-gemini-toc) + (program-events:with-enqueued-process () + (ui:open-gemini-message-link-window :give-focus nil))) ((gemini-client:text-file-stream-p meta) (ensure-just-one-stream-rendering) (force-rendering-of-cached-file stream-object) @@ -368,6 +370,10 @@ (maybe-render-toc () (when (eq (stream-status wrapper-object) :rendering) (ui:open-gemini-toc))) + (maybe-render-links () + (when (eq (stream-status wrapper-object) :rendering) + (program-events:with-enqueued-process () + (ui:open-gemini-message-link-window :give-focus nil)))) (maybe-render-preformat-wrapper (file-stream wrapper-object) (when (not gemini-format-p) (let* ((preformat-line (format nil "~a~%" gemini-parser:+preformatted-prefix+)) @@ -441,6 +447,7 @@ (ui:notify (_ "Gemini document downloading aborted")) (progn (maybe-render-toc) + (maybe-render-links) (ui:notify (_ "Gemini document downloading completed")) (setf (stream-status wrapper-object) :completed) (when (and fragment diff --git a/src/message-window.lisp b/src/message-window.lisp index 799e494..549beae 100644 --- a/src/message-window.lisp +++ b/src/message-window.lisp @@ -118,7 +118,8 @@ command-window-height reference-window-height) (- main-window-height - command-window-height))) + command-window-height + (swconf:config-gemini-fullscreen-links-height)))) (width reference-window-width) (x (if (and command-line:*gemini-full-screen-mode* *gemini-toc-window*) @@ -126,7 +127,7 @@ (win-x reference-window))) (y (if (and command-line:*gemini-full-screen-mode* *gemini-toc-window*) - 0 + (swconf:config-gemini-fullscreen-links-height) (+ (win-y reference-window) reference-window-height)))) (win-resize object width height) @@ -311,6 +312,10 @@ (row-add-original-object res original-object) res)) +(defun row-link-p (row) + (typep (row-get-original-object row) + 'gemini-parser:link-line)) + (defun row-pre-start-p (row) (typep (row-get-original-object row) 'gemini-parser:pre-start)) diff --git a/src/open-attach-window.lisp b/src/open-attach-window.lisp index fa8e911..6a018de 100644 --- a/src/open-attach-window.lisp +++ b/src/open-attach-window.lisp @@ -38,12 +38,20 @@ (selected-bg (swconf:selected-background theme-style)) (unselected-fg (swconf:unselected-foreground theme-style)) (unselected-bg (swconf:unselected-background theme-style)) - (win-w (truncate (/ (win-width specials:*main-window*) 2))) - (win-h (truncate (/ (win-height specials:*main-window*) 2))) - (x (truncate (- (/ (win-width specials:*main-window*) 2) - (/ win-w 2)))) - (y (truncate (- (/ (win-height specials:*main-window*) 2) - (/ win-h 2))))) + (reference-window (if command-line:*gemini-full-screen-mode* + *gemini-toc-window* + *thread-window*)) + (win-w (if command-line:*gemini-full-screen-mode* + (- (win-width *main-window*) + (win-width reference-window)) + (win-width reference-window))) + (win-h (if command-line:*gemini-full-screen-mode* + (swconf:config-gemini-fullscreen-links-height) + (win-height reference-window))) + (x (if command-line:*gemini-full-screen-mode* + (win-width reference-window) + (win-x reference-window))) + (y 0)) (setf (background croatoan-window) (tui:make-win-background bg)) (setf (bgcolor croatoan-window) bg) diff --git a/src/package.lisp b/src/package.lisp index fbc5d36..08d5acf 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -1242,6 +1242,7 @@ :make-tree-colormap :left-arrow :config-gemini-fullscreen-toc-width + :config-gemini-fullscreen-links-height :config-post-allowed-language :config-purge-history-days-offset :config-purge-cage-days-offset @@ -2176,6 +2177,7 @@ :viewport-width :draw-downloading-animation :visible-rows + :row-link-p :row-vertical-space-p :row-preformatted-p :row-invisible-p @@ -2694,8 +2696,10 @@ :open-message-attach-go-up :open-message-attach-go-down :open-message-attach-perform-opening + :gemini-jump-to-link :close-open-attach-window :search-link-window + :open-gemini-message-link-window :open-message-link :open-message-link-go-up :open-message-link-go-down diff --git a/src/program-events.lisp b/src/program-events.lisp index b7c1c88..c359f0c 100644 --- a/src/program-events.lisp +++ b/src/program-events.lisp @@ -1086,6 +1086,7 @@ (gemini-viewer:maybe-initialize-metadata window) (refresh-gemini-message-window links page-data ir-text nil) (ui:open-gemini-toc) + (ui:open-gemini-message-link-window :give-focus nil) (windows:draw window))))) (defclass gemini-request-event (program-event) diff --git a/src/software-configuration.lisp b/src/software-configuration.lisp index 61feb54..249a9df 100644 --- a/src/software-configuration.lisp +++ b/src/software-configuration.lisp @@ -495,6 +495,7 @@ value scheme link + links creation-time access-time visibility @@ -947,6 +948,14 @@ +key-toc+ +key-width+) +(gen-simple-access (gemini-fullscreen-links-height + :transform-value-fn main-window:parse-subwin-h) + +key-gemini+ + +key-exclusive+ + +key-mode+ + +key-links+ + +key-height+) + (gen-simple-access (post-allowed-language :transform-value-fn (lambda (a) (cl-ppcre:create-scanner a :case-insensitive-mode t))) diff --git a/src/ui-goodies.lisp b/src/ui-goodies.lisp index dd53171..6e9c5cf 100644 --- a/src/ui-goodies.lisp +++ b/src/ui-goodies.lisp @@ -460,7 +460,6 @@ Metadata includes: (list *send-message-window* *follow-requests-window* *open-attach-window* - *open-message-link-window* *gemini-streams-window* *gemini-certificates-window* *filesystem-explorer-window*))) @@ -1241,12 +1240,13 @@ If some posts was deleted before, download them again." :prompt (_ "Search key: ") :complete-fn #'complete:complete-always-empty))) -(defun open-gemini-message-link-window () +(defun open-gemini-message-link-window (&key (give-focus t)) (let* ((window *message-window*) (metadata (message-window:metadata window)) (links (gemini-viewer:gemini-metadata-links metadata))) (open-message-link-window:init-gemini-links links) - (focus-to-open-message-link-window))) + (when give-focus + (focus-to-open-message-link-window)))) (defun open-message-link () "Open message links window @@ -1324,6 +1324,27 @@ Browse and optionally open the links the text of the message window contains." (url (line-oriented-window:normal-text selected-line))) (open-message-link-window:open-message-link url enqueue))) +(defun gemini-jump-to-link () + (when-let* ((link-win *open-message-link-window*) + (message-win *message-window*) + (selected-line (line-oriented-window:selected-row link-win)) + (selected-position (line-oriented-window:rows-position-if link-win + (lambda (a) + (eq a selected-line))))) + (when (message-window:gemini-window-p* message-win) + (let ((count-link 0) + (count-rows 0) + (selected-message-row-position -1)) + (line-oriented-window:do-rows-raw (message-win row) + (when (message-window:row-link-p row) + (when (= count-link selected-position) + (setf selected-message-row-position count-rows)) + (incf count-link)) + (incf count-rows)) + (when (> selected-message-row-position 0) + (line-oriented-window:select-row message-win selected-message-row-position) + (draw message-win)))))) + (defun open-message-link-perform-opening () (%open-message-link-perform-opening nil))