Commit 249986fc authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

XCB outputs: use X11 display specified by the window provider

parent 93870103
...@@ -59,15 +59,13 @@ int CheckError (vout_display_t *vd, xcb_connection_t *conn, ...@@ -59,15 +59,13 @@ int CheckError (vout_display_t *vd, xcb_connection_t *conn,
/** /**
* Connect to the X server. * 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); xcb_connection_t *conn = xcb_connect (display, NULL);
free (display);
if (xcb_connection_has_error (conn) /*== NULL*/) 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); xcb_disconnect (conn);
return NULL; return NULL;
} }
...@@ -87,11 +85,12 @@ xcb_connection_t *Connect (vlc_object_t *obj) ...@@ -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. * and probe the MIT-SHM extension.
*/ */
vout_window_t *GetWindow (vout_display_t *vd, vout_window_t *GetWindow (vout_display_t *vd,
xcb_connection_t *conn, xcb_connection_t **restrict pconn,
const xcb_screen_t **restrict pscreen, const xcb_screen_t **restrict pscreen,
uint8_t *restrict pdepth, uint8_t *restrict pdepth,
bool *restrict pshm) bool *restrict pshm)
...@@ -111,6 +110,13 @@ vout_window_t *GetWindow (vout_display_t *vd, ...@@ -111,6 +110,13 @@ vout_window_t *GetWindow (vout_display_t *vd,
msg_Err (vd, "parent window not available"); msg_Err (vd, "parent window not available");
return NULL; return NULL;
} }
xcb_connection_t *conn = Connect (VLC_OBJECT(vd), wnd->x11_display);
if (conn == NULL)
{
vout_display_DeleteWindow (vd, wnd);
return NULL;
}
else else
{ {
xcb_get_geometry_reply_t *geo; xcb_get_geometry_reply_t *geo;
...@@ -178,11 +184,13 @@ vout_window_t *GetWindow (vout_display_t *vd, ...@@ -178,11 +184,13 @@ vout_window_t *GetWindow (vout_display_t *vd,
free (r); free (r);
} }
*pconn = conn;
*pscreen = screen; *pscreen = screen;
*pshm = shm; *pshm = shm;
return wnd; return wnd;
error: error:
xcb_disconnect (conn);
vout_display_DeleteWindow (vd, wnd); vout_display_DeleteWindow (vd, wnd);
return NULL; return NULL;
} }
......
...@@ -110,21 +110,12 @@ static int Open (vlc_object_t *obj) ...@@ -110,21 +110,12 @@ static int Open (vlc_object_t *obj)
vd->sys = p_sys; vd->sys = p_sys;
p_sys->pool = NULL; p_sys->pool = NULL;
/* Connect to X */ /* Get window, connect to X server */
p_sys->conn = Connect (obj);
if (p_sys->conn == NULL)
{
free (p_sys);
return VLC_EGENERIC;
}
/* Get window */
const xcb_screen_t *scr; 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); &p_sys->shm);
if (p_sys->embed == NULL) if (p_sys->embed == NULL)
{ {
xcb_disconnect (p_sys->conn);
free (p_sys); free (p_sys);
return VLC_EGENERIC; return VLC_EGENERIC;
} }
...@@ -323,9 +314,9 @@ static void Close (vlc_object_t *obj) ...@@ -323,9 +314,9 @@ static void Close (vlc_object_t *obj)
vout_display_sys_t *p_sys = vd->sys; vout_display_sys_t *p_sys = vd->sys;
ResetPictures (vd); ResetPictures (vd);
vout_display_DeleteWindow (vd, p_sys->embed);
/* colormap, window and context are garbage-collected by X */ /* colormap, window and context are garbage-collected by X */
xcb_disconnect (p_sys->conn); xcb_disconnect (p_sys->conn);
vout_display_DeleteWindow (vd, p_sys->embed);
free (p_sys); free (p_sys);
} }
......
...@@ -38,9 +38,8 @@ void DestroyKeyHandler (key_handler_t *); ...@@ -38,9 +38,8 @@ void DestroyKeyHandler (key_handler_t *);
int ProcessKeyEvent (key_handler_t *, xcb_generic_event_t *); int ProcessKeyEvent (key_handler_t *, xcb_generic_event_t *);
/* common.c */ /* common.c */
xcb_connection_t *Connect (vlc_object_t *obj);
struct vout_window_t *GetWindow (vout_display_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, const xcb_screen_t **restrict pscreen,
uint8_t *restrict pdepth, uint8_t *restrict pdepth,
bool *restrict pshm); bool *restrict pshm);
......
...@@ -306,35 +306,26 @@ static int Open (vlc_object_t *obj) ...@@ -306,35 +306,26 @@ static int Open (vlc_object_t *obj)
vd->sys = p_sys; vd->sys = p_sys;
/* Connect to X */ /* Connect to X */
xcb_connection_t *conn = Connect (obj); xcb_connection_t *conn;
if (conn == NULL) 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); free (p_sys);
return VLC_EGENERIC; return VLC_EGENERIC;
} }
p_sys->conn = conn; p_sys->conn = conn;
p_sys->att = NULL;
p_sys->pool = NULL;
if (!CheckXVideo (vd, conn)) if (!CheckXVideo (vd, conn))
{ {
msg_Warn (vd, "Please enable XVideo 2.2 for faster video display"); msg_Warn (vd, "Please enable XVideo 2.2 for faster video display");
xcb_disconnect (conn); goto error;
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;
} }
/* */
p_sys->att = NULL;
p_sys->pool = NULL;
p_sys->window = xcb_generate_id (conn); p_sys->window = xcb_generate_id (conn);
/* Cache adaptors infos */ /* Cache adaptors infos */
...@@ -571,8 +562,8 @@ static void Close (vlc_object_t *obj) ...@@ -571,8 +562,8 @@ static void Close (vlc_object_t *obj)
} }
free (p_sys->att); free (p_sys->att);
vout_display_DeleteWindow (vd, p_sys->embed);
xcb_disconnect (p_sys->conn); xcb_disconnect (p_sys->conn);
vout_display_DeleteWindow (vd, p_sys->embed);
free (p_sys); free (p_sys);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment