Re: Fix for RichEdit out of space error in DAoC
Jason Green <[email protected]> Sun, 18 Feb 2007 13:26:46 -0500
| Newsgroups | gmane.comp.emulators.winex.devel |
|---|---|
| Message-ID | <[email protected]> |
Thanks for this patch. It will be included in the next major release.
Rob Crittenden wrote:
> With the latest patch to DAoC a RichEdit out of space dialog pops up and
> clicking Ok lets the program continue but the display is blank.
> According to the MSDN it should truncate the string.
>
> Attached is a patch to do just that. I've only tested it with DAoC and
> it seems to work as expected (it truncates the string).
>
> I release this patch under the X11 license. Do what you will with it.
>
> rob
>
>
> ------------------------------------------------------------------------
>
> Index: controls/edit.c
> ===================================================================
> RCS file: /cvsroot/winex/controls/edit.c,v
> retrieving revision 1.5
> diff -u -r1.5 edit.c
> --- controls/edit.c 18 Feb 2004 22:27:35 -0000 1.5
> +++ controls/edit.c 14 Feb 2007 03:37:45 -0000
> @@ -1819,12 +1819,7 @@
>
> if (size <= es->buffer_size)
> return TRUE;
> - if (size > es->buffer_limit) {
> - EDIT_NOTIFY_PARENT(hwnd, es, EN_MAXTEXT, "EN_MAXTEXT");
> - return FALSE;
> - }
> - if (size > es->buffer_limit)
> - size = es->buffer_limit;
> + /* No need to check (size > es->buffer_limit), already done. */
>
> TRACE("trying to ReAlloc to %d+1 characters\n", size);
>
> @@ -2993,20 +2988,32 @@
> UINT s;
> UINT e;
> UINT i;
> + UINT nl;
> LPWSTR p;
> HRGN hrgn = 0;
>
> - TRACE("%s, can_undo %d, send_update %d\n",
> - debugstr_w(lpsz_replace), can_undo, send_update);
> -
> s = es->selection_start;
> e = es->selection_end;
>
> + TRACE("%s, can_undo %d, send_update %d, strl %d, tl %d, s %d, e %d\n",
> + debugstr_w(lpsz_replace), can_undo, send_update, strl, tl, s, e);
> +
> if ((s == e) && !strl)
> return;
>
> ORDER_UINT(s, e);
>
> + nl = tl - (e - s) + strl;
> +
> + /* If the new length is bigger than our buffer then per the MSDN
> + * truncate to fit. We still need to notify the app that the
> + * buffer is full (presumably so it stops sending stuff).
> + */
> + if (nl > es->buffer_limit) {
> + strl = es->buffer_limit - (tl - (e - s));
> + EDIT_NOTIFY_PARENT(hwnd, es, EN_MAXTEXT, "EN_MAXTEXT");
> + }
> +
> if (!EDIT_MakeFit(hwnd, es, tl - (e - s) + strl))
> return;
>