#include "api.hxx" #include #include namespace ffi { extern "C" Core* rt4_viewport_create(xcb_connection_t* connection, std::uint32_t window, std::uint32_t width, std::uint32_t height); extern "C" void rt4_viewport_destroy(Core* viewport); extern "C" void rt4_viewport_configure(Core* viewport, std::uint32_t width, std::uint32_t height); extern "C" void rt4_viewport_redraw(Core* viewport, const RedrawArgs* args); } // namespace ffi BoxCore::BoxCore(BoxCore&& b) : ptr(std::exchange(b.ptr, {})) { } BoxCore::~BoxCore() { reset(); } BoxCore& BoxCore::operator=(BoxCore&& b) { if (&b == this) return *this; std::swap(ptr, b.ptr); b.reset(); return *this; } BoxCore BoxCore::from_xcb(xcb_connection_t* connection, std::uint32_t window, std::uint32_t width, std::uint32_t height) { if (!connection) throw std::logic_error("attempt to use a null connection"); if (!window) throw std::logic_error("attempt to use a null window"); BoxCore out; out.ptr.ptr = ffi::rt4_viewport_create(connection, window, width, height); return out; } void BoxCore::reset() { auto viewport = std::exchange(ptr, {}); if (viewport) ffi::rt4_viewport_destroy(viewport.use()); } ffi::Core* MutCore::use() const { if (!ptr) throw std::logic_error("attempt to use a null Core"); return ptr; } void MutCore::configure(std::uint32_t width, std::uint32_t height) const { rt4_viewport_configure(use(), width, height); } void MutCore::redraw(const RedrawArgs& args) const { rt4_viewport_redraw(use(), &args); }