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 make assocs init accessors
5 continuations combinators io.encodings.utf8 destructors locals
6 arrays specialized-arrays classes.struct core-foundation
7 core-foundation.arrays core-foundation.run-loop
8 core-foundation.strings core-foundation.time unix.types ;
9 IN: core-foundation.fsevents
11 SPECIALIZED-ARRAY: void*
12 SPECIALIZED-ARRAY: int
13 SPECIALIZED-ARRAY: longlong
15 CONSTANT: kFSEventStreamCreateFlagUseCFTypes 2
16 CONSTANT: kFSEventStreamCreateFlagWatchRoot 4
18 CONSTANT: kFSEventStreamEventFlagMustScanSubDirs 1
19 CONSTANT: kFSEventStreamEventFlagUserDropped 2
20 CONSTANT: kFSEventStreamEventFlagKernelDropped 4
21 CONSTANT: kFSEventStreamEventFlagEventIdsWrapped 8
22 CONSTANT: kFSEventStreamEventFlagHistoryDone 16
23 CONSTANT: kFSEventStreamEventFlagRootChanged 32
24 CONSTANT: kFSEventStreamEventFlagMount 64
25 CONSTANT: kFSEventStreamEventFlagUnmount 128
27 TYPEDEF: int FSEventStreamCreateFlags
28 TYPEDEF: int FSEventStreamEventFlags
29 TYPEDEF: longlong FSEventStreamEventId
30 TYPEDEF: void* FSEventStreamRef
32 STRUCT: FSEventStreamContext
37 { copyDescription void* } ;
39 CALLBACK: void FSEventStreamCallback ( FSEventStreamRef streamRef, void* clientCallBackInfo, size_t numEvents, void* eventPaths, FSEventStreamEventFlags* eventFlags, FSEventStreamEventId* eventIds ) ;
41 CONSTANT: FSEventStreamEventIdSinceNow HEX: FFFFFFFFFFFFFFFF
43 FUNCTION: FSEventStreamRef FSEventStreamCreate (
44 CFAllocatorRef allocator,
45 FSEventStreamCallback callback,
46 FSEventStreamContext* context,
47 CFArrayRef pathsToWatch,
48 FSEventStreamEventId sinceWhen,
49 CFTimeInterval latency,
50 FSEventStreamCreateFlags flags ) ;
52 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
53 CFAllocatorRef allocator,
54 FSEventStreamCallback callback,
55 FSEventStreamContext* context,
57 CFArrayRef pathsToWatchRelativeToDevice,
58 FSEventStreamEventId sinceWhen,
59 CFTimeInterval latency,
60 FSEventStreamCreateFlags flags ) ;
62 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
64 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
66 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
68 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
70 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
72 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
74 CFAbsoluteTime time ) ;
76 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
78 FSEventStreamEventId eventId ) ;
80 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
82 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
84 FUNCTION: void FSEventStreamScheduleWithRunLoop (
85 FSEventStreamRef streamRef,
87 CFStringRef runLoopMode ) ;
89 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
90 FSEventStreamRef streamRef,
92 CFStringRef runLoopMode ) ;
94 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
96 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
98 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
100 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
102 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
104 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
106 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
108 : make-FSEventStreamContext ( info -- alien )
109 FSEventStreamContext <struct>
112 :: <FSEventStream> ( callback info paths latency flags -- event-stream )
115 info make-FSEventStreamContext
116 paths <CFStringArray>
117 FSEventStreamEventIdSinceNow ! sinceWhen
120 FSEventStreamCreate ;
122 C-GLOBAL: void* kCFRunLoopCommonModes
124 : schedule-event-stream ( event-stream -- )
126 kCFRunLoopCommonModes
127 FSEventStreamScheduleWithRunLoop ;
129 : unschedule-event-stream ( event-stream -- )
131 kCFRunLoopCommonModes
132 FSEventStreamUnscheduleFromRunLoop ;
134 : enable-event-stream ( event-stream -- )
136 schedule-event-stream
137 dup FSEventStreamStart [
140 dup unschedule-event-stream
142 "Cannot enable FSEventStream" throw
145 : disable-event-stream ( event-stream -- )
146 dup FSEventStreamStop
147 unschedule-event-stream ;
149 SYMBOL: event-stream-callbacks
151 : event-stream-counter ( -- n )
152 \ event-stream-counter counter ;
155 event-stream-callbacks
156 [ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-global
157 ] "core-foundation" add-startup-hook
159 : add-event-source-callback ( quot -- id )
160 event-stream-counter <alien>
161 [ event-stream-callbacks get set-at ] keep ;
163 : remove-event-source-callback ( id -- )
164 event-stream-callbacks get delete-at ;
166 :: (master-event-source-callback) ( eventStream info numEvents eventPaths eventFlags eventIds -- )
167 eventPaths numEvents <direct-void*-array> [ utf8 alien>string ] { } map-as
168 eventFlags numEvents <direct-int-array>
169 eventIds numEvents <direct-longlong-array>
171 info event-stream-callbacks get at [ drop ] or call( changes -- ) ;
173 : master-event-source-callback ( -- alien )
174 [ (master-event-source-callback) ] FSEventStreamCallback ;
176 TUPLE: event-stream < disposable info handle ;
178 : <event-stream> ( quot paths latency flags -- event-stream )
180 add-event-source-callback
181 [ master-event-source-callback ] keep
182 ] 3dip <FSEventStream>
183 dup enable-event-stream
184 event-stream new-disposable swap >>handle swap >>info ;
186 M: event-stream dispose*
188 [ info>> remove-event-source-callback ]
189 [ handle>> disable-event-stream ]
190 [ handle>> FSEventStreamInvalidate ]
191 [ handle>> FSEventStreamRelease ]