]> gitweb.factorcode.org Git - factor.git/blob - basis/core-foundation/fsevents/fsevents.factor
factor: trim using lists
[factor.git] / basis / core-foundation / fsevents / fsevents.factor
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 namespaces sequences
8 specialized-arrays unix.types ;
9 IN: core-foundation.fsevents
10
11 SPECIALIZED-ARRAY: void*
12 SPECIALIZED-ARRAY: uint
13 SPECIALIZED-ARRAY: ulonglong
14
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
24
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
49
50 TYPEDEF: uint FSEventStreamCreateFlags
51 TYPEDEF: uint FSEventStreamEventFlags
52 TYPEDEF: ulonglong FSEventStreamEventId
53 TYPEDEF: void* FSEventStreamRef
54
55 STRUCT: FSEventStreamContext
56     { version CFIndex }
57     { info void* }
58     { retain void* }
59     { release void* }
60     { copyDescription void* } ;
61
62 CALLBACK: void FSEventStreamCallback ( FSEventStreamRef streamRef, void* clientCallBackInfo, size_t numEvents, void* eventPaths, FSEventStreamEventFlags* eventFlags, FSEventStreamEventId* eventIds )
63
64 CONSTANT: FSEventStreamEventIdSinceNow 0xFFFFFFFFFFFFFFFF
65
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 )
74
75 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
76     CFAllocatorRef           allocator,
77     FSEventStreamCallback    callback,
78     FSEventStreamContext*    context,
79     dev_t                    deviceToWatch,
80     CFArrayRef               pathsToWatchRelativeToDevice,
81     FSEventStreamEventId     sinceWhen,
82     CFTimeInterval           latency,
83     FSEventStreamCreateFlags flags )
84
85 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef )
86
87 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef )
88
89 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef )
90
91 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( )
92
93 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev )
94
95 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
96     dev_t          dev,
97     CFAbsoluteTime time )
98
99 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
100     dev_t                dev,
101     FSEventStreamEventId eventId )
102
103 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef )
104
105 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef )
106
107 FUNCTION: void FSEventStreamScheduleWithRunLoop (
108     FSEventStreamRef streamRef,
109     CFRunLoopRef     runLoop,
110     CFStringRef      runLoopMode )
111
112 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
113     FSEventStreamRef streamRef,
114     CFRunLoopRef     runLoop,
115     CFStringRef      runLoopMode )
116
117 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef )
118
119 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef )
120
121 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef )
122
123 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef )
124
125 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef )
126
127 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef )
128
129 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef )
130
131 : make-FSEventStreamContext ( info -- alien )
132     FSEventStreamContext new
133         swap >>info ;
134
135 :: <FSEventStream> ( callback info paths latency flags -- event-stream )
136     f ! allocator
137     callback
138     info make-FSEventStreamContext
139     paths <CFStringArray>
140     FSEventStreamEventIdSinceNow ! sinceWhen
141     latency
142     flags
143     FSEventStreamCreate ;
144
145 C-GLOBAL: void* kCFRunLoopCommonModes
146
147 : schedule-event-stream ( event-stream -- )
148     CFRunLoopGetMain
149     kCFRunLoopCommonModes
150     FSEventStreamScheduleWithRunLoop ;
151
152 : unschedule-event-stream ( event-stream -- )
153     CFRunLoopGetMain
154     kCFRunLoopCommonModes
155     FSEventStreamUnscheduleFromRunLoop ;
156
157 : enable-event-stream ( event-stream -- )
158     dup
159     schedule-event-stream
160     dup FSEventStreamStart [
161         drop
162     ] [
163         dup unschedule-event-stream
164         FSEventStreamRelease
165         "Cannot enable FSEventStream" throw
166     ] if ;
167
168 : disable-event-stream ( event-stream -- )
169     dup FSEventStreamStop
170     unschedule-event-stream ;
171
172 SYMBOL: event-stream-callbacks
173
174 : event-stream-counter ( -- n )
175     \ event-stream-counter counter ;
176
177 [
178     event-stream-callbacks
179     [ [ drop expired? ] H{ } assoc-reject-as ] change-global
180 ] "core-foundation" add-startup-hook
181
182 : add-event-source-callback ( quot -- id )
183     event-stream-counter <alien>
184     [ event-stream-callbacks get set-at ] keep ;
185
186 : remove-event-source-callback ( id -- )
187     event-stream-callbacks get delete-at ;
188
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>
193     3array flip
194     info event-stream-callbacks get at [ drop ] or call( changes -- ) ;
195
196 : master-event-source-callback ( -- alien )
197     [ (master-event-source-callback) ] FSEventStreamCallback ;
198
199 TUPLE: event-stream < disposable info handle ;
200
201 : <event-stream> ( quot paths latency flags -- event-stream )
202     [
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 ;
208
209 M: event-stream dispose*
210     {
211         [ info>> remove-event-source-callback ]
212         [ handle>> disable-event-stream ]
213         [ handle>> FSEventStreamInvalidate ]
214         [ handle>> FSEventStreamRelease ]
215     } cleave ;