split pointer and object operations
This commit is contained in:
parent
4e4c4493f9
commit
d92d75a4d1
|
|
@ -3,13 +3,15 @@
|
|||
#include <utility>
|
||||
#include <stdexcept>
|
||||
|
||||
namespace ffi {
|
||||
extern "C" Core* rt4_viewport_create(xcb_connection_t* connection, std::uint32_t window);
|
||||
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);
|
||||
}
|
||||
|
||||
BoxCore::BoxCore(BoxCore&& b)
|
||||
: ptr(std::exchange(b.ptr, nullptr))
|
||||
: ptr(std::exchange(b.ptr, {}))
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -31,26 +33,26 @@ BoxCore BoxCore::from_xcb(xcb_connection_t* connection, std::uint32_t window) {
|
|||
if (!window)
|
||||
throw std::logic_error("attempt to use a null window");
|
||||
BoxCore out;
|
||||
out.ptr = rt4_viewport_create(connection, window);
|
||||
out.ptr.ptr = ffi::rt4_viewport_create(connection, window);
|
||||
return out;
|
||||
}
|
||||
|
||||
void BoxCore::reset() {
|
||||
auto viewport = std::exchange(ptr, nullptr);
|
||||
auto viewport = std::exchange(ptr, {});
|
||||
if (viewport)
|
||||
rt4_viewport_destroy(viewport);
|
||||
ffi::rt4_viewport_destroy(viewport.use());
|
||||
}
|
||||
|
||||
Core* BoxCore::use() const {
|
||||
ffi::Core* MutCore::use() const {
|
||||
if (!ptr)
|
||||
throw std::logic_error("attempt to use a null Core");
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void BoxCore::configure(std::uint32_t width, std::uint32_t height) {
|
||||
void MutCore::configure(std::uint32_t width, std::uint32_t height) const {
|
||||
rt4_viewport_configure(use(), width, height);
|
||||
}
|
||||
|
||||
void BoxCore::redraw() {
|
||||
void MutCore::redraw() const {
|
||||
rt4_viewport_redraw(use());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,23 @@
|
|||
|
||||
struct xcb_connection_t;
|
||||
|
||||
namespace ffi {
|
||||
struct Core;
|
||||
}
|
||||
|
||||
class MutCore {
|
||||
friend class BoxCore;
|
||||
|
||||
public:
|
||||
explicit operator bool() const { return ptr; }
|
||||
|
||||
void configure(std::uint32_t width, std::uint32_t height) const;
|
||||
void redraw() const;
|
||||
|
||||
private:
|
||||
ffi::Core* ptr = nullptr;
|
||||
ffi::Core* use() const;
|
||||
};
|
||||
|
||||
class BoxCore {
|
||||
public:
|
||||
|
|
@ -15,16 +31,13 @@ public:
|
|||
BoxCore& operator= (BoxCore&&);
|
||||
~BoxCore();
|
||||
|
||||
explicit operator bool() const { return ptr; }
|
||||
explicit operator bool() const { return !!ptr; }
|
||||
const MutCore* operator->() const { return &ptr; }
|
||||
|
||||
void reset();
|
||||
|
||||
static BoxCore from_xcb(xcb_connection_t* connection, std::uint32_t window);
|
||||
void configure(std::uint32_t width, std::uint32_t height);
|
||||
void redraw();
|
||||
|
||||
private:
|
||||
Core* ptr = nullptr;
|
||||
|
||||
Core* use() const;
|
||||
MutCore ptr;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ bool Viewport::event(QEvent* event) {
|
|||
void Viewport::paintEvent(QPaintEvent* event) {
|
||||
if (!core)
|
||||
recreate();
|
||||
core.redraw();
|
||||
core->redraw();
|
||||
}
|
||||
|
||||
void Viewport::resizeEvent(QResizeEvent* event) {
|
||||
|
|
@ -63,5 +63,5 @@ void Viewport::recreate() try {
|
|||
|
||||
void Viewport::updateSize() {
|
||||
const QSize device_size = size() * devicePixelRatio();
|
||||
core.configure(device_size.width(), device_size.height());
|
||||
core->configure(device_size.width(), device_size.height());
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user