1
0
mirror of https://codeberg.org/cage/tinmop/ synced 2025-02-17 08:10:36 +01:00

- [gemini] remove all pending rendering events when quitting.

This commit is contained in:
cage 2020-09-30 18:24:58 +02:00
parent f1a0715c2b
commit 02ce8fd187
6 changed files with 49 additions and 10 deletions

View File

@ -37,6 +37,13 @@
(remove stream-object *gemini-streams-db*))
*gemini-streams-db*)
(defun remove-all-db-stream ()
(map nil
(lambda (a) (abort-downloading a))
*gemini-streams-window*)
(setf *gemini-streams-db* ())
*gemini-streams-db*)
(defun find-db-stream-if (predicate)
(find-if predicate *gemini-streams-db*))

View File

@ -69,7 +69,10 @@
(defun open-message-link (url enqueue)
(if (string-starts-with-p gemini-constants:+gemini-scheme+ url)
(gemini-viewer:request url :enqueue enqueue)
(let ((event (make-instance 'program-events:gemini-push-behind-downloading-event
:priority program-events:+maximum-event-priority+)))
(program-events:push-event event)
(gemini-viewer:request url :enqueue enqueue))
(os-utils:xdg-open url)))
(defclass open-gemini-document-link-window (focus-marked-window

View File

@ -560,8 +560,10 @@
:pop-element
:find-element
:remove-element
:map-elements
:count-elements-if
:remove-element-if
:map-events
:emptyp
:with-min-queue))
@ -1246,6 +1248,8 @@
:gemini-back-event
:gemini-got-line-event
:gemini-abort-downloading-event
:gemini-push-behind-downloading-event
:gemini-abort-downloading-event
:gemini-enqueue-download-event
:get-chat-messages-event
:get-chats-event
@ -2005,6 +2009,7 @@
(:export
:push-db-stream
:remove-db-stream
:remove-all-db-stream
:find-db-stream-if
:find-db-stream-url
:ensure-just-one-stream-rendering

View File

@ -54,6 +54,8 @@
(defgeneric remove-element (object element))
(defgeneric map-elements (object function))
(defgeneric remove-element-if (object predicate))
(defgeneric count-elements-if (object predicate &key key-fn))
@ -210,3 +212,10 @@
:key (key-function object)
:test (equal-function object))))
(remove-at-pos object pos))))
(defmethod map-elements ((object priority-queue) (function function))
(with-accessors ((heap heap)) object
(loop for index from 1 below (length heap) do
(let ((element (elt heap index)))
(setf (elt heap index)
(funcall function element))))))

View File

@ -158,6 +158,10 @@
(wrapped-in-lock (*events-queue*)
(remove-element-if *events-queue* predicate)))
(defun map-events (fn)
(wrapped-in-lock (*events-queue*)
(map-elements *events-queue* fn)))
(defclass event-on-own-thread (program-event)
((lock
:initform (bt:make-recursive-lock)
@ -998,14 +1002,22 @@
(defclass gemini-abort-downloading-event (program-event) ())
(defmethod process-event ((object gemini-abort-downloading-event))
(with-accessors ((uri payload)) object
(when-let ((stream-object (gemini-viewer:find-db-stream-url uri)))
(gemini-viewer:abort-downloading stream-object)
(gemini-viewer:remove-db-stream stream-object)
(remove-event-if (lambda (a)
(and (typep a 'gemini-got-line-event)
(string= uri (gemini-viewer:download-uri stream-object)))))
(line-oriented-window:resync-rows-db specials:*gemini-streams-window*))))
(gemini-viewer:remove-all-db-stream)
(remove-event-if (lambda (a) (typep a 'gemini-got-line-event))))
(defclass gemini-push-behind-downloading-event (program-event) ())
(defmethod process-event ((object gemini-push-behind-downloading-event))
(map-events (lambda (a)
(setf (priority a) +minimum-event-priority+)
a)))
(defclass gemini-abort-all-downloading-event (program-event) ())
(defmethod process-event ((object gemini-abort-all-downloading-event))
(map-events (lambda (a)
(setf (priority a) +minimum-event-priority+)
a)))
(defclass gemini-enqueue-download-event (program-event) ())

View File

@ -59,7 +59,10 @@
(let ((delete-event (make-instance 'delete-all-status-event)))
(push-event delete-event)
(clean-temporary-files)))))
(let ((delete-count (db:count-status-marked-to-delete)))
(let ((delete-count (db:count-status-marked-to-delete))
(stop-download-event (make-instance 'gemini-abort-downloading-event
:priority +maximum-event-priority+)))
(push-event stop-download-event)
(if (> delete-count 0)
(ask-string-input #'on-input-complete
:prompt (format nil