1 ! Copyright (C) 2008 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien alien.c-types alien.data alien.strings
4 alien.syntax arrays assocs classes.struct combinators
5 core-foundation core-foundation.arrays core-foundation.run-loop
6 core-foundation.strings core-foundation.time destructors init
7 io.encodings.utf8 kernel locals namespaces sequences
8 specialized-arrays unix.types ;
9 IN: core-foundation.fsevents
11 SPECIALIZED-ARRAY: void*
12 SPECIALIZED-ARRAY: uint
13 SPECIALIZED-ARRAY: ulonglong
15 CONSTANT: kFSEventStreamCreateFlagNone 0x00000000
16 CONSTANT: kFSEventStreamCreateFlagUseCFTypes 0x00000001
17 CONSTANT: kFSEventStreamCreateFlagNoDefer 0x00000002
18 CONSTANT: kFSEventStreamCreateFlagWatchRoot 0x00000004
19 CONSTANT: kFSEventStreamCreateFlagIgnoreSelf 0x00000008
20 CONSTANT: kFSEventStreamCreateFlagFileEvents 0x00000010
21 CONSTANT: kFSEventStreamCreateFlagMarkSelf 0x00000020
22 CONSTANT: kFSEventStreamCreateFlagUseExtendedData 0x00000040
23 CONSTANT: kFSEventStreamCreateFlagFullHistory 0x00000080
25 CONSTANT: kFSEventStreamEventFlagNone 0x00000000
26 CONSTANT: kFSEventStreamEventFlagMustScanSubDirs 0x00000001
27 CONSTANT: kFSEventStreamEventFlagUserDropped 0x00000002
28 CONSTANT: kFSEventStreamEventFlagKernelDropped 0x00000004
29 CONSTANT: kFSEventStreamEventFlagEventIdsWrapped 0x00000008
30 CONSTANT: kFSEventStreamEventFlagHistoryDone 0x00000010
31 CONSTANT: kFSEventStreamEventFlagRootChanged 0x00000020
32 CONSTANT: kFSEventStreamEventFlagMount 0x00000040
33 CONSTANT: kFSEventStreamEventFlagUnmount 0x00000080
34 CONSTANT: kFSEventStreamEventFlagItemCreated 0x00000100
35 CONSTANT: kFSEventStreamEventFlagItemRemoved 0x00000200
36 CONSTANT: kFSEventStreamEventFlagItemInodeMetaMod 0x00000400
37 CONSTANT: kFSEventStreamEventFlagItemRenamed 0x00000800
38 CONSTANT: kFSEventStreamEventFlagItemModified 0x00001000
39 CONSTANT: kFSEventStreamEventFlagItemFinderInfoMod 0x00002000
40 CONSTANT: kFSEventStreamEventFlagItemChangeOwner 0x00004000
41 CONSTANT: kFSEventStreamEventFlagItemXattrMod 0x00008000
42 CONSTANT: kFSEventStreamEventFlagItemIsFile 0x00010000
43 CONSTANT: kFSEventStreamEventFlagItemIsDir 0x00020000
44 CONSTANT: kFSEventStreamEventFlagItemIsSymlink 0x00040000
45 CONSTANT: kFSEventStreamEventFlagItemOwnEvent 0x00080000
46 CONSTANT: kFSEventStreamEventFlagItemIsHardlink 0x00100000
47 CONSTANT: kFSEventStreamEventFlagItemIsLastHardlink 0x00200000
48 CONSTANT: kFSEventStreamEventFlagItemCloned 0x00400000
50 TYPEDEF: uint FSEventStreamCreateFlags
51 TYPEDEF: uint FSEventStreamEventFlags
52 TYPEDEF: ulonglong FSEventStreamEventId
53 TYPEDEF: void* FSEventStreamRef
55 STRUCT: FSEventStreamContext
60 { copyDescription void* } ;
62 CALLBACK: void FSEventStreamCallback ( FSEventStreamRef streamRef, void* clientCallBackInfo, size_t numEvents, void* eventPaths, FSEventStreamEventFlags* eventFlags, FSEventStreamEventId* eventIds )
64 CONSTANT: FSEventStreamEventIdSinceNow 0xFFFFFFFFFFFFFFFF
66 FUNCTION: FSEventStreamRef FSEventStreamCreate (
67 CFAllocatorRef allocator,
68 FSEventStreamCallback callback,
69 FSEventStreamContext* context,
70 CFArrayRef pathsToWatch,
71 FSEventStreamEventId sinceWhen,
72 CFTimeInterval latency,
73 FSEventStreamCreateFlags flags )
75 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
76 CFAllocatorRef allocator,
77 FSEventStreamCallback callback,
78 FSEventStreamContext* context,
80 CFArrayRef pathsToWatchRelativeToDevice,
81 FSEventStreamEventId sinceWhen,
82 CFTimeInterval latency,
83 FSEventStreamCreateFlags flags )
85 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef )
87 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef )
89 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef )
91 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( )
93 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev )
95 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
99 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
101 FSEventStreamEventId eventId )
103 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef )
105 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef )
107 FUNCTION: void FSEventStreamScheduleWithRunLoop (
108 FSEventStreamRef streamRef,
109 CFRunLoopRef runLoop,
110 CFStringRef runLoopMode )
112 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
113 FSEventStreamRef streamRef,
114 CFRunLoopRef runLoop,
115 CFStringRef runLoopMode )
117 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef )
119 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef )
121 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef )
123 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef )
125 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef )
127 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef )
129 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef )
131 : make-FSEventStreamContext ( info -- alien )
132 FSEventStreamContext new
135 :: <FSEventStream> ( callback info paths latency flags -- event-stream )
138 info make-FSEventStreamContext
139 paths <CFStringArray>
140 FSEventStreamEventIdSinceNow ! sinceWhen
143 FSEventStreamCreate ;
145 C-GLOBAL: void* kCFRunLoopCommonModes
147 : schedule-event-stream ( event-stream -- )
149 kCFRunLoopCommonModes
150 FSEventStreamScheduleWithRunLoop ;
152 : unschedule-event-stream ( event-stream -- )
154 kCFRunLoopCommonModes
155 FSEventStreamUnscheduleFromRunLoop ;
157 : enable-event-stream ( event-stream -- )
159 schedule-event-stream
160 dup FSEventStreamStart [
163 dup unschedule-event-stream
165 "Cannot enable FSEventStream" throw
168 : disable-event-stream ( event-stream -- )
169 dup FSEventStreamStop
170 unschedule-event-stream ;
172 SYMBOL: event-stream-callbacks
174 : event-stream-counter ( -- n )
175 \ event-stream-counter counter ;
178 event-stream-callbacks
179 [ [ drop expired? ] H{ } assoc-reject-as ] change-global
180 ] "core-foundation" add-startup-hook
182 : add-event-source-callback ( quot -- id )
183 event-stream-counter <alien>
184 [ event-stream-callbacks get set-at ] keep ;
186 : remove-event-source-callback ( id -- )
187 event-stream-callbacks get delete-at ;
189 :: (master-event-source-callback) ( eventStream info numEvents eventPaths eventFlags eventIds -- )
190 eventPaths numEvents void* <c-direct-array> [ utf8 alien>string ] { } map-as
191 eventFlags numEvents uint <c-direct-array>
192 eventIds numEvents ulonglong <c-direct-array>
194 info event-stream-callbacks get at [ drop ] or call( changes -- ) ;
196 : master-event-source-callback ( -- alien )
197 [ (master-event-source-callback) ] FSEventStreamCallback ;
199 TUPLE: event-stream < disposable info handle ;
201 : <event-stream> ( quot paths latency flags -- event-stream )
203 add-event-source-callback
204 [ master-event-source-callback ] keep
205 ] 3dip <FSEventStream>
206 dup enable-event-stream
207 event-stream new-disposable swap >>handle swap >>info ;
209 M: event-stream dispose*
211 [ info>> remove-event-source-callback ]
212 [ handle>> disable-event-stream ]
213 [ handle>> FSEventStreamInvalidate ]
214 [ handle>> FSEventStreamRelease ]