]> gitweb.factorcode.org Git - factor.git/blob - basis/core-foundation/fsevents/fsevents.factor
Merge branch 'master' into experimental (untested!)
[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: 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
10
11 : kFSEventStreamCreateFlagUseCFTypes 2 ; inline
12 : kFSEventStreamCreateFlagWatchRoot 4 ; inline
13
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
22
23 TYPEDEF: int FSEventStreamCreateFlags
24 TYPEDEF: int FSEventStreamEventFlags
25 TYPEDEF: longlong FSEventStreamEventId
26 TYPEDEF: void* FSEventStreamRef
27
28 C-STRUCT: FSEventStreamContext
29     { "CFIndex" "version" }
30     { "void*" "info" }
31     { "void*" "retain" }
32     { "void*" "release" }
33     { "void*" "copyDescription" } ;
34
35 ! callback(FSEventStreamRef streamRef, void *clientCallBackInfo, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[]);
36 TYPEDEF: void* FSEventStreamCallback
37
38 : FSEventStreamEventIdSinceNow HEX: FFFFFFFFFFFFFFFF ; inline
39
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 ) ;
48
49 FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
50     CFAllocatorRef           allocator,
51     FSEventStreamCallback    callback,
52     FSEventStreamContext*    context,
53     dev_t                    deviceToWatch,
54     CFArrayRef               pathsToWatchRelativeToDevice,
55     FSEventStreamEventId     sinceWhen,
56     CFTimeInterval           latency,
57     FSEventStreamCreateFlags flags ) ;
58
59 FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
60
61 FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
62
63 FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
64
65 FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
66
67 FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
68
69 FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
70     dev_t          dev,
71     CFAbsoluteTime time ) ;
72
73 FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
74     dev_t                dev,
75     FSEventStreamEventId eventId ) ;
76
77 FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
78
79 FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
80
81 FUNCTION: void FSEventStreamScheduleWithRunLoop (
82     FSEventStreamRef streamRef,
83     CFRunLoopRef     runLoop,
84     CFStringRef      runLoopMode ) ;
85
86 FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
87     FSEventStreamRef streamRef,
88     CFRunLoopRef     runLoop,
89     CFStringRef      runLoopMode ) ;
90
91 FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
92
93 FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
94
95 FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
96
97 FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
98
99 FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
100
101 FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
102
103 FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
104
105 : make-FSEventStreamContext ( info -- alien )
106     "FSEventStreamContext" <c-object>
107     [ set-FSEventStreamContext-info ] keep ;
108
109 :: <FSEventStream> ( callback info paths latency flags -- event-stream )
110     f ! allocator
111     callback
112     info make-FSEventStreamContext
113     paths <CFStringArray>
114     FSEventStreamEventIdSinceNow ! sinceWhen
115     latency
116     flags
117     FSEventStreamCreate ;
118
119 : kCFRunLoopCommonModes ( -- string )
120     &: kCFRunLoopCommonModes *void* ;
121
122 : schedule-event-stream ( event-stream -- )
123     CFRunLoopGetMain
124     kCFRunLoopCommonModes
125     FSEventStreamScheduleWithRunLoop ;
126
127 : unschedule-event-stream ( event-stream -- )
128     CFRunLoopGetMain
129     kCFRunLoopCommonModes
130     FSEventStreamUnscheduleFromRunLoop ;
131
132 : enable-event-stream ( event-stream -- )
133     dup
134     schedule-event-stream
135     dup FSEventStreamStart [
136         drop
137     ] [
138         dup unschedule-event-stream
139         FSEventStreamRelease
140         "Cannot enable FSEventStream" throw
141     ] if ;
142
143 : disable-event-stream ( event-stream -- )
144     dup FSEventStreamStop
145     unschedule-event-stream ;
146
147 SYMBOL: event-stream-callbacks
148
149 : event-stream-counter ( -- n )
150     \ event-stream-counter counter ;
151
152 [
153     event-stream-callbacks global
154     [ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-at
155 ] "core-foundation" add-init-hook
156
157 : add-event-source-callback ( quot -- id )
158     event-stream-counter <alien>
159     [ event-stream-callbacks get set-at ] keep ;
160
161 : remove-event-source-callback ( id -- )
162     event-stream-callbacks get delete-at ;
163
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>
168     3array flip
169     info event-stream-callbacks get at [ drop ] or call ;
170
171 : master-event-source-callback ( -- alien )
172     "void"
173     {
174         "FSEventStreamRef"
175         "void*"                     ! info
176         "size_t"                    ! numEvents
177         "void*"                     ! eventPaths
178         "FSEventStreamEventFlags*"
179         "FSEventStreamEventId*"
180     }
181     "cdecl" [ (master-event-source-callback) ] alien-callback ;
182
183 TUPLE: event-stream info handle disposed ;
184
185 : <event-stream> ( quot paths latency flags -- event-stream )
186     [
187         add-event-source-callback dup
188         [ master-event-source-callback ] dip
189     ] 3dip <FSEventStream>
190     dup enable-event-stream
191     f event-stream boa ;
192
193 M: event-stream dispose*
194     {
195         [ info>> remove-event-source-callback ]
196         [ handle>> disable-event-stream ]
197         [ handle>> FSEventStreamInvalidate ]
198         [ handle>> FSEventStreamRelease ]
199     } cleave ;