# 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 void InteractionSearchInterface( interaction_t * );
static void InteractionLoop( vlc_object_t * );
static void InteractionManage( interaction_t * );
-static void interaction_Destructor( vlc_object_t *p_interaction );
static interaction_dialog_t *DialogGetById( interaction_t* , int );
static void DialogDestroy( interaction_dialog_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;
*
* \return a vlc_object_t that should be freed when done.
*/
-vlc_object_t * interaction_Init( libvlc_int_t *p_libvlc )
+interaction_t * interaction_Init( libvlc_int_t *p_libvlc )
{
interaction_t *p_interaction;
/* Make sure we haven't yet created an interaction object */
- assert( vlc_object_find( p_libvlc, VLC_OBJECT_INTERACTION, FIND_ANYWHERE ) == NULL );
-
- p_interaction = vlc_object_create( p_libvlc, VLC_OBJECT_INTERACTION );
+ 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( p_interaction )
+ if( vlc_thread_create( p_interaction, "Interaction control",
+ InteractionLoop, VLC_THREAD_PRIORITY_LOW,
+ false ) )
{
- 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;
- }
+ 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;
}
-
- vlc_object_set_destructor( p_interaction, interaction_Destructor );
- return VLC_OBJECT( p_interaction );
+ return p_interaction;
}
-static void interaction_Destructor( vlc_object_t *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 );
}
/**********************************************************************
/* Get the interaction object. Create it if needed */
static interaction_t * InteractionGet( vlc_object_t *p_this )
{
- return vlc_object_find( p_this, VLC_OBJECT_INTERACTION, FIND_ANYWHERE );
+ interaction_t *obj = libvlc_priv(p_this->p_libvlc)->p_interaction;
+ if( obj )
+ vlc_object_yield( obj );
+ return obj;
}
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-- )