Index: game-gui-glfw.hpp
===================================================================
--- game-gui-glfw.hpp	(revision 203ab1bb4bc5c4f4c34de07f7cb1d8ce9d17c3c4)
+++ game-gui-glfw.hpp	(revision f6521fb45b951dc6898451d050a9e418cba295e2)
@@ -47,4 +47,5 @@
 
       int windowWidth, windowHeight;
+      static queue<UIEvent> s_events;
 };
 
Index: game-gui-sdl.cpp
===================================================================
--- game-gui-sdl.cpp	(revision 203ab1bb4bc5c4f4c34de07f7cb1d8ce9d17c3c4)
+++ game-gui-sdl.cpp	(revision f6521fb45b951dc6898451d050a9e418cba295e2)
@@ -5,7 +5,4 @@
 
 #include "consts.hpp"
-
-map<unsigned int, unsigned char> s_keyState;
-map<unsigned int, bool> s_keyDown;
 
 using namespace std;
@@ -81,68 +78,57 @@
 }
 
-/*
 void GameGui_SDL::processEvents() {
+}
+
+int GameGui_SDL::pollEvent(UIEvent* event) {
    SDL_Event e;
 
-   s_keyState.clear();
-   while (SDL_PollEvent(&e)) {
-      if (e.type == SDL_KEYDOWN || e.type == SDL_KEYUP) {
-         if (e.type == SDL_KEYDOWN && !e.key.repeat) {
-            s_keyState[e.key.keysym.sym] = RTWO_KEY_EVENT_PRESSED;
-         } else if (e.type == SDL_KEYUP) {
-            s_keyState[e.key.keysym.sym] = RTWO_KEY_EVENT_RELEASED;
-         } else {
-            s_keyState.erase(e.key.keysym.sym);
-         }
+   /* The trackpad on OSX triggers both SDL_MOUSE and SDL_FINGER events, so just treat them both
+    * as mouse events since this game isn't targeting mobile devices
+    */
 
-         s_keyDown[e.key.keysym.sym] = e.type == SDL_KEYDOWN;
-      } else if (e.type == SDL_MOUSEBUTTONDOWN || e.type == SDL_MOUSEBUTTONUP) {
-         MouseEvent mouseEvent { 0, 0, e.button.x, e.button.y };
+   if (SDL_PollEvent(&e)) {
+      switch(e.type) {
+         case SDL_QUIT:
+            event->type = UI_EVENT_QUIT;
+            break;
+         case SDL_WINDOWEVENT:
+            event->type = UI_EVENT_WINDOW;
+            break;
+         case SDL_KEYUP:
+         case SDL_KEYDOWN:
+            event->type = UI_EVENT_KEY;
+            event->key.keycode = e.key.keysym.scancode;
+            break;
+         case SDL_MOUSEBUTTONDOWN:
+         case SDL_FINGERDOWN:
+            event->type = UI_EVENT_MOUSEBUTTONDOWN;
+            break;
+         case SDL_MOUSEBUTTONUP:
+         case SDL_FINGERUP:
+            event->type = UI_EVENT_MOUSEBUTTONUP;
+            break;
+         case SDL_MOUSEMOTION:
+         case SDL_FINGERMOTION:
+            event->type = UI_EVENT_MOUSEMOTION;
+            break;
+         // Ignore the following events
+         case SDL_AUDIODEVICEADDED:
+         case SDL_AUDIODEVICEREMOVED:
+            event = nullptr;
+            return 0;
+            break;
+         default:
+            cout << "Unknown event type: 0x" << hex << e.type << dec << endl;
+            event = nullptr;
+            return 0;
+      }
 
-         mouseEvents.push(mouseEvent);
-      } else {
-         events.push(e);
-      }
-   }
-}
-
-int GameGui_SDL::pollMouseEvent(MouseEvent* event) {
-   if (mouseEvents.empty()) {
-      return 0;
+      return 1;
    }
 
-   *event = mouseEvents.front();
-   mouseEvents.pop();
-
-   return 1;
+   event = nullptr;
+   return 0;
 }
-
-unsigned char GameGui_SDL::getKeyEvent(unsigned int key) {
-   if (s_keyDown.count(key)) {
-      return s_keyState[key];
-   } else {
-      return RTWO_KEY_EVENT_NONE;
-   }
-}
-
-bool GameGui_SDL::isKeyPressed(unsigned int key) {
-   if (s_keyDown.count(key)) {
-      return s_keyDown[key];
-   } else {
-      return false;
-   }
-}
-
-int GameGui_SDL::pollEvent(SDL_Event* event) {
-   if (events.empty()) {
-      return 0;
-   }
-
-   *event = events.front();
-   events.pop();
-
-   return 1;
-}
-*/
 
 #ifdef GAMEGUI_INCLUDE_VULKAN
Index: game-gui-sdl.hpp
===================================================================
--- game-gui-sdl.hpp	(revision 203ab1bb4bc5c4f4c34de07f7cb1d8ce9d17c3c4)
+++ game-gui-sdl.hpp	(revision f6521fb45b951dc6898451d050a9e418cba295e2)
@@ -18,4 +18,7 @@
       void* createWindow(const string& title, int width, int height, bool fullscreen);
       void destroyWindow();
+
+      void processEvents();
+      int pollEvent(UIEvent* event);
 
       // temporary
Index: game-gui.hpp
===================================================================
--- game-gui.hpp	(revision 203ab1bb4bc5c4f4c34de07f7cb1d8ce9d17c3c4)
+++ game-gui.hpp	(revision f6521fb45b951dc6898451d050a9e418cba295e2)
@@ -5,12 +5,41 @@
 #include <vector>
 
+// TODO: Remove the line below once the couts in the game-gui-* files are moved
+#include <iostream>
+
 #ifdef GAMEGUI_INCLUDE_VULKAN
    #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;
 
-using namespace std;
+enum EventType {
+   UI_EVENT_QUIT,
+   UI_EVENT_WINDOW,
+   UI_EVENT_KEY,
+   UI_EVENT_MOUSEBUTTONDOWN,
+   UI_EVENT_MOUSEBUTTONUP,
+   UI_EVENT_MOUSEMOTION
+};
+
+struct WindowEvent {
+   EventType type;
+};
+
+struct KeyEvent {
+   EventType type;
+   unsigned int keycode;
+};
+
+struct MouseEvent {
+   EventType type;
+};
+
+union UIEvent {
+   EventType type;
+   WindowEvent window;
+   KeyEvent key;
+   MouseEvent mouse;
+};
 
 /*
@@ -35,4 +64,7 @@
       virtual void destroyWindow() = 0;
 
+      virtual void processEvents() = 0;
+      virtual int pollEvent(UIEvent* event) = 0;
+
       /*
       virtual void processEvents() = 0;
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 203ab1bb4bc5c4f4c34de07f7cb1d8ce9d17c3c4)
+++ vulkan-game.cpp	(revision f6521fb45b951dc6898451d050a9e418cba295e2)
@@ -61,30 +61,35 @@
 
 void VulkanGame::mainLoop() {
-   SDL_Event e;
-   //MouseEvent mouseEvent;
+   UIEvent e;
    bool quit = false;
 
    while (!quit) {
-      /*
       gui->processEvents();
 
-      if (gui->getKeyEvent(SDLK_ESCAPE) == RTWO_KEY_EVENT_PRESSED) {
-         quit = true;
-      }
-
-      while (gui->pollMouseEvent(&mouseEvent)) {
-         cout << "Mouse click detected at (" << mouseEvent.x << ", " << mouseEvent.y << ")" << endl;
-      }
-      */
-
-      while (SDL_PollEvent(&e)) {
-         if (e.type == SDL_QUIT) {
-            quit = true;
-         }
-         if (e.type == SDL_KEYDOWN) {
-            quit = true;
-         }
-         if (e.type == SDL_MOUSEBUTTONDOWN) {
-            quit = true;
+      while (gui->pollEvent(&e)) {
+         switch(e.type) {
+            case UI_EVENT_QUIT:
+               cout << "Quit event detected" << endl;
+               quit = true;
+               break;
+            case UI_EVENT_WINDOW:
+               cout << "Window event detected" << endl;
+               // Currently unused
+               break;
+            case UI_EVENT_KEY:
+               if (e.key.keycode == SDL_SCANCODE_ESCAPE) {
+                  quit = true;
+               } else {
+                  cout << "Key event detected" << endl;
+               }
+               break;
+            case UI_EVENT_MOUSEBUTTONDOWN:
+               cout << "Mouse button down event detected" << endl;
+               break;
+            case UI_EVENT_MOUSEBUTTONUP:
+               cout << "Mouse button up event detected" << endl;
+               break;
+            case UI_EVENT_MOUSEMOTION:
+               break;
          }
       }
