summaryrefslogtreecommitdiff
path: root/src/scm/webid-oidc/client/gui/clock.scm
diff options
context:
space:
mode:
Diffstat (limited to 'src/scm/webid-oidc/client/gui/clock.scm')
-rw-r--r--src/scm/webid-oidc/client/gui/clock.scm45
1 files changed, 45 insertions, 0 deletions
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 <https://www.gnu.org/licenses/>.
+
+(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)))