void * p_private; //< Private interface data
int i_status; //< Dialog status;
+
+ int i_action; //< Action to perform;
};
/**
intf_dialog_args_t * );
/** Interaction stuff */
- int ( *pf_interact ) ( intf_thread_t *, interaction_dialog_t *, int );
+ vlc_bool_t b_interaction;
/** Video window callbacks */
void * ( *pf_request_window ) ( intf_thread_t *, vout_thread_t *,
#include <vlc/aout.h>
#include "charset.h"
+#include <vlc_interaction.h>
+
#include <wx/splitter.h>
/* include the toolbar graphics */
/*****************************************************************************
* Local prototypes
*****************************************************************************/
-static int DoInteract( intf_thread_t *, interaction_dialog_t *, int );
+static int InteractCallback( vlc_object_t *, const char *, vlc_value_t,
+ vlc_value_t, void *);
/*****************************************************************************
* Local class declarations.
UpdateVLC_Event,
VLM_Event,
- Iconize_Event
+ Iconize_Event,
};
+DEFINE_LOCAL_EVENT_TYPE( wxEVT_INTERACTION );
+
BEGIN_EVENT_TABLE(Interface, wxFrame)
/* Menu events */
EVT_MENU(Exit_Event, Interface::OnExit)
/* Custom events */
EVT_COMMAND(0, wxEVT_INTF, Interface::OnControlEvent)
EVT_COMMAND(1, wxEVT_INTF, Interface::OnControlEvent)
+
+ EVT_COMMAND( -1, wxEVT_INTERACTION, Interface::OnInteraction )
END_EVENT_TABLE()
/*****************************************************************************
extra_frame = 0;
playlist_manager = 0;
- p_intf->pf_interact = DoInteract;
/* Give our interface a nice little icon */
SetIcon( wxIcon( vlc_xpm ) );
SetIntfMinSize();
+ fprintf( stderr, "Adding callback to object %i\n", p_intf->i_object_id );
+
+ var_Create( p_intf, "interaction", VLC_VAR_ADDRESS );
+ var_AddCallback( p_intf, "interaction", InteractCallback, this );
+ p_intf->b_interaction = VLC_TRUE;
+
/* Show embedded playlist if requested */
if( splitter->ShowOnStart() ) OnSmallPlaylist( dummy );
}
if( p_systray ) delete p_systray;
#endif
+ p_intf->b_interaction = VLC_FALSE;
+ var_DelCallback( p_intf, "interaction", InteractCallback, this );
+
if( p_intf->p_sys->p_wxwindow ) delete p_intf->p_sys->p_wxwindow;
+
/* Clean up */
delete timer;
}
GetToolBar()->ToggleTool( PlayStream_Event, false );
}
-static int DoInteract( intf_thread_t *, interaction_dialog_t *, int )
+void Interface::OnInteraction( wxCommandEvent& event )
{
- fprintf( stderr, "Doing interaction \n" );
+ interaction_dialog_t *p_dialog = (interaction_dialog_t *)
+ event.GetClientData();
+ if( p_dialog->i_widgets == 0 ) return;
+
+ /// \todo : Code this . This is only test code. No locking, ...
+ wxString message = wxU( p_dialog->pp_widgets[0]->psz_text );
+ REMOVE_ELEM( p_dialog->pp_widgets, p_dialog->i_widgets, 0 );
+ wxMessageBox( message, wxU( p_dialog->psz_title ) );
+ p_dialog->i_status = ANSWERED_DIALOG;
+}
+
+static int InteractCallback( vlc_object_t *p_this,
+ const char *psz_var, vlc_value_t old_val,
+ vlc_value_t new_val, void *param )
+{
+ Interface *p_interface = (Interface*)param;
+ interaction_dialog_t *p_dialog = (interaction_dialog_t*)(new_val.p_address);
+
+ /// Not handled
+ if( p_dialog->i_action == INTERACT_HIDE )
+ {
+ p_dialog->i_status = HIDDEN_DIALOG;
+ return;
+ }
+
+ wxCommandEvent event( wxEVT_INTERACTION, -1 );
+ event.SetClientData( new_val.p_address );
+ p_interface->AddPendingEvent( event );
return VLC_SUCCESS;
}
void OnSlowStream( wxCommandEvent& event );
void OnFastStream( wxCommandEvent& event );
+ void OnInteraction( wxCommandEvent& event );
+
void OnMenuOpen( wxMenuEvent& event );
#if defined( __WXMSW__ ) || defined( __WXMAC__ )
{
msg_Err( p_input, "no suitable access module for `%s'", psz_mrl );
intf_UserFatal( VLC_OBJECT( p_input), DIALOG_NOACCESS,
+ "Error opening stream",
"Unable to open '%s'", psz_mrl );
goto error;
}
*/
void intf_InteractionManage( playlist_t *p_playlist )
{
+ vlc_value_t val;
int i_index;
interaction_t *p_interaction;
// Ask interface to hide it
msg_Dbg( p_interaction, "Hiding dialog %i", p_dialog->i_id );
- p_interaction->p_intf->pf_interact( p_interaction->p_intf,
- p_dialog, INTERACT_HIDE );
+ p_dialog->i_action = INTERACT_HIDE;
+ val.p_address = p_dialog;
+ var_Set( p_interaction->p_intf, "interaction", val );
p_dialog->i_status = HIDING_DIALOG;
break;
case UPDATED_DIALOG:
- p_interaction->p_intf->pf_interact( p_interaction->p_intf,
- p_dialog, INTERACT_UPDATE );
+ p_dialog->i_action = INTERACT_UPDATE;
+ val.p_address = p_dialog;
+ var_Set( p_interaction->p_intf, "interaction", val );
p_dialog->i_status = SENT_DIALOG;
msg_Dbg( p_interaction, "Updating dialog %i, %i widgets",
p_dialog->i_id, p_dialog->i_widgets );
break;
case NEW_DIALOG:
// This is truly a new dialog, send it.
- p_interaction->p_intf->pf_interact( p_interaction->p_intf,
- p_dialog, INTERACT_NEW );
- msg_Dbg( p_interaction, "Creating dialog %i, %i widgets",
- p_dialog->i_id, p_dialog->i_widgets );
+ p_dialog->i_action = INTERACT_NEW;
+ val.p_address = p_dialog;
+ var_Set( p_interaction->p_intf, "interaction", val );
+ msg_Dbg( p_interaction, "Creating dialog %i to interface %i, %i widgets",
+ p_dialog->i_id, p_interaction->p_intf->i_object_id, p_dialog->i_widgets );
p_dialog->i_status = SENT_DIALOG;
break;
}
{
intf_thread_t *p_intf = (intf_thread_t *)
p_list->p_values[i_index].p_object;
- if( p_intf->pf_interact != NULL )
+ if( p_intf->b_interaction )
{
p_interaction->p_intf = p_intf;
break;
p_intf->pf_request_window = NULL;
p_intf->pf_release_window = NULL;
p_intf->pf_control_window = NULL;
- p_intf->pf_interact = NULL;
p_intf->b_play = VLC_FALSE;
+ p_intf->b_interaction = VLC_FALSE;
/* Choose the best module */
p_intf->p_module = module_Need( p_intf, "interface", psz_module, 0 );