]> git.sesse.net Git - vlc/commitdiff
XCB outputs: use X11 display specified by the window provider
authorRémi Denis-Courmont <remi@remlab.net>
Mon, 7 Dec 2009 21:59:48 +0000 (23:59 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Tue, 8 Dec 2009 20:04:41 +0000 (22:04 +0200)
modules/video_output/xcb/common.c
modules/video_output/xcb/x11.c
modules/video_output/xcb/xcb_vlc.h
modules/video_output/xcb/xvideo.c

index cf3d05500bc73ace88ba837cb7a4c3588cf61930..e538e65639c74ee682da0c43cabe515d39074148 100644 (file)
@@ -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;
 }
index 5d330eb806a2f0dea0a120c0b8af55c9f7628ddd..bd49e8763a80ea77f3e4778cdda12c4b0736c5b0 100644 (file)
@@ -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);
 }
 
index f90f91225da0fc5e18e2e1da389edd24ab6db73d..96babf7b7e68acd8c9a5a2f203b13a7e24709f84 100644 (file)
@@ -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);
index 0328e1e8be11b8000e1a578059051e6fa78be587..cfd78fa3b762236c293c8c27718f95ba02639f53 100644 (file)
@@ -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);
 }