Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/mpc-hc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/mpc-hc/MainFrm.cpp')
-rw-r--r--src/mpc-hc/MainFrm.cpp872
1 files changed, 450 insertions, 422 deletions
diff --git a/src/mpc-hc/MainFrm.cpp b/src/mpc-hc/MainFrm.cpp
index c6a565e4f..86fcf7d71 100644
--- a/src/mpc-hc/MainFrm.cpp
+++ b/src/mpc-hc/MainFrm.cpp
@@ -1,6 +1,6 @@
/*
* (C) 2003-2006 Gabest
- * (C) 2006-2014 see Authors.txt
+ * (C) 2006-2015 see Authors.txt
*
* This file is part of MPC-HC.
*
@@ -101,6 +101,9 @@
#include "../Subtitles/RLECodedSubtitle.h"
#include "../Subtitles/PGSSub.h"
+#include <mvrInterfaces.h>
+#include <SubRenderIntf.h>
+
template<typename T>
bool NEARLY_EQ(T a, T b, T tol)
{
@@ -247,7 +250,6 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_UPDATE_COMMAND_UI_RANGE(ID_FILE_OPEN_OPTICAL_DISK_START, ID_FILE_OPEN_OPTICAL_DISK_END, OnUpdateFileOpen)
ON_COMMAND(ID_FILE_REOPEN, OnFileReopen)
ON_COMMAND(ID_FILE_RECYCLE, OnFileRecycle)
- ON_WM_DROPFILES()
ON_COMMAND(ID_FILE_SAVE_COPY, OnFileSaveAs)
ON_UPDATE_COMMAND_UI(ID_FILE_SAVE_COPY, OnUpdateFileSaveAs)
ON_COMMAND(ID_FILE_SAVE_IMAGE, OnFileSaveImage)
@@ -332,9 +334,9 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
// Casimir666
ON_UPDATE_COMMAND_UI(ID_VIEW_TEARING_TEST, OnUpdateViewTearingTest)
ON_COMMAND(ID_VIEW_TEARING_TEST, OnViewTearingTest)
- ON_UPDATE_COMMAND_UI(ID_VIEW_DISPLAYSTATS, OnUpdateViewDisplayStats)
- ON_COMMAND(ID_VIEW_RESETSTATS, OnViewResetStats)
- ON_COMMAND(ID_VIEW_DISPLAYSTATS, OnViewDisplayStatsSC)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_DISPLAY_RENDERER_STATS, OnUpdateViewDisplayRendererStats)
+ ON_COMMAND(ID_VIEW_RESET_RENDERER_STATS, OnViewResetRendererStats)
+ ON_COMMAND(ID_VIEW_DISPLAY_RENDERER_STATS, OnViewDisplayRendererStats)
ON_UPDATE_COMMAND_UI(ID_VIEW_FULLSCREENGUISUPPORT, OnUpdateViewFullscreenGUISupport)
ON_UPDATE_COMMAND_UI(ID_VIEW_HIGHCOLORRESOLUTION, OnUpdateViewHighColorResolution)
ON_UPDATE_COMMAND_UI(ID_VIEW_FORCEINPUTHIGHCOLORRESOLUTION, OnUpdateViewForceInputHighColorResolution)
@@ -417,8 +419,10 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_COMMAND(ID_VIEW_VSYNCOFFSET_INCREASE, OnViewVSyncOffsetIncrease)
ON_COMMAND(ID_VIEW_VSYNCOFFSET_DECREASE, OnViewVSyncOffsetDecrease)
- ON_UPDATE_COMMAND_UI(ID_VIEW_REMAINING_TIME, OnUpdateViewRemainingTime)
- ON_COMMAND(ID_VIEW_REMAINING_TIME, OnViewRemainingTime)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_OSD_DISPLAY_TIME, OnUpdateViewOSDDisplayTime)
+ ON_COMMAND(ID_VIEW_OSD_DISPLAY_TIME, OnViewOSDDisplayTime)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_OSD_SHOW_FILENAME, OnUpdateViewOSDShowFileName)
+ ON_COMMAND(ID_VIEW_OSD_SHOW_FILENAME, OnViewOSDShowFileName)
ON_COMMAND(ID_D3DFULLSCREEN_TOGGLE, OnD3DFullscreenToggle)
ON_COMMAND_RANGE(ID_GOTO_PREV_SUB, ID_GOTO_NEXT_SUB, OnGotoSubtitle)
ON_COMMAND_RANGE(ID_SHIFT_SUB_DOWN, ID_SHIFT_SUB_UP, OnShiftSubtitle)
@@ -465,10 +469,10 @@ BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_COMMAND_RANGE(ID_NORMALIZE, ID_REGAIN_VOLUME, OnNormalizeRegainVolume)
ON_UPDATE_COMMAND_UI_RANGE(ID_NORMALIZE, ID_REGAIN_VOLUME, OnUpdateNormalizeRegainVolume)
ON_COMMAND_RANGE(ID_COLOR_BRIGHTNESS_INC, ID_COLOR_RESET, OnPlayColor)
- ON_UPDATE_COMMAND_UI_RANGE(ID_AFTERPLAYBACK_CLOSE, ID_AFTERPLAYBACK_MONITOROFF, OnUpdateAfterplayback)
- ON_COMMAND_RANGE(ID_AFTERPLAYBACK_CLOSE, ID_AFTERPLAYBACK_MONITOROFF, OnAfterplayback)
- ON_UPDATE_COMMAND_UI(ID_AFTERPLAYBACK_PLAYNEXT, OnUpdateAfterplayback)
- ON_COMMAND_RANGE(ID_AFTERPLAYBACK_PLAYNEXT, ID_AFTERPLAYBACK_PLAYNEXT, OnAfterplayback)
+ ON_UPDATE_COMMAND_UI_RANGE(ID_AFTERPLAYBACK_EXIT, ID_AFTERPLAYBACK_MONITOROFF, OnUpdateAfterplayback)
+ ON_COMMAND_RANGE(ID_AFTERPLAYBACK_EXIT, ID_AFTERPLAYBACK_MONITOROFF, OnAfterplayback)
+ ON_UPDATE_COMMAND_UI_RANGE(ID_AFTERPLAYBACK_PLAYNEXT, ID_AFTERPLAYBACK_DONOTHING, OnUpdateAfterplayback)
+ ON_COMMAND_RANGE(ID_AFTERPLAYBACK_PLAYNEXT, ID_AFTERPLAYBACK_DONOTHING, OnAfterplayback)
ON_COMMAND_RANGE(ID_NAVIGATE_SKIPBACK, ID_NAVIGATE_SKIPFORWARD, OnNavigateSkip)
ON_UPDATE_COMMAND_UI_RANGE(ID_NAVIGATE_SKIPBACK, ID_NAVIGATE_SKIPFORWARD, OnUpdateNavigateSkip)
@@ -674,6 +678,10 @@ void CMainFrame::EventCallback(MpcEvent ev)
case MpcEvent::CHANGING_UI_LANGUAGE:
UpdateUILanguage();
break;
+ case MpcEvent::STREAM_POS_UPDATE_REQUEST:
+ OnTimer(TIMER_STREAMPOSPOLLER);
+ OnTimer(TIMER_STREAMPOSPOLLER2);
+ break;
default:
ASSERT(FALSE);
}
@@ -715,18 +723,16 @@ CMainFrame::CMainFrame()
, m_fOpeningAborted(false)
, m_bBuffering(false)
, m_bUsingDXVA(false)
- , m_fileDropTarget(this)
, m_bTrayIcon(false)
, m_pFullscreenWnd(nullptr)
, m_pVideoWnd(nullptr)
- , m_bRemainingTime(false)
+ , m_bOSDDisplayTime(false)
, m_nCurSubtitle(-1)
, m_lSubtitleShift(0)
, m_nStepForwardCount(0)
, m_rtStepForwardStart(0)
, m_lCurrentChapter(0)
, m_lChapterStartTime(0xFFFFFFFF)
- , m_pTaskbarList(nullptr)
, m_pGraphThread(nullptr)
, m_bOpenedThroughThread(false)
, m_evOpenPrivateFinished(FALSE, TRUE)
@@ -783,6 +789,7 @@ CMainFrame::CMainFrame()
receives.insert(MpcEvent::DISPLAY_MODE_AUTOCHANGING);
receives.insert(MpcEvent::DISPLAY_MODE_AUTOCHANGED);
receives.insert(MpcEvent::CHANGING_UI_LANGUAGE);
+ receives.insert(MpcEvent::STREAM_POS_UPDATE_REQUEST);
EventRouter::EventSelection fires;
fires.insert(MpcEvent::SWITCHING_TO_FULLSCREEN);
fires.insert(MpcEvent::SWITCHED_TO_FULLSCREEN);
@@ -902,7 +909,7 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
pair.second->ShowWindow(SW_HIDE);
}
- m_fileDropTarget.Register(this);
+ m_dropTarget.Register(this);
const CAppSettings& s = AfxGetAppSettings();
@@ -910,8 +917,6 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
ShowTrayIcon(s.fTrayIcon);
- SetFocus();
-
m_pGraphThread = (CGraphThread*)AfxBeginThread(RUNTIME_CLASS(CGraphThread));
if (m_pGraphThread) {
@@ -939,7 +944,7 @@ void CMainFrame::OnDestroy()
{
WTSUnRegisterSessionNotification();
ShowTrayIcon(false);
- m_fileDropTarget.Revoke();
+ m_dropTarget.Revoke();
if (m_pDebugShaders && IsWindow(m_pDebugShaders->m_hWnd)) {
VERIFY(m_pDebugShaders->DestroyWindow());
@@ -988,62 +993,6 @@ void CMainFrame::OnClose()
__super::OnClose();
}
-DROPEFFECT CMainFrame::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
-{
- return DROPEFFECT_NONE;
-}
-
-DROPEFFECT CMainFrame::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
-{
- UpdateControlState(UPDATE_CONTROLS_VISIBILITY);
- UINT CF_URL = RegisterClipboardFormat(_T("UniformResourceLocator"));
- return pDataObject->IsDataAvailable(CF_URL) ? DROPEFFECT_COPY : DROPEFFECT_NONE;
-}
-
-BOOL CMainFrame::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
-{
- UINT CF_URL = RegisterClipboardFormat(_T("UniformResourceLocator"));
- BOOL bResult = FALSE;
-
- // If we are dropping a file, let OnDropFiles handle drag-and-drop
- if (!pDataObject->IsDataAvailable(CF_HDROP) && pDataObject->IsDataAvailable(CF_URL)) {
- FORMATETC fmt = {CF_URL, nullptr, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
- if (HGLOBAL hGlobal = pDataObject->GetGlobalData(CF_URL, &fmt)) {
- LPCSTR pText = (LPCSTR)GlobalLock(hGlobal);
- if (AfxIsValidString(pText)) {
- CStringA url(pText);
-
- SetForegroundWindow();
-
- CAtlList<CString> sl;
- sl.AddTail(CString(url));
-
- m_wndPlaylistBar.Open(sl, true);
- OpenCurPlaylistItem();
-
- GlobalUnlock(hGlobal);
- bResult = TRUE;
- }
- }
- }
-
- return bResult;
-}
-
-DROPEFFECT CMainFrame::OnDropEx(COleDataObject* pDataObject, DROPEFFECT dropDefault, DROPEFFECT dropList, CPoint point)
-{
- return (DROPEFFECT) - 1;
-}
-
-void CMainFrame::OnDragLeave()
-{
-}
-
-DROPEFFECT CMainFrame::OnDragScroll(DWORD dwKeyState, CPoint point)
-{
- return DROPEFFECT_NONE;
-}
-
LPCTSTR CMainFrame::GetRecentFile() const
{
CRecentFileList& MRU = AfxGetAppSettings().MRU;
@@ -1605,7 +1554,7 @@ void CMainFrame::OnWindowPosChanging(WINDOWPOS* lpwndpos)
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
// Only stop screensaver if video playing; allow for audio only
- if ((GetMediaState() == State_Running && !m_fAudioOnly)
+ if ((GetMediaState() == State_Running && !m_fEndOfStream && !m_fAudioOnly)
&& (((nID & 0xFFF0) == SC_SCREENSAVE) || ((nID & 0xFFF0) == SC_MONITORPOWER))) {
TRACE(_T("SC_SCREENSAVE, nID = %u, lParam = %d\n"), nID, lParam);
return;
@@ -1807,7 +1756,7 @@ void CMainFrame::OnTimer(UINT_PTR nIDEvent)
m_lSubtitleShift = 0;
}
- m_wndStatusBar.SetStatusTimer(rtNow, rtDur, !!m_wndSubresyncBar.IsWindowVisible(), GetTimeFormat());
+ m_wndStatusBar.SetStatusTimer(rtNow, rtDur, IsSubresyncBarVisible(), GetTimeFormat());
break;
case PM_DVD:
g_bExternalSubtitleTime = true;
@@ -1830,7 +1779,7 @@ void CMainFrame::OnTimer(UINT_PTR nIDEvent)
}
}
}
- m_wndStatusBar.SetStatusTimer(rtNow, rtDur, !!m_wndSubresyncBar.IsWindowVisible(), GetTimeFormat());
+ m_wndStatusBar.SetStatusTimer(rtNow, rtDur, IsSubresyncBarVisible(), GetTimeFormat());
break;
case PM_ANALOG_CAPTURE:
g_bExternalSubtitleTime = true;
@@ -1879,7 +1828,7 @@ void CMainFrame::OnTimer(UINT_PTR nIDEvent)
case PM_FILE:
// no break
case PM_DVD:
- if (m_bRemainingTime) {
+ if (m_bOSDDisplayTime) {
m_OSD.DisplayMessage(OSD_TOPLEFT, m_wndStatusBar.GetStatusTimer());
}
break;
@@ -1891,7 +1840,7 @@ void CMainFrame::OnTimer(UINT_PTR nIDEvent)
REFERENCE_TIME rtNow = REFERENCE_TIME(tNow - NowNext.startTime) * 10000000;
REFERENCE_TIME rtDur = REFERENCE_TIME(NowNext.duration) * 10000000;
m_wndStatusBar.SetStatusTimer(rtNow, rtDur, false, TIME_FORMAT_MEDIA_TIME);
- if (m_bRemainingTime) {
+ if (m_bOSDDisplayTime) {
m_OSD.DisplayMessage(OSD_TOPLEFT, m_wndStatusBar.GetStatusTimer());
}
} else {
@@ -1983,7 +1932,7 @@ void CMainFrame::OnTimer(UINT_PTR nIDEvent)
DWORD nAvg = pBRI->GetAverageBitRate() / 1000;
if (nAvg > 0) {
- sInfo.AppendFormat(_T("[%u]: %lu/%lu Kb/s "), i, nAvg, pBRI->GetCurrentBitRate() / 1000);
+ sInfo.AppendFormat(_T("[%u]: %lu/%lu kb/s "), i, nAvg, pBRI->GetCurrentBitRate() / 1000);
}
}
i++;
@@ -2234,7 +2183,9 @@ void CMainFrame::DoAfterPlaybackEvent()
bool bExitFullScreen = false;
bool bNoMoreMedia = false;
- if (s.nCLSwitches & CLSW_CLOSE) {
+ if (s.nCLSwitches & CLSW_DONOTHING) {
+ // Do nothing
+ } else if (s.nCLSwitches & CLSW_CLOSE) {
SendMessage(WM_COMMAND, ID_FILE_EXIT);
} else if (s.nCLSwitches & CLSW_MONITOROFF) {
m_fEndOfStream = true;
@@ -2304,6 +2255,10 @@ void CMainFrame::DoAfterPlaybackEvent()
}
}
+ if (AfxGetMyApp()->m_fClosingState) {
+ return;
+ }
+
if (m_fEndOfStream) {
m_OSD.EnableShowMessage(false);
SendMessage(WM_COMMAND, ID_PLAY_PAUSE);
@@ -2345,7 +2300,7 @@ void CMainFrame::GraphEventComplete()
DoAfterPlaybackEvent();
} else if (m_wndPlaylistBar.GetCount() > 1) {
int nLoops = m_nLoops;
- SendMessage(WM_COMMAND, ID_NAVIGATE_SKIPFORWARD);
+ SendMessage(WM_COMMAND, ID_NAVIGATE_SKIPFORWARDFILE);
m_nLoops = nLoops;
} else {
if (GetMediaState() == State_Stopped) {
@@ -2374,7 +2329,7 @@ LRESULT CMainFrame::OnGraphNotify(WPARAM wParam, LPARAM lParam)
LONG evCode = 0;
LONG_PTR evParam1, evParam2;
- while (m_pME && SUCCEEDED(m_pME->GetEvent(&evCode, &evParam1, &evParam2, 0))) {
+ while (!AfxGetMyApp()->m_fClosingState && m_pME && SUCCEEDED(m_pME->GetEvent(&evCode, &evParam1, &evParam2, 0))) {
#ifdef _DEBUG
TRACE(_T("--> CMainFrame::OnGraphNotify on thread: %lu; event: 0x%08x (%ws)\n"), GetCurrentThreadId(), evCode, GetEventString(evCode));
#endif
@@ -4111,6 +4066,13 @@ BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCDS)
bool fSetForegroundWindow = false;
+ auto applyRandomizeSwitch = [&]() {
+ if (s.nCLSwitches & CLSW_RANDOMIZE) {
+ m_wndPlaylistBar.Randomize();
+ s.nCLSwitches &= ~CLSW_RANDOMIZE;
+ }
+ };
+
if ((s.nCLSwitches & CLSW_DVD) && !s.slFiles.IsEmpty()) {
SendMessage(WM_COMMAND, ID_FILE_CLOSEMEDIA);
fSetForegroundWindow = true;
@@ -4141,6 +4103,7 @@ BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCDS)
}
m_wndPlaylistBar.Open(sl, true);
+ applyRandomizeSwitch();
OpenCurPlaylistItem();
} else if (s.nCLSwitches & CLSW_DEVICE) {
SendMessage(WM_COMMAND, ID_FILE_OPENDEVICE);
@@ -4148,7 +4111,7 @@ BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCDS)
CAtlList<CString> sl;
sl.AddTailList(&s.slFiles);
- ParseDirs(sl);
+ PathUtils::ParseDirs(sl);
bool fMulti = sl.GetCount() > 1;
@@ -4176,6 +4139,7 @@ BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCDS)
if ((s.nCLSwitches & CLSW_ADD) && !IsPlaylistEmpty()) {
m_wndPlaylistBar.Append(sl, fMulti, &s.slSubs);
+ applyRandomizeSwitch();
if (s.nCLSwitches & (CLSW_OPEN | CLSW_PLAY)) {
m_wndPlaylistBar.SetLast();
@@ -4186,6 +4150,7 @@ BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCDS)
fSetForegroundWindow = true;
m_wndPlaylistBar.Open(sl, fMulti, &s.slSubs);
+ applyRandomizeSwitch();
OpenCurPlaylistItem((s.nCLSwitches & CLSW_STARTVALID) ? s.rtStart : 0);
s.nCLSwitches &= ~CLSW_STARTVALID;
@@ -4193,6 +4158,7 @@ BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCDS)
}
}
} else {
+ applyRandomizeSwitch();
s.nCLSwitches = CLSW_NONE;
}
@@ -4359,39 +4325,39 @@ void CMainFrame::OnFileReopen()
OpenCurPlaylistItem();
}
-void CMainFrame::OnDropFiles(HDROP hDropInfo)
+DROPEFFECT CMainFrame::OnDropAccept(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
- SetForegroundWindow();
-
- UINT nFiles = ::DragQueryFile(hDropInfo, UINT_MAX, nullptr, 0);
-
- CAtlList<CString> sl;
- for (UINT iFile = 0; iFile < nFiles; iFile++) {
- CString fn;
- fn.ReleaseBuffer(::DragQueryFile(hDropInfo, iFile, fn.GetBuffer(MAX_PATH), MAX_PATH));
- sl.AddTail(fn);
+ ClientToScreen(&point);
+ if (CMouse::CursorOnRootWindow(point, *this)) {
+ UpdateControlState(UPDATE_CONTROLS_VISIBILITY);
+ return (dwKeyState & MK_CONTROL) ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
}
- ::DragFinish(hDropInfo);
+ return DROPEFFECT_NONE;
+}
+
+void CMainFrame::OnDropFiles(CAtlList<CString>& slFiles, DROPEFFECT dropEffect)
+{
+ SetForegroundWindow();
- if (sl.IsEmpty()) {
+ if (slFiles.IsEmpty()) {
return;
}
- if (sl.GetCount() == 1 && OpenBD(sl.GetHead())) {
+ if (slFiles.GetCount() == 1 && OpenBD(slFiles.GetHead())) {
return;
}
- ParseDirs(sl);
+ PathUtils::ParseDirs(slFiles);
SubtitleInput subInputSelected;
if (GetLoadState() == MLS::LOADED && !IsPlaybackCaptureMode() && !m_fAudioOnly && m_pCAP) {
- POSITION pos = sl.GetHeadPosition();
+ POSITION pos = slFiles.GetHeadPosition();
while (pos) {
// Try to open all dropped files as subtitles. If one of the files
// cannot be loaded as subtitle, add all files to the playlist.
SubtitleInput subInput;
- if (LoadSubtitle(sl.GetNext(pos), &subInput)) {
+ if (LoadSubtitle(slFiles.GetNext(pos), &subInput)) {
if (!subInputSelected.pSubStream) {
subInputSelected = subInput;
}
@@ -4408,16 +4374,20 @@ void CMainFrame::OnDropFiles(HDROP hDropInfo)
SetSubtitle(subInputSelected);
CString filenames;
- POSITION pos = sl.GetHeadPosition();
+ POSITION pos = slFiles.GetHeadPosition();
while (pos) {
- CPath fn(sl.GetNext(pos));
+ CPath fn(slFiles.GetNext(pos));
fn.StripPath();
filenames.AppendFormat(pos ? _T("%s, ") : _T("%s"), fn);
}
SendStatusMessage(filenames + ResStr(IDS_SUB_LOADED_SUCCESS), 3000);
} else {
- m_wndPlaylistBar.Open(sl, true);
- OpenCurPlaylistItem();
+ if (dropEffect & DROPEFFECT_COPY) {
+ m_wndPlaylistBar.Append(slFiles, true);
+ } else {
+ m_wndPlaylistBar.Open(slFiles, true);
+ OpenCurPlaylistItem();
+ }
}
}
@@ -5415,7 +5385,7 @@ void CMainFrame::OnViewTearingTest()
AfxGetMyApp()->m_Renderers.m_bTearingTest = !AfxGetMyApp()->m_Renderers.m_bTearingTest;
}
-void CMainFrame::OnUpdateViewDisplayStats(CCmdUI* pCmdUI)
+void CMainFrame::OnUpdateViewDisplayRendererStats(CCmdUI* pCmdUI)
{
const CAppSettings& s = AfxGetAppSettings();
bool supported = (s.iDSVideoRendererType == VIDRNDT_DS_VMR9RENDERLESS
@@ -5426,12 +5396,12 @@ void CMainFrame::OnUpdateViewDisplayStats(CCmdUI* pCmdUI)
pCmdUI->SetCheck(supported && AfxGetMyApp()->m_Renderers.m_iDisplayStats);
}
-void CMainFrame::OnViewResetStats()
+void CMainFrame::OnViewResetRendererStats()
{
AfxGetMyApp()->m_Renderers.m_bResetStats = true; // Reset by "consumer"
}
-void CMainFrame::OnViewDisplayStatsSC()
+void CMainFrame::OnViewDisplayRendererStats()
{
const CAppSettings& s = AfxGetAppSettings();
bool supported = (s.iDSVideoRendererType == VIDRNDT_DS_VMR9RENDERLESS
@@ -6167,24 +6137,67 @@ void CMainFrame::OnViewVSyncOffsetDecrease()
m_OSD.DisplayMessage(OSD_TOPRIGHT, strOSD);
}
-void CMainFrame::OnUpdateViewRemainingTime(CCmdUI* pCmdUI)
+void CMainFrame::OnUpdateViewOSDDisplayTime(CCmdUI* pCmdUI)
{
const CAppSettings& s = AfxGetAppSettings();
- pCmdUI->Enable(s.fShowOSD && (GetLoadState() != MLS::CLOSED));
- pCmdUI->SetCheck(m_bRemainingTime);
+ pCmdUI->Enable(s.fShowOSD && GetLoadState() != MLS::CLOSED);
+ pCmdUI->SetCheck(m_bOSDDisplayTime);
}
-void CMainFrame::OnViewRemainingTime()
+void CMainFrame::OnViewOSDDisplayTime()
{
- m_bRemainingTime = !m_bRemainingTime;
+ m_bOSDDisplayTime = !m_bOSDDisplayTime;
- if (!m_bRemainingTime) {
+ if (!m_bOSDDisplayTime) {
m_OSD.ClearMessage();
}
OnTimer(TIMER_STREAMPOSPOLLER2);
}
+void CMainFrame::OnUpdateViewOSDShowFileName(CCmdUI* pCmdUI)
+{
+ const CAppSettings& s = AfxGetAppSettings();
+ pCmdUI->Enable(s.fShowOSD && GetLoadState() != MLS::CLOSED);
+}
+
+void CMainFrame::OnViewOSDShowFileName()
+{
+ CString strOSD;
+ switch (GetPlaybackMode()) {
+ case PM_FILE:
+ strOSD = GetFileName();
+ break;
+ case PM_DVD:
+ strOSD = _T("DVD");
+ if (m_pDVDI) {
+ CString path;
+ ULONG len = 0;
+ if (SUCCEEDED(m_pDVDI->GetDVDDirectory(path.GetBuffer(MAX_PATH), MAX_PATH, &len)) && len) {
+ path.ReleaseBuffer();
+ if (path.Find(_T("\\VIDEO_TS")) == 2) {
+ strOSD.AppendFormat(_T(" - %s"), GetDriveLabel(CPath(path)));
+ } else {
+ strOSD.AppendFormat(_T(" - %s"), path);
+ }
+ }
+ }
+ break;
+ case PM_ANALOG_CAPTURE:
+ strOSD = GetCaptureTitle();
+ break;
+ case PM_DIGITAL_CAPTURE:
+ UpdateCurrentChannelInfo(true, false);
+ break;
+ default: // Shouldn't happen
+ ASSERT(FALSE);
+ return;
+ }
+ if (!strOSD.IsEmpty()) {
+ m_OSD.DisplayMessage(OSD_TOPLEFT, strOSD);
+ }
+}
+
void CMainFrame::OnD3DFullscreenToggle()
{
CAppSettings& s = AfxGetAppSettings();
@@ -6507,7 +6520,7 @@ void CMainFrame::OnViewFullscreenSecondary()
{
const CAppSettings& s = AfxGetAppSettings();
- if (IsD3DFullScreenMode() || (s.IsD3DFullscreen() && !m_fFullScreen)) {
+ if (IsD3DFullScreenMode() || (s.IsD3DFullscreen() && !m_fFullScreen && !m_fAudioOnly)) {
ToggleD3DFullscreen(false);
} else {
ToggleFullscreen(true, false);
@@ -7163,7 +7176,7 @@ void CMainFrame::OnPlayStop()
__int64 start, stop;
m_wndSeekBar.GetRange(start, stop);
if (!IsPlaybackCaptureMode()) {
- m_wndStatusBar.SetStatusTimer(m_wndSeekBar.GetPos(), stop, !!m_wndSubresyncBar.IsWindowVisible(), GetTimeFormat());
+ m_wndStatusBar.SetStatusTimer(m_wndSeekBar.GetPos(), stop, IsSubresyncBarVisible(), GetTimeFormat());
}
SetAlwaysOnTop(AfxGetAppSettings().iOnTop);
@@ -7407,7 +7420,6 @@ void CMainFrame::OnPlaySeekKey(UINT nID)
void CMainFrame::OnUpdatePlaySeek(CCmdUI* pCmdUI)
{
bool fEnable = false;
- OAFilterState fs = GetMediaState();
if (GetLoadState() == MLS::LOADED) {
fEnable = true;
@@ -8136,58 +8148,89 @@ void CMainFrame::OnAfterplayback(UINT nID)
WORD osdMsg = 0;
bool bDisable = false;
- auto toogleOption = [&](UINT64 nID) {
+ auto toggleOption = [&](UINT64 nID) {
bDisable = !!(s.nCLSwitches & nID);
s.nCLSwitches &= ~CLSW_AFTERPLAYBACK_MASK | nID;
s.nCLSwitches ^= nID;
};
switch (nID) {
- case ID_AFTERPLAYBACK_CLOSE:
- toogleOption(CLSW_CLOSE);
- osdMsg = IDS_AFTERPLAYBACK_CLOSE;
+ case ID_AFTERPLAYBACK_EXIT:
+ toggleOption(CLSW_CLOSE);
+ osdMsg = IDS_AFTERPLAYBACK_EXIT;
break;
case ID_AFTERPLAYBACK_STANDBY:
- toogleOption(CLSW_STANDBY);
+ toggleOption(CLSW_STANDBY);
osdMsg = IDS_AFTERPLAYBACK_STANDBY;
break;
case ID_AFTERPLAYBACK_HIBERNATE:
- toogleOption(CLSW_HIBERNATE);
+ toggleOption(CLSW_HIBERNATE);
osdMsg = IDS_AFTERPLAYBACK_HIBERNATE;
break;
case ID_AFTERPLAYBACK_SHUTDOWN:
- toogleOption(CLSW_SHUTDOWN);
+ toggleOption(CLSW_SHUTDOWN);
osdMsg = IDS_AFTERPLAYBACK_SHUTDOWN;
break;
case ID_AFTERPLAYBACK_LOGOFF:
- toogleOption(CLSW_LOGOFF);
+ toggleOption(CLSW_LOGOFF);
osdMsg = IDS_AFTERPLAYBACK_LOGOFF;
break;
case ID_AFTERPLAYBACK_LOCK:
- toogleOption(CLSW_LOCK);
+ toggleOption(CLSW_LOCK);
osdMsg = IDS_AFTERPLAYBACK_LOCK;
break;
case ID_AFTERPLAYBACK_MONITOROFF:
- toogleOption(CLSW_MONITOROFF);
+ toggleOption(CLSW_MONITOROFF);
osdMsg = IDS_AFTERPLAYBACK_MONITOROFF;
break;
case ID_AFTERPLAYBACK_PLAYNEXT:
- toogleOption(CLSW_PLAYNEXT);
+ toggleOption(CLSW_PLAYNEXT);
osdMsg = IDS_AFTERPLAYBACK_PLAYNEXT;
break;
+ case ID_AFTERPLAYBACK_DONOTHING:
+ toggleOption(CLSW_DONOTHING);
+ osdMsg = IDS_AFTERPLAYBACK_DONOTHING;
+ break;
+ }
+ if (bDisable) {
+ switch (s.eAfterPlayback) {
+ case CAppSettings::AfterPlayback::PLAY_NEXT:
+ osdMsg = IDS_AFTERPLAYBACK_PLAYNEXT;
+ break;
+ case CAppSettings::AfterPlayback::REWIND:
+ osdMsg = IDS_AFTERPLAYBACK_REWIND;
+ break;
+ case CAppSettings::AfterPlayback::MONITOROFF:
+ osdMsg = IDS_AFTERPLAYBACK_MONITOROFF;
+ break;
+ case CAppSettings::AfterPlayback::CLOSE:
+ osdMsg = IDS_AFTERPLAYBACK_CLOSE;
+ break;
+ case CAppSettings::AfterPlayback::EXIT:
+ osdMsg = IDS_AFTERPLAYBACK_EXIT;
+ break;
+ default:
+ ASSERT(FALSE);
+ // no break
+ case CAppSettings::AfterPlayback::DO_NOTHING:
+ osdMsg = IDS_AFTERPLAYBACK_DONOTHING;
+ break;
+ }
}
- m_OSD.DisplayMessage(OSD_TOPLEFT, bDisable ? ResStr(IDS_AFTERPLAYBACK_DONOTHING) : ResStr(osdMsg));
+ m_OSD.DisplayMessage(OSD_TOPLEFT, ResStr(osdMsg));
}
void CMainFrame::OnUpdateAfterplayback(CCmdUI* pCmdUI)
{
const CAppSettings& s = AfxGetAppSettings();
- bool bChecked = false;
+ bool bChecked;
+ bool bRadio = false;
switch (pCmdUI->m_nID) {
- case ID_AFTERPLAYBACK_CLOSE:
+ case ID_AFTERPLAYBACK_EXIT:
bChecked = !!(s.nCLSwitches & CLSW_CLOSE);
+ bRadio = s.eAfterPlayback == CAppSettings::AfterPlayback::EXIT;
break;
case ID_AFTERPLAYBACK_STANDBY:
bChecked = !!(s.nCLSwitches & CLSW_STANDBY);
@@ -8206,14 +8249,29 @@ void CMainFrame::OnUpdateAfterplayback(CCmdUI* pCmdUI)
break;
case ID_AFTERPLAYBACK_MONITOROFF:
bChecked = !!(s.nCLSwitches & CLSW_MONITOROFF);
+ bRadio = s.eAfterPlayback == CAppSettings::AfterPlayback::MONITOROFF;
break;
case ID_AFTERPLAYBACK_PLAYNEXT:
bChecked = !!(s.nCLSwitches & CLSW_PLAYNEXT);
+ bRadio = s.eAfterPlayback == CAppSettings::AfterPlayback::PLAY_NEXT;
break;
+ case ID_AFTERPLAYBACK_DONOTHING:
+ bChecked = !!(s.nCLSwitches & CLSW_DONOTHING);
+ bRadio = s.eAfterPlayback == CAppSettings::AfterPlayback::DO_NOTHING;
+ break;
+ default:
+ ASSERT(FALSE);
+ return;
}
- pCmdUI->Enable();
- pCmdUI->SetCheck(bChecked);
+ if (IsMenu(*pCmdUI->m_pMenu)) {
+ MENUITEMINFO mii;
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_FTYPE | MIIM_STATE;
+ mii.fType = (bRadio ? MFT_RADIOCHECK : 0);
+ mii.fState = (bRadio ? MFS_DISABLED : 0) | (bChecked || bRadio ? MFS_CHECKED : 0);
+ VERIFY(pCmdUI->m_pMenu->SetMenuItemInfo(pCmdUI->m_nID, &mii));
+ }
}
bool CMainFrame::SeekToFileChapter(int iChapter, bool bRelative /*= false*/)
@@ -8246,7 +8304,9 @@ bool CMainFrame::SeekToFileChapter(int iChapter, bool bRelative /*= false*/)
}
CComBSTR name;
- if (iChapter >= 0 && DWORD(iChapter) < nChapters && SUCCEEDED(m_pCB->ChapGet(iChapter, &rt, &name))) {
+ REFERENCE_TIME rtStart, rtStop;
+ m_wndSeekBar.GetRange(rtStart, rtStop);
+ if (iChapter >= 0 && DWORD(iChapter) < nChapters && SUCCEEDED(m_pCB->ChapGet(iChapter, &rt, &name)) && rt < rtStop) {
SeekTo(rt, false);
SendStatusMessage(ResStr(IDS_AG_CHAPTER2) + CString(name), 3000);
ret = true;
@@ -8604,7 +8664,7 @@ void CMainFrame::OnNavigateMenuItem(UINT nID)
m_pDVDC->SelectRelativeButton(DVD_Relative_Lower);
break;
case 4:
- if (m_iDVDDomain != DVD_DOMAIN_Title) { // Casimir666 : for the remote control
+ if (m_iDVDDomain == DVD_DOMAIN_Title || m_iDVDDomain == DVD_DOMAIN_VideoTitleSetMenu || m_iDVDDomain == DVD_DOMAIN_VideoManagerMenu) {
m_pDVDC->ActivateButton();
} else {
OnPlayPlay();
@@ -8740,11 +8800,10 @@ void CMainFrame::AddFavorite(bool fDisplayMessage, bool fShowDialog)
BeginEnumFilters(m_pGB, pEF, pBF) {
CComQIPtr<IFileSourceFilter> pFSF = pBF;
if (pFSF) {
- LPOLESTR pFN = nullptr;
+ CComHeapPtr<OLECHAR> pFN;
AM_MEDIA_TYPE mt;
if (SUCCEEDED(pFSF->GetCurFile(&pFN, &mt)) && pFN && *pFN) {
fn = CStringW(pFN);
- CoTaskMemFree(pFN);
}
break;
}
@@ -9095,7 +9154,7 @@ void CMainFrame::OnHelpToolbarImages()
void CMainFrame::OnHelpDonate()
{
- ShellExecute(m_hWnd, _T("open"), _T("http://mpc-hc.org/donate/"), nullptr, nullptr, SW_SHOWDEFAULT);
+ ShellExecute(m_hWnd, _T("open"), _T("https://mpc-hc.org/donate/"), nullptr, nullptr, SW_SHOWDEFAULT);
}
//////////////////////////////////
@@ -9119,7 +9178,7 @@ void CMainFrame::SetDefaultWindowRect(int iMonitor)
ModifyStyle(WS_CAPTION | WS_THICKFRAME, 0, SWP_NOZORDER);
}
SetMenuBarVisibility(AFX_MBV_DISPLAYONFOCUS | AFX_MBV_DISPLAYONF10);
- SetWindowPos(nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
+ SetWindowPos(nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
}
CSize windowSize;
@@ -9156,23 +9215,17 @@ void CMainFrame::SetDefaultWindowRect(int iMonitor)
if (!bRestoredWindowPosition) {
CMonitors monitors;
CMonitor monitor;
- if (iMonitor > 0) {
+ if (iMonitor > 0 && iMonitor <= monitors.GetCount()) {
monitor = monitors.GetMonitor(--iMonitor);
} else {
monitor = CMonitors::GetNearestMonitor(this);
}
- SetWindowPos(nullptr, 0, 0, windowSize.cx, windowSize.cy, SWP_NOMOVE | SWP_NOZORDER);
- monitor.CenterWindowToMonitor(this, TRUE);
- }
-
- if (s.fRememberWindowSize && s.fRememberWindowPos) {
- UINT lastWindowType = s.nLastWindowType;
- if (lastWindowType == SIZE_MAXIMIZED) {
- ShowWindow(SW_MAXIMIZE);
- } else if (lastWindowType == SIZE_MINIMIZED) {
- ShowWindow(SW_MINIMIZE);
- }
+ MINMAXINFO mmi;
+ OnGetMinMaxInfo(&mmi);
+ CRect windowRect(0, 0, max(windowSize.cx, mmi.ptMinTrackSize.x), max(windowSize.cy, mmi.ptMinTrackSize.y));
+ monitor.CenterRectToMonitor(windowRect, TRUE);
+ SetWindowPos(nullptr, windowRect.left, windowRect.top, windowSize.cx, windowSize.cy, SWP_NOZORDER | SWP_NOACTIVATE);
}
if (s.fSavePnSZoom) {
@@ -10094,7 +10147,7 @@ double CMainFrame::GetZoomAutoFitScale(bool bLargerOnly)
LONG width = wa.right - wa.left;
LONG height = wa.bottom - wa.top;
- if (bLargerOnly && (arxy.cx + decorationsSize.cx < width && arxy.cy + decorationsSize.cy < height)) {
+ if (bLargerOnly && (arxy.cx + decorationsSize.cx <= width && arxy.cy + decorationsSize.cy <= height)) {
return 1.0;
}
@@ -10471,13 +10524,16 @@ void CMainFrame::OpenFile(OpenFileData* pOFD)
if (bMainFile) {
pOFD->title = fn;
- if (!(m_pFSF = m_pGB)) {
- BeginEnumFilters(m_pGB, pEF, pBF);
- if (m_pFSF = pBF) {
- break;
- }
- EndEnumFilters;
+
+ m_pFSF = m_pGB;
+ BeginEnumFilters(m_pGB, pEF, pBF);
+ if (!m_pFSF) {
+ m_pFSF = pBF;
}
+ if (!m_pKFI) {
+ m_pKFI = pBF;
+ }
+ EndEnumFilters;
}
bMainFile = false;
@@ -11156,6 +11212,8 @@ void CMainFrame::OpenSetupCaptureBar()
void CMainFrame::OpenSetupInfoBar(bool bClear /*= true*/)
{
+ bool bRecalcLayout = false;
+
if (bClear) {
m_wndInfoBar.RemoveAllLines();
}
@@ -11189,19 +11247,23 @@ void CMainFrame::OpenSetupInfoBar(bool bClear /*= true*/)
}
EndEnumFilters;
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_TITLE), title);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_TITLE), title);
UpdateChapterInInfoBar();
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_AUTHOR), author);
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_COPYRIGHT), copyright);
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_RATING), rating);
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_DESCRIPTION), description);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_AUTHOR), author);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_COPYRIGHT), copyright);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_RATING), rating);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_DESCRIPTION), description);
} else if (GetPlaybackMode() == PM_DVD) {
CString info('-');
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_DOMAIN), info);
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_LOCATION), info);
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_VIDEO), info);
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_AUDIO), info);
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_SUBTITLES), info);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_DOMAIN), info);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_LOCATION), info);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_VIDEO), info);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_AUDIO), info);
+ bRecalcLayout |= m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_SUBTITLES), info);
+ }
+
+ if (bRecalcLayout) {
+ RecalcLayout();
}
}
@@ -11223,7 +11285,9 @@ void CMainFrame::UpdateChapterInInfoBar()
}
}
}
- m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_CHAPTER), chapter);
+ if (m_wndInfoBar.SetLine(ResStr(IDS_INFOBAR_CHAPTER), chapter)) {
+ RecalcLayout();
+ }
}
@@ -11728,6 +11792,7 @@ bool CMainFrame::OpenMediaPrivate(CAutoPtr<OpenMediaData> pOMD)
m_pGB->FindInterface(IID_PPV_ARGS(&m_pVMRMC), TRUE);
m_pGB->FindInterface(IID_PPV_ARGS(&pVMB), TRUE);
m_pGB->FindInterface(IID_PPV_ARGS(&pMFVMB), TRUE);
+ m_pMVRSR = m_pCAP;
m_pMVRS = m_pCAP;
pMVTO = m_pCAP;
@@ -11784,9 +11849,14 @@ bool CMainFrame::OpenMediaPrivate(CAutoPtr<OpenMediaData> pOMD)
// Set start time but seek only after all files are loaded
if (pFileData->rtStart > 0) { // Check if an explicit start time was given
rtPos = pFileData->rtStart;
- } else if (m_bRememberFilePos && !s.filePositions.AddEntry(fn)) {
- // else check if we have a remembered position to restore
- rtPos = s.filePositions.GetLatestEntry()->llPosition;
+ }
+ if (m_bRememberFilePos) { // Check if we want to remember the position
+ // Always update the file positions list so that the position
+ // is correctly saved but only restore the remembered position
+ // if no explicit start time was already set.
+ if (!s.filePositions.AddEntry(fn) && !rtPos) {
+ rtPos = s.filePositions.GetLatestEntry()->llPosition;
+ }
}
if (rtPos) {
@@ -11890,6 +11960,7 @@ void CMainFrame::CloseMediaPrivate()
// IMPORTANT: IVMRSurfaceAllocatorNotify/IVMRSurfaceAllocatorNotify9 has to be released before the VMR/VMR9, otherwise it will crash in Release()
m_OSD.Stop();
m_pMVRS.Release();
+ m_pMVRSR.Release();
m_pCAP2.Release();
m_pCAP.Release();
m_pVMRWC.Release();
@@ -11924,6 +11995,7 @@ void CMainFrame::CloseMediaPrivate()
m_pME.Release();
m_pMC.Release();
m_pFSF.Release();
+ m_pKFI.Release();
if (m_pGB) {
m_pGB->RemoveFromROT();
@@ -11938,30 +12010,6 @@ void CMainFrame::CloseMediaPrivate()
m_AudDispName.Empty();
}
-void CMainFrame::ParseDirs(CAtlList<CString>& sl)
-{
- POSITION pos = sl.GetHeadPosition();
-
- while (pos) {
- CString fn = sl.GetNext(pos);
- WIN32_FIND_DATA fd;
- ZeroMemory(&fd, sizeof(WIN32_FIND_DATA));
- HANDLE hFind = FindFirstFile(fn, &fd);
-
- if (hFind != INVALID_HANDLE_VALUE) {
- if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
- if (fn[fn.GetLength() - 1] != '\\') {
- fn += '\\';
- }
-
- COpenDirHelper::RecurseAddDir(fn, &sl);
- }
-
- FindClose(hFind);
- }
- }
-}
-
bool CMainFrame::SearchInDir(bool bDirForward, bool bLoop /*= false*/)
{
ASSERT(GetPlaybackMode() == PM_FILE);
@@ -13572,36 +13620,34 @@ void CMainFrame::SetSubtitle(const SubtitleInput& subInput)
pRTS->SetOverride(s.fUseDefaultSubtitlesStyle, s.subtitlesDefStyle);
pRTS->SetAlignment(s.fOverridePlacement, s.nHorPos, s.nVerPos);
pRTS->Deinit();
- } else if (clsid == __uuidof(CRLECodedSubtitle)) {
- CRLECodedSubtitle* pRHS = (CRLECodedSubtitle*)(ISubStream*)subInput.pSubStream;
-
- CComQIPtr<ISubRenderOptions> pSRO = m_pCAP;
- CComQIPtr<IMadVRInfo> pMVRI = m_pCAP;
-
- LPWSTR yuvMatrix = nullptr;
- int nLen;
- if (pMVRI) {
- pMVRI->GetString("yuvMatrix", &yuvMatrix, &nLen);
- } else if (pSRO) {
- pSRO->GetString("yuvMatrix", &yuvMatrix, &nLen);
- }
+ }
- int targetBlackLevel = 0, targetWhiteLevel = 255;
- if (m_pMVRS) {
- m_pMVRS->SettingsGetInteger(L"Black", &targetBlackLevel);
- m_pMVRS->SettingsGetInteger(L"White", &targetWhiteLevel);
- } else if (pSRO) {
- int range = 0;
- pSRO->GetInt("supportedLevels", &range);
- if (range == 3) {
- targetBlackLevel = 16;
- targetWhiteLevel = 235;
- }
- }
+ CComQIPtr<ISubRenderOptions> pSRO = m_pCAP;
+ CComQIPtr<IMadVRInfo> pMVRI = m_pCAP;
- pRHS->SetSourceTargetInfo(yuvMatrix, targetBlackLevel, targetWhiteLevel);
- LocalFree(yuvMatrix);
+ LPWSTR yuvMatrix = nullptr;
+ int nLen;
+ if (pMVRI) {
+ pMVRI->GetString("yuvMatrix", &yuvMatrix, &nLen);
+ } else if (pSRO) {
+ pSRO->GetString("yuvMatrix", &yuvMatrix, &nLen);
}
+
+ int targetBlackLevel = 0, targetWhiteLevel = 255;
+ if (m_pMVRS) {
+ m_pMVRS->SettingsGetInteger(L"Black", &targetBlackLevel);
+ m_pMVRS->SettingsGetInteger(L"White", &targetWhiteLevel);
+ } else if (pSRO) {
+ int range = 0;
+ pSRO->GetInt("supportedLevels", &range);
+ if (range == 3) {
+ targetBlackLevel = 16;
+ targetWhiteLevel = 235;
+ }
+ }
+
+ subInput.pSubStream->SetSourceTargetInfo(yuvMatrix, targetBlackLevel, targetWhiteLevel);
+ LocalFree(yuvMatrix);
}
m_pCurrentSubInput = subInput;
@@ -13743,18 +13789,12 @@ bool CMainFrame::GetNeighbouringKeyFrames(REFERENCE_TIME rtTarget, std::pair<REF
void CMainFrame::LoadKeyFrames()
{
- CComQIPtr<IKeyFrameInfo> pKFI;
- BeginEnumFilters(m_pGB, pEF, pBF);
- if (pKFI = pBF) {
- break;
- }
- EndEnumFilters;
UINT nKFs = 0;
m_kfs.clear();
- if (pKFI && S_OK == pKFI->GetKeyFrameCount(nKFs) && nKFs > 1) {
+ if (m_pKFI && S_OK == m_pKFI->GetKeyFrameCount(nKFs) && nKFs > 1) {
UINT k = nKFs;
m_kfs.resize(k);
- if (FAILED(pKFI->GetKeyFrames(&TIME_FORMAT_MEDIA_TIME, m_kfs.data(), k)) || k != nKFs) {
+ if (FAILED(m_pKFI->GetKeyFrames(&TIME_FORMAT_MEDIA_TIME, m_kfs.data(), k)) || k != nKFs) {
m_kfs.clear();
}
}
@@ -13801,7 +13841,7 @@ void CMainFrame::SeekTo(REFERENCE_TIME rtPos, bool bShowOSD /*= true*/)
if (rtPos > stop) {
rtPos = stop;
}
- m_wndStatusBar.SetStatusTimer(rtPos, stop, !!m_wndSubresyncBar.IsWindowVisible(), GetTimeFormat());
+ m_wndStatusBar.SetStatusTimer(rtPos, stop, IsSubresyncBarVisible(), GetTimeFormat());
if (bShowOSD) {
m_OSD.DisplayMessage(OSD_TOPLEFT, m_wndStatusBar.GetStatusTimer(), 1500);
@@ -14136,6 +14176,7 @@ bool CMainFrame::BuildGraphVideoAudio(int fVPreview, bool fVCapture, int fAPrevi
CComPtr<IMadVRTextOsd> pMVTO;
m_pMVRS.Release();
+ m_pMVRSR.Release();
m_OSD.Stop();
m_pCAP2.Release();
@@ -14157,6 +14198,7 @@ bool CMainFrame::BuildGraphVideoAudio(int fVPreview, bool fVCapture, int fAPrevi
m_pGB->FindInterface(IID_PPV_ARGS(&m_pMFVDC), TRUE);
m_pGB->FindInterface(IID_PPV_ARGS(&m_pMFVP), TRUE);
pMVTO = m_pCAP;
+ m_pMVRSR = m_pCAP;
m_pMVRS = m_pCAP;
const CAppSettings& s = AfxGetAppSettings();
@@ -14890,63 +14932,37 @@ void CMainFrame::SetPlayState(MPC_PLAYSTATE iState)
bool CMainFrame::CreateFullScreenWindow()
{
- HMONITOR hMonitor;
- MONITORINFOEX MonitorInfo;
- CRect MonitorRect;
+ const CAppSettings& s = AfxGetAppSettings();
+ CMonitor monitor;
if (m_pFullscreenWnd->IsWindow()) {
m_pFullscreenWnd->DestroyWindow();
}
- ZeroMemory(&MonitorInfo, sizeof(MonitorInfo));
- MonitorInfo.cbSize = sizeof(MonitorInfo);
-
- CMonitors monitors;
- CString str;
- CMonitor monitor;
- const CAppSettings& s = AfxGetAppSettings();
- hMonitor = nullptr;
-
- if (!s.iMonitor) {
- if (s.strFullScreenMonitor == _T("Current")) {
- hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
- } else {
- for (int i = 0; i < monitors.GetCount(); i++) {
- monitor = monitors.GetMonitor(i);
+ if (s.iMonitor == 0 && s.strFullScreenMonitor != _T("Current")) {
+ CMonitors monitors;
+ for (int i = 0; i < monitors.GetCount(); i++) {
+ monitor = monitors.GetMonitor(i);
+ if (monitor.IsMonitor()) {
+ CString str;
monitor.GetName(str);
-
- if ((monitor.IsMonitor()) && (s.strFullScreenMonitor == str)) {
- hMonitor = monitor;
+ if (s.strFullScreenMonitor == str) {
break;
}
- }
- if (!hMonitor) {
- hMonitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
+ monitor.Detach();
}
}
- } else {
- hMonitor = MonitorFromWindow(m_hWnd, 0);
}
- if (GetMonitorInfo(hMonitor, &MonitorInfo)) {
- MonitorRect = CRect(MonitorInfo.rcMonitor);
- // Window creation
- DWORD dwStyle = WS_POPUP | WS_VISIBLE;
-
- m_pFullscreenWnd->CreateEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW, _T(""), ResStr(IDS_MAINFRM_136), dwStyle, MonitorRect.left, MonitorRect.top, MonitorRect.Width(), MonitorRect.Height(), nullptr, nullptr, nullptr);
- //SetWindowLongPtr(m_pFullscreenWnd->m_hWnd, GWL_EXSTYLE, WS_EX_TOPMOST); // TODO : still freezing sometimes...
- /*
- CRect r;
- GetWindowRect(r);
- int x = MonitorRect.left + (MonitorRect.Width()/2)-(r.Width()/2);
- int y = MonitorRect.top + (MonitorRect.Height()/2)-(r.Height()/2);
- int w = r.Width();
- int h = r.Height();
- MoveWindow(x, y, w, h);
- */
+ if (!monitor.IsMonitor()) {
+ monitor = CMonitors::GetNearestMonitor(this);
}
- return m_pFullscreenWnd->IsWindow();
+ CRect monitorRect;
+ monitor.GetMonitorRect(monitorRect);
+
+ return !!m_pFullscreenWnd->CreateEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW, _T(""), ResStr(IDS_MAINFRM_136),
+ WS_POPUP | WS_VISIBLE, monitorRect, this, 0);
}
bool CMainFrame::IsD3DFullScreenMode() const
@@ -15328,7 +15344,7 @@ void CMainFrame::SendNowPlayingToApi()
// get current location (title number & chapter)
if (SUCCEEDED(m_pDVDI->GetCurrentLocation(&Location))) {
// get number of chapters in current title
- m_pDVDI->GetNumberOfChapters(Location.TitleNum, &ulNumOfChapters);
+ VERIFY(SUCCEEDED(m_pDVDI->GetNumberOfChapters(Location.TitleNum, &ulNumOfChapters)));
}
// get total time of title
@@ -15754,6 +15770,14 @@ void CMainFrame::OnFileOpendirectory()
path = _path;
}
+ // If we got a link file that points to a directory, follow the link
+ if (PathUtils::IsLinkFile(path)) {
+ CString resolvedPath = PathUtils::ResolveLinkFile(path);
+ if (PathUtils::IsDir(resolvedPath)) {
+ path = resolvedPath;
+ }
+ }
+
if (path[path.GetLength() - 1] != '\\') {
path += '\\';
}
@@ -15761,7 +15785,7 @@ void CMainFrame::OnFileOpendirectory()
CAtlList<CString> sl;
sl.AddTail(path);
if (COpenDirHelper::m_incl_subdir) {
- COpenDirHelper::RecurseAddDir(path, &sl);
+ PathUtils::RecurseAddDir(path, sl);
}
m_wndPlaylistBar.Open(sl, true);
@@ -15774,71 +15798,79 @@ HRESULT CMainFrame::CreateThumbnailToolbar()
return E_FAIL;
}
- if (m_pTaskbarList) {
- m_pTaskbarList->Release();
- }
- HRESULT hr = CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pTaskbarList));
- if (SUCCEEDED(hr)) {
+ if (m_pTaskbarList || SUCCEEDED(m_pTaskbarList.CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_INPROC_SERVER))) {
+ bool bRTLLayout = false; // Assume left-to-right layout by default
+ // Try to locate the window used to display the task bar
+ if (CWnd* pTaskBarWnd = FindWindow(_T("TaskListThumbnailWnd"), nullptr)) {
+ bRTLLayout = !!(pTaskBarWnd->GetExStyle() & WS_EX_LAYOUTRTL);
+ }
+
CMPCPngImage image;
- if (!image.Load(MAKEINTRESOURCE(IDF_WIN7_TOOLBAR))) {
- m_pTaskbarList->Release();
- image.CleanUp();
+ if (!image.Load(IDF_WIN7_TOOLBAR)) {
return E_FAIL;
}
- BITMAP bi;
- image.GetBitmap(&bi);
- int nI = bi.bmWidth / bi.bmHeight;
- HIMAGELIST hImageList = ImageList_Create(bi.bmHeight, bi.bmHeight, ILC_COLOR32, nI, 0);
-
- ImageList_Add(hImageList, (HBITMAP)image, 0);
- hr = m_pTaskbarList->ThumbBarSetImageList(m_hWnd, hImageList);
-
- if (SUCCEEDED(hr)) {
+ CSize size = image.GetSize();
+
+ if (bRTLLayout) { // We don't want the buttons to be mirrored so we pre-mirror them
+ // Create memory DCs for the source and destination bitmaps
+ CDC sourceDC, destDC;
+ sourceDC.CreateCompatibleDC(nullptr);
+ destDC.CreateCompatibleDC(nullptr);
+ // Swap the source bitmap with an empty one
+ CBitmap sourceImg;
+ sourceImg.Attach(image.Detach());
+ // Create a temporary DC
+ CClientDC clientDC(nullptr);
+ // Create the destination bitmap
+ image.CreateCompatibleBitmap(&clientDC, size.cx, size.cy);
+ // Select the bitmaps into the DCs
+ HGDIOBJ oldSourceDCObj = sourceDC.SelectObject(sourceImg);
+ HGDIOBJ oldDestDCObj = destDC.SelectObject(image);
+ // Actually flip the bitmap
+ destDC.StretchBlt(0, 0, size.cx, size.cy,
+ &sourceDC, size.cx, 0, -size.cx, size.cy,
+ SRCCOPY);
+ // Reselect the old objects back into their DCs
+ sourceDC.SelectObject(oldSourceDCObj);
+ destDC.SelectObject(oldDestDCObj);
+ }
+
+ CImageList imageList;
+ imageList.Create(size.cy, size.cy, ILC_COLOR32, size.cx / size.cy, 0);
+ imageList.Add(&image, nullptr);
+
+ if (SUCCEEDED(m_pTaskbarList->ThumbBarSetImageList(m_hWnd, imageList.GetSafeHandle()))) {
THUMBBUTTON buttons[5] = {};
+ for (size_t i = 0; i < _countof(buttons); i++) {
+ buttons[i].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
+ buttons[i].dwFlags = THBF_DISABLED;
+ buttons[i].iBitmap = 0; // Will be set later
+ }
+
// PREVIOUS
- buttons[0].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[0].dwFlags = THBF_DISABLED;
buttons[0].iId = IDTB_BUTTON3;
- buttons[0].iBitmap = 0;
- StringCchCopy(buttons[0].szTip, _countof(buttons[0].szTip), ResStr(IDS_AG_PREVIOUS));
-
// STOP
- buttons[1].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[1].dwFlags = THBF_DISABLED;
buttons[1].iId = IDTB_BUTTON1;
- buttons[1].iBitmap = 1;
- StringCchCopy(buttons[1].szTip, _countof(buttons[1].szTip), ResStr(IDS_AG_STOP));
-
// PLAY/PAUSE
- buttons[2].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[2].dwFlags = THBF_DISABLED;
buttons[2].iId = IDTB_BUTTON2;
- buttons[2].iBitmap = 3;
- StringCchCopy(buttons[2].szTip, _countof(buttons[2].szTip), ResStr(IDS_AG_PLAYPAUSE));
-
// NEXT
- buttons[3].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[3].dwFlags = THBF_DISABLED;
buttons[3].iId = IDTB_BUTTON4;
- buttons[3].iBitmap = 4;
- StringCchCopy(buttons[3].szTip, _countof(buttons[3].szTip), ResStr(IDS_AG_NEXT));
-
// FULLSCREEN
- buttons[4].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[4].dwFlags = THBF_DISABLED;
buttons[4].iId = IDTB_BUTTON5;
- buttons[4].iBitmap = 5;
- StringCchCopy(buttons[4].szTip, _countof(buttons[4].szTip), ResStr(IDS_AG_FULLSCREEN));
- hr = m_pTaskbarList->ThumbBarAddButtons(m_hWnd, ARRAYSIZE(buttons), buttons);
+ if (bRTLLayout) { // We don't want the buttons to be mirrored so we pre-mirror them
+ std::reverse(buttons, buttons + _countof(buttons));
+ }
+
+ if (SUCCEEDED(m_pTaskbarList->ThumbBarAddButtons(m_hWnd, _countof(buttons), buttons))) {
+ return UpdateThumbarButton();
+ }
}
- ImageList_Destroy(hImageList);
- image.CleanUp();
}
- return hr;
+ return E_FAIL;
}
HRESULT CMainFrame::UpdateThumbarButton()
@@ -15863,125 +15895,109 @@ HRESULT CMainFrame::UpdateThumbarButton(MPC_PLAYSTATE iPlayState)
return E_FAIL;
}
+ THUMBBUTTON buttons[5] = {};
+
+ for (size_t i = 0; i < _countof(buttons); i++) {
+ buttons[i].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
+ }
+
+ buttons[0].iId = IDTB_BUTTON3;
+ buttons[1].iId = IDTB_BUTTON1;
+ buttons[2].iId = IDTB_BUTTON2;
+ buttons[3].iId = IDTB_BUTTON4;
+ buttons[4].iId = IDTB_BUTTON5;
+
const CAppSettings& s = AfxGetAppSettings();
if (!s.fUseWin7TaskBar) {
m_pTaskbarList->SetOverlayIcon(m_hWnd, nullptr, L"");
m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS);
- THUMBBUTTON buttons[5] = {};
-
- buttons[0].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[0].dwFlags = THBF_HIDDEN;
- buttons[0].iId = IDTB_BUTTON3;
-
- buttons[1].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[1].dwFlags = THBF_HIDDEN;
- buttons[1].iId = IDTB_BUTTON1;
+ for (size_t i = 0; i < _countof(buttons); i++) {
+ buttons[i].dwFlags = THBF_HIDDEN;
+ }
+ } else {
+ buttons[0].iBitmap = 0;
+ StringCchCopy(buttons[0].szTip, _countof(buttons[0].szTip), ResStr(IDS_AG_PREVIOUS));
- buttons[2].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[2].dwFlags = THBF_HIDDEN;
- buttons[2].iId = IDTB_BUTTON2;
+ buttons[1].iBitmap = 1;
+ StringCchCopy(buttons[1].szTip, _countof(buttons[1].szTip), ResStr(IDS_AG_STOP));
- buttons[3].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[3].dwFlags = THBF_HIDDEN;
- buttons[3].iId = IDTB_BUTTON4;
+ buttons[2].iBitmap = 3;
+ StringCchCopy(buttons[2].szTip, _countof(buttons[2].szTip), ResStr(IDS_AG_PLAYPAUSE));
- buttons[4].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[4].dwFlags = THBF_HIDDEN;
- buttons[4].iId = IDTB_BUTTON5;
+ buttons[3].iBitmap = 4;
+ StringCchCopy(buttons[3].szTip, _countof(buttons[3].szTip), ResStr(IDS_AG_NEXT));
- HRESULT hr = m_pTaskbarList->ThumbBarUpdateButtons(m_hWnd, ARRAYSIZE(buttons), buttons);
- return hr;
- }
+ buttons[4].iBitmap = 5;
+ StringCchCopy(buttons[4].szTip, _countof(buttons[4].szTip), ResStr(IDS_AG_FULLSCREEN));
- THUMBBUTTON buttons[5] = {};
+ if (GetLoadState() == MLS::LOADED) {
+ HICON hIcon = nullptr;
- buttons[0].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[0].dwFlags = (!s.fUseSearchInFolder && m_wndPlaylistBar.GetCount() <= 1 && (m_pCB && m_pCB->ChapGetCount() <= 1)) ? THBF_DISABLED : THBF_ENABLED;
- buttons[0].iId = IDTB_BUTTON3;
- buttons[0].iBitmap = 0;
- StringCchCopy(buttons[0].szTip, _countof(buttons[0].szTip), ResStr(IDS_AG_PREVIOUS));
+ buttons[0].dwFlags = (!s.fUseSearchInFolder && m_wndPlaylistBar.GetCount() <= 1 && (m_pCB && m_pCB->ChapGetCount() <= 1)) ? THBF_DISABLED : THBF_ENABLED;
+ buttons[3].dwFlags = (!s.fUseSearchInFolder && m_wndPlaylistBar.GetCount() <= 1 && (m_pCB && m_pCB->ChapGetCount() <= 1)) ? THBF_DISABLED : THBF_ENABLED;
+ buttons[4].dwFlags = THBF_ENABLED;
- buttons[1].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[1].iId = IDTB_BUTTON1;
- buttons[1].iBitmap = 1;
- StringCchCopy(buttons[1].szTip, _countof(buttons[1].szTip), ResStr(IDS_AG_STOP));
+ if (iPlayState == PS_PLAY) {
+ buttons[1].dwFlags = THBF_ENABLED;
+ buttons[2].dwFlags = THBF_ENABLED;
+ buttons[2].iBitmap = 2;
- buttons[2].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[2].iId = IDTB_BUTTON2;
- buttons[2].iBitmap = 3;
- StringCchCopy(buttons[2].szTip, _countof(buttons[2].szTip), ResStr(IDS_AG_PLAYPAUSE));
+ hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_TB_PLAY), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
+ m_pTaskbarList->SetProgressState(m_hWnd, m_wndSeekBar.HasDuration() ? TBPF_NORMAL : TBPF_NOPROGRESS);
+ } else if (iPlayState == PS_STOP) {
+ buttons[1].dwFlags = THBF_DISABLED;
+ buttons[2].dwFlags = THBF_ENABLED;
+ buttons[2].iBitmap = 3;
- buttons[3].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[3].dwFlags = (!s.fUseSearchInFolder && m_wndPlaylistBar.GetCount() <= 1 && (m_pCB && m_pCB->ChapGetCount() <= 1)) ? THBF_DISABLED : THBF_ENABLED;
- buttons[3].iId = IDTB_BUTTON4;
- buttons[3].iBitmap = 4;
- StringCchCopy(buttons[3].szTip, _countof(buttons[3].szTip), ResStr(IDS_AG_NEXT));
+ hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_TB_STOP), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
+ m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS);
+ } else if (iPlayState == PS_PAUSE) {
+ buttons[1].dwFlags = THBF_ENABLED;
+ buttons[2].dwFlags = THBF_ENABLED;
+ buttons[2].iBitmap = 3;
- buttons[4].dwMask = THB_BITMAP | THB_TOOLTIP | THB_FLAGS;
- buttons[4].dwFlags = THBF_ENABLED;
- buttons[4].iId = IDTB_BUTTON5;
- buttons[4].iBitmap = 5;
- StringCchCopy(buttons[4].szTip, _countof(buttons[4].szTip), ResStr(IDS_AG_FULLSCREEN));
+ hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_TB_PAUSE), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
+ m_pTaskbarList->SetProgressState(m_hWnd, m_wndSeekBar.HasDuration() ? TBPF_PAUSED : TBPF_NOPROGRESS);
+ }
- if (GetLoadState() == MLS::LOADED) {
- HICON hIcon = nullptr;
- if (iPlayState == PS_PLAY) {
- buttons[1].dwFlags = THBF_ENABLED;
- buttons[2].dwFlags = THBF_ENABLED;
- buttons[2].iBitmap = 2;
-
- hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_TB_PLAY), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
- m_pTaskbarList->SetProgressState(m_hWnd, m_wndSeekBar.HasDuration() ? TBPF_NORMAL : TBPF_NOPROGRESS);
- } else if (iPlayState == PS_STOP) {
- buttons[1].dwFlags = THBF_DISABLED;
- buttons[2].dwFlags = THBF_ENABLED;
- buttons[2].iBitmap = 3;
-
- hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_TB_STOP), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
- m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS);
- } else if (iPlayState == PS_PAUSE) {
- buttons[1].dwFlags = THBF_ENABLED;
- buttons[2].dwFlags = THBF_ENABLED;
- buttons[2].iBitmap = 3;
+ if (GetPlaybackMode() == PM_DVD && m_iDVDDomain != DVD_DOMAIN_Title) {
+ buttons[0].dwFlags = THBF_DISABLED;
+ buttons[1].dwFlags = THBF_DISABLED;
+ buttons[2].dwFlags = THBF_DISABLED;
+ buttons[3].dwFlags = THBF_DISABLED;
+ }
- hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_TB_PAUSE), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
- m_pTaskbarList->SetProgressState(m_hWnd, m_wndSeekBar.HasDuration() ? TBPF_PAUSED : TBPF_NOPROGRESS);
- }
+ m_pTaskbarList->SetOverlayIcon(m_hWnd, hIcon, L"");
- if (m_fAudioOnly) {
- buttons[4].dwFlags = THBF_DISABLED;
- }
+ if (hIcon != nullptr) {
+ DestroyIcon(hIcon);
+ }
+ } else {
+ for (size_t i = 0; i < _countof(buttons); i++) {
+ buttons[i].dwFlags = THBF_DISABLED;
+ }
- if (GetPlaybackMode() == PM_DVD && m_iDVDDomain != DVD_DOMAIN_Title) {
- buttons[0].dwFlags = THBF_DISABLED;
- buttons[1].dwFlags = THBF_DISABLED;
- buttons[2].dwFlags = THBF_DISABLED;
- buttons[3].dwFlags = THBF_DISABLED;
+ m_pTaskbarList->SetOverlayIcon(m_hWnd, nullptr, L"");
+ m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS);
}
- m_pTaskbarList->SetOverlayIcon(m_hWnd, hIcon, L"");
+ UpdateThumbnailClip();
+ }
- if (hIcon != nullptr) {
- DestroyIcon(hIcon);
+ // Try to locate the window used to display the task bar to check if it is RTLed
+ if (CWnd* pTaskBarWnd = FindWindow(_T("TaskListThumbnailWnd"), nullptr)) {
+ // We don't want the buttons to be mirrored so we pre-mirror them
+ if (pTaskBarWnd->GetExStyle() & WS_EX_LAYOUTRTL) {
+ for (UINT i = 0; i < _countof(buttons); i++) {
+ buttons[i].iBitmap = _countof(buttons) - buttons[i].iBitmap;
+ }
+ std::reverse(buttons, buttons + _countof(buttons));
}
- } else {
- buttons[0].dwFlags = THBF_DISABLED;
- buttons[1].dwFlags = THBF_DISABLED;
- buttons[2].dwFlags = THBF_DISABLED;
- buttons[3].dwFlags = THBF_DISABLED;
- buttons[4].dwFlags = THBF_DISABLED;
-
- m_pTaskbarList->SetOverlayIcon(m_hWnd, nullptr, L"");
- m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NOPROGRESS);
}
- HRESULT hr = m_pTaskbarList->ThumbBarUpdateButtons(m_hWnd, ARRAYSIZE(buttons), buttons);
-
- UpdateThumbnailClip();
-
- return hr;
+ return m_pTaskbarList->ThumbBarUpdateButtons(m_hWnd, _countof(buttons), buttons);
}
HRESULT CMainFrame::UpdateThumbnailClip()
@@ -16007,11 +16023,6 @@ HRESULT CMainFrame::UpdateThumbnailClip()
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
- if (message == WM_LBUTTONDOWN || message == WM_LBUTTONUP) {
- ASSERT(m_pMVRS);
- return 42;
- }
-
if ((message == WM_COMMAND) && (THBN_CLICKED == HIWORD(wParam))) {
int const wmId = LOWORD(wParam);
switch (wmId) {
@@ -16042,7 +16053,25 @@ LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
return 0;
}
- return __super::WindowProc(message, wParam, lParam);
+ LRESULT ret = 0;
+ bool bCallOurProc = true;
+ if (m_pMVRSR) {
+ // call madVR window proc directly when the interface is available
+ switch (message) {
+ case WM_MOUSEMOVE:
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONUP:
+ // CMouseWnd will call madVR window proc
+ break;
+ default:
+ bCallOurProc = !m_pMVRSR->ParentWindowProc(m_hWnd, message, &wParam, &lParam, &ret);
+ }
+ }
+ if (bCallOurProc) {
+ ret = __super::WindowProc(message, wParam, lParam);
+ }
+
+ return ret;
}
bool CMainFrame::IsAeroSnapped()
@@ -16464,10 +16493,9 @@ CString CMainFrame::GetFileName()
CString path(m_wndPlaylistBar.GetCurFileName());
if (m_pFSF) {
- LPOLESTR pFN;
+ CComHeapPtr<OLECHAR> pFN;
if (SUCCEEDED(m_pFSF->GetCurFile(&pFN, nullptr))) {
path = pFN;
- CoTaskMemFree(pFN);
}
}