📄 interaction.c
字号:
/***************************************************************************** * interaction.c: User interaction functions ***************************************************************************** * Copyright © 2005-2008 the VideoLAN team * $Id: 293dc330e11aa65b6e39467d7e6d1c1d1b5ce759 $ * * Authors: Clément Stenac <zorglub@videolan.org> * Felix Kühne <fkuehne@videolan.org> * * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//** * \file * This file contains functions related to user interaction management *//***************************************************************************** * Preamble *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <vlc_interface.h>#include "interface.h"#include "libvlc.h"#include <assert.h>/***************************************************************************** * Local prototypes *****************************************************************************/static interaction_t * InteractionGet( vlc_object_t * );static void InteractionSearchInterface( interaction_t * );static void* InteractionLoop( vlc_object_t * );static void InteractionManage( interaction_t * );static interaction_dialog_t *DialogGetById( interaction_t* , int );static void DialogDestroy( interaction_dialog_t * );static int DialogSend( vlc_object_t *, interaction_dialog_t * );#define DIALOG_INIT( type ) \ DECMALLOC_ERR( p_new, interaction_dialog_t ); \ memset( p_new, 0, sizeof( interaction_dialog_t ) ); \ p_new->b_cancelled = false; \ p_new->i_status = NEW_DIALOG; \ p_new->i_flags = 0; \ p_new->i_type = INTERACT_DIALOG_##type; \ p_new->psz_returned[0] = NULL; \ p_new->psz_returned[1] = NULL#define FORMAT_DESC \ va_start( args, psz_format ); \ if( vasprintf( &p_new->psz_description, psz_format, args ) == -1 ) \ return VLC_EGENERIC; \ va_end( args )/** * Send an error message, both in a blocking and non-blocking way * * \param p_this Parent vlc_object * \param b_blocking Is this dialog blocking or not? * \param psz_title Title for the dialog * \param psz_format The message to display * \return VLC_SUCCESS or VLC_EGENERIC */int __intf_UserFatal( vlc_object_t *p_this, bool b_blocking, const char *psz_title, const char *psz_format, ... ){ va_list args; DIALOG_INIT( ONEWAY ); p_new->psz_title = strdup( psz_title ); FORMAT_DESC; if( b_blocking ) p_new->i_flags = DIALOG_BLOCKING_ERROR; else p_new->i_flags = DIALOG_NONBLOCKING_ERROR; return DialogSend( p_this, p_new );}/** * Helper function to send a warning, which is always shown non-blocking * * \param p_this Parent vlc_object * \param psz_title Title for the dialog * \param psz_format The message to display * \return VLC_SUCCESS or VLC_EGENERIC */int __intf_UserWarn( vlc_object_t *p_this, const char *psz_title, const char *psz_format, ... ){ va_list args; DIALOG_INIT( ONEWAY ); p_new->psz_title = strdup( psz_title ); FORMAT_DESC; p_new->i_flags = DIALOG_WARNING; return DialogSend( p_this, p_new );}/** * Helper function to ask a yes-no-cancel question * * \param p_this Parent vlc_object * \param psz_title Title for the dialog * \param psz_description A description * \param psz_default caption for the default button * \param psz_alternate caption for the alternate button * \param psz_other caption for the optional 3rd button (== cancel) * \return Clicked button code */int __intf_UserYesNo( vlc_object_t *p_this, const char *psz_title, const char *psz_description, const char *psz_default, const char *psz_alternate, const char *psz_other ){ DIALOG_INIT( TWOWAY ); p_new->psz_title = strdup( psz_title ); p_new->psz_description = strdup( psz_description ); p_new->i_flags = DIALOG_YES_NO_CANCEL; p_new->psz_default_button = strdup( psz_default ); p_new->psz_alternate_button = strdup( psz_alternate ); if( psz_other ) p_new->psz_other_button = strdup( psz_other ); return DialogSend( p_this, p_new );}/** * Helper function to create a dialogue showing a progress-bar with some info * * \param p_this Parent vlc_object * \param psz_title Title for the dialog (NULL implies main intf ) * \param psz_status Current status * \param f_position Current position (0.0->100.0) * \param i_timeToGo Time (in sec) to go until process is finished * \return Dialog id, to give to UserProgressUpdate */int __intf_Progress( vlc_object_t *p_this, const char *psz_title, const char *psz_status, float f_pos, int i_time ){ DIALOG_INIT( ONEWAY ); p_new->psz_description = strdup( psz_status ); p_new->val.f_float = f_pos; p_new->i_timeToGo = i_time; p_new->psz_alternate_button = strdup( _( "Cancel" ) ); if( psz_title ) { p_new->psz_title = strdup( psz_title ); p_new->i_flags = DIALOG_USER_PROGRESS; } else p_new->i_flags = DIALOG_INTF_PROGRESS; DialogSend( p_this, p_new ); return p_new->i_id;}/** * Update a progress bar in a dialogue * * \param p_this Parent vlc_object * \param i_id Identifier of the dialog * \param psz_status New status * \param f_position New position (0.0->100.0) * \param i_timeToGo Time (in sec) to go until process is finished * \return nothing */void __intf_ProgressUpdate( vlc_object_t *p_this, int i_id, const char *psz_status, float f_pos, int i_time ){ interaction_t *p_interaction = InteractionGet( p_this ); interaction_dialog_t *p_dialog; if( !p_interaction ) return; vlc_object_lock( p_interaction ); p_dialog = DialogGetById( p_interaction, i_id ); if( !p_dialog ) { vlc_object_unlock( p_interaction ); vlc_object_release( p_interaction ); return; } free( p_dialog->psz_description ); p_dialog->psz_description = strdup( psz_status ); p_dialog->val.f_float = f_pos; p_dialog->i_timeToGo = i_time; p_dialog->i_status = UPDATED_DIALOG; vlc_object_signal_unlocked( p_interaction ); vlc_object_unlock( p_interaction ); vlc_object_release( p_interaction );}/** * Helper function to communicate dialogue cancellations between the * interface module and the caller * * \param p_this Parent vlc_object * \param i_id Identifier of the dialogue * \return Either true or false */bool __intf_UserProgressIsCancelled( vlc_object_t *p_this, int i_id ){ interaction_t *p_interaction = InteractionGet( p_this ); interaction_dialog_t *p_dialog; bool b_cancel; if( !p_interaction ) return true; vlc_object_lock( p_interaction ); p_dialog = DialogGetById( p_interaction, i_id ); if( !p_dialog ) { vlc_object_unlock( p_interaction ) ; vlc_object_release( p_interaction ); return true; } b_cancel = p_dialog->b_cancelled; vlc_object_unlock( p_interaction ); vlc_object_release( p_interaction ); return b_cancel;}/** * Helper function to make a login/password dialogue * * \param p_this Parent vlc_object * \param psz_title Title for the dialog * \param psz_description A description * \param ppsz_login Returned login * \param ppsz_password Returned password * \return Clicked button code */int __intf_UserLoginPassword( vlc_object_t *p_this, const char *psz_title, const char *psz_description, char **ppsz_login, char **ppsz_password ){ int i_ret; DIALOG_INIT( TWOWAY ); p_new->i_type = INTERACT_DIALOG_TWOWAY; p_new->psz_title = strdup( psz_title ); p_new->psz_description = strdup( psz_description ); p_new->psz_default_button = strdup( _("OK" ) ); p_new->psz_alternate_button = strdup( _("Cancel" ) ); p_new->i_flags = DIALOG_LOGIN_PW_OK_CANCEL; i_ret = DialogSend( p_this, p_new ); if( i_ret != DIALOG_CANCELLED && i_ret != VLC_EGENERIC ) { *ppsz_login = p_new->psz_returned[0]? strdup( p_new->psz_returned[0] ) : NULL; *ppsz_password = p_new->psz_returned[1]? strdup( p_new->psz_returned[1] ) : NULL; } return i_ret;}/** * Helper function to make a dialogue asking the user for !password string * * \param p_this Parent vlc_object * \param psz_title Title for the dialog * \param psz_description A description * \param ppsz_usersString Returned login * \return Clicked button code */int __intf_UserStringInput( vlc_object_t *p_this, const char *psz_title, const char *psz_description, char **ppsz_usersString ){ int i_ret; DIALOG_INIT( TWOWAY ); p_new->i_type = INTERACT_DIALOG_TWOWAY; p_new->psz_title = strdup( psz_title ); p_new->psz_description = strdup( psz_description ); p_new->i_flags = DIALOG_PSZ_INPUT_OK_CANCEL; i_ret = DialogSend( p_this, p_new ); if( i_ret != DIALOG_CANCELLED ) { *ppsz_usersString = p_new->psz_returned[0]? strdup( p_new->psz_returned[0] ) : NULL; } return i_ret;}/** * Hide an interaction dialog * * \param p_this the parent vlc object * \param i_id the id of the item to hide * \return nothing
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -