riched20: Handle EM_SETPASSWORDCHAR in the host.

Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Huw Davies 2021-03-18 08:30:07 +00:00 committed by Alexandre Julliard
parent b927bc8d99
commit 06fb9c7f4c
7 changed files with 38 additions and 25 deletions

View file

@ -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)
{

View file

@ -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;

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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;

View file

@ -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;

View file

@ -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 ) ))