X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fcontrols.m;h=bbd35e275a069b37b90324fb3f098f9dd27aeba4;hb=ea351fa94cab06fc48eed7746ccc7dd6ab60e511;hp=e6c0c9d39151ffc6327dae8bead2a2b06fe39308;hpb=33437a4e17b7fb859691498fece2a7b8accaf7ee;p=vlc diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index e6c0c9d391..bbd35e275a 100644 --- a/modules/gui/macosx/controls.m +++ b/modules/gui/macosx/controls.m @@ -1,19 +1,20 @@ /***************************************************************************** * controls.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2002-2005 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 * * 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 @@ -31,17 +32,26 @@ #include /* for MAXPATHLEN */ #include -#include "intf.h" -#include "vout.h" -#include "open.h" -#include "controls.h" +#import "intf.h" +#import "vout.h" +#import "open.h" +#import "controls.h" +#import "playlist.h" #include +#include /***************************************************************************** - * VLCControls implementation + * 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")]; @@ -49,32 +59,108 @@ [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 = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( p_playlist ) + playlist_t * p_playlist = pl_Yield( p_intf ); + + vlc_object_lock( p_playlist ); + if( playlist_IsEmpty( p_playlist ) ) + { + vlc_object_unlock( p_playlist ); + vlc_object_release( p_playlist ); + [o_main intfOpenFileGeneric: (id)sender]; + } + else + { + 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 ); +} + +/* 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] ) ) { - vlc_mutex_lock( &p_playlist->object_lock ); - if( p_playlist->i_size <= 0 ) + /* 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: @"VLCVoutWindow"] ) { - 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 @@ -82,7 +168,10 @@ 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 ); + /* 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 @@ -90,7 +179,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 @@ -98,7 +187,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 @@ -106,7 +195,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 @@ -114,19 +203,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; @@ -134,28 +218,118 @@ 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; - 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)repeat:(id)sender +/* three little ugly helpers */ +- (void)repeatOne +{ + [o_btn_repeat setImage: o_repeat_single]; + [o_btn_repeat setAlternateImage: o_repeat_all]; +} +- (void)repeatAll +{ + [o_btn_repeat setImage: o_repeat_all]; + [o_btn_repeat setAlternateImage: o_repeat_off]; +} +- (void)repeatOff +{ + [o_btn_repeat setImage: o_repeat_off]; + [o_btn_repeat setAlternateImage: o_repeat_single]; +} +- (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 ); + + 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 = true; + looping.b_bool = 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 = 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 = 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 = true; + p_intf->p_sys->b_intf_update = 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) { @@ -166,14 +340,16 @@ if( val.b_bool ) { 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; + + p_intf->p_sys->b_playmode_update = true; + p_intf->p_sys->b_intf_update = true; vlc_object_release( p_playlist ); } @@ -181,12 +357,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) @@ -198,14 +369,16 @@ if( val.b_bool ) { 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; - 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 ); } @@ -214,7 +387,7 @@ 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 ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); } - (IBAction)backward:(id)sender @@ -222,7 +395,7 @@ 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 ); + var_Set( p_intf->p_libvlc, "key-pressed", val ); } @@ -231,7 +404,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]; } @@ -241,7 +414,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]; } @@ -251,7 +424,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]; } @@ -261,82 +434,153 @@ intf_thread_t * p_intf = VLCIntf; audio_volume_t i_volume = (audio_volume_t)[sender intValue]; int i_volume_step = 0; - i_volume_step = config_GetInt( p_intf->p_vlc, "volume-step" ); + 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)showPosition: (id)sender +{ + vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, + 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 ); + 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]]; +} + +- (BOOL) isFullscreen { + id o_vout_view = [self getVoutView]; + if( o_vout_view ) + { + return [o_vout_view isFullscreen]; + } + return NO; +} + - (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 ) { - id o_embedded_vout_list = [[VLCMain sharedInstance] getEmbeddedList]; - while ((o_window = [o_enumerator nextObject])) + id o_vout_view = [self getVoutView]; + if( o_vout_view ) { - id o_vout_view = nil; - /* We have an embedded vout */ - if( [o_embedded_vout_list windowContainsEmbedded: o_window] ) + if( [o_title isEqualToString: _NS("Half Size") ] ) + [o_vout_view scaleWindowWithFactor: 0.5 animate: YES]; + else if( [o_title isEqualToString: _NS("Normal Size") ] ) + [o_vout_view scaleWindowWithFactor: 1.0 animate: YES]; + else if( [o_title isEqualToString: _NS("Double Size") ] ) + [o_vout_view scaleWindowWithFactor: 2.0 animate: YES]; + else if( [o_title isEqualToString: _NS("Float on Top") ] ) + [o_vout_view toggleFloatOnTop]; + else if( [o_title isEqualToString: _NS("Fit to Screen") ] ) { - o_vout_view = [o_embedded_vout_list getViewForWindow: o_window]; + id o_window = [o_vout_view getWindow]; + if( ![o_window isZoomed] ) + [o_window performZoom:self]; } - /* We have a detached Vout */ - else if( [[o_window className] isEqualToString: @"VLCWindow"] ) + else if( [o_title isEqualToString: _NS("Snapshot") ] ) { - msg_Dbg( VLCIntf, "detached vout controls.m call getVoutView" ); - o_vout_view = [o_window getVoutView]; + [o_vout_view snapshot]; } - - if( o_vout_view ) + else { - 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_window isZoomed] ) - [o_window performZoom:self]; - } - else if( [o_title isEqualToString: _NS("Snapshot") ] ) - { - [o_vout_view snapshot]; - } - else - { - [o_vout_view toggleFullscreen]; - } - break; + /* Fullscreen state for next time will be saved here too */ + [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 ); + + pl_Release( VLCIntf ); + } + +} + +- (void)scrollWheel:(NSEvent *)theEvent +{ + intf_thread_t * p_intf = VLCIntf; + 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_yvlckey = KEY_MOUSEWHEELDOWN; + else + i_yvlckey = KEY_MOUSEWHEELUP; + + if ([theEvent deltaX] < 0.0f) + i_xvlckey = KEY_MOUSEWHEELRIGHT; + else + i_xvlckey = KEY_MOUSEWHEELLEFT; + + /* Send multiple key event, depending on the intensity of the event */ + 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 +{ + 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 @@ -359,7 +603,7 @@ /* Variable doesn't exist or isn't handled */ return; } - + /* Make sure we want to display the variable */ if( i_type & VLC_VAR_HASCHOICE ) { @@ -368,7 +612,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 ? @@ -381,8 +625,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; } @@ -404,12 +648,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 ); } @@ -545,15 +789,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; @@ -568,13 +811,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 = \ @@ -598,14 +840,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 */ @@ -624,6 +865,17 @@ } } +- (id)getFSPanel +{ + if( o_fs_panel ) + return o_fs_panel; + else + { + msg_Err( VLCIntf, "FSPanel is nil" ); + return NULL; + } +} + @end @implementation VLCControls (NSMenuValidation) @@ -633,23 +885,15 @@ 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 ); - - if( p_playlist != NULL ) - { - vlc_mutex_lock( &p_playlist->object_lock ); - } - else return FALSE; - -#define p_input p_playlist->p_input + playlist_t * p_playlist = pl_Yield( p_intf ); + input_thread_t * p_input = playlist_CurrentInput( p_playlist ); if( [[o_mi title] isEqualToString: _NS("Faster")] || [[o_mi title] isEqualToString: _NS("Slower")] ) { if( p_input != NULL ) { - bEnabled = p_input->input.b_can_pace_control; + bEnabled = p_input->b_can_pace_control; } else { @@ -667,7 +911,10 @@ 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 */ + PL_LOCK; + bEnabled = p_playlist->items.i_size > 1; + PL_UNLOCK; } else if( [[o_mi title] isEqualToString: _NS("Random")] ) { @@ -718,7 +965,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 ) @@ -731,7 +978,7 @@ while( (o_window = [o_enumerator nextObject])) { - if( [[o_window className] isEqualToString: @"VLCWindow"] || + if( [[o_window className] isEqualToString: @"VLCVoutWindow"] || [[[VLCMain sharedInstance] getEmbeddedList] windowContainsEmbedded: o_window]) { @@ -739,18 +986,19 @@ 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]; 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 ); + if( p_input ) vlc_object_release( p_input ); vlc_object_release( p_playlist ); return( bEnabled ); @@ -759,7 +1007,7 @@ @end /***************************************************************************** - * VLCMenuExt implementation + * VLCMenuExt implementation ***************************************************************************** * Object connected to a playlistitem which remembers the data belonging to * the variable of the autogenerated menu @@ -812,7 +1060,7 @@ /***************************************************************************** - * VLCTimeField implementation + * VLCTimeField implementation ***************************************************************************** * we need this to catch our click-event in the controller window *****************************************************************************/