diff options
Diffstat (limited to 'src/qtwaylandscanner/qtwaylandscanner.cpp')
-rw-r--r-- | src/qtwaylandscanner/qtwaylandscanner.cpp | 96 |
1 files changed, 34 insertions, 62 deletions
diff --git a/src/qtwaylandscanner/qtwaylandscanner.cpp b/src/qtwaylandscanner/qtwaylandscanner.cpp index 6f1516f4..7264950e 100644 --- a/src/qtwaylandscanner/qtwaylandscanner.cpp +++ b/src/qtwaylandscanner/qtwaylandscanner.cpp @@ -75,7 +75,7 @@ bool parseOption(const char *str, Option *option) struct WaylandEnumEntry { QByteArray name; - int value; + QByteArray value; QByteArray summary; }; @@ -157,7 +157,7 @@ WaylandEnum readEnum(QXmlStreamReader &xml) if (xml.name() == "entry") { WaylandEnumEntry entry; entry.name = byteArrayValue(xml, "name"); - entry.value = intValue(xml, "value"); + entry.value = byteArrayValue(xml, "value"); entry.summary = byteArrayValue(xml, "summary"); result.entries << entry; } @@ -172,7 +172,7 @@ WaylandInterface readInterface(QXmlStreamReader &xml) { WaylandInterface interface; interface.name = byteArrayValue(xml, "name"); - interface.version = intValue(xml, "name", 1); + interface.version = intValue(xml, "version", 1); while (xml.readNextStartElement()) { if (xml.name() == "event") @@ -304,7 +304,7 @@ void printEnums(const QList<WaylandEnum> &enums) printf(" enum %s {\n", e.name.constData()); for (int i = 0; i < e.entries.size(); ++i) { const WaylandEnumEntry &entry = e.entries.at(i); - printf(" %s_%s = %d", e.name.constData(), entry.name.constData(), entry.value); + printf(" %s_%s = %s", e.name.constData(), entry.name.constData(), entry.value.constData()); if (i < e.entries.size() - 1) printf(","); if (!entry.summary.isNull()) @@ -364,10 +364,19 @@ void process(QXmlStreamReader &xml) printf("#define %s\n", inclusionGuard.constData()); printf("\n"); printf("#include \"wayland-server.h\"\n"); - printf("#include \"wayland-server-protocol.h\"\n"); printf("#include \"wayland-%s-server-protocol.h\"\n", QByteArray(protocolName).replace('_', '-').constData()); printf("#include <QByteArray>\n"); + printf("#include <QMultiMap>\n"); printf("#include <QString>\n"); + + printf("\n"); + printf("#ifndef WAYLAND_VERSION_CHECK\n"); + printf("#define WAYLAND_VERSION_CHECK(major, minor, micro) \\\n"); + printf(" ((WAYLAND_VERSION_MAJOR > (major)) || \\\n"); + printf(" (WAYLAND_VERSION_MAJOR == (major) && WAYLAND_VERSION_MINOR > (minor)) || \\\n"); + printf(" (WAYLAND_VERSION_MAJOR == (major) && WAYLAND_VERSION_MINOR == (minor) && WAYLAND_VERSION_MICRO >= (micro)))\n"); + printf("#endif\n"); + printf("\n"); printf("QT_BEGIN_NAMESPACE\n"); printf("\n"); @@ -386,7 +395,6 @@ void process(QXmlStreamReader &xml) printf(" class %s\n {\n", interfaceName); printf(" public:\n"); - printf(" %s(struct ::wl_client *client, struct ::wl_resource *resource, int id);\n", interfaceName); printf(" %s(struct ::wl_client *client, int id);\n", interfaceName); printf(" %s(struct ::wl_display *display);\n", interfaceName); printf(" %s();\n", interfaceName); @@ -407,7 +415,6 @@ void process(QXmlStreamReader &xml) printf(" static Resource *fromResource(struct ::wl_resource *resource) { return static_cast<Resource *>(resource->data); }\n"); printf(" };\n"); printf("\n"); - printf(" void init(struct ::wl_client *client, struct ::wl_resource *resource, int id);\n"); printf(" void init(struct ::wl_client *client, int id);\n"); printf(" void init(struct ::wl_display *display);\n"); printf("\n"); @@ -417,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<struct ::wl_client*, Resource*> resourceMap() { return m_resource_map; }\n"); + printf(" const QMultiMap<struct ::wl_client*, Resource*> 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"); @@ -462,7 +469,7 @@ void process(QXmlStreamReader &xml) printf(" static void bind_func(struct ::wl_client *client, void *data, uint32_t version, uint32_t id);\n"); printf(" static void destroy_func(struct ::wl_resource *client_resource);\n"); printf("\n"); - printf(" Resource *bind(struct ::wl_client *client, struct ::wl_resource *resource, uint32_t id);\n"); + printf(" Resource *bind(struct ::wl_client *client, uint32_t id);\n"); if (hasRequests) { printf("\n"); @@ -479,9 +486,8 @@ void process(QXmlStreamReader &xml) } printf("\n"); + printf(" QMultiMap<struct ::wl_client*, Resource*> m_resource_map;\n"); printf(" Resource *m_resource;\n"); - printf(" bool m_ownResource;\n"); - printf(" struct ::wl_list m_resource_list;\n"); printf(" struct ::wl_global *m_global;\n"); printf(" };\n"); @@ -520,41 +526,29 @@ void process(QXmlStreamReader &xml) QByteArray stripped = stripInterfaceName(interface.name); const char *interfaceNameStripped = stripped.constData(); - printf(" %s::%s(struct ::wl_client *client, struct ::wl_resource *resource, int id)\n", interfaceName, interfaceName); - printf(" : m_resource(0)\n"); - printf(" , m_ownResource(false)\n"); - printf(" , m_global(0)\n"); - printf(" {\n"); - printf(" wl_list_init(&m_resource_list);\n"); - printf(" init(client, resource, id);\n"); - printf(" }\n"); - printf("\n"); - printf(" %s::%s(struct ::wl_client *client, int id)\n", interfaceName, interfaceName); - printf(" : m_resource(0)\n"); - printf(" , m_ownResource(true)\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_ownResource(true)\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"); @@ -563,28 +557,16 @@ void process(QXmlStreamReader &xml) printf(" }\n"); printf("\n"); - printf(" void %s::init(struct ::wl_client *client, struct ::wl_resource *resource, int id)\n", interfaceName); - printf(" {\n"); - printf(" m_resource = bind(client, resource, id);\n"); - printf(" }\n"); - printf("\n"); - printf(" void %s::init(struct ::wl_client *client, int id)\n", interfaceName); printf(" {\n"); - printf(" m_resource = bind(client, 0, id);\n"); + printf(" m_resource = bind(client, id);\n"); printf(" }\n"); printf("\n"); 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, 0, id);\n"); - printf(" wl_list_insert(resource_list, &resource->handle->link);\n"); + printf(" Resource *resource = bind(client, id);\n"); + printf(" m_resource_map.insert(client, resource);\n"); printf(" return resource;\n"); printf(" }\n"); printf("\n"); @@ -614,7 +596,7 @@ void process(QXmlStreamReader &xml) printf(" void %s::bind_func(struct ::wl_client *client, void *data, uint32_t version, uint32_t id)\n", interfaceName); printf(" {\n"); printf(" Q_UNUSED(version);\n"); - printf(" static_cast<%s *>(data)->bind(client, 0, id);\n", interfaceName); + printf(" static_cast<%s *>(data)->add(client, id);\n", interfaceName); printf(" }\n"); printf("\n"); @@ -622,13 +604,12 @@ void process(QXmlStreamReader &xml) printf(" {\n"); printf(" Resource *resource = Resource::fromResource(client_resource);\n"); printf(" %s *that = resource->%s;\n", interfaceName, interfaceNameStripped); - printf(" bool ownResource = that->m_ownResource;\n"); + 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 (ownResource)\n"); - printf(" free(client_resource);\n"); + printf("#if !WAYLAND_VERSION_CHECK(1, 2, 0)\n"); + printf(" free(client_resource);\n"); + printf("#endif\n"); printf(" }\n"); printf("\n"); @@ -636,25 +617,16 @@ void process(QXmlStreamReader &xml) QByteArray interfaceMember = hasRequests ? "&m_" + interface.name + "_interface" : QByteArray("0"); - printf(" %s::Resource *%s::bind(struct ::wl_client *client, struct ::wl_resource *handle, uint32_t id)\n", interfaceName, interfaceName); + printf(" %s::Resource *%s::bind(struct ::wl_client *client, uint32_t id)\n", interfaceName, interfaceName); printf(" {\n"); printf(" Resource *resource = %s_allocate();\n", interfaceNameStripped); printf(" resource->%s = this;\n", interfaceNameStripped); printf("\n"); - printf(" if (handle) {\n"); - printf(" handle->object.id = id;\n"); - printf(" handle->object.interface = &::%s_interface;\n", interfaceName); - printf(" handle->object.implementation = (void (**)(void))%s;\n", interfaceMember.constData()); - printf(" handle->data = resource;\n"); - printf(" wl_client_add_resource(client, handle);\n"); - printf(" } else {\n"); - printf(" handle = wl_client_add_object(client, &::%s_interface, %s, id, resource);\n", interfaceName, interfaceMember.constData()); - printf(" }\n"); + printf(" struct ::wl_resource *handle = wl_client_add_object(client, &::%s_interface, %s, id, resource);\n", interfaceName, interfaceMember.constData()); printf("\n"); 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"); |