2007-10-03 18:26:39 -04:00
//
// MediaKeysApplication . m
// Cog
//
// Created by Vincent Spader on 10 / 3 / 07.
// Copyright 2007 __MyCompanyName __ . All rights reserved .
//
# import "MediaKeysApplication.h"
# import "AppController.h"
2013-10-12 18:26:52 -03:00
# import "SPMediaKeyTap.h"
# import "Logging.h"
2007-10-03 18:26:39 -04:00
@ implementation MediaKeysApplication
2013-10-12 18:26:52 -03:00
+ ( void ) initialize ;
2007-10-03 18:26:39 -04:00
{
2013-10-12 18:26:52 -03:00
if ( [ self class ] ! = [ MediaKeysApplication class ] ) return ;
// Register defaults for the whitelist of apps that want to use media keys
[ [ NSUserDefaults standardUserDefaults ] registerDefaults : [ NSDictionary dictionaryWithObjectsAndKeys :
[ SPMediaKeyTap defaultMediaKeyUserBundleIdentifiers ] , kMediaKeyUsingBundleIdentifiersDefaultsKey ,
nil ] ] ;
}
- ( void ) finishLaunching {
[ super finishLaunching ] ;
2013-10-12 18:41:57 -03:00
[ [ NSUserDefaults standardUserDefaults ] addObserver : self
forKeyPath : @ "allowLastfmMediaKeys"
options : NSKeyValueObservingOptionNew
context : nil ] ;
2013-10-12 18:26:52 -03:00
keyTap = [ [ SPMediaKeyTap alloc ] initWithDelegate : self ] ;
2018-06-27 23:50:26 -04:00
if ( [ SPMediaKeyTap usesGlobalMediaKeyTap ] ) {
2018-06-28 06:59:59 -04:00
if ( ! [ keyTap startWatchingMediaKeys ] ) {
NSAlert * alert = [ [ NSAlert alloc ] init ] ;
2018-06-28 08:04:15 -04:00
[ alert addButtonWithTitle : @ "OK" ] ;
2018-06-28 06:59:59 -04:00
[ alert setMessageText : @ "Enable Media Key access?" ] ;
2018-06-28 08:04:15 -04:00
[ alert setInformativeText : @ "Media Key support requires the \" Accessibility \ " permission. You will need to restart the application for the change to take effect." ] ;
2018-06-28 06:59:59 -04:00
[ alert setAlertStyle : NSInformationalAlertStyle ] ;
2018-06-28 08:04:15 -04:00
[ alert runModal ] ;
ALog ( @ "Media key monitoring disabled until application is restarted" ) ;
2018-06-27 23:50:26 -04:00
}
}
2013-10-12 18:26:52 -03:00
else
ALog ( @ "Media key monitoring disabled" ) ;
2007-10-03 18:26:39 -04:00
}
- ( void ) sendEvent : ( NSEvent * ) event
{
2013-10-12 18:26:52 -03:00
BOOL shouldHandleMediaKeyEventLocally = ! [ SPMediaKeyTap usesGlobalMediaKeyTap ] ;
if ( shouldHandleMediaKeyEventLocally && [ event type ] = = NSSystemDefined && [ event subtype ] = = 8 )
2007-10-03 18:26:39 -04:00
{
2013-10-12 18:26:52 -03:00
[ self mediaKeyTap : nil receivedMediaKeyEvent : event ] ;
2007-10-03 18:26:39 -04:00
}
[ super sendEvent : event ] ;
}
2013-10-12 18:26:52 -03:00
- ( void ) mediaKeyTap : ( SPMediaKeyTap * ) keyTap receivedMediaKeyEvent : ( NSEvent * ) event ;
{
NSAssert ( [ event type ] = = NSSystemDefined && [ event subtype ] = = SPSystemDefinedEventMediaKeys , @ "Unexpected NSEvent in mediaKeyTap:receivedMediaKeyEvent:" ) ;
int keyCode = ( ( [ event data1 ] & 0 xFFFF0000 ) > > 16 ) ;
int keyFlags = ( [ event data1 ] & 0 x0000FFFF ) ;
BOOL keyIsPressed = ( ( ( keyFlags & 0 xFF00 ) > > 8 ) ) = = 0 xA ;
if ( ! keyIsPressed ) // pressed and released
{
switch ( keyCode )
{
case NX_KEYTYPE _PLAY :
[ ( AppController * ) [ self delegate ] clickPlay ] ;
break ;
case NX_KEYTYPE _NEXT :
case NX_KEYTYPE _FAST :
[ ( AppController * ) [ self delegate ] clickNext ] ;
break ;
case NX_KEYTYPE _PREVIOUS :
case NX_KEYTYPE _REWIND :
[ ( AppController * ) [ self delegate ] clickPrev ] ;
break ;
}
}
}
2013-10-12 18:41:57 -03:00
- ( void ) observeValueForKeyPath : ( NSString * ) keyPath ofObject : ( id ) object change : ( NSDictionary * ) change context : ( void * ) context {
if ( [ keyPath isEqualToString : @ "allowLastfmMediaKeys" ] )
{
NSUserDefaults * defs = [ NSUserDefaults standardUserDefaults ] ;
BOOL allowLastfmMediaKeys = [ defs boolForKey : @ "allowLastfmMediaKeys" ] ;
NSArray * old = [ defs arrayForKey : kMediaKeyUsingBundleIdentifiersDefaultsKey ] ;
NSMutableArray * new = [ old mutableCopy ] ;
NSArray * lastfmIds = [ NSArray arrayWithObjects : @ "fm.last.Last.fm" , @ "fm.last.Scrobbler" , nil ] ;
if ( allowLastfmMediaKeys )
{
[ new addObjectsFromArray : lastfmIds ] ;
}
else
{
[ new removeObjectsInArray : lastfmIds ] ;
}
[ defs setObject : new forKey : kMediaKeyUsingBundleIdentifiersDefaultsKey ] ;
}
else
{
[ super observeValueForKeyPath : keyPath ofObject : object change : change context : context ] ;
}
}
2007-10-03 18:26:39 -04:00
@ end