Implemented on-screen visibility handling via wayland
authorMartin Zielinski <martin.zielinski@nokia.com>
Mon, 27 Jun 2011 07:23:13 +0000 (09:23 +0200)
committerQt by Nokia <qt-info@nokia.com>
Fri, 1 Jul 2011 08:17:54 +0000 (10:17 +0200)
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>
src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanager-client-protocol.h
src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.cpp
src/plugins/platforms/wayland/windowmanager_integration/qwaylandwindowmanagerintegration.h
src/plugins/platforms/wayland/windowmanager_integration/wayland-windowmanager-protocol.c

index 73673ae..8b238fb 100644 (file)
@@ -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
index 4236f39..1889d05 100644 (file)
 
 #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);
+}
index 0e3781d..ac76fd6 100644 (file)
@@ -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
index 0250801..e759b3a 100644 (file)
 #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,
 };
+