diff --git "a/dll/win32/comctl32/listview.c" "b/dll/win32/comctl32/listview.c" index e9f8fd0b440..c9a12a307e6 100644 --- "a/dll/win32/comctl32/listview.c" +++ "b/dll/win32/comctl32/listview.c" @@ -426,6 +426,15 @@ typedef struct tagLISTVIEW_INFO static const WCHAR themeClass[] = {'L','i','s','t','V','i','e','w',0}; +#ifdef __REACTOS__ // Cherry pick Wine 10.9 commit 3b06cc7 +enum key_state +{ + SHIFT_KEY = 0x1, + CTRL_KEY = 0x2, + SPACE_KEY = 0x4, +}; +#endif + /* * forward declarations */ @@ -439,7 +448,11 @@ static BOOL LISTVIEW_GetViewRect(const LISTVIEW_INFO *, LPRECT); static void LISTVIEW_UpdateSize(LISTVIEW_INFO *); static LRESULT LISTVIEW_Command(LISTVIEW_INFO *, WPARAM, LPARAM); static INT LISTVIEW_GetStringWidthT(const LISTVIEW_INFO *, LPCWSTR, BOOL); +#ifdef __REACTOS__ // Cherry pick Wine 10.9 commit 3b06cc7 +static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *, INT, DWORD); +#else static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *, INT, BOOL); +#endif static UINT LISTVIEW_GetItemState(const LISTVIEW_INFO *, INT, UINT); static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *, INT, const LVITEMW *); static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *, INT, INT); @@ -1989,7 +2002,11 @@ static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, L } if (nItem != -1) +#ifdef __REACTOS__ // Cherry pick Wine 10.9 commit 3b06cc7 + LISTVIEW_KeySelection(infoPtr, nItem, 0); +#else LISTVIEW_KeySelection(infoPtr, nItem, FALSE); +#endif return 0; } @@ -3815,6 +3832,13 @@ static void LISTVIEW_SetSelection(LISTVIEW_INFO *infoPtr, INT nItem) infoPtr->nSelectionMark = nItem; } +#ifdef __REACTOS__ // Cherry pick Wine 10.9 commit 3b06cc7 +/* Change item selection with key input. */ +static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *infoPtr, INT nItem, DWORD keys) +{ + WORD wShift = !!(keys & SHIFT_KEY); + WORD wCtrl = !!(keys & CTRL_KEY); +#else /*** * DESCRIPTION: * Set selection(s) with keyboard. @@ -3833,6 +3857,7 @@ static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *infoPtr, INT nItem, BOOL space) /* FIXME: pass in the state */ WORD wShift = GetKeyState(VK_SHIFT) & 0x8000; WORD wCtrl = GetKeyState(VK_CONTROL) & 0x8000; +#endif BOOL bResult = FALSE; TRACE("nItem=%d, wShift=%d, wCtrl=%d\n", nItem, wShift, wCtrl); @@ -3851,7 +3876,11 @@ static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *infoPtr, INT nItem, BOOL space) LVITEMW lvItem; lvItem.state = ~LISTVIEW_GetItemState(infoPtr, nItem, LVIS_SELECTED); lvItem.stateMask = LVIS_SELECTED; +#ifdef __REACTOS__ // Cherry pick Wine 10.9 commit 3b06cc7 + if (keys & SPACE_KEY) +#else if (space) +#endif { LISTVIEW_SetItemState(infoPtr, nItem, &lvItem); if (lvItem.state & LVIS_SELECTED) @@ -10223,7 +10252,22 @@ static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lK } if ((nItem != -1) && (nItem != infoPtr->nFocusedItem || nVirtualKey == VK_SPACE)) +#ifdef __REACTOS__ // Cherry pick Wine 10.9 commit 3b06cc7 + { + DWORD keys = 0; + + if (GetKeyState(VK_SHIFT) & 0x8000) + keys |= SHIFT_KEY; + if (GetKeyState(VK_CONTROL) & 0x8000) + keys |= CTRL_KEY; + if (nVirtualKey == VK_SPACE) + keys |= SPACE_KEY; + + LISTVIEW_KeySelection(infoPtr, nItem, keys); + } +#else LISTVIEW_KeySelection(infoPtr, nItem, nVirtualKey == VK_SPACE); +#endif return 0; }