[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