aboutsummaryrefslogtreecommitdiffstats
path: root/bindings/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/cpp')
-rw-r--r--bindings/cpp/include/pugl/cairo.hpp4
-rw-r--r--bindings/cpp/include/pugl/gl.hpp6
-rw-r--r--bindings/cpp/include/pugl/pugl.hpp80
-rw-r--r--bindings/cpp/include/pugl/stub.hpp4
-rw-r--r--bindings/cpp/include/pugl/vulkan.hpp6
-rw-r--r--bindings/cpp/meson.build14
-rw-r--r--bindings/cpp/test/headers/.clang-tidy26
-rw-r--r--bindings/cpp/test/headers/meson.build39
-rw-r--r--bindings/cpp/test/headers/test_headers.cpp20
9 files changed, 167 insertions, 32 deletions
diff --git a/bindings/cpp/include/pugl/cairo.hpp b/bindings/cpp/include/pugl/cairo.hpp
index e619412..4a51f96 100644
--- a/bindings/cpp/include/pugl/cairo.hpp
+++ b/bindings/cpp/include/pugl/cairo.hpp
@@ -4,8 +4,8 @@
#ifndef PUGL_CAIRO_HPP
#define PUGL_CAIRO_HPP
-#include "pugl/cairo.h"
-#include "pugl/pugl.h"
+#include <pugl/cairo.h>
+#include <pugl/pugl.h>
namespace pugl {
diff --git a/bindings/cpp/include/pugl/gl.hpp b/bindings/cpp/include/pugl/gl.hpp
index 7c361e6..5aa5ca5 100644
--- a/bindings/cpp/include/pugl/gl.hpp
+++ b/bindings/cpp/include/pugl/gl.hpp
@@ -4,9 +4,9 @@
#ifndef PUGL_GL_HPP
#define PUGL_GL_HPP
-#include "pugl/gl.h"
-#include "pugl/pugl.h"
-#include "pugl/pugl.hpp"
+#include <pugl/gl.h>
+#include <pugl/pugl.h>
+#include <pugl/pugl.hpp>
namespace pugl {
diff --git a/bindings/cpp/include/pugl/pugl.hpp b/bindings/cpp/include/pugl/pugl.hpp
index e374efc..eba2583 100644
--- a/bindings/cpp/include/pugl/pugl.hpp
+++ b/bindings/cpp/include/pugl/pugl.hpp
@@ -4,10 +4,10 @@
#ifndef PUGL_PUGL_HPP
#define PUGL_PUGL_HPP
-#include "pugl/pugl.h"
+#include <pugl/pugl.h>
-#include <cstddef> // IWYU pragma: keep
-#include <cstdint> // IWYU pragma: keep
+#include <cstddef>
+#include <cstdint>
#if defined(PUGL_HPP_THROW_FAILED_CONSTRUCTION)
# include <exception>
@@ -66,8 +66,17 @@ private:
} // namespace detail
-/// @copydoc PuglRect
-using Rect = PuglRect;
+/// @copydoc PuglCoord
+using Coord = PuglCoord;
+
+/// @copydoc PuglSpan
+using Span = PuglSpan;
+
+/// @copydoc PuglPoint
+using Point = PuglPoint;
+
+/// @copydoc PuglArea
+using Area = PuglArea;
/// @copydoc PuglStringHint
enum class StringHint {
@@ -227,6 +236,7 @@ enum class Status {
setFormatFailed, ///< @copydoc PUGL_SET_FORMAT_FAILED
createContextFailed, ///< @copydoc PUGL_CREATE_CONTEXT_FAILED
unsupported, ///< @copydoc PUGL_UNSUPPORTED
+ noMemory, ///< @copydoc PUGL_NO_MEMORY
};
static_assert(static_cast<Status>(PUGL_UNSUPPORTED) == Status::unsupported, "");
@@ -370,11 +380,19 @@ using Backend = PuglBackend;
/// @copydoc PuglNativeView
using NativeView = PuglNativeView;
+/// @copydoc PuglPositionHint
+enum class PositionHint {
+ defaultPosition, ///< @copydoc PUGL_DEFAULT_POSITION
+ currentPosition, ///< @copydoc PUGL_CURRENT_POSITION
+};
+
/// @copydoc PuglSizeHint
enum class SizeHint {
defaultSize, ///< @copydoc PUGL_DEFAULT_SIZE
+ currentSize, ///< @copydoc PUGL_CURRENT_SIZE
minSize, ///< @copydoc PUGL_MIN_SIZE
maxSize, ///< @copydoc PUGL_MAX_SIZE
+ fixedAspect, ///< @copydoc PUGL_FIXED_ASPECT
minAspect, ///< @copydoc PUGL_MIN_ASPECT
maxAspect, ///< @copydoc PUGL_MAX_ASPECT
};
@@ -535,17 +553,27 @@ public:
@{
*/
- /// @copydoc puglGetFrame
- Rect frame() const noexcept { return puglGetFrame(cobj()); }
+ /// @copydoc puglGetPositionHint
+ Point position(PositionHint hint) const noexcept
+ {
+ return puglGetPositionHint(cobj(), static_cast<PuglPositionHint>(hint));
+ }
+
+ /// @copydoc puglGetSizeHint
+ Area size(SizeHint hint) const noexcept
+ {
+ return puglGetSizeHint(cobj(), static_cast<PuglSizeHint>(hint));
+ }
- /// @copydoc puglSetFrame
- Status setFrame(const Rect& frame) noexcept
+ /// @copydoc puglSetSizeHint
+ Status setSize(unsigned width, unsigned height) noexcept
{
- return static_cast<Status>(puglSetFrame(cobj(), frame));
+ return static_cast<Status>(
+ puglSetSizeHint(cobj(), PUGL_CURRENT_SIZE, width, height));
}
/// @copydoc puglSetSizeHint
- Status setSizeHint(SizeHint hint, PuglSpan width, PuglSpan height) noexcept
+ Status setSizeHint(SizeHint hint, unsigned width, unsigned height) noexcept
{
return static_cast<Status>(
puglSetSizeHint(cobj(), static_cast<PuglSizeHint>(hint), width, height));
@@ -558,18 +586,27 @@ public:
@{
*/
- /// @copydoc puglSetParentWindow
- Status setParentWindow(NativeView parent) noexcept
+ /// @copydoc puglSetParent
+ Status setParent(NativeView parent) noexcept
{
- return static_cast<Status>(puglSetParentWindow(cobj(), parent));
+ return static_cast<Status>(puglSetParent(cobj(), parent));
}
+ /// @copydoc puglGetParent
+ NativeView parent() const noexcept { return puglGetParent(cobj()); }
+
/// @copydoc puglSetTransientParent
Status setTransientParent(NativeView parent) noexcept
{
return static_cast<Status>(puglSetTransientParent(cobj(), parent));
}
+ /// @copydoc puglGetTransientParent
+ NativeView transientParent() const noexcept
+ {
+ return puglGetTransientParent(cobj());
+ }
+
/// @copydoc puglRealize
Status realize() noexcept { return static_cast<Status>(puglRealize(cobj())); }
@@ -600,16 +637,19 @@ public:
/// @copydoc puglGetContext
void* context() noexcept { return puglGetContext(cobj()); }
- /// @copydoc puglPostRedisplay
- Status postRedisplay() noexcept
+ /// @copydoc puglObscure
+ Status obscure() noexcept
{
- return static_cast<Status>(puglPostRedisplay(cobj()));
+ return static_cast<Status>(puglObscureView(cobj()));
}
- /// @copydoc puglPostRedisplayRect
- Status postRedisplayRect(const Rect& rect) noexcept
+ /// "Obscure" a region so it will be exposed in the next render
+ Status obscure(const int x,
+ const int y,
+ const unsigned width,
+ const unsigned height)
{
- return static_cast<Status>(puglPostRedisplayRect(cobj(), rect));
+ return static_cast<Status>(puglObscureRegion(cobj(), x, y, width, height));
}
/**
diff --git a/bindings/cpp/include/pugl/stub.hpp b/bindings/cpp/include/pugl/stub.hpp
index 08281b0..13b050d 100644
--- a/bindings/cpp/include/pugl/stub.hpp
+++ b/bindings/cpp/include/pugl/stub.hpp
@@ -4,8 +4,8 @@
#ifndef PUGL_STUB_HPP
#define PUGL_STUB_HPP
-#include "pugl/pugl.h"
-#include "pugl/stub.h"
+#include <pugl/pugl.h>
+#include <pugl/stub.h>
namespace pugl {
diff --git a/bindings/cpp/include/pugl/vulkan.hpp b/bindings/cpp/include/pugl/vulkan.hpp
index 5bb790d..56c91b0 100644
--- a/bindings/cpp/include/pugl/vulkan.hpp
+++ b/bindings/cpp/include/pugl/vulkan.hpp
@@ -10,9 +10,9 @@
#ifndef PUGL_VULKAN_HPP
#define PUGL_VULKAN_HPP
-#include "pugl/pugl.h"
-#include "pugl/pugl.hpp"
-#include "pugl/vulkan.h"
+#include <pugl/pugl.h>
+#include <pugl/pugl.hpp>
+#include <pugl/vulkan.h>
#include <vulkan/vulkan_core.h>
diff --git a/bindings/cpp/meson.build b/bindings/cpp/meson.build
index 5d8f586..0e8ba6a 100644
--- a/bindings/cpp/meson.build
+++ b/bindings/cpp/meson.build
@@ -1,10 +1,14 @@
-# Copyright 2021 David Robillard <d@drobilla.net>
+# Copyright 2021-2025 David Robillard <d@drobilla.net>
# SPDX-License-Identifier: 0BSD OR ISC
+######################################
+# C++ Bindings Package (Header-Only) #
+######################################
+
subdir('include')
puglpp_dep = declare_dependency(
- dependencies: core_deps + [pugl_dep],
+ dependencies: [pugl_dep],
include_directories: include_directories('include'),
link_with: libpugl,
)
@@ -20,3 +24,9 @@ pkg.generate(
)
meson.override_dependency(puglpp_versioned_name, puglpp_dep)
+
+############################
+# C++ Header Warning Tests #
+############################
+
+subdir('test/headers')
diff --git a/bindings/cpp/test/headers/.clang-tidy b/bindings/cpp/test/headers/.clang-tidy
new file mode 100644
index 0000000..0e20b52
--- /dev/null
+++ b/bindings/cpp/test/headers/.clang-tidy
@@ -0,0 +1,26 @@
+# Copyright 2020-2025 David Robillard <d@drobilla.net>
+# SPDX-License-Identifier: 0BSD OR ISC
+
+Checks: >
+ *,
+ -*-magic-numbers,
+ -*-use-using,
+ -altera-*,
+ -cppcoreguidelines-avoid-const-or-ref-data-members,
+ -cppcoreguidelines-pro-bounds-pointer-arithmetic,
+ -cppcoreguidelines-pro-type-reinterpret-cast,
+ -llvmlibc-*,
+ -modernize-redundant-void-arg,
+ -modernize-use-trailing-return-type,
+ -performance-enum-size,
+ -readability-implicit-bool-conversion,
+CheckOptions:
+ - key: readability-function-cognitive-complexity.Threshold
+ value: '2'
+ - key: readability-identifier-length.IgnoredParameterNames
+ value: '^(f)|(id)|(x)|(y)$'
+ - key: readability-identifier-length.IgnoredVariableNames
+ value: '^(r)$'
+FormatStyle: file
+HeaderFilterRegex: '.*'
+WarningsAsErrors: '*'
diff --git a/bindings/cpp/test/headers/meson.build b/bindings/cpp/test/headers/meson.build
new file mode 100644
index 0000000..064c2cf
--- /dev/null
+++ b/bindings/cpp/test/headers/meson.build
@@ -0,0 +1,39 @@
+# Copyright 2020-2025 David Robillard <d@drobilla.net>
+# SPDX-License-Identifier: 0BSD OR ISC
+
+header_cpp_suppressions = []
+
+if get_option('warning_level') == 'everything'
+ if cpp.get_id() == 'clang'
+ if not meson.is_cross_build()
+ header_cpp_suppressions += [
+ '-Wno-old-style-cast',
+ '-Wno-poison-system-directories',
+ ]
+ endif
+ endif
+endif
+
+header_cpp_suppressions = cpp.get_supported_arguments(header_cpp_suppressions)
+
+test_headers_cpp_args = header_cpp_suppressions
+test_headers_cpp_args += [
+ '-DPUGL_NO_INCLUDE_GL_H',
+ '-DPUGL_NO_INCLUDE_GLU_H',
+]
+
+if vulkan_dep.found()
+ test_headers_cpp_args += ['-DPUGL_TEST_VULKAN']
+endif
+
+test(
+ 'headers',
+ executable(
+ 'test_headers_cpp',
+ files('test_headers.cpp'),
+ cpp_args: test_headers_cpp_args,
+ dependencies: [puglpp_dep, vulkan_dep],
+ implicit_include_directories: false,
+ ),
+ suite: 'unit',
+)
diff --git a/bindings/cpp/test/headers/test_headers.cpp b/bindings/cpp/test/headers/test_headers.cpp
new file mode 100644
index 0000000..a28f537
--- /dev/null
+++ b/bindings/cpp/test/headers/test_headers.cpp
@@ -0,0 +1,20 @@
+// Copyright 2022-2025 David Robillard <d@drobilla.net>
+// SPDX-License-Identifier: ISC
+
+#include <pugl/cairo.hpp> // IWYU pragma: keep
+#include <pugl/gl.hpp> // IWYU pragma: keep
+#include <pugl/pugl.hpp> // IWYU pragma: keep
+#include <pugl/stub.hpp> // IWYU pragma: keep
+
+#ifdef PUGL_TEST_VULKAN
+# include <pugl/vulkan.hpp> // IWYU pragma: keep
+#endif
+
+#ifdef __GNUC__
+__attribute__((const))
+#endif
+int
+main()
+{
+ return 0;
+}