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() { } } }