X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fcontrols.m;h=e872714752100e02bfe0e67351fbb46b1893c7ce;hb=b6d0e5a07a9a32894e31da69e25e81dec0366dc5;hp=ebddcefc1fe8b1739a207366c9fe1946220d5b8d;hpb=3a8876ee0e476cbfbd20fc94ef1a7e99fdb9ff81;p=vlc diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index ebddcefc1f..e872714752 100644 --- a/modules/gui/macosx/controls.m +++ b/modules/gui/macosx/controls.m @@ -1,12 +1,14 @@ /***************************************************************************** * controls.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2002-2005 VideoLAN + * Copyright (C) 2002-2006 the VideoLAN team * $Id$ * * Authors: Jon Lech Johansen * Christophe Massiot * Derk-Jan Hartman + * Benjamin Pracht + * 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 @@ -20,7 +22,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. *****************************************************************************/ /***************************************************************************** @@ -30,49 +32,90 @@ #include /* for MAXPATHLEN */ #include -#include "intf.h" -#include "vout.h" -#include "open.h" -#include "controls.h" -#include +#import "intf.h" +#import "vout.h" +#import "open.h" +#import "controls.h" +#import "playlist.h" +#include + /***************************************************************************** * VLCControls implementation *****************************************************************************/ @implementation VLCControls +- (id)init +{ + [super init]; + o_fs_panel = [[VLCFSPanel alloc] init]; + return self; +} + +- (void)awakeFromNib +{ + [o_specificTime_mi setTitle: _NS("Jump To Time")]; + [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("Jump to time")]; +} + - (IBAction)play:(id)sender { 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 ) + playlist_t * p_playlist = pl_Yield( p_intf ); + + vlc_mutex_lock( &p_playlist->object_lock ); + if( playlist_IsEmpty( p_playlist ) ) + { + vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_release( p_playlist ); + [o_main intfOpenFileGeneric: (id)sender]; + } + else { - vlc_mutex_lock( &p_playlist->object_lock ); - if( p_playlist->i_size <= 0 ) + vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_release( p_playlist ); + } + + val.i_int = config_GetInt( p_intf, "key-play-pause" ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); +} + +/* Small helper method */ + +-(id) getVoutView +{ + id o_window; + id o_vout_view = nil; + id o_embedded_vout_list = [[VLCMain sharedInstance] getEmbeddedList]; + NSEnumerator *o_enumerator = [[NSApp orderedWindows] objectEnumerator]; + while( !o_vout_view && ( o_window = [o_enumerator nextObject] ) ) + { + /* We have an embedded vout */ + if( [o_embedded_vout_list windowContainsEmbedded: o_window] ) { - vlc_mutex_unlock( &p_playlist->object_lock ); - vlc_object_release( p_playlist ); - [o_main intfOpenFileGeneric: (id)sender]; + o_vout_view = [o_embedded_vout_list getViewForWindow: o_window]; } - else + /* We have a detached vout */ + else if( [[o_window className] isEqualToString: @"VLCWindow"] ) { - vlc_mutex_unlock( &p_playlist->object_lock ); - vlc_object_release( p_playlist ); + msg_Dbg( VLCIntf, "detached vout controls.m call getVoutView" ); + o_vout_view = [o_window getVoutView]; } - } - val.i_int = config_GetInt( p_intf, "key-play-pause" ); - var_Set( p_intf->p_vlc, "key-pressed", val ); + 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_vlc, "key-pressed", val ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); } - (IBAction)faster:(id)sender @@ -80,7 +123,7 @@ 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 ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); } - (IBAction)slower:(id)sender @@ -88,7 +131,7 @@ 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 ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); } - (IBAction)prev:(id)sender @@ -96,7 +139,7 @@ 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 ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); } - (IBAction)next:(id)sender @@ -104,19 +147,14 @@ 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 ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); } - (IBAction)random:(id)sender { 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 ) - { - return; - } + playlist_t * p_playlist = pl_Yield( p_intf ); var_Get( p_playlist, "random", &val ); val.b_bool = !val.b_bool; @@ -124,10 +162,12 @@ if( val.b_bool ) { vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random On" ) ); + config_PutInt( p_playlist, "random", 1 ); } else { vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random Off" ) ); + config_PutInt( p_playlist, "random", 0 ); } p_intf->p_sys->b_playmode_update = VLC_TRUE; @@ -135,17 +175,114 @@ vlc_object_release( p_playlist ); } -- (IBAction)repeat:(id)sender +/* three little ugly helpers */ +- (void)repeatOne +{ + [o_btn_repeat setImage: [[NSImage alloc] initWithContentsOfFile: + [[NSBundle mainBundle] pathForImageResource:@"repeat_single_embedded_blue.png"]]]; + [o_btn_repeat setAlternateImage: [[NSImage alloc] initWithContentsOfFile: + [[NSBundle mainBundle] pathForImageResource:@"repeat_embedded_blue.png"]]]; +} +- (void)repeatAll +{ + [o_btn_repeat setImage: [[NSImage alloc] initWithContentsOfFile: + [[NSBundle mainBundle] pathForImageResource:@"repeat_embedded_blue.png"]]]; + [o_btn_repeat setAlternateImage: [[NSImage alloc] initWithContentsOfFile: + [[NSBundle mainBundle] pathForImageResource:@"repeat_embedded.png"]]]; +} +- (void)repeatOff +{ + [o_btn_repeat setImage: [[NSImage alloc] initWithContentsOfFile: + [[NSBundle mainBundle] pathForImageResource:@"repeat_embedded.png"]]]; + [o_btn_repeat setAlternateImage: [[NSImage alloc] initWithContentsOfFile: + [[NSBundle mainBundle] pathForImageResource:@"repeat_single_embedded_blue.png"]]]; +} +- (void)shuffle { vlc_value_t val; + playlist_t *p_playlist = pl_Yield( VLCIntf ); + var_Get( p_playlist, "random", &val ); + [o_btn_shuffle setState: val.b_bool]; + vlc_object_release( p_playlist ); +} + +- (IBAction)repeatButtonAction:(id)sender +{ + vlc_value_t looping,repeating; intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( p_playlist == NULL ) + playlist_t * p_playlist = pl_Yield( p_intf ); + + var_Get( p_playlist, "repeat", &repeating ); + var_Get( p_playlist, "loop", &looping ); + + [[o_btn_repeat image] release]; + [[o_btn_repeat alternateImage] release]; + + if( !repeating.b_bool && !looping.b_bool ) { - return; + /* 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; + config_PutInt( p_playlist, "repeat", 1 ); + 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 ); + + /* 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 ); + + /* 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; + + vlc_object_release( p_playlist ); +} + + +- (IBAction)repeat:(id)sender +{ + vlc_value_t val; + intf_thread_t * p_intf = VLCIntf; + playlist_t * p_playlist = pl_Yield( p_intf ); + var_Get( p_playlist, "repeat", &val ); if (!val.b_bool) { @@ -155,13 +292,15 @@ var_Set( p_playlist, "repeat", val ); if( val.b_bool ) { - vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) ); + config_PutInt( p_playlist, "repeat", 1 ); } else { 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; vlc_object_release( p_playlist ); @@ -171,12 +310,7 @@ { 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 ) - { - return; - } + playlist_t * p_playlist = pl_Yield( p_intf ); var_Get( p_playlist, "loop", &val ); if (!val.b_bool) @@ -187,11 +321,13 @@ var_Set( p_playlist, "loop", val ); if( val.b_bool ) { - vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) ); + vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) ); + config_PutInt( p_playlist, "loop", 1 ); } else { vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); + config_PutInt( p_playlist, "loop", 0 ); } p_intf->p_sys->b_playmode_update = VLC_TRUE; @@ -203,16 +339,16 @@ { vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-jump+10sec" ); - var_Set( p_intf->p_vlc, "key-pressed", val ); + val.i_int = config_GetInt( p_intf, "key-jump+short" ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); } - (IBAction)backward:(id)sender { vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - val.i_int = config_GetInt( p_intf, "key-jump-10sec" ); - var_Set( p_intf->p_vlc, "key-pressed", val ); + val.i_int = config_GetInt( p_intf, "key-jump-short" ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); } @@ -221,7 +357,7 @@ 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 ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); /* Manage volume status */ [o_main manageVolumeSlider]; } @@ -231,7 +367,7 @@ 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 ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); /* Manage volume status */ [o_main manageVolumeSlider]; } @@ -241,7 +377,7 @@ 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 ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); /* Manage volume status */ [o_main manageVolumeSlider]; } @@ -250,69 +386,98 @@ { 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 ); + int i_volume_step = 0; + i_volume_step = config_GetInt( p_intf->p_libvlc, "volume-step" ); + aout_VolumeSet( p_intf, i_volume * i_volume_step ); /* Manage volume status */ [o_main manageVolumeSlider]; } - (IBAction)windowAction:(id)sender { - id o_window = [NSApp keyWindow]; NSString *o_title = [sender title]; - NSArray *o_windows = [NSApp orderedWindows]; - NSEnumerator *o_enumerator = [o_windows objectEnumerator]; + vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); - if( p_vout != NULL ) { - while ((o_window = [o_enumerator nextObject])) + id o_vout_view = [self getVoutView]; + if( o_vout_view ) { - if( [[o_window className] isEqualToString: @"VLCWindow"] ) + if( [o_title isEqualToString: _NS("Half Size") ] ) + [o_vout_view scaleWindowWithFactor: 0.5]; + else if( [o_title isEqualToString: _NS("Normal Size") ] ) + [o_vout_view scaleWindowWithFactor: 1.0]; + else if( [o_title isEqualToString: _NS("Double Size") ] ) + [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_title isEqualToString: _NS("Half Size") ] ) - [o_window scaleWindowWithFactor: 0.5]; - else if( [o_title isEqualToString: _NS("Normal Size") ] ) - [o_window 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") ] ) - { - if( ![o_window isZoomed] ) - [o_window performZoom:self]; - } - else if( [o_title isEqualToString: _NS("Snapshot") ] ) - { - [o_window snapshot]; - } - else - { - [o_window toggleFullscreen]; - } - break; + id o_window = [o_vout_view getWindow]; + if( ![o_window isZoomed] ) + [o_window performZoom:self]; + } + else if( [o_title isEqualToString: _NS("Snapshot") ] ) + { + [o_vout_view snapshot]; + } + else + { + [o_vout_view toggleFullscreen]; } } vlc_object_release( (vlc_object_t *)p_vout ); } else { - playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t * p_playlist = pl_Yield( VLCIntf ); - if( p_playlist && ( [o_title isEqualToString: _NS("Fullscreen")] || - [sender isKindOfClass:[NSButton class]] ) ) + if( [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 ); + + vlc_object_release( p_playlist ); } } +- (BOOL)keyEvent:(NSEvent *)o_event +{ + BOOL eventHandled = NO; + unichar key = [[o_event charactersIgnoringModifiers] characterAtIndex: 0]; + + if( key ) + { + vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, + FIND_ANYWHERE ); + if( p_vout != NULL ) + { + /* Escape */ + if( key == (unichar) 0x1b ) + { + id o_vout_view = [self getVoutView]; + if( o_vout_view && [o_vout_view isFullscreen] ) + { + [o_vout_view toggleFullscreen]; + eventHandled = YES; + } + } + else if( key == ' ' ) + { + [self play:self]; + eventHandled = YES; + } + vlc_object_release( (vlc_object_t *)p_vout ); + } + } + return eventHandled; +} + - (void)setupVarMenuItem:(NSMenuItem *)o_mi target:(vlc_object_t *)p_object var:(const char *)psz_variable @@ -468,7 +633,7 @@ 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 ) && !( i_type & VLC_VAR_ISCOMMAND ) ) [o_lmi setState: TRUE ]; @@ -495,7 +660,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 ); @@ -533,23 +698,94 @@ 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 ) + { + unsigned int timeInSec = 0; + NSString * fieldContent = [o_specificTime_enter_fld stringValue]; + if( [[fieldContent componentsSeparatedByString: @":"] count] > 1 && + [[fieldContent componentsSeparatedByString: @":"] count] <= 3 ) + { + NSArray * ourTempArray = \ + [fieldContent componentsSeparatedByString: @":"]; + + if( [[fieldContent componentsSeparatedByString: @":"] count] == 3 ) + { + timeInSec += ([[ourTempArray objectAtIndex: 0] intValue] * 3600); //h + timeInSec += ([[ourTempArray objectAtIndex: 1] intValue] * 60); //m + timeInSec += [[ourTempArray objectAtIndex: 2] intValue]; //s + } + else + { + timeInSec += ([[ourTempArray objectAtIndex: 0] intValue] * 60); //m + timeInSec += [[ourTempArray objectAtIndex: 1] intValue]; //s + } + } + else + timeInSec = [fieldContent intValue]; + + 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 ); + 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 ); + } + } +} + +- (id)getFSPanel +{ + if( o_fs_panel ) + return o_fs_panel; + else + { + msg_Err( VLCIntf, "FSPanel is nil" ); + return NULL; + } +} + @end @implementation VLCControls (NSMenuValidation) - + - (BOOL)validateMenuItem:(NSMenuItem *)o_mi { BOOL bEnabled = TRUE; vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); + playlist_t * p_playlist = pl_Yield( p_intf ); - if( p_playlist != NULL ) - { - vlc_mutex_lock( &p_playlist->object_lock ); - } - else return FALSE; + vlc_mutex_lock( &p_playlist->object_lock ); #define p_input p_playlist->p_input @@ -571,12 +807,13 @@ { bEnabled = FALSE; } - [o_main setupMenus]; /* Make sure input menu is up to date */ + [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")] ) { - bEnabled = p_playlist->i_size > 1; + /** \todo fix i_size use */ + bEnabled = p_playlist->items.i_size > 1; } else if( [[o_mi title] isEqualToString: _NS("Random")] ) { @@ -600,18 +837,20 @@ [o_mi setState: i_state]; } else if( [[o_mi title] isEqualToString: _NS("Step Forward")] || - [[o_mi title] isEqualToString: _NS("Step Backward")] ) + [[o_mi title] isEqualToString: _NS("Step Backward")] || + [[o_mi title] isEqualToString: _NS("Jump To Time")]) { if( p_input != NULL ) { var_Get( p_input, "seekable", &val); bEnabled = val.b_bool; } + else bEnabled = FALSE; } - else if( [[o_mi title] isEqualToString: _NS("Mute")] ) + 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 */ + [o_main setupMenus]; /* Make sure audio menu is up to date */ } else if( [[o_mi title] isEqualToString: _NS("Half Size")] || [[o_mi title] isEqualToString: _NS("Normal Size")] || @@ -638,7 +877,9 @@ 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; @@ -652,7 +893,7 @@ [o_mi setState: val.b_bool]; bEnabled = TRUE; } - [o_main setupMenus]; /* Make sure video menu is up to date */ + [o_main setupMenus]; /* Make sure video menu is up to date */ } vlc_mutex_unlock( &p_playlist->object_lock ); @@ -690,6 +931,7 @@ - (void)dealloc { free( psz_name ); + [super dealloc]; } - (char *)name @@ -713,3 +955,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