+ }
+}
+
+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 );
+ }
+}
+
+/**
+ * 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 );