[PATCH 3/5] riched20: Use the host to set hide/save-sel, auto-word-sel, and vertical properties.

Huw Davies huw at codeweavers.com
Tue Mar 16 03:22:47 CDT 2021


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/riched20/editor.c  | 30 ++++++------------------------
 dlls/riched20/paint.c   |  6 +++---
 dlls/riched20/txthost.c | 35 +++++++++++++++++++++++++++++++----
 dlls/riched20/txtsrv.c  |  2 ++
 4 files changed, 42 insertions(+), 31 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index cf723d66cf6..b7c07058801 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -3118,20 +3118,13 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
   if (ed->props & TXTBIT_USEPASSWORD)
     ITextHost_TxGetPasswordChar(texthost, &ed->cPasswordMask);
 
-  if (ed->props & TXTBIT_AUTOWORDSEL)
-    ed->styleFlags |= ECO_AUTOWORDSELECTION;
   if (ed->props & TXTBIT_MULTILINE) {
     ed->styleFlags |= ES_MULTILINE;
     ed->bWordWrap = (ed->props & TXTBIT_WORDWRAP) != 0;
   } else {
     ed->bWordWrap = FALSE;
   }
-  if (!(ed->props & TXTBIT_HIDESELECTION))
-    ed->styleFlags |= ES_NOHIDESEL;
-  if (ed->props & TXTBIT_SAVESELECTION)
-    ed->styleFlags |= ES_SAVESEL;
-  if (ed->props & TXTBIT_VERTICAL)
-    ed->styleFlags |= ES_VERTICAL;
+
   if (ed->props & TXTBIT_DISABLEDRAG)
     ed->styleFlags |= ES_NOOLEDRAGDROP;
 
@@ -3444,7 +3437,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
       editor->bDialogMode = TRUE;
     if (editor->styleFlags & ES_MULTILINE)
       code |= DLGC_WANTMESSAGE;
-    if (!(editor->styleFlags & ES_SAVESEL))
+    if (!(editor->props & TXTBIT_SAVESELECTION))
       code |= DLGC_HASSETSEL;
     return code;
   }
@@ -3492,8 +3485,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
   case EM_GETOPTIONS:
   {
     /* these flags are equivalent to the ES_* counterparts */
-    DWORD mask = ECO_VERTICAL |
-                 ECO_NOHIDESEL | ECO_WANTRETURN | ECO_SELECTIONBAR;
+    DWORD mask = ECO_WANTRETURN | ECO_SELECTIONBAR;
     DWORD settings = editor->styleFlags & mask;
 
     return settings;
@@ -3544,9 +3536,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
     /* these flags are equivalent to ES_* counterparts, except for
      * ECO_AUTOWORDSELECTION that doesn't have an ES_* counterpart,
      * but is still stored in editor->styleFlags. */
-    const DWORD mask = ECO_VERTICAL |
-                       ECO_NOHIDESEL | ECO_WANTRETURN |
-                       ECO_SELECTIONBAR | ECO_AUTOWORDSELECTION;
+    const DWORD mask = ECO_WANTRETURN | ECO_SELECTIONBAR;
     DWORD settings = mask & editor->styleFlags;
     DWORD oldSettings = settings;
     DWORD changedSettings;
@@ -3584,15 +3574,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
         ME_RewrapRepaint(editor);
       }
 
-      if ((changedSettings & settings & ES_NOHIDESEL) && !editor->bHaveFocus)
-          ME_InvalidateSelection( editor );
 
-      if (changedSettings & settings & ECO_VERTICAL)
-        FIXME("ECO_VERTICAL not implemented yet!\n");
-      if (changedSettings & settings & ECO_AUTOHSCROLL)
-        FIXME("ECO_WANTRETURN not implemented yet!\n");
-      if (changedSettings & settings & ECO_AUTOWORDSELECTION)
-        FIXME("ECO_AUTOWORDSELECTION not implemented yet!\n");
     }
 
     return settings;
@@ -4216,7 +4198,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
     create_caret(editor);
     update_caret(editor);
     ME_SendOldNotify(editor, EN_SETFOCUS);
-    if (!editor->bHideSelection && !(editor->styleFlags & ES_NOHIDESEL))
+    if (!editor->bHideSelection && (editor->props & TXTBIT_HIDESELECTION))
         ME_InvalidateSelection( editor );
     return 0;
   case WM_KILLFOCUS:
@@ -4226,7 +4208,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
     hide_caret(editor);
     DestroyCaret();
     ME_SendOldNotify(editor, EN_KILLFOCUS);
-    if (!editor->bHideSelection && !(editor->styleFlags & ES_NOHIDESEL))
+    if (!editor->bHideSelection && (editor->props & TXTBIT_HIDESELECTION))
         ME_InvalidateSelection( editor );
     return 0;
   case WM_COMMAND:
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index e22dc64ebdb..34d0ab8a54f 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -270,8 +270,8 @@ static void draw_space( ME_Context *c, ME_Run *run, int x, int y,
 
     SetRect( &rect, x, ymin, x + run->nWidth, ymin + cy );
 
-    if (c->editor->bHideSelection || (!c->editor->bHaveFocus &&
-                !(c->editor->styleFlags & ES_NOHIDESEL))) selected = FALSE;
+    if (c->editor->bHideSelection || (!c->editor->bHaveFocus && (c->editor->props & TXTBIT_HIDESELECTION)))
+        selected = FALSE;
     if (c->editor->bEmulateVersion10)
     {
         old_style_selected = selected;
@@ -366,7 +366,7 @@ static void draw_text_with_style( ME_Context *c, ME_Run *run, int x, int y,
   int yOffset = 0;
   BOOL selected = (nSelFrom < run->len && nSelTo >= 0
                    && nSelFrom < nSelTo && !c->editor->bHideSelection &&
-                   (c->editor->bHaveFocus || (c->editor->styleFlags & ES_NOHIDESEL)));
+                   (c->editor->bHaveFocus || !(c->editor->props & TXTBIT_HIDESELECTION)));
   BOOL old_style_selected = FALSE;
   RECT sel_rect;
   HRGN clip = NULL, sel_rgn = NULL;
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index 027b079d654..d10b303a137 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -60,7 +60,7 @@ static void host_init_props( struct host *host )
     if (style & WS_VSCROLL) host->scrollbars |= ES_AUTOVSCROLL;
     if ((style & WS_HSCROLL) && !host->emulate_10) host->scrollbars |= ES_AUTOHSCROLL;
 
-    host->props = TXTBIT_RICHTEXT | TXTBIT_AUTOWORDSEL | TXTBIT_ALLOWBEEP;
+    host->props = TXTBIT_RICHTEXT | TXTBIT_ALLOWBEEP;
     if (style & ES_MULTILINE)     host->props |= TXTBIT_MULTILINE;
     if (style & ES_READONLY)      host->props |= TXTBIT_READONLY;
     if (style & ES_PASSWORD)      host->props |= TXTBIT_USEPASSWORD;
@@ -765,9 +765,11 @@ static HRESULT get_text_rangeA( struct host *host, TEXTRANGEA *rangeA, LRESULT *
 static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *res )
 {
     DWORD style, old_options, new_options, change, props_mask = 0;
-    const DWORD mask = ECO_AUTOVSCROLL | ECO_AUTOHSCROLL | ECO_NOHIDESEL | ECO_READONLY | ECO_WANTRETURN |
-        ECO_SELECTIONBAR | ECO_VERTICAL;
-    const DWORD host_mask = ECO_AUTOVSCROLL | ECO_AUTOHSCROLL | ECO_READONLY;
+    DWORD mask = ECO_AUTOWORDSELECTION | ECO_AUTOVSCROLL | ECO_AUTOHSCROLL | ECO_NOHIDESEL | ECO_READONLY |
+        ECO_WANTRETURN | ECO_SAVESEL | ECO_SELECTIONBAR | ECO_VERTICAL;
+    const DWORD host_mask = ECO_AUTOWORDSELECTION | ECO_AUTOVSCROLL | ECO_AUTOHSCROLL | ECO_NOHIDESEL | ECO_READONLY |
+        ECO_SAVESEL | ECO_VERTICAL;
+
     HRESULT hr = S_OK;
 
     new_options = old_options = SendMessageW( host->window, EM_GETOPTIONS, 0, 0 );
@@ -790,6 +792,11 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
 
     change = (new_options ^ old_options);
 
+    if (change & ECO_AUTOWORDSELECTION)
+    {
+        host->props ^= TXTBIT_AUTOWORDSEL;
+        props_mask |= TXTBIT_AUTOWORDSEL;
+    }
     if (change & ECO_AUTOVSCROLL)
     {
         host->scrollbars ^= WS_VSCROLL;
@@ -800,11 +807,26 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
         host->scrollbars ^= WS_HSCROLL;
         props_mask |= TXTBIT_SCROLLBARCHANGE;
     }
+    if (change & ECO_NOHIDESEL)
+    {
+        host->props ^= TXTBIT_HIDESELECTION;
+        props_mask |= TXTBIT_HIDESELECTION;
+    }
     if (change & ECO_READONLY)
     {
         host->props ^= TXTBIT_READONLY;
         props_mask |= TXTBIT_READONLY;
     }
+    if (change & ECO_SAVESEL)
+    {
+        host->props ^= TXTBIT_SAVESELECTION;
+        props_mask |= TXTBIT_SAVESELECTION;
+    }
+    if (change & ECO_VERTICAL)
+    {
+        host->props ^= TXTBIT_VERTICAL;
+        props_mask |= TXTBIT_VERTICAL;
+    }
 
     if (props_mask)
         ITextServices_OnTxPropertyBitsChange( host->text_srv, props_mask, host->props & props_mask );
@@ -813,6 +835,7 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
     hr = ITextServices_TxSendMessage( host->text_srv, EM_SETOPTIONS, op, value, res );
     *res = (*res & ~host_mask) | (new_options & host_mask);
 
+    mask &= ~ECO_AUTOWORDSELECTION; /* doesn't correspond to a window style */
     style = GetWindowLongW( host->window, GWL_STYLE );
     style = (style & ~mask) | (*res & mask);
     SetWindowLongW( host->window, GWL_STYLE, style );
@@ -926,6 +949,10 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
     case EM_GETOPTIONS:
         hr = ITextServices_TxSendMessage( host->text_srv, EM_GETOPTIONS, 0, 0, &res );
         if (host->props & TXTBIT_READONLY) res |= ECO_READONLY;
+        if (!(host->props & TXTBIT_HIDESELECTION)) res |= ECO_NOHIDESEL;
+        if (host->props & TXTBIT_SAVESELECTION) res |= ECO_SAVESEL;
+        if (host->props & TXTBIT_AUTOWORDSEL) res |= ECO_AUTOWORDSELECTION;
+        if (host->props & TXTBIT_VERTICAL) res |= ECO_VERTICAL;
         if (host->scrollbars & ES_AUTOHSCROLL) res |= ECO_AUTOHSCROLL;
         if (host->scrollbars & ES_AUTOVSCROLL) res |= ECO_AUTOVSCROLL;
         break;
diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c
index c017f5bae16..8fb6416d38b 100644
--- a/dlls/riched20/txtsrv.c
+++ b/dlls/riched20/txtsrv.c
@@ -347,6 +347,8 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_OnTxPropertyBitsChange( ITextServic
         }
     }
 
+    if ((mask & TXTBIT_HIDESELECTION) && !services->editor->bHaveFocus) ME_InvalidateSelection( services->editor );
+
     return S_OK;
 }
 
-- 
2.23.0




More information about the wine-devel mailing list