Index: game-gui-glfw.cpp
===================================================================
--- game-gui-glfw.cpp	(revision 0e6ecf3a10430e2bf6c5aacbc94e7b071595df55)
+++ game-gui-glfw.cpp	(revision 0e6ecf3a10430e2bf6c5aacbc94e7b071595df55)
@@ -0,0 +1,27 @@
+#include "game-gui-glfw.hpp"
+
+bool GameGui_GLFW::Init() {
+   return glfwInit() == GLFW_TRUE ? RTWO_SUCCESS : RTWO_SUCCESS;
+}
+
+void GameGui_GLFW::Shutdown() {
+   glfwTerminate();
+}
+
+void* GameGui_GLFW::CreateWindow(const string& title, unsigned int width, unsigned int height) {
+   glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
+
+   window = glfwCreateWindow(width, height, title.c_str(), nullptr, nullptr);
+
+   return window;
+}
+
+void GameGui_GLFW::DestroyWindow() {
+   // TODO: This function can throw some errors. They should be handled
+   glfwDestroyWindow(window);
+}
+
+bool GameGui_GLFW::CreateVulkanSurface(VkInstance instance, VkSurfaceKHR* surface) {
+   return glfwCreateWindowSurface(instance, window, nullptr, surface) == VK_SUCCESS ?
+      RTWO_SUCCESS : RTWO_ERROR;
+}
Index: game-gui-glfw.hpp
===================================================================
--- game-gui-glfw.hpp	(revision 0e6ecf3a10430e2bf6c5aacbc94e7b071595df55)
+++ game-gui-glfw.hpp	(revision 0e6ecf3a10430e2bf6c5aacbc94e7b071595df55)
@@ -0,0 +1,23 @@
+#ifndef _GAME_GUI_GLFW_H
+#define _GAME_GUI_GLFW_H
+
+#include "game-gui.hpp"
+
+#define GLFW_INCLUDE_VULKAN
+#include <GLFW/glfw3.h>
+
+class GameGui_GLFW : public GameGui {
+   public:
+      bool Init();
+      void Shutdown();
+
+      void* CreateWindow(const string& title, unsigned int width, unsigned int height);
+      void DestroyWindow();
+
+      bool CreateVulkanSurface(VkInstance instance, VkSurfaceKHR* surface);
+
+   private:
+      GLFWwindow* window;
+};
+
+#endif // _GAME_GUI_GLFW_H
Index: game-gui-sdl.cpp
===================================================================
--- game-gui-sdl.cpp	(revision 75108efed1de8df522fe278cac2afd7a2ecb8973)
+++ game-gui-sdl.cpp	(revision 0e6ecf3a10430e2bf6c5aacbc94e7b071595df55)
@@ -1,9 +1,3 @@
 #include "game-gui-sdl.hpp"
-
-#include <SDL2/SDL.h>
-
-#include <iostream>
-
-using namespace std;
 
 bool GameGui_SDL::Init() {
@@ -22,2 +16,23 @@
    SDL_Quit();
 }
+
+void* GameGui_SDL::CreateWindow(const string& title, unsigned int width, unsigned int height) {
+   // 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.
+   window = SDL_CreateWindow(title.c_str(),
+               SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
+               width, height,
+               SDL_WINDOW_VULKAN | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
+
+   return window;
+}
+
+void GameGui_SDL::DestroyWindow() {
+   // TODO: This function can throw some errors. They should be handled
+   SDL_DestroyWindow(window);
+}
+
+bool GameGui_SDL::CreateVulkanSurface(VkInstance instance, VkSurfaceKHR* surface) {
+   return SDL_Vulkan_CreateSurface(window, instance, surface) ?
+      RTWO_SUCCESS : RTWO_ERROR;
+}
Index: game-gui-sdl.hpp
===================================================================
--- game-gui-sdl.hpp	(revision 75108efed1de8df522fe278cac2afd7a2ecb8973)
+++ game-gui-sdl.hpp	(revision 0e6ecf3a10430e2bf6c5aacbc94e7b071595df55)
@@ -1,3 +1,9 @@
+#ifndef _GAME_GUI_SDL_H
+#define _GAME_GUI_SDL_H
+
 #include "game-gui.hpp"
+
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_vulkan.h>
 
 class GameGui_SDL : public GameGui {
@@ -5,3 +11,13 @@
       bool Init();
       void Shutdown();
+
+      void* CreateWindow(const string& title, unsigned int width, unsigned int height);
+      void DestroyWindow();
+
+      bool CreateVulkanSurface(VkInstance instance, VkSurfaceKHR* surface);
+
+   private:
+      SDL_Window* window;
 };
+
+#endif // _GAME_GUI_SDL_H
Index: game-gui.hpp
===================================================================
--- game-gui.hpp	(revision 75108efed1de8df522fe278cac2afd7a2ecb8973)
+++ game-gui.hpp	(revision 0e6ecf3a10430e2bf6c5aacbc94e7b071595df55)
@@ -1,2 +1,11 @@
+#ifndef _GAME_GUI_H
+#define _GAME_GUI_H
+
+#include <vulkan/vulkan.h>
+
+#include <string>
+
+using namespace std;
+
 #define RTWO_SUCCESS true
 #define RTWO_ERROR false
@@ -8,3 +17,10 @@
       virtual bool Init() = 0;
       virtual void Shutdown() = 0;
+
+      virtual void* CreateWindow(const string& title, unsigned int width, unsigned int height) = 0;
+      virtual void DestroyWindow() = 0;
+
+      virtual bool CreateVulkanSurface(VkInstance instance, VkSurfaceKHR* surface) = 0; 
 };
+
+#endif // _GAME_GUI_H
Index: makefile
===================================================================
--- makefile	(revision 75108efed1de8df522fe278cac2afd7a2ecb8973)
+++ makefile	(revision 0e6ecf3a10430e2bf6c5aacbc94e7b071595df55)
@@ -42,5 +42,5 @@
 endif
 
-LIBS = `pkg-config --static --libs sdl2`
+LIBS = `pkg-config --static --libs sdl2 glfw3`
 ifeq ($(OS),Darwin)
 	LIBS := $(VULKAN_SDK_PATH)/lib/libvulkan.dylib $(LIBS)
@@ -52,5 +52,5 @@
 LIB_FLAGS = $(LIB_PATHS) $(LIBS)
 
-vulkangame: vulkan-game.cpp game-gui-sdl.cpp
+vulkangame: vulkan-game.cpp game-gui-sdl.cpp game-gui-glfw.cpp
 	$(CC) $(CXX_FLAGS) -o $@ $^ $(LIB_FLAGS)
 
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 75108efed1de8df522fe278cac2afd7a2ecb8973)
+++ vulkan-game.cpp	(revision 0e6ecf3a10430e2bf6c5aacbc94e7b071595df55)
@@ -1,6 +1,5 @@
-#include <vulkan/vulkan.h>
-
-#include <SDL2/SDL.h>
-#include <SDL2/SDL_vulkan.h>
+#include "game-gui-glfw.hpp"
+
+#include "game-gui-sdl.hpp"
 
 //#define _USE_MATH_DEFINES // Will be needed when/if I need to # include <cmath>
@@ -11,14 +10,9 @@
 #include <glm/mat4x4.hpp>
 
+#include <fstream>
 #include <iostream>
+#include <optional>
+#include <set>
 #include <vector>
-#include <set>
-#include <stdexcept>
-#include <cstdlib>
-#include <optional>
-#include <algorithm>
-#include <fstream>
-
-#include "game-gui-sdl.hpp"
 
 using namespace std;
@@ -137,12 +131,5 @@
             return RTWO_ERROR;
          } else {
-            // 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.
-
-            // TODO: Move this into some generic method in game-gui-sdl
-            window = SDL_CreateWindow("Vulkan Game",
-               SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
-               SCREEN_WIDTH, SCREEN_HEIGHT,
-               SDL_WINDOW_VULKAN | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
+            window = (SDL_Window*) gui->CreateWindow("Vulkan Game", SCREEN_WIDTH, SCREEN_HEIGHT);
 
             if (window == nullptr) {
@@ -274,13 +261,7 @@
          }
 
-         if (!SDL_Vulkan_CreateSurface(window, instance, &surface)) {
+         if (gui->CreateVulkanSurface(instance, &surface) == RTWO_ERROR) {
             throw runtime_error("failed to create window surface!");
          }
-
-         /*
-         if (glfwCreateWindowSurface(instance, window, nullptr, &surface) != VK_SUCCESS) {
-            throw runtime_error("failed to create window surface!");
-         }
-         */
       }
 
@@ -1014,7 +995,5 @@
          vkDestroyInstance(instance, nullptr);
 
-         // TODO: Move this into some generic method in game-gui-sdl
-         SDL_DestroyWindow(window);
-
+         gui->DestroyWindow();
          gui->Shutdown();
          delete gui;
@@ -1029,5 +1008,5 @@
 
          return VK_FALSE;
-}
+      }
 
       static vector<char> readFile(const string& filename) {
