From 9057cad32f22e878701a55e41f1730dac0ec1797 Mon Sep 17 00:00:00 2001 From: Martin Zielinski Date: Mon, 27 Jun 2011 09:23:13 +0200 Subject: 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 --- .../qwaylandwindowmanager-client-protocol.h | 63 ++++++++++------------ .../qwaylandwindowmanagerintegration.cpp | 23 +++++++- .../qwaylandwindowmanagerintegration.h | 4 ++ .../wayland-windowmanager-protocol.c | 15 ++++-- 4 files changed, 64 insertions(+), 41 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanager-client-protocol.h b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanager-client-protocol.h index 73673aef6f..8b238fb6aa 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanager-client-protocol.h +++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanager-client-protocol.h @@ -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 const struct wl_interface wl_windowmanager_interface; -extern void * -wl_proxy_get_user_data(struct wl_proxy *proxy); +struct wl_windowmanager_listener { + void (*client_onscreen_visibility)(void *data, + struct wl_windowmanager *wl_windowmanager, + int visible); +}; -extern const struct wl_interface wl_windowmanager_interface; +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 +#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 diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp index 4236f395cb..1889d05a29 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp +++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp @@ -44,6 +44,14 @@ #include +#include +#include +#include + +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(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); +} diff --git a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h index 0e3781dbe2..ac76fd6211 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h +++ b/src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h @@ -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 diff --git a/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-protocol.c b/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-protocol.c index 0250801b1f..e759b3ac1b 100644 --- a/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-protocol.c +++ b/src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-protocol.c @@ -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, }; + -- cgit v1.2.3