Window resize and close events in X11Window

This commit is contained in:
mrkubax10 2023-06-08 12:21:06 +02:00
parent a5972e4e1a
commit f825d1fe53
4 changed files with 37 additions and 8 deletions

View File

@ -46,7 +46,7 @@ namespace polygun::engine {
Engine::Engine() :
m_screen_manager(*this),
m_window(nullptr),
m_master_renderer()
m_master_renderer(new renderer::MasterRenderer)
{}
void Engine::init(DirectJoinArguments* direct_join) {
@ -55,7 +55,7 @@ namespace polygun::engine {
// TODO: Load requested renderer from config or determine by platform
renderer::RendererType renderer_type = renderer::RendererType::RENDERER_TYPE_GL;
m_window = window::Window::create_window("PolyGun", SCR_WIDTH, SCR_HEIGHT, renderer_type);
m_master_renderer.init(renderer_type, m_window);
m_master_renderer->init(renderer_type, m_window);
if(direct_join) {
// Push game screen
@ -90,6 +90,7 @@ namespace polygun::engine {
}
}
delete m_master_renderer;
delete m_window;
}

View File

@ -45,7 +45,7 @@ namespace polygun::engine {
private:
ScreenManager m_screen_manager;
window::Window* m_window;
renderer::MasterRenderer m_master_renderer;
renderer::MasterRenderer* m_master_renderer;
public:
Engine();
@ -57,9 +57,9 @@ namespace polygun::engine {
ScreenManager& get_screen_manager() { return m_screen_manager; }
window::Window* get_window() { return m_window; }
renderer::MasterRenderer& get_master_renderer() { return m_master_renderer; }
renderer::MeshRenderer* get_mesh_renderer() { return m_master_renderer.get_mesh_renderer(); }
renderer::GUIRenderer* get_gui_renderer() { return m_master_renderer.get_gui_renderer(); }
renderer::MasterRenderer& get_master_renderer() { return *m_master_renderer; }
renderer::MeshRenderer* get_mesh_renderer() { return m_master_renderer->get_mesh_renderer(); }
renderer::GUIRenderer* get_gui_renderer() { return m_master_renderer->get_gui_renderer(); }
static int get_screen_width();
static int get_screen_height();

View File

@ -39,7 +39,10 @@ X11Window::X11Window(const std::string& title, unsigned width, unsigned height,
m_screen(DefaultScreen(m_display)),
m_visual_info(nullptr),
m_window_id(),
m_renderer_type(renderer_type)
m_wm_delete(XInternAtom(m_display, "WM_DELETE_WINDOW", false)),
m_renderer_type(renderer_type),
m_prev_width(width),
m_prev_height(height)
{
m_type = WindowType::WINDOW_TYPE_X11;
if(!m_display)
@ -63,6 +66,7 @@ X11Window::X11Window(const std::string& title, unsigned width, unsigned height,
window_attribs.event_mask = ButtonPressMask | StructureNotifyMask;
m_window_id = XCreateWindow(m_display, root_window, 0, 0, width, height, 0, m_visual_info->depth, InputOutput, m_visual_info->visual, CWBorderPixel | CWColormap | CWEventMask, &window_attribs);
XSetStandardProperties(m_display, m_window_id, title.c_str(), "polygun", None, nullptr, 0, nullptr);
XSetWMProtocols(m_display, m_window_id, &m_wm_delete, 1);
XMapWindow(m_display, m_window_id);
}
@ -77,7 +81,28 @@ size_t X11Window::poll_events(Event& event) {
XEvent ev;
while(XPending(m_display)) {
XNextEvent(m_display, &ev);
// TODO
Event new_event;
bool handled = false;
switch(ev.type) {
case ConfigureNotify:
if(m_prev_width!=static_cast<unsigned>(ev.xconfigure.width) || m_prev_height!=static_cast<unsigned>(ev.xconfigure.height)) {
m_prev_width = static_cast<unsigned>(ev.xconfigure.width);
m_prev_height = static_cast<unsigned>(ev.xconfigure.height);
new_event.m_type = EventType::EVENT_TYPE_WINDOW_RESIZE;
new_event.m_data.m_window_event.m_width = m_prev_width;
new_event.m_data.m_window_event.m_height = m_prev_height;
handled = true;
}
break;
case ClientMessage:
if(static_cast<Atom>(ev.xclient.data.l[0])==m_wm_delete) {
new_event.m_type = EventType::EVENT_TYPE_WINDOW_CLOSE;
handled = true;
}
break;
}
if(handled)
push_event(new_event);
}
return Window::poll_events(event);

View File

@ -54,7 +54,10 @@ namespace polygun::window {
int m_screen;
XVisualInfo* m_visual_info;
::Window m_window_id;
Atom m_wm_delete;
renderer::RendererType m_renderer_type;
unsigned m_prev_width;
unsigned m_prev_height;
private:
#if defined(RENDERER_GL)