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.run-loop core-foundation.strings
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(FSEventStreamRef streamRef, void *clientCallBackInfo, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]);
40 TYPEDEF: void* FSEventStreamCallback
42 CONSTANT: FSEventStreamEventIdSinceNow HEX: FFFFFFFFFFFFFFFF
44 FUNCTION: FSEventStreamRef FSEventStreamCreate (
45 CFAllocatorRef allocator,
46 FSEventStreamCallback callback,
47 FSEventStreamContext* context,
48 CFArrayRef pathsToWatch,
49 FSEventStreamEventId sinceWhen,
50 CFTimeInterval latency,
51 FSEventStreamCreateFlags flags ) ;
53 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
54 CFAllocatorRef allocator,
55 FSEventStreamCallback callback,
56 FSEventStreamContext* context,
58 CFArrayRef pathsToWatchRelativeToDevice,
59 FSEventStreamEventId sinceWhen,
60 CFTimeInterval latency,
61 FSEventStreamCreateFlags flags ) ;
63 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
65 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
67 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
69 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
71 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
73 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
75 CFAbsoluteTime time ) ;
77 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
79 FSEventStreamEventId eventId ) ;
81 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
83 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
85 FUNCTION: void FSEventStreamScheduleWithRunLoop (
86 FSEventStreamRef streamRef,
88 CFStringRef runLoopMode ) ;
90 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
91 FSEventStreamRef streamRef,
93 CFStringRef runLoopMode ) ;
95 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
97 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
99 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
101 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
103 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
105 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
107 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
109 : make-FSEventStreamContext ( info -- alien )
110 FSEventStreamContext <struct>
113 :: <FSEventStream> ( callback info paths latency flags -- event-stream )
116 info make-FSEventStreamContext
117 paths <CFStringArray>
118 FSEventStreamEventIdSinceNow ! sinceWhen
121 FSEventStreamCreate ;
123 : kCFRunLoopCommonModes ( -- string )
124 &: kCFRunLoopCommonModes *void* ;
126 : schedule-event-stream ( event-stream -- )
128 kCFRunLoopCommonModes
129 FSEventStreamScheduleWithRunLoop ;
131 : unschedule-event-stream ( event-stream -- )
133 kCFRunLoopCommonModes
134 FSEventStreamUnscheduleFromRunLoop ;
136 : enable-event-stream ( event-stream -- )
138 schedule-event-stream
139 dup FSEventStreamStart [
142 dup unschedule-event-stream
144 "Cannot enable FSEventStream" throw
147 : disable-event-stream ( event-stream -- )
148 dup FSEventStreamStop
149 unschedule-event-stream ;
151 SYMBOL: event-stream-callbacks
153 : event-stream-counter ( -- n )
154 \ event-stream-counter counter ;
157 event-stream-callbacks
158 [ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-global
159 ] "core-foundation" add-init-hook
161 : add-event-source-callback ( quot -- id )
162 event-stream-counter <alien>
163 [ event-stream-callbacks get set-at ] keep ;
165 : remove-event-source-callback ( id -- )
166 event-stream-callbacks get delete-at ;
168 :: (master-event-source-callback) ( eventStream info numEvents eventPaths eventFlags eventIds -- )
169 eventPaths numEvents <direct-void*-array> [ utf8 alien>string ] { } map-as
170 eventFlags numEvents <direct-int-array>
171 eventIds numEvents <direct-longlong-array>
173 info event-stream-callbacks get at [ drop ] or call( changes -- ) ;
175 : master-event-source-callback ( -- alien )
182 "FSEventStreamEventFlags*"
183 "FSEventStreamEventId*"
185 "cdecl" [ (master-event-source-callback) ] alien-callback ;
187 TUPLE: event-stream < disposable info handle ;
189 : <event-stream> ( quot paths latency flags -- event-stream )
191 add-event-source-callback
192 [ master-event-source-callback ] keep
193 ] 3dip <FSEventStream>
194 dup enable-event-stream
195 event-stream new-disposable swap >>handle swap >>info ;
197 M: event-stream dispose*
199 [ info>> remove-event-source-callback ]
200 [ handle>> disable-event-stream ]
201 [ handle>> FSEventStreamInvalidate ]
202 [ handle>> FSEventStreamRelease ]