📄 controls.m
字号:
return; } VLCMenuExt *o_data; switch( i_type & VLC_VAR_TYPE ) { case VLC_VAR_VOID: 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]]]; break; case VLC_VAR_BOOL: 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]]]; if( !( i_type & VLC_VAR_ISCOMMAND ) ) [o_mi setState: val.b_bool ? TRUE : FALSE ]; break; default: if( 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 );}- (void)setupVarMenu:(NSMenu *)o_menu forMenuItem: (NSMenuItem *)o_parent target:(vlc_object_t *)p_object var:(const char *)psz_variable selector:(SEL)pf_callback{ vlc_value_t val, val_list, text_list; int i_type, i, i_nb_items; /* remove previous items */ i_nb_items = [o_menu numberOfItems]; for( i = 0; i < i_nb_items; i++ ) { [o_menu removeItemAtIndex: 0]; } /* Check the type of the object variable */ i_type = var_Type( p_object, psz_variable ); /* Make sure we want to display the variable */ if( i_type & VLC_VAR_HASCHOICE ) { var_Change( p_object, psz_variable, VLC_VAR_CHOICESCOUNT, &val, NULL ); if( val.i_int == 0 ) return; if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 ) return; } else { return; } switch( i_type & VLC_VAR_TYPE ) { case VLC_VAR_VOID: case VLC_VAR_BOOL: case VLC_VAR_VARIABLE: case VLC_VAR_STRING: case VLC_VAR_INTEGER: break; default: /* Variable doesn't exist or isn't handled */ return; } if( var_Get( p_object, psz_variable, &val ) < 0 ) { return; } if( var_Change( p_object, psz_variable, VLC_VAR_GETLIST, &val_list, &text_list ) < 0 ) { if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string ); return; } /* make (un)sensitive */ [o_parent setEnabled: ( val_list.p_list->i_count > 1 )]; for( i = 0; i < val_list.p_list->i_count; i++ ) { vlc_value_t another_val; NSMenuItem * o_lmi; NSString *o_title = @""; VLCMenuExt *o_data; 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 = [[VLCMenuExt alloc] initWithVar: strdup(psz_variable) Object: p_object->i_object_id 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 ]; break; 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", val_list.p_list->p_values[i].i_int]; o_lmi = [[o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""] retain ]; o_data = [[VLCMenuExt alloc] initWithVar: strdup(psz_variable) Object: p_object->i_object_id Value: val_list.p_list->p_values[i] ofType: i_type]; [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 && !( i_type & VLC_VAR_ISCOMMAND ) ) [o_lmi setState: TRUE ]; break; default: 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 );}- (IBAction)toggleVar:(id)sender{ NSMenuItem *o_mi = (NSMenuItem *)sender; VLCMenuExt *o_data = [[o_mi representedObject] pointerValue]; [NSThread detachNewThreadSelector: @selector(toggleVarThread:) toTarget: self withObject: o_data]; return;}- (int)toggleVarThread: (id)_o_data{ vlc_object_t *p_object; NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init]; VLCMenuExt *o_data = (VLCMenuExt *)_o_data; vlc_thread_set_priority( VLCIntf , VLC_THREAD_PRIORITY_LOW ); p_object = (vlc_object_t *)vlc_object_get( VLCIntf, [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; } [o_pool release]; return VLC_EGENERIC;}@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 ); if( p_playlist != NULL ) { 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_input != NULL ) { bEnabled = p_input->input.b_can_pace_control; } else { bEnabled = FALSE; } } else if( [[o_mi title] isEqualToString: _NS("Stop")] ) { 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")] ) { bEnabled = p_playlist->i_size > 1; } 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 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 All")] ) { int i_state; var_Get( p_playlist, "loop", &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")] ) { if( p_input != NULL ) { 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("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("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; vout_thread_t *p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout != NULL ) { 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"] ) { bEnabled = TRUE; break; } } 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 */ } vlc_mutex_unlock( &p_playlist->object_lock ); vlc_object_release( p_playlist ); return( bEnabled );}@end/***************************************************************************** * VLCMenuExt implementation ***************************************************************************** * Object connected to a playlistitem which remembers the data belonging to * the variable of the autogenerated menu *****************************************************************************/@implementation VLCMenuExt- (id)initWithVar: (const char *)_psz_name Object: (int)i_id Value: (vlc_value_t)val ofType: (int)_i_type{ self = [super init]; if( self != nil ) { psz_name = strdup( _psz_name ); i_object_id = i_id; value = val; i_type = _i_type; } return( self );}- (void)dealloc{ free( psz_name ); [super dealloc];}- (char *)name{ return psz_name;}- (int)objectID{ return i_object_id;}- (vlc_value_t)value{ return value;}- (int)type{ return i_type;}@end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -