432 QFile file(m_protocolFilePath);
433 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
434 fprintf(stderr,
"Unable to open file %s\n", m_protocolFilePath.constData());
438 m_xml =
new QXmlStreamReader(&file);
439 if (!m_xml->readNextStartElement())
442 if (m_xml->name() != QLatin1String(
"protocol")) {
443 m_xml->raiseError(QStringLiteral(
"The file is not a wayland protocol file."));
447 m_protocolName = byteArrayValue(*m_xml,
"name");
449 if (m_protocolName.isEmpty()) {
450 m_xml->raiseError(QStringLiteral(
"Missing protocol name."));
457 QByteArray preProcessorProtocolName = QByteArray(m_protocolName).toUpper();
459 std::vector<WaylandInterface> interfaces;
461 while (m_xml->readNextStartElement()) {
462 if (m_xml->name() == QLatin1String(
"interface"))
463 interfaces.push_back(readInterface(*m_xml));
465 m_xml->skipCurrentElement();
468 if (m_xml->hasError())
471 printf(
"// This file was generated by qtwaylandscanner\n");
472 printf(
"// source file is %s\n\n", qPrintable(m_protocolFilePath));
474 for (
auto b : std::as_const(m_includes))
475 printf(
"#include %s\n", b.constData());
477 if (m_option == ServerHeader) {
478 QByteArray inclusionGuard = QByteArray(
"QT_WAYLAND_SERVER_") + preProcessorProtocolName.constData();
479 printf(
"#ifndef %s\n", inclusionGuard.constData());
480 printf(
"#define %s\n", inclusionGuard.constData());
482 printf(
"#include \"wayland-server-core.h\"\n");
483 if (m_headerPath.isEmpty())
484 printf(
"#include \"wayland-%s-server-protocol.h\"\n", QByteArray(m_protocolName).replace(
'_',
'-').constData());
486 printf(
"#include <%s/wayland-%s-server-protocol.h>\n", m_headerPath.constData(), QByteArray(m_protocolName).replace(
'_',
'-').constData());
487 printf(
"#include <QByteArray>\n");
488 printf(
"#include <QMultiMap>\n");
489 printf(
"#include <QString>\n");
492 printf(
"#include <unistd.h>\n");
495 printf(
"#ifndef WAYLAND_VERSION_CHECK\n");
496 printf(
"#define WAYLAND_VERSION_CHECK(major, minor, micro) \\\n");
497 printf(
" ((WAYLAND_VERSION_MAJOR > (major)) || \\\n");
498 printf(
" (WAYLAND_VERSION_MAJOR == (major) && WAYLAND_VERSION_MINOR > (minor)) || \\\n");
499 printf(
" (WAYLAND_VERSION_MAJOR == (major) && WAYLAND_VERSION_MINOR == (minor) && WAYLAND_VERSION_MICRO >= (micro)))\n");
503 printf(
"QT_BEGIN_NAMESPACE\n");
504 printf(
"QT_WARNING_PUSH\n");
505 printf(
"QT_WARNING_DISABLE_GCC(\"-Wmissing-field-initializers\")\n");
506 printf(
"QT_WARNING_DISABLE_CLANG(\"-Wmissing-field-initializers\")\n");
507 QByteArray serverExport;
508 if (m_headerPath.size()) {
509 serverExport = QByteArray(
"Q_WAYLAND_SERVER_") + preProcessorProtocolName +
"_EXPORT";
511 printf(
"#if !defined(%s)\n", serverExport.constData());
512 printf(
"# if defined(QT_SHARED)\n");
513 printf(
"# define %s Q_DECL_EXPORT\n", serverExport.constData());
515 printf(
"# define %s\n", serverExport.constData());
520 printf(
"namespace QtWaylandServer {\n");
522 bool needsNewLine =
false;
523 for (
const WaylandInterface &interface : interfaces) {
525 if (ignoreInterface(interface.name))
532 const char *interfaceName = interface.name.constData();
534 QByteArray stripped = stripInterfaceName(interface.name);
535 const char *interfaceNameStripped = stripped.constData();
537 printf(
" class %s %s\n {\n", serverExport.constData(), interfaceName);
538 printf(
" public:\n");
539 printf(
" %s(struct ::wl_client *client, int id, int version);\n", interfaceName);
540 printf(
" %s(struct ::wl_display *display, int version);\n", interfaceName);
541 printf(
" %s(struct ::wl_resource *resource);\n", interfaceName);
542 printf(
" %s();\n", interfaceName);
544 printf(
" virtual ~%s();\n", interfaceName);
546 printf(
" class Resource\n");
548 printf(
" public:\n");
549 printf(
" Resource() : %s_object(nullptr), handle(nullptr) {}\n", interfaceNameStripped);
550 printf(
" virtual ~Resource() {}\n");
552 printf(
" %s *%s_object;\n", interfaceName, interfaceNameStripped);
553 printf(
" %s *object() { return %s_object; } \n", interfaceName, interfaceNameStripped);
554 printf(
" struct ::wl_resource *handle;\n");
556 printf(
" struct ::wl_client *client() const { return wl_resource_get_client(handle); }\n");
557 printf(
" int version() const { return wl_resource_get_version(handle); }\n");
559 printf(
" static Resource *fromResource(struct ::wl_resource *resource);\n");
562 printf(
" void init(struct ::wl_client *client, int id, int version);\n");
563 printf(
" void init(struct ::wl_display *display, int version);\n");
564 printf(
" void init(struct ::wl_resource *resource);\n");
566 printf(
" Resource *add(struct ::wl_client *client, int version);\n");
567 printf(
" Resource *add(struct ::wl_client *client, int id, int version);\n");
568 printf(
" Resource *add(struct wl_list *resource_list, struct ::wl_client *client, int id, int version);\n");
570 printf(
" Resource *resource() { return m_resource; }\n");
571 printf(
" const Resource *resource() const { return m_resource; }\n");
573 printf(
" QMultiMap<struct ::wl_client*, Resource*> resourceMap() { return m_resource_map; }\n");
574 printf(
" const QMultiMap<struct ::wl_client*, Resource*> resourceMap() const { return m_resource_map; }\n");
576 printf(
" bool isGlobalRemoved() const { return m_globalRemovedEvent; }\n");
577 printf(
" void globalRemove();\n");
579 printf(
" bool isGlobal() const { return m_global != nullptr; }\n");
580 printf(
" bool isResource() const { return m_resource != nullptr; }\n");
582 printf(
" static const struct ::wl_interface *interface();\n");
583 printf(
" static QByteArray interfaceName() { return interface()->name; }\n");
584 printf(
" static int interfaceVersion() { return interface()->version; }\n");
587 printEnums(interface.enums);
589 bool hasEvents = !interface.events.empty();
593 for (
const WaylandEvent &e : interface.events) {
594 printf(
" void send_");
597 printf(
" void send_");
598 printEvent(e,
false,
true);
604 printf(
" protected:\n");
605 printf(
" virtual Resource *%s_allocate();\n", interfaceNameStripped);
607 printf(
" virtual void %s_destroy_global();\n", interfaceNameStripped);
609 printf(
" virtual void %s_bind_resource(Resource *resource);\n", interfaceNameStripped);
610 printf(
" virtual void %s_destroy_resource(Resource *resource);\n", interfaceNameStripped);
612 bool hasRequests = !interface.requests.empty();
616 for (
const WaylandEvent &e : interface.requests) {
617 printf(
" virtual void %s_", interfaceNameStripped);
624 printf(
" private:\n");
625 printf(
" static void bind_func(struct ::wl_client *client, void *data, uint32_t version, uint32_t id);\n");
626 printf(
" static void destroy_func(struct ::wl_resource *client_resource);\n");
627 printf(
" static void display_destroy_func(struct ::wl_listener *listener, void *data);\n");
628 printf(
" static int deferred_destroy_global_func(void *data);\n");
630 printf(
" Resource *bind(struct ::wl_client *client, uint32_t id, int version);\n");
631 printf(
" Resource *bind(struct ::wl_resource *handle);\n");
635 printf(
" static const struct ::%s_interface m_%s_interface;\n", interfaceName, interfaceName);
638 for (
const WaylandEvent &e : interface.requests) {
639 printf(
" static void ");
641 printEventHandlerSignature(e, interfaceName);
647 printf(
" QMultiMap<struct ::wl_client*, Resource*> m_resource_map;\n");
648 printf(
" Resource *m_resource;\n");
649 printf(
" struct ::wl_global *m_global;\n");
650 printf(
" struct ::wl_display *m_display;\n");
651 printf(
" struct wl_event_source *m_globalRemovedEvent;\n");
652 printf(
" struct DisplayDestroyedListener : ::wl_listener {\n");
653 printf(
" %s *parent;\n", interfaceName);
655 printf(
" DisplayDestroyedListener m_displayDestroyedListener;\n");
661 printf(
"QT_WARNING_POP\n");
662 printf(
"QT_END_NAMESPACE\n");
667 if (m_option == ServerCode) {
668 if (m_headerPath.isEmpty())
669 printf(
"#include \"qwayland-server-%s.h\"\n", QByteArray(m_protocolName).replace(
'_',
'-').constData());
671 printf(
"#include <%s/qwayland-server-%s.h>\n", m_headerPath.constData(), QByteArray(m_protocolName).replace(
'_',
'-').constData());
673 printf(
"QT_BEGIN_NAMESPACE\n");
674 printf(
"QT_WARNING_PUSH\n");
675 printf(
"QT_WARNING_DISABLE_GCC(\"-Wmissing-field-initializers\")\n");
677 printf(
"namespace QtWaylandServer {\n");
679 bool needsNewLine =
false;
681 for (
const WaylandInterface &interface : interfaces) {
683 if (ignoreInterface(interface.name))
691 const char *interfaceName = interface.name.constData();
693 QByteArray stripped = stripInterfaceName(interface.name);
694 const char *interfaceNameStripped = stripped.constData();
697 printf(
" int %s::deferred_destroy_global_func(void *data) {\n", interfaceName);
698 printf(
" auto object = static_cast<%s *>(data);\n", interfaceName);
699 printf(
" wl_global_destroy(object->m_global);\n");
700 printf(
" object->m_global = nullptr;\n");
701 printf(
" wl_event_source_remove(object->m_globalRemovedEvent);\n");
702 printf(
" object->m_globalRemovedEvent = nullptr;\n");
703 printf(
" wl_list_remove(&object->m_displayDestroyedListener.link);\n");
704 printf(
" object->%s_destroy_global();\n", interfaceNameStripped);
705 printf(
" return 0;\n");
709 printf(
" %s::%s(struct ::wl_client *client, int id, int version)\n", interfaceName, interfaceName);
710 printf(
" : m_resource_map()\n");
711 printf(
" , m_resource(nullptr)\n");
712 printf(
" , m_global(nullptr)\n");
713 printf(
" , m_display(nullptr)\n");
714 printf(
" , m_globalRemovedEvent(nullptr)\n");
716 printf(
" init(client, id, version);\n");
720 printf(
" %s::%s(struct ::wl_display *display, int version)\n", interfaceName, interfaceName);
721 printf(
" : m_resource_map()\n");
722 printf(
" , m_resource(nullptr)\n");
723 printf(
" , m_global(nullptr)\n");
724 printf(
" , m_display(nullptr)\n");
725 printf(
" , m_globalRemovedEvent(nullptr)\n");
727 printf(
" init(display, version);\n");
731 printf(
" %s::%s(struct ::wl_resource *resource)\n", interfaceName, interfaceName);
732 printf(
" : m_resource_map()\n");
733 printf(
" , m_resource(nullptr)\n");
734 printf(
" , m_global(nullptr)\n");
735 printf(
" , m_display(nullptr)\n");
736 printf(
" , m_globalRemovedEvent(nullptr)\n");
738 printf(
" init(resource);\n");
742 printf(
" %s::%s()\n", interfaceName, interfaceName);
743 printf(
" : m_resource_map()\n");
744 printf(
" , m_resource(nullptr)\n");
745 printf(
" , m_global(nullptr)\n");
746 printf(
" , m_display(nullptr)\n");
747 printf(
" , m_globalRemovedEvent(nullptr)\n");
752 printf(
" %s::~%s()\n", interfaceName, interfaceName);
754 printf(
" for (auto resource : std::as_const(m_resource_map))\n");
755 printf(
" resource->%s_object = nullptr;\n", interfaceNameStripped);
757 printf(
" if (m_resource)\n");
758 printf(
" m_resource->%s_object = nullptr;\n", interfaceNameStripped);
760 printf(
" if (m_global) {\n");
761 printf(
" if (m_globalRemovedEvent)\n");
762 printf(
" wl_event_source_remove(m_globalRemovedEvent);\n");
763 printf(
" wl_global_destroy(m_global);\n");
764 printf(
" wl_list_remove(&m_displayDestroyedListener.link);\n");
769 printf(
" void %s::init(struct ::wl_client *client, int id, int version)\n", interfaceName);
771 printf(
" m_resource = bind(client, id, version);\n");
775 printf(
" void %s::init(struct ::wl_resource *resource)\n", interfaceName);
777 printf(
" m_resource = bind(resource);\n");
781 printf(
" %s::Resource *%s::add(struct ::wl_client *client, int version)\n", interfaceName, interfaceName);
783 printf(
" Resource *resource = bind(client, 0, version);\n");
784 printf(
" m_resource_map.insert(client, resource);\n");
785 printf(
" return resource;\n");
789 printf(
" %s::Resource *%s::add(struct ::wl_client *client, int id, int version)\n", interfaceName, interfaceName);
791 printf(
" Resource *resource = bind(client, id, version);\n");
792 printf(
" m_resource_map.insert(client, resource);\n");
793 printf(
" return resource;\n");
797 printf(
" void %s::init(struct ::wl_display *display, int version)\n", interfaceName);
799 printf(
" m_display = display;\n");
800 printf(
" m_global = wl_global_create(display, &::%s_interface, version, this, bind_func);\n", interfaceName);
801 printf(
" m_displayDestroyedListener.notify = %s::display_destroy_func;\n", interfaceName);
802 printf(
" m_displayDestroyedListener.parent = this;\n");
803 printf(
" wl_display_add_destroy_listener(display, &m_displayDestroyedListener);\n");
807 printf(
" const struct wl_interface *%s::interface()\n", interfaceName);
809 printf(
" return &::%s_interface;\n", interfaceName);
813 printf(
" %s::Resource *%s::%s_allocate()\n", interfaceName, interfaceName, interfaceNameStripped);
815 printf(
" return new Resource;\n");
819 printf(
" void %s::%s_destroy_global()\n", interfaceName, interfaceNameStripped);
824 printf(
" void %s::%s_bind_resource(Resource *)\n", interfaceName, interfaceNameStripped);
829 printf(
" void %s::%s_destroy_resource(Resource *)\n", interfaceName, interfaceNameStripped);
834 printf(
" void %s::bind_func(struct ::wl_client *client, void *data, uint32_t version, uint32_t id)\n", interfaceName);
836 printf(
" %s *that = static_cast<%s *>(data);\n", interfaceName, interfaceName);
837 printf(
" that->add(client, id, version);\n");
841 printf(
" void %s::display_destroy_func(struct ::wl_listener *listener, void *data)\n", interfaceName);
843 printf(
" Q_UNUSED(data);\n");
844 printf(
" %s *that = static_cast<%s::DisplayDestroyedListener *>(listener)->parent;\n", interfaceName, interfaceName);
845 printf(
" that->m_global = nullptr;\n");
846 printf(
" that->m_globalRemovedEvent = nullptr;\n");
850 printf(
" void %s::destroy_func(struct ::wl_resource *client_resource)\n", interfaceName);
852 printf(
" Resource *resource = Resource::fromResource(client_resource);\n");
853 printf(
" Q_ASSERT(resource);\n");
854 printf(
" %s *that = resource->%s_object;\n", interfaceName, interfaceNameStripped);
855 printf(
" if (Q_LIKELY(that)) {\n");
856 printf(
" that->m_resource_map.remove(resource->client(), resource);\n");
857 printf(
" that->%s_destroy_resource(resource);\n", interfaceNameStripped);
859 printf(
" that = resource->%s_object;\n", interfaceNameStripped);
860 printf(
" if (that && that->m_resource == resource)\n");
861 printf(
" that->m_resource = nullptr;\n");
863 printf(
" delete resource;\n");
870 printf(
" void %s::globalRemove()\n", interfaceName);
872 printf(
" if (!m_global || m_globalRemovedEvent)\n");
873 printf(
" return;\n");
875 printf(
" wl_global_remove(m_global);\n");
877 printf(
" struct wl_event_loop *event_loop = wl_display_get_event_loop(m_display);\n");
878 printf(
" m_globalRemovedEvent = wl_event_loop_add_timer(event_loop, deferred_destroy_global_func, this);\n");
879 printf(
" wl_event_source_timer_update(m_globalRemovedEvent, 5000);\n");
883 bool hasRequests = !interface.requests.empty();
885 QByteArray interfaceMember = hasRequests ?
"&m_" + interface.name +
"_interface" : QByteArray(
"nullptr");
889 printf(
" %s::Resource *%s::bind(struct ::wl_client *client, uint32_t id, int version)\n", interfaceName, interfaceName);
891 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");
892 printf(
" struct ::wl_resource *handle = wl_resource_create(client, &::%s_interface, version, id);\n", interfaceName);
893 printf(
" return bind(handle);\n");
897 printf(
" %s::Resource *%s::bind(struct ::wl_resource *handle)\n", interfaceName, interfaceName);
899 printf(
" Resource *resource = %s_allocate();\n", interfaceNameStripped);
900 printf(
" resource->%s_object = this;\n", interfaceNameStripped);
902 printf(
" wl_resource_set_implementation(handle, %s, resource, destroy_func);", interfaceMember.constData());
904 printf(
" resource->handle = handle;\n");
905 printf(
" %s_bind_resource(resource);\n", interfaceNameStripped);
906 printf(
" return resource;\n");
909 printf(
" %s::Resource *%s::Resource::fromResource(struct ::wl_resource *resource)\n", interfaceName, interfaceName);
911 printf(
" if (Q_UNLIKELY(!resource))\n");
912 printf(
" return nullptr;\n");
913 printf(
" if (wl_resource_instance_of(resource, &::%s_interface, %s))\n", interfaceName, interfaceMember.constData());
914 printf(
" return static_cast<Resource *>(wl_resource_get_user_data(resource));\n");
915 printf(
" return nullptr;\n");
920 printf(
" const struct ::%s_interface %s::m_%s_interface = {", interfaceName, interfaceName, interfaceName);
921 bool needsComma =
false;
922 for (
const WaylandEvent &e : interface.requests) {
927 printf(
" %s::handle_%s", interfaceName, e.name.constData());
932 for (
const WaylandEvent &e : interface.requests) {
934 printf(
" void %s::%s_", interfaceName, interfaceNameStripped);
942 for (
const WaylandEvent &e : interface.requests) {
944 printf(
" void %s::", interfaceName);
946 printEventHandlerSignature(e, interfaceName,
false);
950 printf(
" Q_UNUSED(client);\n");
951 printf(
" Resource *r = Resource::fromResource(resource);\n");
952 printf(
" if (Q_UNLIKELY(!r->%s_object)) {\n", interfaceNameStripped);
953 for (
const WaylandArgument &a : e.arguments) {
954 if (a.type == QByteArrayLiteral(
"fd"))
955 printf(
" close(%s);\n", a.name.constData());
957 if (e.type ==
"destructor")
958 printf(
" wl_resource_destroy(resource);\n");
959 printf(
" return;\n");
961 printf(
" static_cast<%s *>(r->%s_object)->%s_%s(\n", interfaceName, interfaceNameStripped, interfaceNameStripped, e.name.constData());
963 for (
const WaylandArgument &a : e.arguments) {
965 QByteArray cType = waylandToCType(a.type, a.interface);
966 QByteArray qtType = waylandToQtType(a.type, a.interface, e.request);
967 const char *argumentName = a.name.constData();
969 printf(
" %s", argumentName);
970 else if (a.type ==
"string")
971 printf(
" QString::fromUtf8(%s)", argumentName);
978 for (
const WaylandEvent &e : interface.events) {
980 printf(
" void %s::send_", interfaceName);
984 printf(
" Q_ASSERT_X(m_resource, \"%s::%s\", \"Uninitialised resource\");\n", interfaceName, e.name.constData());
985 printf(
" if (Q_UNLIKELY(!m_resource)) {\n");
986 printf(
" qWarning(\"could not call %s::%s as it's not initialised\");\n", interfaceName, e.name.constData());
987 printf(
" return;\n");
989 printf(
" send_%s(\n", e.name.constData());
990 printf(
" m_resource->handle");
991 for (
const WaylandArgument &a : e.arguments) {
993 printf(
" %s", a.name.constData());
999 printf(
" void %s::send_", interfaceName);
1000 printEvent(e,
false,
true);
1004 for (
const WaylandArgument &a : e.arguments) {
1005 if (a.type !=
"array")
1007 QByteArray array = a.name +
"_data";
1008 const char *arrayName = array.constData();
1009 const char *variableName = a.name.constData();
1010 printf(
" struct wl_array %s;\n", arrayName);
1011 printf(
" %s.size = %s.size();\n", arrayName, variableName);
1012 printf(
" %s.data = static_cast<void *>(const_cast<char *>(%s.constData()));\n", arrayName, variableName);
1013 printf(
" %s.alloc = 0;\n", arrayName);
1017 printf(
" %s_send_%s(\n", interfaceName, e.name.constData());
1018 printf(
" resource");
1020 for (
const WaylandArgument &a : e.arguments) {
1022 QByteArray cType = waylandToCType(a.type, a.interface);
1023 QByteArray qtType = waylandToQtType(a.type, a.interface, e.request);
1024 if (a.type ==
"string")
1025 printf(
" %s.toUtf8().constData()", a.name.constData());
1026 else if (a.type ==
"array")
1027 printf(
" &%s_data", a.name.constData());
1028 else if (cType == qtType)
1029 printf(
" %s", a.name.constData());
1039 printf(
"QT_WARNING_POP\n");
1040 printf(
"QT_END_NAMESPACE\n");
1043 if (m_option == ClientHeader) {
1044 QByteArray inclusionGuard = QByteArray(
"QT_WAYLAND_") + preProcessorProtocolName.constData();
1045 printf(
"#ifndef %s\n", inclusionGuard.constData());
1046 printf(
"#define %s\n", inclusionGuard.constData());
1048 if (m_headerPath.isEmpty())
1049 printf(
"#include \"wayland-%s-client-protocol.h\"\n", QByteArray(m_protocolName).replace(
'_',
'-').constData());
1051 printf(
"#include <%s/wayland-%s-client-protocol.h>\n", m_headerPath.constData(), QByteArray(m_protocolName).replace(
'_',
'-').constData());
1052 printf(
"#include <QByteArray>\n");
1053 printf(
"#include <QString>\n");
1055 printf(
"struct wl_registry;\n");
1057 printf(
"QT_BEGIN_NAMESPACE\n");
1058 printf(
"QT_WARNING_PUSH\n");
1059 printf(
"QT_WARNING_DISABLE_GCC(\"-Wmissing-field-initializers\")\n");
1061 QByteArray clientExport;
1063 if (m_headerPath.size()) {
1064 clientExport = QByteArray(
"Q_WAYLAND_CLIENT_") + preProcessorProtocolName +
"_EXPORT";
1066 printf(
"#if !defined(%s)\n", clientExport.constData());
1067 printf(
"# if defined(QT_SHARED)\n");
1068 printf(
"# define %s Q_DECL_EXPORT\n", clientExport.constData());
1070 printf(
"# define %s\n", clientExport.constData());
1071 printf(
"# endif\n");
1075 printf(
"namespace QtWayland {\n");
1077 bool needsNewLine =
false;
1078 for (
const WaylandInterface &interface : interfaces) {
1080 if (ignoreInterface(interface.name))
1085 needsNewLine =
true;
1087 const char *interfaceName = interface.name.constData();
1089 QByteArray stripped = stripInterfaceName(interface.name);
1090 const char *interfaceNameStripped = stripped.constData();
1092 printf(
" class %s %s\n {\n", clientExport.constData(), interfaceName);
1093 printf(
" public:\n");
1094 printf(
" %s(struct ::wl_registry *registry, int id, int version);\n", interfaceName);
1095 printf(
" %s(struct ::%s *object);\n", interfaceName, interfaceName);
1096 printf(
" %s();\n", interfaceName);
1098 printf(
" virtual ~%s();\n", interfaceName);
1100 printf(
" void init(struct ::wl_registry *registry, int id, int version);\n");
1101 printf(
" void init(struct ::%s *object);\n", interfaceName);
1103 printf(
" struct ::%s *object() { return m_%s; }\n", interfaceName, interfaceName);
1104 printf(
" const struct ::%s *object() const { return m_%s; }\n", interfaceName, interfaceName);
1105 printf(
" static %s *fromObject(struct ::%s *object);\n", interfaceName, interfaceName);
1107 printf(
" bool isInitialized() const;\n");
1109 printf(
" static const struct ::wl_interface *interface();\n");
1111 printEnums(interface.enums);
1113 if (!interface.requests.empty()) {
1115 for (
const WaylandEvent &e : interface.requests) {
1116 const WaylandArgument *new_id = newIdArgument(e.arguments);
1117 QByteArray new_id_str =
"void ";
1119 if (new_id->interface.isEmpty())
1120 new_id_str =
"void *";
1122 new_id_str =
"struct ::" + new_id->interface +
" *";
1124 printf(
" %s", new_id_str.constData());
1130 bool hasEvents = !interface.events.empty();
1134 printf(
" protected:\n");
1135 for (
const WaylandEvent &e : interface.events) {
1136 printf(
" virtual void %s_", interfaceNameStripped);
1143 printf(
" private:\n");
1145 printf(
" void init_listener();\n");
1146 printf(
" static const struct %s_listener m_%s_listener;\n", interfaceName, interfaceName);
1147 for (
const WaylandEvent &e : interface.events) {
1148 printf(
" static void ");
1150 printEventHandlerSignature(e, interfaceName);
1154 printf(
" struct ::%s *m_%s;\n", interfaceName, interfaceName);
1159 printf(
"QT_WARNING_POP\n");
1160 printf(
"QT_END_NAMESPACE\n");
1165 if (m_option == ClientCode) {
1166 if (m_headerPath.isEmpty())
1167 printf(
"#include \"qwayland-%s.h\"\n", QByteArray(m_protocolName).replace(
'_',
'-').constData());
1169 printf(
"#include <%s/qwayland-%s.h>\n", m_headerPath.constData(), QByteArray(m_protocolName).replace(
'_',
'-').constData());
1171 printf(
"QT_BEGIN_NAMESPACE\n");
1172 printf(
"QT_WARNING_PUSH\n");
1173 printf(
"QT_WARNING_DISABLE_GCC(\"-Wmissing-field-initializers\")\n");
1175 printf(
"namespace QtWayland {\n");
1180 printf(
"static inline void *wlRegistryBind(struct ::wl_registry *registry, uint32_t name, const struct ::wl_interface *interface, uint32_t version)\n");
1182 printf(
" const uint32_t bindOpCode = 0;\n");
1183 printf(
"#if (WAYLAND_VERSION_MAJOR == 1 && WAYLAND_VERSION_MINOR > 10) || WAYLAND_VERSION_MAJOR > 1\n");
1184 printf(
" return (void *) wl_proxy_marshal_constructor_versioned((struct wl_proxy *) registry,\n");
1185 printf(
" bindOpCode, interface, version, name, interface->name, version, nullptr);\n");
1187 printf(
" return (void *) wl_proxy_marshal_constructor((struct wl_proxy *) registry,\n");
1188 printf(
" bindOpCode, interface, name, interface->name, version, nullptr);\n");
1193 bool needsNewLine =
false;
1194 for (
const WaylandInterface &interface : interfaces) {
1196 if (ignoreInterface(interface.name))
1201 needsNewLine =
true;
1203 const char *interfaceName = interface.name.constData();
1205 QByteArray stripped = stripInterfaceName(interface.name);
1206 const char *interfaceNameStripped = stripped.constData();
1208 bool hasEvents = !interface.events.empty();
1210 printf(
" %s::%s(struct ::wl_registry *registry, int id, int version)\n", interfaceName, interfaceName);
1212 printf(
" init(registry, id, version);\n");
1216 printf(
" %s::%s(struct ::%s *obj)\n", interfaceName, interfaceName, interfaceName);
1217 printf(
" : m_%s(obj)\n", interfaceName);
1220 printf(
" init_listener();\n");
1224 printf(
" %s::%s()\n", interfaceName, interfaceName);
1225 printf(
" : m_%s(nullptr)\n", interfaceName);
1230 printf(
" %s::~%s()\n", interfaceName, interfaceName);
1235 printf(
" void %s::init(struct ::wl_registry *registry, int id, int version)\n", interfaceName);
1237 printf(
" m_%s = static_cast<struct ::%s *>(wlRegistryBind(registry, id, &%s_interface, version));\n", interfaceName, interfaceName, interfaceName);
1239 printf(
" init_listener();\n");
1243 printf(
" void %s::init(struct ::%s *obj)\n", interfaceName, interfaceName);
1245 printf(
" m_%s = obj;\n", interfaceName);
1247 printf(
" init_listener();\n");
1251 printf(
" %s *%s::fromObject(struct ::%s *object)\n", interfaceName, interfaceName, interfaceName);
1254 printf(
" if (wl_proxy_get_listener((struct ::wl_proxy *)object) != (void *)&m_%s_listener)\n", interfaceName);
1255 printf(
" return nullptr;\n");
1257 printf(
" return static_cast<%s *>(%s_get_user_data(object));\n", interfaceName, interfaceName);
1261 printf(
" bool %s::isInitialized() const\n", interfaceName);
1263 printf(
" return m_%s != nullptr;\n", interfaceName);
1267 printf(
" const struct wl_interface *%s::interface()\n", interfaceName);
1269 printf(
" return &::%s_interface;\n", interfaceName);
1272 for (
const WaylandEvent &e : interface.requests) {
1274 const WaylandArgument *new_id = newIdArgument(e.arguments);
1275 QByteArray new_id_str =
"void ";
1277 if (new_id->interface.isEmpty())
1278 new_id_str =
"void *";
1280 new_id_str =
"struct ::" + new_id->interface +
" *";
1282 printf(
" %s%s::", new_id_str.constData(), interfaceName);
1286 for (
const WaylandArgument &a : e.arguments) {
1287 if (a.type !=
"array")
1289 QByteArray array = a.name +
"_data";
1290 const char *arrayName = array.constData();
1291 const char *variableName = a.name.constData();
1292 printf(
" struct wl_array %s;\n", arrayName);
1293 printf(
" %s.size = %s.size();\n", arrayName, variableName);
1294 printf(
" %s.data = static_cast<void *>(const_cast<char *>(%s.constData()));\n", arrayName, variableName);
1295 printf(
" %s.alloc = 0;\n", arrayName);
1298 int actualArgumentCount = new_id ? int(e.arguments.size()) - 1 : int(e.arguments.size());
1299 printf(
" %s%s_%s(\n", new_id ?
"return " :
"", interfaceName, e.name.constData());
1300 printf(
" m_%s%s", interfaceName, actualArgumentCount > 0 ?
"," :
"");
1301 bool needsComma =
false;
1302 for (
const WaylandArgument &a : e.arguments) {
1303 bool isNewId = a.type ==
"new_id";
1304 if (isNewId && !a.interface.isEmpty())
1311 printf(
" interface,\n");
1314 QByteArray cType = waylandToCType(a.type, a.interface);
1315 QByteArray qtType = waylandToQtType(a.type, a.interface, e.request);
1316 if (a.type ==
"string")
1317 printf(
" %s.toUtf8().constData()", a.name.constData());
1318 else if (a.type ==
"array")
1319 printf(
" &%s_data", a.name.constData());
1320 else if (cType == qtType)
1321 printf(
" %s", a.name.constData());
1325 if (e.type ==
"destructor")
1326 printf(
" m_%s = nullptr;\n", interfaceName);
1332 for (
const WaylandEvent &e : interface.events) {
1333 printf(
" void %s::%s_", interfaceName, interfaceNameStripped);
1334 printEvent(e,
true);
1339 printf(
" void %s::", interfaceName);
1340 printEventHandlerSignature(e, interfaceName,
false);
1343 printf(
" Q_UNUSED(object);\n");
1344 printf(
" static_cast<%s *>(data)->%s_%s(", interfaceName, interfaceNameStripped, e.name.constData());
1345 bool needsComma =
false;
1346 for (
const WaylandArgument &a : e.arguments) {
1351 const char *argumentName = a.name.constData();
1352 if (a.type ==
"string")
1353 printf(
" QString::fromUtf8(%s)", argumentName);
1355 printf(
" %s", argumentName);
1362 printf(
" const struct %s_listener %s::m_%s_listener = {\n", interfaceName, interfaceName, interfaceName);
1363 for (
const WaylandEvent &e : interface.events) {
1364 printf(
" %s::handle_%s,\n", interfaceName, e.name.constData());
1369 printf(
" void %s::init_listener()\n", interfaceName);
1371 printf(
" %s_add_listener(m_%s, &m_%s_listener, this);\n", interfaceName, interfaceName, interfaceName);
1377 printf(
"QT_WARNING_POP\n");
1378 printf(
"QT_END_NAMESPACE\n");