⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interaction.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -