summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Olszak <olszak.tomasz@gmail.com>2015-02-26 15:41:37 +0100
committerTomasz Olszak <olszak.tomasz@gmail.com>2015-02-26 15:41:37 +0100
commit25b779a49e39682b17c2a98fc820e6bb42cacf8b (patch)
tree5acd127fdc9cf71985aaf4557d3dd25f3ea9fc14
parentdbcea222e3f4b661c375719796195337baa3b9a4 (diff)
xcb: Added Tizen 2.3 adaptation
Adaptation includes: * Application lifecycle depending on X atoms. Tizen 2.3 native application lifecycle depends on X window. So we react on _X_ILLUME_ACTIVATE|DEACTIVATE_WINDOW atoms and suspend or activate application accordingly. * Platform native interface function for setting device orientation. This api is defined in QtPlatformHeaders/qxcbfunctions.h and can be used from Tizen application wrapper code. Change-Id: I0105717dcb4f652dd27e891a5f6c21388d8399ca Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com> Reviewed-by: Tomasz Olszak <olszak.tomasz@gmail.com>
-rw-r--r--src/platformheaders/xcbfunctions/qxcbfunctions.h57
-rw-r--r--src/platformheaders/xcbfunctions/xcbfunctions.pri4
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp20
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.h6
-rw-r--r--src/plugins/platforms/xcb/qxcbintegration.cpp3
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.cpp25
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.h1
7 files changed, 115 insertions, 1 deletions
diff --git a/src/platformheaders/xcbfunctions/qxcbfunctions.h b/src/platformheaders/xcbfunctions/qxcbfunctions.h
new file mode 100644
index 0000000000..77f4886b78
--- /dev/null
+++ b/src/platformheaders/xcbfunctions/qxcbfunctions.h
@@ -0,0 +1,57 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QXCBFUNCTIONS_H
+#define QXCBFUNCTIONS_H
+
+#include <QtCore/QByteArray>
+#include <QtGui/QGuiApplication>
+
+QT_BEGIN_NAMESPACE
+
+class QXcbFunctions {
+public:
+ typedef void (*SetDeviceOrientationType)(Qt::ScreenOrientation orientation);
+ static const QByteArray setDeviceOrientationTypeIdentifier() { return QByteArrayLiteral("XcbSetDeviceOrientationType"); }
+
+ static void setDeviceOrientation(Qt::ScreenOrientation orientation)
+ {
+ SetDeviceOrientationType func = reinterpret_cast<SetDeviceOrientationType>(QGuiApplication::platformFunction(setDeviceOrientationTypeIdentifier()));
+ if (func)
+ func(orientation);
+ }
+};
+
+QT_END_NAMESPACE
+
+#endif // QXCBFUNCTIONS_H
diff --git a/src/platformheaders/xcbfunctions/xcbfunctions.pri b/src/platformheaders/xcbfunctions/xcbfunctions.pri
index 8844913cd1..ac270fa162 100644
--- a/src/platformheaders/xcbfunctions/xcbfunctions.pri
+++ b/src/platformheaders/xcbfunctions/xcbfunctions.pri
@@ -1 +1,3 @@
-HEADERS += $$PWD/qxcbwindowfunctions.h
+HEADERS += \
+ $$PWD/qxcbfunctions.h \
+ $$PWD/qxcbwindowfunctions.h
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 5510c3b1b4..3d6adfa45c 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -1331,6 +1331,20 @@ void QXcbConnection::handleClientMessageEvent(const xcb_client_message_event_t *
if (!window)
return;
+#ifdef Q_OS_LINUX_TIZEN
+ if (event->type == atom(QXcbAtom::_X_ILLUME_DEACTIVATE_WINDOW)) {
+ QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationSuspended);
+ return;
+ } if (event->type == atom(QXcbAtom::_X_ILLUME_ACTIVATE_WINDOW)) {
+ QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive);
+ return;
+ } else if (event->type == atom(QXcbAtom::_E_COMP_FLUSH)
+ || event->type == atom(QXcbAtom::_NET_CM_WINDOW_EFFECT_CLIENT_STATE)) {
+ //silence the Tizen Mobile X11 WM messages for now
+ return;
+ }
+#endif // Q_OS_LINUX_TIZEN
+
window->handleClientMessageEvent(event);
}
@@ -1536,6 +1550,12 @@ static const char * xcb_atomnames = {
"Rel Vert Wheel\0"
"Rel Horiz Scroll\0"
"Rel Vert Scroll\0"
+#ifdef Q_OS_LINUX_TIZEN
+ "_E_COMP_FLUSH\0"
+ "_NET_CM_WINDOW_EFFECT_CLIENT_STATE\0"
+ "_X_ILLUME_ACTIVATE_WINDOW\0"
+ "_X_ILLUME_DEACTIVATE_WINDOW\0"
+#endif
"_XSETTINGS_SETTINGS\0"
"_COMPIZ_DECOR_PENDING\0"
"_COMPIZ_DECOR_REQUEST\0"
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 7286b6b89b..7fbe21e65b 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -273,6 +273,12 @@ namespace QXcbAtom {
RelHorizScroll,
RelVertScroll,
+#ifdef Q_OS_LINUX_TIZEN
+ _E_COMP_FLUSH,
+ _NET_CM_WINDOW_EFFECT_CLIENT_STATE,
+ _X_ILLUME_ACTIVATE_WINDOW,
+ _X_ILLUME_DEACTIVATE_WINDOW,
+#endif
_XSETTINGS_SETTINGS,
_COMPIZ_DECOR_PENDING,
diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp
index f0c4a7f691..ec006f73b7 100644
--- a/src/plugins/platforms/xcb/qxcbintegration.cpp
+++ b/src/plugins/platforms/xcb/qxcbintegration.cpp
@@ -321,6 +321,9 @@ bool QXcbIntegration::hasCapability(QPlatformIntegration::Capability cap) const
case ForeignWindows: return true;
case SyncState: return true;
case RasterGLSurface: return true;
+#ifdef Q_OS_LINUX_TIZEN
+ case ApplicationState: return true;
+#endif
default: return QPlatformIntegration::hasCapability(cap);
}
}
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
index 31dedd40a2..0b08895a3f 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
@@ -53,6 +53,7 @@
#endif
#include <QtPlatformHeaders/qxcbwindowfunctions.h>
+#include <QtPlatformHeaders/qxcbfunctions.h>
#ifdef XCB_USE_XLIB
# include <X11/Xlib.h>
@@ -334,11 +335,35 @@ QPlatformNativeInterface::NativeResourceForScreenFunction QXcbNativeInterface::n
return 0;
}
+static void _setDeviceOrientation(Qt::ScreenOrientation orientation) {
+ //QMetaObject::invokeMethod method is used here because it is possible
+ //and very probable that this function will be invoked from non-Gui thread.
+ //This way thread safety is guqranteed in easy way
+ QMetaObject::invokeMethod(QGuiApplication::platformNativeInterface(),
+ "setDeviceOrientation",
+ Q_ARG(int, orientation));
+}
+
+void QXcbNativeInterface::setDeviceOrientation(int orientation) {
+ //This slot is private and supposed to be invoked only by _setDeviceOrientation function
+ Qt::ScreenOrientation screenOrientation = (Qt::ScreenOrientation) orientation;
+ QScreen *screen = QGuiApplication::primaryScreen();
+ if (screen)
+ QWindowSystemInterface::handleScreenOrientationChange(screen, screenOrientation);
+ else
+ qWarning() << "Can't set device orientation to:" << qPrintable(screenOrientation)
+ << "because there is no primary screen";
+}
+
QFunctionPointer QXcbNativeInterface::platformFunction(const QByteArray &function) const
{
if (function == QXcbWindowFunctions::setWmWindowTypeIdentifier()) {
return QFunctionPointer(QXcbWindow::setWmWindowTypeStatic);
}
+ if (function == QXcbFunctions::setDeviceOrientationTypeIdentifier()) {
+ //Pointer to static function is returned because - see comment in that function
+ return QFunctionPointer(_setDeviceOrientation);
+ }
return Q_NULLPTR;
}
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.h b/src/plugins/platforms/xcb/qxcbnativeinterface.h
index 330dd008c4..03a029dc80 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.h
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.h
@@ -116,6 +116,7 @@ signals:
private:
xcb_window_t locateSystemTray(xcb_connection_t *conn, const QXcbScreen *screen);
+ Q_INVOKABLE void setDeviceOrientation(int orientation);
const QByteArray m_genericEventFilterType;