[wayland] Create xcb_connection through XLib in windowed mode

Adds optional dependency to X11_XCB and gets used in X11WindowedBackend
to create an XLib Display if dependency is present.

This allows to create an EGL backend for the X11WindowedBackend.
This commit is contained in:
Martin Gräßlin 2015-03-19 11:07:49 +01:00
parent 6bf44b7db4
commit 3cc1032839
4 changed files with 37 additions and 2 deletions

View file

@ -191,6 +191,11 @@ if (XCB_VERSION VERSION_LESS "1.10")
endif() endif()
add_feature_info("XCB-SYNC" HAVE_XCB_SYNC "XCB Sync version >= 1.10 required for synced window resizing") add_feature_info("XCB-SYNC" HAVE_XCB_SYNC "XCB Sync version >= 1.10 required for synced window resizing")
find_package(X11_XCB)
set_package_properties(X11_XCB PROPERTIES
PURPOSE "Required for OpenGL support in X11 windowed backend of kwin_wayland"
TYPE OPTIONAL)
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
########### configure tests ############### ########### configure tests ###############
@ -275,6 +280,8 @@ else()
set(HAVE_XCB_CURSOR FALSE) set(HAVE_XCB_CURSOR FALSE)
endif() endif()
set(HAVE_X11_XCB ${X11_XCB_FOUND})
include(CheckIncludeFiles) include(CheckIncludeFiles)
check_include_files(unistd.h HAVE_UNISTD_H) check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(malloc.h HAVE_MALLOC_H) check_include_files(malloc.h HAVE_MALLOC_H)
@ -510,6 +517,10 @@ set(kwin_WAYLAND_EGL_LIBS
Wayland::Egl Wayland::Egl
) )
if(X11_XCB_FOUND)
set(kwin_WAYLAND_LIBS ${kwin_WAYLAND_LIBS} X11::XCB)
endif()
if(KWIN_BUILD_ACTIVITIES) if(KWIN_BUILD_ACTIVITIES)
set(kwin_KDE_LIBS ${kwin_KDE_LIBS} KF5::Activities) set(kwin_KDE_LIBS ${kwin_KDE_LIBS} KF5::Activities)
endif() endif()

View file

@ -15,6 +15,7 @@
#cmakedefine01 HAVE_INPUT #cmakedefine01 HAVE_INPUT
#cmakedefine01 HAVE_XCB_CURSOR #cmakedefine01 HAVE_XCB_CURSOR
#cmakedefine01 HAVE_XCB_SYNC #cmakedefine01 HAVE_XCB_SYNC
#cmakedefine01 HAVE_X11_XCB
/* Define to 1 if you have the <unistd.h> header file. */ /* Define to 1 if you have the <unistd.h> header file. */
#cmakedefine HAVE_UNISTD_H 1 #cmakedefine HAVE_UNISTD_H 1

View file

@ -34,6 +34,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <KWayland/Server/surface_interface.h> #include <KWayland/Server/surface_interface.h>
// system // system
#include <linux/input.h> #include <linux/input.h>
#if HAVE_X11_XCB
#include <X11/Xlib-xcb.h>
#endif
namespace KWin namespace KWin
{ {
@ -52,10 +55,23 @@ X11WindowedBackend::X11WindowedBackend(const QString &display, const QSize &size
, m_size(size) , m_size(size)
{ {
int screen = 0; int screen = 0;
auto c = xcb_connect(display.toUtf8().constData(), &screen); xcb_connection_t *c = nullptr;
if (!xcb_connection_has_error(c)) { #if HAVE_X11_XCB
Display *xDisplay = XOpenDisplay(display.toUtf8().constData());
if (xDisplay) {
c = XGetXCBConnection(xDisplay);
XSetEventQueueOwner(xDisplay, XCBOwnsEventQueue);
screen = XDefaultScreen(xDisplay);
}
#else
c = xcb_connect(display.toUtf8().constData(), &screen);
#endif
if (c && !xcb_connection_has_error(c)) {
m_connection = c; m_connection = c;
m_screenNumber = screen; m_screenNumber = screen;
#if HAVE_X11_XCB
m_display = xDisplay;
#endif
for (xcb_screen_iterator_t it = xcb_setup_roots_iterator(xcb_get_setup(m_connection)); for (xcb_screen_iterator_t it = xcb_setup_roots_iterator(xcb_get_setup(m_connection));
it.rem; it.rem;
--screen, xcb_screen_next(&it)) { --screen, xcb_screen_next(&it)) {

View file

@ -27,6 +27,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <xcb/xcb.h> #include <xcb/xcb.h>
struct _XDisplay;
typedef struct _XDisplay Display;
namespace KWin namespace KWin
{ {
@ -46,6 +49,9 @@ public:
xcb_window_t window() const { xcb_window_t window() const {
return m_window; return m_window;
} }
Display *display() const {
return m_display;
}
bool isValid() const { bool isValid() const {
return m_connection != nullptr && m_window != XCB_WINDOW_NONE; return m_connection != nullptr && m_window != XCB_WINDOW_NONE;
@ -81,6 +87,7 @@ private:
xcb_atom_t m_protocols = XCB_ATOM_NONE; xcb_atom_t m_protocols = XCB_ATOM_NONE;
xcb_atom_t m_deleteWindowProtocol = XCB_ATOM_NONE; xcb_atom_t m_deleteWindowProtocol = XCB_ATOM_NONE;
xcb_cursor_t m_cursor = XCB_CURSOR_NONE; xcb_cursor_t m_cursor = XCB_CURSOR_NONE;
Display *m_display = nullptr;
static X11WindowedBackend *s_self; static X11WindowedBackend *s_self;
}; };