Huw Davies : riched20: Handle ES_SELECTIONBAR in the host.

Alexandre Julliard julliard at winehq.org
Wed Mar 17 16:23:14 CDT 2021


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

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Mar 17 08:45:26 2021 +0000

riched20: Handle ES_SELECTIONBAR 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  | 70 ++++---------------------------------------------
 dlls/riched20/editstr.h |  1 -
 dlls/riched20/txthost.c | 22 ++++++++--------
 dlls/riched20/txtsrv.c  | 18 +++++++++++++
 4 files changed, 34 insertions(+), 77 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index df4cbcb4129..17b7d427d83 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2979,6 +2979,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
   ME_TextEditor *ed = heap_alloc(sizeof(*ed));
   int i;
   LONG selbarwidth;
+  HRESULT hr;
 
   ed->hWnd = NULL;
   ed->hwndParent = NULL;
@@ -2986,7 +2987,6 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
   ed->texthost = texthost;
   ed->reOle = NULL;
   ed->bEmulateVersion10 = bEmulateVersion10;
-  ed->styleFlags = 0;
   ed->exStyleFlags = 0;
   ed->total_rows = 0;
   ITextHost_TxGetPropertyBits( texthost, TXTBIT_RICHTEXT | TXTBIT_MULTILINE | TXTBIT_READONLY |
@@ -3047,14 +3047,10 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
   ME_CheckCharOffsets(ed);
   SetRectEmpty(&ed->rcFormat);
   ed->bDefaultFormatRect = TRUE;
-  ITextHost_TxGetSelectionBarWidth(ed->texthost, &selbarwidth);
-  if (selbarwidth) {
-    /* FIXME: Convert selbarwidth from HIMETRIC to pixels */
-    ed->selofs = SELECTIONBAR_WIDTH;
-    ed->styleFlags |= ES_SELECTIONBAR;
-  } else {
-    ed->selofs = 0;
-  }
+  hr = ITextHost_TxGetSelectionBarWidth( ed->texthost, &selbarwidth );
+  /* FIXME: Convert selbarwidth from HIMETRIC to pixels */
+  if (hr == S_OK && selbarwidth) ed->selofs = SELECTIONBAR_WIDTH;
+  else ed->selofs = 0;
   ed->nSelectionType = stPosition;
 
   ed->cPasswordMask = 0;
@@ -3405,14 +3401,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
     return ME_Undo(editor);
   case EM_REDO:
     return ME_Redo(editor);
-  case EM_GETOPTIONS:
-  {
-    /* these flags are equivalent to the ES_* counterparts */
-    DWORD mask = ECO_SELECTIONBAR;
-    DWORD settings = editor->styleFlags & mask;
-
-    return settings;
-  }
   case EM_SETFONTSIZE:
   {
       CHARFORMAT2W cf;
@@ -3454,54 +3442,6 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam,
 
       return TRUE;
   }
-  case EM_SETOPTIONS:
-  {
-    /* 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_SELECTIONBAR;
-    DWORD settings = mask & editor->styleFlags;
-    DWORD oldSettings = settings;
-    DWORD changedSettings;
-
-    switch(wParam)
-    {
-      case ECOOP_SET:
-        settings = lParam;
-        break;
-      case ECOOP_OR:
-        settings |= lParam;
-        break;
-      case ECOOP_AND:
-        settings &= lParam;
-        break;
-      case ECOOP_XOR:
-        settings ^= lParam;
-    }
-    changedSettings = oldSettings ^ settings;
-
-    if (changedSettings) {
-      editor->styleFlags = (editor->styleFlags & ~mask) | (settings & mask);
-
-      if (changedSettings & ECO_SELECTIONBAR)
-      {
-        ITextHost_TxInvalidateRect(editor->texthost, &editor->rcFormat, TRUE);
-        if (settings & ECO_SELECTIONBAR) {
-          assert(!editor->selofs);
-          editor->selofs = SELECTIONBAR_WIDTH;
-          editor->rcFormat.left += editor->selofs;
-        } else {
-          editor->rcFormat.left -= editor->selofs;
-          editor->selofs = 0;
-        }
-        ME_RewrapRepaint(editor);
-      }
-
-
-    }
-
-    return settings;
-  }
   case EM_SETSEL:
   {
     return set_selection( editor, wParam, lParam );
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h
index 1fbf70ee6b2..a3e5970bff8 100644
--- a/dlls/riched20/editstr.h
+++ b/dlls/riched20/editstr.h
@@ -383,7 +383,6 @@ typedef struct tagME_TextEditor
   BOOL bEmulateVersion10;
   ME_TextBuffer *pBuffer;
   ME_Cursor *pCursors;
-  DWORD styleFlags;
   DWORD exStyleFlags;
   DWORD props;
   DWORD scrollbars;
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index 9ae54a2a5f2..3ba522331b0 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -42,6 +42,7 @@ struct host
     unsigned int emulate_10 : 1;
     unsigned int dialog_mode : 1;
     unsigned int want_return : 1;
+    unsigned int sel_bar : 1;
     PARAFORMAT2 para_fmt;
     DWORD props, scrollbars, event_mask;
 };
@@ -73,6 +74,7 @@ static void host_init_props( struct host *host )
 
     if (!(host->scrollbars & ES_AUTOHSCROLL)) host->props |= TXTBIT_WORDWRAP;
 
+    host->sel_bar     = !!(style & ES_SELECTIONBAR);
     host->want_return = !!(style & ES_WANTRETURN);
 }
 
@@ -471,8 +473,7 @@ DECLSPEC_HIDDEN HRESULT __thiscall ITextHostImpl_TxGetSelectionBarWidth( ITextHo
 {
     struct host *host = impl_from_ITextHost( iface );
 
-    DWORD style = host->editor ? host->editor->styleFlags : GetWindowLongW( host->window, GWL_STYLE );
-    *width = (style & ES_SELECTIONBAR) ? 225 : 0; /* in HIMETRIC */
+    *width = host->sel_bar ? 225 : 0; /* in HIMETRIC */
     return S_OK;
 }
 
@@ -773,10 +774,6 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
     DWORD style, old_options, new_options, change, props_mask = 0;
     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_WANTRETURN | ECO_SAVESEL | ECO_VERTICAL;
-
-    HRESULT hr = S_OK;
 
     new_options = old_options = SendMessageW( host->window, EM_GETOPTIONS, 0, 0 );
 
@@ -828,6 +825,11 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
         host->props ^= TXTBIT_SAVESELECTION;
         props_mask |= TXTBIT_SAVESELECTION;
     }
+    if (change & ECO_SELECTIONBAR)
+    {
+        host->sel_bar ^= 1;
+        props_mask |= TXTBIT_SELBARCHANGE;
+    }
     if (change & ECO_VERTICAL)
     {
         host->props ^= TXTBIT_VERTICAL;
@@ -838,15 +840,13 @@ static HRESULT set_options( struct host *host, DWORD op, DWORD value, LRESULT *r
     if (props_mask)
         ITextServices_OnTxPropertyBitsChange( host->text_srv, props_mask, host->props & props_mask );
 
-    /* Handle the rest in the editor for now */
-    hr = ITextServices_TxSendMessage( host->text_srv, EM_SETOPTIONS, op, value, res );
-    *res = (*res & ~host_mask) | (new_options & host_mask);
+    *res = new_options;
 
     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 );
-    return hr;
+    return S_OK;
 }
 
 /* handle dialog mode VK_RETURN. Returns TRUE if message has been processed */
@@ -1017,7 +1017,6 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
         break;
     }
     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;
@@ -1026,6 +1025,7 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
         if (host->scrollbars & ES_AUTOHSCROLL) res |= ECO_AUTOHSCROLL;
         if (host->scrollbars & ES_AUTOVSCROLL) res |= ECO_AUTOVSCROLL;
         if (host->want_return) res |= ECO_WANTRETURN;
+        if (host->sel_bar) res |= ECO_SELECTIONBAR;
         break;
 
     case WM_GETTEXT:
diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c
index 8fb6416d38b..df62a2dd7c5 100644
--- a/dlls/riched20/txtsrv.c
+++ b/dlls/riched20/txtsrv.c
@@ -327,6 +327,7 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_OnTxPropertyBitsChange( ITextServic
     struct text_services *services = impl_from_ITextServices( iface );
     DWORD scrollbars;
     HRESULT hr;
+    BOOL repaint = FALSE;
 
     TRACE( "%p, mask %08x, bits %08x\n", services, mask, bits );
 
@@ -349,6 +350,23 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_OnTxPropertyBitsChange( ITextServic
 
     if ((mask & TXTBIT_HIDESELECTION) && !services->editor->bHaveFocus) ME_InvalidateSelection( services->editor );
 
+    if (mask & TXTBIT_SELBARCHANGE)
+    {
+        LONG width;
+
+        hr = ITextHost_TxGetSelectionBarWidth( services->host, &width );
+        if (hr == S_OK)
+        {
+            ITextHost_TxInvalidateRect( services->host, &services->editor->rcFormat, TRUE );
+            services->editor->rcFormat.left -= services->editor->selofs;
+            services->editor->selofs = width ? SELECTIONBAR_WIDTH : 0; /* FIXME: convert from HIMETRIC */
+            services->editor->rcFormat.left += services->editor->selofs;
+            repaint = TRUE;
+        }
+    }
+
+    if (repaint) ME_RewrapRepaint( services->editor );
+
     return S_OK;
 }
 




More information about the wine-cvs mailing list