-void intf_InteractionManage( playlist_t *p_playlist )
-{
- vlc_value_t val;
- int i_index;
- interaction_t *p_interaction = p_playlist->p_interaction;
-
- // Nothing to do
- if( p_interaction->i_dialogs == 0 ) return;
-
- vlc_mutex_lock( &p_interaction->object_lock );
-
- 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;
- if( !(p_dialog->i_flags & DIALOG_REUSABLE) )
- {
- 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 );
- }
-
- vlc_mutex_unlock( &p_playlist->p_interaction->object_lock );
-}
-
-#define DIALOG_INIT( type ) \
- DECMALLOC_ERR( p_new, interaction_dialog_t ); \
- memset( p_new, 0, sizeof( interaction_dialog_t ) ); \
- p_new->b_cancelled = VLC_FALSE; \
- p_new->i_status = NEW_DIALOG; \
- 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 ); \
- vasprintf( &p_new->psz_description, psz_format, args ); \
- 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
- * */
-int __intf_UserFatal( vlc_object_t *p_this, vlc_bool_t 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 an 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
- * */
-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,