From 1e314dc8c55c94f977b8ea07e5e6e448d13d870f Mon Sep 17 00:00:00 2001 From: Vivien Kraus Date: Mon, 4 Oct 2021 16:24:42 +0200 Subject: gui: add a function to insert code to run in the main thread --- src/scm/webid-oidc/client/gui/clock.scm | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/scm/webid-oidc/client/gui/clock.scm (limited to 'src/scm/webid-oidc/client/gui/clock.scm') diff --git a/src/scm/webid-oidc/client/gui/clock.scm b/src/scm/webid-oidc/client/gui/clock.scm new file mode 100644 index 0000000..efb7ce8 --- /dev/null +++ b/src/scm/webid-oidc/client/gui/clock.scm @@ -0,0 +1,45 @@ +;; disfluid, implementation of the Solid specification +;; Copyright (C) 2021 Vivien Kraus + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU Affero General Public License as +;; published by the Free Software Foundation, either version 3 of the +;; License, or (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU Affero General Public License for more details. + +;; You should have received a copy of the GNU Affero General Public License +;; along with this program. If not, see . + +(define-module (webid-oidc client gui clock) + #:use-module (gi) + #:use-module (gi types) + #:use-module (gi util) + #:use-module (ice-9 atomic) + #:use-module (webid-oidc client gui application-hooks) + #:declarative? #t + #:export (wait)) + +(use-typelibs ("GLib" "2.0")) + +(define pending-ops (make-atomic-box '())) + +(define (wait f) + (let ((old (atomic-box-ref pending-ops))) + (unless (eq? old (atomic-box-compare-and-swap! pending-ops old `(,f ,@old))) + (wait f)))) + +(define (run . _) + (let ((old (atomic-box-ref pending-ops))) + (if (eq? old (atomic-box-compare-and-swap! pending-ops old '())) + (begin + (for-each (lambda (f) (f)) (reverse old)) + #t) + (run)))) + +(add-hook! application-activated-hook + (lambda (app) + (timeout-add 0 200 run))) -- cgit v1.2.3