include/glbackend_glfw.hpp
b3b5c285
 /// Guards
 
 #ifdef  GLBACKEND_GLFW
 #ifndef GLBACKEND_GLFW_HPP_
 #define GLBACKEND_GLFW_HPP_
 
 
 /// Includes
 
 #include <array>
 #include <string>
 
 #include <glbackend.hpp>
 
 #include <GLFW/glfw3.h>
 
 
 /// Class definition
 
 class GLBackendGLFW final : public GLBackend
 {
 
 public:
 
     //// Special member functions
 
     explicit GLBackendGLFW(
         std::string const & title,
         std::array<int, 2>  size        = {0, 0},
         std::array<int, 2>  version     = {0, 0},
         int                 samples     = 0,
         bool                fullscreen  = false,
         bool                transparent = false
     );
     ~GLBackendGLFW();
     GLBackendGLFW(GLBackendGLFW &&) noexcept;
     GLBackendGLFW(GLBackendGLFW const &) = delete;
     GLBackendGLFW & operator=(GLBackendGLFW &&) = delete;
     GLBackendGLFW & operator=(GLBackendGLFW const &) = delete;
 
     //// Context
 
     void current() override;
 
     //// Render loop
 
     void swap() override;
 
     void events() override;
 
     bool running() const override;
     bool running(bool running) override;
 
     float time() const override;
     float time(float time) override;
 
     //// Input and output
 
     void lock(bool lock) override;
 
     bool key   (std::string const & key)    const override;
     bool button(int                 button) const override;
 
     //// Debug
 
     std::string debug_info() const override;
 
 protected:
 
     //// Special member functions
 
     void destroy_();
 
     //// Debug
 
     void static debug_glfw_error_callback_(
         int          error,
         char const * message
     );
 
 protected:
 
     //// Context
 
     int static thread_local init_count_;
 
     GLFWwindow * window_;
 
 };
 
 
 /// Inline definitions
 
 inline void GLBackendGLFW::current()
 {
     glfwMakeContextCurrent(window_);
 }
 
 inline void GLBackendGLFW::events()
 {
     glfwPollEvents();
 }
 
 inline void GLBackendGLFW::swap()
 {
     glfwSwapBuffers(window_);
 }
 
 inline bool GLBackendGLFW::running(bool running)
 {
     glfwSetWindowShouldClose(window_, !running);
     return running;
 }
 
 inline bool GLBackendGLFW::running() const
 {
     return !glfwWindowShouldClose(window_);
 }
 
 inline float GLBackendGLFW::time() const
 {
     return (float)glfwGetTime();
 }
 
 inline float GLBackendGLFW::time(float time)
 {
     glfwSetTime((double)time);
     return time;
 }
 
 inline void GLBackendGLFW::lock(bool lock)
 {
     glfwSetInputMode(
         window_, GLFW_CURSOR, lock ? GLFW_CURSOR_DISABLED : GLFW_CURSOR_NORMAL
     );
 }
 
 inline bool GLBackendGLFW::key(std::string const & key) const
 {
     if (key == "Left")
         return glfwGetKey(window_, GLFW_KEY_LEFT) == GLFW_PRESS;
     else if (key == "Right")
         return glfwGetKey(window_, GLFW_KEY_RIGHT) == GLFW_PRESS;
     else if (key == "Up")
         return glfwGetKey(window_, GLFW_KEY_UP) == GLFW_PRESS;
     else if (key == "Down")
         return glfwGetKey(window_, GLFW_KEY_DOWN) == GLFW_PRESS;
     else if (key == "Enter")
         return glfwGetKey(window_, GLFW_KEY_ENTER) == GLFW_PRESS;
     else if (key == "Escape")
         return glfwGetKey(window_, GLFW_KEY_ESCAPE) == GLFW_PRESS;
     else if (key == "Tab")
         return glfwGetKey(window_, GLFW_KEY_TAB) == GLFW_PRESS;
     else if (key == "Backspace")
         return glfwGetKey(window_, GLFW_KEY_BACKSPACE) == GLFW_PRESS;
     else if (key == "Control")
         return
             glfwGetKey(window_, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS ||
             glfwGetKey(window_, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS;
     else if (key == "Shift")
         return
             glfwGetKey(window_, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS ||
             glfwGetKey(window_, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS;
     else if (key == "Alt")
         return
             glfwGetKey(window_, GLFW_KEY_LEFT_ALT) == GLFW_PRESS ||
             glfwGetKey(window_, GLFW_KEY_RIGHT_ALT) == GLFW_PRESS;
     else if (key.length() == 1)
         return glfwGetKey(window_, key[0]) == GLFW_PRESS;
     return false;
 }
 
 inline bool GLBackendGLFW::button(int button) const
 {
     return glfwGetMouseButton(window_, button - 1) == GLFW_PRESS;
 }
 
 
 /// Guards
 
 #endif
 #endif