diff --git a/mono/Assistance/Assistance.csproj b/mono/Assistance/Assistance.csproj
index e4e56d3..2dedccc 100644
--- a/mono/Assistance/Assistance.csproj
+++ b/mono/Assistance/Assistance.csproj
@@ -58,6 +58,7 @@
+
diff --git a/mono/Assistance/KeyState.cs b/mono/Assistance/KeyState.cs
index d231d05..7b46c9f 100644
--- a/mono/Assistance/KeyState.cs
+++ b/mono/Assistance/KeyState.cs
@@ -19,8 +19,10 @@ namespace Assistance {
{ get { return state == null || state.isEmpty; } }
public bool isPressed(T value)
{ return find(value) != null; }
- public double howLongPressed(T value) {
- KeyState state = find(value);
+ public double howLongPressed(T value)
+ { return howLongPressed(find(value), ticks, timeOffset); }
+
+ public static double howLongPressed(KeyState state, long ticks, double timeOffset) {
return state == null ? 0.0
: Math.Max(Timer.step, (ticks - state.ticks)*Timer.step + timeOffset);
}
diff --git a/mono/Assistance/MainWindow.cs b/mono/Assistance/MainWindow.cs
index 62aba73..8f4a0cd 100644
--- a/mono/Assistance/MainWindow.cs
+++ b/mono/Assistance/MainWindow.cs
@@ -23,8 +23,7 @@ namespace Assistance {
Point offset;
Point cursor;
- KeyState keyState = new KeyState();
- KeyState buttonState = new KeyState();
+ InputState inputState = new InputState();
Track track = null;
@@ -138,7 +137,7 @@ namespace Assistance {
endDragAndTrack();
break;
default:
- keyState = keyState.press(e.Key, Timer.ticks());
+ inputState.keyPress(e.Key, Timer.ticks());
retryTrackPoint();
break;
}
@@ -147,7 +146,7 @@ namespace Assistance {
}
protected override bool OnKeyReleaseEvent(Gdk.EventKey e) {
- keyState = keyState.release(e.Key, Timer.ticks());
+ inputState.keyRelease(e.Key, Timer.ticks());
retryTrackPoint();
return base.OnKeyReleaseEvent(e);
}
@@ -170,11 +169,11 @@ namespace Assistance {
}
lastTicks = ticks;
- point.keyState.state = keyState;
+ point.keyState.state = inputState.keyState;
point.keyState.ticks = ticksStart;
point.keyState.timeOffset = point.time;
- point.buttonState.state = buttonState;
+ point.buttonState.state = inputState.buttonState(track.device);
point.buttonState.ticks = ticksStart;
point.buttonState.timeOffset = point.time;
@@ -225,7 +224,8 @@ namespace Assistance {
protected override bool OnButtonPressEvent(Gdk.EventButton e) {
cursor = windowToWorkarea(new Point(e.X, e.Y));
- buttonState = buttonState.press(e.Button, Timer.ticks());
+ Console.WriteLine(e.Button.ToString());
+ inputState.buttonPress(e.Device, e.Button, Timer.ticks());
retryTrackPoint();
if (e.Button == 1) {
timeStart = e.Time;
@@ -243,7 +243,7 @@ namespace Assistance {
protected override bool OnButtonReleaseEvent(Gdk.EventButton e) {
cursor = windowToWorkarea(new Point(e.X, e.Y));
- buttonState = buttonState.release(e.Button, Timer.ticks());
+ inputState.buttonRelease(e.Device, e.Button, Timer.ticks());
retryTrackPoint();
if (e.Button == 1) {
if (!dragging && track != null)
diff --git a/mono/Assistance/Tool.cs b/mono/Assistance/Tool.cs
index 8c7e7fd..a89a607 100644
--- a/mono/Assistance/Tool.cs
+++ b/mono/Assistance/Tool.cs
@@ -9,22 +9,62 @@ namespace Assistance {
Multiline = 4
};
- public class MotionHandler {
- public bool paint_begin() { return false; }
- public void paint_track_begin(Track track) { }
- public void paint_track_point(Track track) { }
- public void paint_track_end(Track track) { }
- public bool paint_apply() { return false; }
- public void paint_cancel() { }
+
+ public class InputHandler {
+ public void activate() { }
+
+ public void keyPress(Gdk.Key key, InputState state) { }
+ public void keyRelease(Gdk.Key key, InputState state) { }
+ public void buttonPress(Gdk.Device device, uint button, InputState state) { }
+ public void buttonRelease(Gdk.Device device, uint button, InputState state) { }
+
+ public bool paintBegin() { return false; }
+ public void paintTrackBegin(Track track) { }
+ public void paintTrackPoint(Track track) { }
+ public void paintTrackEnd(Track track) { }
+ public bool paintApply() { return false; }
+ public void paintCancel() { }
+
+ public void disactivate() { }
}
- public class Tool: MotionHandler {
- public void activate() { }
-
+
+ public class InputModifier {
+ public InputHandler getNext() { return null; }
+
+ public void activate()
+ { if (getNext() != null) getNext().activate(); }
+
+ public void keyPress(Gdk.Key key, InputState state)
+ { if (getNext() != null) getNext().keyPress(key, state); }
+ public void keyRelease(Gdk.Key key, InputState state)
+ { if (getNext() != null) getNext().keyRelease(key, state); }
+ public void buttonPress(Gdk.Device device, uint button, InputState state)
+ { if (getNext() != null) getNext().buttonPress(device, button, state); }
+ public void buttonRelease(Gdk.Device device, uint button, InputState state)
+ { if (getNext() != null) getNext().buttonRelease(device, button, state); }
+
+ public bool paintBegin()
+ { return getNext() == null ? false : getNext().paintBegin(); }
+ public void paintTrackBegin(Track track)
+ { if (getNext() != null) getNext().paintTrackBegin(track); }
+ public void paintTrackPoint(Track track)
+ { if (getNext() != null) getNext().paintTrackPoint(track); }
+ public void paintTrackEnd(Track track)
+ { if (getNext() != null) getNext().paintTrackEnd(track); }
+ public bool paintApply()
+ { return getNext() == null ? false : getNext().paintApply(); }
+ public void paintCancel()
+ { if (getNext() != null) getNext().paintCancel(); }
+
+ public void disactivate()
+ { if (getNext() != null) getNext().disactivate(); }
+ }
+
+
+ public class Tool: InputHandler {
public Modifiers getAvailableModifiers()
{ return Modifiers.None; }
-
- public void disactivate() { }
}
}