Commit 5879ef30 authored by Felix Paul Kühne's avatar Felix Paul Kühne

macosx: forward-port recent preferences and media keys enhancements

This includes [eb241138], [fb5108db], [b8d90e93], [acb8baa1]. Regrettably, these weren't cherry-pickable.
parent 97db61fd
......@@ -431,6 +431,8 @@ struct intf_sys_t
{
BOOL b_justJumped;
BOOL b_mediaKeySupport;
BOOL b_activeInBackground;
BOOL b_active;
}
- (void)coreChangedMediaKeySupportSetting: (NSNotification *)o_notification;
......
......@@ -2862,8 +2862,11 @@ end:
- (void)awakeFromNib
{
b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" );
b_active = b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" );
b_activeInBackground = config_GetInt( VLCIntf, "macosx-mediakeys-background" );
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(coreChangedMediaKeySupportSetting:) name: @"VLCMediaKeySupportSettingChanged" object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appGotActiveOrInactive:) name: @"NSApplicationDidBecomeActiveNotification" object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appGotActiveOrInactive:) name: @"NSApplicationWillResignActiveNotification" object: nil];
}
- (void)dealloc
......@@ -2872,58 +2875,68 @@ end:
[super dealloc];
}
- (void)appGotActiveOrInactive: (NSNotification *)o_notification
{
if(( [[o_notification name] isEqualToString: @"NSApplicationWillResignActiveNotification"] && !b_activeInBackground ) || !b_mediaKeySupport)
b_active = NO;
else
b_active = YES;
}
- (void)coreChangedMediaKeySupportSetting: (NSNotification *)o_notification
{
b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" );
b_active = b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" );
b_activeInBackground = config_GetInt( VLCIntf, "macosx-mediakeys-background" );
}
- (void)sendEvent: (NSEvent*)event
{
if( b_mediaKeySupport )
if( b_active )
{
if( [event type] == NSSystemDefined && [event subtype] == 8 )
{
int keyCode = (([event data1] & 0xFFFF0000) >> 16);
int keyFlags = ([event data1] & 0x0000FFFF);
int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA;
int keyRepeat = (keyFlags & 0x1);
if( keyCode == NX_KEYTYPE_PLAY && keyState == 0 )
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE );
if( keyCode == NX_KEYTYPE_FAST && !b_justJumped )
{
if( keyState == 0 && keyRepeat == 0 )
{
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_NEXT );
}
else if( keyRepeat == 1 )
{
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT );
b_justJumped = YES;
[self performSelector:@selector(resetJump)
withObject: NULL
afterDelay:0.25];
}
}
if( keyCode == NX_KEYTYPE_REWIND && !b_justJumped )
{
if( keyState == 0 && keyRepeat == 0 )
{
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PREV );
}
else if( keyRepeat == 1 )
{
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT );
b_justJumped = YES;
[self performSelector:@selector(resetJump)
withObject: NULL
afterDelay:0.25];
}
}
}
}
if( [event type] == NSSystemDefined && [event subtype] == 8 )
{
int keyCode = (([event data1] & 0xFFFF0000) >> 16);
int keyFlags = ([event data1] & 0x0000FFFF);
int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA;
int keyRepeat = (keyFlags & 0x1);
if( keyCode == NX_KEYTYPE_PLAY && keyState == 0 )
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE );
if( keyCode == NX_KEYTYPE_FAST && !b_justJumped )
{
if( keyState == 0 && keyRepeat == 0 )
{
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_NEXT );
}
else if( keyRepeat == 1 )
{
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT );
b_justJumped = YES;
[self performSelector:@selector(resetJump)
withObject: NULL
afterDelay:0.25];
}
}
if( keyCode == NX_KEYTYPE_REWIND && !b_justJumped )
{
if( keyState == 0 && keyRepeat == 0 )
{
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PREV );
}
else if( keyRepeat == 1 )
{
var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT );
b_justJumped = YES;
[self performSelector:@selector(resetJump)
withObject: NULL
afterDelay:0.25];
}
}
}
}
[super sendEvent: event];
}
......
......@@ -95,6 +95,10 @@ void CloseVideoGL ( vlc_object_t * );
#define USE_MEDIAKEYS_LONGTEXT N_("By default, VLC can be controlled using the media keys on modern Apple " \
"keyboards.")
#define USE_MEDIAKEYS_BACKGROUND_TEXT N_("Use media key control when VLC is in background")
#define USE_MEDIAKEYS_BACKGROUND_LONGTEXT N_("By default, VLC will accept media key events also when being " \
"in background.")
vlc_module_begin ()
set_description( N_("Mac OS X interface") )
set_capability( "interface", 200 )
......@@ -113,6 +117,8 @@ vlc_module_begin ()
false )
add_bool( "macosx-mediakeys", 1, NULL, USE_MEDIAKEYS_TEXT, USE_MEDIAKEYS_LONGTEXT,
false )
add_bool( "macosx-mediakeys-background", 1, NULL, USE_MEDIAKEYS_BACKGROUND_TEXT, USE_MEDIAKEYS_BACKGROUND_LONGTEXT,
false )
add_submodule ()
set_description( "Mac OS X OpenGL" )
......
......@@ -91,6 +91,7 @@
IBOutlet id o_intf_fspanel_ckb;
IBOutlet id o_intf_appleremote_ckb;
IBOutlet id o_intf_mediakeys_ckb;
IBOutlet id o_intf_mediakeys_bg_ckb;
IBOutlet id o_intf_lang_pop;
IBOutlet id o_intf_lang_txt;
IBOutlet id o_intf_network_box;
......
......@@ -266,7 +266,8 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des
[o_intf_network_box setTitle: _NS("Privacy / Network Interaction")];
[o_intf_appleremote_ckb setTitle: _NS("Control playback with the Apple Remote")];
[o_intf_mediakeys_ckb setTitle: _NS("Control playback with media keys")];
[o_intf_mediakeys_bg_ckb setTitle: _NS("...when VLC is in background")];
/* Subtitles and OSD */
[o_osd_encoding_txt setStringValue: _NS("Default Encoding")];
[o_osd_font_box setTitle: _NS("Display Settings")];
......@@ -304,6 +305,31 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des
[o_sprefs_win setTitle: _NS("Preferences")];
}
/* TODO: move this part to core */
#define config_GetLabel(a,b) __config_GetLabel(VLC_OBJECT(a),b)
static inline char * __config_GetLabel( vlc_object_t *p_this, const char *psz_name )
{
module_config_t *p_config;
p_config = config_FindConfig( p_this, psz_name );
/* sanity checks */
if( !p_config )
{
msg_Err( p_this, "option %s does not exist", psz_name );
return NULL;
}
if ( p_config->psz_longtext )
return p_config->psz_longtext;
else if( p_config->psz_text )
return p_config->psz_text;
else
msg_Warn( p_this, "option %s does not include any help" );
return NULL;
}
- (void)setupButton: (NSPopUpButton *)object forStringList: (const char *)name
{
module_config_t *p_item;
......@@ -393,10 +419,17 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des
[object setToolTip: _NS(p_item->psz_longtext)];
}
- (void)setupButton: (NSButton *)object forBoolValue: (const char *)name
{
[object setState: config_GetInt( p_intf, name )];
[object setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, name )]];
}
- (void)setupField:(NSTextField *)o_object forOption:(const char *)psz_option
{
char *psz_tmp = config_GetPsz( p_intf, psz_option );
[o_object setStringValue: [NSString stringWithUTF8String: psz_tmp ?: ""]];
[o_object setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, psz_option )]];
free( psz_tmp );
}
......@@ -415,26 +448,30 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des
[self setupButton: o_intf_lang_pop forStringList: "language"];
[self setupButton: o_intf_art_pop forIntList: "album-art"];
[o_intf_fspanel_ckb setState: config_GetInt( p_intf, "macosx-fspanel" )];
[o_intf_embedded_ckb setState: config_GetInt( p_intf, "embedded-video" )];
[o_intf_appleremote_ckb setState: config_GetInt( p_intf, "macosx-appleremote" )];
[o_intf_mediakeys_ckb setState: config_GetInt( p_intf, "macosx-mediakeys" )];
[self setupButton: o_intf_fspanel_ckb forBoolValue: "macosx-fspanel"];
[self setupButton: o_intf_embedded_ckb forBoolValue: "embedded-video"];
[self setupButton: o_intf_appleremote_ckb forBoolValue: "macosx-appleremote"];
[self setupButton: o_intf_mediakeys_ckb forBoolValue: "macosx-mediakeys"];
[self setupButton: o_intf_mediakeys_bg_ckb forBoolValue: "macosx-mediakeys-background"];
[o_intf_mediakeys_bg_ckb setEnabled: [o_intf_mediakeys_ckb state]];
/******************
* audio settings *
******************/
[o_audio_enable_ckb setState: config_GetInt( p_intf, "audio" )];
[self setupButton: o_audio_enable_ckb forBoolValue: "audio"];
i = (config_GetInt( p_intf, "volume" ) * 0.390625);
[o_audio_vol_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "volume")]];
[o_audio_vol_fld setIntValue: i];
[o_audio_vol_sld setToolTip: [o_audio_vol_fld toolTip]];
[o_audio_vol_sld setIntValue: i];
[o_audio_spdif_ckb setState: config_GetInt( p_intf, "spdif" )];
[self setupButton: o_audio_spdif_ckb forBoolValue: "spdif"];
[self setupButton: o_audio_dolby_pop forIntList: "force-dolby-surround"];
[self setupField: o_audio_lang_fld forOption: "audio-language"];
[o_audio_headphone_ckb setState: config_GetInt( p_intf, "headphone-dolby" )];
[self setupButton: o_audio_headphone_ckb forBoolValue: "headphone-dolby"];
psz_tmp = config_GetPsz( p_intf, "audio-filter" );
if( psz_tmp )
{
......@@ -444,6 +481,7 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des
free( psz_tmp );
}
[o_audio_norm_fld setFloatValue: config_GetFloat( p_intf, "norm-max-level" )];
[o_audio_norm_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "norm-max-level")]];
[self setupButton: o_audio_visual_pop forModuleList: "audio-visual"];
......@@ -472,11 +510,11 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des
/******************
* video settings *
******************/
[o_video_enable_ckb setState: config_GetInt( p_intf, "video" )];
[o_video_fullscreen_ckb setState: config_GetInt( p_intf, "fullscreen" )];
[o_video_onTop_ckb setState: config_GetInt( p_intf, "video-on-top" )];
[o_video_skipFrames_ckb setState: config_GetInt( p_intf, "skip-frames" )];
[o_video_black_ckb setState: config_GetInt( p_intf, "macosx-black" )];
[self setupButton: o_video_enable_ckb forBoolValue: "video"];
[self setupButton: o_video_fullscreen_ckb forBoolValue: "fullscreen"];
[self setupButton: o_video_onTop_ckb forBoolValue: "video-on-top"];
[self setupButton: o_video_skipFrames_ckb forBoolValue: "skip-frames"];
[self setupButton: o_video_black_ckb forBoolValue: "macosx-black"];
[self setupButton: o_video_output_pop forModuleList: "vout"];
......@@ -497,22 +535,24 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des
[o_video_device_pop selectItemAtIndex: 0];
[o_video_device_pop selectItemWithTag: config_GetInt( p_intf, "macosx-vdev" )];
[self setupField:o_video_snap_folder_fld forOption:"snapshot-path"];
[self setupField:o_video_snap_prefix_fld forOption:"snapshot-prefix"];
[o_video_snap_seqnum_ckb setState: config_GetInt( p_intf, "snapshot-sequential" )];
[self setupField: o_video_snap_folder_fld forOption:"snapshot-path"];
[self setupField: o_video_snap_prefix_fld forOption:"snapshot-prefix"];
[self setupButton: o_video_snap_seqnum_ckb forBoolValue: "snapshot-sequential"];
[self setupButton: o_video_snap_format_pop forStringList: "snapshot-format"];
/***************************
* input & codecs settings *
***************************/
[o_input_serverport_fld setIntValue: config_GetInt( p_intf, "server-port" )];
[self setupField:o_input_httpproxy_fld forOption:"http-proxy"];
[self setupField:o_input_httpproxypwd_sfld forOption:"http-proxy-pwd"];
[o_input_postproc_fld setIntValue: config_GetInt( p_intf, "postproc-q" )];
[o_input_serverport_fld setIntValue: config_GetInt( p_intf, "server-port")];
[o_input_serverport_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "server-port")]];
[self setupField: o_input_httpproxy_fld forOption:"http-proxy"];
[self setupField: o_input_httpproxypwd_sfld forOption:"http-proxy-pwd"];
[o_input_postproc_fld setIntValue: config_GetInt( p_intf, "postproc-q")];
[o_input_postproc_fld setToolTip: [NSString stringWithUTF8String: config_GetLabel( p_intf, "postproc-q")]];
[self setupButton: o_input_avi_pop forIntList: "avi-index"];
[o_input_rtsp_ckb setState: config_GetInt( p_intf, "rtsp-tcp" )];
[self setupButton: o_input_rtsp_ckb forBoolValue: "rtsp-tcp"];
[self setupButton: o_input_skipLoop_pop forIntList: "ffmpeg-skiploopfilter"];
[o_input_cachelevel_pop removeAllItems];
......@@ -568,7 +608,7 @@ create_toolbar_item( NSString * o_itemIdent, NSString * o_name, NSString * o_des
/*********************
* subtitle settings *
*********************/
[o_osd_osd_ckb setState: config_GetInt( p_intf, "osd" )];
[self setupButton: o_osd_osd_ckb forBoolValue: "osd"];
[self setupButton: o_osd_encoding_pop forStringList: "subsdec-encoding"];
[self setupField: o_osd_lang_fld forOption: "sub-language" ];
......@@ -742,6 +782,7 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch
config_PutInt( p_intf, "embedded-video", [o_intf_embedded_ckb state] );
config_PutInt( p_intf, "macosx-appleremote", [o_intf_appleremote_ckb state] );
config_PutInt( p_intf, "macosx-mediakeys", [o_intf_mediakeys_ckb state] );
config_PutInt( p_intf, "macosx-mediakeys-background", [o_intf_mediakeys_bg_ckb state] );
/* activate stuff without restart */
if( [o_intf_appleremote_ckb state] == YES )
......@@ -948,7 +989,9 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch
config_PutInt( p_intf, "osd", [o_osd_osd_ckb state] );
if( [o_osd_encoding_pop indexOfSelectedItem] >= 0 )
config_PutPsz( p_intf, "subsdec-encoding", [[[o_osd_encoding_pop selectedItem] title] UTF8String] );
SaveStringList( o_osd_encoding_pop, "subsdec-encoding" );
else
config_PutPsz( p_intf, "subsdec-encoding", "" );
config_PutPsz( p_intf, "sub-language", [[o_osd_lang_fld stringValue] UTF8String] );
......@@ -1042,6 +1085,8 @@ static inline void save_module_list( intf_thread_t * p_intf, id object, const ch
- (IBAction)interfaceSettingChanged:(id)sender
{
if( sender == o_intf_mediakeys_ckb )
[o_intf_mediakeys_bg_ckb setEnabled: [o_intf_mediakeys_ckb state]];
b_intfSettingChanged = YES;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment