mirror of https://github.com/qt/qtbase.git
Add QScreenOrientationChangeEvent and rotation support to wayland client
Qt Compositor propagates screen orientation changes to wayland, which are then picked up by the wayland client. The wayland client then sends a QScreenOrientationChangeEvent to QApplication, which can handle the orientation change. Change-Id: Ieb2225e52b7e3c318648f2cb21dab7937f301505 Reviewed-on: http://codereview.qt.nokia.com/1063 Reviewed-by: Matthias Ettrich
This commit is contained in:
parent
85869920bb
commit
a77ce3301c
|
@ -273,6 +273,8 @@ public:
|
|||
ScrollPrepare = 204,
|
||||
Scroll = 205,
|
||||
|
||||
OrientationChange = 206, // Screen orientation has changed
|
||||
|
||||
// 512 reserved for Qt Jambi's MetaCall event
|
||||
// 513 reserved for Qt Jambi's DeleteOnMainThread event
|
||||
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
#include "qevent_p.h"
|
||||
#include "qgesture.h"
|
||||
#include "qgesture_p.h"
|
||||
#include "qmath.h"
|
||||
|
||||
#ifdef Q_OS_SYMBIAN
|
||||
#include "private/qcore_symbian_p.h"
|
||||
|
@ -4818,4 +4819,101 @@ const QScrollEventPrivate *QScrollEvent::d_func() const
|
|||
return reinterpret_cast<const QScrollEventPrivate *>(d);
|
||||
}
|
||||
|
||||
/*!
|
||||
\enum QScreenOrientationChangeEvent::Orientation
|
||||
|
||||
This enum describes the orientations that a device can have.
|
||||
|
||||
\value Portrait The device is in a position where its top edge is pointing up.
|
||||
|
||||
\value Landscape The device is rotated clockwise 90 degrees, so that its left edge is pointing up.
|
||||
|
||||
\value PortraitInverted The device is rotated 180 degrees, so that its bottom edge is pointing up.
|
||||
|
||||
\value LandscapeInverted The device is counterclockwise 90 degrees, so that its right edge is pointing up.
|
||||
|
||||
\sa QScreenOrientationChangeEvent::orientation()
|
||||
\sa QScreenOrientationChangeEvent::orientationInDegrees()
|
||||
*/
|
||||
|
||||
/*!
|
||||
Creates a new QScreenOrientationChangeEvent
|
||||
\a screenOrientationInDegrees is the new screen orientation, expressed in degrees.
|
||||
The orientation must be expressed in steps of 90 degrees.
|
||||
*/
|
||||
QScreenOrientationChangeEvent::QScreenOrientationChangeEvent(qint32 screenOrientationInDegrees)
|
||||
: QEvent(QEvent::OrientationChange)
|
||||
{
|
||||
d = reinterpret_cast<QEventPrivate *>(new QScreenOrientationChangeEventPrivate());
|
||||
d_func()->orientationInDegrees = screenOrientationInDegrees;
|
||||
|
||||
qint32 orientationIndex = (qAbs(screenOrientationInDegrees) % 360) / 90;
|
||||
// flip around the negative coords to correct order.
|
||||
if (screenOrientationInDegrees < 0) {
|
||||
if (orientationIndex == 1)
|
||||
orientationIndex = 3;
|
||||
else if (orientationIndex == 3)
|
||||
orientationIndex = 1;
|
||||
}
|
||||
|
||||
orientationIndex = qPow(2, orientationIndex);
|
||||
d_func()->orientation = (QScreenOrientationChangeEvent::Orientation)(orientationIndex);
|
||||
d_func()->isValid = (screenOrientationInDegrees % 90 == 0);
|
||||
}
|
||||
|
||||
/*!
|
||||
Creates a new QScreenOrientationChangeEvent
|
||||
\a orientation is the new orientation of the screen.
|
||||
*/
|
||||
QScreenOrientationChangeEvent::QScreenOrientationChangeEvent(QScreenOrientationChangeEvent::Orientation screenOrientation)
|
||||
: QEvent(QEvent::OrientationChange)
|
||||
{
|
||||
d = reinterpret_cast<QEventPrivate *>(new QScreenOrientationChangeEventPrivate());
|
||||
d_func()->orientation = screenOrientation;
|
||||
d_func()->orientationInDegrees = 90 * ((uint)screenOrientation);
|
||||
d_func()->isValid = true;
|
||||
}
|
||||
|
||||
/*!
|
||||
Destroys QScreenOrientationChangeEvent.
|
||||
*/
|
||||
QScreenOrientationChangeEvent::~QScreenOrientationChangeEvent()
|
||||
{
|
||||
delete reinterpret_cast<QScrollEventPrivate *>(d);
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the orientation of the screen.
|
||||
*/
|
||||
QScreenOrientationChangeEvent::Orientation QScreenOrientationChangeEvent::orientation() const
|
||||
{
|
||||
return d_func()->orientation;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the screen orientation in degrees.
|
||||
The orientation is expressed in steps of 90 degrees and depends on the previous value of the orientation.
|
||||
This is intended to allow for smooth animations from one orientation to the other.
|
||||
*/
|
||||
qint32 QScreenOrientationChangeEvent::orientationInDegrees() const
|
||||
{
|
||||
return d_func()->orientationInDegrees;
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
QScreenOrientationChangeEventPrivate *QScreenOrientationChangeEvent::d_func()
|
||||
{
|
||||
return reinterpret_cast<QScreenOrientationChangeEventPrivate *>(d);
|
||||
}
|
||||
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
const QScreenOrientationChangeEventPrivate *QScreenOrientationChangeEvent::d_func() const
|
||||
{
|
||||
return reinterpret_cast<const QScreenOrientationChangeEventPrivate *>(d);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
@ -938,6 +938,30 @@ private:
|
|||
const QScrollEventPrivate *d_func() const;
|
||||
};
|
||||
|
||||
class QScreenOrientationChangeEventPrivate;
|
||||
class Q_GUI_EXPORT QScreenOrientationChangeEvent : public QEvent
|
||||
{
|
||||
public:
|
||||
enum Orientation {
|
||||
Portrait = 1,
|
||||
Landscape = 2,
|
||||
PortraitInverted = 4,
|
||||
LandscapeInverted = 8
|
||||
};
|
||||
QScreenOrientationChangeEvent(qint32 screenOrientationInDegrees);
|
||||
QScreenOrientationChangeEvent(Orientation screenOrientation);
|
||||
~QScreenOrientationChangeEvent();
|
||||
|
||||
bool isValid() const;
|
||||
qint32 orientationInDegrees() const;
|
||||
Orientation orientation() const;
|
||||
|
||||
private:
|
||||
QScreenOrientationChangeEventPrivate *d_func();
|
||||
const QScreenOrientationChangeEventPrivate *d_func() const;
|
||||
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
|
|
@ -200,6 +200,17 @@ public:
|
|||
QScrollEvent::ScrollState state;
|
||||
};
|
||||
|
||||
class QScreenOrientationChangeEventPrivate
|
||||
{
|
||||
public:
|
||||
inline QScreenOrientationChangeEventPrivate()
|
||||
{
|
||||
}
|
||||
QScreenOrientationChangeEvent::Orientation orientation;
|
||||
qint32 orientationInDegrees;
|
||||
bool isValid;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
#endif // QEVENT_P_H
|
||||
|
|
|
@ -39,17 +39,20 @@ struct wl_windowmanager;
|
|||
extern const struct wl_interface wl_windowmanager_interface;
|
||||
|
||||
struct wl_windowmanager_listener {
|
||||
void (*client_onscreen_visibility)(void *data,
|
||||
struct wl_windowmanager *wl_windowmanager,
|
||||
int visible);
|
||||
void (*client_onscreen_visibility)(void *data,
|
||||
struct wl_windowmanager *wl_windowmanager,
|
||||
int visible);
|
||||
void (*set_screen_rotation)(void *data,
|
||||
struct wl_windowmanager *wl_windowmanager,
|
||||
int rotation);
|
||||
};
|
||||
|
||||
static inline int
|
||||
wl_windowmanager_add_listener(struct wl_windowmanager *wl_windowmanager,
|
||||
const struct wl_windowmanager_listener *listener, void *data)
|
||||
const struct wl_windowmanager_listener *listener, void *data)
|
||||
{
|
||||
return wl_proxy_add_listener((struct wl_proxy *) wl_windowmanager,
|
||||
(void (**)(void)) listener, data);
|
||||
return wl_proxy_add_listener((struct wl_proxy *) wl_windowmanager,
|
||||
(void (**)(void)) listener, data);
|
||||
}
|
||||
|
||||
#define WL_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS 0
|
||||
|
@ -58,42 +61,42 @@ wl_windowmanager_add_listener(struct wl_windowmanager *wl_windowmanager,
|
|||
static inline struct wl_windowmanager *
|
||||
wl_windowmanager_create(struct wl_display *display, uint32_t id, uint32_t version)
|
||||
{
|
||||
wl_display_bind(display, id, "wl_windowmanager", version);
|
||||
wl_display_bind(display, id, "wl_windowmanager", version);
|
||||
|
||||
return (struct wl_windowmanager *)
|
||||
wl_proxy_create_for_id(display, &wl_windowmanager_interface, id);
|
||||
return (struct wl_windowmanager *)
|
||||
wl_proxy_create_for_id(display, &wl_windowmanager_interface, id);
|
||||
}
|
||||
|
||||
static inline void
|
||||
wl_windowmanager_set_user_data(struct wl_windowmanager *wl_windowmanager, void *user_data)
|
||||
{
|
||||
wl_proxy_set_user_data((struct wl_proxy *) wl_windowmanager, user_data);
|
||||
wl_proxy_set_user_data((struct wl_proxy *) wl_windowmanager, user_data);
|
||||
}
|
||||
|
||||
static inline void *
|
||||
wl_windowmanager_get_user_data(struct wl_windowmanager *wl_windowmanager)
|
||||
{
|
||||
return wl_proxy_get_user_data((struct wl_proxy *) wl_windowmanager);
|
||||
return wl_proxy_get_user_data((struct wl_proxy *) wl_windowmanager);
|
||||
}
|
||||
|
||||
static inline void
|
||||
wl_windowmanager_destroy(struct wl_windowmanager *wl_windowmanager)
|
||||
{
|
||||
wl_proxy_destroy((struct wl_proxy *) wl_windowmanager);
|
||||
wl_proxy_destroy((struct wl_proxy *) wl_windowmanager);
|
||||
}
|
||||
|
||||
static inline void
|
||||
wl_windowmanager_map_client_to_process(struct wl_windowmanager *wl_windowmanager, uint32_t processid)
|
||||
{
|
||||
wl_proxy_marshal((struct wl_proxy *) wl_windowmanager,
|
||||
WL_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS, processid);
|
||||
wl_proxy_marshal((struct wl_proxy *) wl_windowmanager,
|
||||
WL_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS, processid);
|
||||
}
|
||||
|
||||
static inline void
|
||||
wl_windowmanager_authenticate_with_token(struct wl_windowmanager *wl_windowmanager, const char *processid)
|
||||
{
|
||||
wl_proxy_marshal((struct wl_proxy *) wl_windowmanager,
|
||||
WL_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN, processid);
|
||||
wl_proxy_marshal((struct wl_proxy *) wl_windowmanager,
|
||||
WL_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN, processid);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -43,13 +43,14 @@
|
|||
#include "qwaylandwindowmanager-client-protocol.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QEvent>
|
||||
#include <QtGui/QtEvents>
|
||||
#include <QCoreApplication>
|
||||
|
||||
const struct wl_windowmanager_listener QWaylandWindowManagerIntegration::mWindowManagerListener = {
|
||||
QWaylandWindowManagerIntegration::wlHandleOnScreenVisibilityChange,
|
||||
QWaylandWindowManagerIntegration::wlHandleScreenOrientationChange,
|
||||
};
|
||||
|
||||
QWaylandWindowManagerIntegration *QWaylandWindowManagerIntegration::createIntegration(QWaylandDisplay *waylandDisplay)
|
||||
|
@ -78,6 +79,7 @@ struct wl_windowmanager *QWaylandWindowManagerIntegration::windowManager() const
|
|||
|
||||
void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data)
|
||||
{
|
||||
Q_UNUSED(version);
|
||||
if (strcmp(interface, "wl_windowmanager") == 0) {
|
||||
QWaylandWindowManagerIntegration *integration = static_cast<QWaylandWindowManagerIntegration *>(data);
|
||||
integration->mWaylandWindowManager = wl_windowmanager_create(display, id, 1);
|
||||
|
@ -103,11 +105,19 @@ void QWaylandWindowManagerIntegration::authenticateWithToken(const QByteArray &t
|
|||
|
||||
void QWaylandWindowManagerIntegration::wlHandleOnScreenVisibilityChange(void *data, struct wl_windowmanager *wl_windowmanager, int visible)
|
||||
{
|
||||
QWaylandWindowManagerIntegration *integration = (QWaylandWindowManagerIntegration *)data;
|
||||
|
||||
Q_UNUSED(data);
|
||||
Q_UNUSED(wl_windowmanager);
|
||||
QEvent evt(visible != 0 ? QEvent::ApplicationActivated : QEvent::ApplicationDeactivated);
|
||||
|
||||
QCoreApplication::sendEvent(QCoreApplication::instance(), &evt);
|
||||
|
||||
qDebug() << "OnScreenVisibility" << (visible != 0);
|
||||
}
|
||||
|
||||
void QWaylandWindowManagerIntegration::wlHandleScreenOrientationChange(void *data, struct wl_windowmanager *wl_windowmanager, int screenOrientation)
|
||||
{
|
||||
Q_UNUSED(data);
|
||||
Q_UNUSED(wl_windowmanager);
|
||||
QScreenOrientationChangeEvent event(screenOrientation);
|
||||
QCoreApplication::sendEvent(QCoreApplication::instance(), &event);
|
||||
}
|
||||
|
|
|
@ -63,6 +63,7 @@ private:
|
|||
const char *interface, uint32_t version, void *data);
|
||||
|
||||
static void wlHandleOnScreenVisibilityChange(void *data, struct wl_windowmanager *wl_windowmanager, int visible);
|
||||
static void wlHandleScreenOrientationChange(void *data, struct wl_windowmanager *wl_windowmanager, int screenOrientation);
|
||||
private:
|
||||
|
||||
QWaylandDisplay *mWaylandDisplay;
|
||||
|
|
|
@ -26,12 +26,13 @@
|
|||
#include "wayland-util.h"
|
||||
|
||||
static const struct wl_message wl_windowmanager_requests[] = {
|
||||
{ "map_client_to_process", "u", NULL },
|
||||
{ "authenticate_with_token", "s", NULL },
|
||||
{ "map_client_to_process", "u", NULL },
|
||||
{ "authenticate_with_token", "s", NULL },
|
||||
};
|
||||
|
||||
static const struct wl_message wl_windowmanager_events[] = {
|
||||
{ "client_onscreen_visibility", "i", NULL },
|
||||
{ "client_onscreen_visibility", "i", NULL },
|
||||
{ "set_screen_rotation", "i", NULL },
|
||||
};
|
||||
|
||||
WL_EXPORT const struct wl_interface wl_windowmanager_interface = {
|
||||
|
|
Loading…
Reference in New Issue