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
9 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
10 ! FSEventStream API, Leopard only !
11 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
13 : kFSEventStreamCreateFlagUseCFTypes 2 ; inline
14 : kFSEventStreamCreateFlagWatchRoot 4 ; inline
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
25 TYPEDEF: int FSEventStreamCreateFlags
26 TYPEDEF: int FSEventStreamEventFlags
27 TYPEDEF: longlong FSEventStreamEventId
28 TYPEDEF: void* FSEventStreamRef
30 C-STRUCT: FSEventStreamContext
31 { "CFIndex" "version" }
35 { "void*" "copyDescription" } ;
37 ! callback(FSEventStreamRef streamRef, void *clientCallBackInfo, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]);
38 TYPEDEF: void* FSEventStreamCallback
40 : FSEventStreamEventIdSinceNow HEX: FFFFFFFFFFFFFFFF ; inline
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 ) ;
51 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
52 CFAllocatorRef allocator,
53 FSEventStreamCallback callback,
54 FSEventStreamContext* context,
56 CFArrayRef pathsToWatchRelativeToDevice,
57 FSEventStreamEventId sinceWhen,
58 CFTimeInterval latency,
59 FSEventStreamCreateFlags flags ) ;
61 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
63 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
65 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
67 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
69 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
71 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
73 CFAbsoluteTime time ) ;
75 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
77 FSEventStreamEventId eventId ) ;
79 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
81 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
83 FUNCTION: void FSEventStreamScheduleWithRunLoop (
84 FSEventStreamRef streamRef,
86 CFStringRef runLoopMode ) ;
88 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
89 FSEventStreamRef streamRef,
91 CFStringRef runLoopMode ) ;
93 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
95 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
97 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
99 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
101 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
103 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
105 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
107 : make-FSEventStreamContext ( info -- alien )
108 "FSEventStreamContext" <c-object>
109 [ set-FSEventStreamContext-info ] keep ;
111 : <FSEventStream> ( callback info paths latency flags -- event-stream )
115 r> make-FSEventStreamContext
116 r> <CFStringArray> ! paths
117 FSEventStreamEventIdSinceNow ! sinceWhen
120 FSEventStreamCreate ;
122 : kCFRunLoopCommonModes ( -- string )
123 "kCFRunLoopCommonModes" f dlsym *void* ;
125 : schedule-event-stream ( event-stream -- )
127 kCFRunLoopCommonModes
128 FSEventStreamScheduleWithRunLoop ;
130 : unschedule-event-stream ( event-stream -- )
132 kCFRunLoopCommonModes
133 FSEventStreamUnscheduleFromRunLoop ;
135 : enable-event-stream ( event-stream -- )
137 schedule-event-stream
138 dup FSEventStreamStart [
141 dup unschedule-event-stream
143 "Cannot enable FSEventStream" throw
146 : disable-event-stream ( event-stream -- )
147 dup FSEventStreamStop
148 unschedule-event-stream ;
150 SYMBOL: event-stream-callbacks
152 : event-stream-counter ( -- n )
153 \ event-stream-counter counter ;
156 event-stream-callbacks global
157 [ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-at
158 ] "core-foundation" add-init-hook
160 : add-event-source-callback ( quot -- id )
161 event-stream-counter <alien>
162 [ event-stream-callbacks get set-at ] keep ;
164 : remove-event-source-callback ( id -- )
165 event-stream-callbacks get delete-at ;
167 : >event-triple ( n eventPaths eventFlags eventIds -- triple )
170 r> void*-nth utf8 alien>string ,
175 : master-event-source-callback ( -- alien )
182 "FSEventStreamEventFlags*"
183 "FSEventStreamEventId*"
186 [ >event-triple ] 3curry map
187 swap event-stream-callbacks get at
188 dup [ call drop ] [ 3drop ] if
191 TUPLE: event-stream info handle disposed ;
193 : <event-stream> ( quot paths latency flags -- event-stream )
195 add-event-source-callback dup
196 >r master-event-source-callback r>
197 r> r> r> <FSEventStream>
198 dup enable-event-stream
201 M: event-stream dispose*
203 [ info>> remove-event-source-callback ]
204 [ handle>> disable-event-stream ]
205 [ handle>> FSEventStreamInvalidate ]
206 [ handle>> FSEventStreamRelease ]