aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-03-04 21:32:42 +0200
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-03-04 21:32:42 +0200
commitf17d39f37cac50861467e07a7bee40534d20100a (patch)
tree1d6ba97191b866eee6ffc6ef904fe3803a84decd /Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop
parent565e48de649d3d14e6b82012b6aa2e3819a3c82c (diff)
downloadTango-f17d39f37cac50861467e07a7bee40534d20100a.tar.gz
Tango-f17d39f37cac50861467e07a7bee40534d20100a.zip
Improved "Notify Continuous Requests About Disconnection".
Integrated FSE/PPC Remote Desktop. Implemented RemoteDesktopService / RemoteDesktopProvider. Implemented Mouse/Keyboard gestures.
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs124
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs2
2 files changed, 98 insertions, 28 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs
index 67d0b85de..0d5bd8559 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/DefaultRemoteDesktopService.cs
@@ -4,6 +4,7 @@ using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Windows.Input;
using Tango.Core;
using Tango.Core.DI;
using Tango.Integration.ExternalBridge;
@@ -14,9 +15,11 @@ using Tango.RemoteDesktop.CaptureMethods;
using Tango.RemoteDesktop.Encoders;
using Tango.RemoteDesktop.Engines;
using Tango.RemoteDesktop.Frames;
+using Tango.RemoteDesktop.Input;
using Tango.RemoteDesktop.Network;
using Tango.Settings;
using Tango.Transport;
+using static Tango.RemoteDesktop.Input.MouseController;
namespace Tango.PPC.Common.RemoteDesktop
{
@@ -45,6 +48,8 @@ namespace Tango.PPC.Common.RemoteDesktop
_clients = new List<RemoteDesktopClient>();
_engine = new RasterScreenCaptureEngine();
+ _engine.CaptureCursor = false;
+
_engine.FrameRate = Math.Min(Math.Max(_settings.RemoteDesktopFrameRate, 1), 20);
_engine.FrameReceived += _engine_FrameReceived;
}
@@ -56,6 +61,16 @@ namespace Tango.PPC.Common.RemoteDesktop
_engine.CaptureMethod.Dispose();
var mainWindow = System.Windows.Application.Current.MainWindow;
+ mainWindow.LocationChanged += (_, __) =>
+ {
+ _engine.CaptureRegion = new CaptureRegion()
+ {
+ Left = (int)mainWindow.Left,
+ Top = (int)mainWindow.Top,
+ Width = (int)mainWindow.Width,
+ Height = (int)mainWindow.Height
+ };
+ };
_engine.CaptureRegion = new CaptureRegion()
{
@@ -68,11 +83,6 @@ namespace Tango.PPC.Common.RemoteDesktop
#endif
_engine.Comparer.MaxDifferencesThrow = _engine.CaptureRegion.Width * _engine.CaptureRegion.Height / 2;
-
- if (_settings.EnableRemoteDesktop)
- {
- Start();
- }
}
private bool _isStarted;
@@ -82,24 +92,6 @@ namespace Tango.PPC.Common.RemoteDesktop
private set { _isStarted = value; RaisePropertyChangedAuto(); }
}
- public void Start()
- {
- if (!IsStarted)
- {
- _engine.Start();
- IsStarted = true;
- }
- }
-
- public void Stop()
- {
- if (IsStarted)
- {
- _engine.Stop();
- IsStarted = false;
- }
- }
-
[ExternalBridgeRequestHandlerMethod(typeof(StartRemoteDesktopSessionRequest))]
public async void OnStartRemoteDesktopSessionRequestReceived(StartRemoteDesktopSessionRequest request, String token, ExternalBridgeReceiver receiver)
{
@@ -119,10 +111,85 @@ namespace Tango.PPC.Common.RemoteDesktop
await receiver.SendGenericResponse(new StartRemoteDesktopSessionResponse()
{
FrameRate = _engine.FrameRate
- }, token, new TransportResponseConfig()
+ }, token);
+
+ if (_settings.EnableRemoteDesktop)
{
- Immediate = false,
- });
+ if (!_engine.IsStarted)
+ {
+ _engine.Start();
+ }
+ }
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(StopRemoteDesktopSessionRequest))]
+ public async void OnStopRemoteDesktopSessionRequestReceived(StopRemoteDesktopSessionRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ var client = _clients.SingleOrDefault(x => x.Receiver == receiver);
+
+ if (client != null)
+ {
+ _clients.Remove(client);
+ }
+
+ if (_clients.Count == 0)
+ {
+ _engine.Stop();
+ }
+
+ await receiver.SendGenericResponse(new StopRemoteDesktopSessionResponse(), token);
+
+ if (client != null)
+ {
+ await receiver.SendGenericResponse(new StartRemoteDesktopSessionResponse(), client.Token, new TransportResponseConfig() { Completed = true });
+ }
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(MouseStateRequest))]
+ public async void OnMouseStateRequestReceived(MouseStateRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ MouseController.SetCursorPosition((int)request.Location.X, (int)request.Location.Y);
+
+ if (request.EventType == MouseEventType.Up || request.EventType == MouseEventType.Down)
+ {
+ MouseEventFlags flag = MouseEventFlags.LeftUp;
+
+ switch (request.EventType)
+ {
+ case MouseEventType.Down:
+ flag = request.Button == MouseButton.Right ? MouseEventFlags.RightDown : MouseEventFlags.LeftDown;
+ break;
+ case MouseEventType.Up:
+ flag = request.Button == MouseButton.Right ? MouseEventFlags.RightUp : MouseEventFlags.LeftUp;
+ break;
+ }
+
+ MouseController.MouseEvent(flag);
+ }
+ else if (request.EventType == MouseEventType.DoubleClick)
+ {
+ MouseController.MouseEvent(MouseEventFlags.LeftDown);
+ MouseController.MouseEvent(MouseEventFlags.LeftUp);
+ MouseController.MouseEvent(MouseEventFlags.LeftDown);
+ MouseController.MouseEvent(MouseEventFlags.LeftUp);
+ }
+
+ await receiver.SendGenericResponse(new MouseStateResponse(), token);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(KeyboardStateRequest))]
+ public async void OnKeyboardStateRequestReceived(KeyboardStateRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ if (request.EventType == KeyboardEventType.Down)
+ {
+ KeyboardController.KeyDown(request.Key, request.IsCtrlDown, request.IsShiftDown, request.IsAltDown);
+ }
+ else
+ {
+ KeyboardController.KeyUp(request.Key, request.IsCtrlDown, request.IsShiftDown, request.IsAltDown);
+ }
+
+ await receiver.SendGenericResponse(new KeyboardStateResponse(), token);
}
private async void _engine_FrameReceived(object sender, ScreenCaptureFrameReceivedEventArgs<RasterFrame> e)
@@ -211,6 +278,11 @@ namespace Tango.PPC.Common.RemoteDesktop
{
_clients.Remove(client);
}
+
+ if (_clients.Count == 0)
+ {
+ _engine.Stop();
+ }
}
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs
index bce1bf51e..3c23c4832 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/RemoteDesktop/IRemoteDesktopService.cs
@@ -9,7 +9,5 @@ namespace Tango.PPC.Common.RemoteDesktop
public interface IRemoteDesktopService
{
bool IsStarted { get; }
- void Start();
- void Stop();
}
}