Module: wine Branch: master Commit: 5868c664c1ac56bc6e3a6a531172d6bdae51b9dc URL: https://source.winehq.org/git/wine.git/?a=commit;h=5868c664c1ac56bc6e3a6a531...
Author: Sergio Gómez Del Real sdelreal@codeweavers.com Date: Wed Apr 3 08:23:04 2019 -0500
riched20: Handle efficiently caret creation/destruction.
Signed-off-by: Sergio Gómez Del Real sdelreal@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/riched20/caret.c | 55 ++++++++++++++++++++++++++++--------------------- dlls/riched20/editor.c | 18 +++++++++------- dlls/riched20/editor.h | 7 ++++--- dlls/riched20/editstr.h | 2 ++ dlls/riched20/paint.c | 1 - dlls/riched20/table.c | 3 +-- 6 files changed, 49 insertions(+), 37 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c index ad72511..0951bb9 100644 --- a/dlls/riched20/caret.c +++ b/dlls/riched20/caret.c @@ -266,36 +266,47 @@ void ME_GetCursorCoordinates(ME_TextEditor *editor, ME_Cursor *pCursor, return; }
- -void -ME_MoveCaret(ME_TextEditor *editor) +void create_caret(ME_TextEditor *editor) { int x, y, height;
ME_GetCursorCoordinates(editor, &editor->pCursors[0], &x, &y, &height); - if(editor->bHaveFocus && !ME_IsSelection(editor)) - { - x = min(x, editor->rcFormat.right-1); - ITextHost_TxCreateCaret(editor->texthost, NULL, 0, height); - ITextHost_TxSetCaretPos(editor->texthost, x, y); - } + ITextHost_TxCreateCaret(editor->texthost, NULL, 0, height); + editor->caret_height = height; + editor->caret_hidden = TRUE; }
+void show_caret(ME_TextEditor *editor) +{ + ITextHost_TxShowCaret(editor->texthost, TRUE); + editor->caret_hidden = FALSE; +}
-void ME_ShowCaret(ME_TextEditor *ed) +void hide_caret(ME_TextEditor *editor) { - ME_MoveCaret(ed); - if(ed->bHaveFocus && !ME_IsSelection(ed)) - ITextHost_TxShowCaret(ed->texthost, TRUE); + /* calls to HideCaret are cumulative; do so only once */ + if (!editor->caret_hidden) + { + ITextHost_TxShowCaret(editor->texthost, FALSE); + editor->caret_hidden = TRUE; + } }
-void ME_HideCaret(ME_TextEditor *ed) +void update_caret(ME_TextEditor *editor) { - if(!ed->bHaveFocus || ME_IsSelection(ed)) + int x, y, height; + + if (!editor->bHaveFocus) return; + if (!ME_IsSelection(editor)) { - ITextHost_TxShowCaret(ed->texthost, FALSE); - DestroyCaret(); + ME_GetCursorCoordinates(editor, &editor->pCursors[0], &x, &y, &height); + if (height != editor->caret_height) create_caret(editor); + x = min(x, editor->rcFormat.right-1); + ITextHost_TxSetCaretPos(editor->texthost, x, y); + show_caret(editor); } + else + hide_caret(editor); }
BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start, @@ -1200,8 +1211,7 @@ void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum) } } ME_InvalidateSelection(editor); - ITextHost_TxShowCaret(editor->texthost, FALSE); - ME_ShowCaret(editor); + update_caret(editor); ME_SendSelChange(editor); }
@@ -1233,8 +1243,7 @@ void ME_MouseMove(ME_TextEditor *editor, int x, int y) }
ME_InvalidateSelection(editor); - ITextHost_TxShowCaret(editor->texthost, FALSE); - ME_ShowCaret(editor); + update_caret(editor); ME_SendSelChange(editor); }
@@ -1627,9 +1636,9 @@ ME_ArrowKey(ME_TextEditor *editor, int nVKey, BOOL extend, BOOL ctrl)
ME_InvalidateSelection(editor); ME_Repaint(editor); - ITextHost_TxShowCaret(editor->texthost, FALSE); + hide_caret(editor); ME_EnsureVisible(editor, &tmp_curs); - ME_ShowCaret(editor); + update_caret(editor); ME_SendSelChange(editor); return success; } diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index b7254d2..b826a2c 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -1802,9 +1802,7 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre if (!(format & SFF_SELECTION)) { ME_ClearTempStyle(editor); } - ITextHost_TxShowCaret(editor->texthost, FALSE); - ME_MoveCaret(editor); - ITextHost_TxShowCaret(editor->texthost, TRUE); + update_caret(editor); ME_SendSelChange(editor); ME_SendRequestResize(editor, FALSE);
@@ -2158,8 +2156,7 @@ static int handle_EM_EXSETSEL( ME_TextEditor *editor, int to, int from ) ME_InvalidateSelection( editor ); end = ME_SetSelection( editor, to, from ); ME_InvalidateSelection( editor ); - ITextHost_TxShowCaret( editor->texthost, FALSE ); - ME_ShowCaret( editor ); + update_caret( editor ); ME_SendSelChange( editor );
return end; @@ -3118,6 +3115,8 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10) ed->bHaveFocus = FALSE; ed->bDialogMode = FALSE; ed->bMouseCaptured = FALSE; + ed->caret_hidden = FALSE; + ed->caret_height = 0; for (i=0; i<HFONT_CACHE_SIZE; i++) { ed->pFontCache[i].nRefs = 0; @@ -3529,7 +3528,7 @@ static LRESULT ME_WmCreate(ME_TextEditor *editor, LPARAM lParam, BOOL unicode)
ME_CommitUndo(editor); ME_WrapMarkedParagraphs(editor); - ME_MoveCaret(editor); + update_caret(editor); return 0; }
@@ -4511,7 +4510,8 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, break; case WM_SETFOCUS: editor->bHaveFocus = TRUE; - ME_ShowCaret(editor); + create_caret(editor); + update_caret(editor); ME_SendOldNotify(editor, EN_SETFOCUS); if (!editor->bHideSelection && !(editor->styleFlags & ES_NOHIDESEL)) ME_InvalidateSelection( editor ); @@ -4520,7 +4520,8 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, ME_CommitUndo(editor); /* End coalesced undos for typed characters */ editor->bHaveFocus = FALSE; editor->wheel_remain = 0; - ME_HideCaret(editor); + hide_caret(editor); + DestroyCaret(); ME_SendOldNotify(editor, EN_KILLFOCUS); if (!editor->bHideSelection && !(editor->styleFlags & ES_NOHIDESEL)) ME_InvalidateSelection( editor ); @@ -4978,6 +4979,7 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam, RECT rc; PAINTSTRUCT ps;
+ update_caret(editor); hDC = BeginPaint(editor->hWnd, &ps); if (!editor->bEmulateVersion10 || (editor->nEventMask & ENM_UPDATE)) ME_SendOldNotify(editor, EN_UPDATE); diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 2633fa8..2e08eee 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -152,9 +152,10 @@ void ME_SetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *mod) DECLSPEC_ void ME_SetCursorToStart(ME_TextEditor *editor, ME_Cursor *cursor) DECLSPEC_HIDDEN; int ME_SetSelection(ME_TextEditor *editor, int from, int to) DECLSPEC_HIDDEN; BOOL ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs) DECLSPEC_HIDDEN; -void ME_HideCaret(ME_TextEditor *ed) DECLSPEC_HIDDEN; -void ME_ShowCaret(ME_TextEditor *ed) DECLSPEC_HIDDEN; -void ME_MoveCaret(ME_TextEditor *ed) DECLSPEC_HIDDEN; +void hide_caret(ME_TextEditor *ed) DECLSPEC_HIDDEN; +void show_caret(ME_TextEditor *ed) DECLSPEC_HIDDEN; +void update_caret(ME_TextEditor *ed) DECLSPEC_HIDDEN; +void create_caret(ME_TextEditor *ed) DECLSPEC_HIDDEN; BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y, ME_Cursor *cursor, BOOL *isExact) DECLSPEC_HIDDEN; void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum) DECLSPEC_HIDDEN; void ME_MouseMove(ME_TextEditor *editor, int x, int y) DECLSPEC_HIDDEN; diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index 28be524..87cd71c 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -442,6 +442,8 @@ typedef struct tagME_TextEditor /* Cache previously set scrollbar info */ SCROLLINFO vert_si, horz_si;
+ int caret_height; + BOOL caret_hidden; BOOL bMouseCaptured; int wheel_remain; struct list style_list; diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c index e2ccef4..675e0f7 100644 --- a/dlls/riched20/paint.c +++ b/dlls/riched20/paint.c @@ -43,7 +43,6 @@ void ME_PaintContent(ME_TextEditor *editor, HDC hDC, const RECT *rcUpdate)
ME_InitContext(&c, editor, hDC); SetBkMode(hDC, TRANSPARENT); - ME_MoveCaret(editor); item = editor->pBuffer->pFirst->next; /* This context point is an offset for the paragraph positions stored * during wrapping. It shouldn't be modified during painting. */ diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c index 7e8d7ff..1b4b914 100644 --- a/dlls/riched20/table.c +++ b/dlls/riched20/table.c @@ -613,8 +613,7 @@ void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow) } ME_InvalidateSelection(editor); ME_Repaint(editor); - ITextHost_TxShowCaret(editor->texthost, FALSE); - ME_ShowCaret(editor); + update_caret(editor); ME_SendSelChange(editor); }