#pragma once #include #include #include #include #include #include namespace endofthejedi { class GLWindow { private: //X-related stuff Display* m_display; Window m_rootwnd; GLint m_attributes[23] = { GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, GLX_RENDER_TYPE, GLX_RGBA_BIT, GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR, GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, GLX_ALPHA_SIZE, 8, GLX_DEPTH_SIZE, 24, GLX_STENCIL_SIZE, 8, GLX_DOUBLEBUFFER, True, None }; XVisualInfo* m_visualinfo; Colormap m_colormap; XSetWindowAttributes m_swa; Window m_window; GLXContext m_glcontext; XWindowAttributes m_gwa; Atom m_atomWmDeleteWindow; //End of X related stuff unsigned int m_width; unsigned int m_height; //mainloop condition bool m_running = false; double m_fps; //if maxfps = 0 there's no fps limit double m_maxfps; void handleevents(); protected: //ancestors shall override these methods virtual void init(); //called by mainloop periodically //time shall be used for timebased movement virtual void render(double time); //called by handle on window resize virtual void resize(); //the ancestor should call the handle function in this class, too, //as it handles the close calls & resizing virtual void handle(XEvent event); public: //initializes the X Window & creates an OpenGL context GLWindow(unsigned int width, unsigned int height); ~GLWindow(); //mainloop does event handling & calls render/swap void loop(); void swap(); //stops the mainloop by setting m_running false void stop(); //getters unsigned int getheight() const { return m_height; } unsigned int getwidth() const { return m_width; } double get_maxfps() const { return m_maxfps; } double get_fps() const { return m_fps; } bool get_running() const { return m_running; } //setters void set_maxfps(const double maxfps) { m_maxfps = maxfps; } }; }