summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp
diff options
context:
space:
mode:
authorAndy Nichols <andy.nichols@digia.com>2013-01-31 15:58:14 +0100
committerAndy Nichols <andy.nichols@digia.com>2013-02-06 14:19:35 +0100
commit4cbc411f60d17a6d4f4e9d4156146537d5dc2f16 (patch)
treed73b8d890f9e9e56c988f298f47a20370890bfed /src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp
parent634c4f6877d63cc30914049989b5cbfd18cd15c3 (diff)
Overhaul how platform plugins are built
Instead of building only one platform plugin through the use of a complicated if/else structure, build a plugin for each available hardware integration type. Change-Id: If133576515a881274019c1ac5956605f27a9fc40 Reviewed-by: Andy Nichols <andy.nichols@digia.com> Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
Diffstat (limited to 'src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp')
-rw-r--r--src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp285
1 files changed, 0 insertions, 285 deletions
diff --git a/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp b/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp
deleted file mode 100644
index 8300d9c9b..000000000
--- a/src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp
+++ /dev/null
@@ -1,285 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** 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 Digia. For licensing terms and
-** conditions see http://qt.digia.com/licensing. For further information
-** use the contact form at http://qt.digia.com/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 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights. These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3.0 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 3.0 requirements will be
-** met: http://www.gnu.org/copyleft/gpl.html.
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include "qwaylandshmbackingstore.h"
-
-#include <QtCore/qdebug.h>
-
-#include "qwaylanddisplay.h"
-#include "qwaylandshmwindow.h"
-#include "qwaylandscreen.h"
-#include "qwaylanddecoration.h"
-
-#include <QtGui/QPainter>
-
-#include <wayland-client.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/mman.h>
-
-QT_BEGIN_NAMESPACE
-
-QWaylandShmBuffer::QWaylandShmBuffer(QWaylandDisplay *display,
- const QSize &size, QImage::Format format)
- : mMarginsImage(0)
-{
- int stride = size.width() * 4;
- int alloc = stride * size.height();
- char filename[] = "/tmp/wayland-shm-XXXXXX";
- int fd = mkstemp(filename);
- if (fd < 0) {
- qWarning("mkstemp %s failed: %s", filename, strerror(errno));
- return;
- }
- int flags = fcntl(fd, F_GETFD);
- if (flags != -1)
- fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
-
- if (ftruncate(fd, alloc) < 0) {
- qWarning("ftruncate failed: %s", strerror(errno));
- close(fd);
- return;
- }
- uchar *data = (uchar *)
- mmap(NULL, alloc, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- unlink(filename);
-
- if (data == (uchar *) MAP_FAILED) {
- qWarning("mmap /dev/zero failed: %s", strerror(errno));
- close(fd);
- return;
- }
-
- mImage = QImage(data, size.width(), size.height(), stride, format);
- mShmPool = wl_shm_create_pool(display->shm(), fd, alloc);
- mBuffer = wl_shm_pool_create_buffer(mShmPool,0, size.width(), size.height(),
- stride, WL_SHM_FORMAT_ARGB8888);
- close(fd);
-}
-
-QWaylandShmBuffer::~QWaylandShmBuffer(void)
-{
- munmap((void *) mImage.constBits(), mImage.byteCount());
- wl_buffer_destroy(mBuffer);
- wl_shm_pool_destroy(mShmPool);
-}
-
-QImage *QWaylandShmBuffer::imageInsideMargins(const QMargins &margins)
-{
- if (!margins.isNull() && margins != mMargins) {
- if (mMarginsImage) {
- delete mMarginsImage;
- }
- uchar *bits = const_cast<uchar *>(mImage.constBits());
- uchar *b_s_data = bits + margins.top() * mImage.bytesPerLine() + margins.left() * 4;
- int b_s_width = mImage.size().width() - margins.left() - margins.right();
- int b_s_height = mImage.size().height() - margins.top() - margins.bottom();
- mMarginsImage = new QImage(b_s_data, b_s_width,b_s_height,mImage.bytesPerLine(),mImage.format());
- }
- if (margins.isNull()) {
- delete mMarginsImage;
- mMarginsImage = 0;
- }
-
- mMargins = margins;
- if (!mMarginsImage)
- return &mImage;
-
- return mMarginsImage;
-
-}
-
-QWaylandShmBackingStore::QWaylandShmBackingStore(QWindow *window)
- : QPlatformBackingStore(window)
- , mDisplay(QWaylandScreen::waylandScreenFromWindow(window)->display())
- , mFrontBuffer(0)
- , mBackBuffer(0)
- , mFrontBufferIsDirty(false)
- , mPainting(false)
- , mFrameCallback(0)
-{
-
-}
-
-QWaylandShmBackingStore::~QWaylandShmBackingStore()
-{
- if (mFrameCallback)
- wl_callback_destroy(mFrameCallback);
-
-// if (mFrontBuffer == waylandWindow()->attached())
-// waylandWindow()->attach(0);
-
- if (mFrontBuffer != mBackBuffer)
- delete mFrontBuffer;
-
- delete mBackBuffer;
-}
-
-QPaintDevice *QWaylandShmBackingStore::paintDevice()
-{
- if (!windowDecoration())
- return mBackBuffer->image();
- return mBackBuffer->imageInsideMargins(windowDecorationMargins());
-}
-
-void QWaylandShmBackingStore::beginPaint(const QRegion &)
-{
- mPainting = true;
- ensureSize();
-
- if (waylandWindow()->attached() && mBackBuffer == waylandWindow()->attached() && mFrameCallback) {
- QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->handle());
- Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm);
- waylandWindow->waitForFrameSync();
- }
-
-}
-
-void QWaylandShmBackingStore::endPaint()
-{
- mPainting = false;
-}
-
-void QWaylandShmBackingStore::ensureSize()
-{
- waylandWindow()->setBackingStore(this);
- waylandWindow()->createDecoration();
- resize(mRequestedSize);
-}
-
-void QWaylandShmBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
-{
- Q_UNUSED(window);
- Q_UNUSED(offset);
- Q_ASSERT(waylandWindow()->windowType() == QWaylandWindow::Shm);
-
- mFrontBuffer = mBackBuffer;
-
- if (mFrameCallback) {
- mFrontBufferIsDirty = true;
- return;
- }
-
- mFrameCallback = wl_surface_frame(waylandWindow()->wl_surface());
- wl_callback_add_listener(mFrameCallback,&frameCallbackListener,this);
- QMargins margins = windowDecorationMargins();
-
- bool damageAll = false;
- if (waylandWindow()->attached() != mFrontBuffer) {
- delete waylandWindow()->attached();
- waylandWindow()->attachOffset(mFrontBuffer);
- damageAll = true;
- }
-
- if (damageAll) {
- //need to damage it all, otherwise the attach offset may screw up
- waylandWindow()->damage(QRect(QPoint(0,0),mFrontBuffer->size()));
- } else {
- QVector<QRect> rects = region.rects();
- for (int i = 0; i < rects.size(); i++) {
- QRect rect = rects.at(i);
- rect.translate(margins.left(),margins.top());
- waylandWindow()->damage(rect);
- }
- }
- mFrontBufferIsDirty = false;
-}
-
-void QWaylandShmBackingStore::resize(const QSize &size, const QRegion &)
-{
- mRequestedSize = size;
-}
-
-void QWaylandShmBackingStore::resize(const QSize &size)
-{
- QMargins margins = windowDecorationMargins();
- QSize sizeWithMargins = size + QSize(margins.left()+margins.right(),margins.top()+margins.bottom());
-
- QImage::Format format = QPlatformScreen::platformScreenForWindow(window())->format();
-
- if (mBackBuffer != NULL && mBackBuffer->size() == sizeWithMargins)
- return;
-
- if (mBackBuffer != mFrontBuffer) {
- delete mBackBuffer; //we delete the attached buffer when we flush
- }
-
- mBackBuffer = new QWaylandShmBuffer(mDisplay, sizeWithMargins, format);
-
- if (windowDecoration())
- windowDecoration()->paintDecoration();
-}
-
-QImage *QWaylandShmBackingStore::entireSurface() const
-{
- return mBackBuffer->image();
-}
-
-void QWaylandShmBackingStore::done(void *data, wl_callback *callback, uint32_t time)
-{
- Q_UNUSED(time);
- QWaylandShmBackingStore *self =
- static_cast<QWaylandShmBackingStore *>(data);
- if (callback != self->mFrameCallback) // others, like QWaylandWindow, may trigger callbacks too
- return;
- QWaylandShmWindow *window = self->waylandWindow();
- wl_callback_destroy(self->mFrameCallback);
- self->mFrameCallback = 0;
-
- if (self->mFrontBuffer != window->attached()) {
- delete window->attached();
- }
-
- window->attachOffset(self->mFrontBuffer);
-
- if (self->mFrontBufferIsDirty && !self->mPainting) {
- self->mFrontBufferIsDirty = false;
- self->mFrameCallback = wl_surface_frame(window->wl_surface());
- wl_callback_add_listener(self->mFrameCallback,&self->frameCallbackListener,self);
- window->damage(QRect(QPoint(0,0),self->mFrontBuffer->size()));
- }
-}
-
-const struct wl_callback_listener QWaylandShmBackingStore::frameCallbackListener = {
- QWaylandShmBackingStore::done
-};
-
-QT_END_NAMESPACE