]> gitweb.factorcode.org Git - factor.git/blob - basis/core-foundation/fsevents/fsevents.factor
f14dba643377d94250b5cd7a93591ed4f8961ae5
[factor.git] / basis / core-foundation / fsevents / fsevents.factor
1 ! Copyright (C) 2008 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien alien.c-types alien.strings alien.syntax kernel
4 math sequences namespaces assocs init accessors continuations
5 combinators core-foundation core-foundation.run-loop
6 io.encodings.utf8 destructors ;
7 IN: core-foundation.fsevents
8
9 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
10 ! FSEventStream API, Leopard only !
11 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
12
13 : kFSEventStreamCreateFlagUseCFTypes 2 ; inline
14 : kFSEventStreamCreateFlagWatchRoot 4 ; inline
15
16 : kFSEventStreamEventFlagMustScanSubDirs 1 ; inline
17 : kFSEventStreamEventFlagUserDropped 2 ; inline
18 : kFSEventStreamEventFlagKernelDropped 4 ; inline
19 : kFSEventStreamEventFlagEventIdsWrapped 8 ; inline
20 : kFSEventStreamEventFlagHistoryDone 16 ; inline
21 : kFSEventStreamEventFlagRootChanged 32 ; inline
22 : kFSEventStreamEventFlagMount 64 ; inline
23 : kFSEventStreamEventFlagUnmount 128 ; inline
24
25 TYPEDEF: int FSEventStreamCreateFlags
26 TYPEDEF: int FSEventStreamEventFlags
27 TYPEDEF: longlong FSEventStreamEventId
28 TYPEDEF: void* FSEventStreamRef
29
30 C-STRUCT: FSEventStreamContext
31     { "CFIndex" "version" }
32     { "void*" "info" }
33     { "void*" "retain" }
34     { "void*" "release" }
35     { "void*" "copyDescription" } ;
36
37 ! callback(FSEventStreamRef streamRef, void *clientCallBackInfo, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]);
38 TYPEDEF: void* FSEventStreamCallback
39
40 : FSEventStreamEventIdSinceNow HEX: FFFFFFFFFFFFFFFF ; inline
41
42 FUNCTION: FSEventStreamRef FSEventStreamCreate (
43     CFAllocatorRef           allocator,
44     FSEventStreamCallback    callback,
45     FSEventStreamContext*    context,
46     CFArrayRef               pathsToWatch,
47     FSEventStreamEventId     sinceWhen,
48     CFTimeInterval           latency,
49     FSEventStreamCreateFlags flags ) ;
50
51 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
52     CFAllocatorRef           allocator,
53     FSEventStreamCallback    callback,
54     FSEventStreamContext*    context,
55     dev_t                    deviceToWatch,
56     CFArrayRef               pathsToWatchRelativeToDevice,
57     FSEventStreamEventId     sinceWhen,
58     CFTimeInterval           latency,
59     FSEventStreamCreateFlags flags ) ;
60
61 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
62
63 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
64
65 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
66
67 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
68
69 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
70
71 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
72     dev_t          dev,
73     CFAbsoluteTime time ) ;
74
75 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
76     dev_t                dev,
77     FSEventStreamEventId eventId ) ;
78
79 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
80
81 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
82
83 FUNCTION: void FSEventStreamScheduleWithRunLoop (
84     FSEventStreamRef streamRef,
85     CFRunLoopRef     runLoop,
86     CFStringRef      runLoopMode ) ;
87
88 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
89     FSEventStreamRef streamRef,
90     CFRunLoopRef     runLoop,
91     CFStringRef      runLoopMode ) ;
92
93 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
94
95 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
96
97 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
98
99 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
100
101 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
102
103 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
104
105 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
106
107 : make-FSEventStreamContext ( info -- alien )
108     "FSEventStreamContext" <c-object>
109     [ set-FSEventStreamContext-info ] keep ;
110
111 : <FSEventStream> ( callback info paths latency flags -- event-stream )
112     >r >r >r >r >r
113     f ! allocator
114     r> ! callback
115     r> make-FSEventStreamContext
116     r> <CFStringArray> ! paths
117     FSEventStreamEventIdSinceNow ! sinceWhen
118     r> ! latency
119     r> ! flags
120     FSEventStreamCreate ;
121
122 : kCFRunLoopCommonModes ( -- string )
123     "kCFRunLoopCommonModes" f dlsym *void* ;
124
125 : schedule-event-stream ( event-stream -- )
126     CFRunLoopGetMain
127     kCFRunLoopCommonModes
128     FSEventStreamScheduleWithRunLoop ;
129
130 : unschedule-event-stream ( event-stream -- )
131     CFRunLoopGetMain
132     kCFRunLoopCommonModes
133     FSEventStreamUnscheduleFromRunLoop ;
134
135 : enable-event-stream ( event-stream -- )
136     dup
137     schedule-event-stream
138     dup FSEventStreamStart [
139         drop
140     ] [
141         dup unschedule-event-stream
142         FSEventStreamRelease
143         "Cannot enable FSEventStream" throw
144     ] if ;
145
146 : disable-event-stream ( event-stream -- )
147     dup FSEventStreamStop
148     unschedule-event-stream ;
149
150 SYMBOL: event-stream-callbacks
151
152 : event-stream-counter ( -- n )
153     \ event-stream-counter counter ;
154
155 [
156     event-stream-callbacks global
157     [ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-at
158 ] "core-foundation" add-init-hook
159
160 : add-event-source-callback ( quot -- id )
161     event-stream-counter <alien>
162     [ event-stream-callbacks get set-at ] keep ;
163
164 : remove-event-source-callback ( id -- )
165     event-stream-callbacks get delete-at ;
166
167 : >event-triple ( n eventPaths eventFlags eventIds -- triple )
168     [
169         >r >r >r dup dup
170         r> void*-nth utf8 alien>string ,
171         r> int-nth ,
172         r> longlong-nth ,
173     ] { } make ;
174
175 : master-event-source-callback ( -- alien )
176     "void"
177     {
178         "FSEventStreamRef"
179         "void*"                     ! info
180         "size_t"                    ! numEvents
181         "void*"                     ! eventPaths
182         "FSEventStreamEventFlags*"
183         "FSEventStreamEventId*"
184     }
185     "cdecl" [
186         [ >event-triple ] 3curry map
187         swap event-stream-callbacks get at
188         dup [ call drop ] [ 3drop ] if
189     ] alien-callback ;
190
191 TUPLE: event-stream info handle disposed ;
192
193 : <event-stream> ( quot paths latency flags -- event-stream )
194     >r >r >r
195     add-event-source-callback dup
196     >r master-event-source-callback r>
197     r> r> r> <FSEventStream>
198     dup enable-event-stream
199     f event-stream boa ;
200
201 M: event-stream dispose*
202     {
203         [ info>> remove-event-source-callback ]
204         [ handle>> disable-event-stream ]
205         [ handle>> FSEventStreamInvalidate ]
206         [ handle>> FSEventStreamRelease ]
207     } cleave ;