/**
* 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;
}
/**
- * 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)
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;
free (r);
}
+ *pconn = conn;
*pscreen = screen;
*pshm = shm;
return wnd;
error:
+ xcb_disconnect (conn);
vout_display_DeleteWindow (vd, wnd);
return NULL;
}
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;
}
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);
}
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);
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 */
}
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);
}