1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
public class AstalIO.Time : Object {
public signal void now ();
public signal void cancelled ();
private Cancellable cancellable;
private uint timeout_id;
private bool fulfilled = false;
construct {
cancellable = new Cancellable();
cancellable.cancelled.connect(() => {
if (!fulfilled) {
Source.remove(timeout_id);
cancelled();
dispose();
}
});
}
private void connect_closure(Closure? closure) {
if (closure == null)
return;
now.connect(() => {
Value ret = Value(Type.POINTER); // void
closure.invoke(ref ret, {});
});
}
public Time.interval_prio(uint interval, int prio = Priority.DEFAULT, Closure? fn) {
connect_closure(fn);
Idle.add_once(() => now());
timeout_id = Timeout.add(interval, () => {
now();
return Source.CONTINUE;
}, prio);
}
public Time.timeout_prio(uint timeout, int prio = Priority.DEFAULT, Closure? fn) {
connect_closure(fn);
timeout_id = Timeout.add(timeout, () => {
now();
fulfilled = true;
return Source.REMOVE;
}, prio);
}
public Time.idle_prio(int prio = Priority.DEFAULT_IDLE, Closure? fn) {
connect_closure(fn);
timeout_id = Idle.add(() => {
now();
fulfilled = true;
return Source.REMOVE;
}, prio);
}
public static Time interval(uint interval, Closure? fn) {
return new Time.interval_prio(interval, Priority.DEFAULT, fn);
}
public static Time timeout(uint timeout, Closure? fn) {
return new Time.timeout_prio(timeout, Priority.DEFAULT, fn);
}
public static Time idle(Closure? fn) {
return new Time.idle_prio(Priority.DEFAULT_IDLE, fn);
}
public void cancel() {
cancellable.cancel();
}
}
|