9 #ifndef EAGINE_INTEROP_X11_DISPLAY_HPP
10 #define EAGINE_INTEROP_X11_DISPLAY_HPP
24 template <
typename ObjectType,
typename Deleter =
int(ObjectType*)>
27 ObjectType* _pimpl{
nullptr};
28 Deleter* _deleter{
nullptr};
31 object(ObjectType* pimpl, Deleter* deleter,
const char* error_message)
34 EAGINE_ASSERT(_deleter);
36 throw std::runtime_error(error_message);
41 object(
object&& temp) noexcept
42 : _pimpl(std::exchange(temp._pimpl,
nullptr))
43 , _deleter(std::exchange(temp._deleter,
nullptr)) {}
45 object(
const object&) =
delete;
46 auto operator=(
object&&) =
delete;
47 auto operator=(
const object&) =
delete;
55 auto get() const noexcept -> ObjectType* {
56 EAGINE_ASSERT(_pimpl);
60 operator ObjectType*()
const noexcept {
64 auto operator->() const noexcept -> ObjectType* {
69 class display :
public object<::Display> {
71 static auto _any_event(::Display*, ::XEvent*, ::XPointer) -> Bool {
76 display(
const char* name =
nullptr)
80 "Error opening X Display") {}
82 auto next_event(XEvent& event)
const ->
bool {
83 return ::XCheckIfEvent(
84 this->get(), &event, &_any_event, ::XPointer()) == True;
88 class screen_names :
public std::vector<std::string> {
92 auto name =
static_cast<char*
>(namebuf);
104 if(
auto tmp{::XOpenDisplay(name)}) {
106 ::XCloseDisplay(tmp);
107 }
else if(screen != 0) {
119 template <
typename HandleType,
typename Deleter =
int(::Display*, HandleType)>
120 class display_object {
122 const display& _display;
125 Deleter* _deleter{
nullptr};
128 auto display_ref() const -> auto& {
136 const char* error_message)
139 , _deleter(deleter) {
140 EAGINE_ASSERT(_deleter);
142 throw std::runtime_error(error_message);
147 display_object(display_object&& temp) noexcept
148 : _display(temp._display)
149 , _handle(std::exchange(temp._handle, 0))
150 , _deleter(std::exchange(temp._deleter,
nullptr)) {}
152 display_object(
const display_object&) =
delete;
153 auto operator=(display_object&&) =
delete;
154 auto operator=(
const display_object&) =
delete;
158 _deleter(_display, _handle);
162 auto handle() const -> HandleType {
166 operator HandleType()
const {
171 template <
typename HandleType>
172 class base_display_object {
177 template <
typename Derived,
typename Deleter>
178 base_display_object(
const display_object<Derived, Deleter>& derived)
179 : _handle(derived.handle()) {}
181 auto handle() const -> HandleType {
185 operator HandleType()
const {