From 29c81fbc229006031b02e6295651d066a13fc185 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20Stenac?= Date: Fri, 9 Dec 2005 10:17:41 +0000 Subject: [PATCH] Replace function callback by variable callback. --- include/vlc_interaction.h | 2 ++ include/vlc_interface.h | 2 +- modules/gui/wxwidgets/interface.cpp | 53 ++++++++++++++++++++++++++--- modules/gui/wxwidgets/interface.hpp | 2 ++ src/input/input.c | 1 + src/interface/interaction.c | 22 +++++++----- src/interface/interface.c | 2 +- 7 files changed, 68 insertions(+), 16 deletions(-) diff --git a/include/vlc_interaction.h b/include/vlc_interaction.h index 2efa7bc054..e289101686 100644 --- a/include/vlc_interaction.h +++ b/include/vlc_interaction.h @@ -60,6 +60,8 @@ struct interaction_dialog_t void * p_private; //< Private interface data int i_status; //< Dialog status; + + int i_action; //< Action to perform; }; /** diff --git a/include/vlc_interface.h b/include/vlc_interface.h index cbac6828bb..b05f1d78b1 100644 --- a/include/vlc_interface.h +++ b/include/vlc_interface.h @@ -66,7 +66,7 @@ struct intf_thread_t 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 *, diff --git a/modules/gui/wxwidgets/interface.cpp b/modules/gui/wxwidgets/interface.cpp index 08209a77ab..6412589775 100644 --- a/modules/gui/wxwidgets/interface.cpp +++ b/modules/gui/wxwidgets/interface.cpp @@ -36,6 +36,8 @@ #include #include "charset.h" +#include + #include /* include the toolbar graphics */ @@ -65,7 +67,8 @@ /***************************************************************************** * 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. @@ -296,9 +299,11 @@ enum 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) @@ -343,6 +348,8 @@ BEGIN_EVENT_TABLE(Interface, wxFrame) /* 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() /***************************************************************************** @@ -358,7 +365,6 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): extra_frame = 0; playlist_manager = 0; - p_intf->pf_interact = DoInteract; /* Give our interface a nice little icon */ SetIcon( wxIcon( vlc_xpm ) ); @@ -465,6 +471,12 @@ Interface::Interface( intf_thread_t *_p_intf, long style ): 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 ); } @@ -487,8 +499,12 @@ Interface::~Interface() 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; } @@ -1183,9 +1199,36 @@ void Interface::TogglePlayButton( int i_playing_status ) 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; } diff --git a/modules/gui/wxwidgets/interface.hpp b/modules/gui/wxwidgets/interface.hpp index 5ddacccd0b..97145db123 100644 --- a/modules/gui/wxwidgets/interface.hpp +++ b/modules/gui/wxwidgets/interface.hpp @@ -142,6 +142,8 @@ namespace wxvlc void OnSlowStream( wxCommandEvent& event ); void OnFastStream( wxCommandEvent& event ); + void OnInteraction( wxCommandEvent& event ); + void OnMenuOpen( wxMenuEvent& event ); #if defined( __WXMSW__ ) || defined( __WXMAC__ ) diff --git a/src/input/input.c b/src/input/input.c index 96144a6874..5ab59b5085 100644 --- a/src/input/input.c +++ b/src/input/input.c @@ -2096,6 +2096,7 @@ static int InputSourceInit( input_thread_t *p_input, { 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; } diff --git a/src/interface/interaction.c b/src/interface/interaction.c index fd5a2f49c9..e276e2bf16 100644 --- a/src/interface/interaction.c +++ b/src/interface/interaction.c @@ -99,6 +99,7 @@ void intf_InteractionDestroy( interaction_t *p_interaction ) */ void intf_InteractionManage( playlist_t *p_playlist ) { + vlc_value_t val; int i_index; interaction_t *p_interaction; @@ -134,13 +135,15 @@ void intf_InteractionManage( playlist_t *p_playlist ) // 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 ); @@ -153,10 +156,11 @@ void intf_InteractionManage( playlist_t *p_playlist ) 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; } @@ -321,7 +325,7 @@ static void intf_InteractionSearchInterface( interaction_t *p_interaction ) { 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; diff --git a/src/interface/interface.c b/src/interface/interface.c index a01fd64fe8..36a57eb795 100644 --- a/src/interface/interface.c +++ b/src/interface/interface.c @@ -98,8 +98,8 @@ intf_thread_t* __intf_Create( vlc_object_t *p_this, const char *psz_module ) 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 ); -- 2.39.2