X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finterface%2Finteraction.c;h=e0920eaf50d62a70f0ff56f8e635f728233f828e;hb=7b0dd84fff6c300cab5e0bdbf2a29fb1b3618e62;hp=8a302c8e366781714fa74fe3db808bf9f0b420b7;hpb=a3069143195fc51aecced37fef9725c0f8acb9dd;p=vlc diff --git a/src/interface/interaction.c b/src/interface/interaction.c index 8a302c8e36..e0920eaf50 100644 --- a/src/interface/interaction.c +++ b/src/interface/interaction.c @@ -35,10 +35,11 @@ # include "config.h" #endif -#include +#include #include #include "interface.h" +#include "libvlc.h" #include @@ -275,7 +276,7 @@ int __intf_UserLoginPassword( vlc_object_t *p_this, 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; @@ -354,37 +355,47 @@ void __intf_UserHide( vlc_object_t *p_this, int i_id ) * * \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 ); - if( p_interaction ) + 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 ) ) { - 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 ); - 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; } - - return VLC_OBJECT( p_interaction ); + + 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 ); } /********************************************************************** @@ -394,7 +405,10 @@ vlc_object_t * interaction_Init( libvlc_int_t *p_libvlc ) /* 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; } @@ -460,7 +474,11 @@ static int DialogSend( vlc_object_t *p_this, interaction_dialog_t *p_dialog ) if( p_dialog->i_id == 0 ) p_dialog->i_id = ++p_interaction->i_last_id; - if( p_this->i_flags & OBJECT_FLAGS_NOINTERACT ) return VLC_EGENERIC; + 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 ||