Index: NewOpenGLGame.sln
===================================================================
--- NewOpenGLGame.sln	(revision 27c40cefd96c63cd41234d37e4e62526a7c4ecdb)
+++ NewOpenGLGame.sln	(revision 7bf5433f5c6c2730d8e43381bfb0d0741b7fb34a)
@@ -9,4 +9,6 @@
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VulkanGame", "VulkanGame.vcxproj", "{3489E223-6118-49E3-98F3-8887B68AC32F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenGLGame", "OpenGLGame.vcxproj", "{569037E7-4D03-4412-8CC1-DE51435C0BBE}"
 EndProject
 Global
@@ -42,4 +44,12 @@
 		{3489E223-6118-49E3-98F3-8887B68AC32F}.Release|x86.ActiveCfg = Release|Win32
 		{3489E223-6118-49E3-98F3-8887B68AC32F}.Release|x86.Build.0 = Release|Win32
+		{569037E7-4D03-4412-8CC1-DE51435C0BBE}.Debug|x64.ActiveCfg = Debug|x64
+		{569037E7-4D03-4412-8CC1-DE51435C0BBE}.Debug|x64.Build.0 = Debug|x64
+		{569037E7-4D03-4412-8CC1-DE51435C0BBE}.Debug|x86.ActiveCfg = Debug|Win32
+		{569037E7-4D03-4412-8CC1-DE51435C0BBE}.Debug|x86.Build.0 = Debug|Win32
+		{569037E7-4D03-4412-8CC1-DE51435C0BBE}.Release|x64.ActiveCfg = Release|x64
+		{569037E7-4D03-4412-8CC1-DE51435C0BBE}.Release|x64.Build.0 = Release|x64
+		{569037E7-4D03-4412-8CC1-DE51435C0BBE}.Release|x86.ActiveCfg = Release|Win32
+		{569037E7-4D03-4412-8CC1-DE51435C0BBE}.Release|x86.Build.0 = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
Index: OpenGLGame.vcxproj
===================================================================
--- OpenGLGame.vcxproj	(revision 7bf5433f5c6c2730d8e43381bfb0d0741b7fb34a)
+++ OpenGLGame.vcxproj	(revision 7bf5433f5c6c2730d8e43381bfb0d0741b7fb34a)
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="crash-logger.cpp" />
+    <ClCompile Include="FileStackWalker.cpp" />
+    <ClCompile Include="game-gui-glfw.cpp" />
+    <ClCompile Include="main-opengl.cpp" />
+    <ClCompile Include="opengl-game.cpp" />
+    <ClCompile Include="StackWalker.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="compiler.hpp" />
+    <ClInclude Include="consts.hpp" />
+    <ClInclude Include="crash-logger.hpp" />
+    <ClInclude Include="FileStackWalker.h" />
+    <ClInclude Include="game-gui-glfw.hpp" />
+    <ClInclude Include="game-gui.hpp" />
+    <ClInclude Include="opengl-game.hpp" />
+    <ClInclude Include="StackWalker.h" />
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>16.0</VCProjectVersion>
+    <ProjectGuid>{7BED9D8B-405D-4051-B872-7090AA360091}</ProjectGuid>
+    <RootNamespace>OpenGLGame</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>MultiByte</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <IncludePath>include;$(IncludePath)</IncludePath>
+    <LibraryPath>lib;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <ConformanceMode>true</ConformanceMode>
+      <LanguageStandard>stdcpp17</LanguageStandard>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <AdditionalDependencies>glew32s.lib;glfw3.lib;opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <ConformanceMode>true</ConformanceMode>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
Index: VulkanGame.vcxproj
===================================================================
--- VulkanGame.vcxproj	(revision 27c40cefd96c63cd41234d37e4e62526a7c4ecdb)
+++ VulkanGame.vcxproj	(revision 7bf5433f5c6c2730d8e43381bfb0d0741b7fb34a)
@@ -71,5 +71,5 @@
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <IncludePath>include;$(IncludePath)</IncludePath>
+    <IncludePath>include;D:\VulkanSDK\1.1.108.0\Include;$(IncludePath)</IncludePath>
     <LibraryPath>lib;D:\VulkanSDK\1.1.108.0\Lib;$(LibraryPath)</LibraryPath>
   </PropertyGroup>
@@ -82,5 +82,6 @@
       <LanguageStandard>stdcpp17</LanguageStandard>
       <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;GAMEGUI_INCLUDE_VULKAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>D:\VulkanSDK\1.1.108.0\Include;include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>
+      </AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
@@ -139,4 +140,5 @@
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="compiler.hpp" />
     <ClInclude Include="consts.hpp" />
     <ClInclude Include="crash-logger.hpp" />
Index: game-gui-glfw.cpp
===================================================================
--- game-gui-glfw.cpp	(revision 27c40cefd96c63cd41234d37e4e62526a7c4ecdb)
+++ game-gui-glfw.cpp	(revision 7bf5433f5c6c2730d8e43381bfb0d0741b7fb34a)
@@ -1,13 +1,15 @@
 #include "game-gui-glfw.hpp"
+
+#include <queue>
 
 #include "compiler.hpp"
 #include "consts.hpp"
 
-const int KEY_STATE_UNCHANGED = -1;
+int GameGui_GLFW::s_keyState[GLFW_KEY_LAST];
+bool GameGui_GLFW::s_keyDown[GLFW_KEY_LAST];
+
+// queue<MouseEvent> mouseEvents;
 
 string GameGui_GLFW::s_errorMessage;
-
-int GameGui_GLFW::s_keyState[NUM_KEYS];
-bool GameGui_GLFW::s_keyDown[NUM_KEYS];
 
 string& GameGui_GLFW::getError() {
@@ -62,8 +64,9 @@
    //glfwMakeContextCurrent(window);
 
-   //glfwSetMouseButtonCallback(window, mouse_button_callback);
+   glfwSetMouseButtonCallback(window, glfw_mouse_button_callback);
    glfwSetKeyCallback(window, glfw_key_callback);
 
-   fill(GameGui_GLFW::s_keyState, GameGui_GLFW::s_keyState + NUM_KEYS, KEY_STATE_UNCHANGED);
+   // fill(s_keyState, s_keyState + GLFW_KEY_LAST, RTWO_KEY_EVENT_NONE);
+   // fill(s_keyDown, s_keyDown + GLFW_KEY_LAST, false);
 
    return window;
@@ -74,4 +77,31 @@
    glfwDestroyWindow(window);
 }
+
+/*
+void GameGui_GLFW::processEvents() {
+   fill(s_keyState, s_keyState + GLFW_KEY_LAST, RTWO_KEY_EVENT_NONE);
+
+   glfwPollEvents();
+}
+
+unsigned char GameGui_GLFW::getKeyEvent(unsigned int key) {
+   return s_keyState[key];
+}
+
+bool GameGui_GLFW::isKeyPressed(unsigned int key) {
+   return s_keyDown[key];
+}
+
+int GameGui_GLFW::pollMouseEvent(MouseEvent* event) {
+   if (mouseEvents.empty()) {
+      return 0;
+   }
+
+   *event = mouseEvents.front();
+   mouseEvents.pop();
+
+   return 1;
+}
+*/
 
 #ifdef GAMEGUI_INCLUDE_VULKAN
@@ -107,8 +137,32 @@
 }
 
+void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods) {
+   double x, y;
+   glfwGetCursorPos(window, &x, &y);
+
+   /*
+   MouseEvent e { button, action, (int)x, (int)y };
+
+   mouseEvents.push(e);
+   */
+}
+
 void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
    GameGui_GLFW::s_keyState[key] = action;
+   /*
+   switch(action) {
+      case GLFW_PRESS:
+         s_keyState[key] = RTWO_KEY_EVENT_PRESSED;
+         break;
+      case GLFW_RELEASE:
+         s_keyState[key] = RTWO_KEY_EVENT_RELEASED;
+         break;
+      default:
+         s_keyState[key] = RTWO_KEY_EVENT_NONE;
+         break;
+   }
 
    // should be true for GLFW_PRESS and GLFW_REPEAT
    GameGui_GLFW::s_keyDown[key] = (action != GLFW_RELEASE);
+   */
 }
Index: game-gui-glfw.hpp
===================================================================
--- game-gui-glfw.hpp	(revision 27c40cefd96c63cd41234d37e4e62526a7c4ecdb)
+++ game-gui-glfw.hpp	(revision 7bf5433f5c6c2730d8e43381bfb0d0741b7fb34a)
@@ -10,6 +10,4 @@
 #include <GLFW/glfw3.h>
 
-#define NUM_KEYS (512)
-
 class GameGui_GLFW : public GameGui {
    public:
@@ -18,6 +16,6 @@
       // Both have to be public so that glfw_key_callback can access them
       // TODO: Implement a more generic public api over this to get the key state
-      static int s_keyState[NUM_KEYS];
-      static bool s_keyDown[NUM_KEYS];
+      static int s_keyState[GLFW_KEY_LAST];
+      static bool s_keyDown[GLFW_KEY_LAST];
 
       string& getError();
@@ -28,4 +26,13 @@
       void* createWindow(const string& title, int width, int height, bool fullscreen);
       void destroyWindow();
+
+      /*
+      void processEvents();
+
+      unsigned char getKeyEvent(unsigned int key);
+      bool isKeyPressed(unsigned int key);
+
+      int pollMouseEvent(MouseEvent* event);
+      */
 
 #ifdef GAMEGUI_INCLUDE_VULKAN
@@ -43,4 +50,5 @@
 
 void glfw_error_callback(int error, const char* description);
+void glfw_mouse_button_callback(GLFWwindow* window, int button, int action, int mods);
 void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods);
 
Index: opengl-game.cpp
===================================================================
--- opengl-game.cpp	(revision 27c40cefd96c63cd41234d37e4e62526a7c4ecdb)
+++ opengl-game.cpp	(revision 7bf5433f5c6c2730d8e43381bfb0d0741b7fb34a)
@@ -57,5 +57,19 @@
 
 void OpenGLGame::mainLoop() {
+   //MouseEvent e;
+
    while (!glfwWindowShouldClose(window)) {
+      /*
+      gui->processEvents();
+
+      if (gui->getKeyEvent(GLFW_KEY_ESCAPE) == RTWO_KEY_EVENT_PRESSED) {
+         glfwSetWindowShouldClose(window, 1);
+      }
+
+      while (gui->pollMouseEvent(&e)) {
+         cout << "Mouse click detected at (" << e.x << ", " << e.y << ")" << endl;
+      }
+      */
+
       glfwPollEvents();
 
