Moved the EN_UPDATE notification out of the paint handler. Instead,
the notification is sent when an InvalidateRect is made after
modifying the text.
diff --git a/controls/edit.c b/controls/edit.c
index 40482b9..de8c462 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -250,6 +250,7 @@
static LRESULT EDIT_WM_SysKeyDown(WND *wnd, EDITSTATE *es, INT key, DWORD key_data);
static void EDIT_WM_Timer(WND *wnd, EDITSTATE *es, INT id, TIMERPROC timer_proc);
static LRESULT EDIT_WM_VScroll(WND *wnd, EDITSTATE *es, INT action, INT pos, HWND scroll_bar);
+static void EDIT_UpdateText(WND *wnd, LPRECT rc, BOOL bErase);
/*********************************************************************
@@ -384,14 +385,14 @@
RECT rc;
CONV_RECT16TO32((LPRECT16)PTR_SEG_TO_LIN(lParam), &rc);
EDIT_SetRectNP(wnd, es, &rc);
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
}
break;
case EM_SETRECT:
DPRINTF_EDIT_MSG32("EM_SETRECT");
if ((es->style & ES_MULTILINE) && lParam) {
EDIT_SetRectNP(wnd, es, (LPRECT)lParam);
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
}
break;
@@ -753,7 +754,7 @@
case WM_ENABLE:
DPRINTF_EDIT_MSG32("WM_ENABLE");
es->bEnableState = (BOOL) wParam;
- InvalidateRect(hwnd, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
break;
case WM_ERASEBKGND:
@@ -1255,7 +1256,7 @@
EDIT_GetLineRect(wnd, es, 0, start, end, &line_rect);
if (IntersectRect(&rc, &line_rect, &es->format_rect))
- InvalidateRect(wnd->hwndSelf, &rc, FALSE);
+ EDIT_UpdateText(wnd, &rc, FALSE);
}
@@ -1298,25 +1299,25 @@
if (sl == el) {
EDIT_GetLineRect(wnd, es, sl, sc, ec, &rcLine);
if (IntersectRect(&rcUpdate, &rcWnd, &rcLine))
- InvalidateRect(wnd->hwndSelf, &rcUpdate, FALSE);
+ EDIT_UpdateText(wnd, &rcUpdate, FALSE);
} else {
EDIT_GetLineRect(wnd, es, sl, sc,
EDIT_EM_LineLength(wnd, es,
EDIT_EM_LineIndex(wnd, es, sl)),
&rcLine);
if (IntersectRect(&rcUpdate, &rcWnd, &rcLine))
- InvalidateRect(wnd->hwndSelf, &rcUpdate, FALSE);
+ EDIT_UpdateText(wnd, &rcUpdate, FALSE);
for (l = sl + 1 ; l < el ; l++) {
EDIT_GetLineRect(wnd, es, l, 0,
EDIT_EM_LineLength(wnd, es,
EDIT_EM_LineIndex(wnd, es, l)),
&rcLine);
if (IntersectRect(&rcUpdate, &rcWnd, &rcLine))
- InvalidateRect(wnd->hwndSelf, &rcUpdate, FALSE);
+ EDIT_UpdateText(wnd, &rcUpdate, FALSE);
}
EDIT_GetLineRect(wnd, es, el, 0, ec, &rcLine);
if (IntersectRect(&rcUpdate, &rcWnd, &rcLine))
- InvalidateRect(wnd->hwndSelf, &rcUpdate, FALSE);
+ EDIT_UpdateText(wnd, &rcUpdate, FALSE);
}
}
@@ -2469,10 +2470,8 @@
es->flags |= EF_UPDATE;
EDIT_EM_ScrollCaret(wnd, es);
- EDIT_NOTIFY_PARENT(wnd, EN_UPDATE, "EN_UPDATE");
-
/* FIXME: really inefficient */
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
}
@@ -2567,7 +2566,7 @@
x = SLOWORD(EDIT_EM_PosFromChar(wnd, es, es->selection_end, FALSE));
} while ((x < goal) && es->x_offset);
/* FIXME: use ScrollWindow() somehow to improve performance */
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
} else if (x > es->format_rect.right) {
INT x_last;
INT len = lstrlenA(es->text);
@@ -2578,7 +2577,7 @@
x_last = SLOWORD(EDIT_EM_PosFromChar(wnd, es, len, FALSE));
} while ((x > goal) && (x_last > es->format_rect.right));
/* FIXME: use ScrollWindow() somehow to improve performance */
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
}
}
}
@@ -2622,7 +2621,7 @@
es->flags &= ~EF_MODIFIED;
es->flags &= ~EF_UPDATE;
EDIT_BuildLineDefs_ML(wnd, es);
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
EDIT_EM_ScrollCaret(wnd, es);
}
@@ -2665,7 +2664,7 @@
es->flags &= ~EF_MODIFIED;
es->flags &= ~EF_UPDATE;
EDIT_BuildLineDefs_ML(wnd, es);
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
EDIT_EM_ScrollCaret(wnd, es);
}
@@ -2744,7 +2743,7 @@
wnd->dwStyle &= ~ES_PASSWORD;
es->style &= ~ES_PASSWORD;
}
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
}
@@ -2867,7 +2866,7 @@
es->word_break_proc16 = NULL;
if ((es->style & ES_MULTILINE) && !(es->style & ES_AUTOHSCROLL)) {
EDIT_BuildLineDefs_ML(wnd, es);
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
}
}
@@ -2886,7 +2885,7 @@
es->word_break_proc16 = wbp;
if ((es->style & ES_MULTILINE) && !(es->style & ES_AUTOHSCROLL)) {
EDIT_BuildLineDefs_ML(wnd, es);
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
}
}
@@ -3909,7 +3908,7 @@
EDIT_BuildLineDefs_ML(wnd, es);
if (redraw)
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
if (es->flags & EF_FOCUSED) {
DestroyCaret();
CreateCaret(wnd->hwndSelf, 0, 2, es->line_height);
@@ -3968,7 +3967,7 @@
RECT rc;
SetRect(&rc, 0, 0, width, height);
EDIT_SetRectNP(wnd, es, &rc);
- InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+ EDIT_UpdateText(wnd, NULL, TRUE);
}
}
@@ -4135,3 +4134,20 @@
EDIT_EM_LineScroll(wnd, es, 0, dy);
return 0;
}
+
+
+/*********************************************************************
+ *
+ * EDIT_UpdateText
+ *
+ */
+static void EDIT_UpdateText(WND *wnd, LPRECT rc, BOOL bErase)
+{
+ EDITSTATE *es = *(EDITSTATE **)((wnd)->wExtra);
+
+ /* EF_UPDATE will be turned off in paint */
+ if (es->flags & EF_UPDATE)
+ EDIT_NOTIFY_PARENT(wnd, EN_UPDATE, "EN_UPDATE");
+
+ InvalidateRect(wnd->hwndSelf, rc, bErase);
+}