You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
(1) |
Apr
(1) |
May
|
Jun
(1) |
Jul
|
Aug
(10) |
Sep
|
Oct
|
Nov
|
Dec
(3) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(1) |
Feb
(2) |
Mar
(3) |
Apr
(2) |
May
(10) |
Jun
(2) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
(3) |
Dec
|
2008 |
Jan
(6) |
Feb
(4) |
Mar
(5) |
Apr
(2) |
May
(1) |
Jun
(1) |
Jul
(4) |
Aug
(6) |
Sep
(2) |
Oct
(9) |
Nov
(1) |
Dec
(4) |
2009 |
Jan
(9) |
Feb
(2) |
Mar
(2) |
Apr
(2) |
May
(6) |
Jun
(18) |
Jul
(33) |
Aug
(39) |
Sep
(33) |
Oct
(24) |
Nov
(23) |
Dec
(22) |
2010 |
Jan
(29) |
Feb
(32) |
Mar
(51) |
Apr
(17) |
May
(31) |
Jun
(21) |
Jul
(32) |
Aug
(28) |
Sep
(35) |
Oct
(27) |
Nov
(11) |
Dec
(13) |
2011 |
Jan
(14) |
Feb
(13) |
Mar
(27) |
Apr
(27) |
May
(28) |
Jun
(20) |
Jul
(43) |
Aug
(52) |
Sep
(66) |
Oct
(61) |
Nov
(11) |
Dec
(8) |
2012 |
Jan
(20) |
Feb
(30) |
Mar
(38) |
Apr
(21) |
May
(33) |
Jun
(21) |
Jul
(25) |
Aug
(9) |
Sep
(24) |
Oct
(42) |
Nov
(27) |
Dec
(41) |
2013 |
Jan
(20) |
Feb
(35) |
Mar
(156) |
Apr
(298) |
May
(258) |
Jun
(201) |
Jul
(105) |
Aug
(60) |
Sep
(193) |
Oct
(245) |
Nov
(280) |
Dec
(194) |
2014 |
Jan
(63) |
Feb
(202) |
Mar
(200) |
Apr
(23) |
May
(53) |
Jun
(105) |
Jul
(18) |
Aug
(26) |
Sep
(110) |
Oct
(187) |
Nov
(97) |
Dec
(74) |
2015 |
Jan
(45) |
Feb
(55) |
Mar
(116) |
Apr
(116) |
May
(193) |
Jun
(164) |
Jul
(50) |
Aug
(111) |
Sep
(98) |
Oct
(71) |
Nov
(103) |
Dec
(63) |
2016 |
Jan
(33) |
Feb
(101) |
Mar
(182) |
Apr
(139) |
May
(140) |
Jun
(103) |
Jul
(165) |
Aug
(286) |
Sep
(208) |
Oct
(127) |
Nov
(97) |
Dec
(54) |
2017 |
Jan
(64) |
Feb
(335) |
Mar
(202) |
Apr
(212) |
May
(139) |
Jun
(127) |
Jul
(294) |
Aug
(154) |
Sep
(170) |
Oct
(152) |
Nov
(156) |
Dec
(62) |
2018 |
Jan
(168) |
Feb
(237) |
Mar
(196) |
Apr
(174) |
May
(174) |
Jun
(161) |
Jul
(127) |
Aug
(88) |
Sep
(149) |
Oct
(66) |
Nov
(52) |
Dec
(135) |
2019 |
Jan
(146) |
Feb
(126) |
Mar
(104) |
Apr
(58) |
May
(60) |
Jun
(28) |
Jul
(197) |
Aug
(129) |
Sep
(141) |
Oct
(148) |
Nov
(63) |
Dec
(100) |
2020 |
Jan
(74) |
Feb
(37) |
Mar
(59) |
Apr
(154) |
May
(194) |
Jun
(133) |
Jul
(313) |
Aug
(197) |
Sep
(49) |
Oct
(162) |
Nov
(143) |
Dec
(57) |
2021 |
Jan
(120) |
Feb
(107) |
Mar
(314) |
Apr
(157) |
May
(524) |
Jun
(169) |
Jul
(72) |
Aug
(133) |
Sep
(135) |
Oct
(146) |
Nov
(198) |
Dec
(325) |
2022 |
Jan
(409) |
Feb
(249) |
Mar
(138) |
Apr
(95) |
May
(102) |
Jun
(221) |
Jul
(66) |
Aug
(120) |
Sep
(192) |
Oct
(131) |
Nov
(53) |
Dec
(171) |
2023 |
Jan
(357) |
Feb
(82) |
Mar
(168) |
Apr
(218) |
May
(196) |
Jun
(86) |
Jul
(115) |
Aug
(49) |
Sep
(190) |
Oct
(102) |
Nov
(45) |
Dec
(76) |
2024 |
Jan
(86) |
Feb
(50) |
Mar
(324) |
Apr
(209) |
May
(197) |
Jun
(232) |
Jul
(194) |
Aug
(247) |
Sep
(219) |
Oct
(266) |
Nov
(328) |
Dec
(304) |
2025 |
Jan
(191) |
Feb
(115) |
Mar
(137) |
Apr
(32) |
May
(126) |
Jun
(403) |
Jul
(115) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <sv...@op...> - 2025-01-02 08:17:24
|
Author: manx Date: Thu Jan 2 09:17:17 2025 New Revision: 22689 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22689 Log: [Ref] Silence Clang warning. Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.h Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.h Thu Jan 2 00:25:52 2025 (r22688) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.h Thu Jan 2 09:17:17 2025 (r22689) @@ -200,7 +200,7 @@ void DoDataExchange(CDataExchange* pDX) override; BOOL OnInitDialog() override; void OnOK() override; - CString GetToolTipText(UINT id, HWND hwnd) const; + CString GetToolTipText(UINT id, HWND hwnd) const override; afx_msg void OnLoopTypeChanged(); afx_msg void OnFadeLengthChanged(); |
From: <sv...@op...> - 2025-01-01 23:26:06
|
Author: sagamusix Date: Thu Jan 2 00:25:52 2025 New Revision: 22688 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22688 Log: [Fix] MED: The condition when to repeat octaves was inverted in r22476. Modified: trunk/OpenMPT/soundlib/Load_med.cpp Modified: trunk/OpenMPT/soundlib/Load_med.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp Wed Jan 1 23:35:55 2025 (r22687) +++ trunk/OpenMPT/soundlib/Load_med.cpp Thu Jan 2 00:25:52 2025 (r22688) @@ -1121,7 +1121,7 @@ instr.nMidiProgram = sampleHeader.midiPreset; } - if(instr.nMidiChannel != MidiNoChannel) + if(instr.nMidiChannel == MidiNoChannel) { int offset = NOTE_MIDDLEC + (hardwareMixSamples ? 24 : 36); for(auto ¬e : instr.NoteMap) |
From: <sv...@op...> - 2025-01-01 22:36:05
|
Author: sagamusix Date: Wed Jan 1 23:35:55 2025 New Revision: 22687 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22687 Log: [Fix] Default autosave path was wrong in portable mode. Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp Wed Jan 1 19:54:48 2025 (r22686) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp Wed Jan 1 23:35:55 2025 (r22687) @@ -1418,7 +1418,7 @@ mpt::PathString path; if(theApp.IsPortableMode()) { - return theApp.GetInstallPath().WithTrailingSlash(); + path = theApp.GetInstallPath().WithTrailingSlash(); } else { // Try to find non-roaming (local) app data first, fall back to other directory |
From: <sv...@op...> - 2025-01-01 18:54:57
|
Author: sagamusix Date: Wed Jan 1 19:54:48 2025 New Revision: 22686 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22686 Log: [New] Can now set a separate background color for the active row when recording is enabled (https://bugs.openmpt.org/view.php?id=856). Modified: trunk/OpenMPT/mptrack/ColorConfigDlg.cpp trunk/OpenMPT/mptrack/ColorSchemes.h trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/View_pat.cpp Modified: trunk/OpenMPT/mptrack/ColorConfigDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ColorConfigDlg.cpp Wed Jan 1 18:49:51 2025 (r22685) +++ trunk/OpenMPT/mptrack/ColorConfigDlg.cpp Wed Jan 1 19:54:48 2025 (r22686) @@ -53,7 +53,7 @@ } colorDefs[] = { { _T("Pattern Editor"), 0, { MODCOLOR_BACKNORMAL, MODCOLOR_TEXTNORMAL, MODCOLOR_BACKHILIGHT }, { _T("Background:"), _T("Foreground:"), _T("Highlighted:") } }, - { _T("Active Row"), 0, { MODCOLOR_BACKCURROW, MODCOLOR_TEXTCURROW, {} }, { _T("Background:"), _T("Foreground:"), nullptr } }, + { _T("Active Row"), 0, { MODCOLOR_BACKCURROW, MODCOLOR_TEXTCURROW, MODCOLOR_BACKRECORDROW }, { _T("Background:"), _T("Foreground:"), _T("Background (Record):")}}, { _T("Pattern Selection"), 0, { MODCOLOR_BACKSELECTED, MODCOLOR_TEXTSELECTED, {} }, { _T("Background:"), _T("Foreground:"), nullptr } }, { _T("Play Cursor"), 0, { MODCOLOR_BACKPLAYCURSOR, MODCOLOR_TEXTPLAYCURSOR, {} }, { _T("Background:"), _T("Foreground:"), nullptr } }, { _T("Note Highlight"), 0, { MODCOLOR_NOTE, MODCOLOR_INSTRUMENT, MODCOLOR_VOLUME }, { _T("Note:"), _T("Instrument:"), _T("Volume:") } }, @@ -613,6 +613,9 @@ for(uint32 i = 0; i < MAX_MODCOLORS; i++) { CustomColors[i] = file.Read<int32>(U_("Colors"), MPT_UFORMAT("Color{}")(mpt::ufmt::dec0<2>(i)), CustomColors[i]); + // For old color schemes that don't have this color yet + if(i == MODCOLOR_BACKCURROW) + CustomColors[MODCOLOR_BACKRECORDROW] = CustomColors[MODCOLOR_BACKCURROW]; } } OnPreviewChanged(); Modified: trunk/OpenMPT/mptrack/ColorSchemes.h ============================================================================== --- trunk/OpenMPT/mptrack/ColorSchemes.h Wed Jan 1 18:49:51 2025 (r22685) +++ trunk/OpenMPT/mptrack/ColorSchemes.h Wed Jan 1 19:54:48 2025 (r22686) @@ -60,6 +60,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xFF, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x40, 0x40, 0xA0) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xF0, 0xF0, 0x50) }, + { MODCOLOR_BACKRECORDROW, RGB(0x70, 0x70, 0x70) }, } }, { _T("Green (IT2)"), @@ -99,6 +100,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xE0, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xFF, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0x70, 0x70, 0x70) }, } }, { _T("Buzz"), @@ -138,6 +140,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x30, 0xCC, 0x30) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x32, 0xCC, 0xCC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xCC, 0x30) }, + { MODCOLOR_BACKRECORDROW, RGB(0xC0, 0xB4, 0x9E) }, } }, { _T("arseniiv - my color scheme 2"), @@ -177,6 +180,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0x88, 0x28) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0x80, 0xC0) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFB, 0xF9, 0xAA) }, + { MODCOLOR_BACKRECORDROW, RGB(0xC6, 0xD0, 0xD7) }, } }, { _T("barryvan - Tango"), @@ -216,6 +220,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x8A, 0xE2, 0x34) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x72, 0x9F, 0xCF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xCF, 0xCF, 0x72) }, + { MODCOLOR_BACKRECORDROW, RGB(0xBA, 0xBD, 0xB6) }, } }, { _T("barryvan - TangoDark"), @@ -255,6 +260,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x8A, 0xE2, 0x34) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x72, 0x9F, 0xCF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xCF, 0xCF, 0x72) }, + { MODCOLOR_BACKRECORDROW, RGB(0x3A, 0x43, 0x45) }, } }, { _T("Fasttracker 2 (Why Colors?)"), @@ -294,6 +300,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xC0, 0xC0, 0xC0) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x8A, 0xDB, 0xF3) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x5F) }, + { MODCOLOR_BACKRECORDROW, RGB(0x49, 0x75, 0x82) }, } }, { _T("herodotas - darkwater"), @@ -333,6 +340,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x80, 0xFF, 0xFF) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x32, 0xCC, 0xCC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xCC, 0x30) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x55, 0x55) }, } }, { _T("herodotas - grey&yellow"), @@ -372,6 +380,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x30, 0xCC, 0x30) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x32, 0xCC, 0xCC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xE4, 0xD5, 0x0C) }, + { MODCOLOR_BACKRECORDROW, RGB(0x88, 0x7D, 0x00) }, } }, { _T("herodotas - junglist"), @@ -411,6 +420,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x30, 0xCC, 0x30) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x32, 0xCC, 0xCC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xCC, 0x30) }, + { MODCOLOR_BACKRECORDROW, RGB(0xFF, 0x00, 0x00) }, } }, { _T("herodotas - mortician"), @@ -450,6 +460,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xFF, 0x00, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xC8, 0x00, 0x00) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xCA, 0xCA, 0xCA) }, + { MODCOLOR_BACKRECORDROW, RGB(0x70, 0x70, 0x70) }, } }, { _T("Hot Dog Stand"), @@ -489,6 +500,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xFF, 0x00, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xFF, 0xC0, 0x00) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xE8, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0xFF, 0xC0, 0x00) }, } }, { _T("Impulse Tracker (Camouflage)"), @@ -528,6 +540,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x45, 0x9A, 0x49) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x38, 0x9E, 0x75) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xEB, 0xEB, 0xCB) }, + { MODCOLOR_BACKRECORDROW, RGB(0x10, 0x35, 0x00) }, } }, { _T("jmkz - Aqua LCD"), @@ -567,6 +580,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xCC, 0xFF) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0x99, 0xBF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0x00, 0xB3, 0xDF) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x66, 0x80) }, } }, { _T("jmkz - BeRoTracker"), @@ -606,6 +620,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x48, 0xF3, 0xA7) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x64, 0x7A, 0x91) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xD2, 0xF3, 0xF7) }, + { MODCOLOR_BACKRECORDROW, RGB(0xDB, 0x80, 0x24) }, } }, { _T("jmkz - Classic"), @@ -645,6 +660,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x8F, 0xEF, 0x8F) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x32, 0xCC, 0xCC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xEF, 0xD0, 0x8F) }, + { MODCOLOR_BACKRECORDROW, RGB(0xFF, 0xE2, 0x9F) }, } }, { _T("jmkz - Custom Colors"), @@ -684,6 +700,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x09, 0xB3, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xB0, 0xB0) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xEA, 0xEA, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0x52, 0x4C, 0x34) }, } }, { _T("jmkz - Custom Colors (inverted)"), @@ -723,6 +740,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x30, 0xCC, 0x30) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x32, 0xCC, 0xCC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xCC, 0x30) }, + { MODCOLOR_BACKRECORDROW, RGB(0xAD, 0xB3, 0xCB) }, } }, { _T("jmkz - Dark Pastels"), @@ -762,6 +780,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x9F, 0xFF, 0x9F) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x9F, 0x9F, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xDF, 0x80) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x31, 0x00) }, } }, { _T("jmkz - Deep Sea"), @@ -801,6 +820,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xC0, 0xFF, 0x80) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x80, 0xBF, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xE0, 0x80) }, + { MODCOLOR_BACKRECORDROW, RGB(0x60, 0x90, 0x30) }, } }, { _T("jmkz - Desert Mint"), @@ -840,6 +860,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x75, 0xCE, 0x40) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xB0, 0xB0) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xF0, 0xF0, 0x50) }, + { MODCOLOR_BACKRECORDROW, RGB(0x70, 0x70, 0x70) }, } }, { _T("jmkz - EL Glow"), @@ -879,6 +900,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x80, 0xFF, 0x80) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x9F, 0x9F, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFE, 0xDF, 0x81) }, + { MODCOLOR_BACKRECORDROW, RGB(0x5F, 0x5F, 0x5F) }, } }, { _T("jmkz - Engrayed"), @@ -918,6 +940,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xDC, 0xDC, 0xDC) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xC8, 0xC8, 0xC8) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xF0, 0xF0, 0xF0) }, + { MODCOLOR_BACKRECORDROW, RGB(0x50, 0x50, 0x50) }, } }, { _T("jmkz - GeneGreen"), @@ -957,6 +980,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xFF, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xFF, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0xFF, 0x80, 0x00) }, } }, { _T("jmkz - Harmony"), @@ -996,6 +1020,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x99, 0xFF, 0x33) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xAA, 0xD5, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xAA, 0x55) }, + { MODCOLOR_BACKRECORDROW, RGB(0xCC, 0xE6, 0xFF) }, } }, { _T("jmkz - High Contrast"), @@ -1035,6 +1060,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xFF, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x80, 0xFF, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x00, 0xFF) }, } }, { _T("jmkz - Matrix"), @@ -1074,6 +1100,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xFF, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xBF, 0x00) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0x00, 0xE6, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x80, 0x00) }, } }, { _T("jmkz - Midnite Blue"), @@ -1113,6 +1140,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0x00, 0xC8) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0x00, 0xA0) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0x62, 0x62, 0xFF) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x00, 0x9F) }, } }, { _T("jmkz - Midnite Green"), @@ -1152,6 +1180,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xC8, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xA0, 0x00) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0x00, 0xDC, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x9F, 0x00) }, } }, { _T("jmkz - Midnite Red"), @@ -1191,6 +1220,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xC8, 0x00, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xB4, 0x00, 0x00) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0x00, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0x9F, 0x00, 0x00) }, } }, { _T("jmkz - Mint"), @@ -1230,6 +1260,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x80, 0xFF, 0x80) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xBF, 0xFF, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x80) }, + { MODCOLOR_BACKRECORDROW, RGB(0x3C, 0x3C, 0x84) }, } }, { _T("jmkz - MT2 XP Classic"), @@ -1269,6 +1300,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x46, 0xA6, 0x4E) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x4D, 0x61, 0x85) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xEC, 0xE9, 0xD2) }, + { MODCOLOR_BACKRECORDROW, RGB(0xE0, 0xDF, 0xE3) }, } }, { _T("jmkz - Night Vision Red"), @@ -1308,6 +1340,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xDC, 0x00, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xC8, 0x00, 0x00) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0x42, 0x42) }, + { MODCOLOR_BACKRECORDROW, RGB(0x80, 0x00, 0x00) }, } }, { _T("jmkz - Oil Pastels"), @@ -1347,6 +1380,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x80, 0xFF, 0x80) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x80, 0x80, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xBF, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x31, 0x00) }, } }, { _T("jmkz - Old Sunset"), @@ -1386,6 +1420,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0x97, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0x9B, 0x9B) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xCC, 0x30) }, + { MODCOLOR_BACKRECORDROW, RGB(0x80, 0x00, 0x00) }, } }, { _T("jmkz - Oxygen Glow"), @@ -1425,6 +1460,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x80, 0xFF, 0x93) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x88, 0xEC, 0xF7) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xD2, 0x80) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x94, 0x9F) }, } }, { _T("jmkz - Oxygen"), @@ -1464,6 +1500,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x30, 0x8F, 0x3C) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x49, 0x73, 0x76) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0xB8, 0xE3, 0xE7) }, } }, { _T("jmkz - Pastels"), @@ -1503,6 +1540,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xCE, 0xFF, 0xCE) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xCE, 0xCE, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xDF, 0x80) }, + { MODCOLOR_BACKRECORDROW, RGB(0xCE, 0xFF, 0xCE) }, } }, { _T("jmkz - Plumbum"), @@ -1542,6 +1580,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xBF, 0xD7, 0xA8) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xA8, 0xD7, 0xD7) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xD7, 0xD7, 0xA8) }, + { MODCOLOR_BACKRECORDROW, RGB(0x70, 0x78, 0x8F) }, } }, { _T("jmkz - Preserve (black)"), @@ -1581,6 +1620,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x80, 0xFF, 0x80) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xCE, 0xCE) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xC4, 0xC4, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0x52, 0x52, 0x74) }, } }, { _T("jmkz - Protrekkr"), @@ -1620,6 +1660,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xA0, 0xBE, 0xE4) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x88, 0xD0, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x88) }, + { MODCOLOR_BACKRECORDROW, RGB(0x30, 0x24, 0x34) }, } }, { _T("jmkz - Pure Yellow"), @@ -1659,6 +1700,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xDF, 0xDF, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xC8, 0xC8, 0x00) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0x80, 0x80, 0x00) }, } }, { _T("jmkz - Renoise Visual"), @@ -1698,6 +1740,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xB8, 0xF6, 0xBF) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x43, 0xBD, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xE2, 0xE0, 0x93) }, + { MODCOLOR_BACKRECORDROW, RGB(0x38, 0x38, 0x38) }, } }, { _T("jmkz - Renoise"), @@ -1737,6 +1780,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xB8, 0xF6, 0xBF) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x43, 0xBD, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xE2, 0xE0, 0x93) }, + { MODCOLOR_BACKRECORDROW, RGB(0x38, 0x38, 0x38) }, } }, { _T("jmkz - Silver Luna"), @@ -1776,6 +1820,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x49, 0x88, 0x40) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x40, 0x88, 0x7D) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xEA, 0xEA, 0x15) }, + { MODCOLOR_BACKRECORDROW, RGB(0xD8, 0xD8, 0xDC) }, } }, { _T("jmkz - Skale"), @@ -1815,6 +1860,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x9B, 0xA4, 0xAE) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x22, 0x68, 0x8B) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0x81, 0xC1, 0xE0) }, + { MODCOLOR_BACKRECORDROW, RGB(0x52, 0x60, 0x6E) }, } }, { _T("jmkz - Technic"), @@ -1854,6 +1900,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x1B, 0x85, 0x33) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x32, 0xCC, 0xCC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0xC7, 0xC7, 0xC7) }, } }, { _T("jmkz - Tekton"), @@ -1893,6 +1940,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x30, 0xCC, 0x30) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x2E, 0xBC, 0xBC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x9F) }, + { MODCOLOR_BACKRECORDROW, RGB(0xC1, 0xFF, 0xFF) }, } }, { _T("jmkz - Tundra"), @@ -1932,6 +1980,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0xCF, 0xD7, 0xF1) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x88, 0x94, 0xB8) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xE0, 0xBE, 0xC0) }, + { MODCOLOR_BACKRECORDROW, RGB(0xCF, 0xD7, 0xF1) }, } }, { _T("jmkz - Xenon Glow"), @@ -1971,6 +2020,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x30, 0xCC, 0x30) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x59, 0x95, 0xE7) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xDF, 0xEC, 0xFF) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x43, 0x9F) }, } }, { _T("LegovitchColors"), @@ -2010,9 +2060,10 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xFF, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x81, 0xA8, 0xD3) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xC6, 0x1A) }, + { MODCOLOR_BACKRECORDROW, RGB(0xFF, 0xFF, 0xFF) }, } }, -{ _T("melcom - Aquamarine & Blue - Alternative)"), +{ _T("melcom - Aquamarine & Blue - Alternative"), { { MODCOLOR_BACKNORMAL, RGB(0x14, 0x2D, 0x32) }, { MODCOLOR_TEXTNORMAL, RGB(0x74, 0xA4, 0xB4) }, @@ -2049,6 +2100,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x30, 0xCC, 0x30) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x32, 0xCC, 0xCC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xCC, 0x30) }, + { MODCOLOR_BACKRECORDROW, RGB(0x38, 0x58, 0x78) }, } }, { _T("melcom - Brown, Olive & Green"), @@ -2088,6 +2140,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x30, 0xCC, 0x30) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x32, 0xCC, 0xCC) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xCC, 0x30) }, + { MODCOLOR_BACKRECORDROW, RGB(0x10, 0x35, 0x00) }, } }, { _T("MiDoRi - Coral Reef"), @@ -2127,6 +2180,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x9C, 0xE2, 0x8B) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xC0, 0x98, 0xCB) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xF1, 0xC9, 0x8D) }, + { MODCOLOR_BACKRECORDROW, RGB(0x1A, 0x5F, 0x97) }, } }, { _T("MiDoRi - DarkPlug"), @@ -2166,6 +2220,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x6A, 0xB9, 0xA4) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x4B, 0x79, 0x94) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xAE, 0xD6, 0x38) }, + { MODCOLOR_BACKRECORDROW, RGB(0x33, 0x0D, 0x30) }, } }, { _T("MiDoRi - DX7"), @@ -2205,6 +2260,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x2D, 0xAC, 0x79) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x6C, 0xDB, 0xCA) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xDC, 0xC5, 0xA3) }, + { MODCOLOR_BACKRECORDROW, RGB(0x36, 0x69, 0x62) }, } }, { _T("MiDoRi - Midorian Mode"), @@ -2244,6 +2300,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x28, 0xC8, 0x31) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xA3, 0xF0, 0x7D) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xD9, 0xC8, 0xA4) }, + { MODCOLOR_BACKRECORDROW, RGB(0x75, 0x75, 0x75) }, } }, { _T("MiDoRi - Strawberry"), @@ -2283,6 +2340,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x88, 0xD2, 0xB7) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xC0, 0x98, 0xCB) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xF3, 0xFA, 0xDC) }, + { MODCOLOR_BACKRECORDROW, RGB(0x43, 0x4D, 0x7C) }, } }, { _T("MiDoRi - Wineplume"), @@ -2322,6 +2380,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x53, 0xA4, 0xB5) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0xC8, 0xA0, 0xCB) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFC, 0xF4, 0xE4) }, + { MODCOLOR_BACKRECORDROW, RGB(0x7A, 0x27, 0x18) }, } }, { _T("MilkyTracker"), @@ -2361,6 +2420,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x40, 0x60, 0x80) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x55, 0x80, 0xAA) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x80) }, + { MODCOLOR_BACKRECORDROW, RGB(0x60, 0x20, 0x40) }, } }, { _T("mp64 - Chromatic v2"), @@ -2400,6 +2460,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xFF, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xFF, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0xC0, 0xC0, 0xC0) }, } }, { _T("mp64 - Chromatic"), @@ -2439,6 +2500,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xFF, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xFF, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x00) }, + { MODCOLOR_BACKRECORDROW, RGB(0xE0, 0xE8, 0xE0) }, } }, { _T("Oerg866 - AquaMPT"), @@ -2478,6 +2540,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x6F, 0x88, 0xFF) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x97, 0xBB, 0xFF) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xC6, 0xE1, 0xFF) }, + { MODCOLOR_BACKRECORDROW, RGB(0x00, 0x40, 0x80) }, } }, { _T("Scream Tracker 3 (Gold)"), @@ -2517,6 +2580,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x00, 0xB0, 0x00) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x22, 0x46, 0xA4) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xDF, 0x86) }, + { MODCOLOR_BACKRECORDROW, RGB(0x1A, 0x2D, 0x71) }, } }, { _T("tomaes"), @@ -2556,6 +2620,7 @@ { MODCOLOR_SAMPLE_LOOPMARKER, RGB(0x98, 0xC8, 0x09) }, { MODCOLOR_SAMPLE_SUSTAINMARKER, RGB(0x00, 0xDD, 0xDD) }, { MODCOLOR_SAMPLE_CUEPOINT, RGB(0xFF, 0xFF, 0x80) }, + { MODCOLOR_BACKRECORDROW, RGB(0x60, 0x60, 0x60) }, } }, }; Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp Wed Jan 1 18:49:51 2025 (r22685) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp Wed Jan 1 19:54:48 2025 (r22686) @@ -957,7 +957,7 @@ if(m_Status[psFocussed]) { row_col = MODCOLOR_TEXTCURROW; - row_bkcol = MODCOLOR_BACKCURROW; + row_bkcol = m_Status[psRecordingEnabled] ? MODCOLOR_BACKRECORDROW : MODCOLOR_BACKCURROW; } else if(m_Status[psFollowSong] && isPlaying) { Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp Wed Jan 1 18:49:51 2025 (r22685) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp Wed Jan 1 19:54:48 2025 (r22686) @@ -405,6 +405,9 @@ { const mpt::ustring colorName = MPT_UFORMAT("Color{}")(mpt::ufmt::dec0<2>(ncol)); rgbCustomColors[ncol] = conf.Read<uint32>(UL_("Display"), colorName, rgbCustomColors[ncol]); + // For old color schemes that don't have this color yet + if(ncol == MODCOLOR_BACKCURROW) + rgbCustomColors[MODCOLOR_BACKRECORDROW] = rgbCustomColors[MODCOLOR_BACKCURROW]; } // Paths m_szKbdFile = conf.Read<mpt::PathString>(UL_("Paths"), UL_("Key_Config_File"), mpt::PathString()); @@ -1241,6 +1244,7 @@ colours[MODCOLOR_BACKNORMAL] = RGB(0xFF, 0xFF, 0xFF); colours[MODCOLOR_TEXTNORMAL] = RGB(0x00, 0x00, 0x00); colours[MODCOLOR_BACKCURROW] = RGB(0xC0, 0xC0, 0xC0); + colours[MODCOLOR_BACKRECORDROW] = RGB(0xC0, 0xC0, 0xC0); colours[MODCOLOR_TEXTCURROW] = RGB(0x00, 0x00, 0x00); colours[MODCOLOR_BACKSELECTED] = RGB(0x00, 0x00, 0x00); colours[MODCOLOR_TEXTSELECTED] = RGB(0xFF, 0xFF, 0xFF); Modified: trunk/OpenMPT/mptrack/TrackerSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h Wed Jan 1 18:49:51 2025 (r22685) +++ trunk/OpenMPT/mptrack/TrackerSettings.h Wed Jan 1 19:54:48 2025 (r22686) @@ -86,6 +86,7 @@ MODCOLOR_SAMPLE_LOOPMARKER, MODCOLOR_SAMPLE_SUSTAINMARKER, MODCOLOR_SAMPLE_CUEPOINT, + MODCOLOR_BACKRECORDROW, MAX_MODCOLORS, // Internal color codes (not saved to color preset files) MODCOLOR_2NDHIGHLIGHT, Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Wed Jan 1 18:49:51 2025 (r22685) +++ trunk/OpenMPT/mptrack/View_pat.cpp Wed Jan 1 19:54:48 2025 (r22686) @@ -4232,6 +4232,7 @@ case VIEWMSG_SETRECORD: m_Status.set(psRecordingEnabled, !!lParam); + InvalidateRow(GetCurrentRow()); break; case VIEWMSG_SETSPACING: |
From: <sv...@op...> - 2025-01-01 17:49:58
|
Author: sagamusix Date: Wed Jan 1 18:49:51 2025 New Revision: 22685 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22685 Log: [Imp] "Continue song as soon as MIDI notes are being received" can now optionally start playback from start of pattern, rather than from current row (https://bugs.openmpt.org/view.php?id=445). Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mpdlgs.h trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp Wed Jan 1 18:32:24 2025 (r22684) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp Wed Jan 1 18:49:51 2025 (r22685) @@ -1707,24 +1707,25 @@ // CMidiSetupDlg BEGIN_MESSAGE_MAP(CMidiSetupDlg, CPropertyPage) - ON_CBN_SELCHANGE(IDC_COMBO1, &CMidiSetupDlg::OnSettingsChanged) - ON_CBN_SELCHANGE(IDC_COMBO2, &CMidiSetupDlg::OnSettingsChanged) - ON_CBN_SELCHANGE(IDC_COMBO3, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_BUTTON1, &CMidiSetupDlg::OnRenameDevice) - ON_COMMAND(IDC_CHECK1, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_CHECK2, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_CHECK3, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_CHECK4, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_CHECK5, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_MIDI_TO_PLUGIN, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_MIDI_MACRO_CONTROL, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_MIDIVOL_TO_NOTEVOL, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_MIDIPLAYCONTROL, &CMidiSetupDlg::OnSettingsChanged) - ON_COMMAND(IDC_MIDIPLAYPATTERNONMIDIIN, &CMidiSetupDlg::OnSettingsChanged) - ON_EN_CHANGE(IDC_EDIT1, &CMidiSetupDlg::OnSettingsChanged) - ON_EN_CHANGE(IDC_EDIT2, &CMidiSetupDlg::OnSettingsChanged) - ON_EN_CHANGE(IDC_EDIT3, &CMidiSetupDlg::OnSettingsChanged) - ON_EN_CHANGE(IDC_EDIT4, &CMidiSetupDlg::OnSettingsChanged) + ON_CBN_SELCHANGE(IDC_COMBO1, &CMidiSetupDlg::OnSettingsChanged) + ON_CBN_SELCHANGE(IDC_COMBO2, &CMidiSetupDlg::OnSettingsChanged) + ON_CBN_SELCHANGE(IDC_COMBO3, &CMidiSetupDlg::OnSettingsChanged) + ON_CBN_SELCHANGE(IDC_COMBO4, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_BUTTON1, &CMidiSetupDlg::OnRenameDevice) + ON_COMMAND(IDC_CHECK1, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_CHECK2, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_CHECK3, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_CHECK4, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_CHECK5, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_MIDI_TO_PLUGIN, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_MIDI_MACRO_CONTROL, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_MIDIVOL_TO_NOTEVOL, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_MIDIPLAYCONTROL, &CMidiSetupDlg::OnSettingsChanged) + ON_COMMAND(IDC_MIDIPLAYPATTERNONMIDIIN, &CMidiSetupDlg::OnSettingsChanged) + ON_EN_CHANGE(IDC_EDIT1, &CMidiSetupDlg::OnSettingsChanged) + ON_EN_CHANGE(IDC_EDIT2, &CMidiSetupDlg::OnSettingsChanged) + ON_EN_CHANGE(IDC_EDIT3, &CMidiSetupDlg::OnSettingsChanged) + ON_EN_CHANGE(IDC_EDIT4, &CMidiSetupDlg::OnSettingsChanged) END_MESSAGE_MAP() @@ -1738,6 +1739,7 @@ DDX_Control(pDX, IDC_COMBO1, m_InputDevice); DDX_Control(pDX, IDC_COMBO2, m_ATBehaviour); DDX_Control(pDX, IDC_COMBO3, m_Quantize); + DDX_Control(pDX, IDC_COMBO4, m_ContinueMode); DDX_Control(pDX, IDC_EDIT3, m_editAmp); //}}AFX_DATA_MAP } @@ -1770,6 +1772,11 @@ // Midi In Device RefreshDeviceList(m_nMidiDevice); + // Continue behaviour + m_ContinueMode.AddString(_T("From Cursor Position")); + m_ContinueMode.AddString(_T("From Start of Pattern")); + m_ContinueMode.SetCurSel(m_midiSetup[MidiSetup::PlayPatternFromStart] ? 1 : 0); + // Aftertouch behaviour m_ATBehaviour.ResetContent(); static constexpr std::pair<const TCHAR *, RecordAftertouchOptions> aftertouchOptions[] = @@ -1886,6 +1893,7 @@ m_midiSetup.set(MidiSetup::RespondToPlayControl, IsDlgButtonChecked(IDC_MIDIPLAYCONTROL) != BST_UNCHECKED); m_midiSetup.set(MidiSetup::PlayPatternOnMidiNote, IsDlgButtonChecked(IDC_MIDIPLAYPATTERNONMIDIIN) != BST_UNCHECKED); m_midiSetup.set(MidiSetup::RecordPitchBend, IsDlgButtonChecked(IDC_CHECK5) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::PlayPatternFromStart, m_ContinueMode.GetCurSel() == 1); int n = m_InputDevice.GetCurSel(); if(n >= 0) Modified: trunk/OpenMPT/mptrack/Mpdlgs.h ============================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.h Wed Jan 1 18:32:24 2025 (r22684) +++ trunk/OpenMPT/mptrack/Mpdlgs.h Wed Jan 1 18:49:51 2025 (r22685) @@ -218,7 +218,7 @@ protected: CSpinButtonCtrl m_SpinSpd, m_SpinPat, m_SpinAmp; - CComboBox m_InputDevice, m_ATBehaviour, m_Quantize; + CComboBox m_InputDevice, m_ATBehaviour, m_Quantize, m_ContinueMode; AccessibleEdit m_editAmp; }; Modified: trunk/OpenMPT/mptrack/TrackerSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h Wed Jan 1 18:32:24 2025 (r22684) +++ trunk/OpenMPT/mptrack/TrackerSettings.h Wed Jan 1 18:49:51 2025 (r22685) @@ -158,6 +158,7 @@ PlayPatternOnMidiNote = 0x100, // Play pattern if MIDI Note is received and playback is paused EnableMidiInOnStartup = 0x200, // Enable MIDI recording by default RecordPitchBend = 0x400, // Record MIDI pitch bend messages a MIDI macro changes in pattern + PlayPatternFromStart = 0x800, // When continuing playback due to received MIDI events, restart pattern instead of continuing from current row Default = RecordVelocity | RecordNoteOff | TransposeKeyboard | SendMidiToPlugins }; Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Wed Jan 1 18:32:24 2025 (r22684) +++ trunk/OpenMPT/mptrack/View_pat.cpp Wed Jan 1 18:49:51 2025 (r22685) @@ -4036,7 +4036,12 @@ case MIDIEvents::evNoteOn: // Note On // Continue playing as soon as MIDI notes are being received if((pMainFrm->GetSoundFilePlaying() != &sndFile || sndFile.IsPaused()) && midiSetup[MidiSetup::PlayPatternOnMidiNote]) - pModDoc->OnPatternPlayNoLoop(); + { + if(midiSetup[MidiSetup::PlayPatternFromStart]) + pModDoc->OnPatternRestart(false); + else + pModDoc->OnPatternPlayNoLoop(); + } vol = CMainFrame::ApplyVolumeRelatedSettings(midiData, midiVolume); if(vol < 0) Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Wed Jan 1 18:32:24 2025 (r22684) +++ trunk/OpenMPT/mptrack/mptrack.rc Wed Jan 1 18:49:51 2025 (r22685) @@ -1398,15 +1398,16 @@ COMBOBOX IDC_COMBO1,18,30,234,74,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Re&name",IDC_BUTTON1,258,30,50,14 CONTROL "&Apply Octave Transpose to incoming MIDI Notes",IDC_CHECK4, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,48,237,12 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,48,204,12 CONTROL "&Respond to Play / Continue / Stop Song messages",IDC_MIDIPLAYCONTROL, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,60,237,12 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,60,204,12 CONTROL "&Continue song as soon as MIDI notes are being received",IDC_MIDIPLAYPATTERNONMIDIIN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,73,237,12 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,72,204,12 + COMBOBOX IDC_COMBO4,222,72,86,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "&Pass MIDI to active instrument plugin",IDC_MIDI_TO_PLUGIN, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,84,237,12 - CONTROL "&Enable MIDI recording when launching OpenMPT",IDC_CHECK3, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,97,240,12 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,84,204,12 + CONTROL "&Enable MIDI recording when OpenMPT starts",IDC_CHECK3, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,96,204,12 GROUPBOX "MIDI Recording - Volume and Controllers",IDC_STATIC,6,120,312,114 CONTROL "Record Note &Off",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,138,237,8 CONTROL "Record MIDI Note &Velocity, amplify by",IDC_CHECK1, |
From: <sv...@op...> - 2025-01-01 17:32:33
|
Author: sagamusix Date: Wed Jan 1 18:32:24 2025 New Revision: 22684 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22684 Log: [Ref] Turn pattern and MIDI setup flags into enum class FlagSets, and rename many flags to have more understandable names. Modified: trunk/OpenMPT/mptrack/ColorConfigDlg.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Draw_pat.cpp trunk/OpenMPT/mptrack/GeneralConfigDlg.cpp trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainbar.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Mpdlgs.cpp trunk/OpenMPT/mptrack/Mpdlgs.h trunk/OpenMPT/mptrack/Mpt_midi.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/PatternClipboard.cpp trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_smp.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/ColorConfigDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ColorConfigDlg.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/ColorConfigDlg.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -48,8 +48,8 @@ { const TCHAR *name; int previewImage; - ModColor colorIndex[3]; - const TCHAR *descText[3]; + std::array<ModColor, 3> colorIndex; + std::array<const TCHAR *, 3> descText; } colorDefs[] = { { _T("Pattern Editor"), 0, { MODCOLOR_BACKNORMAL, MODCOLOR_TEXTNORMAL, MODCOLOR_BACKHILIGHT }, { _T("Background:"), _T("Foreground:"), _T("Highlighted:") } }, @@ -182,9 +182,10 @@ 0, 0, HighDPISupport::ScalePixels(PREVIEWBMP_WIDTH * 2, m_hWnd) + 2, HighDPISupport::ScalePixels(PREVIEWBMP_HEIGHT * 2, m_hWnd) + 2, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_STDHIGHLIGHT) CheckDlgButton(IDC_CHECK1, BST_CHECKED); - if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_EFFECTHILIGHT) CheckDlgButton(IDC_CHECK2, BST_CHECKED); - if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_2NDHIGHLIGHT) CheckDlgButton(IDC_CHECK4, BST_CHECKED); + const FlagSet<PatternSetup> patternSetup = TrackerSettings::Instance().patternSetup; + if(patternSetup[PatternSetup::HighlightMeasures]) CheckDlgButton(IDC_CHECK1, BST_CHECKED); + if(patternSetup[PatternSetup::EffectHighlight]) CheckDlgButton(IDC_CHECK2, BST_CHECKED); + if(patternSetup[PatternSetup::HighlightBeats]) CheckDlgButton(IDC_CHECK4, BST_CHECKED); CheckDlgButton(IDC_CHECK3, TrackerSettings::Instance().patternIgnoreSongTimeSignature ? BST_CHECKED : BST_UNCHECKED); CheckDlgButton(IDC_CHECK5, TrackerSettings::Instance().rememberSongWindows ? BST_CHECKED : BST_UNCHECKED); CheckRadioButton(IDC_RADIO1, IDC_RADIO2, TrackerSettings::Instance().accidentalFlats ? IDC_RADIO2 : IDC_RADIO1); @@ -269,10 +270,11 @@ } } - 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; - if(IsDlgButtonChecked(IDC_CHECK4)) TrackerSettings::Instance().m_dwPatternSetup |= PATTERN_2NDHIGHLIGHT; + FlagSet<PatternSetup> patternSetup = TrackerSettings::Instance().patternSetup; + patternSetup.set(PatternSetup::HighlightMeasures, IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED); + patternSetup.set(PatternSetup::EffectHighlight, IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED); + patternSetup.set(PatternSetup::HighlightBeats, IsDlgButtonChecked(IDC_CHECK4) != BST_UNCHECKED); + TrackerSettings::Instance().patternSetup = patternSetup; TrackerSettings::Instance().patternIgnoreSongTimeSignature = IsDlgButtonChecked(IDC_CHECK3) != BST_UNCHECKED; TrackerSettings::Instance().rememberSongWindows = IsDlgButtonChecked(IDC_CHECK5) != BST_UNCHECKED; TrackerSettings::Instance().accidentalFlats = IsDlgButtonChecked(IDC_RADIO2) != BST_UNCHECKED; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -171,7 +171,7 @@ m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP); m_ToolBar.AddButton(ID_PATTERNDETAIL_DROPDOWN, TIMAGE_PATTERN_DETAIL, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN); m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP); - m_ToolBar.AddButton(ID_OVERFLOWPASTE, TIMAGE_PATTERN_OVERFLOWPASTE, TBSTYLE_CHECK, ((TrackerSettings::Instance().m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); + m_ToolBar.AddButton(ID_OVERFLOWPASTE, TIMAGE_PATTERN_OVERFLOWPASTE, TBSTYLE_CHECK, ((TrackerSettings::Instance().patternSetup & PatternSetup::OverflowPaste) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); m_EditPatName.SetLimitText(MAX_PATTERNNAME - 1); // Spin controls @@ -182,7 +182,7 @@ m_SpinInstrument.SetPos(0); SetDlgItemInt(IDC_EDIT_SPACING, TrackerSettings::Instance().gnPatternSpacing); - CheckDlgButton(IDC_PATTERN_FOLLOWSONG, (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FOLLOWSONGOFF) ? BST_UNCHECKED : BST_CHECKED); + CheckDlgButton(IDC_PATTERN_FOLLOWSONG, (TrackerSettings::Instance().patternSetup & PatternSetup::FollowSongOffByDefault) ? BST_UNCHECKED : BST_CHECKED); m_SpinSequence.SetRange32(1, m_sndFile.Order.GetNumSequences()); m_SpinSequence.SetPos(m_sndFile.Order.GetCurrentSequenceIndex() + 1); @@ -544,7 +544,7 @@ break; case CTRLMSG_PAT_UPDATE_TOOLBAR: - m_ToolBar.CheckButton(ID_OVERFLOWPASTE, (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TRUE : FALSE); + m_ToolBar.CheckButton(ID_OVERFLOWPASTE, (TrackerSettings::Instance().patternSetup & PatternSetup::OverflowPaste) ? TRUE : FALSE); m_ToolBar.CheckButton(IDC_METRONOME, TrackerSettings::Instance().metronomeEnabled ? TRUE : FALSE); break; @@ -1105,7 +1105,7 @@ void CCtrlPatterns::OnToggleOverflowPaste() { - TrackerSettings::Instance().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; + TrackerSettings::Instance().patternSetup ^= PatternSetup::OverflowPaste; theApp.PostMessageToAllViews(WM_MOD_CTRLMSG, CTRLMSG_PAT_UPDATE_TOOLBAR); SwitchToView(); } Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -709,7 +709,7 @@ const ORDERINDEX length = order.GetLengthTailTrimmed(); CString s; - if(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_HEXDISPLAY) + if(TrackerSettings::Instance().patternSetup & PatternSetup::RowAndOrderNumbersHex) s.Format(_T("Position %02Xh of %02Xh"), m_nScrollPos, length); else s.Format(_T("Position %u of %u (%02Xh of %02Xh)"), m_nScrollPos, length, m_nScrollPos, length); Modified: trunk/OpenMPT/mptrack/Draw_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Draw_pat.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Draw_pat.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -166,7 +166,7 @@ int CViewPattern::GetSmoothScrollOffset() const { - if((TrackerSettings::Instance().m_dwPatternSetup & PATTERN_SMOOTHSCROLL) != 0 // Actually using the smooth scroll feature + if((TrackerSettings::Instance().patternSetup & PatternSetup::SmoothScrolling) // Actually using the smooth scroll feature && (m_Status & (psFollowSong | psDragActive)) == psFollowSong // Not drawing a selection during playback && (m_nMidRow != 0 || GetYScrollPos() > 0) // If active row is not centered, only scroll when display position is actually not at the top && IsLiveRecord() // Actually playing live (not paused or stepping) @@ -544,7 +544,7 @@ const int chanColorHeight = MulDiv(4, m_dpi, 96); const int chanColorOffset = MulDiv(2, m_dpi, 96); const int recordInsX = MulDiv(3, m_dpi, 96); - const bool doSmoothScroll = (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_SMOOTHSCROLL) != 0; + const bool doSmoothScroll = (TrackerSettings::Instance().patternSetup & PatternSetup::SmoothScrolling); GetClientRect(&rcClient); @@ -593,7 +593,7 @@ PATTERNINDEX nPrevPat = PATTERNINDEX_INVALID; // Display previous pattern - if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_SHOWPREVIOUS) + if(TrackerSettings::Instance().patternSetup & PatternSetup::ShowPrevNextPattern) { if(m_nOrder > 0 && m_nOrder < ordCount) { @@ -640,7 +640,7 @@ DrawPatternData(hdc, m_nPattern, true, (pMainFrm->GetModPlaying() == pModDoc), yofs, nrows, xofs, rcClient, &ypaint); // Display next pattern - if ((TrackerSettings::Instance().m_dwPatternSetup & PATTERN_SHOWPREVIOUS) && (ypaint < rcClient.bottom) && (ypaint == ypatternend)) + if((TrackerSettings::Instance().patternSetup & PatternSetup::ShowPrevNextPattern) && (ypaint < rcClient.bottom) && (ypaint == ypatternend)) { int nVisRows = (rcClient.bottom - ypaint + m_szCell.cy - 1) / m_szCell.cy; if(nVisRows > 0) @@ -829,7 +829,7 @@ if(!sndFile.Patterns.IsValidPat(nPattern)) return; const CPattern &pattern = sndFile.Patterns[nPattern]; - const auto patternSetupFlags = TrackerSettings::Instance().m_dwPatternSetup.Get(); + const FlagSet<PatternSetup> patternSetupFlags = TrackerSettings::Instance().patternSetup; const bool volumeColumnIsHex = TrackerSettings::Instance().patternVolColHex; const PATTERNFONT *pfnt = PatternFont::currentFont; @@ -887,7 +887,7 @@ nMeasure = sndFile.Patterns[nPattern].GetRowsPerMeasure(); } - const bool hexNumbers = (patternSetupFlags & PATTERN_HEXDISPLAY); + const bool hexNumbers = patternSetupFlags[PatternSetup::RowAndOrderNumbersHex]; bool bRowSel = false; int row_col = -1, row_bkcol = -1; for(ROWINDEX row = startRow; row < numRows; row++) @@ -929,8 +929,7 @@ ROWINDEX highlightRow = compRow; if(nMeasure > 0) highlightRow %= nMeasure; - if ((patternSetupFlags & PATTERN_2NDHIGHLIGHT) - && nBeat > 0) + if(patternSetupFlags[PatternSetup::HighlightBeats] && nBeat > 0) { if((highlightRow % nBeat) == 0) { @@ -938,8 +937,7 @@ } } // primary highlight (measures) - if((patternSetupFlags & PATTERN_STDHIGHLIGHT) - && nMeasure > 0) + if(patternSetupFlags[PatternSetup::HighlightMeasures] && nMeasure > 0) { if(highlightRow == 0) { @@ -989,13 +987,13 @@ const ModCommand *m = pattern.GetpModCommand(row, static_cast<CHANNELINDEX>(col)); // Should empty volume commands be replaced with a volume command showing the default volume? - const auto defaultVolume = (patternSetupFlags & PATTERN_SHOWDEFAULTVOLUME) ? DrawDefaultVolume(*m) : std::nullopt; + const auto defaultVolume = patternSetupFlags[PatternSetup::ShowDefaultVolume] ? DrawDefaultVolume(*m) : std::nullopt; DWORD dwSpeedUpMask = 0; if(useSpeedUpMask && (m_chnState[col].selectedCols & COLUMN_BITS_SKIP) && (row)) { const ModCommand *mold = m - ncols; - const auto oldDefaultVolume = (patternSetupFlags & PATTERN_SHOWDEFAULTVOLUME) ? DrawDefaultVolume(*mold) : std::nullopt; + const auto oldDefaultVolume = patternSetupFlags[PatternSetup::ShowDefaultVolume] ? DrawDefaultVolume(*mold) : std::nullopt; if(m->note == mold->note || !m_visibleColumns[PatternCursor::noteColumn]) dwSpeedUpMask |= COLUMN_BITS_NOTE; @@ -1043,7 +1041,7 @@ { tx_col = row_col; bk_col = row_bkcol; - if((patternSetupFlags & PATTERN_EFFECTHILIGHT) && m->IsNote()) + if(patternSetupFlags[PatternSetup::EffectHighlight] && m->IsNote()) { tx_col = MODCOLOR_NOTE; @@ -1084,7 +1082,7 @@ { tx_col = row_col; bk_col = row_bkcol; - if ((patternSetupFlags & PATTERN_EFFECTHILIGHT) && (m->instr)) + if(patternSetupFlags[PatternSetup::EffectHighlight] && (m->instr)) { tx_col = MODCOLOR_INSTRUMENT; } @@ -1111,7 +1109,7 @@ { tx_col = MODCOLOR_TEXTSELECTED; bk_col = MODCOLOR_BACKSELECTED; - } else if (!m->IsPcNote() && (patternSetupFlags & PATTERN_EFFECTHILIGHT)) + } else if (!m->IsPcNote() && patternSetupFlags[PatternSetup::EffectHighlight]) { auto fxColor = effectColors[static_cast<size_t>(m->GetVolumeEffectType())]; if(m->volcmd != VOLCMD_NONE && m->volcmd < MAX_VOLCMDS && fxColor != 0) @@ -1136,7 +1134,7 @@ uint16 val = m->GetValueEffectCol(); if(val > ModCommand::maxColumnValue) val = ModCommand::maxColumnValue; fx_col = row_col; - if (!isPCnote && m->command != CMD_NONE && m->command < MAX_EFFECTS && (patternSetupFlags & PATTERN_EFFECTHILIGHT)) + if (!isPCnote && m->command != CMD_NONE && m->command < MAX_EFFECTS && patternSetupFlags[PatternSetup::EffectHighlight]) { if(auto fxColor = effectColors[static_cast<size_t>(m->GetEffectType())]; fxColor != 0) fx_col = fxColor; @@ -1401,8 +1399,10 @@ sizePage.cy = sizeLine.cy * 8; GetClientRect(&rect); m_nMidRow = 0; - if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_CENTERROW) m_nMidRow = (rect.Height() - m_szHeader.cy) / (m_szCell.cy * 2); - if (m_nMidRow) sizeTotal.cy += m_nMidRow * m_szCell.cy * 2; + if(TrackerSettings::Instance().patternSetup & PatternSetup::CenterActiveRow) + m_nMidRow = (rect.Height() - m_szHeader.cy) / (m_szCell.cy * 2); + if(m_nMidRow) + sizeTotal.cy += m_nMidRow * m_szCell.cy * 2; SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine); m_bWholePatternFitsOnScreen = (rect.Height() >= sizeTotal.cy); if(m_bWholePatternFitsOnScreen) Modified: trunk/OpenMPT/mptrack/GeneralConfigDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/GeneralConfigDlg.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/GeneralConfigDlg.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -44,39 +44,39 @@ static constexpr struct GeneralOptionsDescriptions { - uint32 flag; + PatternSetup flag; const char *name, *description; } generalOptionsList[] = { - {PATTERN_PLAYNEWNOTE, "Play new notes while recording", "When this option is enabled, notes entered in the pattern editor will always be played (If not checked, notes won't be played in record mode)."}, - {PATTERN_PLAYEDITROW, "Play whole row while recording", "When this option is enabled, all notes on the current row are played when entering notes in the pattern editor."}, - {PATTERN_PLAYNAVIGATEROW, "Play whole row when navigating", "When this option is enabled, all notes on the current row are played when navigating vertically in the pattern editor."}, - {PATTERN_PLAYTRANSPOSE, "Play notes when transposing", "When transposing a single note, the new note is previewed."}, - {PATTERN_CENTERROW, "Always center active row", "Turn on this option to have the active row always centered in the pattern editor."}, - {PATTERN_SMOOTHSCROLL, "Smooth pattern scrolling", "Scroll patterns tick by tick rather than row by row at the expense of an increased CPU load."}, - {PATTERN_HEXDISPLAY, "Display rows in hex", "With this option enabled, row numbers and sequence numbers will be displayed in hexadecimal."}, - {PATTERN_WRAP, "Cursor wrap in pattern editor", "When this option is active, going past the end of a pattern row or channel will move the cursor to the beginning. When \"Continuous scroll\"-option is enabled, row wrap is disabled."}, - {PATTERN_DRAGNDROPEDIT, "Drag and Drop Editing", "Enable moving a selection in the pattern editor (copying if pressing shift while dragging)"}, - {PATTERN_FLATBUTTONS, "Flat Buttons", "Use flat buttons in toolbars"}, - {PATTERN_SINGLEEXPAND, "Single click to expand tree", "Single-clicking in the left tree view will expand a node."}, - {PATTERN_MUTECHNMODE, "Ignored muted channels", "Notes will not be played on muted channels (unmuting will only start on a new note)."}, - {PATTERN_NOEXTRALOUD, "No loud sample preview", "Disable loud playback of samples in the sample/instrument editor. Sample volume depends on the sample volume slider on the general tab when activated (if disabled, samples are previewed at 0 dB)."}, - {PATTERN_SHOWPREVIOUS, "Show Prev/Next patterns", "Displays grayed-out version of the previous/next patterns in the pattern editor. Does not work if \"always center active row\" is disabled."}, - {PATTERN_CONTSCROLL, "Continuous scroll", "Jumps to the next pattern when moving past the end of a pattern"}, - {PATTERN_KBDNOTEOFF, "Record note off", "Record note off when a key is released on the PC keyboard."}, - {PATTERN_FOLLOWSONGOFF, "Follow Song off by default", "Ensure Follow Song is off when opening or starting a new song."}, - {PATTERN_NOFOLLOWONCLICK,"Disable Follow Song on click", "Follow Song is deactivated when clicking into the pattern."}, - {PATTERN_OLDCTXMENUSTYLE, "Old style pattern context menu", "Check this option to hide unavailable items in the pattern editor context menu. Uncheck to grey-out unavailable items instead."}, - {PATTERN_SYNCMUTE, "Maintain sample sync on mute", "Samples continue to be processed when channels are muted (like in IT2 and FT2)"}, - {PATTERN_SYNCSAMPLEPOS, "Maintain sample sync on seek", "Sample that are still active from previous patterns are continued to be played after seeking.\nNote: Some pattern commands may prevent samples from being synced. This feature may slow down seeking."}, - {PATTERN_AUTODELAY, "Automatic delay commands", "Automatically insert appropriate note-delay commands when recording notes during live playback."}, - {PATTERN_NOTEFADE, "Note fade on key up", "Enable to fade / stop notes on key up in pattern tab."}, - {PATTERN_OVERFLOWPASTE, "Overflow paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."}, - {PATTERN_RESETCHANNELS, "Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands) and is not recommended to be enabled."}, - {PATTERN_LIVEUPDATETREE,"Update sample status in tree", "If enabled, active samples and instruments will be indicated by a different icon in the treeview."}, - {PATTERN_NOCLOSEDIALOG, "Disable modern close dialog", "When closing the main window, a confirmation window is shown for every unsaved document instead of one single window with a list of unsaved documents."}, - {PATTERN_DBLCLICKSELECT, "Double-click to select channel", "Instead of showing the note properties, double-clicking a pattern cell selects the whole channel."}, - {PATTERN_SHOWDEFAULTVOLUME, "Show default volume commands", "If there is no volume command next to a note + instrument combination, the sample's default volume is shown."}, + {PatternSetup::PlayNewNotesWhileRecording, "Play new notes while recording", "When this option is enabled, notes entered in the pattern editor will always be played (If not checked, notes won't be played in record mode)."}, + {PatternSetup::PlayRowOnNoteEntry, "Play whole row while recording", "When this option is enabled, all notes on the current row are played when entering notes in the pattern editor."}, + {PatternSetup::PlayRowOnNavigate, "Play whole row when navigating", "When this option is enabled, all notes on the current row are played when navigating vertically in the pattern editor."}, + {PatternSetup::PreviewNoteTransposition, "Play notes when transposing", "When transposing a single note, the new note is previewed."}, + {PatternSetup::CenterActiveRow, "Always center active row", "Turn on this option to have the active row always centered in the pattern editor."}, + {PatternSetup::SmoothScrolling, "Smooth pattern scrolling", "Scroll patterns tick by tick rather than row by row at the expense of an increased CPU load."}, + {PatternSetup::RowAndOrderNumbersHex, "Display rows / orders in hex", "With this option enabled, row numbers and sequence numbers will be displayed in hexadecimal."}, + {PatternSetup::CursorWrap, "Cursor wrap in pattern editor", "When this option is active, going past the end of a pattern row or channel will move the cursor to the beginning. When \"Continuous scroll\"-option is enabled, row wrap is disabled."}, + {PatternSetup::DragNDropEdit, "Drag and Drop Editing", "Enable moving a selection in the pattern editor (copying if pressing shift while dragging)"}, + {PatternSetup::FlatToolbarButtons, "Flat Buttons", "Use flat buttons in toolbars"}, + {PatternSetup::SingleClickToExpand, "Single click to expand tree", "Single-clicking in the left tree view will expand a node."}, + {PatternSetup::IgnoreMutedChannels, "Ignored muted channels", "Notes will not be played on muted channels (unmuting will only start on a new note)."}, + {PatternSetup::NoLoudSamplePreview, "No loud sample preview", "Disable loud playback of samples in the sample/instrument editor. Sample volume depends on the sample volume slider on the general tab when activated (if disabled, samples are previewed at 0 dB)."}, + {PatternSetup::ShowPrevNextPattern, "Show Prev/Next patterns", "Displays grayed-out version of the previous/next patterns in the pattern editor. Does not work if \"always center active row\" is disabled."}, + {PatternSetup::ContinuousScrolling, "Continuous scroll", "Jumps to the next pattern when moving past the end of a pattern"}, + {PatternSetup::RecordNoteOff, "Record note off", "Record note off when a key is released on the PC keyboard."}, + {PatternSetup::FollowSongOffByDefault, "Follow Song off by default", "Ensure Follow Song is off when opening or starting a new song."}, + {PatternSetup::DisableFollowOnClick, "Disable Follow Song on click", "Follow Song is deactivated when clicking into the pattern."}, + {PatternSetup::HideUnavailableMenuEntries, "Old style pattern context menu", "Check this option to hide unavailable items in the pattern editor context menu. Uncheck to grey-out unavailable items instead."}, + {PatternSetup::SyncMute, "Maintain sample sync on mute", "Samples continue to be processed when channels are muted (like in IT2 and FT2)"}, + {PatternSetup::SampleSyncOnSeek, "Maintain sample sync on seek", "Sample that are still active from previous patterns are continued to be played after seeking.\nNote: Some pattern commands may prevent samples from being synced. This feature may slow down seeking."}, + {PatternSetup::AutoDelayCommands, "Automatic delay commands", "Automatically insert appropriate note-delay commands when recording notes during live playback."}, + {PatternSetup::NoteFadeOnKeyUp, "Note fade on key up", "Enable to fade / stop notes on key up in pattern tab."}, + {PatternSetup::OverflowPaste, "Overflow paste mode", "Wrap pasted pattern data into next pattern. This is useful for creating echo channels."}, + {PatternSetup::ResetChannelsOnLoop, "Reset channels on loop", "If enabled, channels will be reset to their initial state when song looping is enabled.\nNote: This does not affect manual song loops (i.e. triggered by pattern commands) and is not recommended to be enabled."}, + {PatternSetup::LiveUpdateTreeView, "Update sample status in tree", "If enabled, active samples and instruments will be indicated by a different icon in the treeview."}, + {PatternSetup::NoCustomCloseDialog, "Disable modern close dialog", "When closing the main window, a confirmation window is shown for every unsaved document instead of one single window with a list of unsaved documents."}, + {PatternSetup::DblClickSelectsChannel, "Double-click to select channel", "Instead of showing the note properties, double-clicking a pattern cell selects the whole channel."}, + {PatternSetup::ShowDefaultVolume, "Show default volume commands", "If there is no volume command next to a note + instrument combination, the sample's default volume is shown."}, }; @@ -141,10 +141,11 @@ CheckRadioButton(IDC_RADIO1, IDC_RADIO3, IDC_RADIO1 + TrackerSettings::Instance().defaultNewFileAction); + const FlagSet<PatternSetup> patternSetup = TrackerSettings::Instance().patternSetup; for(const auto &opt : generalOptionsList) { auto idx = m_CheckList.AddString(mpt::ToCString(mpt::Charset::ASCII, opt.name)); - const int check = (TrackerSettings::Instance().m_dwPatternSetup & opt.flag) != 0 ? BST_CHECKED : BST_UNCHECKED; + const int check = patternSetup[opt.flag] ? BST_CHECKED : BST_UNCHECKED; m_CheckList.SetCheck(idx, check); } m_CheckList.SetCurSel(0); @@ -172,13 +173,14 @@ } TrackerSettings::Instance().defaultNewFileAction = action; + FlagSet<PatternSetup> patternSetup = TrackerSettings::Instance().patternSetup; for(int i = 0; i < mpt::saturate_cast<int>(std::size(generalOptionsList)); i++) { const bool check = (m_CheckList.GetCheck(i) != BST_UNCHECKED); - if(check) TrackerSettings::Instance().m_dwPatternSetup |= generalOptionsList[i].flag; - else TrackerSettings::Instance().m_dwPatternSetup &= ~generalOptionsList[i].flag; + patternSetup.set(generalOptionsList[i].flag, check); } + TrackerSettings::Instance().patternSetup = patternSetup; CMainFrame::GetMainFrame()->SetupMiscOptions(); Modified: trunk/OpenMPT/mptrack/Globals.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Globals.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -851,13 +851,13 @@ { if (m_hWnd) { - LONG lStyleOld = GetWindowLong(m_hWnd, GWL_STYLE); - if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FLATBUTTONS) - lStyleOld |= TBSTYLE_FLAT; + LONG style = GetWindowLong(m_hWnd, GWL_STYLE); + if(TrackerSettings::Instance().patternSetup & PatternSetup::FlatToolbarButtons) + style |= TBSTYLE_FLAT; else - lStyleOld &= ~TBSTYLE_FLAT; - lStyleOld |= CCS_NORESIZE | CCS_NOPARENTALIGN | CCS_NODIVIDER | TBSTYLE_TOOLTIPS; - SetWindowLong(m_hWnd, GWL_STYLE, lStyleOld); + style &= ~TBSTYLE_FLAT; + style |= CCS_NORESIZE | CCS_NOPARENTALIGN | CCS_NODIVIDER | TBSTYLE_TOOLTIPS; + SetWindowLong(m_hWnd, GWL_STYLE, style); Invalidate(); } } Modified: trunk/OpenMPT/mptrack/MainFrm.cpp ============================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/MainFrm.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -326,7 +326,8 @@ UpdateColors(); - if(TrackerSettings::Instance().m_dwMidiSetup & MIDISETUP_ENABLE_RECORD_DEFAULT) midiOpenDevice(false); + if(TrackerSettings::Instance().midiSetup & MidiSetup::EnableMidiInOnStartup) + midiOpenDevice(false); #if MPT_COMPILER_MSVC #pragma warning(push) @@ -446,7 +447,7 @@ void CMainFrame::OnClose() { MPT_TRACE_SCOPE(); - if(!(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_NOCLOSEDIALOG)) + if(!(TrackerSettings::Instance().patternSetup & PatternSetup::NoCustomCloseDialog)) { // Show modified documents window CloseMainDialog dlg; @@ -1274,7 +1275,7 @@ void CMainFrame::UpdateAudioParameters(CSoundFile &sndFile, bool reset) { CriticalSection cs; - if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_MUTECHNMODE) + if (TrackerSettings::Instance().patternSetup & PatternSetup::IgnoreMutedChannels) TrackerSettings::Instance().MixerFlags |= SNDMIX_MUTECHNMODE; else TrackerSettings::Instance().MixerFlags &= ~SNDMIX_MUTECHNMODE; @@ -1805,7 +1806,7 @@ m_WaveFile.ResetPlayPos(); const CModDoc *activeDoc = GetActiveDoc(); - if(activeDoc != nullptr && (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_NOEXTRALOUD)) + if(activeDoc != nullptr && (TrackerSettings::Instance().patternSetup & PatternSetup::NoLoudSamplePreview)) { m_WaveFile.SetMixLevels(activeDoc->GetSoundFile().GetMixLevels()); m_WaveFile.m_nSamplePreAmp = activeDoc->GetSoundFile().m_nSamplePreAmp; @@ -1934,7 +1935,8 @@ void CMainFrame::SetupMiscOptions() { - if (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_MUTECHNMODE) + const FlagSet<PatternSetup> patternSetup = TrackerSettings::Instance().patternSetup; + if(patternSetup[PatternSetup::IgnoreMutedChannels]) TrackerSettings::Instance().MixerFlags |= SNDMIX_MUTECHNMODE; else TrackerSettings::Instance().MixerFlags &= ~SNDMIX_MUTECHNMODE; @@ -1943,17 +1945,17 @@ if(GetSoundFilePlaying()) UpdateAudioParameters(*GetSoundFilePlaying()); } - m_wndToolBar.EnableFlatButtons(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FLATBUTTONS); + m_wndToolBar.EnableFlatButtons(patternSetup[PatternSetup::FlatToolbarButtons]); UpdateTree(nullptr, UpdateHint().MPTOptions()); theApp.UpdateAllViews(UpdateHint().MPTOptions()); } -void CMainFrame::SetupMidi(DWORD d, UINT n) +void CMainFrame::SetupMidi(FlagSet<MidiSetup> d, UINT n) { bool deviceChanged = (TrackerSettings::Instance().m_nMidiDevice != n); - TrackerSettings::Instance().m_dwMidiSetup = d; + TrackerSettings::Instance().midiSetup = d; TrackerSettings::Instance().SetMIDIDevice(n); if(deviceChanged && shMidiIn) { @@ -2070,7 +2072,7 @@ #if !defined(NO_REVERB) || !defined(NO_DSP) || !defined(NO_EQ) || !defined(NO_AGC) COptionsPlayer dspdlg; #endif - CMidiSetupDlg mididlg{TrackerSettings::Instance().m_dwMidiSetup, TrackerSettings::Instance().GetCurrentMIDIDevice()}; + CMidiSetupDlg mididlg{TrackerSettings::Instance().midiSetup, TrackerSettings::Instance().GetCurrentMIDIDevice()}; PathConfigDlg pathsdlg; #if defined(MPT_ENABLE_UPDATE) CUpdateSetupDlg updatedlg; Modified: trunk/OpenMPT/mptrack/Mainbar.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mainbar.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Mainbar.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -408,7 +408,7 @@ void CMainToolBar::Init(CMainFrame *pMainFrm) { - EnableFlatButtons(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FLATBUTTONS); + EnableFlatButtons(TrackerSettings::Instance().patternSetup & PatternSetup::FlatToolbarButtons); SetHorizontal(); pMainFrm->DockControlBar(this); } Modified: trunk/OpenMPT/mptrack/Mainfrm.h ============================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Mainfrm.h Wed Jan 1 18:32:24 2025 (r22684) @@ -36,6 +36,7 @@ struct UpdateCheckResult; struct UpdateHint; struct MODPLUGDIB; +enum class MidiSetup: int32; enum class MainToolBarItem : uint8; enum SoundDeviceStopMode : int; namespace SoundDevice { @@ -357,7 +358,7 @@ void SetupMiscOptions(); void SetupPlayer(); - void SetupMidi(DWORD d, UINT n); + void SetupMidi(FlagSet<MidiSetup> d, UINT n); HWND GetFollowSong() const; HWND GetFollowSong(const CModDoc *pDoc) const { return (pDoc == GetModPlaying()) ? GetFollowSong() : nullptr; } void ResetNotificationBuffer(); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Moddoc.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -1032,7 +1032,7 @@ break; } - if((TrackerSettings::Instance().m_dwMidiSetup & MIDISETUP_MIDITOPLUG) && CMainFrame::GetMainFrame()->GetModPlaying() == this && plugin != nullptr) + if((TrackerSettings::Instance().midiSetup & MidiSetup::SendMidiToPlugins) && CMainFrame::GetMainFrame()->GetModPlaying() == this && plugin != nullptr) { plugin->MidiSend(midiData); // Sending midi may modify the plug. For now, if MIDI data is not active sensing or aftertouch messages, set modified. @@ -1128,7 +1128,7 @@ } // Handle extra-loud flag - chn.dwFlags.set(CHN_EXTRALOUD, !(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_NOEXTRALOUD) && params.m_sample); + chn.dwFlags.set(CHN_EXTRALOUD, !(TrackerSettings::Instance().patternSetup & PatternSetup::NoLoudSamplePreview) && params.m_sample); // Handle custom start position if(params.m_sampleOffset > 0 && chn.pModSample) @@ -3009,7 +3009,7 @@ { if(nOrd == ORDERINDEX_INVALID) return; - double t = m_SndFile.GetPlaybackTimeAt(nOrd, nRow, true, setSamplePos && (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_SYNCSAMPLEPOS) != 0); + double t = m_SndFile.GetPlaybackTimeAt(nOrd, nRow, true, setSamplePos && (TrackerSettings::Instance().patternSetup & PatternSetup::SampleSyncOnSeek)); if(t < 0) { // Position is never played regularly, but we may want to continue playing from here nevertheless. Modified: trunk/OpenMPT/mptrack/Mpdlgs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Mpdlgs.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -1743,9 +1743,9 @@ } -CMidiSetupDlg::CMidiSetupDlg(DWORD flags, UINT device) +CMidiSetupDlg::CMidiSetupDlg(FlagSet<MidiSetup> flags, UINT device) : CPropertyPage{IDD_OPTIONS_MIDI} - , m_dwMidiSetup{flags} + , m_midiSetup{flags} , m_nMidiDevice{device} { m_editAmp.SetAccessibleSuffix(_T("%")); @@ -1756,16 +1756,16 @@ { CPropertyPage::OnInitDialog(); // Flags - if (m_dwMidiSetup & MIDISETUP_RECORDVELOCITY) CheckDlgButton(IDC_CHECK1, BST_CHECKED); - if (m_dwMidiSetup & MIDISETUP_RECORDNOTEOFF) CheckDlgButton(IDC_CHECK2, BST_CHECKED); - if (m_dwMidiSetup & MIDISETUP_ENABLE_RECORD_DEFAULT) CheckDlgButton(IDC_CHECK3, BST_CHECKED); - if (m_dwMidiSetup & MIDISETUP_TRANSPOSEKEYBOARD) CheckDlgButton(IDC_CHECK4, BST_CHECKED); - if (m_dwMidiSetup & MIDISETUP_MIDITOPLUG) CheckDlgButton(IDC_MIDI_TO_PLUGIN, BST_CHECKED); - if (m_dwMidiSetup & MIDISETUP_MIDIMACROCONTROL) CheckDlgButton(IDC_MIDI_MACRO_CONTROL, BST_CHECKED); - if (m_dwMidiSetup & MIDISETUP_MIDIVOL_TO_NOTEVOL) CheckDlgButton(IDC_MIDIVOL_TO_NOTEVOL, BST_CHECKED); - if (m_dwMidiSetup & MIDISETUP_RESPONDTOPLAYCONTROLMSGS) CheckDlgButton(IDC_MIDIPLAYCONTROL, BST_CHECKED); - if (m_dwMidiSetup & MIDISETUP_PLAYPATTERNONMIDIIN) CheckDlgButton(IDC_MIDIPLAYPATTERNONMIDIIN, BST_CHECKED); - if (m_dwMidiSetup & MIDISETUP_MIDIMACROPITCHBEND) CheckDlgButton(IDC_CHECK5, BST_CHECKED); + if(m_midiSetup[MidiSetup::RecordVelocity]) CheckDlgButton(IDC_CHECK1, BST_CHECKED); + if(m_midiSetup[MidiSetup::RecordNoteOff]) CheckDlgButton(IDC_CHECK2, BST_CHECKED); + if(m_midiSetup[MidiSetup::EnableMidiInOnStartup]) CheckDlgButton(IDC_CHECK3, BST_CHECKED); + if(m_midiSetup[MidiSetup::TransposeKeyboard]) CheckDlgButton(IDC_CHECK4, BST_CHECKED); + if(m_midiSetup[MidiSetup::SendMidiToPlugins]) CheckDlgButton(IDC_MIDI_TO_PLUGIN, BST_CHECKED); + if(m_midiSetup[MidiSetup::RecordCCsAsMacros]) CheckDlgButton(IDC_MIDI_MACRO_CONTROL, BST_CHECKED); + if(m_midiSetup[MidiSetup::ApplyChannelVolumeToVelocity]) CheckDlgButton(IDC_MIDIVOL_TO_NOTEVOL, BST_CHECKED); + if(m_midiSetup[MidiSetup::RespondToPlayControl]) CheckDlgButton(IDC_MIDIPLAYCONTROL, BST_CHECKED); + if(m_midiSetup[MidiSetup::PlayPatternOnMidiNote]) CheckDlgButton(IDC_MIDIPLAYPATTERNONMIDIIN, BST_CHECKED); + if(m_midiSetup[MidiSetup::RecordPitchBend]) CheckDlgButton(IDC_CHECK5, BST_CHECKED); // Midi In Device RefreshDeviceList(m_nMidiDevice); @@ -1876,21 +1876,22 @@ void CMidiSetupDlg::OnOK() { CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); - m_dwMidiSetup = 0; - m_nMidiDevice = MIDI_MAPPER; - if (IsDlgButtonChecked(IDC_CHECK1)) m_dwMidiSetup |= MIDISETUP_RECORDVELOCITY; - if (IsDlgButtonChecked(IDC_CHECK2)) m_dwMidiSetup |= MIDISETUP_RECORDNOTEOFF; - if (IsDlgButtonChecked(IDC_CHECK3)) m_dwMidiSetup |= MIDISETUP_ENABLE_RECORD_DEFAULT; - if (IsDlgButtonChecked(IDC_CHECK4)) m_dwMidiSetup |= MIDISETUP_TRANSPOSEKEYBOARD; - if (IsDlgButtonChecked(IDC_MIDI_TO_PLUGIN)) m_dwMidiSetup |= MIDISETUP_MIDITOPLUG; - if (IsDlgButtonChecked(IDC_MIDI_MACRO_CONTROL)) m_dwMidiSetup |= MIDISETUP_MIDIMACROCONTROL; - if (IsDlgButtonChecked(IDC_MIDIVOL_TO_NOTEVOL)) m_dwMidiSetup |= MIDISETUP_MIDIVOL_TO_NOTEVOL; - if (IsDlgButtonChecked(IDC_MIDIPLAYCONTROL)) m_dwMidiSetup |= MIDISETUP_RESPONDTOPLAYCONTROLMSGS; - if (IsDlgButtonChecked(IDC_MIDIPLAYPATTERNONMIDIIN)) m_dwMidiSetup |= MIDISETUP_PLAYPATTERNONMIDIIN; - if (IsDlgButtonChecked(IDC_CHECK5)) m_dwMidiSetup |= MIDISETUP_MIDIMACROPITCHBEND; + m_midiSetup.set(MidiSetup::RecordVelocity, IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::RecordNoteOff, IsDlgButtonChecked(IDC_CHECK2) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::EnableMidiInOnStartup, IsDlgButtonChecked(IDC_CHECK3) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::TransposeKeyboard, IsDlgButtonChecked(IDC_CHECK4) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::SendMidiToPlugins, IsDlgButtonChecked(IDC_MIDI_TO_PLUGIN) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::RecordCCsAsMacros, IsDlgButtonChecked(IDC_MIDI_MACRO_CONTROL) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::ApplyChannelVolumeToVelocity, IsDlgButtonChecked(IDC_MIDIVOL_TO_NOTEVOL) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::RespondToPlayControl, IsDlgButtonChecked(IDC_MIDIPLAYCONTROL) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::PlayPatternOnMidiNote, IsDlgButtonChecked(IDC_MIDIPLAYPATTERNONMIDIIN) != BST_UNCHECKED); + m_midiSetup.set(MidiSetup::RecordPitchBend, IsDlgButtonChecked(IDC_CHECK5) != BST_UNCHECKED); int n = m_InputDevice.GetCurSel(); - if (n >= 0) m_nMidiDevice = static_cast<UINT>(m_InputDevice.GetItemData(n)); + if(n >= 0) + m_nMidiDevice = static_cast<UINT>(m_InputDevice.GetItemData(n)); + else + m_nMidiDevice = MIDI_MAPPER; TrackerSettings::Instance().aftertouchBehaviour = static_cast<RecordAftertouchOptions>(m_ATBehaviour.GetItemData(m_ATBehaviour.GetCurSel())); @@ -1910,7 +1911,8 @@ TrackerSettings::Instance().midiImportQuantize = static_cast<uint32>(m_Quantize.GetItemData(m_Quantize.GetCurSel())); } - if (pMainFrm) pMainFrm->SetupMidi(m_dwMidiSetup, m_nMidiDevice); + if(pMainFrm) + pMainFrm->SetupMidi(m_midiSetup, m_nMidiDevice); CPropertyPage::OnOK(); } Modified: trunk/OpenMPT/mptrack/Mpdlgs.h ============================================================================== --- trunk/OpenMPT/mptrack/Mpdlgs.h Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Mpdlgs.h Wed Jan 1 18:32:24 2025 (r22684) @@ -200,11 +200,11 @@ class CMidiSetupDlg: public CPropertyPage { public: - DWORD m_dwMidiSetup; + FlagSet<MidiSetup> m_midiSetup; UINT m_nMidiDevice; public: - CMidiSetupDlg(DWORD flags, UINT device); + CMidiSetupDlg(FlagSet<MidiSetup> flags, UINT device); protected: BOOL OnInitDialog() override; Modified: trunk/OpenMPT/mptrack/Mpt_midi.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mpt_midi.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Mpt_midi.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -36,16 +36,17 @@ int CMainFrame::ApplyVolumeRelatedSettings(const DWORD &dwParam1, uint8 midiChannelVolume) { int nVol = MIDIEvents::GetDataByte2FromEvent(dwParam1); - if(TrackerSettings::Instance().m_dwMidiSetup & MIDISETUP_RECORDVELOCITY) + const FlagSet<MidiSetup> midiSetup = TrackerSettings::Instance().midiSetup; + if(midiSetup[MidiSetup::RecordVelocity]) { - if(!(TrackerSettings::Instance().m_dwMidiSetup & MIDISETUP_MIDIVOL_TO_NOTEVOL)) + if(!midiSetup[MidiSetup::ApplyChannelVolumeToVelocity]) midiChannelVolume = 127; nVol = Util::muldivr_unsigned(CDLSBank::DLSMidiVolumeToLinear(nVol), TrackerSettings::Instance().midiVelocityAmp * midiChannelVolume, 100 * 127 * 256); Limit(nVol, 1, 256); } else { // Case: No velocity record. - if(TrackerSettings::Instance().m_dwMidiSetup & MIDISETUP_MIDIVOL_TO_NOTEVOL) + if(midiSetup[MidiSetup::ApplyChannelVolumeToVelocity]) nVol = (midiChannelVolume + 1) * 2; else //Use default volume nVol = -1; @@ -57,8 +58,9 @@ void ApplyTransposeKeyboardSetting(CMainFrame &rMainFrm, uint32 &dwParam1) { - if ( (TrackerSettings::Instance().m_dwMidiSetup & MIDISETUP_TRANSPOSEKEYBOARD) - && (MIDIEvents::GetChannelFromEvent(dwParam1) != 9) ) + const FlagSet<MidiSetup> midiSetup = TrackerSettings::Instance().midiSetup; + if(midiSetup[MidiSetup::TransposeKeyboard] + && (MIDIEvents::GetChannelFromEvent(dwParam1) != 9)) { int nTranspose = rMainFrm.GetBaseOctave() - 4; if (nTranspose) Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -243,7 +243,7 @@ void CTrackApp::OnFileCloseAll() { - if(!(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_NOCLOSEDIALOG)) + if(!(TrackerSettings::Instance().patternSetup & PatternSetup::NoCustomCloseDialog)) { // Show modified documents window CloseMainDialog dlg; Modified: trunk/OpenMPT/mptrack/PatternClipboard.cpp ============================================================================== --- trunk/OpenMPT/mptrack/PatternClipboard.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/PatternClipboard.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -551,7 +551,7 @@ } const CModSpecifications &sourceSpecs = CSoundFile::GetModSpecifications(pasteFormat); - const bool overflowPaste = (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_OVERFLOWPASTE) && mode != pmPasteFlood && mode != pmPushForward && patternMode != kMultiInsert && curOrder != ORDERINDEX_INVALID; + const bool overflowPaste = (TrackerSettings::Instance().patternSetup & PatternSetup::OverflowPaste) && mode != pmPasteFlood && mode != pmPushForward && patternMode != kMultiInsert && curOrder != ORDERINDEX_INVALID; const bool doITStyleMix = (mode == pmMixPasteIT); const bool doMixPaste = (mode == pmMixPaste) || doITStyleMix; const bool clipboardHasS3MCommands = (pasteFormat & (MOD_TYPE_IT | MOD_TYPE_MPT | MOD_TYPE_S3M)); Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -93,17 +93,6 @@ } -static uint32 GetDefaultPatternSetup() -{ - return PATTERN_PLAYNEWNOTE | PATTERN_EFFECTHILIGHT - | PATTERN_CENTERROW | PATTERN_DRAGNDROPEDIT - | PATTERN_FLATBUTTONS | PATTERN_NOEXTRALOUD | PATTERN_2NDHIGHLIGHT - | PATTERN_STDHIGHLIGHT | PATTERN_SHOWPREVIOUS | PATTERN_CONTSCROLL - | PATTERN_SYNCMUTE | PATTERN_AUTODELAY | PATTERN_NOTEFADE - | PATTERN_SHOWDEFAULTVOLUME | PATTERN_LIVEUPDATETREE | PATTERN_SYNCSAMPLEPOS; -} - - void SampleUndoBufferSize::CalculateSize() { if(sizePercent < 0) @@ -257,7 +246,7 @@ // MIDI Settings , m_nMidiDevice(conf, UL_("MIDI Settings"), UL_("MidiDevice"), 0) , midiDeviceName(conf, UL_("MIDI Settings"), UL_("MidiDeviceName"), _T("")) - , m_dwMidiSetup(conf, UL_("MIDI Settings"), UL_("MidiSetup"), MIDISETUP_RECORDVELOCITY | MIDISETUP_RECORDNOTEOFF | MIDISETUP_TRANSPOSEKEYBOARD | MIDISETUP_MIDITOPLUG) + , midiSetup(conf, UL_("MIDI Settings"), UL_("MidiSetup"), MidiSetup::Default) , aftertouchBehaviour(conf, UL_("MIDI Settings"), UL_("AftertouchBehaviour"), atDoNotRecord) , midiVelocityAmp(conf, UL_("MIDI Settings"), UL_("MidiVelocityAmp"), 100) , midiIgnoreCCs(conf, UL_("MIDI Settings"), UL_("IgnoredCCs"), std::bitset<128>()) @@ -273,7 +262,7 @@ , patternNoEditPopup(conf, UL_("Pattern Editor"), UL_("NoEditPopup"), false) , patternStepCommands(conf, UL_("Pattern Editor"), UL_("EditStepAppliesToCommands"), false) , patternVolColHex(conf, UL_("Pattern Editor"), UL_("VolumeColumnInHex"), false) - , m_dwPatternSetup(conf, UL_("Pattern Editor"), UL_("PatternSetup"), GetDefaultPatternSetup()) + , patternSetup(conf, UL_("Pattern Editor"), UL_("PatternSetup"), PatternSetup::Default) , m_nRowHighlightMeasures(conf, UL_("Pattern Editor"), UL_("RowSpacing"), 16) , m_nRowHighlightBeats(conf, UL_("Pattern Editor"), UL_("RowSpacing2"), 4) , patternIgnoreSongTimeSignature(conf, UL_("Pattern Editor"), UL_("IgnoreSongTimeSignature"), false) @@ -639,59 +628,60 @@ } // MIDI Settings - if((m_dwMidiSetup & 0x40) != 0 && storedVersion < MPT_V("1.20.00.86")) + static constexpr MidiSetup LegacyFlagAmplify2x = static_cast<MidiSetup>(0x40); + if(midiSetup.Get()[LegacyFlagAmplify2x] && storedVersion < MPT_V("1.20.00.86")) { // This flag used to be "amplify MIDI Note Velocity" - with a fixed amplification factor of 2. midiVelocityAmp = 200; - m_dwMidiSetup &= ~0x40; + midiSetup &= ~LegacyFlagAmplify2x; } // Pattern Editor if(storedVersion < MPT_V("1.17.02.50")) { - m_dwPatternSetup |= PATTERN_NOTEFADE; + patternSetup |= PatternSetup::NoteFadeOnKeyUp; } if(storedVersion < MPT_V("1.17.03.01")) { - m_dwPatternSetup |= PATTERN_RESETCHANNELS; + patternSetup |= PatternSetup::ResetChannelsOnLoop; } if(storedVersion < MPT_V("1.19.00.07")) { - m_dwPatternSetup &= ~0x800; // this was previously deprecated and is now used for something else + patternSetup &= ~PatternSetup(0x800); // this was previously deprecated and is now used for something else } if(storedVersion < MPT_V("1.20.00.04")) { - m_dwPatternSetup &= ~0x200000; // ditto + patternSetup &= ~PatternSetup(0x200000); // ditto } if(storedVersion < MPT_V("1.20.00.07")) { - m_dwPatternSetup &= ~0x400000; // ditto + patternSetup &= ~PatternSetup(0x400000); // ditto } if(storedVersion < MPT_V("1.20.00.39")) { - m_dwPatternSetup &= ~0x10000000; // ditto + patternSetup &= ~PatternSetup(0x10000000); // ditto } if(storedVersion < MPT_V("1.24.01.04")) { - commentsFont = FontSetting(UL_("Courier New"), (m_dwPatternSetup & 0x02) ? 120 : 90); - patternFont = FontSetting((m_dwPatternSetup & 0x08) ? PATTERNFONT_SMALL : PATTERNFONT_LARGE, 0); - m_dwPatternSetup &= ~(0x08 | 0x02); + commentsFont = FontSetting(UL_("Courier New"), (patternSetup & PatternSetup(0x02)) ? 120 : 90); + patternFont = FontSetting((patternSetup & PatternSetup(0x08)) ? PATTERNFONT_SMALL : PATTERNFONT_LARGE, 0); + patternSetup &= ~PatternSetup(0x08 | 0x02); } if(storedVersion < MPT_V("1.25.00.08") && glGeneralWindowHeight < 222) { glGeneralWindowHeight += 44; } - if(storedVersion < MPT_V("1.25.00.16") && (m_dwPatternSetup & 0x100000)) + if(storedVersion < MPT_V("1.25.00.16") && (patternSetup & PatternSetup(0x100000))) { // Move MIDI recording to MIDI setup - m_dwPatternSetup &= ~0x100000; - m_dwMidiSetup |= MIDISETUP_ENABLE_RECORD_DEFAULT; + patternSetup &= ~PatternSetup(0x100000); + midiSetup |= MidiSetup::EnableMidiInOnStartup; } if(storedVersion < MPT_V("1.27.00.51")) { // Moving option out of pattern config - CreateBackupFiles = (m_dwPatternSetup & 0x200) != 0; - m_dwPatternSetup &= ~0x200; + CreateBackupFiles = (patternSetup & PatternSetup(0x200)); + patternSetup &= ~PatternSetup(0x200); } // Export Modified: trunk/OpenMPT/mptrack/TrackerSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/TrackerSettings.h Wed Jan 1 18:32:24 2025 (r22684) @@ -98,53 +98,70 @@ // Pattern Setup (contains also non-pattern related settings) // Feel free to replace the deprecated flags by new flags, but be sure to // update TrackerSettings::TrackerSettings() as well. -#define PATTERN_PLAYNEWNOTE 0x01 // play new notes while recording -#define PATTERN_SMOOTHSCROLL 0x02 // scroll tick by tick, not row by row -#define PATTERN_STDHIGHLIGHT 0x04 // enable primary highlight (measures) -#define PATTERN_NOFOLLOWONCLICK 0x08 // disable song follow when clicking into pattern -#define PATTERN_CENTERROW 0x10 // always center active row -#define PATTERN_WRAP 0x20 // wrap around cursor in editor -#define PATTERN_EFFECTHILIGHT 0x40 // effect syntax highlighting -#define PATTERN_HEXDISPLAY 0x80 // display row number in hex -#define PATTERN_FLATBUTTONS 0x100 // flat toolbar buttons -#define PATTERN_PLAYNAVIGATEROW 0x200 // play whole row when navigating -#define PATTERN_SINGLEEXPAND 0x400 // single click to expand tree -#define PATTERN_PLAYEDITROW 0x800 // play all notes on the current row while entering notes -#define PATTERN_NOEXTRALOUD 0x1000 // no loud samples in sample editor -#define PATTERN_DRAGNDROPEDIT 0x2000 // enable drag and drop editing -#define PATTERN_2NDHIGHLIGHT 0x4000 // activate secondary highlight (beats) -#define PATTERN_MUTECHNMODE 0x8000 // ignore muted channels -#define PATTERN_SHOWPREVIOUS 0x10000 // show prev/next patterns -#define PATTERN_CONTSCROLL 0x20000 // continous pattern scrolling -#define PATTERN_KBDNOTEOFF 0x40000 // Record note-off events -#define PATTERN_FOLLOWSONGOFF 0x80000 // follow song off by default -#define PATTERN_PLAYTRANSPOSE 0x100000 // Preview note transposition -#define PATTERN_NOCLOSEDIALOG 0x200000 // Don't use OpenMPT's custom close dialog with a list of saved files when closing the main window -#define PATTERN_DBLCLICKSELECT 0x400000 // Double-clicking pattern selects whole channel -#define PATTERN_OLDCTXMENUSTYLE 0x800000 // Hide pattern context menu entries instead of greying them out. -#define PATTERN_SYNCMUTE 0x1000000 // maintain sample sync on mute -#define PATTERN_AUTODELAY 0x2000000 // automatically insert delay commands in pattern when entering notes -#define PATTERN_NOTEFADE 0x4000000 // alt. note fade behaviour when entering notes -#define PATTERN_OVERFLOWPASTE 0x8000000 // continue paste in the next pattern instead of cutting off -#define PATTERN_SHOWDEFAULTVOLUME 0x10000000 // if there is no volume command next to note+instr, display the sample's default volume. -#define PATTERN_RESETCHANNELS 0x20000000 // reset channels when looping -#define PATTERN_LIVEUPDATETREE 0x40000000 // update active sample / instr icons in treeview -#define PATTERN_SYNCSAMPLEPOS 0x80000000 // sync sample positions when seeking +enum class PatternSetup : uint32 +{ + PlayNewNotesWhileRecording = 0x01, // play new notes while recording + SmoothScrolling = 0x02, // scroll tick by tick, not row by row + HighlightMeasures = 0x04, // enable primary highlight (measures) + DisableFollowOnClick = 0x08, // disable song follow when clicking into pattern + CenterActiveRow = 0x10, // always center active row + CursorWrap = 0x20, // wrap around cursor in editor + EffectHighlight = 0x40, // effect syntax highlighting + RowAndOrderNumbersHex = 0x80, // display row number and order in hex + FlatToolbarButtons = 0x100, // flat toolbar buttons + PlayRowOnNavigate = 0x200, // play whole row when navigating + SingleClickToExpand = 0x400, // single click to expand tree + PlayRowOnNoteEntry = 0x800, // play all notes on the current row while entering notes + NoLoudSamplePreview = 0x1000, // no loud samples in sample editor + DragNDropEdit = 0x2000, // enable drag and drop editing + HighlightBeats = 0x4000, // activate secondary highlight (beats) + IgnoreMutedChannels = 0x8000, // ignore muted channels + ShowPrevNextPattern = 0x10000, // show prev/next patterns + ContinuousScrolling = 0x20000, // continous pattern scrolling + RecordNoteOff = 0x40000, // Record note-off events + FollowSongOffByDefault = 0x80000, // follow song off by default + PreviewNoteTransposition = 0x100000, // Preview note transposition + NoCustomCloseDialog = 0x200000, // Don't use OpenMPT's custom close dialog with a list of saved files when closing the main window + DblClickSelectsChannel = 0x400000, // Double-clicking pattern selects whole channel + HideUnavailableMenuEntries = 0x800000, // Hide pattern context menu entries instead of greying them out. + SyncMute = 0x1000000, // maintain sample sync on mute + AutoDelayCommands = 0x2000000, // automatically insert delay commands in pattern when entering notes + NoteFadeOnKeyUp = 0x4000000, // alt. note fade behaviour when entering notes + OverflowPaste = 0x8000000, // continue paste in the next pattern instead of cutting off + ShowDefaultVolume = 0x10000000, // if there is no volume command next to note+instr, display the sample's default volume. + ResetChannelsOnLoop = 0x20000000, // reset channels when looping + LiveUpdateTreeView = 0x40000000, // update active sample / instr icons in treeview + SampleSyncOnSeek = 0x80000000, // sync sample positions when seeking + + Default = PlayNewNotesWhileRecording | EffectHighlight + | CenterActiveRow | DragNDropEdit + | FlatToolbarButtons | NoLoudSamplePreview | HighlightBeats + | HighlightMeasures | ShowPrevNextPattern | ContinuousScrolling + | SyncMute | AutoDelayCommands | NoteFadeOnKeyUp + | ShowDefaultVolume | LiveUpdateTreeView | SampleSyncOnSeek +}; +DECLARE_FLAGSET(PatternSetup) #define PATTERNFONT_SMALL UL_("@1") #define PATTERNFONT_LARGE UL_("@2") // MIDI Setup -#define MIDISETUP_RECORDVELOCITY 0x01 // Record MIDI velocity -#define MIDISETUP_TRANSPOSEKEYBOARD 0x02 // Apply transpose value to MIDI Notes -#define MIDISETUP_MIDITOPLUG 0x04 // Pass MIDI messages to plugins -#define MIDISETUP_MIDIVOL_TO_NOTEVOL 0x08 // Combine MIDI volume to note velocity -#define MIDISETUP_RECORDNOTEOFF 0x10 // Record MIDI Note Off to pattern -#define MIDISETUP_RESPONDTOPLAYCONTROLMSGS 0x20 // Respond to Restart/Continue/Stop MIDI commands -#define MIDISETUP_MIDIMACROCONTROL 0x80 // Record MIDI controller changes a MIDI macro changes in pattern -#define MIDISETUP_PLAYPATTERNONMIDIIN 0x100 // Play pattern if MIDI Note is received and playback is paused -#define MIDISETUP_ENABLE_RECORD_DEFAULT 0x200 // Enable MIDI recording by default -#define MIDISETUP_MIDIMACROPITCHBEND 0x400 // Record MIDI pitch bend messages a MIDI macro changes in pattern +enum class MidiSetup : int32 +{ + RecordVelocity = 0x01, // Record MIDI velocity + TransposeKeyboard = 0x02, // Apply transpose value to MIDI Notes + SendMidiToPlugins = 0x04, // Pass MIDI messages to plugins + ApplyChannelVolumeToVelocity = 0x08, // Combine MIDI volume to note velocity + RecordNoteOff = 0x10, // Record MIDI Note Off to pattern + RespondToPlayControl = 0x20, // Respond to Restart/Continue/Stop MIDI commands + RecordCCsAsMacros = 0x80, // Record MIDI controller changes a MIDI macro changes in pattern + PlayPatternOnMidiNote = 0x100, // Play pattern if MIDI Note is received and playback is paused + EnableMidiInOnStartup = 0x200, // Enable MIDI recording by default + RecordPitchBend = 0x400, // Record MIDI pitch bend messages a MIDI macro changes in pattern + + Default = RecordVelocity | RecordNoteOff | TransposeKeyboard | SendMidiToPlugins +}; +DECLARE_FLAGSET(MidiSetup) #ifndef NO_EQ @@ -333,6 +350,12 @@ 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 FlagSet<PatternSetup>& val) { return SettingValue(int32(val.GetRaw())); } +template<> inline FlagSet<PatternSetup> FromSettingValue(const SettingValue& val) { return PatternSetup(val.as<int32>()); } + +template<> inline SettingValue ToSettingValue(const FlagSet<MidiSetup> &val) { return SettingValue(int32(val.GetRaw())); } +template<> inline FlagSet<MidiSetup> FromSettingValue(const SettingValue &val) { return MidiSetup(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>()); } @@ -801,7 +824,7 @@ // FIXME: MIDI recording is currently done in its own callback/thread and // accesses settings framework from in there. Work-around the ASSERTs for // now by using cached settings. - CachedSetting<uint32> m_dwMidiSetup; + CachedSetting<FlagSet<MidiSetup>> midiSetup; CachedSetting<RecordAftertouchOptions> aftertouchBehaviour; CachedSetting<uint16> midiVelocityAmp; CachedSetting<std::bitset<128> > midiIgnoreCCs; @@ -820,7 +843,7 @@ CachedSetting<bool> patternNoEditPopup; CachedSetting<bool> patternStepCommands; CachedSetting<bool> patternVolColHex; - CachedSetting<uint32> m_dwPatternSetup; + CachedSetting<FlagSet<PatternSetup>> patternSetup; CachedSetting<uint32> m_nRowHighlightMeasures; // primary (measures) and secondary (beats) highlight CachedSetting<uint32> m_nRowHighlightBeats; // primary (measures) and secondary (beats) highlight CachedSetting<bool> patternIgnoreSongTimeSignature; Modified: trunk/OpenMPT/mptrack/View_ins.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/View_ins.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -1246,6 +1246,7 @@ COLORREF crFc = GetSysColor(COLOR_3DFACE); COLORREF c1, c2; + const bool flat = (TrackerSettings::Instance().patternSetup & PatternSetup::FlatToolbarButtons); if(GetNcButtonRect(nBtn, rect)) { DWORD dwStyle = m_NcButtonState[nBtn]; @@ -1253,7 +1254,7 @@ int xofs = 0, yofs = 0, nImage = 0; c1 = c2 = c3 = c4 = crFc; - if(!(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FLATBUTTONS)) + if(!flat) { c1 = c3 = crHi; c2 = crDk; @@ -1263,13 +1264,13 @@ { c1 = crDk; c2 = crHi; - if(!(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FLATBUTTONS)) + if(!flat) { c4 = crHi; c3 = (dwStyle & NCBTNS_PUSHED) ? RGB(0, 0, 0) : crDk; } xofs = yofs = 1; - } else if((dwStyle & NCBTNS_MOUSEOVER) && (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FLATBUTTONS)) + } else if((dwStyle & NCBTNS_MOUSEOVER) && flat) { c1 = crHi; c2 = crDk; @@ -1305,7 +1306,7 @@ } else { c1 = c2 = crFc; - if(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FLATBUTTONS) + if(flat) { c1 = crDk; c2 = crHi; Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Wed Jan 1 17:19:24 2025 (r22683) +++ trunk/OpenMPT/mptrack/View_pat.cpp Wed Jan 1 18:32:24 2025 (r22684) @@ -281,13 +281,14 @@ if(pSndFile == nullptr || !pSndFile->Patterns.IsValidIndex(m_nPattern) || !m_szCell.cy) return ROWINDEX_INVALID; + const FlagSet<PatternSetup> patternSetup = TrackerSettings::Instance().patternSetup; ROWINDEX numRows = pSndFile->Patterns[m_nPattern].GetNumRows(); if(wrapMode == WrapMode::WrapAround && numRows) { const auto &order = Order(); if(static_cast<int>(row) < 0) { - if(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_CONTSCROLL) + if(patternSetup[PatternSetup::ContinuousScrolling]) { PATTERNINDEX curPattern = m_nPattern; ORDERINDEX curOrder = GetCurrentOrder(); @@ -316,13 +317,13 @@ SetCurrentPattern(curPattern, row); } MPT_ASSERT(numRows == pSndFile->Patterns[m_nPattern].GetNumRows()); - } else if(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_WRAP) + } else if(patternSetup[PatternSetup::CursorWrap]... [truncated message content] |
From: <sv...@op...> - 2025-01-01 16:19:31
|
Author: sagamusix Date: Wed Jan 1 17:19:24 2025 New Revision: 22683 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22683 Log: [Ref] Silence warning. Modified: trunk/OpenMPT/mptrack/DialogBase.cpp Modified: trunk/OpenMPT/mptrack/DialogBase.cpp ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.cpp Wed Jan 1 16:32:09 2025 (r22682) +++ trunk/OpenMPT/mptrack/DialogBase.cpp Wed Jan 1 17:19:24 2025 (r22683) @@ -114,7 +114,7 @@ if(s.IsEmpty()) return FALSE; - if(s.GetLength() < std::size(pTTT->szText)) + if(s.GetLength() < static_cast<int>(std::size(pTTT->szText))) { mpt::String::WriteCStringBuf(pTTT->szText) = s; } else |
From: <sv...@op...> - 2025-01-01 15:32:22
|
Author: sagamusix Date: Wed Jan 1 16:32:09 2025 New Revision: 22682 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22682 Log: [Ref] Reduce duplicated code by moving framework-level tooltip handling to DialogBase class. [Fix] Pattern tab: Channel Manager tooltip didn't show keyboard shortcut if one was assigned, because it was the only button with a control ID < 1000 and thus ran into an ancient code path (that was removed as part of the refacotring) that overrode our custom tooltips. [Imp] Pattern tab: Show toolstips when sequence controls are disabled, and add tooltip to pattern detail level button. Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp trunk/OpenMPT/mptrack/ChannelManagerDlg.h trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/CleanupSong.h trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/Ctrl_gen.h trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_ins.h trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/Ctrl_smp.h trunk/OpenMPT/mptrack/DialogBase.cpp trunk/OpenMPT/mptrack/DialogBase.h trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/Globals.h trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp trunk/OpenMPT/mptrack/MIDIMappingDialog.h trunk/OpenMPT/mptrack/OPLInstrDlg.cpp trunk/OpenMPT/mptrack/OPLInstrDlg.h trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.h trunk/OpenMPT/mptrack/QuickStartDialog.cpp trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp trunk/OpenMPT/mptrack/SampleEditorDialogs.h trunk/OpenMPT/mptrack/TempoSwingDialog.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/mptrack/mptrack.rc Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -50,8 +50,6 @@ ON_COMMAND(IDC_BUTTON8, &CChannelManagerDlg::OnRestore) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CChannelManagerDlg::OnTabSelchange) - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CChannelManagerDlg::OnToolTipText) - END_MESSAGE_MAP() CChannelManagerDlg * CChannelManagerDlg::sharedInstance_ = nullptr; @@ -173,7 +171,6 @@ m_buttonHeight = HighDPISupport::ScalePixels(CM_BT_HEIGHT, m_hWnd); ::ShowWindow(::GetDlgItem(m_hWnd, IDC_BUTTON1), SW_HIDE); - EnableToolTips(); ResetState(true, true, true, true); @@ -202,14 +199,13 @@ } -BOOL CChannelManagerDlg::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *) +CString CChannelManagerDlg::GetToolTipText(UINT id, HWND hwnd) const { - TOOLTIPTEXT *pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); - if((pTTT->uFlags & TTF_IDISHWND) || !m_ModDoc || pNMHDR->idFrom >= m_states.size()) - return FALSE; - CString text; - const CHANNELINDEX chn = m_states[pNMHDR->idFrom].sourceChn; + if(hwnd || !m_ModDoc || id >= m_states.size()) + return text; + + const CHANNELINDEX chn = m_states[id].sourceChn; const auto &chnSettings = m_ModDoc->GetSoundFile().ChnSettings[chn]; if(!chnSettings.szName.empty()) text = MPT_CFORMAT("{}: {}")(chn + 1, mpt::ToWin(m_ModDoc->GetSoundFile().GetCharsetInternal(), chnSettings.szName)); @@ -233,15 +229,14 @@ text += chnSettings.dwFlags[CHN_NOFX] ? _T(" (Plugins Bypassed)") : _T(" (Plugins Enabled)"); break; case kReorderRemove: - if(m_states[pNMHDR->idFrom].removed) + if(m_states[id].removed) text += _T(" (Marked for Removal)"); break; case kNumTabs: MPT_ASSERT_NOTREACHED(); break; } - mpt::String::WriteCStringBuf(pTTT->szText) = text; - return TRUE; + return text; } Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.h ============================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.h Wed Jan 1 16:32:09 2025 (r22682) @@ -100,9 +100,9 @@ BOOL OnInitDialog() override; void OnDPIChanged() override; INT_PTR OnToolHitTest(CPoint point, TOOLINFO *pTI) const override; + CString GetToolTipText(UINT id, HWND hwnd) const override; //}}AFX_VIRTUAL //{{AFX_MSG(CChannelManagerDlg) - afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *); afx_msg void OnApply(); afx_msg void OnClose(); afx_msg void OnSelectAll(); Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp ============================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -100,8 +100,6 @@ ON_COMMAND(IDC_CHK_REMOVE_PLUGINS, &CModCleanupDlg::OnVerifyMutualExclusive) ON_COMMAND(IDC_CHK_RESET_VARIABLES, &CModCleanupDlg::OnVerifyMutualExclusive) ON_COMMAND(IDC_CHK_UNUSED_CHANNELS, &CModCleanupDlg::OnVerifyMutualExclusive) - - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CModCleanupDlg::OnToolTipNotify) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -127,7 +125,6 @@ GetDlgItem(m_CleanupIDtoDlgID[kCleanupInstruments])->EnableWindow((sndFile.GetNumInstruments() > 0) ? TRUE : FALSE); GetDlgItem(m_CleanupIDtoDlgID[kRemoveAllInstruments])->EnableWindow((sndFile.GetNumInstruments() > 0) ? TRUE : FALSE); - EnableToolTips(TRUE); return TRUE; } @@ -266,18 +263,10 @@ } -BOOL CModCleanupDlg::OnToolTipNotify(UINT, NMHDR *pNMHDR, LRESULT *) +CString CModCleanupDlg::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; - if (pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = ::GetDlgCtrlID((HWND)nID); - } - - LPCTSTR lpszText = nullptr; - switch(nID) + LPCTSTR lpszText = _T(""); + switch(id) { // patterns case IDC_CHK_CLEANUP_PATTERNS: @@ -333,12 +322,8 @@ case IDC_CHK_UNUSED_CHANNELS: lpszText = _T("Removes all empty pattern channels."); break; - default: - lpszText = _T(""); - break; } - pTTT->lpszText = const_cast<LPTSTR>(lpszText); - return TRUE; + return lpszText; } Modified: trunk/OpenMPT/mptrack/CleanupSong.h ============================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/CleanupSong.h Wed Jan 1 16:32:09 2025 (r22682) @@ -85,10 +85,9 @@ //{{AFX_VIRTUAL(CModCleanupDlg) BOOL OnInitDialog() override; void OnOK() override; + CString GetToolTipText(UINT id, HWND hwnd) const override; //}}AFX_VIRTUAL - BOOL OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult); - //{{AFX_MSG(CModCleanupDlg) afx_msg void OnPresetCleanupSong(); afx_msg void OnPresetCompoCleanup(); Modified: trunk/OpenMPT/mptrack/Ctrl_gen.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -695,7 +695,7 @@ } -CString CCtrlGeneral::GetToolTipText(UINT uId) +CString CCtrlGeneral::GetToolTipText(UINT uId, HWND) const { CString s; if(uId) Modified: trunk/OpenMPT/mptrack/Ctrl_gen.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_gen.h Wed Jan 1 16:32:09 2025 (r22682) @@ -75,7 +75,7 @@ CRuntimeClass *GetAssociatedViewClass() override; void OnActivatePage(LPARAM) override; void OnDeactivatePage() override; - CString GetToolTipText(UINT uId) override; + CString GetToolTipText(UINT uId, HWND hwnd) const override; //}}AFX_VIRTUAL protected: Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -1758,13 +1758,13 @@ } -CString CCtrlInstruments::GetToolTipText(UINT uId) +CString CCtrlInstruments::GetToolTipText(UINT uId, HWND) const { CString s; if(uId) { CWnd *wnd = GetDlgItem(uId); - bool isEnabled = wnd != nullptr && wnd->IsWindowEnabled() != FALSE; + bool isEnabled = wnd == nullptr || wnd->IsWindowEnabled() != FALSE; if(!isEnabled && !m_sndFile.GetNumInstruments()) { s = _T("Create a new instrument to enable instrument mode."); @@ -1789,7 +1789,7 @@ // Pitch/Tempo lock if(isEnabled) { - const CModSpecifications& specs = m_sndFile.GetModSpecifications(); + const CModSpecifications &specs = m_sndFile.GetModSpecifications(); s = MPT_CFORMAT("Tempo Range: {} - {}")(specs.GetTempoMin().GetInt(), specs.GetTempoMax().GetInt()); } else { @@ -1842,8 +1842,6 @@ return s; if(m_sndFile.m_playBehaviour[kMIDICCBugEmulation]) { - velocityStyle.EnableWindow(FALSE); - m_CbnPluginVolumeHandling.EnableWindow(FALSE); s = _T("To enable, clear Plugin volume command bug emulation flag from Song Properties"); } else { Modified: trunk/OpenMPT/mptrack/Ctrl_ins.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_ins.h Wed Jan 1 16:32:09 2025 (r22682) @@ -147,7 +147,7 @@ void OnDeactivatePage() override; void UpdateView(UpdateHint hint, CObject *pObj = nullptr) override; LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam) override; - CString GetToolTipText(UINT uId) override; + CString GetToolTipText(UINT uId, HWND hwnd) const override; BOOL PreTranslateMessage(MSG* pMsg) override; //}}AFX_VIRTUAL protected: Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -129,7 +129,6 @@ CRect rect, rcOrderList; CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); CModControlDlg::OnInitDialog(); - EnableToolTips(); if(!pMainFrm) return TRUE; @@ -1373,7 +1372,7 @@ } -CString CCtrlPatterns::GetToolTipText(UINT id) +CString CCtrlPatterns::GetToolTipText(UINT id, HWND) const { CString s; CommandID cmd = kcNull; @@ -1400,9 +1399,17 @@ case ID_PATTERN_PROPERTIES: s = _T("Pattern Properties"); cmd = kcShowPatternProperties; break; case ID_PATTERN_EXPAND: s = _T("Expand Pattern"); break; case ID_PATTERN_SHRINK: s = _T("Shrink Pattern"); break; + case ID_PATTERNDETAIL_DROPDOWN: s = _T("Change Pattern Detail Level"); break; case ID_OVERFLOWPASTE: s = _T("Toggle Overflow Paste"); cmd = kcToggleOverflowPaste; break; case IDC_PATTERN_LOOP: s = _T("Toggle Loop Pattern"); cmd = kcChangeLoopStatus; break; case IDC_PATTERN_FOLLOWSONG: s = _T("Toggle Follow Song"); cmd = kcToggleFollowSong; break; + + case IDC_SPIN_SEQNUM: + case IDC_EDIT_SEQNUM: + case IDC_EDIT_SEQUENCE_NAME: + if(!GetDlgItem(id)->IsWindowEnabled()) + s = _T("Multiple sequences are only supported in the MPTM format."); + break; } if(cmd != kcNull) Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h Wed Jan 1 16:32:09 2025 (r22682) @@ -224,7 +224,7 @@ LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam) override; void OnActivatePage(LPARAM) override; void OnDeactivatePage() override; - CString GetToolTipText(UINT id) override; + CString GetToolTipText(UINT id, HWND hwnd) const override; void OnDPIChanged() override; //}}AFX_VIRTUAL protected: Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -533,7 +533,7 @@ } -CString CCtrlSamples::GetToolTipText(UINT uId) +CString CCtrlSamples::GetToolTipText(UINT uId, HWND) const { CString s; if(uId) Modified: trunk/OpenMPT/mptrack/Ctrl_smp.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Ctrl_smp.h Wed Jan 1 16:32:09 2025 (r22682) @@ -97,7 +97,7 @@ void OnDeactivatePage() override; void UpdateView(UpdateHint hint, CObject *pObj = nullptr) override; LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam) override; - CString GetToolTipText(UINT uId) override; + CString GetToolTipText(UINT uId, HWND hwnd) const override; BOOL PreTranslateMessage(MSG* pMsg) override; void OnDPIChanged() override; //}}AFX_VIRTUAL Modified: trunk/OpenMPT/mptrack/DialogBase.cpp ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/DialogBase.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -20,6 +20,7 @@ //{{AFX_MSG_MAP(DialogBase) ON_MESSAGE(WM_DPICHANGED, &DialogBase::OnDPIChanged) ON_MESSAGE(WM_DPICHANGED_AFTERPARENT, &DialogBase::OnDPIChanged) // Dialog inside dialog + ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &DialogBase::OnToolTipText) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -27,6 +28,7 @@ BOOL DialogBase::OnInitDialog() { UpdateDPI(); + EnableToolTips(); return CDialog::OnInitDialog(); } @@ -100,4 +102,34 @@ } +BOOL DialogBase::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +{ + auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); + CString s; + if(pTTT->uFlags & TTF_IDISHWND) + s = GetToolTipText(static_cast<UINT>(::GetDlgCtrlID(reinterpret_cast<HWND>(pNMHDR->idFrom))), reinterpret_cast<HWND>(pNMHDR->idFrom)); + else + s = GetToolTipText(static_cast<UINT>(pNMHDR->idFrom), nullptr); + + if(s.IsEmpty()) + return FALSE; + + if(s.GetLength() < std::size(pTTT->szText)) + { + mpt::String::WriteCStringBuf(pTTT->szText) = s; + } else + { + m_tooltipText = std::move(s); + pTTT->lpszText = const_cast<TCHAR *>(s.GetString()); + } + + *pResult = 0; + + // bring the tooltip window above other popup windows + ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); + + return TRUE; // message was handled +} + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/DialogBase.h ============================================================================== --- trunk/OpenMPT/mptrack/DialogBase.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/DialogBase.h Wed Jan 1 16:32:09 2025 (r22682) @@ -32,11 +32,15 @@ virtual void OnDPIChanged() {} void UpdateDPI(); + virtual CString GetToolTipText(UINT /*id*/, HWND /*hwnd*/) const { return {}; } + afx_msg LRESULT OnDPIChanged(WPARAM, LPARAM); + afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP() private: + CString m_tooltipText; int m_dpi = 0; }; Modified: trunk/OpenMPT/mptrack/Globals.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Globals.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -51,9 +51,7 @@ BEGIN_MESSAGE_MAP(CModControlDlg, DialogBase) //{{AFX_MSG_MAP(CModControlDlg) ON_WM_SIZE() - ON_MESSAGE(WM_MOD_UNLOCKCONTROLS, &CModControlDlg::OnUnlockControls) - ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, &CModControlDlg::OnToolTipText) - ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, &CModControlDlg::OnToolTipText) + ON_MESSAGE(WM_MOD_UNLOCKCONTROLS, &CModControlDlg::OnUnlockControls) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -69,14 +67,6 @@ } -BOOL CModControlDlg::OnInitDialog() -{ - DialogBase::OnInitDialog(); - EnableToolTips(TRUE); - return TRUE; -} - - void CModControlDlg::OnSize(UINT nType, int cx, int cy) { DialogBase::OnSize(nType, cx, cy); @@ -157,44 +147,6 @@ void CModControlDlg::UnlockControls() { PostMessage(WM_MOD_UNLOCKCONTROLS); } -BOOL CModControlDlg::OnToolTipText(UINT /*nID*/, NMHDR *pNMHDR, LRESULT *pResult) -{ - auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); - CString strTipText; - - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(nID))); - } - - if(nID >= 1000 && nID < 65536) - { - strTipText = GetToolTipText(static_cast<UINT>(nID)); - } else - { - // allow top level routing frame to handle the message - if(GetRoutingFrame() != nullptr) - return FALSE; - if(nID != 0) // will be zero on a separator - { - TCHAR szFullText[256] = _T(""); - AfxLoadString(static_cast<UINT>(nID), szFullText, static_cast<UINT>(std::size(szFullText))); - // this is the command id, not the button index - AfxExtractSubString(strTipText, szFullText, 1, _T('\n')); - } - } - mpt::String::WriteCStringBuf(pTTT->szText) = strTipText; - *pResult = 0; - - // bring the tooltip window above other popup windows - ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); - - return TRUE; // message was handled -} - - ///////////////////////////////////////////////////////////////////////////// // CModControlView Modified: trunk/OpenMPT/mptrack/Globals.h ============================================================================== --- trunk/OpenMPT/mptrack/Globals.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/Globals.h Wed Jan 1 16:32:09 2025 (r22682) @@ -86,13 +86,10 @@ virtual LRESULT OnModCtrlMsg(WPARAM wParam, LPARAM lParam); virtual void OnActivatePage(LPARAM) {} virtual void OnDeactivatePage() {} - BOOL OnInitDialog() override; - virtual CString GetToolTipText(UINT) { return {}; } //}}AFX_VIRTUAL //{{AFX_MSG(CModControlDlg) afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg LRESULT OnUnlockControls(WPARAM, LPARAM) { if (m_nLockCount > 0) m_nLockCount--; return 0; } - afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp ============================================================================== --- trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/MIDIMappingDialog.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -72,8 +72,6 @@ ON_MESSAGE(WM_MOD_MIDIMSG, &CMIDIMappingDialog::OnMidiMsg) ON_NOTIFY(UDN_DELTAPOS, IDC_SPINMOVEMAPPING, &CMIDIMappingDialog::OnDeltaposSpinmovemapping) ON_BN_CLICKED(IDC_CHECK_PATRECORD, &CMIDIMappingDialog::OnBnClickedCheckPatRecord) - - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CMIDIMappingDialog::OnToolTipNotify) END_MESSAGE_MAP() @@ -163,7 +161,6 @@ CMainFrame::GetMainFrame()->SetMidiRecordWnd(GetSafeHwnd()); CheckDlgButton(IDC_CHECK_MIDILEARN, BST_CHECKED); - EnableToolTips(TRUE); return TRUE; // return TRUE unless you set the focus to a control } @@ -458,18 +455,10 @@ } -BOOL CMIDIMappingDialog::OnToolTipNotify(UINT, NMHDR * pNMHDR, LRESULT *) +CString CMIDIMappingDialog::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT*)pNMHDR; const TCHAR *text = _T(""); - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = ::GetDlgCtrlID((HWND)nID); - } - - switch(nID) + switch(id) { case IDC_CHECKCAPTURE: text = _T("The event is not passed to any further MIDI mappings or recording facilities."); @@ -497,8 +486,7 @@ break; } - mpt::String::WriteWinBuf(pTTT->szText) = mpt::winstring(text); - return TRUE; + return text; } Modified: trunk/OpenMPT/mptrack/MIDIMappingDialog.h ============================================================================== --- trunk/OpenMPT/mptrack/MIDIMappingDialog.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/MIDIMappingDialog.h Wed Jan 1 16:32:09 2025 (r22682) @@ -61,11 +61,11 @@ BOOL OnInitDialog() override; void DoDataExchange(CDataExchange* pDX) override; // DDX/DDV support + CString GetToolTipText(UINT id, HWND hwnd) const override; DECLARE_MESSAGE_MAP() afx_msg void OnSelectionChanged(NMHDR *pNMHDR = nullptr, LRESULT *pResult = nullptr); - afx_msg BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnBnClickedCheckactive(); afx_msg void OnBnClickedCheckCapture(); Modified: trunk/OpenMPT/mptrack/OPLInstrDlg.cpp ============================================================================== --- trunk/OpenMPT/mptrack/OPLInstrDlg.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/OPLInstrDlg.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -31,7 +31,6 @@ ON_COMMAND(IDC_CHECK9, &OPLInstrDlg::ParamsChanged) ON_CBN_SELCHANGE(IDC_COMBO1, &OPLInstrDlg::ParamsChanged) ON_CBN_SELCHANGE(IDC_COMBO2, &OPLInstrDlg::ParamsChanged) - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &OPLInstrDlg::OnToolTip) END_MESSAGE_MAP() @@ -81,7 +80,6 @@ BOOL OPLInstrDlg::OnInitDialog() { DialogBase::OnInitDialog(); - EnableToolTips(); m_feedback.SetRange(0, 7); for(int op = 0; op < 2; op++) { @@ -234,27 +232,19 @@ } -BOOL OPLInstrDlg::OnToolTip(UINT /*id*/, NMHDR *pNMHDR, LRESULT* /*pResult*/) +CString OPLInstrDlg::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = ::GetDlgCtrlID((HWND)nID); - } - static constexpr const char *feedback[] = {"disabled", "\xCF\x80/16", "\xCF\x80/8", "\xCF\x80/4", "\xCF\x80/2", "\xCF\x80", "2\xCF\x80", "4\xCF\x80"}; static constexpr const TCHAR *ksl[] = {_T("disabled"), _T("1.5 dB / octave"), _T("3 dB / octave"), _T("6 dB / octave")}; - mpt::tstring text; - const CWnd *wnd = GetDlgItem(static_cast<int>(nID)); + CString text; + const CWnd *wnd = GetDlgItem(static_cast<int>(id)); const CSliderCtrl *slider = static_cast<const CSliderCtrl *>(wnd); - switch(nID) + switch(id) { case IDC_SLIDER1: // Feedback - text = mpt::ToWin(mpt::Charset::UTF8, feedback[slider->GetPos() & 7]); + text = mpt::ToCString(mpt::Charset::UTF8, feedback[slider->GetPos() & 7]); break; case IDC_SLIDER2: @@ -264,20 +254,20 @@ case IDC_SLIDER10: case IDC_SLIDER12: // Attack / Decay / Release - text = _T("faster < ") + mpt::tfmt::val(slider->GetPos()) + _T(" > slower"); + text = _T("faster < ") + mpt::cfmt::val(slider->GetPos()) + _T(" > slower"); break; case IDC_SLIDER4: case IDC_SLIDER11: // Sustain Level { const int pos = slider->GetPos(); - text = mpt::tfmt::val((pos == 0) ? -93 : ((-15 + pos) * 3)) + _T(" dB"); + text = mpt::cfmt::val((pos == 0) ? -93 : ((-15 + pos) * 3)) + _T(" dB"); } break; case IDC_SLIDER6: case IDC_SLIDER13: // Volume Level - text = mpt::tfmt::fix((-63 + slider->GetPos()) * 0.75, 2) + _T(" dB"); + text = mpt::cfmt::fix((-63 + slider->GetPos()) * 0.75, 2) + _T(" dB"); break; case IDC_SLIDER7: case IDC_SLIDER14: @@ -290,12 +280,11 @@ if(slider->GetPos() == 0) text = _T("0.5"); else - text = mpt::tfmt::val(slider->GetPos()); + text = mpt::cfmt::val(slider->GetPos()); break; } - mpt::String::WriteWinBuf(pTTT->szText) = text.c_str(); - return TRUE; + return text; } OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/OPLInstrDlg.h ============================================================================== --- trunk/OpenMPT/mptrack/OPLInstrDlg.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/OPLInstrDlg.h Wed Jan 1 16:32:09 2025 (r22682) @@ -41,11 +41,11 @@ void DoDataExchange(CDataExchange *pDX) override; BOOL OnInitDialog() override; BOOL PreTranslateMessage(MSG *pMsg) override; + CString GetToolTipText(UINT id, HWND hwnd) const override; void OnOK() override { } void OnCancel() override { } void OnHScroll(UINT, UINT, CScrollBar *) { ParamsChanged(); } LRESULT OnDragonDropping(WPARAM wParam, LPARAM lParam); - BOOL OnToolTip(UINT id, NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -1299,7 +1299,6 @@ ON_COMMAND(IDC_BUTTON5, &QuickChannelProperties::OnPickPrevColor) ON_COMMAND(IDC_BUTTON6, &QuickChannelProperties::OnPickNextColor) ON_MESSAGE(WM_MOD_KEYCOMMAND, &QuickChannelProperties::OnCustomKeyMsg) - ON_NOTIFY_EX_RANGE(TTN_NEEDTEXT, 0, 0xFFFF, &QuickChannelProperties::OnToolTipText) END_MESSAGE_MAP() @@ -1336,7 +1335,6 @@ if(!m_hWnd) { Create(IDD_CHANNELSETTINGS, nullptr); - EnableToolTips(); m_colorBtn.SubclassDlgItem(IDC_BUTTON4, this); m_colorBtnPrev.SubclassDlgItem(IDC_BUTTON5, this); m_colorBtnNext.SubclassDlgItem(IDC_BUTTON6, this); @@ -1672,19 +1670,11 @@ } -BOOL QuickChannelProperties::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +CString QuickChannelProperties::GetToolTipText(UINT id, HWND) const { - auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); - UINT_PTR id = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - id = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(id))); - } - - mpt::tstring text; + CString text; CommandID cmd = kcNull; - switch (id) + switch(id) { case IDC_EDIT1: case IDC_SLIDER1: @@ -1710,24 +1700,16 @@ text = _T("Take color from next channel"); cmd = kcChnColorFromNext; break; - default: - return FALSE; } if(cmd != kcNull) { auto keyText = CMainFrame::GetInputHandler()->m_activeCommandSet->GetKeyTextFromCommand(cmd, 0); if(!keyText.IsEmpty()) - text += MPT_TFORMAT(" ({})")(keyText); + text += MPT_CFORMAT(" ({})")(keyText); } - mpt::String::WriteWinBuf(pTTT->szText) = text; - *pResult = 0; - - // bring the tooltip window above other popup windows - ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); - - return TRUE; // message was handled + return text; } @@ -1746,8 +1728,6 @@ ON_CBN_SELCHANGE(IDC_COMBO2, &MetronomeSettingsDlg::OnSampleChanged) ON_EN_KILLFOCUS(IDC_EDIT1, &MetronomeSettingsDlg::OnSampleChanged) ON_EN_KILLFOCUS(IDC_EDIT2, &MetronomeSettingsDlg::OnSampleChanged) - - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &MetronomeSettingsDlg::OnToolTipText) END_MESSAGE_MAP() @@ -1791,7 +1771,6 @@ BOOL MetronomeSettingsDlg::OnInitDialog() { DialogBase::OnInitDialog(); - EnableToolTips(); CheckDlgButton(IDC_CHECK1, TrackerSettings::Instance().metronomeEnabled ? BST_CHECKED : BST_UNCHECKED); m_volumeSlider.SetRange(static_cast<int>(-48 / METRONOME_VOLUME_SCALE), 0, TRUE); m_volumeSlider.SetPos(mpt::saturate_round<int>(TrackerSettings::Instance().metronomeVolume / METRONOME_VOLUME_SCALE)); @@ -1907,16 +1886,8 @@ } -BOOL MetronomeSettingsDlg::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +CString MetronomeSettingsDlg::GetToolTipText(UINT id, HWND) const { - auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); - UINT_PTR id = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - id = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(id))); - } - CString s; switch(id) { @@ -1924,17 +1895,9 @@ s = (m_volumeSlider.GetPos() >= 0) ? _T("+") : _T(""); s.AppendFormat(_T("%.2f dB"), m_volumeSlider.GetPos() * METRONOME_VOLUME_SCALE); break; - default: - return FALSE; } - mpt::String::WriteCStringBuf(pTTT->szText) = s; - *pResult = 0; - - // bring the tooltip window above other popup windows - ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); - - return TRUE; // message was handled + return s; } Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.h Wed Jan 1 16:32:09 2025 (r22682) @@ -211,9 +211,9 @@ afx_msg void OnPickPrevColor(); afx_msg void OnPickNextColor(); afx_msg LRESULT OnCustomKeyMsg(WPARAM, LPARAM); - afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); BOOL PreTranslateMessage(MSG *pMsg) override; + CString GetToolTipText(UINT id, HWND hwnd) const override; DECLARE_MESSAGE_MAP(); }; @@ -227,6 +227,7 @@ protected: void DoDataExchange(CDataExchange *pDX) override; BOOL OnInitDialog() override; + CString GetToolTipText(UINT id, HWND hwnd) const override; void SetSampleInfo(const mpt::PathString &path, CComboBox &combo, CEdit &edit, CButton &browseButton); bool GetSampleInfo(Setting<mpt::PathString> &path, CComboBox &combo, CEdit &edit, CButton &browseButton); @@ -237,7 +238,6 @@ afx_msg void OnSampleChanged(); afx_msg void OnBrowseMeasure(); afx_msg void OnBrowseBeat(); - BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); DECLARE_MESSAGE_MAP(); Modified: trunk/OpenMPT/mptrack/QuickStartDialog.cpp ============================================================================== --- trunk/OpenMPT/mptrack/QuickStartDialog.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/QuickStartDialog.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -107,7 +107,6 @@ BOOL QuickStartDlg::OnInitDialog() { ResizableDialog::OnInitDialog(); - EnableToolTips(); OnDPIChanged(); return TRUE; } Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -653,7 +653,6 @@ ON_COMMAND(IDC_RADIO1, &CSampleXFadeDlg::OnLoopTypeChanged) ON_COMMAND(IDC_RADIO2, &CSampleXFadeDlg::OnLoopTypeChanged) ON_EN_CHANGE(IDC_EDIT1, &CSampleXFadeDlg::OnFadeLengthChanged) - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CSampleXFadeDlg::OnToolTipText) END_MESSAGE_MAP() @@ -761,35 +760,23 @@ } -BOOL CSampleXFadeDlg::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +CString CSampleXFadeDlg::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = (UINT_PTR)::GetDlgCtrlID((HWND)nID); - } - switch(nID) + CString s; + switch(id) { case IDC_SLIDER1: { uint32 percent = m_SliderLength.GetPos(); - wsprintf(pTTT->szText, _T("%u.%03u%% of the loop (%u samples)"), percent / 1000, percent % 1000, PercentToSamples(percent)); + s.Format(_T("%u.%03u%% of the loop (%u samples)"), percent / 1000, percent % 1000, PercentToSamples(percent)); } break; case IDC_SLIDER2: - _tcscpy(pTTT->szText, _T("Slide towards constant power for fixing badly looped samples.")); + s = _T("Slide towards constant power for fixing badly looped samples."); break; - default: - return FALSE; } - *pResult = 0; - - // bring the tooltip window above other popup windows - ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, - SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); - return TRUE; + + return s; } Modified: trunk/OpenMPT/mptrack/SampleEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/SampleEditorDialogs.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/SampleEditorDialogs.h Wed Jan 1 16:32:09 2025 (r22682) @@ -200,11 +200,12 @@ void DoDataExchange(CDataExchange* pDX) override; BOOL OnInitDialog() override; void OnOK() override; + CString GetToolTipText(UINT id, HWND hwnd) const; afx_msg void OnLoopTypeChanged(); afx_msg void OnFadeLengthChanged(); afx_msg void OnHScroll(UINT, UINT, CScrollBar *); - afx_msg BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); + DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/TempoSwingDialog.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TempoSwingDialog.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/TempoSwingDialog.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -191,6 +191,7 @@ r->valueSlider.SetTicFreq(SliderResolution / 8); r->valueSlider.SetPageSize(SliderResolution / 8); r->valueSlider.SetPos(1); // Work around https://bugs.winehq.org/show_bug.cgi?id=41909 + SetWindowLongPtr(r->valueSlider, GWLP_USERDATA, i); r->SetValue(m_tempoSwing[i]); rect.MoveToY(rect.top + m.rowHeight); } @@ -215,7 +216,6 @@ windowRect.bottom += displayHeight + m.paddingTop + m.footerHeight; SetWindowPos(nullptr, 0, 0, windowRect.Width(), windowRect.Height(), SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER); - EnableToolTips(); return TRUE; } @@ -465,15 +465,15 @@ BOOL CTempoSwingDlg::SliderContainer::OnToolTipNotify(UINT, NMHDR *pNMHDR, LRESULT *) { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT*)pNMHDR; - for(size_t i = 0; i < m_parent.m_controls.size(); i++) - { - if((HWND)pNMHDR->idFrom == m_parent.m_controls[i]->valueSlider.m_hWnd) - { - int32 val = Util::muldivr(m_parent.m_tempoSwing[i], 100, TempoSwing::Unity) - 100; - wsprintf(pTTT->szText, _T("%s%d"), val > 0 ? _T("+") : _T(""), val); - return TRUE; - } + TOOLTIPTEXT *pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); + if(!(pTTT->uFlags & TTF_IDISHWND)) + return FALSE; + CSliderCtrl *slider = dynamic_cast<CSliderCtrl *>(CWnd::FromHandlePermanent(reinterpret_cast<HWND>(pNMHDR->idFrom))); + if(slider != nullptr) + { + int32 val = Util::muldivr(m_parent.m_tempoSwing[GetWindowLongPtr(*slider, GWLP_USERDATA)], 100, TempoSwing::Unity) - 100; + wsprintf(pTTT->szText, _T("%s%d"), val > 0 ? _T("+") : _T(""), val); + return TRUE; } return FALSE; } Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp Wed Jan 1 16:32:09 2025 (r22682) @@ -45,9 +45,6 @@ ON_COMMAND(IDC_BUTTON1, &CModTypeDlg::OnTempoSwing) ON_COMMAND(IDC_BUTTON2, &CModTypeDlg::OnLegacyPlaybackSettings) ON_COMMAND(IDC_BUTTON3, &CModTypeDlg::OnDefaultBehaviour) - - ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CModTypeDlg::OnToolTipNotify) - //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -120,7 +117,6 @@ UpdateDialog(); m_initialized = true; - EnableToolTips(TRUE); return TRUE; } @@ -485,18 +481,10 @@ } -BOOL CModTypeDlg::OnToolTipNotify(UINT, NMHDR *pNMHDR, LRESULT *) +CString CModTypeDlg::GetToolTipText(UINT id, HWND) const { - TOOLTIPTEXT *pTTT = (TOOLTIPTEXT*)pNMHDR; - UINT_PTR nID = pNMHDR->idFrom; - if(pTTT->uFlags & TTF_IDISHWND) - { - // idFrom is actually the HWND of the tool - nID = ::GetDlgCtrlID((HWND)nID); - } - - mpt::tstring text; - switch(nID) + CString text; + switch(id) { case IDC_CHECK1: text = _T("Note slides always slide the same amount, not depending on the sample frequency."); @@ -535,14 +523,13 @@ { if(i > 0) text += _T(" / "); - text += MPT_TFORMAT("{}%")(Util::muldivr(m_tempoSwing[i], 100, TempoSwing::Unity)); + text += MPT_CFORMAT("{}%")(Util::muldivr(m_tempoSwing[i], 100, TempoSwing::Unity)); } } } } - mpt::String::WriteWinBuf(pTTT->szText) = text; - return TRUE; + return text; } Modified: trunk/OpenMPT/mptrack/dlg_misc.h ============================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/dlg_misc.h Wed Jan 1 16:32:09 2025 (r22682) @@ -59,10 +59,9 @@ BOOL OnInitDialog() override; void OnDPIChanged() override; void OnOK() override; + CString GetToolTipText(UINT id, HWND HWND) const override; //}}AFX_VIRTUAL - BOOL OnToolTipNotify(UINT id, NMHDR* pNMHDR, LRESULT* pResult); - DECLARE_MESSAGE_MAP() }; Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Wed Jan 1 15:15:03 2025 (r22681) +++ trunk/OpenMPT/mptrack/mptrack.rc Wed Jan 1 16:32:09 2025 (r22682) @@ -1524,6 +1524,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | WS_TABSTOP | 0x4d,2,4,382,18 + GROUPBOX "",IDC_STATIC,3,23,381,24 CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",0x0,6,31,11,12 COMBOBOX IDC_COMBO_INSTRUMENT,18,31,132,137,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,156,30,33,13 @@ -1532,17 +1533,16 @@ CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,248,31,11,11 CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,264,33,57,8 CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,324,33,55,8 + GROUPBOX "",IDC_STATIC,390,23,174,24 LTEXT "Pattern Name",IDC_STATIC_PATTERNNAME,396,33,48,8,SS_CENTERIMAGE EDITTEXT IDC_EDIT_PATTERNNAME,450,31,109,12,ES_AUTOHSCROLL + GROUPBOX "",IDC_STATIC_SEQUENCE_NAME_FRAME,390,0,174,24 LTEXT "Sequence",IDC_STATIC_SEQUENCE_NAME,396,10,36,8 EDITTEXT IDC_EDIT_SEQNUM,432,8,28,12,ES_AUTOHSCROLL | ES_NUMBER CONTROL "",IDC_SPIN_SEQNUM,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,450,6,11,11 EDITTEXT IDC_EDIT_SEQUENCE_NAME,462,8,97,12,ES_AUTOHSCROLL PUSHBUTTON "<<",IDC_BUTTON2,3,51,14,15 PUSHBUTTON ">>",IDC_BUTTON1,15,51,14,15 - GROUPBOX "",IDC_STATIC,3,23,381,24 - GROUPBOX "",IDC_STATIC_SEQUENCE_NAME_FRAME,390,0,174,24 - GROUPBOX "",IDC_STATIC,390,23,174,24 END IDD_CONTROL_SAMPLES DIALOGEX 0, 0, 560, 106 |
From: <sv...@op...> - 2025-01-01 14:15:10
|
Author: sagamusix Date: Wed Jan 1 15:15:03 2025 New Revision: 22681 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22681 Log: Merged revision(s) 22680 from trunk/OpenMPT: [Fix] Tree view: ReleaseBuffer was called on the wrong CString object, potentially causing incorrect string comparison results during MIDI library update. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/View_tre.cpp Modified: branches/OpenMPT-1.31/mptrack/View_tre.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/View_tre.cpp Wed Jan 1 15:13:27 2025 (r22680) +++ branches/OpenMPT-1.31/mptrack/View_tre.cpp Wed Jan 1 15:15:03 2025 (r22681) @@ -520,31 +520,31 @@ HTREEITEM parent = GetChildItem(m_hMidiLib); for(UINT iMidi = 0; iMidi < 128; iMidi++) { - DWORD dwImage = IMAGE_INSTRMUTE; + int image = IMAGE_INSTRMUTE; s = mpt::cfmt::val(iMidi) + _T(": ") + mpt::ToCString(mpt::Charset::ASCII, szMidiProgramNames[iMidi]); const LPARAM param = (MODITEM_MIDIINSTRUMENT << MIDILIB_SHIFT) | iMidi; if(!midiLib[iMidi].empty()) { s += _T(": ") + midiLib[iMidi].GetFilename().ToCString(); - dwImage = IMAGE_INSTRUMENTS; + image = IMAGE_INSTRUMENTS; } if(!m_tiMidi[iMidi]) { m_tiMidi[iMidi] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param, parent, TVI_LAST); + s, image, image, 0, 0, param, parent, TVI_LAST); } else { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.hItem = m_tiMidi[iMidi]; tvi.pszText = stmp.GetBuffer(s.GetLength() + 1); tvi.cchTextMax = stmp.GetAllocLength(); - tvi.iImage = tvi.iSelectedImage = dwImage; + tvi.iImage = tvi.iSelectedImage = image; GetItem(&tvi); - s.ReleaseBuffer(); - if(s != stmp || tvi.iImage != (int)dwImage) + stmp.ReleaseBuffer(); + if(tvi.iImage != image || s != stmp) { SetItem(m_tiMidi[iMidi], TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param); + s, image, image, 0, 0, param); } } if((iMidi % 8u) == 7u) @@ -555,32 +555,32 @@ // Midi Percussions for(UINT iPerc = 24; iPerc <= 84; iPerc++) { - DWORD dwImage = IMAGE_NOSAMPLE; + int image = IMAGE_NOSAMPLE; s = mpt::ToCString(CSoundFile::GetNoteName((ModCommand::NOTE)(iPerc + NOTE_MIN), CSoundFile::GetDefaultNoteNames())) + _T(": ") + mpt::ToCString(mpt::Charset::ASCII, szMidiPercussionNames[iPerc - 24]); const LPARAM param = (MODITEM_MIDIPERCUSSION << MIDILIB_SHIFT) | iPerc; if(!midiLib[iPerc | 0x80].empty()) { s += _T(": ") + midiLib[iPerc | 0x80].GetFilename().ToCString(); - dwImage = IMAGE_SAMPLES; + image = IMAGE_SAMPLES; } if(!m_tiPerc[iPerc]) { m_tiPerc[iPerc] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param, parent, TVI_LAST); + s, image, image, 0, 0, param, parent, TVI_LAST); } else { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.hItem = m_tiPerc[iPerc]; tvi.pszText = stmp.GetBuffer(s.GetLength() + 1); tvi.cchTextMax = stmp.GetAllocLength(); - tvi.iImage = tvi.iSelectedImage = dwImage; + tvi.iImage = tvi.iSelectedImage = image; GetItem(&tvi); - s.ReleaseBuffer(); - if(s != stmp || tvi.iImage != (int)dwImage) + stmp.ReleaseBuffer(); + if(tvi.iImage != image || s != stmp) { SetItem(m_tiPerc[iPerc], TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, - s, dwImage, dwImage, 0, 0, param); + s, image, image, 0, 0, param); } } } |
From: <sv...@op...> - 2025-01-01 14:13:34
|
Author: sagamusix Date: Wed Jan 1 15:13:27 2025 New Revision: 22680 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22680 Log: [Fix] Tree view: ReleaseBuffer was called on the wrong CString object, potentially causing incorrect string comparison results during MIDI library update. Modified: trunk/OpenMPT/mptrack/View_tre.cpp Modified: trunk/OpenMPT/mptrack/View_tre.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp Wed Jan 1 11:38:42 2025 (r22679) +++ trunk/OpenMPT/mptrack/View_tre.cpp Wed Jan 1 15:13:27 2025 (r22680) @@ -552,8 +552,8 @@ tvi.cchTextMax = stmp.GetAllocLength(); tvi.iImage = tvi.iSelectedImage = image; GetItem(&tvi); - s.ReleaseBuffer(); - if(s != stmp || tvi.iImage != image) + stmp.ReleaseBuffer(); + if(tvi.iImage != image || s != stmp) { SetItem(m_tiMidi[iMidi], TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, s, image, image, 0, 0, param); @@ -567,32 +567,32 @@ // Midi Percussions for(UINT iPerc = 24; iPerc <= 84; iPerc++) { - DWORD dwImage = IMAGE_NOSAMPLE; + int image = IMAGE_NOSAMPLE; s = mpt::ToCString(CSoundFile::GetNoteName((ModCommand::NOTE)(iPerc + NOTE_MIN), CSoundFile::GetDefaultNoteNames())) + _T(": ") + mpt::ToCString(mpt::Charset::ASCII, szMidiPercussionNames[iPerc - 24]); const LPARAM param = (MODITEM_MIDIPERCUSSION << MIDILIB_SHIFT) | iPerc; if(!midiLib[iPerc | 0x80].empty()) { s += _T(": ") + midiLib[iPerc | 0x80].GetFilename().ToCString(); - dwImage = IMAGE_SAMPLES; + image = IMAGE_SAMPLES; } if(!m_tiPerc[iPerc]) { m_tiPerc[iPerc] = InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM, - s, dwImage, dwImage, 0, 0, param, parent, TVI_LAST); + s, image, image, 0, 0, param, parent, TVI_LAST); } else { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.hItem = m_tiPerc[iPerc]; tvi.pszText = stmp.GetBuffer(s.GetLength() + 1); tvi.cchTextMax = stmp.GetAllocLength(); - tvi.iImage = tvi.iSelectedImage = dwImage; + tvi.iImage = tvi.iSelectedImage = image; GetItem(&tvi); - s.ReleaseBuffer(); - if(s != stmp || tvi.iImage != (int)dwImage) + stmp.ReleaseBuffer(); + if(tvi.iImage != image || s != stmp) { SetItem(m_tiPerc[iPerc], TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, - s, dwImage, dwImage, 0, 0, param); + s, image, image, 0, 0, param); } } } |
From: <sv...@op...> - 2025-01-01 10:38:54
|
Author: manx Date: Wed Jan 1 11:38:42 2025 New Revision: 22679 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22679 Log: Merged revision(s) 22678 from trunk/OpenMPT: [Imp] Update Check: Be transparent that we are also transmitting the OpenMPT version as User-Agent string. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/UpdateCheck.cpp Modified: branches/OpenMPT-1.31/mptrack/UpdateCheck.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/UpdateCheck.cpp Wed Jan 1 11:38:18 2025 (r22678) +++ branches/OpenMPT-1.31/mptrack/UpdateCheck.cpp Wed Jan 1 11:38:42 2025 (r22679) @@ -1641,6 +1641,8 @@ statistics += UL_("\n"); { + statistics += U_("User-Agent: ") + Version::Current().GetOpenMPTVersionString() + UL_("\n"); + statistics += UL_("\n"); statistics += U_("GET ") + settings.apiURL + MPT_UFORMAT("update/{}")(GetChannelName(static_cast<UpdateChannel>(settings.channel))) + UL_("\n"); statistics += UL_("\n"); std::vector<mpt::ustring> keyAnchors = TrackerSettings::Instance().UpdateSigningKeysRootAnchors; @@ -1655,6 +1657,8 @@ { statistics += U_("Statistics:") + UL_("\n"); statistics += UL_("\n"); + statistics += U_("User-Agent: ") + Version::Current().GetOpenMPTVersionString() + UL_("\n"); + statistics += UL_("\n"); if(settings.statisticsUUID.IsValid()) { statistics += U_("PUT ") + settings.apiURL + MPT_UFORMAT("statistics/{}")(settings.statisticsUUID) + UL_("\n"); |
From: <sv...@op...> - 2025-01-01 10:38:30
|
Author: manx Date: Wed Jan 1 11:38:18 2025 New Revision: 22678 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22678 Log: [Imp] Update Check: Be transparent that we are also transmitting the OpenMPT version as User-Agent string. Modified: trunk/OpenMPT/mptrack/UpdateCheck.cpp Modified: trunk/OpenMPT/mptrack/UpdateCheck.cpp ============================================================================== --- trunk/OpenMPT/mptrack/UpdateCheck.cpp Wed Jan 1 02:37:29 2025 (r22677) +++ trunk/OpenMPT/mptrack/UpdateCheck.cpp Wed Jan 1 11:38:18 2025 (r22678) @@ -1644,6 +1644,8 @@ statistics += UL_("\n"); { + statistics += U_("User-Agent: ") + Version::Current().GetOpenMPTVersionString() + UL_("\n"); + statistics += UL_("\n"); statistics += U_("GET ") + settings.apiURL + MPT_UFORMAT("update/{}")(GetChannelName(static_cast<UpdateChannel>(settings.channel))) + UL_("\n"); statistics += UL_("\n"); std::vector<mpt::ustring> keyAnchors = TrackerSettings::Instance().UpdateSigningKeysRootAnchors; @@ -1658,6 +1660,8 @@ { statistics += U_("Statistics:") + UL_("\n"); statistics += UL_("\n"); + statistics += U_("User-Agent: ") + Version::Current().GetOpenMPTVersionString() + UL_("\n"); + statistics += UL_("\n"); if(settings.statisticsUUID.IsValid()) { statistics += U_("PUT ") + settings.apiURL + MPT_UFORMAT("statistics/{}")(settings.statisticsUUID) + UL_("\n"); |
From: <sv...@op...> - 2025-01-01 01:37:41
|
Author: sagamusix Date: Wed Jan 1 02:37:29 2025 New Revision: 22677 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22677 Log: Merged revision(s) 22670 from trunk/OpenMPT: [Imp] XM: When tracker ID is "*Converted from FOO-File*", set "made with" version info for Digitrakker accordingly. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/Load_xm.cpp Modified: branches/OpenMPT-1.31/soundlib/Load_xm.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Load_xm.cpp Wed Jan 1 02:32:31 2025 (r22676) +++ branches/OpenMPT-1.31/soundlib/Load_xm.cpp Wed Jan 1 02:37:29 2025 (r22677) @@ -679,9 +679,10 @@ m_playBehaviour.reset(kFT2ST3OffsetOutOfRange); // Fix arpeggios in KAPTENFL.XM m_playBehaviour.reset(kFT2Arpeggio); - } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11)) + } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11) && !memcmp(fileHeader.trackerName + 14, "-File*", 6)) { - madeWith = verDigiTrakker; + madeWith = verDigiTrakker | verConfirmed; + madeWithTracker = UL_("Digitrakker"); } } |
From: <sv...@op...> - 2025-01-01 01:32:44
|
Author: sagamusix Date: Wed Jan 1 02:32:31 2025 New Revision: 22676 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22676 Log: Merged revision(s) 22630-22631 from trunk/OpenMPT: [Fix] Config Dialog: Browsing for a template file used the wrong base path. ........ [Ref] Add CTrackApp::GetUserTemplatesPath and CTrackApp::GetExampleSongsPath. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/GeneralConfigDlg.cpp branches/OpenMPT-1.31/mptrack/MainFrm.cpp branches/OpenMPT-1.31/mptrack/Moddoc.cpp branches/OpenMPT-1.31/mptrack/Mptrack.cpp branches/OpenMPT-1.31/mptrack/Mptrack.h branches/OpenMPT-1.31/mptrack/TrackerSettings.cpp branches/OpenMPT-1.31/mptrack/TrackerSettings.h Modified: branches/OpenMPT-1.31/mptrack/GeneralConfigDlg.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/GeneralConfigDlg.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/GeneralConfigDlg.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -112,7 +112,7 @@ } } - const mpt::PathString basePath = theApp.GetConfigPath() + P_("TemplateModules\\"); + const mpt::PathString basePath = theApp.GetUserTemplatesPath(); FolderScanner scanner(basePath, FolderScanner::kOnlyFiles | FolderScanner::kFindInSubDirectories); mpt::PathString file; while(scanner.Next(file)) @@ -196,7 +196,7 @@ void COptionsGeneral::OnBrowseTemplate() { - mpt::PathString basePath = theApp.GetInstallPath() + P_("TemplateModules\\"); + mpt::PathString basePath = theApp.GetUserTemplatesPath(); mpt::PathString defaultFile = mpt::PathString::FromCString(GetWindowTextString(m_defaultTemplate)); if(defaultFile.empty()) defaultFile = TrackerSettings::Instance().defaultTemplateFile; Modified: branches/OpenMPT-1.31/mptrack/MainFrm.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/MainFrm.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/MainFrm.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -2245,7 +2245,7 @@ { MPT_ASSERT(nId == UINT(isTemplateFile ? ID_FILE_OPENTEMPLATE_LASTINRANGE : ID_EXAMPLE_MODULES_LASTINRANGE)); FileDialog::PathList files; - theApp.OpenModulesDialog(files, isTemplateFile ? theApp.GetConfigPath() + P_("TemplateModules") : theApp.GetInstallPath() + P_("ExampleSongs")); + theApp.OpenModulesDialog(files, isTemplateFile ? theApp.GetUserTemplatesPath() : theApp.GetExampleSongsPath()); for(const auto &file : files) { theApp.OpenDocumentFile(file.ToCString()); Modified: branches/OpenMPT-1.31/mptrack/Moddoc.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/Moddoc.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/Moddoc.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -3114,7 +3114,7 @@ void CModDoc::OnSaveTemplateModule() { // Create template folder if doesn't exist already. - const mpt::PathString templateFolder = TrackerSettings::Instance().PathUserTemplates.GetDefaultDir(); + const mpt::PathString templateFolder = theApp.GetUserTemplatesPath(); if (!mpt::native_fs{}.is_directory(templateFolder)) { if (!CreateDirectory(templateFolder.AsNative().c_str(), nullptr)) Modified: branches/OpenMPT-1.31/mptrack/Mptrack.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/Mptrack.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/Mptrack.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -983,7 +983,7 @@ void CTrackApp::CreatePaths() { - // Create missing diretories + // Create missing directories if(!IsPortableMode()) { if(!mpt::native_fs{}.is_directory(m_ConfigPath)) @@ -1028,7 +1028,18 @@ RemoveDirectory(oldTunings.AsNative().c_str()); } } +} + +mpt::PathString CTrackApp::GetUserTemplatesPath() const +{ + return GetConfigPath() + P_("TemplateModules\\"); +} + + +mpt::PathString CTrackApp::GetExampleSongsPath() const +{ + return GetInstallPath() + P_("ExampleSongs\\"); } @@ -1687,7 +1698,7 @@ if(TrackerSettings::Instance().defaultNewFileAction == nfDefaultTemplate && !templateFile.empty()) { // Template file can be either a filename inside one of the preset and user TemplateModules folders, or a full path. - const mpt::PathString dirs[] = { GetConfigPath() + P_("TemplateModules\\"), GetInstallPath() + P_("TemplateModules\\"), mpt::PathString() }; + const mpt::PathString dirs[] = { GetUserTemplatesPath(), GetInstallPath() + P_("TemplateModules\\"), mpt::PathString() }; for(const auto &dir : dirs) { if(mpt::native_fs{}.is_file(dir + templateFile)) Modified: branches/OpenMPT-1.31/mptrack/Mptrack.h ============================================================================== --- branches/OpenMPT-1.31/mptrack/Mptrack.h Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/Mptrack.h Wed Jan 1 02:32:31 2025 (r22676) @@ -302,6 +302,8 @@ /// Returns path to config folder including trailing '\'. mpt::PathString GetConfigPath() const { return m_ConfigPath; } + mpt::PathString GetUserTemplatesPath() const; + mpt::PathString GetExampleSongsPath() const; void SetupPaths(bool overridePortable); void CreatePaths(); Modified: branches/OpenMPT-1.31/mptrack/TrackerSettings.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/TrackerSettings.cpp Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/TrackerSettings.cpp Wed Jan 1 02:32:31 2025 (r22676) @@ -313,7 +313,6 @@ , PathPluginPresets(conf, U_("Paths"), U_("Plugin_Presets_Directory"), mpt::PathString()) , PathExport(conf, U_("Paths"), U_("Export_Directory"), mpt::PathString()) , PathTunings(theApp.GetConfigPath() + P_("tunings\\")) - , PathUserTemplates(theApp.GetConfigPath() + P_("TemplateModules\\")) // Default template , defaultTemplateFile(conf, U_("Paths"), U_("DefaultTemplate"), mpt::PathString()) , defaultArtist(conf, U_("Misc"), U_("DefaultArtist"), mpt::getenv(U_("USERNAME")).value_or(U_(""))) Modified: branches/OpenMPT-1.31/mptrack/TrackerSettings.h ============================================================================== --- branches/OpenMPT-1.31/mptrack/TrackerSettings.h Wed Jan 1 02:18:59 2025 (r22675) +++ branches/OpenMPT-1.31/mptrack/TrackerSettings.h Wed Jan 1 02:32:31 2025 (r22676) @@ -865,7 +865,6 @@ ConfigurableDirectory PathPluginPresets; ConfigurableDirectory PathExport; DefaultAndWorkingDirectory PathTunings; - DefaultAndWorkingDirectory PathUserTemplates; mpt::PathString m_szKbdFile; // Default template |
From: <sv...@op...> - 2025-01-01 01:19:05
|
Author: sagamusix Date: Wed Jan 1 02:18:59 2025 New Revision: 22675 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22675 Log: Merged revision(s) 22529 from trunk/OpenMPT: [Fix] Reset tempo mode when initializing module. Since only few formats use a tempo mode other than classic, and their loaders don't return false after the tempo mode has been set, this does not make a difference in practice right now. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/Sndfile.cpp Modified: branches/OpenMPT-1.31/soundlib/Sndfile.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Sndfile.cpp Wed Jan 1 02:15:46 2025 (r22674) +++ branches/OpenMPT-1.31/soundlib/Sndfile.cpp Wed Jan 1 02:18:59 2025 (r22675) @@ -212,6 +212,7 @@ m_nResampling = SRCMODE_DEFAULT; m_dwLastSavedWithVersion = Version(0); m_dwCreatedWithVersion = Version(0); + m_nTempoMode = TempoMode::Classic; SetMixLevels(MixLevels::Compatible); |
From: <sv...@op...> - 2025-01-01 01:16:01
|
Author: sagamusix Date: Wed Jan 1 02:15:46 2025 New Revision: 22674 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22674 Log: Merged revision(s) 22479-22480 from trunk/OpenMPT: [Var] Update to unrar 7.1.2. ........ [Ref] UnRAR: Silence Clang warning. ........ Added: branches/OpenMPT-1.31/include/unrar/largepage.cpp - copied unchanged from r22480, trunk/OpenMPT/include/unrar/largepage.cpp branches/OpenMPT-1.31/include/unrar/largepage.hpp - copied unchanged from r22480, trunk/OpenMPT/include/unrar/largepage.hpp branches/OpenMPT-1.31/include/unrar/motw.cpp - copied unchanged from r22480, trunk/OpenMPT/include/unrar/motw.cpp branches/OpenMPT-1.31/include/unrar/motw.hpp - copied unchanged from r22480, trunk/OpenMPT/include/unrar/motw.hpp Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/build/premake/ext-UnRAR.lua branches/OpenMPT-1.31/build/vs2017winxp/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2017winxpansi/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2019win10/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2019win7/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2019win81/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2022win10/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2022win10clang/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2022win7/ext/UnRAR.vcxproj branches/OpenMPT-1.31/build/vs2022win81/ext/UnRAR.vcxproj branches/OpenMPT-1.31/include/unrar/OpenMPT.txt branches/OpenMPT-1.31/include/unrar/arccmt.cpp branches/OpenMPT-1.31/include/unrar/archive.cpp branches/OpenMPT-1.31/include/unrar/archive.hpp branches/OpenMPT-1.31/include/unrar/arcread.cpp branches/OpenMPT-1.31/include/unrar/blake2s.hpp branches/OpenMPT-1.31/include/unrar/cmddata.cpp branches/OpenMPT-1.31/include/unrar/cmddata.hpp branches/OpenMPT-1.31/include/unrar/cmdmix.cpp branches/OpenMPT-1.31/include/unrar/consio.cpp branches/OpenMPT-1.31/include/unrar/consio.hpp branches/OpenMPT-1.31/include/unrar/crypt.hpp branches/OpenMPT-1.31/include/unrar/dll.cpp branches/OpenMPT-1.31/include/unrar/dll.hpp branches/OpenMPT-1.31/include/unrar/errhnd.hpp branches/OpenMPT-1.31/include/unrar/extinfo.hpp branches/OpenMPT-1.31/include/unrar/extract.cpp branches/OpenMPT-1.31/include/unrar/extract.hpp branches/OpenMPT-1.31/include/unrar/filefn.cpp branches/OpenMPT-1.31/include/unrar/filefn.hpp branches/OpenMPT-1.31/include/unrar/hash.cpp branches/OpenMPT-1.31/include/unrar/hash.hpp branches/OpenMPT-1.31/include/unrar/list.cpp branches/OpenMPT-1.31/include/unrar/loclang.hpp branches/OpenMPT-1.31/include/unrar/options.hpp branches/OpenMPT-1.31/include/unrar/os.hpp branches/OpenMPT-1.31/include/unrar/rar.hpp branches/OpenMPT-1.31/include/unrar/rardefs.hpp branches/OpenMPT-1.31/include/unrar/smallfn.cpp branches/OpenMPT-1.31/include/unrar/smallfn.hpp branches/OpenMPT-1.31/include/unrar/system.cpp branches/OpenMPT-1.31/include/unrar/system.hpp branches/OpenMPT-1.31/include/unrar/timefn.hpp branches/OpenMPT-1.31/include/unrar/ui.hpp branches/OpenMPT-1.31/include/unrar/uiconsole.cpp branches/OpenMPT-1.31/include/unrar/unicode.cpp branches/OpenMPT-1.31/include/unrar/unpack.cpp branches/OpenMPT-1.31/include/unrar/unpack.hpp branches/OpenMPT-1.31/include/unrar/version.hpp branches/OpenMPT-1.31/include/unrar/volume.cpp branches/OpenMPT-1.31/include/unrar/win32acl.cpp branches/OpenMPT-1.31/include/unrar/win32stm.cpp Modified: branches/OpenMPT-1.31/build/premake/ext-UnRAR.lua ============================================================================== --- branches/OpenMPT-1.31/build/premake/ext-UnRAR.lua Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/premake/ext-UnRAR.lua Wed Jan 1 02:15:46 2025 (r22674) @@ -38,6 +38,7 @@ "../../include/unrar/hash.cpp", "../../include/unrar/headers.cpp", "../../include/unrar/isnt.cpp", + "../../include/unrar/largepage.cpp", "../../include/unrar/list.cpp", "../../include/unrar/match.cpp", "../../include/unrar/options.cpp", @@ -91,6 +92,7 @@ "../../include/unrar/headers.hpp", "../../include/unrar/headers5.hpp", "../../include/unrar/isnt.hpp", + "../../include/unrar/largepage.hpp", "../../include/unrar/list.hpp", "../../include/unrar/loclang.hpp", "../../include/unrar/log.hpp", Modified: branches/OpenMPT-1.31/build/vs2017winxp/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2017winxp/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2017winxp/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -614,6 +614,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -677,6 +678,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2017winxpansi/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2017winxpansi/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2017winxpansi/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -614,6 +614,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -677,6 +678,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2019win10/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2019win10/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2019win10/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -1211,6 +1211,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -1274,6 +1275,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2019win7/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2019win7/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2019win7/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -623,6 +623,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -686,6 +687,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2019win81/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2019win81/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2019win81/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -623,6 +623,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -686,6 +687,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2022win10/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2022win10/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2022win10/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -1235,6 +1235,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -1298,6 +1299,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2022win10clang/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2022win10clang/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2022win10clang/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -1169,6 +1169,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -1232,6 +1233,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2022win7/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2022win7/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2022win7/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -635,6 +635,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -698,6 +699,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/build/vs2022win81/ext/UnRAR.vcxproj ============================================================================== --- branches/OpenMPT-1.31/build/vs2022win81/ext/UnRAR.vcxproj Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/build/vs2022win81/ext/UnRAR.vcxproj Wed Jan 1 02:15:46 2025 (r22674) @@ -635,6 +635,7 @@ <ClInclude Include="..\..\..\include\unrar\headers.hpp" /> <ClInclude Include="..\..\..\include\unrar\headers5.hpp" /> <ClInclude Include="..\..\..\include\unrar\isnt.hpp" /> + <ClInclude Include="..\..\..\include\unrar\largepage.hpp" /> <ClInclude Include="..\..\..\include\unrar\list.hpp" /> <ClInclude Include="..\..\..\include\unrar\loclang.hpp" /> <ClInclude Include="..\..\..\include\unrar\log.hpp" /> @@ -698,6 +699,7 @@ <ClCompile Include="..\..\..\include\unrar\hash.cpp" /> <ClCompile Include="..\..\..\include\unrar\headers.cpp" /> <ClCompile Include="..\..\..\include\unrar\isnt.cpp" /> + <ClCompile Include="..\..\..\include\unrar\largepage.cpp" /> <ClCompile Include="..\..\..\include\unrar\list.cpp" /> <ClCompile Include="..\..\..\include\unrar\match.cpp" /> <ClCompile Include="..\..\..\include\unrar\options.cpp" /> Modified: branches/OpenMPT-1.31/include/unrar/OpenMPT.txt ============================================================================== --- branches/OpenMPT-1.31/include/unrar/OpenMPT.txt Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/OpenMPT.txt Wed Jan 1 02:15:46 2025 (r22674) @@ -1,4 +1,4 @@ -This folder is based on https://rarlab.com/rar/unrarsrc-7.0.9.tar.gz +This folder is based on https://rarlab.com/rar/unrarsrc-7.1.2.tar.gz All modifications to existing files have been done in a manner so that no existing lines were edited; only new lines were added. @@ -10,9 +10,9 @@ never be used in OpenMPT's context. The following files have been modified: -extract.cpp, filcreat.cpp, file.cpp, filefn.cpp, find.cpp, match.cpp, -os.hpp, pathfn.cpp, rdwrfn.cpp, secpassword.cpp, volume.cpp, -win32acl.cpp, win32lnk.cpp +extract.cpp, filcreat.cpp, file.cpp, filefn.cpp, find.cpp, largepage.hpp, +match.cpp, os.hpp, pathfn.cpp, rardefs.hpp, rdwrfn.cpp, secpassword.cpp, +volume.cpp, win32acl.cpp, win32lnk.cpp For building, premake is used to generate Visual Studio project files. See ../build/premake/ for details. Modified: branches/OpenMPT-1.31/include/unrar/arccmt.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/arccmt.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/arccmt.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -36,7 +36,12 @@ { // Current (RAR 3.0+) version of archive comment. Seek(GetStartPos(),SEEK_SET); - return SearchSubBlock(SUBHEAD_TYPE_CMT)!=0 && ReadCommentData(CmtData); + if (SearchSubBlock(SUBHEAD_TYPE_CMT)!=0) + if (ReadCommentData(CmtData)) + return true; + else + uiMsg(UIERROR_CMTBROKEN,FileName); + return false; } #ifndef SFX_MODULE // Old style (RAR 2.9) comment header embedded into the main Modified: branches/OpenMPT-1.31/include/unrar/archive.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/archive.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/archive.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -67,7 +67,7 @@ // password is incorrect. if (!FailedHeaderDecryption) uiMsg(UIERROR_BADARCHIVE,FileName); - ErrHandler.Exit(RARX_FATAL); + ErrHandler.Exit(RARX_BADARC); } } @@ -109,9 +109,11 @@ // We check the last signature byte, so we can return a sensible // warning in case we'll want to change the archive format // sometimes in the future. +#ifndef SFX_MODULE if (D[6]==0) Type=RARFMT15; else +#endif if (D[6]==1) Type=RARFMT50; else Modified: branches/OpenMPT-1.31/include/unrar/archive.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/archive.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/archive.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -58,7 +58,7 @@ bool ProhibitQOpen; #endif public: - Archive(CommandData *InitCmd=NULL); + Archive(CommandData *InitCmd=nullptr); ~Archive(); static RARFORMAT IsSignature(const byte *D,size_t Size); bool IsArchive(bool EnableBroken); @@ -147,6 +147,9 @@ bool NewArchive; std::wstring FirstVolumeName; +#ifdef PROPAGATE_MOTW + MarkOfTheWeb Motw; +#endif }; Modified: branches/OpenMPT-1.31/include/unrar/arcread.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/arcread.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/arcread.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -20,10 +20,10 @@ case RARFMT14: ReadSize=ReadHeader14(); break; -#endif case RARFMT15: ReadSize=ReadHeader15(); break; +#endif case RARFMT50: ReadSize=ReadHeader50(); break; @@ -106,6 +106,9 @@ if (CurBlockPos!=ArcSize || NextBlockPos!=ArcSize) { uiMsg(UIERROR_UNEXPEOF,FileName); + if (CurHeaderType!=HEAD_FILE) + uiMsg(UIERROR_TRUNCSERVICE,FileName,SubHead.FileName); + ErrHandler.SetErrorCode(RARX_WARNING); } } @@ -137,6 +140,7 @@ } +#ifndef SFX_MODULE size_t Archive::ReadHeader15() { RawRead Raw(this); @@ -145,7 +149,7 @@ if (Decrypt) { -#ifdef RAR_NOCRYPT // For rarext.dll and unrar_nocrypt.dll. +#ifdef RAR_NOCRYPT // For rarext.dll, Setup.SFX and unrar_nocrypt.dll. return 0; #else RequestArcPassword(NULL); @@ -545,6 +549,7 @@ return Raw.Size(); } +#endif // #ifndef SFX_MODULE size_t Archive::ReadHeader50() @@ -740,10 +745,15 @@ byte csum[SIZE_PSWCHECK_CSUM]; Raw.GetB(csum,SIZE_PSWCHECK_CSUM); +// Exclude this code for rarext.dll, Setup.SFX and unrar_nocrypt.dll linked +// without sha256. But still set Encrypted=true for rarext.dll here, +// so it can recognize encrypted header archives in archive properties. +#ifndef RAR_NOCRYPT byte Digest[SHA256_DIGEST_SIZE]; sha256_get(CryptHead.PswCheck, SIZE_PSWCHECK, Digest); CryptHead.UsePswCheck=memcmp(csum,Digest,SIZE_PSWCHECK_CSUM)==0; +#endif } Encrypted=true; } @@ -1036,22 +1046,30 @@ FileHeader *hd=(FileHeader *)bb; switch(FieldType) { +#ifndef RAR_NOCRYPT // Except rarext.dll, Setup.SFX and unrar_nocrypt.dll. case FHEXTRA_CRYPT: { FileHeader *hd=(FileHeader *)bb; uint EncVersion=(uint)Raw->GetV(); if (EncVersion>CRYPT_VERSION) + { UnkEncVerMsg(hd->FileName,L"x" + std::to_wstring(EncVersion)); + hd->CryptMethod=CRYPT_UNKNOWN; + } else { uint Flags=(uint)Raw->GetV(); - hd->UsePswCheck=(Flags & FHEXTRA_CRYPT_PSWCHECK)!=0; - hd->UseHashKey=(Flags & FHEXTRA_CRYPT_HASHMAC)!=0; hd->Lg2Count=Raw->Get1(); if (hd->Lg2Count>CRYPT5_KDF_LG2_COUNT_MAX) + { UnkEncVerMsg(hd->FileName,L"xc" + std::to_wstring(hd->Lg2Count)); + hd->CryptMethod=CRYPT_UNKNOWN; + } else { + hd->UsePswCheck=(Flags & FHEXTRA_CRYPT_PSWCHECK)!=0; + hd->UseHashKey=(Flags & FHEXTRA_CRYPT_HASHMAC)!=0; + Raw->GetB(hd->Salt,SIZE_SALT50); Raw->GetB(hd->InitV,SIZE_INITV); if (hd->UsePswCheck) @@ -1085,6 +1103,7 @@ } } break; +#endif case FHEXTRA_HASH: { FileHeader *hd=(FileHeader *)bb; Modified: branches/OpenMPT-1.31/include/unrar/blake2s.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/blake2s.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/blake2s.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -5,12 +5,9 @@ #define BLAKE2_DIGEST_SIZE 32 #define BLAKE2_THREADS_NUMBER 8 -enum blake2s_constant -{ - BLAKE2S_BLOCKBYTES = 64, - BLAKE2S_OUTBYTES = 32 -}; - +// Use constexpr instead of enums for -std=c++20 compatibility. +constexpr size_t BLAKE2S_BLOCKBYTES = 64; +constexpr size_t BLAKE2S_OUTBYTES = 32; // Alignment to 64 improves performance of both SSE and non-SSE versions. // Alignment to n*16 is required for SSE version, so we selected 64. Modified: branches/OpenMPT-1.31/include/unrar/cmddata.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/cmddata.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/cmddata.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -38,6 +38,9 @@ InclArgs.Reset(); ArcNames.Reset(); StoreArgs.Reset(); +#ifdef PROPAGATE_MOTW + MotwList.Reset(); +#endif Password.Clean(); NextVolSizes.clear(); #ifdef RARDLL @@ -189,7 +192,7 @@ #if !defined(SFX_MODULE) void CommandData::ParseEnvVar() { - char *EnvVar=getenv("RAR"); + char *EnvVar=getenv("RARINISWITCHES"); if (EnvVar!=NULL) { std::wstring EnvStr; @@ -293,6 +296,9 @@ void CommandData::ProcessSwitch(const wchar *Switch) { + if (LargePageAlloc::ProcessSwitch(this,Switch)) + return; + switch(toupperw(Switch[0])) { case '@': @@ -619,8 +625,6 @@ } } break; - case 'M': - break; case 'D': { bool SetDictLimit=toupperw(Switch[2])=='X'; @@ -665,33 +669,30 @@ if (toupperw(Switch[2])=='S' && Switch[3]==0) SkipEncrypted=true; break; - case 'S': + case 'L': + if (toupperw(Switch[2])=='P') { - std::wstring StoreNames=(Switch[2]==0 ? DefaultStoreList:Switch+2); - size_t Pos=0; - while (Pos<StoreNames.size()) + UseLargePages=true; + if (!LargePageAlloc::IsPrivilegeAssigned() && LargePageAlloc::AssignConfirmation()) { - if (StoreNames[Pos]=='.') - Pos++; - size_t EndPos=StoreNames.find(';',Pos); - std::wstring Mask=StoreNames.substr(Pos,EndPos==std::wstring::npos ? EndPos:EndPos-Pos); - if (Mask.find_first_of(L"*?.")==std::wstring::npos) - Mask.insert(0,L"*."); - StoreArgs.AddString(Mask); - if (EndPos==std::wstring::npos) - break; - Pos=EndPos+1; + LargePageAlloc::AssignPrivilege(); + + // Quit immediately. We do not want to interrupt the current copy + // archive processing with reboot after assigning privilege. + SetupComplete=true; } } break; + case 'M': + break; + case 'S': + GetBriefMaskList(Switch[2]==0 ? DefaultStoreList:Switch+2,StoreArgs); + break; #ifdef RAR_SMP case 'T': Threads=atoiw(Switch+2); if (Threads>MaxPoolThreads || Threads<1) BadSwitch(Switch); - else - { - } break; #endif default: @@ -752,6 +753,18 @@ } break; #endif +#ifdef PROPAGATE_MOTW + case 'M': + { + MotwAllFields=Switch[2]=='1'; + const wchar *Sep=wcschr(Switch+2,'='); + if (Switch[2]=='-') + MotwList.Reset(); + else + GetBriefMaskList(Sep==nullptr ? L"*":Sep+1,MotwList); + } + break; +#endif #ifdef _WIN_ALL case 'N': if (toupperw(Switch[2])=='I') @@ -1033,6 +1046,11 @@ #ifndef SFX_MODULE const wchar *SingleCharCommands=L"FUADPXETK"; + + // RAR -mlp command is the legitimate way to assign the required privilege. + if (Command.empty() && UseLargePages || SetupComplete) + return; + if (Command[0]!=0 && Command[1]!=0 && wcschr(SingleCharCommands,Command[0])!=NULL || ArcName.empty()) OutHelp(Command.empty() ? RARX_SUCCESS:RARX_USERERROR); // Return 'success' for 'rar' without parameters. @@ -1231,5 +1249,25 @@ } +// Treat the list like rar;zip as *.rar;*.zip for -ms and similar switches. +void CommandData::GetBriefMaskList(const std::wstring &Masks,StringList &Args) +{ + size_t Pos=0; + while (Pos<Masks.size()) + { + if (Masks[Pos]=='.') + Pos++; + size_t EndPos=Masks.find(';',Pos); + std::wstring Mask=Masks.substr(Pos,EndPos==std::wstring::npos ? EndPos:EndPos-Pos); + if (Mask.find_first_of(L"*?.")==std::wstring::npos) + Mask.insert(0,L"*."); + Args.AddString(Mask); + if (EndPos==std::wstring::npos) + break; + Pos=EndPos+1; + } +} + + Modified: branches/OpenMPT-1.31/include/unrar/cmddata.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/cmddata.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/cmddata.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -1,6 +1,12 @@ #ifndef _RAR_CMDDATA_ #define _RAR_CMDDATA_ +#if defined(_WIN_ALL) && !defined(SFX_MODULE) +// In Windows we implement our own command line parser to avoid replacing +// \" by " in standard parser. Such replacing corrupts destination paths +// like "dest path\" in extraction commands. +#define CUSTOM_CMDLINE_PARSER +#endif #define DefaultStoreList L"7z;ace;arj;bz2;cab;gz;jpeg;jpg;lha;lz;lzh;mp3;rar;taz;tbz;tbz2;tgz;txz;xz;z;zip;zipx;zst;tzst" @@ -56,6 +62,8 @@ void ReportWrongSwitches(RARFORMAT Format); #endif + void GetBriefMaskList(const std::wstring &Masks,StringList &Args); + std::wstring Command; std::wstring ArcName; @@ -78,6 +86,9 @@ StringList InclArgs; StringList ArcNames; StringList StoreArgs; +#ifdef PROPAGATE_MOTW + StringList MotwList; // Extensions to assign the mark of the web. +#endif SecPassword Password; Modified: branches/OpenMPT-1.31/include/unrar/cmdmix.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/cmdmix.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/cmdmix.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -63,12 +63,12 @@ MCHelpSwAT,MCHelpSwAC,MCHelpSwAD,MCHelpSwAG,MCHelpSwAI,MCHelpSwAP, MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU,MCHelpSwDH,MCHelpSwEP, MCHelpSwEP3,MCHelpSwEP4,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR, - MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwME,MCHelpSwN,MCHelpSwNa, - MCHelpSwNal,MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOP,MCHelpSwOR, - MCHelpSwOW,MCHelpSwP,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSI, - MCHelpSwSL,MCHelpSwSM,MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO, - MCHelpSwTS,MCHelpSwU,MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX, - MCHelpSwXa,MCHelpSwXal,MCHelpSwY + MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwME,MCHelpSwMLP, + MCHelpSwN,MCHelpSwNa,MCHelpSwNal,MCHelpSwO,MCHelpSwOC,MCHelpSwOL, + MCHelpSwOM,MCHelpSwOP,MCHelpSwOR,MCHelpSwOW,MCHelpSwP,MCHelpSwR, + MCHelpSwRI,MCHelpSwSC,MCHelpSwSI,MCHelpSwSL,MCHelpSwSM,MCHelpSwTA, + MCHelpSwTB,MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU,MCHelpSwVUnr, + MCHelpSwVER,MCHelpSwVP,MCHelpSwX,MCHelpSwXa,MCHelpSwXal,MCHelpSwY #endif }; @@ -80,7 +80,7 @@ #ifndef _WIN_ALL static MSGID Win32Only[]={ MCHelpSwIEML,MCHelpSwVD,MCHelpSwAO,MCHelpSwOS,MCHelpSwIOFF, - MCHelpSwEP2,MCHelpSwOC,MCHelpSwONI,MCHelpSwDR,MCHelpSwRI + MCHelpSwEP2,MCHelpSwMLP,MCHelpSwOC,MCHelpSwONI,MCHelpSwDR,MCHelpSwRI }; bool Found=false; for (uint J=0;J<ASIZE(Win32Only);J++) Modified: branches/OpenMPT-1.31/include/unrar/consio.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/consio.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/consio.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -255,7 +255,7 @@ #ifndef SILENT -bool getwstr(std::wstring &str) +void getwstr(std::wstring &str) { // Print buffered prompt title function before waiting for input. fflush(stderr); @@ -281,8 +281,8 @@ if (ReadSize<=0) { // Looks like stdin is a null device. We can enter to infinite loop - // calling Ask(), so let's better exit. - ErrHandler.Exit(RARX_USERBREAK); + // calling Ask() or set an empty password, so let's better exit. + ErrHandler.ReadError(L"stdin"); } StrA[ReadSize]=0; @@ -297,20 +297,26 @@ else { std::vector<wchar> Buf(MaxRead); // Up to 4 UTF-8 characters per wchar_t. + DWORD SizeToRead=(DWORD)Buf.size()-1; + + // ReadConsole fails in Windows 7 for requested input exceeding 30 KB. + // Not certain about Windows 8, so check for Windows 10 here. + if (WinNT()<=WNT_W10) + SizeToRead=Min(SizeToRead,0x4000); + DWORD ReadSize=0; - if (ReadConsole(GetStdHandle(STD_INPUT_HANDLE),&Buf[0],(DWORD)Buf.size()-1,&ReadSize,NULL)==0) - return false; + if (ReadConsole(GetStdHandle(STD_INPUT_HANDLE),&Buf[0],SizeToRead,&ReadSize,NULL)==0) + ErrHandler.ReadError(L"stdin"); // Unknown user input, safer to abort. Buf[ReadSize]=0; str=Buf.data(); } #else std::vector<wchar> Buf(MaxRead); // Up to 4 UTF-8 characters per wchar_t. if (fgetws(&Buf[0],Buf.size(),stdin)==NULL) - ErrHandler.Exit(RARX_USERBREAK); // Avoid infinite Ask() loop. + ErrHandler.ReadError(L"stdin"); // Avoid infinite Ask() loop. str=Buf.data(); #endif RemoveLF(str); - return true; } #endif @@ -324,22 +330,22 @@ { uiAlarm(UIALARM_QUESTION); - const int MaxItems=10; + const uint MaxItems=10; wchar Item[MaxItems][40]; - int ItemKeyPos[MaxItems],NumItems=0; + uint ItemKeyPos[MaxItems],NumItems=0; - for (const wchar *NextItem=AskStr;NextItem!=NULL;NextItem=wcschr(NextItem+1,'_')) + for (const wchar *NextItem=AskStr;NextItem!=nullptr;NextItem=wcschr(NextItem+1,'_')) { wchar *CurItem=Item[NumItems]; wcsncpyz(CurItem,NextItem+1,ASIZE(Item[0])); wchar *EndItem=wcschr(CurItem,'_'); - if (EndItem!=NULL) + if (EndItem!=nullptr) *EndItem=0; - int KeyPos=0,CurKey; + uint KeyPos=0,CurKey; while ((CurKey=CurItem[KeyPos])!=0) { bool Found=false; - for (int I=0;I<NumItems && !Found;I++) + for (uint I=0;I<NumItems && !Found;I++) if (toupperw(Item[I][ItemKeyPos[I]])==toupperw(CurKey)) Found=true; if (!Found && CurKey!=' ') @@ -350,11 +356,11 @@ NumItems++; } - for (int I=0;I<NumItems;I++) + for (uint I=0;I<NumItems;I++) { eprintf(I==0 ? (NumItems>3 ? L"\n":L" "):L", "); - int KeyPos=ItemKeyPos[I]; - for (int J=0;J<KeyPos;J++) + uint KeyPos=ItemKeyPos[I]; + for (uint J=0;J<KeyPos;J++) eprintf(L"%c",Item[I][J]); eprintf(L"[%c]%ls",Item[I][KeyPos],&Item[I][KeyPos+1]); } @@ -362,7 +368,7 @@ std::wstring Str; getwstr(Str); wchar Ch=toupperw(Str[0]); - for (int I=0;I<NumItems;I++) + for (uint I=0;I<NumItems;I++) if (Ch==Item[I][ItemKeyPos[I]]) return I+1; return 0; Modified: branches/OpenMPT-1.31/include/unrar/consio.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/consio.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/consio.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -16,13 +16,13 @@ inline void eprintf(const wchar *fmt,...) {} inline void Alarm() {} inline int Ask(const wchar *AskStr) {return 0;} - inline bool getwstr(std::wstring &str) {return false;} + inline void getwstr(std::wstring &str) {} #else void mprintf(const wchar *fmt,...); void eprintf(const wchar *fmt,...); void Alarm(); int Ask(const wchar *AskStr); - bool getwstr(std::wstring &str); + void getwstr(std::wstring &str); #endif #endif Modified: branches/OpenMPT-1.31/include/unrar/crypt.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/crypt.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/crypt.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -3,7 +3,8 @@ enum CRYPT_METHOD { - CRYPT_NONE,CRYPT_RAR13,CRYPT_RAR15,CRYPT_RAR20,CRYPT_RAR30,CRYPT_RAR50 + CRYPT_NONE,CRYPT_RAR13,CRYPT_RAR15,CRYPT_RAR20,CRYPT_RAR30,CRYPT_RAR50, + CRYPT_UNKNOWN }; #define SIZE_SALT50 16 Modified: branches/OpenMPT-1.31/include/unrar/dll.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/dll.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/dll.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -16,8 +16,7 @@ HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *r) { - RAROpenArchiveDataEx rx; - memset(&rx,0,sizeof(rx)); + RAROpenArchiveDataEx rx{}; rx.ArcName=r->ArcName; rx.OpenMode=r->OpenMode; rx.CmtBuf=r->CmtBuf; @@ -32,7 +31,7 @@ HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *r) { - DataSet *Data=NULL; + DataSet *Data=nullptr; try { ErrHandler.Clean(); @@ -74,7 +73,7 @@ { r->OpenResult=ERAR_EOPEN; delete Data; - return NULL; + return nullptr; } if (!Data->Arc.IsArchive(true)) { @@ -89,7 +88,7 @@ r->OpenResult=ERAR_BAD_ARCHIVE; } delete Data; - return NULL; + return nullptr; } r->Flags=0; @@ -115,7 +114,7 @@ std::wstring CmtDataW; if (r->CmtBufSize!=0 && Data->Arc.GetComment(CmtDataW)) { - if (r->CmtBufW!=NULL) + if (r->CmtBufW!=nullptr) { // CmtDataW.push_back(0); size_t Size=wcslen(CmtDataW.data())+1; @@ -141,6 +140,18 @@ else r->CmtState=r->CmtSize=0; +#ifdef PROPAGATE_MOTW + if (r->MarkOfTheWeb!=nullptr) + { + Data->Cmd.MotwAllFields=r->MarkOfTheWeb[0]=='1'; + const wchar *Sep=wcschr(r->MarkOfTheWeb,'='); + if (r->MarkOfTheWeb[0]=='-') + Data->Cmd.MotwList.Reset(); + else + Data->Cmd.GetBriefMaskList(Sep==nullptr ? L"*":Sep+1,Data->Cmd.MotwList); + } +#endif + Data->Extract.ExtractArchiveInit(Data->Arc); return (HANDLE)Data; } @@ -494,6 +505,8 @@ return ERAR_BAD_PASSWORD; case RARX_SUCCESS: return ERAR_SUCCESS; // 0. + case RARX_BADARC: + return ERAR_BAD_ARCHIVE; default: return ERAR_UNKNOWN; } Modified: branches/OpenMPT-1.31/include/unrar/dll.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/dll.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/dll.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -157,7 +157,8 @@ LPARAM UserData; unsigned int OpFlags; wchar_t *CmtBufW; - unsigned int Reserved[25]; + wchar_t *MarkOfTheWeb; + unsigned int Reserved[23]; }; enum UNRARCALLBACK_MESSAGES { Modified: branches/OpenMPT-1.31/include/unrar/errhnd.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/errhnd.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/errhnd.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -16,6 +16,7 @@ RARX_NOFILES = 10, RARX_BADPWD = 11, RARX_READ = 12, + RARX_BADARC = 13, RARX_USERBREAK = 255 }; Modified: branches/OpenMPT-1.31/include/unrar/extinfo.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/extinfo.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/extinfo.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -11,10 +11,6 @@ std::wstring GetStreamNameNTFS(Archive &Arc); -#ifdef _WIN_ALL -bool SetPrivilege(LPCTSTR PrivName); -#endif - void SetExtraInfo20(CommandData *Cmd,Archive &Arc,const std::wstring &Name); void SetExtraInfo(CommandData *Cmd,Archive &Arc,const std::wstring &Name); void SetFileHeaderExtra(CommandData *Cmd,Archive &Arc,const std::wstring &Name); Modified: branches/OpenMPT-1.31/include/unrar/extract.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/extract.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/extract.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -25,6 +25,7 @@ #ifdef RAR_SMP Unp->SetThreads(Cmd->Threads); #endif + Unp->AllowLargePages(Cmd->UseLargePages); } @@ -112,6 +113,15 @@ void CmdExtract::ExtractArchiveInit(Archive &Arc) { + if (Cmd->Command[0]=='T' || Cmd->Command[0]=='I') + Cmd->Test=true; + +#ifdef PROPAGATE_MOTW + // Invoke here, so it is also supported by unrar.dll. + if (!Cmd->Test && Cmd->MotwList.ItemsCount()>0) + Arc.Motw.ReadZoneIdStream(Arc.FileName,Cmd->MotwAllFields); +#endif + DataIO.AdjustTotalArcSize(&Arc); FileCount=0; @@ -178,12 +188,18 @@ } #endif - mprintf(St(MNotRAR),ArcName.c_str()); - + bool RarExt=false; #ifndef SFX_MODULE - if (CmpExt(ArcName,L"rar")) + RarExt=CmpExt(ArcName,L"rar"); #endif - ErrHandler.SetErrorCode(RARX_WARNING); + + if (RarExt) + uiMsg(UIERROR_BADARCHIVE,ArcName); // Non-archive .rar file. + else + mprintf(St(MNotRAR),ArcName.c_str()); // Non-archive not .rar file, likely in "rar x *.*". + + if (RarExt) + ErrHandler.SetErrorCode(RARX_BADARC); return EXTRACT_ARC_NEXT; } @@ -254,9 +270,6 @@ ExtractArchiveInit(Arc); - if (Cmd->Command[0]=='T' || Cmd->Command[0]=='I') - Cmd->Test=true; - if (Cmd->Command[0]=='I') { @@ -494,7 +507,7 @@ DestFileName=!Cmd->TempPath.empty() ? Cmd->TempPath:Cmd->ExtrPath; AddEndSlash(DestFileName); DestFileName+=L"__tmp_reference_source_"; - MkTemp(DestFileName); + MkTemp(DestFileName,nullptr); MatchedRef.TmpName=DestFileName; } RefTarget=true; // Need it even for 't' to test the reference source. @@ -555,6 +568,7 @@ return !Arc.Solid; // Can try extracting next file only in non-solid archive. } +#ifndef RAR_NOCRYPT // For rarext.dll, Setup.SFX and unrar_nocrypt.dll. if (Arc.FileHead.Encrypted) { RarCheckPassword CheckPwd; @@ -581,9 +595,9 @@ // Set a password before creating the file, so we can skip creating // in case of wrong password. SecPassword FilePassword=Cmd->Password; - #if defined(_WIN_ALL) && !defined(SFX_MODULE) +#if defined(_WIN_ALL) && !defined(SFX_MODULE) ConvertDosPassword(Arc,FilePassword); - #endif +#endif byte PswCheck[SIZE_PSWCHECK]; bool EncSet=DataIO.SetEncryption(false,Arc.FileHead.CryptMethod, @@ -611,16 +625,16 @@ // Avoid new requests for unrar.dll to prevent the infinite loop // if app always returns the same password. - #ifndef RARDLL +#ifndef RARDLL continue; // Request a password again. - #endif +#endif } - #ifdef RARDLL +#ifdef RARDLL // If we already have ERAR_EOPEN as result of missing volume, // we should not replace it with less precise ERAR_BAD_PASSWORD. if (Cmd->DllError!=ERAR_EOPEN) Cmd->DllError=ERAR_BAD_PASSWORD; - #endif +#endif ErrHandler.SetErrorCode(RARX_BADPWD); ExtrFile=false; } @@ -629,6 +643,7 @@ } else DataIO.SetEncryption(false,CRYPT_NONE,NULL,NULL,NULL,0,NULL,NULL); +#endif // RAR_NOCRYPT // Per file symlink conversion flag. Can be turned off in unrar.dll. bool CurConvertSymlinkPaths=ConvertSymlinkPaths; @@ -690,7 +705,29 @@ // any overwrite prompts. if (!CheckWinLimit(Arc,ArcFileName)) return false; - ExtrFile=ExtrCreateFile(Arc,CurFile); + + // Read+write mode is required to set "Compressed" attribute. + // Other than that prefer the write only mode to avoid + // OpenIndiana NAS problem with SetFileTime and read+write files. +#if defined(_WIN_ALL) && !defined(SFX_MODULE) + bool Compressed=Cmd->SetCompressedAttr && + (Arc.FileHead.FileAttr & FILE_ATTRIBUTE_COMPRESSED)!=0; + bool WriteOnly=!Compressed; +#else + bool WriteOnly=true; +#endif + + ExtrFile=ExtrCreateFile(Arc,CurFile,WriteOnly); + +#if defined(_WIN_ALL) && !defined(SFX_MODULE) + // 2024.03.12: Set early to compress written data immediately. + // For 10 GB text file it was ~1.5x faster than when set after close. + + if (ExtrFile && Compressed) + SetFileCompression(CurFile.GetHandle(),true); + +#endif + } if (!ExtrFile && Arc.Solid) @@ -973,6 +1010,9 @@ if (Preallocated>0 && (BrokenFile || DataIO.CurUnpWrite!=Preallocated)) CurFile.Truncate(); +#ifdef PROPAGATE_MOTW + Arc.Motw.CreateZoneIdStream(DestFileName,Cmd->MotwList); +#endif CurFile.SetOpenFileTime( Cmd->xmtime==EXTTIME_NONE ? NULL:&Arc.FileHead.mtime, @@ -992,9 +1032,6 @@ if (SetAttr) { #if defined(_WIN_ALL) && !defined(SFX_MODULE) - if (Cmd->SetCompressedAttr && - (Arc.FileHead.FileAttr & FILE_ATTRIBUTE_COMPRESSED)!=0) - SetFileCompression(DestFileName,true); if (Cmd->ClearArc) Arc.FileHead.FileAttr&=~FILE_ATTRIBUTE_ARCHIVE; #endif @@ -1416,7 +1453,7 @@ } -bool CmdExtract::ExtrCreateFile(Archive &Arc,File &CurFile) +bool CmdExtract::ExtrCreateFile(Archive &Arc,File &CurFile,bool WriteOnly) { return true; // OPENMPT ADDITION bool Success=true; @@ -1428,9 +1465,7 @@ if ((Command=='E' || Command=='X') && !Cmd->Test) { bool UserReject; - // Specify "write only" mode to avoid OpenIndiana NAS problems - // with SetFileTime and read+write files. - if (!FileCreate(Cmd,&CurFile,DestFileName,&UserReject,Arc.FileHead.UnpSize,&Arc.FileHead.mtime,true)) + if (!FileCreate(Cmd,&CurFile,DestFileName,&UserReject,Arc.FileHead.UnpSize,&Arc.FileHead.mtime,WriteOnly)) { Success=false; if (!UserReject) @@ -1490,10 +1525,16 @@ if (Arc.FileHead.Method==0) WrongVer=false; + // Can't unpack the unknown encryption even for stored files. + if (Arc.FileHead.CryptMethod==CRYPT_UNKNOWN) + WrongVer=true; + if (WrongVer) { ErrHandler.UnknownMethodMsg(Arc.FileName,ArcFileName); - uiMsg(UIERROR_NEWERRAR,Arc.FileName); + // No need to suggest a new version if it is just a broken archive. + if (!Arc.BrokenHeader) + uiMsg(UIERROR_NEWERRAR,Arc.FileName); } return !WrongVer; } Modified: branches/OpenMPT-1.31/include/unrar/extract.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/extract.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/extract.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -37,7 +37,7 @@ void ConvertDosPassword(Archive &Arc,SecPassword &DestPwd); #endif void ExtrCreateDir(Archive &Arc,const std::wstring &ArcFileName); - bool ExtrCreateFile(Archive &Arc,File &CurFile); + bool ExtrCreateFile(Archive &Arc,File &CurFile,bool WriteOnly); bool CheckUnpVer(Archive &Arc,const std::wstring &ArcFileName); #ifndef SFX_MODULE void AnalyzeArchive(const std::wstring &ArcName,bool Volume,bool NewNumbering); Modified: branches/OpenMPT-1.31/include/unrar/filefn.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/filefn.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/filefn.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -132,6 +132,8 @@ } + + bool IsRemovable(const std::wstring &Name) { return false; // OPENMPT ADDITION @@ -330,10 +332,10 @@ } -wchar* MkTemp(wchar *Name,size_t MaxSize) +// Ext is the extension with the leading dot, like L".bat", or nullptr to use +// the default extension. +bool MkTemp(std::wstring &Name,const wchar *Ext) { - size_t Length=wcslen(Name); - RarTime CurTime; CurTime.SetCurrentTime(); @@ -352,47 +354,20 @@ for (uint Attempt=0;;Attempt++) { - uint Ext=Random%50000+Attempt; - wchar RndText[50]; + uint RandomExt=Random%50000+Attempt; + if (Attempt==1000) + return false; + // User asked to specify the single extension for all temporary files, // so it can be added to server ransomware protection exceptions. // He wrote, this protection blocks temporary files when adding - // a file to RAR archive with drag and drop. - swprintf(RndText,ASIZE(RndText),L"%u.%03u.rartemp",PID,Ext); - if (Length+wcslen(RndText)>=MaxSize || Attempt==1000) - return NULL; - wcsncpyz(Name+Length,RndText,MaxSize-Length); - if (!FileExist(Name)) - break; - } - return Name; -} - - -bool MkTemp(std::wstring &Name) -{ - RarTime CurTime; - CurTime.SetCurrentTime(); - - // We cannot use CurTime.GetWin() as is, because its lowest bits can - // have low informational value, like being a zero or few fixed numbers. - uint Random=(uint)(CurTime.GetWin()/100000); - - // Using PID we guarantee that different RAR copies use different temp names - // even if started in exactly the same time. - uint PID=0; -#ifdef _WIN_ALL - PID=(uint)GetCurrentProcessId(); -#elif defined(_UNIX) - PID=(uint)getpid(); -#endif + // a file to RAR archive with drag and drop. So unless a calling code + // requires a specific extension, like .bat file when uninstalling, + // we set the uniform extension here. + if (Ext==nullptr) + Ext=L".rartemp"; - for (uint Attempt=0;;Attempt++) - { - uint Ext=Random%50000+Attempt; - if (Attempt==1000) - return false; - std::wstring NewName=Name + std::to_wstring(PID) + L"." + std::to_wstring(Ext) + L".rartemp"; + std::wstring NewName=Name + std::to_wstring(PID) + L"." + std::to_wstring(RandomExt) + Ext; if (!FileExist(NewName)) { Name=NewName; @@ -559,14 +534,21 @@ hFile=CreateFile(LongName.c_str(),FILE_READ_DATA|FILE_WRITE_DATA, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_SEQUENTIAL_SCAN,NULL); + if (hFile==INVALID_HANDLE_VALUE) + return false; } - if (hFile==INVALID_HANDLE_VALUE) - return false; + bool Success=SetFileCompression(hFile,State); + CloseHandle(hFile); + return Success; +} + + +bool SetFileCompression(HANDLE hFile,bool State) +{ SHORT NewState=State ? COMPRESSION_FORMAT_DEFAULT:COMPRESSION_FORMAT_NONE; DWORD Result; int RetCode=DeviceIoControl(hFile,FSCTL_SET_COMPRESSION,&NewState, sizeof(NewState),NULL,0,&Result,NULL); - CloseHandle(hFile); return RetCode!=0; } Modified: branches/OpenMPT-1.31/include/unrar/filefn.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/filefn.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/filefn.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -6,7 +6,10 @@ MKDIR_CODE MakeDir(const std::wstring &Name,bool SetAttr,uint Attr); bool CreateDir(const std::wstring &Name); bool CreatePath(const std::wstring &Path,bool SkipLastName,bool Silent); + void SetDirTime(const std::wstring &Name,RarTime *ftm,RarTime *ftc,RarTime *fta); + + bool IsRemovable(const std::wstring &Name); #ifndef SFX_MODULE @@ -28,8 +31,7 @@ void PrepareToDelete(const std::wstring &Name); uint GetFileAttr(const std::wstring &Name); bool SetFileAttr(const std::wstring &Name,uint Attr); -wchar* MkTemp(wchar *Name,size_t MaxSize); -bool MkTemp(std::wstring &Name); +bool MkTemp(std::wstring &Name,const wchar *Ext); enum CALCFSUM_FLAGS {CALCFSUM_SHOWTEXT=1,CALCFSUM_SHOWPERCENT=2,CALCFSUM_SHOWPROGRESS=4,CALCFSUM_CURPOS=8}; @@ -41,6 +43,7 @@ #if defined(_WIN_ALL) && !defined(SFX_MODULE) bool SetFileCompression(const std::wstring &Name,bool State); +bool SetFileCompression(HANDLE hFile,bool State); void ResetFileCache(const std::wstring &Name); #endif Modified: branches/OpenMPT-1.31/include/unrar/hash.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/hash.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/hash.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -275,7 +275,9 @@ { HashValue Final; Result(&Final); - if (Key!=NULL) +#ifndef RAR_NOCRYPT + if (Key!=nullptr) ConvertHashToMAC(&Final,Key); +#endif return Final==*CmpValue; } Modified: branches/OpenMPT-1.31/include/unrar/hash.hpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/hash.hpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/hash.hpp Wed Jan 1 02:15:46 2025 (r22674) @@ -13,6 +13,8 @@ bool operator == (const HashValue &cmp) const; // Not actually used now. Const member for same reason as operator == above. + // Can be removed after switching to C++20, which automatically provides "!=" + // if operator == is defined. bool operator != (const HashValue &cmp) const {return !(*this==cmp);} HASH_TYPE Type; Copied: branches/OpenMPT-1.31/include/unrar/largepage.cpp (from r22480, trunk/OpenMPT/include/unrar/largepage.cpp) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ branches/OpenMPT-1.31/include/unrar/largepage.cpp Wed Jan 1 02:15:46 2025 (r22674, copy of r22480, trunk/OpenMPT/include/unrar/largepage.cpp) @@ -0,0 +1,201 @@ +#include "rar.hpp" + +/* +To enable, disable or check Large Memory pages manually: +- open "Local Security Policy" from "Start Menu"; +- open "Lock Pages in Memory" in "Local Policies\User Rights Assignment"; +- add or remove the user and sign out and sign in or restart Windows. +*/ + +#if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(RARDLL) +#define ALLOW_LARGE_PAGES +#endif + +LargePageAlloc::LargePageAlloc() +{ + UseLargePages=false; +#ifdef ALLOW_LARGE_PAGES + PageSize=0; +#endif +} + + +void LargePageAlloc::AllowLargePages(bool Allow) +{ +#ifdef ALLOW_LARGE_PAGES + if (Allow && PageSize==0) + { + HMODULE hKernel=GetModuleHandle(L"kernel32.dll"); + if (hKernel!=nullptr) + { + typedef SIZE_T (*GETLARGEPAGEMINIMUM)(); + GETLARGEPAGEMINIMUM pGetLargePageMinimum=(GETLARGEPAGEMINIMUM)GetProcAddress(hKernel, "GetLargePageMinimum"); + if (pGetLargePageMinimum!=nullptr) + PageSize=pGetLargePageMinimum(); + } + if (PageSize==0 || !SetPrivilege(SE_LOCK_MEMORY_NAME)) + { + UseLargePages=false; + return; + } + } + + UseLargePages=Allow; +#endif +} + + +bool LargePageAlloc::IsPrivilegeAssigned() +{ +#ifdef ALLOW_LARGE_PAGES + return SetPrivilege(SE_LOCK_MEMORY_NAME); +#else + return true; +#endif +} + + +bool LargePageAlloc::AssignPrivilege() +{ +#ifdef ALLOW_LARGE_PAGES + HANDLE hToken = NULL; + + if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) + return false; + + // Get the required buffer size. + DWORD BufSize=0; + GetTokenInformation(hToken, TokenUser, NULL, 0, &BufSize); + if (BufSize==0 || BufSize>1000000) // Sanity check for returned value. + { + CloseHandle(hToken); + return false; + } + + TOKEN_USER *TokenInfo = (TOKEN_USER*)malloc(BufSize); + + // Get the current user token information. + if (GetTokenInformation(hToken,TokenUser,TokenInfo,BufSize,&BufSize)==0) + { + CloseHandle(hToken); + return false; + } + + // Get SID string for the current user. + LPWSTR ApiSidStr; + ConvertSidToStringSid(TokenInfo->User.Sid, &ApiSidStr); + + // Convert SID to C++ string and release API based buffer. + std::wstring SidStr=ApiSidStr; + LocalFree(ApiSidStr); + CloseHandle(hToken); + + if (IsUserAdmin()) + AssignPrivilegeBySid(SidStr); + else + { + // Define here, so they survive until ShellExecuteEx call. + std::wstring ExeName=GetModuleFileStr(); + std::wstring Param=std::wstring(L"-") + LOCKMEM_SWITCH + SidStr; + + SHELLEXECUTEINFO shExecInfo{}; + shExecInfo.cbSize = sizeof(shExecInfo); + + shExecInfo.hwnd = NULL; // Specifying WinRAR main window here does not work well in command line mode. + shExecInfo.lpVerb = L"runas"; + shExecInfo.lpFile = ExeName.c_str(); + shExecInfo.lpParameters = Param.c_str(); + shExecInfo.nShow = SW_SHOWNORMAL; + BOOL Result=ShellExecuteEx(&shExecInfo); + } +#endif + + return true; +} + + +bool LargePageAlloc::AssignPrivilegeBySid(const std::wstring &Sid) +{ +#ifdef ALLOW_LARGE_PAGES + LSA_HANDLE PolicyHandle; + LSA_OBJECT_ATTRIBUTES ObjectAttributes{}; // Docs require to zero initalize it. + +#ifndef STATUS_SUCCESS // Can be defined through WIL package in WinRAR. + // We define STATUS_SUCCESS here instead of including ntstatus.h to avoid + // macro redefinition warnings. We tried UMDF_USING_NTSTATUS define + // and other workarounds, but it didn't help. + const uint STATUS_SUCCESS=0; +#endif + + if (LsaOpenPolicy(NULL,&ObjectAttributes,POLICY_CREATE_ACCOUNT| + POLICY_LOOKUP_NAMES,&PolicyHandle)!=STATUS_SUCCESS) + return false; + + PSID UserSid; + ConvertStringSidToSid(Sid.c_str(),&UserSid); + + LSA_UNICODE_STRING LsaString; + LsaString.Buffer=(PWSTR)SE_LOCK_MEMORY_NAME; + // It must be in bytes, so multiple it to sizeof(wchar_t). + LsaString.Length=(USHORT)wcslen(LsaString.Buffer)*sizeof(LsaString.Buffer[0]); + LsaString.MaximumLength=LsaString.Length; + + bool Success=LsaAddAccountRights(PolicyHandle,UserSid,&LsaString,1)==STATUS_SUCCESS; + + LocalFree(UserSid); + LsaClose(PolicyHandle); + + mprintf(St(MPrivilegeAssigned)); + if (Ask(St(MYesNo)) == 1) + Shutdown(POWERMODE_RESTART); + + return Success; +#else + return true; +#endif +} + + +bool LargePageAlloc::AssignConfirmation() +{ +#ifdef ALLOW_LARGE_PAGES + mprintf(St(MLockInMemoryNeeded)); + return Ask(St(MYesNo)) == 1; +#else + return false; +#endif +} + + +void* LargePageAlloc::new_large(size_t Size) +{ + void *Allocated=nullptr; + +#ifdef ALLOW_LARGE_PAGES + if (UseLargePages && Size>=PageSize) + { + // VirtualAlloc fails if allocation size isn't multiple of page size. + SIZE_T AllocSize=Size%PageSize==0 ? Size:(Size/PageSize+1)*PageSize; + Allocated=VirtualAlloc(nullptr,AllocSize,MEM_COMMIT|MEM_RESERVE|MEM_LARGE_PAGES,PAGE_READWRITE); + if (Allocated!=nullptr) + LargeAlloc.push_back(Allocated); + } +#endif + return Allocated; +} + + +bool LargePageAlloc::delete_large(void *Addr) +{ +#ifdef ALLOW_LARGE_PAGES + if (Addr!=nullptr) + for (size_t I=0;I<LargeAlloc.size();I++) + if (LargeAlloc[I]==Addr) + { + LargeAlloc[I]=nullptr; + VirtualFree(Addr,0,MEM_RELEASE); + return true; + } +#endif + return false; +} Copied: branches/OpenMPT-1.31/include/unrar/largepage.hpp (from r22480, trunk/OpenMPT/include/unrar/largepage.hpp) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ branches/OpenMPT-1.31/include/unrar/largepage.hpp Wed Jan 1 02:15:46 2025 (r22674, copy of r22480, trunk/OpenMPT/include/unrar/largepage.hpp) @@ -0,0 +1,55 @@ +#ifndef _RAR_LARGEPAGE_ +#define _RAR_LARGEPAGE_ + +class LargePageAlloc +{ + private: + static constexpr const wchar *LOCKMEM_SWITCH=L"isetup_privilege_lockmem"; + + void* new_large(size_t Size); + bool delete_large(void *Addr); +#ifdef _WIN_ALL + std::vector<void*> LargeAlloc; + [[maybe_unused]] // OPENMPT ADDITION + SIZE_T PageSize; +#endif + bool UseLargePages; + public: + LargePageAlloc(); + void AllowLargePages(bool Allow); + static bool IsPrivilegeAssigned(); + static bool AssignPrivilege(); + static bool AssignPrivilegeBySid(const std::wstring &Sid); + static bool AssignConfirmation(); + + static bool ProcessSwitch(CommandData *Cmd,const wchar *Switch) + { + if (Switch[0]==LOCKMEM_SWITCH[0]) + { + size_t Length=wcslen(LOCKMEM_SWITCH); + if (wcsncmp(Switch,LOCKMEM_SWITCH,Length)==0) + { + LargePageAlloc::AssignPrivilegeBySid(Switch+Length); + return true; + } + } + return false; + } + + template <class T> T* new_l(size_t Size,bool Clear=false) + { + T *Allocated=(T*)new_large(Size*sizeof(T)); + if (Allocated==nullptr) + Allocated=Clear ? new T[Size]{} : new T[Size]; + return Allocated; + } + + template <class T> void delete_l(T *Addr) + { + if (!delete_large(Addr)) + delete[] Addr; + } +}; + + +#endif Modified: branches/OpenMPT-1.31/include/unrar/list.cpp ============================================================================== --- branches/OpenMPT-1.31/include/unrar/list.cpp Wed Jan 1 02:11:11 2025 (r22673) +++ branches/OpenMPT-1.31/include/unrar/list.cpp Wed Jan 1 02:15:46 2025 (r22674) @@ -37,7 +37,7 @@ mprintf(L"\n%s: %s",St(MListArchive),Arc.FileName.c_str()); mprintf(L"\n%s: ",St(MListDetails)); - const wchar *Fmt=Arc.Format==RARFMT14 ? L"RAR 1.4":(Arc.Format==RARFMT15 ? L"RAR 4":L"RAR 5"); + const wchar *Fmt=Arc.Format==RARFMT14 ? L"RAR 1.4":(Arc.Format==RARFMT15 ? L"RAR 1.5":L"RAR 5"); mprintf(L"%s", Fmt... [truncated message content] |
From: <sv...@op...> - 2025-01-01 01:11:23
|
Author: sagamusix Date: Wed Jan 1 02:11:11 2025 New Revision: 22673 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22673 Log: Merged revision(s) 22478 from trunk/OpenMPT: [Fix] XM: In non-compatible linear slide mode, avoid shifting the period by arbitrary bit amounts if the period is extremely high. This caused the frequency to wrap around, which should not happen in non-compatible mode. Found with afl++ + ubsan. ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/Snd_fx.cpp Modified: branches/OpenMPT-1.31/soundlib/Snd_fx.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Snd_fx.cpp Wed Jan 1 02:02:08 2025 (r22672) +++ branches/OpenMPT-1.31/soundlib/Snd_fx.cpp Wed Jan 1 02:11:11 2025 (r22673) @@ -6302,6 +6302,8 @@ octave = ((14 - div) & 0x1F); } else { + if(period > 29 * 768) + return 0; octave = (period / 768) + 2; } return (XMLinearTable[period % 768] << (FREQ_FRACBITS + 2)) >> octave; |
From: <sv...@op...> - 2025-01-01 01:02:20
|
Author: sagamusix Date: Wed Jan 1 02:02:08 2025 New Revision: 22672 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22672 Log: [Mod] Rename cue point preview keyboard shortcuts. Modified: branches/OpenMPT-1.31/mptrack/CommandSet.cpp Modified: branches/OpenMPT-1.31/mptrack/CommandSet.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/CommandSet.cpp Wed Jan 1 02:01:02 2025 (r22671) +++ branches/OpenMPT-1.31/mptrack/CommandSet.cpp Wed Jan 1 02:02:08 2025 (r22672) @@ -1392,7 +1392,7 @@ for(int j = kcStartSampleCues; j <= kcEndSampleCues; j++) { - CString s = MPT_CFORMAT("Preview Sample Cue {}")(j - kcStartSampleCues + 1); + CString s = MPT_CFORMAT("Preview / Set Sample Cue {}")(j - kcStartSampleCues + 1); m_commands[j] = {static_cast<uint32>(1924 + j - kcStartSampleCues), s}; } static_assert(1924 + kcEndSampleCues - kcStartSampleCues < 1950); |
From: <sv...@op...> - 2025-01-01 01:01:09
|
Author: sagamusix Date: Wed Jan 1 02:01:02 2025 New Revision: 22671 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22671 Log: Merged revision(s) 22639 from trunk/OpenMPT: [Fix] Plugin notes played live were no longer cleaning their channel status correctly with the new plugin NNA logic, causing unused NNA channels to pile up (https://bugs.openmpt.org/view.php?id=1853). ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/mptrack/Moddoc.cpp Modified: branches/OpenMPT-1.31/mptrack/Moddoc.cpp ============================================================================== --- branches/OpenMPT-1.31/mptrack/Moddoc.cpp Wed Jan 1 00:28:24 2025 (r22670) +++ branches/OpenMPT-1.31/mptrack/Moddoc.cpp Wed Jan 1 02:01:02 2025 (r22671) @@ -1056,8 +1056,9 @@ // Set instrument (or sample if there are no instruments) chn.ResetEnvelopes(); m_SndFile.InstrumentChange(chn, params.m_instr); - } else if(params.m_sample > 0 && params.m_sample <= GetNumSamples()) // Or set sample explicitely + } else if(params.m_sample > 0 && params.m_sample <= GetNumSamples()) { + // Or set sample explicitly ModSample &sample = m_SndFile.GetSample(params.m_sample); chn.pCurrentSample = sample.samplev(); chn.pModInstrument = nullptr; @@ -1087,8 +1088,6 @@ if(params.m_volume >= 0) chn.nVolume = std::min(params.m_volume, 256); // Handle sample looping. - // Changed line to fix http://forum.openmpt.org/index.php?topic=1700.0 - //if ((loopstart + 16 < loopend) && (loopstart >= 0) && (loopend <= (LONG)pchn.nLength)) if ((params.m_loopStart + 16 < params.m_loopEnd) && (params.m_loopStart >= 0) && (chn.pModSample != nullptr)) { chn.position.Set(params.m_loopStart); @@ -1169,13 +1168,15 @@ { CriticalSection cs; + const ModInstrument *pIns = nullptr; + IMixPlugin *pPlugin = nullptr; if(ins != INSTRUMENTINDEX_INVALID && ins <= m_SndFile.GetNumInstruments() && ModCommand::IsNote(ModCommand::NOTE(note))) { - const ModInstrument *pIns = m_SndFile.Instruments[ins]; - if(pIns && pIns->HasValidMIDIChannel()) // instro sends to a midi chan + pIns = m_SndFile.Instruments[ins]; + if(pIns && pIns->HasValidMIDIChannel()) { - PLUGINDEX plug = pIns->nMixPlug; // First try intrument VST - if((!plug || plug > MAX_MIXPLUGINS) // No good plug yet + PLUGINDEX plug = pIns->nMixPlug; // First try instrument VST + if((!plug || plug > MAX_MIXPLUGINS) // No good plug yet && currentChn < MAX_BASECHANNELS) // Chan OK { plug = m_SndFile.ChnSettings[currentChn].nMixPlugin;// Then try Channel VST @@ -1183,11 +1184,7 @@ if(plug && plug <= MAX_MIXPLUGINS) { - IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[plug - 1].pMixPlugin; - if(pPlugin) - { - pPlugin->MidiCommand(*pIns, pIns->NoteMap[note - NOTE_MIN] | IMixPlugin::MIDI_NOTE_OFF, 0, currentChn); - } + pPlugin = m_SndFile.m_MixPlugins[plug - 1].pMixPlugin; } } } @@ -1196,25 +1193,33 @@ const CHANNELINDEX startChn = currentChn != CHANNELINDEX_INVALID ? currentChn : m_SndFile.m_nChannels; const CHANNELINDEX endChn = currentChn != CHANNELINDEX_INVALID ? currentChn + 1 : MAX_CHANNELS; ModChannel *pChn = &m_SndFile.m_PlayState.Chn[startChn]; - for(CHANNELINDEX i = startChn; i < endChn; i++, pChn++) + bool found = false; + for(CHANNELINDEX i = startChn; i < endChn && !found; i++, pChn++) { // Fade all channels > m_nChannels which are playing this note and aren't NNA channels. + if(pPlugin && pChn->pModInstrument == pIns && (currentChn == CHANNELINDEX_INVALID || currentChn == i) && pChn->lastMidiNoteWithoutArp == pIns->NoteMap[note - NOTE_MIN]) + { + pPlugin->MidiCommand(*pIns, pIns->NoteMap[note - NOTE_MIN] | IMixPlugin::MIDI_NOTE_OFF, 0, currentChn); + pChn->lastMidiNoteWithoutArp = NOTE_NONE; + found = true; + } if((pChn->isPreviewNote || i < m_SndFile.GetNumChannels()) && !pChn->dwFlags[mask] && (pChn->nLength || pChn->dwFlags[CHN_ADLIB]) && (note == pChn->nNewNote || note == NOTE_NONE)) { m_SndFile.KeyOff(*pChn); - if (!m_SndFile.m_nInstruments) pChn->dwFlags.reset(CHN_LOOP | CHN_PINGPONGFLAG); - if (fade) pChn->dwFlags.set(CHN_NOTEFADE); + if(!m_SndFile.m_nInstruments) pChn->dwFlags.reset(CHN_LOOP | CHN_PINGPONGFLAG); + if(fade) pChn->dwFlags.set(CHN_NOTEFADE); // Instantly stop samples that would otherwise play forever - if (pChn->pModInstrument && !pChn->pModInstrument->nFadeOut) + if(pChn->pModInstrument && !pChn->pModInstrument->nFadeOut) pChn->nFadeOutVol = 0; if(pChn->dwFlags[CHN_ADLIB] && m_SndFile.m_opl) { m_SndFile.m_opl->NoteOff(i); } - if (note) break; + if(note) + found = true; } } |
From: <sv...@op...> - 2024-12-31 23:28:31
|
Author: sagamusix Date: Wed Jan 1 00:28:24 2025 New Revision: 22670 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22670 Log: [Imp] XM: When tracker ID is "*Converted from FOO-File*", set "made with" version info for Digitrakker accordingly. Modified: trunk/OpenMPT/soundlib/Load_xm.cpp Modified: trunk/OpenMPT/soundlib/Load_xm.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp Tue Dec 31 23:37:32 2024 (r22669) +++ trunk/OpenMPT/soundlib/Load_xm.cpp Wed Jan 1 00:28:24 2025 (r22670) @@ -678,9 +678,10 @@ m_playBehaviour.reset(kFT2ST3OffsetOutOfRange); // Fix arpeggios in KAPTENFL.XM m_playBehaviour.reset(kFT2Arpeggio); - } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11)) + } else if(!memcmp(fileHeader.trackerName, "*Converted ", 11) && !memcmp(fileHeader.trackerName + 14, "-File*", 6)) { - madeWith = verDigiTrakker; + madeWith = verDigiTrakker | verConfirmed; + madeWithTracker = UL_("Digitrakker"); } } |
From: <sv...@op...> - 2024-12-31 22:37:50
|
Author: sagamusix Date: Tue Dec 31 23:37:32 2024 New Revision: 22669 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22669 Log: [New] There is now a customizable metronome that can be enabled from the pattern tab or via keyboard shortcut (https://bugs.openmpt.org/view.php?id=689). [Mod] OpenMPT: Version is now 1.32.00.39 Modified: trunk/OpenMPT/common/versionNumber.h trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/Ctrl_com.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/DefaultKeyBindings.h trunk/OpenMPT/mptrack/ImageLists.h trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mainfrm.h trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp trunk/OpenMPT/mptrack/PatternEditorDialogs.h trunk/OpenMPT/mptrack/TrackerSettings.cpp trunk/OpenMPT/mptrack/TrackerSettings.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/WindowMessages.h trunk/OpenMPT/mptrack/mptrack.rc trunk/OpenMPT/mptrack/res/originals/pattern_toolbar.pfi trunk/OpenMPT/mptrack/res/pattern_toolbar.png trunk/OpenMPT/mptrack/resource.h trunk/OpenMPT/soundlib/Fastmix.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/common/versionNumber.h ============================================================================== --- trunk/OpenMPT/common/versionNumber.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/common/versionNumber.h Tue Dec 31 23:37:32 2024 (r22669) @@ -16,4 +16,4 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 32 #define VER_MINOR 00 -#define VER_MINORMINOR 38 +#define VER_MINORMINOR 39 Modified: trunk/OpenMPT/mptrack/CommandSet.cpp ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/CommandSet.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -943,6 +943,7 @@ {2116, kcToggleRecordMIDIVelocity, _T("Toggle Record MIDI Velocity")}, {2117, kcToggleRecordMIDIPitchBend, _T("Toggle Record MIDI Pitch Bend")}, {2118, kcToggleRecordMIDICCs, _T("Toggle Record MIDI CCs")}, + {2119, kcToggleMetronome, _T("Toggle Metronome")}, }; // clang-format on Modified: trunk/OpenMPT/mptrack/CommandSet.h ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/CommandSet.h Tue Dec 31 23:37:32 2024 (r22669) @@ -309,6 +309,7 @@ kcPatternGoto, kcFindInstrument, kcPatternRecord, + kcToggleMetronome, kcSetSpacing, kcSetSpacing0, kcSetSpacing1, Modified: trunk/OpenMPT/mptrack/Ctrl_com.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_com.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Ctrl_com.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -131,7 +131,7 @@ void CCtrlComments::OnDPIChanged() { - UpdateView(GeneralHint().MPTOptions(), nullptr); + UpdateView(UpdateHint().MPTOptions(), nullptr); CModControlDlg::OnDPIChanged(); } Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -51,6 +51,8 @@ ON_COMMAND(IDC_PATTERN_PLAY, &CCtrlPatterns::OnPatternPlay) ON_COMMAND(IDC_PATTERN_PLAYFROMSTART, &CCtrlPatterns::OnPatternPlayFromStart) ON_COMMAND(IDC_PATTERN_RECORD, &CCtrlPatterns::OnPatternRecord) + ON_COMMAND(IDC_METRONOME, &CCtrlPatterns::OnToggleMetronome) + ON_COMMAND(ID_METRONOME_SETTINGS, &CCtrlPatterns::OnMetronomeSettings) ON_COMMAND(IDC_PATTERN_LOOP, &CCtrlPatterns::OnChangeLoopStatus) ON_COMMAND(ID_PATTERN_PLAYROW, &CCtrlPatterns::OnPatternPlayRow) ON_COMMAND(ID_PATTERN_CHANNELMANAGER, &CCtrlPatterns::OnChannelManager) @@ -153,6 +155,7 @@ m_ToolBar.AddButton(IDC_PATTERN_STOP, TIMAGE_PATTERN_STOP); m_ToolBar.AddButton(ID_PATTERN_PLAYROW, TIMAGE_PATTERN_PLAYROW); m_ToolBar.AddButton(IDC_PATTERN_RECORD, TIMAGE_PATTERN_RECORD, TBSTYLE_CHECK, (m_bRecord ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); + m_ToolBar.AddButton(IDC_METRONOME, TIMAGE_METRONOME, TBSTYLE_CHECK | TBSTYLE_DROPDOWN, (TrackerSettings::Instance().metronomeEnabled ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); m_ToolBar.AddButton(ID_SEPARATOR, 0, TBSTYLE_SEP); m_ToolBar.AddButton(ID_PATTERN_VUMETERS, TIMAGE_PATTERN_VUMETERS, TBSTYLE_CHECK, (m_bVUMeters ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); m_ToolBar.AddButton(ID_VIEWPLUGNAMES, TIMAGE_PATTERN_PLUGINS, TBSTYLE_CHECK, (m_bPluginNames ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); @@ -481,6 +484,11 @@ SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); break; + case CTRLMSG_TOGGLE_METRONOME: + m_ToolBar.CheckButton(IDC_METRONOME, m_ToolBar.IsButtonChecked(IDC_METRONOME) ? FALSE : TRUE); + OnToggleMetronome(); + break; + case CTRLMSG_TOGGLE_OVERFLOW_PASTE: m_ToolBar.CheckButton(ID_OVERFLOWPASTE, m_ToolBar.IsButtonChecked(ID_OVERFLOWPASTE) ? FALSE : TRUE); OnToggleOverflowPaste(); @@ -538,6 +546,7 @@ case CTRLMSG_PAT_UPDATE_TOOLBAR: m_ToolBar.CheckButton(ID_OVERFLOWPASTE, (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TRUE : FALSE); + m_ToolBar.CheckButton(IDC_METRONOME, TrackerSettings::Instance().metronomeEnabled ? TRUE : FALSE); break; default: @@ -1103,6 +1112,24 @@ } +void CCtrlPatterns::OnToggleMetronome() +{ + bool enableMetronome = m_ToolBar.IsButtonChecked(IDC_METRONOME) != 0; + TrackerSettings::Instance().metronomeEnabled = enableMetronome; + CMainFrame::GetMainFrame()->UpdateMetronomeSamples(); + theApp.PostMessageToAllViews(WM_MOD_CTRLMSG, CTRLMSG_PAT_UPDATE_TOOLBAR); + SwitchToView(); +} + + +void CCtrlPatterns::OnMetronomeSettings() +{ + MetronomeSettingsDlg dlg{this}; + dlg.DoModal(); + SwitchToView(); +} + + void CCtrlPatterns::OnPatternProperties() { SendViewMessage(VIEWMSG_PATTERNPROPERTIES, PATTERNINDEX_INVALID); @@ -1252,6 +1279,13 @@ menu.DestroyMenu(); break; + case IDC_METRONOME: + menu.CreatePopupMenu(); + menu.AppendMenu(MF_STRING, ID_METRONOME_SETTINGS, _T("&Metronome Settings")); + menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, this); + menu.DestroyMenu(); + break; + case ID_PATTERNDETAIL_DROPDOWN: menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING | (visibleColumns[PatternCursor::instrColumn] ? MF_CHECKED : 0), ID_PATTERNDETAIL_INSTR, ih->GetKeyTextFromCommand(kcToggleVisibilityInstrColumn, _T("Show &Instrument Column"))); @@ -1351,6 +1385,7 @@ case IDC_PATTERN_STOP: s = _T("Stop"); cmd = kcPauseSong; break; case ID_PATTERN_PLAYROW: s = _T("Play Row"); cmd = kcPatternPlayRow; break; case IDC_PATTERN_RECORD: s = _T("Record"); cmd = kcPatternRecord; break; + case IDC_METRONOME: s = _T("Metronome"); cmd = kcToggleMetronome; break; case ID_PATTERN_VUMETERS: s = _T("VU-Meters"); break; case ID_VIEWPLUGNAMES: s = _T("Show Plugins"); break; case ID_PATTERN_CHANNELMANAGER: s = _T("Channel Manager"); cmd = kcViewChannelManager; break; Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h Tue Dec 31 23:37:32 2024 (r22669) @@ -252,6 +252,8 @@ afx_msg void OnPatternAmplify(); afx_msg void OnPatternCopy(); afx_msg void OnPatternPaste(); + afx_msg void OnToggleMetronome(); + afx_msg void OnMetronomeSettings(); afx_msg void OnFollowSong(); afx_msg void OnChangeLoopStatus(); // cppcheck-suppress duplInheritedMember Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -1214,80 +1214,13 @@ } -static constexpr std::pair<const mpt::uchar *, const mpt::uchar *> SampleFormats[] -{ - { UL_("Wave Files (*.wav)"), UL_("*.wav") }, -#ifdef MPT_WITH_FLAC - { UL_("FLAC Files (*.flac,*.oga)"), UL_("*.flac;*.oga") }, -#endif // MPT_WITH_FLAC -#if defined(MPT_WITH_OPUSFILE) - { UL_("Opus Files (*.opus,*.oga)"), UL_("*.opus;*.oga") }, -#endif // MPT_WITH_OPUSFILE -#if defined(MPT_WITH_VORBISFILE) || defined(MPT_WITH_STBVORBIS) - { UL_("Ogg Vorbis Files (*.ogg,*.oga)"), UL_("*.ogg;*.oga") }, -#endif // VORBIS -#if defined(MPT_ENABLE_MP3_SAMPLES) - { UL_("MPEG Files (*.mp1,*.mp2,*.mp3)"), UL_("*.mp1;*.mp2;*.mp3") }, -#endif // MPT_ENABLE_MP3_SAMPLES - { UL_("XI Samples (*.xi)"), UL_("*.xi") }, - { UL_("Impulse Tracker Samples (*.its)"), UL_("*.its") }, - { UL_("Scream Tracker Samples (*.s3i,*.smp)"), UL_("*.s3i;*.smp") }, - { UL_("OPL Instruments (*.sb0,*.sb2,*.sbi)"), UL_("*.sb0;*.sb2;*.sbi") }, - { UL_("GF1 Patches (*.pat)"), UL_("*.pat") }, - { UL_("Wave64 Files (*.w64)"), UL_("*.w64") }, - { UL_("CAF Files (*.wav)"), UL_("*.caf") }, - { UL_("AIFF Files (*.aiff,*.8svx)"), UL_("*.aif;*.aiff;*.iff;*.8sv;*.8svx;*.svx") }, - { UL_("Sun Audio (*.au,*.snd)"), UL_("*.au;*.snd") }, - { UL_("SNES BRR Files (*.brr)"), UL_("*.brr") }, -}; - - -static mpt::ustring ConstructFileFilter(bool includeRaw) -{ - mpt::ustring s = U_("All Samples (*.wav,*.flac,*.xi,*.its,*.s3i,*.sbi,...)|"); - bool first = true; - for(const auto &[name, exts] : SampleFormats) - { - if(!first) - s += U_(";"); - else - first = false; - s += exts; - } -#if defined(MPT_WITH_MEDIAFOUNDATION) - std::vector<FileType> mediaFoundationTypes = CSoundFile::GetMediaFoundationFileTypes(); - s += ToFilterOnlyString(mediaFoundationTypes, true).ToUnicode(); -#endif - if(includeRaw) - { - s += U_(";*.raw;*.snd;*.pcm;*.sam"); - } - s += U_("|"); - for(const auto &[name, exts] : SampleFormats) - { - s += name + U_("|"); - s += exts + U_("|"); - } -#if defined(MPT_WITH_MEDIAFOUNDATION) - s += ToFilterString(mediaFoundationTypes, FileTypeFormatShowExtensions).ToUnicode(); -#endif - if(includeRaw) - { - s += U_("Raw Samples (*.raw,*.snd,*.pcm,*.sam)|*.raw;*.snd;*.pcm;*.sam|"); - } - s += U_("All Files (*.*)|*.*||"); - return s; -} - - void CCtrlSamples::OnSampleOpen() { static int nLastIndex = 0; - std::vector<FileType> mediaFoundationTypes = CSoundFile::GetMediaFoundationFileTypes(); FileDialog dlg = OpenFileDialog() .AllowMultiSelect() .EnableAudioPreview() - .ExtensionFilter(ConstructFileFilter(true)) + .ExtensionFilter(ConstructSampleFormatFileFilter(true)) .WorkingDirectory(TrackerSettings::Instance().PathSamples.GetWorkingDir()) .FilterIndex(&nLastIndex); if(!dlg.Show(this)) return; @@ -1302,11 +1235,10 @@ void CCtrlSamples::OnSampleOpenKnown() { static int nLastIndex = 0; - std::vector<FileType> mediaFoundationTypes = CSoundFile::GetMediaFoundationFileTypes(); FileDialog dlg = OpenFileDialog() .AllowMultiSelect() .EnableAudioPreview() - .ExtensionFilter(ConstructFileFilter(false)) + .ExtensionFilter(ConstructSampleFormatFileFilter(false)) .WorkingDirectory(TrackerSettings::Instance().PathSamples.GetWorkingDir()) .FilterIndex(&nLastIndex); if(!dlg.Show(this)) return; Modified: trunk/OpenMPT/mptrack/DefaultKeyBindings.h ============================================================================== --- trunk/OpenMPT/mptrack/DefaultKeyBindings.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/DefaultKeyBindings.h Tue Dec 31 23:37:32 2024 (r22669) @@ -10,6 +10,8 @@ #include "openmpt/all/BuildSettings.hpp" +#pragma once + #include "CommandSet.h" @@ -114,6 +116,7 @@ {kcCursorCopy, VK_RETURN, ModNone, kKeyEventDown, MPT_V("1.31")}, {kcCursorPaste, VK_SPACE, ModNone, kKeyEventDown | kKeyEventRepeat, MPT_V("1.31")}, {kcPatternRecord, VK_SPACE, ModCtrl, kKeyEventDown, MPT_V("1.31")}, + {kcToggleMetronome, 'M', ModAlt, kKeyEventDown, MPT_V("1.32.00.39")}, {kcPatternPlayRow, VK_RETURN, ModCtrl, kKeyEventDown | kKeyEventRepeat, MPT_V("1.31")}, {kcSetSpacing, VK_MENU, ModAlt, kKeyEventDown, MPT_V("1.31")}, {kcSwitchToOrderList, VK_TAB, ModCtrl, kKeyEventDown, MPT_V("1.31")}, Modified: trunk/OpenMPT/mptrack/ImageLists.h ============================================================================== --- trunk/OpenMPT/mptrack/ImageLists.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/ImageLists.h Tue Dec 31 23:37:32 2024 (r22669) @@ -84,7 +84,7 @@ TIMAGE_SAMPLE_DOWNSAMPLE, TIMAGE_PATTERN_DETAIL, TIMAGE_MODULE_FILE, - TIMAGE_PATTERN_DETAIL_HI, // unused + TIMAGE_METRONOME, TIMAGE_PATTERN_PLUGINS, TIMAGE_CHANNELMANAGER, TIMAGE_SAMPLE_INVERT, Modified: trunk/OpenMPT/mptrack/MainFrm.cpp ============================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/MainFrm.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -48,6 +48,7 @@ #include "../common/Profiler.h" #include "../common/version.h" #include "../soundlib/AudioReadTarget.h" +#include "../soundlib/Tables.h" #include "../test/PlaybackTest.h" #include "mpt/audio/span.hpp" #include "mpt/base/alloc.hpp" @@ -263,6 +264,8 @@ m_InputHandler->UpdateMainMenu(); + LoadMetronomeSamples(); + #ifdef MPT_ENABLE_PLAYBACK_TEST_MENU CMenu debugMenu; debugMenu.CreatePopupMenu(); @@ -277,6 +280,8 @@ CMainFrame::~CMainFrame() { CChannelManagerDlg::DestroySharedInstance(); + m_metronomeMeasure.FreeSample(); + m_metronomeBeat.FreeSample(); } @@ -1531,6 +1536,8 @@ m_VUMeterInput = VUMeter(); m_VUMeterOutput = VUMeter(); + UpdateMetronomeSamples(); + if(!StartPlayback()) { UnsetPlaybackSoundFile(); @@ -3139,6 +3146,80 @@ } +void CMainFrame::LoadMetronomeSamples() +{ + const std::tuple<mpt::PathString, ModSample &, const int, const int> metronomeSamples[] = + { + {TrackerSettings::Instance().metronomeSampleMeasure, m_metronomeMeasure, 4, 256}, + {TrackerSettings::Instance().metronomeSampleBeat, m_metronomeBeat, 2, 192}, + }; + CriticalSection cs; + for(auto &[path, sample, speed, amp] : metronomeSamples) + { + sample.FreeSample(); + if(path.empty()) + continue; + if(path != TrackerSettings::GetDefaultMetronomeSample()) + { + mpt::IO::InputFile inputFile(path, TrackerSettings::Instance().MiscCacheCompleteFileBeforeLoading); + if(inputFile.IsValid()) + { + FileReader file = GetFileReader(inputFile); + SAMPLEINDEX srcSmp = m_WaveFile.GetNextFreeSample(); + if(srcSmp == SAMPLEINDEX_INVALID) + srcSmp = 1; + if(m_WaveFile.ReadSampleFromFile(srcSmp, file)) + { + std::swap(sample, m_WaveFile.GetSample(srcSmp)); + sample.Convert(m_WaveFile.GetType(), MOD_TYPE_MPT); + } + } + } + if(!sample.HasSampleData()) + { + sample.Initialize(MOD_TYPE_MPT); + sample.nC5Speed = 8363 * 16; + sample.nLength = 4096; + sample.uFlags.set(CHN_16BIT); + if(sample.AllocateSample()) + { + int16_t *sampleData = sample.sample16(); + for(SmpLength i = 0; i < sample.nLength; i++) + { + sampleData[i] = static_cast<int16>(Util::muldiv(ITSinusTable[(i * speed) % std::size(ITSinusTable)] * amp, 4096 * 4096 - i * i, 4096 * 4096)); + } + } + } + } + UpdateMetronomeVolume(); + UpdateMetronomeSamples(); +} + + +void CMainFrame::UpdateMetronomeSamples() +{ + if(!m_pSndFile) + return; + ModSample *measure = nullptr, *beat = nullptr; + if(TrackerSettings::Instance().metronomeEnabled) + { + measure = &m_metronomeMeasure; + beat = &m_metronomeBeat; + } + CriticalSection cs; + m_pSndFile->SetMetronomeSamples(measure, beat); +} + + +void CMainFrame::UpdateMetronomeVolume() +{ + const float linear = std::pow(10.0f, TrackerSettings::Instance().metronomeVolume / 20.0f); + const uint16 volume = std::clamp(mpt::saturate_round<uint16>(linear * 256.0f), uint16(0), uint16(256)); + CriticalSection cs; + m_metronomeBeat.nVolume = m_metronomeMeasure.nVolume = volume; +} + + HMENU CMainFrame::CreateFileMenu(const size_t maxCount, std::vector<mpt::PathString>& paths, const mpt::PathString &folderName, const uint16 idRangeBegin) { paths.clear(); Modified: trunk/OpenMPT/mptrack/Mainfrm.h ============================================================================== --- trunk/OpenMPT/mptrack/Mainfrm.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Mainfrm.h Tue Dec 31 23:37:32 2024 (r22669) @@ -206,6 +206,7 @@ // Instrument preview in tree view CSoundFile m_WaveFile; + ModSample m_metronomeMeasure{}, m_metronomeBeat{}; TCHAR m_szUserText[512], m_szInfoText[512], m_szXInfoText[512]; @@ -255,6 +256,9 @@ void midiCloseDevice(); void SetMidiRecordWnd(HWND hwnd) { m_hWndMidi = hwnd; } HWND GetMidiRecordWnd() const { return m_hWndMidi; } + void LoadMetronomeSamples(); + void UpdateMetronomeSamples(); + void UpdateMetronomeVolume(); static int ApplyVolumeRelatedSettings(const DWORD &dwParam1, const uint8 midivolume); Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -2641,4 +2641,71 @@ } +static constexpr std::pair<const mpt::uchar*, const mpt::uchar*> SampleFormats[] +{ + { UL_("Wave Files (*.wav)"), UL_("*.wav") }, +#ifdef MPT_WITH_FLAC + { UL_("FLAC Files (*.flac,*.oga)"), UL_("*.flac;*.oga") }, +#endif // MPT_WITH_FLAC +#if defined(MPT_WITH_OPUSFILE) + { UL_("Opus Files (*.opus,*.oga)"), UL_("*.opus;*.oga") }, +#endif // MPT_WITH_OPUSFILE +#if defined(MPT_WITH_VORBISFILE) || defined(MPT_WITH_STBVORBIS) + { UL_("Ogg Vorbis Files (*.ogg,*.oga)"), UL_("*.ogg;*.oga") }, +#endif // VORBIS +#if defined(MPT_ENABLE_MP3_SAMPLES) + { UL_("MPEG Files (*.mp1,*.mp2,*.mp3)"), UL_("*.mp1;*.mp2;*.mp3") }, +#endif // MPT_ENABLE_MP3_SAMPLES + { UL_("XI Samples (*.xi)"), UL_("*.xi") }, + { UL_("Impulse Tracker Samples (*.its)"), UL_("*.its") }, + { UL_("Scream Tracker Samples (*.s3i,*.smp)"), UL_("*.s3i;*.smp") }, + { UL_("OPL Instruments (*.sb0,*.sb2,*.sbi)"), UL_("*.sb0;*.sb2;*.sbi") }, + { UL_("GF1 Patches (*.pat)"), UL_("*.pat") }, + { UL_("Wave64 Files (*.w64)"), UL_("*.w64") }, + { UL_("CAF Files (*.wav)"), UL_("*.caf") }, + { UL_("AIFF Files (*.aiff,*.8svx)"), UL_("*.aif;*.aiff;*.iff;*.8sv;*.8svx;*.svx") }, + { UL_("Sun Audio (*.au,*.snd)"), UL_("*.au;*.snd") }, + { UL_("SNES BRR Files (*.brr)"), UL_("*.brr") }, +}; + + +mpt::ustring ConstructSampleFormatFileFilter(bool includeRaw) +{ + mpt::ustring s = U_("All Samples (*.wav,*.flac,*.xi,*.its,*.s3i,*.sbi,...)|"); + bool first = true; + for (const auto& [name, exts] : SampleFormats) + { + if (!first) + s += U_(";"); + else + first = false; + s += exts; + } +#if defined(MPT_WITH_MEDIAFOUNDATION) + std::vector<FileType> mediaFoundationTypes = CSoundFile::GetMediaFoundationFileTypes(); + s += ToFilterOnlyString(mediaFoundationTypes, true).ToUnicode(); +#endif + if (includeRaw) + { + s += U_(";*.raw;*.snd;*.pcm;*.sam"); + } + s += U_("|"); + for (const auto& [name, exts] : SampleFormats) + { + s += name + U_("|"); + s += exts + U_("|"); + } +#if defined(MPT_WITH_MEDIAFOUNDATION) + s += ToFilterString(mediaFoundationTypes, FileTypeFormatShowExtensions).ToUnicode(); +#endif + if (includeRaw) + { + s += U_("Raw Samples (*.raw,*.snd,*.pcm,*.sam)|*.raw;*.snd;*.pcm;*.sam|"); + } + s += U_("All Files (*.*)|*.*||"); + return s; +} + + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/Mptrack.h ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/Mptrack.h Tue Dec 31 23:37:32 2024 (r22669) @@ -446,6 +446,8 @@ bool ValidateMacroString(CEdit &wnd, const std::string_view prevMacro, bool isParametric, bool allowVariables, bool allowMultiline); +mpt::ustring ConstructSampleFormatFileFilter(bool includeRaw); + /////////////////////////////////////////////////// // Tables Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -11,6 +11,7 @@ #include "stdafx.h" #include "PatternEditorDialogs.h" +#include "FileDialog.h" #include "InputHandler.h" #include "Mainfrm.h" #include "Moddoc.h" @@ -1724,6 +1725,213 @@ *pResult = 0; // bring the tooltip window above other popup windows + ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); + + return TRUE; // message was handled +} + + +///////////////////////////////////////////////////////////////////////// +// Metronome settings + +static constexpr float METRONOME_VOLUME_SCALE = 0.2f; + +BEGIN_MESSAGE_MAP(MetronomeSettingsDlg, DialogBase) + ON_WM_HSCROLL() + + ON_COMMAND(IDC_CHECK1, &MetronomeSettingsDlg::OnToggleMetronome) + ON_COMMAND(IDC_BUTTON1, &MetronomeSettingsDlg::OnBrowseMeasure) + ON_COMMAND(IDC_BUTTON2, &MetronomeSettingsDlg::OnBrowseBeat) + ON_CBN_SELCHANGE(IDC_COMBO1, &MetronomeSettingsDlg::OnSampleChanged) + ON_CBN_SELCHANGE(IDC_COMBO2, &MetronomeSettingsDlg::OnSampleChanged) + ON_EN_KILLFOCUS(IDC_EDIT1, &MetronomeSettingsDlg::OnSampleChanged) + ON_EN_KILLFOCUS(IDC_EDIT2, &MetronomeSettingsDlg::OnSampleChanged) + + ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &MetronomeSettingsDlg::OnToolTipText) +END_MESSAGE_MAP() + + +void MetronomeSettingsDlg::DoDataExchange(CDataExchange* pDX) +{ + DDX_Control(pDX, IDC_SLIDER1, m_volumeSlider); + DDX_Control(pDX, IDC_COMBO1, m_measureCombo); + DDX_Control(pDX, IDC_COMBO2, m_beatCombo); + DDX_Control(pDX, IDC_EDIT1, m_measureEdit); + DDX_Control(pDX, IDC_EDIT2, m_beatEdit); + DDX_Control(pDX, IDC_BUTTON1, m_measureButton); + DDX_Control(pDX, IDC_BUTTON2, m_beatButton); +} + + +MetronomeSettingsDlg::MetronomeSettingsDlg(CWnd *parent) + : DialogBase{IDD_METRONOME_SETTINGS, parent} +{ } + + +void MetronomeSettingsDlg::SetSampleInfo(const mpt::PathString &path, CComboBox &combo, CEdit &edit, CButton &browseButton) +{ + BOOL enable = FALSE; + if(path.empty()) + { + combo.SetCurSel(0); + } else if(path == TrackerSettings::GetDefaultMetronomeSample()) + { + combo.SetCurSel(1); + } else + { + combo.SetCurSel(2); + edit.SetWindowText(path.AsNative().c_str()); + enable = TRUE; + } + edit.EnableWindow(enable); + browseButton.EnableWindow(enable); +} + + +BOOL MetronomeSettingsDlg::OnInitDialog() +{ + DialogBase::OnInitDialog(); + EnableToolTips(); + CheckDlgButton(IDC_CHECK1, TrackerSettings::Instance().metronomeEnabled ? BST_CHECKED : BST_UNCHECKED); + m_volumeSlider.SetRange(static_cast<int>(-48 / METRONOME_VOLUME_SCALE), 0, TRUE); + m_volumeSlider.SetPos(mpt::saturate_round<int>(TrackerSettings::Instance().metronomeVolume / METRONOME_VOLUME_SCALE)); + m_volumeSlider.SetTicFreq(static_cast<int>(3 / METRONOME_VOLUME_SCALE)); + static const TCHAR *Options[] = {_T("Off"), _T("Default (Sine)"), _T("Custom Sample")}; + for(const TCHAR *option : Options) + { + m_measureCombo.AddString(option); + m_beatCombo.AddString(option); + } + SetSampleInfo(TrackerSettings::Instance().metronomeSampleMeasure, m_measureCombo, m_measureEdit, m_measureButton); + SetSampleInfo(TrackerSettings::Instance().metronomeSampleBeat, m_beatCombo, m_beatEdit, m_beatButton); + return TRUE; +} + + +void MetronomeSettingsDlg::OnHScroll(UINT, UINT, CScrollBar *bar) +{ + if(bar == static_cast<CWnd *>(&m_volumeSlider)) + { + TrackerSettings::Instance().metronomeVolume = m_volumeSlider.GetPos() * METRONOME_VOLUME_SCALE; + CMainFrame::GetMainFrame()->UpdateMetronomeVolume(); + } +} + + +void MetronomeSettingsDlg::OnToggleMetronome() +{ + TrackerSettings::Instance().metronomeEnabled = IsDlgButtonChecked(IDC_CHECK1) != BST_UNCHECKED; + CMainFrame::GetMainFrame()->UpdateMetronomeSamples(); +} + + +bool MetronomeSettingsDlg::GetSampleInfo(Setting<mpt::PathString> &path, CComboBox &combo, CEdit &edit, CButton &browseButton) +{ + CString s; + bool modified = false; + BOOL enable = FALSE; + switch(combo.GetCurSel()) + { + case 0: + if(path != mpt::PathString{}) + { + modified = true; + path = {}; + } + break; + case 1: + if(path != TrackerSettings::GetDefaultMetronomeSample()) + { + modified = true; + path = TrackerSettings::GetDefaultMetronomeSample(); + } + break; + case 2: + edit.GetWindowText(s); + if(auto newPath = mpt::PathString::FromCString(s); path != newPath) + { + path = newPath; + modified = true; + } + enable = TRUE; + break; + } + edit.EnableWindow(enable); + browseButton.EnableWindow(enable); + return modified; +} + + +void MetronomeSettingsDlg::OnSampleChanged() +{ + bool modified = GetSampleInfo(TrackerSettings::Instance().metronomeSampleMeasure, m_measureCombo, m_measureEdit, m_measureButton); + modified |= GetSampleInfo(TrackerSettings::Instance().metronomeSampleBeat, m_beatCombo, m_beatEdit, m_beatButton); + if(modified) + CMainFrame::GetMainFrame()->LoadMetronomeSamples(); +} + + +mpt::PathString MetronomeSettingsDlg::BrowseForSample(const mpt::PathString &path) +{ + static int lastIndex = 0; + FileDialog dlg = OpenFileDialog() + .EnableAudioPreview() + .ExtensionFilter(ConstructSampleFormatFileFilter(false)) + .WorkingDirectory(path.empty() ? TrackerSettings::Instance().PathSamples.GetWorkingDir() : path.GetDirectoryWithDrive()) + .DefaultFilename(path.GetFilename()) + .FilterIndex(&lastIndex); + if(!dlg.Show(this)) + return {}; + TrackerSettings::Instance().PathSamples.SetWorkingDir(dlg.GetWorkingDirectory()); + return dlg.GetFirstFile(); +} + + +void MetronomeSettingsDlg::OnBrowseMeasure() +{ + auto newPath = BrowseForSample(TrackerSettings::Instance().metronomeSampleMeasure); + if(newPath.empty()) + return; + m_measureEdit.SetWindowText(newPath.ToCString()); + OnSampleChanged(); +} + + +void MetronomeSettingsDlg::OnBrowseBeat() +{ + auto newPath = BrowseForSample(TrackerSettings::Instance().metronomeSampleBeat); + if(newPath.empty()) + return; + m_beatEdit.SetWindowText(newPath.ToCString()); + OnSampleChanged(); +} + + +BOOL MetronomeSettingsDlg::OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult) +{ + auto pTTT = reinterpret_cast<TOOLTIPTEXT *>(pNMHDR); + UINT_PTR id = pNMHDR->idFrom; + if(pTTT->uFlags & TTF_IDISHWND) + { + // idFrom is actually the HWND of the tool + id = static_cast<UINT_PTR>(::GetDlgCtrlID(reinterpret_cast<HWND>(id))); + } + + CString s; + switch(id) + { + case IDC_SLIDER1: + s = (m_volumeSlider.GetPos() >= 0) ? _T("+") : _T(""); + s.AppendFormat(_T("%.2f dB"), m_volumeSlider.GetPos() * METRONOME_VOLUME_SCALE); + break; + default: + return FALSE; + } + + mpt::String::WriteCStringBuf(pTTT->szText) = s; + *pResult = 0; + + // bring the tooltip window above other popup windows ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOOWNERZORDER); return TRUE; // message was handled Modified: trunk/OpenMPT/mptrack/PatternEditorDialogs.h ============================================================================== --- trunk/OpenMPT/mptrack/PatternEditorDialogs.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/PatternEditorDialogs.h Tue Dec 31 23:37:32 2024 (r22669) @@ -218,4 +218,35 @@ DECLARE_MESSAGE_MAP(); }; + +class MetronomeSettingsDlg : public DialogBase +{ +public: + MetronomeSettingsDlg(CWnd *parent = nullptr); + +protected: + void DoDataExchange(CDataExchange *pDX) override; + BOOL OnInitDialog() override; + + void SetSampleInfo(const mpt::PathString &path, CComboBox &combo, CEdit &edit, CButton &browseButton); + bool GetSampleInfo(Setting<mpt::PathString> &path, CComboBox &combo, CEdit &edit, CButton &browseButton); + mpt::PathString BrowseForSample(const mpt::PathString &path); + + afx_msg void OnHScroll(UINT, UINT, CScrollBar *); + afx_msg void OnToggleMetronome(); + afx_msg void OnSampleChanged(); + afx_msg void OnBrowseMeasure(); + afx_msg void OnBrowseBeat(); + BOOL OnToolTipText(UINT, NMHDR *pNMHDR, LRESULT *pResult); + + DECLARE_MESSAGE_MAP(); + +protected: + CSliderCtrl m_volumeSlider; + CComboBox m_measureCombo, m_beatCombo; + CEdit m_measureEdit, m_beatEdit; + CButton m_measureButton, m_beatButton; +}; + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/TrackerSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/TrackerSettings.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -291,6 +291,10 @@ , patternAlwaysDrawWholePatternOnScrollSlow(conf, UL_("Pattern Editor"), UL_("AlwaysDrawWholePatternOnScrollSlow"), false) , orderListOldDropBehaviour(conf, UL_("Pattern Editor"), UL_("OrderListOldDropBehaviour"), false) , autoHideVolumeColumnForMOD(conf, UL_("Pattern Editor"), UL_("AutoHideVolumeColumnForMOD"), false) + , metronomeEnabled(conf, UL_("Pattern Editor"), UL_("MetronomeEnabled"), false) + , metronomeVolume(conf, UL_("Pattern Editor"), UL_("MetronomeVolume"), -3.0f) + , metronomeSampleMeasure(conf, UL_("Pattern Editor"), UL_("MetronomeSampleMeasure"), GetDefaultMetronomeSample()) + , metronomeSampleBeat(conf, UL_("Pattern Editor"), UL_("MetronomeSampleBeat"), GetDefaultMetronomeSample()) // Sample Editor , m_SampleUndoBufferSize(conf, UL_("Sample Editor"), UL_("UndoBufferSize"), SampleUndoBufferSize()) , sampleEditorKeyBehaviour(conf, UL_("Sample Editor"), UL_("KeyBehaviour"), seNoteOffOnNewKey) Modified: trunk/OpenMPT/mptrack/TrackerSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/TrackerSettings.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/TrackerSettings.h Tue Dec 31 23:37:32 2024 (r22669) @@ -838,6 +838,10 @@ CachedSetting<bool> patternAlwaysDrawWholePatternOnScrollSlow; CachedSetting<bool> orderListOldDropBehaviour; Setting<bool> autoHideVolumeColumnForMOD; + Setting<bool> metronomeEnabled; + Setting<float> metronomeVolume; + Setting<mpt::PathString> metronomeSampleMeasure; + Setting<mpt::PathString> metronomeSampleBeat; // Sample Editor @@ -1005,6 +1009,8 @@ static mpt::PathString GetDefaultAutosavePath(); + static mpt::PathString GetDefaultMetronomeSample() { return P_("*sine"); } + protected: static std::vector<uint32> GetDefaultSampleRates(); Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -4414,6 +4414,7 @@ case kcPatternPlayRow: OnPatternStep(); return wParam; case kcPatternRecord: OnPatternRecord(); return wParam; case kcToggleOverflowPaste: PostCtrlMessage(CTRLMSG_TOGGLE_OVERFLOW_PASTE); return wParam; + case kcToggleMetronome: PostCtrlMessage(CTRLMSG_TOGGLE_METRONOME); return wParam; case kcCursorCopy: OnCursorCopy(); return wParam; case kcCursorPaste: OnCursorPaste(); return wParam; case kcChannelMute: Modified: trunk/OpenMPT/mptrack/WindowMessages.h ============================================================================== --- trunk/OpenMPT/mptrack/WindowMessages.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/WindowMessages.h Tue Dec 31 23:37:32 2024 (r22669) @@ -77,6 +77,7 @@ CTRLMSG_PREVORDER, CTRLMSG_NEXTORDER, CTRLMSG_SETRECORD, + CTRLMSG_TOGGLE_METRONOME, CTRLMSG_TOGGLE_OVERFLOW_PASTE, CTRLMSG_PAT_DUPPATTERN, CTRLMSG_PAT_UPDATE_TOOLBAR, Modified: trunk/OpenMPT/mptrack/mptrack.rc ============================================================================== --- trunk/OpenMPT/mptrack/mptrack.rc Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/mptrack.rc Tue Dec 31 23:37:32 2024 (r22669) @@ -660,6 +660,28 @@ CONTROL "",IDC_PROGRESS1,"msctls_progress32",NOT WS_VISIBLE | WS_BORDER,6,138,144,14 END +IDD_METRONOME_SETTINGS DIALOGEX 0, 0, 279, 207 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Metronome Settings" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "&Close",IDOK,222,186,50,14 + GROUPBOX "Common Settings",IDC_STATIC,6,6,264,54 + CONTROL "&Enable Metronome",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,18,75,10 + LTEXT "&Volume:",IDC_STATIC,12,39,26,8 + CONTROL "",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS | TBS_TOOLTIPS | WS_TABSTOP,54,36,204,15 + GROUPBOX "Measure",IDC_STATIC,6,66,264,55 + COMBOBOX IDC_COMBO1,12,78,192,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Custom &Sample:",IDC_STATIC,12,98,54,8 + EDITTEXT IDC_EDIT1,72,96,134,12,ES_AUTOHSCROLL + PUSHBUTTON "&Browse...",IDC_BUTTON1,210,96,50,12 + GROUPBOX "Beat",IDC_STATIC,6,124,264,55 + COMBOBOX IDC_COMBO2,12,138,192,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Custom &Sample:",IDC_STATIC,12,158,54,8 + EDITTEXT IDC_EDIT2,72,156,134,12,ES_AUTOHSCROLL + PUSHBUTTON "&Browse...",IDC_BUTTON2,210,156,50,12 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -915,6 +937,14 @@ TOPMARGIN, 7 BOTTOMMARGIN, 151 END + + IDD_METRONOME_SETTINGS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 272 + TOPMARGIN, 7 + BOTTOMMARGIN, 200 + END END #endif // APSTUDIO_INVOKED @@ -1108,6 +1138,11 @@ 0 END +IDD_METRONOME_SETTINGS AFX_DIALOG_LAYOUT +BEGIN + 0 +END + #endif // German (Germany) resources ///////////////////////////////////////////////////////////////////////////// @@ -1484,30 +1519,30 @@ LTEXT "Song Message:",IDC_STATIC,4,2,76,8 END -IDD_CONTROL_PATTERNS DIALOGEX 0, 0, 560, 86 +IDD_CONTROL_PATTERNS DIALOGEX 0, 0, 566, 86 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | WS_TABSTOP | 0x4d,2,4,370,18 + CONTROL "Toolbar1",IDC_TOOLBAR1,"ToolbarWindow32",WS_GROUP | WS_TABSTOP | 0x4d,2,4,382,18 CONTROL "Spin1",IDC_SPIN_INSTRUMENT,"msctls_updown32",0x0,6,31,11,12 - COMBOBOX IDC_COMBO_INSTRUMENT,18,31,120,137,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,144,30,33,13,0,WS_EX_STATICEDGE - RTEXT "Edit Step",IDC_STATIC,180,33,30,8,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_SPACING,216,31,28,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,236,31,11,11 - CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,252,33,57,8 - CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,312,33,55,8 - LTEXT "Pattern Name",IDC_STATIC_PATTERNNAME,384,33,48,8,SS_CENTERIMAGE - EDITTEXT IDC_EDIT_PATTERNNAME,438,31,109,12,ES_AUTOHSCROLL - LTEXT "Sequence",IDC_STATIC_SEQUENCE_NAME,384,10,36,8 - EDITTEXT IDC_EDIT_SEQNUM,420,8,28,12,ES_AUTOHSCROLL | ES_NUMBER - CONTROL "",IDC_SPIN_SEQNUM,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,438,6,11,11 - EDITTEXT IDC_EDIT_SEQUENCE_NAME,450,8,97,12,ES_AUTOHSCROLL - PUSHBUTTON "<<",IDC_BUTTON2,3,51,14,15,0,WS_EX_STATICEDGE - PUSHBUTTON ">>",IDC_BUTTON1,15,51,14,15,0,WS_EX_STATICEDGE - GROUPBOX "",IDC_STATIC,3,23,369,24 - GROUPBOX "",IDC_STATIC_SEQUENCE_NAME_FRAME,378,0,174,24 - GROUPBOX "",IDC_STATIC,378,23,174,24 + COMBOBOX IDC_COMBO_INSTRUMENT,18,31,132,137,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Plugin",IDC_PATINSTROPLUGGUI,156,30,33,13 + RTEXT "Edit Step",IDC_STATIC,192,33,30,8,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_SPACING,228,31,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "Spin1",IDC_SPIN_SPACING,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,248,31,11,11 + CONTROL "Loop Pattern",IDC_PATTERN_LOOP,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,264,33,57,8 + CONTROL "Follow Song",IDC_PATTERN_FOLLOWSONG,"Button",BS_AUTOCHECKBOX | BS_FLAT | WS_TABSTOP,324,33,55,8 + LTEXT "Pattern Name",IDC_STATIC_PATTERNNAME,396,33,48,8,SS_CENTERIMAGE + EDITTEXT IDC_EDIT_PATTERNNAME,450,31,109,12,ES_AUTOHSCROLL + LTEXT "Sequence",IDC_STATIC_SEQUENCE_NAME,396,10,36,8 + EDITTEXT IDC_EDIT_SEQNUM,432,8,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_SPIN_SEQNUM,"msctls_updown32",UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,450,6,11,11 + EDITTEXT IDC_EDIT_SEQUENCE_NAME,462,8,97,12,ES_AUTOHSCROLL + PUSHBUTTON "<<",IDC_BUTTON2,3,51,14,15 + PUSHBUTTON ">>",IDC_BUTTON1,15,51,14,15 + GROUPBOX "",IDC_STATIC,3,23,381,24 + GROUPBOX "",IDC_STATIC_SEQUENCE_NAME_FRAME,390,0,174,24 + GROUPBOX "",IDC_STATIC,390,23,174,24 END IDD_CONTROL_SAMPLES DIALOGEX 0, 0, 560, 106 @@ -2427,7 +2462,7 @@ IDD_CONTROL_PATTERNS, DIALOG BEGIN - RIGHTMARGIN, 548 + RIGHTMARGIN, 554 VERTGUIDE, 39 VERTGUIDE, 134 BOTTOMMARGIN, 76 Modified: trunk/OpenMPT/mptrack/res/originals/pattern_toolbar.pfi ============================================================================== Binary file (source and/or target). No diff available. Modified: trunk/OpenMPT/mptrack/res/pattern_toolbar.png ============================================================================== Binary file (source and/or target). No diff available. Modified: trunk/OpenMPT/mptrack/resource.h ============================================================================== --- trunk/OpenMPT/mptrack/resource.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/mptrack/resource.h Tue Dec 31 23:37:32 2024 (r22669) @@ -100,6 +100,7 @@ #define IDD_MIDIPARAMCONTROL 515 #define IDD_ADDSILENCE 517 #define IDD_OPLEXPORT 518 +#define IDD_METRONOME_SETTINGS 519 #define IDD_OPL_PARAMS 520 #define IDD_CLEANUP_SONG 521 #define IDD_CHANNELSETTINGS 522 @@ -849,6 +850,7 @@ #define IDC_SPIN_ADDSILENCE 2382 #define IDC_SAMPLE_INITOPL 2383 #define IDC_RADIO_RESIZETO 2384 +#define IDC_METRONOME 2385 #define IDC_CHECK_PATRECORD 2386 #define IDC_LOAD_COLORSCHEME 2387 #define IDC_SAVE_COLORSCHEME 2388 @@ -1149,6 +1151,7 @@ #define ID_VSTMACRO_INFO 36002 #define ID_VSTINPUT_INFO 36003 #define ID_FILE_NEWMOD_PC 36004 +#define ID_METRONOME_SETTINGS 36005 #define ID_APPROX_BPM 36007 #define ID_FACTORY_MENU 36008 #define ID_PLUG_BYPASS 36009 Modified: trunk/OpenMPT/soundlib/Fastmix.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Fastmix.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/soundlib/Fastmix.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -305,8 +305,6 @@ // Render count * number of channels samples void CSoundFile::CreateStereoMix(int count) { - mixsample_t *pOfsL, *pOfsR; - if(!count) return; @@ -315,17 +313,24 @@ if(m_MixerSettings.gnChannels > 2) StereoFill(MixRearBuffer, count, m_surroundROfsVol, m_surroundLOfsVol); - CHANNELINDEX nchmixed = 0; + // Channels that are actually mixed and not skipped (because they are paused or muted) + CHANNELINDEX numChannelsMixed = 0; for(uint32 nChn = 0; nChn < m_nMixChannels; nChn++) { - ModChannel &chn = m_PlayState.Chn[m_PlayState.ChnMix[nChn]]; + if(MixChannel(count, m_PlayState.Chn[m_PlayState.ChnMix[nChn]], m_PlayState.ChnMix[nChn], numChannelsMixed < m_MixerSettings.m_nMaxMixChannels)) + numChannelsMixed++; + } + m_nMixStat = std::max(m_nMixStat, numChannelsMixed); +} - if(!chn.pCurrentSample && !chn.nLOfs && !chn.nROfs) - continue; - pOfsR = &m_dryROfsVol; - pOfsL = &m_dryLOfsVol; +bool CSoundFile::MixChannel(int count, ModChannel &chn, CHANNELINDEX channel, bool doMix) +{ + if(chn.pCurrentSample || chn.nLOfs || chn.nROfs) + { + mixsample_t *pOfsR = &m_dryROfsVol; + mixsample_t *pOfsL = &m_dryLOfsVol; uint32 functionNdx = MixFuncTable::ResamplingModeToMixFlags(static_cast<ResamplingMode>(chn.resamplingMode)); if(chn.dwFlags[CHN_16BIT]) functionNdx |= MixFuncTable::ndx16Bit; @@ -351,14 +356,13 @@ pOfsL = &m_surroundLOfsVol; } - //Look for plugins associated with this implicit tracker channel. + // Look for plugins associated with this implicit tracker channel. #ifndef NO_PLUGINS - PLUGINDEX nMixPlugin = GetBestPlugin(chn, m_PlayState.ChnMix[nChn], PrioritiseInstrument, RespectMutes); - - if ((nMixPlugin > 0) && (nMixPlugin <= MAX_MIXPLUGINS) && m_MixPlugins[nMixPlugin - 1].pMixPlugin != nullptr) + const PLUGINDEX mixPlugin = GetBestPlugin(chn, channel, PrioritiseInstrument, RespectMutes); + if((mixPlugin > 0) && (mixPlugin <= MAX_MIXPLUGINS) && m_MixPlugins[mixPlugin - 1].pMixPlugin != nullptr) { // Render into plugin buffer instead of global buffer - SNDMIXPLUGINSTATE &mixState = m_MixPlugins[nMixPlugin - 1].pMixPlugin->m_MixState; + SNDMIXPLUGINSTATE &mixState = m_MixPlugins[mixPlugin - 1].pMixPlugin->m_MixState; if (mixState.pMixBuffer) { pbuffer = mixState.pMixBuffer; @@ -379,13 +383,13 @@ *pOfsR += chn.nROfs; *pOfsL += chn.nLOfs; chn.nROfs = chn.nLOfs = 0; - continue; + return false; } MixLoopState mixLoopState(*this, chn); //////////////////////////////////////////////////// - CHANNELINDEX naddmix = 0; + bool addToMix = false; int nsamples = count; // Keep mixing this sample until the buffer is filled. do @@ -412,14 +416,14 @@ break; } - // Should we mix this channel ? - if((nchmixed >= m_MixerSettings.m_nMaxMixChannels) // Too many channels - || (!chn.nRampLength && !(chn.leftVol | chn.rightVol))) // Channel is completely silent + // Should we mix this channel? + if(!doMix // Too many channels + || (!chn.nRampLength && !(chn.leftVol | chn.rightVol))) // Channel is completely silent { chn.position += chn.increment * nSmpCount; chn.nROfs = chn.nLOfs = 0; pbuffer += nSmpCount * 2; - naddmix = 0; + addToMix = false; } #ifdef MODPLUG_TRACKER else if(m_SamplePlayLengths != nullptr) @@ -456,7 +460,7 @@ chn.nROfs += *(pbufmax - 2); chn.nLOfs += *(pbufmax - 1); pbuffer = pbufmax; - naddmix = 1; + addToMix = true; } nsamples -= nSmpCount; @@ -525,16 +529,16 @@ // Restore sample pointer in case it got changed through loop wrap-around chn.pCurrentSample = mixLoopState.samplePointer; - nchmixed += naddmix; #ifndef NO_PLUGINS - if(naddmix && nMixPlugin > 0 && nMixPlugin <= MAX_MIXPLUGINS && m_MixPlugins[nMixPlugin - 1].pMixPlugin) + if(addToMix && mixPlugin > 0 && mixPlugin <= MAX_MIXPLUGINS && m_MixPlugins[mixPlugin - 1].pMixPlugin) { - m_MixPlugins[nMixPlugin - 1].pMixPlugin->ResetSilence(); + m_MixPlugins[mixPlugin - 1].pMixPlugin->ResetSilence(); } #endif // NO_PLUGINS + return addToMix; } - m_nMixStat = std::max(m_nMixStat, nchmixed); + return false; } Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -6723,6 +6723,33 @@ } } } + + // Metronome + if(IsMetronomeEnabled() && !IsRenderingToDisc() && !m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]) + { + const ROWINDEX rpm = m_PlayState.m_nCurrentRowsPerMeasure ? m_PlayState.m_nCurrentRowsPerMeasure : DEFAULT_ROWS_PER_MEASURE; + const ROWINDEX rpb = m_PlayState.m_nCurrentRowsPerBeat ? m_PlayState.m_nCurrentRowsPerBeat : DEFAULT_ROWS_PER_BEAT; + const ModSample *sample = nullptr; + if(!m_PlayState.m_lTotalSampleCount || !(m_PlayState.m_nRow % rpm)) + sample = m_metronomeMeasure; + else if(!(m_PlayState.m_nRow % rpm % rpb)) + sample = m_metronomeBeat; + if(sample) + { + m_metronomeChn.pModSample = sample; + m_metronomeChn.pCurrentSample = sample->samplev(); + m_metronomeChn.dwFlags = (sample->uFlags & CHN_SAMPLEFLAGS) | CHN_NOREVERB; + m_metronomeChn.position.Set(0); + m_metronomeChn.increment = SamplePosition::Ratio(sample->nC5Speed, m_MixerSettings.gdwMixingFreq); + m_metronomeChn.rampLeftVol = m_metronomeChn.rampRightVol = m_metronomeChn.leftVol = m_metronomeChn.rightVol = sample->nVolume * 16; + m_metronomeChn.leftRamp = m_metronomeChn.rightRamp = 0; + m_metronomeChn.nLength = m_metronomeChn.pModSample->nLength; + m_metronomeChn.resamplingMode = m_Resampler.m_Settings.SrcMode; + } + } else + { + m_metronomeChn.pCurrentSample = nullptr; + } } #endif // MODPLUG_TRACKER Modified: trunk/OpenMPT/soundlib/Sndfile.h ============================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/soundlib/Sndfile.h Tue Dec 31 23:37:32 2024 (r22669) @@ -734,6 +734,20 @@ protected: void HandleRowTransitionEvents(bool nextPattern); + + const ModSample *m_metronomeMeasure = nullptr; + const ModSample *m_metronomeBeat = nullptr; + ModChannel m_metronomeChn{}; + +public: + void SetMetronomeSamples(const ModSample *measure, const ModSample *beat) + { + m_metronomeMeasure = measure; + m_metronomeBeat = beat; + m_metronomeChn.pModSample = nullptr; + m_metronomeChn.pCurrentSample = nullptr; + } + constexpr bool IsMetronomeEnabled() const noexcept { return m_metronomeMeasure || m_metronomeBeat; } #endif // MODPLUG_TRACKER public: @@ -974,6 +988,7 @@ samplecount_t ReadOneTick(); private: void CreateStereoMix(int count); + bool MixChannel(int count, ModChannel &chn, CHANNELINDEX channel, bool doMix); public: bool FadeSong(uint32 msec); private: Modified: trunk/OpenMPT/soundlib/Sndmix.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp Tue Dec 31 23:04:45 2024 (r22668) +++ trunk/OpenMPT/soundlib/Sndmix.cpp Tue Dec 31 23:37:32 2024 (r22669) @@ -99,6 +99,9 @@ #ifndef NO_DSP m_BitCrush.Initialize(bReset, m_MixerSettings.gdwMixingFreq); #endif +#ifdef MODPLUG_TRACKER + m_metronomeChn.pCurrentSample = nullptr; +#endif if(m_opl) { m_opl->Initialize(m_MixerSettings.gdwMixingFreq); @@ -339,6 +342,15 @@ ProcessDSP(countChunk); } +#ifdef MODPLUG_TRACKER + // Metronome needs to be mixed last, so that it is not affected by global volume, plugins, DSP effects, etc... + // It will still be visible on VU Meters though, which is not optimal. + if(IsMetronomeEnabled()) + { + MixChannel(countChunk, m_metronomeChn, CHANNELINDEX_INVALID, true); + } +#endif // MODPLUG_TRACKER + if(m_MixerSettings.gnChannels == 4) { InterleaveFrontRear(MixSoundBuffer, MixRearBuffer, countChunk); @@ -448,8 +460,6 @@ { m_PlayState.m_nCurrentOrder = m_lockOrderStart; } -#else - MPT_UNUSED_VARIABLE(patternTransition); #endif // MODPLUG_TRACKER m_PlayState.UpdatePPQ(patternTransition); @@ -2732,7 +2742,7 @@ break; default: break; - } + } } } |
From: <sv...@op...> - 2024-12-31 22:04:57
|
Author: sagamusix Date: Tue Dec 31 23:04:45 2024 New Revision: 22668 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22668 Log: [Fix] Pattern tab: Using the Toggle Overflow Paste shortcut didn't cause any visual updates at all. [Fix] Pattern tab: Checking or unchecking Overflow Paste in one pattern editor didn't update the display in other pattern editors. Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/WindowMessages.h Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp Tue Dec 31 23:04:45 2024 (r22668) @@ -180,7 +180,7 @@ m_SpinInstrument.SetPos(0); SetDlgItemInt(IDC_EDIT_SPACING, TrackerSettings::Instance().gnPatternSpacing); - CheckDlgButton(IDC_PATTERN_FOLLOWSONG, !(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FOLLOWSONGOFF)); + CheckDlgButton(IDC_PATTERN_FOLLOWSONG, (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_FOLLOWSONGOFF) ? BST_UNCHECKED : BST_CHECKED); m_SpinSequence.SetRange32(1, m_sndFile.Order.GetNumSequences()); m_SpinSequence.SetPos(m_sndFile.Order.GetCurrentSequenceIndex() + 1); @@ -188,7 +188,7 @@ m_OrderList.SetFocus(); - UpdateView(PatternHint().Names().ModType(), NULL); + UpdateView(PatternHint().Names().ModType(), nullptr); RecalcLayout(); m_initialized = true; @@ -229,7 +229,7 @@ cx += 2; if((cx > 0) && (cy > 0)) { - m_OrderList.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME); + m_OrderList.SetWindowPos(nullptr, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOZORDER | SWP_DRAWFRAME); } } } @@ -279,7 +279,6 @@ if(hintType[HINT_MPTOPTIONS]) { m_ToolBar.UpdateStyle(); - m_ToolBar.SetState(ID_OVERFLOWPASTE, ((TrackerSettings::Instance().m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TBSTATE_CHECKED : 0) | TBSTATE_ENABLED); } bool instrPluginsChanged = false; @@ -442,7 +441,7 @@ case CTRLMSG_FORCEREFRESH: //refresh GUI - m_OrderList.InvalidateRect(NULL, FALSE); + m_OrderList.InvalidateRect(nullptr, FALSE); break; case CTRLMSG_GETCURRENTORDER: @@ -473,12 +472,20 @@ break; case CTRLMSG_SETRECORD: - if (lParam >= 0) m_bRecord = (BOOL)(lParam); else m_bRecord = !m_bRecord; - m_ToolBar.SetState(IDC_PATTERN_RECORD, ((m_bRecord) ? TBSTATE_CHECKED : 0)|TBSTATE_ENABLED); - TrackerSettings::Instance().gbPatternRecord = (m_bRecord != 0); + if(lParam >= 0) + m_bRecord = lParam != 0; + else + m_bRecord = !m_bRecord; + m_ToolBar.CheckButton(IDC_PATTERN_RECORD, m_bRecord ? TRUE : FALSE); + TrackerSettings::Instance().gbPatternRecord = m_bRecord; SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); break; + case CTRLMSG_TOGGLE_OVERFLOW_PASTE: + m_ToolBar.CheckButton(ID_OVERFLOWPASTE, m_ToolBar.IsButtonChecked(ID_OVERFLOWPASTE) ? FALSE : TRUE); + OnToggleOverflowPaste(); + break; + case CTRLMSG_PREVORDER: m_OrderList.SetCurSel(Order().GetPreviousOrderIgnoringSkips(m_OrderList.GetCurSel(true).firstOrd), true); break; @@ -487,14 +494,13 @@ m_OrderList.SetCurSel(Order().GetNextOrderIgnoringSkips(m_OrderList.GetCurSel(true).firstOrd), true); break; - //rewbs.customKeys case CTRLMSG_PAT_FOLLOWSONG: // parameters: 0 = turn off, 1 = toggle { UINT state = FALSE; if(lParam == 1) // toggle { - state = !IsDlgButtonChecked(IDC_PATTERN_FOLLOWSONG); + state = IsDlgButtonChecked(IDC_PATTERN_FOLLOWSONG) != BST_UNCHECKED; } CheckDlgButton(IDC_PATTERN_FOLLOWSONG, state); OnFollowSong(); @@ -530,6 +536,10 @@ UpdateView(SequenceHint(static_cast<SEQUENCEINDEX>(lParam)).Names(), nullptr); break; + case CTRLMSG_PAT_UPDATE_TOOLBAR: + m_ToolBar.CheckButton(ID_OVERFLOWPASTE, (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_OVERFLOWPASTE) ? TRUE : FALSE); + break; + default: return CModControlDlg::OnModCtrlMsg(wParam, lParam); } @@ -811,8 +821,8 @@ m_OrderList.Invalidate(FALSE); SetCurrentPattern(newPat); m_modDoc.SetModified(); - m_modDoc.UpdateAllViews(NULL, PatternHint(newPat).Names(), this); - m_modDoc.UpdateAllViews(NULL, SequenceHint().Data(), this); + m_modDoc.UpdateAllViews(nullptr, PatternHint(newPat).Names(), this); + m_modDoc.UpdateAllViews(nullptr, SequenceHint().Data(), this); SwitchToView(); } } @@ -1060,9 +1070,8 @@ void CCtrlPatterns::OnPatternRecord() { - UINT nState = m_ToolBar.GetState(IDC_PATTERN_RECORD); - m_bRecord = ((nState & TBSTATE_CHECKED) != 0); - TrackerSettings::Instance().gbPatternRecord = (m_bRecord != 0); + m_bRecord = m_ToolBar.IsButtonChecked(IDC_PATTERN_RECORD) != 0; + TrackerSettings::Instance().gbPatternRecord = m_bRecord; SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); SwitchToView(); } @@ -1070,23 +1079,29 @@ void CCtrlPatterns::OnPatternVUMeters() { - UINT nState = m_ToolBar.GetState(ID_PATTERN_VUMETERS); - m_bVUMeters = ((nState & TBSTATE_CHECKED) != 0); + m_bVUMeters = m_ToolBar.IsButtonChecked(ID_PATTERN_VUMETERS) != 0; TrackerSettings::Instance().gbPatternVUMeters = (m_bVUMeters != 0); SendViewMessage(VIEWMSG_SETVUMETERS, m_bVUMeters); SwitchToView(); } -//rewbs.patPlugName + void CCtrlPatterns::OnPatternViewPlugNames() { - UINT nState = m_ToolBar.GetState(ID_VIEWPLUGNAMES); - m_bPluginNames = ((nState & TBSTATE_CHECKED) != 0); + m_bPluginNames = m_ToolBar.IsButtonChecked(ID_VIEWPLUGNAMES) != 0; TrackerSettings::Instance().gbPatternPluginNames = (m_bPluginNames != 0); SendViewMessage(VIEWMSG_SETPLUGINNAMES, m_bPluginNames); SwitchToView(); } -//end rewbs.patPlugName + + +void CCtrlPatterns::OnToggleOverflowPaste() +{ + TrackerSettings::Instance().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; + theApp.PostMessageToAllViews(WM_MOD_CTRLMSG, CTRLMSG_PAT_UPDATE_TOOLBAR); + SwitchToView(); +} + void CCtrlPatterns::OnPatternProperties() { @@ -1189,7 +1204,7 @@ { if(m_sndFile.GetType() & (MOD_TYPE_XM | MOD_TYPE_IT | MOD_TYPE_MPT)) m_modDoc.SetModified(); - m_modDoc.UpdateAllViews(NULL, PatternHint(nPat).Names(), this); + m_modDoc.UpdateAllViews(nullptr, PatternHint(nPat).Names(), this); } } } @@ -1223,7 +1238,7 @@ { CInputHandler *ih = CMainFrame::GetInputHandler(); NMTOOLBAR *pToolBar = reinterpret_cast<NMTOOLBAR *>(pNMHDR); - ClientToScreen(&(pToolBar->rcButton)); // TrackPopupMenu uses screen coords + ClientToScreen(&(pToolBar->rcButton)); const int offset = HighDPISupport::ScalePixels(4, m_hWnd); // Compared to the main toolbar, the offset seems to be a bit wrong here...? int x = pToolBar->rcButton.left + offset, y = pToolBar->rcButton.bottom + offset; const auto visibleColumns = std::bitset<PatternCursor::numColumns>{static_cast<unsigned long>(SendViewMessage(VIEWMSG_GETDETAIL))}; @@ -1288,14 +1303,6 @@ SwitchToView(); } - -void CCtrlPatterns::OnToggleOverflowPaste() -{ - TrackerSettings::Instance().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; - UpdateView(UpdateHint().MPTOptions()); - SwitchToView(); -} - void CCtrlPatterns::TogglePluginEditor() { Modified: trunk/OpenMPT/mptrack/Mptrack.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/Mptrack.cpp Tue Dec 31 23:04:45 2024 (r22668) @@ -302,6 +302,18 @@ } +void CTrackApp::PostMessageToAllViews(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if(auto *pDocTmpl = GetModDocTemplate()) + { + for(auto &doc : *pDocTmpl) + { + doc->PostMessageToAllViews(uMsg, wParam, lParam); + } + } +} + + ///////////////////////////////////////////////////////////////////////////// // Command Line options Modified: trunk/OpenMPT/mptrack/Mptrack.h ============================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/Mptrack.h Tue Dec 31 23:04:45 2024 (r22668) @@ -219,6 +219,7 @@ CString GetFriendlyMIDIPortName(const CString &deviceName, bool isInputPort, bool addDeviceName = true); void UpdateAllViews(UpdateHint hint, CObject *pHint = nullptr); + void PostMessageToAllViews(UINT uMsg, WPARAM wParam = 0, LPARAM lParam = 0); public: inline mpt::recursive_mutex_with_lock_count &GetGlobalMutexRef() { return m_GlobalMutex; } Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 23:04:45 2024 (r22668) @@ -4413,6 +4413,7 @@ case kcNextOrderAtRowEnd: GotoNextOrder(OrderTransitionMode::AtRowEnd); return wParam; case kcPatternPlayRow: OnPatternStep(); return wParam; case kcPatternRecord: OnPatternRecord(); return wParam; + case kcToggleOverflowPaste: PostCtrlMessage(CTRLMSG_TOGGLE_OVERFLOW_PASTE); return wParam; case kcCursorCopy: OnCursorCopy(); return wParam; case kcCursorPaste: OnCursorPaste(); return wParam; case kcChannelMute: @@ -4755,7 +4756,6 @@ case kcDuplicatePattern: SendCtrlMessage(CTRLMSG_PAT_DUPPATTERN); return wParam; case kcSwitchToOrderList: OnSwitchToOrderList(); return wParam; - case kcToggleOverflowPaste: ToggleFlag(TrackerSettings::Instance().m_dwPatternSetup, PATTERN_OVERFLOWPASTE, _T("Overflow Paste")); return wParam; case kcToggleNoteOffRecordPC: ToggleFlag(TrackerSettings::Instance().m_dwPatternSetup, PATTERN_KBDNOTEOFF, _T("Record Note Off")); return wParam; case kcToggleNoteOffRecordMIDI: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_RECORDNOTEOFF, _T("Record MIDI Note Off")); return wParam; case kcToggleOctaveTransposeMIDI: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_TRANSPOSEKEYBOARD, _T("Apply Octave Transpose")); return wParam; Modified: trunk/OpenMPT/mptrack/WindowMessages.h ============================================================================== --- trunk/OpenMPT/mptrack/WindowMessages.h Tue Dec 31 22:14:16 2024 (r22667) +++ trunk/OpenMPT/mptrack/WindowMessages.h Tue Dec 31 23:04:45 2024 (r22668) @@ -77,7 +77,9 @@ CTRLMSG_PREVORDER, CTRLMSG_NEXTORDER, CTRLMSG_SETRECORD, + CTRLMSG_TOGGLE_OVERFLOW_PASTE, CTRLMSG_PAT_DUPPATTERN, + CTRLMSG_PAT_UPDATE_TOOLBAR, // Sample-Specific CTRLMSG_SMP_PREVINSTRUMENT, CTRLMSG_SMP_NEXTINSTRUMENT, |
From: <sv...@op...> - 2024-12-31 21:14:30
|
Author: sagamusix Date: Tue Dec 31 22:14:16 2024 New Revision: 22667 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22667 Log: [New] Pattern tab: Added keyboard shortcuts for toggling various MIDI recording options (https://bugs.openmpt.org/view.php?id=500). [Imp] Pattern tab: Toggle shortcuts (existing and new ones) now show the new toggle status in the status bar (https://bugs.openmpt.org/view.php?id=500). Modified: trunk/OpenMPT/mptrack/CommandSet.cpp trunk/OpenMPT/mptrack/CommandSet.h trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_pat.h Modified: trunk/OpenMPT/mptrack/CommandSet.cpp ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.cpp Tue Dec 31 16:17:05 2024 (r22666) +++ trunk/OpenMPT/mptrack/CommandSet.cpp Tue Dec 31 22:14:16 2024 (r22667) @@ -937,6 +937,12 @@ {2110, kcSetVolumeD, _T("Set volume digit D")}, {2111, kcSetVolumeE, _T("Set volume digit E")}, {2112, kcSetVolumeF, _T("Set volume digit F")}, + {2113, kcToggleOctaveTransposeMIDI, _T("Toggle Apply Octave Transpose to incoming MIDI Notes")}, + {2114, kcToggleContinueSongOnMIDINote, _T("Toggle Continue Song when MIDI Note is received")}, + {2115, kcToggleContinueSongOnMIDIPlayEvents, _T("Toggle Respond to Play / Continue / Stop Song MIDI messages")}, + {2116, kcToggleRecordMIDIVelocity, _T("Toggle Record MIDI Velocity")}, + {2117, kcToggleRecordMIDIPitchBend, _T("Toggle Record MIDI Pitch Bend")}, + {2118, kcToggleRecordMIDICCs, _T("Toggle Record MIDI CCs")}, }; // clang-format on @@ -951,7 +957,7 @@ for(int j = kcStartSampleCues; j <= kcEndSampleCues; j++) { - CString s = MPT_CFORMAT("Preview Sample Cue {}")(j - kcStartSampleCues + 1); + CString s = MPT_CFORMAT("Preview / Set Sample Cue {}")(j - kcStartSampleCues + 1); m_commands[j] = {static_cast<uint32>(1924 + j - kcStartSampleCues), s}; } static_assert(1924 + kcEndSampleCues - kcStartSampleCues < 1950); Modified: trunk/OpenMPT/mptrack/CommandSet.h ============================================================================== --- trunk/OpenMPT/mptrack/CommandSet.h Tue Dec 31 16:17:05 2024 (r22666) +++ trunk/OpenMPT/mptrack/CommandSet.h Tue Dec 31 22:14:16 2024 (r22667) @@ -65,7 +65,7 @@ DECLARE_FLAGSET(KeyEventType) -enum CommandID +enum CommandID : int { kcCommandSetNumNotes = 59, // kcVPEndNotes - kcVPStartNotes @@ -341,6 +341,12 @@ kcToggleOverflowPaste, kcToggleNoteOffRecordPC, kcToggleNoteOffRecordMIDI, + kcToggleOctaveTransposeMIDI, + kcToggleContinueSongOnMIDINote, + kcToggleContinueSongOnMIDIPlayEvents, + kcToggleRecordMIDIVelocity, + kcToggleRecordMIDIPitchBend, + kcToggleRecordMIDICCs, kcToggleVisibilityInstrColumn, kcToggleVisibilityVolumeColumn, kcToggleVisibilityEffectColumn, Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 16:17:05 2024 (r22666) +++ trunk/OpenMPT/mptrack/View_pat.cpp Tue Dec 31 22:14:16 2024 (r22667) @@ -186,7 +186,6 @@ m_nXScroll = m_nYScroll = 0; m_nPattern = 0; m_nSpacing = 0; - m_nAccelChar = 0; PatternFont::UpdateFont(m_hWnd); UpdateSizes(); UpdateScrollSize(); @@ -1864,7 +1863,7 @@ // When trying to solo a channel that is already the only unmuted channel, // this will result in unmuting all channels, in order to satisfy user habits. -// In all other cases, soloing a channel unsoloes all and mutes all except this channel +// In all other cases, soloing a channel unsolos all and mutes all except this channel void CViewPattern::OnSoloChannel(CHANNELINDEX first, CHANNELINDEX last) { CModDoc *pModDoc = GetDocument(); @@ -4226,7 +4225,7 @@ break; case VIEWMSG_SETSPACING: - m_nSpacing = static_cast<UINT>(lParam); + m_nSpacing = static_cast<uint32>(lParam); break; case VIEWMSG_PATTERNPROPERTIES: @@ -4378,6 +4377,18 @@ } +static void ToggleFlag(CachedSetting<uint32> &flagSet, uint32 flag, const TCHAR *description) +{ + flagSet ^= flag; + CString text = description; + if(flagSet & flag) + text += _T(" is now On"); + else + text += _T(" is now Off"); + CMainFrame::GetMainFrame()->SetHelpText(text); +} + + LRESULT CViewPattern::OnCustomKeyMsg(WPARAM wParam, LPARAM lParam) { CModDoc *pModDoc = GetDocument(); @@ -4744,10 +4755,16 @@ case kcDuplicatePattern: SendCtrlMessage(CTRLMSG_PAT_DUPPATTERN); return wParam; case kcSwitchToOrderList: OnSwitchToOrderList(); return wParam; - case kcToggleOverflowPaste: TrackerSettings::Instance().m_dwPatternSetup ^= PATTERN_OVERFLOWPASTE; return wParam; - case kcToggleNoteOffRecordPC: TrackerSettings::Instance().m_dwPatternSetup ^= PATTERN_KBDNOTEOFF; return wParam; - case kcToggleNoteOffRecordMIDI: TrackerSettings::Instance().m_dwMidiSetup ^= MIDISETUP_RECORDNOTEOFF; return wParam; - + case kcToggleOverflowPaste: ToggleFlag(TrackerSettings::Instance().m_dwPatternSetup, PATTERN_OVERFLOWPASTE, _T("Overflow Paste")); return wParam; + case kcToggleNoteOffRecordPC: ToggleFlag(TrackerSettings::Instance().m_dwPatternSetup, PATTERN_KBDNOTEOFF, _T("Record Note Off")); return wParam; + case kcToggleNoteOffRecordMIDI: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_RECORDNOTEOFF, _T("Record MIDI Note Off")); return wParam; + case kcToggleOctaveTransposeMIDI: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_TRANSPOSEKEYBOARD, _T("Apply Octave Transpose")); return wParam; + case kcToggleContinueSongOnMIDINote: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_PLAYPATTERNONMIDIIN, _T("Continue Song when MIDI Note is received")); return wParam; + case kcToggleContinueSongOnMIDIPlayEvents: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_RESPONDTOPLAYCONTROLMSGS, _T("Respond to Play / Continue Song MIDI messages")); return wParam; + case kcToggleRecordMIDIVelocity: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_RECORDVELOCITY, _T("Record MIDI Velocity")); return wParam; + case kcToggleRecordMIDIPitchBend: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_MIDIMACROPITCHBEND, _T("Record MIDI Pitch Bend")); return wParam; + case kcToggleRecordMIDICCs: ToggleFlag(TrackerSettings::Instance().m_dwMidiSetup, MIDISETUP_MIDIMACROCONTROL, _T("Record MIDI CCs")); return wParam; + case kcToggleVisibilityInstrColumn: UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::instrColumn)); return wParam; case kcToggleVisibilityVolumeColumn: UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::volumeColumn)); return wParam; case kcToggleVisibilityEffectColumn : UpdateVisibileColumns(m_visibleColumns.flip(PatternCursor::effectColumn)); return wParam; @@ -4871,7 +4888,7 @@ if(wParam >= kcSetSpacing0 && wParam <= kcSetSpacing9) { - SetSpacing(static_cast<int>(wParam) - kcSetSpacing0); + SetSpacing(static_cast<uint32>(wParam - kcSetSpacing0)); return wParam; } @@ -4898,7 +4915,7 @@ if(wParam >= kcSetVolumeStart && wParam <= kcSetVolumeEnd) { if(IsEditingEnabled_bmsg()) - TempEnterVol(static_cast<int>(wParam) - kcSetVolumeStart); + TempEnterVol(static_cast<CommandID>(wParam)); return wParam; } @@ -4979,7 +4996,7 @@ // Enter volume effect / number in the pattern. -void CViewPattern::TempEnterVol(int v) +void CViewPattern::TempEnterVol(CommandID cmd) { CSoundFile *pSndFile = GetSoundFile(); @@ -4989,7 +5006,8 @@ ModCommand &target = GetCursorCommand(); ModCommand m = target; // This is the command we are about to overwrite const bool isHex = TrackerSettings::Instance().patternVolColHex; - const bool isDigit = (v >= 0x00) && (v <= 0x0F); + const bool isDigit = (cmd >= kcStartVolumeDigits) && (cmd <= kcEndVolumeDigits); + const int v = static_cast<int>(cmd) - kcStartVolumeDigits; if(m.IsPcNote()) { @@ -5009,7 +5027,7 @@ volcmd = VOLCMD_VOLUME; } else { - switch(v + kcSetVolumeStart) + switch(cmd) { case kcSetVolumeVol: volcmd = VOLCMD_VOLUME; break; case kcSetVolumePan: volcmd = VOLCMD_PANNING; break; @@ -5025,6 +5043,8 @@ case kcSetVolumeITPortaUp: volcmd = VOLCMD_PORTAUP; break; case kcSetVolumeITPortaDown: volcmd = VOLCMD_PORTADOWN; break; case kcSetVolumeITOffset: volcmd = VOLCMD_OFFSET; break; + default: + break; } if(m.volcmd == VOLCMD_NONE && volcmd == m_cmdOld.volcmd) { @@ -5078,11 +5098,11 @@ } -void CViewPattern::SetSpacing(int n) +void CViewPattern::SetSpacing(uint32 n) { - if(static_cast<UINT>(n) != m_nSpacing) + if(n != m_nSpacing) { - m_nSpacing = static_cast<UINT>(n); + m_nSpacing = n; PostCtrlMessage(CTRLMSG_SETSPACING, m_nSpacing); } } @@ -5092,11 +5112,8 @@ void CViewPattern::TempEnterFX(ModCommand::COMMAND c, int v) { CSoundFile *pSndFile = GetSoundFile(); - if(pSndFile == nullptr || !IsEditingEnabled_bmsg()) - { return; - } ModCommand &target = GetCursorCommand(); ModCommand m = target; @@ -5154,7 +5171,7 @@ } -// Enter an effect param in the pattenr +// Enter an effect param in the pattern void CViewPattern::TempEnterFXparam(int v) { CSoundFile *pSndFile = GetSoundFile(); Modified: trunk/OpenMPT/mptrack/View_pat.h ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.h Tue Dec 31 16:17:05 2024 (r22666) +++ trunk/OpenMPT/mptrack/View_pat.h Tue Dec 31 22:14:16 2024 (r22667) @@ -23,6 +23,8 @@ OPENMPT_NAMESPACE_BEGIN +enum CommandID : int; + class CModDoc; class CEditCommand; class CEffectVis; @@ -118,7 +120,7 @@ CEditCommand *m_pEditWnd = nullptr; CSize m_szHeader, m_szPluginHeader, m_szCell; CRect m_oldClient; - UINT m_nMidRow, m_nSpacing, m_nAccelChar, m_nLastPlayedRow, m_nLastPlayedOrder; + uint32 m_nMidRow, m_nSpacing, m_nLastPlayedRow, m_nLastPlayedOrder; FlagSet<PatternStatus> m_Status; ROWINDEX m_nPlayRow, m_nNextPlayRow; uint32 m_nPlayTick, m_nTicksOnRow; @@ -312,7 +314,7 @@ void TempEnterIns(int val); void TempEnterOctave(int val); void TempStopOctave(int val); - void TempEnterVol(int v); + void TempEnterVol(CommandID cmd); void TempEnterFX(ModCommand::COMMAND c, int v = -1); void TempEnterFXparam(int v); void EnterAftertouch(ModCommand::NOTE note, int atValue); @@ -328,7 +330,7 @@ PATTERNINDEX GetPrevPattern() const; PATTERNINDEX GetNextPattern() const; - void SetSpacing(int n); + void SetSpacing(uint32 n); void OnClearField(const std::bitset<PatternCursor::numColumns> mask, bool step, bool ITStyle = false); void SetSelectionInstrument(const INSTRUMENTINDEX instr, bool setEmptyInstrument); |
From: <sv...@op...> - 2024-12-31 15:18:02
|
Author: sagamusix Revision: 22666 Property Name: svn:log Action: modified Property diff: --- old property value +++ new property value @@ -1,3 +1,3 @@ -Merged revision(s) 22604 from trunk/OpenMPT: +Reverted revision(s) 22604 from trunk/OpenMPT: [Mod] XMPlay input plugin: Prefer using the default output format requested by XMPlay by default. ........ |
From: <sv...@op...> - 2024-12-31 15:17:16
|
Author: sagamusix Date: Tue Dec 31 16:17:05 2024 New Revision: 22666 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=22666 Log: Merged revision(s) 22604 from trunk/OpenMPT: [Mod] XMPlay input plugin: Prefer using the default output format requested by XMPlay by default. ........ Modified: trunk/OpenMPT/libopenmpt/plugin-common/libopenmpt_plugin_settings.hpp Modified: trunk/OpenMPT/libopenmpt/plugin-common/libopenmpt_plugin_settings.hpp ============================================================================== --- trunk/OpenMPT/libopenmpt/plugin-common/libopenmpt_plugin_settings.hpp Tue Dec 31 11:23:20 2024 (r22665) +++ trunk/OpenMPT/libopenmpt/plugin-common/libopenmpt_plugin_settings.hpp Tue Dec 31 16:17:05 2024 (r22666) @@ -77,10 +77,6 @@ { no_default_format = no_default_format_; player_setting_name = player_setting_name_; - if (!no_default_format) { - samplerate = 0; - channels = 0; - } } void load() { |