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