Huw Davies : riched20: Defer releasing the host if inside a notify callback.

Alexandre Julliard julliard at winehq.org
Tue Dec 14 15:34:31 CST 2021


Module: wine
Branch: master
Commit: 8138159f20d6453443861570689e0f14018051da
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8138159f20d6453443861570689e0f14018051da

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Dec 14 07:36:13 2021 +0000

riched20: Defer releasing the host if inside a notify callback.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51521
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/riched20/txthost.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index af4d37d9fd2..82a3db8f0b6 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -44,11 +44,13 @@ struct host
     unsigned int client_edge : 1;
     unsigned int use_set_rect : 1;
     unsigned int use_back_colour : 1;
+    unsigned int defer_release : 1;
     PARAFORMAT2 para_fmt;
     DWORD props, scrollbars, event_mask;
     RECT client_rect, set_rect;
     COLORREF back_colour;
     WCHAR password_char;
+    unsigned int notify_level;
 };
 
 static const ITextHost2Vtbl textHostVtbl;
@@ -118,6 +120,8 @@ struct host *host_create( HWND hwnd, CREATESTRUCTW *cs, BOOL emulate_10 )
     GetClientRect( hwnd, &texthost->client_rect );
     texthost->use_back_colour = 0;
     texthost->password_char = (texthost->props & TXTBIT_USEPASSWORD) ? '*' : 0;
+    texthost->defer_release = 0;
+    texthost->notify_level = 0;
 
     return texthost;
 }
@@ -1098,12 +1102,24 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
 
     if ((((host->event_mask & ENM_KEYEVENTS) && msg >= WM_KEYFIRST && msg <= WM_KEYLAST) ||
          ((host->event_mask & ENM_MOUSEEVENTS) && msg >= WM_MOUSEFIRST && msg <= WM_MOUSELAST) ||
-         ((host->event_mask & ENM_SCROLLEVENTS) && msg >= WM_HSCROLL && msg <= WM_VSCROLL)) &&
-        send_msg_filter( host, msg, &wparam, &lparam ))
+         ((host->event_mask & ENM_SCROLLEVENTS) && msg >= WM_HSCROLL && msg <= WM_VSCROLL)))
     {
-        TRACE( "exit (filtered) hwnd %p msg %04x (%s) %lx %lx -> %lu\n",
-               hwnd, msg, get_msg_name(msg), wparam, lparam, res );
-        return res;
+        host->notify_level++;
+        res = send_msg_filter( host, msg, &wparam, &lparam );
+        if (!--host->notify_level && host->defer_release)
+        {
+            TRACE( "exit (filtered deferred release) hwnd %p msg %04x (%s) %lx %lx -> 0\n",
+                   hwnd, msg, get_msg_name(msg), wparam, lparam );
+            ITextHost2_Release( &host->ITextHost_iface );
+            return 0;
+        }
+
+        if (res)
+        {
+            TRACE( "exit (filtered %lu) hwnd %p msg %04x (%s) %lx %lx -> 0\n",
+                   res, hwnd, msg, get_msg_name(msg), wparam, lparam );
+            return 0;
+        }
     }
 
     switch (msg)
@@ -1139,7 +1155,8 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
         break;
     }
     case WM_DESTROY:
-        ITextHost2_Release( &host->ITextHost_iface );
+        if (!host->notify_level) ITextHost2_Release( &host->ITextHost_iface );
+        else host->defer_release = 1;
         return 0;
 
     case WM_ERASEBKGND:




More information about the wine-cvs mailing list