diff options
Diffstat (limited to 'src/compositor/windowmanagerprotocol')
-rw-r--r-- | src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp | 76 | ||||
-rw-r--r-- | src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h | 37 |
2 files changed, 33 insertions, 80 deletions
diff --git a/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp b/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp index e607d636a..f2fa21407 100644 --- a/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp +++ b/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.cpp @@ -40,13 +40,12 @@ #include "waylandwindowmanagerintegration.h" -#include "wayland_wrapper/qwldisplay_p.h" -#include "wayland_wrapper/qwlcompositor_p.h" +#include <wayland_wrapper/qwldisplay_p.h> +#include <wayland_wrapper/qwlcompositor_p.h> -#include "compositor_api/qwaylandcompositor.h" +#include <compositor_api/qwaylandcompositor.h> -#include "wayland-server.h" -#include "wayland-windowmanager-server-protocol.h" +#include <wayland-server.h> #include <QUrl> @@ -54,6 +53,7 @@ QT_BEGIN_NAMESPACE WindowManagerServerIntegration::WindowManagerServerIntegration(QWaylandCompositor *compositor, QObject *parent) : QObject(parent) + , QtWaylandServer::qt_windowmanager() , m_showIsFullScreen(false) , m_compositor(compositor) { @@ -65,75 +65,47 @@ WindowManagerServerIntegration::~WindowManagerServerIntegration() void WindowManagerServerIntegration::initialize(QtWayland::Display *waylandDisplay) { - wl_display_add_global(waylandDisplay->handle(),&qt_windowmanager_interface,this,WindowManagerServerIntegration::bind_func); + init(waylandDisplay->handle()); } void WindowManagerServerIntegration::setShowIsFullScreen(bool value) { m_showIsFullScreen = value; - struct wl_resource *resource; - wl_list_for_each(resource,&client_resources, link) { - qt_windowmanager_send_hints(resource, int32_t(m_showIsFullScreen)); + Q_FOREACH (Resource *resource, resourceMap().values()) { + send_hints(resource->handle, static_cast<int32_t>(m_showIsFullScreen)); } } void WindowManagerServerIntegration::sendQuitMessage(wl_client *client) { - struct wl_resource *resource; - wl_list_for_each(resource, &client_resources, link) { - if (resource->client == client) { - qt_windowmanager_send_quit(resource); - return; - } - } -} + Resource *resource = resourceMap().value(client); -struct WindowManagerServerIntegrationClientData -{ - QByteArray url; - WindowManagerServerIntegration *integration; -}; + if (resource) + send_quit(resource->handle); +} -void WindowManagerServerIntegration::bind_func(struct wl_client *client, void *data, - uint32_t version, uint32_t id) +void WindowManagerServerIntegration::windowmanager_bind_resource(Resource *resource) { - Q_UNUSED(version); - - WindowManagerServerIntegrationClientData *clientData = new WindowManagerServerIntegrationClientData; - clientData->integration = static_cast<WindowManagerServerIntegration *>(data); - - wl_resource *resource = wl_client_add_object(client,&qt_windowmanager_interface,&windowmanager_interface,id,clientData); - resource->destroy = WindowManagerServerIntegration::destroy_resource; - clientData->integration->registerResource(resource); - qt_windowmanager_send_hints(resource, int32_t(clientData->integration->m_showIsFullScreen)); + send_hints(resource->handle, static_cast<int32_t>(m_showIsFullScreen)); } -void WindowManagerServerIntegration::destroy_resource(wl_resource *resource) +void WindowManagerServerIntegration::windowmanager_destroy_resource(Resource *resource) { - WindowManagerServerIntegrationClientData *data = static_cast<WindowManagerServerIntegrationClientData *>(resource->data); - - delete data; - free(resource); + m_urls.remove(resource); } -void WindowManagerServerIntegration::open_url(struct wl_client *client, - struct wl_resource *window_mgr_resource, - uint32_t remaining, - const char *url) +void WindowManagerServerIntegration::windowmanager_open_url(Resource *resource, uint32_t remaining, const QString &newUrl) { - WindowManagerServerIntegrationClientData *data = static_cast<WindowManagerServerIntegrationClientData *>(window_mgr_resource->data); - WindowManagerServerIntegration *window_mgr = data->integration; + QString url = m_urls.value(resource, QString()); - data->url.append(url); + url.append(newUrl); - if (!remaining) { - window_mgr->m_compositor->openUrl(client, QUrl(QString::fromUtf8(data->url))); - data->url = QByteArray(); + if (remaining) + m_urls.insert(resource, url); + else { + m_urls.remove(resource); + m_compositor->openUrl(resource->client(), QUrl(url)); } } -const struct qt_windowmanager_interface WindowManagerServerIntegration::windowmanager_interface = { - WindowManagerServerIntegration::open_url -}; - QT_END_NAMESPACE diff --git a/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h b/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h index 10a29a47e..ccf5d4e8d 100644 --- a/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h +++ b/src/compositor/windowmanagerprotocol/waylandwindowmanagerintegration.h @@ -42,17 +42,10 @@ #define WAYLANDWINDOWMANAGERINTEGRATION_H #include <QtCompositor/qwaylandexport.h> -#include <QtCompositor/qwaylandresourcecollection.h> - -#include <qwindowdefs.h> -#include <stdint.h> +#include "qwayland-server-windowmanager.h" #include <QObject> #include <QMap> -#include <QVariant> - -struct wl_client; -struct wl_object; QT_BEGIN_NAMESPACE @@ -60,15 +53,13 @@ namespace QtWayland { class Display; } -class WindowManagerObject; -class WaylandManagedClient; class QWaylandCompositor; -class Q_COMPOSITOR_EXPORT WindowManagerServerIntegration : public QObject, private QtWayland::ResourceCollection +class Q_COMPOSITOR_EXPORT WindowManagerServerIntegration : public QObject, public QtWaylandServer::qt_windowmanager { Q_OBJECT public: - WindowManagerServerIntegration(QWaylandCompositor *compositor, QObject *parent = 0); + explicit WindowManagerServerIntegration(QWaylandCompositor *compositor, QObject *parent = 0); ~WindowManagerServerIntegration(); void initialize(QtWayland::Display *waylandDisplay); @@ -76,25 +67,15 @@ public: void setShowIsFullScreen(bool value); void sendQuitMessage(wl_client *client); +protected: + void windowmanager_bind_resource(Resource *resource) Q_DECL_OVERRIDE; + void windowmanager_destroy_resource(Resource *resource) Q_DECL_OVERRIDE; + void windowmanager_open_url(Resource *resource, uint32_t remaining, const QString &url) Q_DECL_OVERRIDE; + private: bool m_showIsFullScreen; QWaylandCompositor *m_compositor; - - static void bind_func(struct wl_client *client, void *data, - uint32_t version, uint32_t id); - - static void destroy_resource(wl_resource *resource); - static void map_client_to_process(struct wl_client *client, - struct wl_resource *windowMgrResource, - uint32_t processId); - static void authenticate_with_token(struct wl_client *client, - struct wl_resource *windowMgrResource, - const char *wl_authentication_token); - static void open_url(struct wl_client *client, - struct wl_resource *window_mgr_resource, - uint32_t remaining, - const char *url); - static const struct qt_windowmanager_interface windowmanager_interface; + QMap<Resource*, QString> m_urls; }; QT_END_NAMESPACE |