From 0d86432a31f471917519ae0c1264bee875568e63 Mon Sep 17 00:00:00 2001 From: Fabrice de Gans Date: Sat, 8 Oct 2022 20:29:10 -0700 Subject: [PATCH] [hidpi] Implement full HiDPI support This converts the HiDPIAware into a series of helper functions, using wxWidgets native support starting with wxWidgets 3.1.4. Custom implementations are provided for Mac and Windows. In addition, this fixes a few issues with the Windows build: * Use the same defines variables in the MSVC and MinGW builds, with g++ and Clang. * Add a custom manifest for the application, indicating full DPI support and support for recent Windows versions so the application will no longer run in compatibility mode by default. * Manually spawn a console in debug builds if none is attached and always use the parent console if it is available otherwise, even in release builds. This also removes the /subsystem:console linker argument. --- src/wx/CMakeLists.txt | 53 +++++++++++++++------------- src/wx/macsupport.mm | 35 ------------------- src/wx/panel.cpp | 54 ++++++++++++----------------- src/wx/visualboyadvance-m.manifest | 42 +++++++++++++++++++++++ src/wx/widgets/dpi-support-mac.mm | 47 +++++++++++++++++++++++++ src/wx/widgets/dpi-support-win.cpp | 55 ++++++++++++++++++++++++++++++ src/wx/widgets/dpi-support.cpp | 21 ++++++++++++ src/wx/widgets/dpi-support.h | 23 +++++++++++++ src/wx/wxvbam.cpp | 47 +++++++++++++------------ src/wx/wxvbam.h | 23 ++++--------- src/wx/wxvbam.rc | 3 ++ 11 files changed, 274 insertions(+), 129 deletions(-) create mode 100644 src/wx/visualboyadvance-m.manifest create mode 100644 src/wx/widgets/dpi-support-mac.mm create mode 100644 src/wx/widgets/dpi-support-win.cpp create mode 100644 src/wx/widgets/dpi-support.cpp create mode 100644 src/wx/widgets/dpi-support.h diff --git a/src/wx/CMakeLists.txt b/src/wx/CMakeLists.txt index 7e20c088..fefca080 100644 --- a/src/wx/CMakeLists.txt +++ b/src/wx/CMakeLists.txt @@ -89,6 +89,11 @@ if(NOT WIN32 AND NOT APPLE) endif() endif() +# Win32 definitions common to all toolchains. +if (WIN32) + add_definitions(-D_UNICODE -DUNICODE -DwxUSE_GUI=1 -D__WXMSW__ -DWINVER=0x0A00 -DNTDDI_VERSION=0x0A000007) +endif() + # on VS with vcpkg we can't use FindwxWidgets, we have to set everything up # manually because the package is broken if(WIN32 AND CMAKE_TOOLCHAIN_FILE MATCHES vcpkg AND (X86_32 OR X86_64)) @@ -120,8 +125,6 @@ if(WIN32 AND CMAKE_TOOLCHAIN_FILE MATCHES vcpkg AND (X86_32 OR X86_64)) add_definitions(-DWXUSINGDLL) endif() - add_definitions(-D_UNICODE -DUNICODE -DwxUSE_GUI=1 -D__WXMSW__ -DwxUSE_RC_MANIFEST -DwxUSE_DPI_AWARE_MANIFEST=2) - set(common_prefix ${_VCPKG_INSTALLED_DIR}/${WINARCH}-windows${arch_suffix}) set(dbg_prefix ${_VCPKG_INSTALLED_DIR}/${WINARCH}-windows${arch_suffix}/debug) set(installed_prefix ${_VCPKG_INSTALLED_DIR}/${WINARCH}-windows${arch_suffix}/${path_prefix}) @@ -755,9 +758,17 @@ set( set(ALL_SRC_WX ${SRC_WX}) list(APPEND ALL_SRC_WX ${CMAKE_CURRENT_SOURCE_DIR}/macsupport.mm) +list(APPEND ALL_SRC_WX ${CMAKE_CURRENT_SOURCE_DIR}/widgets/dpi-support-mac.mm) +list(APPEND ALL_SRC_WX ${CMAKE_CURRENT_SOURCE_DIR}/widgets/dpi-support-win.cpp) +list(APPEND ALL_SRC_WX ${CMAKE_CURRENT_SOURCE_DIR}/widgets/dpi-support.cpp) if(APPLE) - list(APPEND SRC_WX ${CMAKE_CURRENT_SOURCE_DIR}/macsupport.mm) + list(APPEND SRC_WX macsupport.mm) + list(APPEND SRC_WX widgets/dpi-support-mac.mm) +elseif(WIN32) + list(APPEND SRC_WX widgets/dpi-support-win.cpp) +else() + list(APPEND SRC_WX widgets/dpi-support.cpp) endif() set( @@ -776,6 +787,7 @@ set( wayland.h wxutil.h config/user-input.h + widgets/dpi-support.h widgets/wx/gamecontrol.h widgets/wx/keyedit.h widgets/wx/joyedit.h @@ -976,18 +988,23 @@ if(NOT TRANSLATIONS_ONLY) endif() endif() + if(WIN32) + # This is necessary for DPI support and is not included by default in + # the msys2 build. + target_link_libraries(visualboyadvance-m shcore) + + if(MSVC) + # the debug lib libcmtd is linked in debug mode, so don't link the normal version + set_target_properties(visualboyadvance-m PROPERTIES LINK_FLAGS_DEBUG "/nodefaultlib:libcmt") + + # Disable the auto-generated manifest from CMake. + target_link_options(visualboyadvance-m PRIVATE "/MANIFEST:NO") + endif() + endif() + # link libgcc/libstdc++ statically on mingw # and adjust link command when making a static binary if(CMAKE_COMPILER_IS_GNUCXX) - if(WIN32) - # Build a console app in debug mode on Windows - if(CMAKE_BUILD_TYPE MATCHES "^(Debug|RelWithDebInfo)$") - set(CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} -Wl,--subsystem,console") - else() - set(CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} -Wl,--subsystem,windows") - endif() - endif() - if(VBAM_STATIC) # some dists don't have a static libpthread set(CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread ") @@ -1006,20 +1023,8 @@ if(NOT TRANSLATIONS_ONLY) ) endif() endif() - elseif(MSVC) - # the debug lib libcmtd is linked in debug mode, so don't link the normal version - set_target_properties(visualboyadvance-m PROPERTIES LINK_FLAGS_DEBUG "/nodefaultlib:libcmt /subsystem:console") - - # Disable the auto-generated manifest from CMake. - target_link_options(visualboyadvance-m PRIVATE "/MANIFEST:NO") endif() - # Make the app a console app in debug mode to get log messages. - if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL Debug) - target_compile_definitions(visualboyadvance-m PRIVATE -DWIN32_CONSOLE_APP) - endif() - - if(NOT WIN32 AND NOT APPLE) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/visualboyadvance-m.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/visualboyadvance-m.appdata.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/appdata) diff --git a/src/wx/macsupport.mm b/src/wx/macsupport.mm index c47590b7..ea285614 100644 --- a/src/wx/macsupport.mm +++ b/src/wx/macsupport.mm @@ -7,41 +7,6 @@ #include "wxvbam.h" #include "drawing.h" -double HiDPIAware::HiDPIScaleFactor() -{ - if (hidpi_scale_factor == 0) { - NSWindow* window = [(NSView*)GetWindow()->GetHandle() window]; - - if ([window respondsToSelector:@selector(backingScaleFactor)]) { - hidpi_scale_factor = [window backingScaleFactor]; - } - else { - hidpi_scale_factor = 1.0; - } - } - - return hidpi_scale_factor; -} - -void HiDPIAware::RequestHighResolutionOpenGLSurface() -{ - NSView* view = (NSView*)(GetWindow()->GetHandle()); - - if ([view respondsToSelector:@selector(setWantsBestResolutionOpenGLSurface:)]) { - [view setWantsBestResolutionOpenGLSurface:YES]; - } -} - -void HiDPIAware::GetRealPixelClientSize(int* x, int* y) -{ - NSView* view = (NSView*)(GetWindow()->GetHandle()); - - NSSize backing_size = [view convertSizeToBacking:view.bounds.size]; - - *x = backing_size.width; - *y = backing_size.height; -} - Quartz2DDrawingPanel::Quartz2DDrawingPanel(wxWindow* parent, int _width, int _height) : BasicDrawingPanel(parent, _width, _height) { diff --git a/src/wx/panel.cpp b/src/wx/panel.cpp index a1ba0afa..5c45bb30 100644 --- a/src/wx/panel.cpp +++ b/src/wx/panel.cpp @@ -54,6 +54,7 @@ GameArea::GameArea() , basic_width(GBAWidth) , basic_height(GBAHeight) , fullscreen(false) + , dpi_scale_factor_(widgets::DPIScaleFactorForWindow(this)) , paused(false) , pointer_blanked(false) , mouse_active_time(0) @@ -745,12 +746,11 @@ void GameArea::DelBorder() void GameArea::AdjustMinSize() { wxWindow* frame = wxGetApp().frame; - double hidpi_scale_factor = HiDPIScaleFactor(); // note: could safely set min size to 1x or less regardless of video_scale // but setting it to scaled size makes resizing to default easier - wxSize sz((std::ceil(basic_width * gopts.video_scale) / hidpi_scale_factor), - (std::ceil(basic_height * gopts.video_scale) / hidpi_scale_factor)); + wxSize sz((std::ceil(basic_width * gopts.video_scale) * dpi_scale_factor_), + (std::ceil(basic_height * gopts.video_scale) * dpi_scale_factor_)); SetMinSize(sz); #if wxCHECK_VERSION(2, 8, 8) sz = frame->ClientToWindowSize(sz); @@ -763,10 +763,9 @@ void GameArea::AdjustMinSize() void GameArea::LowerMinSize() { wxWindow* frame = wxGetApp().frame; - double hidpi_scale_factor = HiDPIScaleFactor(); - wxSize sz(std::ceil(basic_width / hidpi_scale_factor), - std::ceil(basic_height / hidpi_scale_factor)); + wxSize sz(std::ceil(basic_width * dpi_scale_factor_), + std::ceil(basic_height * dpi_scale_factor_)); SetMinSize(sz); // do not take decorations into account @@ -780,9 +779,8 @@ void GameArea::AdjustSize(bool force) if (fullscreen) return; - double hidpi_scale_factor = HiDPIScaleFactor(); - const wxSize newsz((std::ceil(basic_width * gopts.video_scale) / hidpi_scale_factor), - (std::ceil(basic_height * gopts.video_scale) / hidpi_scale_factor)); + const wxSize newsz((std::ceil(basic_width * gopts.video_scale) * dpi_scale_factor_), + (std::ceil(basic_height * gopts.video_scale) * dpi_scale_factor_)); if (!force) { wxSize sz = GetClientSize(); @@ -961,6 +959,16 @@ void GameArea::OnKillFocus(wxFocusEvent& ev) ev.Skip(); } +#if WX_HAS_NATIVE_HI_DPI_SUPPORT +void GameArea::OnDpiChanged(wxDPIChangedEvent&) { + if (dpi_scale_factor_ == GetDPIScaleFactor()) { + return; + } + dpi_scale_factor_ = GetDPIScaleFactor(); + AdjustSize(true); +} +#endif // WX_HAS_NATIVE_HI_DPI_SUPPORT + void GameArea::Pause() { if (paused) @@ -1332,6 +1340,9 @@ void GameArea::OnSDLJoy(wxJoyEvent& ev) BEGIN_EVENT_TABLE(GameArea, wxPanel) EVT_IDLE(GameArea::OnIdle) EVT_SDLJOY(GameArea::OnSDLJoy) +#if WX_HAS_NATIVE_HI_DPI_SUPPORT +EVT_DPI_CHANGED(GameArea::OnDpiChanged) +#endif // WX_HAS_NATIVE_HI_DPI_SUPPORT // FIXME: wxGTK does not generate motion events in MainFrame (not sure // what to do about it) EVT_MOUSE_EVENTS(GameArea::MouseEvent) @@ -2086,7 +2097,7 @@ GLDrawingPanel::GLDrawingPanel(wxWindow* parent, int _width, int _height) , wxglc(parent, wxID_ANY, glopts, wxPoint(0, 0), parent->GetClientSize(), wxFULL_REPAINT_ON_RESIZE | wxWANTS_CHARS) { - RequestHighResolutionOpenGLSurface(); + widgets::RequestHighResolutionOpenGlSurfaceForWindow(this); #ifndef wxGL_IMPLICIT_CONTEXT ctx = new wxGLContext(this); SetCurrent(*ctx); @@ -2251,7 +2262,7 @@ void GLDrawingPanel::AdjustViewport() #endif int x, y; - GetRealPixelClientSize(&x, &y); + widgets::GetRealPixelClientSize(this, &x, &y); glViewport(0, 0, x, y); #ifdef DEBUG @@ -2514,24 +2525,3 @@ void GameArea::ShowMenuBar() menu_bar_hidden = false; #endif } - -// stub HiDPI methods, see macsupport.mm for the Mac support -#ifndef __WXMAC__ -double HiDPIAware::HiDPIScaleFactor() -{ - if (hidpi_scale_factor == 0) { - hidpi_scale_factor = 1.0; - } - - return hidpi_scale_factor; -} - -void HiDPIAware::RequestHighResolutionOpenGLSurface() -{ -} - -void HiDPIAware::GetRealPixelClientSize(int* x, int* y) -{ - GetWindow()->GetClientSize(x, y); -} -#endif // HiDPI stubs diff --git a/src/wx/visualboyadvance-m.manifest b/src/wx/visualboyadvance-m.manifest new file mode 100644 index 00000000..5e5f0c6a --- /dev/null +++ b/src/wx/visualboyadvance-m.manifest @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + PerMonitorV2, system + true + + + + + + + + + + + + + + + + + diff --git a/src/wx/widgets/dpi-support-mac.mm b/src/wx/widgets/dpi-support-mac.mm new file mode 100644 index 00000000..45f2e25e --- /dev/null +++ b/src/wx/widgets/dpi-support-mac.mm @@ -0,0 +1,47 @@ +#include "widgets/dpi-support.h" + +#import +#import + +#include + +namespace widgets { + +double DPIScaleFactorForWindow(wxWindow* window) { +#if WX_HAS_NATIVE_HI_DPI_SUPPORT + return window->GetDPIScaleFactor(); +#else + NSWindow* ns_window = [(NSView*)window->GetHandle() window]; + + if ([ns_window respondsToSelector:@selector(backingScaleFactor)]) { + return [ns_window backingScaleFactor]; + } + return 1.0; +#endif // WX_HAS_NATIVE_HI_DPI_SUPPORT +} + +void RequestHighResolutionOpenGlSurfaceForWindow(wxWindow* window) { +#if !WX_HAS_NATIVE_HI_DPI_SUPPORT + NSView* view = (NSView*)(window->GetHandle()); + + if ([view respondsToSelector:@selector + (setWantsBestResolutionOpenGLSurface:)]) { + [view setWantsBestResolutionOpenGLSurface:YES]; + } +#endif // !WX_HAS_NATIVE_HI_DPI_SUPPORT +} + +void GetRealPixelClientSize(wxWindow* window, int* x, int* y) { +#if WX_HAS_NATIVE_HI_DPI_SUPPORT + window->GetClientSize(x, y); +#else + NSView* view = (NSView*)(window->GetHandle()); + + NSSize backing_size = [view convertSizeToBacking:view.bounds.size]; + + *x = backing_size.width; + *y = backing_size.height; +#endif // WX_HAS_NATIVE_HI_DPI_SUPPORT +} + +} // namespace widgets diff --git a/src/wx/widgets/dpi-support-win.cpp b/src/wx/widgets/dpi-support-win.cpp new file mode 100644 index 00000000..5c5d87f0 --- /dev/null +++ b/src/wx/widgets/dpi-support-win.cpp @@ -0,0 +1,55 @@ +#include "widgets/dpi-support.h" + +#include +#include +#include + +#include + +namespace widgets { + +double DPIScaleFactorForWindow(wxWindow* window) { +#if WX_HAS_NATIVE_HI_DPI_SUPPORT + return window->GetDPIScaleFactor(); +#else + static constexpr double kStandardDpi = 96.0; + HWND wnd = window->GetHWND(); + if (IsWindows10OrGreater()) { + // We can't properly resize on DPI/Monitor change, but neither can + // wxWidgets so we're consistent. + UINT dpi = GetDpiForWindow(wnd); + if (dpi != 0) { + return static_cast(dpi) / kStandardDpi; + } + } + + if (IsWindows8Point1OrGreater()) { + HMONITOR monitor = MonitorFromWindow(wnd, MONITOR_DEFAULTTONEAREST); + UINT xdpi; + UINT ydpi; + HRESULT success = + GetDpiForMonitor(monitor, MDT_EFFECTIVE_DPI, &xdpi, &ydpi); + if (success == S_OK) { + return static_cast(ydpi) / kStandardDpi; + } + } + + HDC dc = GetDC(wnd); + if (dc == nullptr) { + return 1.0; + } + + int ydpi = GetDeviceCaps(dc, LOGPIXELSY); + ReleaseDC(nullptr, dc); + + return ydpi / kStandardDpi; +#endif // WX_HAS_NATIVE_HI_DPI_SUPPORT +} + +void RequestHighResolutionOpenGlSurfaceForWindow(wxWindow*) {} + +void GetRealPixelClientSize(wxWindow* window, int* x, int* y) { + window->GetClientSize(x, y); +} + +} // namespace widgets diff --git a/src/wx/widgets/dpi-support.cpp b/src/wx/widgets/dpi-support.cpp new file mode 100644 index 00000000..512ce124 --- /dev/null +++ b/src/wx/widgets/dpi-support.cpp @@ -0,0 +1,21 @@ +#include "widgets/dpi-support.h" + +#include + +namespace widgets { + +double DPIScaleFactorForWindow(wxWindow* window) { +#if WX_HAS_NATIVE_HI_DPI_SUPPORT + return window->GetDPIScaleFactor(); +#else + return window->GetContentScaleFactor(); +#endif // WX_HAS_NATIVE_HI_DPI_SUPPORT +} + +void RequestHighResolutionOpenGlSurfaceForWindow(wxWindow*) {} + +void GetRealPixelClientSize(wxWindow* window, int* x, int* y) { + window->GetClientSize(x, y); +} + +} // namespace widgets diff --git a/src/wx/widgets/dpi-support.h b/src/wx/widgets/dpi-support.h new file mode 100644 index 00000000..39a33f25 --- /dev/null +++ b/src/wx/widgets/dpi-support.h @@ -0,0 +1,23 @@ +#ifndef VBAM_WX_WIDGETS_DPI_SUPPORT_ +#define VBAM_WX_WIDGETS_DPI_SUPPORT_ + +#include + +#if wxCHECK_VERSION(3, 1, 4) +#define WX_HAS_NATIVE_HI_DPI_SUPPORT 1 +#else +#define WX_HAS_NATIVE_HI_DPI_SUPPORT 0 +#endif // wxCHECK_VERSION(3,1,4) + +// Forward declaration. +class wxWindow; + +namespace widgets { + +double DPIScaleFactorForWindow(wxWindow* window); +void RequestHighResolutionOpenGlSurfaceForWindow(wxWindow* window); +void GetRealPixelClientSize(wxWindow* window, int* x, int* y); + +} // namespace widgets + +#endif // VBAM_WX_WIDGETS_DPI_SUPPORT_ diff --git a/src/wx/wxvbam.cpp b/src/wx/wxvbam.cpp index ba21e807..47cfaf48 100644 --- a/src/wx/wxvbam.cpp +++ b/src/wx/wxvbam.cpp @@ -5,6 +5,10 @@ #include "wxvbam.h" +#ifdef __WXMSW__ +#include +#endif + #include #include #include @@ -35,15 +39,6 @@ IMPLEMENT_APP(wxvbamApp) IMPLEMENT_DYNAMIC_CLASS(MainFrame, wxFrame) -#ifdef WIN32_CONSOLE_APP -#include - -int main(int argc, char** argv) -{ - return WinMain(::GetModuleHandle(NULL), 0, 0, 0); -} -#endif - #ifndef NO_ONLINEUPDATES #include "autoupdater/autoupdater.h" #endif // NO_ONLINEUPDATES @@ -199,28 +194,36 @@ wxString wxvbamApp::GetAbsolutePath(wxString path) return path; } -#ifdef __WXMSW__ -#include -#include -#endif - bool wxvbamApp::OnInit() { // set up logging #ifndef NDEBUG wxLog::SetLogLevel(wxLOG_Trace); -#endif +#endif // !NDEBUG + #ifdef __WXMSW__ // in windows console mode debug builds, redirect e.g. --help to stderr #ifndef NDEBUG wxMessageOutput::Set(new wxMessageOutputStderr()); -#endif - // turn off output buffering to support windows consoles - setvbuf(stdout, NULL, _IONBF, 0); - setvbuf(stderr, NULL, _IONBF, 0); - // redirect stderr to stdout - dup2(1, 2); -#endif +#endif // !NDEBUG + + bool console_attached = AttachConsole(ATTACH_PARENT_PROCESS) != FALSE; +#ifndef NDEBUG + // In debug builds, create a console if none is attached. + if (!console_attached) { + console_attached = AllocConsole() != FALSE; + } +#endif // !NDEBUG + + // Redirect stdout/stderr to the console if one is attached. + // This code was taken from Dolphin. + // https://github.com/dolphin-emu/dolphin/blob/6cf99195c645f54d54c72322ad0312a0e56bc985/Source/Core/DolphinQt/Main.cpp#L112 + HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); + if (console_attached && stdout_handle) { + freopen("CONOUT$", "w", stdout); + freopen("CONOUT$", "w", stderr); + } +#endif // __WXMSW__ using_wayland = IsItWayland(); // use consistent names for config diff --git a/src/wx/wxvbam.h b/src/wx/wxvbam.h index a09889df..21cebe22 100644 --- a/src/wx/wxvbam.h +++ b/src/wx/wxvbam.h @@ -11,6 +11,7 @@ #include #include +#include "widgets/dpi-support.h" #include "wx/joyedit.h" #include "wx/keyedit.h" #include "wx/sdljoy.h" @@ -388,18 +389,6 @@ private: #include "cmdhandlers.h" }; -// helper class to add HiDPI awareness (mostly for Mac OS X) -class HiDPIAware { -public: - HiDPIAware() { hidpi_scale_factor = 0; } - virtual double HiDPIScaleFactor(); - virtual void RequestHighResolutionOpenGLSurface(); - virtual void GetRealPixelClientSize(int* x, int* y); - virtual wxWindow* GetWindow() = 0; -private: - double hidpi_scale_factor; -}; - // a class for polling joystick keys class JoystickPoller : public wxTimer { public: @@ -519,7 +508,7 @@ class DrawingPanelBase; #include #endif -class GameArea : public wxPanel, public HiDPIAware { +class GameArea : public wxPanel { public: GameArea(); virtual ~GameArea(); @@ -641,8 +630,6 @@ public: void StartGamePlayback(const wxString& fname); void StopGamePlayback(); - virtual wxWindow* GetWindow() { return this; } - protected: MainFrame* main_frame; @@ -655,6 +642,7 @@ protected: int basic_width, basic_height; bool fullscreen; + double dpi_scale_factor_ = 0; bool paused; void OnIdle(wxIdleEvent&); @@ -665,6 +653,9 @@ protected: void EraseBackground(wxEraseEvent& ev); void OnSize(wxSizeEvent& ev); void OnKillFocus(wxFocusEvent& ev); +#if WX_HAS_NATIVE_HI_DPI_SUPPORT + void OnDpiChanged(wxDPIChangedEvent& ev); +#endif // WX_HAS_NATIVE_HI_DPI_SUPPORT #ifndef NO_FFMPEG recording::MediaRecorder snd_rec, vid_rec; @@ -716,7 +707,7 @@ extern bool cmditem_lt(const struct cmditem& cmd1, const struct cmditem& cmd2); class FilterThread; -class DrawingPanelBase : public HiDPIAware { +class DrawingPanelBase { public: DrawingPanelBase(int _width, int _height); ~DrawingPanelBase(); diff --git a/src/wx/wxvbam.rc b/src/wx/wxvbam.rc index b3dc78e9..9af08767 100644 --- a/src/wx/wxvbam.rc +++ b/src/wx/wxvbam.rc @@ -2,6 +2,7 @@ AAAAA_MAINICON ICON "icons/visualboyadvance-m.ico" +#define wxUSE_NO_MANIFEST 1 #include "wx/msw/wx.rc" #include "version.h" @@ -23,6 +24,8 @@ WINSPARKLE_DLL_RC RCDATA WINSPARKLE_DLL_PATH #endif /* NO_ONLINEUPDATES */ +CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "visualboyadvance-m.manifest" + VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION PRODUCTVERSION VER_PRODUCTVERSION