Window resize and close events in X11Window
This commit is contained in:
parent
a5972e4e1a
commit
f825d1fe53
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user