# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
#include <vlc_interface.h>
+#include "interface.h"
+#include "libvlc.h"
+
+#include <assert.h>
/*****************************************************************************
* Local prototypes
*****************************************************************************/
-static interaction_t * InteractionInit( libvlc_int_t * );
static interaction_t * InteractionGet( vlc_object_t * );
static void InteractionSearchInterface( interaction_t * );
static void InteractionLoop( vlc_object_t * );
#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->b_cancelled = false; \
p_new->i_status = NEW_DIALOG; \
p_new->i_flags = 0; \
p_new->i_type = INTERACT_DIALOG_##type; \
* \param psz_format The message to display
* \return VLC_SUCCESS or VLC_EGENERIC
*/
-int __intf_UserFatal( vlc_object_t *p_this, vlc_bool_t b_blocking,
+int __intf_UserFatal( vlc_object_t *p_this, bool b_blocking,
const char *psz_title,
const char *psz_format, ... )
{
* \param i_id Identifier of the dialogue
* \return Either true or false
*/
-vlc_bool_t __intf_UserProgressIsCancelled( vlc_object_t *p_this, int i_id )
+bool __intf_UserProgressIsCancelled( vlc_object_t *p_this, int i_id )
{
interaction_t *p_interaction = InteractionGet( p_this );
interaction_dialog_t *p_dialog;
- vlc_bool_t b_cancel;
+ bool b_cancel;
- if( !p_interaction ) return VLC_TRUE;
+ if( !p_interaction ) return true;
vlc_object_lock( p_interaction );
p_dialog = DialogGetById( p_interaction, i_id );
{
vlc_object_unlock( p_interaction ) ;
vlc_object_release( p_interaction );
- return VLC_TRUE;
+ return true;
}
b_cancel = p_dialog->b_cancelled;
p_new->i_type = INTERACT_DIALOG_TWOWAY;
p_new->psz_title = strdup( psz_title );
p_new->psz_description = strdup( psz_description );
- p_new->psz_default_button = strdup( _("Ok" ) );
+ p_new->psz_default_button = strdup( _("OK" ) );
p_new->psz_alternate_button = strdup( _("Cancel" ) );
p_new->i_flags = DIALOG_LOGIN_PW_OK_CANCEL;
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 )
+/**
+ * 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 =
- vlc_object_find( p_this, VLC_OBJECT_INTERACTION, FIND_ANYWHERE );
+ 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 )
- p_interaction = InteractionInit( p_this->p_libvlc );
+ 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;
}
-/* Create the interaction object in the given playlist object */
-static interaction_t * InteractionInit( libvlc_int_t *p_libvlc )
+void interaction_Destroy( interaction_t *p_interaction )
{
- interaction_t *p_interaction =
- vlc_object_create( p_libvlc, VLC_OBJECT_INTERACTION );
+ if( !p_interaction )
+ return;
- if( p_interaction )
- {
- 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,
- VLC_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 );
- p_interaction = NULL;
- }
- else
- vlc_object_yield( p_interaction );
- }
+ vlc_object_kill( p_interaction );
+ vlc_thread_join( p_interaction );
+ vlc_object_release( p_interaction );
+}
- return 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 )
{
p_dialog->i_flags & DIALOG_BLOCKING_ERROR ||
p_dialog->i_flags & DIALOG_NONBLOCKING_ERROR )
{
- vlc_bool_t b_found = VLC_FALSE;
+ bool b_found = false;
int i;
p_dialog->p_interaction = p_interaction;
p_dialog->p_parent = p_this;
for( i = 0 ; i< p_interaction->i_dialogs; i++ )
{
if( p_interaction->pp_dialogs[i]->i_id == p_dialog->i_id )
- b_found = VLC_TRUE;
+ b_found = true;
}
/* Add it to the queue, the main loop will send the orders to the
* interface */
int i;
interaction_t *p_interaction = (interaction_t*) p_this;
- while( !p_this->b_die )
+ vlc_object_lock( p_this );
+ while( vlc_object_alive( p_this ) )
{
- vlc_object_lock( p_this );
- if( vlc_object_wait( p_this ) )
- {
- vlc_object_unlock( p_this );
- break;
- }
InteractionManage( p_interaction );
- vlc_object_unlock( p_this );
+ 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-- )
DialogDestroy( p_dialog );
REMOVE_ELEM( p_interaction->pp_dialogs, p_interaction->i_dialogs, i );
}
-
- vlc_object_detach( p_this );
- vlc_object_release( p_this );
}
/**