File: programming/cocoa/UKIdleTimer.zip/UKIdleTimer/UKIdleTimer.m


//
//  UKIdleTimer.m
//  CocoaMoose
//
//  Created by Uli Kusterer on Tue Apr 06 2004.
//  Copyright (c) 2004 M. Uli Kusterer. All rights reserved.
//
 
#import "UKIdleTimer.h"
#include <Carbon/Carbon.h>
 
pascal void		UKIdleTimerProc( EventLoopTimerRef inTimer,
							EventLoopIdleTimerMessage inMessage, void *refCon );
 
 
@implementation UKIdleTimer
 
-(id)   initWithTimeInterval: (NSTimeInterval)interval
{
	self = [super init];
	if( !self )
		return nil;
	
	static EventLoopIdleTimerUPP eventLoopIdleTimerUPP = NULL;
	if( !eventLoopIdleTimerUPP )
		eventLoopIdleTimerUPP = NewEventLoopIdleTimerUPP(UKIdleTimerProc);
 
	if( InstallEventLoopIdleTimer( GetCurrentEventLoop(),
								kEventDurationSecond * interval,
								kEventDurationSecond * interval,
								eventLoopIdleTimerUPP,
								self, (EventLoopTimerRef*) &carbonTimerRef) != noErr )
	{
		[self release];
		return nil;
	}
	
	return self;
}
 
-(void) dealloc
{
	RemoveEventLoopTimer( (EventLoopTimerRef) carbonTimerRef );
	
	[super dealloc];
}
 
-(void) setFireTime: (NSTimeInterval)foo
{
	SetEventLoopTimerNextFireTime( (EventLoopTimerRef) carbonTimerRef, kEventDurationSecond * foo );
}
 
 
-(id)	delegate
{
    return delegate;
}
 
-(void)	setDelegate: (id)newDelegate
{
	delegate = newDelegate;
}
 
 
-(void) timerBeginsIdling: (id)sender
{
	if( [delegate respondsToSelector: @selector(timerBeginsIdling:)] )
		[delegate timerBeginsIdling: self];
}
 
 
-(void) timerContinuesIdling: (id)sender
{
	if( [delegate respondsToSelector: @selector(timerContinuesIdling:)] )
		[delegate timerContinuesIdling: self];
}
 
 
-(void) timerFinishedIdling: (id)sender
{
	if( [delegate respondsToSelector: @selector(timerFinishedIdling:)] )
		[delegate timerFinishedIdling: self];
}
 
@end
 
pascal void		UKIdleTimerProc( EventLoopTimerRef inTimer,
							EventLoopIdleTimerMessage inMessage, void *refCon )
{
	switch( inMessage )
	{
		case kEventLoopIdleTimerStarted:
			[((UKIdleTimer*)refCon) timerBeginsIdling: nil];
			break;
		
		case kEventLoopIdleTimerIdling:
			[((UKIdleTimer*)refCon) timerContinuesIdling: nil];
			break;
 
		case kEventLoopIdleTimerStopped:
			[((UKIdleTimer*)refCon) timerFinishedIdling: nil];
			break;
	}
}

This code uses the PclZip Zip File reading code, which is subject to the GNU LGPL. It also uses the GeSHi syntax highlighter, subject to the GPL. Ask if you want this for your own web site, it's free.