diff --git a/src/plugins/platforms/wayland/client.pro b/src/plugins/platforms/wayland/client.pro index ba17b21c57c..212ce0d5965 100644 --- a/src/plugins/platforms/wayland/client.pro +++ b/src/plugins/platforms/wayland/client.pro @@ -83,6 +83,7 @@ SOURCES += qwaylandintegration.cpp \ qwaylandwindowmanagerintegration.cpp \ qwaylandinputcontext.cpp \ qwaylanddatadevice.cpp \ + qwaylandshm.cpp \ HEADERS += qwaylandintegration_p.h \ qwaylandnativeinterface_p.h \ @@ -116,6 +117,7 @@ HEADERS += qwaylandintegration_p.h \ qwaylandwindowmanagerintegration_p.h \ qwaylandinputcontext_p.h \ qwaylanddatadevice_p.h \ + qwaylandshm_p.h \ include(hardwareintegration/hardwareintegration.pri) include(shellintegration/shellintegration.pri) diff --git a/src/plugins/platforms/wayland/qwaylandcursor.cpp b/src/plugins/platforms/wayland/qwaylandcursor.cpp index 8dfc95c3604..a76e05a9ab3 100644 --- a/src/plugins/platforms/wayland/qwaylandcursor.cpp +++ b/src/plugins/platforms/wayland/qwaylandcursor.cpp @@ -59,7 +59,7 @@ QWaylandCursor::QWaylandCursor(QWaylandScreen *screen) int cursorSize = cursorSizeFromEnv.toInt(&hasCursorSize); if (!hasCursorSize || cursorSize <= 0) cursorSize = 32; - mCursorTheme = wl_cursor_theme_load(cursorTheme, cursorSize, mDisplay->shm()); + mCursorTheme = wl_cursor_theme_load(cursorTheme, cursorSize, mDisplay->shm()->object()); if (!mCursorTheme) qDebug() << "Could not load theme" << cursorTheme; initCursorMap(); diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index ab69bca3278..0dd7bdfa62e 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -255,7 +255,7 @@ void QWaylandDisplay::registry_global(uint32_t id, const QString &interface, uin mCompositorVersion = qMin((int)version, 3); mCompositor.init(registry, id, mCompositorVersion); } else if (interface == QStringLiteral("wl_shm")) { - mShm = static_cast(wl_registry_bind(registry, id, &wl_shm_interface,1)); + mShm.reset(new QWaylandShm(this, version, id)); } else if (interface == QStringLiteral("xdg_shell") && qEnvironmentVariableIsSet("QT_WAYLAND_USE_XDG_SHELL")) { mShellXdg.reset(new QWaylandXdgShell(registry,id)); diff --git a/src/plugins/platforms/wayland/qwaylanddisplay_p.h b/src/plugins/platforms/wayland/qwaylanddisplay_p.h index 96d79ddbd5a..84e94a61dbb 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay_p.h +++ b/src/plugins/platforms/wayland/qwaylanddisplay_p.h @@ -45,6 +45,7 @@ #include #include #include +#include struct wl_cursor_image; @@ -147,7 +148,7 @@ public: * to enable many listeners at once. */ void addRegistryListener(RegistryListener listener, void *data); - struct wl_shm *shm() const { return mShm; } + QWaylandShm *shm() const { return mShm.data(); } static uint32_t currentTimeMillisec(); @@ -176,7 +177,7 @@ private: struct wl_display *mDisplay; struct wl_event_queue *mEventQueue; QtWayland::wl_compositor mCompositor; - struct wl_shm *mShm; + QScopedPointer mShm; QThread *mEventThread; QWaylandEventThread *mEventThreadObject; QScopedPointer mShell; diff --git a/src/plugins/platforms/wayland/qwaylandshm.cpp b/src/plugins/platforms/wayland/qwaylandshm.cpp new file mode 100644 index 00000000000..1d7981477ad --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandshm.cpp @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2015 LG Electronics Inc, author: +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include +#include + +#include "qwaylandshmformathelper.h" + +QT_BEGIN_NAMESPACE + +namespace QtWaylandClient { + +QWaylandShm::QWaylandShm(QWaylandDisplay *display, int version, uint32_t id) + : QtWayland::wl_shm(display->wl_registry(), id, qMin(version, 1)) +{ +} + +QWaylandShm::~QWaylandShm() +{ + +} + +void QWaylandShm::shm_format(uint32_t format) +{ + m_formats << format; +} + +bool QWaylandShm::formatSupported(wl_shm_format format) const +{ + return m_formats.contains(format); +} + +bool QWaylandShm::formatSupported(QImage::Format format) const +{ + wl_shm_format fmt = formatFrom(format); + return formatSupported(fmt); +} + +wl_shm_format QWaylandShm::formatFrom(QImage::Format format) +{ + return QWaylandShmFormatHelper::fromQImageFormat(format); +} + +QImage::Format QWaylandShm::formatFrom(wl_shm_format format) +{ + return QWaylandShmFormatHelper::fromWaylandShmFormat(format); +} + +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/wayland/qwaylandshm_p.h b/src/plugins/platforms/wayland/qwaylandshm_p.h new file mode 100644 index 00000000000..10feae6a770 --- /dev/null +++ b/src/plugins/platforms/wayland/qwaylandshm_p.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2015 LG Electronics Inc, author: +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDSHM_H +#define QWAYLANDSHM_H + +#include +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +namespace QtWaylandClient { + +class QWaylandDisplay; + +class Q_WAYLAND_CLIENT_EXPORT QWaylandShm : public QtWayland::wl_shm +{ + +public: + + QWaylandShm(QWaylandDisplay *display, int version, uint32_t id); + ~QWaylandShm(); + + bool formatSupported(wl_shm_format format) const; + bool formatSupported(QImage::Format format) const; + + static wl_shm_format formatFrom(QImage::Format format); + static QImage::Format formatFrom(wl_shm_format format); + +protected: + virtual void shm_format(uint32_t format); + +private: + QVector m_formats; + +}; + +} + +QT_END_NAMESPACE + +#endif + diff --git a/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp b/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp index f009e08116b..2912ee3b9e1 100644 --- a/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp +++ b/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp @@ -42,7 +42,6 @@ #include #include -#include "qwaylandshmformathelper.h" #include #include @@ -85,11 +84,12 @@ QWaylandShmBuffer::QWaylandShmBuffer(QWaylandDisplay *display, return; } - wl_shm_format wl_format = QWaylandShmFormatHelper::fromQImageFormat(format); + QWaylandShm* shm = display->shm(); + wl_shm_format wl_format = shm->formatFrom(format); mImage = QImage(data, size.width(), size.height(), stride, format); mImage.setDevicePixelRatio(qreal(scale)); - mShmPool = wl_shm_create_pool(display->shm(), fd, alloc); + mShmPool = wl_shm_create_pool(shm->object(), fd, alloc); mBuffer = wl_shm_pool_create_buffer(mShmPool,0, size.width(), size.height(), stride, wl_format); close(fd);