[vlc-devel] [PATCH] XCB windowless: use Display given rather than creating new xcb connection

Cheng Sun chengsun9 at gmail.com
Fri Jan 4 22:08:58 CET 2013


Fixes compatibility with Chrome
---
 configure.ac                | 13 +++----------
 npapi/Makefile.am           | 24 ++++++++----------------
 npapi/vlcplugin.h           |  7 +++----
 npapi/vlcwindowless_xcb.cpp | 45 ++++++++++++++++++++++-----------------------
 npapi/vlcwindowless_xcb.h   |  3 ++-
 5 files changed, 38 insertions(+), 54 deletions(-)

diff --git a/configure.ac b/configure.ac
index 513d2d1..365bd5d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -248,24 +248,17 @@ dnl GTK+ for linux toolbar
 AC_ARG_WITH([gtk], AS_HELP_STRING([--with-gtk], [Build the GTK+ toolbars in NPAPI plugin [default=auto]]),, [with_gtk=yes])
 gtk_found=no
 AS_IF([ test "${SYS}" != "mingw32" -a "${SYS}" != "darwin" ], [
-  PKG_CHECK_MODULES(XCB, [xcb],[xcb_found=yes])
+  PKG_CHECK_MODULES(XCB, [xcb x11-xcb],[], [
+     AC_MSG_ERROR([Please install the libxcb and x11-xcb development files])
+  ])
   AS_IF([ test "x$with_gtk" != "xno" ],
     [
        PKG_CHECK_MODULES(GTK, [gtk+-2.0], [gtk_found=yes])
     ])
-  AS_IF([ test "x$gtk_found" == "xno" ],
-    [
-      AS_IF([ test "x$xcb_found" == "xno"], [
-        AC_MSG_ERROR([Please install the libxcb development files, or re-run configure with --with-gtk])
-      ])
-    ])
 ])
 AS_IF([ test "x$gtk_found" = "xyes" ],
     AC_DEFINE([USE_GTK], [1], [Define to 1 if using GTK+]))
-AS_IF([ test "x$xcb_found" = "xyes" ],
-    AC_DEFINE([USE_XCB], [1], [Define to 1 if using XCB]))
 AM_CONDITIONAL(WITH_GTK, [ test "x$gtk_found" = "xyes" ])
-AM_CONDITIONAL(HAVE_XCB, [ test "x$xcb_found" = "xyes" ])
 
 dnl
 dnl final flags for ActiveX
diff --git a/npapi/Makefile.am b/npapi/Makefile.am
index c419fbc..5b16024 100644
--- a/npapi/Makefile.am
+++ b/npapi/Makefile.am
@@ -58,36 +58,28 @@ if FETCH_NPAPI
 $(libvlcplugin_la_OBJECTS): npapi-sdk
 endif
 
-AM_CPPFLAGS += -DXP_UNIX -DDATA_PATH=\"$(pkgdatadir)\"
-libvlcplugin_la_LIBADD += $(MOZILLA_LIBS)
+AM_CPPFLAGS += -DXP_UNIX -DDATA_PATH=\"$(pkgdatadir)\" $(XCB_CFLAGS)
+libvlcplugin_la_LIBADD += $(MOZILLA_LIBS) $(XCB_LIBS)
 
 SOURCES_support = \
-	support/npunix.cpp
+	support/npunix.cpp \
+	vlcwindowless_xcb.cpp \
+	vlcwindowless_xcb.h \
+	vlcwindowless_base.cpp \
+	vlcwindowless_base.h
 
 if WITH_GTK
 AM_CPPFLAGS += $(GTK_CFLAGS)
-libvlcplugin_la_LIBADD += $(GTK_LIBS) $(X_LIBS) $(X_PRE_LIBS) -lX11
+libvlcplugin_la_LIBADD += $(GTK_LIBS)
 SOURCES_support += \
 	vlcplugin_gtk.cpp \
 	vlcplugin_gtk.h
 else # !WITH_GTK
-AM_CPPFLAGS += $(XCB_CFLAGS)
-libvlcplugin_la_LIBADD += $(XCB_LIBS)
 SOURCES_support += \
 	vlcplugin_xcb.cpp \
 	vlcplugin_xcb.h
 endif # !USE_GTK
 
-if HAVE_XCB
-AM_CPPFLAGS += $(XCB_CFLAGS)
-libvlcplugin_la_LIBADD += $(XCB_LIBS)
-SOURCES_support += \
-	vlcwindowless_xcb.cpp \
-	vlcwindowless_xcb.h \
-	vlcwindowless_base.cpp \
-	vlcwindowless_base.h
-endif # !HAVE_XCB
-
 else # Win32
 
 # Under Win32|Mac, Mozilla plugins need to be named NP******.DLL, but under Unix
diff --git a/npapi/vlcplugin.h b/npapi/vlcplugin.h
index 82c4180..9f993ce 100644
--- a/npapi/vlcplugin.h
+++ b/npapi/vlcplugin.h
@@ -36,10 +36,6 @@
 #include "common.h"
 
 #if defined(XP_UNIX) && !defined(XP_MACOSX)
-#   if defined(USE_XCB)
-#       include "vlcwindowless_xcb.h"
-        typedef VlcWindowlessXCB VlcWindowless;
-#   endif
 #   if defined(USE_GTK)
 #       include "vlcplugin_gtk.h"
         typedef class VlcPluginGtk VlcPlugin;
@@ -47,6 +43,9 @@
 #       include "vlcplugin_xcb.h"
         typedef class VlcPluginXcb VlcPlugin;
 #   endif
+
+#   include "vlcwindowless_xcb.h"
+    typedef VlcWindowlessXCB VlcWindowless;
 #elif defined(XP_WIN)
 #   include "vlcplugin_win.h"
     typedef class VlcPluginWin VlcPlugin;
diff --git a/npapi/vlcwindowless_xcb.cpp b/npapi/vlcwindowless_xcb.cpp
index 6e0d781..6ce2b0d 100644
--- a/npapi/vlcwindowless_xcb.cpp
+++ b/npapi/vlcwindowless_xcb.cpp
@@ -23,45 +23,44 @@
 
 #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)
 {
-    if (!(m_conn = xcb_connect(NULL, NULL)))
-    {
-        fprintf(stderr, "Can't connect to XCB\n");
-        return;
-    }
-
-    /* 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;
-    }
-
-    /* Get the first screen */
-    m_screen = xcb_setup_roots_iterator(setup).data;
 }
 
 VlcWindowlessXCB::~VlcWindowlessXCB()
 {
-    xcb_disconnect(m_conn);
+}
+
+bool VlcWindowlessXCB::initXCB()
+{
+    NPSetWindowCallbackStruct *info =
+            static_cast<NPSetWindowCallbackStruct *>(npwindow.ws_info);
+
+    if (!info) {
+        /* NPP_SetWindow has not been called yet */
+        return false;
+    }
+
+    m_conn = XGetXCBConnection(info->display);
+    m_colormap = info->colormap;
+
+    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 +94,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 4c84d35..19ee8f7 100644
--- a/npapi/vlcwindowless_xcb.h
+++ b/npapi/vlcwindowless_xcb.h
@@ -37,11 +37,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




More information about the vlc-devel mailing list