Compare commits

...

16 commits
v0.4.2 ... main

Author SHA1 Message Date
SASANO Takayoshi
f6cf414ca0
cmake: add OpenBSD support (no librt) (#21) 2025-11-20 12:04:34 +00:00
Martin
b3b0f1f40a
source: Generate protocol specific dummy_type names (#20) 2025-08-14 16:16:42 +01:00
fcca0c61f9
version: bump to 0.4.5 2025-07-07 16:18:29 +02:00
8fb426b3e5
server: fix empty interface arrays 2025-07-07 11:44:32 +02:00
aa38edd6e3
CI/Nix: add cache-nix-action
Use nixbuild/nix-quick-install-action which pairs well with
nix-community/cache-nix-action.

Should help with build times by reducing the number of packages needing
to be re-downloaded on each run.

Parameters are taken from https://github.com/nix-community/cache-nix-action
and may be tweaked later.
2025-06-20 01:24:29 +03:00
Friday
817918315e
nix: use gcc15 (#17)
also updated dependencies
2025-06-05 18:49:20 +01:00
NyxTrail
e511882b9c
cmake: Make CMAKE builds arch independent (#16) 2025-05-18 18:04:58 +02:00
Honkazel
206367a08d
core: member + designated init and remove redundant cast (#14)
* core: member initialize and rm redundant cast

Both pResource can be member initialized and cast is redundant since 4a53f1a

* use designated initializers
2025-02-18 10:21:20 +01:00
04146df74a
CI: remove deprecated magic-nix-cache-action 2025-02-08 23:10:28 +02:00
de913476b5 version: bump to 0.4.4 2024-12-29 18:31:14 +01:00
4a53f1acc7 client: drop wl_resource usage 2024-12-29 18:30:56 +01:00
3d6681fd35 version: bump to 0.4.3 2024-12-29 18:03:15 +01:00
c0c13f07a0 client: drop wl_resource typedef
this conflicts with some custom wl extension headers

todo: stop using 'wl_resource' in client code altogether...
2024-12-29 18:02:59 +01:00
4d7367b6ee client: use the proper new_id index in marshalling
fixes #13
2024-12-21 15:05:13 +00:00
Austin Horstman
90e87f7fcf
flake.nix: gcc13 -> gcc14; flake.lock: update (#12)
* flake.nix: gcc13 -> gcc14

* flake.lock: update
2024-12-16 22:26:57 +01:00
500c81a9e1 README: clarify function 2024-09-21 00:27:16 +01:00
7 changed files with 87 additions and 34 deletions

View file

@ -7,8 +7,35 @@ jobs:
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: cachix/install-nix-action@v25 - name: Install Nix
- uses: DeterminateSystems/magic-nix-cache-action@main uses: nixbuild/nix-quick-install-action@v31
with:
nix_conf: |
keep-env-derivations = true
keep-outputs = true
- name: Restore and save Nix store
uses: nix-community/cache-nix-action@v6
with:
# restore and save a cache using this key
primary-key: nix-${{ runner.os }}-${{ hashFiles('**/*.nix', '**/flake.lock') }}
# if there's no cache hit, restore a cache by this prefix
restore-prefixes-first-match: nix-${{ runner.os }}-
# collect garbage until the Nix store size (in bytes) is at most this number
# before trying to save a new cache
# 1G = 1073741824
gc-max-store-size-linux: 1G
# do purge caches
purge: true
# purge all versions of the cache
purge-prefixes: nix-${{ runner.os }}-
# created more than this number of seconds ago
purge-created: 0
# or, last accessed more than this number of seconds ago
# relative to the start of the `Post Restore and save Nix store` phase
purge-last-accessed: 0
# except any version with the key that is the same as the `primary-key`
purge-primary-key: never
# not needed (yet) # not needed (yet)
# - uses: cachix/cachix-action@v12 # - uses: cachix/cachix-action@v12

View file

@ -41,7 +41,13 @@ 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 find_library(librt rt)
if("${librt}" MATCHES "librt-NOTFOUND")
unset(LIBRT)
else()
set(LIBRT rt)
endif()
target_link_libraries(hyprwayland-scanner PRIVATE ${LIBRT} Threads::Threads
PkgConfig::deps) PkgConfig::deps)
configure_package_config_file( configure_package_config_file(
@ -51,6 +57,7 @@ configure_package_config_file(
write_basic_package_version_file( write_basic_package_version_file(
"hyprwayland-scanner-config-version.cmake" "hyprwayland-scanner-config-version.cmake"
VERSION "${VERSION}" VERSION "${VERSION}"
ARCH_INDEPENDENT
COMPATIBILITY AnyNewerVersion) COMPATIBILITY AnyNewerVersion)
# Installation # Installation

View file

@ -1,6 +1,9 @@
# hyprwayland-scanner # hyprwayland-scanner
A Hyprland implementation of wayland-scanner, in and for C++. A Hyprland implementation of wayland-scanner, in and for C++.
hw-s automatically generates properly RAII-ready, modern C++ bindings for Wayland protocols, for
either servers or clients.
## Usage ## Usage
```sh ```sh

View file

@ -1 +1 @@
0.4.2 0.4.5

6
flake.lock generated
View file

@ -2,11 +2,11 @@
"nodes": { "nodes": {
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1721138476, "lastModified": 1748929857,
"narHash": "sha256-+W5eZOhhemLQxelojLxETfbFbc19NWawsXBlapYpqIA=", "narHash": "sha256-lcZQ8RhsmhsK8u7LIFsJhsLh/pzR9yZ8yqpTzyGdj+Q=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "ad0b5eed1b6031efaed382844806550c3dcb4206", "rev": "c2a03962b8e24e669fb37b7df10e7c79531ff1a4",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -36,7 +36,7 @@
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.gcc15Stdenv;
version = version + "+date=" + (mkDate (self.lastModifiedDate or "19700101")) + "_" + (self.shortRev or "dirty"); version = version + "+date=" + (mkDate (self.lastModifiedDate or "19700101")) + "_" + (self.shortRev or "dirty");
}; };
}; };

View file

@ -47,6 +47,10 @@ struct {
std::vector<SEnum> enums; std::vector<SEnum> enums;
} XMLDATA; } XMLDATA;
const char* resourceName() {
return clientCode ? "wl_proxy" : "wl_resource";
}
std::string sanitize(const std::string& in) { std::string sanitize(const std::string& in) {
if (in == "namespace") if (in == "namespace")
return "namespace_"; return "namespace_";
@ -124,7 +128,7 @@ std::string WPTypeToCType(const SRequestArgument& arg, bool event /* events pass
if (i.name == arg.interface) if (i.name == arg.interface)
return camelize((clientCode ? "CC_" : "C_") + arg.interface + "*"); return camelize((clientCode ? "CC_" : "C_") + arg.interface + "*");
} }
return "wl_resource*"; return std::string{resourceName()} + "*";
} }
return "uint32_t"; return "uint32_t";
@ -136,7 +140,7 @@ std::string WPTypeToCType(const SRequestArgument& arg, bool event /* events pass
return camelize((clientCode ? "CC_" : "C_") + arg.interface + "*"); return camelize((clientCode ? "CC_" : "C_") + arg.interface + "*");
} }
} }
return "wl_resource*"; return std::string{resourceName()} + "*";
} }
if (arg.wlType == "int" || arg.wlType == "fd") if (arg.wlType == "int" || arg.wlType == "fd")
return "int32_t"; return "int32_t";
@ -241,7 +245,8 @@ void parseXML(pugi::xml_document& doc) {
void parseHeader() { void parseHeader() {
// add some boilerplate // add some boilerplate
HEADER += std::format(R"#(#pragma once HEADER +=
std::format(R"#(#pragma once
#include <functional> #include <functional>
#include <cstdint> #include <cstdint>
@ -253,8 +258,7 @@ void parseHeader() {
{} {}
)#", )#",
(clientCode ? "#include <wayland-client.h>" : "#include <wayland-server.h>"), (clientCode ? "#include <wayland-client.h>" : "#include <wayland-server.h>"), (clientCode ? "struct wl_proxy;" : "struct wl_client;\nstruct wl_resource;"));
(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) {
@ -324,7 +328,7 @@ class {} {{
~{}(); ~{}();
)#", )#",
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, (clientCode ? "wl_resource*" : "wl_client* client, uint32_t version, uint32_t id"), IFACE_CLASS_NAME_CAMEL); IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL, (clientCode ? "wl_proxy*" : "wl_client* client, uint32_t version, uint32_t id"), IFACE_CLASS_NAME_CAMEL);
if (!clientCode) { if (!clientCode) {
HEADER += std::format(R"#( HEADER += std::format(R"#(
@ -382,7 +386,12 @@ class {} {{
}} }}
// get the raw wl_resource (wl_proxy) ptr // get the raw wl_resource (wl_proxy) ptr
wl_resource* resource() {{ wl_proxy* resource() {{
return pResource;
}}
// get the raw wl_proxy ptr
wl_proxy* proxy() {{
return pResource; return pResource;
}} }}
@ -493,7 +502,7 @@ class {} {{
IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL); IFACE_CLASS_NAME_CAMEL, IFACE_CLASS_NAME_CAMEL);
} else { } else {
HEADER += R"#( HEADER += R"#(
wl_resource* pResource = nullptr; wl_proxy* pResource = nullptr;
bool destroyed = false; bool destroyed = false;
@ -507,6 +516,8 @@ class {} {{
} }
void parseSource() { void parseSource() {
std::string DUMMY_TYPE_TABLE_NAME = PROTO_DATA.name + "_dummyTypes";
SOURCE += std::format(R"#(#define private public SOURCE += std::format(R"#(#define private public
#define HYPRWAYLAND_SCANNER_NO_INTERFACES #define HYPRWAYLAND_SCANNER_NO_INTERFACES
#include "{}.hpp" #include "{}.hpp"
@ -518,9 +529,9 @@ void parseSource() {
// reference interfaces // reference interfaces
// dummy // dummy
SOURCE += R"#( SOURCE += std::format(R"#(
static const wl_interface* dummyTypes[] = { nullptr }; static const wl_interface* {}[] = {{ nullptr }};
)#"; )#", DUMMY_TYPE_TABLE_NAME);
SOURCE += R"#( SOURCE += R"#(
// Reference all other interfaces. // Reference all other interfaces.
@ -652,6 +663,10 @@ static const void* {}[] = {{
SOURCE += std::format(" (void*){},\n", REQUEST_NAME); SOURCE += std::format(" (void*){},\n", REQUEST_NAME);
} }
if ((clientCode ? iface.events : iface.requests).empty()) {
SOURCE += " nullptr,\n";
}
SOURCE += "};\n"; SOURCE += "};\n";
// create events // create events
@ -675,8 +690,8 @@ static const void* {}[] = {{
std::string argsN = ", "; std::string argsN = ", ";
for (auto& arg : ev.args) { for (auto& arg : ev.args) {
if (arg.newType) if (arg.newType)
continue; argsN += "nullptr, ";
if (!WPTypeToCType(arg, true).starts_with("C")) else if (!WPTypeToCType(arg, true).starts_with("C"))
argsN += arg.name + ", "; argsN += arg.name + ", ";
else else
argsN += (arg.name + " ? " + arg.name + "->pResource : nullptr, "); argsN += (arg.name + " ? " + arg.name + "->pResource : nullptr, ");
@ -703,12 +718,12 @@ void {}::{}({}) {{
if (!pResource) if (!pResource)
return{};{} return{};{}
auto proxy = wl_proxy_marshal_flags((wl_proxy*)pResource, {}, {}, wl_proxy_get_version((wl_proxy*)pResource), {}{}{});{} auto proxy = wl_proxy_marshal_flags(pResource, {}, {}, wl_proxy_get_version(pResource), {}{});{}
}} }}
)#", )#",
ptrRetType, IFACE_CLASS_NAME_CAMEL, EVENT_NAME, argsC, (ev.newIdType.empty() ? "" : " nullptr"), 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.destructor ? "\n destroyed = true;" : ""), evid, (ev.newIdType.empty() ? "nullptr" : "&" + ev.newIdType + "_interface"), flags, argsN,
(!ev.newIdType.empty() ? ", nullptr" : ""), argsN, (ev.newIdType.empty() ? "\n proxy;" : "\n\n return proxy;")); (ev.newIdType.empty() ? "\n proxy;" : "\n\n return proxy;"));
} }
evid++; evid++;
@ -809,7 +824,8 @@ static const wl_message {}[] = {{
// 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(" {{ .name = \"{}\", .signature = \"{}\", .types = {}}},\n", rq.name, argsToShort(rq.args, rq.since),
rq.args.empty() ? std::format("{} + 0", DUMMY_TYPE_TABLE_NAME) : TYPE_TABLE_NAME + " + 0");
} }
SOURCE += "};\n"; SOURCE += "};\n";
@ -824,7 +840,8 @@ static const wl_message {}[] = {{
// 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(" {{ .name = \"{}\", .signature = \"{}\", .types = {}}},\n", ev.name, argsToShort(ev.args, ev.since),
ev.args.empty() ? std::format("{} + 0", DUMMY_TYPE_TABLE_NAME) : TYPE_TABLE_NAME + " + 0");
} }
SOURCE += "};\n"; SOURCE += "};\n";
@ -833,9 +850,9 @@ static const wl_message {}[] = {{
// iface // iface
SOURCE += std::format(R"#( SOURCE += std::format(R"#(
const wl_interface {} = {{ const wl_interface {} = {{
"{}", {}, .name = "{}", .version = {},
{}, {}, .method_count = {}, .methods = {},
{}, {}, .event_count = {}, .events = {},
}}; }};
)#", )#",
IFACE_WL_NAME, iface.name, iface.version, iface.requests.size(), (iface.requests.size() > 0 ? MESSAGE_NAME_REQUESTS : "nullptr"), IFACE_WL_NAME, iface.name, iface.version, iface.requests.size(), (iface.requests.size() > 0 ? MESSAGE_NAME_REQUESTS : "nullptr"),
@ -845,8 +862,8 @@ const wl_interface {} = {{
// protocol body // protocol body
if (!clientCode) { if (!clientCode) {
SOURCE += std::format(R"#( 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)) {{
if (!pResource) if (!pResource)
return; return;
@ -903,8 +920,7 @@ void {}::onDestroyCalled() {{
DTOR_FUNC = "wl_proxy_destroy(pResource)"; DTOR_FUNC = "wl_proxy_destroy(pResource)";
SOURCE += std::format(R"#( SOURCE += std::format(R"#(
{}::{}(wl_resource* resource) {{ {}::{}(wl_proxy* resource) : pResource(resource) {{
pResource = resource;
if (!pResource) if (!pResource)
return; return;
@ -1050,4 +1066,4 @@ int main(int argc, char** argv, char** envp) {
} }
return 0; return 0;
} }