Dmitry Timoshkov : user32:
CBN_SELCHANGE notification should be sent before an edit update.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Aug 9 08:23:16 CDT 2007
Module: wine
Branch: master
Commit: ce1ab638dac02ad61cdabb32a7353e54e7b1c8e3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce1ab638dac02ad61cdabb32a7353e54e7b1c8e3
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Thu Aug 9 18:34:23 2007 +0900
user32: CBN_SELCHANGE notification should be sent before an edit update.
---
dlls/user32/combo.c | 8 ++--
dlls/user32/tests/combo.c | 93 ++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 95 insertions(+), 6 deletions(-)
diff --git a/dlls/user32/combo.c b/dlls/user32/combo.c
index e9a76b5..084e612 100644
--- a/dlls/user32/combo.c
+++ b/dlls/user32/combo.c
@@ -1347,7 +1347,9 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd )
case LBN_SELCHANGE:
case LBN_SELCANCEL:
- TRACE("[%p]: lbox selection change [%x]\n", lphc->self, lphc->wState );
+ TRACE("[%p]: lbox selection change [%x]\n", lphc->self, lphc->wState );
+
+ CB_NOTIFY( lphc, CBN_SELCHANGE );
if( HIWORD(wParam) == LBN_SELCHANGE)
{
@@ -1371,9 +1373,7 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd )
}
else lphc->wState &= ~CBF_NOROLLUP;
- CB_NOTIFY( lphc, CBN_SELCHANGE );
-
- /* fall through */
+ break;
case LBN_SETFOCUS:
case LBN_KILLFOCUS:
diff --git a/dlls/user32/tests/combo.c b/dlls/user32/tests/combo.c
index bf777c7..642c49d 100644
--- a/dlls/user32/tests/combo.c
+++ b/dlls/user32/tests/combo.c
@@ -21,12 +21,15 @@
#include <stdarg.h>
#include <stdio.h>
+#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "wine/test.h"
-HWND hMainWnd;
+#define COMBO_ID 1995
+
+static HWND hMainWnd;
#define expect_eq(expr, value, type, fmt); { type val = expr; ok(val == (value), #expr " expected " #fmt " got " #fmt "\n", (value), val); }
#define expect_rect(r, _left, _top, _right, _bottom) ok(r.left == _left && r.top == _top && \
@@ -35,7 +38,7 @@ HWND hMainWnd;
static HWND build_combo(DWORD style)
{
- return CreateWindow("ComboBox", "Combo", WS_VISIBLE|WS_CHILD|style, 5, 5, 100, 100, hMainWnd, NULL, NULL, 0);
+ return CreateWindow("ComboBox", "Combo", WS_VISIBLE|WS_CHILD|style, 5, 5, 100, 100, hMainWnd, (HMENU)COMBO_ID, NULL, 0);
}
static int font_height(HFONT hFont)
@@ -84,6 +87,9 @@ static void test_setfont(DWORD style)
if (!is_font_installed("Marlett"))
{
skip("Marlett font not available\n");
+ DestroyWindow(hCombo);
+ DeleteObject(hFont1);
+ DeleteObject(hFont2);
return;
}
@@ -130,6 +136,87 @@ static void test_setfont(DWORD style)
DeleteObject(hFont2);
}
+static LRESULT (CALLBACK *old_parent_proc)(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
+static LPCSTR expected_edit_text;
+static LPCSTR expected_list_text;
+
+static LRESULT CALLBACK parent_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
+{
+ switch (msg)
+ {
+ case WM_COMMAND:
+ switch (wparam)
+ {
+ case MAKEWPARAM(COMBO_ID, CBN_SELCHANGE):
+ {
+ HWND hCombo = (HWND)lparam;
+ int idx;
+ char list[20], edit[20];
+
+ memset(list, 0, sizeof(list));
+ memset(edit, 0, sizeof(edit));
+
+ idx = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+ SendMessage(hCombo, CB_GETLBTEXT, idx, (LPARAM)list);
+ SendMessage(hCombo, WM_GETTEXT, sizeof(edit), (LPARAM)edit);
+
+ ok(!strcmp(edit, expected_edit_text), "edit: got %s, expected %s\n",
+ edit, expected_edit_text);
+ ok(!strcmp(list, expected_list_text), "list: got %s, expected %s\n",
+ list, expected_list_text);
+ }
+ break;
+ }
+ break;
+ }
+
+ return CallWindowProc(old_parent_proc, hwnd, msg, wparam, lparam);
+}
+
+static void test_selection(DWORD style, const char * const text[],
+ const int *edit, const int *list)
+{
+ INT idx;
+ HWND hCombo;
+
+ hCombo = build_combo(style);
+
+ SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)text[0]);
+ SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)text[1]);
+ SendMessage(hCombo, CB_SETCURSEL, -1, 0);
+
+ old_parent_proc = (void *)SetWindowLongPtr(hMainWnd, GWLP_WNDPROC, (ULONG_PTR)parent_wnd_proc);
+
+ idx = SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+ ok(idx == -1, "expected selection -1, got %d\n", idx);
+
+ expected_list_text = text[list[0]];
+ expected_edit_text = text[edit[0]];
+ SendMessage(hCombo, WM_KEYDOWN, VK_DOWN, 0);
+
+ expected_list_text = text[list[1]];
+ expected_edit_text = text[edit[1]];
+ SendMessage(hCombo, WM_KEYDOWN, VK_DOWN, 0);
+
+ expected_list_text = text[list[2]];
+ expected_edit_text = text[edit[2]];
+ SendMessage(hCombo, WM_KEYDOWN, VK_UP, 0);
+
+ SetWindowLongPtr(hMainWnd, GWLP_WNDPROC, (ULONG_PTR)old_parent_proc);
+ DestroyWindow(hCombo);
+}
+
+static void test_CBN_SELCHANGE(void)
+{
+ static const char * const text[] = { "alpha", "beta", "" };
+ static const int sel_1[] = { 2, 0, 1 };
+ static const int sel_2[] = { 0, 1, 0 };
+
+ test_selection(CBS_SIMPLE, text, sel_1, sel_2);
+ test_selection(CBS_DROPDOWN, text, sel_1, sel_2);
+ test_selection(CBS_DROPDOWNLIST, text, sel_2, sel_2);
+}
+
START_TEST(combo)
{
hMainWnd = CreateWindow("static", "Test", WS_OVERLAPPEDWINDOW, 10, 10, 300, 300, NULL, NULL, NULL, 0);
@@ -137,5 +224,7 @@ START_TEST(combo)
test_setfont(CBS_DROPDOWN);
test_setfont(CBS_DROPDOWNLIST);
+ test_CBN_SELCHANGE();
+
DestroyWindow(hMainWnd);
}
More information about the wine-cvs
mailing list