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.direct.alien
7 specialized-arrays.direct.int specialized-arrays.direct.longlong
8 core-foundation core-foundation.run-loop core-foundation.strings
10 IN: core-foundation.fsevents
12 CONSTANT: kFSEventStreamCreateFlagUseCFTypes 2
13 CONSTANT: kFSEventStreamCreateFlagWatchRoot 4
15 CONSTANT: kFSEventStreamEventFlagMustScanSubDirs 1
16 CONSTANT: kFSEventStreamEventFlagUserDropped 2
17 CONSTANT: kFSEventStreamEventFlagKernelDropped 4
18 CONSTANT: kFSEventStreamEventFlagEventIdsWrapped 8
19 CONSTANT: kFSEventStreamEventFlagHistoryDone 16
20 CONSTANT: kFSEventStreamEventFlagRootChanged 32
21 CONSTANT: kFSEventStreamEventFlagMount 64
22 CONSTANT: kFSEventStreamEventFlagUnmount 128
24 TYPEDEF: int FSEventStreamCreateFlags
25 TYPEDEF: int FSEventStreamEventFlags
26 TYPEDEF: longlong FSEventStreamEventId
27 TYPEDEF: void* FSEventStreamRef
29 C-STRUCT: FSEventStreamContext
30 { "CFIndex" "version" }
34 { "void*" "copyDescription" } ;
36 ! callback(FSEventStreamRef streamRef, void *clientCallBackInfo, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]);
37 TYPEDEF: void* FSEventStreamCallback
39 CONSTANT: FSEventStreamEventIdSinceNow HEX: FFFFFFFFFFFFFFFF
41 FUNCTION: FSEventStreamRef FSEventStreamCreate (
42 CFAllocatorRef allocator,
43 FSEventStreamCallback callback,
44 FSEventStreamContext* context,
45 CFArrayRef pathsToWatch,
46 FSEventStreamEventId sinceWhen,
47 CFTimeInterval latency,
48 FSEventStreamCreateFlags flags ) ;
50 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
51 CFAllocatorRef allocator,
52 FSEventStreamCallback callback,
53 FSEventStreamContext* context,
55 CFArrayRef pathsToWatchRelativeToDevice,
56 FSEventStreamEventId sinceWhen,
57 CFTimeInterval latency,
58 FSEventStreamCreateFlags flags ) ;
60 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
62 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
64 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
66 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
68 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
70 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
72 CFAbsoluteTime time ) ;
74 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
76 FSEventStreamEventId eventId ) ;
78 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
80 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
82 FUNCTION: void FSEventStreamScheduleWithRunLoop (
83 FSEventStreamRef streamRef,
85 CFStringRef runLoopMode ) ;
87 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
88 FSEventStreamRef streamRef,
90 CFStringRef runLoopMode ) ;
92 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
94 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
96 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
98 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
100 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
102 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
104 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
106 : make-FSEventStreamContext ( info -- alien )
107 "FSEventStreamContext" <c-object>
108 [ set-FSEventStreamContext-info ] keep ;
110 :: <FSEventStream> ( callback info paths latency flags -- event-stream )
113 info make-FSEventStreamContext
114 paths <CFStringArray>
115 FSEventStreamEventIdSinceNow ! sinceWhen
118 FSEventStreamCreate ;
120 : kCFRunLoopCommonModes ( -- string )
121 &: kCFRunLoopCommonModes *void* ;
123 : schedule-event-stream ( event-stream -- )
125 kCFRunLoopCommonModes
126 FSEventStreamScheduleWithRunLoop ;
128 : unschedule-event-stream ( event-stream -- )
130 kCFRunLoopCommonModes
131 FSEventStreamUnscheduleFromRunLoop ;
133 : enable-event-stream ( event-stream -- )
135 schedule-event-stream
136 dup FSEventStreamStart [
139 dup unschedule-event-stream
141 "Cannot enable FSEventStream" throw
144 : disable-event-stream ( event-stream -- )
145 dup FSEventStreamStop
146 unschedule-event-stream ;
148 SYMBOL: event-stream-callbacks
150 : event-stream-counter ( -- n )
151 \ event-stream-counter counter ;
154 event-stream-callbacks
155 [ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-global
156 ] "core-foundation" add-init-hook
158 : add-event-source-callback ( quot -- id )
159 event-stream-counter <alien>
160 [ event-stream-callbacks get set-at ] keep ;
162 : remove-event-source-callback ( id -- )
163 event-stream-callbacks get delete-at ;
165 :: (master-event-source-callback) ( eventStream info numEvents eventPaths eventFlags eventIds -- )
166 eventPaths numEvents <direct-void*-array> [ utf8 alien>string ] { } map-as
167 eventFlags numEvents <direct-int-array>
168 eventIds numEvents <direct-longlong-array>
170 info event-stream-callbacks get at [ drop ] or call( changes -- ) ;
172 : master-event-source-callback ( -- alien )
179 "FSEventStreamEventFlags*"
180 "FSEventStreamEventId*"
182 "cdecl" [ (master-event-source-callback) ] alien-callback ;
184 TUPLE: event-stream < disposable info handle ;
186 : <event-stream> ( quot paths latency flags -- event-stream )
188 add-event-source-callback
189 [ master-event-source-callback ] keep
190 ] 3dip <FSEventStream>
191 dup enable-event-stream
192 event-stream new-disposable swap >>handle swap >>info ;
194 M: event-stream dispose*
196 [ info>> remove-event-source-callback ]
197 [ handle>> disable-event-stream ]
198 [ handle>> FSEventStreamInvalidate ]
199 [ handle>> FSEventStreamRelease ]