📄 hotkeys.c
字号:
/***************************************************************************** * hotkeys.c: Hotkey handling for vlc ***************************************************************************** * Copyright (C) 2005 VideoLAN * $Id: hotkeys.c 10733 2005-04-18 18:13:37Z jpsaman $ * * Authors: Sigmund Augdal <sigmunau@idi.ntnu.no> * * 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 * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include <stdlib.h> /* malloc(), free() */#include <vlc/vlc.h>#include <vlc/intf.h>#include <vlc/input.h>#include <vlc/vout.h>#include <vlc/aout.h>#include <osd.h>#include "vlc_keys.h"#define BUFFER_SIZE 10#define CHANNELS_NUMBER 4#define VOLUME_TEXT_CHAN p_intf->p_sys->p_channels[ 0 ]#define VOLUME_WIDGET_CHAN p_intf->p_sys->p_channels[ 1 ]#define POSITION_TEXT_CHAN p_intf->p_sys->p_channels[ 2 ]#define POSITION_WIDGET_CHAN p_intf->p_sys->p_channels[ 3 ]/***************************************************************************** * intf_sys_t: description and status of FB interface *****************************************************************************/struct intf_sys_t{ vlc_mutex_t change_lock; /* mutex to keep the callback * and the main loop from * stepping on each others * toes */ int p_keys[ BUFFER_SIZE ]; /* buffer that contains * keyevents */ int i_size; /* number of events in buffer */ int p_channels[ CHANNELS_NUMBER ]; /* contains registered * channel IDs */ input_thread_t * p_input; /* pointer to input */ vout_thread_t * p_vout; /* pointer to vout object */};/***************************************************************************** * Local prototypes *****************************************************************************/static int Open ( vlc_object_t * );static void Close ( vlc_object_t * );static void Run ( intf_thread_t * );static int GetKey ( intf_thread_t *);static int KeyEvent( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );static int ActionKeyCB( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );static void PlayBookmark( intf_thread_t *, int );static void SetBookmark ( intf_thread_t *, int );static void DisplayPosition( intf_thread_t *, vout_thread_t *, input_thread_t * );static void DisplayVolume ( intf_thread_t *, vout_thread_t *, audio_volume_t );static void ClearChannels ( intf_thread_t *, vout_thread_t * );/***************************************************************************** * Module descriptor *****************************************************************************/#define BOOKMARK1_TEXT N_("Playlist bookmark 1")#define BOOKMARK2_TEXT N_("Playlist bookmark 2")#define BOOKMARK3_TEXT N_("Playlist bookmark 3")#define BOOKMARK4_TEXT N_("Playlist bookmark 4")#define BOOKMARK5_TEXT N_("Playlist bookmark 5")#define BOOKMARK6_TEXT N_("Playlist bookmark 6")#define BOOKMARK7_TEXT N_("Playlist bookmark 7")#define BOOKMARK8_TEXT N_("Playlist bookmark 8")#define BOOKMARK9_TEXT N_("Playlist bookmark 9")#define BOOKMARK10_TEXT N_("Playlist bookmark 10")#define BOOKMARK_LONGTEXT N_( \ "This option allows you to define playlist bookmarks.")vlc_module_begin(); set_description( _("Hotkeys management interface") ); add_string( "bookmark1", NULL, NULL, BOOKMARK1_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); add_string( "bookmark2", NULL, NULL, BOOKMARK2_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); add_string( "bookmark3", NULL, NULL, BOOKMARK3_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); add_string( "bookmark4", NULL, NULL, BOOKMARK4_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); add_string( "bookmark5", NULL, NULL, BOOKMARK5_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); add_string( "bookmark6", NULL, NULL, BOOKMARK6_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); add_string( "bookmark7", NULL, NULL, BOOKMARK7_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); add_string( "bookmark8", NULL, NULL, BOOKMARK8_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); add_string( "bookmark9", NULL, NULL, BOOKMARK9_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); add_string( "bookmark10", NULL, NULL, BOOKMARK10_TEXT, BOOKMARK_LONGTEXT, VLC_FALSE ); set_capability( "interface", 0 ); set_callbacks( Open, Close );vlc_module_end();/***************************************************************************** * Open: initialize interface *****************************************************************************/static int Open( vlc_object_t *p_this ){ intf_thread_t *p_intf = (intf_thread_t *)p_this; /* Allocate instance and initialize some members */ p_intf->p_sys = malloc( sizeof( intf_sys_t ) ); if( p_intf->p_sys == NULL ) { msg_Err( p_intf, "out of memory" ); return 1; } vlc_mutex_init( p_intf, &p_intf->p_sys->change_lock ); p_intf->p_sys->i_size = 0; p_intf->pf_run = Run; p_intf->p_sys->p_input = NULL; p_intf->p_sys->p_vout = NULL; var_AddCallback( p_intf->p_vlc, "key-pressed", KeyEvent, p_intf ); return 0;}/***************************************************************************** * Close: destroy interface *****************************************************************************/static void Close( vlc_object_t *p_this ){ intf_thread_t *p_intf = (intf_thread_t *)p_this; if( p_intf->p_sys->p_input ) { vlc_object_release( p_intf->p_sys->p_input ); } if( p_intf->p_sys->p_vout ) { vlc_object_release( p_intf->p_sys->p_vout ); } /* Destroy structure */ free( p_intf->p_sys );}/***************************************************************************** * Run: main loop *****************************************************************************/static void Run( intf_thread_t *p_intf ){ playlist_t *p_playlist; input_thread_t *p_input; vout_thread_t *p_vout = NULL; vout_thread_t *p_last_vout; struct hotkey *p_hotkeys = p_intf->p_vlc->p_hotkeys; vlc_value_t val; int i; /* Initialize hotkey structure */ for( i = 0; p_hotkeys[i].psz_action != NULL; i++ ) { var_Create( p_intf->p_vlc, p_hotkeys[i].psz_action, VLC_VAR_HOTKEY | VLC_VAR_DOINHERIT ); var_AddCallback( p_intf->p_vlc, p_hotkeys[i].psz_action, ActionKeyCB, NULL ); var_Get( p_intf->p_vlc, p_hotkeys[i].psz_action, &val ); var_Set( p_intf->p_vlc, p_hotkeys[i].psz_action, val ); } while( !p_intf->b_die ) { int i_key, i_action; /* Sleep a bit */ msleep( INTF_IDLE_SLEEP ); /* Update the input */ if( p_intf->p_sys->p_input == NULL ) { p_intf->p_sys->p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); } else if( p_intf->p_sys->p_input->b_dead ) { vlc_object_release( p_intf->p_sys->p_input ); p_intf->p_sys->p_input = NULL; } p_input = p_intf->p_sys->p_input; /* Update the vout */ p_last_vout = p_intf->p_sys->p_vout; if( p_vout == NULL ) { p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); p_intf->p_sys->p_vout = p_vout; } else if( p_vout->b_die ) { vlc_object_release( p_vout ); p_vout = NULL; p_intf->p_sys->p_vout = NULL; } /* Register OSD channels */ if( p_vout && p_vout != p_last_vout ) { for( i = 0; i < CHANNELS_NUMBER; i++ ) { spu_Control( p_vout->p_spu, SPU_CHANNEL_REGISTER, &p_intf->p_sys->p_channels[ i ] ); } } /* Find action triggered by hotkey */ i_action = 0; i_key = GetKey( p_intf ); for( i = 0; i_key != -1 && p_hotkeys[i].psz_action != NULL; i++ ) { if( p_hotkeys[i].i_key == i_key ) { i_action = p_hotkeys[i].i_action; } } if( !i_action ) { /* No key pressed, sleep a bit more */ msleep( INTF_IDLE_SLEEP ); continue; } if( i_action == ACTIONID_QUIT ) { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { playlist_Stop( p_playlist ); vlc_object_release( p_playlist ); } /* Playlist is stopped now kill vlc. */ p_intf->p_vlc->b_die = VLC_TRUE; ClearChannels( p_intf, p_vout ); vout_OSDMessage( p_intf, DEFAULT_CHAN, _( "Quit" ) ); continue; } else if( i_action == ACTIONID_VOL_UP ) { audio_volume_t i_newvol; aout_VolumeUp( p_intf, 1, &i_newvol ); DisplayVolume( p_intf, p_vout, i_newvol ); } else if( i_action == ACTIONID_VOL_DOWN ) { audio_volume_t i_newvol; aout_VolumeDown( p_intf, 1, &i_newvol ); DisplayVolume( p_intf, p_vout, i_newvol ); } else if( i_action == ACTIONID_VOL_MUTE ) { audio_volume_t i_newvol = -1; aout_VolumeMute( p_intf, &i_newvol ); if( p_vout ) { if( i_newvol == 0 ) { ClearChannels( p_intf, p_vout ); vout_OSDIcon( VLC_OBJECT( p_intf ), DEFAULT_CHAN, OSD_MUTE_ICON ); } else { DisplayVolume( p_intf, p_vout, i_newvol ); } } } else if( i_action == ACTIONID_INTF_SHOW ) { val.b_bool = VLC_TRUE; p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { var_Set( p_playlist, "intf-show", val ); vlc_object_release( p_playlist ); } } else if( i_action == ACTIONID_SNAPSHOT ) { if( p_vout ) vout_Control( p_vout, VOUT_SNAPSHOT ); } else if( i_action == ACTIONID_SUBDELAY_DOWN ) { int64_t i_delay = var_GetTime( p_input, "spu-delay" ); i_delay -= 50000; /* 50 ms */ var_SetTime( p_input, "spu-delay", i_delay ); ClearChannels( p_intf, p_vout ); vout_OSDMessage( p_intf, DEFAULT_CHAN, "Subtitle delay %i ms", (int)(i_delay/1000) ); } else if( i_action == ACTIONID_SUBDELAY_UP ) { int64_t i_delay = var_GetTime( p_input, "spu-delay" ); i_delay += 50000; /* 50 ms */ var_SetTime( p_input, "spu-delay", i_delay ); ClearChannels( p_intf, p_vout ); vout_OSDMessage( p_intf, DEFAULT_CHAN, "Subtitle delay %i ms", (int)(i_delay/1000) ); } else if( i_action == ACTIONID_AUDIODELAY_DOWN ) { int64_t i_delay = var_GetTime( p_input, "audio-delay" ); i_delay -= 50000; /* 50 ms */ var_SetTime( p_input, "audio-delay", i_delay ); ClearChannels( p_intf, p_vout ); vout_OSDMessage( p_intf, DEFAULT_CHAN, "Audio delay %i ms", (int)(i_delay/1000) ); } else if( i_action == ACTIONID_AUDIODELAY_UP ) { int64_t i_delay = var_GetTime( p_input, "audio-delay" ); i_delay += 50000; /* 50 ms */ var_SetTime( p_input, "audio-delay", i_delay ); ClearChannels( p_intf, p_vout ); vout_OSDMessage( p_intf, DEFAULT_CHAN, "Audio delay %i ms", (int)(i_delay/1000) ); } else if( i_action == ACTIONID_FULLSCREEN ) { if( p_vout ) { var_Get( p_vout, "fullscreen", &val ); val.b_bool = !val.b_bool; var_Set( p_vout, "fullscreen", val ); } else { p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( p_playlist ) { var_Get( p_playlist, "fullscreen", &val ); val.b_bool = !val.b_bool; var_Set( p_playlist, "fullscreen", val ); vlc_object_release( p_playlist ); } } } else if( i_action == ACTIONID_PLAY ) { 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_PAUSE_ICON ); playlist_Play( p_playlist ); vlc_object_release( p_playlist ); } } else if( i_action == ACTIONID_PLAY_PAUSE ) { val.i_int = PLAYING_S; if( p_input ) { var_Get( p_input, "state", &val ); } if( p_input && val.i_int != PAUSE_S ) { 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 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -