X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fcontrols.m;h=75536d4673548f23fdbb47ae53ceba91ba75ee04;hb=79559bdf7ff37fb54364a3ef7917b1e5481dc4c2;hp=0441bcf0baa2cc2a25be1e58dad494134243ab7a;hpb=39e14fc7656f3f4495f14b44dcb10c23ed557364;p=vlc diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index 0441bcf0ba..75536d4673 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,6 +59,60 @@ [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 @@ -67,16 +121,16 @@ 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 ); } @@ -109,13 +163,15 @@ 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 ); + /* 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 @@ -170,26 +226,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 +268,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 +347,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,8 +377,8 @@ 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 ); } @@ -399,8 +455,8 @@ } - (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 +499,8 @@ } else { + playlist_t * p_playlist = pl_Yield( VLCIntf ); + /* Fullscreen state for next time will be saved here too */ [o_vout_view toggleFullscreen]; } } @@ -460,7 +518,7 @@ var_Set( p_playlist, "fullscreen", (vlc_value_t)!val.b_bool ); } - vlc_object_release( p_playlist ); + pl_Release( VLCIntf ); } } @@ -486,12 +544,12 @@ 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 ); - } + /* 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 @@ -546,7 +604,7 @@ /* Variable doesn't exist or isn't handled */ return; } - + /* Make sure we want to display the variable */ if( i_type & VLC_VAR_HASCHOICE ) { @@ -555,7 +613,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 ? @@ -568,8 +626,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; } @@ -591,12 +649,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 ); } @@ -732,15 +790,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; @@ -761,7 +818,7 @@ { 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 = \ @@ -785,7 +842,7 @@ 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]; } @@ -832,10 +889,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")] ) @@ -860,8 +914,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")] ) { @@ -912,7 +968,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 ) @@ -933,9 +989,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]; @@ -944,7 +1001,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 ); @@ -953,7 +1010,7 @@ @end /***************************************************************************** - * VLCMenuExt implementation + * VLCMenuExt implementation ***************************************************************************** * Object connected to a playlistitem which remembers the data belonging to * the variable of the autogenerated menu @@ -1006,7 +1063,7 @@ /***************************************************************************** - * VLCTimeField implementation + * VLCTimeField implementation ***************************************************************************** * we need this to catch our click-event in the controller window *****************************************************************************/