📄 interaction.c
字号:
INTERACT_INIT( p_new ); p_new->i_type = INTERACT_DIALOG_ONEWAY; p_new->psz_title = strdup( psz_title ); /* Progress bar */ p_widget = (user_widget_t* )malloc( sizeof( user_widget_t ) ); p_widget->i_type = WIDGET_PROGRESS; p_widget->psz_text = strdup( psz_status ); p_widget->val.f_float = f_pos; INSERT_ELEM ( p_new->pp_widgets, p_new->i_widgets, p_new->i_widgets, p_widget ); i_ret = intf_Interact( p_this, p_new ); return p_new->i_id;}/** Update a progress bar * \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) * \return nothing */void __intf_UserProgressUpdate( vlc_object_t *p_this, int i_id, const char *psz_status, float f_pos ){ interaction_t *p_interaction = intf_InteractionGet( p_this ); interaction_dialog_t *p_dialog; if( !p_interaction ) return; vlc_mutex_lock( &p_interaction->object_lock ); p_dialog = intf_InteractionGetById( p_this, i_id ); if( !p_dialog ) { vlc_mutex_unlock( &p_interaction->object_lock ) ; return; } if( p_dialog->pp_widgets[0]->psz_text ) free( p_dialog->pp_widgets[0]->psz_text ); p_dialog->pp_widgets[0]->psz_text = strdup( psz_status ); p_dialog->pp_widgets[0]->val.f_float = f_pos; p_dialog->i_status = UPDATED_DIALOG; vlc_mutex_unlock( &p_interaction->object_lock) ;}/** Helper function to make a login/password box * \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; interaction_dialog_t *p_new = NULL; user_widget_t *p_widget = NULL; INTERACT_INIT( p_new ); p_new->i_type = INTERACT_DIALOG_TWOWAY; p_new->psz_title = strdup( psz_title ); /* Text */ p_widget = (user_widget_t* )malloc( sizeof( user_widget_t ) ); p_widget->i_type = WIDGET_TEXT; p_widget->psz_text = strdup( psz_description ); p_widget->val.psz_string = NULL; INSERT_ELEM ( p_new->pp_widgets, p_new->i_widgets, p_new->i_widgets, p_widget ); /* Login */ p_widget = (user_widget_t* )malloc( sizeof( user_widget_t ) ); p_widget->i_type = WIDGET_INPUT_TEXT; p_widget->psz_text = strdup( _("Login") ); p_widget->val.psz_string = NULL; INSERT_ELEM ( p_new->pp_widgets, p_new->i_widgets, p_new->i_widgets, p_widget ); /* Password */ p_widget = (user_widget_t* )malloc( sizeof( user_widget_t ) ); p_widget->i_type = WIDGET_INPUT_TEXT; p_widget->psz_text = strdup( _("Password") ); p_widget->val.psz_string = NULL; INSERT_ELEM ( p_new->pp_widgets, p_new->i_widgets, p_new->i_widgets, p_widget ); p_new->i_flags = DIALOG_OK_CANCEL; i_ret = intf_Interact( p_this, p_new ); if( i_ret != DIALOG_CANCELLED && i_ret != VLC_EGENERIC ) { *ppsz_login = p_new->pp_widgets[1]->val.psz_string? strdup( p_new->pp_widgets[1]->val.psz_string ) : NULL; *ppsz_password = p_new->pp_widgets[2]->val.psz_string? strdup( p_new->pp_widgets[2]->val.psz_string ) : 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 */void __intf_UserHide( vlc_object_t *p_this, int i_id ){ interaction_t *p_interaction = intf_InteractionGet( p_this ); interaction_dialog_t *p_dialog; if( !p_interaction ) return; vlc_mutex_lock( &p_interaction->object_lock ); p_dialog = intf_InteractionGetById( p_this, i_id ); if( !p_dialog ) { vlc_mutex_unlock( &p_interaction->object_lock ); return; } p_dialog->i_status = ANSWERED_DIALOG; vlc_mutex_unlock( &p_interaction->object_lock );}/********************************************************************** * The following functions are local **********************************************************************//* Get the interaction object. Create it if needed */static interaction_t * intf_InteractionGet( vlc_object_t *p_this ){ playlist_t *p_playlist; interaction_t *p_interaction; p_playlist = (playlist_t*) vlc_object_find( p_this, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( !p_playlist ) { return NULL; } if( p_playlist->p_interaction == NULL ) { intf_InteractionInit( p_playlist ); } p_interaction = p_playlist->p_interaction; vlc_object_release( p_playlist ); return p_interaction;}/* Create the interaction object in the given playlist object */static void intf_InteractionInit( playlist_t *p_playlist ){ interaction_t *p_interaction; p_interaction = vlc_object_create( VLC_OBJECT( p_playlist ), sizeof( interaction_t ) ); if( !p_interaction ) { msg_Err( p_playlist,"out of memory" ); return; } p_interaction->i_dialogs = 0; p_interaction->pp_dialogs = NULL; p_interaction->p_intf = NULL; p_interaction->i_last_id = DIALOG_LAST_PREDEFINED + 1; vlc_mutex_init( p_interaction , &p_interaction->object_lock ); p_playlist->p_interaction = p_interaction;}/* Look for an interface suitable for interaction */static void intf_InteractionSearchInterface( interaction_t *p_interaction ){ vlc_list_t *p_list; int i_index; p_interaction->p_intf = NULL; p_list = vlc_list_find( p_interaction, VLC_OBJECT_INTF, FIND_ANYWHERE ); if( !p_list ) { msg_Err( p_interaction, "unable to create module list" ); return; } for( i_index = 0; i_index < p_list->i_count; i_index ++ ) { intf_thread_t *p_intf = (intf_thread_t *) p_list->p_values[i_index].p_object; if( p_intf->b_interaction ) { p_interaction->p_intf = p_intf; break; } } vlc_list_release ( p_list );}/* Add a dialog to the queue and wait for answer */static int intf_WaitAnswer( interaction_t *p_interact, interaction_dialog_t *p_dialog ){ int i; vlc_bool_t b_found = VLC_FALSE; vlc_mutex_lock( &p_interact->object_lock ); for( i = 0 ; i< p_interact->i_dialogs; i++ ) { if( p_interact->pp_dialogs[i]->i_id == p_dialog->i_id ) { b_found = VLC_TRUE; } } if( ! b_found ) { INSERT_ELEM( p_interact->pp_dialogs, p_interact->i_dialogs, p_interact->i_dialogs, p_dialog ); } else p_dialog->i_status = UPDATED_DIALOG; vlc_mutex_unlock( &p_interact->object_lock ); /// \todo Check that the initiating object is not dying while( p_dialog->i_status != ANSWERED_DIALOG && p_dialog->i_status != HIDING_DIALOG && p_dialog->i_status != HIDDEN_DIALOG && !p_dialog->p_parent->b_die ) { msleep( 100000 ); } /// \todo locking if( p_dialog->p_parent->b_die ) { p_dialog->i_return = DIALOG_CANCELLED; p_dialog->i_status = ANSWERED_DIALOG; } p_dialog->i_flags |= DIALOG_GOT_ANSWER; return p_dialog->i_return;}/* Add a dialog to the queue and return */static int intf_Send( interaction_t *p_interact, interaction_dialog_t *p_dialog ){ int i; vlc_bool_t b_found = VLC_FALSE; if( p_interact == NULL ) return VLC_ENOOBJ; vlc_mutex_lock( &p_interact->object_lock ); for( i = 0 ; i< p_interact->i_dialogs; i++ ) { if( p_interact->pp_dialogs[i]->i_id == p_dialog->i_id ) { b_found = VLC_TRUE; } } if( !b_found ) { INSERT_ELEM( p_interact->pp_dialogs, p_interact->i_dialogs, p_interact->i_dialogs, p_dialog ); } else p_dialog->i_status = UPDATED_DIALOG; // Pretend we already retrieved the "answer" p_dialog->i_flags |= DIALOG_GOT_ANSWER; vlc_mutex_unlock( &p_interact->object_lock ); return VLC_SUCCESS;}/* Find an interaction dialog by its id */static interaction_dialog_t *intf_InteractionGetById( vlc_object_t* p_this, int i_id ){ interaction_t *p_interaction = intf_InteractionGet( p_this ); int i; if( !p_interaction ) return NULL; for( i = 0 ; i< p_interaction->i_dialogs; i++ ) { if( p_interaction->pp_dialogs[i]->i_id == i_id ) { return p_interaction->pp_dialogs[i]; } } return NULL;}#define FREE( i ) { if( i ) free( i ); i = NULL; }static void intf_InteractionDialogDestroy( interaction_dialog_t *p_dialog ){ int i; for( i = p_dialog->i_widgets - 1 ; i >= 0 ; i-- ) { user_widget_t *p_widget = p_dialog->pp_widgets[i]; FREE( p_widget->psz_text ); if( p_widget->i_type == WIDGET_INPUT_TEXT ) { FREE( p_widget->val.psz_string ); } REMOVE_ELEM( p_dialog->pp_widgets, p_dialog->i_widgets, i ); free( p_widget ); } FREE( p_dialog->psz_title ); FREE( p_dialog->psz_description ); free( p_dialog );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -