summaryrefslogtreecommitdiffstats
path: root/krdc/vnc/pointerlatencyometer.h
diff options
context:
space:
mode:
Diffstat (limited to 'krdc/vnc/pointerlatencyometer.h')
-rw-r--r--krdc/vnc/pointerlatencyometer.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/krdc/vnc/pointerlatencyometer.h b/krdc/vnc/pointerlatencyometer.h
new file mode 100644
index 00000000..559536b2
--- /dev/null
+++ b/krdc/vnc/pointerlatencyometer.h
@@ -0,0 +1,83 @@
+/***************************************************************************
+ pointerlatencyometer.h - measuring pointer latency
+ -------------------
+ begin : Wed Jun 30 12:04:44 CET 2002
+ copyright : (C) 2002-2003 by Tim Jansen
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <qdatetime.h>
+#include <kdebug.h>
+
+struct PointerState {
+ int x, y;
+ QTime timestamp;
+};
+
+class PointerLatencyOMeter {
+private:
+ enum { stateCapacity = 30, maximumLatency = 1000 };
+ PointerState states[stateCapacity];
+ int firstState, stateNum;
+ float last3Latency, last20Latency;
+
+public:
+ PointerLatencyOMeter() :
+ firstState(0),
+ stateNum(0),
+ last3Latency(125),
+ last20Latency(25) {
+ }
+
+ // registers a client pointer state
+ void registerPointerState(int x, int y) {
+ if (stateNum == stateCapacity)
+ stateNum--;
+ if (firstState == 0)
+ firstState = stateCapacity-1;
+ else
+ firstState--;
+ states[firstState].x = x;
+ states[firstState].y = y;
+ states[firstState].timestamp.start();
+ stateNum++;
+ }
+
+ /* Returns true if pointer should be visible */
+ bool registerLatency(int msecs) {
+ last3Latency = ((last3Latency * 2.0) + msecs) / 3.0;
+ last20Latency = ((last20Latency * 19.0) + msecs) / 20.0;
+
+ if (msecs >= maximumLatency)
+ return true;
+ if (last3Latency > (1000/4))
+ return true;
+ return last20Latency > (1000/12);
+ }
+
+ // Called with server-side coordinates.
+ // Returns true if pointer should be visible
+ bool handlePointerEvent(int x, int y) {
+ for (int i = stateNum-1; i >= 0; i--) {
+ int idx = (i+firstState) % stateCapacity;
+ if ((states[idx].x != x) ||
+ (states[idx].y != y))
+ continue;
+
+ stateNum = i;
+ int l = states[idx].timestamp.elapsed();
+ return registerLatency((l > maximumLatency) ? maximumLatency : l);
+ }
+ return true;
+ }
+
+};