[PATCH resend 1/2] comctl32: Set the selection if it's currently invalid in HandleTimer.

Gabriel Ivăncescu gabrielopcode at gmail.com
Wed Nov 10 08:22:02 CST 2021


Don't skip MoveCaret if it would actually change the selection when it is
invalid. This can happen, for example, in a combo box if the dropdown is shown
by a mouse click + release followed by the mouse being moved into the dropped
listbox, when the listbox has nothing selected. In this case, the item with
the index zero would not be selected the first time the mouse moves over it,
since the focus_item would be zero, despite the fact the item is not selected.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---

This can be easily tested with winecfg. Launch winecfg, go to `Libraries`
tab, click on the combobox arrow dropdown for `New override for library`
to open the listbox, then hover the mouse over the first entry (acledit).

Notice that it does not get highlighted, which is the issue. If you move
the mouse to the second entry (aclui) and then back to (acledit), it works.

With this patch, the first hover over the first entry will also work as
it should.

 dlls/comctl32/listbox.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dlls/comctl32/listbox.c b/dlls/comctl32/listbox.c
index 1edb233..d89d49a 100644
--- a/dlls/comctl32/listbox.c
+++ b/dlls/comctl32/listbox.c
@@ -2339,7 +2339,7 @@ static LRESULT LISTBOX_HandleTimer( LB_DESCR *descr, INT index, TIMER_DIRECTION
     case LB_TIMER_NONE:
         break;
     }
-    if (index == descr->focus_item) return FALSE;
+    if (index == descr->focus_item && descr->selected_item != -1) return FALSE;
     LISTBOX_MoveCaret( descr, index, FALSE );
     return TRUE;
 }
-- 
2.31.1




More information about the wine-devel mailing list