X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fcontrols.m;h=826d89a852a5dad3329a409d7f7a79e0a7123a22;hb=ec57767b3dacc995a14e3eafe30eec76c5dd811e;hp=862e54bb3e82392365c283c12d08d420613025a6;hpb=2a2b478368aa26cfbf613f5205bc5ba1298a34ad;p=vlc diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index 862e54bb3e..826d89a852 100644 --- a/modules/gui/macosx/controls.m +++ b/modules/gui/macosx/controls.m @@ -1,20 +1,20 @@ /***************************************************************************** * controls.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2002-2006 the VideoLAN team + * Copyright (C) 2002-2007 the VideoLAN team * $Id$ * * Authors: Jon Lech Johansen * Christophe Massiot * Derk-Jan Hartman * Benjamin Pracht - * Felix KŸhne + * Felix Kühne * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @@ -41,7 +41,7 @@ #include /***************************************************************************** - * VLCControls implementation + * VLCControls implementation *****************************************************************************/ @implementation VLCControls @@ -59,29 +59,81 @@ [o_specificTime_ok_btn setTitle: _NS("OK")]; [o_specificTime_sec_lbl setStringValue: _NS("sec.")]; [o_specificTime_goTo_lbl setStringValue: _NS("Jump to time")]; + + o_repeat_off = [NSImage imageNamed:@"repeat_embedded"]; + + [self controlTintChanged]; + + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector( controlTintChanged ) + name: NSControlTintDidChangeNotification + object: nil]; +} + +- (void)controlTintChanged +{ + int i_repeat = 0; + if( [o_btn_repeat image] == o_repeat_single ) + i_repeat = 1; + else if( [o_btn_repeat image] == o_repeat_all ) + i_repeat = 2; + + if( [NSColor currentControlTint] == NSGraphiteControlTint ) + { + o_repeat_single = [NSImage imageNamed:@"repeat_single_embedded_graphite"]; + o_repeat_all = [NSImage imageNamed:@"repeat_embedded_graphite"]; + + [o_btn_shuffle setAlternateImage: [NSImage imageNamed: @"shuffle_embedded_graphite"]]; + [o_btn_addNode setAlternateImage: [NSImage imageNamed: @"add_embedded_graphite"]]; + } + else + { + o_repeat_single = [NSImage imageNamed:@"repeat_single_embedded_blue"]; + o_repeat_all = [NSImage imageNamed:@"repeat_embedded_blue"]; + + [o_btn_shuffle setAlternateImage: [NSImage imageNamed: @"shuffle_embedded_blue"]]; + [o_btn_addNode setAlternateImage: [NSImage imageNamed: @"add_embedded_blue"]]; + } + + /* update the repeat button, but keep its state */ + if( i_repeat == 1 ) + [self repeatOne]; + else if( i_repeat == 2 ) + [self repeatAll]; + else + [self repeatOff]; +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver: self]; + + [o_repeat_single release]; + [o_repeat_all release]; + [o_repeat_off release]; + + [super dealloc]; } - (IBAction)play:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; playlist_t * p_playlist = pl_Yield( p_intf ); - vlc_mutex_lock( &p_playlist->object_lock ); + vlc_object_lock( p_playlist ); if( playlist_IsEmpty( p_playlist ) ) { - vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_unlock( p_playlist ); vlc_object_release( p_playlist ); [o_main intfOpenFileGeneric: (id)sender]; } else { - vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_unlock( p_playlist ); vlc_object_release( p_playlist ); } - val.i_int = config_GetInt( p_intf, "key-play-pause" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE ); } /* Small helper method */ @@ -109,45 +161,37 @@ return o_vout_view; } - - (IBAction)stop:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-stop" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_STOP ); + /* Close the window directly, because we do know that there + * won't be anymore video. It's currently waiting a bit. */ + [[[self getVoutView] window] orderOut:self]; } - (IBAction)faster:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-faster" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_FASTER ); } - (IBAction)slower:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-slower" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_SLOWER ); } - (IBAction)prev:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-prev" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_PREV ); } - (IBAction)next:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-next" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_NEXT ); } - (IBAction)random:(id)sender @@ -170,26 +214,26 @@ config_PutInt( p_playlist, "random", 0 ); } - p_intf->p_sys->b_playmode_update = VLC_TRUE; - p_intf->p_sys->b_intf_update = VLC_TRUE; + p_intf->p_sys->b_playmode_update = true; + p_intf->p_sys->b_intf_update = true; vlc_object_release( p_playlist ); } /* three little ugly helpers */ - (void)repeatOne { - [o_btn_repeat setImage: [NSImage imageNamed:@"repeat_single_embedded_blue"]]; - [o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat_embedded_blue"]]; + [o_btn_repeat setImage: o_repeat_single]; + [o_btn_repeat setAlternateImage: o_repeat_all]; } - (void)repeatAll { - [o_btn_repeat setImage: [NSImage imageNamed:@"repeat_embedded_blue"]]; - [o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat_embedded"]]; + [o_btn_repeat setImage: o_repeat_all]; + [o_btn_repeat setAlternateImage: o_repeat_off]; } - (void)repeatOff { - [o_btn_repeat setImage: [NSImage imageNamed:@"repeat_embedded"]]; - [o_btn_repeat setAlternateImage: [NSImage imageNamed:@"repeat_single_embedded_blue"]]; + [o_btn_repeat setImage: o_repeat_off]; + [o_btn_repeat setAlternateImage: o_repeat_single]; } - (void)shuffle { @@ -212,57 +256,57 @@ if( !repeating.b_bool && !looping.b_bool ) { /* was: no repeating at all, switching to Repeat One */ - + /* set our button's look */ [self repeatOne]; - + /* prepare core communication */ - repeating.b_bool = VLC_TRUE; - looping.b_bool = VLC_FALSE; + repeating.b_bool = true; + looping.b_bool = false; config_PutInt( p_playlist, "repeat", 1 ); - config_PutInt( p_playlist, "loop", 0 ); - + config_PutInt( p_playlist, "loop", 0 ); + /* show the change */ vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) ); } else if( repeating.b_bool && !looping.b_bool ) { /* was: Repeat One, switching to Repeat All */ - + /* set our button's look */ [self repeatAll]; - + /* prepare core communication */ - repeating.b_bool = VLC_FALSE; - looping.b_bool = VLC_TRUE; - config_PutInt( p_playlist, "repeat", 0 ); - config_PutInt( p_playlist, "loop", 1 ); - + repeating.b_bool = false; + looping.b_bool = true; + config_PutInt( p_playlist, "repeat", 0 ); + config_PutInt( p_playlist, "loop", 1 ); + /* show the change */ vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) ); } else { /* was: Repeat All or bug in VLC, switching to Repeat Off */ - + /* set our button's look */ [self repeatOff]; - + /* prepare core communication */ - repeating.b_bool = VLC_FALSE; - looping.b_bool = VLC_FALSE; - config_PutInt( p_playlist, "repeat", 0 ); - config_PutInt( p_playlist, "loop", 0 ); - + repeating.b_bool = false; + looping.b_bool = false; + config_PutInt( p_playlist, "repeat", 0 ); + config_PutInt( p_playlist, "loop", 0 ); + /* show the change */ vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); } /* communicate with core and the main intf loop */ var_Set( p_playlist, "repeat", repeating ); - var_Set( p_playlist, "loop", looping ); - p_intf->p_sys->b_playmode_update = VLC_TRUE; - p_intf->p_sys->b_intf_update = VLC_TRUE; + var_Set( p_playlist, "loop", looping ); + p_intf->p_sys->b_playmode_update = true; + p_intf->p_sys->b_intf_update = true; vlc_object_release( p_playlist ); } @@ -291,9 +335,9 @@ vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); config_PutInt( p_playlist, "repeat", 0 ); } - - p_intf->p_sys->b_playmode_update = VLC_TRUE; - p_intf->p_sys->b_intf_update = VLC_TRUE; + + p_intf->p_sys->b_playmode_update = true; + p_intf->p_sys->b_intf_update = true; vlc_object_release( p_playlist ); } @@ -321,54 +365,45 @@ config_PutInt( p_playlist, "loop", 0 ); } - p_intf->p_sys->b_playmode_update = VLC_TRUE; - p_intf->p_sys->b_intf_update = VLC_TRUE; + p_intf->p_sys->b_playmode_update = true; + p_intf->p_sys->b_intf_update = true; vlc_object_release( p_playlist ); } - (IBAction)forward:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-jump+short" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT ); } - (IBAction)backward:(id)sender { vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-jump-short" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT ); } - (IBAction)volumeUp:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-vol-up" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_VOL_UP ); /* Manage volume status */ [o_main manageVolumeSlider]; } - (IBAction)volumeDown:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-vol-down" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_VOL_DOWN ); /* Manage volume status */ [o_main manageVolumeSlider]; } - (IBAction)mute:(id)sender { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-vol-mute" ); - var_Set( p_intf->p_libvlc, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_VOL_MUTE ); /* Manage volume status */ [o_main manageVolumeSlider]; } @@ -390,17 +425,15 @@ FIND_ANYWHERE ); if( p_vout != NULL ) { - vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-position" ); - var_Set( p_intf, "key-pressed", val ); + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_POSITION ); vlc_object_release( (vlc_object_t *)p_vout ); } } - (IBAction)toogleFullscreen:(id)sender { - NSMenuItem *o_mi = [[NSMenuItem alloc] initWithTitle: _NS("Fullscreen") action: nil keyEquivalent:@""]; - [self windowAction: [o_mi autorelease]]; + NSMenuItem *o_mi = [[NSMenuItem alloc] initWithTitle: _NS("Fullscreen") action: nil keyEquivalent:@""]; + [self windowAction: [o_mi autorelease]]; } - (BOOL) isFullscreen { @@ -443,6 +476,7 @@ } else { + /* Fullscreen state for next time will be saved here too */ [o_vout_view toggleFullscreen]; } } @@ -460,7 +494,7 @@ var_Set( p_playlist, "fullscreen", (vlc_value_t)!val.b_bool ); } - vlc_object_release( p_playlist ); + pl_Release( VLCIntf ); } } @@ -468,19 +502,30 @@ - (void)scrollWheel:(NSEvent *)theEvent { intf_thread_t * p_intf = VLCIntf; - float f_absvalue = [theEvent deltaY] > 0.0f ? [theEvent deltaY] : -[theEvent deltaY]; - int i, i_vlckey; - - f_absvalue = f_absvalue/2.0f + 1.0f; + float f_yabsvalue = [theEvent deltaY] > 0.0f ? [theEvent deltaY] : -[theEvent deltaY]; + float f_xabsvalue = [theEvent deltaX] > 0.0f ? [theEvent deltaX] : -[theEvent deltaX]; + int i, i_yvlckey, i_xvlckey; if ([theEvent deltaY] < 0.0f) - i_vlckey = KEY_MOUSEWHEELDOWN; + i_yvlckey = KEY_MOUSEWHEELDOWN; + else + i_yvlckey = KEY_MOUSEWHEELUP; + + if ([theEvent deltaX] < 0.0f) + i_xvlckey = KEY_MOUSEWHEELRIGHT; else - i_vlckey = KEY_MOUSEWHEELUP; + i_xvlckey = KEY_MOUSEWHEELLEFT; /* Send multiple key event, depending on the intensity of the event */ - for (i = 0; i < (int)f_absvalue; i++) - var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlckey ); + for (i = 0; i < (int)(f_yabsvalue/4.+1.) && f_yabsvalue > 0.05 ; i++) + var_SetInteger( p_intf->p_libvlc, "key-pressed", i_yvlckey ); + + /* Prioritize Y event (sound volume) over X event */ + if (f_yabsvalue < 0.05) + { + for (i = 0; i < (int)(f_xabsvalue/6.+1.) && f_xabsvalue > 0.05; i++) + var_SetInteger( p_intf->p_libvlc, "key-pressed", i_xvlckey ); + } } - (BOOL)keyEvent:(NSEvent *)o_event @@ -535,7 +580,7 @@ /* Variable doesn't exist or isn't handled */ return; } - + /* Make sure we want to display the variable */ if( i_type & VLC_VAR_HASCHOICE ) { @@ -544,7 +589,7 @@ if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 ) return; } - + /* Get the descriptive name of the variable */ var_Change( p_object, psz_variable, VLC_VAR_GETTEXT, &text, NULL ); [o_mi setTitle: [[VLCMain sharedInstance] localizedString: text.psz_string ? @@ -557,8 +602,8 @@ [self setupVarMenu: o_menu forMenuItem: o_mi target:p_object var:psz_variable selector:pf_callback]; - - if( text.psz_string ) free( text.psz_string ); + + free( text.psz_string ); return; } @@ -580,12 +625,12 @@ break; default: - if( text.psz_string ) free( text.psz_string ); + free( text.psz_string ); return; } if( ( i_type & VLC_VAR_TYPE ) == VLC_VAR_STRING ) free( val.psz_string ); - if( text.psz_string ) free( text.psz_string ); + free( text.psz_string ); } @@ -721,15 +766,14 @@ vlc_thread_set_priority( VLCIntf , VLC_THREAD_PRIORITY_LOW ); - p_object = (vlc_object_t *)vlc_object_get( VLCIntf, - [o_data objectID] ); + p_object = (vlc_object_t *)vlc_object_get( [o_data objectID] ); if( p_object != NULL ) { var_Set( p_object, strdup([o_data name]), [o_data value] ); vlc_object_release( p_object ); [o_pool release]; - return VLC_TRUE; + return true; } [o_pool release]; return VLC_EGENERIC; @@ -744,13 +788,12 @@ } else if( sender == o_specificTime_ok_btn ) { - input_thread_t * p_input = (input_thread_t *)vlc_object_find( VLCIntf, \ - VLC_OBJECT_INPUT, FIND_ANYWHERE ); + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); if( p_input ) { unsigned int timeInSec = 0; NSString * fieldContent = [o_specificTime_enter_fld stringValue]; - if( [[fieldContent componentsSeparatedByString: @":"] count] > 1 && + if( [[fieldContent componentsSeparatedByString: @":"] count] > 1 && [[fieldContent componentsSeparatedByString: @":"] count] <= 3 ) { NSArray * ourTempArray = \ @@ -774,14 +817,13 @@ input_Control( p_input, INPUT_SET_TIME, (int64_t)(timeInSec * 1000000)); vlc_object_release( p_input ); } - + [NSApp endSheet: o_specificTime_win]; [o_specificTime_win close]; } else { - input_thread_t * p_input = (input_thread_t *)vlc_object_find( VLCIntf, \ - VLC_OBJECT_INPUT, FIND_ANYWHERE ); + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); if( p_input ) { /* we can obviously only do that if an input is available */ @@ -821,10 +863,7 @@ vlc_value_t val; intf_thread_t * p_intf = VLCIntf; playlist_t * p_playlist = pl_Yield( p_intf ); - - vlc_mutex_lock( &p_playlist->object_lock ); - -#define p_input p_playlist->p_input + input_thread_t * p_input = playlist_CurrentInput( p_playlist ); if( [[o_mi title] isEqualToString: _NS("Faster")] || [[o_mi title] isEqualToString: _NS("Slower")] ) @@ -849,8 +888,10 @@ else if( [[o_mi title] isEqualToString: _NS("Previous")] || [[o_mi title] isEqualToString: _NS("Next")] ) { - /** \todo fix i_size use */ - bEnabled = p_playlist->items.i_size > 1; + /** \todo fix i_size use */ + PL_LOCK; + bEnabled = p_playlist->items.i_size > 1; + PL_UNLOCK; } else if( [[o_mi title] isEqualToString: _NS("Random")] ) { @@ -901,7 +942,7 @@ NSArray *o_windows = [NSApp orderedWindows]; NSEnumerator *o_enumerator = [o_windows objectEnumerator]; bEnabled = FALSE; - + vout_thread_t *p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout != NULL ) @@ -922,9 +963,10 @@ break; } } + vlc_object_release( (vlc_object_t *)p_vout ); } - else if( [[o_mi title] isEqualToString: _NS("Fullscreen")] ) + if( [[o_mi title] isEqualToString: _NS("Fullscreen")] ) { var_Get( p_playlist, "fullscreen", &val ); [o_mi setState: val.b_bool]; @@ -933,7 +975,7 @@ [o_main setupMenus]; /* Make sure video menu is up to date */ } - vlc_mutex_unlock( &p_playlist->object_lock ); + if( p_input ) vlc_object_release( p_input ); vlc_object_release( p_playlist ); return( bEnabled ); @@ -942,7 +984,7 @@ @end /***************************************************************************** - * VLCMenuExt implementation + * VLCMenuExt implementation ***************************************************************************** * Object connected to a playlistitem which remembers the data belonging to * the variable of the autogenerated menu @@ -995,7 +1037,7 @@ /***************************************************************************** - * VLCTimeField implementation + * VLCTimeField implementation ***************************************************************************** * we need this to catch our click-event in the controller window *****************************************************************************/