From: <sv...@op...> - 2024-12-01 22:07:04
|
Author: sagamusix Date: Sun Dec 1 23:06:51 2024 New Revision: 22440 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22440 Log: [Imp] Allow DPI-awareness to be set in the Display options directly, without the need to edit hidden settings. System-DPI-aware mode is now also supported. [Mod] The old Display.HighResUI and Display.UseGDIUpscaling settings are gone. They are not migrated. Modified: trunk/OpenMPT/mptrack/ColorConfigDlg.cpp trunk/OpenMPT/mptrack/ColorConfigDlg.h trunk/OpenMPT/mptrack/HighDPISupport.cpp trunk/OpenMPT/mptrack/HighDPISupport.h trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/ColorConfigDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ColorConfigDlg.cpp Sun Dec 1 22:19:08 2024 (r22439) +++ trunk/OpenMPT/mptrack/ColorConfigDlg.cpp Sun Dec 1 23:06:51 2024 (r22440) @@ -108,6 +108,7 @@ DDX_Control(pDX, IDC_COMBO1, m_ComboItem); DDX_Control(pDX, IDC_COMBO2, m_ComboFont); DDX_Control(pDX, IDC_COMBO3, m_ComboPreset); + DDX_Control(pDX, IDC_COMBO4, m_ComboDPIAwareness); DDX_Control(pDX, IDC_BUTTON4, m_BtnPreview); DDX_Control(pDX, IDC_TEXT1, m_TxtColor[0]); DDX_Control(pDX, IDC_TEXT2, m_TxtColor[1]); @@ -143,11 +144,33 @@ BOOL COptionsColors::OnInitDialog() { CPropertyPage::OnInitDialog(); + m_pPreviewDib = LoadDib(MAKEINTRESOURCE(IDB_COLORSETUP)); + + m_ComboDPIAwareness.SetRedraw(FALSE); + static constexpr std::pair<const TCHAR *, DPIAwarenessMode> DPIModes[] = + { + {_T("Not DPI-Aware"), DPIAwarenessMode::NoDPIAwareness }, + {_T("Not DPI-Aware; GDI upscaling"), DPIAwarenessMode::NoDPIAwarenessGDIUpscaled}, + {_T("System DPI-Aware"), DPIAwarenessMode::SystemDPIAware }, + {_T("Per-Monitor DPI-Aware"), DPIAwarenessMode::PerMonitorDPIAware }, + }; + const DPIAwarenessMode currentDPIMode = TrackerSettings::Instance().dpiAwareness; + for(const auto dpiMode : DPIModes) + { + int item = m_ComboDPIAwareness.AddString(dpiMode.first); + m_ComboDPIAwareness.SetItemData(item, static_cast<DWORD_PTR>(dpiMode.second)); + if(currentDPIMode == dpiMode.second) + m_ComboDPIAwareness.SetCurSel(item); + } + m_ComboDPIAwareness.SetRedraw(TRUE); + + m_ComboItem.SetRedraw(FALSE); for (size_t i = 0; i < std::size(colorDefs); i++) { m_ComboItem.SetItemData(m_ComboItem.AddString(colorDefs[i].name), i); } + m_ComboItem.SetRedraw(TRUE); m_ComboItem.SetCurSel(0); m_BtnColor[0].SubclassDlgItem(IDC_BUTTON1, this); @@ -168,6 +191,7 @@ CheckRadioButton(IDC_RADIO3, IDC_RADIO5, IDC_RADIO3 + static_cast<int>(TrackerSettings::Instance().defaultRainbowChannelColors.Get())); patternFont = TrackerSettings::Instance().patternFont; + m_ComboFont.SetRedraw(FALSE); m_ComboFont.AddString(_T("Built-in (small)")); m_ComboFont.AddString(_T("Built-in (large)")); m_ComboFont.AddString(_T("Built-in (small, x2)")); @@ -186,6 +210,7 @@ m_ComboFont.AddString(FormatFontName(patternFont)); sel = 6; } + m_ComboFont.SetRedraw(TRUE); m_ComboFont.SetCurSel(sel); commentFont = TrackerSettings::Instance().commentsFont; @@ -227,6 +252,17 @@ void COptionsColors::OnOK() { + if(m_ComboDPIAwareness.GetCurSel() >= 0) + { + const DPIAwarenessMode currentDPIMode = TrackerSettings::Instance().dpiAwareness; + const DPIAwarenessMode newDPIMode = static_cast<DPIAwarenessMode>(m_ComboDPIAwareness.GetItemData(m_ComboDPIAwareness.GetCurSel())); + if(newDPIMode != currentDPIMode) + { + TrackerSettings::Instance().dpiAwareness = newDPIMode; + Reporting::Information(_T("You need to restart OpenMPT for the new DPI-awareness setting to take effect.")); + } + } + TrackerSettings::Instance().m_dwPatternSetup &= ~(PATTERN_STDHIGHLIGHT|PATTERN_2NDHIGHLIGHT|PATTERN_EFFECTHILIGHT); if(IsDlgButtonChecked(IDC_CHECK1)) TrackerSettings::Instance().m_dwPatternSetup |= PATTERN_STDHIGHLIGHT; if(IsDlgButtonChecked(IDC_CHECK2)) TrackerSettings::Instance().m_dwPatternSetup |= PATTERN_EFFECTHILIGHT; Modified: trunk/OpenMPT/mptrack/ColorConfigDlg.h ============================================================================== --- trunk/OpenMPT/mptrack/ColorConfigDlg.h Sun Dec 1 22:19:08 2024 (r22439) +++ trunk/OpenMPT/mptrack/ColorConfigDlg.h Sun Dec 1 23:06:51 2024 (r22440) @@ -23,7 +23,7 @@ { protected: std::array<COLORREF, MAX_MODCOLORS> CustomColors; - CComboBox m_ComboItem, m_ComboFont, m_ComboPreset; + CComboBox m_ComboDPIAwareness, m_ComboItem, m_ComboFont, m_ComboPreset; ColorPickerButton m_BtnColor[3]; CButton m_BtnPreview; CSpinButtonCtrl m_ColorSpin; Modified: trunk/OpenMPT/mptrack/HighDPISupport.cpp ============================================================================== --- trunk/OpenMPT/mptrack/HighDPISupport.cpp Sun Dec 1 22:19:08 2024 (r22439) +++ trunk/OpenMPT/mptrack/HighDPISupport.cpp Sun Dec 1 23:06:51 2024 (r22440) @@ -57,6 +57,20 @@ }; +static HANDLE DPIModeToContext(HighDPISupport::Mode mode) +{ + switch (mode) + { + case HighDPISupport::Mode::LowDpi: return HANDLE(MPT_DPI_AWARENESS_CONTEXT_UNAWARE); + case HighDPISupport::Mode::LowDpiUpscaled: return HANDLE(MPT_DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED); + case HighDPISupport::Mode::HighDpiSystem: return HANDLE(MPT_DPI_AWARENESS_CONTEXT_SYSTEM_AWARE); + case HighDPISupport::Mode::HighDpiPerMonitor: return HANDLE(MPT_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); + } + MPT_ASSERT_NOTREACHED(); + return HANDLE(MPT_DPI_AWARENESS_CONTEXT_UNAWARE); +} + + static HighDPISupportData *GetHighDPISupportData() { static std::unique_ptr<HighDPISupportData> highDPISupportData; @@ -70,7 +84,6 @@ void HighDPISupport::SetDPIAwareness(Mode mode) { auto instance = GetHighDPISupportData(); - bool setDPI = false; // For Windows 10, Creators Update (1703) and newer if(instance->m_user32.IsValid()) { @@ -78,29 +91,27 @@ PSETPROCESSDPIAWARENESSCONTEXT SetProcessDpiAwarenessContext = nullptr; if(instance->m_user32.Bind(SetProcessDpiAwarenessContext, "SetProcessDpiAwarenessContext")) { - if(mode == Mode::HighDpi) - setDPI = (SetProcessDpiAwarenessContext(HANDLE(MPT_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2)) == TRUE); - else if(mode == Mode::LowDpiUpscaled && SetProcessDpiAwarenessContext(HANDLE(MPT_DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED)) == TRUE) - setDPI = true; - else - setDPI = (SetProcessDpiAwarenessContext(HANDLE(MPT_DPI_AWARENESS_CONTEXT_UNAWARE)) == TRUE); + if(SetProcessDpiAwarenessContext(DPIModeToContext(mode)) == TRUE) + return; } } // For Windows 8.1 and newer - if(!setDPI) + const bool highDPI = (mode == Mode::HighDpiSystem || mode == Mode::HighDpiPerMonitor); + mpt::Library shcore(mpt::LibraryPath::System(P_("SHCore"))); + if(shcore.IsValid()) { - mpt::Library shcore(mpt::LibraryPath::System(P_("SHCore"))); - if(shcore.IsValid()) + using PSETPROCESSDPIAWARENESS = HRESULT(WINAPI *)(int); + PSETPROCESSDPIAWARENESS SetProcessDPIAwareness = nullptr; + if(shcore.Bind(SetProcessDPIAwareness, "SetProcessDpiAwareness")) { - using PSETPROCESSDPIAWARENESS = HRESULT(WINAPI *)(int); - PSETPROCESSDPIAWARENESS SetProcessDPIAwareness = nullptr; - if(shcore.Bind(SetProcessDPIAwareness, "SetProcessDpiAwareness")) - setDPI = (SetProcessDPIAwareness(mode == Mode::HighDpi ? 2 : 0) == S_OK); + if(SetProcessDPIAwareness(highDPI ? 2 : 0) == S_OK) + return; } } + // For Vista and newer - if(!setDPI && mode == Mode::HighDpi && instance->m_user32.IsValid()) + if(highDPI && instance->m_user32.IsValid()) { using PSETPROCESSDPIAWARE = BOOL(WINAPI *)(); PSETPROCESSDPIAWARE SetProcessDPIAware = nullptr; @@ -199,7 +210,7 @@ HighDPISupport::DPIAwarenessBypass::DPIAwarenessBypass(Mode forceMode) { if(auto instance = GetHighDPISupportData(); instance->m_SetThreadDpiAwarenessContext) - m_previous = instance->m_SetThreadDpiAwarenessContext(HANDLE((forceMode == Mode::HighDpi) ? MPT_DPI_AWARENESS_CONTEXT_SYSTEM_AWARE : MPT_DPI_AWARENESS_CONTEXT_UNAWARE)); + m_previous = instance->m_SetThreadDpiAwarenessContext(DPIModeToContext(forceMode)); } Modified: trunk/OpenMPT/mptrack/HighDPISupport.h ============================================================================== --- trunk/OpenMPT/mptrack/HighDPISupport.h Sun Dec 1 22:19:08 2024 (r22439) +++ trunk/OpenMPT/mptrack/HighDPISupport.h Sun Dec 1 23:06:51 2024 (r22440) @@ -30,7 +30,8 @@ { LowDpi, LowDpiUpscaled, - HighDpi, + HighDpiSystem, + HighDpiPerMonitor, }; void SetDPIAwareness(Mode mode); @@ -64,7 +65,7 @@ class DPIAwarenessBypass { public: - DPIAwarenessBypass(Mode forceMode = Mode::HighDpi); + DPIAwarenessBypass(Mode forceMode = Mode::HighDpiSystem); ~DPIAwarenessBypass(); private: Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Sun Dec 1 22:19:08 2024 (r22439) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Sun Dec 1 23:06:51 2024 (r22440) @@ -1295,12 +1295,24 @@ #endif // Dynamic DPI-awareness. Some users might want to disable DPI-awareness because of their DPI-unaware VST plugins. - if(TrackerSettings::Instance().highResUI) - HighDPISupport::SetDPIAwareness(HighDPISupport::Mode::HighDpi); - else if(TrackerSettings::Instance().useGDIUpcaling) - HighDPISupport::SetDPIAwareness(HighDPISupport::Mode::LowDpiUpscaled); - else + switch(TrackerSettings::Instance().dpiAwareness) + { + case DPIAwarenessMode::NoDPIAwareness: HighDPISupport::SetDPIAwareness(HighDPISupport::Mode::LowDpi); + break; + case DPIAwarenessMode::NoDPIAwarenessGDIUpscaled: + HighDPISupport::SetDPIAwareness(HighDPISupport::Mode::LowDpiUpscaled); + break; + case DPIAwarenessMode::SystemDPIAware: + HighDPISupport::SetDPIAwareness(HighDPISupport::Mode::HighDpiSystem); + break; + case DPIAwarenessMode::PerMonitorDPIAware: + HighDPISupport::SetDPIAwareness(HighDPISupport::Mode::HighDpiPerMonitor); + break; + default: + MPT_ASSERT_NOTREACHED(); + break; + } // create main MDI Frame window CMainFrame *pMainFrame = new CMainFrame(); Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp Sun Dec 1 22:19:08 2024 (r22439) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp Sun Dec 1 23:06:51 2024 (r22440) @@ -182,8 +182,7 @@ // Display , m_ShowSplashScreen(conf, UL_("Display"), UL_("ShowSplashScreen"), true) , gbMdiMaximize(conf, UL_("Display"), UL_("MDIMaximize"), true) - , highResUI(conf, UL_("Display"), UL_("HighResUI"), false) - , useGDIUpcaling(conf, UL_("Display"), UL_("UseGDIUpscaling"), true) + , dpiAwareness(conf, UL_("Display"), UL_("DPIAwareness"), DPIAwarenessMode::PerMonitorDPIAware) , glTreeSplitRatio(conf, UL_("Display"), UL_("MDITreeRatio"), 128) , glTreeWindowWidth(conf, UL_("Display"), UL_("MDITreeWidth"), 160) , glGeneralWindowHeight(conf, UL_("Display"), UL_("MDIGeneralHeight"), 222) Modified: trunk/OpenMPT/mptrack/TrackerSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h Sun Dec 1 22:19:08 2024 (r22439) +++ trunk/OpenMPT/mptrack/TrackerSettings.h Sun Dec 1 23:06:51 2024 (r22440) @@ -266,6 +266,13 @@ Random, }; +enum class DPIAwarenessMode +{ + NoDPIAwareness = 0, + NoDPIAwarenessGDIUpscaled, + SystemDPIAware, + PerMonitorDPIAware, +}; class SampleUndoBufferSize { @@ -323,6 +330,9 @@ template<> inline SettingValue ToSettingValue(const DefaultChannelColors & val) { return SettingValue(int32(val)); } template<> inline DefaultChannelColors FromSettingValue(const SettingValue& val) { return DefaultChannelColors(val.as<int32>()); } +template<> inline SettingValue ToSettingValue(const DPIAwarenessMode &val) { return SettingValue(int32(val)); } +template<> inline DPIAwarenessMode FromSettingValue(const SettingValue &val) { return DPIAwarenessMode(val.as<int32>()); } + template<> inline SettingValue ToSettingValue(const MODTYPE &val) { return SettingValue(SettingsModTypeToString(val), "MODTYPE"); } template<> inline MODTYPE FromSettingValue(const SettingValue &val) { ASSERT(val.GetTypeTag() == "MODTYPE"); return SettingsStringToModType(val.as<mpt::ustring>()); } @@ -684,8 +694,7 @@ Setting<bool> m_ShowSplashScreen; Setting<bool> gbMdiMaximize; - Setting<bool> highResUI; - Setting<bool> useGDIUpcaling; + Setting<DPIAwarenessMode> dpiAwareness; Setting<LONG> glTreeSplitRatio; Setting<LONG> glTreeWindowWidth; Setting<LONG> glGeneralWindowHeight; Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Sun Dec 1 22:19:08 2024 (r22439) +++ trunk/OpenMPT/mptrack/mptrack.rc Sun Dec 1 23:06:51 2024 (r22440) @@ -1308,29 +1308,31 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN GROUPBOX "",IDC_STATIC,6,6,312,192 - LTEXT "Pattern &Font:",IDC_STATIC,18,20,54,8 - COMBOBOX IDC_COMBO2,72,18,180,66,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Custom...",IDC_BUTTON9,258,18,50,12 - LTEXT "Comments f&ont:",IDC_STATIC,18,38,52,8 - PUSHBUTTON "Font",IDC_BUTTON10,72,36,180,12 - LTEXT "Display accidentals as:",IDC_STATIC,18,53,78,12,SS_CENTERIMAGE - CONTROL "&Sharps (#)",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,102,54,66,12 - CONTROL "Flats (&b)",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,168,54,108,12 - LTEXT "Default channel colours:",IDC_STATIC,18,67,78,12,SS_CENTERIMAGE - CONTROL "&No Colours",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,102,67,66,12 - CONTROL "&Rainbow",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,168,67,60,12 - CONTROL "Ran&dom",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON,228,67,48,12 - CONTROL "&Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,84,114,10 + LTEXT "DPI Awareness:",IDC_STATIC,18,20,54,8 + COMBOBOX IDC_COMBO4,78,18,174,66,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Pattern &Font:",IDC_STATIC,18,39,54,8 + COMBOBOX IDC_COMBO2,78,36,174,66,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&Custom...",IDC_BUTTON9,258,36,50,12 + LTEXT "Comments f&ont:",IDC_STATIC,18,57,54,8 + PUSHBUTTON "Font",IDC_BUTTON10,78,55,174,12 + LTEXT "Display accidentals as:",IDC_STATIC,18,71,84,12,SS_CENTERIMAGE + CONTROL "&Sharps (#)",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,108,72,66,12 + CONTROL "Flats (&b)",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,174,72,108,12 + LTEXT "Default channel colours:",IDC_STATIC,18,86,84,12,SS_CENTERIMAGE + CONTROL "&No Colours",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,108,85,66,12 + CONTROL "&Rainbow",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,174,85,60,12 + CONTROL "Ran&dom",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON,234,85,48,12 + CONTROL "&Enable effect highlighting",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,103,114,10 CONTROL "Remember each song's &window positions",IDC_CHECK5, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,102,168,10 - PUSHBUTTON "Clear Song Cac&he",IDC_BUTTON11,186,100,78,12 - CONTROL "&Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,118,84,10 - EDITTEXT IDC_PRIMARYHILITE,102,118,24,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows per measure (default)",IDC_STATIC,132,121,144,8 - CONTROL "Secondar&y highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,137,80,10 - EDITTEXT IDC_SECONDARYHILITE,102,137,24,12,ES_AUTOHSCROLL | ES_NUMBER - LTEXT "Rows per beat (default)",IDC_STATIC,132,140,144,8 - LTEXT "Note: Songs' time signatures will override the default highlight values",IDC_STATIC,18,153,258,8 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,121,168,10 + PUSHBUTTON "Clear Song Cac&he",IDC_BUTTON11,186,119,78,12 + CONTROL "&Primary highlight",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,137,84,10 + EDITTEXT IDC_PRIMARYHILITE,102,137,24,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Rows per measure (default)",IDC_STATIC,132,140,144,8 + CONTROL "Secondar&y highlight",IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,156,80,10 + EDITTEXT IDC_SECONDARYHILITE,102,156,24,12,ES_AUTOHSCROLL | ES_NUMBER + LTEXT "Rows per beat (default)",IDC_STATIC,132,159,144,8 + LTEXT "Note: Songs' time signatures will override the default highlight values",IDC_STATIC,18,172,258,8 GROUPBOX "Colours",IDC_STATIC,6,204,312,102 LTEXT "Select colo&ur for:",IDC_STATIC,18,218,63,8 CONTROL "",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,84,216,11,12 |