;; 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) #:use-module (webid-oidc client application) #:use-module ((webid-oidc client gui settings) #:prefix settings:) #:declarative? #t #:duplicates (merge-generics) #: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)) (settings:application-state (join (settings:application-state))) #t) (run)))) (add-hook! application-activated-hook (lambda (app) (timeout-add 0 200 run)))