From d8f54d49fb3254183481e62918deedbbfa3dcee7 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Fri, 2 Apr 2004 16:08:29 +0000 Subject: [PATCH] * src/video_output/vout_intf.c: new vout_ControlWindow() function. * modules/gui/wxwindows/video.cpp: implement vout_ControlWindow(). * modules/video_output/directx/events.c, modules/video_output/x11/xcommon.c: + call vout_ControlWindow() when resizing in embedded mode. + implemented a VOUT_REPARENT/CLOSE mode in Control() so the interface can signal that it closes its video window. --- include/video_output.h | 4 +- include/vlc_interface.h | 4 +- modules/gui/wxwindows/video.cpp | 81 +++++++++++++++++++++++---- modules/video_output/directx/events.c | 7 +++ modules/video_output/x11/xcommon.c | 15 ++++- src/interface/interface.c | 1 + src/video_output/vout_intf.c | 24 +++++++- 7 files changed, 121 insertions(+), 15 deletions(-) diff --git a/include/video_output.h b/include/video_output.h index 0f76a160c0..70cd8369f8 100644 --- a/include/video_output.h +++ b/include/video_output.h @@ -218,6 +218,7 @@ picture_t * vout_RenderPicture ( vout_thread_t *, picture_t *, subpicture_t * ); VLC_EXPORT( void *, vout_RequestWindow, ( vout_thread_t *, int *, int *, unsigned int *, unsigned int * ) ); VLC_EXPORT( void, vout_ReleaseWindow, ( vout_thread_t *, void * ) ); +VLC_EXPORT( int, vout_ControlWindow, ( vout_thread_t *, void *, int, va_list ) ); static inline int vout_vaControl( vout_thread_t *p_vout, int i_query, va_list args ) @@ -242,7 +243,8 @@ static inline int vout_Control( vout_thread_t *p_vout, int i_query, ... ) enum output_query_e { VOUT_SET_ZOOM, /* arg1= double * res= */ - VOUT_REPARENT + VOUT_REPARENT, + VOUT_CLOSE }; /** diff --git a/include/vlc_interface.h b/include/vlc_interface.h index 25182af21f..98410c9873 100644 --- a/include/vlc_interface.h +++ b/include/vlc_interface.h @@ -64,9 +64,11 @@ struct intf_thread_t intf_dialog_args_t * ); /** Video window callbacks */ - void * ( *pf_request_window ) ( intf_thread_t *, int *, int *, + void * ( *pf_request_window ) ( intf_thread_t *, vout_thread_t *, + int *, int *, unsigned int *, unsigned int * ); void ( *pf_release_window ) ( intf_thread_t *, void * ); + int ( *pf_control_window ) ( intf_thread_t *, void *, int, va_list ); /* XXX: new message passing stuff will go here */ vlc_mutex_t change_lock; diff --git a/modules/gui/wxwindows/video.cpp b/modules/gui/wxwindows/video.cpp index 0dd25b5e5d..99c255142a 100644 --- a/modules/gui/wxwindows/video.cpp +++ b/modules/gui/wxwindows/video.cpp @@ -31,11 +31,16 @@ #include "wxwindows.h" -static void *GetWindow( intf_thread_t *p_intf, int *pi_x_hint, int *pi_y_hint, +static void *GetWindow( intf_thread_t *p_intf, vout_thread_t *, + int *pi_x_hint, int *pi_y_hint, unsigned int *pi_width_hint, unsigned int *pi_height_hint ); + static void ReleaseWindow( intf_thread_t *p_intf, void *p_window ); +static int ControlWindow( intf_thread_t *p_intf, void *p_window, + int i_query, va_list args ); + /* IDs for the controls and the menu commands */ enum { @@ -50,14 +55,16 @@ public: VideoWindow( intf_thread_t *_p_intf, wxWindow *p_parent ); virtual ~VideoWindow(); - void *GetWindow( int *, int *, unsigned int *, unsigned int * ); + void *GetWindow( vout_thread_t *p_vout, int *, int *, + unsigned int *, unsigned int * ); void ReleaseWindow( void * ); + int ControlWindow( void *, int, va_list ); private: intf_thread_t *p_intf; + vout_thread_t *p_vout; wxWindow *p_parent; vlc_mutex_t lock; - vlc_bool_t b_in_use; wxWindow *p_child_window; @@ -91,10 +98,12 @@ VideoWindow::VideoWindow( intf_thread_t *_p_intf, wxWindow *_p_parent ): p_parent = _p_parent; vlc_mutex_init( p_intf, &lock ); - b_in_use = VLC_FALSE; + + p_vout = NULL; p_intf->pf_request_window = ::GetWindow; p_intf->pf_release_window = ::ReleaseWindow; + p_intf->pf_control_window = ::ControlWindow; p_intf->p_sys->p_video_window = this; p_child_window = new wxWindow( this, -1, wxDefaultPosition, wxSize(0,0) ); @@ -109,17 +118,27 @@ VideoWindow::VideoWindow( intf_thread_t *_p_intf, wxWindow *_p_parent ): VideoWindow::~VideoWindow() { + vlc_mutex_lock( &lock ); + if( p_vout ) + { + if( vout_Control( p_vout, VOUT_REPARENT ) != VLC_SUCCESS ) + vout_Control( p_vout, VOUT_CLOSE ); + } + vlc_mutex_unlock( &lock ); + vlc_mutex_destroy( &lock ); } /***************************************************************************** * Private methods. *****************************************************************************/ -static void *GetWindow( intf_thread_t *p_intf, int *pi_x_hint, int *pi_y_hint, +static void *GetWindow( intf_thread_t *p_intf, vout_thread_t *p_vout, + int *pi_x_hint, int *pi_y_hint, unsigned int *pi_width_hint, unsigned int *pi_height_hint ) { - return p_intf->p_sys->p_video_window->GetWindow( pi_x_hint, pi_y_hint, + return p_intf->p_sys->p_video_window->GetWindow( p_vout, + pi_x_hint, pi_y_hint, pi_width_hint, pi_height_hint ); } @@ -134,23 +153,24 @@ extern "C" { } #endif -void *VideoWindow::GetWindow( int *pi_x_hint, int *pi_y_hint, +void *VideoWindow::GetWindow( vout_thread_t *_p_vout, + int *pi_x_hint, int *pi_y_hint, unsigned int *pi_width_hint, unsigned int *pi_height_hint ) { #if defined(__WXGTK__) || defined(WIN32) vlc_mutex_lock( &lock ); - if( b_in_use ) + if( p_vout ) { msg_Dbg( p_intf, "Video window already in use" ); return NULL; } - b_in_use = VLC_TRUE; + p_vout = _p_vout; wxSizeEvent event( wxSize(*pi_width_hint, *pi_height_hint), - UpdateSize_Event ); + UpdateSize_Event ); AddPendingEvent( event ); vlc_mutex_unlock( &lock ); @@ -185,7 +205,7 @@ void VideoWindow::ReleaseWindow( void *p_window ) { vlc_mutex_lock( &lock ); - b_in_use = VLC_FALSE; + p_vout = NULL; #if defined(__WXGTK__) || defined(WIN32) wxSizeEvent event( wxSize(0, 0), UpdateHide_Event ); @@ -221,3 +241,42 @@ void VideoWindow::UpdateHide( wxSizeEvent &event ) wxCommandEvent intf_event( wxEVT_INTF, 0 ); p_parent->AddPendingEvent( intf_event ); } + +static int ControlWindow( intf_thread_t *p_intf, void *p_window, + int i_query, va_list args ) +{ + return p_intf->p_sys->p_video_window->ControlWindow( p_window, i_query, + args ); +} + +int VideoWindow::ControlWindow( void *p_window, int i_query, va_list args ) +{ + int i_ret = VLC_EGENERIC; + + vlc_mutex_lock( &lock ); + + switch( i_query ) + { + case VOUT_SET_ZOOM: + { + double f_arg = va_arg( args, double ); + + /* Update dimensions */ + wxSizeEvent event( wxSize(p_vout->render.i_width * f_arg, + p_vout->render.i_height * f_arg), + UpdateSize_Event ); + AddPendingEvent( event ); + + i_ret = VLC_SUCCESS; + } + break; + + default: + msg_Dbg( p_intf, "control query not supported" ); + break; + } + + vlc_mutex_unlock( &lock ); + + return i_ret; +} diff --git a/modules/video_output/directx/events.c b/modules/video_output/directx/events.c index 357b86e682..730e158105 100644 --- a/modules/video_output/directx/events.c +++ b/modules/video_output/directx/events.c @@ -927,6 +927,10 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) switch( i_query ) { case VOUT_SET_ZOOM: + if( p_vout->p_sys->p_win->owner_window ) + return vout_ControlWindow( p_vout, + (void *)p_vout->p_sys->hparent, i_query, args ); + f_arg = va_arg( args, double ); /* Update dimensions */ @@ -941,6 +945,9 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) return VLC_SUCCESS; + case VOUT_CLOSE: + return VLC_SUCCESS; + default: msg_Dbg( p_vout, "control query not supported" ); return VLC_EGENERIC; diff --git a/modules/video_output/x11/xcommon.c b/modules/video_output/x11/xcommon.c index 3e50142eb5..e58330c10d 100644 --- a/modules/video_output/x11/xcommon.c +++ b/modules/video_output/x11/xcommon.c @@ -2126,6 +2126,10 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) switch( i_query ) { case VOUT_SET_ZOOM: + if( p_vout->p_sys->p_win->owner_window ) + return vout_ControlWindow( p_vout, + (void *)p_vout->p_sys->p_win->owner_window, i_query, args); + f_arg = va_arg( args, double ); /* Update dimensions */ @@ -2136,7 +2140,16 @@ static int Control( vout_thread_t *p_vout, int i_query, va_list args ) return VLC_SUCCESS; - default: + case VOUT_REPARENT: + XReparentWindow( p_vout->p_sys->p_display, + p_vout->p_sys->p_win->base_window, + DefaultRootWindow( p_vout->p_sys->p_display ), + 0, 0 ); + XSync( p_vout->p_sys->p_display, False ); + p_vout->p_sys->p_win->owner_window = 0; + return VLC_SUCCESS; + + default: msg_Dbg( p_vout, "control query not supported" ); return VLC_EGENERIC; } diff --git a/src/interface/interface.c b/src/interface/interface.c index c47ecd1141..fc95c5d935 100644 --- a/src/interface/interface.c +++ b/src/interface/interface.c @@ -85,6 +85,7 @@ 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; /* Choose the best module */ p_intf->p_module = module_Need( p_intf, "interface", psz_module, 0 ); diff --git a/src/video_output/vout_intf.c b/src/video_output/vout_intf.c index 81251e396b..dd4676aaec 100644 --- a/src/video_output/vout_intf.c +++ b/src/video_output/vout_intf.c @@ -79,7 +79,7 @@ void *vout_RequestWindow( vout_thread_t *p_vout, return NULL; } - p_window = p_intf->pf_request_window( p_intf, pi_x_hint, pi_y_hint, + p_window = p_intf->pf_request_window( p_intf, p_vout, pi_x_hint, pi_y_hint, pi_width_hint, pi_height_hint ); vlc_object_release( p_intf ); @@ -105,6 +105,28 @@ void vout_ReleaseWindow( vout_thread_t *p_vout, void *p_window ) vlc_object_release( p_intf ); } +int vout_ControlWindow( vout_thread_t *p_vout, void *p_window, + int i_query, va_list args ) +{ + intf_thread_t *p_intf; + int i_ret; + + /* Find the main interface */ + p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF, FIND_ANYWHERE ); + if( !p_intf ) return VLC_EGENERIC; + + if( !p_intf->pf_control_window ) + { + msg_Err( p_vout, "no pf_control_window"); + vlc_object_release( p_intf ); + return VLC_EGENERIC; + } + + i_ret = p_intf->pf_control_window( p_intf, p_window, i_query, args ); + vlc_object_release( p_intf ); + return i_ret; +} + /***************************************************************************** * vout_IntfInit: called during the vout creation to initialise misc things. *****************************************************************************/ -- 2.39.2