shithub: cstory

Download patch

ref: 1301ea87979035a9bed141daaf1de1aa91d7c015
parent: 4dadefc7d46b99642b9dd43c455dff2d3d3596cf
author: Clownacy <Clownacy@users.noreply.github.com>
date: Mon Sep 2 16:05:47 EDT 2019

Replace WinAPI with SDL2 as the windowing system

--- a/Makefile
+++ b/Makefile
@@ -41,11 +41,14 @@
 	CXXFLAGS += -DDEBUG_SAVE
 endif
 
-CXXFLAGS += -std=c++98 -MMD -MP -MF $@.d -DWINDOWS -DNONPORTABLE
+CXXFLAGS += -std=c++98 -MMD -MP -MF $@.d -DWINDOWS -DNONPORTABLE `pkg-config sdl2 --cflags`
 LIBS += -lkernel32 -lgdi32 -lddraw -ldinput -ldsound -lversion -lshlwapi -limm32 -lwinmm -ldxguid
 
 ifeq ($(STATIC), 1)
 	LDFLAGS += -static
+	LIBS += `pkg-config sdl2 --libs --static`
+else
+	LIBS += `pkg-config sdl2 --libs`
 endif
 
 SOURCES = \
--- a/src/Main.cpp
+++ b/src/Main.cpp
@@ -6,6 +6,9 @@
 
 #include <shlwapi.h>
 
+#include "SDL.h"
+#include "SDL_syswm.h"
+
 #include "WindowsWrapper.h"
 
 #include "CommonDefines.h"
@@ -22,8 +25,6 @@
 #include "Sound.h"
 #include "Triangle.h"
 
-LRESULT __stdcall WindowProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
-
 char gModulePath[MAX_PATH];
 char gDataPath[MAX_PATH];
 
@@ -38,7 +39,6 @@
 
 static HANDLE hObject;
 static HANDLE hMutex;
-static HINSTANCE ghInstance;
 
 static int windowWidth;
 static int windowHeight;
@@ -46,19 +46,11 @@
 static const char *mutex_name = "Doukutsu";
 
 #ifdef JAPANESE
-static const char *lpWindowName = "\x93\xB4\x8C\x41\x95\xA8\x8C\xEA";
+static const char *lpWindowName = "洞窟物語";
 #else
 static const char *lpWindowName = "Cave Story ~ Doukutsu Monogatari";
 #endif
 
-void SetWindowName(HWND hWnd)
-{
-	char window_name[0x100];
-
-	sprintf(window_name, "%s", lpWindowName);
-	SetWindowTextA(hWnd, window_name);
-}
-
 // Framerate stuff
 void PutFramePerSecound(void)
 {
@@ -96,8 +88,11 @@
 	return frames_this_second;
 }
 
-int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
+int main(int argc, char *argv[])
 {
+	(void)argc;
+	(void)argv;
+
 	int i;
 
 	hObject = OpenMutexA(MUTEX_ALL_ACCESS, 0, mutex_name);
@@ -109,8 +104,6 @@
 
 	hMutex = CreateMutexA(NULL, FALSE, mutex_name);
 
-	ghInstance = hInstance;
-
 	// Get executable's path
 	GetModuleFileNameA(NULL, gModulePath, MAX_PATH);
 	PathRemoveFileSpecA(gModulePath);
@@ -210,35 +203,16 @@
 
 	RECT unused_rect = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
 
-	WNDCLASSEXA wndclassex;
-	memset(&wndclassex, 0, sizeof(WNDCLASSEXA));
-	wndclassex.cbSize = sizeof(WNDCLASSEXA);
-	wndclassex.lpfnWndProc = WindowProcedure;
-	wndclassex.hInstance = hInstance;
-	wndclassex.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);	// This is what gives the window's undrawn regions its grey colour
-	wndclassex.lpszClassName = lpWindowName;
-	wndclassex.hCursor = LoadCursorA(hInstance, "CURSOR_NORMAL");
-	wndclassex.hIcon = LoadIconA(hInstance, "0");
-	wndclassex.hIconSm = LoadIconA(hInstance, "ICON_MINI");
+	SDL_Init(SDL_INIT_EVENTS);
 
 	HWND hWnd;
-	HMENU hMenu;
-	int nWidth;
-	int nHeight;
-	int x;
-	int y;
+	SDL_Window *window;
+	SDL_SysWMinfo info;
 
 	switch (conf.display_mode)
 	{
 		case 1:
 		case 2:
-			wndclassex.lpszMenuName = "MENU_MAIN";
-			if (RegisterClassExA(&wndclassex) == 0)
-			{
-				ReleaseMutex(hMutex);
-				return 0;
-			}
-
 			// Set window dimensions
 			if (conf.display_mode == 1)
 			{
@@ -251,24 +225,22 @@
 				windowHeight = WINDOW_HEIGHT * 2;
 			}
 
-			nWidth = windowWidth + 2 * GetSystemMetrics(SM_CXFIXEDFRAME) + 2;
-			nHeight = (2 * GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYCAPTION)) + GetSystemMetrics(SM_CYMENU) + windowHeight + 2;
-			x = (GetSystemMetrics(SM_CXSCREEN) - nWidth) / 2;
-			y = (GetSystemMetrics(SM_CYSCREEN) - nHeight) / 2;
+			SetWindowPadding(GetSystemMetrics(SM_CXFIXEDFRAME) + 1, GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYCAPTION) + 1);
 
-			SetWindowPadding(GetSystemMetrics(SM_CXFIXEDFRAME) + 1, GetSystemMetrics(SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + 1);
+			window = SDL_CreateWindow(lpWindowName, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, windowWidth, windowHeight, 0);
 
-			hWnd = CreateWindowExA(WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR, lpWindowName, lpWindowName, WS_MINIMIZEBOX | WS_SYSMENU | WS_BORDER | WS_DLGFRAME | WS_VISIBLE, x, y, nWidth, nHeight, NULL, NULL, hInstance, NULL);
-			ghWnd = hWnd;
-
-			if (hWnd == NULL)
+			if (window == NULL)
 			{
 				ReleaseMutex(hMutex);
 				return 0;
 			}
 
-			hMenu = GetMenu(hWnd);
+			SDL_VERSION(&info.version);
+			SDL_GetWindowWMInfo(window, &info);
+			hWnd = info.info.win.window;
 
+			ghWnd = hWnd;
+
 			if (conf.display_mode == 1)
 				StartDirectDraw(hWnd, 0, 0);
 			else
@@ -279,12 +251,6 @@
 		case 0:
 		case 3:
 		case 4:
-			if (RegisterClassExA(&wndclassex) == 0)
-			{
-				ReleaseMutex(hMutex);
-				return 0;
-			}
-
 			// Set window dimensions
 			windowWidth = WINDOW_WIDTH * 2;
 			windowHeight = WINDOW_HEIGHT * 2;
@@ -291,7 +257,18 @@
 
 			SetWindowPadding(0, 0);
 
-			hWnd = CreateWindowExA(WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR, lpWindowName, lpWindowName, WS_SYSMENU | WS_VISIBLE | WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL);
+			window = SDL_CreateWindow(lpWindowName, 0, 0, windowWidth, windowHeight, SDL_WINDOW_FULLSCREEN);
+
+			if (window == NULL)
+			{
+				ReleaseMutex(hMutex);
+				return 0;
+			}
+
+			SDL_VERSION(&info.version);
+			SDL_GetWindowWMInfo(window, &info);
+			hWnd = info.info.win.window;
+
 			ghWnd = hWnd;
 
 			if (hWnd == NULL)
@@ -319,10 +296,13 @@
 			StartDirectDraw(ghWnd, 2, depth);
 			bFullscreen = TRUE;
 
-			ShowCursor(FALSE);
 			break;
 	}
 
+#ifdef DEBUG_SAVE
+	SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
+#endif
+
 	// Set rects
 	RECT rcLoading = {0, 0, 64, 8};
 	RECT rcFull = {0, 0, 0, 0};
@@ -348,7 +328,7 @@
 		InitDirectSound(hWnd);
 
 		// Initialize joystick
-		if (conf.bJoystick && InitDirectInput(hInstance, hWnd))
+		if (conf.bJoystick && InitDirectInput(info.info.win.hinstance, hWnd))
 		{
 			ResetJoystickStatus();
 			gbUseJoystick = TRUE;
@@ -397,340 +377,208 @@
 	PlaySoundObject(7, -1);
 }
 
-// Turns out you could drag-and-drop a save file onto the
-// window to load it, but this behavior is dummied-out.
-BOOL DragAndDropHandler(HWND hWnd, WPARAM wParam)
-{
-	char path[MAX_PATH];
-	HDROP hDrop = (HDROP)wParam;
+void JoystickProc(void);
 
-	if (DragQueryFileA(hDrop, 0xFFFFFFFF, NULL, 0) != 0)
-	{
-		DragQueryFileA(hDrop, 0, path, sizeof(path));
-		LoadProfile(path);
-	}
-
-	DragFinish(hDrop);
-
-	return TRUE;
-}
-
-LRESULT __stdcall WindowProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
+BOOL SystemTask(void)
 {
-	BOOL window_focus;
-	HMENU hMenu;
-
-	switch (Msg)
+	SDL_Event event;
+	while (SDL_PollEvent(&event) || !bActive)
 	{
-		case WM_CREATE:
-			hMenu = GetMenu(hWnd);
-		#ifdef DEBUG_SAVE
-			if (!CheckFileExists("save"))	// Chances are a line like this used to exist
-		#endif
-				DeleteMenu(hMenu, 40005, MF_BYCOMMAND);
-			DrawMenuBar(hWnd);
+		switch (event.type)
+		{
+			case SDL_KEYDOWN:
+				switch (event.key.keysym.sym)
+				{
+					case SDLK_ESCAPE:
+						gKey |= KEY_ESCAPE;
+						break;
 
-			hMenu = GetMenu(hWnd);
-			if (!CheckFileExists("mute"))
-				DeleteMenu(hMenu, 40007, MF_BYCOMMAND);
-			DrawMenuBar(hWnd);
+					case SDLK_w:
+						gKey |= KEY_MAP;
+						break;
 
-			if (CheckFileExists("fps"))
-				bFps = TRUE;
+					case SDLK_LEFT:
+						gKey |= KEY_LEFT;
+						break;
 
-			if (!bFullscreen)
-				LoadWindowRect(hWnd, "window.rect", FALSE);
+					case SDLK_RIGHT:
+						gKey |= KEY_RIGHT;
+						break;
 
-			SetWindowName(hWnd);
+					case SDLK_UP:
+						gKey |= KEY_UP;
+						break;
 
-		#ifdef DEBUG_SAVE
-			DragAcceptFiles(hWnd, TRUE);
-		#endif
+					case SDLK_DOWN:
+						gKey |= KEY_DOWN;
+						break;
 
-			break;
+					case SDLK_x:
+						gKey |= KEY_X;
+						break;
 
-		case WM_SYSCOMMAND:
-			switch (wParam)
-			{
-				case SC_MONITORPOWER:
-					break;
+					case SDLK_z:
+						gKey |= KEY_Z;
+						break;
 
-				case SC_KEYMENU:
-					break;
+					case SDLK_s:
+						gKey |= KEY_ARMS;
+						break;
 
-				case SC_SCREENSAVE:
-					break;
+					case SDLK_a:
+						gKey |= KEY_ARMSREV;
+						break;
 
-				default:
-					DefWindowProcA(hWnd, Msg, wParam, lParam);
-					break;
-			}
+					case SDLK_LSHIFT:
+					case SDLK_RSHIFT:
+						gKey |= KEY_SHIFT;
+						break;
 
-			break;
+					case SDLK_F1:
+						gKey |= KEY_F1;
+						break;
 
-		case WM_IME_NOTIFY:
-			if (wParam == IMN_SETOPENSTATUS)
-			{
-				HIMC hImc = ImmGetContext(hWnd);
-				ImmSetOpenStatus(hImc, 0);
-				ImmReleaseContext(hWnd, hImc);
-			}
+					case SDLK_F2:
+						gKey |= KEY_F2;
+						break;
 
-			break;
+					case SDLK_q:
+						gKey |= KEY_ITEM;
+						break;
 
-		case WM_KEYDOWN:
-			switch (wParam)
-			{
-				case VK_ESCAPE:
-					gKey |= KEY_ESCAPE;
-					break;
+					case SDLK_COMMA:
+						gKey |= KEY_ALT_LEFT;
+						break;
 
-				case 'W':
-					gKey |= KEY_MAP;
-					break;
+					case SDLK_PERIOD:
+						gKey |= KEY_ALT_DOWN;
+						break;
 
-				case VK_LEFT:
-					gKey |= KEY_LEFT;
-					break;
+					case SDLK_SLASH:
+						gKey |= KEY_ALT_RIGHT;
+						break;
 
-				case VK_RIGHT:
-					gKey |= KEY_RIGHT;
-					break;
+					case SDLK_l:
+						gKey |= KEY_L;
+						break;
 
-				case VK_UP:
-					gKey |= KEY_UP;
-					break;
+					case SDLK_PLUS:
+						gKey |= KEY_PLUS;
+						break;
 
-				case VK_DOWN:
-					gKey |= KEY_DOWN;
-					break;
+					case SDLK_F5:
+						gbUseJoystick = FALSE;
+						break;
+				}
 
-				case 'X':
-					gKey |= KEY_X;
-					break;
+				break;
 
-				case 'Z':
-					gKey |= KEY_Z;
-					break;
+			case SDL_KEYUP:
+				switch (event.key.keysym.sym)
+				{
+					case SDLK_ESCAPE:
+						gKey &= ~KEY_ESCAPE;
+						break;
 
-				case 'S':
-					gKey |= KEY_ARMS;
-					break;
+					case SDLK_w:
+						gKey &= ~KEY_MAP;
+						break;
 
-				case 'A':
-					gKey |= KEY_ARMSREV;
-					break;
+					case SDLK_LEFT:
+						gKey &= ~KEY_LEFT;
+						break;
 
-				case VK_SHIFT:
-					gKey |= KEY_SHIFT;
-					break;
+					case SDLK_RIGHT:
+						gKey &= ~KEY_RIGHT;
+						break;
 
-				case VK_F1:
-					gKey |= KEY_F1;
-					break;
+					case SDLK_UP:
+						gKey &= ~KEY_UP;
+						break;
 
-				case VK_F2:
-					gKey |= KEY_F2;
-					break;
+					case SDLK_DOWN:
+						gKey &= ~KEY_DOWN;
+						break;
 
-				case 'Q':
-					gKey |= KEY_ITEM;
-					break;
+					case SDLK_x:
+						gKey &= ~KEY_X;
+						break;
 
-				case VK_OEM_COMMA:
-					gKey |= KEY_ALT_LEFT;
-					break;
+					case SDLK_z:
+						gKey &= ~KEY_Z;
+						break;
 
-				case VK_OEM_PERIOD:
-					gKey |= KEY_ALT_DOWN;
-					break;
+					case SDLK_s:
+						gKey &= ~KEY_ARMS;
+						break;
 
-				case VK_OEM_2:
-					gKey |= KEY_ALT_RIGHT;
-					break;
+					case SDLK_a:
+						gKey &= ~KEY_ARMSREV;
+						break;
 
-				case 'L':
-					gKey |= KEY_L;
-					break;
+					case SDLK_LSHIFT:
+					case SDLK_RSHIFT:
+						gKey &= ~KEY_SHIFT;
+						break;
 
-				case VK_OEM_PLUS:
-					gKey |= KEY_PLUS;
-					break;
+					case SDLK_F1:
+						gKey &= ~KEY_F1;
+						break;
 
-				case VK_F5:
-					gbUseJoystick = FALSE;
-					break;
-			}
+					case SDLK_F2:
+						gKey &= ~KEY_F2;
+						break;
 
-			break;
+					case SDLK_q:
+						gKey &= ~KEY_ITEM;
+						break;
 
-		case WM_KEYUP:
-			switch (wParam)
-			{
-				case VK_ESCAPE:
-					gKey &= ~KEY_ESCAPE;
-					break;
+					case SDLK_COMMA:
+						gKey &= ~KEY_ALT_LEFT;
+						break;
 
-				case 'W':
-					gKey &= ~KEY_MAP;
-					break;
+					case SDLK_PERIOD:
+						gKey &= ~KEY_ALT_DOWN;
+						break;
 
-				case VK_LEFT:
-					gKey &= ~KEY_LEFT;
-					break;
+					case SDLK_SLASH:
+						gKey &= ~KEY_ALT_RIGHT;
+						break;
 
-				case VK_RIGHT:
-					gKey &= ~KEY_RIGHT;
-					break;
+					case SDLK_l:
+						gKey &= ~KEY_L;
+						break;
 
-				case VK_UP:
-					gKey &= ~KEY_UP;
-					break;
+					case SDLK_PLUS:
+						gKey &= ~KEY_PLUS;
+						break;
+				}
 
-				case VK_DOWN:
-					gKey &= ~KEY_DOWN;
-					break;
+				break;
 
-				case 'X':
-					gKey &= ~KEY_X;
-					break;
+			case SDL_DROPFILE:
+				LoadProfile(event.drop.file);
+				SDL_free(event.drop.file);
+				break;
 
-				case 'Z':
-					gKey &= ~KEY_Z;
-					break;
+			case SDL_WINDOWEVENT:
+				switch (event.window.type)
+				{
+					case SDL_WINDOWEVENT_FOCUS_LOST:
+						InactiveWindow();
+						break;
 
-				case 'S':
-					gKey &= ~KEY_ARMS;
-					break;
+					case SDL_WINDOWEVENT_FOCUS_GAINED:
+						ActiveWindow();
+						break;
+				}
 
-				case 'A':
-					gKey &= ~KEY_ARMSREV;
-					break;
+				break;
 
-				case VK_SHIFT:
-					gKey &= ~KEY_SHIFT;
-					break;
-
-				case VK_F1:
-					gKey &= ~KEY_F1;
-					break;
-
-				case VK_F2:
-					gKey &= ~KEY_F2;
-					break;
-
-				case 'Q':
-					gKey &= ~KEY_ITEM;
-					break;
-
-				case VK_OEM_COMMA:
-					gKey &= ~KEY_ALT_LEFT;
-					break;
-
-				case VK_OEM_PERIOD:
-					gKey &= ~KEY_ALT_DOWN;
-					break;
-
-				case VK_OEM_2:
-					gKey &= ~KEY_ALT_RIGHT;
-					break;
-
-				case 'L':
-					gKey &= ~KEY_L;
-					break;
-
-				case VK_OEM_PLUS:
-					gKey &= ~KEY_PLUS;
-					break;
-			}
-
-			break;
-
-		case WM_COMMAND:
-			switch (LOWORD(wParam))
-			{
-				case 40001:
-					if (DialogBoxParamA(ghInstance, "DLG_YESNO", hWnd, QuitDialog, (LPARAM)"Quit?") == 1)
-						PostMessageA(hWnd, WM_CLOSE, 0, 0);
-					break;
-
-				case 40002:
-					DialogBoxParamA(ghInstance, "DLG_ABOUT", hWnd, VersionDialog, 0);
-					break;
-
-				case 40004:
-					if (!OpenVolumeConfiguration(hWnd))
-					#ifdef JAPANESE
-						MessageBoxA(hWnd, "â{âèâàü[âÇɦÆÞé­ïNô«é+é½é_é¦é±é+éÁé¢", lpWindowName, 0);
-					#else
-						MessageBoxA(hWnd, "Could not launch volume configuration", lpWindowName, 0);
-					#endif
-					break;
-
-				case 40005:
-					DialogBoxParamA(ghInstance, "DLG_SAVE", hWnd, DebugSaveDialog, 0);
-					break;
-
-				case 40007:
-					DialogBoxParamA(ghInstance, "DLG_MUTE", hWnd, DebugMuteDialog, 0);
-					break;
-			}
-
-			break;
-
-		case WM_DROPFILES:
-			DragAndDropHandler(hWnd, wParam);
-			break;
-
-		case WM_ACTIVATE:
-			switch (LOWORD(wParam))
-			{
-				case WA_INACTIVE:
-					window_focus = FALSE;
-					break;
-
-				case WA_ACTIVE:
-				case WA_CLICKACTIVE:
-					if (HIWORD(wParam) != 0)
-						window_focus = FALSE;
-					else
-						window_focus = TRUE;
-
-					break;
-			}
-
-			if (window_focus)
-				ActiveWindow();
-			else
-				InactiveWindow();
-
-			break;
-
-		case WM_CLOSE:
-			StopOrganyaMusic();
-			PostQuitMessage(0);
-			break;
-
-		default:
-			return DefWindowProcA(hWnd, Msg, wParam, lParam);
-	}
-
-	return 1;
-}
-
-void JoystickProc(void);
-
-BOOL SystemTask(void)
-{
-	MSG Msg;
-
-	while (PeekMessageA(&Msg, NULL, 0, 0, PM_NOREMOVE) || !bActive)
-	{
-		if (!GetMessageA(&Msg, NULL, 0, 0))
-			return FALSE;
-
-		TranslateMessage(&Msg);
-		DispatchMessageA(&Msg);
+			case SDL_QUIT:
+				StopOrganyaMusic();
+				return FALSE;
+		}
 	}
 
 	// Run joystick code
--