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

📄 interaction.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
 */void __intf_UserHide( vlc_object_t *p_this, int i_id ){    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 )    {        p_dialog->i_status = ANSWERED_DIALOG;        vlc_object_signal_unlocked( p_interaction );    }    vlc_object_unlock( p_interaction );    vlc_object_release( p_interaction );}/** * Create the initial interaction object * (should only be used in libvlc_InternalInit, LibVLC private) * * \return a vlc_object_t that should be freed when done. */interaction_t * interaction_Init( libvlc_int_t *p_libvlc ){    interaction_t *p_interaction;    /* Make sure we haven't yet created an interaction object */    assert( libvlc_priv(p_libvlc)->p_interaction == NULL );    p_interaction = vlc_custom_create( VLC_OBJECT(p_libvlc),                                       sizeof( *p_interaction ),                                       VLC_OBJECT_GENERIC, "interaction" );    if( !p_interaction )        return NULL;    vlc_object_attach( p_interaction, p_libvlc );    p_interaction->i_dialogs = 0;    p_interaction->pp_dialogs = NULL;    p_interaction->p_intf = NULL;    p_interaction->i_last_id = 0;    if( vlc_thread_create( p_interaction, "Interaction control",                           InteractionLoop, VLC_THREAD_PRIORITY_LOW,                           false ) )    {        msg_Err( p_interaction, "Interaction control thread creation failed, "                 "interaction will not be displayed" );        vlc_object_detach( p_interaction );        vlc_object_release( p_interaction );        return NULL;    }    return p_interaction;}void interaction_Destroy( interaction_t *p_interaction ){    if( !p_interaction )        return;    vlc_object_kill( p_interaction );    vlc_thread_join( p_interaction );    vlc_object_release( p_interaction );}/********************************************************************** * The following functions are local **********************************************************************//* Get the interaction object. Create it if needed */static interaction_t * InteractionGet( vlc_object_t *p_this ){    interaction_t *obj = libvlc_priv(p_this->p_libvlc)->p_interaction;    if( obj )        vlc_object_yield( obj );    return obj;}/* Look for an interface suitable for interaction */static void 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 );}/* Find an interaction dialog by its id */static interaction_dialog_t *DialogGetById( interaction_t *p_interaction,                                            int i_id ){    int i;    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;}/* Destroy a dialog */static void DialogDestroy( interaction_dialog_t *p_dialog ){    free( p_dialog->psz_title );    free( p_dialog->psz_description );    free( p_dialog->psz_default_button );    free( p_dialog->psz_alternate_button );    free( p_dialog->psz_other_button );    free( p_dialog );}/* Ask for the dialog to be sent to the user. Wait for answer * if required */static int DialogSend( vlc_object_t *p_this, interaction_dialog_t *p_dialog ){    interaction_t *p_interaction = InteractionGet( p_this );    if( !p_interaction )        return VLC_EGENERIC;    /* Get an id, if we don't already have one */    vlc_object_lock( p_interaction );    if( p_dialog->i_id == 0 )        p_dialog->i_id = ++p_interaction->i_last_id;    vlc_object_unlock( p_interaction );    if( p_this->i_flags & OBJECT_FLAGS_NOINTERACT )    {        vlc_object_release( p_interaction );        return VLC_EGENERIC;    }    if( config_GetInt( p_this, "interact" ) ||        p_dialog->i_flags & DIALOG_BLOCKING_ERROR ||        p_dialog->i_flags & DIALOG_NONBLOCKING_ERROR )    {        bool b_found = false;        int i;        p_dialog->p_interaction = p_interaction;        p_dialog->p_parent = p_this;        /* Check if we have already added this dialog */        vlc_object_lock( p_interaction );        for( i = 0 ; i< p_interaction->i_dialogs; i++ )        {            if( p_interaction->pp_dialogs[i]->i_id == p_dialog->i_id )                b_found = true;        }        /* Add it to the queue, the main loop will send the orders to the         * interface */        if( ! b_found )        {            INSERT_ELEM( p_interaction->pp_dialogs,                         p_interaction->i_dialogs,                         p_interaction->i_dialogs,                         p_dialog );        }        else            p_dialog->i_status = UPDATED_DIALOG;        if( p_dialog->i_type == INTERACT_DIALOG_TWOWAY ) /* Wait for answer */        {            vlc_object_signal_unlocked( p_interaction );            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 )            {                vlc_object_unlock( p_interaction );                msleep( 100000 );                vlc_object_lock( p_interaction );            }            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;            vlc_object_signal_unlocked( p_interaction );            vlc_object_unlock( p_interaction );            vlc_object_release( p_interaction );            return p_dialog->i_return;        }        else        {            /* Pretend we already retrieved the "answer" */            p_dialog->i_flags |=  DIALOG_GOT_ANSWER;            vlc_object_signal_unlocked( p_interaction );            vlc_object_unlock( p_interaction );            vlc_object_release( p_interaction );            return VLC_SUCCESS;        }    }    else    {        vlc_object_release( p_interaction );        return VLC_EGENERIC;    }}static void* InteractionLoop( vlc_object_t *p_this ){    int i;    interaction_t *p_interaction = (interaction_t*) p_this;    vlc_object_lock( p_this );    while( vlc_object_alive( p_this ) )    {        InteractionManage( p_interaction );        vlc_object_wait( p_this );    }    vlc_object_unlock( p_this );    /* Remove all dialogs - Interfaces must be able to clean up their data */    for( i = p_interaction->i_dialogs -1 ; i >= 0; i-- )    {        interaction_dialog_t * p_dialog = p_interaction->pp_dialogs[i];        DialogDestroy( p_dialog );        REMOVE_ELEM( p_interaction->pp_dialogs, p_interaction->i_dialogs, i );    }    return NULL;}/** * The main interaction processing loop * * \param p_interaction the interaction object * \return nothing */static void InteractionManage( interaction_t *p_interaction ){    vlc_value_t val;    int i_index;    /* Nothing to do */    if( p_interaction->i_dialogs == 0 ) return;    InteractionSearchInterface( p_interaction );    if( !p_interaction->p_intf )    {        /* We mark all dialogs as answered with their "default" answer */        for( i_index = 0 ; i_index < p_interaction->i_dialogs; i_index ++ )        {            interaction_dialog_t *p_dialog = p_interaction->pp_dialogs[i_index];            p_dialog->i_return = DIALOG_DEFAULT; /* Give default answer */            /* Pretend we have hidden and destroyed it */            if( p_dialog->i_status == HIDDEN_DIALOG )                p_dialog->i_status = DESTROYED_DIALOG;            else                p_dialog->i_status = HIDING_DIALOG;        }    }    else        vlc_object_yield( p_interaction->p_intf );    for( i_index = 0 ; i_index < p_interaction->i_dialogs; i_index ++ )    {        interaction_dialog_t *p_dialog = p_interaction->pp_dialogs[i_index];        switch( p_dialog->i_status )        {        case ANSWERED_DIALOG:            /* Ask interface to hide it */            p_dialog->i_action = INTERACT_HIDE;            val.p_address = p_dialog;            if( p_interaction->p_intf )                var_Set( p_interaction->p_intf, "interaction", val );            p_dialog->i_status = HIDING_DIALOG;            break;        case UPDATED_DIALOG:            p_dialog->i_action = INTERACT_UPDATE;            val.p_address = p_dialog;            if( p_interaction->p_intf )                var_Set( p_interaction->p_intf, "interaction", val );            p_dialog->i_status = SENT_DIALOG;            break;        case HIDDEN_DIALOG:            if( !(p_dialog->i_flags & DIALOG_GOT_ANSWER) ) break;            p_dialog->i_action = INTERACT_DESTROY;            val.p_address = p_dialog;            if( p_interaction->p_intf )                var_Set( p_interaction->p_intf, "interaction", val );            break;        case DESTROYED_DIALOG:            /* Interface has now destroyed it, remove it */            REMOVE_ELEM( p_interaction->pp_dialogs, p_interaction->i_dialogs,                         i_index);            i_index--;            DialogDestroy( p_dialog );            break;        case NEW_DIALOG:            /* This is truly a new dialog, send it. */            p_dialog->i_action = INTERACT_NEW;            val.p_address = p_dialog;            if( p_interaction->p_intf )                var_Set( p_interaction->p_intf, "interaction", val );            p_dialog->i_status = SENT_DIALOG;            break;        }    }    if( p_interaction->p_intf )        vlc_object_release( p_interaction->p_intf );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -