]> git.sesse.net Git - vlc/commitdiff
* src/video_output/vout_intf.c: new vout_ControlWindow() function.
authorGildas Bazin <gbazin@videolan.org>
Fri, 2 Apr 2004 16:08:29 +0000 (16:08 +0000)
committerGildas Bazin <gbazin@videolan.org>
Fri, 2 Apr 2004 16:08:29 +0000 (16:08 +0000)
* 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
include/vlc_interface.h
modules/gui/wxwindows/video.cpp
modules/video_output/directx/events.c
modules/video_output/x11/xcommon.c
src/interface/interface.c
src/video_output/vout_intf.c

index 0f76a160c09953706a443e8405f1eb9bfe9e0251..70cd8369f85bcee25bc5febdcffd932269bc5e55 100644 (file)
@@ -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
 };
 
 /**
index 25182af21f5e1fe307faa86a290e1a7ccb84852a..98410c987356ffb1c74671fddc4b4e0c91c11c3b 100644 (file)
@@ -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;
index 0dd25b5e5d0c57b60e2724ec47922f72a4156994..99c255142a65a74de8d09353b839ee7d962a99bf 100644 (file)
 
 #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;
+}
index 357b86e682f9bca53403fcbf7e8c350de5286150..730e158105616f7a395a9b417899b56a4006b417 100644 (file)
@@ -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;
index 3e50142eb5ed1a725aed04d42410afadd9c451cb..e58330c10dbc63688f4d3502f1dd66ab2e628428 100644 (file)
@@ -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;
     }
index c47ecd114140518552e3a2e5adaa836d72efed09..fc95c5d935fb352bbb492307a01a0ba4218c1630 100644 (file)
@@ -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 );
index 81251e396b254074f78769f157bc9819e13d1aeb..dd4676aaeccd9563a8325117e932f5fd4c599cec 100644 (file)
@@ -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.
  *****************************************************************************/