Reactos

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

authored by

Whindmar Saksit and committed by
GitHub
4f7736a0 22d077f9

+99 -60
+28 -10
dll/win32/shell32/CDefView.cpp
··· 346 346 LRESULT DoColumnContextMenu(LRESULT lParam); 347 347 UINT GetSelections(); 348 348 SFGAOF GetSelectionAttributes(SFGAOF Query); 349 - HRESULT OpenSelectedItems(); 349 + HRESULT OpenSelectedItems(PCSTR pszVerb = NULL); 350 350 void OnDeactivate(); 351 351 void DoActivate(UINT uState); 352 352 HRESULT drag_notify_subitem(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); ··· 357 357 HRESULT LoadViewState(); 358 358 HRESULT SaveViewState(IStream *pStream); 359 359 void UpdateFolderViewFlags(); 360 + UINT GetItemActivateFlags(); 360 361 361 362 DWORD GetCommDlgViewFlags() 362 363 { ··· 906 907 if (m_FolderSettings.fFlags & FWF_FULLROWSELECT) 907 908 ListExStyle |= LVS_EX_FULLROWSELECT; 908 909 909 - if ((m_FolderSettings.fFlags & FWF_SINGLECLICKACTIVATE) || 910 - (!SHELL_GetSetting(SSF_DOUBLECLICKINWEBVIEW, fDoubleClickInWebView) && !SHELL_GetSetting(SSF_WIN95CLASSIC, fWin95Classic))) 911 - ListExStyle |= LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE; 910 + ListExStyle |= GetItemActivateFlags(); 911 + if (ListExStyle & LVS_EX_ONECLICKACTIVATE) 912 + ListExStyle |= SHELL_GetIconUnderlineFlags(); 912 913 913 914 if (m_FolderSettings.fFlags & FWF_NOCOLUMNHEADER) 914 915 dwStyle |= LVS_NOCOLUMNHEADER; ··· 2184 2185 return S_OK; 2185 2186 } 2186 2187 2187 - HRESULT CDefView::OpenSelectedItems() 2188 + HRESULT CDefView::OpenSelectedItems(PCSTR pszVerb) 2188 2189 { 2189 2190 HMENU hMenu; 2190 2191 UINT uCommand; ··· 2213 2214 return hResult; 2214 2215 2215 2216 uCommand = GetMenuDefaultItem(hMenu, FALSE, 0); 2216 - if (uCommand == (UINT)-1) 2217 + if (uCommand == (UINT)-1 && !pszVerb) 2217 2218 { 2218 2219 ERR("GetMenuDefaultItem returned -1\n"); 2219 2220 return E_FAIL; 2220 2221 } 2222 + if (!pszVerb) 2223 + pszVerb = MAKEINTRESOURCEA(uCommand); 2221 2224 2222 - InvokeContextMenuCommand(pCM, MAKEINTRESOURCEA(uCommand), NULL); 2225 + InvokeContextMenuCommand(pCM, pszVerb, NULL); 2223 2226 2224 2227 return hResult; 2225 2228 } ··· 2681 2684 break; 2682 2685 case NM_DBLCLK: 2683 2686 TRACE("-- NM_DBLCLK %p\n", this); 2684 - OpenSelectedItems(); 2685 2687 break; 2686 2688 case NM_RETURN: 2687 2689 TRACE("-- NM_RETURN %p\n", this); 2688 - OpenSelectedItems(); 2689 2690 break; 2690 2691 case HDN_ENDTRACKW: 2691 2692 TRACE("-- HDN_ENDTRACKW %p\n", this); ··· 2705 2706 break; 2706 2707 case LVN_ITEMACTIVATE: 2707 2708 TRACE("-- LVN_ITEMACTIVATE %p\n", this); 2708 - OnStateChange(CDBOSC_SELCHANGE); // browser will get the IDataObject 2709 + OpenSelectedItems(((NMITEMACTIVATE *)lpnmh)->uKeyFlags & LVKF_ALT ? "properties" : NULL); 2709 2710 break; 2710 2711 case LVN_COLUMNCLICK: 2711 2712 { ··· 3028 3029 if (wParam == SPI_SETDESKWALLPAPER || wParam == 0) 3029 3030 UpdateListColors(); 3030 3031 3032 + UINT ListExMask = LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE; 3033 + UINT ListExBits = GetItemActivateFlags(); 3034 + if (wParam == SPI_GETICONTITLELOGFONT || 3035 + (lParam && !lstrcmpiW((PWSTR)lParam, REGSTR_PATH_EXPLORER L"\\IconUnderline"))) 3036 + { 3037 + ListExMask |= LVS_EX_UNDERLINEHOT | LVS_EX_UNDERLINECOLD; 3038 + ListExBits |= SHELL_GetIconUnderlineFlags(); 3039 + } 3040 + m_ListView.SetExtendedListViewStyle(ListExBits, ListExMask); 3031 3041 m_ListView.SendMessage(uMsg, wParam, lParam); 3032 3042 return S_OK; 3033 3043 } ··· 3456 3466 UPDATEFOLDERVIEWFLAGS(m_FolderSettings.fFlags, FWF_AUTOARRANGE, GetAutoArrange() == S_OK); 3457 3467 UPDATEFOLDERVIEWFLAGS(m_FolderSettings.fFlags, FWF_SNAPTOGRID, _GetSnapToGrid() == S_OK); 3458 3468 UPDATEFOLDERVIEWFLAGS(m_FolderSettings.fFlags, FWF_NOGROUPING, !ListView_IsGroupViewEnabled(m_ListView.m_hWnd)); 3469 + } 3470 + 3471 + UINT CDefView::GetItemActivateFlags() 3472 + { 3473 + SHELLSTATE ss; 3474 + SHGetSetSettings(&ss, SSF_DOUBLECLICKINWEBVIEW | SSF_WIN95CLASSIC, FALSE); 3475 + return ((m_FolderSettings.fFlags & FWF_SINGLECLICKACTIVATE) || (!ss.fDoubleClickInWebView && !ss.fWin95Classic)) 3476 + ? (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE) : 0; 3459 3477 } 3460 3478 3461 3479 HRESULT WINAPI CDefView::SelectItem(PCUITEMID_CHILD pidl, UINT uFlags)
+69 -50
dll/win32/shell32/dialogs/general.cpp
··· 23 23 24 24 WINE_DEFAULT_DEBUG_CHANNEL (fprop); 25 25 26 - static const LPCWSTR s_pszExplorerKey = 27 - L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"; 26 + static const LPCWSTR s_pszExplorerKey = REGSTR_PATH_EXPLORER; 27 + 28 + enum { UNDERLINE_ON, UNDERLINE_OFF, UNDERLINE_HOVER, UNDERLINE_IE }; 28 29 29 30 ///////////////////////////////////////////////////////////////////////////// 30 31 // Shell settings ··· 60 61 // bDoubleClick is FALSE if "Single-click to open an item (point to select)". 61 62 ////////////////////////////////////////////////////////////////////////////// 62 63 // API Monitor: 63 - // SHLWAPI.dll RegOpenKeyExW ( 0x000000c8, NULL, 0, MAXIMUM_ALLOWED, 0x00def234 ) ERROR_SUCCESS 0.0000243 64 - // SHLWAPI.dll RegSetValueExW ( 0x000003e8, "ShellState", 0, REG_BINARY, 0x000c2050, 36 ) ERROR_SUCCESS 0.0001028 65 - // SHLWAPI.dll RegCloseKey ( 0x000003e8 ) ERROR_SUCCESS 0.0000081 66 - // Explorer.EXE SHSettingsChanged ( 0, "ShellState" ) 0.0000131 64 + // SHLWAPI.dll RegOpenKeyExW ( 0x000000c8, NULL, 0, MAXIMUM_ALLOWED, 0x00def234 ) ERROR_SUCCESS 65 + // SHLWAPI.dll RegSetValueExW ( 0x000003e8, "ShellState", 0, REG_BINARY, 0x000c2050, 36 ) ERROR_SUCCESS 66 + // SHLWAPI.dll RegCloseKey ( 0x000003e8 ) ERROR_SUCCESS 67 + // Explorer.EXE SHSettingsChanged ( 0, "ShellState" ) (WM_SETTINGCHANGE handling) 67 68 static BOOL 68 69 IntSetShellStateSettings(BOOL bDoubleClick, BOOL bUseCommonTasks) 69 70 { ··· 71 72 shellstate.fDoubleClickInWebView = !!bDoubleClick; 72 73 shellstate.fWebView = !!bUseCommonTasks; 73 74 SHGetSetSettings(&shellstate, SSF_DOUBLECLICKINWEBVIEW | SSF_WEBVIEW, TRUE); 74 - 75 - // FIXME: This is not correct, it does nothing. SHGetSetSettings will broadcast it. 76 - SHSettingsChanged(0, L"ShellState"); 77 75 return TRUE; 78 76 } 79 77 80 - ////////////////////////////////////////////////////////////////////////////// 81 - // API Monitor: 82 - // SHLWAPI.dll RegOpenKeyExW ( 0x000000c8, NULL, 0, MAXIMUM_ALLOWED, 0x0007e484 ) ERROR_SUCCESS 0.0000388 83 - // SHLWAPI.dll RegQueryValueExW ( 0x000005a8, "ShellState", NULL, 0x0007e474, 0x000c2050, 0x0007e4fc ) ERROR_SUCCESS 0.0000271 84 - // SHLWAPI.dll RegCloseKey ( 0x000005a8 ) ERROR_SUCCESS 0.0000112 85 78 EXTERN_C BOOL 86 79 SHELL32_ReadRegShellState(PREGSHELLSTATE prss) 87 80 { ··· 91 84 return err == ERROR_SUCCESS && prss->dwSize >= REGSHELLSTATE_SIZE; 92 85 } 93 86 94 - // bIconUnderline is TRUE if "Underline icon titles only when I point at them". 95 - // bIconUnderline is FALSE if "Underline icon titles consistent with my browser". 87 + // bUnderlineHover is TRUE if "Underline icon titles only when I point at them". 88 + // bUnderlineHover is FALSE if "Underline icon titles consistent with my browser". 96 89 ////////////////////////////////////////////////////////////////////////////// 97 90 // API Monitor: 98 - // SHELL32.dll SHRegGetUSValueW ( "Software\Microsoft\Windows\CurrentVersion\Explorer", "IconUnderline", NULL, 0x00d2f324, 0x00d2f328, FALSE, 0x00d2f32c, 4 ) ERROR_SUCCESS 0.0002484 99 - // SHELL32.dll IsDlgButtonChecked ( 0x0005009e, 30104 ) BST_CHECKED 0.0000212 100 - // SHELL32.dll SHRegSetUSValueW ( "Software\Microsoft\Windows\CurrentVersion\Explorer", "IconUnderline", 0, 0x00d2f314, 4, 6 ) ERROR_SUCCESS 0.0008300 101 - // Explorer.EXE SHSettingsChanged ( 0, "Software\Microsoft\Windows\CurrentVersion\Explorer\IconUnderline" ) 0.0000092 102 - static BOOL IntSetUnderlineState(BOOL bIconUnderline) 91 + // SHELL32.dll SHRegGetUSValueW ( "Software\Microsoft\Windows\CurrentVersion\Explorer", "IconUnderline", NULL, 0x00d2f324, 0x00d2f328, FALSE, 0x00d2f32c, 4 ) ERROR_SUCCESS 92 + // SHELL32.dll IsDlgButtonChecked ( 0x0005009e, 30104 ) BST_CHECKED 93 + // SHELL32.dll SHRegSetUSValueW ( "Software\Microsoft\Windows\CurrentVersion\Explorer", "IconUnderline", 0, 0x00d2f314, 4, 6 ) ERROR_SUCCESS 94 + // Explorer.EXE SHSettingsChanged ( 0, "Software\Microsoft\Windows\CurrentVersion\Explorer\IconUnderline" ) (WM_SETTINGCHANGE handling) 95 + static BOOL IntSetUnderlineState(BOOL bUnderlineHover) 103 96 { 104 97 LSTATUS Status; 105 - DWORD dwValue = (bIconUnderline ? 3 : 2), dwSize = sizeof(DWORD); 98 + DWORD dwValue = bUnderlineHover ? UNDERLINE_HOVER : UNDERLINE_IE; 106 99 Status = SHRegSetUSValue(s_pszExplorerKey, L"IconUnderline", REG_NONE, 107 - &dwValue, dwSize, SHREGSET_FORCE_HKCU | SHREGSET_HKLM); 100 + &dwValue, sizeof(dwValue), SHREGSET_FORCE_HKCU | SHREGSET_HKLM); 108 101 if (Status != ERROR_SUCCESS) 109 102 return FALSE; 110 103 111 - SHSendMessageBroadcastW(WM_SETTINGCHANGE, 0, (LPARAM)L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\IconUnderline"); 104 + SHSendMessageBroadcastW(WM_SETTINGCHANGE, 0, (LPARAM)(REGSTR_PATH_EXPLORER L"\\IconUnderline")); 112 105 return TRUE; 113 106 } 114 107 115 - static BOOL IntGetUnderlineState(VOID) 108 + static UINT IntGetRawIconUnderlineValue() 109 + { 110 + DWORD dwValue, dwDefault = UNDERLINE_ON; 111 + DWORD dwSize = sizeof(dwValue); 112 + SHRegGetUSValue(s_pszExplorerKey, L"IconUnderline", NULL, &dwValue, &dwSize, FALSE, &dwDefault, sizeof(dwDefault)); 113 + return dwValue; 114 + } 115 + 116 + static UINT SHELL_GetIconUnderlineMode() 117 + { 118 + UINT mode = IntGetRawIconUnderlineValue(); 119 + if (mode < UNDERLINE_IE) 120 + return mode; 121 + 122 + WCHAR buf[sizeof("hoverX")]; 123 + *buf = UNICODE_NULL; 124 + DWORD cb = sizeof(buf); 125 + SHRegGetUSValueW(L"Software\\Microsoft\\Internet Explorer\\Main", 126 + L"Anchor Underline", NULL, buf, &cb, FALSE, buf, cb); 127 + if (!lstrcmpiW(buf, L"no")) 128 + return UNDERLINE_OFF; 129 + if (!lstrcmpiW(buf, L"hover")) 130 + return UNDERLINE_HOVER; 131 + return UNDERLINE_ON; 132 + } 133 + 134 + UINT SHELL_GetIconUnderlineFlags() 116 135 { 117 - DWORD dwValue, dwDefault = 2, dwSize = sizeof(DWORD); 118 - SHRegGetUSValue(s_pszExplorerKey, L"IconUnderline", NULL, &dwValue, &dwSize, FALSE, &dwDefault, sizeof(DWORD)); 119 - return dwValue == 3; 136 + UINT mode = SHELL_GetIconUnderlineMode(); 137 + if (mode == UNDERLINE_HOVER) 138 + return LVS_EX_UNDERLINEHOT; 139 + if (mode == UNDERLINE_ON) 140 + return LVS_EX_UNDERLINEHOT | LVS_EX_UNDERLINECOLD; 141 + return 0; 120 142 } 121 143 122 144 // bNewWindowMode is TRUE if "Open each folder in its own window". ··· 239 261 240 262 if (nCtrlID == IDC_FOLDER_OPTIONS_DOUBLECLICK) 241 263 { 242 - CheckRadioButton(hDlg, IDC_FOLDER_OPTIONS_ULBROWSER, IDC_FOLDER_OPTIONS_ULPOINT, IDC_FOLDER_OPTIONS_ULBROWSER); 243 264 EnableWindow(GetDlgItem(hDlg, IDC_FOLDER_OPTIONS_ULBROWSER), FALSE); 244 265 EnableWindow(GetDlgItem(hDlg, IDC_FOLDER_OPTIONS_ULPOINT), FALSE); 245 266 } ··· 247 268 248 269 static void 249 270 GeneralDlg_StoreToUI(HWND hwndDlg, BOOL bDoubleClick, BOOL bUseCommonTasks, 250 - BOOL bUnderline, BOOL bNewWindowMode, PGENERAL_DIALOG pGeneral) 271 + BOOL bUnderlineHover, BOOL bNewWindowMode, PGENERAL_DIALOG pGeneral) 251 272 { 252 - EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_COMMONTASKS), bUseCommonTasks); // FIXME: ROS DefView does not support WebView nor the tasks pane 273 + if (SHRestricted(REST_CLASSICSHELL)) 274 + { 275 + EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_SINGLECLICK), FALSE); 276 + bDoubleClick = TRUE; 277 + bUseCommonTasks = FALSE; 278 + } 279 + 280 + EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_COMMONTASKS), bUseCommonTasks); // TODO: ROS DefView does not support WebView nor the tasks pane 253 281 254 282 if (bUseCommonTasks) 255 283 CheckRadioButton(hwndDlg, IDC_FOLDER_OPTIONS_COMMONTASKS, IDC_FOLDER_OPTIONS_CLASSICFOLDERS, IDC_FOLDER_OPTIONS_COMMONTASKS); ··· 266 294 else 267 295 CheckRadioButton(hwndDlg, IDC_FOLDER_OPTIONS_SAMEWINDOW, IDC_FOLDER_OPTIONS_OWNWINDOW, IDC_FOLDER_OPTIONS_SAMEWINDOW); 268 296 269 - if (!bDoubleClick) 270 - { 271 - EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_ULBROWSER), TRUE); 272 - EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_ULPOINT), TRUE); 273 - if (bUnderline) 274 - CheckRadioButton(hwndDlg, IDC_FOLDER_OPTIONS_ULBROWSER, IDC_FOLDER_OPTIONS_ULPOINT, IDC_FOLDER_OPTIONS_ULPOINT); 275 - else 276 - CheckRadioButton(hwndDlg, IDC_FOLDER_OPTIONS_ULBROWSER, IDC_FOLDER_OPTIONS_ULPOINT, IDC_FOLDER_OPTIONS_ULBROWSER); 277 - } 297 + EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_ULBROWSER), !bDoubleClick); 298 + EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_ULPOINT), !bDoubleClick); 299 + if (bUnderlineHover) 300 + CheckRadioButton(hwndDlg, IDC_FOLDER_OPTIONS_ULBROWSER, IDC_FOLDER_OPTIONS_ULPOINT, IDC_FOLDER_OPTIONS_ULPOINT); 278 301 else 279 - { 280 - EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_ULBROWSER), FALSE); 281 - EnableWindow(GetDlgItem(hwndDlg, IDC_FOLDER_OPTIONS_ULPOINT), FALSE); 282 302 CheckRadioButton(hwndDlg, IDC_FOLDER_OPTIONS_ULBROWSER, IDC_FOLDER_OPTIONS_ULPOINT, IDC_FOLDER_OPTIONS_ULBROWSER); 283 - } 284 303 } 285 304 286 305 static BOOL ··· 290 309 SHGetSetSettings(&ss, SSF_DOUBLECLICKINWEBVIEW | SSF_WEBVIEW, FALSE); 291 310 BOOL bDoubleClick = !!ss.fDoubleClickInWebView; 292 311 BOOL bUseCommonTasks = !!ss.fWebView; 293 - BOOL bUnderline = IntGetUnderlineState(); 312 + BOOL bUnderlineHover = IntGetRawIconUnderlineValue() == UNDERLINE_HOVER; 294 313 BOOL bNewWindowMode = IntGetNewWindowMode(); 295 314 296 - GeneralDlg_StoreToUI(hwndDlg, bDoubleClick, bUseCommonTasks, bUnderline, bNewWindowMode, pGeneral); 315 + GeneralDlg_StoreToUI(hwndDlg, bDoubleClick, bUseCommonTasks, bUnderlineHover, bNewWindowMode, pGeneral); 297 316 GeneralDlg_UpdateIcons(hwndDlg, 0, pGeneral); 298 317 299 318 return TRUE; ··· 305 324 // default values 306 325 BOOL bDoubleClick = TRUE; 307 326 BOOL bUseCommonTasks = TRUE; 308 - BOOL bUnderline = FALSE; 327 + BOOL bUnderlineHover = FALSE; 309 328 BOOL bNewWindowMode = (_WIN32_WINNT < _WIN32_WINNT_WIN2K); 310 329 311 - GeneralDlg_StoreToUI(hwndDlg, bDoubleClick, bUseCommonTasks, bUnderline, bNewWindowMode, pGeneral); 330 + GeneralDlg_StoreToUI(hwndDlg, bDoubleClick, bUseCommonTasks, bUnderlineHover, bNewWindowMode, pGeneral); 312 331 GeneralDlg_UpdateIcons(hwndDlg, 0, pGeneral); 313 332 } 314 333 ··· 317 336 { 318 337 BOOL bDoubleClick = !(IsDlgButtonChecked(hwndDlg, IDC_FOLDER_OPTIONS_SINGLECLICK) == BST_CHECKED); 319 338 BOOL bUseCommonTasks = (IsDlgButtonChecked(hwndDlg, IDC_FOLDER_OPTIONS_COMMONTASKS) == BST_CHECKED); 320 - BOOL bUnderline = (IsDlgButtonChecked(hwndDlg, IDC_FOLDER_OPTIONS_ULPOINT) == BST_CHECKED); 339 + BOOL bUnderlineHover = (IsDlgButtonChecked(hwndDlg, IDC_FOLDER_OPTIONS_ULPOINT) == BST_CHECKED); 321 340 BOOL bNewWindowMode = !(IsDlgButtonChecked(hwndDlg, IDC_FOLDER_OPTIONS_SAMEWINDOW) == BST_CHECKED); 322 341 323 - IntSetUnderlineState(bUnderline); 342 + IntSetUnderlineState(bUnderlineHover); 324 343 BOOL updateCabinets = IntSetNewWindowMode(bNewWindowMode) == S_OK; 325 344 IntSetShellStateSettings(bDoubleClick, bUseCommonTasks); 326 345 if (updateCabinets)
+2
dll/win32/shell32/shfldr.h
··· 207 207 208 208 #endif 209 209 210 + UINT SHELL_GetIconUnderlineFlags(); 211 + 210 212 #endif /* _SHFLDR_H_ */