X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fcontrols.m;h=ffecbac7691be84bf919d0a7be726f6797f87ee7;hb=b58dfe3584f7a60fcd5afbdac903b513f7082804;hp=06018f682498d178d78761e530e09dea6544cee9;hpb=48515f2a60b833b4b9e5869190c533f7f848b821;p=vlc diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index 06018f6824..ffecbac769 100644 --- a/modules/gui/macosx/controls.m +++ b/modules/gui/macosx/controls.m @@ -1,12 +1,13 @@ /***************************************************************************** - * controls.m: MacOS X interface plugin + * controls.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2002-2003 VideoLAN - * $Id: controls.m,v 1.59 2003/12/15 19:25:56 bigben Exp $ + * Copyright (C) 2002-2005 the VideoLAN team + * $Id$ * * Authors: Jon Lech Johansen * Christophe Massiot - * Derk-Jan Hartman + * Derk-Jan Hartman + * Benjamin Pracht * * 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 @@ -20,7 +21,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -34,130 +35,92 @@ #include "vout.h" #include "open.h" #include "controls.h" -#include +#include /***************************************************************************** * VLCControls implementation *****************************************************************************/ @implementation VLCControls +- (void)awakeFromNib +{ + [o_specificTime_mi setTitle: _NS("Go To Position")]; + [o_specificTime_cancel_btn setTitle: _NS("Cancel")]; + [o_specificTime_ok_btn setTitle: _NS("OK")]; + [o_specificTime_sec_lbl setStringValue: _NS("sec.")]; + [o_specificTime_goTo_lbl setStringValue: _NS("Go to specific position")]; +} + - (IBAction)play:(id)sender { vlc_value_t val; - playlist_t * p_playlist; - intf_thread_t * p_intf = [NSApp getIntf]; - input_thread_t * p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, - FIND_ANYWHERE ); - - val.i_int = PLAYING_S; - if( p_input ) - { - var_Get( p_input, "state", &val ); - } - if( p_input && val.i_int != PAUSE_S ) - { - vout_OSDMessage( VLC_OBJECT(p_intf), _( "Pause" ) ); - val.i_int = PAUSE_S; - var_Set( p_input, "state", val ); - } - else - { - p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + intf_thread_t * p_intf = VLCIntf; + playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - if( p_playlist ) + if( p_playlist ) + { + vlc_mutex_lock( &p_playlist->object_lock ); + if( p_playlist->i_size <= 0 ) { - vlc_mutex_lock( &p_playlist->object_lock ); - if( p_playlist->i_size ) - { - vlc_mutex_unlock( &p_playlist->object_lock ); - vout_OSDMessage( VLC_OBJECT(p_intf), _( "Play" ) ); - playlist_Play( p_playlist ); - vlc_object_release( p_playlist ); - } - else - { - vlc_mutex_unlock( &p_playlist->object_lock ); - vlc_object_release( p_playlist ); - [o_open openFileGeneric: nil]; - } + vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_release( p_playlist ); + [o_main intfOpenFileGeneric: (id)sender]; + } + else + { + vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_release( p_playlist ); } + } - if( p_input ) vlc_object_release( p_input ); + val.i_int = config_GetInt( p_intf, "key-play-pause" ); + var_Set( p_intf->p_vlc, "key-pressed", val ); } - (IBAction)stop:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( p_playlist != NULL ) - { - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Stop" ) ); - playlist_Stop( p_playlist ); - vlc_object_release( p_playlist ); - } + vlc_value_t val; + intf_thread_t * p_intf = VLCIntf; + val.i_int = config_GetInt( p_intf, "key-stop" ); + var_Set( p_intf->p_vlc, "key-pressed", val ); } - (IBAction)faster:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - input_thread_t * p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, - FIND_ANYWHERE ); - if( p_input != NULL ) - { - vlc_value_t val; val.b_bool = VLC_TRUE; - - var_Set( p_input, "rate-faster", val ); - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Faster" ) ); - vlc_object_release( p_input ); - } + vlc_value_t val; + intf_thread_t * p_intf = VLCIntf; + val.i_int = config_GetInt( p_intf, "key-faster" ); + var_Set( p_intf->p_vlc, "key-pressed", val ); } - (IBAction)slower:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - input_thread_t * p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, - FIND_ANYWHERE ); - if( p_input != NULL ) - { - vlc_value_t val; val.b_bool = VLC_TRUE; - - var_Set( p_input, "rate-slower", val ); - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Slower" ) ); - vlc_object_release( p_input ); - } + vlc_value_t val; + intf_thread_t * p_intf = VLCIntf; + val.i_int = config_GetInt( p_intf, "key-slower" ); + var_Set( p_intf->p_vlc, "key-pressed", val ); } - (IBAction)prev:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( p_playlist ) - { - playlist_Prev( p_playlist ); - vlc_object_release( p_playlist ); - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Previous" ) ); - } + vlc_value_t val; + intf_thread_t * p_intf = VLCIntf; + val.i_int = config_GetInt( p_intf, "key-prev" ); + var_Set( p_intf->p_vlc, "key-pressed", val ); } - (IBAction)next:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( p_playlist ) - { - playlist_Next( p_playlist ); - vlc_object_release( p_playlist ); - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Next" ) ); - } + vlc_value_t val; + intf_thread_t * p_intf = VLCIntf; + val.i_int = config_GetInt( p_intf, "key-next" ); + var_Set( p_intf->p_vlc, "key-pressed", val ); } - (IBAction)random:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; vlc_value_t val; + intf_thread_t * p_intf = VLCIntf; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) @@ -170,22 +133,22 @@ var_Set( p_playlist, "random", val ); if( val.b_bool ) { - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Shuffle On" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random On" ) ); } else { - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Shuffle Off" ) ); - } + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random Off" ) ); + } - p_intf->p_sys->b_playlist_update = VLC_TRUE; + p_intf->p_sys->b_playmode_update = VLC_TRUE; p_intf->p_sys->b_intf_update = VLC_TRUE; vlc_object_release( p_playlist ); } - (IBAction)repeat:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; vlc_value_t val; + intf_thread_t * p_intf = VLCIntf; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) @@ -194,26 +157,30 @@ } var_Get( p_playlist, "repeat", &val ); + if (!val.b_bool) + { + var_Set( p_playlist, "loop", val ); + } val.b_bool = !val.b_bool; var_Set( p_playlist, "repeat", val ); if( val.b_bool ) { - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Repeat On" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) ); } else { - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Repeat Off" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); } - p_intf->p_sys->b_playlist_update = VLC_TRUE; + p_intf->p_sys->b_playmode_update = VLC_TRUE; p_intf->p_sys->b_intf_update = VLC_TRUE; vlc_object_release( p_playlist ); } - (IBAction)loop:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; vlc_value_t val; + intf_thread_t * p_intf = VLCIntf; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist == NULL ) @@ -222,109 +189,82 @@ } var_Get( p_playlist, "loop", &val ); + if (!val.b_bool) + { + var_Set( p_playlist, "repeat", val ); + } val.b_bool = !val.b_bool; var_Set( p_playlist, "loop", val ); if( val.b_bool ) { - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Loop On" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) ); } else { - vout_OSDMessage( (vlc_object_t *)p_intf, _( "Loop Off" ) ); - } + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); + } - p_intf->p_sys->b_playlist_update = VLC_TRUE; + p_intf->p_sys->b_playmode_update = VLC_TRUE; p_intf->p_sys->b_intf_update = VLC_TRUE; vlc_object_release( p_playlist ); } - (IBAction)forward:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - input_thread_t * p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, - FIND_ANYWHERE ); - if( p_input != NULL ) - { - vlc_value_t time; - time.i_time = 10 * 1000000; - var_Set( p_input, "time-offset", time ); - vlc_object_release( p_input ); - } + 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_vlc, "key-pressed", val ); } - (IBAction)backward:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - input_thread_t * p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, - FIND_ANYWHERE ); - if( p_input != NULL ) - { - vlc_value_t time; - time.i_time = -10 * 1000000; - var_Set( p_input, "time-offset", time ); - vlc_object_release( p_input ); - } + 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_vlc, "key-pressed", val ); } + - (IBAction)volumeUp:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - - if( p_intf->p_sys->b_mute ) - { - [self mute: nil]; - } - - aout_VolumeUp( p_intf, 1, NULL ); - - [self updateVolumeSlider]; + 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_vlc, "key-pressed", val ); + /* Manage volume status */ + [o_main manageVolumeSlider]; } - (IBAction)volumeDown:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - - if( p_intf->p_sys->b_mute ) - { - [self mute: nil]; - } - - aout_VolumeDown( p_intf, 1, NULL ); - - [self updateVolumeSlider]; + 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_vlc, "key-pressed", val ); + /* Manage volume status */ + [o_main manageVolumeSlider]; } - (IBAction)mute:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; - audio_volume_t i_volume; - - aout_VolumeMute( p_intf, &i_volume ); - p_intf->p_sys->b_mute = ( i_volume == 0 ); - - [self updateVolumeSlider]; + 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_vlc, "key-pressed", val ); + /* Manage volume status */ + [o_main manageVolumeSlider]; } - (IBAction)volumeSliderUpdated:(id)sender { - intf_thread_t * p_intf = [NSApp getIntf]; + intf_thread_t * p_intf = VLCIntf; audio_volume_t i_volume = (audio_volume_t)[sender intValue]; - - aout_VolumeSet( p_intf, i_volume * AOUT_VOLUME_STEP ); -} - -- (void)updateVolumeSlider -{ - intf_thread_t * p_intf = [NSApp getIntf]; - audio_volume_t i_volume; - char string[9]; - - aout_VolumeGet( p_intf, &i_volume ); - - [o_volumeslider setFloatValue: (float)(i_volume / AOUT_VOLUME_STEP)]; - - sprintf( string, "Vol %d%%", i_volume*100/AOUT_VOLUME_MAX ); - vout_OSDMessage( (vlc_object_t *)p_intf, string ); + int i_volume_step = 0; + i_volume_step = config_GetInt( p_intf->p_vlc, "volume-step" ); + aout_VolumeSet( p_intf, i_volume * i_volume_step ); + /* Manage volume status */ + [o_main manageVolumeSlider]; } - (IBAction)windowAction:(id)sender @@ -333,37 +273,70 @@ NSString *o_title = [sender title]; NSArray *o_windows = [NSApp orderedWindows]; NSEnumerator *o_enumerator = [o_windows objectEnumerator]; - vout_thread_t *p_vout = vlc_object_find( [NSApp getIntf], VLC_OBJECT_VOUT, + vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout != NULL ) { + id o_embedded_vout_list = [[VLCMain sharedInstance] getEmbeddedList]; while ((o_window = [o_enumerator nextObject])) { - if( [[o_window className] isEqualToString: @"VLCWindow"] ) + id o_vout_view = nil; + /* We have an embedded vout */ + if( [o_embedded_vout_list windowContainsEmbedded: o_window] ) + { + o_vout_view = [o_embedded_vout_list getViewForWindow: o_window]; + } + /* We have a detached Vout */ + else if( [[o_window className] isEqualToString: @"VLCWindow"] ) + { + msg_Dbg( VLCIntf, "detached vout controls.m call getVoutView" ); + o_vout_view = [o_window getVoutView]; + } + + if( o_vout_view ) { if( [o_title isEqualToString: _NS("Half Size") ] ) - [o_window scaleWindowWithFactor: 0.5]; + [o_vout_view scaleWindowWithFactor: 0.5]; else if( [o_title isEqualToString: _NS("Normal Size") ] ) - [o_window scaleWindowWithFactor: 1.0]; + [o_vout_view scaleWindowWithFactor: 1.0]; else if( [o_title isEqualToString: _NS("Double Size") ] ) - [o_window scaleWindowWithFactor: 2.0]; - else if( [o_title isEqualToString: _NS("Float On Top") ] ) - [o_window toggleFloatOnTop]; - else if( [o_title isEqualToString: _NS("Fit To Screen") ] ) + [o_vout_view scaleWindowWithFactor: 2.0]; + else if( [o_title isEqualToString: _NS("Float on Top") ] ) + [o_vout_view toggleFloatOnTop]; + else if( [o_title isEqualToString: _NS("Fit to Screen") ] ) { if( ![o_window isZoomed] ) [o_window performZoom:self]; } + else if( [o_title isEqualToString: _NS("Snapshot") ] ) + { + [o_vout_view snapshot]; + } else { - [o_window toggleFullscreen]; + [o_vout_view toggleFullscreen]; } break; } } vlc_object_release( (vlc_object_t *)p_vout ); } + else + { + playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + if( p_playlist && ( [o_title isEqualToString: _NS("Fullscreen")] || + [sender isKindOfClass:[NSButton class]] ) ) + { + vlc_value_t val; + var_Get( p_playlist, "fullscreen", &val ); + var_Set( p_playlist, "fullscreen", (vlc_value_t)!val.b_bool ); + } + if( p_playlist ) vlc_object_release( (vlc_object_t *)p_playlist ); + } + } - (void)setupVarMenuItem:(NSMenuItem *)o_mi @@ -398,7 +371,7 @@ /* Get the descriptive name of the variable */ var_Change( p_object, psz_variable, VLC_VAR_GETTEXT, &text, NULL ); - [o_mi setTitle: [NSApp localizedString: text.psz_string ? + [o_mi setTitle: [[VLCMain sharedInstance] localizedString: text.psz_string ? text.psz_string : strdup( psz_variable ) ]]; var_Get( p_object, psz_variable, &val ); @@ -426,7 +399,8 @@ o_data = [[VLCMenuExt alloc] initWithVar: psz_variable Object: p_object->i_object_id Value: val ofType: i_type]; [o_mi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]]; - [o_mi setState: val.b_bool ? TRUE : FALSE ]; + if( !( i_type & VLC_VAR_ISCOMMAND ) ) + [o_mi setState: val.b_bool ? TRUE : FALSE ]; break; default: @@ -434,7 +408,7 @@ return; } - if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string ); + if( ( i_type & VLC_VAR_TYPE ) == VLC_VAR_STRING ) free( val.psz_string ); if( text.psz_string ) free( text.psz_string ); } @@ -508,29 +482,11 @@ switch( i_type & VLC_VAR_TYPE ) { - case VLC_VAR_VARIABLE: - - /* This is causing crashes for the moment. - o_title = [NSApp localizedString: text_list.p_list->p_values[i].psz_string ? - text_list.p_list->p_values[i].psz_string : val_list.p_list->p_values[i].psz_string ]; - - o_data = [[VLCMenuExt alloc] initWithVar: strdup(psz_variable) Object: p_object->i_object_id - Value: val ofType: i_type]; - [o_lmi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]]; - - // Create a submenu - NSMenu *o_menu = [o_lmi submenu]; - - [self setupVarMenu: o_menu forMenuItem: o_lmi target:p_object - var:psz_variable selector:pf_callback]; -*/ - return; - case VLC_VAR_STRING: another_val.psz_string = strdup(val_list.p_list->p_values[i].psz_string); - o_title = [NSApp localizedString: text_list.p_list->p_values[i].psz_string ? + o_title = [[VLCMain sharedInstance] localizedString: text_list.p_list->p_values[i].psz_string ? text_list.p_list->p_values[i].psz_string : val_list.p_list->p_values[i].psz_string ]; o_lmi = [o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""]; @@ -538,8 +494,8 @@ Value: another_val ofType: i_type]; [o_lmi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]]; [o_lmi setTarget: self]; - - if( !strcmp( val.psz_string, val_list.p_list->p_values[i].psz_string ) ) + + if( !strcmp( val.psz_string, val_list.p_list->p_values[i].psz_string ) && !( i_type & VLC_VAR_ISCOMMAND ) ) [o_lmi setState: TRUE ]; break; @@ -547,7 +503,7 @@ case VLC_VAR_INTEGER: o_title = text_list.p_list->p_values[i].psz_string ? - [NSApp localizedString: strdup( text_list.p_list->p_values[i].psz_string )] : + [[VLCMain sharedInstance] localizedString: strdup( text_list.p_list->p_values[i].psz_string )] : [NSString stringWithFormat: @"%d", val_list.p_list->p_values[i].i_int]; @@ -557,7 +513,7 @@ [o_lmi setRepresentedObject: [NSValue valueWithPointer:[ o_data retain]]]; [o_lmi setTarget: self]; - if( val_list.p_list->p_values[i].i_int == val.i_int ) + if( val_list.p_list->p_values[i].i_int == val.i_int && !( i_type & VLC_VAR_ISCOMMAND ) ) [o_lmi setState: TRUE ]; break; @@ -565,7 +521,7 @@ break; } } - + /* clean up everything */ if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string ); var_Change( p_object, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list ); @@ -587,9 +543,9 @@ NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; VLCMenuExt *o_data = (VLCMenuExt *)_o_data; - vlc_thread_set_priority( [NSApp getIntf] , VLC_THREAD_PRIORITY_LOW ); + vlc_thread_set_priority( VLCIntf , VLC_THREAD_PRIORITY_LOW ); - p_object = (vlc_object_t *)vlc_object_get( [NSApp getIntf], + p_object = (vlc_object_t *)vlc_object_get( VLCIntf, [o_data objectID] ); if( p_object != NULL ) @@ -603,6 +559,49 @@ return VLC_EGENERIC; } +- (IBAction)goToSpecificTime:(id)sender +{ + if( sender == o_specificTime_cancel_btn ) + { + [NSApp endSheet: o_specificTime_win]; + [o_specificTime_win close]; + } + else if( sender == o_specificTime_ok_btn ) + { + input_thread_t * p_input = (input_thread_t *)vlc_object_find( VLCIntf, \ + VLC_OBJECT_INPUT, FIND_ANYWHERE ); + if( p_input ) + { + input_Control( p_input, INPUT_SET_TIME, \ + (int64_t)([o_specificTime_enter_fld intValue] * 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 ); + if( p_input ) + { + /* we can obviously only do that if an input is available */ + vlc_value_t pos, length; + var_Get( p_input, "time", &pos ); + [o_specificTime_enter_fld setIntValue: (pos.i_time / 1000000)]; + var_Get( p_input, "length", &length ); + [o_specificTime_stepper setMaxValue: (length.i_time / 1000000)]; + + [NSApp beginSheet: o_specificTime_win modalForWindow: \ + [NSApp mainWindow] modalDelegate: self didEndSelector: nil \ + contextInfo: nil]; + [o_specificTime_win makeKeyWindow]; + vlc_object_release( p_input ); + } + } +} + @end @implementation VLCControls (NSMenuValidation) @@ -611,7 +610,7 @@ { BOOL bEnabled = TRUE; vlc_value_t val; - intf_thread_t * p_intf = [NSApp getIntf]; + intf_thread_t * p_intf = VLCIntf; playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); @@ -619,17 +618,16 @@ { vlc_mutex_lock( &p_playlist->object_lock ); } + else return FALSE; #define p_input p_playlist->p_input if( [[o_mi title] isEqualToString: _NS("Faster")] || [[o_mi title] isEqualToString: _NS("Slower")] ) { - if( p_playlist != NULL && p_input != NULL ) + if( p_input != NULL ) { - vlc_mutex_lock( &p_input->stream.stream_lock ); - bEnabled = p_input->stream.b_pace_control; - vlc_mutex_unlock( &p_input->stream.stream_lock ); + bEnabled = p_input->input.b_can_pace_control; } else { @@ -638,45 +636,32 @@ } else if( [[o_mi title] isEqualToString: _NS("Stop")] ) { - if( p_playlist == NULL || p_input == NULL ) + if( p_input == NULL ) { bEnabled = FALSE; } + [o_main setupMenus]; /* Make sure input menu is up to date */ } else if( [[o_mi title] isEqualToString: _NS("Previous")] || [[o_mi title] isEqualToString: _NS("Next")] ) { - if( p_playlist == NULL ) - { - bEnabled = FALSE; - } - else - { bEnabled = p_playlist->i_size > 1; - - if( p_input != NULL ) - { - vlc_mutex_lock( &p_input->stream.stream_lock ); - bEnabled |= p_input->stream.i_area_nb > 1; - vlc_mutex_unlock( &p_input->stream.stream_lock ); - } - } } - else if( [[o_mi title] isEqualToString: _NS("Shuffle")] ) + else if( [[o_mi title] isEqualToString: _NS("Random")] ) { int i_state; var_Get( p_playlist, "random", &val ); i_state = val.b_bool ? NSOnState : NSOffState; [o_mi setState: i_state]; } - else if( [[o_mi title] isEqualToString: _NS("Repeat Item")] ) + else if( [[o_mi title] isEqualToString: _NS("Repeat One")] ) { int i_state; var_Get( p_playlist, "repeat", &val ); i_state = val.b_bool ? NSOnState : NSOffState; [o_mi setState: i_state]; } - else if( [[o_mi title] isEqualToString: _NS("Repeat Playlist")] ) + else if( [[o_mi title] isEqualToString: _NS("Repeat All")] ) { int i_state; var_Get( p_playlist, "loop", &val ); @@ -686,47 +671,45 @@ else if( [[o_mi title] isEqualToString: _NS("Step Forward")] || [[o_mi title] isEqualToString: _NS("Step Backward")] ) { - if( p_playlist != NULL && p_input != NULL ) + if( p_input != NULL ) { - vlc_mutex_lock( &p_input->stream.stream_lock ); - bEnabled = p_input->stream.b_seekable; - vlc_mutex_unlock( &p_input->stream.stream_lock ); - } - else - { - bEnabled = FALSE; + var_Get( p_input, "seekable", &val); + bEnabled = val.b_bool; } } else if( [[o_mi title] isEqualToString: _NS("Mute")] ) { [o_mi setState: p_intf->p_sys->b_mute ? NSOnState : NSOffState]; + [o_main setupMenus]; /* Make sure audio menu is up to date */ } - else if( [[o_mi title] isEqualToString: _NS("Fullscreen")] || - [[o_mi title] isEqualToString: _NS("Half Size")] || + else if( [[o_mi title] isEqualToString: _NS("Half Size")] || [[o_mi title] isEqualToString: _NS("Normal Size")] || [[o_mi title] isEqualToString: _NS("Double Size")] || - [[o_mi title] isEqualToString: _NS("Fit To Screen")] || - [[o_mi title] isEqualToString: _NS("Float On Top")] ) + [[o_mi title] isEqualToString: _NS("Fit to Screen")] || + [[o_mi title] isEqualToString: _NS("Snapshot")] || + [[o_mi title] isEqualToString: _NS("Fullscreen")] || + [[o_mi title] isEqualToString: _NS("Float on Top")] ) { id o_window; NSArray *o_windows = [NSApp orderedWindows]; NSEnumerator *o_enumerator = [o_windows objectEnumerator]; bEnabled = FALSE; - if ( [[o_mi title] isEqualToString: _NS("Float On Top")] ) - { - int i_state = config_GetInt( p_playlist, "video-on-top" ) ? - NSOnState : NSOffState; - [o_mi setState: i_state]; - } - vout_thread_t *p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout != NULL ) { - while ((o_window = [o_enumerator nextObject])) + if( [[o_mi title] isEqualToString: _NS("Float on Top")] ) + { + var_Get( p_vout, "video-on-top", &val ); + [o_mi setState: val.b_bool ? NSOnState : NSOffState]; + } + + while( (o_window = [o_enumerator nextObject])) { - if( [[o_window className] isEqualToString: @"VLCWindow"] ) + if( [[o_window className] isEqualToString: @"VLCWindow"] || + [[[VLCMain sharedInstance] getEmbeddedList] + windowContainsEmbedded: o_window]) { bEnabled = TRUE; break; @@ -734,13 +717,17 @@ } vlc_object_release( (vlc_object_t *)p_vout ); } + else if( [[o_mi title] isEqualToString: _NS("Fullscreen")] ) + { + var_Get( p_playlist, "fullscreen", &val ); + [o_mi setState: val.b_bool]; + bEnabled = TRUE; + } + [o_main setupMenus]; /* Make sure video menu is up to date */ } - if( p_playlist != NULL ) - { - vlc_mutex_unlock( &p_playlist->object_lock ); - vlc_object_release( p_playlist ); - } + vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_release( p_playlist ); return( bEnabled ); } @@ -774,6 +761,7 @@ - (void)dealloc { free( psz_name ); + [super dealloc]; } - (char *)name @@ -797,3 +785,18 @@ } @end + + +/***************************************************************************** + * VLCTimeField implementation + ***************************************************************************** + * we need this to catch our click-event in the controller window + *****************************************************************************/ + +@implementation VLCTimeField +- (void)mouseDown: (NSEvent *)ourEvent +{ + if( [ourEvent clickCount] > 1 ) + [[[VLCMain sharedInstance] getControls] goToSpecificTime: nil]; +} +@end