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:
parent
f1a0715c2b
commit
02ce8fd187
@ -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*))
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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))))))
|
||||
|
@ -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) ())
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user