osx: implement media keys

Media keys are pretty handy if you use mpv as a music player (yes I'm one of
those people that do).

These are the bindings (which lead to the same behaviour as iTunes):
  * NX_KEYTYPE_PLAY   -> MP_KEY_PLAY
  * NX_KEYTYPE_FAST   -> MP_KEY_NEXT
  * NX_KEYTYPE_REWIND -> MP_KEY_PREV

I just handled these ones as the volume one would be pretty invasive. I could
maybe change it to increase the application's volume instead of system volume
only when mpv is frontmost (iTunes does this), but some users would probably
hate it.
This commit is contained in:
Stefano Pigozzi 2013-06-02 18:23:18 +02:00
parent d67b687530
commit c39efb96d1
3 changed files with 33 additions and 1 deletions

View File

@ -120,7 +120,19 @@ static NSString *escape_loadfile_name(NSString *input)
- (void)sendEvent:(NSEvent *)event
{
[super sendEvent:event];
if ([event type] == NSSystemDefined && [event subtype] == 8) {
// It's a media key! Handle it specially. The magic numbers are reverse
// engineered and found on several blog posts. Unfortunately there is
// no public API for this. F-bomb.
int code = (([event data1] & 0xFFFF0000) >> 16);
int flags = ([event data1] & 0x0000FFFF);
int down = (((flags & 0xFF00) >> 8)) == 0xA;
if (down)
[self.eventsResponder handleMediaKey:code];
} else {
[super sendEvent:event];
}
if (self.inputContext)
mp_input_wakeup(self.inputContext);

View File

@ -27,6 +27,7 @@ struct cocoa_input_queue;
@end
@interface EventsResponder : NSResponder
- (void)handleMediaKey:(int)key;
- (NSEvent *)handleKeyDown:(NSEvent *)event;
@end

View File

@ -20,6 +20,9 @@
// Carbon header is included but Carbon is NOT linked to mpv's binary. This
// file only needs this include to use the keycode definitions in keymap.
#import <Carbon/Carbon.h>
// Media keys definitions
#import <IOKit/hidsystem/ev_keymap.h>
#import <Cocoa/Cocoa.h>
#include "talloc.h"
@ -107,6 +110,22 @@ void cocoa_put_key(int keycode)
{
return @[@"h", @"q", @"Q", @"0", @"1", @"2"];
}
- (void)handleMediaKey:(int)key
{
switch (key) {
case NX_KEYTYPE_PLAY:
cocoa_put_key(MP_KEY_PLAY);
break;
case NX_KEYTYPE_FAST:
cocoa_put_key(MP_KEY_NEXT);
break;
case NX_KEYTYPE_REWIND:
cocoa_put_key(MP_KEY_PREV);
break;
}
}
- (NSEvent*)handleKeyDown:(NSEvent *)event
{
NSString *chars;