📄 controls.m
字号:
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( [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 true; } [o_pool release]; 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 = pl_CurrentInput( VLCIntf ); 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 = pl_CurrentInput( VLCIntf ); 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 = 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->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")] ) { /** \todo fix i_size use */ PL_LOCK; bEnabled = p_playlist->items.i_size > 1; PL_UNLOCK; } 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")] || [[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")] ) { [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: @"VLCVoutWindow"] || [[[VLCMain sharedInstance] getEmbeddedList] windowContainsEmbedded: o_window]) { bEnabled = TRUE; break; } } vlc_object_release( (vlc_object_t *)p_vout ); } 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_input ) vlc_object_release( p_input ); 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/***************************************************************************** * 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -