| Index | Submit class | Submit snippet | Submission feed | List |

UKIdleTimer

Language: Objective-C, Author: Uli Kusterer
License: MIT/X11

This is a wrapper around the Carbon EventLoopIdleTimer, intended to be used just like an NSTimer. An Idle Timer doesn't trigger until the user has been idle for a while, doing nothing in the GUI of the current application.

UKIdleTimer source preview

//
//  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;
  }
}

UKIdleTimer header preview

//
//  UKIdleTimer.h
//  CocoaMoose
//
//  Created by Uli Kusterer on Tue Apr 06 2004.
//  Copyright (c) 2004 M. Uli Kusterer. All rights reserved.
//

#import <Foundation/Foundation.h>


@interface UKIdleTimer : NSObject
{
  void*    carbonTimerRef;
  id      delegate;
}


-(id)   initWithTimeInterval: (NSTimeInterval)interval; // After this much inactivity, the timer will fire, then periodically again with this interval until the user does something.

-(id)  delegate;
-(void)  setDelegate: (id)newDelegate;

-(void) setFireTime: (NSTimeInterval)foo;

// The following three messages are sent to the delegate if it handles them:
-(void) timerBeginsIdling: (id)sender;
-(void) timerContinuesIdling: (id)sender;
-(void) timerFinishedIdling: (id)sender;

@end
Download Archive

Compatible with:


Comments

Name

Website

Do you hate spammers? (Answer "Yes")