summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@nokia.com>2010-04-21 11:25:54 (GMT)
committerJørgen Lind <jorgen.lind@nokia.com>2010-04-21 11:25:54 (GMT)
commit6f5ad5dcab8e6f702894c4fa5c016d9837375626 (patch)
tree8951be47d1da0f836c461d0f844083f65880ebbb
parent662eab575f3678364fbd3f317624fdd840e03c3c (diff)
parent66e4d48129d6baa405ed9a4a22b12913227a8c45 (diff)
downloadQt-6f5ad5dcab8e6f702894c4fa5c016d9837375626.zip
Qt-6f5ad5dcab8e6f702894c4fa5c016d9837375626.tar.gz
Qt-6f5ad5dcab8e6f702894c4fa5c016d9837375626.tar.bz2
Merge branch 'platform_window' into lighthouse
Conflicts: src/gui/kernel/qplatformscreen_lite.h src/plugins/platforms/fb_base/fb_base.cpp src/plugins/platforms/fb_base/fb_base.h src/plugins/platforms/linuxfb/main.cpp src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.cpp src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.h src/plugins/platforms/testlite/qplatformintegration_testlite.cpp src/plugins/platforms/vnc/main.cpp src/plugins/platforms/vnc/qgraphicssystem_vnc.cpp src/plugins/platforms/vnc/qgraphicssystem_vnc.h src/plugins/platforms/vnc/qvnccursor.cpp src/plugins/platforms/vnc/qvnccursor.h src/plugins/platforms/vnc/qvncserver.cpp src/plugins/platforms/vnc/qvncserver.h
-rw-r--r--src/gui/kernel/kernel.pri4
-rw-r--r--src/gui/kernel/qapplication_lite.cpp12
-rw-r--r--src/gui/kernel/qplatformintegration_lite.h3
-rw-r--r--src/gui/kernel/qplatformscreen_lite.cpp8
-rw-r--r--src/gui/kernel/qplatformscreen_lite.h5
-rw-r--r--src/gui/kernel/qplatformwindow_lite.cpp78
-rw-r--r--src/gui/kernel/qplatformwindow_lite.h85
-rw-r--r--src/gui/kernel/qwidget.cpp46
-rw-r--r--src/gui/kernel/qwidget.h6
-rw-r--r--src/gui/kernel/qwidget_lite.cpp111
-rw-r--r--src/gui/kernel/qwidget_p.h5
-rw-r--r--src/gui/painting/painting.pri2
-rw-r--r--src/gui/painting/qbackingstore.cpp27
-rw-r--r--src/gui/painting/qgraphicssystem_lite.cpp2
-rw-r--r--src/gui/painting/qpaintengine_blitter.cpp113
-rw-r--r--src/gui/painting/qpaintengine_blitter_p.h1
-rw-r--r--src/gui/painting/qwindowsurface.cpp53
-rw-r--r--src/gui/painting/qwindowsurface_p.h16
-rw-r--r--src/gui/text/qfont.cpp26
-rw-r--r--src/plugins/graphicssystems/trace/qgraphicssystem_trace.cpp4
-rw-r--r--src/plugins/platforms/directfb/directfb.pro18
-rw-r--r--src/plugins/platforms/directfb/main.cpp2
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.cpp (renamed from src/plugins/platforms/directfb/qblitter_directfb.cpp)15
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.h (renamed from src/plugins/platforms/directfb/qblitter_directfb.h)0
-rw-r--r--src/plugins/platforms/directfb/qdirectfbconvenience.cpp2
-rw-r--r--src/plugins/platforms/directfb/qdirectfbcursor.cpp3
-rw-r--r--src/plugins/platforms/directfb/qdirectfbinput.cpp13
-rw-r--r--src/plugins/platforms/directfb/qdirectfbinput.h4
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.cpp (renamed from src/plugins/platforms/directfb/qplatformintegration_directfb.cpp)17
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.h (renamed from src/plugins/platforms/directfb/qplatformintegration_directfb.h)4
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindow.cpp (renamed from src/plugins/platforms/directfb/qwindowsurface_directfb.cpp)128
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindow.h73
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindowsurface.cpp141
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindowsurface.h (renamed from src/plugins/platforms/directfb/qwindowsurface_directfb.h)15
-rw-r--r--src/plugins/platforms/fb_base/fb_base.cpp112
-rw-r--r--src/plugins/platforms/fb_base/fb_base.h65
-rw-r--r--src/plugins/platforms/linuxfb/main.cpp2
-rw-r--r--src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.cpp45
-rw-r--r--src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.h11
-rw-r--r--src/plugins/platforms/minimal/minimal.pro2
-rw-r--r--src/plugins/platforms/minimal/qplatformintegration_minimal.cpp12
-rw-r--r--src/plugins/platforms/minimal/qplatformintegration_minimal.h4
-rw-r--r--src/plugins/platforms/minimal/qwindowsurface_minimal.cpp8
-rw-r--r--src/plugins/platforms/minimal/qwindowsurface_minimal.h4
-rw-r--r--src/plugins/platforms/qvfb/main.cpp16
-rw-r--r--src/plugins/platforms/qvfb/qvfb.pro11
-rw-r--r--src/plugins/platforms/qvfb/qvfbintegration.cpp (renamed from src/plugins/platforms/qvfb/qgraphicssystem_qvfb.cpp)95
-rw-r--r--src/plugins/platforms/qvfb/qvfbintegration.h (renamed from src/plugins/platforms/qvfb/qgraphicssystem_qvfb.h)28
-rw-r--r--src/plugins/platforms/qvfb/qwindowsurface_qvfb.cpp38
-rw-r--r--src/plugins/platforms/qvfb/qwindowsurface_qvfb.h26
-rw-r--r--src/plugins/platforms/testlite/qplatformintegration_testlite.cpp26
-rw-r--r--src/plugins/platforms/testlite/qplatformintegration_testlite.h3
-rw-r--r--src/plugins/platforms/testlite/qtestlitewindow.cpp (renamed from src/plugins/platforms/testlite/x11util.cpp)1596
-rw-r--r--src/plugins/platforms/testlite/qtestlitewindow.h (renamed from src/plugins/platforms/testlite/x11util.h)132
-rw-r--r--src/plugins/platforms/testlite/qwindowsurface_testlite.cpp636
-rw-r--r--src/plugins/platforms/testlite/qwindowsurface_testlite.h42
-rw-r--r--src/plugins/platforms/testlite/testlite.pro8
-rw-r--r--src/plugins/platforms/vnc/main.cpp12
-rw-r--r--src/plugins/platforms/vnc/qgraphicssystem_vnc.cpp42
-rw-r--r--src/plugins/platforms/vnc/qgraphicssystem_vnc.h21
-rw-r--r--src/plugins/platforms/vnc/qvnccursor.cpp2
-rw-r--r--src/plugins/platforms/vnc/qvnccursor.h4
-rw-r--r--src/plugins/platforms/vnc/qvncserver.cpp12
-rw-r--r--src/plugins/platforms/vnc/qvncserver.h22
-rw-r--r--src/plugins/plugins.pro2
65 files changed, 2261 insertions, 1820 deletions
diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri
index cf5ec92..049637f 100644
--- a/src/gui/kernel/kernel.pri
+++ b/src/gui/kernel/kernel.pri
@@ -207,6 +207,7 @@ embedded_lite {
kernel/qplatformscreen_lite.h \
kernel/qplatformintegrationfactory_lite_p.h \
kernel/qplatformintegrationplugin_lite.h \
+ kernel/qplatformwindow_lite.h
SOURCES += \
kernel/qapplication_lite.cpp \
@@ -224,7 +225,8 @@ embedded_lite {
kernel/qplatformintegration_lite.cpp \
kernel/qplatformscreen_lite.cpp \
kernel/qplatformintegrationfactory_lite.cpp \
- kernel/qplatformintegrationplugin_lite.cpp
+ kernel/qplatformintegrationplugin_lite.cpp \
+ kernel/qplatformwindow_lite.cpp
contains(QT_CONFIG, glib) {
SOURCES += \
diff --git a/src/gui/kernel/qapplication_lite.cpp b/src/gui/kernel/qapplication_lite.cpp
index c8d65ff..867c2dc 100644
--- a/src/gui/kernel/qapplication_lite.cpp
+++ b/src/gui/kernel/qapplication_lite.cpp
@@ -422,6 +422,15 @@ static void init_platform(const QString &name)
}
+
+static void cleanup_platform()
+{
+ delete QApplicationPrivate::platform_integration;
+ QApplicationPrivate::platform_integration = 0;
+ delete QApplicationPrivate::graphics_system;
+ QApplicationPrivate::graphics_system = 0;
+}
+
static void init_plugins(const QList<QByteArray> pluginList)
{
for (int i = 0; i < pluginList.count(); ++i) {
@@ -520,6 +529,8 @@ void qt_init(QApplicationPrivate *priv, int type)
void qt_cleanup()
{
+ cleanup_platform();
+
QPixmapCache::clear();
#ifndef QT_NO_CURSOR
QCursorData::cleanup();
@@ -767,6 +778,7 @@ void QApplicationPrivate::processGeometryChange(QWidget *tlw, const QRect &newRe
if (isResize) {
QResizeEvent e(tlw->data->crect.size(), cr.size());
QApplication::sendSpontaneousEvent(tlw, &e);
+ tlw->update();
}
if (isMove) {
diff --git a/src/gui/kernel/qplatformintegration_lite.h b/src/gui/kernel/qplatformintegration_lite.h
index 2018c70..70bd0ce 100644
--- a/src/gui/kernel/qplatformintegration_lite.h
+++ b/src/gui/kernel/qplatformintegration_lite.h
@@ -64,7 +64,8 @@ public:
// GraphicsSystem functions
virtual QPixmapData *createPixmapData(QPixmapData::PixelType type) const = 0;
- virtual QWindowSurface *createWindowSurface(QWidget *widget) const = 0;
+ virtual QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId = 0) const = 0;
+ virtual QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const = 0;
virtual QBlittable *createBlittable(const QSize &size) const;
// Window System functions
diff --git a/src/gui/kernel/qplatformscreen_lite.cpp b/src/gui/kernel/qplatformscreen_lite.cpp
index 4492463..4c0a02b 100644
--- a/src/gui/kernel/qplatformscreen_lite.cpp
+++ b/src/gui/kernel/qplatformscreen_lite.cpp
@@ -56,3 +56,11 @@ QWidget *QPlatformScreen::topLevelAt(const QPoint & pos) const
return 0;
}
+QSize QPlatformScreen::physicalSize() const
+{
+ static const int dpi = 100;
+ int width = geometry().width() / dpi * qreal(25.4) ;
+ int height = geometry().height() / dpi * qreal(25.4) ;
+ return QSize(width,height);
+}
+
diff --git a/src/gui/kernel/qplatformscreen_lite.h b/src/gui/kernel/qplatformscreen_lite.h
index abdf362..7d0e28d 100644
--- a/src/gui/kernel/qplatformscreen_lite.h
+++ b/src/gui/kernel/qplatformscreen_lite.h
@@ -44,7 +44,7 @@
#include <QtCore/qrect.h>
#include <QtGui/qimage.h>
-#include <QObject>
+#include <QtCore/qobject.h>
QT_BEGIN_HEADER
@@ -54,6 +54,7 @@ QT_MODULE(Gui)
class Q_GUI_EXPORT QPlatformScreen : public QObject
{
+ Q_OBJECT
public:
virtual ~QPlatformScreen() { }
@@ -61,7 +62,7 @@ public:
virtual QRect availableGeometry() const {return geometry();};
virtual int depth() const = 0;
virtual QImage::Format format() const = 0;
- virtual QSize physicalSize() const = 0;
+ virtual QSize physicalSize() const;
virtual void setDirty(const QRect &) {}
virtual QWidget *topLevelAt(const QPoint &point) const;
};
diff --git a/src/gui/kernel/qplatformwindow_lite.cpp b/src/gui/kernel/qplatformwindow_lite.cpp
new file mode 100644
index 0000000..c8a3ed5
--- /dev/null
+++ b/src/gui/kernel/qplatformwindow_lite.cpp
@@ -0,0 +1,78 @@
+#include "qplatformwindow_lite.h"
+
+#include <QtGui/qwidget.h>
+
+class QPlatformWindowPrivate
+{
+ QWidget *tlw;
+ QRect rect;
+ friend class QPlatformWindow;
+};
+
+QPlatformWindow::QPlatformWindow(QWidget *tlw)
+ : d_ptr(new QPlatformWindowPrivate)
+{
+ Q_D(QPlatformWindow);
+ d->tlw = tlw;
+ tlw->setPlatformWindow(this);
+}
+
+QPlatformWindow::~QPlatformWindow()
+{
+}
+
+QWidget *QPlatformWindow::widget() const
+{
+ Q_D(const QPlatformWindow);
+ return d->tlw;
+}
+
+void QPlatformWindow::setGeometry(const QRect &rect)
+{
+ Q_D(QPlatformWindow);
+ d->rect = rect;
+}
+
+QRect QPlatformWindow::geometry() const
+{
+ Q_D(const QPlatformWindow);
+ return d->rect;
+}
+
+/*!
+Reimplemented in subclasses to show the surface if \a visible is \c true, and hide it if \a visible is \c false.
+*/
+void QPlatformWindow::setVisible(bool visible)
+{
+ Q_UNUSED(visible);
+}
+/*!
+Requests setting the window flags of this surface to \a type. Returns the actual flags set.
+*/
+Qt::WindowFlags QPlatformWindow::setWindowFlags(Qt::WindowFlags flags)
+{
+ Q_UNUSED(flags);
+ return Qt::Window;
+}
+
+/*!
+ Returns the effective window flags for this surface.
+*/
+Qt::WindowFlags QPlatformWindow::windowFlags() const
+{
+ return Qt::Window;
+}
+
+WId QPlatformWindow::winId() const { return WId(0); }
+
+void QPlatformWindow::setWindowTitle(const QString &) {}
+
+void QPlatformWindow::raise() { qWarning("This plugin does not support raise()"); }
+
+void QPlatformWindow::lower() { qWarning("This plugin does not support lower()"); }
+
+void QPlatformWindow::setOpacity(qreal level)
+{
+ Q_UNUSED(level);
+ qWarning("This plugin does not support setting window opacity");
+}
diff --git a/src/gui/kernel/qplatformwindow_lite.h b/src/gui/kernel/qplatformwindow_lite.h
new file mode 100644
index 0000000..583ac28
--- /dev/null
+++ b/src/gui/kernel/qplatformwindow_lite.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QPLATFORMWINDOW_H
+#define QPLATFORMWINDOW_H
+
+
+#include <QtCore/qscopedpointer.h>
+#include <QtCore/qrect.h>
+#include <QtCore/qstring.h>
+#include <QtGui/qwindowdefs.h>
+
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QPlatformWindowPrivate;
+class QWidget;
+class Q_GUI_EXPORT QPlatformWindow
+{
+ Q_DECLARE_PRIVATE(QPlatformWindow);
+public:
+ QPlatformWindow(QWidget *tlw);
+ virtual ~QPlatformWindow();
+
+ QWidget *widget() const;
+ virtual void setGeometry(const QRect &rect);
+ virtual QRect geometry() const;
+
+ virtual void setVisible(bool visible);
+ virtual Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags);
+ virtual Qt::WindowFlags windowFlags() const;
+ virtual WId winId() const;
+
+ virtual void setWindowTitle(const QString &);
+ virtual void raise();
+ virtual void lower();
+
+ virtual void setOpacity(qreal level);
+protected:
+ QScopedPointer<QPlatformWindowPrivate> d_ptr;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+#endif //QPLATFORMWINDOW_H
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index 3ca7591..07639ba 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -74,6 +74,9 @@
# include "qpaintengine.h" // for PorterDuff
# include "private/qwindowsurface_qws_p.h"
#endif
+#if defined(Q_WS_LITE)
+#include "qplatformwindow_lite.h"
+#endif
#include "qpainter.h"
#include "qtooltip.h"
#include "qwhatsthis.h"
@@ -1574,6 +1577,9 @@ void QWidgetPrivate::createTLExtra()
static int count = 0;
qDebug() << "tlextra" << ++count;
#endif
+#if defined(Q_WS_LITE)
+ x->platformWindow = 0;
+#endif
}
}
@@ -11836,6 +11842,46 @@ QWindowSurface *QWidget::windowSurface() const
return bs ? bs->windowSurface : 0;
}
+#if defined(Q_WS_LITE)
+/*!
+ \preliminary
+
+ Sets the window to be the \a window specified.
+ The QWidget takes ownership of the \a surface.
+*/
+void QWidget::setPlatformWindow(QPlatformWindow *window)
+{
+#ifndef Q_BACKINGSTORE_SUBSURFACES
+ if (!isTopLevel())
+ return;
+#endif
+
+ Q_D(QWidget);
+
+ QTLWExtra *topData = d->topData();
+ if (topData->platformWindow == window)
+ return;
+
+ delete topData->platformWindow;
+ topData->platformWindow = window;
+}
+
+/*!
+ \preliminary
+
+ Returns the QPlatformWindow this widget will be drawn into.
+*/
+QPlatformWindow *QWidget::platformWindow() const
+{
+ Q_D(const QWidget);
+ QTLWExtra *extra = d->maybeTopData();
+ if (extra && extra->platformWindow)
+ return extra->platformWindow;
+
+ return 0;
+}
+#endif //defined(Q_WS_LITE)
+
void QWidgetPrivate::getLayoutItemMargins(int *left, int *top, int *right, int *bottom) const
{
if (left)
diff --git a/src/gui/kernel/qwidget.h b/src/gui/kernel/qwidget.h
index e12148b..7dff703 100644
--- a/src/gui/kernel/qwidget.h
+++ b/src/gui/kernel/qwidget.h
@@ -94,6 +94,7 @@ class QHideEvent;
class QInputContext;
class QIcon;
class QWindowSurface;
+class QPlatformWindow;
class QLocale;
class QGraphicsProxyWidget;
class QGraphicsEffect;
@@ -625,6 +626,11 @@ public:
void setWindowSurface(QWindowSurface *surface);
QWindowSurface *windowSurface() const;
+#if defined(Q_WS_LITE)
+ void setPlatformWindow(QPlatformWindow *window);
+ QPlatformWindow *platformWindow() const;
+#endif
+
Q_SIGNALS:
void customContextMenuRequested(const QPoint &pos);
diff --git a/src/gui/kernel/qwidget_lite.cpp b/src/gui/kernel/qwidget_lite.cpp
index add5592..ee1a582 100644
--- a/src/gui/kernel/qwidget_lite.cpp
+++ b/src/gui/kernel/qwidget_lite.cpp
@@ -39,26 +39,28 @@
**
****************************************************************************/
-#include "qwidget.h"
-#include "qevent.h"
-#include "qapplication.h"
-#include "private/qbackingstore_p.h"
-#include "private/qwidget_p.h"
-#include "private/qgraphicssystem_p.h"
-#include "private/qapplication_p.h"
-#include "qdesktopwidget.h"
-
-#include <QGraphicsSystemCursor>
+#include "QtGui/qwidget.h"
+#include "QtGui/qevent.h"
+#include "QtGui/qapplication.h"
+#include "QtGui/private/qbackingstore_p.h"
+#include "QtGui/private/qwidget_p.h"
+#include "QtGui/private/qgraphicssystem_p.h"
+#include "QtGui/private/qapplication_p.h"
+#include "QtGui/qdesktopwidget.h"
+#include "QtGui/qplatformwindow_lite.h"
+
+#include <QtGui/QGraphicsSystemCursor>
QT_BEGIN_NAMESPACE
static QPlatformScreen *qt_screenForWidget(const QWidget *w);
-void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool /*destroyOldWindow*/)
+void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyOldWindow)
{
Q_Q(QWidget);
Q_UNUSED(window);
Q_UNUSED(initializeWindow);
+ Q_UNUSED(destroyOldWindow);
// XXX
Qt::WindowFlags flags = data.window_flags;
@@ -67,25 +69,29 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool /*destro
return; // we only care about real toplevels
QWindowSurface *surface = q->windowSurface();
+ QPlatformWindow *platformWindow = q->platformWindow();
- if (!surface)
- surface = createDefaultWindowSurface();
+ if (!platformWindow) {
+ platformWindow = QApplicationPrivate::platformIntegration()->createPlatformWindow(q);
+ }
+ Q_ASSERT(platformWindow);
+ if (!surface) {
+ surface = QApplicationPrivate::platformIntegration()->createWindowSurface(q,platformWindow->winId());
+ }
Q_ASSERT(surface);
- data.window_flags = surface->setWindowFlags(data.window_flags);
+ data.window_flags = q->platformWindow()->setWindowFlags(data.window_flags);
- setWinId(surface->winId());
+ setWinId(q->platformWindow()->winId());
// qDebug() << "create_sys" << q << q->internalWinId();
}
void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
{
- Q_UNUSED(destroyWindow);
+ Q_D(QWidget);
Q_UNUSED(destroySubWindows);
- // XXX
-
if ((windowType() == Qt::Popup))
qApp->d_func()->closePopup(this);
@@ -93,14 +99,27 @@ void QWidget::destroy(bool destroyWindow, bool destroySubWindows)
//### we don't have proper focus event handling yet
if (this == QApplicationPrivate::active_window)
QApplication::setActiveWindow(0);
+
+ if (windowType() != Qt::Desktop) {
+ if (destroyWindow && isWindow()) {
+ QTLWExtra *topData = d->maybeTopData();
+ if (topData) {
+ delete topData->platformWindow;
+ topData->platformWindow = 0;
+ }
+ } else {
+ if (parentWidget() && parentWidget()->testAttribute(Qt::WA_WState_Created)) {
+ d->hide_sys();
+ }
+ }
+ }
}
void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f)
{
Q_Q(QWidget);
-
- QWidget *oldParent = q->parentWidget();
+// QWidget *oldParent = q->parentWidget();
Qt::WindowFlags oldFlags = data.window_flags;
if (parent != newparent) {
QObjectPrivate::setParent_helper(newparent); //### why does this have to be done in the _sys function???
@@ -119,8 +138,8 @@ void QWidgetPrivate::setParent_sys(QWidget *newparent, Qt::WindowFlags f)
if (f & Qt::Window) {
//qDebug() << "setParent_sys" << q << newparent << hex << f;
- if (QWindowSurface *surface = q->windowSurface())
- data.window_flags = surface->setWindowFlags(data.window_flags);
+ if (QPlatformWindow *window = q->platformWindow())
+ data.window_flags = window->setWindowFlags(data.window_flags);
}
// XXX Reparenting child to toplevel or vice versa ###
if ((f&Qt::Window) && !(oldFlags&Qt::Window)) {
@@ -191,8 +210,8 @@ void QWidgetPrivate::setWindowTitle_sys(const QString &caption)
if (!q->isWindow())
return;
- if (QWindowSurface *surface = q->windowSurface())
- surface->setWindowTitle(caption);
+ if (QPlatformWindow *window = q->platformWindow())
+ window->setWindowTitle(caption);
}
@@ -299,9 +318,14 @@ void QWidgetPrivate::show_sys()
if (QWindowSurface *surface = q->windowSurface()) {
const QRect geomRect = q->geometry();
- if (surface->geometry() != geomRect)
- surface->setGeometry(geomRect);
- surface->setVisible(true);
+ const QRect windowRect = q->platformWindow()->geometry();
+ if (windowRect != geomRect) {
+ q->platformWindow()->setGeometry(geomRect);
+ if (windowRect.size() != geomRect.size()) {
+ surface->resize(geomRect.size());
+ }
+ }
+ q->platformWindow()->setVisible(true);
}
if (q->windowType() != Qt::Popup && q->windowType() != Qt::ToolTip && !(q->windowFlags() & Qt::X11BypassWindowManagerHint))
@@ -320,8 +344,8 @@ void QWidgetPrivate::hide_sys()
}
return;
}
- if (QWindowSurface *surface = q->windowSurface()) {
- surface->setVisible(false);
+ if (QPlatformWindow *window = q->platformWindow()) {
+ window->setVisible(false);
}
//### we don't yet have proper focus event handling
@@ -427,8 +451,7 @@ void QWidgetPrivate::raise_sys()
{
Q_Q(QWidget);
if (q->isWindow()) {
- QWindowSurface *surface = q->windowSurface();
- surface->raise();
+ q->platformWindow()->raise();
}
}
@@ -437,8 +460,7 @@ void QWidgetPrivate::lower_sys()
Q_Q(QWidget);
if (q->isWindow()) {
Q_ASSERT(q->testAttribute(Qt::WA_WState_Created));
- QWindowSurface *surface = q->windowSurface();
- surface->lower();
+ q->platformWindow()->lower();
} else if (QWidget *p = q->parentWidget()) {
setDirtyOpaqueRegion();
p->d_func()->invalidateBuffer(effectiveRectFor(q->geometry()));
@@ -491,8 +513,11 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove)
if (q->isWindow()) {
const QWidgetBackingStore *bs = maybeBackingStore();
- if (bs->windowSurface)
- bs->windowSurface->setGeometry(q->frameGeometry());
+ if (bs->windowSurface) {
+ q->platformWindow()->setGeometry(q->frameGeometry());
+ if (isResize)
+ bs->windowSurface->resize(r.size());
+ }
} else {
if (isMove && !isResize)
moveRect(QRect(oldPos, olds), x - oldPos.x(), y - oldPos.y());
@@ -634,8 +659,8 @@ void QWidgetPrivate::updateFrameStrut()
void QWidgetPrivate::setWindowOpacity_sys(qreal level)
{
- Q_UNUSED(level);
- // XXX
+ Q_Q(QWidget);
+ q->platformWindow()->setOpacity(level);
}
void QWidgetPrivate::setWSGeometry(bool dontShow, const QRect &oldRect)
@@ -653,16 +678,8 @@ QPaintEngine *QWidget::paintEngine() const
QWindowSurface *QWidgetPrivate::createDefaultWindowSurface_sys()
{
- Q_Q(QWidget);
- if (q->windowType() == Qt::Desktop)
- return 0;
- q->ensurePolished();
-
- QGraphicsSystem *gs = QApplicationPrivate::graphicsSystem();
- if (!gs)
- return 0;
-
- return gs->createWindowSurface(q);
+ qFatal("CreateDefaultWindowSurface_sys should not be used on lighthouse");
+ return 0;
}
void QWidgetPrivate::setModal_sys()
diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h
index 0f34ae0..4ca493e 100644
--- a/src/gui/kernel/qwidget_p.h
+++ b/src/gui/kernel/qwidget_p.h
@@ -102,6 +102,9 @@ class QWSManager;
#if defined(Q_WS_MAC)
class QCoreGraphicsPaintEnginePrivate;
#endif
+#if defined(Q_WS_LITE)
+class QPlatformWindow;
+#endif
class QPaintEngine;
class QPixmap;
class QWidgetBackingStore;
@@ -176,6 +179,8 @@ struct QTLWExtra {
#endif
#elif defined(Q_OS_SYMBIAN)
uint inExpose : 1; // Prevents drawing recursion
+#elif defined(Q_WS_LITE)
+ QPlatformWindow *platformWindow;
#endif
};
diff --git a/src/gui/painting/painting.pri b/src/gui/painting/painting.pri
index c4e8f7a..972bac2 100644
--- a/src/gui/painting/painting.pri
+++ b/src/gui/painting/painting.pri
@@ -117,7 +117,7 @@ embedded {
SOURCES += \
painting/qgraphicssystem_qws.cpp \
-} else {
+} else: if(!embedded_lite) {
HEADERS += \
painting/qgraphicssystem_raster_p.h \
painting/qgraphicssystemfactory_p.h \
diff --git a/src/gui/painting/qbackingstore.cpp b/src/gui/painting/qbackingstore.cpp
index f2cd7e6..cc16fd0 100644
--- a/src/gui/painting/qbackingstore.cpp
+++ b/src/gui/painting/qbackingstore.cpp
@@ -286,7 +286,11 @@ bool QWidgetBackingStore::bltRect(const QRect &rect, int dx, int dy, QWidget *wi
void QWidgetBackingStore::releaseBuffer()
{
if (windowSurface)
+#if defined(Q_WS_LITE)
+ windowSurface->resize(QSize());
+#else
windowSurface->setGeometry(QRect());
+#endif
#ifdef Q_BACKINGSTORE_SUBSURFACES
for (int i = 0; i < subSurfaces.size(); ++i)
subSurfaces.at(i)->setGeometry(QRect());
@@ -416,7 +420,11 @@ QRegion QWidgetBackingStore::dirtyRegion(QWidget *widget) const
{
const bool widgetDirty = widget && widget != tlw;
const QRect tlwRect(topLevelRect());
+#if defined(Q_WS_LITE)
+ const QRect surfaceGeometry(tlwRect.topLeft(), windowSurface->size());
+#else
const QRect surfaceGeometry(windowSurface->geometry());
+#endif
if (surfaceGeometry != tlwRect && surfaceGeometry.size() != tlwRect.size()) {
if (widgetDirty) {
const QRect dirtyTlwRect = QRect(QPoint(), tlwRect.size());
@@ -467,7 +475,11 @@ QRegion QWidgetBackingStore::dirtyRegion(QWidget *widget) const
QRegion QWidgetBackingStore::staticContents(QWidget *parent, const QRect &withinClipRect) const
{
if (!parent && tlw->testAttribute(Qt::WA_StaticContents)) {
+#if defined(Q_WS_LITE)
+ const QSize surfaceGeometry(windowSurface->size());
+#else
const QRect surfaceGeometry(windowSurface->geometry());
+#endif
QRect surfaceRect(0, 0, surfaceGeometry.width(), surfaceGeometry.height());
if (!withinClipRect.isEmpty())
surfaceRect &= withinClipRect;
@@ -1144,12 +1156,16 @@ void QWidgetBackingStore::sync()
return;
}
- const bool inTopLevelResize = tlwExtra->inTopLevelResize;
const bool updatesDisabled = !tlw->updatesEnabled();
- const QRect tlwRect(topLevelRect());
- const QRect surfaceGeometry(windowSurface->geometry());
bool repaintAllWidgets = false;
+ const bool inTopLevelResize = tlwExtra->inTopLevelResize;
+ const QRect tlwRect(topLevelRect());
+#ifdef Q_WS_LITE
+ const QRect surfaceGeometry(tlwRect.topLeft(), windowSurface->size());
+#else
+ const QRect surfaceGeometry(windowSurface->geometry());
+#endif
if (inTopLevelResize || surfaceGeometry != tlwRect) {
if ((inTopLevelResize || surfaceGeometry.size() != tlwRect.size()) && !updatesDisabled) {
if (hasStaticContents()) {
@@ -1169,9 +1185,14 @@ void QWidgetBackingStore::sync()
repaintAllWidgets = true;
}
}
+#ifdef Q_WS_LITE
+ windowSurface->resize(tlwRect.size());
+#else
windowSurface->setGeometry(tlwRect);
+#endif
}
+
if (updatesDisabled)
return;
diff --git a/src/gui/painting/qgraphicssystem_lite.cpp b/src/gui/painting/qgraphicssystem_lite.cpp
index 42e7238..1d24129 100644
--- a/src/gui/painting/qgraphicssystem_lite.cpp
+++ b/src/gui/painting/qgraphicssystem_lite.cpp
@@ -51,7 +51,7 @@ QPixmapData *QLiteGraphicsSystem::createPixmapData(QPixmapData::PixelType type)
QWindowSurface *QLiteGraphicsSystem::createWindowSurface(QWidget *widget) const
{
- return QApplicationPrivate::platformIntegration()->createWindowSurface(widget);
+ return QApplicationPrivate::platformIntegration()->createWindowSurface(widget, widget->winId());
}
QBlittable *QLiteGraphicsSystem::createBlittable(const QSize &size) const
diff --git a/src/gui/painting/qpaintengine_blitter.cpp b/src/gui/painting/qpaintengine_blitter.cpp
index 0b74a4d..4144696 100644
--- a/src/gui/painting/qpaintengine_blitter.cpp
+++ b/src/gui/painting/qpaintengine_blitter.cpp
@@ -30,14 +30,20 @@ static inline void updateStateBits(uint *state, uint mask, bool on)
*state = on ? (*state | mask) : (*state & ~mask);
}
+static inline bool checkStateAgainstMask(uint state, uint mask)
+{
+ return !state || (state & mask && !(state & ~mask));
+}
+
class CapabilitiesToStateMask
{
public:
CapabilitiesToStateMask(QBlittable::Capabilities capabilities)
: m_capabilities(capabilities),
- fillRectMask(0), fillRectState(0),
- drawRectMask(0), drawRectState(0),
- drawPixmapMask(0), drawPixmapState(0)
+ fillRectMask(0),
+ drawRectMask(0),
+ drawPixmapMask(0),
+ capabillitiesState(0)
{
if (capabilities & QBlittable::SolidRectCapability) {
setFillRectMask();
@@ -48,23 +54,26 @@ public:
if (capabilities & QBlittable::SourceOverPixmapCapability) {
setSourceOverPixmapMask();
}
+ if (capabilities & QBlittable::SourceOverScaledPixmapCapability) {
+ setSourceOverScaledPixmapMask();
+ }
}
inline bool canBlitterFillRect() const
{
- return !fillRectState || (fillRectState & fillRectMask);
+ return checkStateAgainstMask(capabillitiesState,fillRectMask);
}
inline bool canBlitterDrawRectMask() const
{
- return drawRectState & drawRectMask;
+ return checkStateAgainstMask(capabillitiesState,drawRectMask);
}
bool canBlitterDrawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) const
{
if (pm.pixmapData()->classId() != QPixmapData::BlitterClass)
return false;
- if ((!drawPixmapState) || drawPixmapState & drawPixmapMask) {
+ if (checkStateAgainstMask(capabillitiesState,drawPixmapMask)) {
if (m_capabilities & (QBlittable::SourceOverPixmapCapability
| QBlittable::SourceOverScaledPixmapCapability)) {
if (r.size() != sr.size()) {
@@ -80,21 +89,8 @@ public:
return false;
}
- inline void updateFillRectBits(uint mask, bool on) {
- updateStateBits(&fillRectState,mask,on);
- }
-
- inline void updateDrawRectBits(uint mask, bool on) {
- updateStateBits(&drawRectState,mask,on);
- }
-
- inline void updateDrawPixmapBits(uint mask, bool on) {
- updateStateBits(&drawPixmapState,mask,on);
- }
- inline void updateAllWithBits(uint mask, bool on) {
- updateStateBits(&fillRectState,mask,on);
- updateStateBits(&drawRectState,mask,on);
- updateStateBits(&drawPixmapState,mask,on);
+ inline void updateState(uint mask, bool on) {
+ updateStateBits(&capabillitiesState,mask,on);
}
public:
@@ -138,17 +134,21 @@ public:
setSourcePixmapMask();
}
+ void setSourceOverScaledPixmapMask() {
+ setSourceOverPixmapMask();
+ updateStateBits(&drawRectMask, STATE_XFORM_SCALE, true);
+ }
+
QBlittable::Capabilities m_capabilities;
uint fillRectMask;
- uint fillRectState;
uint drawRectMask;
- uint drawRectState;
uint drawPixmapMask;
- uint drawPixmapState;
+ uint capabillitiesState;
};
class QBlitterPaintEnginePrivate : public QPaintEngineExPrivate
{
+ Q_DECLARE_PUBLIC(QBlitterPaintEngine);
public:
QBlitterPaintEnginePrivate(QBlittablePixmapData *p)
: QPaintEngineExPrivate(),
@@ -176,12 +176,13 @@ public:
}
void fillRect(const QRectF &rect, const QColor &color) {
+ Q_Q(QBlitterPaintEngine);
pmData->unmarkRasterOverlay(rect);
QRectF targetRect = rect;
if (hasXForm) {
- targetRect = state->matrix.mapRect(rect);
+ targetRect = q->state()->matrix.mapRect(rect);
}
- const QClipData *clipData = raster->d_func()->clip();;
+ const QClipData *clipData = q->clip();
if (clipData) {
if (clipData->hasRectClip) {
unlock();
@@ -214,23 +215,23 @@ public:
QRectF intersectedRect = clip.intersected(target);
if (intersectedRect.isEmpty())
return;
-
QRectF source = sr;
if(intersectedRect.size() != target.size()) {
qreal deltaTop = target.top() - intersectedRect.top();
qreal deltaLeft = target.left() - intersectedRect.left();
qreal deltaBottom = target.bottom() - intersectedRect.bottom();
qreal deltaRight = target.right() - intersectedRect.right();
- source.adjust(-deltaLeft,-deltaTop,deltaRight,deltaBottom);
+ source.adjust(-deltaLeft,-deltaTop,-deltaRight,-deltaBottom);
}
pmData->unmarkRasterOverlay(intersectedRect);
pmData->blittable()->drawPixmap(intersectedRect, pm, source);
}
void updateClip() {
- const QClipData *clip = raster->d_func()->clip();
- bool complex = clip != 0 && !(clip->hasRectClip || clip->hasRegionClip);
- capabillities->updateAllWithBits(STATE_CLIP_COMPLEX, complex);
+ Q_Q(QBlitterPaintEngine);
+ const QClipData *clip = q->clip();
+ bool complex = clip && !(clip->hasRectClip || clip->hasRegionClip);
+ capabillities->updateState(STATE_CLIP_COMPLEX, complex);
}
void systemStateChanged() {
@@ -238,7 +239,6 @@ public:
}
QRasterPaintEngine *raster;
- QRasterPaintEngineState *state;
QBlittablePixmapData *pmData;
bool isBlitterLocked;
@@ -267,8 +267,6 @@ bool QBlitterPaintEngine::begin(QPaintDevice *pdev)
{
Q_D(QBlitterPaintEngine);
- d->raster->setSystemRect(systemRect());
- d->raster->setSystemClip(systemClip());
setActive(true);
bool ok = d->raster->begin(pdev);
#ifdef QT_BLITTER_RASTEROVERLAY
@@ -282,8 +280,6 @@ bool QBlitterPaintEngine::end()
{
Q_D(QBlitterPaintEngine);
- d->raster->setPaintDevice(0);
- d->raster->setActive(false);
setActive(false);
#ifdef QT_BLITTER_RASTEROVERLAY
d->pmData->mergeOverlay();
@@ -321,7 +317,9 @@ void QBlitterPaintEngine::fillRect(const QRectF &rect, const QBrush &brush)
{
if(rect.size().isEmpty())
return;
+
Q_D(QBlitterPaintEngine);
+
if (qbrush_style(brush) == Qt::SolidPattern
&& qbrush_color(brush).alpha() == 0xff
&& d->capabillities->canBlitterFillRect())
@@ -336,11 +334,11 @@ void QBlitterPaintEngine::fillRect(const QRectF &rect, const QBrush &brush)
qreal y = transformedRect.y();
QPixmap pm = brush.texture();
d->unlock();
- int srcX = (int)(rect.x() - d->raster->state()->brushOrigin.x()) % pm.width();
+ int srcX = int(rect.x() - state()->brushOrigin.x()) % pm.width();
if (srcX < 0)
srcX = pm.width() + srcX;
const int startX = srcX;
- int srcY = (int)(rect.y() - d->raster->state()->brushOrigin.y())% pm.height();
+ int srcY = int(rect.y() - state()->brushOrigin.y()) % pm.height();
if (srcY < 0)
srcY = pm.height() + srcY;
while (!rectIsFilled) {
@@ -350,7 +348,7 @@ void QBlitterPaintEngine::fillRect(const QRectF &rect, const QBrush &brush)
blitWidth = transformedRect.right() -x;
if (y + blitHeight > transformedRect.bottom())
blitHeight = transformedRect.bottom() - y;
- const QClipData *clipData = d->raster->d_func()->clip();
+ const QClipData *clipData = clip();
if (clipData->hasRectClip) {
QRect targetRect = QRect(x,y,blitWidth,blitHeight).intersected(clipData->clipRect);
if (targetRect.isValid()) {
@@ -434,7 +432,7 @@ void QBlitterPaintEngine::penChanged()
Q_D(QBlitterPaintEngine);
d->lock();
d->raster->penChanged();
- d->capabillities->updateDrawRectBits(STATE_PEN_ENABLED,qpen_style(d->state->pen) != Qt::NoPen);
+ d->capabillities->updateState(STATE_PEN_ENABLED,qpen_style(state()->pen) != Qt::NoPen);
}
void QBlitterPaintEngine::brushChanged()
@@ -442,11 +440,11 @@ void QBlitterPaintEngine::brushChanged()
Q_D(QBlitterPaintEngine);
d->raster->brushChanged();
- bool solid = qbrush_style(d->state->brush) == Qt::SolidPattern;
+ bool solid = qbrush_style(state()->brush) == Qt::SolidPattern;
- d->capabillities->updateDrawRectBits(STATE_BRUSH_PATTERN, !solid);
- d->capabillities->updateDrawRectBits(STATE_BRUSH_ALPHA,
- qbrush_color(d->state->brush).alpha() < 255);
+ d->capabillities->updateState(STATE_BRUSH_PATTERN, !solid);
+ d->capabillities->updateState(STATE_BRUSH_ALPHA,
+ qbrush_color(state()->brush).alpha() < 255);
}
void QBlitterPaintEngine::brushOriginChanged()
@@ -460,8 +458,8 @@ void QBlitterPaintEngine::opacityChanged()
Q_D(QBlitterPaintEngine);
d->raster->opacityChanged();
- bool translucent = d->state->opacity < 1;
- d->capabillities->updateAllWithBits(STATE_ALPHA,translucent);
+ bool translucent = state()->opacity < 1;
+ d->capabillities->updateState(STATE_ALPHA,translucent);
}
void QBlitterPaintEngine::compositionModeChanged()
@@ -469,10 +467,10 @@ void QBlitterPaintEngine::compositionModeChanged()
Q_D(QBlitterPaintEngine);
d->raster->compositionModeChanged();
- bool nonTrivial = d->state->composition_mode != QPainter::CompositionMode_SourceOver
- && d->state->composition_mode != QPainter::CompositionMode_Source;
+ bool nonTrivial = state()->composition_mode != QPainter::CompositionMode_SourceOver
+ && state()->composition_mode != QPainter::CompositionMode_Source;
- d->capabillities->updateAllWithBits(STATE_BLENDING_COMPLEX,nonTrivial);
+ d->capabillities->updateState(STATE_BLENDING_COMPLEX,nonTrivial);
}
void QBlitterPaintEngine::renderHintsChanged()
@@ -480,9 +478,8 @@ void QBlitterPaintEngine::renderHintsChanged()
Q_D(QBlitterPaintEngine);
d->raster->renderHintsChanged();
- bool aa = d->state->renderHints & QPainter::Antialiasing;
- d->capabillities->updateFillRectBits(STATE_ANTIALIASING, aa);
- d->capabillities->updateDrawRectBits(STATE_ANTIALIASING, aa);
+ bool aa = state()->renderHints & QPainter::Antialiasing;
+ d->capabillities->updateState(STATE_ANTIALIASING, aa);
}
@@ -491,9 +488,10 @@ void QBlitterPaintEngine::transformChanged()
Q_D(QBlitterPaintEngine);
d->raster->transformChanged();
- QTransform::TransformationType type = d->state->matrix.type();
+ QTransform::TransformationType type = state()->matrix.type();
- d->capabillities->updateAllWithBits(STATE_XFORM_COMPLEX, type > QTransform::TxScale);
+ d->capabillities->updateState(STATE_XFORM_COMPLEX, type > QTransform::TxScale);
+ d->capabillities->updateState(STATE_XFORM_SCALE, type > QTransform::TxTranslate);
d->hasXForm = type >= QTransform::TxTranslate;
@@ -504,7 +502,7 @@ void QBlitterPaintEngine::drawRects(const QRect *rects, int rectCount)
Q_D(QBlitterPaintEngine);
if (d->capabillities->canBlitterDrawRectMask()) {
for (int i=0; i<rectCount; ++i) {
- d->fillRect(rects[i], qbrush_color(d->state->brush));
+ d->fillRect(rects[i], qbrush_color(state()->brush));
}
} else {
d->pmData->markRasterOverlay(rects,rectCount);
@@ -517,7 +515,7 @@ void QBlitterPaintEngine::drawRects(const QRectF *rects, int rectCount)
Q_D(QBlitterPaintEngine);
if (d->capabillities->canBlitterDrawRectMask()) {
for (int i=0; i<rectCount; ++i) {
- d->fillRect(rects[i], qbrush_color(d->state->brush));
+ d->fillRect(rects[i], qbrush_color(state()->brush));
}
} else {
d->pmData->markRasterOverlay(rects,rectCount);
@@ -535,7 +533,7 @@ void QBlitterPaintEngine::drawPixmap(const QRectF &r, const QPixmap &pm, const Q
if (d->hasXForm) {
targetRect = state()->matrix.mapRect(r);
}
- const QClipData *clipData = d->raster->d_func()->clip();
+ const QClipData *clipData = clip();
if (clipData) {
if (clipData->hasRectClip) {
d->clipAndDrawPixmap(clipData->clipRect,targetRect,pm,sr);
@@ -600,7 +598,6 @@ void QBlitterPaintEngine::setState(QPainterState *s)
d->lock();
QPaintEngineEx::setState(s);
d->raster->setState(s);
- d->state = (QRasterPaintEngineState *) s;
clipEnabledChanged();
penChanged();
diff --git a/src/gui/painting/qpaintengine_blitter_p.h b/src/gui/painting/qpaintengine_blitter_p.h
index d436993..3a2fce5 100644
--- a/src/gui/painting/qpaintengine_blitter_p.h
+++ b/src/gui/painting/qpaintengine_blitter_p.h
@@ -64,7 +64,6 @@ public:
private:
QRasterPaintEngine *raster() const;
-
};
QT_END_NAMESPACE
diff --git a/src/gui/painting/qwindowsurface.cpp b/src/gui/painting/qwindowsurface.cpp
index 34c2936..20594c4 100644
--- a/src/gui/painting/qwindowsurface.cpp
+++ b/src/gui/painting/qwindowsurface.cpp
@@ -52,7 +52,11 @@ public:
QWindowSurfacePrivate(QWidget *w) : window(w), staticContentsSupport(false) {}
QWidget *window;
+#if !defined(Q_WS_LITE)
QRect geometry;
+#else
+ QSize size;
+#endif //Q_WS_LITE
QRegion staticContents;
QList<QImage*> bufferImages;
bool staticContentsSupport;
@@ -144,6 +148,7 @@ void QWindowSurface::endPaint(const QRegion &)
d_ptr->bufferImages.clear();
}
+#if !defined(Q_WS_LITE)
/*!
Sets the currently allocated area to be the given \a rect.
@@ -164,6 +169,17 @@ QRect QWindowSurface::geometry() const
{
return d_ptr->geometry;
}
+#else
+void QWindowSurface::resize(const QSize &size)
+{
+ d_ptr->size = size;
+}
+
+QSize QWindowSurface::size() const
+{
+ return d_ptr->size;
+}
+#endif //Q_WS_LITE
/*!
Scrolls the given \a area \a dx pixels to the right and \a dy
@@ -349,41 +365,4 @@ void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset)
}
}
-
-#ifdef Q_WS_LITE
-/*!
-Requests setting the window flags of this surface to \a type. Returns the actual flags set.
-*/
-Qt::WindowFlags QWindowSurface::setWindowFlags(Qt::WindowFlags type)
-{
- Q_UNUSED(type);
- qDebug() << "QWindowSurface::setWindowFlags" << hex << type;
- return Qt::Window;
-}
-
-/*!
- Returns the effective window flags for this surface.
-*/
-Qt::WindowFlags QWindowSurface::windowFlags() const
-{
- return Qt::Window;
-}
-
-/*!
-Reimplemented in subclasses to show the surface if \a visible is \c true, and hide it if \a visible is \c false.
-*/
-
-void QWindowSurface::setVisible(bool visible)
-{
- Q_UNUSED(visible);
-}
-
-
-WId QWindowSurface::winId() const
-{
- return WId(0);
-}
-
-#endif
-
QT_END_NAMESPACE
diff --git a/src/gui/painting/qwindowsurface_p.h b/src/gui/painting/qwindowsurface_p.h
index 5930704..3a14b0f 100644
--- a/src/gui/painting/qwindowsurface_p.h
+++ b/src/gui/painting/qwindowsurface_p.h
@@ -63,6 +63,7 @@ class QRect;
class QPoint;
class QImage;
class QWindowSurfacePrivate;
+class QPlatformWindow;
class Q_GUI_EXPORT QWindowSurface
{
@@ -75,8 +76,13 @@ public:
virtual QPaintDevice *paintDevice() = 0;
virtual void flush(QWidget *widget, const QRegion &region,
const QPoint &offset) = 0;
+#if !defined(Q_WS_LITE)
virtual void setGeometry(const QRect &rect);
QRect geometry() const;
+#else
+ virtual void resize(const QSize &size);
+ QSize size() const;
+#endif
virtual bool scroll(const QRegion &area, int dx, int dy);
@@ -89,16 +95,6 @@ public:
virtual QPoint offset(const QWidget *widget) const;
inline QRect rect(const QWidget *widget) const;
-#ifdef Q_WS_LITE
- virtual void setVisible(bool visible);
- virtual Qt::WindowFlags setWindowFlags(Qt::WindowFlags type);
- virtual Qt::WindowFlags windowFlags() const;
- virtual WId winId() const;
-
- virtual void setWindowTitle(const QString &) {}
- virtual void raise() { qWarning("This plugin does not support raise()"); }
- virtual void lower() { qWarning("This plugin does not support lower()"); }
-#endif
bool hasStaticContentsSupport() const;
void setStaticContents(const QRegion &region);
diff --git a/src/gui/text/qfont.cpp b/src/gui/text/qfont.cpp
index 01e4ef6..2c2ceb1 100644
--- a/src/gui/text/qfont.cpp
+++ b/src/gui/text/qfont.cpp
@@ -75,6 +75,10 @@
#ifdef Q_OS_SYMBIAN
#include "qt_s60_p.h"
#endif
+#ifdef Q_WS_LITE
+#include <QtGui/qplatformscreen_lite.h>
+#include <QtGui/private/qapplication_p.h>
+#endif
#include <QMutexLocker>
@@ -173,7 +177,16 @@ Q_GUI_EXPORT int qt_defaultDpiX()
screen = subScreens.at(0);
dpi = qRound(screen->width() / (screen->physicalWidth() / qreal(25.4)));
#elif defined(Q_WS_LITE)
- dpi = 72;
+ QPlatformIntegration *pi = QApplicationPrivate::platformIntegration();
+ if (pi) {
+ QPlatformScreen *screen = QApplicationPrivate::platformIntegration()->screens().at(0);
+ const QSize screenSize = screen->geometry().size();
+ const QSize physicalSize = screen->physicalSize();
+ dpi = qRound(screenSize.width() / (physicalSize.width() / qreal(25.4)));
+ } else {
+ //PI has not been initialised, or it is being initialised. Give a default dpi
+ dpi = 100;
+ }
#elif defined(Q_OS_SYMBIAN)
dpi = S60->defaultDpiX;
#endif // Q_WS_X11
@@ -203,7 +216,16 @@ Q_GUI_EXPORT int qt_defaultDpiY()
screen = subScreens.at(0);
dpi = qRound(screen->height() / (screen->physicalHeight() / qreal(25.4)));
#elif defined(Q_WS_LITE)
- dpi = 72;
+ QPlatformIntegration *pi = QApplicationPrivate::platformIntegration();
+ if (pi) {
+ QPlatformScreen *screen = QApplicationPrivate::platformIntegration()->screens().at(0);
+ const QSize screenSize = screen->geometry().size();
+ const QSize physicalSize = screen->physicalSize();
+ dpi = qRound(screenSize.height() / (physicalSize.height() / qreal(25.4)));
+ } else {
+ //PI has not been initialised, or it is being initialised. Give a default dpi
+ dpi = 100;
+ }
#elif defined(Q_OS_SYMBIAN)
dpi = S60->defaultDpiY;
#endif // Q_WS_X11
diff --git a/src/plugins/graphicssystems/trace/qgraphicssystem_trace.cpp b/src/plugins/graphicssystems/trace/qgraphicssystem_trace.cpp
index 6bf9d6b..695050e 100644
--- a/src/plugins/graphicssystems/trace/qgraphicssystem_trace.cpp
+++ b/src/plugins/graphicssystems/trace/qgraphicssystem_trace.cpp
@@ -98,7 +98,11 @@ QPaintDevice *QTraceWindowSurface::paintDevice()
{
if (!buffer) {
buffer = new QPaintBuffer;
+#ifdef Q_WS_LITE
+ buffer->setBoundingRect(QRect(QPoint(), size()));
+#else
buffer->setBoundingRect(geometry());
+#endif
}
return buffer;
}
diff --git a/src/plugins/platforms/directfb/directfb.pro b/src/plugins/platforms/directfb/directfb.pro
index f8fccaa..f81ec31 100644
--- a/src/plugins/platforms/directfb/directfb.pro
+++ b/src/plugins/platforms/directfb/directfb.pro
@@ -13,17 +13,19 @@ INCLUDEPATH += $$DIRECTFB_INCLUDEPATH
LIBS += $$DIRECTFB_LIBS
SOURCES = main.cpp \
- qplatformintegration_directfb.cpp \
- qwindowsurface_directfb.cpp \
- qblitter_directfb.cpp \
+ qdirectfbintegration.cpp \
+ qdirectfbwindowsurface.cpp \
+ qdirectfbblitter.cpp \
qdirectfbconvenience.cpp \
qdirectfbinput.cpp \
- qdirectfbcursor.cpp
-HEADERS = qplatformintegration_directfb.h \
- qwindowsurface_directfb.h \
- qblitter_directfb.h \
+ qdirectfbcursor.cpp \
+ qdirectfbwindow.cpp
+HEADERS = qdirectfbintegration.h \
+ qdirectfbwindowsurface.h \
+ qdirectfbblitter.h \
qdirectfbconvenience.h \
qdirectfbinput.h \
- qdirectfbcursor.h
+ qdirectfbcursor.h \
+ qdirectfbwindow.h
target.path += $$[QT_INSTALL_PLUGINS]/platforms
INSTALLS += target
diff --git a/src/plugins/platforms/directfb/main.cpp b/src/plugins/platforms/directfb/main.cpp
index 1f0f081..9c7bcf6 100644
--- a/src/plugins/platforms/directfb/main.cpp
+++ b/src/plugins/platforms/directfb/main.cpp
@@ -40,7 +40,7 @@
****************************************************************************/
#include <QtGui/QPlatformIntegrationPlugin>
-#include "qplatformintegration_directfb.h"
+#include "qdirectfbintegration.h"
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qblitter_directfb.cpp b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
index 08dee0a..15bb18b 100644
--- a/src/plugins/platforms/directfb/qblitter_directfb.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
@@ -1,4 +1,4 @@
-#include "qblitter_directfb.h"
+#include "qdirectfbblitter.h"
#include "qdirectfbconvenience.h"
#include <QtGui/private/qpixmap_blitter_p.h>
@@ -28,6 +28,7 @@ QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, IDirectFBSurface *surface)
dfb->CreateSurface(dfb,&surfaceDesc, &m_surface);
m_surface->Clear(m_surface,0,0,0,0);
}
+
}
QDirectFbBlitter::~QDirectFbBlitter()
@@ -59,14 +60,18 @@ void QDirectFbBlitter::drawPixmap(const QRectF &rect, const QPixmap &pixmap, con
IDirectFBSurface *s = dfbBlitter->m_surface;
- quint32 blittingFlags = pixmap.hasAlpha()? DSBLIT_BLEND_ALPHACHANNEL : DSBLIT_NOFX;
+ DFBSurfaceBlittingFlags blittingFlags = DSBLIT_NOFX;
+ DFBSurfacePorterDuffRule porterDuff = DSPD_SRC;
+ if (pixmap.hasAlpha()) {
+ blittingFlags = DSBLIT_BLEND_ALPHACHANNEL;
+ porterDuff = DSPD_SRC_OVER;
+ }
- s->SetBlittingFlags(s, DFBSurfaceBlittingFlags(blittingFlags));
m_surface->SetBlittingFlags(m_surface, DFBSurfaceBlittingFlags(blittingFlags));
- m_surface->SetPorterDuff(m_surface,DSPD_SRC_OVER);
+ m_surface->SetPorterDuff(m_surface,porterDuff);
m_surface->SetDstBlendFunction(m_surface,DSBF_INVSRCALPHA);
- const DFBRectangle sRect = { srcRect.x(), srcRect.y(), rect.width(), rect.height() };
+ const DFBRectangle sRect = { srcRect.x(), srcRect.y(), srcRect.width(), srcRect.height() };
DFBResult result;
if (rect.width() == srcRect.width() && rect.height() == srcRect.height())
diff --git a/src/plugins/platforms/directfb/qblitter_directfb.h b/src/plugins/platforms/directfb/qdirectfbblitter.h
index 85a303a..85a303a 100644
--- a/src/plugins/platforms/directfb/qblitter_directfb.h
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.h
diff --git a/src/plugins/platforms/directfb/qdirectfbconvenience.cpp b/src/plugins/platforms/directfb/qdirectfbconvenience.cpp
index 8594c09..adf9687 100644
--- a/src/plugins/platforms/directfb/qdirectfbconvenience.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbconvenience.cpp
@@ -1,5 +1,5 @@
#include "qdirectfbconvenience.h"
-#include "qblitter_directfb.h"
+#include "qdirectfbblitter.h"
#include <private/qpixmap_blitter_p.h>
diff --git a/src/plugins/platforms/directfb/qdirectfbcursor.cpp b/src/plugins/platforms/directfb/qdirectfbcursor.cpp
index bb7088f..2edae45 100644
--- a/src/plugins/platforms/directfb/qdirectfbcursor.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbcursor.cpp
@@ -1,9 +1,6 @@
#include "qdirectfbcursor.h"
-#include "qblitter_directfb.h"
-#include "qplatformintegration_directfb.h"
#include "qdirectfbconvenience.h"
-#include <private/qpixmap_blitter_p.h>
QDirectFBCursor::QDirectFBCursor(QPlatformScreen* screen) :
QGraphicsSystemCursor(screen), surface(0)
diff --git a/src/plugins/platforms/directfb/qdirectfbinput.cpp b/src/plugins/platforms/directfb/qdirectfbinput.cpp
index 74a38a4..90c3348 100644
--- a/src/plugins/platforms/directfb/qdirectfbinput.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbinput.cpp
@@ -78,16 +78,13 @@ void QDirectFbInput::addWindow(DFBWindowID id, QWidget *tlw)
window->AttachEventBuffer(window,eventBuffer);
}
-void QDirectFbInput::removeWindow(QWidget *tlw)
+void QDirectFbInput::removeWindow(WId wId)
{
- DFBWindowID id = tlwMap.key(tlw,0);
- if (id) {
- IDirectFBWindow *window;
- dfbDisplayLayer->GetWindow(dfbDisplayLayer,id, &window);
+ IDirectFBWindow *window;
+ dfbDisplayLayer->GetWindow(dfbDisplayLayer,wId, &window);
- window->DetachEventBuffer(window,eventBuffer);
- tlwMap.remove(id);
- }
+ window->DetachEventBuffer(window,eventBuffer);
+ tlwMap.remove(wId);
}
void QDirectFbInput::handleEvents()
diff --git a/src/plugins/platforms/directfb/qdirectfbinput.h b/src/plugins/platforms/directfb/qdirectfbinput.h
index 31aa082..016e7f1 100644
--- a/src/plugins/platforms/directfb/qdirectfbinput.h
+++ b/src/plugins/platforms/directfb/qdirectfbinput.h
@@ -9,6 +9,8 @@
#include <QPoint>
#include <QEvent>
+#include <QtGui/qwindowdefs.h>
+
#include <directfb.h>
class InputSocketWaiter : public QThread
@@ -35,7 +37,7 @@ class QDirectFbInput : public QObject
public:
static QDirectFbInput *instance();
void addWindow(DFBWindowID id, QWidget *tlw);
- void removeWindow(QWidget *tlw);
+ void removeWindow(WId wId);
public slots:
void handleEvents();
diff --git a/src/plugins/platforms/directfb/qplatformintegration_directfb.cpp b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
index c70bb64..60fce7e 100644
--- a/src/plugins/platforms/directfb/qplatformintegration_directfb.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
@@ -39,11 +39,12 @@
**
****************************************************************************/
-#include "qplatformintegration_directfb.h"
-#include "qwindowsurface_directfb.h"
-#include "qblitter_directfb.h"
+#include "qdirectfbintegration.h"
+#include "qdirectfbwindowsurface.h"
+#include "qdirectfbblitter.h"
#include "qdirectfbconvenience.h"
#include "qdirectfbcursor.h"
+#include "qdirectfbwindow.h"
#include <private/qwindowsurface_raster_p.h>
#include <private/qpixmap_raster_p.h>
@@ -105,9 +106,15 @@ QPixmapData *QDirectFbIntegration::createPixmapData(QPixmapData::PixelType type)
return new QBlittablePixmapData(type);
}
-QWindowSurface *QDirectFbIntegration::createWindowSurface(QWidget *widget) const
+QPlatformWindow *QDirectFbIntegration::createPlatformWindow(QWidget *widget, WId winId) const
{
- return new QDirectFbWindowSurface (widget);
+ Q_UNUSED(winId);
+ return new QDirectFbWindow(widget);
+}
+
+QWindowSurface *QDirectFbIntegration::createWindowSurface(QWidget *widget, WId winId) const
+{
+ return new QDirectFbWindowSurface(widget,winId);
}
QBlittable *QDirectFbIntegration::createBlittable(const QSize &size) const
diff --git a/src/plugins/platforms/directfb/qplatformintegration_directfb.h b/src/plugins/platforms/directfb/qdirectfbintegration.h
index f74a81d..c0e770f 100644
--- a/src/plugins/platforms/directfb/qplatformintegration_directfb.h
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.h
@@ -54,6 +54,7 @@ class QDirectFBCursor;
class QDirectFbScreen : public QPlatformScreen
{
+Q_OBJECT
public:
QDirectFbScreen(int display);
~QDirectFbScreen();
@@ -82,7 +83,8 @@ public:
QDirectFbIntegration();
QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
- QWindowSurface *createWindowSurface(QWidget *widget) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId = 0) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
QBlittable *createBlittable(const QSize &size) const;
QList<QPlatformScreen *> screens() const { return mScreens; }
diff --git a/src/plugins/platforms/directfb/qwindowsurface_directfb.cpp b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
index afe34b7..d88953e 100644
--- a/src/plugins/platforms/directfb/qwindowsurface_directfb.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
@@ -38,23 +38,16 @@
** $QT_END_LICENSE$
**
****************************************************************************/
+#include "qdirectfbwindow.h"
+#include "qdirectfbinput.h"
-#include "qwindowsurface_directfb.h"
-#include "qplatformintegration_directfb.h"
-#include "qblitter_directfb.h"
-#include "qdirectfbconvenience.h"
-#include <private/qpixmap_blitter_p.h>
+#include <QWidget>
-#include <QtCore/qdebug.h>
+#include <directfb.h>
-QT_BEGIN_NAMESPACE
-
-QDirectFbWindowSurface::QDirectFbWindowSurface(QWidget *window)
- : QWindowSurface(window), m_pixmap(0), m_pmdata(0),
- m_dfbWindow(0), m_dfbSurface(0)
+QDirectFbWindow::QDirectFbWindow(QWidget *tlw)
+ : QPlatformWindow(tlw)
{
- window->setWindowSurface(this);
-
IDirectFBDisplayLayer *layer = QDirectFbConvenience::dfbDisplayLayer();
DFBDisplayLayerConfig layerConfig;
layer->GetConfiguration(layer,&layerConfig);
@@ -66,10 +59,10 @@ QDirectFbWindowSurface::QDirectFbWindowSurface(QWidget *window)
|DWDESC_OPTIONS
#endif
|DWDESC_CAPS);
- description.width = window->rect().width();
- description.height = window->rect().height();
- description.posx = window->rect().x();
- description.posy = window->rect().y();
+ description.width = tlw->rect().width();
+ description.height = tlw->rect().height();
+ description.posx = tlw->rect().x();
+ description.posy = tlw->rect().y();
if (layerConfig.surface_caps & DSCAPS_PREMULTIPLIED)
description.surface_caps = DSCAPS_PREMULTIPLIED;
@@ -86,102 +79,38 @@ QDirectFbWindowSurface::QDirectFbWindowSurface(QWidget *window)
DirectFBError("QDirectFbGraphicsSystemScreen: failed to create window",result);
}
+ m_dfbWindow->SetOpacity(m_dfbWindow,0xff);
+
DFBWindowID id;
m_dfbWindow->GetID(m_dfbWindow, &id);
- QDirectFbInput::instance()->addWindow(id,window);
-
- m_dfbWindow->GetSurface(m_dfbWindow,&m_dfbSurface);
-
- QDirectFbBlitter *blitter = new QDirectFbBlitter(window->rect().size(), m_dfbSurface);
- m_pmdata = new QBlittablePixmapData(QPixmapData::PixmapType);
- m_pmdata->setBlittable(blitter);
- m_pixmap = new QPixmap(m_pmdata);
+ QDirectFbInput::instance()->addWindow(id,tlw);
}
-QDirectFbWindowSurface::~QDirectFbWindowSurface()
+QDirectFbWindow::~QDirectFbWindow()
{
- QDirectFbInput::instance()->removeWindow(this->window());
+ QDirectFbInput::instance()->removeWindow(winId());
m_dfbWindow->Destroy(m_dfbWindow);
}
-QPaintDevice *QDirectFbWindowSurface::paintDevice()
-{
- return m_pixmap;
-}
-
-void QDirectFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+void QDirectFbWindow::setGeometry(const QRect &rect)
{
- m_pmdata->blittable()->unlock();
-
- const quint8 windowOpacity = quint8(widget->windowOpacity() * 0xff);
- m_dfbWindow->SetOpacity(m_dfbWindow,windowOpacity);
-
- QVector<QRect> rects = region.rects();
- for (int i = 0 ; i < rects.size(); i++) {
- const QRect rect = rects.at(i);
- DFBRegion dfbReg = { rect.x() + offset.x(),rect.y() + offset.y(),rect.right() + offset.x(),rect.bottom() + offset.y()};
- m_dfbSurface->Flip(m_dfbSurface, &dfbReg, DFBSurfaceFlipFlags(DSFLIP_BLIT|DSFLIP_ONSYNC));
- }
-}
-
-void QDirectFbWindowSurface::setGeometry(const QRect &rect)
-{
- m_pmdata->blittable()->unlock();
-
- QWindowSurface::setGeometry(rect);
+ QPlatformWindow::setGeometry(rect);
m_dfbWindow->SetBounds(m_dfbWindow, rect.x(),rect.y(),
rect.width(), rect.height());
- //Have to add 1 ref ass it will be removed by deleting the old blitter in setBlittable
- m_dfbSurface->AddRef(m_dfbSurface);
- QDirectFbBlitter *blitter = new QDirectFbBlitter(rect.size(),m_dfbSurface);
- m_pmdata->setBlittable(blitter);
}
-static inline void scrollSurface(IDirectFBSurface *surface, const QRect &r, int dx, int dy)
+void QDirectFbWindow::setOpacity(qreal level)
{
- const DFBRectangle rect = { r.x(), r.y(), r.width(), r.height() };
- surface->Blit(surface, surface, &rect, r.x() + dx, r.y() + dy);
- const DFBRegion region = { rect.x + dx, rect.y + dy, r.right() + dx, r.bottom() + dy };
- surface->Flip(surface, &region, DFBSurfaceFlipFlags(DSFLIP_BLIT));
-}
-
-bool QDirectFbWindowSurface::scroll(const QRegion &area, int dx, int dy)
-{
- m_pmdata->blittable()->unlock();
-
- if (!m_dfbSurface || area.isEmpty())
- return false;
- m_dfbSurface->SetBlittingFlags(m_dfbSurface, DSBLIT_NOFX);
- if (area.rectCount() == 1) {
- scrollSurface(m_dfbSurface, area.boundingRect(), dx, dy);
- } else {
- const QVector<QRect> rects = area.rects();
- const int n = rects.size();
- for (int i=0; i<n; ++i) {
- scrollSurface(m_dfbSurface, rects.at(i), dx, dy);
- }
- }
- return true;
-}
-
-void QDirectFbWindowSurface::beginPaint(const QRegion &region)
-{
- Q_UNUSED(region);
-}
-
-void QDirectFbWindowSurface::endPaint(const QRegion &region)
-{
- Q_UNUSED(region);
+ const quint8 windowOpacity = quint8(level * 0xff);
+ m_dfbWindow->SetOpacity(m_dfbWindow,windowOpacity);
}
-void QDirectFbWindowSurface::setVisible(bool visible)
+void QDirectFbWindow::setVisible(bool visible)
{
- m_pmdata->blittable()->unlock();
-
if (visible) {
- int x = this->geometry().x();
- int y = this->geometry().y();
+ int x = geometry().x();
+ int y = geometry().y();
m_dfbWindow->MoveTo(m_dfbWindow,x,y);
} else {
IDirectFBDisplayLayer *displayLayer;
@@ -193,7 +122,7 @@ void QDirectFbWindowSurface::setVisible(bool visible)
}
}
-Qt::WindowFlags QDirectFbWindowSurface::setWindowFlags(Qt::WindowFlags flags)
+Qt::WindowFlags QDirectFbWindow::setWindowFlags(Qt::WindowFlags flags)
{
switch (flags & Qt::WindowType_Mask) {
case Qt::ToolTip: {
@@ -210,22 +139,19 @@ Qt::WindowFlags QDirectFbWindowSurface::setWindowFlags(Qt::WindowFlags flags)
return flags;
}
-void QDirectFbWindowSurface::raise()
+void QDirectFbWindow::raise()
{
m_dfbWindow->RaiseToTop(m_dfbWindow);
}
-void QDirectFbWindowSurface::lower()
+void QDirectFbWindow::lower()
{
m_dfbWindow->LowerToBottom(m_dfbWindow);
}
-WId QDirectFbWindowSurface::winId() const
+WId QDirectFbWindow::winId() const
{
DFBWindowID id;
m_dfbWindow->GetID(m_dfbWindow, &id);
return WId(id);
}
-
-
-QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.h b/src/plugins/platforms/directfb/qdirectfbwindow.h
new file mode 100644
index 0000000..d5fd408
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbwindow.h
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenVG module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDIRECTFBWINDOW_H
+#define QDIRECTFBWINDOW_H
+
+#include <QPlatformWindow>
+
+#include "qdirectfbconvenience.h"
+
+QT_BEGIN_NAMESPACE
+
+class QDirectFbWindow : public QPlatformWindow
+{
+public:
+ QDirectFbWindow(QWidget *tlw);
+ ~QDirectFbWindow();
+
+ void setGeometry(const QRect &rect);
+ void setOpacity(qreal level);
+
+ void setVisible(bool visible);
+
+ Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags);
+ void raise();
+ void lower();
+ WId winId() const;
+
+private:
+ IDirectFBWindow *m_dfbWindow;
+};
+
+QT_END_NAMESPACE
+
+#endif // QDIRECTFBWINDOW_H
diff --git a/src/plugins/platforms/directfb/qdirectfbwindowsurface.cpp b/src/plugins/platforms/directfb/qdirectfbwindowsurface.cpp
new file mode 100644
index 0000000..4ca9a72
--- /dev/null
+++ b/src/plugins/platforms/directfb/qdirectfbwindowsurface.cpp
@@ -0,0 +1,141 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtOpenVG module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** 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, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdirectfbwindowsurface.h"
+#include "qdirectfbintegration.h"
+#include "qdirectfbblitter.h"
+#include "qdirectfbconvenience.h"
+#include <private/qpixmap_blitter_p.h>
+
+#include <QtCore/qdebug.h>
+
+QT_BEGIN_NAMESPACE
+
+QDirectFbWindowSurface::QDirectFbWindowSurface(QWidget *window, WId wId)
+ : QWindowSurface(window), m_pixmap(0), m_pmdata(0), m_dfbSurface(0)
+{
+
+ IDirectFBDisplayLayer *layer = QDirectFbConvenience::dfbDisplayLayer();
+
+ DFBWindowID id(wId);
+ IDirectFBWindow *dfbWindow;
+
+ layer->GetWindow(layer,id,&dfbWindow);
+
+ dfbWindow->GetSurface(dfbWindow,&m_dfbSurface);
+//WRONGSIZE
+ QDirectFbBlitter *blitter = new QDirectFbBlitter(window->rect().size(), m_dfbSurface);
+ m_pmdata = new QBlittablePixmapData(QPixmapData::PixmapType);
+ m_pmdata->setBlittable(blitter);
+ m_pixmap = new QPixmap(m_pmdata);
+}
+
+QDirectFbWindowSurface::~QDirectFbWindowSurface()
+{
+
+}
+
+QPaintDevice *QDirectFbWindowSurface::paintDevice()
+{
+ return m_pixmap;
+}
+
+void QDirectFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
+{
+ Q_UNUSED(widget);
+ m_pmdata->blittable()->unlock();
+
+ QVector<QRect> rects = region.rects();
+ for (int i = 0 ; i < rects.size(); i++) {
+ const QRect rect = rects.at(i);
+ DFBRegion dfbReg = { rect.x() + offset.x(),rect.y() + offset.y(),rect.right() + offset.x(),rect.bottom() + offset.y()};
+ m_dfbSurface->Flip(m_dfbSurface, &dfbReg, DFBSurfaceFlipFlags(DSFLIP_BLIT|DSFLIP_ONSYNC));
+ }
+}
+
+void QDirectFbWindowSurface::resize(const QSize &size)
+{
+ QWindowSurface::resize(size);
+
+ //Have to add 1 ref ass it will be removed by deleting the old blitter in setBlittable
+ m_dfbSurface->AddRef(m_dfbSurface);
+ QDirectFbBlitter *blitter = new QDirectFbBlitter(size,m_dfbSurface);
+ m_pmdata->setBlittable(blitter);
+}
+
+static inline void scrollSurface(IDirectFBSurface *surface, const QRect &r, int dx, int dy)
+{
+ const DFBRectangle rect = { r.x(), r.y(), r.width(), r.height() };
+ surface->Blit(surface, surface, &rect, r.x() + dx, r.y() + dy);
+ const DFBRegion region = { rect.x + dx, rect.y + dy, r.right() + dx, r.bottom() + dy };
+ surface->Flip(surface, &region, DFBSurfaceFlipFlags(DSFLIP_BLIT));
+}
+
+bool QDirectFbWindowSurface::scroll(const QRegion &area, int dx, int dy)
+{
+ m_pmdata->blittable()->unlock();
+
+ if (!m_dfbSurface || area.isEmpty())
+ return false;
+ m_dfbSurface->SetBlittingFlags(m_dfbSurface, DSBLIT_NOFX);
+ if (area.rectCount() == 1) {
+ scrollSurface(m_dfbSurface, area.boundingRect(), dx, dy);
+ } else {
+ const QVector<QRect> rects = area.rects();
+ const int n = rects.size();
+ for (int i=0; i<n; ++i) {
+ scrollSurface(m_dfbSurface, rects.at(i), dx, dy);
+ }
+ }
+ return true;
+}
+
+void QDirectFbWindowSurface::beginPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+}
+
+void QDirectFbWindowSurface::endPaint(const QRegion &region)
+{
+ Q_UNUSED(region);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qwindowsurface_directfb.h b/src/plugins/platforms/directfb/qdirectfbwindowsurface.h
index 2f31513..d48f534 100644
--- a/src/plugins/platforms/directfb/qwindowsurface_directfb.h
+++ b/src/plugins/platforms/directfb/qdirectfbwindowsurface.h
@@ -49,37 +49,26 @@
QT_BEGIN_NAMESPACE
-class QDirectFbGraphicsSystemScreen;
-
class QDirectFbWindowSurface : public QWindowSurface
{
public:
- QDirectFbWindowSurface(QWidget *window);
+ QDirectFbWindowSurface(QWidget *window, WId wid);
~QDirectFbWindowSurface();
QPaintDevice *paintDevice();
void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
- void setGeometry(const QRect &rect);
+ void resize (const QSize &size);
bool scroll(const QRegion &area, int dx, int dy);
void beginPaint(const QRegion &region);
void endPaint(const QRegion &region);
- void setVisible(bool visible);
- Qt::WindowFlags setWindowFlags(Qt::WindowFlags type);
-
- void raise();
- void lower();
-
- WId winId() const;
-
private:
void lockSurfaceToImage();
QPixmap *m_pixmap;
QBlittablePixmapData *m_pmdata;
- IDirectFBWindow *m_dfbWindow;
IDirectFBSurface *m_dfbSurface;
};
diff --git a/src/plugins/platforms/fb_base/fb_base.cpp b/src/plugins/platforms/fb_base/fb_base.cpp
index a2a6609..f2009c1 100644
--- a/src/plugins/platforms/fb_base/fb_base.cpp
+++ b/src/plugins/platforms/fb_base/fb_base.cpp
@@ -81,7 +81,7 @@ void QGraphicsSystemSoftwareCursor::changeCursor(QCursor * widgetCursor, QWidget
screen->setDirty(currentRect);
}
-QFbPlatformScreen::QFbPlatformScreen() : cursor(0), mGeometry(), mDepth(16), mFormat(QImage::Format_RGB16), mScreenImage(0), compositePainter(0), isUpToDate(false)
+QFbScreen::QFbScreen() : cursor(0), mGeometry(), mDepth(16), mFormat(QImage::Format_RGB16), mScreenImage(0), compositePainter(0), isUpToDate(false)
{
mScreenImage = new QImage(mGeometry.size(), mFormat);
redrawTimer.setSingleShot(true);
@@ -89,7 +89,7 @@ QFbPlatformScreen::QFbPlatformScreen() : cursor(0), mGeometry(), mDepth(16), mFo
QObject::connect(&redrawTimer, SIGNAL(timeout()), this, SLOT(doRedraw()));
}
-void QFbPlatformScreen::setGeometry(QRect rect)
+void QFbScreen::setGeometry(QRect rect)
{
delete mScreenImage;
mGeometry = rect;
@@ -99,17 +99,17 @@ void QFbPlatformScreen::setGeometry(QRect rect)
invalidateRectCache();
}
-void QFbPlatformScreen::setDepth(int depth)
+void QFbScreen::setDepth(int depth)
{
mDepth = depth;
}
-void QFbPlatformScreen::setPhysicalSize(QSize size)
+void QFbScreen::setPhysicalSize(QSize size)
{
mPhysicalSize = size;
}
-void QFbPlatformScreen::setFormat(QImage::Format format)
+void QFbScreen::setFormat(QImage::Format format)
{
mFormat = format;
delete mScreenImage;
@@ -118,21 +118,23 @@ void QFbPlatformScreen::setFormat(QImage::Format format)
compositePainter = 0;
}
-QFbPlatformScreen::~QFbPlatformScreen()
+QFbScreen::~QFbScreen()
{
delete compositePainter;
delete mScreenImage;
}
-void QFbPlatformScreen::setDirty(const QRect &rect)
+void QFbScreen::setDirty(const QRect &rect)
{
+
+// qDebug() << "QFbScreen::setDirty" << rect;
repaintRegion += rect;
if (!redrawTimer.isActive()) {
redrawTimer.start();
}
}
-void QFbPlatformScreen::generateRects()
+void QFbScreen::generateRects()
{
cachedRects.clear();
QRegion remainingScreen(mGeometry);
@@ -140,7 +142,10 @@ void QFbPlatformScreen::generateRects()
for (int i = 0; i < windowStack.length(); i++) {
if (remainingScreen.isEmpty())
break;
- if (!windowStack[i]->window()->testAttribute(Qt::WA_TranslucentBackground)) {
+ if (!windowStack[i]->visible())
+ continue;
+
+ if (!windowStack[i]->widget()->testAttribute(Qt::WA_TranslucentBackground)) {
remainingScreen -= windowStack[i]->geometry();
QRegion windowRegion(windowStack[i]->geometry());
windowRegion -= remainingScreen;
@@ -157,7 +162,7 @@ void QFbPlatformScreen::generateRects()
-QRegion QFbPlatformScreen::doRedraw()
+QRegion QFbScreen::doRedraw()
{
QRegion touchedRegion;
if (cursor)
@@ -197,12 +202,13 @@ QRegion QFbPlatformScreen::doRedraw()
for (int layerIndex = layer; layerIndex != -1; layerIndex--) {
if (!windowStack[layerIndex]->visible())
continue;
- if (windowStack[layerIndex]->window()->isMinimized())
+ if (windowStack[layerIndex]->widget()->isMinimized())
continue;
QRect windowRect = windowStack[layerIndex]->geometry();
QRect windowIntersect = rect.translated(-windowRect.left(),
-windowRect.top());
- compositePainter->drawImage(rect, windowStack[layerIndex]->image(),
+// qDebug() << " compositing" << layerIndex << windowStack[layerIndex]->surface->image().size();
+ compositePainter->drawImage(rect, windowStack[layerIndex]->surface->image(),
windowIntersect);
if (firstLayer) {
firstLayer = false;
@@ -224,24 +230,29 @@ QRegion QFbPlatformScreen::doRedraw()
touchedRegion += repaintRegion;
repaintRegion = QRegion();
+
+
+// qDebug() << "QFbScreen::doRedraw" << windowStack.size() << mScreenImage->size() << touchedRegion;
+
+
return touchedRegion;
}
-void QFbPlatformScreen::removeWindowSurface(QFbWindowSurface * surface)
+void QFbScreen::removeWindow(QFbWindow * surface)
{
windowStack.removeOne(surface);
invalidateRectCache();
setDirty(surface->geometry());
}
-void QFbWindowSurface::raise()
+void QFbWindow::raise()
{
mScreen->raise(this);
}
-void QFbPlatformScreen::raise(QWindowSurface * surface)
+void QFbScreen::raise(QPlatformWindow * surface)
{
- QFbWindowSurface *s = static_cast<QFbWindowSurface *>(surface);
+ QFbWindow *s = static_cast<QFbWindow *>(surface);
int index = windowStack.indexOf(s);
if (index <= 0)
return;
@@ -250,14 +261,14 @@ void QFbPlatformScreen::raise(QWindowSurface * surface)
setDirty(s->geometry());
}
-void QFbWindowSurface::lower()
+void QFbWindow::lower()
{
mScreen->lower(this);
}
-void QFbPlatformScreen::lower(QWindowSurface * surface)
+void QFbScreen::lower(QPlatformWindow * surface)
{
- QFbWindowSurface *s = static_cast<QFbWindowSurface *>(surface);
+ QFbWindow *s = static_cast<QFbWindow *>(surface);
int index = windowStack.indexOf(s);
if (index == -1 || index == (windowStack.size() - 1))
return;
@@ -266,32 +277,46 @@ void QFbPlatformScreen::lower(QWindowSurface * surface)
setDirty(s->geometry());
}
-QWidget * QFbPlatformScreen::topLevelAt(const QPoint & p) const
+QWidget * QFbScreen::topLevelAt(const QPoint & p) const
{
for(int i = 0; i < windowStack.size(); i++) {
if (windowStack[i]->geometry().contains(p, false) &&
windowStack[i]->visible() &&
- !windowStack[i]->window()->isMinimized()) {
- return windowStack[i]->window();
+ !windowStack[i]->widget()->isMinimized()) {
+ return windowStack[i]->widget();
}
}
return 0;
}
-QFbWindowSurface::QFbWindowSurface(QFbPlatformScreen *screen, QWidget *window)
- : QWindowSurface(window),
+QFbWindow::QFbWindow(QFbScreen *screen, QWidget *window)
+ :QPlatformWindow(window),
mScreen(screen),
visibleFlag(false)
{
static QAtomicInt winIdGenerator(1);
+ windowId = winIdGenerator.fetchAndAddRelaxed(1);
+}
+
+QFbWindow::~QFbWindow()
+{
+ mScreen->removeWindow(this);
+}
+
+
+QFbWindowSurface::QFbWindowSurface(QFbScreen *screen, QWidget *window)
+ : QWindowSurface(window),
+ mScreen(screen)
+{
mImage = QImage(window->size(), mScreen->format());
- windowId = winIdGenerator.fetchAndAddRelaxed(1);
+
+ platformWindow = static_cast<QFbWindow*>(window->platformWindow());
+ platformWindow->surface = this;
}
QFbWindowSurface::~QFbWindowSurface()
{
- mScreen->removeWindowSurface(this);
}
void QFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
@@ -299,6 +324,16 @@ void QFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoin
Q_UNUSED(widget);
Q_UNUSED(offset);
+
+// qDebug() << "QFbWindowSurface::flush" << region;
+
+
+ platformWindow->repaint(region);
+}
+
+
+void QFbWindow::repaint(const QRegion &region)
+{
QRect currentGeometry = geometry();
// If this is a move, redraw the previous location
if (oldGeometry != currentGeometry) {
@@ -314,19 +349,24 @@ void QFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoin
mScreen->setDirty(dirtyRegion);
}
-void QFbWindowSurface::setGeometry(const QRect &rect)
+void QFbWindowSurface::resize(const QSize &size)
{
- // store previous geometry for screen update
+ // change the widget's QImage if this is a resize
+ if (mImage.size() != size)
+ mImage = QImage(size, mScreen->format());
+ QWindowSurface::resize(size);
+}
+
+void QFbWindow::setGeometry(const QRect &rect)
+{
+// store previous geometry for screen update
oldGeometry = geometry();
- // change the widget's QImage if this is a resize
- if (mImage.size() != rect.size())
- mImage = QImage(rect.size(), mScreen->format());
mScreen->invalidateRectCache();
- QWindowSystemInterface::handleGeometryChange(window(), rect);
+//### QWindowSystemInterface::handleGeometryChange(window(), rect);
- QWindowSurface::setGeometry(rect);
+ QPlatformWindow::setGeometry(rect);
}
bool QFbWindowSurface::scroll(const QRegion &area, int dx, int dy)
@@ -344,21 +384,21 @@ void QFbWindowSurface::endPaint(const QRegion &region)
Q_UNUSED(region);
}
-void QFbWindowSurface::setVisible(bool visible)
+void QFbWindow::setVisible(bool visible)
{
visibleFlag = visible;
mScreen->invalidateRectCache();
mScreen->setDirty(geometry());
}
-Qt::WindowFlags QFbWindowSurface::setWindowFlags(Qt::WindowFlags type)
+Qt::WindowFlags QFbWindow::setWindowFlags(Qt::WindowFlags type)
{
flags = type;
mScreen->invalidateRectCache();
return flags;
}
-Qt::WindowFlags QFbWindowSurface::windowFlags() const
+Qt::WindowFlags QFbWindow::windowFlags() const
{
return flags;
}
diff --git a/src/plugins/platforms/fb_base/fb_base.h b/src/plugins/platforms/fb_base/fb_base.h
index fef769c..2b32209 100644
--- a/src/plugins/platforms/fb_base/fb_base.h
+++ b/src/plugins/platforms/fb_base/fb_base.h
@@ -1,18 +1,19 @@
#ifndef QLIGHTHOUSEGRAPHICSSCREEN_H
#define QLIGHTHOUSEGRAPHICSSCREEN_H
-#include <QtGui/QPlatformIntegration>
#include <qrect.h>
#include <qimage.h>
#include <qtimer.h>
#include <qpainter.h>
-#include <QtGui/QGraphicsSystemCursor>
+#include <QGraphicsSystemCursor>
+#include <QPlatformScreen>
+#include <QPlatformWindow>
class QMouseEvent;
class QSize;
class QPainter;
-class QFbPlatformScreen;
+class QFbScreen;
class QGraphicsSystemSoftwareCursor : public QGraphicsSystemCursor
{
@@ -39,10 +40,12 @@ private:
QRect getCurrentRect();
};
+class QFbWindow;
+
class QFbWindowSurface : public QWindowSurface
{
public:
- QFbWindowSurface(QFbPlatformScreen *screen, QWidget *window);
+ QFbWindowSurface(QFbScreen *screen, QWidget *window);
~QFbWindowSurface();
virtual QPaintDevice *paintDevice() { return &mImage; }
@@ -51,35 +54,62 @@ public:
virtual void beginPaint(const QRegion &region);
virtual void endPaint(const QRegion &region);
- virtual void setVisible(bool visible);
- virtual bool visible() { return visibleFlag; }
+
const QImage image() { return mImage; }
- void setGeometry(const QRect &rect);
+ void resize(const QSize &size);
+
+protected:
+ friend class QFbWindow;
+ QFbWindow *platformWindow;
+
+ QFbScreen *mScreen;
+ QImage mImage;
+};
+
+
+class QFbWindow : public QPlatformWindow
+{
+public:
+
+ QFbWindow(QFbScreen *screen, QWidget *window);
+ ~QFbWindow();
+
+
+ virtual void setVisible(bool visible);
+ virtual bool visible() { return visibleFlag; }
virtual void raise();
virtual void lower();
+ void setGeometry(const QRect &rect);
+
virtual Qt::WindowFlags setWindowFlags(Qt::WindowFlags type);
virtual Qt::WindowFlags windowFlags() const;
WId winId() const { return windowId; }
+
+ virtual void repaint(const QRegion&);
+
protected:
- QFbPlatformScreen *mScreen;
+ friend class QFbWindowSurface;
+ friend class QFbScreen;
+ QFbWindowSurface *surface;
+ QFbScreen *mScreen;
QRect oldGeometry;
- QImage mImage;
bool visibleFlag;
Qt::WindowFlags flags;
+
WId windowId;
};
-class QFbPlatformScreen : public QPlatformScreen
+class QFbScreen : public QPlatformScreen
{
Q_OBJECT
public:
- QFbPlatformScreen();
- ~QFbPlatformScreen();
+ QFbScreen();
+ ~QFbScreen();
virtual QRect geometry() const { return mGeometry; }
virtual int depth() const { return mDepth; }
@@ -93,18 +123,18 @@ public:
virtual void setDirty(const QRect &rect);
- virtual void removeWindowSurface(QFbWindowSurface * surface);
- virtual void addWindowSurface(QFbWindowSurface * surface) {
+ virtual void removeWindow(QFbWindow * surface);
+ virtual void addWindow(QFbWindow * surface) {
windowStack.prepend(surface); invalidateRectCache(); }
- virtual void raise(QWindowSurface * surface);
- virtual void lower(QWindowSurface * surface);
+ virtual void raise(QPlatformWindow * surface);
+ virtual void lower(QPlatformWindow * surface);
virtual QWidget * topLevelAt(const QPoint & p) const;
QImage * image() const { return mScreenImage; }
QPaintDevice * paintDevice() const { return mScreenImage; }
protected:
- QList<QFbWindowSurface *> windowStack;
+ QList<QFbWindow *> windowStack;
QRegion repaintRegion;
QGraphicsSystemSoftwareCursor * cursor;
QTimer redrawTimer;
@@ -126,6 +156,7 @@ private:
void invalidateRectCache() { isUpToDate = false; }
friend class QFbWindowSurface;
+ friend class QFbWindow;
bool isUpToDate;
};
diff --git a/src/plugins/platforms/linuxfb/main.cpp b/src/plugins/platforms/linuxfb/main.cpp
index 4f7684b..1ee24b6 100644
--- a/src/plugins/platforms/linuxfb/main.cpp
+++ b/src/plugins/platforms/linuxfb/main.cpp
@@ -39,7 +39,7 @@
**
****************************************************************************/
-#include <QtGui/QPlatformIntegrationPlugin>
+#include <QPlatformIntegrationPlugin>
#include "qgraphicssystem_linuxfb.h"
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.cpp b/src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.cpp
index 6310062..321e90f 100644
--- a/src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.cpp
+++ b/src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.cpp
@@ -69,11 +69,11 @@
QT_BEGIN_NAMESPACE
-class QLinuxFbPrivate
+class QLinuxFbIntegrationPrivate
{
public:
- QLinuxFbPrivate();
- ~QLinuxFbPrivate();
+ QLinuxFbIntegrationPrivate();
+ ~QLinuxFbIntegrationPrivate();
void openTty();
void closeTty();
@@ -94,7 +94,7 @@ public:
QString displaySpec;
};
-QLinuxFbPrivate::QLinuxFbPrivate()
+QLinuxFbIntegrationPrivate::QLinuxFbIntegrationPrivate()
: fd(-1), blank(true), doGraphicsMode(true),
#ifdef QT_QWS_DEPTH_GENERIC
doGenericColors(false),
@@ -103,12 +103,12 @@ QLinuxFbPrivate::QLinuxFbPrivate()
{
}
-QLinuxFbPrivate::~QLinuxFbPrivate()
+QLinuxFbIntegrationPrivate::~QLinuxFbIntegrationPrivate()
{
closeTty();
}
-void QLinuxFbPrivate::openTty()
+void QLinuxFbIntegrationPrivate::openTty()
{
const char *const devs[] = {"/dev/tty0", "/dev/tty", "/dev/console", 0};
@@ -139,7 +139,7 @@ void QLinuxFbPrivate::openTty()
QT_WRITE(ttyfd, termctl, sizeof(termctl));
}
-void QLinuxFbPrivate::closeTty()
+void QLinuxFbIntegrationPrivate::closeTty()
{
if (ttyfd == -1)
return;
@@ -157,18 +157,19 @@ void QLinuxFbPrivate::closeTty()
QLinuxFbIntegration::QLinuxFbIntegration()
{
- d_ptr = new QLinuxFbPrivate();
+ d_ptr = new QLinuxFbIntegrationPrivate();
// XXX
QString displaySpec = QString::fromLatin1(qgetenv("QWS_DISPLAY"));
if (!connect(displaySpec))
- qFatal("QLinuxFbGraphicsSystem: could not initialize screen");
+ qFatal("QLinuxFbIntegration: could not initialize screen");
initDevice();
// Create a QImage directly on the screen's framebuffer.
// This is the blit target for copying windows to the screen.
- mPrimaryScreen = new QLinuxFbScreen(data, w, h, lstep, screenFormat);
+ mPrimaryScreen = new QLinuxFbScreen(data, w, h, lstep,
+ screenFormat);
mPrimaryScreen->setPhysicalSize(QSize(physWidth, physHeight));
mScreens.append(mPrimaryScreen);
}
@@ -235,7 +236,7 @@ bool QLinuxFbIntegration::connect(const QString &displaySpec)
/* Get fixed screen information */
if (d_ptr->fd != -1 && ioctl(d_ptr->fd, FBIOGET_FSCREENINFO, &finfo)) {
- perror("QLinuxFbGraphicsSystem::connect");
+ perror("QLinuxFbIntegration::connect");
qWarning("Error reading fixed information");
return false;
}
@@ -247,7 +248,7 @@ bool QLinuxFbIntegration::connect(const QString &displaySpec)
/* Get variable screen information */
if (d_ptr->fd != -1 && ioctl(d_ptr->fd, FBIOGET_VSCREENINFO, &vinfo)) {
- perror("QLinuxFbGraphicsSystem::connect");
+ perror("QLinuxFbIntegration::connect");
qWarning("Error reading variable information");
return false;
}
@@ -293,7 +294,7 @@ bool QLinuxFbIntegration::connect(const QString &displaySpec)
}
if (w == 0 || h == 0) {
- qWarning("QLinuxFbGraphicsSystem::connect(): Unable to find screen geometry, "
+ qWarning("QLinuxFbIntegration::connect(): Unable to find screen geometry, "
"will use 320x240.");
dw = w = 320;
dh = h = 240;
@@ -345,7 +346,7 @@ bool QLinuxFbIntegration::connect(const QString &displaySpec)
MAP_SHARED, d_ptr->fd, 0);
if ((long)data == -1) {
- perror("QLinuxFbGraphicsSystem::connect");
+ perror("QLinuxFbIntegration::connect");
qWarning("Error: failed to map framebuffer device to memory.");
return false;
} else {
@@ -375,7 +376,7 @@ bool QLinuxFbIntegration::connect(const QString &displaySpec)
startcmap.transp=(unsigned short int *)
malloc(sizeof(unsigned short int)*screencols);
if (d_ptr->fd == -1 || ioctl(d_ptr->fd, FBIOGETCMAP, &startcmap)) {
- perror("QLinuxFbGraphicsSystem::connect");
+ perror("QLinuxFbIntegration::connect");
qWarning("Error reading palette from framebuffer, using default palette");
createPalette(startcmap, vinfo, finfo);
}
@@ -784,16 +785,20 @@ QPixmapData *QLinuxFbIntegration::createPixmapData(QPixmapData::PixelType type)
return new QRasterPixmapData(type);
}
-QWindowSurface *QLinuxFbIntegration::createWindowSurface(QWidget *widget) const
+QWindowSurface *QLinuxFbIntegration::createWindowSurface(QWidget *widget, WId) const
{
- if (widget->windowType() == Qt::Desktop)
- return 0; // Don't create an explicit window surface for the destkop.
QFbWindowSurface * surface =
new QFbWindowSurface(mPrimaryScreen, widget);
- mPrimaryScreen->addWindowSurface(surface);
return surface;
}
+QPlatformWindow *QLinuxFbIntegration::createPlatformWindow(QWidget *widget, WId /*winId*/) const
+{
+ QFbWindow *w = new QFbWindow(mPrimaryScreen, widget);
+ mPrimaryScreen->addWindow(w);
+ return w;
+}
+
QLinuxFbScreen::QLinuxFbScreen(uchar * d, int w,
int h, int lstep, QImage::Format screenFormat) : compositePainter(0)
{
@@ -840,7 +845,7 @@ void QLinuxFbScreen::setFormat(QImage::Format format)
QRegion QLinuxFbScreen::doRedraw()
{
QRegion touched;
- touched = QFbPlatformScreen::doRedraw();
+ touched = QFbScreen::doRedraw();
if (!compositePainter) {
compositePainter = new QPainter(mFbScreenImage);
diff --git a/src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.h b/src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.h
index bb4c920..dc61df5 100644
--- a/src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.h
+++ b/src/plugins/platforms/linuxfb/qgraphicssystem_linuxfb.h
@@ -42,12 +42,12 @@
#ifndef QGRAPHICSSYSTEM_LINUXFB_H
#define QGRAPHICSSYSTEM_LINUXFB_H
-#include <QtGui/QPlatformIntegration>
+#include <QPlatformIntegration>
#include "../fb_base/fb_base.h"
QT_BEGIN_NAMESPACE
-class QLinuxFbScreen : public QFbPlatformScreen
+class QLinuxFbScreen : public QFbScreen
{
public:
QLinuxFbScreen(uchar * d, int w, int h, int lstep, QImage::Format screenFormat);
@@ -65,7 +65,7 @@ private:
QPainter *compositePainter;
};
-class QLinuxFbPrivate;
+class QLinuxFbIntegrationPrivate;
struct fb_cmap;
struct fb_var_screeninfo;
struct fb_fix_screeninfo;
@@ -77,14 +77,15 @@ public:
~QLinuxFbIntegration();
QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
- QWindowSurface *createWindowSurface(QWidget *widget) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId WinId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId WinId) const;
QList<QPlatformScreen *> screens() const { return mScreens; }
private:
QLinuxFbScreen *mPrimaryScreen;
QList<QPlatformScreen *> mScreens;
- QLinuxFbPrivate *d_ptr;
+ QLinuxFbIntegrationPrivate *d_ptr;
enum PixelType { NormalPixel, BGRPixel };
diff --git a/src/plugins/platforms/minimal/minimal.pro b/src/plugins/platforms/minimal/minimal.pro
index 567b551..6c97f07 100644
--- a/src/plugins/platforms/minimal/minimal.pro
+++ b/src/plugins/platforms/minimal/minimal.pro
@@ -1,4 +1,4 @@
-TARGET = qminimalgraphicssystem
+TARGET = qminimal
include(../../qpluginbase.pri)
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
diff --git a/src/plugins/platforms/minimal/qplatformintegration_minimal.cpp b/src/plugins/platforms/minimal/qplatformintegration_minimal.cpp
index 693e0c3..73e025c 100644
--- a/src/plugins/platforms/minimal/qplatformintegration_minimal.cpp
+++ b/src/plugins/platforms/minimal/qplatformintegration_minimal.cpp
@@ -2,6 +2,7 @@
#include "qwindowsurface_minimal.h"
#include <QtGui/private/qpixmap_raster_p.h>
+#include <QtGui/QPlatformWindow>
QMinimalIntegration::QMinimalIntegration()
{
@@ -10,7 +11,6 @@ QMinimalIntegration::QMinimalIntegration()
mPrimaryScreen->mGeometry = QRect(0, 0, 240, 320);
mPrimaryScreen->mDepth = 16;
mPrimaryScreen->mFormat = QImage::Format_RGB16;
- mPrimaryScreen->mPhysicalSize = QSize(40, 54);
mScreens.append(mPrimaryScreen);
}
@@ -19,7 +19,15 @@ QPixmapData *QMinimalIntegration::createPixmapData(QPixmapData::PixelType type)
{
return new QRasterPixmapData(type);
}
-QWindowSurface *QMinimalIntegration::createWindowSurface(QWidget *widget) const
+
+QPlatformWindow *QMinimalIntegration::createPlatformWindow(QWidget *widget, WId winId) const
+{
+ Q_UNUSED(winId);
+ return new QPlatformWindow(widget);
+}
+
+QWindowSurface *QMinimalIntegration::createWindowSurface(QWidget *widget, WId winId) const
{
+ Q_UNUSED(winId);
return new QMinimalWindowSurface(widget);
}
diff --git a/src/plugins/platforms/minimal/qplatformintegration_minimal.h b/src/plugins/platforms/minimal/qplatformintegration_minimal.h
index d4eb78b..a2f7449 100644
--- a/src/plugins/platforms/minimal/qplatformintegration_minimal.h
+++ b/src/plugins/platforms/minimal/qplatformintegration_minimal.h
@@ -57,7 +57,6 @@ public:
QRect geometry() const { return mGeometry; }
int depth() const { return mDepth; }
QImage::Format format() const { return mFormat; }
- QSize physicalSize() const { return mPhysicalSize; }
public:
QRect mGeometry;
@@ -72,7 +71,8 @@ public:
QMinimalIntegration();
QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
- QWindowSurface *createWindowSurface(QWidget *widget) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
QList<QPlatformScreen *> screens() const { return mScreens; }
diff --git a/src/plugins/platforms/minimal/qwindowsurface_minimal.cpp b/src/plugins/platforms/minimal/qwindowsurface_minimal.cpp
index 0b2bdd2..2f8b1f0 100644
--- a/src/plugins/platforms/minimal/qwindowsurface_minimal.cpp
+++ b/src/plugins/platforms/minimal/qwindowsurface_minimal.cpp
@@ -73,13 +73,13 @@ void QMinimalWindowSurface::flush(QWidget *widget, const QRegion &region, const
mImage.save(filename);
}
-void QMinimalWindowSurface::setGeometry(const QRect &rect)
+void QMinimalWindowSurface::resize(const QSize &size)
{
//qDebug() << "QMinimalWindowSurface::setGeometry:" << (long)this << rect;
- QWindowSurface::setGeometry(rect);
+ QWindowSurface::resize(size);
QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format();
- if (mImage.size() != rect.size())
- mImage = QImage(rect.size(), format);
+ if (mImage.size() != size)
+ mImage = QImage(size, format);
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/minimal/qwindowsurface_minimal.h b/src/plugins/platforms/minimal/qwindowsurface_minimal.h
index 959a731..96f989d 100644
--- a/src/plugins/platforms/minimal/qwindowsurface_minimal.h
+++ b/src/plugins/platforms/minimal/qwindowsurface_minimal.h
@@ -44,6 +44,8 @@
#include <QtGui/private/qwindowsurface_p.h>
+#include <QtGui/QPlatformWindow>
+
QT_BEGIN_NAMESPACE
class QMinimalWindowSurface : public QWindowSurface
@@ -54,7 +56,7 @@ public:
QPaintDevice *paintDevice();
void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
- void setGeometry(const QRect &rect);
+ void resize(const QSize &size);
private:
QImage mImage;
diff --git a/src/plugins/platforms/qvfb/main.cpp b/src/plugins/platforms/qvfb/main.cpp
index b28dde8..409f11c 100644
--- a/src/plugins/platforms/qvfb/main.cpp
+++ b/src/plugins/platforms/qvfb/main.cpp
@@ -39,34 +39,34 @@
**
****************************************************************************/
-#include <private/qgraphicssystemplugin_p.h>
-#include "qgraphicssystem_qvfb.h"
+#include <QPlatformIntegrationPlugin>
+#include "qvfbintegration.h"
#include <qstringlist.h>
QT_BEGIN_NAMESPACE
-class QVFbGraphicsSystemPlugin : public QGraphicsSystemPlugin
+class QVFbIntegrationPlugin : public QPlatformIntegrationPlugin
{
public:
QStringList keys() const;
- QGraphicsSystem *create(const QString&);
+ QPlatformIntegration *create(const QString&);
};
-QStringList QVFbGraphicsSystemPlugin::keys() const
+QStringList QVFbIntegrationPlugin::keys() const
{
QStringList list;
list << "QVFb";
return list;
}
-QGraphicsSystem* QVFbGraphicsSystemPlugin::create(const QString& system)
+QPlatformIntegration* QVFbIntegrationPlugin::create(const QString& system)
{
if (system.toLower() == "qvfb")
- return new QVFbGraphicsSystem;
+ return new QVFbIntegration;
return 0;
}
-Q_EXPORT_PLUGIN2(qvfb, QVFbGraphicsSystemPlugin)
+Q_EXPORT_PLUGIN2(qvfb, QVFbIntegrationPlugin)
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qvfb/qvfb.pro b/src/plugins/platforms/qvfb/qvfb.pro
index b321725..4dec274 100644
--- a/src/plugins/platforms/qvfb/qvfb.pro
+++ b/src/plugins/platforms/qvfb/qvfb.pro
@@ -1,12 +1,11 @@
-TARGET = qvfbgraphicssystem
+TARGET = qvfbintegration
include(../../qpluginbase.pri)
-QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/graphicssystems
+QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
+SOURCES = main.cpp qvfbintegration.cpp qwindowsurface_qvfb.cpp
+HEADERS = qvfbintegration.h qwindowsurface_qvfb.h
-SOURCES = main.cpp qgraphicssystem_qvfb.cpp qwindowsurface_qvfb.cpp
-HEADERS = qgraphicssystem_qvfb.h qwindowsurface_qvfb.h
-
-target.path += $$[QT_INSTALL_PLUGINS]/graphicssystems
+target.path += $$[QT_INSTALL_PLUGINS]/platforms
INSTALLS += target
diff --git a/src/plugins/platforms/qvfb/qgraphicssystem_qvfb.cpp b/src/plugins/platforms/qvfb/qvfbintegration.cpp
index 19058a6..e22c724 100644
--- a/src/plugins/platforms/qvfb/qgraphicssystem_qvfb.cpp
+++ b/src/plugins/platforms/qvfb/qvfbintegration.cpp
@@ -52,7 +52,7 @@
#include <qvfbhdr.h>
#include <qsocketnotifier.h>
-#include "qgraphicssystem_qvfb.h"
+#include "qvfbintegration.h"
#include "qwindowsurface_qvfb.h"
#include <QtGui/private/qpixmap_raster_p.h>
#include <QtCore/qdebug.h>
@@ -65,12 +65,12 @@
QT_BEGIN_NAMESPACE
-class QVFbGraphicsSystemScreenKeyboardHandler : public QObject
+class QVFbScreenKeyboardHandler : public QObject
{
Q_OBJECT
public:
- QVFbGraphicsSystemScreenKeyboardHandler();
- ~QVFbGraphicsSystemScreenKeyboardHandler();
+ QVFbScreenKeyboardHandler();
+ ~QVFbScreenKeyboardHandler();
private slots:
void readKeyboardData();
@@ -83,7 +83,7 @@ private:
QSocketNotifier *keyNotifier;
};
-QVFbGraphicsSystemScreenKeyboardHandler::QVFbGraphicsSystemScreenKeyboardHandler()
+QVFbScreenKeyboardHandler::QVFbScreenKeyboardHandler()
{
int displayId = 0; //TODO displayId
const QString keyboardDev = QT_VFB_KEYBOARD_PIPE(displayId);
@@ -97,8 +97,8 @@ QVFbGraphicsSystemScreenKeyboardHandler::QVFbGraphicsSystemScreenKeyboardHandler
kbdFD = QT_OPEN(keyboardDev.toLatin1().constData(), O_RDWR | O_NDELAY);
if (kbdFD == -1) {
- perror("QVFbGraphicsSystemScreenKeyboardHandler");
- qWarning("QVFbGraphicsSystemScreenKeyboardHandler: Unable to open device %s",
+ perror("QVFbScreenKeyboardHandler");
+ qWarning("QVFbScreenKeyboardHandler: Unable to open device %s",
qPrintable(keyboardDev));
return;
}
@@ -112,7 +112,7 @@ QVFbGraphicsSystemScreenKeyboardHandler::QVFbGraphicsSystemScreenKeyboardHandler
}
-QVFbGraphicsSystemScreenKeyboardHandler::~QVFbGraphicsSystemScreenKeyboardHandler()
+QVFbScreenKeyboardHandler::~QVFbScreenKeyboardHandler()
{
if (kbdFD >= 0)
QT_CLOSE(kbdFD);
@@ -120,7 +120,7 @@ QVFbGraphicsSystemScreenKeyboardHandler::~QVFbGraphicsSystemScreenKeyboardHandle
}
-void QVFbGraphicsSystemScreenKeyboardHandler::readKeyboardData()
+void QVFbScreenKeyboardHandler::readKeyboardData()
{
int n;
do {
@@ -161,12 +161,12 @@ void QVFbGraphicsSystemScreenKeyboardHandler::readKeyboardData()
-class QVFbGraphicsSystemScreenMouseHandler : public QObject
+class QVFbScreenMouseHandler : public QObject
{
Q_OBJECT
public:
- QVFbGraphicsSystemScreenMouseHandler();
- ~QVFbGraphicsSystemScreenMouseHandler();
+ QVFbScreenMouseHandler();
+ ~QVFbScreenMouseHandler();
private slots:
void readMouseData();
@@ -181,7 +181,7 @@ private:
int oldButtonState;
};
-QVFbGraphicsSystemScreenMouseHandler::QVFbGraphicsSystemScreenMouseHandler()
+QVFbScreenMouseHandler::QVFbScreenMouseHandler()
{
int displayId = 0; //TODO: displayId
QString mouseDev = QT_VFB_MOUSE_PIPE(displayId);
@@ -206,13 +206,13 @@ QVFbGraphicsSystemScreenMouseHandler::QVFbGraphicsSystemScreenMouseHandler()
}
-QVFbGraphicsSystemScreenMouseHandler::~QVFbGraphicsSystemScreenMouseHandler()
+QVFbScreenMouseHandler::~QVFbScreenMouseHandler()
{
if (mouseFD >= 0)
QT_CLOSE(mouseFD);
}
-void QVFbGraphicsSystemScreenMouseHandler::readMouseData()
+void QVFbScreenMouseHandler::readMouseData()
{
int n;
do {
@@ -229,7 +229,7 @@ void QVFbGraphicsSystemScreenMouseHandler::readMouseData()
mb += sizeof(QPoint);
int bstate = *reinterpret_cast<int *>(mb);
mb += sizeof(int);
- int wheel = *reinterpret_cast<int *>(mb);
+ //int wheel = *reinterpret_cast<int *>(mb);
int button = bstate ^ oldButtonState;
QEvent::Type type = QEvent::MouseMove;
@@ -254,16 +254,16 @@ void QVFbGraphicsSystemScreenMouseHandler::readMouseData()
}
-class QVFbGraphicsSystemScreenPrivate
+class QVFbScreenPrivate
{
public:
- QVFbGraphicsSystemScreenPrivate(QVFbGraphicsSystemScreen *)
+ QVFbScreenPrivate(QVFbScreen *)
: shmrgn(0), hdr(0), data(0), mouseHandler(0), keyboardHandler(0)
{
connect(0); //for now we only handle one screen
}
- ~QVFbGraphicsSystemScreenPrivate() { disconnect(); }
+ ~QVFbScreenPrivate() { disconnect(); }
void setDirty(const QRect &r);
bool connect(int displayId);
@@ -279,22 +279,22 @@ private:
unsigned char *shmrgn;
QVFbHeader *hdr;
uchar *data;
- QVFbGraphicsSystemScreenMouseHandler *mouseHandler;
- QVFbGraphicsSystemScreenKeyboardHandler *keyboardHandler;
+ QVFbScreenMouseHandler *mouseHandler;
+ QVFbScreenKeyboardHandler *keyboardHandler;
QImage img;
};
-void QVFbGraphicsSystemScreenPrivate::setDirty(const QRect &r)
+void QVFbScreenPrivate::setDirty(const QRect &r)
{
hdr->dirty = true;
hdr->update = hdr->update.united(r);
}
-bool QVFbGraphicsSystemScreenPrivate::connect(int displayId)
+bool QVFbScreenPrivate::connect(int displayId)
{
key_t key = ftok(QT_VFB_MOUSE_PIPE(displayId).toLatin1(), 'b');
@@ -339,12 +339,12 @@ bool QVFbGraphicsSystemScreenPrivate::connect(int displayId)
qDebug("connected %dx%d %d bpp", w, h, d);
- mouseHandler = new QVFbGraphicsSystemScreenMouseHandler;
- keyboardHandler = new QVFbGraphicsSystemScreenKeyboardHandler;
+ mouseHandler = new QVFbScreenMouseHandler;
+ keyboardHandler = new QVFbScreenKeyboardHandler;
return true;
}
-void QVFbGraphicsSystemScreenPrivate::disconnect()
+void QVFbScreenPrivate::disconnect()
{
if ((long)shmrgn != -1 && shmrgn) {
shmdt((char*)shmrgn);
@@ -357,78 +357,81 @@ void QVFbGraphicsSystemScreenPrivate::disconnect()
}
-QVFbGraphicsSystemScreen::QVFbGraphicsSystemScreen()
+QVFbScreen::QVFbScreen()
{
- d_ptr = new QVFbGraphicsSystemScreenPrivate(this);
+ d_ptr = new QVFbScreenPrivate(this);
}
-QVFbGraphicsSystemScreen::~QVFbGraphicsSystemScreen()
+QVFbScreen::~QVFbScreen()
{
delete d_ptr;
}
-void QVFbGraphicsSystemScreen::setDirty(const QRect &rect)
+void QVFbScreen::setDirty(const QRect &rect)
{
d_ptr->setDirty(rect);
}
-QRect QVFbGraphicsSystemScreen::geometry() const {
+QRect QVFbScreen::geometry() const {
return QRect(QPoint(), d_ptr->screenSize());
}
-int QVFbGraphicsSystemScreen::depth() const
+int QVFbScreen::depth() const
{
return d_ptr->depth();
}
-QImage::Format QVFbGraphicsSystemScreen::format() const
+QImage::Format QVFbScreen::format() const
{
return d_ptr->format();
}
-QSize QVFbGraphicsSystemScreen::physicalSize() const {
+QSize QVFbScreen::physicalSize() const {
return (d_ptr->screenSize()*254)/720;
}
#if 0
-int QVFbGraphicsSystemScreen::linestep() const {
+int QVFbScreen::linestep() const {
return d_ptr->screenImage() ? d_ptr->screenImage()->bytesPerLine() : 0;
}
-uchar *QVFbGraphicsSystemScreen::base() const {
+uchar *QVFbScreen::base() const {
return d_ptr->screenImage() ? d_ptr->screenImage()->bits() : 0;
}
#endif
-QImage *QVFbGraphicsSystemScreen::screenImage()
+QImage *QVFbScreen::screenImage()
{
return d_ptr->screenImage();
}
-QVFbGraphicsSystem::QVFbGraphicsSystem()
+QVFbIntegration::QVFbIntegration()
{
- mPrimaryScreen = new QVFbGraphicsSystemScreen();
+ mPrimaryScreen = new QVFbScreen();
mScreens.append(mPrimaryScreen);
}
-QPixmapData *QVFbGraphicsSystem::createPixmapData(QPixmapData::PixelType type) const
+QPixmapData *QVFbIntegration::createPixmapData(QPixmapData::PixelType type) const
{
return new QRasterPixmapData(type);
}
-QWindowSurface *QVFbGraphicsSystem::createWindowSurface(QWidget *widget) const
+QWindowSurface *QVFbIntegration::createWindowSurface(QWidget *widget, WId) const
{
- if (widget->windowType() == Qt::Desktop)
- return 0; // Don't create an explicit window surface for the destkop.
- return new QVFbWindowSurface
- (const_cast<QVFbGraphicsSystem *>(this), mPrimaryScreen, widget);
+ return new QVFbWindowSurface(mPrimaryScreen, widget);
+}
+
+
+QPlatformWindow *QVFbIntegration::createPlatformWindow(QWidget *widget, WId) const
+{
+ return new QVFbWindow(mPrimaryScreen, widget);
}
QT_END_NAMESPACE
-#include "qgraphicssystem_qvfb.moc"
+#include "qvfbintegration.moc"
diff --git a/src/plugins/platforms/qvfb/qgraphicssystem_qvfb.h b/src/plugins/platforms/qvfb/qvfbintegration.h
index b31869c..ab44d46 100644
--- a/src/plugins/platforms/qvfb/qgraphicssystem_qvfb.h
+++ b/src/plugins/platforms/qvfb/qvfbintegration.h
@@ -42,18 +42,19 @@
#ifndef QGRAPHICSSYSTEM_QVFB_H
#define QGRAPHICSSYSTEM_QVFB_H
-#include <QtGui/private/qgraphicssystem_p.h>
+#include <QPlatformScreen>
+#include <QPlatformIntegration>
QT_BEGIN_NAMESPACE
-class QVFbGraphicsSystemScreenPrivate;
+class QVFbScreenPrivate;
-class QVFbGraphicsSystemScreen : public QGraphicsSystemScreen
+class QVFbScreen : public QPlatformScreen
{
public:
- QVFbGraphicsSystemScreen();
- ~QVFbGraphicsSystemScreen();
+ QVFbScreen();
+ ~QVFbScreen();
QRect geometry() const;
int depth() const;
@@ -66,25 +67,26 @@ public:
public:
- QVFbGraphicsSystemScreenPrivate *d_ptr;
+ QVFbScreenPrivate *d_ptr;
};
-class QVFbGraphicsSystemPrivate;
+class QVFbIntegrationPrivate;
-class QVFbGraphicsSystem : public QGraphicsSystem
+class QVFbIntegration : public QPlatformIntegration
{
public:
- QVFbGraphicsSystem();
+ QVFbIntegration();
QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
- QWindowSurface *createWindowSurface(QWidget *widget) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
- QList<QGraphicsSystemScreen *> screens() const { return mScreens; }
+ QList<QPlatformScreen *> screens() const { return mScreens; }
private:
- QVFbGraphicsSystemScreen *mPrimaryScreen;
- QList<QGraphicsSystemScreen *> mScreens;
+ QVFbScreen *mPrimaryScreen;
+ QList<QPlatformScreen *> mScreens;
};
diff --git a/src/plugins/platforms/qvfb/qwindowsurface_qvfb.cpp b/src/plugins/platforms/qvfb/qwindowsurface_qvfb.cpp
index 0aafe28..b46d9c0 100644
--- a/src/plugins/platforms/qvfb/qwindowsurface_qvfb.cpp
+++ b/src/plugins/platforms/qvfb/qwindowsurface_qvfb.cpp
@@ -41,15 +41,15 @@
#include "qwindowsurface_qvfb.h"
-#include "qgraphicssystem_qvfb.h"
+#include "qvfbintegration.h"
#include <QtCore/qdebug.h>
#include <QtGui/qpainter.h>
#include <private/qapplication_p.h>
QT_BEGIN_NAMESPACE
-QVFbWindowSurface::QVFbWindowSurface(QVFbGraphicsSystem *graphicsSystem,
- QVFbGraphicsSystemScreen *screen, QWidget *window)
+QVFbWindowSurface::QVFbWindowSurface(//QVFbIntegration *graphicsSystem,
+ QVFbScreen *screen, QWidget *window)
: QWindowSurface(window),
mScreen(screen)
{
@@ -69,36 +69,40 @@ void QVFbWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoi
Q_UNUSED(widget);
Q_UNUSED(offset);
- QRect rect = geometry();
- QPoint topLeft = rect.topLeft();
+// QRect rect = geometry();
+// QPoint topLeft = rect.topLeft();
mScreen->setDirty(region.boundingRect());
}
-void QVFbWindowSurface::setGeometry(const QRect &)
+void QVFbWindowSurface::resize(const QSize&)
{
// any size you like as long as it's full-screen...
QRect rect(mScreen->availableGeometry());
- QWindowSystemInterface::handleGeometryChange(this->window(), rect);
-
- QWindowSurface::setGeometry(rect);
+ QWindowSurface::resize(rect.size());
}
-bool QVFbWindowSurface::scroll(const QRegion &area, int dx, int dy)
-{
- return QWindowSurface::scroll(area, dx, dy);
-}
-void QVFbWindowSurface::beginPaint(const QRegion &region)
+QVFbWindow::QVFbWindow(QVFbScreen *screen, QWidget *window)
+ : QPlatformWindow(window),
+ mScreen(screen)
{
- Q_UNUSED(region);
}
-void QVFbWindowSurface::endPaint(const QRegion &region)
+
+void QVFbWindow::setGeometry(const QRect &)
{
- Q_UNUSED(region);
+
+// any size you like as long as it's full-screen...
+
+ QRect rect(mScreen->availableGeometry());
+ QWindowSystemInterface::handleGeometryChange(this->widget(), rect);
+
+ QPlatformWindow::setGeometry(rect);
}
+
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qvfb/qwindowsurface_qvfb.h b/src/plugins/platforms/qvfb/qwindowsurface_qvfb.h
index 1971caa..9228189 100644
--- a/src/plugins/platforms/qvfb/qwindowsurface_qvfb.h
+++ b/src/plugins/platforms/qvfb/qwindowsurface_qvfb.h
@@ -43,32 +43,38 @@
#define QWINDOWSURFACE_QVFB_H
#include <QtGui/private/qwindowsurface_p.h>
+#include <QPlatformWindow>
QT_BEGIN_NAMESPACE
-class QVFbGraphicsSystem;
-class QVFbGraphicsSystemScreen;
+class QVFbIntegration;
+class QVFbScreen;
class QVFbWindowSurface : public QWindowSurface
{
public:
- QVFbWindowSurface(QVFbGraphicsSystem *graphicsSystem,
- QVFbGraphicsSystemScreen *screen, QWidget *window);
+ QVFbWindowSurface(QVFbScreen *screen, QWidget *window);
~QVFbWindowSurface();
QPaintDevice *paintDevice();
void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
- void setGeometry(const QRect &rect);
- bool scroll(const QRegion &area, int dx, int dy);
+ void resize(const QSize &size);
+
+private:
+ QVFbScreen *mScreen;
+};
- void beginPaint(const QRegion &region);
- void endPaint(const QRegion &region);
+class QVFbWindow : public QPlatformWindow
+{
+public:
+ QVFbWindow(QVFbScreen *screen, QWidget *window);
+ void setGeometry(const QRect &rect);
private:
- QVFbGraphicsSystem *mGraphicsSystem;
- QVFbGraphicsSystemScreen *mScreen;
+ QVFbScreen *mScreen;
};
+
QT_END_NAMESPACE
#endif
diff --git a/src/plugins/platforms/testlite/qplatformintegration_testlite.cpp b/src/plugins/platforms/testlite/qplatformintegration_testlite.cpp
index 6776e0c..cc77bc7 100644
--- a/src/plugins/platforms/testlite/qplatformintegration_testlite.cpp
+++ b/src/plugins/platforms/testlite/qplatformintegration_testlite.cpp
@@ -39,6 +39,8 @@
**
****************************************************************************/
+
+
#include "qplatformintegration_testlite.h"
#include "qwindowsurface_testlite.h"
#include <QtGui/private/qpixmap_raster_p.h>
@@ -46,7 +48,7 @@
#include <QGraphicsSystemCursor>
-#include "x11util.h"
+#include "qtestlitewindow.h"
#ifndef QT_NO_OPENGL
#include <GL/glx.h>
@@ -61,20 +63,20 @@ public:
MyCursor(QPlatformScreen *screen) : QGraphicsSystemCursor(screen) {}
void changeCursor(QCursor * cursor, QWidget * widget) {
- QTestLiteWindowSurface *ws = 0;
+ QTestLiteWindow *w = 0;
if (widget) {
QWidget *window = widget->window();
- ws = static_cast<QTestLiteWindowSurface*>(window->windowSurface());
+ w = static_cast<QTestLiteWindow*>(window->platformWindow());
} else {
// No X11 cursor control when there is no widget under the cursor
return;
}
//qDebug() << "changeCursor" << widget << ws;
- if (!ws)
+ if (!w)
return;
- ws->setCursor(cursor);
+ w->setCursor(cursor);
}
};
@@ -105,15 +107,19 @@ QPixmapData *QTestLiteIntegration::createPixmapData(QPixmapData::PixelType type)
return new QRasterPixmapData(type);
}
-QWindowSurface *QTestLiteIntegration::createWindowSurface(QWidget *widget) const
+QWindowSurface *QTestLiteIntegration::createWindowSurface(QWidget *widget, WId) const
{
- if (widget->windowType() == Qt::Desktop)
- return 0; // Don't create an explicit window surface for the destkop.
- return new QTestLiteWindowSurface
- (const_cast<QTestLiteIntegration *>(this), mPrimaryScreen, widget);
+ return new QTestLiteWindowSurface(mPrimaryScreen, widget);
}
+QPlatformWindow *QTestLiteIntegration::createPlatformWindow(QWidget *widget, WId /*winId*/) const
+{
+ return new QTestLiteWindow(this, mPrimaryScreen, widget);
+}
+
+
+
QPixmap QTestLiteIntegration::grabWindow(WId window, int x, int y, int width, int height) const
{
QImage img = xd->grabWindow(window, x, y, width, height);
diff --git a/src/plugins/platforms/testlite/qplatformintegration_testlite.h b/src/plugins/platforms/testlite/qplatformintegration_testlite.h
index 8dbbc50..4260faa 100644
--- a/src/plugins/platforms/testlite/qplatformintegration_testlite.h
+++ b/src/plugins/platforms/testlite/qplatformintegration_testlite.h
@@ -74,7 +74,8 @@ public:
QTestLiteIntegration();
QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
- QWindowSurface *createWindowSurface(QWidget *widget) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
diff --git a/src/plugins/platforms/testlite/x11util.cpp b/src/plugins/platforms/testlite/qtestlitewindow.cpp
index 6d2966f..108f732 100644
--- a/src/plugins/platforms/testlite/x11util.cpp
+++ b/src/plugins/platforms/testlite/qtestlitewindow.cpp
@@ -39,6 +39,16 @@
**
****************************************************************************/
+#include "qwindowsurface_testlite.h"
+#include "qplatformintegration_testlite.h"
+#include <QWindowSystemInterface>
+
+#include "qtestlitewindow.h"
+
+#include <QBitmap>
+#include <QCursor>
+#include <QDateTime>
+#include <QPixmap>
#include <QImage>
#include <QSocketNotifier>
@@ -46,9 +56,6 @@
#include <QTimer>
#include <QApplication>
-#include "x11util.h"
-#include "qwindowsurface_testlite.h"
-
#include <stdio.h>
#include <stdlib.h>
@@ -57,23 +64,13 @@
#include <X11/cursorfont.h>
-# include <sys/ipc.h>
-# include <sys/shm.h>
-# include <X11/extensions/XShm.h>
-
-#include <QBitmap>
-#include <QCursor>
-#include <QDateTime>
-#include <QPixmap>
//### remove stuff we don't want from qt_x11_p.h
#undef ATOM
#undef X11
-//#define MYX11_DEBUG
-
-//#define DONT_USE_MIT_SHM
+QT_BEGIN_NAMESPACE
static int (*original_x_errhandler)(Display *dpy, XErrorEvent *);
static bool seen_badwindow;
@@ -82,398 +79,574 @@ static bool seen_badwindow;
static Atom wmProtocolsAtom;
static Atom wmDeleteWindowAtom;
-//### copied from qapplication_x11.cpp
-static int qt_x_errhandler(Display *dpy, XErrorEvent *err)
+
+class MyX11CursorNode
{
+public:
+ MyX11CursorNode(int id, Cursor c) { idValue = id; cursorValue = c; refCount = 1; }
+ QDateTime expiration() { return t; }
+ void setExpiration(QDateTime val) { t = val; }
+ MyX11CursorNode * ante() { return before; }
+ void setAnte(MyX11CursorNode *node) { before = node; }
+ MyX11CursorNode * post() { return after; }
+ void setPost(MyX11CursorNode *node) { after = node; }
+ Cursor cursor() { return cursorValue; }
+ int id() { return idValue; }
+ unsigned int refCount;
+
+private:
+ MyX11CursorNode *before;
+ MyX11CursorNode *after;
+ QDateTime t;
+ Cursor cursorValue;
+ int idValue;
+
+ Display * display;
+};
-qDebug() << "qt_x_errhandler" << err->error_code;
- switch (err->error_code) {
- case BadAtom:
-#if 0
- if (err->request_code == 20 /* X_GetProperty */
- && (err->resourceid == XA_RESOURCE_MANAGER
- || err->resourceid == XA_RGB_DEFAULT_MAP
- || err->resourceid == ATOM(_NET_SUPPORTED)
- || err->resourceid == ATOM(_NET_SUPPORTING_WM_CHECK)
- || err->resourceid == ATOM(KDE_FULL_SESSION)
- || err->resourceid == ATOM(KWIN_RUNNING)
- || err->resourceid == ATOM(XdndProxy)
- || err->resourceid == ATOM(XdndAware))
- ) {
- // Perhaps we're running under SECURITY reduction? :/
- return 0;
- }
-#endif
- qDebug() << "BadAtom";
- break;
-
- case BadWindow:
- if (err->request_code == 2 /* X_ChangeWindowAttributes */
- || err->request_code == 38 /* X_QueryPointer */) {
- for (int i = 0; i < ScreenCount(dpy); ++i) {
- if (err->resourceid == RootWindow(dpy, i)) {
- // Perhaps we're running under SECURITY reduction? :/
- return 0;
- }
- }
- }
- seen_badwindow = true;
- if (err->request_code == 25 /* X_SendEvent */) {
- for (int i = 0; i < ScreenCount(dpy); ++i) {
- if (err->resourceid == RootWindow(dpy, i)) {
- // Perhaps we're running under SECURITY reduction? :/
- return 0;
- }
- }
-#if 0
- if (X11->xdndHandleBadwindow()) {
- qDebug("xdndHandleBadwindow returned true");
- return 0;
- }
-#endif
- }
-#if 0
- if (X11->ignore_badwindow)
- return 0;
-#endif
- break;
-
- case BadMatch:
- if (err->request_code == 42 /* X_SetInputFocus */)
- return 0;
- break;
-
- default:
-#if 0 //!defined(QT_NO_XINPUT)
- if (err->request_code == X11->xinput_major
- && err->error_code == (X11->xinput_errorbase + XI_BadDevice)
- && err->minor_code == 3 /* X_OpenDevice */) {
- return 0;
- }
-#endif
- break;
- }
-
- char errstr[256];
- XGetErrorText( dpy, err->error_code, errstr, 256 );
- char buffer[256];
- char request_str[256];
- qsnprintf(buffer, 256, "%d", err->request_code);
- XGetErrorDatabaseText(dpy, "XRequest", buffer, "", request_str, 256);
- if (err->request_code < 128) {
- // X error for a normal protocol request
- qWarning( "X Error: %s %d\n"
- " Major opcode: %d (%s)\n"
- " Resource id: 0x%lx",
- errstr, err->error_code,
- err->request_code,
- request_str,
- err->resourceid );
- } else {
- // X error for an extension request
- const char *extensionName = 0;
-#if 0
- if (err->request_code == X11->xrender_major)
- extensionName = "RENDER";
- else if (err->request_code == X11->xrandr_major)
- extensionName = "RANDR";
- else if (err->request_code == X11->xinput_major)
- extensionName = "XInputExtension";
- else if (err->request_code == X11->mitshm_major)
- extensionName = "MIT-SHM";
-#endif
- char minor_str[256];
- if (extensionName) {
- qsnprintf(buffer, 256, "%s.%d", extensionName, err->minor_code);
- XGetErrorDatabaseText(dpy, "XRequest", buffer, "", minor_str, 256);
- } else {
- extensionName = "Uknown extension";
- qsnprintf(minor_str, 256, "Unknown request");
- }
- qWarning( "X Error: %s %d\n"
- " Extension: %d (%s)\n"
- " Minor opcode: %d (%s)\n"
- " Resource id: 0x%lx",
- errstr, err->error_code,
- err->request_code,
- extensionName,
- err->minor_code,
- minor_str,
- err->resourceid );
- }
-
- // ### we really should distinguish between severe, non-severe and
- // ### application specific errors
-
- return 0;
-}
-
+class MyX11Cursors : public QObject
+{
+ Q_OBJECT
+public:
+ MyX11Cursors(Display * d);
+ ~MyX11Cursors() { timer.stop(); }
+ void incrementUseCount(int id);
+ void decrementUseCount(int id);
+ void createNode(int id, Cursor c);
+ bool exists(int id) { return lookupMap.contains(id); }
+ Cursor cursor(int id);
+public slots:
+ void timeout();
+
+private:
+ void removeNode(MyX11CursorNode *node);
+ void insertNode(MyX11CursorNode *node);
+
+ // linked list of cursors currently not assigned to any window
+ MyX11CursorNode *firstExpired;
+ MyX11CursorNode *lastExpired;
+
+ QHash<int, MyX11CursorNode *> lookupMap;
+ QTimer timer;
+ Display *display;
+ int removalDelay;
+};
-bool MyDisplay::handleEvent(XEvent *xe)
+QTestLiteWindow::QTestLiteWindow(const QTestLiteIntegration *platformIntegration,
+ QTestLiteScreen */*screen*/, QWidget *window)
+ :QPlatformWindow(window)
{
- //qDebug() << "handleEvent" << xe->xany.type << xe->xany.window;
- int quit = false;
- MyWindow *xw = 0;
- foreach (MyWindow *w, windowList) {
- if (w->window == xe->xany.window) {
- xw = w;
- break;
- }
- }
- if (!xw) {
-#ifdef MYX11_DEBUG
- qWarning() << "Unknown window" << hex << xe->xany.window << "received event" << xe->type;
-#endif
- return quit;
- }
+ xd = platformIntegration->xd;
+ xd->windowList.append(this);
+ {
+ int x = 0;
+ int y = 0;
+ int w = 300;
+ int h = 300; //###
- switch (xe->type) {
+ x_window = XCreateSimpleWindow(xd->display, xd->rootWindow(),
+ x, y, w, h, 0 /*border_width*/,
+ xd->blackPixel(), xd->whitePixel());
- case ClientMessage:
- if (xe->xclient.format == 32 && xe->xclient.message_type == wmProtocolsAtom) {
- Atom a = xe->xclient.data.l[0];
- if (a == wmDeleteWindowAtom)
- xw->closeEvent();
-#ifdef MYX11_DEBUG
- qDebug() << "ClientMessage WM_PROTOCOLS" << a;
-#endif
- }
-#ifdef MYX11_DEBUG
- else
- qDebug() << "ClientMessage" << xe->xclient.format << xe->xclient.message_type;
-#endif
- break;
+ }
- case Expose:
- if (xw)
- if (xe->xexpose.count == 0)
- xw->paintEvent();
- break;
- case ConfigureNotify:
- if (xw)
- xw->resizeEvent(&xe->xconfigure);
- break;
+ width = -1;
+ height = -1;
+ xpos = -1;
+ ypos = -1;
- case ButtonPress:
- xw->mousePressEvent(&xe->xbutton);
- break;
+ XSetWindowBackgroundPixmap(xd->display, x_window, XNone);
- case ButtonRelease:
- xw->mouseReleaseEvent(&xe->xbutton);
- break;
+ XSelectInput(xd->display, x_window, ExposureMask | KeyPressMask | KeyReleaseMask |
+ EnterWindowMask | LeaveWindowMask | FocusChangeMask |
+ PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask |
+ StructureNotifyMask);
- case MotionNotify:
- xw->mouseMoveEvent(&xe->xbutton);
- break;
+ gc = createGC();
- case XKeyPress:
- xw->keyPressEvent(&xe->xkey);
- break;
+ XChangeProperty (xd->display, x_window,
+ wmProtocolsAtom,
+ XA_ATOM, 32, PropModeAppend,
+ (unsigned char *) &wmDeleteWindowAtom, 1);
- case XKeyRelease:
- xw->keyReleaseEvent(&xe->xkey);
- break;
- case EnterNotify:
- xw->enterEvent(&xe->xcrossing);
- break;
+ setWindowTitle(QLatin1String("Qt Lighthouse"));
- case LeaveNotify:
- xw->leaveEvent(&xe->xcrossing);
- break;
+ currentCursor = -1;
+ windowSurface = 0;
- default:
-#ifdef MYX11_DEBUG
- qDebug() << hex << xe->xany.window << "Other X event" << xe->type;
-#endif
- break;
- }
- return quit;
-};
+ setWindowFlags(window->windowFlags()); //##### This should not be the plugin's responsibility
+ //xw->windowTL = this;
+}
-MyDisplay::MyDisplay()
+QTestLiteWindow::~QTestLiteWindow()
{
- char *display_name = getenv("DISPLAY");
- display = XOpenDisplay(display_name);
- if (!display) {
- fprintf(stderr, "Cannot connect to X server: %s\n",
- display_name);
- exit(1);
- }
-
-#ifndef DONT_USE_MIT_SHM
- Status MIT_SHM_extension_supported = XShmQueryExtension (display);
- Q_ASSERT(MIT_SHM_extension_supported == True);
+#ifdef MYX11_DEBUG
+ qDebug() << "~QTestLiteWindow" << hex << x_window;
#endif
- original_x_errhandler = XSetErrorHandler(qt_x_errhandler);
+ XFreeGC(xd->display, gc);
+ XDestroyWindow(xd->display, x_window);
- if (qgetenv("DO_X_SYNCHRONIZE").toInt())
- XSynchronize(display, true);
+ xd->windowList.removeAll(this);
+}
- screen = DefaultScreen(display);
- width = DisplayWidth(display, screen);
- height = DisplayHeight(display, screen);
- physicalWidth = DisplayWidthMM(display, screen);
- physicalHeight = DisplayHeightMM(display, screen);
- int xSocketNumber = XConnectionNumber(display);
-#ifdef MYX11_DEBUG
- qDebug() << "X socket:"<< xSocketNumber;
-#endif
- QSocketNotifier *sock = new QSocketNotifier(xSocketNumber, QSocketNotifier::Read, this);
- connect(sock, SIGNAL(activated(int)), this, SLOT(eventDispatcher()));
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Mouse event stuff
- wmProtocolsAtom = XInternAtom (display, "WM_PROTOCOLS", False);
- wmDeleteWindowAtom = XInternAtom (display, "WM_DELETE_WINDOW", False);
- cursors = new MyX11Cursors(display);
-}
-MyDisplay::~MyDisplay()
+static Qt::MouseButtons translateMouseButtons(int s)
{
- XCloseDisplay(display);
+ Qt::MouseButtons ret = 0;
+ if (s & Button1Mask)
+ ret |= Qt::LeftButton;
+ if (s & Button2Mask)
+ ret |= Qt::MidButton;
+ if (s & Button3Mask)
+ ret |= Qt::RightButton;
+ return ret;
}
-void MyDisplay::eventDispatcher()
+static Qt::KeyboardModifiers translateModifiers(int s)
{
-// qDebug() << "eventDispatcher";
-
-
- ulong marker = XNextRequest(display);
-// int i = 0;
- while (XPending(display)) {
- XEvent event;
- XNextEvent(display, &event);
- /* done = */
- handleEvent(&event);
-
- if (event.xany.serial >= marker) {
-#ifdef MYX11_DEBUG
- qDebug() << "potential livelock averted";
-#endif
+ const uchar qt_alt_mask = Mod1Mask;
+ const uchar qt_meta_mask = Mod4Mask;
+
+
+ Qt::KeyboardModifiers ret = 0;
+ if (s & ShiftMask)
+ ret |= Qt::ShiftModifier;
+ if (s & ControlMask)
+ ret |= Qt::ControlModifier;
+ if (s & qt_alt_mask)
+ ret |= Qt::AltModifier;
+ if (s & qt_meta_mask)
+ ret |= Qt::MetaModifier;
#if 0
- if (XEventsQueued(display, QueuedAfterFlush)) {
- qDebug() << " with events queued";
- QTimer::singleShot(0, this, SLOT(eventDispatcher()));
- }
+ if (s & qt_mode_switch_mask)
+ ret |= Qt::GroupSwitchModifier;
#endif
- break;
- }
- }
+ return ret;
}
-
-QImage MyDisplay::grabWindow(Window window, int x, int y, int w, int h)
+void QTestLiteWindow::handleMouseEvent(QEvent::Type type, XButtonEvent *e)
{
- if (w == 0 || h ==0)
- return QImage();
+ static QPoint mousePoint;
+
+ Qt::MouseButton button = Qt::NoButton;
+ Qt::MouseButtons buttons = translateMouseButtons(e->state);
+ Qt::KeyboardModifiers modifiers = translateModifiers(e->state);
+ if (type != QEvent::MouseMove) {
+ switch (e->button) {
+ case Button1: button = Qt::LeftButton; break;
+ case Button2: button = Qt::MidButton; break;
+ case Button3: button = Qt::RightButton; break;
+ case Button4:
+ case Button5:
+ case 6:
+ case 7: {
+ //mouse wheel
+ if (type == QEvent::MouseButtonPress) {
+ //logic borrowed from qapplication_x11.cpp
+ int delta = 120 * ((e->button == Button4 || e->button == 6) ? 1 : -1);
+ bool hor = (((e->button == Button4 || e->button == Button5)
+ && (modifiers & Qt::AltModifier))
+ || (e->button == 6 || e->button == 7));
+ QWindowSystemInterface::handleWheelEvent(widget(), e->time,
+ QPoint(e->x, e->y),
+ QPoint(e->x_root, e->y_root),
+ delta, hor ? Qt::Horizontal : Qt::Vertical);
+ }
+ return;
+ }
+ default: break;
+ }
+ }
- //WinId 0 means the desktop widget
- if (!window)
- window = rootWindow();
+ buttons ^= button; // X event uses state *before*, Qt uses state *after*
- XWindowAttributes window_attr;
- if (!XGetWindowAttributes(display, window, &window_attr))
- return QImage();
+ QWindowSystemInterface::handleMouseEvent(widget(), e->time, QPoint(e->x, e->y),
+ QPoint(e->x_root, e->y_root),
+ buttons);
- if (w < 0)
- w = window_attr.width - x;
- if (h < 0)
- h = window_attr.height - y;
+ mousePoint = QPoint(e->x_root, e->y_root);
+}
- // Ideally, we should also limit ourselves to the screen area, but the Qt docs say
- // that it's "unsafe" to go outside the screen, so we can ignore that problem.
+void QTestLiteWindow::handleCloseEvent()
+{
+ QWindowSystemInterface::handleCloseEvent(widget());
+}
- //We're definitely not optimizing for speed...
- XImage *xi = XGetImage(display, window, x, y, w, h, AllPlanes, ZPixmap);
- if (!xi)
- return QImage();
+void QTestLiteWindow::handleEnterEvent()
+{
+ QWindowSystemInterface::handleEnterEvent(widget());
+}
- //taking a copy to make sure we have ownership -- not fast
- QImage result = QImage( (uchar*) xi->data, xi->width, xi->height, xi->bytes_per_line, QImage::Format_RGB32 ).copy();
+void QTestLiteWindow::handleLeaveEvent()
+{
+ QWindowSystemInterface::handleLeaveEvent(widget());
+}
- XDestroyImage(xi);
- return result;
-}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Key event stuff -- not pretty either
+//
+// What we want to do is to port Robert's keytable code properly
+
+// keyboard mapping table
+static const unsigned int keyTbl[] = {
+
+ // misc keys
+
+ XK_Escape, Qt::Key_Escape,
+ XK_Tab, Qt::Key_Tab,
+ XK_ISO_Left_Tab, Qt::Key_Backtab,
+ XK_BackSpace, Qt::Key_Backspace,
+ XK_Return, Qt::Key_Return,
+ XK_Insert, Qt::Key_Insert,
+ XK_Delete, Qt::Key_Delete,
+ XK_Clear, Qt::Key_Delete,
+ XK_Pause, Qt::Key_Pause,
+ XK_Print, Qt::Key_Print,
+ 0x1005FF60, Qt::Key_SysReq, // hardcoded Sun SysReq
+ 0x1007ff00, Qt::Key_SysReq, // hardcoded X386 SysReq
+
+ // cursor movement
+
+ XK_Home, Qt::Key_Home,
+ XK_End, Qt::Key_End,
+ XK_Left, Qt::Key_Left,
+ XK_Up, Qt::Key_Up,
+ XK_Right, Qt::Key_Right,
+ XK_Down, Qt::Key_Down,
+ XK_Prior, Qt::Key_PageUp,
+ XK_Next, Qt::Key_PageDown,
+
+ // modifiers
+
+ XK_Shift_L, Qt::Key_Shift,
+ XK_Shift_R, Qt::Key_Shift,
+ XK_Shift_Lock, Qt::Key_Shift,
+ XK_Control_L, Qt::Key_Control,
+ XK_Control_R, Qt::Key_Control,
+ XK_Meta_L, Qt::Key_Meta,
+ XK_Meta_R, Qt::Key_Meta,
+ XK_Alt_L, Qt::Key_Alt,
+ XK_Alt_R, Qt::Key_Alt,
+ XK_Caps_Lock, Qt::Key_CapsLock,
+ XK_Num_Lock, Qt::Key_NumLock,
+ XK_Scroll_Lock, Qt::Key_ScrollLock,
+ XK_Super_L, Qt::Key_Super_L,
+ XK_Super_R, Qt::Key_Super_R,
+ XK_Menu, Qt::Key_Menu,
+ XK_Hyper_L, Qt::Key_Hyper_L,
+ XK_Hyper_R, Qt::Key_Hyper_R,
+ XK_Help, Qt::Key_Help,
+ 0x1000FF74, Qt::Key_Backtab, // hardcoded HP backtab
+ 0x1005FF10, Qt::Key_F11, // hardcoded Sun F36 (labeled F11)
+ 0x1005FF11, Qt::Key_F12, // hardcoded Sun F37 (labeled F12)
+
+ // numeric and function keypad keys
+
+ XK_KP_Space, Qt::Key_Space,
+ XK_KP_Tab, Qt::Key_Tab,
+ XK_KP_Enter, Qt::Key_Enter,
+ //XK_KP_F1, Qt::Key_F1,
+ //XK_KP_F2, Qt::Key_F2,
+ //XK_KP_F3, Qt::Key_F3,
+ //XK_KP_F4, Qt::Key_F4,
+ XK_KP_Home, Qt::Key_Home,
+ XK_KP_Left, Qt::Key_Left,
+ XK_KP_Up, Qt::Key_Up,
+ XK_KP_Right, Qt::Key_Right,
+ XK_KP_Down, Qt::Key_Down,
+ XK_KP_Prior, Qt::Key_PageUp,
+ XK_KP_Next, Qt::Key_PageDown,
+ XK_KP_End, Qt::Key_End,
+ XK_KP_Begin, Qt::Key_Clear,
+ XK_KP_Insert, Qt::Key_Insert,
+ XK_KP_Delete, Qt::Key_Delete,
+ XK_KP_Equal, Qt::Key_Equal,
+ XK_KP_Multiply, Qt::Key_Asterisk,
+ XK_KP_Add, Qt::Key_Plus,
+ XK_KP_Separator, Qt::Key_Comma,
+ XK_KP_Subtract, Qt::Key_Minus,
+ XK_KP_Decimal, Qt::Key_Period,
+ XK_KP_Divide, Qt::Key_Slash,
+
+ // International input method support keys
+
+ // International & multi-key character composition
+ XK_ISO_Level3_Shift, Qt::Key_AltGr,
+ XK_Multi_key, Qt::Key_Multi_key,
+ XK_Codeinput, Qt::Key_Codeinput,
+ XK_SingleCandidate, Qt::Key_SingleCandidate,
+ XK_MultipleCandidate, Qt::Key_MultipleCandidate,
+ XK_PreviousCandidate, Qt::Key_PreviousCandidate,
+
+ // Misc Functions
+ XK_Mode_switch, Qt::Key_Mode_switch,
+ XK_script_switch, Qt::Key_Mode_switch,
+
+ // Japanese keyboard support
+ XK_Kanji, Qt::Key_Kanji,
+ XK_Muhenkan, Qt::Key_Muhenkan,
+ //XK_Henkan_Mode, Qt::Key_Henkan_Mode,
+ XK_Henkan_Mode, Qt::Key_Henkan,
+ XK_Henkan, Qt::Key_Henkan,
+ XK_Romaji, Qt::Key_Romaji,
+ XK_Hiragana, Qt::Key_Hiragana,
+ XK_Katakana, Qt::Key_Katakana,
+ XK_Hiragana_Katakana, Qt::Key_Hiragana_Katakana,
+ XK_Zenkaku, Qt::Key_Zenkaku,
+ XK_Hankaku, Qt::Key_Hankaku,
+ XK_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku,
+ XK_Touroku, Qt::Key_Touroku,
+ XK_Massyo, Qt::Key_Massyo,
+ XK_Kana_Lock, Qt::Key_Kana_Lock,
+ XK_Kana_Shift, Qt::Key_Kana_Shift,
+ XK_Eisu_Shift, Qt::Key_Eisu_Shift,
+ XK_Eisu_toggle, Qt::Key_Eisu_toggle,
+ //XK_Kanji_Bangou, Qt::Key_Kanji_Bangou,
+ //XK_Zen_Koho, Qt::Key_Zen_Koho,
+ //XK_Mae_Koho, Qt::Key_Mae_Koho,
+ XK_Kanji_Bangou, Qt::Key_Codeinput,
+ XK_Zen_Koho, Qt::Key_MultipleCandidate,
+ XK_Mae_Koho, Qt::Key_PreviousCandidate,
+
+#ifdef XK_KOREAN
+ // Korean keyboard support
+ XK_Hangul, Qt::Key_Hangul,
+ XK_Hangul_Start, Qt::Key_Hangul_Start,
+ XK_Hangul_End, Qt::Key_Hangul_End,
+ XK_Hangul_Hanja, Qt::Key_Hangul_Hanja,
+ XK_Hangul_Jamo, Qt::Key_Hangul_Jamo,
+ XK_Hangul_Romaja, Qt::Key_Hangul_Romaja,
+ //XK_Hangul_Codeinput, Qt::Key_Hangul_Codeinput,
+ XK_Hangul_Codeinput, Qt::Key_Codeinput,
+ XK_Hangul_Jeonja, Qt::Key_Hangul_Jeonja,
+ XK_Hangul_Banja, Qt::Key_Hangul_Banja,
+ XK_Hangul_PreHanja, Qt::Key_Hangul_PreHanja,
+ XK_Hangul_PostHanja, Qt::Key_Hangul_PostHanja,
+ //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate,
+ //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate,
+ //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate,
+ XK_Hangul_SingleCandidate, Qt::Key_SingleCandidate,
+ XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate,
+ XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate,
+ XK_Hangul_Special, Qt::Key_Hangul_Special,
+ //XK_Hangul_switch, Qt::Key_Hangul_switch,
+ XK_Hangul_switch, Qt::Key_Mode_switch,
+#endif // XK_KOREAN
+
+ // dead keys
+ XK_dead_grave, Qt::Key_Dead_Grave,
+ XK_dead_acute, Qt::Key_Dead_Acute,
+ XK_dead_circumflex, Qt::Key_Dead_Circumflex,
+ XK_dead_tilde, Qt::Key_Dead_Tilde,
+ XK_dead_macron, Qt::Key_Dead_Macron,
+ XK_dead_breve, Qt::Key_Dead_Breve,
+ XK_dead_abovedot, Qt::Key_Dead_Abovedot,
+ XK_dead_diaeresis, Qt::Key_Dead_Diaeresis,
+ XK_dead_abovering, Qt::Key_Dead_Abovering,
+ XK_dead_doubleacute, Qt::Key_Dead_Doubleacute,
+ XK_dead_caron, Qt::Key_Dead_Caron,
+ XK_dead_cedilla, Qt::Key_Dead_Cedilla,
+ XK_dead_ogonek, Qt::Key_Dead_Ogonek,
+ XK_dead_iota, Qt::Key_Dead_Iota,
+ XK_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound,
+ XK_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound,
+ XK_dead_belowdot, Qt::Key_Dead_Belowdot,
+ XK_dead_hook, Qt::Key_Dead_Hook,
+ XK_dead_horn, Qt::Key_Dead_Horn,
+#if 0
+ // Special multimedia keys
+ // currently only tested with MS internet keyboard
+
+ // browsing keys
+ XF86XK_Back, Qt::Key_Back,
+ XF86XK_Forward, Qt::Key_Forward,
+ XF86XK_Stop, Qt::Key_Stop,
+ XF86XK_Refresh, Qt::Key_Refresh,
+ XF86XK_Favorites, Qt::Key_Favorites,
+ XF86XK_AudioMedia, Qt::Key_LaunchMedia,
+ XF86XK_OpenURL, Qt::Key_OpenUrl,
+ XF86XK_HomePage, Qt::Key_HomePage,
+ XF86XK_Search, Qt::Key_Search,
+
+ // media keys
+ XF86XK_AudioLowerVolume, Qt::Key_VolumeDown,
+ XF86XK_AudioMute, Qt::Key_VolumeMute,
+ XF86XK_AudioRaiseVolume, Qt::Key_VolumeUp,
+ XF86XK_AudioPlay, Qt::Key_MediaPlay,
+ XF86XK_AudioStop, Qt::Key_MediaStop,
+ XF86XK_AudioPrev, Qt::Key_MediaPrevious,
+ XF86XK_AudioNext, Qt::Key_MediaNext,
+ XF86XK_AudioRecord, Qt::Key_MediaRecord,
+
+ // launch keys
+ XF86XK_Mail, Qt::Key_LaunchMail,
+ XF86XK_MyComputer, Qt::Key_Launch0,
+ XF86XK_Calculator, Qt::Key_Launch1,
+ XF86XK_Standby, Qt::Key_Standby,
+
+ XF86XK_Launch0, Qt::Key_Launch2,
+ XF86XK_Launch1, Qt::Key_Launch3,
+ XF86XK_Launch2, Qt::Key_Launch4,
+ XF86XK_Launch3, Qt::Key_Launch5,
+ XF86XK_Launch4, Qt::Key_Launch6,
+ XF86XK_Launch5, Qt::Key_Launch7,
+ XF86XK_Launch6, Qt::Key_Launch8,
+ XF86XK_Launch7, Qt::Key_Launch9,
+ XF86XK_Launch8, Qt::Key_LaunchA,
+ XF86XK_Launch9, Qt::Key_LaunchB,
+ XF86XK_LaunchA, Qt::Key_LaunchC,
+ XF86XK_LaunchB, Qt::Key_LaunchD,
+ XF86XK_LaunchC, Qt::Key_LaunchE,
+ XF86XK_LaunchD, Qt::Key_LaunchF,
+#endif
+#if 0
+ // Qtopia keys
+ QTOPIAXK_Select, Qt::Key_Select,
+ QTOPIAXK_Yes, Qt::Key_Yes,
+ QTOPIAXK_No, Qt::Key_No,
+ QTOPIAXK_Cancel, Qt::Key_Cancel,
+ QTOPIAXK_Printer, Qt::Key_Printer,
+ QTOPIAXK_Execute, Qt::Key_Execute,
+ QTOPIAXK_Sleep, Qt::Key_Sleep,
+ QTOPIAXK_Play, Qt::Key_Play,
+ QTOPIAXK_Zoom, Qt::Key_Zoom,
+ QTOPIAXK_Context1, Qt::Key_Context1,
+ QTOPIAXK_Context2, Qt::Key_Context2,
+ QTOPIAXK_Context3, Qt::Key_Context3,
+ QTOPIAXK_Context4, Qt::Key_Context4,
+ QTOPIAXK_Call, Qt::Key_Call,
+ QTOPIAXK_Hangup, Qt::Key_Hangup,
+ QTOPIAXK_Flip, Qt::Key_Flip,
+#endif
+ 0, 0
+};
-struct MyShmImageInfo {
- MyShmImageInfo(Display *xdisplay) : image(0), display(xdisplay) {}
- ~MyShmImageInfo() { destroy(); }
+static int lookupCode(unsigned int xkeycode)
+{
+ if (xkeycode >= XK_F1 && xkeycode <= XK_F35)
+ return Qt::Key_F1 + (int(xkeycode) - XK_F1);
+
+ const unsigned int *p = keyTbl;
+ while (*p) {
+ if (*p == xkeycode)
+ return *++p;
+ p += 2;
+ }
- void destroy();
+ return 0;
+}
- XShmSegmentInfo shminfo;
- XImage *image;
- Display *display;
-};
-MyWindow::MyWindow(MyDisplay *display, int x, int y, int w, int h)
+static Qt::KeyboardModifiers modifierFromKeyCode(int qtcode)
{
- xd = display;
+ switch (qtcode) {
+ case Qt::Key_Control:
+ return Qt::ControlModifier;
+ case Qt::Key_Alt:
+ return Qt::AltModifier;
+ case Qt::Key_Shift:
+ return Qt::ShiftModifier;
+ case Qt::Key_Meta:
+ return Qt::MetaModifier;
+ default:
+ return Qt::NoModifier;
+ }
+}
- xd->windowList.append(this);
+void QTestLiteWindow::handleKeyEvent(QEvent::Type type, void *ev)
+{
+ XKeyEvent *e = static_cast<XKeyEvent*>(ev);
- window = XCreateSimpleWindow(xd->display, xd->rootWindow(),
- x, y, w, h, 0 /*border_width*/,
- xd->blackPixel(), xd->whitePixel());
+ KeySym keySym;
+ QByteArray chars;
+ chars.resize(513);
+ int count = XLookupString(e, chars.data(), chars.size(), &keySym, 0);
+ Q_UNUSED(count);
+// qDebug() << "QTLWS::handleKeyEvent" << count << hex << "XKeysym:" << keySym;
+// if (count)
+// qDebug() << hex << int(chars[0]) << "String:" << chars;
-#ifdef MYX11_DEBUG
- qDebug() << "MyWindow::MyWindow" << hex << window;
-#endif
+ Qt::KeyboardModifiers modifiers = translateModifiers(e->state);
+ int qtcode = lookupCode(keySym);
+// qDebug() << "lookup: " << hex << keySym << qtcode << "mod" << modifiers;
- width = -1;
- height = -1;
- xpos = -1;
- ypos = -1;
-
- XSetWindowBackgroundPixmap(xd->display, window, XNone);
+ //X11 specifies state *before*, Qt expects state *after* the event
- XSelectInput(xd->display, window, ExposureMask | KeyPressMask | KeyReleaseMask |
- EnterWindowMask | LeaveWindowMask | FocusChangeMask |
- PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ButtonMotionMask |
- StructureNotifyMask);
+ modifiers ^= modifierFromKeyCode(qtcode);
- gc = createGC();
+ if (qtcode) {
+ QWindowSystemInterface::handleKeyEvent(widget(), e->time, type, qtcode, modifiers);
+ } else if (chars[0]) {
+ int qtcode = chars.toUpper()[0]; //Not exactly right...
+ if (modifiers & Qt::ControlModifier && qtcode < ' ')
+ qtcode = chars[0] + '@';
+ QWindowSystemInterface::handleKeyEvent(widget(), e->time, type, qtcode, modifiers, QString::fromLatin1(chars));
+ } else {
+ qWarning() << "unknown X keycode" << hex << e->keycode << keySym;
+ }
+}
- XChangeProperty (xd->display, window,
- wmProtocolsAtom,
- XA_ATOM, 32, PropModeAppend,
- (unsigned char *) &wmDeleteWindowAtom, 1);
+void QTestLiteWindow::setGeometry(const QRect &rect)
+{
+ QRect oldRect = geometry();
+ if (rect == oldRect)
+ return;
+ //if unchanged ###
+ XMoveResizeWindow(xd->display, x_window, rect.x(), rect.y(), rect.width(), rect.height());
+ QPlatformWindow::setGeometry(rect);
+}
- setWindowTitle(QLatin1String("Qt Lighthouse"));
- currentCursor = -1;
+Qt::WindowFlags QTestLiteWindow::windowFlags() const
+{
+ return window_flags;
+}
- image_info = 0;
- painted = false;
+WId QTestLiteWindow::winId() const
+{
+ return x_window;
}
+void QTestLiteWindow::raise()
+{
+ XRaiseWindow(xd->display, x_window);
+}
-void MyWindow::setWindowTitle(const QString &title)
+void QTestLiteWindow::lower()
+{
+ XLowerWindow(xd->display, x_window);
+}
+void QTestLiteWindow::setWindowTitle(const QString &title)
{
QByteArray ba = title.toLatin1(); //We're not making a general solution here...
XTextProperty windowName;
@@ -482,141 +655,34 @@ void MyWindow::setWindowTitle(const QString &title)
windowName.format = 8;
windowName.nitems = ba.length();
- XSetWMName(xd->display, window, &windowName);
+ XSetWMName(xd->display, x_window, &windowName);
}
-MyWindow::~MyWindow()
-{
-#ifdef MYX11_DEBUG
- qDebug() << "~MyWindow" << hex << window;
-#endif
- XFreeGC(xd->display, gc);
- XDestroyWindow(xd->display, window);
- xd->windowList.removeAll(this);
- delete image_info;
-}
-
-GC MyWindow::createGC()
+GC QTestLiteWindow::createGC()
{
GC gc;
- gc = XCreateGC(xd->display, window, 0, 0);
+ gc = XCreateGC(xd->display, x_window, 0, 0);
if (gc < 0) {
- qWarning("MyWindow::createGC() could not create GC");
+ qWarning("QTestLiteWindow::createGC() could not create GC");
}
return gc;
}
-void MyWindow::closeEvent()
-{
- windowSurface->handleCloseEvent();
-}
-void MyWindow::paintEvent()
+void QTestLiteWindow::paintEvent()
{
#ifdef MYX11_DEBUG
- qDebug() << "MyWindow::paintEvent" << shm_img.size() << painted;
+ qDebug() << "QTestLiteWindow::paintEvent" << shm_img.size() << painted;
#endif
- if (!painted)
- return;
-
-#ifdef DONT_USE_MIT_SHM
- // just convert the image every time...
- if (!shm_img.isNull()) {
- Visual *visual = DefaultVisual(xd->display, xd->screen);
-
- QImage image = shm_img;
- //img.convertToFormat(
- XImage *xi = XCreateImage(xd->display, visual, 24, ZPixmap,
- 0, (char *) image.scanLine(0), image.width(), image.height(),
- 32, image.bytesPerLine());
-
- int x = 0;
- int y = 0;
-
- /*int r =*/ XPutImage(xd->display, window, gc, xi, 0, 0, x, y, image.width(), image.height());
-
- xi->data = 0; // QImage owns these bits
- XDestroyImage(xi);
- }
-#else
- // Use MIT_SHM
- if (image_info->image) {
- //qDebug() << "Here we go" << image_info->image->width << image_info->image->height;
- int x = 0;
- int y = 0;
- // We could set send_event to true, and then use the ShmCompletion to synchronize,
- // but let's do like Qt/11 and just use XSync
- XShmPutImage (xd->display, window, gc, image_info->image, 0, 0,
- x, y, image_info->image->width, image_info->image->height,
- /*send_event*/ False);
-
- XSync(xd->display, False);
- }
-#endif
+ windowSurface->flush(windowSurface->window(), QRect(xpos,ypos,width, height), QPoint());
}
-#ifndef DONT_USE_MIT_SHM
-void MyShmImageInfo::destroy()
-{
- XShmDetach (display, &shminfo);
- XDestroyImage (image);
- shmdt (shminfo.shmaddr);
- shmctl (shminfo.shmid, IPC_RMID, 0);
-}
-#endif
-void MyWindow::resizeShmImage(int width, int height)
-{
-#ifdef DONT_USE_MIT_SHM
- shm_img = QImage(width, height, QImage::Format_RGB32);
-#else
- if (image_info)
- image_info->destroy();
- else
- image_info = new MyShmImageInfo(xd->display);
-
- Visual *visual = DefaultVisual(xd->display, xd->screen);
-
-
- XImage *image = XShmCreateImage (xd->display, visual, 24, ZPixmap, 0,
- &image_info->shminfo, width, height);
-
-
- image_info->shminfo.shmid = shmget (IPC_PRIVATE,
- image->bytes_per_line * image->height, IPC_CREAT|0777);
-
- image_info->shminfo.shmaddr = image->data = (char*)shmat (image_info->shminfo.shmid, 0, 0);
- image_info->shminfo.readOnly = False;
-
- image_info->image = image;
-
- Status shm_attach_status = XShmAttach(xd->display, &image_info->shminfo);
-
- Q_ASSERT(shm_attach_status == True);
-
- shm_img = QImage( (uchar*) image->data, image->width, image->height, image->bytes_per_line, QImage::Format_RGB32 );
-#endif
- painted = false;
-}
-
-
-void MyWindow::resizeBuffer(QSize s)
-{
- if (shm_img.size() != s)
- resizeShmImage(s.width(), s.height());
-}
-
-QSize MyWindow::bufferSize() const
-{
- return shm_img.size();
-}
-
-
-void MyWindow::resizeEvent(XConfigureEvent *e)
+void QTestLiteWindow::resizeEvent(XConfigureEvent *e)
{
if ((e->width != width || e->height != height) && e->x == 0 && e->y == 0) {
@@ -633,42 +699,11 @@ void MyWindow::resizeEvent(XConfigureEvent *e)
qDebug() << hex << window << dec << "ConfigureNotify" << e->x << e->y << e->width << e->height << "geometry" << xpos << ypos << width << height << "img:" << shm_img.size();
#endif
- windowSurface->handleGeometryChange(xpos, ypos, width, height);
-}
-
-#if 0
-void MyWindow::setSize(int w, int h)
-{
- XResizeWindow(xd->display, window, w, h);
-}
-#endif
-
-void MyWindow::setGeometry(int x, int y, int w, int h)
-{
-#ifdef MYX11_DEBUG
- qDebug() << "MyWindow::setGeometry" << hex << window << dec << x << y << w << h << "img:" << shm_img.size();
-#endif
- XMoveResizeWindow(xd->display, window, x, y, w, h);
+ QWindowSystemInterface::handleGeometryChange(widget(), QRect(xpos, ypos, width, height));
}
-void MyWindow::enterEvent(XCrossingEvent *)
-{
-#ifdef MYX11_DEBUG
- qDebug() << "MyWindow::enterEvent" << hex << window;
-#endif
- windowSurface->handleEnterEvent();
-}
-
-void MyWindow::leaveEvent(XCrossingEvent *)
-{
-#ifdef MYX11_DEBUG
- qDebug() << "MyWindow::enterEvent" << hex << window;
-#endif
- windowSurface->handleLeaveEvent();
-}
-
-void MyWindow::mousePressEvent(XButtonEvent *e)
+void QTestLiteWindow::mousePressEvent(XButtonEvent *e)
{
static long prevTime = 0;
static Window prevWindow;
@@ -688,36 +723,9 @@ void MyWindow::mousePressEvent(XButtonEvent *e)
prevX = e->x;
prevY = e->y;
- windowSurface->handleMouseEvent(type, e);
-}
-
-void MyWindow::mouseReleaseEvent(XButtonEvent *e)
-{
- windowSurface->handleMouseEvent(QEvent::MouseButtonRelease, e);
-}
-
-void MyWindow::mouseMoveEvent(XButtonEvent *e)
-{
- windowSurface->handleMouseEvent(QEvent::MouseMove, e);
+ handleMouseEvent(type, e);
}
-#ifdef KeyPress
-#undef KeyPress
-#endif
-
-void MyWindow::keyPressEvent(XKeyEvent *e)
-{
- windowSurface->handleKeyEvent(QEvent::KeyPress, e);
-}
-
-#ifdef KeyRelease
-#undef KeyRelease
-#endif
-
-void MyWindow::keyReleaseEvent(XKeyEvent *e)
-{
- windowSurface->handleKeyEvent(QEvent::KeyRelease, e);
-}
// WindowFlag stuff, lots of copied code from qwidget_x11.cpp...
@@ -761,6 +769,7 @@ enum {
static Atom mwm_hint_atom = XNone;
+#if 0
static QtMWMHints GetMWMHints(Display *display, Window window)
{
QtMWMHints mwmhints;
@@ -789,6 +798,7 @@ static QtMWMHints GetMWMHints(Display *display, Window window)
return mwmhints;
}
+#endif
static void SetMWMHints(Display *display, Window window, const QtMWMHints &mwmhints)
{
@@ -815,15 +825,17 @@ static inline bool isTransient(const QWidget *w)
-Qt::WindowFlags MyWindow::setWindowFlags(Qt::WindowFlags flags)
+Qt::WindowFlags QTestLiteWindow::setWindowFlags(Qt::WindowFlags flags)
{
+ Q_ASSERT(flags & Qt::Window);
+ window_flags = flags;
if (mwm_hint_atom == XNone) {
mwm_hint_atom = XInternAtom(xd->display, "_MOTIF_WM_HINTS\0", False);
}
#ifdef MYX11_DEBUG
- qDebug() << "MyWindow::setWindowFlags" << hex << window << "flags" << flags;
+ qDebug() << "QTestLiteWindow::setWindowFlags" << hex << window << "flags" << flags;
#endif
Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
@@ -840,6 +852,12 @@ Qt::WindowFlags MyWindow::setWindowFlags(Qt::WindowFlags flags)
bool tool = (type == Qt::Tool || type == Qt::SplashScreen
|| type == Qt::ToolTip || type == Qt::Drawer);
+
+ Q_UNUSED(topLevel);
+ Q_UNUSED(dialog);
+ Q_UNUSED(desktop);
+
+
bool tooltip = (type == Qt::ToolTip);
XSetWindowAttributes wsa;
@@ -920,7 +938,7 @@ Qt::WindowFlags MyWindow::setWindowFlags(Qt::WindowFlags flags)
mwmhints.decorations = 0;
}
- SetMWMHints(xd->display, window, mwmhints);
+ SetMWMHints(xd->display, x_window, mwmhints);
//##### only if initializeWindow???
@@ -933,7 +951,7 @@ Qt::WindowFlags MyWindow::setWindowFlags(Qt::WindowFlags flags)
wsa.override_redirect = True;
wsa.save_under = True;
- XChangeWindowAttributes(xd->display, window, CWOverrideRedirect | CWSaveUnder,
+ XChangeWindowAttributes(xd->display, x_window, CWOverrideRedirect | CWSaveUnder,
&wsa);
} else {
#ifdef MYX11_DEBUG
@@ -944,17 +962,149 @@ Qt::WindowFlags MyWindow::setWindowFlags(Qt::WindowFlags flags)
return flags;
}
-void MyWindow::setVisible(bool visible)
+void QTestLiteWindow::setVisible(bool visible)
{
#ifdef MYX11_DEBUG
- qDebug() << "MyWindow::setVisible" << visible << hex << window;
+ qDebug() << "QTestLiteWindow::setVisible" << visible << hex << window;
#endif
if (visible)
- XMapWindow(xd->display, window);
+ XMapWindow(xd->display, x_window);
else
- XUnmapWindow(xd->display, window);
+ XUnmapWindow(xd->display, x_window);
+}
+
+
+void QTestLiteWindow::setCursor(QCursor * cursor)
+{
+ int id = cursor->handle();
+ if (id == currentCursor)
+ return;
+ Cursor c;
+ if (!xd->cursors->exists(id)) {
+ if (cursor->shape() == Qt::BitmapCursor)
+ c = createCursorBitmap(cursor);
+ else
+ c = createCursorShape(cursor->shape());
+ if (!c) {
+ return;
+ }
+ xd->cursors->createNode(id, c);
+ } else {
+ xd->cursors->incrementUseCount(id);
+ c = xd->cursors->cursor(id);
+ }
+
+ if (currentCursor != -1)
+ xd->cursors->decrementUseCount(currentCursor);
+ currentCursor = id;
+
+ XDefineCursor(xd->display, x_window, c);
+ XFlush(xd->display);
+}
+
+Cursor QTestLiteWindow::createCursorBitmap(QCursor * cursor)
+{
+ XColor bg, fg;
+ bg.red = 255 << 8;
+ bg.green = 255 << 8;
+ bg.blue = 255 << 8;
+ fg.red = 0;
+ fg.green = 0;
+ fg.blue = 0;
+ QPoint spot = cursor->hotSpot();
+ Window rootwin = x_window;
+
+ QImage mapImage = cursor->bitmap()->toImage().convertToFormat(QImage::Format_MonoLSB);
+ QImage maskImage = cursor->mask()->toImage().convertToFormat(QImage::Format_MonoLSB);
+
+ int width = cursor->bitmap()->width();
+ int height = cursor->bitmap()->height();
+ int bytesPerLine = mapImage.bytesPerLine();
+ int destLineSize = width / 8;
+ if (width % 8)
+ destLineSize++;
+
+ const uchar * map = mapImage.bits();
+ const uchar * mask = maskImage.bits();
+
+ char * mapBits = new char[height * destLineSize];
+ char * maskBits = new char[height * destLineSize];
+ for (int i = 0; i < height; i++) {
+ memcpy(mapBits + (destLineSize * i),map + (bytesPerLine * i), destLineSize);
+ memcpy(maskBits + (destLineSize * i),mask + (bytesPerLine * i), destLineSize);
+ }
+
+ Pixmap cp = XCreateBitmapFromData(xd->display, rootwin, mapBits, width, height);
+ Pixmap mp = XCreateBitmapFromData(xd->display, rootwin, maskBits, width, height);
+ Cursor c = XCreatePixmapCursor(xd->display, cp, mp, &fg, &bg, spot.x(), spot.y());
+ XFreePixmap(xd->display, cp);
+ XFreePixmap(xd->display, mp);
+ delete[] mapBits;
+ delete[] maskBits;
+
+ return c;
}
+Cursor QTestLiteWindow::createCursorShape(int cshape)
+{
+ Cursor cursor = 0;
+
+ if (cshape < 0 || cshape > Qt::LastCursor)
+ return 0;
+
+ switch (cshape) {
+ case Qt::ArrowCursor:
+ cursor = XCreateFontCursor(xd->display, XC_left_ptr);
+ break;
+ case Qt::UpArrowCursor:
+ cursor = XCreateFontCursor(xd->display, XC_center_ptr);
+ break;
+ case Qt::CrossCursor:
+ cursor = XCreateFontCursor(xd->display, XC_crosshair);
+ break;
+ case Qt::WaitCursor:
+ cursor = XCreateFontCursor(xd->display, XC_watch);
+ break;
+ case Qt::IBeamCursor:
+ cursor = XCreateFontCursor(xd->display, XC_xterm);
+ break;
+ case Qt::SizeAllCursor:
+ cursor = XCreateFontCursor(xd->display, XC_fleur);
+ break;
+ case Qt::PointingHandCursor:
+ cursor = XCreateFontCursor(xd->display, XC_hand2);
+ break;
+ case Qt::SizeBDiagCursor:
+ cursor = XCreateFontCursor(xd->display, XC_top_right_corner);
+ break;
+ case Qt::SizeFDiagCursor:
+ cursor = XCreateFontCursor(xd->display, XC_bottom_right_corner);
+ break;
+ case Qt::SizeVerCursor:
+ case Qt::SplitVCursor:
+ cursor = XCreateFontCursor(xd->display, XC_sb_v_double_arrow);
+ break;
+ case Qt::SizeHorCursor:
+ case Qt::SplitHCursor:
+ cursor = XCreateFontCursor(xd->display, XC_sb_h_double_arrow);
+ break;
+ case Qt::WhatsThisCursor:
+ cursor = XCreateFontCursor(xd->display, XC_question_arrow);
+ break;
+ case Qt::ForbiddenCursor:
+ cursor = XCreateFontCursor(xd->display, XC_circle);
+ break;
+ case Qt::BusyCursor:
+ cursor = XCreateFontCursor(xd->display, XC_watch);
+ break;
+
+ default: //default cursor for all the rest
+ break;
+ }
+ return cursor;
+}
+
+
MyX11Cursors::MyX11Cursors(Display * d) : firstExpired(0), lastExpired(0), display(d), removalDelay(3)
{
connect(&timer, SIGNAL(timeout()), this, SLOT(timeout()));
@@ -1060,156 +1210,350 @@ Cursor MyX11Cursors::cursor(int id)
return node->cursor();
}
-void MyWindow::setCursor(QCursor * cursor)
-{
- int id = cursor->handle();
- if (id == currentCursor)
- return;
- Cursor c;
- if (!xd->cursors->exists(id)) {
- if (cursor->shape() == Qt::BitmapCursor)
- c = createCursorBitmap(cursor);
- else
- c = createCursorShape(cursor->shape());
- if (!c) {
- return;
- }
- xd->cursors->createNode(id, c);
- } else {
- xd->cursors->incrementUseCount(id);
- c = xd->cursors->cursor(id);
- }
- if (currentCursor != -1)
- xd->cursors->decrementUseCount(currentCursor);
- currentCursor = id;
- XDefineCursor(xd->display, window, c);
- XFlush(xd->display);
-}
+/********************************************************************
-Cursor MyWindow::createCursorBitmap(QCursor * cursor)
+MyDisplay class - perhaps better placed in qplatformintegration_testlite?
+
+*********************************************************************/
+
+//### copied from qapplication_x11.cpp
+
+static int qt_x_errhandler(Display *dpy, XErrorEvent *err)
{
- XColor bg, fg;
- bg.red = 255 << 8;
- bg.green = 255 << 8;
- bg.blue = 255 << 8;
- fg.red = 0;
- fg.green = 0;
- fg.blue = 0;
- QPoint spot = cursor->hotSpot();
- Window rootwin = window;
- QImage mapImage = cursor->bitmap()->toImage().convertToFormat(QImage::Format_MonoLSB);
- QImage maskImage = cursor->mask()->toImage().convertToFormat(QImage::Format_MonoLSB);
+qDebug() << "qt_x_errhandler" << err->error_code;
- int width = cursor->bitmap()->width();
- int height = cursor->bitmap()->height();
- int bytesPerLine = mapImage.bytesPerLine();
- int destLineSize = width / 8;
- if (width % 8)
- destLineSize++;
+ switch (err->error_code) {
+ case BadAtom:
+#if 0
+ if (err->request_code == 20 /* X_GetProperty */
+ && (err->resourceid == XA_RESOURCE_MANAGER
+ || err->resourceid == XA_RGB_DEFAULT_MAP
+ || err->resourceid == ATOM(_NET_SUPPORTED)
+ || err->resourceid == ATOM(_NET_SUPPORTING_WM_CHECK)
+ || err->resourceid == ATOM(KDE_FULL_SESSION)
+ || err->resourceid == ATOM(KWIN_RUNNING)
+ || err->resourceid == ATOM(XdndProxy)
+ || err->resourceid == ATOM(XdndAware))
- const uchar * map = mapImage.bits();
- const uchar * mask = maskImage.bits();
- char * mapBits = new char[height * destLineSize];
- char * maskBits = new char[height * destLineSize];
- for (int i = 0; i < height; i++) {
- memcpy(mapBits + (destLineSize * i),map + (bytesPerLine * i), destLineSize);
- memcpy(maskBits + (destLineSize * i),mask + (bytesPerLine * i), destLineSize);
+ ) {
+ // Perhaps we're running under SECURITY reduction? :/
+ return 0;
+ }
+#endif
+ qDebug() << "BadAtom";
+ break;
+
+ case BadWindow:
+ if (err->request_code == 2 /* X_ChangeWindowAttributes */
+ || err->request_code == 38 /* X_QueryPointer */) {
+ for (int i = 0; i < ScreenCount(dpy); ++i) {
+ if (err->resourceid == RootWindow(dpy, i)) {
+ // Perhaps we're running under SECURITY reduction? :/
+ return 0;
+ }
+ }
+ }
+ seen_badwindow = true;
+ if (err->request_code == 25 /* X_SendEvent */) {
+ for (int i = 0; i < ScreenCount(dpy); ++i) {
+ if (err->resourceid == RootWindow(dpy, i)) {
+ // Perhaps we're running under SECURITY reduction? :/
+ return 0;
+ }
+ }
+#if 0
+ if (X11->xdndHandleBadwindow()) {
+ qDebug("xdndHandleBadwindow returned true");
+ return 0;
+ }
+#endif
+ }
+#if 0
+ if (X11->ignore_badwindow)
+ return 0;
+#endif
+ break;
+
+ case BadMatch:
+ if (err->request_code == 42 /* X_SetInputFocus */)
+ return 0;
+ break;
+
+ default:
+#if 0 //!defined(QT_NO_XINPUT)
+ if (err->request_code == X11->xinput_major
+ && err->error_code == (X11->xinput_errorbase + XI_BadDevice)
+ && err->minor_code == 3 /* X_OpenDevice */) {
+ return 0;
+ }
+#endif
+ break;
}
- Pixmap cp = XCreateBitmapFromData(xd->display, rootwin, mapBits, width, height);
- Pixmap mp = XCreateBitmapFromData(xd->display, rootwin, maskBits, width, height);
- Cursor c = XCreatePixmapCursor(xd->display, cp, mp, &fg, &bg, spot.x(), spot.y());
- XFreePixmap(xd->display, cp);
- XFreePixmap(xd->display, mp);
- delete[] mapBits;
- delete[] maskBits;
+ char errstr[256];
+ XGetErrorText( dpy, err->error_code, errstr, 256 );
+ char buffer[256];
+ char request_str[256];
+ qsnprintf(buffer, 256, "%d", err->request_code);
+ XGetErrorDatabaseText(dpy, "XRequest", buffer, "", request_str, 256);
+ if (err->request_code < 128) {
+ // X error for a normal protocol request
+ qWarning( "X Error: %s %d\n"
+ " Major opcode: %d (%s)\n"
+ " Resource id: 0x%lx",
+ errstr, err->error_code,
+ err->request_code,
+ request_str,
+ err->resourceid );
+ } else {
+ // X error for an extension request
+ const char *extensionName = 0;
+#if 0
+ if (err->request_code == X11->xrender_major)
+ extensionName = "RENDER";
+ else if (err->request_code == X11->xrandr_major)
+ extensionName = "RANDR";
+ else if (err->request_code == X11->xinput_major)
+ extensionName = "XInputExtension";
+ else if (err->request_code == X11->mitshm_major)
+ extensionName = "MIT-SHM";
+#endif
+ char minor_str[256];
+ if (extensionName) {
+ qsnprintf(buffer, 256, "%s.%d", extensionName, err->minor_code);
+ XGetErrorDatabaseText(dpy, "XRequest", buffer, "", minor_str, 256);
+ } else {
+ extensionName = "Uknown extension";
+ qsnprintf(minor_str, 256, "Unknown request");
+ }
+ qWarning( "X Error: %s %d\n"
+ " Extension: %d (%s)\n"
+ " Minor opcode: %d (%s)\n"
+ " Resource id: 0x%lx",
+ errstr, err->error_code,
+ err->request_code,
+ extensionName,
+ err->minor_code,
+ minor_str,
+ err->resourceid );
+ }
- return c;
+ // ### we really should distinguish between severe, non-severe and
+ // ### application specific errors
+
+ return 0;
}
-Cursor MyWindow::createCursorShape(int cshape)
+
+#ifdef KeyPress
+#undef KeyPress
+#endif
+#ifdef KeyRelease
+#undef KeyRelease
+#endif
+
+bool MyDisplay::handleEvent(XEvent *xe)
{
- Cursor cursor = 0;
+ //qDebug() << "handleEvent" << xe->xany.type << xe->xany.window;
+ int quit = false;
+ QTestLiteWindow *xw = 0;
+ foreach (QTestLiteWindow *w, windowList) {
+ if (w->winId() == xe->xany.window) {
+ xw = w;
+ break;
+ }
+ }
+ if (!xw) {
+#ifdef MYX11_DEBUG
+ qWarning() << "Unknown window" << hex << xe->xany.window << "received event" << xe->type;
+#endif
+ return quit;
+ }
- if (cshape < 0 || cshape > Qt::LastCursor)
- return 0;
+ switch (xe->type) {
- switch (cshape) {
- case Qt::ArrowCursor:
- cursor = XCreateFontCursor(xd->display, XC_left_ptr);
- break;
- case Qt::UpArrowCursor:
- cursor = XCreateFontCursor(xd->display, XC_center_ptr);
- break;
- case Qt::CrossCursor:
- cursor = XCreateFontCursor(xd->display, XC_crosshair);
- break;
- case Qt::WaitCursor:
- cursor = XCreateFontCursor(xd->display, XC_watch);
- break;
- case Qt::IBeamCursor:
- cursor = XCreateFontCursor(xd->display, XC_xterm);
+ case ClientMessage:
+ if (xe->xclient.format == 32 && xe->xclient.message_type == wmProtocolsAtom) {
+ Atom a = xe->xclient.data.l[0];
+ if (a == wmDeleteWindowAtom)
+ xw->handleCloseEvent();
+#ifdef MYX11_DEBUG
+ qDebug() << "ClientMessage WM_PROTOCOLS" << a;
+#endif
+ }
+#ifdef MYX11_DEBUG
+ else
+ qDebug() << "ClientMessage" << xe->xclient.format << xe->xclient.message_type;
+#endif
break;
- case Qt::SizeAllCursor:
- cursor = XCreateFontCursor(xd->display, XC_fleur);
+
+ case Expose:
+ if (xw)
+ if (xe->xexpose.count == 0)
+ xw->paintEvent();
break;
- case Qt::PointingHandCursor:
- cursor = XCreateFontCursor(xd->display, XC_hand2);
+ case ConfigureNotify:
+ if (xw)
+ xw->resizeEvent(&xe->xconfigure);
break;
- case Qt::SizeBDiagCursor:
- cursor = XCreateFontCursor(xd->display, XC_top_right_corner);
+
+ case ButtonPress:
+ xw->mousePressEvent(&xe->xbutton);
break;
- case Qt::SizeFDiagCursor:
- cursor = XCreateFontCursor(xd->display, XC_bottom_right_corner);
+
+ case ButtonRelease:
+ xw->handleMouseEvent(QEvent::MouseButtonRelease, &xe->xbutton);
break;
- case Qt::SizeVerCursor:
- case Qt::SplitVCursor:
- cursor = XCreateFontCursor(xd->display, XC_sb_v_double_arrow);
+
+ case MotionNotify:
+ xw->handleMouseEvent(QEvent::MouseMove, &xe->xbutton);
break;
- case Qt::SizeHorCursor:
- case Qt::SplitHCursor:
- cursor = XCreateFontCursor(xd->display, XC_sb_h_double_arrow);
+
+ case XKeyPress:
+ xw->handleKeyEvent(QEvent::KeyPress, &xe->xkey);
break;
- case Qt::WhatsThisCursor:
- cursor = XCreateFontCursor(xd->display, XC_question_arrow);
+
+ case XKeyRelease:
+ xw->handleKeyEvent(QEvent::KeyRelease, &xe->xkey);
break;
- case Qt::ForbiddenCursor:
- cursor = XCreateFontCursor(xd->display, XC_circle);
+
+ case EnterNotify:
+ xw->handleEnterEvent();
break;
- case Qt::BusyCursor:
- cursor = XCreateFontCursor(xd->display, XC_watch);
+
+ case LeaveNotify:
+ xw->handleLeaveEvent();
break;
- default: //default cursor for all the rest
+ default:
+#ifdef MYX11_DEBUG
+ qDebug() << hex << xe->xany.window << "Other X event" << xe->type;
+#endif
break;
}
- return cursor;
+ return quit;
+};
+
+
+
+MyDisplay::MyDisplay()
+{
+ char *display_name = getenv("DISPLAY");
+ display = XOpenDisplay(display_name);
+ if (!display) {
+ fprintf(stderr, "Cannot connect to X server: %s\n",
+ display_name);
+ exit(1);
+ }
+
+#ifndef DONT_USE_MIT_SHM
+ Status MIT_SHM_extension_supported = XShmQueryExtension (display);
+ Q_ASSERT(MIT_SHM_extension_supported == True);
+#endif
+ original_x_errhandler = XSetErrorHandler(qt_x_errhandler);
+
+ if (qgetenv("DO_X_SYNCHRONIZE").toInt())
+ XSynchronize(display, true);
+
+ screen = DefaultScreen(display);
+ width = DisplayWidth(display, screen);
+ height = DisplayHeight(display, screen);
+ physicalWidth = DisplayWidthMM(display, screen);
+ physicalHeight = DisplayHeightMM(display, screen);
+
+ int xSocketNumber = XConnectionNumber(display);
+#ifdef MYX11_DEBUG
+ qDebug() << "X socket:"<< xSocketNumber;
+#endif
+ QSocketNotifier *sock = new QSocketNotifier(xSocketNumber, QSocketNotifier::Read, this);
+ connect(sock, SIGNAL(activated(int)), this, SLOT(eventDispatcher()));
+
+ wmProtocolsAtom = XInternAtom (display, "WM_PROTOCOLS", False);
+ wmDeleteWindowAtom = XInternAtom (display, "WM_DELETE_WINDOW", False);
+
+ cursors = new MyX11Cursors(display);
}
-#if 0
+MyDisplay::~MyDisplay()
+{
+ XCloseDisplay(display);
+}
- switch (cshape) { // map Q cursor to X cursor
- case Qt::BlankCursor:
- XColor bg, fg;
- bg.red = 255 << 8;
- bg.green = 255 << 8;
- bg.blue = 255 << 8;
- fg.red = 0;
- fg.green = 0;
- fg.blue = 0;
- pm = XCreateBitmapFromData(dpy, rootwin, cur_blank_bits, 16, 16);
- pmm = XCreateBitmapFromData(dpy, rootwin, cur_blank_bits, 16, 16);
- hcurs = XCreatePixmapCursor(dpy, pm, pmm, &fg, &bg, 8, 8);
- return;
- break;
- default:
- qWarning("QCursor::update: Invalid cursor shape %d", cshape);
- return;
- }
+void MyDisplay::eventDispatcher()
+{
+// qDebug() << "eventDispatcher";
+
+
+ ulong marker = XNextRequest(display);
+// int i = 0;
+ while (XPending(display)) {
+ XEvent event;
+ XNextEvent(display, &event);
+ /* done = */
+ handleEvent(&event);
+
+ if (event.xany.serial >= marker) {
+#ifdef MYX11_DEBUG
+ qDebug() << "potential livelock averted";
#endif
+#if 0
+ if (XEventsQueued(display, QueuedAfterFlush)) {
+ qDebug() << " with events queued";
+ QTimer::singleShot(0, this, SLOT(eventDispatcher()));
+ }
+#endif
+ break;
+ }
+ }
+}
+
+
+QImage MyDisplay::grabWindow(Window window, int x, int y, int w, int h)
+{
+ if (w == 0 || h ==0)
+ return QImage();
+
+ //WinId 0 means the desktop widget
+ if (!window)
+ window = rootWindow();
+
+ XWindowAttributes window_attr;
+ if (!XGetWindowAttributes(display, window, &window_attr))
+ return QImage();
+
+ if (w < 0)
+ w = window_attr.width - x;
+ if (h < 0)
+ h = window_attr.height - y;
+
+ // Ideally, we should also limit ourselves to the screen area, but the Qt docs say
+ // that it's "unsafe" to go outside the screen, so we can ignore that problem.
+
+ //We're definitely not optimizing for speed...
+ XImage *xi = XGetImage(display, window, x, y, w, h, AllPlanes, ZPixmap);
+
+ if (!xi)
+ return QImage();
+
+ //taking a copy to make sure we have ownership -- not fast
+ QImage result = QImage( (uchar*) xi->data, xi->width, xi->height, xi->bytes_per_line, QImage::Format_RGB32 ).copy();
+
+ XDestroyImage(xi);
+
+ return result;
+}
+
+
+
+
+
+
+
+QT_END_NAMESPACE
+#include "qtestlitewindow.moc"
diff --git a/src/plugins/platforms/testlite/x11util.h b/src/plugins/platforms/testlite/qtestlitewindow.h
index 79e7461..3624854 100644
--- a/src/plugins/platforms/testlite/x11util.h
+++ b/src/plugins/platforms/testlite/qtestlitewindow.h
@@ -39,8 +39,11 @@
**
****************************************************************************/
-#ifndef MYX11UTIL_H
-#define MYX11UTIL_H
+#ifndef QTESTLITEWINDOW_H
+#define QTESTLITEWINDOW_H
+
+#include <QPlatformWindow>
+#include <qevent.h>
#include <QObject>
#include <QImage>
@@ -53,8 +56,12 @@
#include <X11/Xutil.h>
-class MyWindow;
+
+class QTestLiteIntegration;
+class QTestLiteScreen;
+class QTestLiteWindowSurface;
class MyX11Cursors;
+class QTestLiteWindow;
class MyDisplay : public QObject
{
@@ -80,125 +87,70 @@ public: //###
int physicalWidth;
int physicalHeight;
- QList<MyWindow*> windowList;
+ QList<QTestLiteWindow*> windowList;
MyX11Cursors * cursors;
};
-class QTestLiteWindowSurface; //### abstract callback interface, anyone?
-
struct MyShmImageInfo;
-class MyWindow : public QObject
+class QWindowSurface;
+
+class QTestLiteWindow : public QPlatformWindow
{
- Q_OBJECT;
public:
- MyWindow(MyDisplay *xd, int x, int y, int w, int h);
- ~MyWindow();
+ QTestLiteWindow(const QTestLiteIntegration *platformIntegration,
+ QTestLiteScreen *screen, QWidget *window);
+ ~QTestLiteWindow();
void mousePressEvent(XButtonEvent*);
- void mouseReleaseEvent(XButtonEvent*);
- void mouseMoveEvent(XButtonEvent*);
+ void handleMouseEvent(QEvent::Type, XButtonEvent *ev);
- void keyPressEvent(XKeyEvent*);
- void keyReleaseEvent(XKeyEvent*);
+ void handleKeyEvent(QEvent::Type, void *);
+ void handleCloseEvent();
+ void handleEnterEvent();
+ void handleLeaveEvent();
- void enterEvent(XCrossingEvent*);
- void leaveEvent(XCrossingEvent*);
-
- void closeEvent();
- void paintEvent();
void resizeEvent(XConfigureEvent *configure_event);
-// void setSize(int w, int h);
- void setGeometry(int x, int y, int w, int h);
+ void paintEvent();
- GC createGC();
- Qt::WindowFlags setWindowFlags(Qt::WindowFlags flags);
- void setVisible(bool visible);
- void setCursor(QCursor * cursor);
- Cursor createCursorShape(int cshape);
- Cursor createCursorBitmap(QCursor * cursor);
+ void setGeometry(const QRect &rect);
+ Qt::WindowFlags setWindowFlags(Qt::WindowFlags type);
+ Qt::WindowFlags windowFlags() const;
+ void setVisible(bool visible);
+ WId winId() const;
+ void raise();
+ void lower();
void setWindowTitle(const QString &title);
- QImage *image() { return &shm_img; }
-
-public: //###
+ void setCursor(QCursor * cursor);
+private:
int xpos, ypos;
int width, height;
- Window window;
- MyDisplay *xd;
+ Window x_window;
GC gc;
- QTestLiteWindowSurface *windowSurface;
+ GC createGC();
+ Cursor createCursorShape(int cshape);
+ Cursor createCursorBitmap(QCursor * cursor);
int currentCursor;
- bool painted;
- void resizeBuffer(QSize);
- QSize bufferSize() const;
-
-private:
- void resizeShmImage(int width, int height);
- QImage shm_img;
- MyShmImageInfo *image_info;
-};
+ QWindowSurface *windowSurface;
+ MyDisplay *xd;
-class MyX11CursorNode
-{
-public:
- MyX11CursorNode(int id, Cursor c) { idValue = id; cursorValue = c; refCount = 1; }
- QDateTime expiration() { return t; }
- void setExpiration(QDateTime val) { t = val; }
- MyX11CursorNode * ante() { return before; }
- void setAnte(MyX11CursorNode *node) { before = node; }
- MyX11CursorNode * post() { return after; }
- void setPost(MyX11CursorNode *node) { after = node; }
- Cursor cursor() { return cursorValue; }
- int id() { return idValue; }
- unsigned int refCount;
+ QTestLiteScreen *mScreen;
+ Qt::WindowFlags window_flags;
-private:
- MyX11CursorNode *before;
- MyX11CursorNode *after;
- QDateTime t;
- Cursor cursorValue;
- int idValue;
-
- Display * display;
+ friend class QTestLiteWindowSurface; // x_window, gc and windowSurface
};
-class MyX11Cursors : public QObject
-{
- Q_OBJECT
-public:
- MyX11Cursors(Display * d);
- ~MyX11Cursors() { timer.stop(); }
- void incrementUseCount(int id);
- void decrementUseCount(int id);
- void createNode(int id, Cursor c);
- bool exists(int id) { return lookupMap.contains(id); }
- Cursor cursor(int id);
-public slots:
- void timeout();
-private:
- void removeNode(MyX11CursorNode *node);
- void insertNode(MyX11CursorNode *node);
-
- // linked list of cursors currently not assigned to any window
- MyX11CursorNode *firstExpired;
- MyX11CursorNode *lastExpired;
- QHash<int, MyX11CursorNode *> lookupMap;
- QTimer timer;
- Display *display;
-
- int removalDelay;
-};
-#endif // MYX11UTIL_H
+#endif
diff --git a/src/plugins/platforms/testlite/qwindowsurface_testlite.cpp b/src/plugins/platforms/testlite/qwindowsurface_testlite.cpp
index e2574f9..af10368 100644
--- a/src/plugins/platforms/testlite/qwindowsurface_testlite.cpp
+++ b/src/plugins/platforms/testlite/qwindowsurface_testlite.cpp
@@ -45,39 +45,107 @@
#include <QtCore/qdebug.h>
#include <QWindowSystemInterface>
-#include "x11util.h"
+#include "qtestlitewindow.h"
+
+# include <sys/ipc.h>
+# include <sys/shm.h>
+# include <X11/extensions/XShm.h>
QT_BEGIN_NAMESPACE
-QTestLiteWindowSurface::QTestLiteWindowSurface
- (QTestLiteIntegration *platformIntegration,
- QTestLiteScreen *screen, QWidget *window)
- : QWindowSurface(window),
- mPlatformIntegration(platformIntegration),
- mScreen(screen),
- xw(0)
+
+struct MyShmImageInfo {
+ MyShmImageInfo(Display *xdisplay) : image(0), display(xdisplay) {}
+ ~MyShmImageInfo() { destroy(); }
+
+ void destroy();
+
+ XShmSegmentInfo shminfo;
+ XImage *image;
+ Display *display;
+};
+
+//void QTestLiteWindowSurface::flush()
+
+
+#ifndef DONT_USE_MIT_SHM
+void MyShmImageInfo::destroy()
{
+ XShmDetach (display, &shminfo);
+ XDestroyImage (image);
+ shmdt (shminfo.shmaddr);
+ shmctl (shminfo.shmid, IPC_RMID, 0);
+}
+#endif
+void QTestLiteWindowSurface::resizeShmImage(int width, int height)
+{
+ MyDisplay *xd = xw->xd;
- xw = new MyWindow(platformIntegration->xd, 0,0,300,300);
- xw->windowSurface = this;
+#ifdef DONT_USE_MIT_SHM
+ shm_img = QImage(width, height, QImage::Format_RGB32);
+#else
+ if (image_info)
+ image_info->destroy();
+ else
+ image_info = new MyShmImageInfo(xd->display);
+
+ Visual *visual = DefaultVisual(xd->display, xd->screen);
+
+
+ XImage *image = XShmCreateImage (xd->display, visual, 24, ZPixmap, 0,
+ &image_info->shminfo, width, height);
-// qDebug() << "QTestLiteWindowSurface::QTestLiteWindowSurface:" << xw->window;
- setWindowFlags(window->windowFlags()); //##### This should not be the plugin's responsibility
+ image_info->shminfo.shmid = shmget (IPC_PRIVATE,
+ image->bytes_per_line * image->height, IPC_CREAT|0777);
+
+ image_info->shminfo.shmaddr = image->data = (char*)shmat (image_info->shminfo.shmid, 0, 0);
+ image_info->shminfo.readOnly = False;
+
+ image_info->image = image;
+
+ Status shm_attach_status = XShmAttach(xd->display, &image_info->shminfo);
+
+ Q_ASSERT(shm_attach_status == True);
+
+ shm_img = QImage( (uchar*) image->data, image->width, image->height, image->bytes_per_line, QImage::Format_RGB32 );
+#endif
+ painted = false;
+}
+
+
+void QTestLiteWindowSurface::resizeBuffer(QSize s)
+{
+ if (shm_img.size() != s)
+ resizeShmImage(s.width(), s.height());
+}
+
+QSize QTestLiteWindowSurface::bufferSize() const
+{
+ return shm_img.size();
+}
+
+QTestLiteWindowSurface::QTestLiteWindowSurface (QTestLiteScreen */*screen*/, QWidget *window)
+ : QWindowSurface(window),
+ painted(false), image_info(0)
+{
+ xw = static_cast<QTestLiteWindow*>(window->platformWindow());
+ xw->windowSurface = this;
+// qDebug() << "QTestLiteWindowSurface::QTestLiteWindowSurface:" << xw->window;
}
QTestLiteWindowSurface::~QTestLiteWindowSurface()
{
-// qDebug() << "~QTestLiteWindowSurface" << xw->window;
- delete xw;
+ delete image_info;
}
QPaintDevice *QTestLiteWindowSurface::paintDevice()
{
- return xw->image();
+ return &shm_img;
}
+
void QTestLiteWindowSurface::flush(QWidget *widget, const QRegion &region, const QPoint &offset)
{
Q_UNUSED(widget);
@@ -86,21 +154,47 @@ void QTestLiteWindowSurface::flush(QWidget *widget, const QRegion &region, const
// qDebug() << "QTestLiteWindowSurface::flush:" << (long)this;
- xw->paintEvent();
-}
+ if (!painted)
+ return;
+ MyDisplay *xd = xw->xd;
+ GC gc = xw->gc;
+ Window window = xw->x_window;
+#ifdef DONT_USE_MIT_SHM
+ // just convert the image every time...
+ if (!shm_img.isNull()) {
+ Visual *visual = DefaultVisual(xd->display, xd->screen);
-void QTestLiteWindowSurface::setGeometry(const QRect &rect)
-{
- QRect oldRect = geometry();
- if (rect == oldRect)
- return;
+ QImage image = shm_img;
+ //img.convertToFormat(
+ XImage *xi = XCreateImage(xd->display, visual, 24, ZPixmap,
+ 0, (char *) image.scanLine(0), image.width(), image.height(),
+ 32, image.bytesPerLine());
+
+ int x = 0;
+ int y = 0;
- QWindowSurface::setGeometry(rect);
+ /*int r =*/ XPutImage(xd->display, window, gc, xi, 0, 0, x, y, image.width(), image.height());
- //if unchanged ###
-// xw->setSize(rect.width(), rect.height());
- xw->setGeometry(rect.x(), rect.y(), rect.width(), rect.height());
+ xi->data = 0; // QImage owns these bits
+ XDestroyImage(xi);
+ }
+#else
+ // Use MIT_SHM
+ if (image_info->image) {
+ //qDebug() << "Here we go" << image_info->image->width << image_info->image->height;
+ int x = 0;
+ int y = 0;
+
+ // We could set send_event to true, and then use the ShmCompletion to synchronize,
+ // but let's do like Qt/11 and just use XSync
+ XShmPutImage (xd->display, window, gc, image_info->image, 0, 0,
+ x, y, image_info->image->width, image_info->image->height,
+ /*send_event*/ False);
+
+ XSync(xd->display, False);
+ }
+#endif
}
//### scroll logic copied from QRasterWindowSurface, we should make better API for this
@@ -154,12 +248,12 @@ void copied_qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &o
bool QTestLiteWindowSurface::scroll(const QRegion &area, int dx, int dy)
{
- if (!xw->image() || xw->image()->isNull())
+ if (shm_img.isNull())
return false;
const QVector<QRect> rects = area.rects();
for (int i = 0; i < rects.size(); ++i)
- copied_qt_scrollRectInImage(*xw->image(), rects.at(i), QPoint(dx, dy));
+ copied_qt_scrollRectInImage(shm_img, rects.at(i), QPoint(dx, dy));
return true;
}
@@ -168,494 +262,12 @@ bool QTestLiteWindowSurface::scroll(const QRegion &area, int dx, int dy)
void QTestLiteWindowSurface::beginPaint(const QRegion &region)
{
Q_UNUSED(region);
- xw->resizeBuffer(geometry().size());
+ resizeBuffer(size());
}
void QTestLiteWindowSurface::endPaint(const QRegion &region)
{
Q_UNUSED(region);
- xw->painted = true; //there is content in the buffer
-}
-
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Mouse event stuff
-
-
-
-
-static Qt::MouseButtons translateMouseButtons(int s)
-{
- Qt::MouseButtons ret = 0;
- if (s & Button1Mask)
- ret |= Qt::LeftButton;
- if (s & Button2Mask)
- ret |= Qt::MidButton;
- if (s & Button3Mask)
- ret |= Qt::RightButton;
- return ret;
-}
-
-
-static Qt::KeyboardModifiers translateModifiers(int s)
-{
- const uchar qt_alt_mask = Mod1Mask;
- const uchar qt_meta_mask = Mod4Mask;
-
-
- Qt::KeyboardModifiers ret = 0;
- if (s & ShiftMask)
- ret |= Qt::ShiftModifier;
- if (s & ControlMask)
- ret |= Qt::ControlModifier;
- if (s & qt_alt_mask)
- ret |= Qt::AltModifier;
- if (s & qt_meta_mask)
- ret |= Qt::MetaModifier;
-#if 0
- if (s & qt_mode_switch_mask)
- ret |= Qt::GroupSwitchModifier;
-#endif
- return ret;
-}
-
-void QTestLiteWindowSurface::handleMouseEvent(QEvent::Type type, void *ev)
-{
- static QPoint mousePoint;
-
- XButtonEvent *e = static_cast<XButtonEvent*>(ev);
-
- Qt::MouseButton button = Qt::NoButton;
- Qt::MouseButtons buttons = translateMouseButtons(e->state);
- Qt::KeyboardModifiers modifiers = translateModifiers(e->state);
- if (type != QEvent::MouseMove) {
- switch (e->button) {
- case Button1: button = Qt::LeftButton; break;
- case Button2: button = Qt::MidButton; break;
- case Button3: button = Qt::RightButton; break;
- case Button4:
- case Button5:
- case 6:
- case 7: {
- //mouse wheel
- if (type == QEvent::MouseButtonPress) {
- //logic borrowed from qapplication_x11.cpp
- int delta = 120 * ((e->button == Button4 || e->button == 6) ? 1 : -1);
- bool hor = (((e->button == Button4 || e->button == Button5)
- && (modifiers & Qt::AltModifier))
- || (e->button == 6 || e->button == 7));
- QWindowSystemInterface::handleWheelEvent(window(), e->time,
- QPoint(e->x, e->y),
- QPoint(e->x_root, e->y_root),
- delta, hor ? Qt::Horizontal : Qt::Vertical);
- }
- return;
- }
- default: break;
- }
- }
-
- buttons ^= button; // X event uses state *before*, Qt uses state *after*
-
- QWindowSystemInterface::handleMouseEvent(window(), e->time, QPoint(e->x, e->y),
- QPoint(e->x_root, e->y_root),
- buttons);
-
- mousePoint = QPoint(e->x_root, e->y_root);
-}
-
-void QTestLiteWindowSurface::handleGeometryChange(int x, int y, int w, int h)
-{
- QWindowSystemInterface::handleGeometryChange(window(), QRect(x,y,w,h));
-}
-
-
-void QTestLiteWindowSurface::handleCloseEvent()
-{
- QWindowSystemInterface::handleCloseEvent(window());
-}
-
-
-void QTestLiteWindowSurface::handleEnterEvent()
-{
- QWindowSystemInterface::handleEnterEvent(window());
-}
-
-void QTestLiteWindowSurface::handleLeaveEvent()
-{
- QWindowSystemInterface::handleLeaveEvent(window());
-}
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Key event stuff -- not pretty either
-//
-// What we want to do is to port Robert's keytable code properly
-
-
-
-
-
-
-
-// keyboard mapping table
-static const unsigned int keyTbl[] = {
-
- // misc keys
-
- XK_Escape, Qt::Key_Escape,
- XK_Tab, Qt::Key_Tab,
- XK_ISO_Left_Tab, Qt::Key_Backtab,
- XK_BackSpace, Qt::Key_Backspace,
- XK_Return, Qt::Key_Return,
- XK_Insert, Qt::Key_Insert,
- XK_Delete, Qt::Key_Delete,
- XK_Clear, Qt::Key_Delete,
- XK_Pause, Qt::Key_Pause,
- XK_Print, Qt::Key_Print,
- 0x1005FF60, Qt::Key_SysReq, // hardcoded Sun SysReq
- 0x1007ff00, Qt::Key_SysReq, // hardcoded X386 SysReq
-
- // cursor movement
-
- XK_Home, Qt::Key_Home,
- XK_End, Qt::Key_End,
- XK_Left, Qt::Key_Left,
- XK_Up, Qt::Key_Up,
- XK_Right, Qt::Key_Right,
- XK_Down, Qt::Key_Down,
- XK_Prior, Qt::Key_PageUp,
- XK_Next, Qt::Key_PageDown,
-
- // modifiers
-
- XK_Shift_L, Qt::Key_Shift,
- XK_Shift_R, Qt::Key_Shift,
- XK_Shift_Lock, Qt::Key_Shift,
- XK_Control_L, Qt::Key_Control,
- XK_Control_R, Qt::Key_Control,
- XK_Meta_L, Qt::Key_Meta,
- XK_Meta_R, Qt::Key_Meta,
- XK_Alt_L, Qt::Key_Alt,
- XK_Alt_R, Qt::Key_Alt,
- XK_Caps_Lock, Qt::Key_CapsLock,
- XK_Num_Lock, Qt::Key_NumLock,
- XK_Scroll_Lock, Qt::Key_ScrollLock,
- XK_Super_L, Qt::Key_Super_L,
- XK_Super_R, Qt::Key_Super_R,
- XK_Menu, Qt::Key_Menu,
- XK_Hyper_L, Qt::Key_Hyper_L,
- XK_Hyper_R, Qt::Key_Hyper_R,
- XK_Help, Qt::Key_Help,
- 0x1000FF74, Qt::Key_Backtab, // hardcoded HP backtab
- 0x1005FF10, Qt::Key_F11, // hardcoded Sun F36 (labeled F11)
- 0x1005FF11, Qt::Key_F12, // hardcoded Sun F37 (labeled F12)
-
- // numeric and function keypad keys
-
- XK_KP_Space, Qt::Key_Space,
- XK_KP_Tab, Qt::Key_Tab,
- XK_KP_Enter, Qt::Key_Enter,
- //XK_KP_F1, Qt::Key_F1,
- //XK_KP_F2, Qt::Key_F2,
- //XK_KP_F3, Qt::Key_F3,
- //XK_KP_F4, Qt::Key_F4,
- XK_KP_Home, Qt::Key_Home,
- XK_KP_Left, Qt::Key_Left,
- XK_KP_Up, Qt::Key_Up,
- XK_KP_Right, Qt::Key_Right,
- XK_KP_Down, Qt::Key_Down,
- XK_KP_Prior, Qt::Key_PageUp,
- XK_KP_Next, Qt::Key_PageDown,
- XK_KP_End, Qt::Key_End,
- XK_KP_Begin, Qt::Key_Clear,
- XK_KP_Insert, Qt::Key_Insert,
- XK_KP_Delete, Qt::Key_Delete,
- XK_KP_Equal, Qt::Key_Equal,
- XK_KP_Multiply, Qt::Key_Asterisk,
- XK_KP_Add, Qt::Key_Plus,
- XK_KP_Separator, Qt::Key_Comma,
- XK_KP_Subtract, Qt::Key_Minus,
- XK_KP_Decimal, Qt::Key_Period,
- XK_KP_Divide, Qt::Key_Slash,
-
- // International input method support keys
-
- // International & multi-key character composition
- XK_ISO_Level3_Shift, Qt::Key_AltGr,
- XK_Multi_key, Qt::Key_Multi_key,
- XK_Codeinput, Qt::Key_Codeinput,
- XK_SingleCandidate, Qt::Key_SingleCandidate,
- XK_MultipleCandidate, Qt::Key_MultipleCandidate,
- XK_PreviousCandidate, Qt::Key_PreviousCandidate,
-
- // Misc Functions
- XK_Mode_switch, Qt::Key_Mode_switch,
- XK_script_switch, Qt::Key_Mode_switch,
-
- // Japanese keyboard support
- XK_Kanji, Qt::Key_Kanji,
- XK_Muhenkan, Qt::Key_Muhenkan,
- //XK_Henkan_Mode, Qt::Key_Henkan_Mode,
- XK_Henkan_Mode, Qt::Key_Henkan,
- XK_Henkan, Qt::Key_Henkan,
- XK_Romaji, Qt::Key_Romaji,
- XK_Hiragana, Qt::Key_Hiragana,
- XK_Katakana, Qt::Key_Katakana,
- XK_Hiragana_Katakana, Qt::Key_Hiragana_Katakana,
- XK_Zenkaku, Qt::Key_Zenkaku,
- XK_Hankaku, Qt::Key_Hankaku,
- XK_Zenkaku_Hankaku, Qt::Key_Zenkaku_Hankaku,
- XK_Touroku, Qt::Key_Touroku,
- XK_Massyo, Qt::Key_Massyo,
- XK_Kana_Lock, Qt::Key_Kana_Lock,
- XK_Kana_Shift, Qt::Key_Kana_Shift,
- XK_Eisu_Shift, Qt::Key_Eisu_Shift,
- XK_Eisu_toggle, Qt::Key_Eisu_toggle,
- //XK_Kanji_Bangou, Qt::Key_Kanji_Bangou,
- //XK_Zen_Koho, Qt::Key_Zen_Koho,
- //XK_Mae_Koho, Qt::Key_Mae_Koho,
- XK_Kanji_Bangou, Qt::Key_Codeinput,
- XK_Zen_Koho, Qt::Key_MultipleCandidate,
- XK_Mae_Koho, Qt::Key_PreviousCandidate,
-
-#ifdef XK_KOREAN
- // Korean keyboard support
- XK_Hangul, Qt::Key_Hangul,
- XK_Hangul_Start, Qt::Key_Hangul_Start,
- XK_Hangul_End, Qt::Key_Hangul_End,
- XK_Hangul_Hanja, Qt::Key_Hangul_Hanja,
- XK_Hangul_Jamo, Qt::Key_Hangul_Jamo,
- XK_Hangul_Romaja, Qt::Key_Hangul_Romaja,
- //XK_Hangul_Codeinput, Qt::Key_Hangul_Codeinput,
- XK_Hangul_Codeinput, Qt::Key_Codeinput,
- XK_Hangul_Jeonja, Qt::Key_Hangul_Jeonja,
- XK_Hangul_Banja, Qt::Key_Hangul_Banja,
- XK_Hangul_PreHanja, Qt::Key_Hangul_PreHanja,
- XK_Hangul_PostHanja, Qt::Key_Hangul_PostHanja,
- //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate,
- //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate,
- //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate,
- XK_Hangul_SingleCandidate, Qt::Key_SingleCandidate,
- XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate,
- XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate,
- XK_Hangul_Special, Qt::Key_Hangul_Special,
- //XK_Hangul_switch, Qt::Key_Hangul_switch,
- XK_Hangul_switch, Qt::Key_Mode_switch,
-#endif // XK_KOREAN
-
- // dead keys
- XK_dead_grave, Qt::Key_Dead_Grave,
- XK_dead_acute, Qt::Key_Dead_Acute,
- XK_dead_circumflex, Qt::Key_Dead_Circumflex,
- XK_dead_tilde, Qt::Key_Dead_Tilde,
- XK_dead_macron, Qt::Key_Dead_Macron,
- XK_dead_breve, Qt::Key_Dead_Breve,
- XK_dead_abovedot, Qt::Key_Dead_Abovedot,
- XK_dead_diaeresis, Qt::Key_Dead_Diaeresis,
- XK_dead_abovering, Qt::Key_Dead_Abovering,
- XK_dead_doubleacute, Qt::Key_Dead_Doubleacute,
- XK_dead_caron, Qt::Key_Dead_Caron,
- XK_dead_cedilla, Qt::Key_Dead_Cedilla,
- XK_dead_ogonek, Qt::Key_Dead_Ogonek,
- XK_dead_iota, Qt::Key_Dead_Iota,
- XK_dead_voiced_sound, Qt::Key_Dead_Voiced_Sound,
- XK_dead_semivoiced_sound, Qt::Key_Dead_Semivoiced_Sound,
- XK_dead_belowdot, Qt::Key_Dead_Belowdot,
- XK_dead_hook, Qt::Key_Dead_Hook,
- XK_dead_horn, Qt::Key_Dead_Horn,
-
-#if 0
- // Special multimedia keys
- // currently only tested with MS internet keyboard
-
- // browsing keys
- XF86XK_Back, Qt::Key_Back,
- XF86XK_Forward, Qt::Key_Forward,
- XF86XK_Stop, Qt::Key_Stop,
- XF86XK_Refresh, Qt::Key_Refresh,
- XF86XK_Favorites, Qt::Key_Favorites,
- XF86XK_AudioMedia, Qt::Key_LaunchMedia,
- XF86XK_OpenURL, Qt::Key_OpenUrl,
- XF86XK_HomePage, Qt::Key_HomePage,
- XF86XK_Search, Qt::Key_Search,
-
- // media keys
- XF86XK_AudioLowerVolume, Qt::Key_VolumeDown,
- XF86XK_AudioMute, Qt::Key_VolumeMute,
- XF86XK_AudioRaiseVolume, Qt::Key_VolumeUp,
- XF86XK_AudioPlay, Qt::Key_MediaPlay,
- XF86XK_AudioStop, Qt::Key_MediaStop,
- XF86XK_AudioPrev, Qt::Key_MediaPrevious,
- XF86XK_AudioNext, Qt::Key_MediaNext,
- XF86XK_AudioRecord, Qt::Key_MediaRecord,
-
- // launch keys
- XF86XK_Mail, Qt::Key_LaunchMail,
- XF86XK_MyComputer, Qt::Key_Launch0,
- XF86XK_Calculator, Qt::Key_Launch1,
- XF86XK_Standby, Qt::Key_Standby,
-
- XF86XK_Launch0, Qt::Key_Launch2,
- XF86XK_Launch1, Qt::Key_Launch3,
- XF86XK_Launch2, Qt::Key_Launch4,
- XF86XK_Launch3, Qt::Key_Launch5,
- XF86XK_Launch4, Qt::Key_Launch6,
- XF86XK_Launch5, Qt::Key_Launch7,
- XF86XK_Launch6, Qt::Key_Launch8,
- XF86XK_Launch7, Qt::Key_Launch9,
- XF86XK_Launch8, Qt::Key_LaunchA,
- XF86XK_Launch9, Qt::Key_LaunchB,
- XF86XK_LaunchA, Qt::Key_LaunchC,
- XF86XK_LaunchB, Qt::Key_LaunchD,
- XF86XK_LaunchC, Qt::Key_LaunchE,
- XF86XK_LaunchD, Qt::Key_LaunchF,
-#endif
-
-#if 0
- // Qtopia keys
- QTOPIAXK_Select, Qt::Key_Select,
- QTOPIAXK_Yes, Qt::Key_Yes,
- QTOPIAXK_No, Qt::Key_No,
- QTOPIAXK_Cancel, Qt::Key_Cancel,
- QTOPIAXK_Printer, Qt::Key_Printer,
- QTOPIAXK_Execute, Qt::Key_Execute,
- QTOPIAXK_Sleep, Qt::Key_Sleep,
- QTOPIAXK_Play, Qt::Key_Play,
- QTOPIAXK_Zoom, Qt::Key_Zoom,
- QTOPIAXK_Context1, Qt::Key_Context1,
- QTOPIAXK_Context2, Qt::Key_Context2,
- QTOPIAXK_Context3, Qt::Key_Context3,
- QTOPIAXK_Context4, Qt::Key_Context4,
- QTOPIAXK_Call, Qt::Key_Call,
- QTOPIAXK_Hangup, Qt::Key_Hangup,
- QTOPIAXK_Flip, Qt::Key_Flip,
-#endif
- 0, 0
-};
-
-
-static int lookupCode(unsigned int xkeycode)
-{
- if (xkeycode >= XK_F1 && xkeycode <= XK_F35)
- return Qt::Key_F1 + (int(xkeycode) - XK_F1);
-
- const unsigned int *p = keyTbl;
- while (*p) {
- if (*p == xkeycode)
- return *++p;
- p += 2;
- }
-
- return 0;
-}
-
-
-static Qt::KeyboardModifiers modifierFromKeyCode(int qtcode)
-{
- switch (qtcode) {
- case Qt::Key_Control:
- return Qt::ControlModifier;
- case Qt::Key_Alt:
- return Qt::AltModifier;
- case Qt::Key_Shift:
- return Qt::ShiftModifier;
- case Qt::Key_Meta:
- return Qt::MetaModifier;
- default:
- return Qt::NoModifier;
- }
-}
-
-void QTestLiteWindowSurface::handleKeyEvent(QEvent::Type type, void *ev)
-{
- XKeyEvent *e = static_cast<XKeyEvent*>(ev);
-
- KeySym keySym;
- QByteArray chars;
- chars.resize(513);
-
- int count = XLookupString(e, chars.data(), chars.size(), &keySym, 0);
-
-// qDebug() << "QTLWS::handleKeyEvent" << count << hex << "XKeysym:" << keySym;
-// if (count)
-// qDebug() << hex << int(chars[0]) << "String:" << chars;
-
- Qt::KeyboardModifiers modifiers = translateModifiers(e->state);
-
- int qtcode = lookupCode(keySym);
-// qDebug() << "lookup: " << hex << keySym << qtcode << "mod" << modifiers;
-
- //X11 specifies state *before*, Qt expects state *after* the event
-
- modifiers ^= modifierFromKeyCode(qtcode);
-
- if (qtcode) {
- QWindowSystemInterface::handleKeyEvent(window(), e->time, type, qtcode, modifiers);
- } else if (chars[0]) {
- int qtcode = chars.toUpper()[0]; //Not exactly right...
- if (modifiers & Qt::ControlModifier && qtcode < ' ')
- qtcode = chars[0] + '@';
- QWindowSystemInterface::handleKeyEvent(window(), e->time, type, qtcode, modifiers, QString::fromLatin1(chars));
- } else {
- qWarning() << "unknown X keycode" << hex << e->keycode << keySym;
- }
-}
-
-
-
-Qt::WindowFlags QTestLiteWindowSurface::setWindowFlags(Qt::WindowFlags flags)
-{
- Q_ASSERT(flags & Qt::Window);
-
- window_flags = flags;
-
- xw->setWindowFlags(flags);
-
- return window_flags;
-
-}
-
-Qt::WindowFlags QTestLiteWindowSurface::windowFlags() const
-{
- return window_flags;
-}
-
-void QTestLiteWindowSurface::setVisible(bool visible)
-{
- //qDebug() << "QTestLiteWindowSurface::setVisible" << visible << xw->window;
- xw->setVisible(visible);
-}
-
-
-WId QTestLiteWindowSurface::winId() const
-{
- if (xw)
- return (WId) xw->window;
- else
- return WId(0);
-}
-
-void QTestLiteWindowSurface::raise()
-{
- WId window = winId();
- XRaiseWindow(mPlatformIntegration->xd->display, window);
-}
-
-void QTestLiteWindowSurface::lower()
-{
- WId window = winId();
- XLowerWindow(mPlatformIntegration->xd->display, window);
-}
-
-void QTestLiteWindowSurface::setWindowTitle(const QString &title)
-{
- xw->setWindowTitle(title);
-}
-
-void QTestLiteWindowSurface::setCursor(QCursor *cursor)
-{
- xw->setCursor(cursor);
+ painted = true; //there is content in the buffer
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/testlite/qwindowsurface_testlite.h b/src/plugins/platforms/testlite/qwindowsurface_testlite.h
index ffd2d3a..915e7fe 100644
--- a/src/plugins/platforms/testlite/qwindowsurface_testlite.h
+++ b/src/plugins/platforms/testlite/qwindowsurface_testlite.h
@@ -43,54 +43,46 @@
#define QWINDOWSURFACE_TESTLITE_H
#include <QtGui/private/qwindowsurface_p.h>
-#include <qevent.h>
+
QT_BEGIN_NAMESPACE
-class MyWindow;
+class QTestLiteWindow;
class QTestLiteIntegration;
class QTestLiteScreen;
+class MyShmImageInfo;
class QTestLiteWindowSurface : public QWindowSurface
{
public:
- QTestLiteWindowSurface
- (QTestLiteIntegration *platformIntegration,
- QTestLiteScreen *screen, QWidget *window);
+ QTestLiteWindowSurface (QTestLiteScreen *screen, QWidget *window);
~QTestLiteWindowSurface();
QPaintDevice *paintDevice();
+// void flush();
void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
- void setGeometry(const QRect &rect);
+// void resize(const QSize &size);
bool scroll(const QRegion &area, int dx, int dy);
void beginPaint(const QRegion &region);
void endPaint(const QRegion &region);
- void handleMouseEvent(QEvent::Type, void *); //forwarding X types is apparently impossible :(
- void handleKeyEvent(QEvent::Type, void *);
- void handleGeometryChange(int x, int y, int w, int h);
- void handleCloseEvent();
- void handleEnterEvent();
- void handleLeaveEvent();
+private:
+ bool painted;
+ void resizeBuffer(QSize);
+ QSize bufferSize() const;
- Qt::WindowFlags setWindowFlags(Qt::WindowFlags type);
- Qt::WindowFlags windowFlags() const;
- void setVisible(bool visible);
- WId winId() const;
- void raise();
- void lower();
- void setWindowTitle(const QString &title);
- void setCursor(QCursor * cursor);
+ void resizeShmImage(int width, int height);
+
+ QImage shm_img;
+ MyShmImageInfo *image_info;
+
+ QTestLiteWindow *xw;
-private:
- QTestLiteIntegration *mPlatformIntegration;
- QTestLiteScreen *mScreen;
- Qt::WindowFlags window_flags;
- MyWindow *xw;
};
+
QT_END_NAMESPACE
#endif
diff --git a/src/plugins/platforms/testlite/testlite.pro b/src/plugins/platforms/testlite/testlite.pro
index 5f7eb2a..8f108ae 100644
--- a/src/plugins/platforms/testlite/testlite.pro
+++ b/src/plugins/platforms/testlite/testlite.pro
@@ -3,12 +3,8 @@ include(../../qpluginbase.pri)
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/platforms
-SOURCES = main.cpp qplatformintegration_testlite.cpp qwindowsurface_testlite.cpp
-HEADERS = qplatformintegration_testlite.h qwindowsurface_testlite.h
-
-
-HEADERS += x11util.h
-SOURCES += x11util.cpp
+SOURCES = main.cpp qplatformintegration_testlite.cpp qwindowsurface_testlite.cpp qtestlitewindow.cpp
+HEADERS = qplatformintegration_testlite.h qwindowsurface_testlite.h qtestlitewindow.h
LIBS += -lX11 -lXext
diff --git a/src/plugins/platforms/vnc/main.cpp b/src/plugins/platforms/vnc/main.cpp
index baaca3e..23d78c1 100644
--- a/src/plugins/platforms/vnc/main.cpp
+++ b/src/plugins/platforms/vnc/main.cpp
@@ -39,34 +39,34 @@
**
****************************************************************************/
-#include <QtGui/QPlatformIntegrationPlugin>
#include "qgraphicssystem_vnc.h"
#include <qstringlist.h>
+#include <QtGui/QPlatformIntegrationPlugin>
QT_BEGIN_NAMESPACE
-class QVNCPlatformIntegrationPlugin : public QPlatformIntegrationPlugin
+class QVNCIntegrationPlugin : public QPlatformIntegrationPlugin
{
public:
QStringList keys() const;
QPlatformIntegration *create(const QString&);
};
-QStringList QVNCPlatformIntegrationPlugin::keys() const
+QStringList QVNCIntegrationPlugin::keys() const
{
QStringList list;
list << "VNC";
return list;
}
-QPlatformIntegration* QVNCPlatformIntegrationPlugin::create(const QString& system)
+QPlatformIntegration* QVNCIntegrationPlugin::create(const QString& system)
{
if (system.toLower() == "vnc")
- return new QVNCPlatformIntegration;
+ return new QVNCIntegration;
return 0;
}
-Q_EXPORT_PLUGIN2(vnc, QVNCPlatformIntegrationPlugin)
+Q_EXPORT_PLUGIN2(vnc, QVNCIntegrationPlugin)
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/vnc/qgraphicssystem_vnc.cpp b/src/plugins/platforms/vnc/qgraphicssystem_vnc.cpp
index 85f1b73..a872991 100644
--- a/src/plugins/platforms/vnc/qgraphicssystem_vnc.cpp
+++ b/src/plugins/platforms/vnc/qgraphicssystem_vnc.cpp
@@ -51,8 +51,8 @@
#include <QtCore/QTimer>
-QVNCPlatformScreen::QVNCPlatformScreen()
- : QFbPlatformScreen::QFbPlatformScreen()
+QVNCScreen::QVNCScreen()
+ : QFbScreen::QFbScreen()
{
int w = 800;
int h = 600;
@@ -69,21 +69,21 @@ QVNCPlatformScreen::QVNCPlatformScreen()
setPhysicalSize((geometry().size()*254)/720);
- d_ptr = new QVNCPlatformScreenPrivate(this);
+ d_ptr = new QVNCScreenPrivate(this);
cursor = new QVNCCursor(d_ptr->vncServer, this);
d_ptr->vncServer->setCursor(static_cast<QVNCCursor *>(cursor));
}
-QVNCDirtyMap *QVNCPlatformScreen::dirtyMap()
+QVNCDirtyMap *QVNCScreen::dirtyMap()
{
return d_ptr->dirty;
}
-QRegion QVNCPlatformScreen::doRedraw()
+QRegion QVNCScreen::doRedraw()
{
QRegion touched;
- touched = QFbPlatformScreen::doRedraw();
+ touched = QFbScreen::doRedraw();
QVector<QRect> rects = touched.rects();
for (int i = 0; i < rects.size(); i++)
@@ -92,24 +92,40 @@ QRegion QVNCPlatformScreen::doRedraw()
}
-QVNCPlatformIntegration::QVNCPlatformIntegration()
+QVNCIntegration::QVNCIntegration()
{
- mPrimaryScreen = new QVNCPlatformScreen();
+ mPrimaryScreen = new QVNCScreen();
mScreens.append(mPrimaryScreen);
}
-QPixmapData *QVNCPlatformIntegration::createPixmapData(QPixmapData::PixelType type) const
+QPixmapData *QVNCIntegration::createPixmapData(QPixmapData::PixelType type) const
{
return new QRasterPixmapData(type);
}
-QWindowSurface *QVNCPlatformIntegration::createWindowSurface(QWidget *widget) const
+// QWindowSurface *QVNCIntegration::createWindowSurface(QWidget *widget) const
+// {
+// if (widget->windowType() == Qt::Desktop)
+// return 0; // Don't create an explicit window surface for the destkop.
+// QFbWindowSurface * surface;
+// surface = new QFbWindowSurface(mPrimaryScreen, widget);
+// mPrimaryScreen->addWindowSurface(surface);
+// return surface;
+// }
+
+QWindowSurface *QVNCIntegration::createWindowSurface(QWidget *widget, WId) const
{
- if (widget->windowType() == Qt::Desktop)
- return 0; // Don't create an explicit window surface for the destkop.
QFbWindowSurface * surface;
surface = new QFbWindowSurface(mPrimaryScreen, widget);
- mPrimaryScreen->addWindowSurface(surface);
return surface;
}
+
+
+QPlatformWindow *QVNCIntegration::createPlatformWindow(QWidget *widget, WId /*winId*/) const
+{
+ QFbWindow *w = new QFbWindow(mPrimaryScreen, widget);
+ mPrimaryScreen->addWindow(w);
+ return w;
+}
+
diff --git a/src/plugins/platforms/vnc/qgraphicssystem_vnc.h b/src/plugins/platforms/vnc/qgraphicssystem_vnc.h
index 731d3e9..524b888 100644
--- a/src/plugins/platforms/vnc/qgraphicssystem_vnc.h
+++ b/src/plugins/platforms/vnc/qgraphicssystem_vnc.h
@@ -44,48 +44,49 @@
#include "qvnccursor.h"
#include "../fb_base/fb_base.h"
-#include <QtGui/QPlatformIntegration>
+#include <QPlatformIntegration>
QT_BEGIN_NAMESPACE
class QVNCServer;
class QVNCDirtyMap;
-class QVNCPlatformScreenPrivate;
+class QVNCScreenPrivate;
-class QVNCPlatformScreen : public QFbPlatformScreen
+class QVNCScreen : public QFbScreen
{
public:
- QVNCPlatformScreen();
+ QVNCScreen();
int linestep() const { return image() ? image()->bytesPerLine() : 0; }
uchar *base() const { return image() ? image()->bits() : 0; }
QVNCDirtyMap *dirtyMap();
public:
- QVNCPlatformScreenPrivate *d_ptr;
+ QVNCScreenPrivate *d_ptr;
private:
QVNCServer *server;
QRegion doRedraw();
};
-class QVNCPlatformIntegrationPrivate;
+class QVNCIntegrationPrivate;
-class QVNCPlatformIntegration : public QPlatformIntegration
+class QVNCIntegration : public QPlatformIntegration
{
public:
- QVNCPlatformIntegration();
+ QVNCIntegration();
QPixmapData *createPixmapData(QPixmapData::PixelType type) const;
- QWindowSurface *createWindowSurface(QWidget *widget) const;
+ QPlatformWindow *createPlatformWindow(QWidget *widget, WId winId) const;
+ QWindowSurface *createWindowSurface(QWidget *widget, WId winId) const;
QList<QPlatformScreen *> screens() const { return mScreens; }
private:
- QVNCPlatformScreen *mPrimaryScreen;
+ QVNCScreen *mPrimaryScreen;
QList<QPlatformScreen *> mScreens;
};
diff --git a/src/plugins/platforms/vnc/qvnccursor.cpp b/src/plugins/platforms/vnc/qvnccursor.cpp
index 5f9fbb6..78da53b 100644
--- a/src/plugins/platforms/vnc/qvnccursor.cpp
+++ b/src/plugins/platforms/vnc/qvnccursor.cpp
@@ -53,7 +53,7 @@
QT_BEGIN_NAMESPACE
-QVNCCursor::QVNCCursor(QVNCServer * srvr, QVNCPlatformScreen *scr )
+QVNCCursor::QVNCCursor(QVNCServer * srvr, QVNCScreen *scr )
:QGraphicsSystemSoftwareCursor(scr), useVncCursor(false), server(srvr)
{
}
diff --git a/src/plugins/platforms/vnc/qvnccursor.h b/src/plugins/platforms/vnc/qvnccursor.h
index 0e4d7ca..2c6ff5b 100644
--- a/src/plugins/platforms/vnc/qvnccursor.h
+++ b/src/plugins/platforms/vnc/qvnccursor.h
@@ -48,12 +48,12 @@
QT_BEGIN_NAMESPACE
-class QVNCPlatformScreen;
+class QVNCScreen;
class QVNCServer;
class QVNCCursor : public QGraphicsSystemSoftwareCursor {
public:
- QVNCCursor(QVNCServer *, QVNCPlatformScreen *);
+ QVNCCursor(QVNCServer *, QVNCScreen *);
// input methods
void setCursorMode(bool vnc);
diff --git a/src/plugins/platforms/vnc/qvncserver.cpp b/src/plugins/platforms/vnc/qvncserver.cpp
index ce08082..ab0a2f3 100644
--- a/src/plugins/platforms/vnc/qvncserver.cpp
+++ b/src/plugins/platforms/vnc/qvncserver.cpp
@@ -358,13 +358,13 @@ bool QRfbClientCutText::read(QTcpSocket *s)
//===========================================================================
-QVNCServer::QVNCServer(QVNCPlatformScreen *screen)
+QVNCServer::QVNCServer(QVNCScreen *screen)
: qvnc_screen(screen), cursor(0)
{
init(5900);
}
-QVNCServer::QVNCServer(QVNCPlatformScreen *screen, int id)
+QVNCServer::QVNCServer(QVNCScreen *screen, int id)
: qvnc_screen(screen), cursor(0)
{
init(5900 + id);
@@ -1499,7 +1499,7 @@ static void blendCursor(QImage &image, const QRect &imageRect)
}
#endif // QT_NO_QWS_CURSOR
-QVNCDirtyMap::QVNCDirtyMap(QVNCPlatformScreen *s)
+QVNCDirtyMap::QVNCDirtyMap(QVNCScreen *s)
: bytesPerPixel(0), numDirty(0), screen(s)
{
bytesPerPixel = (screen->depth() + 7) / 8;
@@ -1885,7 +1885,7 @@ void QVNCServer::discardClient()
-QVNCPlatformScreenPrivate::QVNCPlatformScreenPrivate(QVNCPlatformScreen *parent)
+QVNCScreenPrivate::QVNCScreenPrivate(QVNCScreen *parent)
: dpiX(72), dpiY(72), doOnScreenSurface(false), refreshRate(25),
vncServer(0), q_ptr(parent)
{
@@ -1902,12 +1902,12 @@ QVNCPlatformScreenPrivate::QVNCPlatformScreenPrivate(QVNCPlatformScreen *parent)
dirty = new QVNCDirtyMapOptimized<quint32>(q_ptr);
}
-QVNCPlatformScreenPrivate::~QVNCPlatformScreenPrivate()
+QVNCScreenPrivate::~QVNCScreenPrivate()
{
}
-void QVNCPlatformScreenPrivate::setDirty(const QRect& rect, bool force)
+void QVNCScreenPrivate::setDirty(const QRect& rect, bool force)
{
if (rect.isEmpty())
return;
diff --git a/src/plugins/platforms/vnc/qvncserver.h b/src/plugins/platforms/vnc/qvncserver.h
index 6830ddd..41cadab 100644
--- a/src/plugins/platforms/vnc/qvncserver.h
+++ b/src/plugins/platforms/vnc/qvncserver.h
@@ -106,7 +106,7 @@ private:
class QVNCDirtyMap
{
public:
- QVNCDirtyMap(QVNCPlatformScreen *screen);
+ QVNCDirtyMap(QVNCScreen *screen);
virtual ~QVNCDirtyMap();
void reset();
@@ -122,7 +122,7 @@ public:
protected:
uchar *map;
- QVNCPlatformScreen *screen;
+ QVNCScreen *screen;
uchar *buffer;
int bufferWidth;
int bufferHeight;
@@ -134,7 +134,7 @@ template <class T>
class QVNCDirtyMapOptimized : public QVNCDirtyMap
{
public:
- QVNCDirtyMapOptimized(QVNCPlatformScreen *screen) : QVNCDirtyMap(screen) {}
+ QVNCDirtyMapOptimized(QVNCScreen *screen) : QVNCDirtyMap(screen) {}
~QVNCDirtyMapOptimized() {}
void setDirty(int x, int y, bool force = false);
@@ -246,11 +246,11 @@ public:
quint32 length;
};
-class QVNCPlatformScreenPrivate : public QObject
+class QVNCScreenPrivate : public QObject
{
public:
- QVNCPlatformScreenPrivate(QVNCPlatformScreen *parent);
- ~QVNCPlatformScreenPrivate();
+ QVNCScreenPrivate(QVNCScreen *parent);
+ ~QVNCScreenPrivate();
void setDirty(const QRect &rect, bool force = false);
void configure();
@@ -266,7 +266,7 @@ public:
QSharedMemory shm;
#endif
- QVNCPlatformScreen *q_ptr;
+ QVNCScreen *q_ptr;
};
class QRfbEncoder
@@ -438,8 +438,8 @@ class QVNCServer : public QObject
{
Q_OBJECT
public:
- QVNCServer(QVNCPlatformScreen *screen);
- QVNCServer(QVNCPlatformScreen *screen, int id);
+ QVNCServer(QVNCScreen *screen);
+ QVNCServer(QVNCScreen *screen, int id);
~QVNCServer();
void setDirty();
@@ -464,7 +464,7 @@ public:
return pixelFormat.bitsPerPixel / 8;
}
- inline QVNCPlatformScreen* screen() const { return qvnc_screen; }
+ inline QVNCScreen* screen() const { return qvnc_screen; }
inline QVNCDirtyMap* dirtyMap() const { return qvnc_screen->dirtyMap(); }
inline QTcpSocket* clientSocket() const { return client; }
QImage *screenImage() const;
@@ -519,7 +519,7 @@ private:
#endif
bool dirtyCursor;
int refreshRate;
- QVNCPlatformScreen *qvnc_screen;
+ QVNCScreen *qvnc_screen;
#ifndef QT_NO_QWS_CURSOR
QVNCClientCursor *qvnc_cursor;
#endif
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 730fdc5..0e9a14c 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -6,7 +6,7 @@ unix:!symbian {
} else {
SUBDIRS *= codecs
}
-!embedded:SUBDIRS *= graphicssystems
+!embedded:!embedded_lite:SUBDIRS *= graphicssystems
embedded:SUBDIRS *= gfxdrivers decorations mousedrivers kbddrivers
!win32:!embedded:!mac:!symbian:SUBDIRS *= inputmethods
symbian:SUBDIRS += s60