From 988785c857b7cf4f468561df7a9d4c52f6716340 Mon Sep 17 00:00:00 2001 From: Jan Arne Petersen Date: Thu, 22 Aug 2013 23:22:24 +0200 Subject: [PATCH] Use QMultiMap instead of wl_list for resources Change generated code in qtwaylandscanner to generate resourceMap() methods returning a QMultiMap. Adapt code using resource lists to use the map instead. Remove Compositor::resourceForSurface(). Change-Id: Id41a1712f9c2477c1a1af843bba2795dd90391e5 Reviewed-by: Andy Nichols Reviewed-by: Andrew Knight --- .../qtwaylandscanner/qtwaylandscanner.cpp | 31 +++++++------------ tests/auto/wayland/mockinput.cpp | 22 ++----------- 2 files changed, 14 insertions(+), 39 deletions(-) diff --git a/src/tools/qtwaylandscanner/qtwaylandscanner.cpp b/src/tools/qtwaylandscanner/qtwaylandscanner.cpp index 0df2d0c37fd..5de7cb11d1d 100644 --- a/src/tools/qtwaylandscanner/qtwaylandscanner.cpp +++ b/src/tools/qtwaylandscanner/qtwaylandscanner.cpp @@ -366,6 +366,7 @@ void process(QXmlStreamReader &xml) printf("#include \"wayland-server.h\"\n"); printf("#include \"wayland-%s-server-protocol.h\"\n", QByteArray(protocolName).replace('_', '-').constData()); printf("#include \n"); + printf("#include \n"); printf("#include \n"); printf("\n"); @@ -423,8 +424,8 @@ void process(QXmlStreamReader &xml) printf(" Resource *resource() { return m_resource; }\n"); printf(" const Resource *resource() const { return m_resource; }\n"); printf("\n"); - printf(" struct ::wl_list *resourceList() { return &m_resource_list; }\n"); - printf(" const struct ::wl_list *resourceList() const { return &m_resource_list; }\n"); + printf(" QMultiMap resourceMap() { return m_resource_map; }\n"); + printf(" const QMultiMap resourceMap() const { return m_resource_map; }\n"); printf("\n"); printf(" bool isGlobal() const { return m_global != 0; }\n"); printf(" bool isResource() const { return m_resource != 0; }\n"); @@ -485,8 +486,8 @@ void process(QXmlStreamReader &xml) } printf("\n"); + printf(" QMultiMap m_resource_map;\n"); printf(" Resource *m_resource;\n"); - printf(" struct ::wl_list m_resource_list;\n"); printf(" struct ::wl_global *m_global;\n"); printf(" };\n"); @@ -526,28 +527,28 @@ void process(QXmlStreamReader &xml) const char *interfaceNameStripped = stripped.constData(); printf(" %s::%s(struct ::wl_client *client, int id)\n", interfaceName, interfaceName); - printf(" : m_resource(0)\n"); + printf(" : m_resource_map()\n"); + printf(" , m_resource(0)\n"); printf(" , m_global(0)\n"); printf(" {\n"); - printf(" wl_list_init(&m_resource_list);\n"); printf(" init(client, id);\n"); printf(" }\n"); printf("\n"); printf(" %s::%s(struct ::wl_display *display)\n", interfaceName, interfaceName); - printf(" : m_resource(0)\n"); + printf(" : m_resource_map()\n"); + printf(" , m_resource(0)\n"); printf(" , m_global(0)\n"); printf(" {\n"); - printf(" wl_list_init(&m_resource_list);\n"); printf(" init(display);\n"); printf(" }\n"); printf("\n"); printf(" %s::%s()\n", interfaceName, interfaceName); - printf(" : m_resource(0)\n"); + printf(" : m_resource_map()\n"); + printf(" , m_resource(0)\n"); printf(" , m_global(0)\n"); printf(" {\n"); - printf(" wl_list_init(&m_resource_list);\n"); printf(" }\n"); printf("\n"); @@ -564,14 +565,8 @@ void process(QXmlStreamReader &xml) printf(" %s::Resource *%s::add(struct ::wl_client *client, int id)\n", interfaceName, interfaceName); printf(" {\n"); - printf(" return add(&m_resource_list, client, id);\n"); - printf(" }\n"); - printf("\n"); - - printf(" %s::Resource *%s::add(struct wl_list *resource_list, struct ::wl_client *client, int id)\n", interfaceName, interfaceName); - printf(" {\n"); printf(" Resource *resource = bind(client, id);\n"); - printf(" wl_list_insert(resource_list, &resource->handle->link);\n"); + printf(" m_resource_map.insert(client, resource);\n"); printf(" return resource;\n"); printf(" }\n"); printf("\n"); @@ -609,9 +604,8 @@ void process(QXmlStreamReader &xml) printf(" {\n"); printf(" Resource *resource = Resource::fromResource(client_resource);\n"); printf(" %s *that = resource->%s;\n", interfaceName, interfaceNameStripped); + printf(" that->m_resource_map.remove(resource->client(), resource);\n"); printf(" that->%s_destroy_resource(resource);\n", interfaceNameStripped); - printf(" if (client_resource->link.next)\n"); - printf(" wl_list_remove(&client_resource->link);\n"); printf(" delete resource;\n"); printf("#if !WAYLAND_VERSION_CHECK(1, 2, 0)\n"); printf(" free(client_resource);\n"); @@ -633,7 +627,6 @@ void process(QXmlStreamReader &xml) printf(" handle->destroy = destroy_func;\n"); printf(" resource->handle = handle;\n"); printf(" %s_bind_resource(resource);\n", interfaceNameStripped); - printf(" wl_list_init(&resource->handle->link);\n"); printf(" return resource;\n"); printf(" }\n"); diff --git a/tests/auto/wayland/mockinput.cpp b/tests/auto/wayland/mockinput.cpp index ac2b666b43f..40b01317f9a 100644 --- a/tests/auto/wayland/mockinput.cpp +++ b/tests/auto/wayland/mockinput.cpp @@ -137,22 +137,6 @@ Keyboard::~Keyboard() { } -static wl_resource *resourceForSurface(wl_list *resourceList, Surface *surface) -{ - if (!surface) - return 0; - - wl_resource *r; - wl_client *surfaceClient = surface->resource()->client(); - - wl_list_for_each(r, resourceList, link) { - if (r->client == surfaceClient) - return r; - } - - return 0; -} - void Keyboard::setFocus(Surface *surface) { if (m_focusResource && m_focus != surface) { @@ -160,8 +144,7 @@ void Keyboard::setFocus(Surface *surface) send_leave(m_focusResource->handle, serial, m_focus->resource()->handle); } - struct ::wl_resource *r = resourceForSurface(resourceList(), surface); - Resource *resource = r ? Resource::fromResource(r) : 0; + Resource *resource = surface ? resourceMap().value(surface->resource()->client()) : 0; if (resource && (m_focus != surface || m_focusResource != resource)) { uint32_t serial = m_compositor->nextSerial(); @@ -199,8 +182,7 @@ void Pointer::setFocus(Surface *surface, const QPoint &pos) send_leave(m_focusResource->handle, serial, m_focus->resource()->handle); } - struct ::wl_resource *r = resourceForSurface(resourceList(), surface); - Resource *resource = r ? Resource::fromResource(r) : 0; + Resource *resource = surface ? resourceMap().value(surface->resource()->client()) : 0; if (resource && (m_focus != surface || resource != m_focusResource)) { uint32_t serial = m_compositor->nextSerial();