📄 hotkeys.c
字号:
} else { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { ClearChannels( p_intf, p_vout ); vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, OSD_PLAY_ICON ); playlist_Play( p_playlist ); vlc_object_release( p_playlist ); } } } else if( p_input ) { /* FIXME --fenrir * How to get a valid value ? * That's not that easy with some special stream */ vlc_bool_t b_seekable = VLC_TRUE; if( i_action == ACTIONID_PAUSE ) { ClearChannels( p_intf, p_vout ); vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, OSD_PAUSE_ICON ); val.i_int = PAUSE_S; var_Set( p_input, "state", val ); } else if( i_action == ACTIONID_JUMP_BACKWARD_10SEC && b_seekable ) { val.i_time = -10000000; var_Set( p_input, "time-offset", val ); DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_FORWARD_10SEC && b_seekable ) { val.i_time = 10000000; var_Set( p_input, "time-offset", val ); DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_BACKWARD_1MIN && b_seekable ) { val.i_time = -60000000; var_Set( p_input, "time-offset", val ); DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_FORWARD_1MIN && b_seekable ) { val.i_time = 60000000; var_Set( p_input, "time-offset", val ); DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_BACKWARD_5MIN && b_seekable ) { val.i_time = -300000000; var_Set( p_input, "time-offset", val ); DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_JUMP_FORWARD_5MIN && b_seekable ) { val.i_time = 300000000; var_Set( p_input, "time-offset", val ); DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action == ACTIONID_AUDIO_TRACK ) { vlc_value_t val, list, list2; int i_count, i; var_Get( p_input, "audio-es", &val ); var_Change( p_input, "audio-es", VLC_VAR_GETCHOICES, &list, &list2 ); i_count = list.p_list->i_count; if( i_count <= 1 ) { continue; } for( i = 0; i < i_count; i++ ) { if( val.i_int == list.p_list->p_values[i].i_int ) { break; } } /* value of audio-es was not in choices list */ if( i == i_count ) { msg_Warn( p_input, "invalid current audio track, selecting 0" ); var_Set( p_input, "audio-es", list.p_list->p_values[0] ); i = 0; } else if( i == i_count - 1 ) { var_Set( p_input, "audio-es", list.p_list->p_values[1] ); i = 1; } else { var_Set( p_input, "audio-es", list.p_list->p_values[i+1] ); i++; } vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Audio track: %s"), list2.p_list->p_values[i].psz_string ); } else if( i_action == ACTIONID_SUBTITLE_TRACK ) { vlc_value_t val, list, list2; int i_count, i; var_Get( p_input, "spu-es", &val ); var_Change( p_input, "spu-es", VLC_VAR_GETCHOICES, &list, &list2 ); i_count = list.p_list->i_count; if( i_count <= 1 ) { vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Subtitle track: %s"), _("N/A") ); continue; } for( i = 0; i < i_count; i++ ) { if( val.i_int == list.p_list->p_values[i].i_int ) { break; } } /* value of spu-es was not in choices list */ if( i == i_count ) { msg_Warn( p_input, "invalid current subtitle track, selecting 0" ); var_Set( p_input, "spu-es", list.p_list->p_values[0] ); i = 0; } else if( i == i_count - 1 ) { var_Set( p_input, "spu-es", list.p_list->p_values[0] ); i = 0; } else { var_Set( p_input, "spu-es", list.p_list->p_values[i+1] ); i = i + 1; } vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Subtitle track: %s"), list2.p_list->p_values[i].psz_string ); } else if( i_action == ACTIONID_NEXT ) { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Next") ); playlist_Next( p_playlist ); vlc_object_release( p_playlist ); } } else if( i_action == ACTIONID_PREV ) { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Previous") ); playlist_Prev( p_playlist ); vlc_object_release( p_playlist ); } } else if( i_action == ACTIONID_STOP ) { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { playlist_Stop( p_playlist ); vlc_object_release( p_playlist ); } } else if( i_action == ACTIONID_FASTER ) { vlc_value_t val; val.b_bool = VLC_TRUE; var_Set( p_input, "rate-faster", val ); vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Faster") ); } else if( i_action == ACTIONID_SLOWER ) { vlc_value_t val; val.b_bool = VLC_TRUE; var_Set( p_input, "rate-slower", val ); vout_OSDMessage( VLC_OBJECT(p_input), DEFAULT_CHAN, _("Slower") ); } else if( i_action == ACTIONID_POSITION && b_seekable ) { DisplayPosition( p_intf, p_vout, p_input ); } else if( i_action >= ACTIONID_PLAY_BOOKMARK1 && i_action <= ACTIONID_PLAY_BOOKMARK10 ) { PlayBookmark( p_intf, i_action - ACTIONID_PLAY_BOOKMARK1 + 1 ); } else if( i_action >= ACTIONID_SET_BOOKMARK1 && i_action <= ACTIONID_SET_BOOKMARK10 ) { SetBookmark( p_intf, i_action - ACTIONID_SET_BOOKMARK1 + 1 ); } } }}static int GetKey( intf_thread_t *p_intf){ vlc_mutex_lock( &p_intf->p_sys->change_lock ); if ( p_intf->p_sys->i_size == 0 ) { vlc_mutex_unlock( &p_intf->p_sys->change_lock ); return -1; } else { int i_return = p_intf->p_sys->p_keys[ 0 ]; int i; p_intf->p_sys->i_size--; for ( i = 0; i < BUFFER_SIZE - 1; i++) { p_intf->p_sys->p_keys[ i ] = p_intf->p_sys->p_keys[ i + 1 ]; } vlc_mutex_unlock( &p_intf->p_sys->change_lock ); return i_return; }}/***************************************************************************** * KeyEvent: callback for keyboard events *****************************************************************************/static int KeyEvent( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ intf_thread_t *p_intf = (intf_thread_t *)p_data; vlc_mutex_lock( &p_intf->p_sys->change_lock ); if ( p_intf->p_sys->i_size == BUFFER_SIZE ) { msg_Warn( p_intf, "event buffer full, dropping keypress" ); vlc_mutex_unlock( &p_intf->p_sys->change_lock ); return VLC_EGENERIC; } else { p_intf->p_sys->p_keys[ p_intf->p_sys->i_size ] = newval.i_int; p_intf->p_sys->i_size++; } vlc_mutex_unlock( &p_intf->p_sys->change_lock ); return VLC_SUCCESS;}static int ActionKeyCB( vlc_object_t *p_this, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data ){ vlc_t *p_vlc = (vlc_t *)p_this; struct hotkey *p_hotkeys = p_vlc->p_hotkeys; int i; for( i = 0; p_hotkeys[i].psz_action != NULL; i++ ) { if( !strcmp( p_hotkeys[i].psz_action, psz_var ) ) { p_hotkeys[i].i_key = newval.i_int; } } return VLC_SUCCESS;}static void PlayBookmark( intf_thread_t *p_intf, int i_num ){ vlc_value_t val; int i_position; char psz_bookmark_name[11]; playlist_t *p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); sprintf( psz_bookmark_name, "bookmark%i", i_num ); var_Create( p_intf, psz_bookmark_name, VLC_VAR_STRING|VLC_VAR_DOINHERIT ); var_Get( p_intf, psz_bookmark_name, &val ); if( p_playlist ) { char *psz_bookmark = strdup( val.psz_string ); for( i_position = 0; i_position < p_playlist->i_size; i_position++) { if( !strcmp( psz_bookmark, p_playlist->pp_items[i_position]->input.psz_uri ) ) { playlist_Goto( p_playlist, i_position ); break; } } vlc_object_release( p_playlist ); }}static void SetBookmark( intf_thread_t *p_intf, int i_num ){ vlc_value_t val; playlist_t *p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { char psz_bookmark_name[11]; sprintf( psz_bookmark_name, "bookmark%i", i_num ); var_Create( p_intf, psz_bookmark_name, VLC_VAR_STRING|VLC_VAR_DOINHERIT ); if( p_playlist->status.p_item ) { val.psz_string = strdup( p_playlist->status.p_item->input.psz_uri ); var_Set( p_intf, psz_bookmark_name, val ); msg_Info( p_intf, "setting playlist bookmark %i to %s", i_num, val.psz_string ); } vlc_object_release( p_playlist ); }}static void DisplayPosition( intf_thread_t *p_intf, vout_thread_t *p_vout, input_thread_t *p_input ){ char psz_duration[MSTRTIME_MAX_SIZE]; char psz_time[MSTRTIME_MAX_SIZE]; vlc_value_t time, pos; mtime_t i_seconds; if( p_vout == NULL ) { return; } ClearChannels( p_intf, p_vout ); var_Get( p_input, "time", &time ); i_seconds = time.i_time / 1000000; secstotimestr ( psz_time, i_seconds ); var_Get( p_input, "length", &time ); if( time.i_time > 0 ) { secstotimestr( psz_duration, time.i_time / 1000000 ); vout_OSDMessage( p_input, POSITION_TEXT_CHAN, "%s / %s", psz_time, psz_duration ); } else if( i_seconds > 0 ) { vout_OSDMessage( p_input, POSITION_TEXT_CHAN, psz_time ); } if( !p_vout->p_parent_intf || p_vout->b_fullscreen ) { var_Get( p_input, "position", &pos ); vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_WIDGET_CHAN, pos.f_float * 100, OSD_HOR_SLIDER ); }}static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout, audio_volume_t i_vol ){ if( p_vout == NULL ) { return; } ClearChannels( p_intf, p_vout ); if( !p_vout->p_parent_intf || p_vout->b_fullscreen ) { vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_WIDGET_CHAN, i_vol*100/AOUT_VOLUME_MAX, OSD_VERT_SLIDER ); } else { vout_OSDMessage( p_vout, VOLUME_TEXT_CHAN, "Vol %d%%", 2*i_vol*100/AOUT_VOLUME_MAX ); }}static void ClearChannels( intf_thread_t *p_intf, vout_thread_t *p_vout ){ int i; if( p_vout ) { spu_Control( p_vout->p_spu, SPU_CHANNEL_CLEAR, DEFAULT_CHAN ); for( i = 0; i < CHANNELS_NUMBER; i++ ) { spu_Control( p_vout->p_spu, SPU_CHANNEL_CLEAR, p_intf->p_sys->p_channels[ i ] ); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -