Fixes an issue in GenoPro where existing data would be cleared whenever you went to edit it
From: Evan Tang etang@codeweavers.com
--- dlls/riched20/tests/editor.c | 70 +++++++++++------------------------- 1 file changed, 20 insertions(+), 50 deletions(-)
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index 9551f490a2d..08ec4860ba3 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -110,6 +110,21 @@ static HWND new_richeditW(HWND parent) { return new_windowW(RICHEDIT_CLASS20W, ES_MULTILINE, parent); }
+static WNDCLASSA make_simple_class(WNDPROC wndproc, LPCSTR lpClassName) { + WNDCLASSA cls; + cls.style = 0; + cls.lpfnWndProc = wndproc; + cls.cbClsExtra = 0; + cls.cbWndExtra = 0; + cls.hInstance = GetModuleHandleA(0); + cls.hIcon = 0; + cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); + cls.hbrBackground = GetStockObject(WHITE_BRUSH); + cls.lpszMenuName = NULL; + cls.lpszClassName = lpClassName; + return cls; +} + /* Keeps the window reponsive for the deley_time in seconds. * This is useful for debugging a test to see what is happening. */ static void keep_responsive(time_t delay_time) @@ -4070,16 +4085,7 @@ static void test_EM_SETTEXTEX(void) * For some reason the scroll position is 0 after EM_SETTEXTEX * with the ST_SELECTION flag only when the control has a parent * window, even though the selection is at the end. */ - cls.style = 0; - cls.lpfnWndProc = DefWindowProcA; - cls.cbClsExtra = 0; - cls.cbWndExtra = 0; - cls.hInstance = GetModuleHandleA(0); - cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); - cls.hbrBackground = GetStockObject(WHITE_BRUSH); - cls.lpszMenuName = NULL; - cls.lpszClassName = "ParentTestClass"; + cls = make_simple_class(DefWindowProcA, "ParentTestClass"); if(!RegisterClassA(&cls)) assert(0);
parent = CreateWindowA(cls.lpszClassName, NULL, WS_POPUP|WS_VISIBLE, @@ -6599,16 +6605,7 @@ static void test_eventMask(void) int eventMask;
/* register class to capture WM_COMMAND */ - cls.style = 0; - cls.lpfnWndProc = ParentMsgCheckProcA; - cls.cbClsExtra = 0; - cls.cbWndExtra = 0; - cls.hInstance = GetModuleHandleA(0); - cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); - cls.hbrBackground = GetStockObject(WHITE_BRUSH); - cls.lpszMenuName = NULL; - cls.lpszClassName = "EventMaskParentClass"; + cls = make_simple_class(ParentMsgCheckProcA, "EventMaskParentClass"); if(!RegisterClassA(&cls)) assert(0);
parent = CreateWindowA(cls.lpszClassName, NULL, WS_POPUP|WS_VISIBLE, @@ -6692,16 +6689,7 @@ static void test_WM_NOTIFY(void) int sel_start, sel_end;
/* register class to capture WM_NOTIFY */ - cls.style = 0; - cls.lpfnWndProc = WM_NOTIFY_ParentMsgCheckProcA; - cls.cbClsExtra = 0; - cls.cbWndExtra = 0; - cls.hInstance = GetModuleHandleA(0); - cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); - cls.hbrBackground = GetStockObject(WHITE_BRUSH); - cls.lpszMenuName = NULL; - cls.lpszClassName = "WM_NOTIFY_ParentClass"; + cls = make_simple_class(WM_NOTIFY_ParentMsgCheckProcA, "WM_NOTIFY_ParentClass"); if(!RegisterClassA(&cls)) assert(0);
parent = CreateWindowA(cls.lpszClassName, NULL, WS_POPUP|WS_VISIBLE, @@ -6927,16 +6915,7 @@ static void test_EN_LINK(void) };
/* register class to capture WM_NOTIFY */ - cls.style = 0; - cls.lpfnWndProc = EN_LINK_ParentMsgCheckProcA; - cls.cbClsExtra = 0; - cls.cbWndExtra = 0; - cls.hInstance = GetModuleHandleA(0); - cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); - cls.hbrBackground = GetStockObject(WHITE_BRUSH); - cls.lpszMenuName = NULL; - cls.lpszClassName = "EN_LINK_ParentClass"; + cls = make_simple_class(EN_LINK_ParentMsgCheckProcA, "EN_LINK_ParentClass"); if(!RegisterClassA(&cls)) assert(0);
parent = CreateWindowA(cls.lpszClassName, NULL, WS_POPUP|WS_VISIBLE, @@ -7973,16 +7952,7 @@ static void test_dialogmode(void) int lcount, r; WNDCLASSA cls;
- cls.style = 0; - cls.lpfnWndProc = dialog_mode_wnd_proc; - cls.cbClsExtra = 0; - cls.cbWndExtra = 0; - cls.hInstance = GetModuleHandleA(0); - cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); - cls.hbrBackground = GetStockObject(WHITE_BRUSH); - cls.lpszMenuName = NULL; - cls.lpszClassName = "DialogModeParentClass"; + cls = make_simple_class(dialog_mode_wnd_proc, "DialogModeParentClass"); if(!RegisterClassA(&cls)) assert(0);
hwParent = CreateWindowA("DialogModeParentClass", NULL, WS_OVERLAPPEDWINDOW,
From: Evan Tang etang@codeweavers.com
GenoPro isn't very happy if it receives one --- dlls/riched20/tests/editor.c | 43 ++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+)
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index 08ec4860ba3..64724b92a62 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -8912,6 +8912,48 @@ static void fill_reobject_struct(REOBJECT *reobj, LONG cp, LPOLEOBJECT poleobj, reobj->dwUser = user; }
+static BOOL change_received = FALSE; + +static LRESULT WINAPI ChangeWatcherWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + if (message == WM_COMMAND && (wParam >> 16) == EN_CHANGE) change_received = TRUE; + return DefWindowProcA(hwnd, message, wParam, lParam); +} + +static LRESULT WINAPI RichEditWithEventsWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + if (message == WM_CREATE) { + SendMessageA(hwnd, EM_SETEVENTMASK, 0, ENM_CHANGE); + } + return CallWindowProcA(richeditProc, hwnd, message, wParam, lParam); +} + +static void test_init_messages(void) +{ + WNDCLASSA cls; + HWND parent, edit; + + /* register class to capture EN_CHANGE */ + cls = make_simple_class(ChangeWatcherWndProc, "ChangeWatcherClass"); + if(!RegisterClassA(&cls)) assert(0); + + /* and a class that sets ENM_CHANGE during WM_CREATE */ + if (!GetClassInfoA(hmoduleRichEdit, RICHEDIT_CLASS20A, &cls)) return; + richeditProc = cls.lpfnWndProc; + cls.lpfnWndProc = RichEditWithEventsWndProc; + cls.lpszClassName = "RichEditWithEvents"; + if (!RegisterClassA(&cls)) assert(0); + + parent = CreateWindowA("ChangeWatcherClass", NULL, WS_POPUP|WS_VISIBLE, + 0, 0, 200, 60, NULL, NULL, NULL, NULL); + ok(parent != 0, "Failed to create parent window\n"); + change_received = FALSE; + edit = new_window("RichEditWithEvents", 0, parent); + todo_wine ok(change_received == FALSE, "Creating a RichEdit should not make any EN_CHANGE events\n"); + DestroyWindow(edit); + DestroyWindow(parent); +} + static void test_EM_SELECTIONTYPE(void) { HWND hwnd = new_richedit(NULL); @@ -9090,6 +9132,7 @@ START_TEST( editor ) test_background(); test_eop_char_fmt(); test_para_numbering(); + test_init_messages(); test_EM_SELECTIONTYPE();
/* Set the environment variable WINETEST_RICHED20 to keep windows
From: Evan Tang etang@codeweavers.com
--- dlls/riched20/tests/editor.c | 2 +- dlls/riched20/txthost.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index 64724b92a62..2c1949f2a23 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -8949,7 +8949,7 @@ static void test_init_messages(void) ok(parent != 0, "Failed to create parent window\n"); change_received = FALSE; edit = new_window("RichEditWithEvents", 0, parent); - todo_wine ok(change_received == FALSE, "Creating a RichEdit should not make any EN_CHANGE events\n"); + ok(change_received == FALSE, "Creating a RichEdit should not make any EN_CHANGE events\n"); DestroyWindow(edit); DestroyWindow(parent); } diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c index c53aa0a3e05..cb008f19c21 100644 --- a/dlls/riched20/txthost.c +++ b/dlls/riched20/txthost.c @@ -1142,6 +1142,7 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam, WCHAR *textW = NULL; LONG codepage = unicode ? CP_UNICODE : CP_ACP; int len; + LRESULT evmask;
ITextServices_OnTxInPlaceActivate( host->text_srv, NULL );
@@ -1150,7 +1151,10 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam, text = unicode ? (void *)createW->lpszName : (void *)createA->lpszName; textW = ME_ToUnicode( codepage, text, &len ); } + ITextServices_TxSendMessage( host->text_srv, EM_GETEVENTMASK, 0, 0, &evmask ); + ITextServices_TxSendMessage( host->text_srv, EM_SETEVENTMASK, 0, evmask & ~ENM_CHANGE, &evmask ); ITextServices_TxSetText( host->text_srv, textW ); + ITextServices_TxSendMessage( host->text_srv, EM_SETEVENTMASK, 0, evmask, NULL ); if (lparam) ME_EndToUnicode( codepage, textW ); break; }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=125859
Your paranoid android.
=== debian11 (32 bit report) ===
d3d8: device.c:3365: Test failed: Expected message 0x1c for window 0x1, but didn't receive it
Huw Davies (@huw) commented about dlls/riched20/tests/editor.c:
return new_windowW(RICHEDIT_CLASS20W, ES_MULTILINE, parent); }
+static WNDCLASSA make_simple_class(WNDPROC wndproc, LPCSTR lpClassName) {
```suggestion:-0+0 static WNDCLASSA make_simple_class(WNDPROC wndproc, LPCSTR lpClassName) { ```
Huw Davies (@huw) commented about dlls/riched20/tests/editor.c:
reobj->dwUser = user;
}
+static BOOL change_received = FALSE;
+static LRESULT WINAPI ChangeWatcherWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{
- if (message == WM_COMMAND && (wParam >> 16) == EN_CHANGE) change_received = TRUE;
- return DefWindowProcA(hwnd, message, wParam, lParam);
+}
+static LRESULT WINAPI RichEditWithEventsWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{
- if (message == WM_CREATE) {
SendMessageA(hwnd, EM_SETEVENTMASK, 0, ENM_CHANGE);
- }
```suggestion:-2+0 if (message == WM_CREATE) SendMessageA(hwnd, EM_SETEVENTMASK, 0, ENM_CHANGE); ```
Huw Davies (@huw) commented about dlls/riched20/tests/editor.c:
+static LRESULT WINAPI RichEditWithEventsWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{
- if (message == WM_CREATE) {
SendMessageA(hwnd, EM_SETEVENTMASK, 0, ENM_CHANGE);
- }
- return CallWindowProcA(richeditProc, hwnd, message, wParam, lParam);
+}
+static void test_init_messages(void) +{
- WNDCLASSA cls;
- HWND parent, edit;
- /* register class to capture EN_CHANGE */
- cls = make_simple_class(ChangeWatcherWndProc, "ChangeWatcherClass");
- if(!RegisterClassA(&cls)) assert(0);
```suggestion:-0+0 if (!RegisterClassA(&cls)) assert(0); ```