shithub: cstory

Download patch

ref: 8acdcface4d841539c04d022dc5b77e28819c7ae
parent: 4568d58c777c3a7f72463bea3d019b2617ef1287
author: Clownacy <Clownacy@users.noreply.github.com>
date: Sat Apr 4 15:56:57 EDT 2020

Update CMakeLists.txt

--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -303,9 +303,17 @@
 endif()
 
 if(BACKEND_AUDIO MATCHES "SDL2")
-	target_sources(CSE2 PRIVATE "src/Backends/Audio/SDL2.cpp" "src/Backends/Audio/SoftwareMixer.cpp" "src/Backends/Audio/SoftwareMixer.h")
+	target_sources(CSE2 PRIVATE
+		"src/Backends/Audio/SDL2.cpp"
+		"src/Backends/Audio/SoftwareMixer.cpp"
+		"src/Backends/Audio/SoftwareMixer.h"
+	)
 elseif(BACKEND_AUDIO MATCHES "miniaudio")
-	target_sources(CSE2 PRIVATE "src/Backends/Audio/miniaudio.cpp" "src/Backends/Audio/SoftwareMixer.cpp" "src/Backends/Audio/SoftwareMixer.h")
+	target_sources(CSE2 PRIVATE
+		"src/Backends/Audio/miniaudio.cpp"
+		"src/Backends/Audio/SoftwareMixer.cpp"
+		"src/Backends/Audio/SoftwareMixer.h"
+	)
 
 	# Link libdl, libm, and libpthread
 	include(CheckLibraryExists)
@@ -326,9 +334,18 @@
 endif()
 
 if(BACKEND_PLATFORM MATCHES "SDL2")
-	target_sources(CSE2 PRIVATE "src/Backends/SDL2/Controller.cpp" "src/Backends/SDL2/Misc.cpp" "src/Backends/SDL2/Platform.h")
+	target_sources(CSE2 PRIVATE
+		"src/Backends/SDL2/Controller.cpp"
+		"src/Backends/SDL2/Controller.h"
+		"src/Backends/SDL2/Platform.cpp"
+		"src/Backends/SDL2/Platform.h"
+	)
 elseif(BACKEND_PLATFORM MATCHES "GLFW3")
-	target_sources(CSE2 PRIVATE "src/Backends/GLFW3/Controller.cpp" "src/Backends/GLFW3/Misc.cpp" "src/Backends/GLFW3/Platform.h")
+	target_sources(CSE2 PRIVATE
+		"src/Backends/GLFW3/Controller.cpp"
+		"src/Backends/GLFW3/Platform.cpp"
+		"src/Backends/GLFW3/Platform.h"
+	)
 endif()
 
 if(BACKEND_PLATFORM MATCHES "SDL2" AND BACKEND_RENDERER MATCHES "OpenGL3")
--- a/src/Backends/GLFW3/Misc.cpp
+++ /dev/null
@@ -1,294 +1,0 @@
-#include "../Platform.h"
-#include "Platform.h"
-
-#include <chrono>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <thread>
-
-#include <GLFW/glfw3.h>
-
-#include "../../WindowsWrapper.h"
-
-#include "../Rendering.h"
-#include "../../Main.h"
-#include "../../Organya.h"
-#include "../../Profile.h"
-#include "../../Resource.h"
-
-#define DO_KEY(GLFW_KEY, BACKEND_KEY) \
-	case GLFW_KEY: \
-		backend_keyboard_state[BACKEND_KEY] = action == GLFW_PRESS; \
-		break;
-
-GLFWwindow *window;
-
-BOOL bActive = TRUE;
-BOOL backend_keyboard_state[BACKEND_KEYBOARD_TOTAL];
-BOOL backend_previous_keyboard_state[BACKEND_KEYBOARD_TOTAL];
-
-static GLFWcursor* cursor;
-
-static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods)
-{
-	(void)window;
-	(void)scancode;
-	(void)mods;
-
-	switch (action)
-	{
-		case GLFW_RELEASE:
-		case GLFW_PRESS:
-			switch (key)
-			{
-				DO_KEY(GLFW_KEY_A, BACKEND_KEYBOARD_A)
-				DO_KEY(GLFW_KEY_B, BACKEND_KEYBOARD_B)
-				DO_KEY(GLFW_KEY_C, BACKEND_KEYBOARD_C)
-				DO_KEY(GLFW_KEY_D, BACKEND_KEYBOARD_D)
-				DO_KEY(GLFW_KEY_E, BACKEND_KEYBOARD_E)
-				DO_KEY(GLFW_KEY_F, BACKEND_KEYBOARD_F)
-				DO_KEY(GLFW_KEY_G, BACKEND_KEYBOARD_G)
-				DO_KEY(GLFW_KEY_H, BACKEND_KEYBOARD_H)
-				DO_KEY(GLFW_KEY_I, BACKEND_KEYBOARD_I)
-				DO_KEY(GLFW_KEY_J, BACKEND_KEYBOARD_J)
-				DO_KEY(GLFW_KEY_K, BACKEND_KEYBOARD_K)
-				DO_KEY(GLFW_KEY_L, BACKEND_KEYBOARD_L)
-				DO_KEY(GLFW_KEY_M, BACKEND_KEYBOARD_M)
-				DO_KEY(GLFW_KEY_N, BACKEND_KEYBOARD_N)
-				DO_KEY(GLFW_KEY_O, BACKEND_KEYBOARD_O)
-				DO_KEY(GLFW_KEY_P, BACKEND_KEYBOARD_P)
-				DO_KEY(GLFW_KEY_Q, BACKEND_KEYBOARD_Q)
-				DO_KEY(GLFW_KEY_R, BACKEND_KEYBOARD_R)
-				DO_KEY(GLFW_KEY_S, BACKEND_KEYBOARD_S)
-				DO_KEY(GLFW_KEY_T, BACKEND_KEYBOARD_T)
-				DO_KEY(GLFW_KEY_U, BACKEND_KEYBOARD_U)
-				DO_KEY(GLFW_KEY_V, BACKEND_KEYBOARD_V)
-				DO_KEY(GLFW_KEY_W, BACKEND_KEYBOARD_W)
-				DO_KEY(GLFW_KEY_X, BACKEND_KEYBOARD_X)
-				DO_KEY(GLFW_KEY_Y, BACKEND_KEYBOARD_Y)
-				DO_KEY(GLFW_KEY_Z, BACKEND_KEYBOARD_Z)
-				DO_KEY(GLFW_KEY_0, BACKEND_KEYBOARD_0)
-				DO_KEY(GLFW_KEY_1, BACKEND_KEYBOARD_1)
-				DO_KEY(GLFW_KEY_2, BACKEND_KEYBOARD_2)
-				DO_KEY(GLFW_KEY_3, BACKEND_KEYBOARD_3)
-				DO_KEY(GLFW_KEY_4, BACKEND_KEYBOARD_4)
-				DO_KEY(GLFW_KEY_5, BACKEND_KEYBOARD_5)
-				DO_KEY(GLFW_KEY_6, BACKEND_KEYBOARD_6)
-				DO_KEY(GLFW_KEY_7, BACKEND_KEYBOARD_7)
-				DO_KEY(GLFW_KEY_8, BACKEND_KEYBOARD_8)
-				DO_KEY(GLFW_KEY_9, BACKEND_KEYBOARD_9)
-				DO_KEY(GLFW_KEY_F1, BACKEND_KEYBOARD_F1)
-				DO_KEY(GLFW_KEY_F2, BACKEND_KEYBOARD_F2)
-				DO_KEY(GLFW_KEY_F3, BACKEND_KEYBOARD_F3)
-				DO_KEY(GLFW_KEY_F4, BACKEND_KEYBOARD_F4)
-				DO_KEY(GLFW_KEY_F5, BACKEND_KEYBOARD_F5)
-				DO_KEY(GLFW_KEY_F6, BACKEND_KEYBOARD_F6)
-				DO_KEY(GLFW_KEY_F7, BACKEND_KEYBOARD_F7)
-				DO_KEY(GLFW_KEY_F8, BACKEND_KEYBOARD_F8)
-				DO_KEY(GLFW_KEY_F9, BACKEND_KEYBOARD_F9)
-				DO_KEY(GLFW_KEY_F10, BACKEND_KEYBOARD_F10)
-				DO_KEY(GLFW_KEY_F11, BACKEND_KEYBOARD_F11)
-				DO_KEY(GLFW_KEY_F12, BACKEND_KEYBOARD_F12)
-				DO_KEY(GLFW_KEY_UP, BACKEND_KEYBOARD_UP)
-				DO_KEY(GLFW_KEY_DOWN, BACKEND_KEYBOARD_DOWN)
-				DO_KEY(GLFW_KEY_LEFT, BACKEND_KEYBOARD_LEFT)
-				DO_KEY(GLFW_KEY_RIGHT, BACKEND_KEYBOARD_RIGHT)
-				DO_KEY(GLFW_KEY_ESCAPE, BACKEND_KEYBOARD_ESCAPE)
-				DO_KEY(GLFW_KEY_GRAVE_ACCENT, BACKEND_KEYBOARD_BACK_QUOTE)
-				DO_KEY(GLFW_KEY_TAB, BACKEND_KEYBOARD_TAB)
-				DO_KEY(GLFW_KEY_CAPS_LOCK, BACKEND_KEYBOARD_CAPS_LOCK)
-				DO_KEY(GLFW_KEY_LEFT_SHIFT, BACKEND_KEYBOARD_LEFT_SHIFT)
-				DO_KEY(GLFW_KEY_LEFT_CONTROL, BACKEND_KEYBOARD_LEFT_CTRL)
-				DO_KEY(GLFW_KEY_LEFT_ALT, BACKEND_KEYBOARD_LEFT_ALT)
-				DO_KEY(GLFW_KEY_SPACE, BACKEND_KEYBOARD_SPACE)
-				DO_KEY(GLFW_KEY_RIGHT_ALT, BACKEND_KEYBOARD_RIGHT_ALT)
-				DO_KEY(GLFW_KEY_RIGHT_CONTROL, BACKEND_KEYBOARD_RIGHT_CTRL)
-				DO_KEY(GLFW_KEY_RIGHT_SHIFT, BACKEND_KEYBOARD_RIGHT_SHIFT)
-				DO_KEY(GLFW_KEY_ENTER, BACKEND_KEYBOARD_ENTER)
-				DO_KEY(GLFW_KEY_BACKSPACE, BACKEND_KEYBOARD_BACKSPACE)
-				DO_KEY(GLFW_KEY_MINUS, BACKEND_KEYBOARD_MINUS)
-				DO_KEY(GLFW_KEY_EQUAL, BACKEND_KEYBOARD_EQUALS)
-				DO_KEY(GLFW_KEY_LEFT_BRACKET, BACKEND_KEYBOARD_LEFT_BRACKET)
-				DO_KEY(GLFW_KEY_RIGHT_BRACKET, BACKEND_KEYBOARD_RIGHT_BRACKET)
-				DO_KEY(GLFW_KEY_BACKSLASH, BACKEND_KEYBOARD_BACK_SLASH)
-				DO_KEY(GLFW_KEY_SEMICOLON, BACKEND_KEYBOARD_SEMICOLON)
-				DO_KEY(GLFW_KEY_APOSTROPHE, BACKEND_KEYBOARD_APOSTROPHE)
-				DO_KEY(GLFW_KEY_COMMA, BACKEND_KEYBOARD_COMMA)
-				DO_KEY(GLFW_KEY_PERIOD, BACKEND_KEYBOARD_PERIOD)
-				DO_KEY(GLFW_KEY_SLASH, BACKEND_KEYBOARD_FORWARD_SLASH)
-
-				default:
-					break;
-			}
-
-			break;
-	}
-}
-
-static void WindowFocusCallback(GLFWwindow *window, int focused)
-{
-	(void)window;
-
-	if (focused)
-		ActiveWindow();
-	else
-		InactiveWindow();
-}
-
-static void WindowSizeCallback(GLFWwindow *window, int width, int height)
-{
-	(void)window;
-
-	Backend_HandleWindowResize(width, height);
-}
-
-static void DragAndDropCallback(GLFWwindow *window, int count, const char **paths)
-{
-	(void)window;
-	(void)count;
-
-	LoadProfile(paths[0]);
-}
-
-void PlatformBackend_Init(void)
-{
-	glfwInit();
-}
-
-void PlatformBackend_Deinit(void)
-{
-	if (cursor != NULL)
-		glfwDestroyCursor(cursor);
-
-	glfwTerminate();
-}
-
-void PlatformBackend_PostWindowCreation(void)
-{
-	// Hook callbacks
-	glfwSetKeyCallback(window, KeyCallback);
-	glfwSetWindowFocusCallback(window, WindowFocusCallback);
-	glfwSetWindowSizeCallback(window, WindowSizeCallback);
-}
-
-BOOL PlatformBackend_GetBasePath(char *string_buffer)
-{
-	(void)string_buffer;
-
-	// GLFW3 doesn't seem to have a mechanism for this
-	return FALSE;
-}
-
-void PlatformBackend_HideMouse(void)
-{
-	glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
-}
-
-void PlatformBackend_SetWindowIcon(const unsigned char *rgb_pixels, unsigned int width, unsigned int height)
-{
-	// Convert to RGBA, since that's the only think GLFW3 accepts
-	unsigned char *rgba_pixels = (unsigned char*)malloc(width * height * 4);
-
-	const unsigned char *rgb_pointer = rgb_pixels;
-	unsigned char *rgba_pointer = rgba_pixels;
-
-	if (rgba_pixels != NULL)
-	{
-		for (unsigned int y = 0; y < height; ++y)
-		{
-			for (unsigned int x = 0; x < width; ++x)
-			{
-				*rgba_pointer++ = *rgb_pointer++;
-				*rgba_pointer++ = *rgb_pointer++;
-				*rgba_pointer++ = *rgb_pointer++;
-				*rgba_pointer++ = 0xFF;
-			}
-		}
-
-		GLFWimage glfw_image = {(int)width, (int)height, rgba_pixels};
-		glfwSetWindowIcon(window, 1, &glfw_image);
-
-		free(rgba_pixels);
-	}
-}
-
-void PlatformBackend_SetCursor(const unsigned char *rgb_pixels, unsigned int width, unsigned int height)
-{
-	// Convert to RGBA, since that's the only think GLFW3 accepts
-	unsigned char *rgba_pixels = (unsigned char*)malloc(width * height * 4);
-
-	const unsigned char *rgb_pointer = rgb_pixels;
-	unsigned char *rgba_pointer = rgba_pixels;
-
-	if (rgba_pixels != NULL)
-	{
-		for (unsigned int y = 0; y < height; ++y)
-		{
-			for (unsigned int x = 0; x < width; ++x)
-			{
-				if (rgb_pointer[0] == 0xFF && rgb_pointer[1] == 0 && rgb_pointer[2] == 0xFF)	// Colour-key
-				{
-					*rgba_pointer++ = *rgb_pointer++;
-					*rgba_pointer++ = *rgb_pointer++;
-					*rgba_pointer++ = *rgb_pointer++;
-					*rgba_pointer++ = 0;
-				}
-				else
-				{
-					*rgba_pointer++ = *rgb_pointer++;
-					*rgba_pointer++ = *rgb_pointer++;
-					*rgba_pointer++ = *rgb_pointer++;
-					*rgba_pointer++ = 0xFF;
-				}
-			}
-		}
-
-		GLFWimage glfw_image = {(int)width, (int)height, rgba_pixels};
-		cursor = glfwCreateCursor(&glfw_image, 0, 0);
-		glfwSetCursor(window, cursor);
-
-		free(rgba_pixels);
-	}
-}
-
-void PlaybackBackend_EnableDragAndDrop(void)
-{
-	glfwSetDropCallback(window, DragAndDropCallback);
-}
-
-BOOL PlatformBackend_SystemTask(void)
-{
-	if (glfwWindowShouldClose(window))
-	{
-		StopOrganyaMusic();
-		return FALSE;
-	}
-
-	memcpy(backend_previous_keyboard_state, backend_keyboard_state, sizeof(backend_keyboard_state));
-
-	glfwPollEvents();
-
-	while (!bActive)
-		glfwWaitEvents();
-
-	return TRUE;
-}
-
-void PlatformBackend_ShowMessageBox(const char *title, const char *message)
-{
-	// GLFW3 doesn't have a message box
-	printf("ShowMessageBox - '%s' - '%s'\n", title, message);
-}
-
-unsigned long PlatformBackend_GetTicks(void)
-{
-	return (unsigned long)(glfwGetTime() * 1000.0);
-}
-
-void PlatformBackend_Delay(unsigned int ticks)
-{
-	// GLFW3 doesn't have a delay function, so here's some butt-ugly C++11
-	std::this_thread::sleep_for(std::chrono::milliseconds(ticks));
-}
--- /dev/null
+++ b/src/Backends/GLFW3/Platform.cpp
@@ -1,0 +1,294 @@
+#include "../Platform.h"
+#include "Platform.h"
+
+#include <chrono>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <thread>
+
+#include <GLFW/glfw3.h>
+
+#include "../../WindowsWrapper.h"
+
+#include "../Rendering.h"
+#include "../../Main.h"
+#include "../../Organya.h"
+#include "../../Profile.h"
+#include "../../Resource.h"
+
+#define DO_KEY(GLFW_KEY, BACKEND_KEY) \
+	case GLFW_KEY: \
+		backend_keyboard_state[BACKEND_KEY] = action == GLFW_PRESS; \
+		break;
+
+GLFWwindow *window;
+
+BOOL bActive = TRUE;
+BOOL backend_keyboard_state[BACKEND_KEYBOARD_TOTAL];
+BOOL backend_previous_keyboard_state[BACKEND_KEYBOARD_TOTAL];
+
+static GLFWcursor* cursor;
+
+static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods)
+{
+	(void)window;
+	(void)scancode;
+	(void)mods;
+
+	switch (action)
+	{
+		case GLFW_RELEASE:
+		case GLFW_PRESS:
+			switch (key)
+			{
+				DO_KEY(GLFW_KEY_A, BACKEND_KEYBOARD_A)
+				DO_KEY(GLFW_KEY_B, BACKEND_KEYBOARD_B)
+				DO_KEY(GLFW_KEY_C, BACKEND_KEYBOARD_C)
+				DO_KEY(GLFW_KEY_D, BACKEND_KEYBOARD_D)
+				DO_KEY(GLFW_KEY_E, BACKEND_KEYBOARD_E)
+				DO_KEY(GLFW_KEY_F, BACKEND_KEYBOARD_F)
+				DO_KEY(GLFW_KEY_G, BACKEND_KEYBOARD_G)
+				DO_KEY(GLFW_KEY_H, BACKEND_KEYBOARD_H)
+				DO_KEY(GLFW_KEY_I, BACKEND_KEYBOARD_I)
+				DO_KEY(GLFW_KEY_J, BACKEND_KEYBOARD_J)
+				DO_KEY(GLFW_KEY_K, BACKEND_KEYBOARD_K)
+				DO_KEY(GLFW_KEY_L, BACKEND_KEYBOARD_L)
+				DO_KEY(GLFW_KEY_M, BACKEND_KEYBOARD_M)
+				DO_KEY(GLFW_KEY_N, BACKEND_KEYBOARD_N)
+				DO_KEY(GLFW_KEY_O, BACKEND_KEYBOARD_O)
+				DO_KEY(GLFW_KEY_P, BACKEND_KEYBOARD_P)
+				DO_KEY(GLFW_KEY_Q, BACKEND_KEYBOARD_Q)
+				DO_KEY(GLFW_KEY_R, BACKEND_KEYBOARD_R)
+				DO_KEY(GLFW_KEY_S, BACKEND_KEYBOARD_S)
+				DO_KEY(GLFW_KEY_T, BACKEND_KEYBOARD_T)
+				DO_KEY(GLFW_KEY_U, BACKEND_KEYBOARD_U)
+				DO_KEY(GLFW_KEY_V, BACKEND_KEYBOARD_V)
+				DO_KEY(GLFW_KEY_W, BACKEND_KEYBOARD_W)
+				DO_KEY(GLFW_KEY_X, BACKEND_KEYBOARD_X)
+				DO_KEY(GLFW_KEY_Y, BACKEND_KEYBOARD_Y)
+				DO_KEY(GLFW_KEY_Z, BACKEND_KEYBOARD_Z)
+				DO_KEY(GLFW_KEY_0, BACKEND_KEYBOARD_0)
+				DO_KEY(GLFW_KEY_1, BACKEND_KEYBOARD_1)
+				DO_KEY(GLFW_KEY_2, BACKEND_KEYBOARD_2)
+				DO_KEY(GLFW_KEY_3, BACKEND_KEYBOARD_3)
+				DO_KEY(GLFW_KEY_4, BACKEND_KEYBOARD_4)
+				DO_KEY(GLFW_KEY_5, BACKEND_KEYBOARD_5)
+				DO_KEY(GLFW_KEY_6, BACKEND_KEYBOARD_6)
+				DO_KEY(GLFW_KEY_7, BACKEND_KEYBOARD_7)
+				DO_KEY(GLFW_KEY_8, BACKEND_KEYBOARD_8)
+				DO_KEY(GLFW_KEY_9, BACKEND_KEYBOARD_9)
+				DO_KEY(GLFW_KEY_F1, BACKEND_KEYBOARD_F1)
+				DO_KEY(GLFW_KEY_F2, BACKEND_KEYBOARD_F2)
+				DO_KEY(GLFW_KEY_F3, BACKEND_KEYBOARD_F3)
+				DO_KEY(GLFW_KEY_F4, BACKEND_KEYBOARD_F4)
+				DO_KEY(GLFW_KEY_F5, BACKEND_KEYBOARD_F5)
+				DO_KEY(GLFW_KEY_F6, BACKEND_KEYBOARD_F6)
+				DO_KEY(GLFW_KEY_F7, BACKEND_KEYBOARD_F7)
+				DO_KEY(GLFW_KEY_F8, BACKEND_KEYBOARD_F8)
+				DO_KEY(GLFW_KEY_F9, BACKEND_KEYBOARD_F9)
+				DO_KEY(GLFW_KEY_F10, BACKEND_KEYBOARD_F10)
+				DO_KEY(GLFW_KEY_F11, BACKEND_KEYBOARD_F11)
+				DO_KEY(GLFW_KEY_F12, BACKEND_KEYBOARD_F12)
+				DO_KEY(GLFW_KEY_UP, BACKEND_KEYBOARD_UP)
+				DO_KEY(GLFW_KEY_DOWN, BACKEND_KEYBOARD_DOWN)
+				DO_KEY(GLFW_KEY_LEFT, BACKEND_KEYBOARD_LEFT)
+				DO_KEY(GLFW_KEY_RIGHT, BACKEND_KEYBOARD_RIGHT)
+				DO_KEY(GLFW_KEY_ESCAPE, BACKEND_KEYBOARD_ESCAPE)
+				DO_KEY(GLFW_KEY_GRAVE_ACCENT, BACKEND_KEYBOARD_BACK_QUOTE)
+				DO_KEY(GLFW_KEY_TAB, BACKEND_KEYBOARD_TAB)
+				DO_KEY(GLFW_KEY_CAPS_LOCK, BACKEND_KEYBOARD_CAPS_LOCK)
+				DO_KEY(GLFW_KEY_LEFT_SHIFT, BACKEND_KEYBOARD_LEFT_SHIFT)
+				DO_KEY(GLFW_KEY_LEFT_CONTROL, BACKEND_KEYBOARD_LEFT_CTRL)
+				DO_KEY(GLFW_KEY_LEFT_ALT, BACKEND_KEYBOARD_LEFT_ALT)
+				DO_KEY(GLFW_KEY_SPACE, BACKEND_KEYBOARD_SPACE)
+				DO_KEY(GLFW_KEY_RIGHT_ALT, BACKEND_KEYBOARD_RIGHT_ALT)
+				DO_KEY(GLFW_KEY_RIGHT_CONTROL, BACKEND_KEYBOARD_RIGHT_CTRL)
+				DO_KEY(GLFW_KEY_RIGHT_SHIFT, BACKEND_KEYBOARD_RIGHT_SHIFT)
+				DO_KEY(GLFW_KEY_ENTER, BACKEND_KEYBOARD_ENTER)
+				DO_KEY(GLFW_KEY_BACKSPACE, BACKEND_KEYBOARD_BACKSPACE)
+				DO_KEY(GLFW_KEY_MINUS, BACKEND_KEYBOARD_MINUS)
+				DO_KEY(GLFW_KEY_EQUAL, BACKEND_KEYBOARD_EQUALS)
+				DO_KEY(GLFW_KEY_LEFT_BRACKET, BACKEND_KEYBOARD_LEFT_BRACKET)
+				DO_KEY(GLFW_KEY_RIGHT_BRACKET, BACKEND_KEYBOARD_RIGHT_BRACKET)
+				DO_KEY(GLFW_KEY_BACKSLASH, BACKEND_KEYBOARD_BACK_SLASH)
+				DO_KEY(GLFW_KEY_SEMICOLON, BACKEND_KEYBOARD_SEMICOLON)
+				DO_KEY(GLFW_KEY_APOSTROPHE, BACKEND_KEYBOARD_APOSTROPHE)
+				DO_KEY(GLFW_KEY_COMMA, BACKEND_KEYBOARD_COMMA)
+				DO_KEY(GLFW_KEY_PERIOD, BACKEND_KEYBOARD_PERIOD)
+				DO_KEY(GLFW_KEY_SLASH, BACKEND_KEYBOARD_FORWARD_SLASH)
+
+				default:
+					break;
+			}
+
+			break;
+	}
+}
+
+static void WindowFocusCallback(GLFWwindow *window, int focused)
+{
+	(void)window;
+
+	if (focused)
+		ActiveWindow();
+	else
+		InactiveWindow();
+}
+
+static void WindowSizeCallback(GLFWwindow *window, int width, int height)
+{
+	(void)window;
+
+	Backend_HandleWindowResize(width, height);
+}
+
+static void DragAndDropCallback(GLFWwindow *window, int count, const char **paths)
+{
+	(void)window;
+	(void)count;
+
+	LoadProfile(paths[0]);
+}
+
+void PlatformBackend_Init(void)
+{
+	glfwInit();
+}
+
+void PlatformBackend_Deinit(void)
+{
+	if (cursor != NULL)
+		glfwDestroyCursor(cursor);
+
+	glfwTerminate();
+}
+
+void PlatformBackend_PostWindowCreation(void)
+{
+	// Hook callbacks
+	glfwSetKeyCallback(window, KeyCallback);
+	glfwSetWindowFocusCallback(window, WindowFocusCallback);
+	glfwSetWindowSizeCallback(window, WindowSizeCallback);
+}
+
+BOOL PlatformBackend_GetBasePath(char *string_buffer)
+{
+	(void)string_buffer;
+
+	// GLFW3 doesn't seem to have a mechanism for this
+	return FALSE;
+}
+
+void PlatformBackend_HideMouse(void)
+{
+	glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
+}
+
+void PlatformBackend_SetWindowIcon(const unsigned char *rgb_pixels, unsigned int width, unsigned int height)
+{
+	// Convert to RGBA, since that's the only think GLFW3 accepts
+	unsigned char *rgba_pixels = (unsigned char*)malloc(width * height * 4);
+
+	const unsigned char *rgb_pointer = rgb_pixels;
+	unsigned char *rgba_pointer = rgba_pixels;
+
+	if (rgba_pixels != NULL)
+	{
+		for (unsigned int y = 0; y < height; ++y)
+		{
+			for (unsigned int x = 0; x < width; ++x)
+			{
+				*rgba_pointer++ = *rgb_pointer++;
+				*rgba_pointer++ = *rgb_pointer++;
+				*rgba_pointer++ = *rgb_pointer++;
+				*rgba_pointer++ = 0xFF;
+			}
+		}
+
+		GLFWimage glfw_image = {(int)width, (int)height, rgba_pixels};
+		glfwSetWindowIcon(window, 1, &glfw_image);
+
+		free(rgba_pixels);
+	}
+}
+
+void PlatformBackend_SetCursor(const unsigned char *rgb_pixels, unsigned int width, unsigned int height)
+{
+	// Convert to RGBA, since that's the only think GLFW3 accepts
+	unsigned char *rgba_pixels = (unsigned char*)malloc(width * height * 4);
+
+	const unsigned char *rgb_pointer = rgb_pixels;
+	unsigned char *rgba_pointer = rgba_pixels;
+
+	if (rgba_pixels != NULL)
+	{
+		for (unsigned int y = 0; y < height; ++y)
+		{
+			for (unsigned int x = 0; x < width; ++x)
+			{
+				if (rgb_pointer[0] == 0xFF && rgb_pointer[1] == 0 && rgb_pointer[2] == 0xFF)	// Colour-key
+				{
+					*rgba_pointer++ = *rgb_pointer++;
+					*rgba_pointer++ = *rgb_pointer++;
+					*rgba_pointer++ = *rgb_pointer++;
+					*rgba_pointer++ = 0;
+				}
+				else
+				{
+					*rgba_pointer++ = *rgb_pointer++;
+					*rgba_pointer++ = *rgb_pointer++;
+					*rgba_pointer++ = *rgb_pointer++;
+					*rgba_pointer++ = 0xFF;
+				}
+			}
+		}
+
+		GLFWimage glfw_image = {(int)width, (int)height, rgba_pixels};
+		cursor = glfwCreateCursor(&glfw_image, 0, 0);
+		glfwSetCursor(window, cursor);
+
+		free(rgba_pixels);
+	}
+}
+
+void PlaybackBackend_EnableDragAndDrop(void)
+{
+	glfwSetDropCallback(window, DragAndDropCallback);
+}
+
+BOOL PlatformBackend_SystemTask(void)
+{
+	if (glfwWindowShouldClose(window))
+	{
+		StopOrganyaMusic();
+		return FALSE;
+	}
+
+	memcpy(backend_previous_keyboard_state, backend_keyboard_state, sizeof(backend_keyboard_state));
+
+	glfwPollEvents();
+
+	while (!bActive)
+		glfwWaitEvents();
+
+	return TRUE;
+}
+
+void PlatformBackend_ShowMessageBox(const char *title, const char *message)
+{
+	// GLFW3 doesn't have a message box
+	printf("ShowMessageBox - '%s' - '%s'\n", title, message);
+}
+
+unsigned long PlatformBackend_GetTicks(void)
+{
+	return (unsigned long)(glfwGetTime() * 1000.0);
+}
+
+void PlatformBackend_Delay(unsigned int ticks)
+{
+	// GLFW3 doesn't have a delay function, so here's some butt-ugly C++11
+	std::this_thread::sleep_for(std::chrono::milliseconds(ticks));
+}
--- a/src/Backends/SDL2/Misc.cpp
+++ /dev/null
@@ -1,258 +1,0 @@
-#include "../Platform.h"
-#include "Platform.h"
-
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "SDL.h"
-
-#include "../../WindowsWrapper.h"
-
-#include "Controller.h"
-#include "../Rendering.h"
-#include "../../Main.h"
-#include "../../Organya.h"
-#include "../../Profile.h"
-#include "../../Resource.h"
-
-#define DO_KEY(SDL_KEY, BACKEND_KEY) \
-	case SDL_KEY: \
-		backend_keyboard_state[BACKEND_KEY] = event.key.type == SDL_KEYDOWN; \
-		break;
-
-SDL_Window *window;
-
-BOOL bActive = TRUE;
-BOOL backend_keyboard_state[BACKEND_KEYBOARD_TOTAL];
-BOOL backend_previous_keyboard_state[BACKEND_KEYBOARD_TOTAL];
-
-static SDL_Surface *cursor_surface;
-static SDL_Cursor *cursor;
-
-void PlatformBackend_Init(void)
-{
-	SDL_Init(SDL_INIT_EVENTS);
-
-	SDL_InitSubSystem(SDL_INIT_VIDEO);
-
-	puts("Available SDL2 video drivers:");
-
-	for (int i = 0; i < SDL_GetNumVideoDrivers(); ++i)
-		puts(SDL_GetVideoDriver(i));
-
-	printf("Selected SDL2 video driver: %s\n", SDL_GetCurrentVideoDriver());
-}
-
-void PlatformBackend_Deinit(void)
-{
-	if (cursor != NULL)
-		SDL_FreeCursor(cursor);
-
-	if (cursor_surface != NULL)
-		SDL_FreeSurface(cursor_surface);
-
-	SDL_Quit();
-}
-
-void PlatformBackend_PostWindowCreation(void)
-{
-	
-}
-
-BOOL PlatformBackend_GetBasePath(char *string_buffer)
-{
-	char *base_path = SDL_GetBasePath();
-	// Trim the trailing '/'
-	size_t base_path_length = strlen(base_path);
-	base_path[base_path_length - 1] = '\0';
-	strcpy(string_buffer, base_path);
-	SDL_free(base_path);
-
-	return TRUE;
-}
-
-void PlatformBackend_HideMouse(void)
-{
-	SDL_ShowCursor(SDL_DISABLE);
-}
-
-void PlatformBackend_SetWindowIcon(const unsigned char *rgb_pixels, unsigned int width, unsigned int height)
-{
-	SDL_Surface *surface = SDL_CreateRGBSurfaceWithFormatFrom((void*)rgb_pixels, width, height, 0, width * 3, SDL_PIXELFORMAT_RGB24);
-	SDL_SetWindowIcon(window, surface);
-	SDL_FreeSurface(surface);
-}
-
-void PlatformBackend_SetCursor(const unsigned char *rgb_pixels, unsigned int width, unsigned int height)
-{
-	cursor_surface = SDL_CreateRGBSurfaceWithFormatFrom((void*)rgb_pixels, width, height, 0, width * 3, SDL_PIXELFORMAT_RGB24);
-	SDL_SetColorKey(cursor_surface, SDL_TRUE, SDL_MapRGB(cursor_surface->format, 0xFF, 0, 0xFF));
-	cursor = SDL_CreateColorCursor(cursor_surface, 0, 0);
-	SDL_SetCursor(cursor);
-}
-
-void PlaybackBackend_EnableDragAndDrop(void)
-{
-	SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
-}
-
-BOOL PlatformBackend_SystemTask(void)
-{
-	memcpy(backend_previous_keyboard_state, backend_keyboard_state, sizeof(backend_keyboard_state));
-
-	while (SDL_PollEvent(NULL) || !bActive)
-	{
-		SDL_Event event;
-
-		if (!SDL_WaitEvent(&event))
-			return FALSE;
-
-		switch (event.type)
-		{
-			case SDL_KEYUP:
-			case SDL_KEYDOWN:
-				switch (event.key.keysym.sym)
-				{
-					DO_KEY(SDLK_a, BACKEND_KEYBOARD_A)
-					DO_KEY(SDLK_b, BACKEND_KEYBOARD_B)
-					DO_KEY(SDLK_c, BACKEND_KEYBOARD_C)
-					DO_KEY(SDLK_d, BACKEND_KEYBOARD_D)
-					DO_KEY(SDLK_e, BACKEND_KEYBOARD_E)
-					DO_KEY(SDLK_f, BACKEND_KEYBOARD_F)
-					DO_KEY(SDLK_g, BACKEND_KEYBOARD_G)
-					DO_KEY(SDLK_h, BACKEND_KEYBOARD_H)
-					DO_KEY(SDLK_i, BACKEND_KEYBOARD_I)
-					DO_KEY(SDLK_j, BACKEND_KEYBOARD_J)
-					DO_KEY(SDLK_k, BACKEND_KEYBOARD_K)
-					DO_KEY(SDLK_l, BACKEND_KEYBOARD_L)
-					DO_KEY(SDLK_m, BACKEND_KEYBOARD_M)
-					DO_KEY(SDLK_n, BACKEND_KEYBOARD_N)
-					DO_KEY(SDLK_o, BACKEND_KEYBOARD_O)
-					DO_KEY(SDLK_p, BACKEND_KEYBOARD_P)
-					DO_KEY(SDLK_q, BACKEND_KEYBOARD_Q)
-					DO_KEY(SDLK_r, BACKEND_KEYBOARD_R)
-					DO_KEY(SDLK_s, BACKEND_KEYBOARD_S)
-					DO_KEY(SDLK_t, BACKEND_KEYBOARD_T)
-					DO_KEY(SDLK_u, BACKEND_KEYBOARD_U)
-					DO_KEY(SDLK_v, BACKEND_KEYBOARD_V)
-					DO_KEY(SDLK_w, BACKEND_KEYBOARD_W)
-					DO_KEY(SDLK_x, BACKEND_KEYBOARD_X)
-					DO_KEY(SDLK_y, BACKEND_KEYBOARD_Y)
-					DO_KEY(SDLK_z, BACKEND_KEYBOARD_Z)
-					DO_KEY(SDLK_0, BACKEND_KEYBOARD_0)
-					DO_KEY(SDLK_1, BACKEND_KEYBOARD_1)
-					DO_KEY(SDLK_2, BACKEND_KEYBOARD_2)
-					DO_KEY(SDLK_3, BACKEND_KEYBOARD_3)
-					DO_KEY(SDLK_4, BACKEND_KEYBOARD_4)
-					DO_KEY(SDLK_5, BACKEND_KEYBOARD_5)
-					DO_KEY(SDLK_6, BACKEND_KEYBOARD_6)
-					DO_KEY(SDLK_7, BACKEND_KEYBOARD_7)
-					DO_KEY(SDLK_8, BACKEND_KEYBOARD_8)
-					DO_KEY(SDLK_9, BACKEND_KEYBOARD_9)
-					DO_KEY(SDLK_F1, BACKEND_KEYBOARD_F1)
-					DO_KEY(SDLK_F2, BACKEND_KEYBOARD_F2)
-					DO_KEY(SDLK_F3, BACKEND_KEYBOARD_F3)
-					DO_KEY(SDLK_F4, BACKEND_KEYBOARD_F4)
-					DO_KEY(SDLK_F5, BACKEND_KEYBOARD_F5)
-					DO_KEY(SDLK_F6, BACKEND_KEYBOARD_F6)
-					DO_KEY(SDLK_F7, BACKEND_KEYBOARD_F7)
-					DO_KEY(SDLK_F8, BACKEND_KEYBOARD_F8)
-					DO_KEY(SDLK_F9, BACKEND_KEYBOARD_F9)
-					DO_KEY(SDLK_F10, BACKEND_KEYBOARD_F10)
-					DO_KEY(SDLK_F11, BACKEND_KEYBOARD_F11)
-					DO_KEY(SDLK_F12, BACKEND_KEYBOARD_F12)
-					DO_KEY(SDLK_UP, BACKEND_KEYBOARD_UP)
-					DO_KEY(SDLK_DOWN, BACKEND_KEYBOARD_DOWN)
-					DO_KEY(SDLK_LEFT, BACKEND_KEYBOARD_LEFT)
-					DO_KEY(SDLK_RIGHT, BACKEND_KEYBOARD_RIGHT)
-					DO_KEY(SDLK_ESCAPE, BACKEND_KEYBOARD_ESCAPE)
-					DO_KEY(SDLK_BACKQUOTE, BACKEND_KEYBOARD_BACK_QUOTE)
-					DO_KEY(SDLK_TAB, BACKEND_KEYBOARD_TAB)
-					DO_KEY(SDLK_CAPSLOCK, BACKEND_KEYBOARD_CAPS_LOCK)
-					DO_KEY(SDLK_LSHIFT, BACKEND_KEYBOARD_LEFT_SHIFT)
-					DO_KEY(SDLK_LCTRL, BACKEND_KEYBOARD_LEFT_CTRL)
-					DO_KEY(SDLK_LALT, BACKEND_KEYBOARD_LEFT_ALT)
-					DO_KEY(SDLK_SPACE, BACKEND_KEYBOARD_SPACE)
-					DO_KEY(SDLK_RALT, BACKEND_KEYBOARD_RIGHT_ALT)
-					DO_KEY(SDLK_RCTRL, BACKEND_KEYBOARD_RIGHT_CTRL)
-					DO_KEY(SDLK_RSHIFT, BACKEND_KEYBOARD_RIGHT_SHIFT)
-					DO_KEY(SDLK_RETURN, BACKEND_KEYBOARD_ENTER)
-					DO_KEY(SDLK_BACKSPACE, BACKEND_KEYBOARD_BACKSPACE)
-					DO_KEY(SDLK_MINUS, BACKEND_KEYBOARD_MINUS)
-					DO_KEY(SDLK_EQUALS, BACKEND_KEYBOARD_EQUALS)
-					DO_KEY(SDLK_LEFTBRACKET, BACKEND_KEYBOARD_LEFT_BRACKET)
-					DO_KEY(SDLK_RIGHTBRACKET, BACKEND_KEYBOARD_RIGHT_BRACKET)
-					DO_KEY(SDLK_BACKSLASH, BACKEND_KEYBOARD_BACK_SLASH)
-					DO_KEY(SDLK_SEMICOLON, BACKEND_KEYBOARD_SEMICOLON)
-					DO_KEY(SDLK_QUOTE, BACKEND_KEYBOARD_APOSTROPHE)
-					DO_KEY(SDLK_COMMA, BACKEND_KEYBOARD_COMMA)
-					DO_KEY(SDLK_PERIOD, BACKEND_KEYBOARD_PERIOD)
-					DO_KEY(SDLK_SLASH, BACKEND_KEYBOARD_FORWARD_SLASH)
-
-					default:
-						break;
-				}
-
-				break;
-
-			case SDL_JOYDEVICEADDED:
-				ControllerBackend_JoystickConnect(event.jdevice.which);
-				break;
-
-			case SDL_JOYDEVICEREMOVED:
-				ControllerBackend_JoystickDisconnect(event.jdevice.which);
-				break;
-
-			case SDL_DROPFILE:
-				LoadProfile(event.drop.file);
-				SDL_free(event.drop.file);
-				break;
-
-			case SDL_WINDOWEVENT:
-				switch (event.window.event)
-				{
-					case SDL_WINDOWEVENT_FOCUS_LOST:
-						InactiveWindow();
-						break;
-
-					case SDL_WINDOWEVENT_FOCUS_GAINED:
-						ActiveWindow();
-						break;
-
-					case SDL_WINDOWEVENT_RESIZED:
-					case SDL_WINDOWEVENT_SIZE_CHANGED:
-						Backend_HandleWindowResize(event.window.data1, event.window.data2);
-						break;
-				}
-
-				break;
-
-			case SDL_QUIT:
-				StopOrganyaMusic();
-				return FALSE;
-
-			case SDL_RENDER_TARGETS_RESET:
-				Backend_HandleRenderTargetLoss();
-				break;
-
-		}
-	}
-
-	return TRUE;
-}
-
-void PlatformBackend_ShowMessageBox(const char *title, const char *message)
-{
-	SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title, message, window);
-}
-
-unsigned long PlatformBackend_GetTicks(void)
-{
-	return SDL_GetTicks();
-}
-
-void PlatformBackend_Delay(unsigned int ticks)
-{
-	SDL_Delay(ticks);
-}
--- /dev/null
+++ b/src/Backends/SDL2/Platform.cpp
@@ -1,0 +1,258 @@
+#include "../Platform.h"
+#include "Platform.h"
+
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "SDL.h"
+
+#include "../../WindowsWrapper.h"
+
+#include "Controller.h"
+#include "../Rendering.h"
+#include "../../Main.h"
+#include "../../Organya.h"
+#include "../../Profile.h"
+#include "../../Resource.h"
+
+#define DO_KEY(SDL_KEY, BACKEND_KEY) \
+	case SDL_KEY: \
+		backend_keyboard_state[BACKEND_KEY] = event.key.type == SDL_KEYDOWN; \
+		break;
+
+SDL_Window *window;
+
+BOOL bActive = TRUE;
+BOOL backend_keyboard_state[BACKEND_KEYBOARD_TOTAL];
+BOOL backend_previous_keyboard_state[BACKEND_KEYBOARD_TOTAL];
+
+static SDL_Surface *cursor_surface;
+static SDL_Cursor *cursor;
+
+void PlatformBackend_Init(void)
+{
+	SDL_Init(SDL_INIT_EVENTS);
+
+	SDL_InitSubSystem(SDL_INIT_VIDEO);
+
+	puts("Available SDL2 video drivers:");
+
+	for (int i = 0; i < SDL_GetNumVideoDrivers(); ++i)
+		puts(SDL_GetVideoDriver(i));
+
+	printf("Selected SDL2 video driver: %s\n", SDL_GetCurrentVideoDriver());
+}
+
+void PlatformBackend_Deinit(void)
+{
+	if (cursor != NULL)
+		SDL_FreeCursor(cursor);
+
+	if (cursor_surface != NULL)
+		SDL_FreeSurface(cursor_surface);
+
+	SDL_Quit();
+}
+
+void PlatformBackend_PostWindowCreation(void)
+{
+	
+}
+
+BOOL PlatformBackend_GetBasePath(char *string_buffer)
+{
+	char *base_path = SDL_GetBasePath();
+	// Trim the trailing '/'
+	size_t base_path_length = strlen(base_path);
+	base_path[base_path_length - 1] = '\0';
+	strcpy(string_buffer, base_path);
+	SDL_free(base_path);
+
+	return TRUE;
+}
+
+void PlatformBackend_HideMouse(void)
+{
+	SDL_ShowCursor(SDL_DISABLE);
+}
+
+void PlatformBackend_SetWindowIcon(const unsigned char *rgb_pixels, unsigned int width, unsigned int height)
+{
+	SDL_Surface *surface = SDL_CreateRGBSurfaceWithFormatFrom((void*)rgb_pixels, width, height, 0, width * 3, SDL_PIXELFORMAT_RGB24);
+	SDL_SetWindowIcon(window, surface);
+	SDL_FreeSurface(surface);
+}
+
+void PlatformBackend_SetCursor(const unsigned char *rgb_pixels, unsigned int width, unsigned int height)
+{
+	cursor_surface = SDL_CreateRGBSurfaceWithFormatFrom((void*)rgb_pixels, width, height, 0, width * 3, SDL_PIXELFORMAT_RGB24);
+	SDL_SetColorKey(cursor_surface, SDL_TRUE, SDL_MapRGB(cursor_surface->format, 0xFF, 0, 0xFF));
+	cursor = SDL_CreateColorCursor(cursor_surface, 0, 0);
+	SDL_SetCursor(cursor);
+}
+
+void PlaybackBackend_EnableDragAndDrop(void)
+{
+	SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
+}
+
+BOOL PlatformBackend_SystemTask(void)
+{
+	memcpy(backend_previous_keyboard_state, backend_keyboard_state, sizeof(backend_keyboard_state));
+
+	while (SDL_PollEvent(NULL) || !bActive)
+	{
+		SDL_Event event;
+
+		if (!SDL_WaitEvent(&event))
+			return FALSE;
+
+		switch (event.type)
+		{
+			case SDL_KEYUP:
+			case SDL_KEYDOWN:
+				switch (event.key.keysym.sym)
+				{
+					DO_KEY(SDLK_a, BACKEND_KEYBOARD_A)
+					DO_KEY(SDLK_b, BACKEND_KEYBOARD_B)
+					DO_KEY(SDLK_c, BACKEND_KEYBOARD_C)
+					DO_KEY(SDLK_d, BACKEND_KEYBOARD_D)
+					DO_KEY(SDLK_e, BACKEND_KEYBOARD_E)
+					DO_KEY(SDLK_f, BACKEND_KEYBOARD_F)
+					DO_KEY(SDLK_g, BACKEND_KEYBOARD_G)
+					DO_KEY(SDLK_h, BACKEND_KEYBOARD_H)
+					DO_KEY(SDLK_i, BACKEND_KEYBOARD_I)
+					DO_KEY(SDLK_j, BACKEND_KEYBOARD_J)
+					DO_KEY(SDLK_k, BACKEND_KEYBOARD_K)
+					DO_KEY(SDLK_l, BACKEND_KEYBOARD_L)
+					DO_KEY(SDLK_m, BACKEND_KEYBOARD_M)
+					DO_KEY(SDLK_n, BACKEND_KEYBOARD_N)
+					DO_KEY(SDLK_o, BACKEND_KEYBOARD_O)
+					DO_KEY(SDLK_p, BACKEND_KEYBOARD_P)
+					DO_KEY(SDLK_q, BACKEND_KEYBOARD_Q)
+					DO_KEY(SDLK_r, BACKEND_KEYBOARD_R)
+					DO_KEY(SDLK_s, BACKEND_KEYBOARD_S)
+					DO_KEY(SDLK_t, BACKEND_KEYBOARD_T)
+					DO_KEY(SDLK_u, BACKEND_KEYBOARD_U)
+					DO_KEY(SDLK_v, BACKEND_KEYBOARD_V)
+					DO_KEY(SDLK_w, BACKEND_KEYBOARD_W)
+					DO_KEY(SDLK_x, BACKEND_KEYBOARD_X)
+					DO_KEY(SDLK_y, BACKEND_KEYBOARD_Y)
+					DO_KEY(SDLK_z, BACKEND_KEYBOARD_Z)
+					DO_KEY(SDLK_0, BACKEND_KEYBOARD_0)
+					DO_KEY(SDLK_1, BACKEND_KEYBOARD_1)
+					DO_KEY(SDLK_2, BACKEND_KEYBOARD_2)
+					DO_KEY(SDLK_3, BACKEND_KEYBOARD_3)
+					DO_KEY(SDLK_4, BACKEND_KEYBOARD_4)
+					DO_KEY(SDLK_5, BACKEND_KEYBOARD_5)
+					DO_KEY(SDLK_6, BACKEND_KEYBOARD_6)
+					DO_KEY(SDLK_7, BACKEND_KEYBOARD_7)
+					DO_KEY(SDLK_8, BACKEND_KEYBOARD_8)
+					DO_KEY(SDLK_9, BACKEND_KEYBOARD_9)
+					DO_KEY(SDLK_F1, BACKEND_KEYBOARD_F1)
+					DO_KEY(SDLK_F2, BACKEND_KEYBOARD_F2)
+					DO_KEY(SDLK_F3, BACKEND_KEYBOARD_F3)
+					DO_KEY(SDLK_F4, BACKEND_KEYBOARD_F4)
+					DO_KEY(SDLK_F5, BACKEND_KEYBOARD_F5)
+					DO_KEY(SDLK_F6, BACKEND_KEYBOARD_F6)
+					DO_KEY(SDLK_F7, BACKEND_KEYBOARD_F7)
+					DO_KEY(SDLK_F8, BACKEND_KEYBOARD_F8)
+					DO_KEY(SDLK_F9, BACKEND_KEYBOARD_F9)
+					DO_KEY(SDLK_F10, BACKEND_KEYBOARD_F10)
+					DO_KEY(SDLK_F11, BACKEND_KEYBOARD_F11)
+					DO_KEY(SDLK_F12, BACKEND_KEYBOARD_F12)
+					DO_KEY(SDLK_UP, BACKEND_KEYBOARD_UP)
+					DO_KEY(SDLK_DOWN, BACKEND_KEYBOARD_DOWN)
+					DO_KEY(SDLK_LEFT, BACKEND_KEYBOARD_LEFT)
+					DO_KEY(SDLK_RIGHT, BACKEND_KEYBOARD_RIGHT)
+					DO_KEY(SDLK_ESCAPE, BACKEND_KEYBOARD_ESCAPE)
+					DO_KEY(SDLK_BACKQUOTE, BACKEND_KEYBOARD_BACK_QUOTE)
+					DO_KEY(SDLK_TAB, BACKEND_KEYBOARD_TAB)
+					DO_KEY(SDLK_CAPSLOCK, BACKEND_KEYBOARD_CAPS_LOCK)
+					DO_KEY(SDLK_LSHIFT, BACKEND_KEYBOARD_LEFT_SHIFT)
+					DO_KEY(SDLK_LCTRL, BACKEND_KEYBOARD_LEFT_CTRL)
+					DO_KEY(SDLK_LALT, BACKEND_KEYBOARD_LEFT_ALT)
+					DO_KEY(SDLK_SPACE, BACKEND_KEYBOARD_SPACE)
+					DO_KEY(SDLK_RALT, BACKEND_KEYBOARD_RIGHT_ALT)
+					DO_KEY(SDLK_RCTRL, BACKEND_KEYBOARD_RIGHT_CTRL)
+					DO_KEY(SDLK_RSHIFT, BACKEND_KEYBOARD_RIGHT_SHIFT)
+					DO_KEY(SDLK_RETURN, BACKEND_KEYBOARD_ENTER)
+					DO_KEY(SDLK_BACKSPACE, BACKEND_KEYBOARD_BACKSPACE)
+					DO_KEY(SDLK_MINUS, BACKEND_KEYBOARD_MINUS)
+					DO_KEY(SDLK_EQUALS, BACKEND_KEYBOARD_EQUALS)
+					DO_KEY(SDLK_LEFTBRACKET, BACKEND_KEYBOARD_LEFT_BRACKET)
+					DO_KEY(SDLK_RIGHTBRACKET, BACKEND_KEYBOARD_RIGHT_BRACKET)
+					DO_KEY(SDLK_BACKSLASH, BACKEND_KEYBOARD_BACK_SLASH)
+					DO_KEY(SDLK_SEMICOLON, BACKEND_KEYBOARD_SEMICOLON)
+					DO_KEY(SDLK_QUOTE, BACKEND_KEYBOARD_APOSTROPHE)
+					DO_KEY(SDLK_COMMA, BACKEND_KEYBOARD_COMMA)
+					DO_KEY(SDLK_PERIOD, BACKEND_KEYBOARD_PERIOD)
+					DO_KEY(SDLK_SLASH, BACKEND_KEYBOARD_FORWARD_SLASH)
+
+					default:
+						break;
+				}
+
+				break;
+
+			case SDL_JOYDEVICEADDED:
+				ControllerBackend_JoystickConnect(event.jdevice.which);
+				break;
+
+			case SDL_JOYDEVICEREMOVED:
+				ControllerBackend_JoystickDisconnect(event.jdevice.which);
+				break;
+
+			case SDL_DROPFILE:
+				LoadProfile(event.drop.file);
+				SDL_free(event.drop.file);
+				break;
+
+			case SDL_WINDOWEVENT:
+				switch (event.window.event)
+				{
+					case SDL_WINDOWEVENT_FOCUS_LOST:
+						InactiveWindow();
+						break;
+
+					case SDL_WINDOWEVENT_FOCUS_GAINED:
+						ActiveWindow();
+						break;
+
+					case SDL_WINDOWEVENT_RESIZED:
+					case SDL_WINDOWEVENT_SIZE_CHANGED:
+						Backend_HandleWindowResize(event.window.data1, event.window.data2);
+						break;
+				}
+
+				break;
+
+			case SDL_QUIT:
+				StopOrganyaMusic();
+				return FALSE;
+
+			case SDL_RENDER_TARGETS_RESET:
+				Backend_HandleRenderTargetLoss();
+				break;
+
+		}
+	}
+
+	return TRUE;
+}
+
+void PlatformBackend_ShowMessageBox(const char *title, const char *message)
+{
+	SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title, message, window);
+}
+
+unsigned long PlatformBackend_GetTicks(void)
+{
+	return SDL_GetTicks();
+}
+
+void PlatformBackend_Delay(unsigned int ticks)
+{
+	SDL_Delay(ticks);
+}