40 if ( (
self = [super
init]) ) {
51- (void) setDelegate: (
id) _delegate {
52 if ( _delegate && ( [_delegate respondsToSelector:
@selector(remoteButton:pressedDown:clickCount:)] == NO ))
return;
63- (void) setSimulateHoldEvent: (
BOOL) value {
77- (void) setClickCountingEnabled: (
BOOL) value {
79 [
self setClickCountEnabledButtons: kRemoteButtonPlus | kRemoteButtonMinus | kRemoteButtonPlay | kRemoteButtonLeft | kRemoteButtonRight | kRemoteButtonMenu | kMetallicRemote2009ButtonPlay | kMetallicRemote2009ButtonMiddlePlay];
81 [
self setClickCountEnabledButtons: 0];
88- (void) setClickCountEnabledButtons: (
unsigned int)value {
95- (void) setMaximumClickCountTimeDifference: (NSTimeInterval) timeDiff {
99- (void) sendSimulatedHoldEvent: (
id) time {
100 BOOL startSimulateHold =
NO;
102 @
synchronized(
self) {
105 if (startSimulateHold) {
108 [delegate remoteButton:event pressedDown: YES clickCount: 1];
112- (void) executeClickCountEvent: (NSArray*) values {
114 NSTimeInterval eventTimePoint = [[values objectAtIndex: 1] doubleValue];
116 BOOL finishedClicking =
NO;
119 @
synchronized(
self) {
121 if (finishedClicking) {
128 if (finishedClicking) {
129 [delegate remoteButton:event pressedDown: YES clickCount:finalClickCount];
131 [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow:0.1]];
132 [delegate remoteButton:event pressedDown: NO clickCount:finalClickCount];
139 BOOL clickCountingForEvent = ([
self clickCountEnabledButtons] & event) == event;
141 if ([
self simulatesHoldForButtonIdentifier: event remoteControl: remoteControl] &&
lastClickCountEvent==0) {
146 [
self performSelector:@selector(sendSimulatedHoldEvent:)
147 withObject:[NSNumber numberWithDouble:lastHoldEventTime]
148 afterDelay:HOLD_RECOGNITION_TIME_INTERVAL];
158 [delegate remoteButton:event pressedDown: pressedDown clickCount:1];
162 @
synchronized(
self) {
167 if (clickCountingForEvent) {
170 NSNumber* eventNumber;
171 NSNumber* timeNumber;
173 timeNumber = [NSNumber numberWithDouble:lastClickCountEventTime];
174 eventNumber= [NSNumber numberWithUnsignedInt:previousEvent];
176 [
self performSelector: @selector(executeClickCountEvent:)
177 withObject: [NSArray arrayWithObjects:eventNumber, timeNumber, nil]
178 afterDelay: diffTime];
183 [delegate remoteButton:event pressedDown: YES clickCount:1];
189 if (clickCountingForEvent) {
190 if (pressedDown == NO)
return;
192 NSNumber* eventNumber;
193 NSNumber* timeNumber;
194 @
synchronized(
self) {
202 timeNumber = [NSNumber numberWithDouble:lastClickCountEventTime];
203 eventNumber= [NSNumber numberWithUnsignedInt:event];
205 [
self performSelector: @selector(executeClickCountEvent:)
206 withObject: [NSArray arrayWithObjects:eventNumber, timeNumber, nil]
207 afterDelay: maxClickTimeDifference];
209 [delegate remoteButton:event pressedDown: pressedDown clickCount:1];
static const NSTimeInterval HOLD_RECOGNITION_TIME_INTERVAL
static const NSTimeInterval DEFAULT_MAXIMUM_CLICK_TIME_DIFFERENCE
#define EVENT_TO_HOLD_EVENT_OFFSET
RemoteControlEventIdentifier
BOOL sendsEventForButtonIdentifier:(RemoteControlEventIdentifier identifier)
A behavior that adds multiclick and hold events on top of a device.
unsigned int eventClickCount
NSTimeInterval maxClickTimeDifference
NSTimeInterval lastHoldEventTime
BOOL clickCountingEnabled()
NSTimeInterval maximumClickCountTimeDifference()
RemoteControlEventIdentifier lastClickCountEvent
RemoteControlEventIdentifier lastHoldEvent
NSTimeInterval lastClickCountEventTime
BOOL lastEventSimulatedHold
unsigned int clickCountEnabledButtons
const wchar_t *typedef BOOL
const wchar_t *typedef int(__stdcall *DllNativeUnregProc)(int