summaryrefslogtreecommitdiff
path: root/src/qtwaylandscanner/qtwaylandscanner.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qtwaylandscanner/qtwaylandscanner.cpp')
-rw-r--r--src/qtwaylandscanner/qtwaylandscanner.cpp96
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");