Huw Davies : riched20: Return the nearest char pos if the coords are outside the format rect.

Alexandre Julliard julliard at winehq.org
Mon Dec 13 15:59:53 CST 2021


Module: wine
Branch: master
Commit: 363508454d5f8f1fc5916bda47e6429756b7dc8f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=363508454d5f8f1fc5916bda47e6429756b7dc8f

Author: Huw Davies <huw at codeweavers.com>
Date:   Mon Dec 13 12:58:51 2021 +0000

riched20: Return the nearest char pos if the coords are outside the format rect.

For the two tests that remain todo_wine, the results differ between
riched20 and msftedit, with Wine's implementation matching msftedit.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52041
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/riched20/caret.c        | 27 ++++++---------------------
 dlls/riched20/editor.c       | 34 +++++++++++++---------------------
 dlls/riched20/editor.h       |  4 ++--
 dlls/riched20/tests/editor.c | 10 ++++++----
 4 files changed, 27 insertions(+), 48 deletions(-)

diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c
index beac8af50a1..ebc137ebf85 100644
--- a/dlls/riched20/caret.c
+++ b/dlls/riched20/caret.c
@@ -993,32 +993,17 @@ static BOOL cursor_from_virtual_coords( ME_TextEditor *editor, int x, int y,
  *
  * x & y are pixel positions in client coordinates.
  *
- * isExact will be set to TRUE if the run is directly under the pixel
- * position, FALSE if it not, unless isExact is set to NULL.
- *
- * return FALSE if outside client area and the cursor is not set,
- * otherwise TRUE is returned.
+ * return TRUE if the run is directly under the pixel
+ * position, FALSE if it not.
  */
-BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y,
-                    ME_Cursor *cursor, BOOL *isExact)
+BOOL cursor_from_coords( ME_TextEditor *editor, int x, int y, ME_Cursor *cursor )
 {
-  RECT rc;
-  BOOL bResult;
-
-  ITextHost_TxGetClientRect(editor->texthost, &rc);
-  if (x < 0 || y < 0 || x >= rc.right || y >= rc.bottom) {
-    if (isExact) *isExact = FALSE;
-    return FALSE;
-  }
-  x += editor->horz_si.nPos;
-  y += editor->vert_si.nPos;
-  bResult = cursor_from_virtual_coords( editor, x, y, cursor, FALSE );
-  if (isExact) *isExact = bResult;
-  return TRUE;
+    x += editor->horz_si.nPos;
+    y += editor->vert_si.nPos;
+    return cursor_from_virtual_coords( editor, x, y, cursor, FALSE );
 }
 
 
-
 /* Extends the selection with a word, line, or paragraph selection type.
  *
  * The selection is anchored by editor->pCursors[2-3] such that the text
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 3bf499681ed..429f023ebe4 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -2815,7 +2815,6 @@ static BOOL is_link( ME_Run *run )
 void editor_set_cursor( ME_TextEditor *editor, int x, int y )
 {
     ME_Cursor pos;
-    BOOL is_exact;
     static HCURSOR cursor_arrow, cursor_hand, cursor_ibeam, cursor_reverse;
     HCURSOR cursor;
 
@@ -2838,22 +2837,18 @@ void editor_set_cursor( ME_TextEditor *editor, int x, int y )
         else cursor = cursor_ibeam;
     }
     else if (x < editor->rcFormat.left) cursor = cursor_reverse;
-    else
+    else if (cursor_from_coords( editor, x, y, &pos ))
     {
-        ME_CharFromPos( editor, x, y, &pos, &is_exact );
-        if (is_exact)
-        {
-            ME_Run *run = pos.run;
+        ME_Run *run = pos.run;
 
-            if (is_link( run )) cursor = cursor_hand;
+        if (is_link( run )) cursor = cursor_hand;
 
-            else if (ME_IsSelection( editor ))
-            {
-                int start, end, offset = ME_GetCursorOfs( &pos );
+        else if (ME_IsSelection( editor ))
+        {
+            int start, end, offset = ME_GetCursorOfs( &pos );
 
-                ME_GetSelectionOfs( editor, &start, &end );
-                if (start <= offset && end >= offset) cursor = cursor_arrow;
-            }
+            ME_GetSelectionOfs( editor, &start, &end );
+            if (start <= offset && end >= offset) cursor = cursor_arrow;
         }
     }
 
@@ -3113,15 +3108,13 @@ static inline int calc_wheel_change( int *remain, int amount_per_click )
 void link_notify(ME_TextEditor *editor, UINT msg, WPARAM wParam, LPARAM lParam)
 {
   int x,y;
-  BOOL isExact;
   ME_Cursor cursor; /* The start of the clicked text. */
   ME_Run *run;
   ENLINK info;
 
   x = (short)LOWORD(lParam);
   y = (short)HIWORD(lParam);
-  ME_CharFromPos(editor, x, y, &cursor, &isExact);
-  if (!isExact) return;
+  if (!cursor_from_coords( editor, x, y, &cursor )) return;
 
   if (is_link( cursor.run ))
   { /* The clicked run has CFE_LINK set */
@@ -3853,11 +3846,10 @@ LRESULT editor_handle_message( ME_TextEditor *editor, UINT msg, WPARAM wParam,
   case EM_CHARFROMPOS:
   {
     ME_Cursor cursor;
-    if (ME_CharFromPos(editor, ((POINTL *)lParam)->x, ((POINTL *)lParam)->y,
-                       &cursor, NULL))
-      return ME_GetCursorOfs(&cursor);
-    else
-      return -1;
+    POINTL *pt = (POINTL *)lParam;
+
+    cursor_from_coords(editor, pt->x, pt->y, &cursor);
+    return ME_GetCursorOfs(&cursor);
   }
   case EM_POSFROMCHAR:
   {
diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h
index 7bdd1bf5efe..8a46e942581 100644
--- a/dlls/riched20/editor.h
+++ b/dlls/riched20/editor.h
@@ -164,6 +164,7 @@ static inline ME_DisplayItem *run_get_di( ME_Run *run )
 
 /* caret.c */
 void cursor_coords( ME_TextEditor *editor, ME_Cursor *cursor, int *x, int *y, int *height ) DECLSPEC_HIDDEN;
+BOOL cursor_from_coords( ME_TextEditor *editor, int x, int y, ME_Cursor *cursor ) DECLSPEC_HIDDEN;
 void ME_SetCursorToStart(ME_TextEditor *editor, ME_Cursor *cursor) DECLSPEC_HIDDEN;
 int set_selection_cursors(ME_TextEditor *editor, int from, int to) DECLSPEC_HIDDEN;
 BOOL ME_MoveCursorWords(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs) DECLSPEC_HIDDEN;
@@ -171,11 +172,10 @@ 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;
 BOOL ME_DeleteTextAtCursor(ME_TextEditor *editor, int nCursor, int nChars) DECLSPEC_HIDDEN;
-void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor, 
+void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor,
                              const WCHAR *str, int len, ME_Style *style) DECLSPEC_HIDDEN;
 void ME_InsertEndRowFromCursor(ME_TextEditor *editor, int nCursor) DECLSPEC_HIDDEN;
 int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs, BOOL final_eop) DECLSPEC_HIDDEN;
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index ab74e0ef1ab..85f7c00383a 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -7228,32 +7228,34 @@ static void test_EM_CHARFROMPOS(void)
     point.x = -1;
     point.y = 40;
     result = SendMessageA(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&point);
-    todo_wine ok(result == 34, "expected character index of 34 but got %d\n", result);
+    ok(result == 34, "expected character index of 34 but got %d\n", result);
 
     point.x = 1000;
     point.y = 0;
     result = SendMessageA(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&point);
-    todo_wine ok(result == 33, "expected character index of 33 but got %d\n", result);
+    ok(result == 33, "expected character index of 33 but got %d\n", result);
 
     point.x = 1000;
     point.y = 36;
     result = SendMessageA(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&point);
-    todo_wine ok(result == 39, "expected character index of 39 but got %d\n", result);
+    ok(result == 39, "expected character index of 39 but got %d\n", result);
 
     point.x = 1000;
     point.y = -1;
     result = SendMessageA(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&point);
+    /* This differs from the msftedit result */
     todo_wine ok(result == 0, "expected character index of 0 but got %d\n", result);
 
     point.x = 1000;
     point.y = rcClient.bottom + 1;
     result = SendMessageA(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&point);
+    /* This differs from the msftedit result */
     todo_wine ok(result == 34, "expected character index of 34 but got %d\n", result);
 
     point.x = 1000;
     point.y = rcClient.bottom;
     result = SendMessageA(hwnd, EM_CHARFROMPOS, 0, (LPARAM)&point);
-    todo_wine ok(result == 39, "expected character index of 39 but got %d\n", result);
+    ok(result == 39, "expected character index of 39 but got %d\n", result);
 
     DestroyWindow(hwnd);
 }




More information about the wine-cvs mailing list