From 40f6f0642a81c7c97a1044029fae67dd76b77bcd Mon Sep 17 00:00:00 2001 From: cage Date: Fri, 8 Oct 2021 11:55:16 +0200 Subject: [PATCH] - forced scrolling to the last message when a new message has been posted on the chat window; - added 'message-window-lock-scrolling' and 'message-window-unlock-scrolling' allowing users to choose their preferered way to render the gemini text (this is useful for gemini streaming services, like chat or similar). --- etc/init.lisp | 4 ++++ src/line-oriented-window.lisp | 6 ++++++ src/package.lisp | 5 ++++- src/program-events.lisp | 2 ++ src/ui-goodies.lisp | 8 ++++++++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/etc/init.lisp b/etc/init.lisp index c40bf7a..64035ed 100644 --- a/etc/init.lisp +++ b/etc/init.lisp @@ -173,6 +173,10 @@ (define-key "M-up" #'pass-focus-on-top) +(define-key "M-l" #'message-window-lock-scrolling) + +(define-key "M-u" #'message-window-unlock-scrolling) + ;; focus (define-key "f1" #'focus-to-tags-window) diff --git a/src/line-oriented-window.lisp b/src/line-oriented-window.lisp index 6436dcf..e9e5796 100644 --- a/src/line-oriented-window.lisp +++ b/src/line-oriented-window.lisp @@ -135,6 +135,8 @@ (defgeneric select-first-row (object)) +(defgeneric adjust-selected-rows (object strategy)) + (defgeneric selected-row (object)) (defgeneric selected-row-fields (object)) @@ -241,6 +243,10 @@ height)))))) window) +(defmethod adjust-selected-rows ((object row-oriented-widget) (strategy function)) + (funcall strategy object) + object) + (defmethod selected-row ((object row-oriented-widget)) "Return the current selected row" (with-accessors ((rows rows) diff --git a/src/package.lisp b/src/package.lisp index fb0d167..d2f8b32 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -1935,6 +1935,7 @@ :unselect-all :select-row :select-first-row + :adjust-selected-rows :adjust-rows-noop :adjust-rows-select-first :adjust-rows-select-last @@ -2702,7 +2703,9 @@ :gempub-library-window-go-up :gempub-library-window-go-down :gempub-library-window-close - :gempub-open-file)) + :gempub-open-file + :message-window-lock-scrolling + :message-window-unlock-scrolling)) (defpackage :scheduled-events (:use diff --git a/src/program-events.lisp b/src/program-events.lisp index 3cd2211..f263c9e 100644 --- a/src/program-events.lisp +++ b/src/program-events.lisp @@ -1491,6 +1491,8 @@ (message-window:scroll-end specials:*message-window*) (setf (message-window:metadata specials:*message-window*) chat) + (line-oriented-window:adjust-selected-rows specials:*message-window* + #'line-oriented-window:adjust-rows-select-last) (windows:draw specials:*message-window*)))) (defclass chat-post-message-event (program-event) diff --git a/src/ui-goodies.lisp b/src/ui-goodies.lisp index e4b7371..8b7013f 100644 --- a/src/ui-goodies.lisp +++ b/src/ui-goodies.lisp @@ -2274,3 +2274,11 @@ gemini page the program is rendering." (when-let* ((fields (line-oriented-window:selected-row-fields *gempub-library-window*)) (iri-to-open (db:row-local-uri fields))) (gemini-viewer:load-gemini-url iri-to-open :give-focus-to-message-window t))) + +(defun message-window-lock-scrolling () + (setf (message-window:adjust-rows-strategy specials:*message-window*) + #'line-oriented-window:adjust-rows-noop)) + +(defun message-window-unlock-scrolling () + (setf (message-window:adjust-rows-strategy specials:*message-window*) + #'line-oriented-window:adjust-rows-select-last))