[wineconsole] Avoid memmove in event compression (1/3)
Peter Berg Larsen
pebl at math.ku.dk
Tue Oct 7 23:00:33 CDT 2003
Changelog:
- use CONSOLE_RENDERER_NONE_EVENT to compress an event instead of deleting
it with a memmove
-------------- next part --------------
diff -b -u wine-20030911/programs/wineconsole/wineconsole.c wine-my/programs/wineconsole/wineconsole.c
--- wine-20030911/programs/wineconsole/wineconsole.c 2003-06-23 05:37:14.000000000 +0200
+++ wine-my/programs/wineconsole/wineconsole.c 2003-09-03 03:42:42.000000000 +0200
@@ -208,7 +208,7 @@
int WINECON_GrabChanges(struct inner_data* data)
{
struct console_renderer_event evts[256];
- int i, num, curs = -1;
+ int i, num, ev_found;
HANDLE h;
SERVER_START_REQ( get_console_renderer_events )
@@ -223,40 +223,37 @@
/* FIXME: should do some event compression here (cursor pos, update) */
/* step 1: keep only last cursor pos event */
+ ev_found = -1;
for (i = num - 1; i >= 0; i--)
{
if (evts[i].event == CONSOLE_RENDERER_CURSOR_POS_EVENT)
{
- if (curs == -1)
- curs = i;
- else
- {
- memmove(&evts[i], &evts[i+1], (num - i - 1) * sizeof(evts[0]));
- num--;
- }
+ if (ev_found != -1) evts[ev_found].event = CONSOLE_RENDERER_NONE_EVENT;
+ ev_found = i;
}
}
/* step 2: manage update events */
+ ev_found = -1;
for (i = 0; i < num - 1; i++)
{
- if (evts[i].event == CONSOLE_RENDERER_UPDATE_EVENT &&
- evts[i+1].event == CONSOLE_RENDERER_UPDATE_EVENT)
+ if (evts[i].event == CONSOLE_RENDERER_NONE_EVENT) continue;
+ if (evts[i].event != CONSOLE_RENDERER_UPDATE_EVENT)
{
- /* contiguous */
- if (evts[i].u.update.bottom + 1 == evts[i+1].u.update.top)
- {
- evts[i].u.update.bottom = evts[i+1].u.update.bottom;
- memmove(&evts[i+1], &evts[i+2], (num - i - 2) * sizeof(evts[0]));
- num--; i--;
- }
- /* already handled cases */
- else if (evts[i].u.update.top <= evts[i+1].u.update.top &&
- evts[i].u.update.bottom >= evts[i+1].u.update.bottom)
- {
- memmove(&evts[i+1], &evts[i+2], (num - i - 2) * sizeof(evts[0]));
- num--; i--;
+ ev_found = -1;
+ continue;
}
+
+ if (ev_found != -1 &&
+ !(evts[i ].u.update.bottom + 1 < evts[ev_found].u.update.top ||
+ evts[ev_found].u.update.bottom + 1 < evts[i ].u.update.top))
+ {
+ evts[i].u.update.top = min(evts[i ].u.update.top,
+ evts[ev_found].u.update.top);
+ evts[i].u.update.bottom = max(evts[i ].u.update.bottom,
+ evts[ev_found].u.update.bottom);
+ evts[ev_found].event = CONSOLE_RENDERER_NONE_EVENT;
}
+ ev_found = i;
}
WINE_TRACE("Events:");
@@ -264,6 +261,8 @@
{
switch (evts[i].event)
{
+ case CONSOLE_RENDERER_NONE_EVENT:
+ break;
case CONSOLE_RENDERER_TITLE_EVENT:
data->fnSetTitle(data);
break;
More information about the wine-patches
mailing list