[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