Huw Davies : riched20: Handle EM_SETBKGNDCOLOR in the host.

Alexandre Julliard julliard at winehq.org
Thu Mar 18 16:43:53 CDT 2021


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Mar 18 08:30:06 2021 +0000

riched20: Handle EM_SETBKGNDCOLOR in the host.

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/riched20/editor.c  | 26 --------------------------
 dlls/riched20/editstr.h |  2 --
 dlls/riched20/txthost.c | 26 ++++++++++++++++++++++----
 3 files changed, 22 insertions(+), 32 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 13a04a003f4..3073294bd7b 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -3005,8 +3005,6 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
   ed->nLastTotalLength = ed->nTotalLength = 0;
   ed->nLastTotalWidth = ed->nTotalWidth = 0;
   ed->nUDArrowX = -1;
-  ed->rgbBackColor = -1;
-  ed->hbrBackground = GetSysColorBrush(COLOR_WINDOW);
   ed->nEventMask = 0;
   ed->nModifyStep = 0;
   ed->nTextLimit = TEXT_LIMIT_DEFAULT;
@@ -3100,8 +3098,6 @@ void ME_DestroyEditor(ME_TextEditor *editor)
     if (editor->pFontCache[i].hFont)
       DeleteObject(editor->pFontCache[i].hFont);
   }
-  if (editor->rgbBackColor != -1)
-    DeleteObject(editor->hbrBackground);
   if(editor->lpOleCallback)
     IRichEditOleCallback_Release(editor->lpOleCallback);
   if (editor->reOle)
@@ -3516,28 +3512,6 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
   }
   case EM_SELECTIONTYPE:
     return ME_GetSelectionType(editor);
-  case EM_SETBKGNDCOLOR:
-  {
-    LRESULT lColor;
-    if (editor->rgbBackColor != -1) {
-      DeleteObject(editor->hbrBackground);
-      lColor = editor->rgbBackColor;
-    }
-    else lColor = ITextHost_TxGetSysColor(editor->texthost, COLOR_WINDOW);
-
-    if (wParam)
-    {
-      editor->rgbBackColor = -1;
-      editor->hbrBackground = GetSysColorBrush(COLOR_WINDOW);
-    }
-    else
-    {
-      editor->rgbBackColor = lParam;
-      editor->hbrBackground = CreateSolidBrush(editor->rgbBackColor);
-    }
-    ITextHost_TxInvalidateRect(editor->texthost, NULL, TRUE);
-    return lColor;
-  }
   case EM_GETMODIFY:
     return editor->nModifyStep == 0 ? 0 : -1;
   case EM_SETMODIFY:
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h
index 1f277cbf6bc..0273fde4350 100644
--- a/dlls/riched20/editstr.h
+++ b/dlls/riched20/editstr.h
@@ -392,8 +392,6 @@ typedef struct tagME_TextEditor
   int nAvailWidth; /* 0 = wrap to client area, else wrap width in twips */
   int nUDArrowX;
   int total_rows;
-  COLORREF rgbBackColor;
-  HBRUSH hbrBackground;
   int nEventMask;
   int nModifyStep;
   struct list undo_stack;
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index c80263bbd69..ebccddf65e3 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -45,9 +45,11 @@ struct host
     unsigned int sel_bar : 1;
     unsigned int client_edge : 1;
     unsigned int use_set_rect : 1;
+    unsigned int use_back_colour : 1;
     PARAFORMAT2 para_fmt;
     DWORD props, scrollbars, event_mask;
     RECT client_rect, set_rect;
+    COLORREF back_colour;
 };
 
 static const ITextHostVtbl textHostVtbl;
@@ -111,6 +113,7 @@ struct host *host_create( HWND hwnd, CREATESTRUCTW *cs, BOOL emulate_10 )
     texthost->use_set_rect = 0;
     SetRectEmpty( &texthost->set_rect );
     GetClientRect( hwnd, &texthost->client_rect );
+    texthost->use_back_colour = 0;
 
     return texthost;
 }
@@ -346,6 +349,9 @@ DECLSPEC_HIDDEN HRESULT __thiscall ITextHostImpl_TxGetParaFormat( ITextHost *ifa
 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSysColor,8)
 DECLSPEC_HIDDEN COLORREF __thiscall ITextHostImpl_TxGetSysColor( ITextHost *iface, int index )
 {
+    struct host *host = impl_from_ITextHost( iface );
+
+    if (index == COLOR_WINDOW && host->use_back_colour) return host->back_colour;
     return GetSysColor( index );
 }
 
@@ -992,9 +998,14 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
     {
         HDC hdc = (HDC)wparam;
         RECT rc;
+        HBRUSH brush;
 
         if (GetUpdateRect( editor->hWnd, &rc, TRUE ))
-            FillRect( hdc, &rc, editor->hbrBackground );
+        {
+            brush = CreateSolidBrush( ITextHost_TxGetSysColor( &host->ITextHost_iface, COLOR_WINDOW ) );
+            FillRect( hdc, &rc, brush );
+            DeleteObject( brush );
+        }
         return 1;
     }
     case EM_FINDTEXT:
@@ -1127,13 +1138,13 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
         HDC hdc;
         RECT rc;
         PAINTSTRUCT ps;
-        HBRUSH old_brush;
+        HBRUSH brush = CreateSolidBrush( ITextHost_TxGetSysColor( &host->ITextHost_iface, COLOR_WINDOW ) );
 
         update_caret( editor );
         hdc = BeginPaint( editor->hWnd, &ps );
         if (!editor->bEmulateVersion10 || (editor->nEventMask & ENM_UPDATE))
             ME_SendOldNotify( editor, EN_UPDATE );
-        old_brush = SelectObject( hdc, editor->hbrBackground );
+        brush = SelectObject( hdc, brush );
 
         /* Erase area outside of the formatting rectangle */
         if (ps.rcPaint.top < editor->rcFormat.top)
@@ -1166,7 +1177,7 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
         }
 
         ME_PaintContent( editor, hdc, &ps.rcPaint );
-        SelectObject( hdc, old_brush );
+        DeleteObject( SelectObject( hdc, brush ) );
         EndPaint( editor->hWnd, &ps );
         return 0;
     }
@@ -1181,6 +1192,13 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
         res = len;
         break;
     }
+    case EM_SETBKGNDCOLOR:
+        res = ITextHost_TxGetSysColor( &host->ITextHost_iface, COLOR_WINDOW );
+        host->use_back_colour = !wparam;
+        if (host->use_back_colour) host->back_colour = lparam;
+        InvalidateRect( hwnd, NULL, TRUE );
+        break;
+
     case EM_SETEVENTMASK:
         host->event_mask = lparam;
         hr = ITextServices_TxSendMessage( host->text_srv, msg, wparam, lparam, &res );




More information about the wine-cvs mailing list