summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/accessible/widgets/main.cpp4
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.cpp17
-rw-r--r--src/plugins/accessible/widgets/qaccessiblewidgets.h4
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.cpp109
-rw-r--r--src/plugins/accessible/widgets/simplewidgets.h29
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.mm29
-rw-r--r--src/plugins/platforms/cocoa/qcocoaclipboard.mm1
-rw-r--r--src/plugins/platforms/cocoa/qcocoacursor.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm1
-rw-r--r--src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm11
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h7
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm18
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.h4
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.mm4
-rw-r--r--src/plugins/platforms/cocoa/qmacmime.h4
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm38
-rw-r--r--src/plugins/platforms/cocoa/qnsviewaccessibility.mm1
-rw-r--r--src/plugins/platforms/eglfs/eglfs.pro4
-rw-r--r--src/plugins/platforms/eglfs/qeglfsbackingstore.cpp77
-rw-r--r--src/plugins/platforms/eglfs/qeglfsbackingstore.h17
-rw-r--r--src/plugins/platforms/qnx/qnx.pro10
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.cpp17
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.h4
-rw-r--r--src/plugins/platforms/qnx/qqnxservices.cpp81
-rw-r--r--src/plugins/platforms/qnx/qqnxservices.h (renamed from src/plugins/platforms/xcb/qxcbsharedgraphicscache.h)51
-rw-r--r--src/plugins/platforms/windows/accessible/accessible.pri25
-rw-r--r--src/plugins/platforms/windows/accessible/iaccessible2.cpp123
-rw-r--r--src/plugins/platforms/windows/accessible/iaccessible2.h41
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp14
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp58
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h29
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp29
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.h8
-rw-r--r--src/plugins/platforms/xcb/qxcbsharedbuffermanager.cpp640
-rw-r--r--src/plugins/platforms/xcb/qxcbsharedbuffermanager.h215
-rw-r--r--src/plugins/platforms/xcb/qxcbsharedgraphicscache.cpp290
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp15
-rw-r--r--src/plugins/platforms/xcb/xcb.pro11
-rw-r--r--src/plugins/printsupport/windows/qwindowsprintersupport.cpp4
43 files changed, 587 insertions, 1470 deletions
diff --git a/src/plugins/accessible/widgets/main.cpp b/src/plugins/accessible/widgets/main.cpp
index 10a9aa8f47..d180be6d2a 100644
--- a/src/plugins/accessible/widgets/main.cpp
+++ b/src/plugins/accessible/widgets/main.cpp
@@ -234,8 +234,10 @@ QAccessibleInterface *AccessibleFactory::create(const QString &classname, QObjec
#endif
} else if (classname == QLatin1String("QLabel") || classname == QLatin1String("QLCDNumber")) {
iface = new QAccessibleDisplay(widget);
+#ifndef QT_NO_GROUPBOX
} else if (classname == QLatin1String("QGroupBox")) {
- iface = new QAccessibleDisplay(widget, QAccessible::Grouping);
+ iface = new QAccessibleGroupBox(widget);
+#endif
} else if (classname == QLatin1String("QStatusBar")) {
iface = new QAccessibleWidget(widget, QAccessible::StatusBar);
#ifndef QT_NO_PROGRESSBAR
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
index 222d838642..a002b8bf26 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.cpp
@@ -271,7 +271,7 @@ int QAccessibleTextEdit::cursorPosition() const
return textEdit()->textCursor().position();
}
-QRect QAccessibleTextEdit::characterRect(int offset, CoordinateType coordType) const
+QRect QAccessibleTextEdit::characterRect(int offset) const
{
QTextEdit *edit = textEdit();
QTextCursor cursor(edit->document());
@@ -292,14 +292,7 @@ QRect QAccessibleTextEdit::characterRect(int offset, CoordinateType coordType) c
r.setWidth(averageCharWidth);
}
- switch (coordType) {
- case RelativeToScreen:
- r.moveTo(edit->viewport()->mapToGlobal(r.topLeft()));
- break;
- case RelativeToParent:
- break;
- }
-
+ r.moveTo(edit->viewport()->mapToGlobal(r.topLeft()));
return r;
}
@@ -308,13 +301,11 @@ int QAccessibleTextEdit::selectionCount() const
return textEdit()->textCursor().hasSelection() ? 1 : 0;
}
-int QAccessibleTextEdit::offsetAtPoint(const QPoint &point, CoordinateType coordType) const
+int QAccessibleTextEdit::offsetAtPoint(const QPoint &point) const
{
QTextEdit *edit = textEdit();
- QPoint p = point;
- if (coordType == RelativeToScreen)
- p = edit->viewport()->mapFromGlobal(p);
+ QPoint p = edit->viewport()->mapFromGlobal(point);
// convert to document coordinates
p += QPoint(edit->horizontalScrollBar()->value(), edit->verticalScrollBar()->value());
diff --git a/src/plugins/accessible/widgets/qaccessiblewidgets.h b/src/plugins/accessible/widgets/qaccessiblewidgets.h
index f161c52561..79ac5ae7b5 100644
--- a/src/plugins/accessible/widgets/qaccessiblewidgets.h
+++ b/src/plugins/accessible/widgets/qaccessiblewidgets.h
@@ -80,9 +80,9 @@ public:
void addSelection(int startOffset, int endOffset);
QString attributes(int offset, int *startOffset, int *endOffset) const;
int cursorPosition() const;
- QRect characterRect(int offset, QAccessible2::CoordinateType coordType) const;
+ QRect characterRect(int offset) const;
int selectionCount() const;
- int offsetAtPoint(const QPoint &point, QAccessible2::CoordinateType coordType) const;
+ int offsetAtPoint(const QPoint &point) const;
void selection(int selectionIndex, int *startOffset, int *endOffset) const;
QString text(int startOffset, int endOffset) const;
QString textBeforeOffset (int offset, QAccessible2::BoundaryType boundaryType,
diff --git a/src/plugins/accessible/widgets/simplewidgets.cpp b/src/plugins/accessible/widgets/simplewidgets.cpp
index 39d7e03a1b..af0c211cca 100644
--- a/src/plugins/accessible/widgets/simplewidgets.cpp
+++ b/src/plugins/accessible/widgets/simplewidgets.cpp
@@ -399,10 +399,6 @@ QString QAccessibleDisplay::text(QAccessible::Text t) const
if (str.isEmpty()) {
if (qobject_cast<QLabel*>(object())) {
str = qobject_cast<QLabel*>(object())->text();
-#ifndef QT_NO_GROUPBOX
- } else if (qobject_cast<QGroupBox*>(object())) {
- str = qobject_cast<QGroupBox*>(object())->title();
-#endif
#ifndef QT_NO_LCDNUMBER
} else if (qobject_cast<QLCDNumber*>(object())) {
QLCDNumber *l = qobject_cast<QLCDNumber*>(object());
@@ -440,15 +436,6 @@ QAccessibleDisplay::relations(QAccessible::Relation match /*= QAccessible::AllRe
if (QLabel *label = qobject_cast<QLabel*>(object())) {
relatedObjects.append(label->buddy());
#endif
-#ifndef QT_NO_GROUPBOX
- } else if (QGroupBox *groupbox = qobject_cast<QGroupBox*>(object())) {
- if (!groupbox->title().isEmpty()) {
- const QList<QWidget*> kids = childWidgets(widget());
- for (int i = 0; i < kids.count(); ++i) {
- relatedObjects.append(kids.at(i));
- }
- }
-#endif
}
for (int i = 0; i < relatedObjects.count(); ++i) {
const QAccessible::Relation rel = QAccessible::Labelled;
@@ -490,7 +477,7 @@ QSize QAccessibleDisplay::imageSize() const
}
/*! \internal */
-QRect QAccessibleDisplay::imagePosition(QAccessible2::CoordinateType coordType) const
+QRect QAccessibleDisplay::imagePosition() const
{
QLabel *label = qobject_cast<QLabel *>(widget());
if (!label)
@@ -499,16 +486,90 @@ QRect QAccessibleDisplay::imagePosition(QAccessible2::CoordinateType coordType)
if (!pixmap)
return QRect();
- switch (coordType) {
- case QAccessible2::RelativeToScreen:
- return QRect(label->mapToGlobal(label->pos()), label->size());
- case QAccessible2::RelativeToParent:
- return label->geometry();
+ return QRect(label->mapToGlobal(label->pos()), label->size());
+}
+
+#ifndef QT_NO_GROUPBOX
+QAccessibleGroupBox::QAccessibleGroupBox(QWidget *w)
+: QAccessibleWidget(w)
+{
+}
+
+QGroupBox* QAccessibleGroupBox::groupBox() const
+{
+ return static_cast<QGroupBox *>(widget());
+}
+
+QString QAccessibleGroupBox::text(QAccessible::Text t) const
+{
+ QString txt = QAccessibleWidget::text(t);
+
+ if (txt.isEmpty()) {
+ switch (t) {
+ case QAccessible::Name:
+ txt = qt_accStripAmp(groupBox()->title());
+ case QAccessible::Description:
+ txt = qt_accStripAmp(groupBox()->title());
+ default:
+ break;
+ }
}
- return QRect();
+ return txt;
+}
+
+QAccessible::State QAccessibleGroupBox::state() const
+{
+ QAccessible::State st = QAccessibleWidget::state();
+ st.checkable = groupBox()->isCheckable();
+ st.checked = groupBox()->isChecked();
+ return st;
+}
+
+QAccessible::Role QAccessibleGroupBox::role() const
+{
+ return groupBox()->isCheckable() ? QAccessible::CheckBox : QAccessible::Grouping;
+}
+
+QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >
+QAccessibleGroupBox::relations(QAccessible::Relation match /*= QAccessible::AllRelations*/) const
+{
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> > rels = QAccessibleWidget::relations(match);
+
+ if ((match & QAccessible::Labelled) && (!groupBox()->title().isEmpty())) {
+ const QList<QWidget*> kids = childWidgets(widget());
+ for (int i = 0; i < kids.count(); ++i) {
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(kids.at(i));
+ if (iface)
+ rels.append(qMakePair(iface, QAccessible::Relation(QAccessible::Labelled)));
+ }
+ }
+ return rels;
+}
+
+QStringList QAccessibleGroupBox::actionNames() const
+{
+ QStringList actions = QAccessibleWidget::actionNames();
+
+ if (groupBox()->isCheckable()) {
+ actions.prepend(QAccessibleActionInterface::checkAction());
+ }
+ return actions;
+}
+
+void QAccessibleGroupBox::doAction(const QString &actionName)
+{
+ if (actionName == QAccessibleActionInterface::checkAction())
+ groupBox()->setChecked(!groupBox()->isChecked());
}
+QStringList QAccessibleGroupBox::keyBindingsForAction(const QString &) const
+{
+ return QStringList();
+}
+
+#endif
+
#ifndef QT_NO_LINEEDIT
/*!
\class QAccessibleLineEdit
@@ -613,7 +674,7 @@ int QAccessibleLineEdit::cursorPosition() const
return lineEdit()->cursorPosition();
}
-QRect QAccessibleLineEdit::characterRect(int /*offset*/, CoordinateType /*coordType*/) const
+QRect QAccessibleLineEdit::characterRect(int /*offset*/) const
{
// QLineEdit doesn't hand out character rects
return QRect();
@@ -624,11 +685,9 @@ int QAccessibleLineEdit::selectionCount() const
return lineEdit()->hasSelectedText() ? 1 : 0;
}
-int QAccessibleLineEdit::offsetAtPoint(const QPoint &point, CoordinateType coordType) const
+int QAccessibleLineEdit::offsetAtPoint(const QPoint &point) const
{
- QPoint p = point;
- if (coordType == RelativeToScreen)
- p = lineEdit()->mapFromGlobal(p);
+ QPoint p = lineEdit()->mapFromGlobal(point);
return lineEdit()->cursorPositionAt(p);
}
diff --git a/src/plugins/accessible/widgets/simplewidgets.h b/src/plugins/accessible/widgets/simplewidgets.h
index c228775421..74c1da405d 100644
--- a/src/plugins/accessible/widgets/simplewidgets.h
+++ b/src/plugins/accessible/widgets/simplewidgets.h
@@ -53,6 +53,7 @@ QT_BEGIN_NAMESPACE
class QAbstractButton;
class QLineEdit;
class QToolButton;
+class QGroupBox;
class QProgressBar;
class QAccessibleButton : public QAccessibleWidget
@@ -110,9 +111,31 @@ public:
// QAccessibleImageInterface
QString imageDescription() const;
QSize imageSize() const;
- QRect imagePosition(QAccessible2::CoordinateType coordType) const;
+ QRect imagePosition() const;
};
+#ifndef QT_NO_GROUPBOX
+class QAccessibleGroupBox : public QAccessibleWidget
+{
+public:
+ explicit QAccessibleGroupBox(QWidget *w);
+
+ QAccessible::State state() const;
+ QAccessible::Role role() const;
+ QString text(QAccessible::Text t) const;
+
+ QVector<QPair<QAccessibleInterface*, QAccessible::Relation> >relations(QAccessible::Relation match = QAccessible::AllRelations) const;
+
+ //QAccessibleActionInterface
+ QStringList actionNames() const;
+ void doAction(const QString &actionName);
+ QStringList keyBindingsForAction(const QString &) const;
+
+private:
+ QGroupBox *groupBox() const;
+};
+#endif
+
#ifndef QT_NO_LINEEDIT
class QAccessibleLineEdit : public QAccessibleWidget, public QAccessibleTextInterface,
public QAccessibleSimpleEditableTextInterface
@@ -129,9 +152,9 @@ public:
void addSelection(int startOffset, int endOffset);
QString attributes(int offset, int *startOffset, int *endOffset) const;
int cursorPosition() const;
- QRect characterRect(int offset, QAccessible2::CoordinateType coordType) const;
+ QRect characterRect(int offset) const;
int selectionCount() const;
- int offsetAtPoint(const QPoint &point, QAccessible2::CoordinateType coordType) const;
+ int offsetAtPoint(const QPoint &point) const;
void selection(int selectionIndex, int *startOffset, int *endOffset) const;
QString text(int startOffset, int endOffset) const;
QString textBeforeOffset (int offset, QAccessible2::BoundaryType boundaryType,
diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
index e405c81726..947d91005d 100644
--- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
+++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
@@ -172,8 +172,8 @@ static void cleanupCocoaApplicationDelegate()
// QApplicationPrivate::globalAppleEventProcessor in qapplication_mac.mm
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
-/*
Q_UNUSED(sender);
+/*
// The reflection delegate gets precedence
if (reflectionDelegate
&& [reflectionDelegate respondsToSelector:@selector(applicationShouldTerminate:)]) {
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h
index 794693627b..489938c4b3 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.h
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h
@@ -60,6 +60,7 @@ public:
QPaintDevice *paintDevice();
void flush(QWindow *widget, const QRegion &region, const QPoint &offset);
void resize (const QSize &size, const QRegion &);
+ bool scroll(const QRegion &area, int dx, int dy);
private:
QCocoaWindow *m_cocoaWindow;
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
index 5e221ffd8b..f0ff7ba0d6 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.mm
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm
@@ -47,23 +47,10 @@
QT_BEGIN_NAMESPACE
-QRect flipedRect(const QRect &sourceRect,int height)
-{
- if (!sourceRect.isValid())
- return QRect();
- QRect flippedRect = sourceRect;
- flippedRect.moveTop(height - sourceRect.y());
- return flippedRect;
-}
-
QCocoaBackingStore::QCocoaBackingStore(QWindow *window)
: QPlatformBackingStore(window)
{
m_cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
-
- const QRect geo = window->geometry();
- NSRect rect = NSMakeRect(geo.x(),geo.y(),geo.width(),geo.height());
-
m_image = new QImage(window->geometry().size(),QImage::Format_ARGB32_Premultiplied);
}
@@ -84,7 +71,6 @@ void QCocoaBackingStore::flush(QWindow *widget, const QRegion &region, const QPo
QCocoaAutoReleasePool pool;
QRect geo = region.boundingRect();
-
NSRect rect = NSMakeRect(geo.x(), geo.y(), geo.width(), geo.height());
[m_cocoaWindow->m_contentView displayRect:rect];
}
@@ -92,9 +78,20 @@ void QCocoaBackingStore::flush(QWindow *widget, const QRegion &region, const QPo
void QCocoaBackingStore::resize(const QSize &size, const QRegion &)
{
delete m_image;
- m_image = new QImage(size,QImage::Format_ARGB32_Premultiplied);
- NSSize newSize = NSMakeSize(size.width(),size.height());
+ m_image = new QImage(size, QImage::Format_ARGB32_Premultiplied);
[static_cast<QNSView *>(m_cocoaWindow->m_contentView) setImage:m_image];
}
+bool QCocoaBackingStore::scroll(const QRegion &area, int dx, int dy)
+{
+ extern void qt_scrollRectInImage(QImage &img, const QRect &rect, const QPoint &offset);
+ QPoint qpoint(dx, dy);
+ const QVector<QRect> qrects = area.rects();
+ for (int i = 0; i < qrects.count(); ++i) {
+ const QRect &qrect = qrects.at(i);
+ qt_scrollRectInImage(*m_image, qrect, qpoint);
+ }
+ return true;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoaclipboard.mm b/src/plugins/platforms/cocoa/qcocoaclipboard.mm
index 87c085457f..f76174e085 100644
--- a/src/plugins/platforms/cocoa/qcocoaclipboard.mm
+++ b/src/plugins/platforms/cocoa/qcocoaclipboard.mm
@@ -81,6 +81,7 @@ bool QCocoaClipboard::supportsMode(QClipboard::Mode mode) const
bool QCocoaClipboard::ownsMode(QClipboard::Mode mode) const
{
+ Q_UNUSED(mode);
return false;
}
diff --git a/src/plugins/platforms/cocoa/qcocoacursor.mm b/src/plugins/platforms/cocoa/qcocoacursor.mm
index 56f0dcf72e..bd8d32b07e 100644
--- a/src/plugins/platforms/cocoa/qcocoacursor.mm
+++ b/src/plugins/platforms/cocoa/qcocoacursor.mm
@@ -59,6 +59,8 @@ QCocoaCursor::QCocoaCursor()
void QCocoaCursor::changeCursor(QCursor *cursor, QWindow *window)
{
+ Q_UNUSED(window);
+
// Check for a suitable built-in NSCursor first:
switch (cursor->shape()) {
case Qt::ArrowCursor:
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
index 305a8ddc95..77cccac0b4 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
@@ -895,6 +895,7 @@ QCocoaEventDispatcherPrivate::QCocoaEventDispatcherPrivate()
nsAppRunCalledByQt(false),
cleanupModalSessionsNeeded(false),
currentModalSessionCached(0),
+ lastSerial(-1),
interrupt(false)
{
}
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
index ecb732c9da..c333e3ac1f 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
@@ -504,17 +504,6 @@ typedef QSharedPointer<QFileDialogOptions> SharedPointerFileDialogOptions;
QT_BEGIN_NAMESPACE
-static bool qt_mac_is_macsheet(const QWidget *w)
-{
- if (!w)
- return false;
-
- Qt::WindowModality modality = w->windowModality();
- if (modality == Qt::ApplicationModal)
- return false;
- return w->parentWidget() && (modality == Qt::WindowModal || w->windowType() == Qt::Sheet);
-}
-
QCocoaFileDialogHelper::QCocoaFileDialogHelper()
:mDelegate(0)
{
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
index 8856e90cf3..bb4d0f9f6c 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
@@ -45,6 +45,8 @@
#include <QtGui/QPlatformNativeInterface>
#include <QtPrintSupport/QPlatformPrinterSupport>
+QT_BEGIN_NAMESPACE
+
class QWidget;
class QCocoaNativeInterface : public QPlatformNativeInterface
@@ -74,3 +76,5 @@ private:
};
#endif // QCOCOANATIVEINTERFACE_H
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
index 29c2e58959..ca15b6bbfb 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
@@ -54,6 +54,8 @@
#include "qprintengine_mac_p.h"
+QT_BEGIN_NAMESPACE
+
void *QCocoaNativeInterface::nativeResourceForWindow(const QByteArray &resourceString, QWindow *window)
{
if (!window->handle()) {
@@ -81,3 +83,5 @@ void *QCocoaNativeInterface::NSPrintInfoForPrintEngine(QPrintEngine *printEngine
QMacPrintEngine *macPrintEngine = static_cast<QMacPrintEngine *>(printEngine);
return macPrintEngine->d_func()->printInfo;
}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 90c5a050d0..184422a04a 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -49,7 +49,7 @@
#include "qcocoaglcontext.h"
#include "qnsview.h"
-class QCocoaWindow;
+class QT_PREPEND_NAMESPACE(QCocoaWindow);
@interface QNSWindow : NSWindow {
@public QCocoaWindow *m_cocoaPlatformWindow;
@@ -59,7 +59,7 @@ class QCocoaWindow;
@end
@interface QNSPanel : NSPanel {
- @public QCocoaWindow *m_cocoaPlatformWindow;
+ @public QT_PREPEND_NAMESPACE(QCocoaWindow) *m_cocoaPlatformWindow;
}
- (BOOL)canBecomeKeyWindow;
@end
@@ -99,6 +99,7 @@ public:
void raise();
void lower();
void propagateSizeHints();
+ void setOpacity(qreal level);
bool setKeyboardGrabEnabled(bool grab);
bool setMouseGrabEnabled(bool grab);
@@ -133,7 +134,7 @@ public: // for QNSView
friend class QCocoaNativeInterface;
QNSView *m_contentView;
- QNSWindow *m_nsWindow;
+ NSWindow *m_nsWindow;
Qt::WindowFlags m_windowFlags;
QPointer<QWindow> m_activePopupWindow;
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index b5e8ff2246..4f95489798 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -111,8 +111,8 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
QCocoaWindow::~QCocoaWindow()
{
- [m_contentView release];
clearNSWindow(m_nsWindow);
+ [m_contentView release];
[m_nsWindow release];
}
@@ -198,13 +198,17 @@ void QCocoaWindow::raise()
{
//qDebug() << "raise" << this;
// ### handle spaces (see Qt 4 raise_sys in qwidget_mac.mm)
- if (m_nsWindow)
+ if (!m_nsWindow)
+ return;
+ if ([m_nsWindow isVisible])
[m_nsWindow orderFront: m_nsWindow];
}
void QCocoaWindow::lower()
{
- if (m_nsWindow)
+ if (!m_nsWindow)
+ return;
+ if ([m_nsWindow isVisible])
[m_nsWindow orderBack: m_nsWindow];
}
@@ -233,6 +237,12 @@ void QCocoaWindow::propagateSizeHints()
}
}
+void QCocoaWindow::setOpacity(qreal level)
+{
+ if (m_nsWindow)
+ [m_nsWindow setAlphaValue:level];
+}
+
bool QCocoaWindow::setKeyboardGrabEnabled(bool grab)
{
if (!m_nsWindow)
@@ -439,7 +449,9 @@ void QCocoaWindow::setNSWindow(NSWindow *window)
void QCocoaWindow::clearNSWindow(NSWindow *window)
{
+ [window setDelegate:nil];
[[NSNotificationCenter defaultCenter] removeObserver:m_contentView];
+ [m_contentView removeFromSuperviewWithoutNeedingDisplay];
}
// Returns the current global screen geometry for the nswindow associated with this window.
diff --git a/src/plugins/platforms/cocoa/qmacclipboard.h b/src/plugins/platforms/cocoa/qmacclipboard.h
index 9371aca459..634d29a60f 100644
--- a/src/plugins/platforms/cocoa/qmacclipboard.h
+++ b/src/plugins/platforms/cocoa/qmacclipboard.h
@@ -49,6 +49,8 @@
#import <Cocoa/Cocoa.h>
+QT_BEGIN_NAMESPACE
+
class QMacPasteboard
{
struct Promise {
@@ -90,4 +92,6 @@ public:
QString qt_mac_get_pasteboardString(PasteboardRef paste);
+QT_END_NAMESPACE
+
#endif
diff --git a/src/plugins/platforms/cocoa/qmacclipboard.mm b/src/plugins/platforms/cocoa/qmacclipboard.mm
index eff2c5b07a..73abd8945c 100644
--- a/src/plugins/platforms/cocoa/qmacclipboard.mm
+++ b/src/plugins/platforms/cocoa/qmacclipboard.mm
@@ -56,8 +56,6 @@
QT_BEGIN_NAMESPACE
-QT_USE_NAMESPACE
-
/*****************************************************************************
QClipboard debug facilities
*****************************************************************************/
@@ -548,6 +546,4 @@ QString qt_mac_get_pasteboardString(PasteboardRef paste)
return QString();
}
-
-
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qmacmime.h b/src/plugins/platforms/cocoa/qmacmime.h
index 7226caef28..12c9aff039 100644
--- a/src/plugins/platforms/cocoa/qmacmime.h
+++ b/src/plugins/platforms/cocoa/qmacmime.h
@@ -46,6 +46,8 @@
#include <CoreFoundation/CoreFoundation.h>
+QT_BEGIN_NAMESPACE
+
class Q_GUI_EXPORT QMacPasteboardMime {
char type;
public:
@@ -74,5 +76,7 @@ public:
virtual QList<QByteArray> convertFromMime(const QString &mime, QVariant data, QString flav) = 0;
};
+QT_END_NAMESPACE
+
#endif
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index d249158db3..e76c02704f 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -238,6 +238,7 @@ static QTouchDevice *touchDevice = 0;
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
+ Q_UNUSED(theEvent);
return YES;
}
@@ -638,6 +639,43 @@ static QTouchDevice *touchDevice = 0;
[self handleKeyEvent:nsevent eventType:int(QEvent::KeyRelease)];
}
+- (void)flagsChanged:(NSEvent *)nsevent
+{
+ ulong timestamp = [nsevent timestamp] * 1000;
+ ulong modifiers = [nsevent modifierFlags];
+ Qt::KeyboardModifiers qmodifiers = [self convertKeyModifiers:modifiers];
+
+ // calculate the delta and remember the current modifiers for next time
+ static ulong m_lastKnownModifiers;
+ ulong lastKnownModifiers = m_lastKnownModifiers;
+ ulong delta = lastKnownModifiers ^ modifiers;
+ m_lastKnownModifiers = modifiers;
+
+ struct qt_mac_enum_mapper
+ {
+ ulong mac_mask;
+ Qt::Key qt_code;
+ };
+ static qt_mac_enum_mapper modifier_key_symbols[] = {
+ { NSShiftKeyMask, Qt::Key_Shift },
+ { NSControlKeyMask, Qt::Key_Meta },
+ { NSCommandKeyMask, Qt::Key_Control },
+ { NSAlternateKeyMask, Qt::Key_Alt },
+ { NSAlphaShiftKeyMask, Qt::Key_CapsLock },
+ { 0ul, Qt::Key_unknown } };
+ for (int i = 0; modifier_key_symbols[i].mac_mask != 0u; ++i) {
+ uint mac_mask = modifier_key_symbols[i].mac_mask;
+ if ((delta & mac_mask) == 0u)
+ continue;
+
+ QWindowSystemInterface::handleKeyEvent(m_window,
+ timestamp,
+ (lastKnownModifiers & mac_mask) ? QEvent::KeyRelease : QEvent::KeyPress,
+ modifier_key_symbols[i].qt_code,
+ qmodifiers);
+ }
+}
+
- (void) doCommandBySelector:(SEL)aSelector
{
[self tryToPerform:aSelector with:self];
diff --git a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
index d20246d292..205a52c204 100644
--- a/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
+++ b/src/plugins/platforms/cocoa/qnsviewaccessibility.mm
@@ -87,7 +87,6 @@
- (id)accessibilityHitTest:(NSPoint)point {
if (!m_accessibleRoot)
return [super accessibilityHitTest:point];
- NSPoint windowPoint = [[self window] convertScreenToBase:point];
QAccessibleInterface *childInterface = m_accessibleRoot->childAt(point.x, qt_mac_flipYCoordinate(point.y));
// No child found, meaning we hit the NSView
diff --git a/src/plugins/platforms/eglfs/eglfs.pro b/src/plugins/platforms/eglfs/eglfs.pro
index 86a1b8239c..c12d612c98 100644
--- a/src/plugins/platforms/eglfs/eglfs.pro
+++ b/src/plugins/platforms/eglfs/eglfs.pro
@@ -3,10 +3,6 @@ load(qt_plugin)
QT += core-private gui-private platformsupport-private
-!contains(QT_CONFIG, no-widgets) {
- QT += opengl opengl-private widgets-private
-}
-
DESTDIR = $$QT.gui.plugins/platforms
#DEFINES += QEGL_EXTRA_DEBUG
diff --git a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp
index d2e4a47e56..8e9e5f76e0 100644
--- a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp
+++ b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp
@@ -41,67 +41,54 @@
#include "qeglfsbackingstore.h"
-#ifndef QT_NO_WIDGETS
-#include <QtOpenGL/private/qgl_p.h>
-#include <QtOpenGL/private/qglpaintdevice_p.h>
-#endif //QT_NO_WIDGETS
-
-#include <QtGui/QPlatformOpenGLContext>
-#include <QtGui/QScreen>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOpenGLPaintDevice>
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_WIDGETS
-class QEglFSPaintDevice : public QGLPaintDevice
+QEglFSBackingStore::QEglFSBackingStore(QWindow *window)
+ : QPlatformBackingStore(window)
+ , m_context(new QOpenGLContext)
{
-public:
- QEglFSPaintDevice(QEglFSScreen *screen)
- :QGLPaintDevice(), m_screen(screen)
- {
- #ifdef QEGL_EXTRA_DEBUG
- qWarning("QEglPaintDevice %p, %p",this, screen);
- #endif
- }
-
- QSize size() const { return m_screen->geometry().size(); }
- QGLContext* context() const { return QGLContext::fromOpenGLContext(m_screen->platformContext()->context()); }
-
- QPaintEngine *paintEngine() const { return qt_qgl_paint_engine(); }
+ m_context->setFormat(window->requestedFormat());
+ m_context->setScreen(window->screen());
+ m_context->create();
+}
- void beginPaint(){
- QGLPaintDevice::beginPaint();
- }
-private:
- QEglFSScreen *m_screen;
- QGLContext *m_context;
-};
-#endif //QT_NO_WIDGETS
+QEglFSBackingStore::~QEglFSBackingStore()
+{
+ delete m_context;
+}
-QEglFSBackingStore::QEglFSBackingStore(QWindow *window)
- : QPlatformBackingStore(window),
- m_paintDevice(0)
+QPaintDevice *QEglFSBackingStore::paintDevice()
{
-#ifdef QEGL_EXTRA_DEBUG
- qWarning("QEglBackingStore %p, %p", window, window->screen());
-#endif
-#ifdef QT_NO_WIDGETS
- m_paintDevice = new QImage(0,0);
-#else
- m_paintDevice = new QEglFSPaintDevice(static_cast<QEglFSScreen *>(window->screen()->handle()));
-#endif //QT_NO_WIDGETS
+ return m_device;
}
void QEglFSBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
{
- Q_UNUSED(window);
Q_UNUSED(region);
Q_UNUSED(offset);
+
#ifdef QEGL_EXTRA_DEBUG
qWarning("QEglBackingStore::flush %p", window);
#endif
-#ifndef QT_NO_WIDGETS
- static_cast<QEglFSPaintDevice *>(m_paintDevice)->context()->swapBuffers();
-#endif //QT_NO_WIDGETS
+
+ m_context->swapBuffers(window);
+}
+
+void QEglFSBackingStore::beginPaint(const QRegion &)
+{
+ // needed to prevent QOpenGLContext::makeCurrent() from failing
+ window()->setSurfaceType(QSurface::OpenGLSurface);
+
+ m_context->makeCurrent(window());
+ m_device = new QOpenGLPaintDevice(window()->size());
+}
+
+void QEglFSBackingStore::endPaint()
+{
+ delete m_device;
}
void QEglFSBackingStore::resize(const QSize &size, const QRegion &staticContents)
diff --git a/src/plugins/platforms/eglfs/qeglfsbackingstore.h b/src/plugins/platforms/eglfs/qeglfsbackingstore.h
index 1ae3ecdc61..1eb4d8d79a 100644
--- a/src/plugins/platforms/eglfs/qeglfsbackingstore.h
+++ b/src/plugins/platforms/eglfs/qeglfsbackingstore.h
@@ -42,25 +42,30 @@
#ifndef QEGLWINDOWSURFACE_H
#define QEGLWINDOWSURFACE_H
-#include "qeglfsintegration.h"
-#include "qeglfswindow.h"
-
#include <QtGui/qplatformbackingstore_qpa.h>
QT_BEGIN_NAMESPACE
+class QOpenGLContext;
+class QOpenGLPaintDevice;
+
class QEglFSBackingStore : public QPlatformBackingStore
{
public:
QEglFSBackingStore(QWindow *window);
- ~QEglFSBackingStore() { delete m_paintDevice; }
+ ~QEglFSBackingStore();
+
+ QPaintDevice *paintDevice();
+
+ void beginPaint(const QRegion &);
+ void endPaint();
- QPaintDevice *paintDevice() { return m_paintDevice; }
void flush(QWindow *window, const QRegion &region, const QPoint &offset);
void resize(const QSize &size, const QRegion &staticContents);
private:
- QPaintDevice *m_paintDevice;
+ QOpenGLContext *m_context;
+ QOpenGLPaintDevice *m_device;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/qnx/qnx.pro b/src/plugins/platforms/qnx/qnx.pro
index cf82084de0..588464fc47 100644
--- a/src/plugins/platforms/qnx/qnx.pro
+++ b/src/plugins/platforms/qnx/qnx.pro
@@ -37,6 +37,7 @@ SOURCES = main.cpp \
qqnxclipboard.cpp \
qqnxrootwindow.cpp
+
HEADERS = qqnxbuffer.h \
qqnxeventthread.h \
qqnxkeytranslator.h \
@@ -51,6 +52,11 @@ HEADERS = qqnxbuffer.h \
qqnxclipboard.h \
qqnxrootwindow.h
+CONFIG(blackberry) {
+ SOURCES += qqnxservices.cpp
+ HEADERS += qqnxservices.h
+}
+
CONFIG(qqnx_imf) {
DEFINES += QQNX_IMF
HEADERS += qqnxinputcontext_imf.h
@@ -64,6 +70,10 @@ QMAKE_CXXFLAGS += -I./private
LIBS += -lpps -lscreen -lEGL -lclipboard
+CONFIG(blackberry) {
+ LIBS += -lbps
+}
+
include (../../../platformsupport/eglconvenience/eglconvenience.pri)
include (../../../platformsupport/fontdatabases/fontdatabases.pri)
diff --git a/src/plugins/platforms/qnx/qqnxintegration.cpp b/src/plugins/platforms/qnx/qqnxintegration.cpp
index cb7f14f963..5ef34f3aea 100644
--- a/src/plugins/platforms/qnx/qqnxintegration.cpp
+++ b/src/plugins/platforms/qnx/qqnxintegration.cpp
@@ -50,6 +50,7 @@
#include "qqnxvirtualkeyboard.h"
#include "qqnxclipboard.h"
#include "qqnxglcontext.h"
+#include "qqnxservices.h"
#if defined(QQnx_IMF)
#include "qqnxinputcontext_imf.h"
@@ -82,6 +83,7 @@ QQnxIntegration::QQnxIntegration()
, m_fontDatabase(new QGenericUnixFontDatabase())
, m_paintUsingOpenGL(false)
, m_eventDispatcher(createUnixEventDispatcher())
+ , m_services(0)
#ifndef QT_NO_CLIPBOARD
, m_clipboard(0)
#endif
@@ -124,6 +126,11 @@ QQnxIntegration::QQnxIntegration()
// Set up the input context
m_inputContext = new QQnxInputContext;
+
+ // Create services handling class
+#ifdef Q_OS_BLACKBERRY
+ m_services = new QQnxServices;
+#endif
}
QQnxIntegration::~QQnxIntegration()
@@ -154,6 +161,11 @@ QQnxIntegration::~QQnxIntegration()
// Cleanup global OpenGL resources
QQnxGLContext::shutdown();
+ // Destroy services class
+#ifdef Q_OS_BLACKBERRY
+ delete m_services;
+#endif
+
#if defined(QQNXINTEGRATION_DEBUG)
qDebug() << "QQnx: platform plugin shutdown end";
#endif
@@ -266,6 +278,11 @@ QVariant QQnxIntegration::styleHint(QPlatformIntegration::StyleHint hint) const
return QPlatformIntegration::styleHint(hint);
}
+QPlatformServices * QQnxIntegration::services() const
+{
+ return m_services;
+}
+
QWindow *QQnxIntegration::window(screen_window_t qnxWindow)
{
#if defined(QQNXINTEGRATION_DEBUG)
diff --git a/src/plugins/platforms/qnx/qqnxintegration.h b/src/plugins/platforms/qnx/qqnxintegration.h
index 892bb6e16f..6aa16100ad 100644
--- a/src/plugins/platforms/qnx/qqnxintegration.h
+++ b/src/plugins/platforms/qnx/qqnxintegration.h
@@ -54,6 +54,7 @@ class QQnxEventThread;
class QQnxInputContext;
class QQnxNavigatorEventHandler;
class QQnxWindow;
+class QQnxServices;
#ifndef QT_NO_CLIPBOARD
class QQnxClipboard;
@@ -91,6 +92,8 @@ public:
bool paintUsingOpenGL() const { return m_paintUsingOpenGL; }
+ virtual QPlatformServices *services() const;
+
static QWindow *window(screen_window_t qnxWindow);
private:
@@ -104,6 +107,7 @@ private:
QPlatformFontDatabase *m_fontDatabase;
bool m_paintUsingOpenGL;
QAbstractEventDispatcher *m_eventDispatcher;
+ QQnxServices *m_services;
#ifndef QT_NO_CLIPBOARD
mutable QQnxClipboard* m_clipboard;
#endif
diff --git a/src/plugins/platforms/qnx/qqnxservices.cpp b/src/plugins/platforms/qnx/qqnxservices.cpp
new file mode 100644
index 0000000000..a1a27906ae
--- /dev/null
+++ b/src/plugins/platforms/qnx/qqnxservices.cpp
@@ -0,0 +1,81 @@
+/***************************************************************************
+**
+** Copyright (C) 2011 - 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** 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.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qqnxservices.h"
+
+#include <bps/navigator.h>
+#include <stdbool.h>
+#include <sys/platform.h>
+#include <QUrl>
+
+QT_BEGIN_NAMESPACE
+
+QQnxServices::QQnxServices()
+{
+ bps_initialize();
+}
+
+QQnxServices::~QQnxServices()
+{
+ bps_shutdown();
+}
+
+bool QQnxServices::openUrl(const QUrl &url)
+{
+ return navigatorInvoke(url);
+}
+
+bool QQnxServices::openDocument(const QUrl &url)
+{
+ return navigatorInvoke(url);
+}
+
+bool QQnxServices::navigatorInvoke(const QUrl &url)
+{
+ if (!url.isValid() || url.isRelative())
+ return false;
+
+ int ret = navigator_invoke(url.toString().toUtf8(), 0);
+
+ return (ret == BPS_SUCCESS);
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qxcbsharedgraphicscache.h b/src/plugins/platforms/qnx/qqnxservices.h
index e565556463..36eb8edf65 100644
--- a/src/plugins/platforms/xcb/qxcbsharedgraphicscache.h
+++ b/src/plugins/platforms/qnx/qqnxservices.h
@@ -1,6 +1,6 @@
-/****************************************************************************
+/***************************************************************************
**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2011 - 2012 Research In Motion
** Contact: http://www.qt-project.org/
**
** This file is part of the plugins of the Qt Toolkit.
@@ -39,53 +39,26 @@
**
****************************************************************************/
-#ifndef QXCBSHAREDGRAPHICSCACHE
-#define QXCBSHAREDGRAPHICSCACHE
+#ifndef QQNXSERVICES_H
+#define QQNXSERVICES_H
-#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
-
-#include <QtGui/qplatformsharedgraphicscache_qpa.h>
-
-QT_BEGIN_HEADER
+#include <QtGui/QPlatformServices>
QT_BEGIN_NAMESPACE
-class QXcbSharedBufferManager;
-class QXcbSharedGraphicsCache : public QPlatformSharedGraphicsCache
+class QQnxServices : public QPlatformServices
{
- Q_OBJECT
public:
- explicit QXcbSharedGraphicsCache(QObject *parent = 0);
-
- virtual void ensureCacheInitialized(const QByteArray &cacheId, BufferType bufferType,
- PixelFormat pixelFormat);
-
- virtual void requestItems(const QByteArray &cacheId, const QVector<quint32> &itemIds);
- virtual void insertItems(const QByteArray &cacheId,
- const QVector<quint32> &itemIds,
- const QVector<QImage> &items);
- virtual void releaseItems(const QByteArray &cacheId, const QVector<quint32> &itemIds);
+ QQnxServices();
+ ~QQnxServices();
- virtual void serializeBuffer(void *bufferId, QByteArray *serializedData, int *fileDescriptor) const;
- virtual uint textureIdForBuffer(void *bufferId);
- virtual void referenceBuffer(void *bufferId);
- virtual bool dereferenceBuffer(void *bufferId);
+ bool openUrl(const QUrl &url);
+ bool openDocument(const QUrl &url);
private:
- struct ReadyItem {
- QVector<quint32> itemIds;
- QVector<QPoint> positions;
- };
-
- void processPendingItems();
-
- QXcbSharedBufferManager *m_bufferManager;
+ bool navigatorInvoke(const QUrl &url);
};
QT_END_NAMESPACE
-QT_END_HEADER
-
-#endif // QT_USE_XCB_SHARED_GRAPHICS_CACHE
-
-#endif // QXCBSHAREDGRAPHICSCACHE
+#endif // QQNXSERVICES_H
diff --git a/src/plugins/platforms/windows/accessible/accessible.pri b/src/plugins/platforms/windows/accessible/accessible.pri
index 1671c67d17..3069c2dda3 100644
--- a/src/plugins/platforms/windows/accessible/accessible.pri
+++ b/src/plugins/platforms/windows/accessible/accessible.pri
@@ -1,19 +1,16 @@
SOURCES += \
- $$PWD/qwindowsaccessibility.cpp
+ $$PWD/qwindowsmsaaaccessible.cpp \
+ $$PWD/qwindowsaccessibility.cpp \
+ $$PWD/comutils.cpp
HEADERS += \
- $$PWD/qwindowsaccessibility.h
-
-!*g++* {
- SOURCES += \
- $$PWD/qwindowsmsaaaccessible.cpp \
- $$PWD/iaccessible2.cpp \
- $$PWD/comutils.cpp
-
- HEADERS += \
- $$PWD/qwindowsmsaaaccessible.h \
- $$PWD/iaccessible2.h \
- $$PWD/comutils.h
+ $$PWD/qwindowsmsaaaccessible.h \
+ $$PWD/qwindowsaccessibility.h \
+ $$PWD/comutils.h
+!*g++: {
+ SOURCES += $$PWD/iaccessible2.cpp
+ HEADERS += $$PWD/iaccessible2.h
include(../../../../3rdparty/iaccessible2/iaccessible2.pri)
-} # !g++
+}
+
diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.cpp b/src/plugins/platforms/windows/accessible/iaccessible2.cpp
index f22349714f..c3d5c543cf 100644
--- a/src/plugins/platforms/windows/accessible/iaccessible2.cpp
+++ b/src/plugins/platforms/windows/accessible/iaccessible2.cpp
@@ -167,81 +167,62 @@ HRESULT STDMETHODCALLTYPE AccessibleRelation::get_targets(
**************************************************************/
HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::QueryInterface(REFIID id, LPVOID *iface)
{
- *iface = 0;
-
- QByteArray strIID = IIDToString(id);
- if (!strIID.isEmpty()) {
- QString ss; QDebug dbg(&ss); dbg << accessible;
- accessibleDebug("QWindowsIA2Accessible::QI() - IID:%s, iface:%s ", strIID.constData(), qPrintable(ss));
- }
- if (id == IID_IUnknown) {
- *iface = (IUnknown*)(IDispatch*)this;
- } else if (id == IID_IDispatch) {
- *iface = (IDispatch*)this;
- } else if (id == IID_IAccessible) {
- *iface = (IAccessible*)this;
- } else if (id == IID_IOleWindow) {
- *iface = (IOleWindow*)this;
- } else if (id == IID_IServiceProvider) {
- *iface = (IServiceProvider*)this;
- } else if (id == IID_IAccessible2) {
- *iface = (IAccessible2*)this;
- } else if (id == IID_IAccessibleAction) {
- if (accessible->actionInterface())
- *iface = (IAccessibleAction*)this;
- } else if (id == IID_IAccessibleComponent) {
- *iface = (IAccessibleComponent*)this;
- } else if (id == IID_IAccessibleEditableText) {
- //if (accessible->editableTextInterface()) {
- //*iface = (IAccessibleEditableText*)this;
- //}
- } else if (id == IID_IAccessibleHyperlink) {
- //*iface = (IAccessibleHyperlink*)this;
- } else if (id == IID_IAccessibleHypertext) {
- //*iface = (IAccessibleHypertext*)this;
- } else if (id == IID_IAccessibleImage) {
- //*iface = (IAccessibleImage*)this;
- } else if (id == IID_IAccessibleRelation) {
- *iface = (IAccessibleRelation*)this;
- } else if (id == IID_IAccessibleTable) {
- //*iface = (IAccessibleTable*)this; // not supported
- } else if (id == IID_IAccessibleTable2) {
- if (accessible->tableInterface())
- *iface = (IAccessibleTable2*)this;
- } else if (id == IID_IAccessibleTableCell) {
- if (accessible->tableCellInterface())
- *iface = (IAccessibleTableCell*)this;
- } else if (id == IID_IAccessibleText) {
- if (accessible->textInterface())
- *iface = (IAccessibleText*)this;
- } else if (id == IID_IAccessibleValue) {
- if (accessible->valueInterface())
- *iface = (IAccessibleValue*)this;
- }
- if (*iface) {
- AddRef();
- return S_OK;
+ HRESULT hr = QWindowsMsaaAccessible::QueryInterface(id, iface);
+ if (!SUCCEEDED(hr)) {
+ if (id == IID_IAccessible2) {
+ *iface = (IAccessible2*)this;
+ } else if (id == IID_IAccessibleAction) {
+ if (accessible->actionInterface())
+ *iface = (IAccessibleAction*)this;
+ } else if (id == IID_IAccessibleComponent) {
+ *iface = (IAccessibleComponent*)this;
+ } else if (id == IID_IAccessibleEditableText) {
+ //if (accessible->editableTextInterface()) {
+ //*iface = (IAccessibleEditableText*)this;
+ //}
+ } else if (id == IID_IAccessibleHyperlink) {
+ //*iface = (IAccessibleHyperlink*)this;
+ } else if (id == IID_IAccessibleHypertext) {
+ //*iface = (IAccessibleHypertext*)this;
+ } else if (id == IID_IAccessibleImage) {
+ //*iface = (IAccessibleImage*)this;
+ } else if (id == IID_IAccessibleRelation) {
+ *iface = (IAccessibleRelation*)this;
+ } else if (id == IID_IAccessibleTable) {
+ //*iface = (IAccessibleTable*)this; // not supported
+ } else if (id == IID_IAccessibleTable2) {
+ if (accessible->tableInterface())
+ *iface = (IAccessibleTable2*)this;
+ } else if (id == IID_IAccessibleTableCell) {
+ if (accessible->tableCellInterface())
+ *iface = (IAccessibleTableCell*)this;
+ } else if (id == IID_IAccessibleText) {
+ if (accessible->textInterface())
+ *iface = (IAccessibleText*)this;
+ } else if (id == IID_IAccessibleValue) {
+ if (accessible->valueInterface())
+ *iface = (IAccessibleValue*)this;
+ }
+ if (*iface) {
+ AddRef();
+ hr = S_OK;
+ } else {
+ hr = E_NOINTERFACE;
+ }
}
-
- return E_NOINTERFACE;
+ return hr;
}
ULONG STDMETHODCALLTYPE QWindowsIA2Accessible::AddRef()
{
- return ++ref;
+ return QWindowsMsaaAccessible::AddRef();
}
ULONG STDMETHODCALLTYPE QWindowsIA2Accessible::Release()
{
- if (!--ref) {
- delete this;
- return 0;
- }
- return ref;
+ return QWindowsMsaaAccessible::Release();
}
-
-
/**************************************************************\
* *
* IAccessible2 *
@@ -1028,6 +1009,7 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_caretOffset(long *offset)
return E_FAIL;
}
+
HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_characterExtents(long offset,
enum IA2CoordinateType coordType,
long *x,
@@ -1037,9 +1019,8 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_characterExtents(long offse
{
accessibleDebugClientCalls(accessible);
if (QAccessibleTextInterface *text = textInterface()) {
- const QRect rect = text->characterRect(offset, (QAccessible2::CoordinateType)coordType);
- *x = rect.x();
- *y = rect.y();
+ QRect rect = text->characterRect(offset);
+ mapFromScreenPos(coordType, rect.topLeft(), x, y);
*width = rect.width();
*height = rect.height();
return S_OK;
@@ -1064,7 +1045,8 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_offsetAtPoint(long x,
{
accessibleDebugClientCalls(accessible);
if (QAccessibleTextInterface *text = textInterface()) {
- *offset = text->offsetAtPoint(QPoint(x,y), (QAccessible2::CoordinateType)coordType);
+ QPoint screenPos = mapToScreenPos(coordType, x, y);
+ *offset = text->offsetAtPoint(screenPos);
return (*offset >=0 ? S_OK : S_FALSE);
}
return E_FAIL;
@@ -1429,6 +1411,10 @@ uint QWindowsIA2Accessible::uniqueID() const
QByteArray QWindowsIA2Accessible::IIDToString(REFIID id)
{
+ QByteArray strGuid = QWindowsMsaaAccessible::IIDToString(id);
+ if (!strGuid.isEmpty())
+ return strGuid;
+
IF_EQUAL_RETURN_IIDSTRING(id, IID_IUnknown);
IF_EQUAL_RETURN_IIDSTRING(id, IID_IDispatch);
IF_EQUAL_RETURN_IIDSTRING(id, IID_IAccessible);
@@ -1450,7 +1436,6 @@ QByteArray QWindowsIA2Accessible::IIDToString(REFIID id)
IF_EQUAL_RETURN_IIDSTRING(id, IID_IAccessibleValue);
// else...
- QByteArray strGuid;
#if 0 // Can be useful for debugging, but normally we'd like to reduce the noise a bit...
OLECHAR szGuid[39]={0};
::StringFromGUID2(id, szGuid, 39);
diff --git a/src/plugins/platforms/windows/accessible/iaccessible2.h b/src/plugins/platforms/windows/accessible/iaccessible2.h
index a59263fba1..9b8a1ad3a6 100644
--- a/src/plugins/platforms/windows/accessible/iaccessible2.h
+++ b/src/plugins/platforms/windows/accessible/iaccessible2.h
@@ -66,9 +66,7 @@
#include "AccessibleRole.h"
#include "AccessibleStates.h"
-#ifdef Q_CC_MINGW
-# include <servprov.h>
-#endif
+#include <servprov.h>
QT_BEGIN_NAMESPACE
@@ -229,14 +227,45 @@ private:
return accessible->tableCellInterface();
}
+ /*!
+ \internal
+ \a screenPos is in screen relative position
+ \a x and \y (out) is in parent relative position if coordType == IA2_COORDTYPE_PARENT_RELATIVE
+ */
+ void mapFromScreenPos(enum IA2CoordinateType coordType, const QPoint &screenPos, long *x, long *y) const {
+ if (coordType == IA2_COORDTYPE_PARENT_RELATIVE) {
+ // caller wants relative to parent
+ if (QAccessibleInterface *parent = accessible->parent()) {
+ const QRect parentScreenRect = parent->rect();
+ *x = parentScreenRect.x() - screenPos.x();
+ *y = parentScreenRect.y() - screenPos.y();
+ return;
+ }
+ }
+ *x = screenPos.x();
+ *y = screenPos.y();
+ }
+
+ /*!
+ \internal
+ \a x and \y is in parent relative position if coordType == IA2_COORDTYPE_PARENT_RELATIVE
+ \return a screen relative position
+ */
+ QPoint mapToScreenPos(enum IA2CoordinateType coordType, long x, long y) const {
+ if (coordType == IA2_COORDTYPE_PARENT_RELATIVE) {
+ if (QAccessibleInterface *parent = accessible->parent()) {
+ const QRect parentScreenRect = parent->rect();
+ return QPoint(parentScreenRect.x() + x, parentScreenRect.y() + y);
+ }
+ }
+ return QPoint(x,y);
+ }
+
HRESULT getRelationsHelper(IAccessibleRelation **relations, int startIndex, long maxRelations, long *nRelations = 0);
HRESULT wrapListOfCells(const QList<QAccessibleInterface*> &inputCells, IUnknown ***outputAccessibles, long *nCellCount);
uint uniqueID() const;
QByteArray IIDToString(REFIID id);
-private:
- ULONG ref;
-
};
/**************************************************************\
diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp
index 4f92b910b2..bd928399c8 100644
--- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp
+++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp
@@ -56,11 +56,11 @@
#include <QtGui/qguiapplication.h>
#include "qwindowsaccessibility.h"
-
-#ifndef Q_CC_MINGW
-# include "iaccessible2.h"
-#endif // !Q_CC_MINGW
-
+#ifdef Q_CC_MINGW
+# include "qwindowsmsaaaccessible.h"
+#else
+# include "iaccessible2.h"
+#endif
#include "comutils.h"
#include <oleacc.h>
@@ -237,7 +237,11 @@ IAccessible *QWindowsAccessibility::wrap(QAccessibleInterface *acc)
#else
if (!acc)
return 0;
+#ifdef Q_CC_MINGW
+ QWindowsMsaaAccessible *wacc = new QWindowsMsaaAccessible(acc);
+#else
QWindowsIA2Accessible *wacc = new QWindowsIA2Accessible(acc);
+#endif
IAccessible *iacc = 0;
wacc->QueryInterface(IID_IAccessible, (void**)&iacc);
return iacc;
diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp
index 8791bbdcfb..6c4d217cb4 100644
--- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp
+++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp
@@ -224,6 +224,53 @@ void accessibleDebugClientCalls_helper(const char* funcName, const QAccessibleIn
}
#endif
+/**************************************************************\
+ * *
+ * IUnknown *
+ * *
+ **************************************************************/
+HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::QueryInterface(REFIID id, LPVOID *iface)
+{
+ *iface = 0;
+
+ QByteArray strIID = IIDToString(id);
+ if (!strIID.isEmpty()) {
+ QString ss; QDebug dbg(&ss); dbg << accessible;
+ accessibleDebug("QWindowsIA2Accessible::QI() - IID:%s, iface:%s ", strIID.constData(), qPrintable(ss));
+ }
+ if (id == IID_IUnknown) {
+ *iface = (IUnknown*)(IDispatch*)this;
+ } else if (id == IID_IDispatch) {
+ *iface = (IDispatch*)this;
+ } else if (id == IID_IAccessible) {
+ *iface = (IAccessible*)this;
+ } else if (id == IID_IOleWindow) {
+ *iface = (IOleWindow*)this;
+ }
+
+ if (*iface) {
+ AddRef();
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+ULONG STDMETHODCALLTYPE QWindowsMsaaAccessible::AddRef()
+{
+ return ++ref;
+}
+
+ULONG STDMETHODCALLTYPE QWindowsMsaaAccessible::Release()
+{
+ if (!--ref) {
+ delete this;
+ return 0;
+ }
+ return ref;
+}
+
+
/*
IDispatch
*/
@@ -1208,6 +1255,17 @@ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::ContextSensitiveHelp(BOOL)
return S_OK;
}
+#define IF_EQUAL_RETURN_IIDSTRING(id, iid) if (id == iid) return QByteArray(#iid)
+QByteArray QWindowsMsaaAccessible::IIDToString(REFIID id)
+{
+ IF_EQUAL_RETURN_IIDSTRING(id, IID_IUnknown);
+ IF_EQUAL_RETURN_IIDSTRING(id, IID_IDispatch);
+ IF_EQUAL_RETURN_IIDSTRING(id, IID_IAccessible);
+ IF_EQUAL_RETURN_IIDSTRING(id, IID_IOleWindow);
+
+ return QByteArray();
+}
+
QT_END_NAMESPACE
#endif //QT_NO_ACCESSIBILITY
diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h
index 9cb56c954c..d7dda6b3e2 100644
--- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h
+++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h
@@ -43,12 +43,19 @@
#include <QtCore/QtConfig>
#ifndef QT_NO_ACCESSIBILITY
+#include <QtCore/qglobal.h>
#include "../qtwindows_additional.h"
-#include <oleacc.h>
-#include "Accessible2.h"
#include <QtCore/qsharedpointer.h>
#include <QtGui/qaccessible.h>
+#ifndef Q_CC_MINGW
+# include <oleacc.h>
+# include "Accessible2.h" // IAccessible2 inherits from IAccessible
+#else
+ // MinGW
+# include <basetyps.h>
+# include <oleacc.h>
+#endif
QT_BEGIN_NAMESPACE
@@ -74,7 +81,13 @@ QWindow *window_helper(const QAccessibleInterface *iface);
/**************************************************************\
* QWindowsAccessible *
**************************************************************/
-class QWindowsMsaaAccessible : public IAccessible2, public IOleWindow
+class QWindowsMsaaAccessible : public
+#ifdef Q_CC_MINGW
+ IAccessible
+#else
+ IAccessible2
+#endif
+ , public IOleWindow
{
public:
QWindowsMsaaAccessible(QAccessibleInterface *a)
@@ -87,6 +100,10 @@ public:
delete accessible;
}
+ /* IUnknown */
+ HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, LPVOID *);
+ ULONG STDMETHODCALLTYPE AddRef();
+ ULONG STDMETHODCALLTYPE Release();
/* IDispatch */
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int *);
@@ -124,12 +141,18 @@ public:
HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
protected:
+ virtual QByteArray IIDToString(REFIID id);
+
QAccessibleInterface *accessible;
QAIPointer childPointer(VARIANT varID)
{
return QAIPointer(accessible->child(varID.lVal - 1));
}
+
+private:
+ ULONG ref;
+
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index 50d3c4f1b5..255c49fb46 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -47,7 +47,6 @@
#include "qxcbnativeinterface.h"
#include "qxcbclipboard.h"
#include "qxcbdrag.h"
-#include "qxcbsharedgraphicscache.h"
#include <xcb/xcb.h>
@@ -118,10 +117,6 @@ QXcbIntegration::QXcbIntegration(const QStringList &parameters)
#ifndef QT_NO_ACCESSIBILITY
m_accessibility.reset(new QPlatformAccessibility());
#endif
-
-#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
- m_sharedGraphicsCache.reset(new QXcbSharedGraphicsCache);
-#endif
}
QXcbIntegration::~QXcbIntegration()
@@ -203,10 +198,6 @@ QPlatformBackingStore *QXcbIntegration::createPlatformBackingStore(QWindow *wind
bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const
{
switch (cap) {
-#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
- case SharedGraphicsCache: return true;
-#endif
-
case ThreadedPixmaps: return true;
case OpenGL: return true;
case ThreadedOpenGL: return false;
@@ -257,26 +248,6 @@ QPlatformAccessibility *QXcbIntegration::accessibility() const
}
#endif
-#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
-static bool sharedGraphicsCacheDisabled()
-{
- static const char *environmentVariable = "QT_DISABLE_SHARED_CACHE";
- static bool cacheDisabled = !qgetenv(environmentVariable).isEmpty()
- && qgetenv(environmentVariable).toInt() != 0;
- return cacheDisabled;
-}
-
-QPlatformSharedGraphicsCache *QXcbIntegration::createPlatformSharedGraphicsCache(const char *cacheId) const
-{
- Q_UNUSED(cacheId);
-
- if (sharedGraphicsCacheDisabled())
- return 0;
-
- return m_sharedGraphicsCache.data();
-}
-#endif
-
QPlatformServices *QXcbIntegration::services() const
{
return m_services.data();
diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h
index 58eebfe716..6170232d1e 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.h
+++ b/src/plugins/platforms/xcb/qxcbintegration.h
@@ -81,10 +81,6 @@ public:
QPlatformAccessibility *accessibility() const;
#endif
-#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
- QPlatformSharedGraphicsCache *createPlatformSharedGraphicsCache(const char *cacheId) const;
-#endif
-
QPlatformServices *services() const;
QStringList themeNames() const;
@@ -103,10 +99,6 @@ private:
QScopedPointer<QPlatformAccessibility> m_accessibility;
#endif
-#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
- QScopedPointer<QPlatformSharedGraphicsCache> m_sharedGraphicsCache;
-#endif
-
QScopedPointer<QPlatformServices> m_services;
};
diff --git a/src/plugins/platforms/xcb/qxcbsharedbuffermanager.cpp b/src/plugins/platforms/xcb/qxcbsharedbuffermanager.cpp
deleted file mode 100644
index 8bd3aea259..0000000000
--- a/src/plugins/platforms/xcb/qxcbsharedbuffermanager.cpp
+++ /dev/null
@@ -1,640 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
-
-#include "qxcbsharedbuffermanager.h"
-
-#include <QtCore/quuid.h>
-#include <QtGui/qimage.h>
-
-#include <stdio.h>
-
-#if !defined(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED)
-# define SHAREDGRAPHICSCACHE_MAX_MEMORY_USED 16 * 1024 * 1024 // 16 MB limit
-#endif
-
-#if !defined(SHAREDGRAPHICSCACHE_MAX_TEXTURES_PER_CACHE)
-# define SHAREDGRAPHICSCACHE_MAX_TEXTURES_PER_CACHE 1
-#endif
-
-#if !defined(SHAREDGRAPHICSCACHE_TEXTURE_SIZE)
-# define SHAREDGRAPHICSCACHE_TEXTURE_SIZE 2048
-#endif
-
-#define SHAREDBUFFERMANAGER_DEBUG 1
-
-QT_BEGIN_NAMESPACE
-
-QXcbSharedBufferManager::QXcbSharedBufferManager()
- : m_memoryUsed(0)
- , m_mostRecentlyUsed(0)
- , m_leastRecentlyUsed(0)
-{
-}
-
-QXcbSharedBufferManager::~QXcbSharedBufferManager()
-{
- {
- QHash<QByteArray, Buffer *>::const_iterator it = m_buffers.constBegin();
- while (it != m_buffers.constEnd()) {
- Buffer *buffer = it.value();
- delete buffer;
- ++it;
- }
- }
-
- {
- QHash<QByteArray, Items *>::const_iterator it = m_items.constBegin();
- while (it != m_items.constEnd()) {
- Items *items = it.value();
- QHash<quint32, Item *>::const_iterator itemIt = items->items.constBegin();
- while (itemIt != items->items.constEnd()) {
- delete itemIt.value();
- ++itemIt;
- }
- delete it.value();
- ++it;
- }
- }
-}
-
-void QXcbSharedBufferManager::getBufferForItem(const QByteArray &cacheId, quint32 itemId,
- Buffer **buffer, int *x, int *y) const
-{
- Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO,
- "Call endSharedBufferAction before accessing data");
-
- Q_ASSERT(buffer != 0);
- Q_ASSERT(x != 0);
- Q_ASSERT(y != 0);
-
- Items *items = itemsForCache(cacheId);
- Item *item = items->items.value(itemId);
- if (item != 0) {
- *buffer = item->buffer;
- *x = item->x;
- *y = item->y;
- } else {
- *buffer = 0;
- *x = -1;
- *y = -1;
- }
-}
-
-QPair<QByteArray, int> QXcbSharedBufferManager::serializeBuffer(QSharedMemory *buffer) const
-{
- Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO,
- "Call endSharedBufferAction before accessing data");
-
- return qMakePair(buffer->key().toLatin1(), 0);
-}
-
-void QXcbSharedBufferManager::beginSharedBufferAction(const QByteArray &cacheId)
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::beginSharedBufferAction() called for %s", cacheId.constData());
-#endif
-
- Q_ASSERT(m_currentCacheId.isEmpty());
- Q_ASSERT(!cacheId.isEmpty());
-
- m_pendingInvalidatedItems.clear();
- m_pendingReadyItems.clear();
- m_pendingMissingItems.clear();
-
- m_currentCacheId = cacheId;
-}
-
-void QXcbSharedBufferManager::requestItems(const QSet<quint32> &itemIds)
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::requestItems for %d items", itemIds.size());
-#endif
-
- Q_ASSERT_X(!m_currentCacheId.isEmpty(), Q_FUNC_INFO,
- "Call beginSharedBufferAction before requesting items");
- Items *items = itemsForCache(m_currentCacheId);
-
- QSet<quint32>::const_iterator it = itemIds.constBegin();
- while (it != itemIds.constEnd()) {
- if (items->items.contains(*it))
- m_pendingReadyItems[m_currentCacheId].insert(*it);
- else
- m_pendingMissingItems[m_currentCacheId].insert(*it);
- ++it;
- }
-}
-
-void QXcbSharedBufferManager::releaseItems(const QSet<quint32> &itemIds)
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::releaseItems for %d items", itemIds.size());
-#endif
-
- Items *items = itemsForCache(m_currentCacheId);
-
- QSet<quint32>::const_iterator it;
- for (it = itemIds.constBegin(); it != itemIds.constEnd(); ++it) {
- Item *item = items->items.value(*it);
- if (item != 0)
- pushItemToBack(items, item);
-
- m_pendingReadyItems[m_currentCacheId].remove(*it);
- m_pendingMissingItems[m_currentCacheId].remove(*it);
- }
-}
-
-void QXcbSharedBufferManager::insertItem(quint32 itemId, uchar *data,
- int itemWidth, int itemHeight)
-{
- Q_ASSERT_X(!m_currentCacheId.isEmpty(), Q_FUNC_INFO,
- "Call beginSharedBufferAction before inserting items");
- Items *items = itemsForCache(m_currentCacheId);
-
- if (!items->items.contains(itemId)) {
- Buffer *sharedBuffer = 0;
- int x = 0;
- int y = 0;
-
- findAvailableBuffer(itemWidth, itemHeight, &sharedBuffer, &x, &y);
- copyIntoBuffer(sharedBuffer, x, y, itemWidth, itemHeight, data);
-
-// static int counter=0;
-// QString fileName = QString::fromLatin1("buffer%1.png").arg(counter++);
-// saveBuffer(sharedBuffer, fileName);
-
- Item *item = new Item;
- item->itemId = itemId;
- item->buffer = sharedBuffer;
- item->x = x;
- item->y = y;
-
- items->items[itemId] = item;
-
- touchItem(items, item);
- }
-}
-
-void QXcbSharedBufferManager::endSharedBufferAction()
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::endSharedBufferAction() called for %s",
- m_currentCacheId.constData());
-#endif
-
- Q_ASSERT(!m_currentCacheId.isEmpty());
-
- // Do an extra validation pass on the invalidated items since they may have been re-inserted
- // after they were invalidated
- if (m_pendingInvalidatedItems.contains(m_currentCacheId)) {
- QSet<quint32> &invalidatedItems = m_pendingInvalidatedItems[m_currentCacheId];
- QSet<quint32>::iterator it = invalidatedItems.begin();
- while (it != invalidatedItems.end()) {
- Items *items = m_items.value(m_currentCacheId);
-
- if (items->items.contains(*it)) {
- m_pendingReadyItems[m_currentCacheId].insert(*it);
- it = invalidatedItems.erase(it);
- } else {
- ++it;
- }
- }
- }
-
- m_currentCacheId.clear();
-}
-
-void QXcbSharedBufferManager::pushItemToBack(Items *items, Item *item)
-{
- if (items->leastRecentlyUsed == item)
- return;
-
- if (item->next != 0)
- item->next->prev = item->prev;
- if (item->prev != 0)
- item->prev->next = item->next;
-
- if (items->mostRecentlyUsed == item)
- items->mostRecentlyUsed = item->prev;
-
- if (items->leastRecentlyUsed != 0)
- items->leastRecentlyUsed->prev = item;
-
- item->prev = 0;
- item->next = items->leastRecentlyUsed;
- items->leastRecentlyUsed = item;
- if (items->mostRecentlyUsed == 0)
- items->mostRecentlyUsed = item;
-}
-
-void QXcbSharedBufferManager::touchItem(Items *items, Item *item)
-{
- if (items->mostRecentlyUsed == item)
- return;
-
- if (item->next != 0)
- item->next->prev = item->prev;
- if (item->prev != 0)
- item->prev->next = item->next;
-
- if (items->leastRecentlyUsed == item)
- items->leastRecentlyUsed = item->next;
-
- if (items->mostRecentlyUsed != 0)
- items->mostRecentlyUsed->next = item;
-
- item->next = 0;
- item->prev = items->mostRecentlyUsed;
- items->mostRecentlyUsed = item;
- if (items->leastRecentlyUsed == 0)
- items->leastRecentlyUsed = item;
-}
-
-void QXcbSharedBufferManager::deleteItem(Items *items, Item *item)
-{
- Q_ASSERT(items != 0);
- Q_ASSERT(item != 0);
-
- if (items->mostRecentlyUsed == item)
- items->mostRecentlyUsed = item->prev;
- if (items->leastRecentlyUsed == item)
- items->leastRecentlyUsed = item->next;
-
- if (item->next != 0)
- item->next->prev = item->prev;
- if (item->prev != 0)
- item->prev->next = item->next;
-
- m_pendingInvalidatedItems[items->cacheId].insert(item->itemId);
-
- {
- QHash<quint32, Item *>::iterator it = items->items.find(item->itemId);
- while (it != items->items.end() && it.value()->itemId == item->itemId)
- it = items->items.erase(it);
- }
-
- delete item;
-}
-
-void QXcbSharedBufferManager::recycleItem(Buffer **sharedBuffer, int *glyphX, int *glyphY)
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::recycleItem() called for %s", m_currentCacheId.constData());
-#endif
-
- Items *items = itemsForCache(m_currentCacheId);
-
- Item *recycledItem = items->leastRecentlyUsed;
- Q_ASSERT(recycledItem != 0);
-
- *sharedBuffer = recycledItem->buffer;
- *glyphX = recycledItem->x;
- *glyphY = recycledItem->y;
-
- deleteItem(items, recycledItem);
-}
-
-void QXcbSharedBufferManager::touchBuffer(Buffer *buffer)
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::touchBuffer() called for %s", buffer->cacheId.constData());
-#endif
-
- if (buffer == m_mostRecentlyUsed)
- return;
-
- if (buffer->next != 0)
- buffer->next->prev = buffer->prev;
- if (buffer->prev != 0)
- buffer->prev->next = buffer->next;
-
- if (m_leastRecentlyUsed == buffer)
- m_leastRecentlyUsed = buffer->next;
-
- buffer->next = 0;
- buffer->prev = m_mostRecentlyUsed;
- if (m_mostRecentlyUsed != 0)
- m_mostRecentlyUsed->next = buffer;
- if (m_leastRecentlyUsed == 0)
- m_leastRecentlyUsed = buffer;
- m_mostRecentlyUsed = buffer;
-}
-
-void QXcbSharedBufferManager::deleteLeastRecentlyUsed()
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::deleteLeastRecentlyUsed() called");
-#endif
-
- if (m_leastRecentlyUsed == 0)
- return;
-
- Buffer *old = m_leastRecentlyUsed;
- m_leastRecentlyUsed = old->next;
- m_leastRecentlyUsed->prev = 0;
-
- QByteArray cacheId = old->cacheId;
- Items *items = itemsForCache(cacheId);
-
- QHash<quint32, Item *>::iterator it = items->items.begin();
- while (it != items->items.end()) {
- Item *item = it.value();
- if (item->buffer == old) {
- deleteItem(items, item);
- it = items->items.erase(it);
- } else {
- ++it;
- }
- }
-
- m_buffers.remove(cacheId, old);
- m_memoryUsed -= old->width * old->height * old->bytesPerPixel;
-
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::deleteLeastRecentlyUsed: Memory used: %d / %d (%6.2f %%)",
- m_memoryUsed, SHAREDGRAPHICSCACHE_MAX_MEMORY_USED,
- 100.0f * float(m_memoryUsed) / float(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED));
-#endif
-
- delete old;
-}
-
-QXcbSharedBufferManager::Buffer *QXcbSharedBufferManager::createNewBuffer(const QByteArray &cacheId,
- int heightRequired)
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::createNewBuffer() called for %s", cacheId.constData());
-#endif
-
- // ###
- // if (bufferCount of cacheId == SHAREDGRAPHICACHE_MAX_TEXTURES_PER_CACHE)
- // deleteLeastRecentlyUsedBufferForCache(cacheId);
-
- // ### Take pixel format into account
- while (m_memoryUsed + SHAREDGRAPHICSCACHE_TEXTURE_SIZE * heightRequired >= SHAREDGRAPHICSCACHE_MAX_MEMORY_USED)
- deleteLeastRecentlyUsed();
-
- Buffer *buffer = allocateBuffer(SHAREDGRAPHICSCACHE_TEXTURE_SIZE, heightRequired);
- buffer->cacheId = cacheId;
-
- buffer->currentLineMaxHeight = 0;
- m_buffers.insert(cacheId, buffer);
-
- return buffer;
-}
-
-static inline int qt_next_power_of_two(int v)
-{
- v--;
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- ++v;
- return v;
-}
-
-QXcbSharedBufferManager::Buffer *QXcbSharedBufferManager::resizeBuffer(Buffer *oldBuffer, const QSize &newSize)
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::resizeBuffer() called for %s (current size: %dx%d, new size: %dx%d)",
- oldBuffer->cacheId.constData(), oldBuffer->width, oldBuffer->height,
- newSize.width(), newSize.height());
-#endif
-
- // Remove old buffer from lists to avoid deleting it under our feet
- if (m_leastRecentlyUsed == oldBuffer)
- m_leastRecentlyUsed = oldBuffer->next;
- if (m_mostRecentlyUsed == oldBuffer)
- m_mostRecentlyUsed = oldBuffer->prev;
-
- if (oldBuffer->prev != 0)
- oldBuffer->prev->next = oldBuffer->next;
- if (oldBuffer->next != 0)
- oldBuffer->next->prev = oldBuffer->prev;
-
- m_memoryUsed -= oldBuffer->width * oldBuffer->height * oldBuffer->bytesPerPixel;
- m_buffers.remove(oldBuffer->cacheId, oldBuffer);
-
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::resizeBuffer: Memory used: %d / %d (%6.2f %%)",
- m_memoryUsed, SHAREDGRAPHICSCACHE_MAX_MEMORY_USED,
- 100.0f * float(m_memoryUsed) / float(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED));
-#endif
-
- Buffer *resizedBuffer = createNewBuffer(oldBuffer->cacheId, newSize.height());
- copyIntoBuffer(resizedBuffer, 0, 0, oldBuffer->width, oldBuffer->height,
- reinterpret_cast<uchar *>(oldBuffer->buffer->data()));
-
- resizedBuffer->currentLineMaxHeight = oldBuffer->currentLineMaxHeight;
-
- Items *items = itemsForCache(oldBuffer->cacheId);
- QHash<quint32, Item *>::const_iterator it = items->items.constBegin();
- while (it != items->items.constEnd()) {
- Item *item = it.value();
- if (item->buffer == oldBuffer) {
- m_pendingReadyItems[oldBuffer->cacheId].insert(item->itemId);
- item->buffer = resizedBuffer;
- }
- ++it;
- }
-
- resizedBuffer->nextX = oldBuffer->nextX;
- resizedBuffer->nextY = oldBuffer->nextY;
- resizedBuffer->currentLineMaxHeight = oldBuffer->currentLineMaxHeight;
-
- delete oldBuffer;
- return resizedBuffer;
-}
-
-void QXcbSharedBufferManager::findAvailableBuffer(int itemWidth, int itemHeight,
- Buffer **sharedBuffer, int *glyphX, int *glyphY)
-{
- Q_ASSERT(sharedBuffer != 0);
- Q_ASSERT(glyphX != 0);
- Q_ASSERT(glyphY != 0);
-
- QMultiHash<QByteArray, Buffer *>::iterator it = m_buffers.find(m_currentCacheId);
-
- int bufferCount = 0;
- while (it != m_buffers.end() && it.key() == m_currentCacheId) {
- Buffer *buffer = it.value();
-
- int x = buffer->nextX;
- int y = buffer->nextY;
- int width = buffer->width;
- int height = buffer->height;
-
- if (x + itemWidth <= width && y + itemHeight <= height) {
- // There is space on the current line, put the item there
- buffer->currentLineMaxHeight = qMax(buffer->currentLineMaxHeight, itemHeight);
- *sharedBuffer = buffer;
- *glyphX = x;
- *glyphY = y;
-
- buffer->nextX += itemWidth;
-
- return;
- } else if (itemWidth <= width && y + buffer->currentLineMaxHeight + itemHeight <= height) {
- // There is space for a new line, put the item on the new line
- buffer->nextX = 0;
- buffer->nextY += buffer->currentLineMaxHeight;
- buffer->currentLineMaxHeight = 0;
-
- *sharedBuffer = buffer;
- *glyphX = buffer->nextX;
- *glyphY = buffer->nextY;
-
- buffer->nextX += itemWidth;
-
- return;
- } else if (y + buffer->currentLineMaxHeight + itemHeight <= SHAREDGRAPHICSCACHE_TEXTURE_SIZE) {
- // There is space if we resize the buffer, so we do that
- int newHeight = qt_next_power_of_two(y + buffer->currentLineMaxHeight + itemHeight);
- buffer = resizeBuffer(buffer, QSize(width, newHeight));
-
- buffer->nextX = 0;
- buffer->nextY += buffer->currentLineMaxHeight;
- buffer->currentLineMaxHeight = 0;
-
- *sharedBuffer = buffer;
- *glyphX = buffer->nextX;
- *glyphY = buffer->nextY;
-
- buffer->nextX += itemWidth;
- return;
- }
-
- bufferCount++;
- ++it;
- }
-
- if (bufferCount == SHAREDGRAPHICSCACHE_MAX_TEXTURES_PER_CACHE) {
- // There is no space in any buffer, and there is no space for a new buffer
- // recycle an old item
- recycleItem(sharedBuffer, glyphX, glyphY);
- } else {
- // Create a new buffer for the item
- *sharedBuffer = createNewBuffer(m_currentCacheId, qt_next_power_of_two(itemHeight));
- if (*sharedBuffer == 0) {
- Q_ASSERT(false);
- return;
- }
-
- *glyphX = (*sharedBuffer)->nextX;
- *glyphY = (*sharedBuffer)->nextY;
-
- (*sharedBuffer)->nextX += itemWidth;
- }
-}
-
-QXcbSharedBufferManager::Buffer *QXcbSharedBufferManager::allocateBuffer(int width, int height)
-{
- Buffer *buffer = new Buffer;
- buffer->nextX = 0;
- buffer->nextY = 0;
- buffer->width = width;
- buffer->height = height;
- buffer->bytesPerPixel = 1; // ### Use pixel format here
-
- buffer->buffer = new QSharedMemory(QUuid::createUuid().toString());
- bool ok = buffer->buffer->create(buffer->width * buffer->height * buffer->bytesPerPixel,
- QSharedMemory::ReadWrite);
- if (!ok) {
- qWarning("QXcbSharedBufferManager::findAvailableBuffer: Can't create new buffer (%s)",
- qPrintable(buffer->buffer->errorString()));
- delete buffer;
- return 0;
- }
- qMemSet(buffer->buffer->data(), 0, buffer->buffer->size());
-
- m_memoryUsed += buffer->width * buffer->height * buffer->bytesPerPixel;
-
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::allocateBuffer: Memory used: %d / %d (%6.2f %%)",
- int(m_memoryUsed), int(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED),
- 100.0f * float(m_memoryUsed) / float(SHAREDGRAPHICSCACHE_MAX_MEMORY_USED));
-#endif
-
- return buffer;
-}
-
-void QXcbSharedBufferManager::copyIntoBuffer(Buffer *buffer,
- int bufferX, int bufferY, int width, int height,
- uchar *data)
-{
-#if defined(SHAREDBUFFERMANAGER_DEBUG)
- qDebug("QXcbSharedBufferManager::copyIntoBuffer() called for %s (coords: %d, %d)",
- buffer->cacheId.constData(), bufferX, bufferY);
-#endif
-
- Q_ASSERT(bufferX >= 0);
- Q_ASSERT(bufferX + width <= buffer->width);
- Q_ASSERT(bufferY >= 0);
- Q_ASSERT(bufferY + height <= buffer->height);
-
- uchar *dest = reinterpret_cast<uchar *>(buffer->buffer->data());
- dest += bufferX + bufferY * buffer->width;
- for (int y=0; y<height; ++y) {
- qMemCopy(dest, data, width);
-
- data += width;
- dest += buffer->width;
- }
-}
-
-QXcbSharedBufferManager::Items *QXcbSharedBufferManager::itemsForCache(const QByteArray &cacheId) const
-{
- Items *items = m_items.value(cacheId);
- if (items == 0) {
- items = new Items;
- items->cacheId = cacheId;
- m_items[cacheId] = items;
- }
-
- return items;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_USE_XCB_SHARED_GRAPHICS_CACHE
diff --git a/src/plugins/platforms/xcb/qxcbsharedbuffermanager.h b/src/plugins/platforms/xcb/qxcbsharedbuffermanager.h
deleted file mode 100644
index ca79b502c2..0000000000
--- a/src/plugins/platforms/xcb/qxcbsharedbuffermanager.h
+++ /dev/null
@@ -1,215 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef XCBSHAREDBUFFERMANAGER_H
-#define XCBSHAREDBUFFERMANAGER_H
-
-#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
-
-#include <QtCore/qset.h>
-#include <QtCore/qhash.h>
-#include <QtCore/qsharedmemory.h>
-
-#include <GLES2/gl2.h>
-
-#include <EGL/egl.h>
-
-#include <EGL/eglext.h>
-
-class wl_resource;
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-class QXcbSharedBufferManager
-{
-public:
- struct Buffer {
- Buffer()
- : width(-1)
- , height(-1)
- , bytesPerPixel(1)
- , nextX(-1)
- , nextY(-1)
- , currentLineMaxHeight(0)
- , next(0)
- , prev(0)
- , buffer(0)
- , textureId(0)
- {
- }
-
- ~Buffer()
- {
- delete buffer;
-
- if (textureId != 0)
- glDeleteTextures(1, &textureId);
- }
-
- QByteArray cacheId;
- int width;
- int height;
- int bytesPerPixel;
- int nextX;
- int nextY;
- int currentLineMaxHeight;
-
- Buffer *next;
- Buffer *prev;
-
- QSharedMemory *buffer;
-
- GLuint textureId;
-
- QAtomicInt ref;
- };
-
- typedef QHash<QByteArray, QSet<quint32> > PendingItemIds;
-
- QXcbSharedBufferManager();
- ~QXcbSharedBufferManager();
-
- void beginSharedBufferAction(const QByteArray &cacheId);
- void insertItem(quint32 itemId, uchar *data, int itemWidth, int itemHeight);
- void requestItems(const QSet<quint32> &itemIds);
- void releaseItems(const QSet<quint32> &itemIds);
- void endSharedBufferAction();
-
- void getBufferForItem(const QByteArray &cacheId, quint32 itemId, Buffer **buffer,
- int *x, int *y) const;
- QPair<QByteArray, int> serializeBuffer(QSharedMemory *buffer) const;
-
- PendingItemIds pendingItemsInvalidated() const
- {
- Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO,
- "Call endSharedBufferAction() before accessing data");
- return m_pendingInvalidatedItems;
- }
-
- PendingItemIds pendingItemsReady() const
- {
- Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO,
- "Call endSharedBufferAction() before accessing data");
- return m_pendingReadyItems;
- }
-
- PendingItemIds pendingItemsMissing() const
- {
- Q_ASSERT_X(m_currentCacheId.isEmpty(), Q_FUNC_INFO,
- "Call endSharedBufferAction() before accessing data");
- return m_pendingMissingItems;
- }
-
-private:
- struct Item {
- Item()
- : next(0)
- , prev(0)
- , buffer(0)
- , itemId(0)
- , x(-1)
- , y(-1)
- , width(-1)
- , height(-1)
- {
- }
-
- Item *next;
- Item *prev;
-
- Buffer *buffer;
- quint32 itemId;
- int x;
- int y;
- int width;
- int height;
- };
-
- struct Items
- {
- Items() : leastRecentlyUsed(0), mostRecentlyUsed(0) {}
-
- Item *leastRecentlyUsed;
- Item *mostRecentlyUsed;
-
- QByteArray cacheId;
- QHash<quint32, Item *> items;
- };
-
- void findAvailableBuffer(int itemWidth, int itemHeight, Buffer **buffer, int *x, int *y);
- void recycleItem(Buffer **buffer, int *x, int *y);
- void copyIntoBuffer(Buffer *buffer, int x, int y, int itemWidth, int itemHeight, uchar *data);
- void touchBuffer(Buffer *buffer);
- void deleteLeastRecentlyUsed();
-
- Buffer *createNewBuffer(const QByteArray &cacheId, int heightRequired);
- Buffer *resizeBuffer(Buffer *buffer, const QSize &newSize);
- Buffer *allocateBuffer(int width, int height);
-
- Items *itemsForCache(const QByteArray &cacheId) const;
- void pushItemToBack(Items *items, Item *item);
- void touchItem(Items *items, Item *item);
- void deleteItem(Items *items, Item *item);
- void recycleItem(const QByteArray &cacheId, Buffer **sharedBuffer, int *glyphX, int *glyphY);
-
- QByteArray m_currentCacheId;
-
- quint32 m_memoryUsed;
- Buffer *m_mostRecentlyUsed;
- Buffer *m_leastRecentlyUsed;
-
- mutable QHash<QByteArray, Items *> m_items;
- QMultiHash<QByteArray, Buffer *> m_buffers;
-
- PendingItemIds m_pendingInvalidatedItems;
- PendingItemIds m_pendingReadyItems;
- PendingItemIds m_pendingMissingItems;
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // QT_USE_XCB_SHARED_GRAPHICS_CACHE
-
-#endif // XCBSHAREDBUFFERMANAGER_H
diff --git a/src/plugins/platforms/xcb/qxcbsharedgraphicscache.cpp b/src/plugins/platforms/xcb/qxcbsharedgraphicscache.cpp
deleted file mode 100644
index fa937504ad..0000000000
--- a/src/plugins/platforms/xcb/qxcbsharedgraphicscache.cpp
+++ /dev/null
@@ -1,290 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the plugins of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** 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.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#if defined(QT_USE_XCB_SHARED_GRAPHICS_CACHE)
-
-#include "qxcbsharedgraphicscache.h"
-#include "qxcbsharedbuffermanager.h"
-
-#include <QtCore/qsharedmemory.h>
-
-#include <QtGui/qopenglcontext.h>
-#include <QtGui/qscreen.h>
-
-#define GL_GLEXT_PROTOTYPES
-#include <GLES2/gl2ext.h>
-
-#define SHAREDGRAPHICSCACHE_DEBUG 1
-
-QT_BEGIN_NAMESPACE
-
-QXcbSharedGraphicsCache::QXcbSharedGraphicsCache(QObject *parent)
- : QPlatformSharedGraphicsCache(parent)
- , m_bufferManager(new QXcbSharedBufferManager)
-{
-}
-
-void QXcbSharedGraphicsCache::requestItems(const QByteArray &cacheId,
- const QVector<quint32> &itemIds)
-{
- m_bufferManager->beginSharedBufferAction(cacheId);
-
- QSet<quint32> itemsForRequest;
- for (int i=0; i<itemIds.size(); ++i)
- itemsForRequest.insert(itemIds.at(i));
-
- m_bufferManager->requestItems(itemsForRequest);
- m_bufferManager->endSharedBufferAction();
-
- processPendingItems();
-}
-
-void QXcbSharedGraphicsCache::insertItems(const QByteArray &cacheId,
- const QVector<quint32> &itemIds,
- const QVector<QImage> &items)
-{
- m_bufferManager->beginSharedBufferAction(cacheId);
-
- QSet<quint32> itemsForRequest;
- for (int i=0; i<itemIds.size(); ++i) {
- QImage image = items.at(i);
- m_bufferManager->insertItem(itemIds.at(i), image.bits(), image.width(), image.height());
- itemsForRequest.insert(itemIds.at(i));
- }
-
- // ### To avoid loops, we could check missing items here and notify the client
- m_bufferManager->requestItems(itemsForRequest);
-
- m_bufferManager->endSharedBufferAction();
-
- processPendingItems();
-}
-
-void QXcbSharedGraphicsCache::ensureCacheInitialized(const QByteArray &cacheId,
- BufferType bufferType,
- PixelFormat pixelFormat)
-{
- Q_UNUSED(cacheId);
- Q_UNUSED(bufferType);
- Q_UNUSED(pixelFormat);
-}
-
-
-void QXcbSharedGraphicsCache::releaseItems(const QByteArray &cacheId,
- const QVector<quint32> &itemIds)
-{
- m_bufferManager->beginSharedBufferAction(cacheId);
-
- QSet<quint32> itemsToRelease;
- for (int i=0; i<itemIds.size(); ++i)
- itemsToRelease.insert(itemIds.at(i));
-
- m_bufferManager->releaseItems(itemsToRelease);
-
- m_bufferManager->endSharedBufferAction();
-
- processPendingItems();
-}
-
-void QXcbSharedGraphicsCache::serializeBuffer(void *bufferId,
- QByteArray *serializedData,
- int *fileDescriptor) const
-{
- QXcbSharedBufferManager::Buffer *buffer =
- reinterpret_cast<QXcbSharedBufferManager::Buffer *>(bufferId);
-
- QPair<QByteArray, int> bufferName = m_bufferManager->serializeBuffer(buffer->buffer);
-
- *serializedData = bufferName.first;
- *fileDescriptor = bufferName.second;
-}
-
-GLuint QXcbSharedGraphicsCache::textureIdForBuffer(void *bufferId)
-{
-# if defined(SHAREDGRAPHICSCACHE_DEBUG)
- qDebug("QXcbSharedGraphicsCache::textureIdForBuffer");
-# endif
-
- QXcbSharedBufferManager::Buffer *buffer =
- reinterpret_cast<QXcbSharedBufferManager::Buffer *>(bufferId);
-
- if (buffer->textureId == 0) {
- glGenTextures(1, &buffer->textureId);
- if (buffer->textureId == 0) {
- qWarning("QXcbSharedGraphicsCache::textureIdForBuffer: Failed to generate texture (gl error: 0x%x)",
- glGetError());
- return 0;
- }
-
- glBindTexture(GL_TEXTURE_2D, buffer->textureId);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- }
-
- glBindTexture(GL_TEXTURE_2D, buffer->textureId);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, buffer->width, buffer->height, 0, GL_ALPHA,
- GL_UNSIGNED_BYTE, buffer->buffer->data());
- glBindTexture(GL_TEXTURE_2D, 0);
-
- return buffer->textureId;
-}
-
-void QXcbSharedGraphicsCache::referenceBuffer(void *bufferId)
-{
- QXcbSharedBufferManager::Buffer *buffer =
- reinterpret_cast<QXcbSharedBufferManager::Buffer *>(bufferId);
-
- buffer->ref.ref();
-}
-
-bool QXcbSharedGraphicsCache::dereferenceBuffer(void *bufferId)
-{
- QXcbSharedBufferManager::Buffer *buffer =
- reinterpret_cast<QXcbSharedBufferManager::Buffer *>(bufferId);
-
- if (buffer->ref.deref())
- return true;
-
- if (buffer->textureId != 0) {
- glDeleteTextures(1, &buffer->textureId);
- buffer->textureId = 0;
- }
-
- return false;
-}
-
-void QXcbSharedGraphicsCache::processPendingItems()
-{
-# if defined(SHAREDGRAPHICSCACHE_DEBUG)
- qDebug("QXcbSharedGraphicsCache::processPendingItems");
-# endif
-
- {
- QXcbSharedBufferManager::PendingItemIds pendingMissingItems = m_bufferManager->pendingItemsMissing();
- QXcbSharedBufferManager::PendingItemIds::const_iterator it;
-
-
- for (it = pendingMissingItems.constBegin(); it != pendingMissingItems.constEnd(); ++it) {
- QVector<quint32> missingItems;
-
- const QSet<quint32> &items = it.value();
- QSet<quint32>::const_iterator itemIt;
- for (itemIt = items.constBegin(); itemIt != items.constEnd(); ++itemIt)
- missingItems.append(*itemIt);
-
-# if defined(SHAREDGRAPHICSCACHE_DEBUG)
- qDebug("QXcbSharedGraphicsCache::processPendingItems: %d missing items",
- missingItems.size());
-# endif
-
- if (!missingItems.isEmpty())
- emit itemsMissing(it.key(), missingItems);
- }
- }
-
- {
- QXcbSharedBufferManager::PendingItemIds pendingInvalidatedItems = m_bufferManager->pendingItemsInvalidated();
- QXcbSharedBufferManager::PendingItemIds::const_iterator it;
-
- for (it = pendingInvalidatedItems.constBegin(); it != pendingInvalidatedItems.constEnd(); ++it) {
- QVector<quint32> invalidatedItems;
-
- const QSet<quint32> &items = it.value();
- QSet<quint32>::const_iterator itemIt;
- for (itemIt = items.constBegin(); itemIt != items.constEnd(); ++itemIt)
- invalidatedItems.append(*itemIt);
-
-# if defined(SHAREDGRAPHICSCACHE_DEBUG)
- qDebug("QXcbSharedGraphicsCache::processPendingItems: %d invalidated items",
- invalidatedItems.size());
-# endif
-
- if (!invalidatedItems.isEmpty())
- emit itemsInvalidated(it.key(), invalidatedItems);
- }
- }
-
- {
- QXcbSharedBufferManager::PendingItemIds pendingReadyItems = m_bufferManager->pendingItemsReady();
- QXcbSharedBufferManager::PendingItemIds::const_iterator it;
-
- for (it = pendingReadyItems.constBegin(); it != pendingReadyItems.constEnd(); ++it) {
- QHash<QXcbSharedBufferManager::Buffer *, ReadyItem> readyItemsForBuffer;
- const QSet<quint32> &items = it.value();
-
- QByteArray cacheId = it.key();
-
- QSet<quint32>::const_iterator itemIt;
- for (itemIt = items.constBegin(); itemIt != items.constEnd(); ++itemIt) {
- QXcbSharedBufferManager::Buffer *buffer;
- int x = -1;
- int y = -1;
-
- m_bufferManager->getBufferForItem(cacheId, *itemIt, &buffer, &x, &y);
-
- readyItemsForBuffer[buffer].itemIds.append(*itemIt);
- readyItemsForBuffer[buffer].positions.append(QPoint(x, y));
- }
-
- QHash<QXcbSharedBufferManager::Buffer*, ReadyItem>::iterator readyItemIt
- = readyItemsForBuffer.begin();
- while (readyItemIt != readyItemsForBuffer.end()) {
- QXcbSharedBufferManager::Buffer *buffer = readyItemIt.key();
- if (!readyItemIt.value().itemIds.isEmpty()) {
-# if defined(SHAREDGRAPHICSCACHE_DEBUG)
- qDebug("QXcbSharedGraphicsCache::processPendingItems: %d ready items",
- readyItemIt.value().itemIds.size());
-# endif
-
- emit itemsAvailable(cacheId, buffer, QSize(buffer->width, buffer->height),
- readyItemIt.value().itemIds, readyItemIt.value().positions);
- }
- ++readyItemIt;
- }
- }
- }
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_USE_XCB_SHARED_GRAPHICS_CACHE
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 3e63ab0f27..458ba8f07f 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -398,12 +398,14 @@ void QXcbWindow::setGeometry(const QRect &rect)
propagateSizeHints();
const quint32 mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
- const quint32 values[] = { rect.x(),
- rect.y(),
- qBound(1, rect.width(), XCOORD_MAX),
- qBound(1, rect.height(), XCOORD_MAX) };
+ const qint32 values[] = {
+ qBound<qint32>(-XCOORD_MAX, rect.x(), XCOORD_MAX),
+ qBound<qint32>(-XCOORD_MAX, rect.y(), XCOORD_MAX),
+ qBound<qint32>(1, rect.width(), XCOORD_MAX),
+ qBound<qint32>(1, rect.height(), XCOORD_MAX),
+ };
- Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, values));
+ Q_XCB_CALL(xcb_configure_window(xcb_connection(), m_window, mask, reinterpret_cast<const quint32*>(values)));
xcb_flush(xcb_connection());
}
@@ -551,7 +553,7 @@ void QXcbWindow::show()
updateNetWmStateBeforeMap();
}
- if (connection()->time() != CurrentTime)
+ if (connection()->time() != XCB_TIME_CURRENT_TIME)
updateNetWmUserTime(connection()->time());
Q_XCB_CALL(xcb_map_window(xcb_connection(), m_window));
@@ -1300,6 +1302,7 @@ void QXcbWindow::handleClientMessageEvent(const xcb_client_message_event_t *even
connection()->drag()->handleLeave(window(), event);
} else if (event->type == atom(QXcbAtom::XdndDrop)) {
connection()->drag()->handleDrop(window(), event);
+ } else if (event->type == atom(QXcbAtom::_XEMBED)) { // QSystemTrayIcon
} else {
qWarning() << "QXcbWindow: Unhandled client message:" << connection()->atomName(event->type);
}
diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro
index d220766be0..0da5fb1674 100644
--- a/src/plugins/platforms/xcb/xcb.pro
+++ b/src/plugins/platforms/xcb/xcb.pro
@@ -20,9 +20,7 @@ SOURCES = \
main.cpp \
qxcbnativeinterface.cpp \
qxcbcursor.cpp \
- qxcbimage.cpp \
- qxcbsharedbuffermanager.cpp \
- qxcbsharedgraphicscache.cpp
+ qxcbimage.cpp
HEADERS = \
qxcbclipboard.h \
@@ -38,9 +36,7 @@ HEADERS = \
qxcbwmsupport.h \
qxcbnativeinterface.h \
qxcbcursor.h \
- qxcbimage.h \
- qxcbsharedbuffermanager.h \
- qxcbsharedgraphicscache.h
+ qxcbimage.h
contains(QT_CONFIG, xcb-poll-for-queued-event) {
DEFINES += XCB_POLL_FOR_QUEUED_EVENT
@@ -91,10 +87,11 @@ contains(DEFINES, XCB_USE_DRI2) {
DEFINES += XCB_USE_GLX
HEADERS += qglxintegration.h
SOURCES += qglxintegration.cpp
+ LIBS += $$QMAKE_LIBS_DYNLOAD
}
}
-LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shape
+LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm -lxcb-sync -lxcb-xfixes -lxcb-shape -lxcb-shm
DEFINES += $$QMAKE_DEFINES_XCB
LIBS += $$QMAKE_LIBS_XCB
diff --git a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp b/src/plugins/printsupport/windows/qwindowsprintersupport.cpp
index c5c60ae5cc..476889890d 100644
--- a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp
+++ b/src/plugins/printsupport/windows/qwindowsprintersupport.cpp
@@ -59,7 +59,9 @@ QWindowsPrinterSupport::QWindowsPrinterSupport()
if (EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, buffer, needed, &needed, &returned)) {
PPRINTER_INFO_4 infoList = reinterpret_cast<PPRINTER_INFO_4>(buffer);
QString defaultPrinterName;
- QWin32PrintEngine::queryDefaultPrinter(defaultPrinterName, QString(), QString());
+ QString program;
+ QString port;
+ QWin32PrintEngine::queryDefaultPrinter(defaultPrinterName, program, port);
for (uint i = 0; i < returned; ++i) {
QString printerName(QString::fromWCharArray(infoList[i].pPrinterName));