summaryrefslogtreecommitdiff
path: root/src/plugins/platforms/wayland_common/qwaylanddisplay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/wayland_common/qwaylanddisplay.cpp')
-rw-r--r--src/plugins/platforms/wayland_common/qwaylanddisplay.cpp114
1 files changed, 21 insertions, 93 deletions
diff --git a/src/plugins/platforms/wayland_common/qwaylanddisplay.cpp b/src/plugins/platforms/wayland_common/qwaylanddisplay.cpp
index 0e4fb588..bb056c96 100644
--- a/src/plugins/platforms/wayland_common/qwaylanddisplay.cpp
+++ b/src/plugins/platforms/wayland_common/qwaylanddisplay.cpp
@@ -48,7 +48,6 @@
#include "qwaylandinputdevice.h"
#include "qwaylandclipboard.h"
#include "qwaylanddatadevicemanager.h"
-#include "qwaylandshell.h"
#ifdef QT_WAYLAND_GL_SUPPORT
#include "qwaylandglintegration.h"
@@ -73,7 +72,7 @@ QT_USE_NAMESPACE
struct wl_surface *QWaylandDisplay::createSurface(void *handle)
{
- struct wl_surface * surface = wl_compositor_create_surface(mCompositor);
+ struct wl_surface *surface = mCompositor.create_surface();
wl_surface_set_user_data(surface, handle);
return surface;
}
@@ -104,11 +103,7 @@ void QWaylandDisplay::setLastKeyboardFocusInputDevice(QWaylandInputDevice *devic
static QWaylandDisplay *display = 0;
-const struct wl_registry_listener QWaylandDisplay::registryListener = {
- QWaylandDisplay::displayHandleGlobal
-};
-
-QWaylandDisplay::QWaylandDisplay(void)
+QWaylandDisplay::QWaylandDisplay()
: mLastKeyboardFocusInputDevice(0)
, mDndSelectionHandler(0)
, mWindowExtension(0)
@@ -131,9 +126,10 @@ QWaylandDisplay::QWaylandDisplay(void)
//Create a new even queue for the QtGui thread
mEventQueue = wl_display_create_queue(mDisplay);
- mRegistry = wl_display_get_registry(mDisplay);
- wl_proxy_set_queue((struct wl_proxy *)mRegistry, mEventQueue);
- wl_registry_add_listener(mRegistry, &registryListener, this);
+ struct ::wl_registry *registry = wl_display_get_registry(mDisplay);
+ wl_proxy_set_queue((struct wl_proxy *)registry, mEventQueue);
+
+ init(registry);
QAbstractEventDispatcher *dispatcher = QGuiApplicationPrivate::eventDispatcher;
connect(dispatcher, SIGNAL(aboutToBlock()), this, SLOT(flushRequests()));
@@ -144,7 +140,7 @@ QWaylandDisplay::QWaylandDisplay(void)
#endif
#ifdef QT_WAYLAND_WINDOWMANAGER_SUPPORT
- mWindowManagerIntegration = QWaylandWindowManagerIntegration::createIntegration(this);
+ mWindowManagerIntegration = new QWaylandWindowManagerIntegration(this);
#endif
blockingReadEvents();
@@ -170,27 +166,10 @@ QWaylandDisplay::~QWaylandDisplay(void)
delete mEventThreadObject;
}
-void QWaylandDisplay::createNewScreen(struct wl_output *output)
-{
- QWaylandScreen *waylandScreen = new QWaylandScreen(this,output);
- mScreens.append(waylandScreen);
-}
-
-void QWaylandDisplay::scheduleRedraw(QWaylandWindow *window)
-{
- if (!mWindows.contains(window))
- mWindows << window;
-}
-
void QWaylandDisplay::flushRequests()
{
wl_display_dispatch_queue_pending(mDisplay, mEventQueue);
wl_display_flush(mDisplay);
-
- foreach (QWaylandWindow *w, mWindows) {
- w->redraw();
- }
- mWindows.clear();
}
void QWaylandDisplay::blockingReadEvents()
@@ -208,51 +187,12 @@ QWaylandScreen *QWaylandDisplay::screenForOutput(struct wl_output *output) const
return 0;
}
-void QWaylandDisplay::outputHandleGeometry(void *data,
- struct wl_output *output,
- int32_t x, int32_t y,
- int32_t physicalWidth,
- int32_t physicalHeight,
- int subpixel,
- const char *make, const char *model,
- int32_t transform)
-{
- Q_UNUSED(subpixel);
- Q_UNUSED(make);
- Q_UNUSED(model);
- Q_UNUSED(transform);
- QWaylandDisplay *waylandDisplay = static_cast<QWaylandDisplay *>(data);
- QRect outputRect = QRect(x, y, physicalWidth, physicalHeight);
- waylandDisplay->screenForOutput(output)->setGeometry(outputRect);
-}
-
-void QWaylandDisplay::mode(void *data,
- struct wl_output *output,
- uint32_t flags,
- int width,
- int height,
- int refresh)
-{
- QWaylandDisplay *waylandDisplay = static_cast<QWaylandDisplay *>(data);
-
- if (flags & WL_OUTPUT_MODE_CURRENT) {
- QWaylandScreen *screen = waylandDisplay->screenForOutput(output);
- if (screen)
- screen->handleMode(QSize(width, height), refresh);
- }
-}
-
void QWaylandDisplay::addRegistryListener(RegistryListener listener, void *data)
{
Listener l = { listener, data };
mRegistryListeners.append(l);
}
-const struct wl_output_listener QWaylandDisplay::outputListener = {
- QWaylandDisplay::outputHandleGeometry,
- QWaylandDisplay::mode
-};
-
void QWaylandDisplay::waitForScreens()
{
flushRequests();
@@ -260,53 +200,41 @@ void QWaylandDisplay::waitForScreens()
blockingReadEvents();
}
-void QWaylandDisplay::displayHandleGlobal(void *data,
- struct wl_registry *registry,
- uint32_t id,
- const char *interface,
- uint32_t version)
-{
- Q_UNUSED(registry);
- QWaylandDisplay *that = static_cast<QWaylandDisplay *>(data);
- that->displayHandleGlobal(id, QByteArray(interface), version);
-}
-
-void QWaylandDisplay::displayHandleGlobal(uint32_t id,
- const QByteArray &interface,
- uint32_t version)
+void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uint32_t version)
{
Q_UNUSED(version);
+ struct ::wl_registry *registry = object();
+
if (interface == "wl_output") {
- struct wl_output *output = static_cast<struct wl_output *>(wl_registry_bind(mRegistry,id,&wl_output_interface,1));
- createNewScreen(output);
- wl_output_add_listener(output, &outputListener, this);
+ mScreens.append(new QWaylandScreen(this, id));
} else if (interface == "wl_compositor") {
- mCompositor = static_cast<struct wl_compositor *>(wl_registry_bind(mRegistry, id,&wl_compositor_interface,1));
+ mCompositor.init(registry, id);
} else if (interface == "wl_shm") {
- mShm = static_cast<struct wl_shm *>(wl_registry_bind(mRegistry, id, &wl_shm_interface,1));
+ mShm = static_cast<struct wl_shm *>(wl_registry_bind(registry, id, &wl_shm_interface,1));
} else if (interface == "wl_shell"){
- mShell = new QWaylandShell(this,id,version);
+ mShell = new QtWayland::wl_shell(registry, id);
} else if (interface == "wl_seat") {
QWaylandInputDevice *inputDevice = new QWaylandInputDevice(this, id);
mInputDevices.append(inputDevice);
} else if (interface == "wl_data_device_manager") {
mDndSelectionHandler = new QWaylandDataDeviceManager(this, id);
} else if (interface == "wl_output_extension") {
- mOutputExtension = new QWaylandOutputExtension(this,id);
+ mOutputExtension = new QtWayland::qt_output_extension(registry, id);
+ foreach (QPlatformScreen *screen, screens())
+ static_cast<QWaylandScreen *>(screen)->createExtendedOutput();
} else if (interface == "wl_surface_extension") {
- mWindowExtension = new QWaylandSurfaceExtension(this,id);
+ mWindowExtension = new QtWayland::qt_surface_extension(registry, id);
} else if (interface == "wl_sub_surface_extension") {
- mSubSurfaceExtension = new QWaylandSubSurfaceExtension(this,id);
+ mSubSurfaceExtension = new QtWayland::qt_sub_surface_extension(registry, id);
} else if (interface == "wl_touch_extension") {
mTouchExtension = new QWaylandTouchExtension(this, id);
} else if (interface == "wl_qtkey_extension") {
mQtKeyExtension = new QWaylandQtKeyExtension(this, id);
}
- foreach (Listener l, mRegistryListeners) {
- (*l.listener)(l.data, mRegistry, id, interface, version);
- }
+ foreach (Listener l, mRegistryListeners)
+ (*l.listener)(l.data, registry, id, interface, version);
}
uint32_t QWaylandDisplay::currentTimeMillisec()