From e520a47e2f65b4d44305983b08db27bc557b7619 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Mon, 2 Jun 2025 21:48:04 -0400 Subject: [PATCH] Port CONFIG to Qt (#210) Co-authored-by: Anonymous Maarten Co-authored-by: Anonymous Maarten --- .github/workflows/ci.yml | 20 +- CMakeLists.txt | 19 +- CONFIG/AboutDlg.cpp | 16 +- CONFIG/AboutDlg.h | 17 +- CONFIG/ConfigCommandLineInfo.cpp | 22 -- CONFIG/ConfigCommandLineInfo.h | 21 -- CONFIG/MainDlg.cpp | 359 ++++++++++++++--------------- CONFIG/MainDlg.h | 70 +++--- CONFIG/StdAfx.cpp | 7 - CONFIG/StdAfx.h | 35 --- CONFIG/config.cpp | 360 ++++++++++++------------------ CONFIG/config.h | 89 ++++---- CONFIG/detectdx5.cpp | 40 ++-- CONFIG/detectdx5.h | 4 +- CONFIG/res/about.ui | 99 ++++++++ CONFIG/res/config.qrc | 7 + CONFIG/res/config.rc | 56 +---- CONFIG/res/lego1.png | Bin 0 -> 477 bytes CONFIG/res/lego2.png | Bin 0 -> 397 bytes CONFIG/res/maindialog.ui | 357 +++++++++++++++++++++++++++++ CONFIG/res/resource.h | 25 --- CONFIG/res/shark.bmp | Bin 56230 -> 0 bytes CONFIG/res/shark.png | Bin 0 -> 15334 bytes ISLE/isleapp.cpp | 6 +- miniwin/CMakeLists.txt | 14 -- miniwin/include/miniwin/ddraw.h | 8 +- miniwin/include/miniwin/mfc.h | 304 ------------------------- miniwin/include/miniwin/windows.h | 15 +- miniwin/src/ddraw/ddraw.cpp | 7 +- miniwin/src/mfc/mfc.cpp | 332 --------------------------- miniwin/src/windows/windows.cpp | 15 +- 31 files changed, 953 insertions(+), 1371 deletions(-) delete mode 100644 CONFIG/ConfigCommandLineInfo.cpp delete mode 100644 CONFIG/ConfigCommandLineInfo.h delete mode 100644 CONFIG/StdAfx.cpp delete mode 100644 CONFIG/StdAfx.h create mode 100644 CONFIG/res/about.ui create mode 100644 CONFIG/res/config.qrc create mode 100644 CONFIG/res/lego1.png create mode 100644 CONFIG/res/lego2.png create mode 100644 CONFIG/res/maindialog.ui delete mode 100644 CONFIG/res/resource.h delete mode 100644 CONFIG/res/shark.bmp create mode 100644 CONFIG/res/shark.png delete mode 100644 miniwin/include/miniwin/mfc.h delete mode 100644 miniwin/src/mfc/mfc.cpp diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc59ca25..5a91eb19 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,13 +33,13 @@ jobs: fail-fast: false matrix: include: - - { name: 'Linux', os: 'ubuntu-latest', dx5: false, build-type: 'Debug', linux: true, werror: true, clang-tidy: true } - - { name: 'MSVC (x86)', os: 'windows-latest', dx5: true, build-type: 'Debug', msvc: true, werror: false, clang-tidy: false, vc-arch: 'amd64_x86' } - - { name: 'MSVC (x64)', os: 'windows-latest', dx5: false, build-type: 'Debug', msvc: true, werror: false, clang-tidy: false, vc-arch: 'amd64' } - - { name: 'MSVC (arm64)', os: 'windows-latest', dx5: false, build-type: 'Debug', msvc: true, werror: false, clang-tidy: false, vc-arch: 'amd64_arm64' } - - { name: 'msys2 mingw32', os: 'windows-latest', dx5: false, build-type: 'Debug', mingw: true, werror: true, clang-tidy: true, msystem: 'mingw32', msys-env: 'mingw-w64-i686', shell: 'msys2 {0}' } - - { name: 'msys2 mingw64', os: 'windows-latest', dx5: false, build-type: 'Debug', mingw: true, werror: true, clang-tidy: true, msystem: 'mingw64', msys-env: 'mingw-w64-x86_64', shell: 'msys2 {0}' } - - { name: 'macOS', os: 'macos-latest', dx5: false, build-type: 'Debug', brew: true, werror: true, clang-tidy: false } + - { name: 'Linux', os: 'ubuntu-latest', dx5: false, config: true, build-type: 'Debug', linux: true, werror: true, clang-tidy: true } + - { name: 'MSVC (x86)', os: 'windows-latest', dx5: true, config: false, build-type: 'Debug', msvc: true, werror: false, clang-tidy: false, vc-arch: 'amd64_x86' } + - { name: 'MSVC (x64)', os: 'windows-latest', dx5: false, config: false, build-type: 'Debug', msvc: true, werror: false, clang-tidy: false, vc-arch: 'amd64' } + - { name: 'MSVC (arm64)', os: 'windows-latest', dx5: false, config: false, build-type: 'Debug', msvc: true, werror: false, clang-tidy: false, vc-arch: 'amd64_arm64' } + - { name: 'msys2 mingw32', os: 'windows-latest', dx5: false, config: false, build-type: 'Debug', mingw: true, werror: true, clang-tidy: true, msystem: 'mingw32', msys-env: 'mingw-w64-i686', shell: 'msys2 {0}' } + - { name: 'msys2 mingw64', os: 'windows-latest', dx5: false, config: true, build-type: 'Debug', mingw: true, werror: true, clang-tidy: true, msystem: 'mingw64', msys-env: 'mingw-w64-x86_64', shell: 'msys2 {0}' } + - { name: 'macOS', os: 'macos-latest', dx5: false, config: true, build-type: 'Debug', brew: true, werror: true, clang-tidy: false } steps: - name: Setup vcvars if: ${{ !!matrix.msvc }} @@ -57,6 +57,7 @@ jobs: ${{ matrix.msys-env }}-cmake ${{ matrix.msys-env }}-ninja ${{ matrix.msys-env }}-clang-tools-extra + ${{ (matrix.config && format('{0}-qt6-base', matrix.msys-env)) || '' }} - name: Install Linux dependencies (apt-get) if: ${{ matrix.linux }} @@ -64,13 +65,13 @@ jobs: sudo apt-get update sudo apt-get install -y \ libx11-dev libxext-dev libxrandr-dev libxrender-dev libxfixes-dev libxi-dev libxinerama-dev \ - libxcursor-dev libwayland-dev libxkbcommon-dev wayland-protocols libgl1-mesa-dev libglew-dev + libxcursor-dev libwayland-dev libxkbcommon-dev wayland-protocols libgl1-mesa-dev libglew-dev qt6-base-dev - name: Install macOS dependencies (brew) if: ${{ matrix.brew }} run: | brew update - brew install cmake ninja llvm + brew install cmake ninja llvm qt6 echo "LLVM_ROOT=$(brew --prefix llvm)/bin" >> $GITHUB_ENV - name: Setup ninja @@ -84,6 +85,7 @@ jobs: cmake -S . -B build -GNinja \ -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ -DISLE_USE_DX5=${{ !!matrix.dx5 }} \ + -DISLE_BUILD_CONFIG=${{ matrix.config }} \ -DENABLE_CLANG_TIDY=${{ !!matrix.clang-tidy }} \ -DISLE_WERROR=${{ !!matrix.werror }} \ -Werror=dev diff --git a/CMakeLists.txt b/CMakeLists.txt index bd311e42..00ce813a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,7 +27,7 @@ option(ISLE_UBSAN "Enable Undefined Behavior Sanitizer" OFF) option(ISLE_WERROR "Treat warnings as errors" OFF) option(ISLE_DEBUG "Enable imgui debug" ON) cmake_dependent_option(ISLE_USE_DX5 "Build with internal DirectX 5 SDK" "${NOT_MINGW}" "WIN32;CMAKE_SIZEOF_VOID_P EQUAL 4" OFF) -cmake_dependent_option(ISLE_MINIWIN "Use miniwin and minimfc" ON "NOT ISLE_USE_DX5" OFF) +cmake_dependent_option(ISLE_MINIWIN "Use miniwin" ON "NOT ISLE_USE_DX5" OFF) cmake_dependent_option(ISLE_BUILD_CONFIG "Build CONFIG.EXE application" ON "MSVC OR ISLE_MINIWIN" OFF) cmake_dependent_option(ISLE_COMPILE_SHADERS "Compile shaders" ON "SDL_SHADERCROSS_BIN;TARGET Python3::Interpreter" OFF) option(CMAKE_POSITION_INDEPENDENT_CODE "Build with -fPIC" ON) @@ -491,20 +491,23 @@ if (ISLE_BUILD_APP) endif() if (ISLE_BUILD_CONFIG) - add_executable(config WIN32 + find_package(Qt6 REQUIRED COMPONENTS Core Widgets) + qt_standard_project_setup() + qt_add_executable(config WIN32 LEGO1/mxdirectx/mxdirectxinfo.cpp LEGO1/mxdirectx/legodxinfo.cpp CONFIG/config.cpp - CONFIG/ConfigCommandLineInfo.cpp CONFIG/AboutDlg.cpp CONFIG/MainDlg.cpp CONFIG/detectdx5.cpp - CONFIG/StdAfx.cpp CONFIG/res/config.rc + CONFIG/res/config.qrc ) - if (ISLE_MINIWIN) - target_link_libraries(config PRIVATE minimfc) - endif() + target_link_libraries(config PRIVATE Qt6::Core Qt6::Widgets) + set_property(TARGET config PROPERTY AUTOMOC ON) + set_property(TARGET config PROPERTY AUTORCC ON) + set_property(TARGET config PROPERTY AUTOUIC ON) + set_property(TARGET config PROPERTY AUTOUIC_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/CONFIG/res") list(APPEND isle_targets config) target_compile_definitions(config PRIVATE _AFXDLL MXDIRECTX_FOR_CONFIG) target_include_directories(config PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/LEGO1") @@ -513,7 +516,7 @@ if (ISLE_BUILD_CONFIG) target_link_libraries(config PRIVATE DirectX5::DirectX5) endif() target_compile_definitions(config PRIVATE DIRECT3D_VERSION=0x500) - target_link_libraries(config PRIVATE SDL3::SDL3) + target_link_libraries(config PRIVATE SDL3::SDL3 iniparser-static) if (NOT ISLE_MINIWIN) target_link_libraries(config PRIVATE ddraw dxguid) endif() diff --git a/CONFIG/AboutDlg.cpp b/CONFIG/AboutDlg.cpp index 9585d1c1..b2c14eca 100644 --- a/CONFIG/AboutDlg.cpp +++ b/CONFIG/AboutDlg.cpp @@ -2,18 +2,16 @@ #include "decomp.h" +#include + DECOMP_SIZE_ASSERT(CDialog, 0x60) DECOMP_SIZE_ASSERT(CAboutDialog, 0x60) +// FIXME: disable dialog resizing + // FUNCTION: CONFIG 0x00403c20 -CAboutDialog::CAboutDialog() : CDialog(IDD) +CAboutDialog::CAboutDialog() : QDialog() { + m_ui = new Ui::AboutDialog; + m_ui->setupUi(this); } - -// FUNCTION: CONFIG 0x00403d20 -void CAboutDialog::DoDataExchange(CDataExchange* pDX) -{ -} - -BEGIN_MESSAGE_MAP(CAboutDialog, CDialog) -END_MESSAGE_MAP() diff --git a/CONFIG/AboutDlg.h b/CONFIG/AboutDlg.h index dc648d63..883bc5df 100644 --- a/CONFIG/AboutDlg.h +++ b/CONFIG/AboutDlg.h @@ -1,24 +1,27 @@ #if !defined(AFX_ABOUTDLG_H) #define AFX_ABOUTDLG_H -#include "StdAfx.h" #include "compat.h" #include "res/resource.h" +#include + +namespace Ui +{ +class AboutDialog; +} + // VTABLE: CONFIG 0x00406308 // SIZE 0x60 -class CAboutDialog : public CDialog { +class CAboutDialog : public QDialog { public: CAboutDialog(); - enum { - IDD = IDD_ABOUT - }; protected: - void DoDataExchange(CDataExchange* pDX) override; + /*void DoDataExchange(CDataExchange* pDX) override;*/ protected: - DECLARE_MESSAGE_MAP() + Ui::AboutDialog* m_ui; }; // SYNTHETIC: CONFIG 0x00403cb0 diff --git a/CONFIG/ConfigCommandLineInfo.cpp b/CONFIG/ConfigCommandLineInfo.cpp deleted file mode 100644 index cf3180c4..00000000 --- a/CONFIG/ConfigCommandLineInfo.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "ConfigCommandLineInfo.h" - -#include "decomp.h" - -DECOMP_SIZE_ASSERT(CCommandLineInfo, 0x24) -DECOMP_SIZE_ASSERT(CConfigCommandLineInfo, 0x24) - -// FUNCTION: CONFIG 0x00403b10 -CConfigCommandLineInfo::CConfigCommandLineInfo() -{ - currentConfigApp->m_run_config_dialog = FALSE; -} - -// FUNCTION: CONFIG 0x00403bf0 -void CConfigCommandLineInfo::ParseParam(LPCSTR pszParam, BOOL bFlag, BOOL bLast) -{ - if (bFlag) { - if (lstrcmpi(pszParam, "config") == 0) { - currentConfigApp->m_run_config_dialog = TRUE; - } - } -} diff --git a/CONFIG/ConfigCommandLineInfo.h b/CONFIG/ConfigCommandLineInfo.h deleted file mode 100644 index 82510df1..00000000 --- a/CONFIG/ConfigCommandLineInfo.h +++ /dev/null @@ -1,21 +0,0 @@ -#if !defined(AFX_CONFIGCOMMANDLINEINFO_H) -#define AFX_CONFIGCOMMANDLINEINFO_H - -#include "StdAfx.h" -#include "compat.h" -#include "config.h" -#include "decomp.h" - -// VTABLE: CONFIG 0x004060e8 -// SIZE 0x24 -class CConfigCommandLineInfo : public CCommandLineInfo { -public: - CConfigCommandLineInfo(); - - void ParseParam(LPCSTR pszParam, BOOL bFlag, BOOL bLast) override; -}; - -// SYNTHETIC: CONFIG 0x00403b80 -// CConfigCommandLineInfo::`scalar deleting destructor' - -#endif // !defined(AFX_CONFIGCOMMANDLINEINFO_H) diff --git a/CONFIG/MainDlg.cpp b/CONFIG/MainDlg.cpp index 7d4f6d2a..87685165 100644 --- a/CONFIG/MainDlg.cpp +++ b/CONFIG/MainDlg.cpp @@ -10,63 +10,70 @@ #include "config.h" #include "res/resource.h" +#include #include +#include DECOMP_SIZE_ASSERT(CDialog, 0x60) DECOMP_SIZE_ASSERT(CMainDialog, 0x70) +// FIXME: disable dialog resizing +// FIXME: advanced mode should resize dialog, ignoring advanced controls +// FIXME: list widget should have less rows + // FUNCTION: CONFIG 0x00403d50 -CMainDialog::CMainDialog(CWnd* pParent) : CDialog(IDD, pParent) +CMainDialog::CMainDialog(QWidget* pParent) : QDialog(pParent) { - afxCurrentWinApp; - m_icon = LoadIcon(AfxFindResourceHandle(MAKEINTRESOURCE(IDI_CONFIG), RT_GROUP_ICON), MAKEINTRESOURCE(IDI_CONFIG)); + m_ui = new Ui::MainDialog; + m_ui->setupUi(this); + + // Populate the dialog prior to connecting all signals + OnInitDialog(); + + connect(m_ui->colorPalette16bitRadioButton, &QRadioButton::toggled, this, &CMainDialog::OnRadiobuttonPalette16bit); + connect(m_ui->colorPalette256RadioButton, &QRadioButton::toggled, this, &CMainDialog::OnRadiobuttonPalette256); + connect( + m_ui->modelQualityFastRadioButton, + &QRadioButton::toggled, + this, + &CMainDialog::OnRadiobuttonModelLowQuality + ); + connect( + m_ui->modelQualityHighRadioButton, + &QRadioButton::toggled, + this, + &CMainDialog::OnRadiobuttonModelHighQuality + ); + connect( + m_ui->textureQualityFastRadioButton, + &QRadioButton::toggled, + this, + &CMainDialog::OnRadiobuttonTextureLowQuality + ); + connect( + m_ui->textureQualityHighRadioButton, + &QRadioButton::toggled, + this, + &CMainDialog::OnRadiobuttonTextureHighQuality + ); + connect(m_ui->devicesList, &QListWidget::currentRowChanged, this, &CMainDialog::OnList3DevicesSelectionChanged); + connect(m_ui->musicCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxMusic); + connect(m_ui->drawCursorCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxDrawCursor); + connect(m_ui->videomemoryCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckbox3DVideoMemory); + connect(m_ui->flipVideoMemoryPagesCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxFlipVideoMemPages); + connect(m_ui->sound3DCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckbox3DSound); + connect(m_ui->joystickCheckBox, &QCheckBox::toggled, this, &CMainDialog::OnCheckboxJoystick); + connect(m_ui->okButton, &QPushButton::clicked, this, &CMainDialog::accept); + connect(m_ui->cancelButton, &QPushButton::clicked, this, &CMainDialog::reject); + connect(m_ui->advancedButton, &QPushButton::clicked, this, &CMainDialog::OnButtonAdvanced); } - -// FUNCTION: CONFIG 0x00403e50 -void CMainDialog::DoDataExchange(CDataExchange* pDX) -{ -} - -BEGIN_MESSAGE_MAP(CMainDialog, CDialog) -ON_WM_SYSCOMMAND() -ON_WM_PAINT() -ON_WM_QUERYDRAGICON() -ON_COMMAND(IDC_CHK_FLIP_VIDEO_MEM_PAGES, OnCheckboxFlipVideoMemPages) -ON_LBN_SELCHANGE(IDC_LIST_3DDEVICES, OnList3DevicesSelectionChanged) -ON_COMMAND(IDC_RAD_PALETTE_16BIT, OnRadiobuttonPalette16bit) -ON_COMMAND(IDC_RAD_PALETTE_256, OnRadiobuttonPalette256) -ON_COMMAND(IDC_CHK_3D_VIDEO_MEMORY, OnCheckbox3DVideoMemory) -ON_WM_DESTROY() // FIXME: CONFIG.EXE calls Default -ON_COMMAND(IDABORT, OnButtonCancel) -ON_COMMAND(IDC_CHK_3DSOUND, OnCheckbox3DSound) -ON_COMMAND(IDC_RAD_MODEL_QUALITY_LOW, OnRadiobuttonModelLowQuality) -ON_COMMAND(IDC_RAD_MODEL_QUALITY_HIGH, OnRadiobuttonModelHighQuality) -ON_COMMAND(IDC_RAD_TEXTURE_QUALITY_LOW, OnRadiobuttonTextureLowQuality) -ON_COMMAND(IDC_RAD_TEXTURE_QUALITY_HIGH, OnRadiobuttonTextureHighQuality) -ON_COMMAND(IDC_CHK_JOYSTICK, OnCheckboxJoystick) -ON_COMMAND(IDC_BTN_ADVANCED, OnButtonAdvanced) -ON_COMMAND(IDC_CHK_DRAW_CURSOR, OnCheckboxDrawCursor) -ON_COMMAND(IDC_CHK_MUSIC, OnCheckboxMusic) -END_MESSAGE_MAP() - // FUNCTION: CONFIG 0x00403e80 -BOOL CMainDialog::OnInitDialog() +bool CMainDialog::OnInitDialog() { - CDialog::OnInitDialog(); - SwitchToAdvanced(FALSE); - CMenu* system_menu = CMenu::FromHandle(::GetSystemMenu(m_hWnd, FALSE)); - CString about_text; - about_text.LoadString(IDS_ABOUT); - if (system_menu) { - AppendMenu(system_menu->m_hMenu, MF_SEPARATOR, 0, NULL); - AppendMenu(system_menu->m_hMenu, MF_STRING, 16, (LPCTSTR) about_text); - } - SendMessage(WM_SETICON, ICON_BIG, (LPARAM) m_icon); - SendMessage(WM_SETICON, ICON_SMALL, (LPARAM) m_icon); + SwitchToAdvanced(false); LegoDeviceEnumerate* enumerator = currentConfigApp->m_device_enumerator; enumerator->FUN_1009d210(); m_modified = currentConfigApp->ReadRegisterSettings(); - CWnd* list_3d_devices = GetDlgItem(IDC_LIST_3DDEVICES); int driver_i = 0; int device_i = 0; int selected = 0; @@ -84,227 +91,214 @@ BOOL CMainDialog::OnInitDialog() device_i += 1; sprintf( device_name, - driver_i == 0 ? "%s ( Primary Device )" : "%s ( Secondary Device )", - device.m_deviceName + "%s [%s] ( %s )", + device.m_deviceDesc, + device.m_deviceName, + driver_i == 0 ? "Primary Device" : "Secondary Device" ); - ::SendMessage(list_3d_devices->m_hWnd, LB_ADDSTRING, 0, (LPARAM) device_name); + m_ui->devicesList->addItem(device_name); } driver_i += 1; } - ::SendMessage(list_3d_devices->m_hWnd, LB_SETCURSEL, selected, 0); + m_ui->devicesList->setCurrentRow(selected); UpdateInterface(); - return TRUE; + return true; } // FUNCTION: CONFIG 0x00404080 -void CMainDialog::OnSysCommand(UINT nID, LPARAM lParam) +void CMainDialog::keyReleaseEvent(QKeyEvent* event) { - if ((nID & 0xfff0) == 0x10) { + if (event->matches(QKeySequence::StandardKey::HelpContents)) { CAboutDialog about_dialog; - about_dialog.DoModal(); + about_dialog.exec(); } else { - Default(); + QDialog::keyReleaseEvent(event); } } -// FUNCTION: CONFIG 0x00404150 -void CMainDialog::OnPaint() -{ - if (IsIconic()) { - CPaintDC painter(this); - ::SendMessage(m_hWnd, WM_ICONERASEBKGND, (WPARAM) painter.m_hDC, 0); - RECT dim; - GetClientRect(&dim); - DrawIcon( - painter.m_hDC, - (dim.right - dim.left - GetSystemMetrics(SM_CXICON) + 1) / 2, - (dim.bottom - dim.top - GetSystemMetrics(SM_CYICON) + 1) / 2, - m_icon - ); - } - else { - Default(); - } -} - -// FUNCTION: CONFIG 0x00404230 -HCURSOR CMainDialog::OnQueryDragIcon() -{ - return m_icon; -} - // FUNCTION: CONFIG 0x00404240 -void CMainDialog::OnList3DevicesSelectionChanged() +void CMainDialog::OnList3DevicesSelectionChanged(int selected) { LegoDeviceEnumerate* device_enumerator = currentConfigApp->m_device_enumerator; - int selected = ::SendMessage(GetDlgItem(IDC_LIST_3DDEVICES)->m_hWnd, LB_GETCURSEL, 0, 0); device_enumerator->GetDevice(selected, currentConfigApp->m_driver, currentConfigApp->m_device); if (currentConfigApp->GetHardwareDeviceColorModel() != D3DCOLOR_NONE) { - GetDlgItem(IDC_CHK_DRAW_CURSOR)->EnableWindow(TRUE); + m_ui->drawCursorCheckBox->setEnabled(true); } else { currentConfigApp->m_3d_video_ram = FALSE; currentConfigApp->m_flip_surfaces = FALSE; - CheckDlgButton(IDC_CHK_3D_VIDEO_MEMORY, currentConfigApp->m_3d_video_ram); - CheckDlgButton(IDC_CHK_FLIP_VIDEO_MEM_PAGES, currentConfigApp->m_flip_surfaces); + m_ui->videomemoryCheckBox->setChecked(currentConfigApp->m_3d_video_ram); + m_ui->flipVideoMemoryPagesCheckBox->setChecked(currentConfigApp->m_flip_surfaces); } - m_modified = TRUE; + m_modified = true; UpdateInterface(); } -// FUNCTION: CONFIG 0x00404320 -void CMainDialog::OnCancel() -{ - CDialog::OnCancel(); -} - -// FUNCTION: CONFIG 0x00404330 -void CMainDialog::OnDestroy() -{ - CDialog::Default(); -} - // FUNCTION: CONFIG 0x00404340 -void CMainDialog::OnButtonCancel() +void CMainDialog::reject() +{ + QDialog::reject(); +} + +void CMainDialog::accept() { if (m_modified) { currentConfigApp->WriteRegisterSettings(); } - OnCancel(); + QDialog::accept(); } // FUNCTION: CONFIG 0x00404360 void CMainDialog::UpdateInterface() { currentConfigApp->ValidateSettings(); - GetDlgItem(IDC_CHK_3D_VIDEO_MEMORY) - ->EnableWindow( - !currentConfigApp->m_flip_surfaces && currentConfigApp->GetHardwareDeviceColorModel() == D3DCOLOR_NONE - ); - CheckDlgButton(IDC_CHK_FLIP_VIDEO_MEM_PAGES, currentConfigApp->m_flip_surfaces); - CheckDlgButton(IDC_CHK_3D_VIDEO_MEMORY, currentConfigApp->m_3d_video_ram); - BOOL full_screen = currentConfigApp->m_full_screen; + m_ui->videomemoryCheckBox->setEnabled( + !currentConfigApp->m_flip_surfaces && currentConfigApp->GetHardwareDeviceColorModel() == D3DCOLOR_NONE + ); + m_ui->flipVideoMemoryPagesCheckBox->setChecked(currentConfigApp->m_flip_surfaces); + m_ui->videomemoryCheckBox->setChecked(currentConfigApp->m_3d_video_ram); + bool full_screen = currentConfigApp->m_full_screen; currentConfigApp->AdjustDisplayBitDepthBasedOnRenderStatus(); if (currentConfigApp->GetHardwareDeviceColorModel() != D3DCOLOR_NONE) { - CheckDlgButton(IDC_CHK_DRAW_CURSOR, TRUE); + m_ui->drawCursorCheckBox->setChecked(true); } else { - CheckDlgButton(IDC_CHK_DRAW_CURSOR, FALSE); + m_ui->drawCursorCheckBox->setChecked(false); currentConfigApp->m_draw_cursor = FALSE; - GetDlgItem(IDC_CHK_DRAW_CURSOR)->EnableWindow(FALSE); + m_ui->drawCursorCheckBox->setEnabled(false); } if (full_screen) { - CheckRadioButton( - IDC_RAD_PALETTE_256, - IDC_RAD_PALETTE_16BIT, - currentConfigApp->m_display_bit_depth == 8 ? IDC_RAD_PALETTE_256 : IDC_RAD_PALETTE_16BIT - ); + if (currentConfigApp->m_display_bit_depth == 8) { + m_ui->colorPalette256RadioButton->setChecked(true); + } + else { + m_ui->colorPalette16bitRadioButton->setChecked(true); + } } else { - CheckDlgButton(IDC_RAD_PALETTE_256, 0); - CheckDlgButton(IDC_RAD_PALETTE_16BIT, 0); + m_ui->colorPalette256RadioButton->setChecked(false); + m_ui->colorPalette256RadioButton->setChecked(false); currentConfigApp->m_display_bit_depth = 0; } - GetDlgItem(IDC_RAD_PALETTE_256) - ->EnableWindow(full_screen && currentConfigApp->GetConditionalDeviceRenderBitDepth()); - GetDlgItem(IDC_RAD_PALETTE_16BIT)->EnableWindow(full_screen && currentConfigApp->GetDeviceRenderBitStatus()); - CheckDlgButton(IDC_CHK_3DSOUND, currentConfigApp->m_3d_sound); - CheckDlgButton(IDC_CHK_DRAW_CURSOR, currentConfigApp->m_draw_cursor); + m_ui->colorPalette256RadioButton->setEnabled(full_screen && currentConfigApp->GetConditionalDeviceRenderBitDepth()); + m_ui->colorPalette16bitRadioButton->setEnabled(full_screen && currentConfigApp->GetDeviceRenderBitStatus()); + m_ui->sound3DCheckBox->setChecked(currentConfigApp->m_3d_sound); + m_ui->drawCursorCheckBox->setChecked(currentConfigApp->m_draw_cursor); switch (currentConfigApp->m_model_quality) { case 1: - CheckRadioButton(IDC_RAD_MODEL_QUALITY_LOW, IDC_RAD_MODEL_QUALITY_HIGH, IDC_RAD_MODEL_QUALITY_LOW); + m_ui->modelQualityFastRadioButton->setChecked(true); break; case 2: - CheckRadioButton(IDC_RAD_MODEL_QUALITY_LOW, IDC_RAD_MODEL_QUALITY_HIGH, IDC_RAD_MODEL_QUALITY_HIGH); + m_ui->modelQualityHighRadioButton->setChecked(true); break; } - CheckRadioButton( - IDC_RAD_TEXTURE_QUALITY_LOW, - IDC_RAD_TEXTURE_QUALITY_HIGH, - currentConfigApp->m_texture_quality == 0 ? IDC_RAD_TEXTURE_QUALITY_LOW : IDC_RAD_TEXTURE_QUALITY_HIGH - ); - CheckDlgButton(IDC_CHK_JOYSTICK, currentConfigApp->m_use_joystick); - CheckDlgButton(IDC_CHK_MUSIC, currentConfigApp->m_music); + if (currentConfigApp->m_texture_quality == 0) { + m_ui->textureQualityFastRadioButton->setChecked(true); + } + else { + m_ui->textureQualityHighRadioButton->setChecked(true); + } + m_ui->joystickCheckBox->setChecked(currentConfigApp->m_use_joystick); + m_ui->musicCheckBox->setChecked(currentConfigApp->m_music); } // FUNCTION: CONFIG 0x004045e0 -void CMainDialog::OnCheckbox3DSound() +void CMainDialog::OnCheckbox3DSound(bool checked) { - currentConfigApp->m_3d_sound = IsDlgButtonChecked(IDC_CHK_3DSOUND); - m_modified = TRUE; + currentConfigApp->m_3d_sound = checked; + m_modified = true; UpdateInterface(); } // FUNCTION: CONFIG 0x00404610 -void CMainDialog::OnCheckbox3DVideoMemory() +void CMainDialog::OnCheckbox3DVideoMemory(bool checked) { - currentConfigApp->m_3d_video_ram = IsDlgButtonChecked(IDC_CHK_3D_VIDEO_MEMORY); - m_modified = TRUE; + currentConfigApp->m_3d_video_ram = checked; + m_modified = true; UpdateInterface(); } // FUNCTION: CONFIG 0x00404640 -void CMainDialog::OnRadiobuttonPalette16bit() +void CMainDialog::OnRadiobuttonPalette16bit(bool checked) { - currentConfigApp->m_display_bit_depth = 16; - m_modified = TRUE; - UpdateInterface(); + if (checked) { + currentConfigApp->m_display_bit_depth = 16; + m_modified = true; + UpdateInterface(); + } } // FUNCTION: CONFIG 0x00404670 -void CMainDialog::OnRadiobuttonPalette256() +void CMainDialog::OnRadiobuttonPalette256(bool checked) { - currentConfigApp->m_display_bit_depth = 8; - m_modified = TRUE; - UpdateInterface(); + if (checked) { + currentConfigApp->m_display_bit_depth = 8; + m_modified = true; + UpdateInterface(); + } } // FUNCTION: CONFIG 0x004046a0 -void CMainDialog::OnCheckboxFlipVideoMemPages() +void CMainDialog::OnCheckboxFlipVideoMemPages(bool checked) { - currentConfigApp->m_flip_surfaces = IsDlgButtonChecked(IDC_CHK_FLIP_VIDEO_MEM_PAGES); - m_modified = TRUE; + currentConfigApp->m_flip_surfaces = checked; + m_modified = true; UpdateInterface(); } // FUNCTION: CONFIG 0x004046d0 -void CMainDialog::OnRadiobuttonModelLowQuality() +void CMainDialog::OnRadiobuttonModelLowQuality(bool checked) { - currentConfigApp->m_model_quality = 1; - m_modified = TRUE; - UpdateInterface(); + if (checked) { + // FIXME: are OnRadiobuttonModelLowQuality and OnRadiobuttonModelHighQuality triggered both? + qInfo() << "OnRadiobuttonModelLowQuality"; + currentConfigApp->m_model_quality = 1; + m_modified = true; + UpdateInterface(); + } } // FUNCTION: CONFIG 0x00404700 -void CMainDialog::OnRadiobuttonModelHighQuality() +void CMainDialog::OnRadiobuttonModelHighQuality(bool checked) { - currentConfigApp->m_model_quality = 2; - m_modified = TRUE; - UpdateInterface(); + if (checked) { + qInfo() << "OnRadiobuttonModelHighQuality"; + currentConfigApp->m_model_quality = 2; + m_modified = true; + UpdateInterface(); + } } // FUNCTION: CONFIG 0x00404730 -void CMainDialog::OnRadiobuttonTextureLowQuality() +void CMainDialog::OnRadiobuttonTextureLowQuality(bool checked) { - currentConfigApp->m_texture_quality = 0; - m_modified = TRUE; - UpdateInterface(); + if (checked) { + // FIXME: are OnRadiobuttonTextureLowQuality and OnRadiobuttonTextureHighQuality triggered both? + qInfo() << "OnRadiobuttonTextureLowQuality"; + currentConfigApp->m_texture_quality = 0; + m_modified = true; + UpdateInterface(); + } } // FUNCTION: CONFIG 0x00404760 -void CMainDialog::OnRadiobuttonTextureHighQuality() +void CMainDialog::OnRadiobuttonTextureHighQuality(bool checked) { - currentConfigApp->m_texture_quality = 1; - m_modified = TRUE; - UpdateInterface(); + if (checked) { + // FIXME: are OnRadiobuttonTextureLowQuality and OnRadiobuttonTextureHighQuality triggered both? + qInfo() << "OnRadiobuttonTextureHighQuality"; + currentConfigApp->m_texture_quality = 1; + m_modified = true; + UpdateInterface(); + } } // FUNCTION: CONFIG 0x00404790 -void CMainDialog::OnCheckboxJoystick() +void CMainDialog::OnCheckboxJoystick(bool checked) { - currentConfigApp->m_use_joystick = IsDlgButtonChecked(IDC_CHK_JOYSTICK); - m_modified = TRUE; + currentConfigApp->m_use_joystick = checked; + m_modified = true; UpdateInterface(); } @@ -315,40 +309,25 @@ void CMainDialog::OnButtonAdvanced() } // FUNCTION: CONFIG 0x004047d0 -void CMainDialog::SwitchToAdvanced(BOOL p_advanced) +void CMainDialog::SwitchToAdvanced(bool p_advanced) { - RECT dialog_rect; - RECT grp_advanced_rect; - ::GetWindowRect(m_hWnd, &dialog_rect); - ::GetWindowRect(GetDlgItem(IDC_GRP_ADVANCED)->m_hWnd, &grp_advanced_rect); - CWnd* button_advanced = GetDlgItem(IDC_BTN_ADVANCED); + m_ui->advancedGroup->setVisible(p_advanced); + layout()->setSizeConstraint(QLayout::SetMinAndMaxSize); m_advanced = p_advanced; - int height; - if (p_advanced) { - height = grp_advanced_rect.bottom - dialog_rect.top + 10; - GetDlgItem(IDC_BMP_SHARK)->EnableWindow(TRUE); - button_advanced->SetWindowText("Basic"); - } - else { - height = grp_advanced_rect.top - dialog_rect.top; - GetDlgItem(IDC_BMP_SHARK)->EnableWindow(FALSE); - button_advanced->SetWindowText("Advanced"); - } - SetWindowPos(&wndTop, 0, 0, dialog_rect.right - dialog_rect.left, height, SWP_NOMOVE); } // FUNCTION: CONFIG 0x00404890 -void CMainDialog::OnCheckboxDrawCursor() +void CMainDialog::OnCheckboxDrawCursor(bool checked) { - currentConfigApp->m_draw_cursor = IsDlgButtonChecked(IDC_CHK_DRAW_CURSOR); - m_modified = TRUE; + currentConfigApp->m_draw_cursor = checked; + m_modified = true; UpdateInterface(); } // FUNCTION: CONFIG 0x004048c0 -void CMainDialog::OnCheckboxMusic() +void CMainDialog::OnCheckboxMusic(bool checked) { - currentConfigApp->m_music = IsDlgButtonChecked(IDC_CHK_MUSIC); - m_modified = TRUE; + currentConfigApp->m_music = checked; + m_modified = true; UpdateInterface(); } diff --git a/CONFIG/MainDlg.h b/CONFIG/MainDlg.h index eeebc868..7c0ea8ed 100644 --- a/CONFIG/MainDlg.h +++ b/CONFIG/MainDlg.h @@ -1,55 +1,53 @@ #if !defined(AFX_MAINDLG_H) #define AFX_MAINDLG_H -#include "StdAfx.h" #include "compat.h" #include "decomp.h" #include "res/resource.h" +#include + +namespace Ui +{ +class MainDialog; +} + // VTABLE: CONFIG 0x004063e0 // SIZE 0x70 -class CMainDialog : public CDialog { +class CMainDialog : public QDialog { + Q_OBJECT + public: - CMainDialog(CWnd* pParent); - enum { - IDD = IDD_MAIN - }; + CMainDialog(QWidget* pParent = nullptr); protected: - void DoDataExchange(CDataExchange* pDX) override; void UpdateInterface(); - void SwitchToAdvanced(BOOL p_advanced); + void SwitchToAdvanced(bool p_advanced); - undefined m_unk0x60[4]; // 0x60 - HCURSOR m_icon; // 0x64 - BOOL m_modified; // 0x68 - BOOL m_advanced; // 0x6c - // Implementation +private: + bool m_modified = false; + bool m_advanced = false; + Ui::MainDialog* m_ui = nullptr; -protected: - BOOL OnInitDialog() override; - void OnSysCommand(UINT nID, LPARAM lParam); - void OnPaint(); - HCURSOR OnQueryDragIcon(); - void OnList3DevicesSelectionChanged(); - void OnCancel(); - void OnDestroy(); - void OnButtonCancel(); - void OnCheckbox3DSound(); - void OnCheckbox3DVideoMemory(); - void OnRadiobuttonPalette16bit(); - void OnRadiobuttonPalette256(); - void OnCheckboxFlipVideoMemPages(); - void OnRadiobuttonModelLowQuality(); - void OnRadiobuttonModelHighQuality(); - void OnRadiobuttonTextureLowQuality(); - void OnRadiobuttonTextureHighQuality(); - void OnCheckboxJoystick(); + void keyReleaseEvent(QKeyEvent* event) override; + bool OnInitDialog(); +private slots: + void OnList3DevicesSelectionChanged(int row); + void OnCheckbox3DSound(bool checked); + void OnCheckbox3DVideoMemory(bool checked); + void OnRadiobuttonPalette16bit(bool checked); + void OnRadiobuttonPalette256(bool checked); + void OnCheckboxFlipVideoMemPages(bool checked); + void OnRadiobuttonModelLowQuality(bool checked); + void OnRadiobuttonModelHighQuality(bool checked); + void OnRadiobuttonTextureLowQuality(bool checked); + void OnRadiobuttonTextureHighQuality(bool checked); + void OnCheckboxJoystick(bool chedked); + void OnCheckboxDrawCursor(bool checked); + void OnCheckboxMusic(bool checked); void OnButtonAdvanced(); - void OnCheckboxDrawCursor(); - void OnCheckboxMusic(); - - DECLARE_MESSAGE_MAP() + void accept() override; + void reject() override; }; // SYNTHETIC: CONFIG 0x00403de0 diff --git a/CONFIG/StdAfx.cpp b/CONFIG/StdAfx.cpp deleted file mode 100644 index c7ac7bf3..00000000 --- a/CONFIG/StdAfx.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// simple.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#ifndef MINIMFC -#include "StdAfx.h" -#endif diff --git a/CONFIG/StdAfx.h b/CONFIG/StdAfx.h deleted file mode 100644 index a411b312..00000000 --- a/CONFIG/StdAfx.h +++ /dev/null @@ -1,35 +0,0 @@ -#if !defined(AFX_STDAFX_H) -#define AFX_STDAFX_H - -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - -#ifdef MINIMFC -#include "miniwin/mfc.h" -#else -#include // MFC extensions -#include // MFC core and standard components -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT -#endif - -#if 0 - -// FUNCTION: CONFIG 0x402ca0 -// CObject::Serialize - -// FUNCTION: CONFIG 0x402cb0 -// CObject::AssertValid - -// FUNCTION: CONFIG 0x402cc0 -// CObject::Dump - -// FUNCTION: CONFIG 0x00403c90 -// CWnd::BeginModalState - -// FUNCTION: CONFIG 0x00403ca0 -// CWnd::EndModalState - -#endif - -#endif // !defined(AFX_STDAFX_H) diff --git a/CONFIG/config.cpp b/CONFIG/config.cpp index 7cc6beb5..fc4ba324 100644 --- a/CONFIG/config.cpp +++ b/CONFIG/config.cpp @@ -1,6 +1,5 @@ #include "config.h" -#include "ConfigCommandLineInfo.h" #include "MainDlg.h" #include "detectdx5.h" @@ -14,44 +13,47 @@ #include // _spawnl #endif +#include +#include +#include +#include +#include + DECOMP_SIZE_ASSERT(CWinApp, 0xc4) DECOMP_SIZE_ASSERT(CConfigApp, 0x108) DECOMP_STATIC_ASSERT(offsetof(CConfigApp, m_display_bit_depth) == 0xd0) -BEGIN_MESSAGE_MAP(CConfigApp, CWinApp) -ON_COMMAND(ID_HELP, OnHelp) -END_MESSAGE_MAP() - // FUNCTION: CONFIG 0x00402c40 CConfigApp::CConfigApp() { + char* prefPath = SDL_GetPrefPath("isledecomp", "isle"); + char* iniConfig; + if (prefPath) { + m_iniPath = std::string{prefPath} + "isle.ini"; + } + else { + m_iniPath = "isle.ini"; + } + SDL_free(prefPath); } -#define MiB (1024 * 1024) - // FUNCTION: CONFIG 0x00402dc0 -BOOL CConfigApp::InitInstance() +bool CConfigApp::InitInstance() { - if (!IsLegoNotRunning()) { - return FALSE; + if (!SDL_Init(SDL_INIT_VIDEO)) { + QString err = QString{"SDL failed to initialize ("} + SDL_GetError() + ")"; + QMessageBox::warning(nullptr, "SDL initialization error", err); + return false; } if (!DetectDirectX5()) { - AfxMessageBox( - "\"LEGO\xae Island\" is not detecting DirectX 5 or later. Please quit all other applications and try " + QMessageBox::warning( + nullptr, + "Missing DirectX", + "\"LEGO\xc2\xae Island\" is not detecting DirectX 5 or later. Please quit all other applications and try " "again." ); - return FALSE; - } -#ifdef _AFXDLL - Enable3dControls(); -#else - Enable3dControlsStatic(); -#endif - CConfigCommandLineInfo cmdInfo; - ParseCommandLine(cmdInfo); - if (_stricmp(afxCurrentAppName, "config") == 0) { - m_run_config_dialog = TRUE; + return false; } m_device_enumerator = new LegoDeviceEnumerate; if (m_device_enumerator->DoEnumerate()) { @@ -67,15 +69,13 @@ BOOL CConfigApp::InitInstance() m_3d_video_ram = FALSE; m_joystick_index = -1; m_display_bit_depth = 16; - MEMORYSTATUS memory_status; - memory_status.dwLength = sizeof(memory_status); - GlobalMemoryStatus(&memory_status); - if (memory_status.dwTotalPhys < 12 * MiB) { + int totalRamMiB = SDL_GetSystemRAM(); + if (totalRamMiB < 12) { m_3d_sound = FALSE; m_model_quality = 0; m_texture_quality = 1; } - else if (memory_status.dwTotalPhys < 20 * MiB) { + else if (totalRamMiB < 20) { m_3d_sound = FALSE; m_model_quality = 1; m_texture_quality = 1; @@ -85,126 +85,11 @@ BOOL CConfigApp::InitInstance() m_3d_sound = TRUE; m_texture_quality = 1; } - if (!m_run_config_dialog) { - ReadRegisterSettings(); - ValidateSettings(); - WriteRegisterSettings(); - delete m_device_enumerator; - m_device_enumerator = NULL; - m_driver = NULL; - m_device = NULL; - char password[256]; - ReadReg("password", password, sizeof(password)); - const char* exe = _stricmp("ogel", password) == 0 ? "isled.exe" : "isle.exe"; - char diskpath[1024]; - if (ReadReg("diskpath", diskpath, sizeof(diskpath))) { - _chdir(diskpath); - } - _spawnl(_P_NOWAIT, exe, exe, "/diskstream", "/script", "\\lego\\scripts\\isle\\isle.si", NULL); - return FALSE; - } - CMainDialog main_dialog(NULL); - main_dialog.DoModal(); - return FALSE; -} - -// FUNCTION: CONFIG 0x00403100 -BOOL CConfigApp::IsLegoNotRunning() -{ - HWND hWnd = FindWindow("Lego Island MainNoM App", "LEGO\xae"); - if (_stricmp(afxCurrentAppName, "config") == 0 || !hWnd) { - return TRUE; - } - if (SetForegroundWindow(hWnd)) { - ShowWindow(hWnd, SW_RESTORE); - } - return FALSE; -} - -// FUNCTION: CONFIG 0x004031b0 -BOOL CConfigApp::WriteReg(const char* p_key, const char* p_value) const -{ - HKEY hKey; - DWORD pos; - - if (RegCreateKeyEx( - HKEY_LOCAL_MACHINE, - "SOFTWARE\\Mindscape\\LEGO Island", - 0, - "string", - 0, - KEY_READ | KEY_WRITE, - NULL, - &hKey, - &pos - ) == ERROR_SUCCESS) { - if (RegSetValueEx(hKey, p_key, 0, REG_SZ, (LPBYTE) p_value, strlen(p_value)) == ERROR_SUCCESS) { - if (RegCloseKey(hKey) == ERROR_SUCCESS) { - return TRUE; - } - } - else { - RegCloseKey(hKey); - } - } - return FALSE; -} - -// FUNCTION: CONFIG 0x00403240 -BOOL CConfigApp::ReadReg(LPCSTR p_key, LPCSTR p_value, DWORD p_size) const -{ - HKEY hKey; - DWORD valueType; - - BOOL out = FALSE; - DWORD size = p_size; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Mindscape\\LEGO Island", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { - if (RegQueryValueEx(hKey, p_key, NULL, &valueType, (LPBYTE) p_value, &size) == ERROR_SUCCESS) { - if (RegCloseKey(hKey) == ERROR_SUCCESS) { - out = TRUE; - } - } - } - return out; -} - -// FUNCTION: CONFIG 0x004032b0 -BOOL CConfigApp::ReadRegBool(LPCSTR p_key, BOOL* p_bool) const -{ - char buffer[256]; - - BOOL read = ReadReg(p_key, buffer, sizeof(buffer)); - if (read) { - if (strcmp("YES", buffer) == 0) { - *p_bool = TRUE; - return read; - } - - if (strcmp("NO", buffer) == 0) { - *p_bool = FALSE; - return read; - } - - read = FALSE; - } - return read; -} - -// FUNCTION: CONFIG 0x00403380 -BOOL CConfigApp::ReadRegInt(LPCSTR p_key, int* p_value) const -{ - char buffer[256]; - - BOOL read = ReadReg(p_key, buffer, sizeof(buffer)); - if (read) { - *p_value = atoi(buffer); - } - - return read; + return true; } // FUNCTION: CONFIG 0x004033d0 -BOOL CConfigApp::IsDeviceInBasicRGBMode() const +bool CConfigApp::IsDeviceInBasicRGBMode() const { /* * BUG: should be: @@ -220,71 +105,55 @@ D3DCOLORMODEL CConfigApp::GetHardwareDeviceColorModel() const } // FUNCTION: CONFIG 0x00403410 -BOOL CConfigApp::IsPrimaryDriver() const +bool CConfigApp::IsPrimaryDriver() const { return m_driver == &m_device_enumerator->GetDriverList().front(); } // FUNCTION: CONFIG 0x00403430 -BOOL CConfigApp::ReadRegisterSettings() +bool CConfigApp::ReadRegisterSettings() { - char buffer[256]; - BOOL is_modified = FALSE; int tmp = -1; +#define NOT_FOUND (-2) - if (ReadReg("3D Device ID", buffer, sizeof(buffer))) { - tmp = m_device_enumerator->ParseDeviceName(buffer); + dictionary* dict = iniparser_load(m_iniPath.c_str()); + if (!dict) { + dict = dictionary_new(0); + } + + const char* device3D = iniparser_getstring(dict, "isle:3D Device ID", nullptr); + if (device3D) { + tmp = m_device_enumerator->ParseDeviceName(device3D); if (tmp >= 0) { tmp = m_device_enumerator->GetDevice(tmp, m_driver, m_device); } } if (tmp != 0) { - is_modified = TRUE; m_device_enumerator->FUN_1009d210(); tmp = m_device_enumerator->GetBestDevice(); m_device_enumerator->GetDevice(tmp, m_driver, m_device); } - if (!ReadRegInt("Display Bit Depth", &m_display_bit_depth)) { - is_modified = TRUE; - } - if (!ReadRegBool("Flip Surfaces", &m_flip_surfaces)) { - is_modified = TRUE; - } - if (!ReadRegBool("Full Screen", &m_full_screen)) { - is_modified = TRUE; - } - if (!ReadRegBool("Back Buffers in Video RAM", &m_3d_video_ram)) { - is_modified = TRUE; - } - if (!ReadRegBool("Wide View Angle", &m_wide_view_angle)) { - is_modified = TRUE; - } - if (!ReadRegBool("3DSound", &m_3d_sound)) { - is_modified = TRUE; - } - if (!ReadRegBool("Draw Cursor", &m_draw_cursor)) { - is_modified = TRUE; - } - if (!ReadRegInt("Island Quality", &m_model_quality)) { - is_modified = TRUE; - } - if (!ReadRegInt("Island Texture", &m_texture_quality)) { - is_modified = TRUE; - } - if (!ReadRegBool("UseJoystick", &m_use_joystick)) { - is_modified = TRUE; - } - if (!ReadRegBool("Music", &m_music)) { - is_modified = TRUE; - } - if (!ReadRegInt("JoystickIndex", &m_joystick_index)) { - is_modified = TRUE; - } - return is_modified; + m_base_path = iniparser_getstring(dict, "isle:diskpath", m_base_path.c_str()); + m_cd_path = iniparser_getstring(dict, "isle:cdpath", m_cd_path.c_str()); + m_media_path = iniparser_getstring(dict, "isle:mediapath", m_media_path.c_str()); + m_save_path = iniparser_getstring(dict, "isle:savepath", m_save_path.c_str()); + m_display_bit_depth = iniparser_getint(dict, "isle:Display Bit Depth", -1); + m_flip_surfaces = iniparser_getboolean(dict, "isle:Flip Surfaces", m_flip_surfaces); + m_full_screen = iniparser_getboolean(dict, "isle:Full Screen", m_full_screen); + m_3d_video_ram = iniparser_getboolean(dict, "isle:Back Buffers in Video RAM", m_3d_video_ram); + m_wide_view_angle = iniparser_getboolean(dict, "isle:Wide View Angle", m_wide_view_angle); + m_3d_sound = iniparser_getboolean(dict, "isle:3DSound", m_3d_sound); + m_draw_cursor = iniparser_getboolean(dict, "isle:Draw Cursor", m_draw_cursor); + m_model_quality = iniparser_getint(dict, "isle:Island Quality", m_model_quality); + m_texture_quality = iniparser_getint(dict, "isle:Island Texture", m_texture_quality); + m_use_joystick = iniparser_getboolean(dict, "isle:UseJoystick", m_use_joystick); + m_music = iniparser_getboolean(dict, "isle:Music", m_music); + m_joystick_index = iniparser_getint(dict, "isle:JoystickIndex", m_joystick_index); + return true; } // FUNCTION: CONFIG 0x00403630 -BOOL CConfigApp::ValidateSettings() +bool CConfigApp::ValidateSettings() { BOOL is_modified = FALSE; @@ -369,7 +238,7 @@ DWORD CConfigApp::GetDeviceRenderBitStatus() const } // FUNCTION: CONFIG 0x00403810 -BOOL CConfigApp::AdjustDisplayBitDepthBasedOnRenderStatus() +bool CConfigApp::AdjustDisplayBitDepthBasedOnRenderStatus() { if (m_display_bit_depth == 8) { if (GetConditionalDeviceRenderBitDepth()) { @@ -398,32 +267,55 @@ void CConfigApp::WriteRegisterSettings() const { char buffer[128]; - -#define WriteRegBool(NAME, VALUE) WriteReg(NAME, VALUE ? "YES" : "NO") -#define WriteRegInt(NAME, VALUE) \ +#define SetIniBool(DICT, NAME, VALUE) iniparser_set(DICT, NAME, VALUE ? "true" : "false") +#define SetIniInt(DICT, NAME, VALUE) \ do { \ sprintf(buffer, "%d", VALUE); \ - WriteReg(NAME, buffer); \ + iniparser_set(DICT, NAME, buffer); \ } while (0) m_device_enumerator->FormatDeviceName(buffer, m_driver, m_device); - WriteReg("3D Device ID", buffer); - WriteReg("3D Device Name", m_device->m_deviceName); - WriteRegInt("Display Bit Depth", m_display_bit_depth); - WriteRegBool("Flip Surfaces", m_flip_surfaces); - WriteRegBool("Full Screen", m_full_screen); - WriteRegBool("Back Buffers in Video RAM", m_3d_video_ram); - WriteRegBool("Wide View Angle", m_wide_view_angle); - WriteRegBool("3DSound", m_3d_sound); - WriteRegBool("Draw Cursor", m_draw_cursor); - WriteRegInt("Island Quality", m_model_quality); - WriteRegInt("Island Texture", m_texture_quality); - WriteRegBool("UseJoystick", m_use_joystick); - WriteRegBool("Music", m_music); - WriteRegInt("JoystickIndex", m_joystick_index); -#undef WriteRegBool -#undef WriteRegInt + dictionary* dict = dictionary_new(0); + iniparser_set(dict, "isle", NULL); + if (m_device_enumerator->FormatDeviceName(buffer, m_driver, m_device) >= 0) { + iniparser_set(dict, "isle:3D Device ID", buffer); + } + iniparser_set(dict, "isle:diskpath", m_base_path.c_str()); + iniparser_set(dict, "isle:cdpath", m_cd_path.c_str()); + iniparser_set(dict, "isle:mediapath", m_media_path.c_str()); + iniparser_set(dict, "isle:savepath", m_save_path.c_str()); + + SetIniBool(dict, "isle:Display Bit Depth", m_display_bit_depth); + SetIniBool(dict, "isle:Flip Surfaces", m_flip_surfaces); + SetIniBool(dict, "isle:Full Screen", m_full_screen); + SetIniBool(dict, "isle:Wide View Angle", m_wide_view_angle); + + SetIniBool(dict, "isle:3DSound", m_3d_sound); + SetIniBool(dict, "isle:Music", m_music); + + SetIniInt(dict, "isle:UseJoystick", m_use_joystick); + SetIniBool(dict, "isle:JoystickIndex", m_joystick_index); + SetIniBool(dict, "isle:Draw Cursor", m_draw_cursor); + + SetIniBool(dict, "isle:Back Buffers in Video RAM", m_3d_video_ram); + + SetIniInt(dict, "isle:Island Quality", m_model_quality); + SetIniInt(dict, "isle:Island Texture", m_texture_quality); + +#undef SetIniBool +#undef SetIniInt + + FILE* iniFP = fopen(m_iniPath.c_str(), "wb"); + if (iniFP) { + iniparser_dump_ini(dict, iniFP); + qInfo() << "New config written at" << QString::fromStdString(m_iniPath); + fclose(iniFP); + } + else { + QMessageBox::warning(nullptr, "Failed to save ini", "Failed to save ini"); + } + iniparser_freedict(dict); } // FUNCTION: CONFIG 0x00403a90 @@ -433,8 +325,52 @@ int CConfigApp::ExitInstance() delete m_device_enumerator; m_device_enumerator = NULL; } - return CWinApp::ExitInstance(); + SDL_Quit(); + return 0; +} + +void CConfigApp::SetIniPath(const std::string& p_path) +{ + m_iniPath = p_path; +} +const std::string& CConfigApp::GetIniPath() const +{ + return m_iniPath; } // GLOBAL: CONFIG 0x00408e50 CConfigApp g_theApp; + +int main(int argc, char* argv[]) +{ + QApplication app(argc, argv); + QCoreApplication::setApplicationName("config"); + QCoreApplication::setApplicationVersion("1.0"); + + QCommandLineParser parser; + parser.setApplicationDescription("Configure LEGO Island"); + parser.addHelpOption(); + parser.addVersionOption(); + + QCommandLineOption iniOption( + QStringList() << "ini", + QCoreApplication::translate("config", "Set INI path."), + QCoreApplication::translate("config", "path") + ); + parser.addOption(iniOption); + parser.process(app); + + if (parser.isSet(iniOption)) { + g_theApp.SetIniPath(parser.value(iniOption).toStdString()); + } + qInfo() << "Ini path =" << QString::fromStdString(g_theApp.GetIniPath()); + + int result = 1; + if (g_theApp.InitInstance()) { + CMainDialog main_dialog; + main_dialog.show(); + result = app.exec(); + } + g_theApp.ExitInstance(); + return result; +} diff --git a/CONFIG/config.h b/CONFIG/config.h index bcc02cc5..687da4d3 100644 --- a/CONFIG/config.h +++ b/CONFIG/config.h @@ -1,7 +1,7 @@ #if !defined(AFX_CONFIG_H) #define AFX_CONFIG_H -#include "StdAfx.h" +#include "AboutDlg.h" #include "compat.h" #include "decomp.h" @@ -11,15 +11,17 @@ #include #endif +#include + class LegoDeviceEnumerate; struct Direct3DDeviceInfo; struct MxDriver; -#define currentConfigApp ((CConfigApp*) afxCurrentWinApp) +#define currentConfigApp (&g_theApp) // VTABLE: CONFIG 0x00406040 // SIZE 0x108 -class CConfigApp : public CWinApp { +class CConfigApp { public: CConfigApp(); @@ -28,68 +30,57 @@ class CConfigApp : public CWinApp { //{{AFX_VIRTUAL(CConfigApp) public: - BOOL InitInstance() override; - int ExitInstance() override; + bool InitInstance(); + int ExitInstance(); //}}AFX_VIRTUAL // Implementation - BOOL WriteReg(const char* p_key, const char* p_value) const; - BOOL ReadReg(LPCSTR p_key, LPCSTR p_value, DWORD p_size) const; - BOOL ReadRegBool(LPCSTR p_key, BOOL* p_bool) const; - BOOL ReadRegInt(LPCSTR p_key, int* p_value) const; - BOOL IsDeviceInBasicRGBMode() const; + // bool WriteReg(const char* p_key, const char* p_value) const; + // bool ReadReg(LPCSTR p_key, LPCSTR p_value, DWORD p_size) const; + // bool ReadRegBool(LPCSTR p_key, bool* p_bool) const; + // bool ReadRegInt(LPCSTR p_key, int* p_value) const; + bool IsDeviceInBasicRGBMode() const; D3DCOLORMODEL GetHardwareDeviceColorModel() const; - BOOL IsPrimaryDriver() const; - BOOL ReadRegisterSettings(); - BOOL ValidateSettings(); + bool IsPrimaryDriver() const; + bool ReadRegisterSettings(); + bool ValidateSettings(); DWORD GetConditionalDeviceRenderBitDepth() const; DWORD GetDeviceRenderBitStatus() const; - BOOL AdjustDisplayBitDepthBasedOnRenderStatus(); + bool AdjustDisplayBitDepthBasedOnRenderStatus(); void WriteRegisterSettings() const; + void SetIniPath(const std::string& p_path); + const std::string& GetIniPath() const; //{{AFX_MSG(CConfigApp) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG - DECLARE_MESSAGE_MAP() - -private: - BOOL IsLegoNotRunning(); + // DECLARE_MESSAGE_MAP() public: - LegoDeviceEnumerate* m_device_enumerator; // 0x0c4 - MxDriver* m_driver; // 0x0c8 - Direct3DDeviceInfo* m_device; // 0x0cc - int m_display_bit_depth; // 0x0d0 - BOOL m_flip_surfaces; // 0x0d4 - BOOL m_full_screen; // 0x0d8 - BOOL m_3d_video_ram; // 0x0dc - BOOL m_wide_view_angle; // 0x0e0 - BOOL m_3d_sound; // 0x0e4 - BOOL m_draw_cursor; // 0x0e8 - BOOL m_use_joystick; // 0x0ec - int m_joystick_index; // 0x0f0 - BOOL m_run_config_dialog; // 0x0f4 - int m_model_quality; // 0x0f8 - int m_texture_quality; // 0x0fc - undefined m_unk0x100[4]; // 0x100 - BOOL m_music; // 0x104 + LegoDeviceEnumerate* m_device_enumerator; + MxDriver* m_driver; + Direct3DDeviceInfo* m_device; + int m_display_bit_depth; + bool m_flip_surfaces; + bool m_full_screen; + bool m_3d_video_ram; + bool m_wide_view_angle; + bool m_3d_sound; + bool m_draw_cursor; + bool m_use_joystick; + int m_joystick_index; + int m_model_quality; + int m_texture_quality; + bool m_music; + std::string m_iniPath; + std::string m_base_path; + std::string m_cd_path; + std::string m_media_path; + std::string m_save_path; }; -// SYNTHETIC: CONFIG 0x00402cd0 -// CConfigApp::`scalar deleting destructor' - -// FUNCTION: CONFIG 0x402c20 -// CConfigApp::_GetBaseMessageMap - -// FUNCTION: CONFIG 0x402c30 -// CConfigApp::GetMessageMap - -// GLOBAL: CONFIG 0x406008 -// CConfigApp::messageMap - -// GLOBAL: CONFIG 0x406010 -// CConfigApp::_messageEntries +extern CConfigApp g_theApp; #endif // !defined(AFX_CONFIG_H) diff --git a/CONFIG/detectdx5.cpp b/CONFIG/detectdx5.cpp index bf9f6f61..b828b025 100644 --- a/CONFIG/detectdx5.cpp +++ b/CONFIG/detectdx5.cpp @@ -3,28 +3,37 @@ #ifdef MINIWIN #include "miniwin/ddraw.h" #include "miniwin/dinput.h" -#include "miniwin/mfc.h" +#include "qlibrary.h" +#include "qoperatingsystemversion.h" #else #include #include #endif +typedef struct IUnknown* LPUNKNOWN; + typedef HRESULT WINAPI DirectDrawCreate_fn(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter); typedef HRESULT WINAPI DirectInputCreateA_fn(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA* ppDI, LPUNKNOWN punkOuter); // FUNCTION: CONFIG 0x004048f0 -BOOL DetectDirectX5() +bool DetectDirectX5() { unsigned int version; - BOOL found; + bool found; DetectDirectX(&version, &found); return version >= 0x500; } // FUNCTION: CONFIG 0x00404920 -void DetectDirectX(unsigned int* p_version, BOOL* p_found) +void DetectDirectX(unsigned int* p_version, bool* p_found) { +#ifdef MINIWIN + QOperatingSystemVersion os_version = QOperatingSystemVersion::current(); + *p_found = true; + *p_version = 0x500; +#else + OSVERSIONINFOA os_version; os_version.dwOSVersionInfoSize = sizeof(os_version); @@ -40,7 +49,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found) return; } if (os_version.dwMajorVersion != 4) { - *p_version = 0x501; + *p_version = MAKEWORD(5, 1); return; } *p_version = 0x200; @@ -56,18 +65,18 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found) OutputDebugString("Couldn't GetProcAddress DInputCreate\r\n"); return; } - *p_version = 0x300; + *p_version = MAKEWORD(3, 0); return; } - *p_found = 1; + *p_found = true; if (LOWORD(os_version.dwBuildNumber) >= 0x550) { - *p_version = 0x501; + *p_version = MAKEWORD(5, 1); return; } HMODULE ddraw_module = LoadLibrary("DDRAW.DLL"); if (!ddraw_module) { *p_version = 0; - *p_found = 0; + *p_found = false; FreeLibrary(ddraw_module); return; } @@ -75,7 +84,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found) (DirectDrawCreate_fn*) GetProcAddress(ddraw_module, "DirectDrawCreate"); if (!func_DirectDrawCreate) { *p_version = 0; - *p_found = 0; + *p_found = false; FreeLibrary(ddraw_module); OutputDebugString("Couldn't LoadLibrary DDraw\r\n"); return; @@ -83,12 +92,12 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found) LPDIRECTDRAW ddraw; if (FAILED(func_DirectDrawCreate(NULL, &ddraw, NULL))) { *p_version = 0; - *p_found = 0; + *p_found = false; FreeLibrary(ddraw_module); OutputDebugString("Couldn't create DDraw\r\n"); return; } - *p_version = 0x100; + *p_version = MAKEWORD(1, 0); LPDIRECTDRAW2 ddraw2; if (FAILED(ddraw->QueryInterface(IID_IDirectDraw2, (LPVOID*) &ddraw2))) { ddraw->Release(); @@ -97,7 +106,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found) return; } ddraw->Release(); - *p_version = 0x200; + *p_version = MAKEWORD(2, 0); HMODULE dinput_module = LoadLibrary("DINPUT.DLL"); if (!dinput_module) { OutputDebugString("Couldn't LoadLibrary DInput\r\n"); @@ -114,7 +123,7 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found) OutputDebugString("Couldn't GetProcAddress DInputCreate\r\n"); return; } - *p_version = 0x300; + *p_version = MAKEWORD(3, 0); DDSURFACEDESC surface_desc; memset(&surface_desc, 0, sizeof(surface_desc)); surface_desc.dwSize = sizeof(surface_desc); @@ -141,8 +150,9 @@ void DetectDirectX(unsigned int* p_version, BOOL* p_found) FreeLibrary(ddraw_module); return; } - *p_version = 0x500; + *p_version = MAKEWORD(5, 0); surface3->Release(); ddraw2->Release(); FreeLibrary(ddraw_module); +#endif } diff --git a/CONFIG/detectdx5.h b/CONFIG/detectdx5.h index 3034b775..11c945d1 100644 --- a/CONFIG/detectdx5.h +++ b/CONFIG/detectdx5.h @@ -7,8 +7,8 @@ #include #endif -extern BOOL DetectDirectX5(); +extern bool DetectDirectX5(); -extern void DetectDirectX(unsigned int* p_version, BOOL* p_found); +extern void DetectDirectX(unsigned int* p_version, bool* p_found); #endif // !defined(AFX_DETECTDX5_H) diff --git a/CONFIG/res/about.ui b/CONFIG/res/about.ui new file mode 100644 index 00000000..a716ebc8 --- /dev/null +++ b/CONFIG/res/about.ui @@ -0,0 +1,99 @@ + + + AboutDialog + + + + 0 + 0 + 387 + 78 + + + + About Configure LEGO© Island + + + + + + + 0 + 0 + + + + + + + :/lego1.png + + + + + + + + + + Configure LEGO Island Version 1.0 + + + + + + + Copyright © 1997 mindscape + + + + + + + + + + QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + AboutDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AboutDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/CONFIG/res/config.qrc b/CONFIG/res/config.qrc new file mode 100644 index 00000000..a2fa0bcb --- /dev/null +++ b/CONFIG/res/config.qrc @@ -0,0 +1,7 @@ + + + shark.png + lego1.png + lego2.png + + \ No newline at end of file diff --git a/CONFIG/res/config.rc b/CONFIG/res/config.rc index a6164bfa..6bfb2925 100644 --- a/CONFIG/res/config.rc +++ b/CONFIG/res/config.rc @@ -1,58 +1,6 @@ -#include "resource.h" -#include "afxres.h" +#include -IDI_CONFIG ICON "lego.ico" - -IDB_SHARK BITMAP "shark.bmp" - -IDD_ABOUT DIALOG 0, 0, 217, 55 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "About Configure LEGO\xAE Island" -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -FONT 8, "MS Sans Serif" -BEGIN - CONTROL IDI_CONFIG, -1, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 11, 17, 18, 20 - CONTROL "Configure LEGO Island Version 1.0", -1, "STATIC", SS_LEFT | SS_NOPREFIX | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 10, 119, 8 - CONTROL "Copyright \xA9 1997 mindscape", -1, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 25, 119, 8 - CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 178, 7, 32, 14 -END - -STRINGTABLE -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -BEGIN - IDS_ABOUT, "&About Config..." -END - -IDD_MAIN DIALOGEX 0, 0, 289, 247 -STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "Configure LEGO Island" -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -FONT 8, "MS Sans Serif" -BEGIN - CONTROL "OK", IDABORT, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 172, 125, 44, 14 - CONTROL "Cancel", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 238, 125, 44, 14 - CONTROL "Fast", IDC_RAD_MODEL_QUALITY_LOW, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 124, 18, 42, 10 - CONTROL "High", IDC_RAD_MODEL_QUALITY_HIGH, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 192, 18, 69, 10 - CONTROL "Fast", IDC_RAD_TEXTURE_QUALITY_LOW, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 124, 49, 43, 10 - CONTROL "High", IDC_RAD_TEXTURE_QUALITY_HIGH, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 192, 49, 69, 10 - CONTROL "256 Color", IDC_RAD_PALETTE_256, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 124, 80, 50, 10 - CONTROL "High Color(16 bit)", IDC_RAD_PALETTE_16BIT, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 192, 80, 76, 10 - CONTROL "Use Joystick", IDC_CHK_JOYSTICK, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 192, 104, 60, 10 - CONTROL "", IDC_LIST_3DDEVICES, "LISTBOX", LBS_NOTIFY | LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL, 115, 168, 161, 36 , WS_EX_TRANSPARENT - CONTROL "Flip Video Memory Pages", IDC_CHK_FLIP_VIDEO_MEM_PAGES, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE, 116, 224, 96, 15 - CONTROL "Draw 3D to Video Memory", IDC_CHK_3D_VIDEO_MEMORY, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE, 116, 210, 99, 10 - CONTROL "Color Palette", -1, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 107, 69, 175, 26 - CONTROL "Direct 3D Devices", -1, "STATIC", SS_CENTER | WS_CHILD | WS_VISIBLE | WS_GROUP, 123, 158, 143, 10 - CONTROL "3D Sound", IDC_CHK_3DSOUND, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE, 220, 210, 45, 10 - CONTROL "Island Model Quality", -1, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 107, 7, 175, 26 - CONTROL "Island Texture Quality", -1, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 107, 38, 175, 26 - CONTROL "Advanced Settings", IDC_GRP_ADVANCED, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 107, 147, 175, 93 - CONTROL "Advanced", IDC_BTN_ADVANCED, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 109, 124, 44, 14 - CONTROL IDB_SHARK, IDC_BMP_SHARK, "STATIC", SS_BITMAP | WS_CHILD | WS_VISIBLE, 7, 7, 83, 249 - CONTROL "Draw Cursor", IDC_CHK_DRAW_CURSOR, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE, 219, 227, 54, 10 - CONTROL "Music", IDC_CHK_MUSIC, "BUTTON", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 124, 104, 35, 10 -END +1 ICON "lego.ico" 1 VERSIONINFO FILEVERSION 1,1,0,0 diff --git a/CONFIG/res/lego1.png b/CONFIG/res/lego1.png new file mode 100644 index 0000000000000000000000000000000000000000..06fbd8a0ae76f554ee94ea3e8ca3da7a03119c49 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vO2U$sR$z3=CCj3=9n|3=F@3LJcn% z7)lKo7+xhXFj&oCU=S~uvn$XBC?Oi)6XFV_|NjRP3?Kr;`VR!hCH_hSxr`-2e!&b5 z&u*lFI7!~_E^LWuJ8FR(_7YEDSN4}|jG|1+4)+;cfI?F|T^vI+&d=>X$a`3U$F(=` z{SM(JTlTsqHfu1uOubP*_0|nF*S#ix6(nu<*|RYQw%0zdlirFT&sGH&1-s7MMGL+kel}(mRU|EXV=XB?{r|B-8SI| zL9e|JY`(UanN#+_^kfE`n@SJfE&k8;WGY{ULHIB6Iaj4GUDVW;@(MWybf0R8YeY#( zVo9o1a#1RfVlXl=GSM|K(={>*F*33;GPg1?(>5@$GB7x%zg7`NLvDUbW?Cg~4cm)E z=K?ioz-=hW%uOvWNz5$(=`jUaVqh3zWN2kzWMym$v1D6tc@t0%gQu&X%Q~loCID|N Bnh*d0 literal 0 HcmV?d00001 diff --git a/CONFIG/res/lego2.png b/CONFIG/res/lego2.png new file mode 100644 index 0000000000000000000000000000000000000000..872fcb26113de837b56ef70c85c7188e9b9f90af GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFvNcITwWnidMV_;}#VPNOf*SEoE$e&gn}CtusNe>SKmpFR9pwwHD3`6d3ntf_a`L@Qr- z)v%huh@oERkC3%aMcpmh?11Vl2ohYqEsNoU}RuqqHAELYh)B+WMpMzZe?Jm zZD3$!U~o)-ts;ts-29Zxv`X9>wik)c1!~ZM+fb63n_66wm|FnSV+yjwz%azf(8|Eb Y%GeZQ$+qC~CZHY$Pgg&ebxsLQ06f`wTmS$7 literal 0 HcmV?d00001 diff --git a/CONFIG/res/maindialog.ui b/CONFIG/res/maindialog.ui new file mode 100644 index 00000000..1dfc3052 --- /dev/null +++ b/CONFIG/res/maindialog.ui @@ -0,0 +1,357 @@ + + + MainDialog + + + + 0 + 0 + 549 + 563 + + + + + 0 + 0 + + + + Configure LEGO Island + + + + :/lego1.png:/lego1.png + + + + + + + 0 + 0 + + + + + 143 + 545 + + + + + + + :/shark.png + + + true + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 41 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Island Texture Quality + + + + 0 + + + 0 + + + + + Fast + + + + + + + High + + + + + + + + + + Island Model Quality + + + + 0 + + + 0 + + + + + Fast + + + + + + + High + + + + + + + + + + Color Palette + + + + 0 + + + 0 + + + + + 256 Color + + + + + + + High Color (16 bit) + + + + + + + + + + + 0 + + + 0 + + + + + Music + + + + + + + Use Joystick + + + + + + + + + + + 30 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Advanced + + + + + + + OK + + + true + + + + + + + Cancel + + + + + + + + + + + + + Advanced Settings + + + + 6 + + + 0 + + + 6 + + + 0 + + + + + + 0 + 0 + + + + Direct 3D Devices + + + Qt::AlignCenter + + + + + + + true + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::SelectRows + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Flip Video Memory Pages + + + + + + + Draw 3D to Video Memory + + + + + + + 3D Sound + + + + + + + Draw Cursor + + + + + + + + + + + + + + + + + + + diff --git a/CONFIG/res/resource.h b/CONFIG/res/resource.h deleted file mode 100644 index 4c72eaa1..00000000 --- a/CONFIG/res/resource.h +++ /dev/null @@ -1,25 +0,0 @@ -#define IDI_CONFIG 128 - -#define IDD_ABOUT 100 -#define IDS_ABOUT 101 - -#define IDD_MAIN 102 - -#define IDC_LIST_3DDEVICES 1000 -#define IDC_CHK_FLIP_VIDEO_MEM_PAGES 1001 -#define IDC_CHK_3D_VIDEO_MEMORY 1003 -#define IDC_RAD_PALETTE_256 1004 -#define IDC_RAD_PALETTE_16BIT 1005 -#define IDC_CHK_3DSOUND 1006 -#define IDC_CHK_DRAW_CURSOR 1008 -#define IDC_RAD_MODEL_QUALITY_LOW 1010 -#define IDC_RAD_MODEL_QUALITY_HIGH 1011 -#define IDC_RAD_TEXTURE_QUALITY_LOW 1013 -#define IDC_RAD_TEXTURE_QUALITY_HIGH 1014 -#define IDC_CHK_JOYSTICK 1015 -#define IDC_GRP_ADVANCED 1017 -#define IDC_BTN_ADVANCED 1020 -#define IDC_BMP_SHARK 1023 -#define IDC_CHK_MUSIC 1024 - -#define IDB_SHARK 135 diff --git a/CONFIG/res/shark.bmp b/CONFIG/res/shark.bmp deleted file mode 100644 index 0829a1d1da6bd18c3729c84bf0e16d16a7bb2c43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56230 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 diff --git a/CONFIG/res/shark.png b/CONFIG/res/shark.png new file mode 100644 index 0000000000000000000000000000000000000000..58b96386644318f0f0de9fb705508bfe1012c882 GIT binary patch literal 15334 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 literal 0 HcmV?d00001 diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index 20fc9437..a6f46822 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -511,11 +511,11 @@ MxResult IsleApp::SetupWindow() SDL_SetStringProperty(props, SDL_PROP_WINDOW_CREATE_TITLE_STRING, WINDOW_TITLE); window = SDL_CreateWindowWithProperties(props); -#ifndef MINIWIN +#ifdef MINIWIN + m_windowHandle = reinterpret_cast(window); +#else m_windowHandle = (HWND) SDL_GetPointerProperty(SDL_GetWindowProperties(window), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL); -#else - m_windowHandle = window; #endif SDL_DestroyProperties(props); diff --git a/miniwin/CMakeLists.txt b/miniwin/CMakeLists.txt index 85ada8af..65d1584e 100644 --- a/miniwin/CMakeLists.txt +++ b/miniwin/CMakeLists.txt @@ -1,7 +1,6 @@ add_library(miniwin STATIC EXCLUDE_FROM_ALL # Core src/windows/windows.cpp - src/mfc/mfc.cpp # DDraw src/ddraw/ddraw.cpp @@ -148,16 +147,3 @@ if(ISLE_COMPILE_SHADERS) DEPENDS "${py_gencshadersource}" ${shader_headers} ${shader_jsons}) endif() target_sources(miniwin PRIVATE "${index}" "${index_cpp}") - -# Minimfc lib -add_library(minimfc STATIC EXCLUDE_FROM_ALL - src/mfc/mfc.cpp -) - -target_include_directories(minimfc - PUBLIC $ - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/internal -) - -target_compile_definitions(minimfc PUBLIC MINIMFC) -target_link_libraries(minimfc PRIVATE SDL3::SDL3 miniwin) diff --git a/miniwin/include/miniwin/ddraw.h b/miniwin/include/miniwin/ddraw.h index 37dfb9d1..7b403259 100644 --- a/miniwin/include/miniwin/ddraw.h +++ b/miniwin/include/miniwin/ddraw.h @@ -13,14 +13,14 @@ #define DDERR_CANNOTDETACHSURFACE MAKE_DDHRESULT(20) #define DDERR_CURRENTLYNOTAVAIL MAKE_DDHRESULT(40) #define DDERR_EXCEPTION MAKE_DDHRESULT(55) -#define DDERR_GENERIC 0x80004005 +#define DDERR_GENERIC ((HRESULT) 0x80004005) #define DDERR_HEIGHTALIGN MAKE_DDHRESULT(90) #define DDERR_INCOMPATIBLEPRIMARY MAKE_DDHRESULT(95) #define DDERR_INVALIDCAPS MAKE_DDHRESULT(100) #define DDERR_INVALIDCLIPLIST MAKE_DDHRESULT(110) #define DDERR_INVALIDMODE MAKE_DDHRESULT(120) #define DDERR_INVALIDOBJECT MAKE_DDHRESULT(130) -#define DDERR_INVALIDPARAMS 0x80070057 +#define DDERR_INVALIDPARAMS ((HRESULT) 0x80070057) #define DDERR_INVALIDPIXELFORMAT MAKE_DDHRESULT(145) #define DDERR_INVALIDRECT MAKE_DDHRESULT(150) #define DDERR_LOCKEDSURFACES MAKE_DDHRESULT(160) @@ -48,7 +48,7 @@ #define DDERR_NOZBUFFERHW MAKE_DDHRESULT(340) #define DDERR_NOZOVERLAYHW MAKE_DDHRESULT(350) #define DDERR_OUTOFCAPS MAKE_DDHRESULT(360) -#define DDERR_OUTOFMEMORY 0x8007000E +#define DDERR_OUTOFMEMORY ((HRESULT) 0x8007000E) #define DDERR_OUTOFVIDEOMEMORY MAKE_DDHRESULT(380) #define DDERR_OVERLAYCANTCLIP MAKE_DDHRESULT(382) #define DDERR_OVERLAYCOLORKEYONLYONEACTIVE MAKE_DDHRESULT(384) @@ -63,7 +63,7 @@ #define DDERR_TOOBIGHEIGHT MAKE_DDHRESULT(470) #define DDERR_TOOBIGSIZE MAKE_DDHRESULT(480) #define DDERR_TOOBIGWIDTH MAKE_DDHRESULT(490) -#define DDERR_UNSUPPORTED 0x80004001 +#define DDERR_UNSUPPORTED ((HRESULT) 0x80004001) #define DDERR_UNSUPPORTEDFORMAT MAKE_DDHRESULT(510) #define DDERR_UNSUPPORTEDMASK MAKE_DDHRESULT(520) #define DDERR_VERTICALBLANKINPROGRESS MAKE_DDHRESULT(537) diff --git a/miniwin/include/miniwin/mfc.h b/miniwin/include/miniwin/mfc.h deleted file mode 100644 index 4ea09053..00000000 --- a/miniwin/include/miniwin/mfc.h +++ /dev/null @@ -1,304 +0,0 @@ -#pragma once - -#include "miniwin/windows.h" - -#include -#include -#include - -// --- Defines and Macros --- - -// Remove WinAPI stuff -#define BEGIN_MESSAGE_MAP(class_name, base_class_name) -#define DECLARE_MESSAGE_MAP() -#ifndef __cdecl -#define __cdecl -#endif -#define END_MESSAGE_MAP() -#define ON_COMMAND(id, func) -#define ON_LBN_SELCHANGE(id, func) -#define ON_WM_DESTROY() -#define ON_WM_PAINT() -#define ON_WM_QUERYDRAGICON() -#define ON_WM_SYSCOMMAND() - -#define FAILED(hr) (((HRESULT) (hr)) < 0) -#define InterlockedIncrement(x) __sync_add_and_fetch(x, 1) -#define HKEY_LOCAL_MACHINE ((HKEY) 0x80000002) -#define LOWORD(l) ((WORD) (((DWORD_PTR) (l)) & 0xffff)) -#define MAKEINTRESOURCE(i) (reinterpret_cast((ULONG_PTR) ((WORD) (i)))) - -#define ICON_BIG 1 -#define ICON_SMALL 0 - -#define KEY_READ 0x20019 -#define KEY_WRITE 0x20006 - -#define LB_ADDSTRING 0x180 -#define LB_GETCURSEL 0x0188 -#define LB_SETCURSEL 0x185 - -#define MF_SEPARATOR 0x80000000 -#define MF_STRING 0x00000000 - -#define SM_CXICON 11 -#define SM_CYICON 12 - -#define WM_ICONERASEBKGND 0x0027 -#define WM_SETICON 0x804 - -#define ERROR_SUCCESS 0 -#define GENERIC_READ 0x80000000L -#define OPEN_EXISTING 3 -#define REG_SZ 1 -#define RT_GROUP_ICON 0x00000007 -#define SW_RESTORE 9 - -// --- Typedefs --- -typedef char CHAR; -typedef BYTE* LPBYTE; -typedef char* LPTSTR; -typedef const char* LPCTSTR; -typedef intptr_t INT_PTR, *PINT_PTR; -typedef uintptr_t UINT_PTR, *PUINT_PTR; -typedef intptr_t LONG_PTR, *PLONG_PTR; -typedef uintptr_t ULONG_PTR, *PULONG_PTR; -typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; -typedef UINT_PTR WPARAM; -typedef LONG_PTR LPARAM, LRESULT; -typedef HKEY* PHKEY; -typedef BITMAPINFO* LPBITMAPINFO; -typedef GUID REFIID; - -// --- Structs --- -struct OSVERSIONINFOA { - DWORD dwOSVersionInfoSize; - DWORD dwMajorVersion; - DWORD dwBuildNumber; - DWORD dwPlatformId; -}; -typedef struct IUnknown* LPUNKNOWN; - -struct CWnd { - HWND m_hWnd; - void EnableWindow(bool bEnable); - void SetWindowText(const char* text); -}; - -struct CDataExchange { - bool m_bSaveAndValidate; -}; - -struct CDialog { - HWND m_hWnd; - int m_nIDTemplate; - CWnd* m_pParentWnd; - CDialog(); - CDialog(int nIDTemplate); - CDialog(int nIDTemplate, CWnd* pParent); - virtual BOOL OnInitDialog(); - void OnCancel(); - virtual void OnOK(); - virtual void DoModal(); - virtual void Default(); - virtual void EndDialog(int nResult); - virtual void DoDataExchange(CDataExchange* pDX); -}; - -struct CPaintDC { - void* m_hDC; - CPaintDC(CDialog* hWnd); - void Draw(); -}; - -struct CMenu { - void* m_hMenu; - CMenu() : m_hMenu(nullptr) {} - static CMenu* FromHandle(void* hMenu) - { - CMenu* pMenu = new CMenu(); - pMenu->m_hMenu = hMenu; - return pMenu; - } - bool InsertMenu(UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCTSTR lpszNewItem); - bool RemoveMenu(UINT uPosition, UINT uFlags); - bool SetMenuItemInfo(UINT uIDItem, const void* pMenuItemInfo, bool fByPosition = false); - int GetMenuItemCount() const; -}; - -struct CWinApp { - CWinApp(); - ~CWinApp() = default; - virtual BOOL InitInstance() = 0; - virtual int ExitInstance(); -}; - -struct MEMORYSTATUS { - DWORD dwLength; - DWORD dwTotalPhys; -}; - -struct CCommandLineInfo { - virtual void ParseParam(LPCSTR pszParam, BOOL bFlag, BOOL bLast) {} -}; - -// --- Classs --- -class CString { -public: - CString(const char* str = "") : m_str(str) {} - void LoadString(int str) {} - operator const char*() const { return m_str; } - -private: - const char* m_str; -}; - -// --- Functions --- -inline WINBOOL WINAPI SetForegroundWindow(HWND hWnd) -{ - return TRUE; -} - -inline BOOL ShowWindow(HWND hWnd, int nCmdShow) -{ - return TRUE; -} - -inline BOOL SetWindowPos(CWinApp** hWnd, int X, int Y, int cx, int cy, UINT uFlags) -{ - return TRUE; -} - -BOOL GetWindowRect(HWND hDlg, struct RECT* Rect); - -inline BOOL GetClientRect(LPRECT lpRect) -{ - return TRUE; -} - -inline BOOL IsIconic() -{ - return FALSE; -} - -inline int GetSystemMetrics(int nIndex) -{ - return 0; -} - -BOOL GetVersionEx(OSVERSIONINFOA* version); - -void GlobalMemoryStatus(MEMORYSTATUS* memory_status); - -inline BOOL DrawIcon(HDC hdc, int x, int y, HICON hIcon) -{ - return TRUE; -} - -inline bool AppendMenu(void* menu, UINT uFlags, UINT_PTR uIDNewItem, LPCTSTR lpszNewItem) -{ - return true; -} - -inline LSTATUS RegOpenKeyEx(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult) -{ - return ERROR_SUCCESS; -} - -inline LSTATUS RegQueryValueEx( - HKEY hKey, - LPCSTR lpValueName, - LPDWORD lpReserved, - LPDWORD lpType, - BYTE* lpData, - LPDWORD lpcbData -) -{ - return ERROR_SUCCESS; -} - -inline LSTATUS RegCloseKey(HKEY hKey) -{ - return ERROR_SUCCESS; -} - -inline LSTATUS RegSetValueEx( - HKEY hKey, - LPCSTR lpValueName, - DWORD Reserved, - DWORD dwType, - const BYTE* lpData, - DWORD cbData -) -{ - return ERROR_SUCCESS; -} - -inline LSTATUS RegCreateKeyEx( - HKEY hKey, - LPCSTR lpSubKey, - DWORD Reserved, - const char* lpClass, - DWORD dwOptions, - REGSAM samDesired, - void* lpSecurityAttributes, - PHKEY phkResult, - LPDWORD lpdwDisposition -) -{ - return ERROR_SUCCESS; -} - -void OutputDebugString(const char* lpOutputString); - -void* GetProcAddress(HMODULE module, const char* name); - -int miniwin_stricmp(const char* str1, const char* str2); -#define _stricmp miniwin_stricmp - -HICON LoadIcon(HINSTANCE hInstance, LPCSTR lpIconName); - -int lstrcmpi(LPCSTR lpString1, LPCSTR lpString2); - -HINSTANCE AfxFindResourceHandle(LPCTSTR lpszResourceName, int lpszResourceType); - -HMODULE LoadLibrary(const char* name); - -int FreeLibrary(void* hModule); - -HMENU GetSystemMenu(HWND hWnd, bool bRevert); - -HWND WINAPI FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName); - -LRESULT SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam); - -LRESULT SendMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam); - -BOOL IsDlgButtonChecked(int nIDButton); - -CWnd* GetDlgItem(int id); - -BOOL OnInitDialog(HWND hDlg, HWND hwndFocus, LPARAM lParam); - -BOOL CheckRadioButton(int nIDFirstButton, int nIDLastButton, int nIDCheckButton); - -BOOL CheckDlgButton(int nIDButton, BOOL uCheck); - -void Enable3dControls(); - -void ParseCommandLine(CCommandLineInfo& cmdInfo); - -struct AFX_MODULE_STATE { - CWinApp* m_pCurrentWinApp; -}; -extern char* afxCurrentAppName; -extern CWinApp* wndTop; -extern AFX_MODULE_STATE g_CustomModuleState; -#define afxCurrentWinApp AfxGetModuleState()->m_pCurrentWinApp -inline AFX_MODULE_STATE* AfxGetModuleState() -{ - g_CustomModuleState.m_pCurrentWinApp = wndTop; - return &g_CustomModuleState; -} - -void AfxMessageBox(const char* message); diff --git a/miniwin/include/miniwin/windows.h b/miniwin/include/miniwin/windows.h index f4b9da44..bd54249d 100644 --- a/miniwin/include/miniwin/windows.h +++ b/miniwin/include/miniwin/windows.h @@ -60,7 +60,8 @@ // --- Typedefs --- typedef uint8_t BYTE, byte; typedef int32_t LONG; -typedef uint32_t ULONG, DWORD, HRESULT; +typedef uint32_t ULONG, DWORD; +typedef long HRESULT; typedef DWORD* LPDWORD; typedef int BOOL, WINBOOL, INT; typedef unsigned int UINT; @@ -70,10 +71,16 @@ typedef void* LPVOID; typedef char* LPSTR; typedef const char* LPCSTR; typedef void* HANDLE; -typedef HANDLE HICON, HFONT; +typedef struct HICON__* HICON; +typedef struct HFONT__* HFONT; typedef struct HINSTANCE__* HINSTANCE; -typedef SDL_Window *HMENU, *HWND; -typedef HANDLE HMODULE, HDC, HPALETTE, HFILE, HCURSOR; +typedef struct HMENU__* HMENU; +typedef struct HWND__* HWND; +typedef HINSTANCE HMODULE; +typedef struct HDC__* HDC; +typedef struct HPALETTE__* HPALETTE; +typedef HICON HCURSOR; +typedef HANDLE HFILE; typedef int LSTATUS, HKEY, REGSAM; // --- Structs --- diff --git a/miniwin/src/ddraw/ddraw.cpp b/miniwin/src/ddraw/ddraw.cpp index 84d3958e..9d817c9c 100644 --- a/miniwin/src/ddraw/ddraw.cpp +++ b/miniwin/src/ddraw/ddraw.cpp @@ -279,7 +279,8 @@ HRESULT DirectDrawImpl::RestoreDisplayMode() HRESULT DirectDrawImpl::SetCooperativeLevel(HWND hWnd, DDSCLFlags dwFlags) { - if (hWnd) { + SDL_Window* sdlWindow = reinterpret_cast(hWnd); + if (sdlWindow) { bool fullscreen; if ((dwFlags & DDSCL_NORMAL) == DDSCL_NORMAL) { fullscreen = false; @@ -291,10 +292,10 @@ HRESULT DirectDrawImpl::SetCooperativeLevel(HWND hWnd, DDSCLFlags dwFlags) return DDERR_INVALIDPARAMS; } - if (!SDL_SetWindowFullscreen(hWnd, fullscreen)) { + if (!SDL_SetWindowFullscreen(sdlWindow, fullscreen)) { return DDERR_GENERIC; } - DDWindow = hWnd; + DDWindow = sdlWindow; } return DD_OK; } diff --git a/miniwin/src/mfc/mfc.cpp b/miniwin/src/mfc/mfc.cpp deleted file mode 100644 index 628f4914..00000000 --- a/miniwin/src/mfc/mfc.cpp +++ /dev/null @@ -1,332 +0,0 @@ -#include "miniwin/mfc.h" - -#include "miniwin.h" - -#include -#include -#include -#include - -char* afxCurrentAppName; -AFX_MODULE_STATE g_CustomModuleState; -CWinApp* wndTop; - -SDL_Window* window; -const char* title = "Configure LEGO Island"; - -void CWnd::EnableWindow(bool bEnable) -{ - MINIWIN_NOT_IMPLEMENTED(); -} -void CWnd::SetWindowText(const char* text) -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -CDialog::CDialog() : m_nIDTemplate(0), m_pParentWnd(nullptr) -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -CDialog::CDialog(int nIDTemplate) : m_nIDTemplate(nIDTemplate), m_pParentWnd(nullptr) -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -CDialog::CDialog(int nIDTemplate, CWnd* pParent) : m_nIDTemplate(nIDTemplate), m_pParentWnd(pParent) -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -BOOL CDialog::OnInitDialog() -{ - MINIWIN_NOT_IMPLEMENTED(); - return TRUE; -} - -void CDialog::OnCancel() -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -void CDialog::OnOK() -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -void CDialog::DoModal() -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -void CDialog::Default() -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -void CDialog::EndDialog(int nResult) -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -void CDialog::DoDataExchange(CDataExchange* pDX) -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -CPaintDC::CPaintDC(CDialog* hWnd) -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -bool CMenu::InsertMenu(UINT uPosition, UINT uFlags, UINT_PTR uIDNewItem, LPCTSTR lpszNewItem) -{ - MINIWIN_NOT_IMPLEMENTED(); - return true; -} - -bool CMenu::RemoveMenu(UINT uPosition, UINT uFlags) -{ - MINIWIN_NOT_IMPLEMENTED(); - return true; -} - -bool CMenu::SetMenuItemInfo(UINT uIDItem, const void* pMenuItemInfo, bool fByPosition) -{ - MINIWIN_NOT_IMPLEMENTED(); - return true; -} - -int CMenu::GetMenuItemCount() const -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -void CPaintDC::Draw() -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -CWinApp::CWinApp() -{ - if (wndTop != NULL) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "There can only be one CWinApp!"); - abort(); - } - wndTop = this; - - if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK)) { - SDL_Log("SDL_Init: %s\n", SDL_GetError()); - return; - } - - window = SDL_CreateWindow(title, 640, 480, 0); -} - -int CWinApp::ExitInstance() -{ - SDL_Quit(); - return 0; -} - -static char* get_base_filename(const char* path) -{ - for (;;) { - const char* next = SDL_strpbrk(path, "/\\"); - if (next == NULL) { - break; - } - path = next + 1; - } - const char* end = SDL_strchr(path, '.'); - size_t len; - if (end == NULL) { - len = SDL_strlen(path); - } - else { - len = end - path; - } - char* filename = new char[len + 1]; - SDL_memcpy(filename, path, len); - filename[len] = '\0'; - return filename; -} - -int main(int argc, char* argv[]) -{ - afxCurrentAppName = get_base_filename(argv[0]); - if (wndTop == NULL) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "No CWinApp created"); - abort(); - } - wndTop->InitInstance(); - - SDL_Event event; - bool running = true; - while (running) { - while (SDL_PollEvent(&event)) { - if (event.type == SDL_EVENT_QUIT) { - running = false; - } - } - - SDL_Delay(16); // 60 FPS - } - - int result = wndTop->ExitInstance(); - delete[] afxCurrentAppName; - return result; -} - -void AfxMessageBox(const char* message) -{ - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title, message, NULL); -} - -BOOL GetWindowRect(HWND hWnd, RECT* Rect) -{ - int x, y, w, h; - if (!Rect) { - return FALSE; - } - if (hWnd == NULL) { - MINIWIN_NOT_IMPLEMENTED(); - return FALSE; - } - SDL_GetWindowPosition(hWnd, &x, &y); - SDL_GetWindowSize(hWnd, &w, &h); - - Rect->right = x; - Rect->top = y; - Rect->left = w + x; - Rect->bottom = h + y; - - return TRUE; -} - -BOOL GetVersionEx(OSVERSIONINFOA* version) -{ - version->dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); - version->dwMajorVersion = 5; // Win2k/XP - version->dwPlatformId = 2; // NT - version->dwBuildNumber = 0x500; - return TRUE; -} - -void OutputDebugString(const char* lpOutputString) -{ - SDL_LogDebug(SDL_LOG_CATEGORY_APPLICATION, "%s", lpOutputString); -} - -void* GetProcAddress(HMODULE module, const char* name) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -int miniwin_stricmp(const char* str1, const char* str2) -{ - return SDL_strcasecmp(str1, str2); -} - -void GlobalMemoryStatus(MEMORYSTATUS* memory_status) -{ - memory_status->dwLength = sizeof(*memory_status); - memory_status->dwTotalPhys = 1024 * SDL_GetSystemRAM(); -} - -HICON LoadIcon(HINSTANCE hInstance, LPCSTR lpIconName) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -int lstrcmpi(LPCSTR lpString1, LPCSTR lpString2) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -HINSTANCE AfxFindResourceHandle(LPCTSTR lpszResourceName, int lpszResourceType) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -HMODULE LoadLibrary(const char* name) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -int FreeLibrary(void* hModule) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -HMENU GetSystemMenu(HWND hWnd, bool bRevert) -{ - MINIWIN_NOT_IMPLEMENTED(); - assert(false && "Needs implementation"); - return reinterpret_cast(0x1234); -} - -HWND WINAPI FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -LRESULT SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -LRESULT SendMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -BOOL IsDlgButtonChecked(int nIDButton) -{ - MINIWIN_NOT_IMPLEMENTED(); - return 0; -} - -CWnd* GetDlgItem(int id) -{ - MINIWIN_NOT_IMPLEMENTED(); - return new CWnd(); -} - -BOOL OnInitDialog(HWND hDlg, HWND hwndFocus, LPARAM lParam) -{ - MINIWIN_NOT_IMPLEMENTED(); - return TRUE; -} - -BOOL CheckRadioButton(int nIDFirstButton, int nIDLastButton, int nIDCheckButton) -{ - MINIWIN_NOT_IMPLEMENTED(); - return TRUE; -} - -BOOL CheckDlgButton(int nIDButton, BOOL uCheck) -{ - MINIWIN_NOT_IMPLEMENTED(); - return TRUE; -} - -void Enable3dControls() -{ - MINIWIN_NOT_IMPLEMENTED(); -} - -void ParseCommandLine(CCommandLineInfo& cmdInfo) -{ - MINIWIN_NOT_IMPLEMENTED(); -} diff --git a/miniwin/src/windows/windows.cpp b/miniwin/src/windows/windows.cpp index 4c2f458d..5e174b8a 100644 --- a/miniwin/src/windows/windows.cpp +++ b/miniwin/src/windows/windows.cpp @@ -36,17 +36,18 @@ BOOL SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, if (!hWnd) { return FALSE; } + SDL_Window* sdlWindow = reinterpret_cast(hWnd); if (!(uFlags & SWP_NOACTIVATE)) { - SDL_RaiseWindow(hWnd); + SDL_RaiseWindow(sdlWindow); } if (!(uFlags & SWP_NOSIZE)) { - SDL_SetWindowSize(hWnd, cx, cy); + SDL_SetWindowSize(sdlWindow, cx, cy); } if (!(uFlags & SWP_NOMOVE)) { - SDL_SetWindowPosition(hWnd, X, Y); + SDL_SetWindowPosition(sdlWindow, X, Y); } return TRUE; @@ -181,8 +182,9 @@ int StretchDIBits( LONG GetWindowLong(HWND hWnd, int nIndex) { + SDL_Window* sdlWindow = reinterpret_cast(hWnd); if (nIndex == GWL_STYLE) { - Uint32 flags = SDL_GetWindowFlags(hWnd); + Uint32 flags = SDL_GetWindowFlags(sdlWindow); LONG style = WS_POPUP; if ((flags & SDL_WINDOW_BORDERLESS) == 0) { style = WS_OVERLAPPED | WS_CAPTION; @@ -202,9 +204,10 @@ LONG GetWindowLong(HWND hWnd, int nIndex) LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong) { + SDL_Window* sdlWindow = reinterpret_cast(hWnd); if (nIndex == GWL_STYLE) { - SDL_SetWindowBordered(hWnd, (dwNewLong & WS_CAPTION) != 0); - SDL_SetWindowResizable(hWnd, (dwNewLong & WS_THICKFRAME) != 0); + SDL_SetWindowBordered(sdlWindow, (dwNewLong & WS_CAPTION) != 0); + SDL_SetWindowResizable(sdlWindow, (dwNewLong & WS_THICKFRAME) != 0); return dwNewLong; }