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
--
⑨