[vlc-devel] [PATCH 3/3] XCB windowless: use Display given rather than creating new xcb connection
Ludovic Fauvet
etix at videolan.org
Tue Jan 1 20:00:21 CET 2013
On Sun, Dec 30, 2012 at 11:47 PM, Cheng Sun <chengsun9 at gmail.com> wrote:
> Fixes compatibility with Chrome
> ---
> npapi/Makefile.am | 2 +-
> npapi/vlcwindowless_xcb.cpp | 43 +++++++++++++++++++++++++------------------
> npapi/vlcwindowless_xcb.h | 3 ++-
> 3 files changed, 28 insertions(+), 20 deletions(-)
>
> diff --git a/npapi/Makefile.am b/npapi/Makefile.am
> index a96df6d..7a97351 100644
> --- a/npapi/Makefile.am
> +++ b/npapi/Makefile.am
> @@ -80,7 +80,7 @@ endif # !USE_GTK
>
> if HAVE_XCB
> AM_CPPFLAGS += $(XCB_CFLAGS)
> -libvlcplugin_la_LIBADD += $(XCB_LIBS)
> +libvlcplugin_la_LIBADD += $(XCB_LIBS) -lX11-xcb
Adding x11-xcb during configure would be better IMHO.
> SOURCES_support += \
> vlcwindowless_xcb.cpp \
> vlcwindowless_xcb.h
> diff --git a/npapi/vlcwindowless_xcb.cpp b/npapi/vlcwindowless_xcb.cpp
> index 6e0d781..7bc95f0 100644
> --- a/npapi/vlcwindowless_xcb.cpp
> +++ b/npapi/vlcwindowless_xcb.cpp
> @@ -23,45 +23,52 @@
>
> #include "vlcwindowless_xcb.h"
>
> +#include <X11/Xlib-xcb.h>
> #include <xcb/xcb.h>
> #include <xcb/xproto.h>
> #include <cstring>
> #include <cstdlib>
>
> VlcWindowlessXCB::VlcWindowlessXCB(NPP instance, NPuint16_t mode) :
> - VlcWindowlessBase(instance, mode), m_conn(0), m_screen(0)
> + VlcWindowlessBase(instance, mode), m_conn(0), m_colormap(0)
> {
> +}
> +
> +VlcWindowlessXCB::~VlcWindowlessXCB()
> +{
> +}
> +
> +bool VlcWindowlessXCB::initXCB()
> +{
> + /*
> if (!(m_conn = xcb_connect(NULL, NULL)))
> {
> fprintf(stderr, "Can't connect to XCB\n");
> return;
> }
> + */
Since your changes are not breaking the current behavior you can
remove this safely.
> - /* Retrieve the setup */
> - const xcb_setup_t *setup;
> - if (!(setup = xcb_get_setup(m_conn)))
> - {
> - fprintf(stderr, "Can't get the XCB setup\n");
> - return;
> + NPSetWindowCallbackStruct *info =
> + static_cast<NPSetWindowCallbackStruct *>(npwindow.ws_info);
> +
> + if (!info) {
> + /* NPP_SetWindow has not been called yet */
> + return false;
> }
>
> - /* Get the first screen */
> - m_screen = xcb_setup_roots_iterator(setup).data;
> -}
> + m_conn = XGetXCBConnection(info->display);
> + m_colormap = info->colormap;
>
> -VlcWindowlessXCB::~VlcWindowlessXCB()
> -{
> - xcb_disconnect(m_conn);
> + return true;
> }
>
> void VlcWindowlessXCB::drawBackground(xcb_drawable_t drawable)
> {
> /* Obtain the background color */
> - xcb_colormap_t colormap = m_screen->default_colormap;
> unsigned r = 0, g = 0, b = 0;
> HTMLColor2RGB(get_options().get_bg_color().c_str(), &r, &g, &b);
> xcb_alloc_color_reply_t *reply = xcb_alloc_color_reply(m_conn,
> - xcb_alloc_color(m_conn, colormap,
> + xcb_alloc_color(m_conn, m_colormap,
> (uint16_t) r << 8,
> (uint16_t) g << 8,
> (uint16_t) b << 8), NULL);
> @@ -95,9 +102,9 @@ bool VlcWindowlessXCB::handle_event(void *event)
> xcb_generic_error_t *err;
> XGraphicsExposeEvent *xgeevent = reinterpret_cast<XGraphicsExposeEvent *>(xevent);
>
> - /* Something went wrong during initialization */
> - if (!m_conn || !m_screen)
> - break;
> + /* Initialize xcb connection if necessary */
> + if (!m_conn)
> + if (!initXCB()) break;
>
> drawBackground(xgeevent->drawable);
>
> diff --git a/npapi/vlcwindowless_xcb.h b/npapi/vlcwindowless_xcb.h
> index 41bb005..d79396b 100644
> --- a/npapi/vlcwindowless_xcb.h
> +++ b/npapi/vlcwindowless_xcb.h
> @@ -38,11 +38,12 @@ public:
> bool handle_event(void *event);
>
> protected:
> + bool initXCB();
> void drawBackground(xcb_drawable_t drawable);
>
> private:
> xcb_connection_t *m_conn;
> - xcb_screen_t *m_screen;
> + xcb_colormap_t m_colormap;
> };
>
>
> --
> 1.8.0.3
--
Ludovic Fauvet
More information about the vlc-devel
mailing list