diff options
author | Andy Nichols <andy.nichols@digia.com> | 2013-01-31 15:58:14 +0100 |
---|---|---|
committer | Andy Nichols <andy.nichols@digia.com> | 2013-02-06 14:19:35 +0100 |
commit | 4cbc411f60d17a6d4f4e9d4156146537d5dc2f16 (patch) | |
tree | d73b8d890f9e9e56c988f298f47a20370890bfed /src/plugins/platforms/wayland/qwaylandshmbackingstore.cpp | |
parent | 634c4f6877d63cc30914049989b5cbfd18cd15c3 (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.cpp | 285 |
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 ®ion, 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 |