2024-02-14 00:11:47 -08:00
|
|
|
#include "ehs/io/Window_Way.h"
|
2024-02-05 22:25:30 -08:00
|
|
|
|
2024-07-03 19:49:18 -07:00
|
|
|
#include <unistd.h>
|
|
|
|
#include <sys/mman.h>
|
|
|
|
|
|
|
|
#include "ehs/io/Console.h"
|
|
|
|
#include "ehs/io/xdg-shell-client-protocol.h"
|
|
|
|
|
2024-02-05 22:25:30 -08:00
|
|
|
namespace ehs
|
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
void Window::SurfaceConfigEvent(void* data, xdg_surface* xdg_surface, UInt_32 serial)
|
2024-07-03 19:49:18 -07:00
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
xdg_surface_ack_configure(xdg_surface, serial);
|
2024-07-03 19:49:18 -07:00
|
|
|
|
2024-07-09 16:41:43 -07:00
|
|
|
//Window* win = (Window *)data;
|
2024-07-03 19:49:18 -07:00
|
|
|
|
2024-07-09 16:41:43 -07:00
|
|
|
//wl_surface_commit(win->wlSurface);
|
2024-07-03 19:49:18 -07:00
|
|
|
}
|
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
void Window::ShellPing(void* data, xdg_wm_base* shell, UInt_32 serial)
|
2024-07-03 19:49:18 -07:00
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
xdg_wm_base_pong(shell, serial);
|
|
|
|
}
|
2024-07-03 19:49:18 -07:00
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
void Window::RegistryHandler(void* data, wl_registry* registry, UInt_32 id, const char* interface, UInt_32 version)
|
|
|
|
{
|
|
|
|
Window *win = (Window *)data;
|
2024-07-03 19:49:18 -07:00
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
if (Str_8::Cmp(interface, wl_compositor_interface.name))
|
|
|
|
win->compositor = (wl_compositor*)wl_registry_bind(registry, id, &wl_compositor_interface, 1);
|
|
|
|
else if (Str_8::Cmp(interface, xdg_wm_base_interface.name))
|
|
|
|
win->xdgShell = (xdg_wm_base*)wl_registry_bind(registry, id, &xdg_wm_base_interface, 1);
|
|
|
|
else if (Str_8::Cmp(interface, zxdg_decoration_manager_v1_interface.name))
|
|
|
|
win->decManager = (zxdg_decoration_manager_v1*)wl_registry_bind(registry, id, &zxdg_decoration_manager_v1_interface, 1);
|
|
|
|
else if (Str_8::Cmp(interface, wl_seat_interface.name))
|
|
|
|
win->seat = (wl_seat *)wl_registry_bind(registry, id, &wl_seat_interface, 1);
|
|
|
|
}
|
2024-07-03 19:49:18 -07:00
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
void Window::RegistryRemoved(void* data, wl_registry* registry, UInt_32 id)
|
|
|
|
{
|
2024-07-03 19:49:18 -07:00
|
|
|
}
|
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
void Window::ResizeEvent(void *data, struct xdg_toplevel *xdg_toplevel, Int_32 width, Int_32 height, wl_array *states)
|
2024-02-05 22:25:30 -08:00
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
if (!width && !height)
|
|
|
|
return;
|
|
|
|
|
|
|
|
Window *win = (Window *)data;
|
2024-07-05 13:15:34 -07:00
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
win->scale = {(UInt_32)width, (UInt_32)height};
|
2024-02-05 22:25:30 -08:00
|
|
|
}
|
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
void Window::CloseEvent(void *data, xdg_toplevel *xdg_toplevel)
|
2024-02-05 22:25:30 -08:00
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
Window *win = (Window *)data;
|
|
|
|
win->Close();
|
2024-02-05 22:25:30 -08:00
|
|
|
}
|
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
void Window::SeatCapabilitiesEvent(void *data, wl_seat *seat, UInt_32 capabilities)
|
2024-02-05 22:25:30 -08:00
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
Window *win = (Window *)data;
|
2024-02-05 22:25:30 -08:00
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
if (capabilities & WL_SEAT_CAPABILITY_POINTER)
|
2024-02-05 22:25:30 -08:00
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
win->pointer = wl_seat_get_pointer(seat);
|
2024-02-05 22:25:30 -08:00
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
static const wl_pointer_listener pointer_listener = {
|
|
|
|
.motion = PointerMotionEvent
|
|
|
|
};
|
|
|
|
|
|
|
|
wl_pointer_add_listener(win->pointer, &pointer_listener, win);
|
|
|
|
}
|
2024-02-05 22:25:30 -08:00
|
|
|
}
|
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
void Window::PointerMotionEvent(void *data, wl_pointer *pointer, UInt_32 time, wl_fixed_t sx, wl_fixed_t sy)
|
2024-07-03 19:49:18 -07:00
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
EHS_LOG_INT(LogType::INFO, 0, "Pointer Pos: <" + Str_8::FromNum(wl_fixed_to_double(sx)) + ", " + Str_8::FromNum(wl_fixed_to_double(sy)) + ">");
|
2024-07-03 19:49:18 -07:00
|
|
|
}
|
|
|
|
|
2024-02-05 22:25:30 -08:00
|
|
|
Window::~Window()
|
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
if (!created)
|
|
|
|
return;
|
|
|
|
|
2024-07-04 12:12:19 -07:00
|
|
|
zxdg_toplevel_decoration_v1_destroy(dec);
|
|
|
|
zxdg_decoration_manager_v1_destroy(decManager);
|
2024-02-05 22:25:30 -08:00
|
|
|
xdg_toplevel_destroy(xdgToplevel);
|
|
|
|
xdg_surface_destroy(xdgSurface);
|
|
|
|
xdg_wm_base_destroy(xdgShell);
|
2024-07-03 19:49:18 -07:00
|
|
|
wl_surface_destroy(wlSurface);
|
2024-02-05 22:25:30 -08:00
|
|
|
wl_compositor_destroy(compositor);
|
|
|
|
wl_registry_destroy(registry);
|
|
|
|
wl_display_disconnect(display);
|
|
|
|
}
|
|
|
|
|
|
|
|
Window::Window()
|
2024-07-03 19:49:18 -07:00
|
|
|
: display(nullptr), registry(nullptr), compositor(nullptr), wlSurface(nullptr), xdgShell(nullptr),
|
2024-07-08 21:17:09 -07:00
|
|
|
xdgSurface(nullptr), xdgToplevel(nullptr), decManager(nullptr), dec(nullptr), seat(nullptr), pointer(nullptr)
|
2024-07-03 19:49:18 -07:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Window::Window(Window &&win) noexcept
|
|
|
|
: BaseWindow(win), display(win.display), registry(win.registry), compositor(win.compositor),
|
|
|
|
wlSurface(win.wlSurface), xdgShell(win.xdgShell), xdgSurface(win.xdgSurface), xdgToplevel(win.xdgToplevel),
|
2024-07-08 21:17:09 -07:00
|
|
|
decManager(win.decManager), dec(win.dec), seat(win.seat), pointer(win.pointer)
|
2024-07-03 19:49:18 -07:00
|
|
|
{
|
|
|
|
win.display = nullptr;
|
|
|
|
win.registry = nullptr;
|
|
|
|
win.compositor = nullptr;
|
|
|
|
win.wlSurface = nullptr;
|
|
|
|
win.xdgShell = nullptr;
|
|
|
|
win.xdgSurface = nullptr;
|
|
|
|
win.xdgToplevel = nullptr;
|
|
|
|
win.decManager = nullptr;
|
|
|
|
win.dec = nullptr;
|
2024-07-08 21:17:09 -07:00
|
|
|
win.seat = nullptr;
|
|
|
|
win.pointer = nullptr;
|
2024-07-03 19:49:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
Window::Window(const Window &win)
|
|
|
|
: BaseWindow(win), display(nullptr), registry(nullptr), compositor(nullptr), wlSurface(nullptr),
|
2024-07-08 21:17:09 -07:00
|
|
|
xdgShell(nullptr), xdgSurface(nullptr), xdgToplevel(nullptr), decManager(nullptr), dec(nullptr), seat(nullptr),
|
|
|
|
pointer(nullptr)
|
2024-02-05 22:25:30 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2024-07-03 19:49:18 -07:00
|
|
|
Window & Window::operator=(Window &&win) noexcept
|
|
|
|
{
|
|
|
|
if (this == &win)
|
|
|
|
return *this;
|
|
|
|
|
|
|
|
BaseWindow::operator=(win);
|
|
|
|
|
|
|
|
display = win.display;
|
|
|
|
registry = win.registry;
|
|
|
|
compositor = win.compositor;
|
|
|
|
wlSurface = win.wlSurface;
|
|
|
|
xdgShell = win.xdgShell;
|
|
|
|
xdgSurface = win.xdgSurface;
|
|
|
|
xdgToplevel = win.xdgToplevel;
|
|
|
|
decManager = win.decManager;
|
|
|
|
dec = win.dec;
|
2024-07-08 21:17:09 -07:00
|
|
|
seat = win.seat;
|
|
|
|
pointer = win.pointer;
|
2024-07-03 19:49:18 -07:00
|
|
|
|
|
|
|
win.display = nullptr;
|
|
|
|
win.registry = nullptr;
|
|
|
|
win.compositor = nullptr;
|
|
|
|
win.wlSurface = nullptr;
|
|
|
|
win.xdgShell = nullptr;
|
|
|
|
win.xdgSurface = nullptr;
|
|
|
|
win.xdgToplevel = nullptr;
|
|
|
|
win.decManager = nullptr;
|
|
|
|
win.dec = nullptr;
|
2024-07-08 21:17:09 -07:00
|
|
|
win.seat = nullptr;
|
|
|
|
win.pointer = nullptr;
|
2024-07-03 19:49:18 -07:00
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
Window & Window::operator=(const Window &win)
|
|
|
|
{
|
|
|
|
if (this == &win)
|
|
|
|
return *this;
|
|
|
|
|
|
|
|
BaseWindow::operator=(win);
|
|
|
|
|
|
|
|
display = nullptr;
|
|
|
|
registry = nullptr;
|
|
|
|
compositor = nullptr;
|
|
|
|
wlSurface = nullptr;
|
|
|
|
xdgShell = nullptr;
|
|
|
|
xdgSurface = nullptr;
|
|
|
|
xdgToplevel = nullptr;
|
|
|
|
decManager = nullptr;
|
|
|
|
dec = nullptr;
|
2024-07-08 21:17:09 -07:00
|
|
|
seat = nullptr;
|
|
|
|
pointer = nullptr;
|
2024-07-03 19:49:18 -07:00
|
|
|
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2024-02-05 22:25:30 -08:00
|
|
|
void Window::Create_32(const Str_32& title, const Vec2_s32& pos, const Vec2_u32 scale)
|
|
|
|
{
|
|
|
|
Create_8(UTF::To_8(title), pos, scale);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::Create_16(const Str_16& title, const Vec2_s32& pos, const Vec2_u32 scale)
|
|
|
|
{
|
|
|
|
Create_8(UTF::To_8(title), pos, scale);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::Create_8(const Str_8& title, const Vec2_s32& pos, const Vec2_u32 scale)
|
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
if (created)
|
|
|
|
return;
|
|
|
|
|
2024-02-05 22:25:30 -08:00
|
|
|
display = wl_display_connect(nullptr);
|
|
|
|
if (!display)
|
|
|
|
{
|
2024-04-23 22:29:49 -07:00
|
|
|
EHS_LOG_INT(LogType::ERR, 0, "Failed to connect to display server.");
|
2024-02-05 22:25:30 -08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
static constexpr wl_registry_listener registry_listener = {
|
2024-07-08 21:17:09 -07:00
|
|
|
.global = RegistryHandler,
|
|
|
|
.global_remove = RegistryRemoved
|
2024-02-05 22:25:30 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
registry = wl_display_get_registry(display);
|
2024-07-08 21:17:09 -07:00
|
|
|
wl_registry_add_listener(registry, ®istry_listener, this);
|
2024-02-05 22:25:30 -08:00
|
|
|
|
|
|
|
wl_display_dispatch(display);
|
|
|
|
wl_display_roundtrip(display);
|
|
|
|
|
|
|
|
if (!compositor || !xdgShell)
|
|
|
|
{
|
2024-04-23 22:29:49 -07:00
|
|
|
EHS_LOG_INT(LogType::ERR, 1, "Can't find required interfaces.");
|
2024-02-05 22:25:30 -08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
static constexpr xdg_wm_base_listener xdg_shell_listener = {
|
|
|
|
.ping = ShellPing
|
|
|
|
};
|
2024-02-05 22:25:30 -08:00
|
|
|
|
|
|
|
xdg_wm_base_add_listener(xdgShell, &xdg_shell_listener, nullptr);
|
|
|
|
|
2024-07-09 16:41:43 -07:00
|
|
|
wl_display_roundtrip(display);
|
|
|
|
|
2024-07-03 19:49:18 -07:00
|
|
|
wlSurface = wl_compositor_create_surface(compositor);
|
|
|
|
if (!wlSurface)
|
2024-02-05 22:25:30 -08:00
|
|
|
{
|
2024-04-23 22:29:49 -07:00
|
|
|
EHS_LOG_INT(LogType::ERR, 2, "Can't create surface.");
|
2024-02-05 22:25:30 -08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-07-03 19:49:18 -07:00
|
|
|
xdgSurface = xdg_wm_base_get_xdg_surface(xdgShell, wlSurface);
|
2024-02-05 22:25:30 -08:00
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
static constexpr xdg_surface_listener surfaceListener = {
|
|
|
|
.configure = SurfaceConfigEvent
|
|
|
|
};
|
2024-02-05 22:25:30 -08:00
|
|
|
|
2024-07-05 13:15:34 -07:00
|
|
|
xdg_surface_add_listener(xdgSurface, &surfaceListener, this);
|
2024-02-05 22:25:30 -08:00
|
|
|
|
2024-07-09 16:41:43 -07:00
|
|
|
wl_display_roundtrip(display);
|
|
|
|
|
2024-07-03 19:49:18 -07:00
|
|
|
xdgToplevel = xdg_surface_get_toplevel(xdgSurface);
|
|
|
|
|
|
|
|
static constexpr xdg_toplevel_listener topLevelListener = {
|
2024-07-08 21:17:09 -07:00
|
|
|
.configure = ResizeEvent,
|
|
|
|
.close = CloseEvent
|
2024-07-03 19:49:18 -07:00
|
|
|
};
|
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
xdg_toplevel_add_listener(xdgToplevel, &topLevelListener, this);
|
2024-07-03 19:49:18 -07:00
|
|
|
|
2024-07-09 16:41:43 -07:00
|
|
|
wl_display_roundtrip(display);
|
|
|
|
|
2024-02-05 22:25:30 -08:00
|
|
|
xdg_toplevel_set_title(xdgToplevel, title);
|
2024-07-08 21:17:09 -07:00
|
|
|
xdg_toplevel_set_app_id(xdgToplevel, title);
|
2024-07-03 19:49:18 -07:00
|
|
|
|
2024-07-09 16:41:43 -07:00
|
|
|
wl_display_roundtrip(display);
|
|
|
|
|
2024-07-03 19:49:18 -07:00
|
|
|
dec = zxdg_decoration_manager_v1_get_toplevel_decoration(decManager, xdgToplevel);
|
|
|
|
zxdg_toplevel_decoration_v1_set_mode(dec, ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE);
|
|
|
|
|
2024-07-09 16:41:43 -07:00
|
|
|
wl_display_roundtrip(display);
|
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
static constexpr wl_seat_listener seat_listener = {
|
|
|
|
.capabilities = SeatCapabilitiesEvent
|
|
|
|
};
|
|
|
|
|
|
|
|
wl_seat_add_listener(seat, &seat_listener, this);
|
2024-07-04 12:12:19 -07:00
|
|
|
|
|
|
|
wl_display_roundtrip(display);
|
|
|
|
|
2024-07-03 19:49:18 -07:00
|
|
|
wl_surface_commit(wlSurface);
|
|
|
|
|
|
|
|
wl_display_roundtrip(display);
|
|
|
|
|
2024-07-08 21:17:09 -07:00
|
|
|
this->scale = scale;
|
|
|
|
created = true;
|
|
|
|
|
2024-07-03 19:49:18 -07:00
|
|
|
OnCreated();
|
2024-02-05 22:25:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void Window::OnCreated()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::Close()
|
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
if (!created)
|
|
|
|
return;
|
|
|
|
|
|
|
|
zxdg_toplevel_decoration_v1_destroy(dec);
|
|
|
|
dec = nullptr;
|
|
|
|
|
|
|
|
zxdg_decoration_manager_v1_destroy(decManager);
|
|
|
|
decManager = nullptr;
|
|
|
|
|
2024-02-05 22:25:30 -08:00
|
|
|
xdg_toplevel_destroy(xdgToplevel);
|
|
|
|
xdgToplevel = nullptr;
|
|
|
|
|
|
|
|
xdg_surface_destroy(xdgSurface);
|
|
|
|
xdgSurface = nullptr;
|
|
|
|
|
|
|
|
xdg_wm_base_destroy(xdgShell);
|
|
|
|
xdgShell = nullptr;
|
|
|
|
|
2024-07-03 19:49:18 -07:00
|
|
|
wl_surface_destroy(wlSurface);
|
|
|
|
wlSurface = nullptr;
|
2024-02-05 22:25:30 -08:00
|
|
|
|
|
|
|
wl_compositor_destroy(compositor);
|
|
|
|
compositor = nullptr;
|
|
|
|
|
|
|
|
wl_registry_destroy(registry);
|
|
|
|
registry = nullptr;
|
|
|
|
|
|
|
|
wl_display_disconnect(display);
|
|
|
|
display = nullptr;
|
2024-07-08 21:17:09 -07:00
|
|
|
|
|
|
|
created = false;
|
2024-02-05 22:25:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void Window::Show()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::Hide()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Window::Poll()
|
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
if (wl_display_dispatch_pending(display) == -1)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (!created)
|
|
|
|
return false;
|
2024-02-05 22:25:30 -08:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::ShowCursor(bool toggle)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::ConstrainCursor(const bool constrain)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::SetTitle_32(const Str_32& newTitle)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Str_32 Window::GetTitle_32() const
|
|
|
|
{
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::SetTitle_16(const Str_16& newTitle)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Str_16 Window::GetTitle_16() const
|
|
|
|
{
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::SetTitle_8(const Str_8& newTitle)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Str_8 Window::GetTitle_8() const
|
|
|
|
{
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::SetPos(const Vec2_s32& newPos)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Vec2_s32 Window::GetPos() const
|
|
|
|
{
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::SetScale(const Vec2_u32& newScale)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
Vec2_u32 Window::GetScale() const
|
|
|
|
{
|
2024-07-08 21:17:09 -07:00
|
|
|
return scale;
|
2024-02-05 22:25:30 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
Serializer<UInt_64> Window::GetClipboard()
|
|
|
|
{
|
|
|
|
return {};
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::SetClipboard(Serializer<UInt_64> data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void Window::SetCursorImg(const CursorImg img)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|