summaryrefslogtreecommitdiffstats
path: root/apple_remote/source/RemoteMainController.m
diff options
context:
space:
mode:
Diffstat (limited to 'apple_remote/source/RemoteMainController.m')
-rw-r--r--apple_remote/source/RemoteMainController.m177
1 files changed, 177 insertions, 0 deletions
diff --git a/apple_remote/source/RemoteMainController.m b/apple_remote/source/RemoteMainController.m
new file mode 100644
index 0000000000..9e933a3028
--- /dev/null
+++ b/apple_remote/source/RemoteMainController.m
@@ -0,0 +1,177 @@
+/* -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*****************************************************************************
+ * RemoteMainController.m
+ *
+ * Created by Martin Kahr on 11.03.06 under a MIT-style license.
+ * Copyright (c) 2006 martinkahr.com. All rights reserved.
+ *
+ * Code modified and adapted to OpenOffice.org
+ * by Eric Bachard on 11.08.2008 under the same License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+#import <apple_remote/RemoteMainController.h>
+#import "AppleRemote.h"
+#import "KeyspanFrontRowControl.h"
+#import "GlobalKeyboardDevice.h"
+#import "RemoteControlContainer.h"
+#import "MultiClickRemoteBehavior.h"
+
+
+// Sample Code 3: Multi Click Behavior and Hold Event Simulation
+
+
+@implementation AppleRemoteMainController
+
+- (id) init {
+ self = [super init]; // because we redefined our own init instead of use the fu..nny awakeFromNib
+ if (self != nil) {
+
+ // 1. instantiate the desired behavior for the remote control device
+ remoteControlBehavior = [[MultiClickRemoteBehavior alloc] init];
+
+ // 2. configure the behavior
+ [remoteControlBehavior setDelegate: self];
+
+ // 3. a Remote Control Container manages a number of devices and conforms to the RemoteControl interface
+ // Therefore you can enable or disable all the devices of the container with a single "startListening:" call.
+ RemoteControlContainer* container = [[RemoteControlContainer alloc] initWithDelegate: remoteControlBehavior];
+
+ if ( [container instantiateAndAddRemoteControlDeviceWithClass: [AppleRemote class]] != 0 ) {
+#ifdef DEBUG
+ NSLog(@"[container instantiateAndAddRemoteControlDeviceWithClass: [AppleRemote class]] successful");
+ }
+ else {
+ NSLog(@"[container instantiateAndAddRemoteControlDeviceWithClass: [AppleRemote class]] failed");
+#endif
+ }
+
+ if ( [container instantiateAndAddRemoteControlDeviceWithClass: [GlobalKeyboardDevice class]] != 0 ) {
+#ifdef DEBUG
+ NSLog(@"[container instantiateAndAddRemoteControlDeviceWithClass: [GlobalKeyboardDevice class]] successful");
+ }
+ else {
+ NSLog(@"[container instantiateAndAddRemoteControlDeviceWithClass: [GlobalKeyboardDevice class]] failed");
+#endif
+ }
+ // to give the binding mechanism a chance to see the change of the attribute
+ [self setValue: container forKey: @"remoteControl"];
+#ifdef DEBUG
+ NSLog(@"AppleRemoteMainController init done");
+#endif
+ }
+ else
+ NSLog(@"AppleRemoteMainController init failed");
+ return self;
+}
+
+- (void) postTheEvent: (short int)buttonIdentifier modifierFlags:(int)modifierFlags
+{
+SAL_WNODEPRECATED_DECLARATIONS_PUSH
+ // 'NSApplicationDefined' is deprecated: first deprecated in macOS 10.12
+ [NSApp postEvent:
+ [NSEvent otherEventWithType:NSApplicationDefined
+ location:NSZeroPoint
+ modifierFlags:modifierFlags
+ timestamp: 0
+ windowNumber:[[NSApp keyWindow] windowNumber]
+ context:nil
+ subtype:AppleRemoteControlEvent
+ data1: buttonIdentifier
+ data2: 0]
+ atStart: NO];
+SAL_WNODEPRECATED_DECLARATIONS_POP
+}
+
+
+- (void) remoteButton: (RemoteControlEventIdentifier)buttonIdentifier pressedDown: (BOOL) pressedDown clickCount: (unsigned int)clickCount
+{
+ (void)clickCount;
+#ifdef DEBUG
+ NSString* pressed = @"";
+ NSString* buttonName = nil;
+#endif
+ if (pressedDown)
+ {
+#ifdef DEBUG
+ pressed = @"(AppleRemoteMainController: button pressed)";
+
+ switch(buttonIdentifier)
+ {
+ case kRemoteButtonPlus: buttonName = @"Volume up"; break; // MEDIA_COMMAND_VOLUME_UP ( see include/vcl/commandevent.hxx )
+ case kRemoteButtonMinus: buttonName = @"Volume down"; break; // MEDIA_COMMAND_VOLUME_DOWN
+ case kRemoteButtonMenu: buttonName = @"Menu"; break; // MEDIA_COMMAND_MENU
+ case kRemoteButtonPlay: buttonName = @"Play"; break; // MEDIA_COMMAND_PLAY
+ case kRemoteButtonRight: buttonName = @"Next slide"; break; // MEDIA_COMMAND_NEXTTRACK
+ case kRemoteButtonLeft: buttonName = @"Left"; break; // MEDIA_COMMAND_PREVIOUSTRACK
+ case kRemoteButtonRight_Hold: buttonName = @"Last slide"; break; // MEDIA_COMMAND_NEXTTRACK_HOLD
+ case kRemoteButtonLeft_Hold: buttonName = @"First slide"; break; // MEDIA_COMMAND_PREVIOUSTRACK_HOLD
+ case kRemoteButtonPlus_Hold: buttonName = @"Volume up holding"; break;
+ case kRemoteButtonMinus_Hold: buttonName = @"Volume down holding"; break;
+ case kRemoteButtonPlay_Hold: buttonName = @"Play (sleep mode)"; break; // MEDIA_COMMAND_PLAY_HOLD
+ case kRemoteButtonMenu_Hold: buttonName = @"Menu (long)"; break; // MEDIA_COMMAND_MENU_HOLD
+ case kRemoteControl_Switched: buttonName = @"Remote Control Switched";break;
+
+ default: NSLog( @"AppleRemoteMainController: Unmapped event for button %d", buttonIdentifier); break;
+ }
+#endif
+ [ self postTheEvent:buttonIdentifier modifierFlags: 0 ];
+ }
+ else // not pressed
+ {
+#ifdef DEBUG
+ pressed = @"(AppleRemoteMainController: button released)";
+#endif
+ }
+
+#ifdef DEBUG
+ //NSLog(@"Button %@ pressed %@", buttonName, pressed);
+ NSString* clickCountString = @"";
+ if (clickCount > 1) clickCountString = [NSString stringWithFormat: @"%d clicks", clickCount];
+ NSString* feedbackString = [NSString stringWithFormat:@"(Value:%4d) %@ %@ %@", buttonIdentifier, buttonName, pressed, clickCountString];
+
+ // print out events
+ NSLog(@"%@", feedbackString);
+
+ if (pressedDown == NO) printf("\n");
+ // simulate slow processing of events
+ // [NSThread sleepUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.5]];
+#endif
+}
+
+- (void) dealloc {
+ [ remoteControl release ]; remoteControl = nil;
+ [ remoteControlBehavior release ]; remoteControlBehavior = nil;
+ [super dealloc];
+}
+
+// for bindings access
+- (RemoteControl*) remoteControl {
+ return remoteControl;
+}
+
+- (MultiClickRemoteBehavior*) remoteBehavior {
+ return remoteControlBehavior;
+}
+
+@end
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */