http://bugs.winehq.org/show_bug.cgi?id=12311
--- Comment #5 from Alex Villacís Lasso a_villacis@palosanto.com 2008-05-13 12:13:38 --- Created an attachment (id=13024) --> (http://bugs.winehq.org/attachment.cgi?id=13024) richedit: do not hide or show vertical scrollbar if app hides or shows it behind our back
Finally found the root cause of the non-updating of the text window. To apply, first follow the instructions attached for previous patch, to get this one to apply cleanly.
What is happening is that the application has its own window class to show the text window, which delegates to richedit for most of the actual display, but also calls ShowScrollBar() on receiving WM_SIZE *after* the message has been processed by richedit window proc. It seems the app wants to show the vertical scrollbar at all times, overriding the default richedit behavior of hiding it when not needed, but does not bother to use the ES_DISABLENOSCROLL style, so it calls ShowScrollBar() to show the scrollbar after WM_SIZE decided to hide it.
Native richedit somehow detects that the scrollbars have been messed up with outside of richedit logic and does not attempt to modify them. In particular, a WM_SIZE triggered by the showing of the bars (and consequent resize of the client area) does not trigger an auto-hide of the scrollbar if the scrollbar was forcibly shown. In builtin, it does, resulting in a childish recursive yanking back and forth between the app winproc override ("no!, I want the bars to be shown!") and the builtin richedit winproc ("no!, the bars should be hidden!") with an end result of an application hang. This patch fixes the yanking in a way similar to native richedit.
Please note that this patch does NOT make the application usable yet, it merely fixes this issue and exposes the next issue, which is a crash by invalid memory access when the mouse pointer is moved over the richedit window.
From git commit:
Some applications (such as the one on bug #12311) have never heard of ES_DISABLENOSCROLL and attempt to force scrollbars to be always shown (with ShowScrollBar() or similar) when otherwise richedit would hide them. If richedit attempts to wrestle control back, a recursive loop of requests can result if app overrides WM_SIZE behavior. So let the app have its way. Richedit should reclaim control when forced visibility matches default automatic behavior. Tests to verify this behavior.