Implemented on-screen visibility handling via wayland
The compositor informs the client about it's window not being visible at all. This is handled here by dispatching a ApplicationActivated/ApplicationDeactivated event. The application than is free to handle this event and stop rendering and other not needed processing. Change-Id: I1dcc3f2a4a8e63ad5cc4f89cbf82cc63f779edbf Reviewed-on: http://codereview.qt.nokia.com/763 Reviewed-by: Lasse Holmstedt Reviewed-by: Paul Olav Tvete <paul.tvete@nokia.com>
This commit is contained in:
parent
25beb403ff
commit
9057cad32f
@ -36,71 +36,64 @@ struct wl_client;
|
||||
|
||||
struct wl_windowmanager;
|
||||
|
||||
struct wl_proxy;
|
||||
|
||||
extern void
|
||||
wl_proxy_marshal(struct wl_proxy *p, uint32_t opcode, ...);
|
||||
extern struct wl_proxy *
|
||||
wl_proxy_create(struct wl_proxy *factory,
|
||||
const struct wl_interface *interface);
|
||||
extern struct wl_proxy *
|
||||
wl_proxy_create_for_id(struct wl_display *display,
|
||||
const struct wl_interface *interface, uint32_t id);
|
||||
extern void
|
||||
wl_proxy_destroy(struct wl_proxy *proxy);
|
||||
|
||||
extern int
|
||||
wl_proxy_add_listener(struct wl_proxy *proxy,
|
||||
void (**implementation)(void), void *data);
|
||||
|
||||
extern void
|
||||
wl_proxy_set_user_data(struct wl_proxy *proxy, void *user_data);
|
||||
|
||||
extern void *
|
||||
wl_proxy_get_user_data(struct wl_proxy *proxy);
|
||||
|
||||
extern const struct wl_interface wl_windowmanager_interface;
|
||||
|
||||
#define wl_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS 0
|
||||
#define wl_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN 1
|
||||
struct wl_windowmanager_listener {
|
||||
void (*client_onscreen_visibility)(void *data,
|
||||
struct wl_windowmanager *wl_windowmanager,
|
||||
int visible);
|
||||
};
|
||||
|
||||
static inline int
|
||||
wl_windowmanager_add_listener(struct wl_windowmanager *wl_windowmanager,
|
||||
const struct wl_windowmanager_listener *listener, void *data)
|
||||
{
|
||||
return wl_proxy_add_listener((struct wl_proxy *) wl_windowmanager,
|
||||
(void (**)(void)) listener, data);
|
||||
}
|
||||
|
||||
#define WL_WINDOWMANAGER_MAP_CLIENT_TO_PROCESS 0
|
||||
#define WL_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN 1
|
||||
|
||||
static inline struct wl_windowmanager *
|
||||
wl_windowmanager_create(struct wl_display *display, uint32_t id)
|
||||
wl_windowmanager_create(struct wl_display *display, uint32_t id, uint32_t version)
|
||||
{
|
||||
return (struct wl_windowmanager *)
|
||||
wl_proxy_create_for_id(display, &wl_windowmanager_interface, id);
|
||||
wl_display_bind(display, id, "wl_windowmanager", version);
|
||||
|
||||
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 *wl_authentication_token)
|
||||
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, wl_authentication_token);
|
||||
wl_proxy_marshal((struct wl_proxy *) wl_windowmanager,
|
||||
WL_WINDOWMANAGER_AUTHENTICATE_WITH_TOKEN, processid);
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -44,6 +44,14 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QEvent>
|
||||
#include <QCoreApplication>
|
||||
|
||||
const struct wl_windowmanager_listener QWaylandWindowManagerIntegration::mWindowManagerListener = {
|
||||
QWaylandWindowManagerIntegration::wlHandleOnScreenVisibilityChange,
|
||||
};
|
||||
|
||||
QWaylandWindowManagerIntegration *QWaylandWindowManagerIntegration::createIntegration(QWaylandDisplay *waylandDisplay)
|
||||
{
|
||||
return new QWaylandWindowManagerIntegration(waylandDisplay);
|
||||
@ -72,7 +80,9 @@ void QWaylandWindowManagerIntegration::wlHandleListenerGlobal(wl_display *displa
|
||||
{
|
||||
if (strcmp(interface, "wl_windowmanager") == 0) {
|
||||
QWaylandWindowManagerIntegration *integration = static_cast<QWaylandWindowManagerIntegration *>(data);
|
||||
integration->mWaylandWindowManager = wl_windowmanager_create(display, id);
|
||||
integration->mWaylandWindowManager = wl_windowmanager_create(display, id, 1);
|
||||
|
||||
wl_windowmanager_add_listener(integration->mWaylandWindowManager, &mWindowManagerListener, integration);
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,3 +100,14 @@ void QWaylandWindowManagerIntegration::authenticateWithToken(const QByteArray &t
|
||||
if (mWaylandWindowManager)
|
||||
wl_windowmanager_authenticate_with_token(mWaylandWindowManager, authToken.constData());
|
||||
}
|
||||
|
||||
void QWaylandWindowManagerIntegration::wlHandleOnScreenVisibilityChange(void *data, struct wl_windowmanager *wl_windowmanager, int visible)
|
||||
{
|
||||
QWaylandWindowManagerIntegration *integration = (QWaylandWindowManagerIntegration *)data;
|
||||
|
||||
QEvent evt(visible != 0 ? QEvent::ApplicationActivated : QEvent::ApplicationDeactivated);
|
||||
|
||||
QCoreApplication::sendEvent(QCoreApplication::instance(), &evt);
|
||||
|
||||
qDebug() << "OnScreenVisibility" << (visible != 0);
|
||||
}
|
||||
|
@ -62,9 +62,13 @@ private:
|
||||
static void wlHandleListenerGlobal(wl_display *display, uint32_t id,
|
||||
const char *interface, uint32_t version, void *data);
|
||||
|
||||
static void wlHandleOnScreenVisibilityChange(void *data, struct wl_windowmanager *wl_windowmanager, int visible);
|
||||
private:
|
||||
|
||||
QWaylandDisplay *mWaylandDisplay;
|
||||
struct wl_windowmanager *mWaylandWindowManager;
|
||||
|
||||
static const struct wl_windowmanager_listener mWindowManagerListener;
|
||||
};
|
||||
|
||||
#endif // QWAYLANDWINDOWMANAGERINTEGRATION_H
|
||||
|
@ -26,12 +26,17 @@
|
||||
#include "wayland-util.h"
|
||||
|
||||
static const struct wl_message wl_windowmanager_requests[] = {
|
||||
{ "map_client_to_process", "u" },
|
||||
{ "authenticate_with_token", "s" },
|
||||
{ "map_client_to_process", "u", NULL },
|
||||
{ "authenticate_with_token", "s", NULL },
|
||||
};
|
||||
|
||||
static const struct wl_message wl_windowmanager_events[] = {
|
||||
{ "client_onscreen_visibility", "i", NULL },
|
||||
};
|
||||
|
||||
WL_EXPORT const struct wl_interface wl_windowmanager_interface = {
|
||||
"wl_windowmanager", 1,
|
||||
ARRAY_LENGTH(wl_windowmanager_requests), wl_windowmanager_requests,
|
||||
0, NULL,
|
||||
"wl_windowmanager", 1,
|
||||
ARRAY_LENGTH(wl_windowmanager_requests), wl_windowmanager_requests,
|
||||
ARRAY_LENGTH(wl_windowmanager_events), wl_windowmanager_events,
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user