Index: game-gui-glfw.cpp
===================================================================
--- game-gui-glfw.cpp	(revision 301d0d470c82c5948b168e05240b05caa640455a)
+++ game-gui-glfw.cpp	(revision 1ce9afe3ae0ad78348a9673e25aa7483c890246d)
@@ -1,11 +1,13 @@
 #include "game-gui-glfw.hpp"
 
+#include "compiler.hpp"
 #include "consts.hpp"
+
+const int KEY_STATE_UNCHANGED = -1;
 
 string GameGui_GLFW::s_errorMessage;
 
-void glfw_error_callback(int error, const char* description) {
-   GameGui_GLFW::s_errorMessage = description;
-}
+int GameGui_GLFW::s_keyState[NUM_KEYS];
+bool GameGui_GLFW::s_keyDown[NUM_KEYS];
 
 string& GameGui_GLFW::GetError() {
@@ -24,8 +26,42 @@
 }
 
-void* GameGui_GLFW::CreateWindow(const string& title, unsigned int width, unsigned int height) {
-   glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
+void* GameGui_GLFW::CreateWindow(const string& title, unsigned int width, unsigned int height, bool fullscreen) {
+   GLFWwindow* window = nullptr;
+   GLFWmonitor* mon = nullptr;
 
-   window = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr);
+#if defined(GAMEGUI_INCLUDE_VULKAN)
+   glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); // This is for Vulkan, OpenGL needs different flags
+#elif defined(MAC)
+   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+   glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+   glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
+   glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+#else
+   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
+   glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+#endif
+
+   glfwWindowHint(GLFW_SAMPLES, 16);
+   glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, true);
+
+   if (fullscreen) {
+      mon = glfwGetPrimaryMonitor();
+      const GLFWvidmode* vmode = glfwGetVideoMode(mon);
+
+      width = vmode->width;
+      height = vmode->height;
+
+      // TODO: Should probably enable some way to retrieve this from outside this class
+      // and print it out there
+      cout << "Fullscreen resolution " << vmode->width << "x" << vmode->height << endl;
+   }
+
+   window = glfwCreateWindow(width, height, title.c_str(), mon, nullptr);
+   //glfwMakeContextCurrent(window);
+
+   //glfwSetMouseButtonCallback(window, mouse_button_callback);
+   glfwSetKeyCallback(window, glfw_key_callback);
+
+   fill(GameGui_GLFW::s_keyState, GameGui_GLFW::s_keyState + NUM_KEYS, KEY_STATE_UNCHANGED);
 
    return window;
@@ -60,2 +96,13 @@
    glfwGetFramebufferSize(window, width, height);
 }
+
+void glfw_error_callback(int error, const char* description) {
+   GameGui_GLFW::s_errorMessage = description;
+}
+
+void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
+   GameGui_GLFW::s_keyState[key] = action;
+
+   // 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 301d0d470c82c5948b168e05240b05caa640455a)
+++ game-gui-glfw.hpp	(revision 1ce9afe3ae0ad78348a9673e25aa7483c890246d)
@@ -10,14 +10,21 @@
 #include <GLFW/glfw3.h>
 
+#define NUM_KEYS (512)
+
 class GameGui_GLFW : public GameGui {
    public:
+      static string s_errorMessage; // Has to be public so that glfw_error_callback can access it
+
+      // 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];
+
       string& GetError();
-
-      static string s_errorMessage; // Has to be public so that glfw_error_callback can access it
 
       bool Init();
       void Shutdown();
 
-      void* CreateWindow(const string& title, unsigned int width, unsigned int height);
+      void* CreateWindow(const string& title, unsigned int width, unsigned int height, bool fullscreen);
       void DestroyWindow();
 
@@ -34,4 +41,5 @@
 
 void glfw_error_callback(int error, const char* description);
+void glfw_key_callback(GLFWwindow* window, int key, int scancode, int action, int mods);
 
 #endif // _GAME_GUI_GLFW_H
Index: game-gui-sdl.cpp
===================================================================
--- game-gui-sdl.cpp	(revision 301d0d470c82c5948b168e05240b05caa640455a)
+++ game-gui-sdl.cpp	(revision 1ce9afe3ae0ad78348a9673e25aa7483c890246d)
@@ -37,5 +37,9 @@
 }
 
-void* GameGui_SDL::CreateWindow(const string& title, unsigned int width, unsigned int height) {
+void* GameGui_SDL::CreateWindow(const string& title, unsigned int width, unsigned int height, bool fullscreen) {
+   cout << "About to go fullscreen in SDL..." << endl;
+
+   // TODO: Make an OpenGL version of the SDL_CreateWindow call as well
+
    // On Apple's OS X you must set the NSHighResolutionCapable Info.plist property to YES,
    // otherwise you will not receive a High DPI OpenGL canvas.
Index: game-gui-sdl.hpp
===================================================================
--- game-gui-sdl.hpp	(revision 301d0d470c82c5948b168e05240b05caa640455a)
+++ game-gui-sdl.hpp	(revision 1ce9afe3ae0ad78348a9673e25aa7483c890246d)
@@ -16,5 +16,5 @@
       void Shutdown();
 
-      void* CreateWindow(const string& title, unsigned int width, unsigned int height);
+      void* CreateWindow(const string& title, unsigned int width, unsigned int height, bool fullscreen);
       void DestroyWindow();
 
Index: game-gui.hpp
===================================================================
--- game-gui.hpp	(revision 301d0d470c82c5948b168e05240b05caa640455a)
+++ game-gui.hpp	(revision 1ce9afe3ae0ad78348a9673e25aa7483c890246d)
@@ -8,4 +8,7 @@
    #include <vulkan/vulkan.h>
 #endif
+
+// TODO: Remove the line below once the couts in the game-gui-* files are moved
+#include <iostream>
 
 using namespace std;
@@ -20,5 +23,5 @@
       virtual void Shutdown() = 0;
 
-      virtual void* CreateWindow(const string& title, unsigned int width, unsigned int height) = 0;
+      virtual void* CreateWindow(const string& title, unsigned int width, unsigned int height, bool fullscreen) = 0;
       virtual void DestroyWindow() = 0;
 
Index: opengl-game.cpp
===================================================================
--- opengl-game.cpp	(revision 301d0d470c82c5948b168e05240b05caa640455a)
+++ opengl-game.cpp	(revision 1ce9afe3ae0ad78348a9673e25aa7483c890246d)
@@ -36,5 +36,5 @@
    cout << "GUI init succeeded" << endl;
 
-   window = (GLFWwindow*) gui->CreateWindow("OpenGL Game", width, height);
+   window = (GLFWwindow*) gui->CreateWindow("OpenGL Game", width, height, guiFlags | GUI_FLAGS_WINDOW_FULLSCREEN);
    if (window == nullptr) {
       cout << "Window could not be created!" << endl;
@@ -52,4 +52,8 @@
       glfwPollEvents();
 
+      if (GameGui_GLFW::s_keyState[GLFW_KEY_ESCAPE] == GLFW_PRESS) {
+         glfwSetWindowShouldClose(window, 1);
+      }
+
       glfwSwapBuffers(window);
    }
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 301d0d470c82c5948b168e05240b05caa640455a)
+++ vulkan-game.cpp	(revision 1ce9afe3ae0ad78348a9673e25aa7483c890246d)
@@ -37,5 +37,5 @@
    cout << "GUI init succeeded" << endl;
 
-   window = (SDL_Window*) gui->CreateWindow("Vulkan Game", width, height);
+   window = (SDL_Window*) gui->CreateWindow("Vulkan Game", width, height, guiFlags | GUI_FLAGS_WINDOW_FULLSCREEN);
    if (window == nullptr) {
       cout << "Window could not be created!" << endl;
