comctl32: listview should accept both unicode and ansi notifications.
Dmitry Timoshkov
dmitry at codeweavers.com
Thu Feb 18 06:46:27 CST 2010
Listview receives notifications not only from built-in header control,
but also from custom or subclassed application controls, there is no
need to assert(0) on application input, printing a FIXME is the maximum
we can do on an unknown input.
Added test case passes under XP, but listview in Wine intentionally
crashes itself on an absolutely valid input.
---
dlls/comctl32/listview.c | 18 +++++++++++++++---
dlls/comctl32/tests/listview.c | 40 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index cf06e09..2d39675 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -753,25 +753,37 @@ static int get_ansi_notification(UINT unicodeNotificationCode)
{
switch (unicodeNotificationCode)
{
+ case LVN_BEGINLABELEDITA:
case LVN_BEGINLABELEDITW: return LVN_BEGINLABELEDITA;
+ case LVN_ENDLABELEDITA:
case LVN_ENDLABELEDITW: return LVN_ENDLABELEDITA;
+ case LVN_GETDISPINFOA:
case LVN_GETDISPINFOW: return LVN_GETDISPINFOA;
+ case LVN_SETDISPINFOA:
case LVN_SETDISPINFOW: return LVN_SETDISPINFOA;
+ case LVN_ODFINDITEMA:
case LVN_ODFINDITEMW: return LVN_ODFINDITEMA;
+ case LVN_GETINFOTIPA:
case LVN_GETINFOTIPW: return LVN_GETINFOTIPA;
/* header forwards */
+ case HDN_TRACKA:
case HDN_TRACKW: return HDN_TRACKA;
+ case HDN_ENDTRACKA:
case HDN_ENDTRACKW: return HDN_ENDTRACKA;
case HDN_BEGINDRAG: return HDN_BEGINDRAG;
case HDN_ENDDRAG: return HDN_ENDDRAG;
+ case HDN_ITEMCHANGINGA:
case HDN_ITEMCHANGINGW: return HDN_ITEMCHANGINGA;
+ case HDN_ITEMCHANGEDA:
case HDN_ITEMCHANGEDW: return HDN_ITEMCHANGEDA;
+ case HDN_ITEMCLICKA:
case HDN_ITEMCLICKW: return HDN_ITEMCLICKA;
+ case HDN_DIVIDERDBLCLICKA:
case HDN_DIVIDERDBLCLICKW: return HDN_DIVIDERDBLCLICKA;
+ default: break;
}
- ERR("unknown notification %x\n", unicodeNotificationCode);
- assert(FALSE);
- return 0;
+ FIXME("unknown notification %x\n", unicodeNotificationCode);
+ return unicodeNotificationCode;
}
/* forwards header notifications to listview parent */
diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c
index 9014f72..02f530f 100644
--- a/dlls/comctl32/tests/listview.c
+++ b/dlls/comctl32/tests/listview.c
@@ -4290,6 +4290,45 @@ static void test_destroynotify(void)
ok_sequence(sequences, COMBINED_SEQ_INDEX, listview_destroy, "check destroy order", FALSE);
}
+static void test_header_notification(void)
+{
+ HWND list, header;
+ HDITEMA item;
+ NMHEADER nmh;
+ LVCOLUMNA col;
+ LRESULT ret;
+
+ list = create_listview_control(LVS_REPORT);
+ ok(list != 0, "failed to create listview window\n");
+
+ memset(&col, 0, sizeof(col));
+ col.mask = LVCF_WIDTH;
+ col.cx = 100;
+ ret = SendMessage(list, LVM_INSERTCOLUMNA, 0, (LPARAM)&col);
+ ok(!ret, "expected 0, got %ld\n", ret);
+
+ header = subclass_header(list);
+
+ ret = SendMessage(header, HDM_GETITEMCOUNT, 0, 0);
+ ok(ret == 1, "expected header item count 1, got %ld\n", ret);
+
+ ret = SendMessage(header, HDM_GETITEMA, 0, (LPARAM)&item);
+ ok(ret, "HDM_GETITEM failed\n");
+
+ nmh.hdr.hwndFrom = header;
+ nmh.hdr.idFrom = GetWindowLong(header, GWL_ID);
+ nmh.hdr.code = HDN_ITEMCHANGEDA;
+ nmh.iItem = 0;
+ nmh.iButton = 0;
+ item.mask = HDI_WIDTH;
+ item.cxy = 50;
+ nmh.pitem = &item;
+ ret = SendMessage(list, WM_NOTIFY, 0, (LPARAM)&nmh);
+ ok(!ret, "WM_NOTIFY/HDN_ITEMCHANGED failed\n");
+
+ DestroyWindow(list);
+}
+
START_TEST(listview)
{
HMODULE hComctl32;
@@ -4318,6 +4357,7 @@ START_TEST(listview)
g_is_below_5 = is_below_comctl_5();
+ test_header_notification();
test_images();
test_checkboxes();
test_items();
--
1.7.0
More information about the wine-patches
mailing list