factor/basis/core-foundation/fsevents/fsevents.factor

194 lines
6.3 KiB
Factor
Raw Normal View History

2008-02-12 03:21:47 -05:00
! Copyright (C) 2008 Slava Pestov
! See http://factorcode.org/license.txt for BSD license.
USING: alien alien.c-types alien.data alien.strings alien.syntax
kernel math sequences namespaces make assocs init accessors
continuations combinators io.encodings.utf8 destructors locals
arrays specialized-arrays classes.struct core-foundation
core-foundation.arrays core-foundation.run-loop
core-foundation.strings core-foundation.time unix.types ;
FROM: namespaces => change-global ;
2008-02-12 03:33:06 -05:00
IN: core-foundation.fsevents
2008-02-12 03:21:47 -05:00
SPECIALIZED-ARRAY: void*
SPECIALIZED-ARRAY: int
SPECIALIZED-ARRAY: longlong
2009-02-22 20:13:08 -05:00
CONSTANT: kFSEventStreamCreateFlagUseCFTypes 2
CONSTANT: kFSEventStreamCreateFlagWatchRoot 4
2008-02-12 03:21:47 -05:00
2009-02-22 20:13:08 -05:00
CONSTANT: kFSEventStreamEventFlagMustScanSubDirs 1
CONSTANT: kFSEventStreamEventFlagUserDropped 2
CONSTANT: kFSEventStreamEventFlagKernelDropped 4
CONSTANT: kFSEventStreamEventFlagEventIdsWrapped 8
CONSTANT: kFSEventStreamEventFlagHistoryDone 16
CONSTANT: kFSEventStreamEventFlagRootChanged 32
CONSTANT: kFSEventStreamEventFlagMount 64
CONSTANT: kFSEventStreamEventFlagUnmount 128
2008-02-12 03:21:47 -05:00
TYPEDEF: int FSEventStreamCreateFlags
TYPEDEF: int FSEventStreamEventFlags
TYPEDEF: longlong FSEventStreamEventId
TYPEDEF: void* FSEventStreamRef
STRUCT: FSEventStreamContext
{ version CFIndex }
{ info void* }
{ retain void* }
{ release void* }
{ copyDescription void* } ;
2008-02-12 03:21:47 -05:00
CALLBACK: void FSEventStreamCallback ( FSEventStreamRef streamRef, void* clientCallBackInfo, size_t numEvents, void* eventPaths, FSEventStreamEventFlags* eventFlags, FSEventStreamEventId* eventIds ) ;
2008-02-12 03:21:47 -05:00
2011-11-23 21:49:33 -05:00
CONSTANT: FSEventStreamEventIdSinceNow 0xFFFFFFFFFFFFFFFF
2008-02-12 03:21:47 -05:00
FUNCTION: FSEventStreamRef FSEventStreamCreate (
CFAllocatorRef allocator,
FSEventStreamCallback callback,
FSEventStreamContext* context,
CFArrayRef pathsToWatch,
FSEventStreamEventId sinceWhen,
CFTimeInterval latency,
FSEventStreamCreateFlags flags ) ;
FUNCTION: FSEventStreamRef FSEventStreamCreateRelativeToDevice (
CFAllocatorRef allocator,
FSEventStreamCallback callback,
FSEventStreamContext* context,
dev_t deviceToWatch,
CFArrayRef pathsToWatchRelativeToDevice,
FSEventStreamEventId sinceWhen,
CFTimeInterval latency,
FSEventStreamCreateFlags flags ) ;
FUNCTION: FSEventStreamEventId FSEventStreamGetLatestEventId ( FSEventStreamRef streamRef ) ;
FUNCTION: dev_t FSEventStreamGetDeviceBeingWatched ( FSEventStreamRef streamRef ) ;
FUNCTION: CFArrayRef FSEventStreamCopyPathsBeingWatched ( FSEventStreamRef streamRef ) ;
FUNCTION: FSEventStreamEventId FSEventsGetCurrentEventId ( ) ;
FUNCTION: CFUUIDRef FSEventsCopyUUIDForDevice ( dev_t dev ) ;
FUNCTION: FSEventStreamEventId FSEventsGetLastEventIdForDeviceBeforeTime (
dev_t dev,
CFAbsoluteTime time ) ;
FUNCTION: Boolean FSEventsPurgeEventsForDeviceUpToEventId (
dev_t dev,
FSEventStreamEventId eventId ) ;
FUNCTION: void FSEventStreamRetain ( FSEventStreamRef streamRef ) ;
FUNCTION: void FSEventStreamRelease ( FSEventStreamRef streamRef ) ;
FUNCTION: void FSEventStreamScheduleWithRunLoop (
FSEventStreamRef streamRef,
CFRunLoopRef runLoop,
CFStringRef runLoopMode ) ;
FUNCTION: void FSEventStreamUnscheduleFromRunLoop (
FSEventStreamRef streamRef,
CFRunLoopRef runLoop,
CFStringRef runLoopMode ) ;
FUNCTION: void FSEventStreamInvalidate ( FSEventStreamRef streamRef ) ;
FUNCTION: Boolean FSEventStreamStart ( FSEventStreamRef streamRef ) ;
FUNCTION: FSEventStreamEventId FSEventStreamFlushAsync ( FSEventStreamRef streamRef ) ;
FUNCTION: void FSEventStreamFlushSync ( FSEventStreamRef streamRef ) ;
FUNCTION: void FSEventStreamStop ( FSEventStreamRef streamRef ) ;
FUNCTION: void FSEventStreamShow ( FSEventStreamRef streamRef ) ;
FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef ) ;
: make-FSEventStreamContext ( info -- alien )
FSEventStreamContext <struct>
swap >>info ;
2008-02-12 03:21:47 -05:00
:: <FSEventStream> ( callback info paths latency flags -- event-stream )
2008-02-12 03:21:47 -05:00
f ! allocator
callback
info make-FSEventStreamContext
paths <CFStringArray>
2008-02-12 03:21:47 -05:00
FSEventStreamEventIdSinceNow ! sinceWhen
latency
flags
2008-02-12 03:21:47 -05:00
FSEventStreamCreate ;
C-GLOBAL: void* kCFRunLoopCommonModes
2008-02-12 03:21:47 -05:00
: schedule-event-stream ( event-stream -- )
CFRunLoopGetMain
kCFRunLoopCommonModes
FSEventStreamScheduleWithRunLoop ;
: unschedule-event-stream ( event-stream -- )
CFRunLoopGetMain
kCFRunLoopCommonModes
FSEventStreamUnscheduleFromRunLoop ;
: enable-event-stream ( event-stream -- )
dup
schedule-event-stream
dup FSEventStreamStart [
drop
] [
dup unschedule-event-stream
FSEventStreamRelease
"Cannot enable FSEventStream" throw
] if ;
: disable-event-stream ( event-stream -- )
dup FSEventStreamStop
unschedule-event-stream ;
SYMBOL: event-stream-callbacks
2008-06-08 16:32:55 -04:00
: event-stream-counter ( -- n )
\ event-stream-counter counter ;
2008-02-12 03:21:47 -05:00
[
event-stream-callbacks
[ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-global
] "core-foundation" add-startup-hook
2008-02-12 03:21:47 -05:00
: add-event-source-callback ( quot -- id )
event-stream-counter <alien>
[ event-stream-callbacks get set-at ] keep ;
: remove-event-source-callback ( id -- )
event-stream-callbacks get delete-at ;
:: (master-event-source-callback) ( eventStream info numEvents eventPaths eventFlags eventIds -- )
eventPaths numEvents void* <c-direct-array> [ utf8 alien>string ] { } map-as
eventFlags numEvents int <c-direct-array>
eventIds numEvents longlong <c-direct-array>
3array flip
2009-03-17 19:53:44 -04:00
info event-stream-callbacks get at [ drop ] or call( changes -- ) ;
2008-02-12 03:21:47 -05:00
: master-event-source-callback ( -- alien )
[ (master-event-source-callback) ] FSEventStreamCallback ;
2008-02-12 03:21:47 -05:00
TUPLE: event-stream < disposable info handle ;
2008-02-12 03:21:47 -05:00
: <event-stream> ( quot paths latency flags -- event-stream )
[
add-event-source-callback
[ master-event-source-callback ] keep
] 3dip <FSEventStream>
2008-02-12 03:21:47 -05:00
dup enable-event-stream
event-stream new-disposable swap >>handle swap >>info ;
2008-02-12 03:21:47 -05:00
2008-05-15 00:23:12 -04:00
M: event-stream dispose*
{
[ info>> remove-event-source-callback ]
[ handle>> disable-event-stream ]
[ handle>> FSEventStreamInvalidate ]
[ handle>> FSEventStreamRelease ]
} cleave ;