[PATCH] comctl32: Dont set caret position if we dont have focus
When SetFont is called on an Edit Control which doesn't have focus, it causes the current control to draw the caret in the incorrect location until a key is pressed. EDIT_SetCaretPos (es=0x204439c0, pos=0, after_wrap=0) 0x7eace3be in EDIT_AdjustFormatRect (es=0x204439c0) 0x7eace465 in EDIT_SetRectNP (es=0x204439c0, rc=<optimized out>) 0x7ead180c in EDIT_WM_SetFont (es=0x204439c0, font=<optimized out>, redraw=1) Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> --- dlls/comctl32/edit.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c index 06e1f498dc9..3ffc2e5c16a 100644 --- a/dlls/comctl32/edit.c +++ b/dlls/comctl32/edit.c @@ -2238,7 +2238,8 @@ static void EDIT_AdjustFormatRect(EDITSTATE *es) if ((es->style & ES_MULTILINE) && !(es->style & ES_AUTOHSCROLL)) EDIT_BuildLineDefs_ML(es, 0, get_text_length(es), 0, NULL); - EDIT_SetCaretPos(es, es->selection_end, es->flags & EF_AFTER_WRAP); + if (es->flags & EF_FOCUSED) + EDIT_SetCaretPos(es, es->selection_end, es->flags & EF_AFTER_WRAP); } -- 2.19.2
On 12/5/18 5:08 AM, Alistair Leslie-Hughes wrote:
When SetFont is called on an Edit Control which doesn't have focus, it causes the current control to draw the caret in the incorrect location until a key is pressed.
EDIT_SetCaretPos (es=0x204439c0, pos=0, after_wrap=0) 0x7eace3be in EDIT_AdjustFormatRect (es=0x204439c0) 0x7eace465 in EDIT_SetRectNP (es=0x204439c0, rc=<optimized out>) 0x7ead180c in EDIT_WM_SetFont (es=0x204439c0, font=<optimized out>, redraw=1)
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> --- dlls/comctl32/edit.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c index 06e1f498dc9..3ffc2e5c16a 100644 --- a/dlls/comctl32/edit.c +++ b/dlls/comctl32/edit.c @@ -2238,7 +2238,8 @@ static void EDIT_AdjustFormatRect(EDITSTATE *es) if ((es->style & ES_MULTILINE) && !(es->style & ES_AUTOHSCROLL)) EDIT_BuildLineDefs_ML(es, 0, get_text_length(es), 0, NULL);
- EDIT_SetCaretPos(es, es->selection_end, es->flags & EF_AFTER_WRAP); + if (es->flags & EF_FOCUSED) + EDIT_SetCaretPos(es, es->selection_end, es->flags & EF_AFTER_WRAP); }
Does that mean EF_FOCUSED is inconsistent with actual window focus at this point? Or instead: - caret created by one Edit control; - WM_SETFONT called for another; - caret is moved unexpectedly, for first control? In that case I think we should move flag check to EDIT_SetCaretPos().
On 5/12/18 4:14 pm, Nikolay Sivov wrote:
On 12/5/18 5:08 AM, Alistair Leslie-Hughes wrote:
When SetFont is called on an Edit Control which doesn't have focus, it causes the current control to draw the caret in the incorrect location until a key is pressed.
EDIT_SetCaretPos (es=0x204439c0, pos=0, after_wrap=0) 0x7eace3be in EDIT_AdjustFormatRect (es=0x204439c0) 0x7eace465 in EDIT_SetRectNP (es=0x204439c0, rc=<optimized out>) 0x7ead180c in EDIT_WM_SetFont (es=0x204439c0, font=<optimized out>, redraw=1)
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com> --- dlls/comctl32/edit.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c index 06e1f498dc9..3ffc2e5c16a 100644 --- a/dlls/comctl32/edit.c +++ b/dlls/comctl32/edit.c @@ -2238,7 +2238,8 @@ static void EDIT_AdjustFormatRect(EDITSTATE *es) if ((es->style & ES_MULTILINE) && !(es->style & ES_AUTOHSCROLL)) EDIT_BuildLineDefs_ML(es, 0, get_text_length(es), 0, NULL); - EDIT_SetCaretPos(es, es->selection_end, es->flags & EF_AFTER_WRAP); + if (es->flags & EF_FOCUSED) + EDIT_SetCaretPos(es, es->selection_end, es->flags & EF_AFTER_WRAP); }
Does that mean EF_FOCUSED is inconsistent with actual window focus at this point?
Or instead:
- caret created by one Edit control; - WM_SETFONT called for another; - caret is moved unexpectedly, for first control?
Yes, this is the exact scenario I am tying to correct.
In that case I think we should move flag check to EDIT_SetCaretPos().
Cool, Ill send an updated patch shortly. Alistair.
participants (2)
-
Alistair Leslie-Hughes -
Nikolay Sivov