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 ;
9 IN: core-foundation.fsevents
11 : kFSEventStreamCreateFlagUseCFTypes 2 ; inline
12 : kFSEventStreamCreateFlagWatchRoot 4 ; inline
14 : kFSEventStreamEventFlagMustScanSubDirs 1 ; inline
15 : kFSEventStreamEventFlagUserDropped 2 ; inline
16 : kFSEventStreamEventFlagKernelDropped 4 ; inline
17 : kFSEventStreamEventFlagEventIdsWrapped 8 ; inline
18 : kFSEventStreamEventFlagHistoryDone 16 ; inline
19 : kFSEventStreamEventFlagRootChanged 32 ; inline
20 : kFSEventStreamEventFlagMount 64 ; inline
21 : kFSEventStreamEventFlagUnmount 128 ; inline
23 TYPEDEF: int FSEventStreamCreateFlags
24 TYPEDEF: int FSEventStreamEventFlags
25 TYPEDEF: longlong FSEventStreamEventId
26 TYPEDEF: void* FSEventStreamRef
28 C-STRUCT: FSEventStreamContext
29 { "CFIndex" "version" }
33 { "void*" "copyDescription" } ;
35 ! callback(FSEventStreamRef streamRef, void *clientCallBackInfo, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]);
36 TYPEDEF: void* FSEventStreamCallback
38 : FSEventStreamEventIdSinceNow HEX: FFFFFFFFFFFFFFFF ; inline
40 FUNCTION: FSEventStreamRef FSEventStreamCreate (
41 CFAllocatorRef allocator,
42 FSEventStreamCallback callback,
43 FSEventStreamContext* context,
44 CFArrayRef pathsToWatch,
45 FSEventStreamEventId sinceWhen,
46 CFTimeInterval latency,
47 FSEventStreamCreateFlags flags ) ;
49 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
50 CFAllocatorRef allocator,
51 FSEventStreamCallback callback,
52 FSEventStreamContext* context,
54 CFArrayRef pathsToWatchRelativeToDevice,
55 FSEventStreamEventId sinceWhen,
56 CFTimeInterval latency,
57 FSEventStreamCreateFlags flags ) ;
59 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
61 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
63 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
65 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
67 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
69 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
71 CFAbsoluteTime time ) ;
73 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
75 FSEventStreamEventId eventId ) ;
77 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
79 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
81 FUNCTION: void FSEventStreamScheduleWithRunLoop (
82 FSEventStreamRef streamRef,
84 CFStringRef runLoopMode ) ;
86 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
87 FSEventStreamRef streamRef,
89 CFStringRef runLoopMode ) ;
91 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
93 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
95 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
97 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
99 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
101 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
103 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
105 : make-FSEventStreamContext ( info -- alien )
106 "FSEventStreamContext" <c-object>
107 [ set-FSEventStreamContext-info ] keep ;
109 :: <FSEventStream> ( callback info paths latency flags -- event-stream )
112 info make-FSEventStreamContext
113 paths <CFStringArray>
114 FSEventStreamEventIdSinceNow ! sinceWhen
117 FSEventStreamCreate ;
119 : kCFRunLoopCommonModes ( -- string )
120 &: kCFRunLoopCommonModes *void* ;
122 : schedule-event-stream ( event-stream -- )
124 kCFRunLoopCommonModes
125 FSEventStreamScheduleWithRunLoop ;
127 : unschedule-event-stream ( event-stream -- )
129 kCFRunLoopCommonModes
130 FSEventStreamUnscheduleFromRunLoop ;
132 : enable-event-stream ( event-stream -- )
134 schedule-event-stream
135 dup FSEventStreamStart [
138 dup unschedule-event-stream
140 "Cannot enable FSEventStream" throw
143 : disable-event-stream ( event-stream -- )
144 dup FSEventStreamStop
145 unschedule-event-stream ;
147 SYMBOL: event-stream-callbacks
149 : event-stream-counter ( -- n )
150 \ event-stream-counter counter ;
153 event-stream-callbacks global
154 [ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-at
155 ] "core-foundation" add-init-hook
157 : add-event-source-callback ( quot -- id )
158 event-stream-counter <alien>
159 [ event-stream-callbacks get set-at ] keep ;
161 : remove-event-source-callback ( id -- )
162 event-stream-callbacks get delete-at ;
164 :: (master-event-source-callback) ( eventStream info numEvents eventPaths eventFlags eventIds -- )
165 eventPaths numEvents <direct-void*-array> [ utf8 alien>string ] { } map-as
166 eventFlags numEvents <direct-int-array>
167 eventIds numEvents <direct-longlong-array>
169 info event-stream-callbacks get at [ drop ] or call ;
171 : master-event-source-callback ( -- alien )
178 "FSEventStreamEventFlags*"
179 "FSEventStreamEventId*"
181 "cdecl" [ (master-event-source-callback) ] alien-callback ;
183 TUPLE: event-stream info handle disposed ;
185 : <event-stream> ( quot paths latency flags -- event-stream )
187 add-event-source-callback dup
188 [ master-event-source-callback ] dip
189 ] 3dip <FSEventStream>
190 dup enable-event-stream
193 M: event-stream dispose*
195 [ info>> remove-event-source-callback ]
196 [ handle>> disable-event-stream ]
197 [ handle>> FSEventStreamInvalidate ]
198 [ handle>> FSEventStreamRelease ]