[vlc-devel] commit: XCB outputs: use X11 display specified by the window provider ( Rémi Denis-Courmont )

git version control git at videolan.org
Tue Dec 8 21:24:21 CET 2009


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Dec  7 23:59:48 2009 +0200| [249986fcbdf647d562a609053236add2ec6abe68] | committer: Rémi Denis-Courmont 

XCB outputs: use X11 display specified by the window provider

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=249986fcbdf647d562a609053236add2ec6abe68
---

 modules/video_output/xcb/common.c  |   22 +++++++++++++++-------
 modules/video_output/xcb/x11.c     |   15 +++------------
 modules/video_output/xcb/xcb_vlc.h |    3 +--
 modules/video_output/xcb/xvideo.c  |   29 ++++++++++-------------------
 4 files changed, 29 insertions(+), 40 deletions(-)

diff --git a/modules/video_output/xcb/common.c b/modules/video_output/xcb/common.c
index cf3d055..e538e65 100644
--- a/modules/video_output/xcb/common.c
+++ b/modules/video_output/xcb/common.c
@@ -59,15 +59,13 @@ int CheckError (vout_display_t *vd, xcb_connection_t *conn,
 /**
  * Connect to the X server.
  */
-xcb_connection_t *Connect (vlc_object_t *obj)
+static xcb_connection_t *Connect (vlc_object_t *obj, const char *display)
 {
-    char *display = var_CreateGetNonEmptyString (obj, "x11-display");
     xcb_connection_t *conn = xcb_connect (display, NULL);
-
-    free (display);
     if (xcb_connection_has_error (conn) /*== NULL*/)
     {
-        msg_Err (obj, "cannot connect to X server");
+        msg_Err (obj, "cannot connect to X server (%s)",
+                 display ? display : "default");
         xcb_disconnect (conn);
         return NULL;
     }
@@ -87,11 +85,12 @@ xcb_connection_t *Connect (vlc_object_t *obj)
 
 
 /**
- * Create a VLC video X window object, find the corresponding X server screen,
+ * Create a VLC video X window object, connect to the corresponding X server,
+ * find the corresponding X server screen,
  * and probe the MIT-SHM extension.
  */
 vout_window_t *GetWindow (vout_display_t *vd,
-                          xcb_connection_t *conn,
+                          xcb_connection_t **restrict pconn,
                           const xcb_screen_t **restrict pscreen,
                           uint8_t *restrict pdepth,
                           bool *restrict pshm)
@@ -111,6 +110,13 @@ vout_window_t *GetWindow (vout_display_t *vd,
         msg_Err (vd, "parent window not available");
         return NULL;
     }
+
+    xcb_connection_t *conn = Connect (VLC_OBJECT(vd), wnd->x11_display);
+    if (conn == NULL)
+    {
+        vout_display_DeleteWindow (vd, wnd);
+        return NULL;
+    }
     else
     {
         xcb_get_geometry_reply_t *geo;
@@ -178,11 +184,13 @@ vout_window_t *GetWindow (vout_display_t *vd,
         free (r);
     }
 
+    *pconn = conn;
     *pscreen = screen;
     *pshm = shm;
     return wnd;
 
 error:
+    xcb_disconnect (conn);
     vout_display_DeleteWindow (vd, wnd);
     return NULL;
 }
diff --git a/modules/video_output/xcb/x11.c b/modules/video_output/xcb/x11.c
index 5d330eb..bd49e87 100644
--- a/modules/video_output/xcb/x11.c
+++ b/modules/video_output/xcb/x11.c
@@ -110,21 +110,12 @@ static int Open (vlc_object_t *obj)
     vd->sys = p_sys;
     p_sys->pool = NULL;
 
-    /* Connect to X */
-    p_sys->conn = Connect (obj);
-    if (p_sys->conn == NULL)
-    {
-        free (p_sys);
-        return VLC_EGENERIC;
-    }
-
-    /* Get window */
+    /* Get window, connect to X server */
     const xcb_screen_t *scr;
-    p_sys->embed = GetWindow (vd, p_sys->conn, &scr, &p_sys->depth,
+    p_sys->embed = GetWindow (vd, &p_sys->conn, &scr, &p_sys->depth,
                               &p_sys->shm);
     if (p_sys->embed == NULL)
     {
-        xcb_disconnect (p_sys->conn);
         free (p_sys);
         return VLC_EGENERIC;
     }
@@ -323,9 +314,9 @@ static void Close (vlc_object_t *obj)
     vout_display_sys_t *p_sys = vd->sys;
 
     ResetPictures (vd);
-    vout_display_DeleteWindow (vd, p_sys->embed);
     /* colormap, window and context are garbage-collected by X */
     xcb_disconnect (p_sys->conn);
+    vout_display_DeleteWindow (vd, p_sys->embed);
     free (p_sys);
 }
 
diff --git a/modules/video_output/xcb/xcb_vlc.h b/modules/video_output/xcb/xcb_vlc.h
index f90f912..96babf7 100644
--- a/modules/video_output/xcb/xcb_vlc.h
+++ b/modules/video_output/xcb/xcb_vlc.h
@@ -38,9 +38,8 @@ void DestroyKeyHandler (key_handler_t *);
 int ProcessKeyEvent (key_handler_t *, xcb_generic_event_t *);
 
 /* common.c */
-xcb_connection_t *Connect (vlc_object_t *obj);
 struct vout_window_t *GetWindow (vout_display_t *obj,
-                                 xcb_connection_t *pconn,
+                                 xcb_connection_t **restrict pconn,
                                  const xcb_screen_t **restrict pscreen,
                                  uint8_t *restrict pdepth,
                                  bool *restrict pshm);
diff --git a/modules/video_output/xcb/xvideo.c b/modules/video_output/xcb/xvideo.c
index 0328e1e..cfd78fa 100644
--- a/modules/video_output/xcb/xvideo.c
+++ b/modules/video_output/xcb/xvideo.c
@@ -306,35 +306,26 @@ static int Open (vlc_object_t *obj)
     vd->sys = p_sys;
 
     /* Connect to X */
-    xcb_connection_t *conn = Connect (obj);
-    if (conn == NULL)
+    xcb_connection_t *conn;
+    const xcb_screen_t *screen;
+    uint8_t depth;
+    p_sys->embed = GetWindow (vd, &conn, &screen, &depth, &p_sys->shm);
+    if (p_sys->embed == NULL)
     {
         free (p_sys);
         return VLC_EGENERIC;
     }
+
     p_sys->conn = conn;
+    p_sys->att = NULL;
+    p_sys->pool = NULL;
 
     if (!CheckXVideo (vd, conn))
     {
         msg_Warn (vd, "Please enable XVideo 2.2 for faster video display");
-        xcb_disconnect (conn);
-        free (p_sys);
-        return VLC_EGENERIC;
-    }
-
-    const xcb_screen_t *screen;
-    uint8_t depth;
-    p_sys->embed = GetWindow (vd, conn, &screen, &depth, &p_sys->shm);
-    if (p_sys->embed == NULL)
-    {
-        xcb_disconnect (conn);
-        free (p_sys);
-        return VLC_EGENERIC;
+        goto error;
     }
 
-    /* */
-    p_sys->att = NULL;
-    p_sys->pool = NULL;
     p_sys->window = xcb_generate_id (conn);
 
     /* Cache adaptors infos */
@@ -571,8 +562,8 @@ static void Close (vlc_object_t *obj)
     }
 
     free (p_sys->att);
-    vout_display_DeleteWindow (vd, p_sys->embed);
     xcb_disconnect (p_sys->conn);
+    vout_display_DeleteWindow (vd, p_sys->embed);
     free (p_sys);
 }
 




More information about the vlc-devel mailing list