diff --git a/dlls/comctl32/tests/updown.c b/dlls/comctl32/tests/updown.c index dacc460dd4..fef53bfb54 100644 --- a/dlls/comctl32/tests/updown.c +++ b/dlls/comctl32/tests/updown.c @@ -59,6 +59,9 @@ #define EDIT_SEQ_INDEX 1 #define UPDOWN_SEQ_INDEX 2 +#define UPDOWN_ID 0 +#define BUDDY_ID 1 + static HWND parent_wnd, g_edit; static BOOL (WINAPI *pSetWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR); @@ -156,6 +159,11 @@ static const struct message test_updown_unicode_seq[] = { { 0 } }; +static const struct message test_updown_pos_nochange_seq[] = { + { WM_GETTEXT, sent|id, 0, 0, BUDDY_ID }, + { 0 } +}; + static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static LONG defwndproc_counter = 0; @@ -233,6 +241,7 @@ static LRESULT WINAPI edit_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.id = BUDDY_ID; add_message(sequences, EDIT_SEQ_INDEX, &msg); defwndproc_counter++; @@ -274,6 +283,7 @@ static LRESULT WINAPI updown_subclass_proc(HWND hwnd, UINT message, WPARAM wPara if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + msg.id = UPDOWN_ID; add_message(sequences, UPDOWN_SEQ_INDEX, &msg); defwndproc_counter++; @@ -360,6 +370,19 @@ static void test_updown_pos(void) ok_sequence(sequences, UPDOWN_SEQ_INDEX, test_updown_pos_seq , "test updown pos", FALSE); DestroyWindow(updown); + + /* there's no attempt to update buddy Edit if text didn't change */ + SetWindowTextA(g_edit, "50"); + updown = create_updown_control(UDS_ALIGNRIGHT | UDS_SETBUDDYINT, g_edit); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + r = SendMessage(updown, UDM_SETPOS, 0, 50); + expect(50,r); + ok_sequence(sequences, EDIT_SEQ_INDEX, test_updown_pos_nochange_seq, + "test updown pos, no change", FALSE); + + DestroyWindow(updown); } static void test_updown_pos32(void) @@ -434,6 +457,19 @@ static void test_updown_pos32(void) ok_sequence(sequences, UPDOWN_SEQ_INDEX, test_updown_pos32_seq, "test updown pos32", FALSE); DestroyWindow(updown); + + /* there's no attempt to update buddy Edit if text didn't change */ + SetWindowTextA(g_edit, "50"); + updown = create_updown_control(UDS_ALIGNRIGHT | UDS_SETBUDDYINT, g_edit); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + r = SendMessage(updown, UDM_SETPOS32, 0, 50); + expect(50,r); + ok_sequence(sequences, EDIT_SEQ_INDEX, test_updown_pos_nochange_seq, + "test updown pos, no change", FALSE); + + DestroyWindow(updown); } static void test_updown_buddy(void) diff --git a/dlls/comctl32/updown.c b/dlls/comctl32/updown.c index 127bb40ecf..776d72ee8a 100644 --- a/dlls/comctl32/updown.c +++ b/dlls/comctl32/updown.c @@ -310,7 +310,7 @@ static BOOL UPDOWN_GetBuddyInt (UPDOWN_INFO *infoPtr) static BOOL UPDOWN_SetBuddyInt (const UPDOWN_INFO *infoPtr) { WCHAR fmt[3] = { '%', 'd', '\0' }; - WCHAR txt[20]; + WCHAR txt[20], txt_old[20] = { 0 }; int len; if (!((infoPtr->Flags & FLAG_BUDDYINT) && IsWindow(infoPtr->Buddy))) @@ -345,6 +345,10 @@ static BOOL UPDOWN_SetBuddyInt (const UPDOWN_INFO *infoPtr) *dst = 0; } + /* if nothing changed exit earlier */ + GetWindowTextW(infoPtr->Buddy, txt_old, sizeof(txt_old)/sizeof(WCHAR)); + if (lstrcmpiW(txt_old, txt) == 0) return 0; + return SetWindowTextW(infoPtr->Buddy, txt); }