New upstream version 0.4.2
This commit is contained in:
parent
91ab610821
commit
da27435de4
|
|
@ -1,11 +1,12 @@
|
||||||
cmake_minimum_required(VERSION 3.19)
|
cmake_minimum_required(VERSION 3.19)
|
||||||
|
|
||||||
set(VERSION 0.3.10)
|
file(READ "${CMAKE_SOURCE_DIR}/VERSION" VER_RAW)
|
||||||
|
string(STRIP ${VER_RAW} VERSION)
|
||||||
|
|
||||||
project(hyprwayland-scanner
|
project(
|
||||||
DESCRIPTION "A hyprland version of wayland-scanner in and for C++"
|
hyprwayland-scanner
|
||||||
VERSION ${VERSION}
|
DESCRIPTION "A hyprland version of wayland-scanner in and for C++"
|
||||||
)
|
VERSION ${VERSION})
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
|
|
@ -15,18 +16,17 @@ set(PREFIX ${CMAKE_INSTALL_PREFIX})
|
||||||
set(CMAKE_MESSAGE_LOG_LEVEL "STATUS")
|
set(CMAKE_MESSAGE_LOG_LEVEL "STATUS")
|
||||||
|
|
||||||
if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG)
|
if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG)
|
||||||
message(STATUS "Configuring hyprwayland-scanner in Debug with CMake")
|
message(STATUS "Configuring hyprwayland-scanner in Debug with CMake")
|
||||||
add_compile_definitions(HYPRLAND_DEBUG)
|
add_compile_definitions(HYPRLAND_DEBUG)
|
||||||
else()
|
else()
|
||||||
add_compile_options(-O3)
|
add_compile_options(-O3)
|
||||||
message(STATUS "Configuring hyprwayland-scanner in Release with CMake")
|
message(STATUS "Configuring hyprwayland-scanner in Release with CMake")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
# configure
|
# configure
|
||||||
set(CMAKE_CXX_STANDARD 23)
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
add_compile_options(-Wall -Wextra -Wno-unused-parameter -Wno-unused-value
|
add_compile_options(-Wall -Wextra -Wno-unused-parameter -Wno-unused-value
|
||||||
-Wno-missing-field-initializers -Wno-narrowing)
|
-Wno-missing-field-initializers -Wno-narrowing)
|
||||||
|
|
||||||
add_compile_definitions(SCANNER_VERSION="${VERSION}")
|
add_compile_definitions(SCANNER_VERSION="${VERSION}")
|
||||||
|
|
||||||
|
|
@ -41,25 +41,22 @@ pkg_check_modules(deps REQUIRED IMPORTED_TARGET pugixml)
|
||||||
|
|
||||||
file(GLOB_RECURSE SRCFILES CONFIGURE_DEPENDS "src/*.cpp")
|
file(GLOB_RECURSE SRCFILES CONFIGURE_DEPENDS "src/*.cpp")
|
||||||
add_executable(hyprwayland-scanner ${SRCFILES})
|
add_executable(hyprwayland-scanner ${SRCFILES})
|
||||||
target_link_libraries(hyprwayland-scanner PRIVATE rt Threads::Threads PkgConfig::deps)
|
target_link_libraries(hyprwayland-scanner PRIVATE rt Threads::Threads
|
||||||
|
PkgConfig::deps)
|
||||||
|
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
hyprwayland-scanner-config.cmake.in
|
hyprwayland-scanner-config.cmake.in hyprwayland-scanner-config.cmake
|
||||||
hyprwayland-scanner-config.cmake
|
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/hyprwayland-scanner"
|
||||||
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/hyprwayland-scanner"
|
PATH_VARS CMAKE_INSTALL_BINDIR)
|
||||||
PATH_VARS CMAKE_INSTALL_BINDIR
|
|
||||||
)
|
|
||||||
write_basic_package_version_file(
|
write_basic_package_version_file(
|
||||||
"hyprwayland-scanner-config-version.cmake"
|
"hyprwayland-scanner-config-version.cmake"
|
||||||
VERSION "${VERSION}"
|
VERSION "${VERSION}"
|
||||||
COMPATIBILITY AnyNewerVersion
|
COMPATIBILITY AnyNewerVersion)
|
||||||
)
|
|
||||||
|
|
||||||
# Installation
|
# Installation
|
||||||
install(TARGETS hyprwayland-scanner)
|
install(TARGETS hyprwayland-scanner)
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/hyprwayland-scanner.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
install(FILES ${CMAKE_BINARY_DIR}/hyprwayland-scanner.pc
|
||||||
install(FILES
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
${CMAKE_BINARY_DIR}/hyprwayland-scanner-config.cmake
|
install(FILES ${CMAKE_BINARY_DIR}/hyprwayland-scanner-config.cmake
|
||||||
${CMAKE_BINARY_DIR}/hyprwayland-scanner-config-version.cmake
|
${CMAKE_BINARY_DIR}/hyprwayland-scanner-config-version.cmake
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/hyprwayland-scanner
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/hyprwayland-scanner)
|
||||||
)
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,11 @@ A Hyprland implementation of wayland-scanner, in and for C++.
|
||||||
hyprwayland-scanner '/path/to/proto' '/path/to/output/directory'
|
hyprwayland-scanner '/path/to/proto' '/path/to/output/directory'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
- `--client` -> generate client code
|
||||||
|
- `--wayland-enums` -> use wayland enum naming (snake instead of camel)
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
Requires a compiler with C++23 support.
|
Requires a compiler with C++23 support.
|
||||||
|
|
@ -26,7 +31,3 @@ cmake --build build -j `nproc`
|
||||||
```sh
|
```sh
|
||||||
sudo cmake --install build
|
sudo cmake --install build
|
||||||
```
|
```
|
||||||
|
|
||||||
## TODO
|
|
||||||
|
|
||||||
- [ ] Support for generating client headers
|
|
||||||
|
|
@ -2,11 +2,11 @@
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1713537308,
|
"lastModified": 1721138476,
|
||||||
"narHash": "sha256-XtTSSIB2DA6tOv+l0FhvfDMiyCmhoRbNB+0SeInZkbk=",
|
"narHash": "sha256-+W5eZOhhemLQxelojLxETfbFbc19NWawsXBlapYpqIA=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "5c24cf2f0a12ad855f444c30b2421d044120c66f",
|
"rev": "ad0b5eed1b6031efaed382844806550c3dcb4206",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
|
||||||
11
flake.nix
11
flake.nix
|
|
@ -18,18 +18,26 @@
|
||||||
localSystem.system = system;
|
localSystem.system = system;
|
||||||
overlays = with self.overlays; [hyprwayland-scanner];
|
overlays = with self.overlays; [hyprwayland-scanner];
|
||||||
});
|
});
|
||||||
|
pkgsCrossFor = eachSystem (system: crossSystem:
|
||||||
|
import nixpkgs {
|
||||||
|
localSystem = system;
|
||||||
|
crossSystem = crossSystem;
|
||||||
|
overlays = with self.overlays; [hyprwayland-scanner];
|
||||||
|
});
|
||||||
mkDate = longDate: (lib.concatStringsSep "-" [
|
mkDate = longDate: (lib.concatStringsSep "-" [
|
||||||
(builtins.substring 0 4 longDate)
|
(builtins.substring 0 4 longDate)
|
||||||
(builtins.substring 4 2 longDate)
|
(builtins.substring 4 2 longDate)
|
||||||
(builtins.substring 6 2 longDate)
|
(builtins.substring 6 2 longDate)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
version = lib.removeSuffix "\n" (builtins.readFile ./VERSION);
|
||||||
in {
|
in {
|
||||||
overlays = {
|
overlays = {
|
||||||
default = self.overlays.hyprwayland-scanner;
|
default = self.overlays.hyprwayland-scanner;
|
||||||
hyprwayland-scanner = final: prev: {
|
hyprwayland-scanner = final: prev: {
|
||||||
hyprwayland-scanner = final.callPackage ./nix/default.nix {
|
hyprwayland-scanner = final.callPackage ./nix/default.nix {
|
||||||
stdenv = final.gcc13Stdenv;
|
stdenv = final.gcc13Stdenv;
|
||||||
version = "0.1.0" + "+date=" + (mkDate (self.lastModifiedDate or "19700101")) + "_" + (self.shortRev or "dirty");
|
version = version + "+date=" + (mkDate (self.lastModifiedDate or "19700101")) + "_" + (self.shortRev or "dirty");
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
@ -37,6 +45,7 @@
|
||||||
packages = eachSystem (system: {
|
packages = eachSystem (system: {
|
||||||
default = self.packages.${system}.hyprwayland-scanner;
|
default = self.packages.${system}.hyprwayland-scanner;
|
||||||
inherit (pkgsFor.${system}) hyprwayland-scanner;
|
inherit (pkgsFor.${system}) hyprwayland-scanner;
|
||||||
|
hyprwayland-scanner-cross = (pkgsCrossFor.${system} "aarch64-linux").hyprwayland-scanner;
|
||||||
});
|
});
|
||||||
|
|
||||||
formatter = eachSystem (system: pkgsFor.${system}.alejandra);
|
formatter = eachSystem (system: pkgsFor.${system}.alejandra);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,9 @@ stdenv.mkDerivation {
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
cmake
|
cmake
|
||||||
pkg-config
|
pkg-config
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
pugixml
|
pugixml
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
393
src/main.cpp
393
src/main.cpp
|
|
@ -9,32 +9,31 @@
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
bool waylandEnums = false;
|
bool waylandEnums = false;
|
||||||
|
bool clientCode = false;
|
||||||
|
bool noInterfaces = false;
|
||||||
|
|
||||||
struct SRequestArgument {
|
struct SRequestArgument {
|
||||||
std::string wlType;
|
std::string wlType;
|
||||||
std::string interface;
|
std::string interface;
|
||||||
std::string enumName;
|
std::string enumName;
|
||||||
std::string name;
|
std::string name;
|
||||||
|
bool newType = false;
|
||||||
bool allowNull = false;
|
bool allowNull = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SRequest {
|
struct SWaylandFunction {
|
||||||
std::vector<SRequestArgument> args;
|
|
||||||
std::string name;
|
|
||||||
std::string since;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SEvent {
|
|
||||||
std::vector<SRequestArgument> args;
|
std::vector<SRequestArgument> args;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string since;
|
std::string since;
|
||||||
|
std::string newIdType = ""; // client only
|
||||||
|
bool destructor = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SInterface {
|
struct SInterface {
|
||||||
std::vector<SRequest> requests;
|
std::vector<SWaylandFunction> requests;
|
||||||
std::vector<SEvent> events;
|
std::vector<SWaylandFunction> events;
|
||||||
std::string name;
|
std::string name;
|
||||||
int version = 1;
|
int version = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SEnum {
|
struct SEnum {
|
||||||
|
|
@ -108,17 +107,22 @@ std::string WPTypeToCType(const SRequestArgument& arg, bool event /* events pass
|
||||||
return "uint32_t";
|
return "uint32_t";
|
||||||
|
|
||||||
// enum
|
// enum
|
||||||
if (!arg.enumName.empty())
|
if (!arg.enumName.empty()) {
|
||||||
for (auto& e : XMLDATA.enums) {
|
for (auto& e : XMLDATA.enums) {
|
||||||
if (e.nameOriginal == arg.enumName)
|
if (e.nameOriginal == arg.enumName)
|
||||||
return e.name;
|
return e.name;
|
||||||
}
|
}
|
||||||
|
return "uint32_t";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!event && clientCode && arg.wlType == "new_id")
|
||||||
|
return "wl_proxy*";
|
||||||
|
|
||||||
// iface
|
// iface
|
||||||
if (!arg.interface.empty() && event) {
|
if (!arg.interface.empty() && event) {
|
||||||
for (auto& i : XMLDATA.ifaces) {
|
for (auto& i : XMLDATA.ifaces) {
|
||||||
if (i.name == arg.interface)
|
if (i.name == arg.interface)
|
||||||
return camelize("C_" + arg.interface + "*");
|
return camelize((clientCode ? "CC_" : "C_") + arg.interface + "*");
|
||||||
}
|
}
|
||||||
return "wl_resource*";
|
return "wl_resource*";
|
||||||
}
|
}
|
||||||
|
|
@ -129,7 +133,7 @@ std::string WPTypeToCType(const SRequestArgument& arg, bool event /* events pass
|
||||||
if (!arg.interface.empty() && event && !ignoreTypes) {
|
if (!arg.interface.empty() && event && !ignoreTypes) {
|
||||||
for (auto& i : XMLDATA.ifaces) {
|
for (auto& i : XMLDATA.ifaces) {
|
||||||
if (i.name == arg.interface)
|
if (i.name == arg.interface)
|
||||||
return camelize("C_" + arg.interface + "*");
|
return camelize((clientCode ? "CC_" : "C_") + arg.interface + "*");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "wl_resource*";
|
return "wl_resource*";
|
||||||
|
|
@ -187,12 +191,17 @@ void parseXML(pugi::xml_document& doc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& rq : iface.children("request")) {
|
for (auto& rq : iface.children("request")) {
|
||||||
SRequest srq;
|
SWaylandFunction srq;
|
||||||
srq.name = rq.attribute("name").as_string();
|
srq.name = rq.attribute("name").as_string();
|
||||||
srq.since = rq.attribute("since").as_string();
|
srq.since = rq.attribute("since").as_string();
|
||||||
|
srq.destructor = rq.attribute("type").as_string() == std::string{"destructor"};
|
||||||
|
|
||||||
for (auto& arg : rq.children("arg")) {
|
for (auto& arg : rq.children("arg")) {
|
||||||
SRequestArgument sargm;
|
SRequestArgument sargm;
|
||||||
|
if (arg.attribute("type").as_string() == std::string{"new_id"} && clientCode)
|
||||||
|
srq.newIdType = arg.attribute("interface").as_string();
|
||||||
|
|
||||||
|
sargm.newType = arg.attribute("type").as_string() == std::string{"new_id"} && clientCode;
|
||||||
sargm.name = sanitize(arg.attribute("name").as_string());
|
sargm.name = sanitize(arg.attribute("name").as_string());
|
||||||
sargm.wlType = arg.attribute("type").as_string();
|
sargm.wlType = arg.attribute("type").as_string();
|
||||||
sargm.interface = arg.attribute("interface").as_string();
|
sargm.interface = arg.attribute("interface").as_string();
|
||||||
|
|
@ -206,9 +215,10 @@ void parseXML(pugi::xml_document& doc) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& ev : iface.children("event")) {
|
for (auto& ev : iface.children("event")) {
|
||||||
SEvent sev;
|
SWaylandFunction sev;
|
||||||
sev.name = ev.attribute("name").as_string();
|
sev.name = ev.attribute("name").as_string();
|
||||||
sev.since = ev.attribute("since").as_string();
|
sev.since = ev.attribute("since").as_string();
|
||||||
|
sev.destructor = ev.attribute("type").as_string() == std::string{"destructor"};
|
||||||
|
|
||||||
for (auto& arg : ev.children("arg")) {
|
for (auto& arg : ev.children("arg")) {
|
||||||
SRequestArgument sargm;
|
SRequestArgument sargm;
|
||||||
|
|
@ -231,19 +241,20 @@ void parseXML(pugi::xml_document& doc) {
|
||||||
void parseHeader() {
|
void parseHeader() {
|
||||||
|
|
||||||
// add some boilerplate
|
// add some boilerplate
|
||||||
HEADER += R"#(#pragma once
|
HEADER += std::format(R"#(#pragma once
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <wayland-server.h>
|
{}
|
||||||
|
|
||||||
#define F std::function
|
#define F std::function
|
||||||
|
|
||||||
struct wl_client;
|
{}
|
||||||
struct wl_resource;
|
|
||||||
|
|
||||||
)#";
|
)#",
|
||||||
|
(clientCode ? "#include <wayland-client.h>" : "#include <wayland-server.h>"),
|
||||||
|
(clientCode ? "struct wl_proxy;\ntypedef wl_proxy wl_resource;" : "struct wl_client;\nstruct wl_resource;"));
|
||||||
|
|
||||||
// parse all enums
|
// parse all enums
|
||||||
if (!waylandEnums) {
|
if (!waylandEnums) {
|
||||||
|
|
@ -258,13 +269,13 @@ struct wl_resource;
|
||||||
|
|
||||||
// fw declare all classes
|
// fw declare all classes
|
||||||
for (auto& iface : XMLDATA.ifaces) {
|
for (auto& iface : XMLDATA.ifaces) {
|
||||||
const auto IFACE_CLASS_NAME_CAMEL = camelize("C_" + iface.name);
|
const auto IFACE_CLASS_NAME_CAMEL = camelize((clientCode ? "CC_" : "C_") + iface.name);
|
||||||
HEADER += std::format("\nclass {};", IFACE_CLASS_NAME_CAMEL);
|
HEADER += std::format("\nclass {};", IFACE_CLASS_NAME_CAMEL);
|
||||||
|
|
||||||
for (auto& rq : iface.requests) {
|
for (auto& rq : iface.requests) {
|
||||||
for (auto& arg : rq.args) {
|
for (auto& arg : rq.args) {
|
||||||
if (!arg.interface.empty()) {
|
if (!arg.interface.empty()) {
|
||||||
HEADER += std::format("\nclass {};", camelize("C_" + arg.interface));
|
HEADER += std::format("\nclass {};", camelize((clientCode ? "CC_" : "C_") + arg.interface));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -272,7 +283,7 @@ struct wl_resource;
|
||||||
for (auto& rq : iface.events) {
|
for (auto& rq : iface.events) {
|
||||||
for (auto& arg : rq.args) {
|
for (auto& arg : rq.args) {
|
||||||
if (!arg.interface.empty()) {
|
if (!arg.interface.empty()) {
|
||||||
HEADER += std::format("\nclass {};", camelize("C_" + arg.interface));
|
HEADER += std::format("\nclass {};", camelize((clientCode ? "CC_" : "C_") + arg.interface));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -291,15 +302,32 @@ struct wl_resource;
|
||||||
|
|
||||||
for (auto& iface : XMLDATA.ifaces) {
|
for (auto& iface : XMLDATA.ifaces) {
|
||||||
const auto IFACE_NAME_CAMEL = camelize(iface.name);
|
const auto IFACE_NAME_CAMEL = camelize(iface.name);
|
||||||
const auto IFACE_CLASS_NAME_CAMEL = camelize("C_" + iface.name);
|
const auto IFACE_CLASS_NAME_CAMEL = camelize((clientCode ? "CC_" : "C_") + iface.name);
|
||||||
|
|
||||||
|
if (!clientCode) {
|
||||||
|
HEADER += std::format(R"#(
|
||||||
|
struct {}DestroyWrapper {{
|
||||||
|
wl_listener listener;
|
||||||
|
{}* parent = nullptr;
|
||||||
|
}};
|
||||||
|
)#",
|
||||||
|
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL);
|
||||||
|
}
|
||||||
|
|
||||||
// begin the class
|
// begin the class
|
||||||
HEADER += std::format(R"#(
|
HEADER +=
|
||||||
|
std::format(R"#(
|
||||||
|
|
||||||
class {} {{
|
class {} {{
|
||||||
public:
|
public:
|
||||||
{}(wl_client* client, uint32_t version, uint32_t id);
|
{}({});
|
||||||
~{}();
|
~{}();
|
||||||
|
|
||||||
|
)#",
|
||||||
|
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, (clientCode ? "wl_resource*" : "wl_client* client, uint32_t version, uint32_t id"), IFACE_CLASS_NAME_CAMEL);
|
||||||
|
|
||||||
|
if (!clientCode) {
|
||||||
|
HEADER += std::format(R"#(
|
||||||
// set a listener for when this resource is _being_ destroyed
|
// set a listener for when this resource is _being_ destroyed
|
||||||
void setOnDestroy(F<void({}*)> handler) {{
|
void setOnDestroy(F<void({}*)> handler) {{
|
||||||
onDestroy = handler;
|
onDestroy = handler;
|
||||||
|
|
@ -314,7 +342,7 @@ class {} {{
|
||||||
void* data() {{
|
void* data() {{
|
||||||
return pData;
|
return pData;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
// get the raw wl_resource ptr
|
// get the raw wl_resource ptr
|
||||||
wl_resource* resource() {{
|
wl_resource* resource() {{
|
||||||
return pResource;
|
return pResource;
|
||||||
|
|
@ -339,17 +367,41 @@ class {} {{
|
||||||
int version() {{
|
int version() {{
|
||||||
return wl_resource_get_version(pResource);
|
return wl_resource_get_version(pResource);
|
||||||
}}
|
}}
|
||||||
|
)#",
|
||||||
|
IFACE_CLASS_NAME_CAMEL);
|
||||||
|
} else {
|
||||||
|
HEADER += R"#(
|
||||||
|
// set the data for this resource
|
||||||
|
void setData(void* data) {{
|
||||||
|
pData = data;
|
||||||
|
}}
|
||||||
|
|
||||||
)#",
|
// get the data for this resource
|
||||||
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL);
|
void* data() {{
|
||||||
|
return pData;
|
||||||
|
}}
|
||||||
|
|
||||||
|
// get the raw wl_resource (wl_proxy) ptr
|
||||||
|
wl_resource* resource() {{
|
||||||
|
return pResource;
|
||||||
|
}}
|
||||||
|
|
||||||
|
// get the resource version
|
||||||
|
int version() {{
|
||||||
|
return wl_proxy_get_version(pResource);
|
||||||
|
}}
|
||||||
|
)#";
|
||||||
|
}
|
||||||
|
|
||||||
// add all setters for requests
|
// add all setters for requests
|
||||||
HEADER += "\n // --------------- Requests --------------- //\n\n";
|
HEADER += "\n // --------------- Requests --------------- //\n\n";
|
||||||
|
|
||||||
for (auto& rq : iface.requests) {
|
for (auto& rq : (clientCode ? iface.events : iface.requests)) {
|
||||||
|
|
||||||
std::string args = ", ";
|
std::string args = ", ";
|
||||||
for (auto& arg : rq.args) {
|
for (auto& arg : rq.args) {
|
||||||
|
if (arg.newType)
|
||||||
|
continue;
|
||||||
args += WPTypeToCType(arg, false) + ", ";
|
args += WPTypeToCType(arg, false) + ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -363,9 +415,11 @@ class {} {{
|
||||||
|
|
||||||
HEADER += "\n // --------------- Events --------------- //\n\n";
|
HEADER += "\n // --------------- Events --------------- //\n\n";
|
||||||
|
|
||||||
for (auto& ev : iface.events) {
|
for (auto& ev : (!clientCode ? iface.events : iface.requests)) {
|
||||||
std::string args = "";
|
std::string args = "";
|
||||||
for (auto& arg : ev.args) {
|
for (auto& arg : ev.args) {
|
||||||
|
if (arg.newType)
|
||||||
|
continue;
|
||||||
args += WPTypeToCType(arg, true) + ", ";
|
args += WPTypeToCType(arg, true) + ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -374,22 +428,26 @@ class {} {{
|
||||||
args.pop_back();
|
args.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
HEADER += std::format(" void {}({});\n", camelize("send_" + ev.name), args);
|
HEADER += std::format(" {} {}({});\n", ev.newIdType.empty() ? "void" : "wl_proxy*", camelize("send_" + ev.name), args);
|
||||||
}
|
}
|
||||||
|
|
||||||
// dangerous ones
|
// dangerous ones
|
||||||
for (auto& ev : iface.events) {
|
if (!clientCode) {
|
||||||
std::string args = "";
|
for (auto& ev : (!clientCode ? iface.events : iface.requests)) {
|
||||||
for (auto& arg : ev.args) {
|
std::string args = "";
|
||||||
args += WPTypeToCType(arg, true, true) + ", ";
|
for (auto& arg : ev.args) {
|
||||||
}
|
if (arg.newType)
|
||||||
|
continue;
|
||||||
|
args += WPTypeToCType(arg, true, true) + ", ";
|
||||||
|
}
|
||||||
|
|
||||||
if (!args.empty()) {
|
if (!args.empty()) {
|
||||||
args.pop_back();
|
args.pop_back();
|
||||||
args.pop_back();
|
args.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
HEADER += std::format(" void {}({});\n", camelize("send_" + ev.name + "_raw"), args);
|
HEADER += std::format(" void {}({});\n", camelize("send_" + ev.name + "_raw"), args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// end events
|
// end events
|
||||||
|
|
@ -400,10 +458,12 @@ class {} {{
|
||||||
// start requests storage
|
// start requests storage
|
||||||
HEADER += " struct {\n";
|
HEADER += " struct {\n";
|
||||||
|
|
||||||
for (auto& rq : iface.requests) {
|
for (auto& rq : (clientCode ? iface.events : iface.requests)) {
|
||||||
|
|
||||||
std::string args = ", ";
|
std::string args = ", ";
|
||||||
for (auto& arg : rq.args) {
|
for (auto& arg : rq.args) {
|
||||||
|
if (arg.newType)
|
||||||
|
continue;
|
||||||
args += WPTypeToCType(arg, false) + ", ";
|
args += WPTypeToCType(arg, false) + ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -419,17 +479,26 @@ class {} {{
|
||||||
HEADER += " } requests;\n";
|
HEADER += " } requests;\n";
|
||||||
|
|
||||||
// constant resource stuff
|
// constant resource stuff
|
||||||
HEADER += std::format(R"#(
|
if (!clientCode) {
|
||||||
|
HEADER += std::format(R"#(
|
||||||
void onDestroyCalled();
|
void onDestroyCalled();
|
||||||
|
|
||||||
F<void({}*)> onDestroy;
|
F<void({}*)> onDestroy;
|
||||||
|
|
||||||
wl_resource* pResource = nullptr;
|
wl_resource* pResource = nullptr;
|
||||||
|
|
||||||
wl_listener resourceDestroyListener;
|
{}DestroyWrapper resourceDestroyListener;
|
||||||
|
|
||||||
void* pData = nullptr;)#",
|
void* pData = nullptr;)#",
|
||||||
IFACE_CLASS_NAME_CAMEL);
|
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL);
|
||||||
|
} else {
|
||||||
|
HEADER += R"#(
|
||||||
|
wl_resource* pResource = nullptr;
|
||||||
|
|
||||||
|
bool destroyed = false;
|
||||||
|
|
||||||
|
void* pData = nullptr;)#";
|
||||||
|
}
|
||||||
|
|
||||||
HEADER += "\n};\n\n";
|
HEADER += "\n};\n\n";
|
||||||
}
|
}
|
||||||
|
|
@ -510,14 +579,16 @@ static const wl_interface* dummyTypes[] = { nullptr };
|
||||||
const auto IFACE_WL_NAME = iface.name + "_interface";
|
const auto IFACE_WL_NAME = iface.name + "_interface";
|
||||||
const auto IFACE_NAME = iface.name;
|
const auto IFACE_NAME = iface.name;
|
||||||
const auto IFACE_NAME_CAMEL = camelize(iface.name);
|
const auto IFACE_NAME_CAMEL = camelize(iface.name);
|
||||||
const auto IFACE_CLASS_NAME_CAMEL = camelize("C_" + iface.name);
|
const auto IFACE_CLASS_NAME_CAMEL = camelize((clientCode ? "CC_" : "C_") + iface.name);
|
||||||
|
|
||||||
// create handlers
|
// create handlers
|
||||||
for (auto& rq : iface.requests) {
|
for (auto& rq : (clientCode ? iface.events : iface.requests)) {
|
||||||
const auto REQUEST_NAME = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_" + rq.name);
|
const auto REQUEST_NAME = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_" + rq.name);
|
||||||
|
|
||||||
std::string argsC = ", ";
|
std::string argsC = ", ";
|
||||||
for (auto& arg : rq.args) {
|
for (auto& arg : rq.args) {
|
||||||
|
if (arg.newType)
|
||||||
|
continue;
|
||||||
argsC += WPTypeToCType(arg, false) + " " + arg.name + ", ";
|
argsC += WPTypeToCType(arg, false) + " " + arg.name + ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -534,24 +605,38 @@ static const wl_interface* dummyTypes[] = { nullptr };
|
||||||
argsN.pop_back();
|
argsN.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
SOURCE += std::format(R"#(
|
if (!clientCode) {
|
||||||
|
SOURCE += std::format(R"#(
|
||||||
static void {}(wl_client* client, wl_resource* resource{}) {{
|
static void {}(wl_client* client, wl_resource* resource{}) {{
|
||||||
const auto PO = ({}*)wl_resource_get_user_data(resource);
|
const auto PO = ({}*)wl_resource_get_user_data(resource);
|
||||||
if (PO && PO->requests.{})
|
if (PO && PO->requests.{})
|
||||||
PO->requests.{}(PO{});
|
PO->requests.{}(PO{});
|
||||||
}}
|
}}
|
||||||
)#",
|
)#",
|
||||||
REQUEST_NAME, argsC, IFACE_CLASS_NAME_CAMEL, camelize(rq.name), camelize(rq.name), argsN);
|
REQUEST_NAME, argsC, IFACE_CLASS_NAME_CAMEL, camelize(rq.name), camelize(rq.name), argsN);
|
||||||
|
} else {
|
||||||
|
SOURCE += std::format(R"#(
|
||||||
|
static void {}(void* data, void* resource{}) {{
|
||||||
|
const auto PO = ({}*)data;
|
||||||
|
if (PO && PO->requests.{})
|
||||||
|
PO->requests.{}(PO{});
|
||||||
|
}}
|
||||||
|
)#",
|
||||||
|
REQUEST_NAME, argsC, IFACE_CLASS_NAME_CAMEL, camelize(rq.name), camelize(rq.name), argsN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// destroy handler
|
// destroy handler
|
||||||
SOURCE += std::format(R"#(
|
if (!clientCode) {
|
||||||
|
SOURCE += std::format(R"#(
|
||||||
static void _{}__DestroyListener(wl_listener* l, void* d) {{
|
static void _{}__DestroyListener(wl_listener* l, void* d) {{
|
||||||
{}* pResource = wl_container_of(l, pResource, resourceDestroyListener);
|
{}DestroyWrapper *wrap = wl_container_of(l, wrap, listener);
|
||||||
|
{}* pResource = wrap->parent;
|
||||||
pResource->onDestroyCalled();
|
pResource->onDestroyCalled();
|
||||||
}}
|
}}
|
||||||
)#",
|
)#",
|
||||||
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL);
|
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL);
|
||||||
|
}
|
||||||
|
|
||||||
// create vtable
|
// create vtable
|
||||||
|
|
||||||
|
|
@ -562,7 +647,7 @@ static const void* {}[] = {{
|
||||||
)#",
|
)#",
|
||||||
IFACE_VTABLE_NAME);
|
IFACE_VTABLE_NAME);
|
||||||
|
|
||||||
for (auto& rq : iface.requests) {
|
for (auto& rq : (clientCode ? iface.events : iface.requests)) {
|
||||||
const auto REQUEST_NAME = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_" + rq.name);
|
const auto REQUEST_NAME = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_" + rq.name);
|
||||||
SOURCE += std::format(" (void*){},\n", REQUEST_NAME);
|
SOURCE += std::format(" (void*){},\n", REQUEST_NAME);
|
||||||
}
|
}
|
||||||
|
|
@ -572,11 +657,13 @@ static const void* {}[] = {{
|
||||||
// create events
|
// create events
|
||||||
|
|
||||||
int evid = 0;
|
int evid = 0;
|
||||||
for (auto& ev : iface.events) {
|
for (auto& ev : (!clientCode ? iface.events : iface.requests)) {
|
||||||
const auto EVENT_NAME = camelize("send_" + ev.name);
|
const auto EVENT_NAME = camelize("send_" + ev.name);
|
||||||
|
|
||||||
std::string argsC = "";
|
std::string argsC = "";
|
||||||
for (auto& arg : ev.args) {
|
for (auto& arg : ev.args) {
|
||||||
|
if (arg.newType)
|
||||||
|
continue;
|
||||||
argsC += WPTypeToCType(arg, true) + " " + arg.name + ", ";
|
argsC += WPTypeToCType(arg, true) + " " + arg.name + ", ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -587,60 +674,85 @@ static const void* {}[] = {{
|
||||||
|
|
||||||
std::string argsN = ", ";
|
std::string argsN = ", ";
|
||||||
for (auto& arg : ev.args) {
|
for (auto& arg : ev.args) {
|
||||||
|
if (arg.newType)
|
||||||
|
continue;
|
||||||
if (!WPTypeToCType(arg, true).starts_with("C"))
|
if (!WPTypeToCType(arg, true).starts_with("C"))
|
||||||
argsN += arg.name + ", ";
|
argsN += arg.name + ", ";
|
||||||
else
|
else
|
||||||
argsN += arg.name + "->pResource, ";
|
argsN += (arg.name + " ? " + arg.name + "->pResource : nullptr, ");
|
||||||
}
|
}
|
||||||
|
|
||||||
argsN.pop_back();
|
argsN.pop_back();
|
||||||
argsN.pop_back();
|
argsN.pop_back();
|
||||||
|
|
||||||
SOURCE += std::format(R"#(
|
if (!clientCode) {
|
||||||
|
SOURCE += std::format(R"#(
|
||||||
void {}::{}({}) {{
|
void {}::{}({}) {{
|
||||||
if (!pResource)
|
if (!pResource)
|
||||||
return;
|
return;
|
||||||
wl_resource_post_event(pResource, {}{});
|
wl_resource_post_event(pResource, {}{});
|
||||||
}}
|
}}
|
||||||
)#",
|
)#",
|
||||||
IFACE_CLASS_NAME_CAMEL, EVENT_NAME, argsC, evid, argsN);
|
IFACE_CLASS_NAME_CAMEL, EVENT_NAME, argsC, evid, argsN);
|
||||||
|
} else {
|
||||||
|
std::string retType = ev.newIdType.empty() ? "void" : "wl_proxy";
|
||||||
|
std::string ptrRetType = ev.newIdType.empty() ? "void" : "wl_proxy*";
|
||||||
|
std::string flags = ev.destructor ? "1" : "0";
|
||||||
|
SOURCE += std::format(R"#(
|
||||||
|
{} {}::{}({}) {{
|
||||||
|
if (!pResource)
|
||||||
|
return{};{}
|
||||||
|
|
||||||
|
auto proxy = wl_proxy_marshal_flags((wl_proxy*)pResource, {}, {}, wl_proxy_get_version((wl_proxy*)pResource), {}{}{});{}
|
||||||
|
}}
|
||||||
|
)#",
|
||||||
|
ptrRetType, IFACE_CLASS_NAME_CAMEL, EVENT_NAME, argsC, (ev.newIdType.empty() ? "" : " nullptr"),
|
||||||
|
(ev.destructor ? "\n destroyed = true;" : ""), evid, (ev.newIdType.empty() ? "nullptr" : "&" + ev.newIdType + "_interface"), flags,
|
||||||
|
(!ev.newIdType.empty() ? ", nullptr" : ""), argsN, (ev.newIdType.empty() ? "\n proxy;" : "\n\n return proxy;"));
|
||||||
|
}
|
||||||
|
|
||||||
evid++;
|
evid++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// dangerous
|
// dangerous
|
||||||
evid = 0;
|
if (!clientCode) {
|
||||||
for (auto& ev : iface.events) {
|
evid = 0;
|
||||||
const auto EVENT_NAME = camelize("send_" + ev.name + "_raw");
|
for (auto& ev : iface.events) {
|
||||||
|
const auto EVENT_NAME = camelize("send_" + ev.name + "_raw");
|
||||||
|
|
||||||
std::string argsC = "";
|
std::string argsC = "";
|
||||||
for (auto& arg : ev.args) {
|
for (auto& arg : ev.args) {
|
||||||
argsC += WPTypeToCType(arg, true, true) + " " + arg.name + ", ";
|
if (arg.newType)
|
||||||
}
|
continue;
|
||||||
|
argsC += WPTypeToCType(arg, true, true) + " " + arg.name + ", ";
|
||||||
|
}
|
||||||
|
|
||||||
if (!argsC.empty()) {
|
if (!argsC.empty()) {
|
||||||
argsC.pop_back();
|
argsC.pop_back();
|
||||||
argsC.pop_back();
|
argsC.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string argsN = ", ";
|
std::string argsN = ", ";
|
||||||
for (auto& arg : ev.args) {
|
for (auto& arg : ev.args) {
|
||||||
argsN += arg.name + ", ";
|
if (arg.newType)
|
||||||
}
|
continue;
|
||||||
|
argsN += arg.name + ", ";
|
||||||
|
}
|
||||||
|
|
||||||
argsN.pop_back();
|
argsN.pop_back();
|
||||||
argsN.pop_back();
|
argsN.pop_back();
|
||||||
|
|
||||||
SOURCE += std::format(R"#(
|
SOURCE += std::format(R"#(
|
||||||
void {}::{}({}) {{
|
void {}::{}({}) {{
|
||||||
if (!pResource)
|
if (!pResource)
|
||||||
return;
|
return;
|
||||||
wl_resource_post_event(pResource, {}{});
|
wl_resource_post_event(pResource, {}{});
|
||||||
}}
|
}}
|
||||||
)#",
|
)#",
|
||||||
IFACE_CLASS_NAME_CAMEL, EVENT_NAME, argsC, evid, argsN);
|
IFACE_CLASS_NAME_CAMEL, EVENT_NAME, argsC, evid, argsN);
|
||||||
|
|
||||||
evid++;
|
evid++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// wayland interfaces and stuff
|
// wayland interfaces and stuff
|
||||||
|
|
@ -687,49 +799,52 @@ void {}::{}({}) {{
|
||||||
const auto MESSAGE_NAME_EVENTS = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_events");
|
const auto MESSAGE_NAME_EVENTS = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_events");
|
||||||
|
|
||||||
// message
|
// message
|
||||||
if (iface.requests.size() > 0) {
|
if (!noInterfaces) {
|
||||||
SOURCE += std::format(R"#(
|
if (iface.requests.size() > 0) {
|
||||||
|
SOURCE += std::format(R"#(
|
||||||
static const wl_message {}[] = {{
|
static const wl_message {}[] = {{
|
||||||
)#",
|
)#",
|
||||||
MESSAGE_NAME_REQUESTS);
|
MESSAGE_NAME_REQUESTS);
|
||||||
for (auto& rq : iface.requests) {
|
for (auto& rq : iface.requests) {
|
||||||
// create type table
|
// create type table
|
||||||
const auto TYPE_TABLE_NAME = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_" + rq.name + "_types");
|
const auto TYPE_TABLE_NAME = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_" + rq.name + "_types");
|
||||||
|
|
||||||
SOURCE += std::format(" {{ \"{}\", \"{}\", {}}},\n", rq.name, argsToShort(rq.args, rq.since), rq.args.empty() ? "dummyTypes + 0" : TYPE_TABLE_NAME + " + 0");
|
SOURCE += std::format(" {{ \"{}\", \"{}\", {}}},\n", rq.name, argsToShort(rq.args, rq.since), rq.args.empty() ? "dummyTypes + 0" : TYPE_TABLE_NAME + " + 0");
|
||||||
|
}
|
||||||
|
|
||||||
|
SOURCE += "};\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
SOURCE += "};\n";
|
if (iface.events.size() > 0) {
|
||||||
}
|
SOURCE += std::format(R"#(
|
||||||
|
|
||||||
if (iface.events.size() > 0) {
|
|
||||||
SOURCE += std::format(R"#(
|
|
||||||
static const wl_message {}[] = {{
|
static const wl_message {}[] = {{
|
||||||
)#",
|
)#",
|
||||||
MESSAGE_NAME_EVENTS);
|
MESSAGE_NAME_EVENTS);
|
||||||
for (auto& ev : iface.events) {
|
for (auto& ev : iface.events) {
|
||||||
// create type table
|
// create type table
|
||||||
const auto TYPE_TABLE_NAME = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_" + ev.name + "_types");
|
const auto TYPE_TABLE_NAME = camelize(std::string{"_"} + "C_" + IFACE_NAME + "_" + ev.name + "_types");
|
||||||
|
|
||||||
SOURCE += std::format(" {{ \"{}\", \"{}\", {}}},\n", ev.name, argsToShort(ev.args, ev.since), ev.args.empty() ? "dummyTypes + 0" : TYPE_TABLE_NAME + " + 0");
|
SOURCE += std::format(" {{ \"{}\", \"{}\", {}}},\n", ev.name, argsToShort(ev.args, ev.since), ev.args.empty() ? "dummyTypes + 0" : TYPE_TABLE_NAME + " + 0");
|
||||||
|
}
|
||||||
|
|
||||||
|
SOURCE += "};\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
SOURCE += "};\n";
|
// iface
|
||||||
}
|
SOURCE += std::format(R"#(
|
||||||
|
|
||||||
// iface
|
|
||||||
SOURCE += std::format(R"#(
|
|
||||||
const wl_interface {} = {{
|
const wl_interface {} = {{
|
||||||
"{}", {},
|
"{}", {},
|
||||||
{}, {},
|
{}, {},
|
||||||
{}, {},
|
{}, {},
|
||||||
}};
|
}};
|
||||||
)#",
|
)#",
|
||||||
IFACE_WL_NAME, iface.name, iface.version, iface.requests.size(), (iface.requests.size() > 0 ? MESSAGE_NAME_REQUESTS : "nullptr"), iface.events.size(),
|
IFACE_WL_NAME, iface.name, iface.version, iface.requests.size(), (iface.requests.size() > 0 ? MESSAGE_NAME_REQUESTS : "nullptr"),
|
||||||
(iface.events.size() > 0 ? MESSAGE_NAME_EVENTS : "nullptr"));
|
iface.events.size(), (iface.events.size() > 0 ? MESSAGE_NAME_EVENTS : "nullptr"));
|
||||||
|
}
|
||||||
|
|
||||||
// protocol body
|
// protocol body
|
||||||
SOURCE += std::format(R"#(
|
if (!clientCode) {
|
||||||
|
SOURCE += std::format(R"#(
|
||||||
{}::{}(wl_client* client, uint32_t version, uint32_t id) {{
|
{}::{}(wl_client* client, uint32_t version, uint32_t id) {{
|
||||||
pResource = wl_resource_create(client, &{}, version, id);
|
pResource = wl_resource_create(client, &{}, version, id);
|
||||||
|
|
||||||
|
|
@ -737,16 +852,17 @@ const wl_interface {} = {{
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wl_resource_set_user_data(pResource, this);
|
wl_resource_set_user_data(pResource, this);
|
||||||
wl_list_init(&resourceDestroyListener.link);
|
wl_list_init(&resourceDestroyListener.listener.link);
|
||||||
resourceDestroyListener.notify = _{}__DestroyListener;
|
resourceDestroyListener.listener.notify = _{}__DestroyListener;
|
||||||
wl_resource_add_destroy_listener(pResource, &resourceDestroyListener);
|
resourceDestroyListener.parent = this;
|
||||||
|
wl_resource_add_destroy_listener(pResource, &resourceDestroyListener.listener);
|
||||||
|
|
||||||
wl_resource_set_implementation(pResource, {}, this, nullptr);
|
wl_resource_set_implementation(pResource, {}, this, nullptr);
|
||||||
}}
|
}}
|
||||||
|
|
||||||
{}::~{}() {{
|
{}::~{}() {{
|
||||||
wl_list_remove(&resourceDestroyListener.link);
|
wl_list_remove(&resourceDestroyListener.listener.link);
|
||||||
wl_list_init(&resourceDestroyListener.link);
|
wl_list_init(&resourceDestroyListener.listener.link);
|
||||||
|
|
||||||
// if we still own the wayland resource,
|
// if we still own the wayland resource,
|
||||||
// it means we need to destroy it.
|
// it means we need to destroy it.
|
||||||
|
|
@ -758,8 +874,8 @@ const wl_interface {} = {{
|
||||||
|
|
||||||
void {}::onDestroyCalled() {{
|
void {}::onDestroyCalled() {{
|
||||||
wl_resource_set_user_data(pResource, nullptr);
|
wl_resource_set_user_data(pResource, nullptr);
|
||||||
wl_list_remove(&resourceDestroyListener.link);
|
wl_list_remove(&resourceDestroyListener.listener.link);
|
||||||
wl_list_init(&resourceDestroyListener.link);
|
wl_list_init(&resourceDestroyListener.listener.link);
|
||||||
|
|
||||||
// set the resource to nullptr,
|
// set the resource to nullptr,
|
||||||
// as it will be freed. If the consumer does not destroy this resource
|
// as it will be freed. If the consumer does not destroy this resource
|
||||||
|
|
@ -770,10 +886,41 @@ void {}::onDestroyCalled() {{
|
||||||
onDestroy(this);
|
onDestroy(this);
|
||||||
}}
|
}}
|
||||||
)#",
|
)#",
|
||||||
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, IFACE_NAME + "_interface", IFACE_CLASS_NAME_CAMEL, IFACE_VTABLE_NAME, IFACE_CLASS_NAME_CAMEL,
|
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, IFACE_NAME + "_interface", IFACE_CLASS_NAME_CAMEL, IFACE_VTABLE_NAME, IFACE_CLASS_NAME_CAMEL,
|
||||||
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL);
|
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL);
|
||||||
|
} else {
|
||||||
|
std::string DTOR_FUNC = "";
|
||||||
|
|
||||||
for (auto& rq : iface.requests) {
|
for (auto& rq : iface.requests) {
|
||||||
|
if (!rq.destructor)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
DTOR_FUNC = camelize("send_" + rq.name) + "()";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DTOR_FUNC.empty())
|
||||||
|
DTOR_FUNC = "wl_proxy_destroy(pResource)";
|
||||||
|
|
||||||
|
SOURCE += std::format(R"#(
|
||||||
|
{}::{}(wl_resource* resource) {{
|
||||||
|
pResource = resource;
|
||||||
|
|
||||||
|
if (!pResource)
|
||||||
|
return;
|
||||||
|
|
||||||
|
wl_proxy_add_listener(pResource, (void (**)(void))&{}, this);
|
||||||
|
}}
|
||||||
|
|
||||||
|
{}::~{}() {{
|
||||||
|
if (!destroyed)
|
||||||
|
{};
|
||||||
|
}}
|
||||||
|
)#",
|
||||||
|
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, IFACE_VTABLE_NAME, IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, DTOR_FUNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& rq : (clientCode ? iface.events : iface.requests)) {
|
||||||
std::string args = ", ";
|
std::string args = ", ";
|
||||||
for (auto& arg : rq.args) {
|
for (auto& arg : rq.args) {
|
||||||
args += WPTypeToCType(arg, false) + ", ";
|
args += WPTypeToCType(arg, false) + ", ";
|
||||||
|
|
@ -808,6 +955,16 @@ int main(int argc, char** argv, char** envp) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (curarg == "-c" || curarg == "--client") {
|
||||||
|
clientCode = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (curarg == "--no-interfaces") {
|
||||||
|
noInterfaces = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (curarg == "--wayland-enums") {
|
if (curarg == "--wayland-enums") {
|
||||||
waylandEnums = true;
|
waylandEnums = true;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue