Tizen: Added screen orientation handling in xcb plugin.
authorTomasz Olszak <olszak.tomasz@gmail.com>
Tue, 10 Nov 2015 14:41:49 +0000 (15:41 +0100)
committerTomasz Olszak <olszak.tomasz@gmail.com>
Tue, 10 Nov 2015 14:41:49 +0000 (15:41 +0100)
X Window events sent by Window Manager are used.

Change-Id: I06970059a003326ddda94cf07d8822f14af5cadc
Reviewed-by: Jarosław Staniek <staniek@kde.org>
Reviewed-by: Tomasz Olszak <olszak.tomasz@gmail.com>
src/plugins/platforms/xcb/qxcbconnection.cpp
src/plugins/platforms/xcb/qxcbconnection.h
src/plugins/platforms/xcb/qxcbwindow.cpp

index e82626d3be64781a166de3ab4d3a37f6e4cbd8e5..cd15f92bac7fe82d20c2b259b04e87e76fa220e0 100644 (file)
@@ -32,6 +32,7 @@
 ****************************************************************************/
 
 #include <QtGui/private/qguiapplication_p.h>
+#include <private/qmath_p.h>
 #include <QtCore/QDebug>
 
 #include "qxcbconnection.h"
@@ -1526,6 +1527,45 @@ void QXcbConnection::handleClientMessageEvent(const xcb_client_message_event_t *
         drag()->handleFinished(event);
     }
 #endif
+
+#ifdef Q_OS_LINUX_TIZEN
+    if (event->type == atom(QXcbAtom::_X_ILLUME_DEACTIVATE_WINDOW)) {
+        QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationHidden);
+        return;
+    } else if (event->type == atom(QXcbAtom::_E_WINDOW_ROTATION_CHANGE_PREPARE)) {
+        xcb_client_message_event_t reply = *event;
+        reply.response_type = XCB_CLIENT_MESSAGE;
+        reply.type = atom(QXcbAtom::_E_WINDOW_ROTATION_CHANGE_PREPARE_DONE);
+        xcb_send_event(xcb_connection(), 0, reply.window,  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY| XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *)&reply);
+        xcb_flush(xcb_connection());
+        return;
+    } else if (event->type == atom(QXcbAtom::_E_WINDOW_ROTATION_CHANGE_REQUEST)) {
+        xcb_client_message_event_t reply = *event;
+        reply.response_type = XCB_CLIENT_MESSAGE;
+        reply.type = atom(QXcbAtom::_E_WINDOW_ROTATION_CHANGE_DONE);
+
+        xcb_randr_screen_change_notify_event_t e;
+        e.config_timestamp = (xcb_timestamp_t)QDateTime::currentMSecsSinceEpoch();
+        switch (reply.data.data32[1]) {
+            case 0: e.rotation = XCB_RANDR_ROTATION_ROTATE_90; break;
+            case 90: e.rotation = XCB_RANDR_ROTATION_ROTATE_180; break;
+            case 180: e.rotation = XCB_RANDR_ROTATION_ROTATE_270; break;
+            case 270: e.rotation = XCB_RANDR_ROTATION_ROTATE_0; break;
+        }
+
+        QXcbScreen *scrn = m_screens.at(primaryScreen());
+        e.width = scrn->geometry().width();
+        e.height = scrn->geometry().height();
+        e.mwidth = scrn->logicalDpi().first/Q_MM_PER_INCH/e.width;
+        e.mheight = scrn->logicalDpi().second/Q_MM_PER_INCH/e.height;
+        scrn->handleScreenChange(&e);
+        xcb_send_event(xcb_connection(), 0, reply.window,  XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY| XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *)&reply);
+        xcb_flush(xcb_connection());
+        return;
+    }
+#endif // Q_OS_LINUX_TIZEN
+
+
     if (m_systemTrayTracker && event->type == atom(QXcbAtom::MANAGER))
         m_systemTrayTracker->notifyManagerClientMessageEvent(event);
 
@@ -1742,7 +1782,17 @@ static const char * xcb_atomnames = {
     "Rel Vert Scroll\0"
 #ifdef Q_OS_LINUX_TIZEN
     "_X_ILLUME_DEACTIVATE_WINDOW\0"
-#endif
+    "_E_WINDOW_ROTATION_AVAILABLE_LIST\0"
+    "_E_ILLUME_ROTATE_WINDOW_ANGLE\0"
+    "_E_WINDOW_ROTATION_PREFERRED_ROTATION\0"
+    "_E_ILLUME_ROTATE_ROOT_ANGLE\0"
+    "_E_WINDOW_ROTATION_SUPPORTED\0"
+    "_E_WINDOW_ROTATION_CHANGE_PREPARE\0"
+    "_E_WINDOW_ROTATION_CHANGE_PREPARE_DONE\0"
+    "_E_WINDOW_ROTATION_CHANGE_REQUEST\0"
+    "_E_WINDOW_ROTATION_CHANGE_DONE\0"
+    "_E_WINDOW_ROTATION_APP_SUPPORTED\0"
+#endif  //Q_OS_LINUX_TIZEN
     "_XSETTINGS_SETTINGS\0"
     "_COMPIZ_DECOR_PENDING\0"
     "_COMPIZ_DECOR_REQUEST\0"
index 967939f0a577720d0859416cc2b4bb34a2ea9eb0..29efdc598890a53cd38035e3eea502113f3d55cf 100644 (file)
@@ -283,7 +283,17 @@ namespace QXcbAtom {
 
 #ifdef Q_OS_LINUX_TIZEN
         _X_ILLUME_DEACTIVATE_WINDOW,
-#endif
+        _E_WINDOW_ROTATION_AVAILABLE_LIST,
+        _E_ILLUME_ROTATE_WINDOW_ANGLE,
+        _E_WINDOW_ROTATION_PREFERRED_ROTATION,
+        _E_ILLUME_ROTATE_ROOT_ANGLE,
+        _E_WINDOW_ROTATION_SUPPORTED,
+        _E_WINDOW_ROTATION_CHANGE_PREPARE,
+        _E_WINDOW_ROTATION_CHANGE_PREPARE_DONE,
+        _E_WINDOW_ROTATION_CHANGE_REQUEST,
+        _E_WINDOW_ROTATION_CHANGE_DONE,
+        _E_WINDOW_ROTATION_APP_SUPPORTED,
+#endif //Q_OS_LINUX_TIZEN
         _XSETTINGS_SETTINGS,
 
         _COMPIZ_DECOR_PENDING,
index f7affd5e8c1087f7bbc8994c0c81c7ffcaa7accd..0b22b8a1d7229a66cce3687a8033b722d4c6a7fd 100644 (file)
@@ -568,6 +568,12 @@ void QXcbWindow::create()
                                    atom(QXcbAtom::_XEMBED_INFO),
                                    32, 2, (void *)data));
 
+#ifdef Q_OS_LINUX_TIZEN
+    int set = 1;
+    Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
+                                   atom(QXcbAtom::_E_WINDOW_ROTATION_SUPPORTED), XCB_ATOM_CARDINAL, 32,
+                                   1, &set));
+#endif //Q_OS_LINUX_TIZEN
 
 #if defined(XCB_USE_XINPUT2)
     connection()->xi2Select(m_window);