From: <sv...@op...> - 2024-07-23 19:28:19
|
Author: sagamusix Date: Tue Jul 23 21:28:11 2024 New Revision: 21267 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=21267 Log: [Fix] When restoring keyboard focus, avoid setting it to disabled controls (https://bugs.openmpt.org/view.php?id=1800). [Mod] Forget previous keyboard focus inside tab when switching between tabs (https://bugs.openmpt.org/view.php?id=1800). [Fix] When switching from sample to OPL slot, make sure that we have a valid keyboard focus (https://bugs.openmpt.org/view.php?id=1799). Modified: trunk/OpenMPT/mptrack/Globals.cpp trunk/OpenMPT/mptrack/Globals.h trunk/OpenMPT/mptrack/View_smp.cpp Modified: trunk/OpenMPT/mptrack/Globals.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Globals.cpp Tue Jul 23 21:12:28 2024 (r21266) +++ trunk/OpenMPT/mptrack/Globals.cpp Tue Jul 23 21:28:11 2024 (r21267) @@ -30,7 +30,7 @@ static void RestoreLastFocusItem(HWND parent, HWND &lastFocusItem) { - if(lastFocusItem && ::IsChild(parent, lastFocusItem)) + if(lastFocusItem && ::IsChild(parent, lastFocusItem) && ::IsWindowEnabled(lastFocusItem)) ::SetFocus(lastFocusItem); else if(HWND firstWnd = ::GetTopWindow(parent)) ::SetFocus(lastFocusItem = firstWnd); @@ -113,7 +113,7 @@ switch(wParam) { case CTRLMSG_SETVIEWWND: - m_hWndView = (HWND)lParam; + m_hWndView = reinterpret_cast<HWND>(lParam); break; case CTRLMSG_ACTIVATEPAGE: @@ -365,6 +365,7 @@ { m_nActiveDlg = page; pDlg = m_Pages[static_cast<size_t>(page)]; + pDlg->ForgetLastFocusItem(); } else // Ctrl window is not created yet - creating one. { m_nActiveDlg = Page::Unknown; @@ -405,7 +406,8 @@ pMainFrm->SetXInfoText(_T("")); pDlg->ShowWindow(SW_SHOW); static_cast<CChildFrame *>(GetParentFrame())->SetSplitterHeight(pDlg->GetSplitPosRef()); - if (m_hWndMDI) ::PostMessage(m_hWndMDI, WM_MOD_CHANGEVIEWCLASS, (WPARAM)lParam, (LPARAM)pDlg); + if(m_hWndMDI) + ::PostMessage(m_hWndMDI, WM_MOD_CHANGEVIEWCLASS, (WPARAM)lParam, (LPARAM)pDlg); return true; } Modified: trunk/OpenMPT/mptrack/Globals.h ============================================================================== --- trunk/OpenMPT/mptrack/Globals.h Tue Jul 23 21:12:28 2024 (r21266) +++ trunk/OpenMPT/mptrack/Globals.h Tue Jul 23 21:28:11 2024 (r21267) @@ -63,6 +63,7 @@ virtual Setting<LONG> &GetSplitPosRef() = 0; void SaveLastFocusItem(HWND hwnd); + void ForgetLastFocusItem() { m_lastFocusItem = nullptr; } void RestoreLastFocusItem(); afx_msg void OnEditCut() { if (m_hWndView) ::SendMessage(m_hWndView, WM_COMMAND, ID_EDIT_CUT, 0); } Modified: trunk/OpenMPT/mptrack/View_smp.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_smp.cpp Tue Jul 23 21:12:28 2024 (r21266) +++ trunk/OpenMPT/mptrack/View_smp.cpp Tue Jul 23 21:28:11 2024 (r21267) @@ -421,28 +421,25 @@ } return; } + const bool hadFocus = m_oplEditor && m_oplEditor->IsChild(GetFocus()); CSoundFile &sndFile = GetDocument()->GetSoundFile(); - ModSample &sample = sndFile.GetSample(m_nSample); - if(sample.uFlags[CHN_ADLIB]) + if(!m_oplEditor) { - if(!m_oplEditor) + try { - try - { - m_oplEditor = std::make_unique<OPLInstrDlg>(*this, sndFile); - } catch(mpt::out_of_memory e) - { - mpt::delete_out_of_memory(e); - } - } - if(m_oplEditor) + m_oplEditor = std::make_unique<OPLInstrDlg>(*this, sndFile); + } catch(mpt::out_of_memory e) { - m_oplEditor->SetPatch(sample.adlib); - m_oplEditor->EnableWindow(TRUE); - auto size = m_oplEditor->GetMinimumSize(); - m_oplEditor->SetWindowPos(nullptr, -m_nScrollPosX, -m_nScrollPosY, std::max(size.cx, m_rcClient.right), std::max(size.cy, m_rcClient.bottom), SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW); + mpt::delete_out_of_memory(e); + return; } } + m_oplEditor->SetPatch(sndFile.GetSample(m_nSample).adlib); + m_oplEditor->EnableWindow(TRUE); + auto size = m_oplEditor->GetMinimumSize(); + m_oplEditor->SetWindowPos(nullptr, -m_nScrollPosX, -m_nScrollPosY, std::max(size.cx, m_rcClient.right), std::max(size.cy, m_rcClient.bottom), SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW); + if(!hadFocus) + m_oplEditor->GetTopWindow()->SetFocus(); } |