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