X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fcontrols.m;h=cad72406ec443f82f6cf808d9196b1cf611a3e99;hb=e62feac00d9f66cd9c5cb39eee86102a2bd16f5a;hp=c6b9f6778a809f9f5dd73dcea324252fd531f2ad;hpb=f2600dd0cc98ffc1dfb52a1e5ef390009f72f367;p=vlc diff --git a/modules/gui/macosx/controls.m b/modules/gui/macosx/controls.m index c6b9f6778a..cad72406ec 100644 --- a/modules/gui/macosx/controls.m +++ b/modules/gui/macosx/controls.m @@ -40,30 +40,6 @@ #include #include -/***************************************************************************** - * VLCAutoGeneratedMenuContent interface - ***************************************************************************** - * This holds our data for autogenerated menus - *****************************************************************************/ -@interface VLCAutoGeneratedMenuContent : NSObject -{ - char *psz_name; - vlc_object_t * _vlc_object; - vlc_value_t value; - int i_type; -} - -- (id)initWithVariableName: (const char *)name - ofObject: (vlc_object_t *)object - andValue: (vlc_value_t)value - ofType: (int)type; -- (const char *)name; -- (vlc_value_t)value; -- (vlc_object_t *)vlcObject; -- (int)type; - -@end - #pragma mark - /***************************************************************************** * VLCControls implementation @@ -74,6 +50,7 @@ { [super init]; o_fs_panel = [[VLCFSPanel alloc] init]; + b_lockAspectRatio = YES; return self; } @@ -107,7 +84,7 @@ { 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"]]; } @@ -115,11 +92,11 @@ { 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]; @@ -132,26 +109,25 @@ - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; - + + [o_fs_panel release]; [o_repeat_single release]; [o_repeat_all release]; [o_repeat_off release]; - + [super dealloc]; } - (IBAction)play:(id)sender { intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = pl_Hold( p_intf ); + playlist_t * p_playlist = pl_Get( p_intf ); bool empty; PL_LOCK; empty = playlist_IsEmpty( p_playlist ); PL_UNLOCK; - pl_Release( p_intf ); - if( empty ) [o_main intfOpenFileGeneric: (id)sender]; @@ -160,24 +136,29 @@ - (id)voutView { - id window; - id voutView = nil; - id embeddedViewList = [[VLCMain sharedInstance] getEmbeddedList]; - NSEnumerator *enumerator = [[NSApp orderedWindows] objectEnumerator]; - while( !voutView && ( window = [enumerator nextObject] ) ) + id o_window; + id o_voutView = nil; + id o_embeddedViewList = [[VLCMain sharedInstance] embeddedList]; + NSEnumerator *o_enumerator = [[NSApp orderedWindows] objectEnumerator]; + while( !o_voutView && ( o_window = [o_enumerator nextObject] ) ) { /* We have an embedded vout */ - if( [embeddedViewList windowContainsEmbedded: window] ) + if( [o_embeddedViewList windowContainsEmbedded: o_window] ) { - voutView = [embeddedViewList getViewForWindow: window]; + o_voutView = [o_embeddedViewList viewForWindow: o_window]; } /* We have a detached vout */ - else if( [[window className] isEqualToString: @"VLCVoutWindow"] ) + else if( [[o_window className] isEqualToString: @"VLCVoutWindow"] ) { - voutView = [window voutView]; + o_voutView = [o_window voutView]; } } - return [[voutView retain] autorelease]; + return [[o_voutView retain] autorelease]; +} + +- (BOOL)aspectRatioIsLocked +{ + return b_lockAspectRatio; } - (IBAction)stop:(id)sender @@ -201,6 +182,12 @@ var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_SLOWER ); } +- (IBAction)normalSpeed:(id)sender +{ + intf_thread_t * p_intf = VLCIntf; + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_RATE_NORMAL ); +} + - (IBAction)prev:(id)sender { intf_thread_t * p_intf = VLCIntf; @@ -217,25 +204,24 @@ { vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = pl_Hold( p_intf ); + playlist_t * p_playlist = pl_Get( p_intf ); var_Get( p_playlist, "random", &val ); val.b_bool = !val.b_bool; var_Set( p_playlist, "random", val ); if( val.b_bool ) { - vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random On" ) ); + //vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Random On" ) ); config_PutInt( p_playlist, "random", 1 ); } else { - vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Random Off" ) ); + //vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Random Off" ) ); config_PutInt( p_playlist, "random", 0 ); } p_intf->p_sys->b_playmode_update = true; p_intf->p_sys->b_intf_update = true; - pl_Release( p_intf ); } /* three little ugly helpers */ @@ -243,31 +229,37 @@ { [o_btn_repeat setImage: o_repeat_single]; [o_btn_repeat setAlternateImage: o_repeat_all]; + [o_btn_repeat_embed setImage: [NSImage imageNamed:@"sidebarRepeatOneOn"]]; } - (void)repeatAll { [o_btn_repeat setImage: o_repeat_all]; [o_btn_repeat setAlternateImage: o_repeat_off]; + [o_btn_repeat_embed setImage: [NSImage imageNamed:@"sidebarRepeatOn"]]; } - (void)repeatOff { [o_btn_repeat setImage: o_repeat_off]; [o_btn_repeat setAlternateImage: o_repeat_single]; + [o_btn_repeat_embed setImage: [NSImage imageNamed:@"sidebarRepeat"]]; } - (void)shuffle { vlc_value_t val; - playlist_t *p_playlist = pl_Hold( VLCIntf ); + playlist_t *p_playlist = pl_Get( VLCIntf ); var_Get( p_playlist, "random", &val ); [o_btn_shuffle setState: val.b_bool]; - pl_Release( VLCIntf ); + if(val.b_bool) + [o_btn_shuffle_embed setImage: [NSImage imageNamed:@"sidebarShuffleOn"]]; + else + [o_btn_shuffle_embed setImage: [NSImage imageNamed:@"sidebarShuffle"]]; } - (IBAction)repeatButtonAction:(id)sender { vlc_value_t looping,repeating; intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = pl_Hold( p_intf ); + playlist_t * p_playlist = pl_Get( p_intf ); var_Get( p_playlist, "repeat", &repeating ); var_Get( p_playlist, "loop", &looping ); @@ -275,50 +267,50 @@ 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 = 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" ) ); + //vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "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" ) ); + //vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "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" ) ); + //vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat Off" ) ); } /* communicate with core and the main intf loop */ @@ -326,8 +318,6 @@ var_Set( p_playlist, "loop", looping ); p_intf->p_sys->b_playmode_update = true; p_intf->p_sys->b_intf_update = true; - - pl_Release( p_intf ); } @@ -335,7 +325,7 @@ { vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = pl_Hold( p_intf ); + playlist_t * p_playlist = pl_Get( p_intf ); var_Get( p_playlist, "repeat", &val ); if (!val.b_bool) @@ -346,25 +336,24 @@ var_Set( p_playlist, "repeat", val ); if( val.b_bool ) { - vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat One" ) ); + //vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat One" ) ); config_PutInt( p_playlist, "repeat", 1 ); } else { - vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); + //vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat Off" ) ); config_PutInt( p_playlist, "repeat", 0 ); } - + p_intf->p_sys->b_playmode_update = true; p_intf->p_sys->b_intf_update = true; - pl_Release( p_intf ); } - (IBAction)loop:(id)sender { vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = pl_Hold( p_intf ); + playlist_t * p_playlist = pl_Get( p_intf ); var_Get( p_playlist, "loop", &val ); if (!val.b_bool) @@ -375,18 +364,24 @@ var_Set( p_playlist, "loop", val ); if( val.b_bool ) { - vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat All" ) ); + //vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat All" ) ); config_PutInt( p_playlist, "loop", 1 ); } else { - vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Repeat Off" ) ); + //vout_OSDMessage( p_intf, SPU_DEFAULT_CHANNEL, "%s", _( "Repeat Off" ) ); config_PutInt( p_playlist, "loop", 0 ); } p_intf->p_sys->b_playmode_update = true; p_intf->p_sys->b_intf_update = true; - pl_Release( p_intf ); +} + +- (IBAction)quitAfterPlayback:(id)sender +{ + vlc_value_t val; + playlist_t * p_playlist = pl_Get( VLCIntf ); + var_ToggleBool( p_playlist, "play-and-exit" ); } - (IBAction)forward:(id)sender @@ -430,23 +425,28 @@ - (IBAction)volumeSliderUpdated:(id)sender { intf_thread_t * p_intf = VLCIntf; + playlist_t * p_playlist = pl_Get( p_intf ); audio_volume_t i_volume = (audio_volume_t)[sender intValue]; - int i_volume_step = 0; + int i_volume_step; + i_volume_step = config_GetInt( p_intf->p_libvlc, "volume-step" ); - aout_VolumeSet( p_intf, i_volume * i_volume_step ); + aout_VolumeSet( p_playlist, 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 ) + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); + if( p_input != NULL ) { - intf_thread_t * p_intf = VLCIntf; - var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_POSITION ); - vlc_object_release( (vlc_object_t *)p_vout ); + vout_thread_t *p_vout = input_GetVout( p_input ); + if( p_vout != NULL ) + { + var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_POSITION ); + vlc_object_release( (vlc_object_t *)p_vout ); + } + vlc_object_release( p_input ); } } @@ -467,55 +467,54 @@ - (IBAction)windowAction:(id)sender { NSString *o_title = [sender title]; + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); - vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, - FIND_ANYWHERE ); - if( p_vout != NULL ) + if( p_input != NULL ) { - id o_vout_view = [self voutView]; - if( o_vout_view ) + vout_thread_t *p_vout = input_GetVout( p_input ); + if( p_vout != NULL ) { - 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") ] ) - { - id o_window = [o_vout_view getWindow]; - if( ![o_window isZoomed] ) - [o_window performZoom:self]; - } - else if( [o_title isEqualToString: _NS("Snapshot") ] ) + id o_vout_view = [self voutView]; + if( o_vout_view ) { - [o_vout_view snapshot]; - } - else - { - /* Fullscreen state for next time will be saved here too */ - [o_vout_view toggleFullscreen]; + 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") ] ) + { + id o_window = [o_vout_view voutWindow]; + if( ![o_window isZoomed] ) + [o_window performZoom:self]; + } + else if( [o_title isEqualToString: _NS("Snapshot") ] ) + { + [o_vout_view snapshot]; + } + else + { + /* Fullscreen state for next time will be saved here too */ + [o_vout_view toggleFullscreen]; + } } + vlc_object_release( (vlc_object_t *)p_vout ); } - vlc_object_release( (vlc_object_t *)p_vout ); - } - else - { - playlist_t * p_playlist = pl_Hold( VLCIntf ); - - if( [o_title isEqualToString: _NS("Fullscreen")] || - [sender isKindOfClass:[NSButton class]] ) + else { - vlc_value_t val; - var_Get( p_playlist, "fullscreen", &val ); - var_Set( p_playlist, "fullscreen", (vlc_value_t)!val.b_bool ); - } + playlist_t * p_playlist = pl_Get( VLCIntf ); - pl_Release( VLCIntf ); + if( [o_title isEqualToString: _NS("Fullscreen")] || + [sender isKindOfClass:[NSButton class]] ) + { + var_ToggleBool( p_playlist, "fullscreen" ); + } + } + vlc_object_release( p_input ); } - } - (IBAction)telxTransparent:(id)sender @@ -559,6 +558,16 @@ } } +- (IBAction)lockVideosAspectRatio:(id)sender +{ + if( [sender state] == NSOffState ) + [sender setState: NSOnState]; + else + [sender setState: NSOffState]; + + b_lockAspectRatio = !b_lockAspectRatio; +} + - (IBAction)addSubtitleFile:(id)sender { NSInteger i_returnValue = 0; @@ -582,16 +591,15 @@ { NSUInteger c = 0; if( !p_input ) return; - + c = [[openPanel filenames] count]; - NSLog( @"count: %i", c ); - for (int i = 0; [[openPanel filenames] count] > i ; i++) + + for (int i = 0; i < [[openPanel filenames] count] ; i++) { msg_Dbg( VLCIntf, "loading subs from %s", [[[openPanel filenames] objectAtIndex: i] UTF8String] ); if( input_AddSubtitle( p_input, [[[openPanel filenames] objectAtIndex: i] UTF8String], TRUE ) ) msg_Warn( VLCIntf, "unable to load subtitles from '%s'", [[[openPanel filenames] objectAtIndex: i] UTF8String] ); - i++; } } } @@ -632,26 +640,31 @@ if( key ) { - vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, - FIND_ANYWHERE ); - if( p_vout != NULL ) + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); + if( p_input != NULL ) { - /* Escape */ - if( key == (unichar) 0x1b ) + vout_thread_t *p_vout = input_GetVout( p_input ); + + if( p_vout != NULL ) { - id o_vout_view = [self voutView]; - if( o_vout_view && [o_vout_view isFullscreen] ) + /* Escape */ + if( key == (unichar) 0x1b ) { - [o_vout_view toggleFullscreen]; + id o_vout_view = [self voutView]; + 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 ); } - else if( key == ' ' ) - { - [self play:self]; - eventHandled = YES; - } - vlc_object_release( (vlc_object_t *)p_vout ); + vlc_object_release( p_input ); } } return eventHandled; @@ -677,7 +690,7 @@ /* Variable doesn't exist or isn't handled */ return; } - + /* Make sure we want to display the variable */ if( i_type & VLC_VAR_HASCHOICE ) { @@ -686,23 +699,26 @@ 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 ? - text.psz_string : strdup( psz_variable ) ]]; + text.psz_string : psz_variable ]]; - var_Get( p_object, psz_variable, &val ); if( i_type & VLC_VAR_HASCHOICE ) { NSMenu *o_menu = [o_mi submenu]; [self setupVarMenu: o_menu forMenuItem: o_mi target:p_object var:psz_variable selector:pf_callback]; - + free( text.psz_string ); return; } + if( var_Get( p_object, psz_variable, &val ) < 0 ) + { + return; + } VLCAutoGeneratedMenuContent *o_data; switch( i_type & VLC_VAR_TYPE ) @@ -710,20 +726,19 @@ case VLC_VAR_VOID: o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object andValue: val ofType: i_type]; - [o_mi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]]; + [o_mi setRepresentedObject: [o_data autorelease]]; break; case VLC_VAR_BOOL: o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object andValue: val ofType: i_type]; - [o_mi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]]; + [o_mi setRepresentedObject: [o_data autorelease]]; if( !( i_type & VLC_VAR_ISCOMMAND ) ) [o_mi setState: val.b_bool ? TRUE : FALSE ]; break; default: - free( text.psz_string ); - return; + break; } if( ( i_type & VLC_VAR_TYPE ) == VLC_VAR_STRING ) free( val.psz_string ); @@ -791,6 +806,18 @@ /* make (un)sensitive */ [o_parent setEnabled: ( val_list.p_list->i_count > 1 )]; + /* Aspect Ratio */ + if( [[o_parent title] isEqualToString: _NS("Aspect-ratio")] == YES ) + { + NSMenuItem *o_lmi_tmp2; + o_lmi_tmp2 = [o_menu addItemWithTitle: _NS("Lock Aspect Ratio") action: @selector(lockVideosAspectRatio:) keyEquivalent: @""]; + [o_lmi_tmp2 setTarget: self]; + [o_lmi_tmp2 setEnabled: YES]; + [o_lmi_tmp2 setState: b_lockAspectRatio]; + [o_parent setEnabled: YES]; + [o_menu addItem: [NSMenuItem separatorItem]]; + } + /* special case for the subtitles items */ if( [[o_parent title] isEqualToString: _NS("Subtitles Track")] == YES ) { @@ -804,7 +831,6 @@ for( i = 0; i < val_list.p_list->i_count; i++ ) { - vlc_value_t another_val; NSMenuItem * o_lmi; NSString *o_title = @""; VLCAutoGeneratedMenuContent *o_data; @@ -812,16 +838,14 @@ switch( i_type & VLC_VAR_TYPE ) { case VLC_VAR_STRING: - another_val.psz_string = - strdup(val_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: @""]; - o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: strdup(psz_variable) ofObject: p_object - andValue: another_val ofType: i_type]; - [o_lmi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]]; + o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object + andValue: val_list.p_list->p_values[i] ofType: i_type]; + [o_lmi setRepresentedObject: [o_data autorelease]]; [o_lmi setTarget: self]; if( !strcmp( val.psz_string, val_list.p_list->p_values[i].psz_string ) && !( i_type & VLC_VAR_ISCOMMAND ) ) @@ -832,14 +856,14 @@ case VLC_VAR_INTEGER: o_title = 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", + [[VLCMain sharedInstance] localizedString: text_list.p_list->p_values[i].psz_string] : + [NSString stringWithFormat: @"%"PRId64, val_list.p_list->p_values[i].i_int]; - o_lmi = [[o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""] retain ]; - o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: strdup(psz_variable) ofObject: p_object + o_lmi = [o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""]; + o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object andValue: val_list.p_list->p_values[i] ofType: i_type]; - [o_lmi setRepresentedObject: [NSValue valueWithPointer:[ o_data retain]]]; + [o_lmi setRepresentedObject: [o_data autorelease]]; [o_lmi setTarget: self]; if( val_list.p_list->p_values[i].i_int == val.i_int && !( i_type & VLC_VAR_ISCOMMAND ) ) @@ -861,13 +885,13 @@ /* 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 ); + var_FreeList( &val_list, &text_list ); } - (IBAction)toggleVar:(id)sender { NSMenuItem *o_mi = (NSMenuItem *)sender; - VLCAutoGeneratedMenuContent *o_data = [[o_mi representedObject] pointerValue]; + VLCAutoGeneratedMenuContent *o_data = [o_mi representedObject]; [NSThread detachNewThreadSelector: @selector(toggleVarThread:) toTarget: self withObject: o_data]; @@ -960,7 +984,7 @@ } } -- (id)getFSPanel +- (id)fspanel { if( o_fs_panel ) return o_fs_panel; @@ -980,11 +1004,12 @@ BOOL bEnabled = TRUE; vlc_value_t val; intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = pl_Hold( p_intf ); + playlist_t * p_playlist = pl_Get( p_intf ); input_thread_t * p_input = playlist_CurrentInput( p_playlist ); if( [[o_mi title] isEqualToString: _NS("Faster")] || - [[o_mi title] isEqualToString: _NS("Slower")] ) + [[o_mi title] isEqualToString: _NS("Slower")] || + [[o_mi title] isEqualToString: _NS("Normal rate")] ) { if( p_input != NULL ) { @@ -1006,9 +1031,8 @@ else if( [[o_mi title] isEqualToString: _NS("Previous")] || [[o_mi title] isEqualToString: _NS("Next")] ) { - /** \todo fix i_size use */ PL_LOCK; - bEnabled = p_playlist->items.i_size > 1; + bEnabled = playlist_CurrentSize( p_playlist ) > 1; PL_UNLOCK; } else if( [[o_mi title] isEqualToString: _NS("Random")] ) @@ -1032,6 +1056,13 @@ i_state = val.b_bool ? NSOnState : NSOffState; [o_mi setState: i_state]; } + else if( [[o_mi title] isEqualToString: _NS("Quit after Playback")] ) + { + int i_state; + var_Get( p_playlist, "play-and-exit", &val ); + i_state = val.b_bool ? NSOnState : NSOffState; + [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("Jump To Time")]) @@ -1060,29 +1091,31 @@ 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 ) + + if( p_input != NULL ) { - if( [[o_mi title] isEqualToString: _NS("Float on Top")] ) + vout_thread_t *p_vout = input_GetVout( p_input ); + if( p_vout != NULL ) { - var_Get( p_vout, "video-on-top", &val ); - [o_mi setState: val.b_bool ? NSOnState : NSOffState]; - } + 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: @"VLCVoutWindow"] || - [[[VLCMain sharedInstance] getEmbeddedList] - windowContainsEmbedded: o_window]) + while( (o_window = [o_enumerator nextObject])) { - bEnabled = TRUE; - break; + if( [[o_window className] isEqualToString: @"VLCVoutWindow"] || + [[[VLCMain sharedInstance] embeddedList] + windowContainsEmbedded: o_window]) + { + bEnabled = TRUE; + break; + } } - } - vlc_object_release( (vlc_object_t *)p_vout ); + vlc_object_release( (vlc_object_t *)p_vout ); + } } if( [[o_mi title] isEqualToString: _NS("Fullscreen")] ) { @@ -1094,7 +1127,7 @@ } /* Special case for telx menu */ - if( [[o_mi title] isEqualToString: _NS("Normal Size")] ); + if( [[o_mi title] isEqualToString: _NS("Normal Size")] ) { NSMenuItem *item = [[o_mi menu] itemWithTitle:_NS("Teletext")]; bool b_telx = p_input && var_GetInteger( p_input, "teletext-es" ) >= 0; @@ -1107,7 +1140,6 @@ } if( p_input ) vlc_object_release( p_input ); - pl_Release( p_intf ); return( bEnabled ); } @@ -1129,10 +1161,12 @@ if( self != nil ) { - psz_name = strdup( name ); _vlc_object = vlc_object_hold( object ); - value = val; + psz_name = strdup( name ); i_type = type; + value = val; + if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) + value.psz_string = strdup( val.psz_string ); } return( self ); @@ -1141,6 +1175,8 @@ - (void)dealloc { vlc_object_release( _vlc_object ); + if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) + free( value.psz_string ); free( psz_name ); [super dealloc]; } @@ -1179,7 +1215,7 @@ - (void)mouseDown: (NSEvent *)ourEvent { if( [ourEvent clickCount] > 1 ) - [[[VLCMain sharedInstance] getControls] goToSpecificTime: nil]; + [[[VLCMain sharedInstance] controls] goToSpecificTime: nil]; else [[VLCMain sharedInstance] timeFieldWasClicked: self]; }