[PATCH 2/5] riched20: Handle EM_SETPASSWORDCHAR in the host.

Huw Davies huw at codeweavers.com
Thu Mar 18 03:30:07 CDT 2021


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/riched20/editor.c  | 16 +++-------------
 dlls/riched20/editstr.h |  2 +-
 dlls/riched20/paint.c   |  4 ++--
 dlls/riched20/run.c     | 12 ++++++------
 dlls/riched20/txthost.c | 20 ++++++++++++++++++--
 dlls/riched20/txtsrv.c  |  7 +++++++
 dlls/riched20/wrap.c    |  2 +-
 7 files changed, 38 insertions(+), 25 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 3073294bd7b..f7d383c2f10 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2375,7 +2375,7 @@ static BOOL copy_or_cut( ME_TextEditor *editor, BOOL cut )
     int start_cursor = ME_GetSelectionOfs( editor, &offs, &count );
     ME_Cursor *sel_start = &editor->pCursors[start_cursor];
 
-    if (editor->cPasswordMask) return FALSE;
+    if (editor->password_char) return FALSE;
 
     count -= offs;
     hr = editor_copy_or_cut( editor, cut, sel_start, count, NULL );
@@ -3041,9 +3041,9 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
   else ed->selofs = 0;
   ed->nSelectionType = stPosition;
 
-  ed->cPasswordMask = 0;
+  ed->password_char = 0;
   if (ed->props & TXTBIT_USEPASSWORD)
-    ITextHost_TxGetPasswordChar(texthost, &ed->cPasswordMask);
+    ITextHost_TxGetPasswordChar( texthost, &ed->password_char );
 
   ed->bWordWrap = (ed->props & TXTBIT_WORDWRAP) && (ed->props & TXTBIT_MULTILINE);
 
@@ -4217,10 +4217,6 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
       return 1;
     return 0;
   }
-  case EM_GETPASSWORDCHAR:
-  {
-    return editor->cPasswordMask;
-  }
   case EM_SETOLECALLBACK:
     if(editor->lpOleCallback)
       IRichEditOleCallback_Release(editor->lpOleCallback);
@@ -4274,12 +4270,6 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
     editor->mode = (editor->mode & ~mask) | changes;
     return 0;
   }
-  case EM_SETPASSWORDCHAR:
-  {
-    editor->cPasswordMask = wParam;
-    ME_RewrapRepaint(editor);
-    return 0;
-  }
   case EM_SETTARGETDEVICE:
     if (wParam == 0)
     {
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h
index 0273fde4350..df07923548d 100644
--- a/dlls/riched20/editstr.h
+++ b/dlls/riched20/editstr.h
@@ -416,7 +416,7 @@ typedef struct tagME_TextEditor
   int mode;
   BOOL bHideSelection;
   BOOL AutoURLDetect_bEnable;
-  WCHAR cPasswordMask;
+  WCHAR password_char;
   BOOL bHaveFocus;
   /*for IME */
   int imeStartIndex;
diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c
index 8ef5ada5855..607ced52089 100644
--- a/dlls/riched20/paint.c
+++ b/dlls/riched20/paint.c
@@ -333,9 +333,9 @@ static void draw_text( ME_Context *c, ME_Run *run, int x, int y, BOOL selected,
             && !(CFE_AUTOBACKCOLOR & run->style->fmt.dwEffects) )
         );
 
-    if (c->editor->cPasswordMask)
+    if (c->editor->password_char)
     {
-        masked = ME_MakeStringR( c->editor->cPasswordMask, run->len );
+        masked = ME_MakeStringR( c->editor->password_char, run->len );
         text = masked->szData;
     }
 
diff --git a/dlls/riched20/run.c b/dlls/riched20/run.c
index e099c0be6dc..bc282b20a57 100644
--- a/dlls/riched20/run.c
+++ b/dlls/riched20/run.c
@@ -543,9 +543,9 @@ int ME_CharFromPointContext(ME_Context *c, int cx, ME_Run *run, BOOL closest, BO
       return closest ? cp + trailing : cp;
   }
 
-  if (c->editor->cPasswordMask)
+  if (c->editor->password_char)
   {
-    mask_text = ME_MakeStringR( c->editor->cPasswordMask, run->len );
+    mask_text = ME_MakeStringR( c->editor->password_char, run->len );
     str = mask_text->szData;
   }
   else
@@ -626,9 +626,9 @@ int ME_PointFromCharContext(ME_Context *c, ME_Run *pRun, int nOffset, BOOL visua
       if (visual_order && pRun->script_analysis.fRTL) x = pRun->nWidth - x - 1;
       return x;
   }
-  if (c->editor->cPasswordMask)
+  if (c->editor->password_char)
   {
-    mask_text = ME_MakeStringR(c->editor->cPasswordMask, pRun->len);
+    mask_text = ME_MakeStringR( c->editor->password_char, pRun->len );
     str = mask_text->szData;
   }
   else
@@ -678,9 +678,9 @@ SIZE ME_GetRunSizeCommon(ME_Context *c, const ME_Paragraph *para, ME_Run *run, i
   {
       size.cx = run->nWidth;
   }
-  else if (c->editor->cPasswordMask)
+  else if (c->editor->password_char)
   {
-    ME_String *szMasked = ME_MakeStringR(c->editor->cPasswordMask,nLen);
+    ME_String *szMasked = ME_MakeStringR( c->editor->password_char, nLen );
     ME_GetTextExtent(c, szMasked->szData, nLen,run->style, &size); 
     ME_DestroyString(szMasked);
   }
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index ebccddf65e3..beb2e423089 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -50,6 +50,7 @@ struct host
     DWORD props, scrollbars, event_mask;
     RECT client_rect, set_rect;
     COLORREF back_colour;
+    WCHAR password_char;
 };
 
 static const ITextHostVtbl textHostVtbl;
@@ -114,6 +115,7 @@ struct host *host_create( HWND hwnd, CREATESTRUCTW *cs, BOOL emulate_10 )
     SetRectEmpty( &texthost->set_rect );
     GetClientRect( hwnd, &texthost->client_rect );
     texthost->use_back_colour = 0;
+    texthost->password_char = (texthost->props & TXTBIT_USEPASSWORD) ? '*' : 0;
 
     return texthost;
 }
@@ -381,8 +383,10 @@ DECLSPEC_HIDDEN HRESULT __thiscall ITextHostImpl_TxGetScrollBars( ITextHost *ifa
 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetPasswordChar,8)
 DECLSPEC_HIDDEN HRESULT __thiscall ITextHostImpl_TxGetPasswordChar( ITextHost *iface, WCHAR *c )
 {
-    *c = '*';
-    return S_OK;
+    struct host *host = impl_from_ITextHost( iface );
+
+    *c = host->password_char;
+    return *c ? S_OK : S_FALSE;
 }
 
 DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetAcceleratorPos,8)
@@ -1058,6 +1062,10 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
         else hr = get_lineA( host->text_srv, wparam, lparam, &res );
         break;
 
+    case EM_GETPASSWORDCHAR:
+        ITextHost_TxGetPasswordChar( &host->ITextHost_iface, (WCHAR *)&res );
+        break;
+
     case EM_GETRECT:
         hr = ITextHost_TxGetClientRect( &host->ITextHost_iface, (RECT *)lparam );
         break;
@@ -1208,6 +1216,14 @@ static LRESULT RichEditWndProc_common( HWND hwnd, UINT msg, WPARAM wparam,
         hr = set_options( host, wparam, lparam, &res );
         break;
 
+    case EM_SETPASSWORDCHAR:
+        if (wparam == host->password_char) break;
+        host->password_char = wparam;
+        if (wparam) host->props |= TXTBIT_USEPASSWORD;
+        else host->props &= ~TXTBIT_USEPASSWORD;
+        ITextServices_OnTxPropertyBitsChange( host->text_srv, TXTBIT_USEPASSWORD, host->props & TXTBIT_USEPASSWORD );
+        break;
+
     case EM_SETREADONLY:
     {
         DWORD op = wparam ? ECOOP_OR : ECOOP_AND;
diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c
index 9cf1908b4de..e86a8936531 100644
--- a/dlls/riched20/txtsrv.c
+++ b/dlls/riched20/txtsrv.c
@@ -390,6 +390,13 @@ DECLSPEC_HIDDEN HRESULT __thiscall fnTextSrv_OnTxPropertyBitsChange( ITextServic
         if (SUCCEEDED( hr )) repaint = TRUE;
     }
 
+    if (mask & TXTBIT_USEPASSWORD)
+    {
+        if (bits & TXTBIT_USEPASSWORD) ITextHost_TxGetPasswordChar( services->host, &services->editor->password_char );
+        else services->editor->password_char = 0;
+        repaint = TRUE;
+    }
+
     if (repaint) ME_RewrapRepaint( services->editor );
 
     return S_OK;
diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c
index 0ca70b8a8ad..dcda041d773 100644
--- a/dlls/riched20/wrap.c
+++ b/dlls/riched20/wrap.c
@@ -829,7 +829,7 @@ static void ME_WrapTextParagraph( ME_TextEditor *editor, ME_Context *c, ME_Parag
   para_num_init( c, para );
 
   /* For now treating all non-password text as complex for better testing */
-  if (!c->editor->cPasswordMask /* &&
+  if (!c->editor->password_char /* &&
       ScriptIsComplex( tp->member.para.text->szData, tp->member.para.text->nLen, SIC_COMPLEX ) == S_OK */)
   {
       if (SUCCEEDED( itemize_para( c, para ) ))
-- 
2.23.0




More information about the wine-devel mailing list