aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/views/mac/SkEventNotifier.mm
blob: 0864380d95174df3f717cb09d3413891f3640df9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

/*
 * Copyright 2011 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#import "SkEventNotifier.h"
#include "SkEvent.h"
#define SkEventClass @"SkEvenClass"
@implementation SkEventNotifier
- (id)init {
    self = [super init];
    if (self) {
        //Register as an observer for SkEventClass events and call
        //receiveSkEvent: upon receiving the event
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(receiveSkEvent:)
                                                     name:SkEventClass
                                                   object:nil];
    }
    return self;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

-(BOOL) acceptsFirstResponder {
    return YES;
}

//SkEvent Handers
- (void)receiveSkEvent:(NSNotification *)notification {
    if(SkEvent::ProcessEvent())
        SkEvent::SignalNonEmptyQueue();
}

+ (void)postTimedSkEvent:(NSTimeInterval)timeInterval {
    [NSTimer scheduledTimerWithTimeInterval:timeInterval target:self
                                   selector:@selector(timerFireMethod:)
                                   userInfo:nil repeats:NO];
}

+ (void)timerFireMethod:(NSTimer*)theTimer {
	SkEvent::ServiceQueueTimer();
}

@end
////////////////////////////////////////////////////////////////////////////////
void SkEvent::SignalNonEmptyQueue() {
    //post a SkEventClass event to the default notification queue
    NSNotification* notification = [NSNotification notificationWithName:SkEventClass object:nil];
    [[NSNotificationQueue defaultQueue] enqueueNotification:notification
                                               postingStyle:NSPostWhenIdle
                                               coalesceMask:NSNotificationNoCoalescing
                                                   forModes:nil];
}

void SkEvent::SignalQueueTimer(SkMSec delay) {
	if (delay) {
        //Convert to seconds
        NSTimeInterval ti = delay/(float)SK_MSec1;
        [SkEventNotifier postTimedSkEvent:ti];
	}
}