400 QFile file(m_protocolFilePath);
401 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
402 fprintf(stderr,
"Unable to open file %s\n", m_protocolFilePath.constData());
406 m_xml =
new QXmlStreamReader(&file);
407 if (!m_xml->readNextStartElement())
410 if (m_xml->name() != u"protocol") {
411 m_xml->raiseError(QStringLiteral(
"The file is not a wayland protocol file."));
415 m_protocolName = byteArrayValue(*m_xml,
"name");
417 if (m_protocolName.isEmpty()) {
418 m_xml->raiseError(QStringLiteral(
"Missing protocol name."));
425 QByteArray preProcessorProtocolName = QByteArray(m_protocolName).toUpper();
427 const QByteArray fileBaseName = QFileInfo(file).completeBaseName().toLocal8Bit();
429 std::vector<WaylandInterface> interfaces;
431 while (m_xml->readNextStartElement()) {
432 if (m_xml->name() == u"interface")
433 interfaces.push_back(readInterface(*m_xml));
435 m_xml->skipCurrentElement();
438 if (m_xml->hasError())
441 printf(
"// This file was generated by qtwaylandscanner\n");
442 printf(
"// source file is %s\n\n", qPrintable(QFileInfo(file).fileName()));
444 for (
auto b : std::as_const(m_includes))
445 printf(
"#include %s\n", b.constData());
447 auto printExportMacro = [
this](
const char *prefix,
const QByteArray &preProcessorProtocolName) {
448 QByteArray exportMacro = prefix + preProcessorProtocolName +
"_EXPORT";
449 printf(
"#if !defined(%s)\n", exportMacro.constData());
450 printf(
"# if defined(QT_SHARED) && !defined(QT_STATIC)\n");
451 if (m_buildMacro.isEmpty()) {
452 printf(
"# define %s Q_DECL_EXPORT\n", exportMacro.constData());
454 printf(
"# if defined(%s)\n", m_buildMacro.constData());
455 printf(
"# define %s Q_DECL_EXPORT\n", exportMacro.constData());
457 printf(
"# define %s Q_DECL_IMPORT\n", exportMacro.constData());
461 printf(
"# define %s\n", exportMacro.constData());
467 if (m_option == ServerHeader) {
468 QByteArray inclusionGuard = QByteArray(
"QT_WAYLAND_SERVER_") + preProcessorProtocolName.constData();
469 printf(
"#ifndef %s\n", inclusionGuard.constData());
470 printf(
"#define %s\n", inclusionGuard.constData());
472 printf(
"#include \"wayland-server-core.h\"\n");
473 if (m_headerPath.isEmpty())
474 printf(
"#include \"wayland-%s-server-protocol.h\"\n", fileBaseName.constData());
476 printf(
"#include <%s/wayland-%s-server-protocol.h>\n", m_headerPath.constData(), fileBaseName.constData());
477 printf(
"#include <QByteArray>\n");
478 printf(
"#include <QMultiMap>\n");
479 printf(
"#include <QString>\n");
482 printf(
"#ifndef WAYLAND_VERSION_CHECK\n");
483 printf(
"#define WAYLAND_VERSION_CHECK(major, minor, micro) \\\n");
484 printf(
" ((WAYLAND_VERSION_MAJOR > (major)) || \\\n");
485 printf(
" (WAYLAND_VERSION_MAJOR == (major) && WAYLAND_VERSION_MINOR > (minor)) || \\\n");
486 printf(
" (WAYLAND_VERSION_MAJOR == (major) && WAYLAND_VERSION_MINOR == (minor) && WAYLAND_VERSION_MICRO >= (micro)))\n");
490 printf(
"QT_BEGIN_NAMESPACE\n");
491 printf(
"QT_WARNING_PUSH\n");
492 printf(
"QT_WARNING_DISABLE_GCC(\"-Wmissing-field-initializers\")\n");
493 printf(
"QT_WARNING_DISABLE_CLANG(\"-Wmissing-field-initializers\")\n");
494 QByteArray serverExport;
495 if (m_headerPath.size())
496 serverExport = printExportMacro(
"Q_WAYLAND_SERVER_", preProcessorProtocolName);
498 printf(
"namespace QtWaylandServer {\n");
500 bool needsNewLine =
false;
501 for (
const WaylandInterface &interface : interfaces) {
503 if (ignoreInterface(interface.name))
510 const char *interfaceName = interface.name.constData();
512 QByteArray stripped = stripInterfaceName(interface.name);
513 const char *interfaceNameStripped = stripped.constData();
515 printf(
" class %s %s\n {\n", serverExport.constData(), interfaceName);
516 printf(
" public:\n");
517 printf(
" %s(struct ::wl_client *client, uint32_t id, int version);\n", interfaceName);
518 printf(
" %s(struct ::wl_display *display, int version);\n", interfaceName);
519 printf(
" %s(struct ::wl_resource *resource);\n", interfaceName);
520 printf(
" %s();\n", interfaceName);
522 printf(
" virtual ~%s();\n", interfaceName);
524 printf(
" class Resource\n");
526 printf(
" public:\n");
527 printf(
" Resource() : %s_object(nullptr), handle(nullptr) {}\n", interfaceNameStripped);
528 printf(
" virtual ~Resource() {}\n");
530 printf(
" %s *%s_object;\n", interfaceName, interfaceNameStripped);
531 printf(
" %s *object() { return %s_object; } \n", interfaceName, interfaceNameStripped);
532 printf(
" struct ::wl_resource *handle;\n");
534 printf(
" struct ::wl_client *client() const { return wl_resource_get_client(handle); }\n");
535 printf(
" int version() const { return wl_resource_get_version(handle); }\n");
537 printf(
" static Resource *fromResource(struct ::wl_resource *resource);\n");
540 printf(
" void init(struct ::wl_client *client, uint32_t id, int version);\n");
541 printf(
" void init(struct ::wl_display *display, int version);\n");
542 printf(
" void init(struct ::wl_resource *resource);\n");
544 printf(
" Resource *add(struct ::wl_client *client, int version);\n");
545 printf(
" Resource *add(struct ::wl_client *client, uint32_t id, int version);\n");
546 printf(
" Resource *add(struct wl_list *resource_list, struct ::wl_client *client, uint32_t id, int version);\n");
548 printf(
" Resource *resource() { return m_resource; }\n");
549 printf(
" const Resource *resource() const { return m_resource; }\n");
551 printf(
" QMultiMap<struct ::wl_client*, Resource*> resourceMap() { return m_resource_map; }\n");
552 printf(
" const QMultiMap<struct ::wl_client*, Resource*> resourceMap() const { return m_resource_map; }\n");
554 printf(
" bool isGlobal() const { return m_global != nullptr; }\n");
555 printf(
" bool isResource() const { return m_resource != nullptr; }\n");
557 printf(
" static const struct ::wl_interface *interface();\n");
558 printf(
" static QByteArray interfaceName() { return interface()->name; }\n");
559 printf(
" static int interfaceVersion() { return interface()->version; }\n");
562 printEnums(interface.enums);
564 bool hasEvents = !interface.events.empty();
568 for (
const WaylandEvent &e : interface.events) {
569 printf(
" void send_");
572 printf(
" void send_");
573 printEvent(e,
false,
true);
579 printf(
" protected:\n");
580 printf(
" virtual Resource *%s_allocate();\n", interfaceNameStripped);
582 printf(
" virtual void %s_bind_resource(Resource *resource);\n", interfaceNameStripped);
583 printf(
" virtual void %s_destroy_resource(Resource *resource);\n", interfaceNameStripped);
585 bool hasRequests = !interface.requests.empty();
589 for (
const WaylandEvent &e : interface.requests) {
590 printf(
" virtual void %s_", interfaceNameStripped);
597 printf(
" private:\n");
598 printf(
" static void bind_func(struct ::wl_client *client, void *data, uint32_t version, uint32_t id);\n");
599 printf(
" static void destroy_func(struct ::wl_resource *client_resource);\n");
600 printf(
" static void display_destroy_func(struct ::wl_listener *listener, void *data);\n");
602 printf(
" Resource *bind(struct ::wl_client *client, uint32_t id, int version);\n");
603 printf(
" Resource *bind(struct ::wl_resource *handle);\n");
607 printf(
" static const struct ::%s_interface m_%s_interface;\n", interfaceName, interfaceName);
610 for (
const WaylandEvent &e : interface.requests) {
611 printf(
" static void ");
613 printEventHandlerSignature(e, interfaceName);
619 printf(
" QMultiMap<struct ::wl_client*, Resource*> m_resource_map;\n");
620 printf(
" Resource *m_resource;\n");
621 printf(
" struct ::wl_global *m_global;\n");
622 printf(
" struct DisplayDestroyedListener : ::wl_listener {\n");
623 printf(
" %s *parent;\n", interfaceName);
625 printf(
" DisplayDestroyedListener m_displayDestroyedListener;\n");
631 printf(
"QT_WARNING_POP\n");
632 printf(
"QT_END_NAMESPACE\n");
637 if (m_option == ServerCode) {
638 if (m_headerPath.isEmpty())
639 printf(
"#include \"qwayland-server-%s.h\"\n", fileBaseName.constData());
641 printf(
"#include <%s/qwayland-server-%s.h>\n", m_headerPath.constData(), fileBaseName.constData());
643 printf(
"QT_BEGIN_NAMESPACE\n");
644 printf(
"QT_WARNING_PUSH\n");
645 printf(
"QT_WARNING_DISABLE_GCC(\"-Wmissing-field-initializers\")\n");
646 printf(
"QT_WARNING_DISABLE_CLANG(\"-Wmissing-field-initializers\")\n");
648 printf(
"namespace QtWaylandServer {\n");
650 bool needsNewLine =
false;
651 for (
const WaylandInterface &interface : interfaces) {
653 if (ignoreInterface(interface.name))
661 const char *interfaceName = interface.name.constData();
663 QByteArray stripped = stripInterfaceName(interface.name);
664 const char *interfaceNameStripped = stripped.constData();
666 printf(
" %s::%s(struct ::wl_client *client, uint32_t id, int version)\n", interfaceName, interfaceName);
667 printf(
" : m_resource_map()\n");
668 printf(
" , m_resource(nullptr)\n");
669 printf(
" , m_global(nullptr)\n");
671 printf(
" init(client, id, version);\n");
675 printf(
" %s::%s(struct ::wl_display *display, int version)\n", interfaceName, interfaceName);
676 printf(
" : m_resource_map()\n");
677 printf(
" , m_resource(nullptr)\n");
678 printf(
" , m_global(nullptr)\n");
680 printf(
" init(display, version);\n");
684 printf(
" %s::%s(struct ::wl_resource *resource)\n", interfaceName, interfaceName);
685 printf(
" : m_resource_map()\n");
686 printf(
" , m_resource(nullptr)\n");
687 printf(
" , m_global(nullptr)\n");
689 printf(
" init(resource);\n");
693 printf(
" %s::%s()\n", interfaceName, interfaceName);
694 printf(
" : m_resource_map()\n");
695 printf(
" , m_resource(nullptr)\n");
696 printf(
" , m_global(nullptr)\n");
701 printf(
" %s::~%s()\n", interfaceName, interfaceName);
703 printf(
" for (auto resource : std::as_const(m_resource_map))\n");
704 printf(
" resource->%s_object = nullptr;\n", interfaceNameStripped);
706 printf(
" if (m_resource)\n");
707 printf(
" m_resource->%s_object = nullptr;\n", interfaceNameStripped);
709 printf(
" if (m_global) {\n");
710 printf(
" wl_global_destroy(m_global);\n");
711 printf(
" wl_list_remove(&m_displayDestroyedListener.link);\n");
716 printf(
" void %s::init(struct ::wl_client *client, uint32_t id, int version)\n", interfaceName);
718 printf(
" m_resource = bind(client, id, version);\n");
722 printf(
" void %s::init(struct ::wl_resource *resource)\n", interfaceName);
724 printf(
" m_resource = bind(resource);\n");
728 printf(
" %s::Resource *%s::add(struct ::wl_client *client, int version)\n", interfaceName, interfaceName);
730 printf(
" Resource *resource = bind(client, 0, version);\n");
731 printf(
" m_resource_map.insert(client, resource);\n");
732 printf(
" return resource;\n");
736 printf(
" %s::Resource *%s::add(struct ::wl_client *client, uint32_t id, int version)\n", interfaceName, interfaceName);
738 printf(
" Resource *resource = bind(client, id, version);\n");
739 printf(
" m_resource_map.insert(client, resource);\n");
740 printf(
" return resource;\n");
744 printf(
" void %s::init(struct ::wl_display *display, int version)\n", interfaceName);
746 printf(
" m_global = wl_global_create(display, &::%s_interface, version, this, bind_func);\n", interfaceName);
747 printf(
" m_displayDestroyedListener.notify = %s::display_destroy_func;\n", interfaceName);
748 printf(
" m_displayDestroyedListener.parent = this;\n");
749 printf(
" wl_display_add_destroy_listener(display, &m_displayDestroyedListener);\n");
753 printf(
" const struct wl_interface *%s::interface()\n", interfaceName);
755 printf(
" return &::%s_interface;\n", interfaceName);
759 printf(
" %s::Resource *%s::%s_allocate()\n", interfaceName, interfaceName, interfaceNameStripped);
761 printf(
" return new Resource;\n");
765 printf(
" void %s::%s_bind_resource(Resource *)\n", interfaceName, interfaceNameStripped);
770 printf(
" void %s::%s_destroy_resource(Resource *)\n", interfaceName, interfaceNameStripped);
775 printf(
" void %s::bind_func(struct ::wl_client *client, void *data, uint32_t version, uint32_t id)\n", interfaceName);
777 printf(
" %s *that = static_cast<%s *>(data);\n", interfaceName, interfaceName);
778 printf(
" that->add(client, id, version);\n");
782 printf(
" void %s::display_destroy_func(struct ::wl_listener *listener, void *data)\n", interfaceName);
784 printf(
" Q_UNUSED(data);\n");
785 printf(
" %s *that = static_cast<%s::DisplayDestroyedListener *>(listener)->parent;\n", interfaceName, interfaceName);
786 printf(
" that->m_global = nullptr;\n");
790 printf(
" void %s::destroy_func(struct ::wl_resource *client_resource)\n", interfaceName);
792 printf(
" Resource *resource = Resource::fromResource(client_resource);\n");
793 printf(
" Q_ASSERT(resource);\n");
794 printf(
" %s *that = resource->%s_object;\n", interfaceName, interfaceNameStripped);
795 printf(
" if (Q_LIKELY(that)) {\n");
796 printf(
" that->m_resource_map.remove(resource->client(), resource);\n");
797 printf(
" that->%s_destroy_resource(resource);\n", interfaceNameStripped);
799 printf(
" that = resource->%s_object;\n", interfaceNameStripped);
800 printf(
" if (that && that->m_resource == resource)\n");
801 printf(
" that->m_resource = nullptr;\n");
803 printf(
" delete resource;\n");
807 bool hasRequests = !interface.requests.empty();
809 QByteArray interfaceMember = hasRequests ?
"&m_" + interface.name +
"_interface" : QByteArray(
"nullptr");
813 printf(
" %s::Resource *%s::bind(struct ::wl_client *client, uint32_t id, int version)\n", interfaceName, interfaceName);
815 printf(
" Q_ASSERT_X(!wl_client_get_object(client, id), \"QWaylandObject bind\", QStringLiteral(\"binding to object %%1 more than once\").arg(id).toLocal8Bit().constData());\n");
816 printf(
" struct ::wl_resource *handle = wl_resource_create(client, &::%s_interface, version, id);\n", interfaceName);
817 printf(
" return bind(handle);\n");
821 printf(
" %s::Resource *%s::bind(struct ::wl_resource *handle)\n", interfaceName, interfaceName);
823 printf(
" Resource *resource = %s_allocate();\n", interfaceNameStripped);
824 printf(
" resource->%s_object = this;\n", interfaceNameStripped);
826 printf(
" wl_resource_set_implementation(handle, %s, resource, destroy_func);", interfaceMember.constData());
828 printf(
" resource->handle = handle;\n");
829 printf(
" %s_bind_resource(resource);\n", interfaceNameStripped);
830 printf(
" return resource;\n");
833 printf(
" %s::Resource *%s::Resource::fromResource(struct ::wl_resource *resource)\n", interfaceName, interfaceName);
835 printf(
" if (Q_UNLIKELY(!resource))\n");
836 printf(
" return nullptr;\n");
837 printf(
" if (wl_resource_instance_of(resource, &::%s_interface, %s))\n", interfaceName, interfaceMember.constData());
838 printf(
" return static_cast<Resource *>(wl_resource_get_user_data(resource));\n");
839 printf(
" return nullptr;\n");
844 printf(
" const struct ::%s_interface %s::m_%s_interface = {", interfaceName, interfaceName, interfaceName);
845 bool needsComma =
false;
846 for (
const WaylandEvent &e : interface.requests) {
851 printf(
" %s::handle_%s", interfaceName, e.name.constData());
856 for (
const WaylandEvent &e : interface.requests) {
858 printf(
" void %s::%s_", interfaceName, interfaceNameStripped);
866 for (
const WaylandEvent &e : interface.requests) {
868 printf(
" void %s::", interfaceName);
870 printEventHandlerSignature(e, interfaceName,
false);
874 printf(
" Q_UNUSED(client);\n");
875 printf(
" Resource *r = Resource::fromResource(resource);\n");
876 printf(
" if (Q_UNLIKELY(!r->%s_object)) {\n", interfaceNameStripped);
877 if (e.type ==
"destructor")
878 printf(
" wl_resource_destroy(resource);\n");
879 printf(
" return;\n");
881 printf(
" static_cast<%s *>(r->%s_object)->%s_%s(\n", interfaceName, interfaceNameStripped, interfaceNameStripped, e.name.constData());
883 for (
const WaylandArgument &a : e.arguments) {
885 QByteArray cType = waylandToCType(a.type, a.interface);
886 QByteArray qtType = waylandToQtType(a.type, a.interface, e.request);
887 const char *argumentName = a.name.constData();
889 printf(
" %s", argumentName);
890 else if (a.type ==
"string")
891 printf(
" QString::fromUtf8(%s)", argumentName);
898 for (
const WaylandEvent &e : interface.events) {
900 printf(
" void %s::send_", interfaceName);
904 printf(
" Q_ASSERT_X(m_resource, \"%s::%s\", \"Uninitialised resource\");\n", interfaceName, e.name.constData());
905 printf(
" if (Q_UNLIKELY(!m_resource)) {\n");
906 printf(
" qWarning(\"could not call %s::%s as it's not initialised\");\n", interfaceName, e.name.constData());
907 printf(
" return;\n");
909 printf(
" send_%s(\n", e.name.constData());
910 printf(
" m_resource->handle");
911 for (
const WaylandArgument &a : e.arguments) {
913 printf(
" %s", a.name.constData());
919 printf(
" void %s::send_", interfaceName);
920 printEvent(e,
false,
true);
924 for (
const WaylandArgument &a : e.arguments) {
925 if (a.type !=
"array")
927 QByteArray array = a.name +
"_data";
928 const char *arrayName = array.constData();
929 const char *variableName = a.name.constData();
930 printf(
" struct wl_array %s;\n", arrayName);
931 printf(
" %s.size = %s.size();\n", arrayName, variableName);
932 printf(
" %s.data = static_cast<void *>(const_cast<char *>(%s.constData()));\n", arrayName, variableName);
933 printf(
" %s.alloc = 0;\n", arrayName);
937 printf(
" %s_send_%s(\n", interfaceName, e.name.constData());
940 for (
const WaylandArgument &a : e.arguments) {
942 QByteArray cType = waylandToCType(a.type, a.interface);
943 QByteArray qtType = waylandToQtType(a.type, a.interface, e.request);
944 if (a.type ==
"string") {
947 printf(
"%s.isNull() ? nullptr : ", a.name.constData());
948 printf(
"%s.toUtf8().constData()", a.name.constData());
949 }
else if (a.type ==
"array")
950 printf(
" &%s_data", a.name.constData());
951 else if (cType == qtType)
952 printf(
" %s", a.name.constData());
962 printf(
"QT_WARNING_POP\n");
963 printf(
"QT_END_NAMESPACE\n");
966 if (m_option == ClientHeader) {
967 QByteArray inclusionGuard = QByteArray(
"QT_WAYLAND_") + preProcessorProtocolName.constData();
968 printf(
"#ifndef %s\n", inclusionGuard.constData());
969 printf(
"#define %s\n", inclusionGuard.constData());
971 if (m_headerPath.isEmpty())
972 printf(
"#include \"wayland-%s-client-protocol.h\"\n", fileBaseName.constData());
974 printf(
"#include <%s/wayland-%s-client-protocol.h>\n", m_headerPath.constData(), fileBaseName.constData());
975 printf(
"#include <QByteArray>\n");
976 printf(
"#include <QString>\n");
978 printf(
"struct wl_registry;\n");
980 printf(
"QT_BEGIN_NAMESPACE\n");
981 printf(
"QT_WARNING_PUSH\n");
982 printf(
"QT_WARNING_DISABLE_GCC(\"-Wmissing-field-initializers\")\n");
983 printf(
"QT_WARNING_DISABLE_CLANG(\"-Wmissing-field-initializers\")\n");
985 QByteArray clientExport;
986 if (m_headerPath.size())
987 clientExport = printExportMacro(
"Q_WAYLAND_CLIENT_", preProcessorProtocolName);
990 printf(
"namespace QtWayland {\n");
992 bool needsNewLine =
false;
993 for (
const WaylandInterface &interface : interfaces) {
995 if (ignoreInterface(interface.name))
1000 needsNewLine =
true;
1002 const char *interfaceName = interface.name.constData();
1004 QByteArray stripped = stripInterfaceName(interface.name);
1005 const char *interfaceNameStripped = stripped.constData();
1007 printf(
" class %s %s\n {\n", clientExport.constData(), interfaceName);
1008 printf(
" public:\n");
1009 printf(
" %s(struct ::wl_registry *registry, uint32_t id, int version);\n", interfaceName);
1010 printf(
" %s(struct ::%s *object);\n", interfaceName, interfaceName);
1011 printf(
" %s();\n", interfaceName);
1013 printf(
" virtual ~%s();\n", interfaceName);
1015 printf(
" void init(struct ::wl_registry *registry, uint32_t id, int version);\n");
1016 printf(
" void init(struct ::%s *object);\n", interfaceName);
1018 printf(
" struct ::%s *object() { return m_%s; }\n", interfaceName, interfaceName);
1019 printf(
" const struct ::%s *object() const { return m_%s; }\n", interfaceName, interfaceName);
1020 printf(
" static %s *fromObject(struct ::%s *object);\n", interfaceName, interfaceName);
1022 printf(
" bool isInitialized() const;\n");
1024 printf(
" uint32_t version() const;");
1026 printf(
" static const struct ::wl_interface *interface();\n");
1028 printEnums(interface.enums);
1030 if (!interface.requests.empty()) {
1032 for (
const WaylandEvent &e : interface.requests) {
1033 const WaylandArgument *new_id = newIdArgument(e.arguments);
1034 QByteArray new_id_str =
"void ";
1036 if (new_id->interface.isEmpty())
1037 new_id_str =
"void *";
1039 new_id_str =
"struct ::" + new_id->interface +
" *";
1041 printf(
" %s", new_id_str.constData());
1047 bool hasEvents = !interface.events.empty();
1051 printf(
" protected:\n");
1052 for (
const WaylandEvent &e : interface.events) {
1053 printf(
" virtual void %s_", interfaceNameStripped);
1060 printf(
" private:\n");
1062 printf(
" void init_listener();\n");
1063 printf(
" static const struct %s_listener m_%s_listener;\n", interfaceName, interfaceName);
1064 for (
const WaylandEvent &e : interface.events) {
1065 printf(
" static void ");
1067 printEventHandlerSignature(e, interfaceName);
1071 printf(
" struct ::%s *m_%s;\n", interfaceName, interfaceName);
1076 printf(
"QT_WARNING_POP\n");
1077 printf(
"QT_END_NAMESPACE\n");
1082 if (m_option == ClientCode) {
1083 if (m_headerPath.isEmpty())
1084 printf(
"#include \"qwayland-%s.h\"\n", fileBaseName.constData());
1086 printf(
"#include <%s/qwayland-%s.h>\n", m_headerPath.constData(), fileBaseName.constData());
1088 printf(
"QT_BEGIN_NAMESPACE\n");
1089 printf(
"QT_WARNING_PUSH\n");
1090 printf(
"QT_WARNING_DISABLE_GCC(\"-Wmissing-field-initializers\")\n");
1091 printf(
"QT_WARNING_DISABLE_CLANG(\"-Wmissing-field-initializers\")\n");
1093 printf(
"namespace QtWayland {\n");
1098 printf(
"static inline void *wlRegistryBind(struct ::wl_registry *registry, uint32_t name, const struct ::wl_interface *interface, uint32_t version)\n");
1100 printf(
" const uint32_t bindOpCode = 0;\n");
1101 printf(
" return (void *) wl_proxy_marshal_constructor_versioned((struct wl_proxy *) registry,\n");
1102 printf(
" bindOpCode, interface, version, name, interface->name, version, nullptr);\n");
1106 bool needsNewLine =
false;
1107 for (
const WaylandInterface &interface : interfaces) {
1109 if (ignoreInterface(interface.name))
1114 needsNewLine =
true;
1116 const char *interfaceName = interface.name.constData();
1118 QByteArray stripped = stripInterfaceName(interface.name);
1119 const char *interfaceNameStripped = stripped.constData();
1121 bool hasEvents = !interface.events.empty();
1123 printf(
" %s::%s(struct ::wl_registry *registry, uint32_t id, int version)\n", interfaceName, interfaceName);
1125 printf(
" init(registry, id, version);\n");
1129 printf(
" %s::%s(struct ::%s *obj)\n", interfaceName, interfaceName, interfaceName);
1130 printf(
" : m_%s(obj)\n", interfaceName);
1133 printf(
" init_listener();\n");
1137 printf(
" %s::%s()\n", interfaceName, interfaceName);
1138 printf(
" : m_%s(nullptr)\n", interfaceName);
1143 printf(
" %s::~%s()\n", interfaceName, interfaceName);
1148 printf(
" void %s::init(struct ::wl_registry *registry, uint32_t id, int version)\n", interfaceName);
1150 printf(
" m_%s = static_cast<struct ::%s *>(wlRegistryBind(registry, id, &%s_interface, version));\n", interfaceName, interfaceName, interfaceName);
1152 printf(
" init_listener();\n");
1156 printf(
" void %s::init(struct ::%s *obj)\n", interfaceName, interfaceName);
1158 printf(
" m_%s = obj;\n", interfaceName);
1160 printf(
" init_listener();\n");
1164 printf(
" %s *%s::fromObject(struct ::%s *object)\n", interfaceName, interfaceName, interfaceName);
1167 printf(
" if (wl_proxy_get_listener((struct ::wl_proxy *)object) != (void *)&m_%s_listener)\n", interfaceName);
1168 printf(
" return nullptr;\n");
1170 printf(
" return static_cast<%s *>(%s_get_user_data(object));\n", interfaceName, interfaceName);
1174 printf(
" bool %s::isInitialized() const\n", interfaceName);
1176 printf(
" return m_%s != nullptr;\n", interfaceName);
1180 printf(
" uint32_t %s::version() const\n", interfaceName);
1182 printf(
" return wl_proxy_get_version(reinterpret_cast<wl_proxy*>(m_%s));\n", interfaceName);
1186 printf(
" const struct wl_interface *%s::interface()\n", interfaceName);
1188 printf(
" return &::%s_interface;\n", interfaceName);
1191 for (
const WaylandEvent &e : interface.requests) {
1193 const WaylandArgument *new_id = newIdArgument(e.arguments);
1194 QByteArray new_id_str =
"void ";
1196 if (new_id->interface.isEmpty())
1197 new_id_str =
"void *";
1199 new_id_str =
"struct ::" + new_id->interface +
" *";
1201 printf(
" %s%s::", new_id_str.constData(), interfaceName);
1205 for (
const WaylandArgument &a : e.arguments) {
1206 if (a.type !=
"array")
1208 QByteArray array = a.name +
"_data";
1209 const char *arrayName = array.constData();
1210 const char *variableName = a.name.constData();
1211 printf(
" struct wl_array %s;\n", arrayName);
1212 printf(
" %s.size = %s.size();\n", arrayName, variableName);
1213 printf(
" %s.data = static_cast<void *>(const_cast<char *>(%s.constData()));\n", arrayName, variableName);
1214 printf(
" %s.alloc = 0;\n", arrayName);
1217 int actualArgumentCount = new_id ?
int(e.arguments.size()) - 1 :
int(e.arguments.size());
1219 printf(
" %s %s = ::%s_%s(\n", new_id_str.constData(), new_id->name.constData(), interfaceName, e.name.constData());
1221 printf(
" ::%s_%s(\n", interfaceName, e.name.constData());
1222 printf(
" m_%s%s", interfaceName, actualArgumentCount > 0 ?
"," :
"");
1223 bool needsComma =
false;
1224 for (
const WaylandArgument &a : e.arguments) {
1225 bool isNewId = a.type ==
"new_id";
1226 if (isNewId && !a.interface.isEmpty())
1233 printf(
" interface,\n");
1236 QByteArray cType = waylandToCType(a.type, a.interface);
1237 QByteArray qtType = waylandToQtType(a.type, a.interface, e.request);
1238 if (a.type ==
"string") {
1241 printf(
"%s.isNull() ? nullptr : ", a.name.constData());
1242 printf(
"%s.toUtf8().constData()", a.name.constData());
1243 }
else if (a.type ==
"array")
1244 printf(
" &%s_data", a.name.constData());
1245 else if (cType == qtType)
1246 printf(
" %s", a.name.constData());
1250 if (e.type ==
"destructor")
1251 printf(
" m_%s = nullptr;\n", interfaceName);
1253 printf(
" return %s;\n", new_id->name.constData());
1259 for (
const WaylandEvent &e : interface.events) {
1260 printf(
" void %s::%s_", interfaceName, interfaceNameStripped);
1261 printEvent(e,
true);
1266 printf(
" void %s::", interfaceName);
1267 printEventHandlerSignature(e, interfaceName,
false);
1270 printf(
" Q_UNUSED(object);\n");
1271 printf(
" static_cast<%s *>(data)->%s_%s(", interfaceName, interfaceNameStripped, e.name.constData());
1272 bool needsComma =
false;
1273 for (
const WaylandArgument &a : e.arguments) {
1278 const char *argumentName = a.name.constData();
1279 if (a.type ==
"string")
1280 printf(
" QString::fromUtf8(%s)", argumentName);
1282 printf(
" %s", argumentName);
1289 printf(
" const struct %s_listener %s::m_%s_listener = {\n", interfaceName, interfaceName, interfaceName);
1290 for (
const WaylandEvent &e : interface.events) {
1291 printf(
" %s::handle_%s,\n", interfaceName, e.name.constData());
1296 printf(
" void %s::init_listener()\n", interfaceName);
1298 printf(
" %s_add_listener(m_%s, &m_%s_listener, this);\n", interfaceName, interfaceName, interfaceName);
1304 printf(
"QT_WARNING_POP\n");
1305 printf(
"QT_END_NAMESPACE\n");