Rewritten embedded window internal ABI
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Fri, 20 Jun 2008 13:40:27 +0000 (16:40 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Fri, 20 Jun 2008 13:40:38 +0000 (16:40 +0300)
include/vlc_vout.h
include/vlc_window.h [new file with mode: 0644]
modules/control/hotkeys.c
src/video_output/video_output.c
src/video_output/vout_intf.c

index fc8306b..f958055 100644 (file)
@@ -399,8 +399,7 @@ struct vout_thread_t
     unsigned int        i_par_num;           /**< monitor pixel aspect-ratio */
     unsigned int        i_par_den;           /**< monitor pixel aspect-ratio */
 
-    intf_thread_t       *p_parent_intf;   /**< parent interface for embedded
-                                                               vout (if any) */
+    struct vout_window_t *p_window;   /**< window for embedded vout (if any) */
     /**@}*/
 
     /** \name Plugin used and shortcuts to access its capabilities */
diff --git a/include/vlc_window.h b/include/vlc_window.h
new file mode 100644 (file)
index 0000000..8cbb75a
--- /dev/null
@@ -0,0 +1,44 @@
+/*****************************************************************************
+ * vlc_window.h: Embedded video output window
+ *****************************************************************************
+ * Copyright (C) 2008 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef LIBVLCCORE_WINDOW_H
+# define LIBVLCCORE_WINDOW_H 1
+
+# include <stdarg.h>
+
+typedef struct vout_window_t vout_window_t;
+
+struct vout_window_t
+{
+    VLC_COMMON_MEMBERS
+
+    module_t      *module;
+    vout_thread_t *vout;
+    void          *handle; /* OS-specific Window handle */
+
+    unsigned       width;  /* pixels width */
+    unsigned       height; /* pixels height */
+    int            pos_x;  /* horizontal position hint */
+    int            pos_y;  /* vertical position hint */
+
+    int (*control) (struct vout_window_t *, int, va_list);
+};
+
+#endif /* !LIBVLCCORE_WINDOW_H */
index f2d80d4..88b5210 100644 (file)
@@ -982,7 +982,7 @@ static void DisplayPosition( intf_thread_t *p_intf, vout_thread_t *p_vout,
         vout_OSDMessage( p_input, POSITION_TEXT_CHAN, psz_time );
     }
 
-    if( !p_vout->p_parent_intf || p_vout->b_fullscreen )
+    if( !p_vout->p_window || p_vout->b_fullscreen )
     {
         var_Get( p_input, "position", &pos );
         vout_OSDSlider( VLC_OBJECT( p_input ), POSITION_WIDGET_CHAN,
@@ -999,7 +999,7 @@ static void DisplayVolume( intf_thread_t *p_intf, vout_thread_t *p_vout,
     }
     ClearChannels( p_intf, p_vout );
 
-    if( !p_vout->p_parent_intf || p_vout->b_fullscreen )
+    if( !p_vout->p_window || p_vout->b_fullscreen )
     {
         vout_OSDSlider( VLC_OBJECT( p_vout ), VOLUME_WIDGET_CHAN,
             i_vol*100/AOUT_VOLUME_MAX, OSD_VERT_SLIDER );
index d2be65a..d61484f 100644 (file)
@@ -304,8 +304,8 @@ vout_thread_t * __vout_Create( vlc_object_t *p_parent, video_format_t *p_fmt )
     p_vout->render_time  = 10;
     p_vout->c_fps_samples = 0;
     p_vout->b_filter_change = 0;
-    p_vout->pf_control = 0;
-    p_vout->p_parent_intf = 0;
+    p_vout->pf_control = NULL;
+    p_vout->p_window = NULL;
     p_vout->i_par_num = p_vout->i_par_den = 1;
 
     /* Initialize locks */
index b572823..22241cf 100644 (file)
 #include <stdlib.h>                                                /* free() */
 #include <sys/types.h>                                          /* opendir() */
 #include <dirent.h>                                             /* opendir() */
+#include <assert.h>
 
 #include <vlc_interface.h>
 #include <vlc_block.h>
 #include <vlc_playlist.h>
 
 #include <vlc_vout.h>
+#include <vlc_window.h>
 #include <vlc_image.h>
 #include <vlc_osd.h>
 #include <vlc_charset.h>
@@ -100,18 +102,59 @@ void *vout_RequestWindow( vout_thread_t *p_vout,
     int drawable = var_CreateGetInteger( p_vout, "drawable" );
     if( drawable ) return (void *)(intptr_t)drawable;
 
-   return NULL;
+    vout_window_t *wnd = vlc_custom_create (VLC_OBJECT(p_vout), sizeof (*wnd),
+                                            VLC_OBJECT_GENERIC, "window");
+    if (wnd == NULL)
+        return NULL;
+
+    wnd->vout = p_vout;
+    wnd->width = *pi_width_hint;
+    wnd->height = *pi_height_hint;
+    wnd->pos_x = *pi_x_hint;
+    wnd->pos_y = *pi_y_hint;
+    vlc_object_attach (wnd, p_vout);
+
+    wnd->module = module_Need (wnd, "vout window", 0, 0);
+    if (wnd->module == NULL)
+    {
+        msg_Dbg (wnd, "no window provider available");
+        vlc_object_release (wnd);
+        return NULL;
+    }
+    p_vout->p_window = wnd;
+    *pi_width_hint = wnd->width;
+    *pi_height_hint = wnd->height;
+    *pi_x_hint = wnd->pos_x;
+    *pi_y_hint = wnd->pos_y;
+    return wnd->handle;
 }
 
-void vout_ReleaseWindow( vout_thread_t *p_vout, void *p_window )
+void vout_ReleaseWindow( vout_thread_t *p_vout, void *dummy )
 {
-    (void)p_vout; (void)p_window;
+    vout_window_t *wnd = p_vout->p_window;
+
+    if (wnd == NULL)
+        return;
+    p_vout->p_window = NULL;
+
+    assert (wnd->module);
+    module_Unneed (wnd, wnd->module);
+
+    vlc_object_detach (wnd);
+    vlc_object_release (wnd);
+    (void)dummy;
 }
 
-int vout_ControlWindow( vout_thread_t *p_vout, void *p_window,
+int vout_ControlWindow( vout_thread_t *p_vout, void *dummy,
                         int i_query, va_list args )
 {
-    (void)p_vout; (void)p_window; (void)i_query; (void)args;
+    vout_window_t *wnd = p_vout->p_window;
+
+    if (wnd == NULL)
+        return VLC_EGENERIC;
+
+    assert (wnd->control);
+    return wnd->control (wnd, i_query, args);
 }
 
 /*****************************************************************************
@@ -782,23 +825,18 @@ int vout_vaControlDefault( vout_thread_t *p_vout, int i_query, va_list args )
     {
     case VOUT_REPARENT:
     case VOUT_CLOSE:
-        if( p_vout->p_parent_intf )
-        {
-            vlc_object_release( p_vout->p_parent_intf );
-            p_vout->p_parent_intf = NULL;
-        }
+        if( p_vout->p_window )
+            vout_ReleaseWindow( p_vout->p_window, NULL );
         return VLC_SUCCESS;
-        break;
 
     case VOUT_SNAPSHOT:
         p_vout->b_snapshot = true;
         return VLC_SUCCESS;
-        break;
 
     default:
         msg_Dbg( p_vout, "control query not supported" );
-        return VLC_EGENERIC;
     }
+    return VLC_EGENERIC;
 }
 
 /*****************************************************************************