]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
mouse counter under/overflow fix
authorToni Wilen <twilen@winuae.net>
Wed, 5 Dec 2012 18:19:13 +0000 (20:19 +0200)
committerToni Wilen <twilen@winuae.net>
Wed, 5 Dec 2012 18:19:13 +0000 (20:19 +0200)
inputdevice.cpp

index 6a94a5bf5b7f6affd4d838b8059ee8b505dd1a6f..31b69fdca9f00633161a3327f21865db912fd3bb 100644 (file)
@@ -1744,7 +1744,9 @@ static int getvelocity (int num, int subnum, int pct)
        return v;
 }
 
-static void mouseupdate (int pct, int vsync)
+#define MOUSEXY_MAX 1024
+
+static void mouseupdate (int pct, bool vsync)
 {
        int v, i;
        int max = 120;
@@ -1797,10 +1799,26 @@ static void mouseupdate (int pct, int vsync)
                        v = getvelocity (i, 0, pct);
                        mxd += v;
                        mouse_x[i] += v;
+                       if (mouse_x[i] < 0) {
+                               mouse_x[i] += MOUSEXY_MAX;
+                               mouse_frame_x[i] = mouse_x[i] - v;
+                       }
+                       if (mouse_x[i] >= MOUSEXY_MAX) {
+                               mouse_x[i] -= MOUSEXY_MAX;
+                               mouse_frame_x[i] = mouse_x[i] - v;
+                       }
 
                        v = getvelocity (i, 1, pct);
                        myd += v;
                        mouse_y[i] += v;
+                       if (mouse_y[i] < 0) {
+                               mouse_y[i] += MOUSEXY_MAX;
+                               mouse_frame_y[i] = mouse_y[i] - v;
+                       }
+                       if (mouse_y[i] >= MOUSEXY_MAX) {
+                               mouse_y[i] -= MOUSEXY_MAX;
+                               mouse_frame_y[i] = mouse_y[i] - v;
+                       }
 
                        v = getvelocity (i, 2, pct);
                        if (v > 0)
@@ -1810,10 +1828,14 @@ static void mouseupdate (int pct, int vsync)
                        if (!mouse_deltanoreset[i][2])
                                mouse_delta[i][2] = 0;
 
-                       if (mouse_frame_x[i] - mouse_x[i] > max)
+                       if (mouse_frame_x[i] - mouse_x[i] > max) {
                                mouse_x[i] = mouse_frame_x[i] - max;
-                       if (mouse_frame_x[i] - mouse_x[i] < -max)
+                               mouse_x[i] &= MOUSEXY_MAX - 1;
+                       }
+                       if (mouse_frame_x[i] - mouse_x[i] < -max) {
                                mouse_x[i] = mouse_frame_x[i] + max;
+                               mouse_x[i] &= MOUSEXY_MAX - 1;
+                       }
 
                        if (mouse_frame_y[i] - mouse_y[i] > max)
                                mouse_y[i] = mouse_frame_y[i] - max;
@@ -1840,9 +1862,9 @@ static void readinput (void)
        diff = totalvpos - input_vpos;
        if (diff > 0) {
                if (diff < 10) {
-                       mouseupdate (0, 0);
+                       mouseupdate (0, false);
                } else {
-                       mouseupdate (diff * 1000 / current_maxvpos (), 0);
+                       mouseupdate (diff * 1000 / current_maxvpos (), false);
                }
        }
        input_vpos = totalvpos;
@@ -3197,7 +3219,7 @@ void inputdevice_vsync (void)
                write_log (_T("*\n"));
 
        input_frame++;
-       mouseupdate (0, 1);
+       mouseupdate (0, true);
 
        if (!input_record) {
                inputdevice_read ();