[PATCH 5/5] riched20: Remove the caret at end hack.
Huw Davies
huw at codeweavers.com
Fri Oct 23 04:25:06 CDT 2020
The end of one run already has a different cursor
to the beginning of the next run.
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/riched20/caret.c | 111 ++++++++--------------------------------
dlls/riched20/editor.c | 1 -
dlls/riched20/editstr.h | 1 -
dlls/riched20/table.c | 5 +-
4 files changed, 21 insertions(+), 97 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index bb462b034b7..4da6898bef8 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -238,16 +238,6 @@ void ME_GetCursorCoordinates(ME_TextEditor *editor, ME_Cursor *pCursor,
if (!pCursor->nOffset && (prev = run_prev( run ))) size_run = prev;
- if (editor->bCaretAtEnd && !pCursor->nOffset &&
- run == &ME_FindItemFwd( row, diRun )->member.run)
- {
- ME_DisplayItem *tmp = ME_FindItemBack(row, diRunOrParagraph);
- if (tmp->type == diRun)
- {
- row = ME_FindItemBack(tmp, diStartRow);
- size_run = run = &tmp->member.run;
- }
- }
run_x = ME_PointFromCharContext( &c, run, pCursor->nOffset, TRUE );
*height = size_run->nAscent + size_run->nDescent;
@@ -484,7 +474,6 @@ void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCur
ME_DeleteSelection(editor);
run = run_insert( editor, cursor, style, &space, 1, MERF_GRAPHICS );
- editor->bCaretAtEnd = FALSE;
run->reobj = create_re_object( reo );
@@ -517,7 +506,6 @@ void ME_InsertEndRowFromCursor(ME_TextEditor *editor, int nCursor)
ME_DeleteSelection(editor);
run_insert( editor, cursor, style, &space, 1, MERF_ENDROW );
- editor->bCaretAtEnd = FALSE;
ME_ReleaseStyle( style );
}
@@ -538,7 +526,6 @@ void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor,
/* text operations set modified state */
editor->nModifyStep = 1;
- editor->bCaretAtEnd = FALSE;
assert(style);
@@ -877,7 +864,7 @@ int ME_GetCursorOfs(const ME_Cursor *cursor)
+ cursor->pRun->member.run.nCharOfs + cursor->nOffset;
}
-/* Helper function for ME_FindPixelPos to find paragraph within tables */
+/* Helper function for cursor_from_virtual_coords() to find paragraph within tables */
static ME_Paragraph *pixel_pos_in_table_row( int x, int y, ME_Paragraph *para )
{
ME_Cell *cell, *next_cell;
@@ -916,8 +903,9 @@ static ME_Paragraph *pixel_pos_in_table_row( int x, int y, ME_Paragraph *para )
return para;
}
-static BOOL ME_FindRunInRow(ME_TextEditor *editor, ME_DisplayItem *pRow,
- int x, ME_Cursor *cursor, BOOL *pbCaretAtEnd)
+
+static BOOL cursor_from_row( ME_TextEditor *editor, ME_DisplayItem *pRow,
+ int x, ME_Cursor *cursor )
{
ME_DisplayItem *pNext, *pLastRun;
ME_Row *row = &pRow->member.row;
@@ -930,7 +918,6 @@ static BOOL ME_FindRunInRow(ME_TextEditor *editor, ME_DisplayItem *pRow,
}
pNext = ME_FindItemFwd(pRow, diRunOrStartRow);
assert(pNext->type == diRun);
- if (pbCaretAtEnd) *pbCaretAtEnd = FALSE;
cursor->nOffset = 0;
do {
int run_x = pNext->member.run.pt.x;
@@ -947,14 +934,7 @@ static BOOL ME_FindRunInRow(ME_TextEditor *editor, ME_DisplayItem *pRow,
pNext = ME_FindItemFwd(pNext, diRunOrStartRow);
} while(pNext && pNext->type == diRun);
- if ((pLastRun->member.run.nFlags & MERF_ENDPARA) == 0)
- {
- cursor->pRun = ME_FindItemFwd(pNext, diRun);
- if (pbCaretAtEnd) *pbCaretAtEnd = TRUE;
- }
- else
- cursor->pRun = pLastRun;
-
+ cursor->pRun = pLastRun;
cursor->pPara = ME_GetParagraph( cursor->pRun );
return FALSE;
}
@@ -969,8 +949,8 @@ static BOOL ME_FindRunInRow(ME_TextEditor *editor, ME_DisplayItem *pRow,
* returns TRUE if the result was exactly under the cursor, otherwise returns
* FALSE, and result is set to the closest position to the coordinates.
*/
-static BOOL ME_FindPixelPos(ME_TextEditor *editor, int x, int y,
- ME_Cursor *result, BOOL *is_eol, BOOL final_eop)
+static BOOL cursor_from_virtual_coords( ME_TextEditor *editor, int x, int y,
+ ME_Cursor *result, BOOL final_eop )
{
ME_Paragraph *para = editor_first_para( editor );
ME_DisplayItem *row = NULL;
@@ -979,9 +959,6 @@ static BOOL ME_FindPixelPos(ME_TextEditor *editor, int x, int y,
x -= editor->rcFormat.left;
y -= editor->rcFormat.top;
- if (is_eol)
- *is_eol = FALSE;
-
/* find paragraph */
for (; para_next( para ); para = para_next( para ))
{
@@ -1018,7 +995,8 @@ static BOOL ME_FindPixelPos(ME_TextEditor *editor, int x, int y,
row = ME_FindItemBack( para_get_di( para ), diStartRow);
}
- if (row) return ME_FindRunInRow( editor, row, x, result, is_eol ) && isExact;
+
+ if (row) return cursor_from_row( editor, row, x, result ) && isExact;
ME_SetCursorToEnd(editor, result, TRUE);
return FALSE;
@@ -1048,7 +1026,7 @@ BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y,
}
x += editor->horz_si.nPos;
y += editor->vert_si.nPos;
- bResult = ME_FindPixelPos(editor, x, y, cursor, NULL, FALSE);
+ bResult = cursor_from_virtual_coords( editor, x, y, cursor, FALSE );
if (isExact) *isExact = bResult;
return TRUE;
}
@@ -1131,7 +1109,7 @@ void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum)
is_selection = ME_IsSelection(editor);
is_shift = GetKeyState(VK_SHIFT) < 0;
- ME_FindPixelPos(editor, x, y, &editor->pCursors[0], &editor->bCaretAtEnd, FALSE);
+ cursor_from_virtual_coords( editor, x, y, &editor->pCursors[0], FALSE );
if (x >= editor->rcFormat.left || is_shift)
{
@@ -1189,8 +1167,8 @@ void ME_MouseMove(ME_TextEditor *editor, int x, int y)
y += editor->vert_si.nPos;
tmp_cursor = editor->pCursors[0];
- /* FIXME: do something with the return value of ME_FindPixelPos */
- ME_FindPixelPos(editor, x, y, &tmp_cursor, &editor->bCaretAtEnd, TRUE);
+ /* FIXME: do something with the return value of cursor_from_virtual_coords */
+ cursor_from_virtual_coords( editor, x, y, &tmp_cursor, TRUE );
ME_InvalidateSelection(editor);
editor->pCursors[0] = tmp_cursor;
@@ -1220,17 +1198,8 @@ static int ME_GetXForArrow(ME_TextEditor *editor, ME_Cursor *pCursor)
x = editor->nUDArrowX;
else
{
- if (editor->bCaretAtEnd)
- {
- run = run_prev_all_paras( run );
- assert( run );
- x = run->pt.x + run->nWidth;
- }
- else
- {
- x = run->pt.x;
- x += ME_PointFromChar( editor, run, pCursor->nOffset, TRUE );
- }
+ x = run->pt.x;
+ x += ME_PointFromChar( editor, run, pCursor->nOffset, TRUE );
editor->nUDArrowX = x;
}
return x;
@@ -1245,14 +1214,6 @@ ME_MoveCursorLines(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs, BOOL
ME_DisplayItem *pItem;
int x = ME_GetXForArrow(editor, pCursor);
- if (editor->bCaretAtEnd && !pCursor->nOffset)
- {
- ME_Run *prev = run_prev_all_paras( &pRun->member.run );
- if (!prev) return;
- pRun = run_get_di( prev );
- old_para = prev->para;
- }
-
if (nRelOfs == -1)
{
/* start of this row */
@@ -1318,7 +1279,7 @@ ME_MoveCursorLines(ME_TextEditor *editor, ME_Cursor *pCursor, int nRelOfs, BOOL
/* row not found - ignore */
return;
}
- ME_FindRunInRow(editor, pItem, x, pCursor, &editor->bCaretAtEnd);
+ cursor_from_row( editor, pItem, x, pCursor );
assert(pCursor->pRun);
assert(pCursor->pRun->type == diRun);
}
@@ -1330,7 +1291,6 @@ static void ME_ArrowPageUp(ME_TextEditor *editor, ME_Cursor *pCursor)
if (editor->vert_si.nPos < p->member.row.nHeight)
{
ME_SetCursorToStart(editor, pCursor);
- editor->bCaretAtEnd = FALSE;
/* Native clears seems to clear this x value on page up at the top
* of the text, but not on page down at the end of the text.
* Doesn't make sense, but we try to be bug for bug compatible. */
@@ -1342,8 +1302,6 @@ static void ME_ArrowPageUp(ME_TextEditor *editor, ME_Cursor *pCursor)
int yOldScrollPos = editor->vert_si.nPos;
x = ME_GetXForArrow(editor, pCursor);
- if (!pCursor->nOffset && editor->bCaretAtEnd)
- pRun = ME_FindItemBack(pRun, diRun);
p = ME_FindItemBack(pRun, diStartRowOrParagraph);
assert(p->type == diStartRow);
@@ -1371,7 +1329,7 @@ static void ME_ArrowPageUp(ME_TextEditor *editor, ME_Cursor *pCursor)
pLast = p;
} while(1);
- ME_FindRunInRow(editor, pLast, x, pCursor, &editor->bCaretAtEnd);
+ cursor_from_row( editor, pLast, x, pCursor );
}
assert(pCursor->pRun);
assert(pCursor->pRun->type == diRun);
@@ -1392,16 +1350,12 @@ static void ME_ArrowPageDown(ME_TextEditor *editor, ME_Cursor *pCursor)
if (editor->vert_si.nPos >= y - editor->sizeWindow.cy)
{
ME_SetCursorToEnd(editor, pCursor, FALSE);
- editor->bCaretAtEnd = FALSE;
} else {
ME_DisplayItem *pRun = pCursor->pRun;
ME_DisplayItem *p;
int yd, yp;
int yOldScrollPos = editor->vert_si.nPos;
- if (!pCursor->nOffset && editor->bCaretAtEnd)
- pRun = ME_FindItemBack(pRun, diRun);
-
p = ME_FindItemBack(pRun, diStartRowOrParagraph);
assert(p->type == diStartRow);
yp = ME_FindItemBack(p, diParagraph)->member.para.pt.y;
@@ -1429,7 +1383,7 @@ static void ME_ArrowPageDown(ME_TextEditor *editor, ME_Cursor *pCursor)
pLast = p;
} while(1);
- ME_FindRunInRow(editor, pLast, x, pCursor, &editor->bCaretAtEnd);
+ cursor_from_row( editor, pLast, x, pCursor );
}
assert(pCursor->pRun);
assert(pCursor->pRun->type == diRun);
@@ -1440,11 +1394,7 @@ static void ME_ArrowHome(ME_TextEditor *editor, ME_Cursor *pCursor)
ME_DisplayItem *pRow = ME_FindItemBack(pCursor->pRun, diStartRow);
if (pRow) {
ME_DisplayItem *pRun;
- if (editor->bCaretAtEnd && !pCursor->nOffset) {
- pRow = ME_FindItemBack(pRow, diStartRow);
- if (!pRow)
- return;
- }
+
pRun = ME_FindItemFwd(pRow, diRun);
if (pRun) {
pCursor->pRun = pRun;
@@ -1452,44 +1402,26 @@ static void ME_ArrowHome(ME_TextEditor *editor, ME_Cursor *pCursor)
pCursor->nOffset = 0;
}
}
- editor->bCaretAtEnd = FALSE;
}
static void ME_ArrowCtrlHome(ME_TextEditor *editor, ME_Cursor *pCursor)
{
ME_SetCursorToStart(editor, pCursor);
- editor->bCaretAtEnd = FALSE;
}
static void ME_ArrowEnd(ME_TextEditor *editor, ME_Cursor *pCursor)
{
ME_DisplayItem *pRow;
- if (editor->bCaretAtEnd && !pCursor->nOffset)
- return;
-
pRow = ME_FindItemFwd(pCursor->pRun, diStartRowOrParagraphOrEnd);
assert(pRow);
- if (pRow->type == diStartRow) {
- ME_DisplayItem *pRun = ME_FindItemFwd(pRow, diRun);
- assert(pRun);
- pCursor->pRun = pRun;
- assert(pCursor->pPara == ME_GetParagraph(pCursor->pRun));
- pCursor->nOffset = 0;
- editor->bCaretAtEnd = TRUE;
- return;
- }
pCursor->pRun = ME_FindItemBack(pRow, diRun);
- assert(pCursor->pRun && pCursor->pRun->member.run.nFlags & MERF_ENDPARA);
- assert(pCursor->pPara == ME_GetParagraph(pCursor->pRun));
- pCursor->nOffset = 0;
- editor->bCaretAtEnd = FALSE;
+ pCursor->nOffset = (pRow->type == diStartRow) ? pCursor->pRun->member.run.len : 0;
}
static void ME_ArrowCtrlEnd(ME_TextEditor *editor, ME_Cursor *pCursor)
{
ME_SetCursorToEnd(editor, pCursor, FALSE);
- editor->bCaretAtEnd = FALSE;
}
BOOL ME_IsSelection(ME_TextEditor *editor)
@@ -1554,14 +1486,12 @@ ME_ArrowKey(ME_TextEditor *editor, int nVKey, BOOL extend, BOOL ctrl)
ME_CheckCharOffsets(editor);
switch(nVKey) {
case VK_LEFT:
- editor->bCaretAtEnd = FALSE;
if (ctrl)
success = ME_MoveCursorWords(editor, &tmp_curs, -1);
else
success = ME_MoveCursorChars(editor, &tmp_curs, -1, extend);
break;
case VK_RIGHT:
- editor->bCaretAtEnd = FALSE;
if (ctrl)
success = ME_MoveCursorWords(editor, &tmp_curs, +1);
else
@@ -1584,7 +1514,6 @@ ME_ArrowKey(ME_TextEditor *editor, int nVKey, BOOL extend, BOOL ctrl)
ME_ArrowCtrlHome(editor, &tmp_curs);
else
ME_ArrowHome(editor, &tmp_curs);
- editor->bCaretAtEnd = FALSE;
break;
}
case VK_END:
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 0cc33ad5d9b..6a2e96a3c7c 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -3121,7 +3121,6 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10)
ed->nUDArrowX = -1;
ed->rgbBackColor = -1;
ed->hbrBackground = GetSysColorBrush(COLOR_WINDOW);
- ed->bCaretAtEnd = FALSE;
ed->nEventMask = 0;
ed->nModifyStep = 0;
ed->nTextLimit = TEXT_LIMIT_DEFAULT;
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h
index fd5c9bc3df8..8722890bf47 100644
--- a/dlls/riched20/editstr.h
+++ b/dlls/riched20/editstr.h
@@ -398,7 +398,6 @@ typedef struct tagME_TextEditor
int total_rows;
COLORREF rgbBackColor;
HBRUSH hbrBackground;
- BOOL bCaretAtEnd;
int nEventMask;
int nModifyStep;
struct list undo_stack;
diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c
index daae18d5968..33e89a11771 100644
--- a/dlls/riched20/table.c
+++ b/dlls/riched20/table.c
@@ -625,10 +625,7 @@ void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow)
editor->pCursors[0] = fromCursor;
editor->pCursors[1] = fromCursor;
/* FIXME: For some reason the caret is shown at the start of the
- * previous paragraph in v1.0 to v3.0, and bCaretAtEnd only works
- * within the paragraph for wrapped lines. */
- if (ME_FindItemBack(fromCursor.pRun, diRun))
- editor->bCaretAtEnd = TRUE;
+ * previous paragraph in v1.0 to v3.0 */
} else if ((bSelectedRow || !ME_IsInTable(toCursor.pRun))) {
ME_SelectOrInsertNextCell(editor, fromCursor.pRun);
} else {
--
2.23.0
More information about the wine-devel
mailing list