[SHELL32] Implement single-click mode in DefView (#8054)

This commit is contained in:
Whindmar Saksit
2025-06-03 20:39:38 +02:00
committed by GitHub
parent 22d077f9f1
commit 4f7736a088
3 changed files with 99 additions and 60 deletions

View File

@@ -346,7 +346,7 @@ public:
LRESULT DoColumnContextMenu(LRESULT lParam);
UINT GetSelections();
SFGAOF GetSelectionAttributes(SFGAOF Query);
HRESULT OpenSelectedItems();
HRESULT OpenSelectedItems(PCSTR pszVerb = NULL);
void OnDeactivate();
void DoActivate(UINT uState);
HRESULT drag_notify_subitem(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
@@ -357,6 +357,7 @@ public:
HRESULT LoadViewState();
HRESULT SaveViewState(IStream *pStream);
void UpdateFolderViewFlags();
UINT GetItemActivateFlags();
DWORD GetCommDlgViewFlags()
{
@@ -906,9 +907,9 @@ BOOL CDefView::CreateList()
if (m_FolderSettings.fFlags & FWF_FULLROWSELECT)
ListExStyle |= LVS_EX_FULLROWSELECT;
if ((m_FolderSettings.fFlags & FWF_SINGLECLICKACTIVATE) ||
(!SHELL_GetSetting(SSF_DOUBLECLICKINWEBVIEW, fDoubleClickInWebView) && !SHELL_GetSetting(SSF_WIN95CLASSIC, fWin95Classic)))
ListExStyle |= LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE;
ListExStyle |= GetItemActivateFlags();
if (ListExStyle & LVS_EX_ONECLICKACTIVATE)
ListExStyle |= SHELL_GetIconUnderlineFlags();
if (m_FolderSettings.fFlags & FWF_NOCOLUMNHEADER)
dwStyle |= LVS_NOCOLUMNHEADER;
@@ -2184,7 +2185,7 @@ HRESULT CDefView::InvokeContextMenuCommand(CComPtr<IContextMenu>& pCM, LPCSTR lp
return S_OK;
}
HRESULT CDefView::OpenSelectedItems()
HRESULT CDefView::OpenSelectedItems(PCSTR pszVerb)
{
HMENU hMenu;
UINT uCommand;
@@ -2213,13 +2214,15 @@ HRESULT CDefView::OpenSelectedItems()
return hResult;
uCommand = GetMenuDefaultItem(hMenu, FALSE, 0);
if (uCommand == (UINT)-1)
if (uCommand == (UINT)-1 && !pszVerb)
{
ERR("GetMenuDefaultItem returned -1\n");
return E_FAIL;
}
if (!pszVerb)
pszVerb = MAKEINTRESOURCEA(uCommand);
InvokeContextMenuCommand(pCM, MAKEINTRESOURCEA(uCommand), NULL);
InvokeContextMenuCommand(pCM, pszVerb, NULL);
return hResult;
}
@@ -2681,11 +2684,9 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
break;
case NM_DBLCLK:
TRACE("-- NM_DBLCLK %p\n", this);
OpenSelectedItems();
break;
case NM_RETURN:
TRACE("-- NM_RETURN %p\n", this);
OpenSelectedItems();
break;
case HDN_ENDTRACKW:
TRACE("-- HDN_ENDTRACKW %p\n", this);
@@ -2705,7 +2706,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
break;
case LVN_ITEMACTIVATE:
TRACE("-- LVN_ITEMACTIVATE %p\n", this);
OnStateChange(CDBOSC_SELCHANGE); // browser will get the IDataObject
OpenSelectedItems(((NMITEMACTIVATE *)lpnmh)->uKeyFlags & LVKF_ALT ? "properties" : NULL);
break;
case LVN_COLUMNCLICK:
{
@@ -3028,6 +3029,15 @@ LRESULT CDefView::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
if (wParam == SPI_SETDESKWALLPAPER || wParam == 0)
UpdateListColors();
UINT ListExMask = LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE;
UINT ListExBits = GetItemActivateFlags();
if (wParam == SPI_GETICONTITLELOGFONT ||
(lParam && !lstrcmpiW((PWSTR)lParam, REGSTR_PATH_EXPLORER L"\\IconUnderline")))
{
ListExMask |= LVS_EX_UNDERLINEHOT | LVS_EX_UNDERLINECOLD;
ListExBits |= SHELL_GetIconUnderlineFlags();
}
m_ListView.SetExtendedListViewStyle(ListExBits, ListExMask);
m_ListView.SendMessage(uMsg, wParam, lParam);
return S_OK;
}
@@ -3458,6 +3468,14 @@ void CDefView::UpdateFolderViewFlags()
UPDATEFOLDERVIEWFLAGS(m_FolderSettings.fFlags, FWF_NOGROUPING, !ListView_IsGroupViewEnabled(m_ListView.m_hWnd));
}
UINT CDefView::GetItemActivateFlags()
{
SHELLSTATE ss;
SHGetSetSettings(&ss, SSF_DOUBLECLICKINWEBVIEW | SSF_WIN95CLASSIC, FALSE);
return ((m_FolderSettings.fFlags & FWF_SINGLECLICKACTIVATE) || (!ss.fDoubleClickInWebView && !ss.fWin95Classic))
? (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE) : 0;
}
HRESULT WINAPI CDefView::SelectItem(PCUITEMID_CHILD pidl, UINT uFlags)
{
int i;