mirror of
https://github.com/immense/Remotely.git
synced 2025-10-26 11:27:15 +00:00
Merged PR 9: Auto-quality tweaks.
Auto-quality updates.
This commit is contained in:
parent
af0884e260
commit
ec2ae45e88
@ -4,4 +4,7 @@
|
||||
dotnet_diagnostic.CA1416.severity = none
|
||||
|
||||
# CS1591: Missing XML comment for publicly visible type or member
|
||||
dotnet_diagnostic.CS1591.severity = none
|
||||
dotnet_diagnostic.CS1591.severity = none
|
||||
csharp_style_var_for_built_in_types=true:silent
|
||||
csharp_style_var_when_type_is_apparent=true:silent
|
||||
csharp_style_var_elsewhere=true:silent
|
||||
@ -11,8 +11,6 @@ namespace Remotely.Desktop.Core
|
||||
{
|
||||
public event EventHandler<ScreenCastRequest> ScreenCastRequested;
|
||||
|
||||
public event EventHandler<string> SessionIDChanged;
|
||||
|
||||
public event EventHandler<Services.Viewer> ViewerAdded;
|
||||
|
||||
public event EventHandler<string> ViewerRemoved;
|
||||
@ -32,11 +30,6 @@ namespace Remotely.Desktop.Core
|
||||
ScreenCastRequested?.Invoke(null, viewerIdAndRequesterName);
|
||||
}
|
||||
|
||||
public void InvokeSessionIDChanged(string sessionID)
|
||||
{
|
||||
SessionIDChanged?.Invoke(null, sessionID);
|
||||
}
|
||||
|
||||
public void InvokeViewerAdded(Services.Viewer viewer)
|
||||
{
|
||||
ViewerAdded?.Invoke(null, viewer);
|
||||
|
||||
@ -14,5 +14,6 @@ namespace Remotely.Desktop.Core.Models
|
||||
public int Left { get; init; }
|
||||
public int Height { get; init; }
|
||||
public int Width { get; init; }
|
||||
public long Sequence { get; init; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -20,14 +20,14 @@ namespace Remotely.Desktop.Core.Services
|
||||
Task DisconnectAllViewers();
|
||||
Task DisconnectViewer(Viewer viewer, bool notifyViewer);
|
||||
Task<IceServerModel[]> GetIceServers();
|
||||
Task GetSessionID();
|
||||
Task<string> GetSessionID();
|
||||
Task NotifyRequesterUnattendedReady(string requesterID);
|
||||
Task NotifyViewersRelaunchedScreenCasterReady(string[] viewerIDs);
|
||||
Task SendConnectionFailedToViewers(List<string> viewerIDs);
|
||||
Task SendConnectionRequestDenied(string viewerID);
|
||||
Task SendCtrlAltDelToAgent();
|
||||
Task SendDeviceInfo(string serviceID, string machineName, string deviceID);
|
||||
Task SendDtoToViewer<T>(T baseDto, string viewerId);
|
||||
Task SendDtoToViewer<T>(T dto, string viewerId);
|
||||
Task SendIceCandidateToBrowser(string candidate, int sdpMlineIndex, string sdpMid, string viewerConnectionID);
|
||||
Task SendMessageToViewer(string viewerID, string message);
|
||||
Task SendRtcOfferToBrowser(string sdp, string viewerID, IceServerModel[] iceServers);
|
||||
@ -108,11 +108,11 @@ namespace Remotely.Desktop.Core.Services
|
||||
}
|
||||
}
|
||||
|
||||
public async Task DisconnectViewer(Viewer viewer, bool notifyViewer)
|
||||
public Task DisconnectViewer(Viewer viewer, bool notifyViewer)
|
||||
{
|
||||
viewer.DisconnectRequested = true;
|
||||
viewer.Dispose();
|
||||
await Connection.SendAsync("DisconnectViewer", viewer.ViewerConnectionID, notifyViewer);
|
||||
return Connection.SendAsync("DisconnectViewer", viewer.ViewerConnectionID, notifyViewer);
|
||||
}
|
||||
|
||||
public async Task<IceServerModel[]> GetIceServers()
|
||||
@ -120,62 +120,62 @@ namespace Remotely.Desktop.Core.Services
|
||||
return await Connection.InvokeAsync<IceServerModel[]>("GetIceServers");
|
||||
}
|
||||
|
||||
public async Task GetSessionID()
|
||||
public async Task<string> GetSessionID()
|
||||
{
|
||||
await Connection.SendAsync("GetSessionID");
|
||||
return await Connection.InvokeAsync<string>("GetSessionID");
|
||||
}
|
||||
public async Task NotifyRequesterUnattendedReady(string requesterID)
|
||||
public Task NotifyRequesterUnattendedReady(string requesterID)
|
||||
{
|
||||
await Connection.SendAsync("NotifyRequesterUnattendedReady", requesterID);
|
||||
return Connection.SendAsync("NotifyRequesterUnattendedReady", requesterID);
|
||||
}
|
||||
|
||||
public async Task NotifyViewersRelaunchedScreenCasterReady(string[] viewerIDs)
|
||||
public Task NotifyViewersRelaunchedScreenCasterReady(string[] viewerIDs)
|
||||
{
|
||||
await Connection.SendAsync("NotifyViewersRelaunchedScreenCasterReady", viewerIDs);
|
||||
return Connection.SendAsync("NotifyViewersRelaunchedScreenCasterReady", viewerIDs);
|
||||
}
|
||||
|
||||
public async Task SendConnectionFailedToViewers(List<string> viewerIDs)
|
||||
public Task SendConnectionFailedToViewers(List<string> viewerIDs)
|
||||
{
|
||||
await Connection.SendAsync("SendConnectionFailedToViewers", viewerIDs);
|
||||
return Connection.SendAsync("SendConnectionFailedToViewers", viewerIDs);
|
||||
}
|
||||
|
||||
public async Task SendConnectionRequestDenied(string viewerID)
|
||||
public Task SendConnectionRequestDenied(string viewerID)
|
||||
{
|
||||
await Connection.SendAsync("SendConnectionRequestDenied", viewerID);
|
||||
return Connection.SendAsync("SendConnectionRequestDenied", viewerID);
|
||||
}
|
||||
|
||||
public async Task SendMessageToViewer(string viewerID, string message)
|
||||
public Task SendMessageToViewer(string viewerID, string message)
|
||||
{
|
||||
await Connection.SendAsync("SendMessageToViewer", viewerID, message);
|
||||
return Connection.SendAsync("SendMessageToViewer", viewerID, message);
|
||||
}
|
||||
|
||||
public async Task SendCtrlAltDelToAgent()
|
||||
public Task SendCtrlAltDelToAgent()
|
||||
{
|
||||
await Connection.SendAsync("SendCtrlAltDelToAgent");
|
||||
return Connection.SendAsync("SendCtrlAltDelToAgent");
|
||||
}
|
||||
|
||||
public async Task SendDeviceInfo(string serviceID, string machineName, string deviceID)
|
||||
public Task SendDeviceInfo(string serviceID, string machineName, string deviceID)
|
||||
{
|
||||
await Connection.SendAsync("ReceiveDeviceInfo", serviceID, machineName, deviceID);
|
||||
return Connection.SendAsync("ReceiveDeviceInfo", serviceID, machineName, deviceID);
|
||||
}
|
||||
|
||||
public Task SendDtoToViewer<T>(T baseDto, string viewerId)
|
||||
public Task SendDtoToViewer<T>(T dto, string viewerId)
|
||||
{
|
||||
var serializedDto = MessagePack.MessagePackSerializer.Serialize(baseDto);
|
||||
var serializedDto = MessagePack.MessagePackSerializer.Serialize(dto);
|
||||
return Connection.SendAsync("SendDtoToBrowser", serializedDto, viewerId);
|
||||
}
|
||||
public async Task SendIceCandidateToBrowser(string candidate, int sdpMlineIndex, string sdpMid, string viewerConnectionID)
|
||||
public Task SendIceCandidateToBrowser(string candidate, int sdpMlineIndex, string sdpMid, string viewerConnectionID)
|
||||
{
|
||||
await Connection.SendAsync("SendIceCandidateToBrowser", candidate, sdpMlineIndex, sdpMid, viewerConnectionID);
|
||||
return Connection.SendAsync("SendIceCandidateToBrowser", candidate, sdpMlineIndex, sdpMid, viewerConnectionID);
|
||||
}
|
||||
|
||||
public async Task SendRtcOfferToBrowser(string sdp, string viewerID, IceServerModel[] iceServers)
|
||||
public Task SendRtcOfferToBrowser(string sdp, string viewerID, IceServerModel[] iceServers)
|
||||
{
|
||||
await Connection.SendAsync("SendRtcOfferToBrowser", sdp, viewerID, iceServers);
|
||||
return Connection.SendAsync("SendRtcOfferToBrowser", sdp, viewerID, iceServers);
|
||||
}
|
||||
public async Task SendViewerConnected(string viewerConnectionId)
|
||||
public Task SendViewerConnected(string viewerConnectionId)
|
||||
{
|
||||
await Connection.SendAsync("ViewerConnected", viewerConnectionId);
|
||||
return Connection.SendAsync("ViewerConnected", viewerConnectionId);
|
||||
}
|
||||
|
||||
private void ApplyConnectionHandlers()
|
||||
@ -287,11 +287,6 @@ namespace Remotely.Desktop.Core.Services
|
||||
}
|
||||
});
|
||||
|
||||
Connection.On("SessionID", (string sessionID) =>
|
||||
{
|
||||
conductor.InvokeSessionIDChanged(sessionID);
|
||||
});
|
||||
|
||||
Connection.On("ViewerDisconnected", async (string viewerID) =>
|
||||
{
|
||||
await Connection.SendAsync("DisconnectViewer", viewerID, false);
|
||||
|
||||
@ -161,15 +161,7 @@ namespace Remotely.Desktop.Core.Services
|
||||
|
||||
private void HandleFrameReceived(Viewer viewer)
|
||||
{
|
||||
while (viewer.PendingSentFrames.Count > 0 &&
|
||||
!viewer.IsStalled &&
|
||||
viewer.IsConnected)
|
||||
{
|
||||
if (viewer.PendingSentFrames.TryDequeue(out _))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
viewer.DequeuePendingFrame();
|
||||
}
|
||||
|
||||
private void KeyDown(byte[] message)
|
||||
|
||||
@ -42,6 +42,7 @@ namespace Remotely.Desktop.Core.Services
|
||||
{
|
||||
Bitmap currentFrame = null;
|
||||
Bitmap previousFrame = null;
|
||||
long sequence = 0;
|
||||
|
||||
var viewer = ServiceContainer.Instance.GetRequiredService<Viewer>();
|
||||
viewer.Name = screenCastRequest.RequesterName;
|
||||
@ -66,11 +67,11 @@ namespace Remotely.Desktop.Core.Services
|
||||
|
||||
await viewer.SendViewerConnected();
|
||||
|
||||
await viewer.SendMachineName(Environment.MachineName);
|
||||
|
||||
await viewer.SendScreenData(
|
||||
viewer.Capturer.SelectedScreen,
|
||||
viewer.Capturer.GetDisplayNames().ToArray());
|
||||
viewer.Capturer.SelectedScreen,
|
||||
viewer.Capturer.GetDisplayNames(),
|
||||
screenBounds.Width,
|
||||
screenBounds.Height);
|
||||
|
||||
await viewer.SendScreenSize(screenBounds.Width, screenBounds.Height);
|
||||
|
||||
@ -93,7 +94,8 @@ namespace Remotely.Desktop.Core.Services
|
||||
Left = screenBounds.Left,
|
||||
Top = screenBounds.Top,
|
||||
Width = screenBounds.Width,
|
||||
Height = screenBounds.Height
|
||||
Height = screenBounds.Height,
|
||||
Sequence = sequence++
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -116,6 +118,7 @@ namespace Remotely.Desktop.Core.Services
|
||||
Thread.Sleep(100);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (viewer.IsStalled)
|
||||
{
|
||||
// Viewer isn't responding. Abort sending.
|
||||
@ -123,8 +126,6 @@ namespace Remotely.Desktop.Core.Services
|
||||
break;
|
||||
}
|
||||
|
||||
viewer.ThrottleIfNeeded();
|
||||
|
||||
if (currentFrame != null)
|
||||
{
|
||||
previousFrame?.Dispose();
|
||||
@ -149,8 +150,21 @@ namespace Remotely.Desktop.Core.Services
|
||||
viewer.Capturer.CaptureFullscreen = false;
|
||||
|
||||
using var croppedFrame = currentFrame.Clone(diffArea, currentFrame.PixelFormat);
|
||||
var encodedImageBytes = ImageUtils.EncodeJpeg(croppedFrame);
|
||||
await SendFrame(encodedImageBytes, diffArea, viewer);
|
||||
|
||||
byte[] encodedImageBytes;
|
||||
|
||||
if (viewer.ImageQuality == Viewer.DefaultQuality)
|
||||
{
|
||||
encodedImageBytes = ImageUtils.EncodeJpeg(croppedFrame);
|
||||
}
|
||||
else
|
||||
{
|
||||
encodedImageBytes = ImageUtils.EncodeJpeg(croppedFrame, viewer.ImageQuality);
|
||||
}
|
||||
|
||||
await SendFrame(encodedImageBytes, diffArea, sequence++, viewer);
|
||||
|
||||
viewer.ApplyAutoQuality();
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
@ -184,7 +198,7 @@ namespace Remotely.Desktop.Core.Services
|
||||
}
|
||||
}
|
||||
|
||||
private static async Task SendFrame(byte[] encodedImageBytes, Rectangle diffArea, Viewer viewer)
|
||||
private static async Task SendFrame(byte[] encodedImageBytes, Rectangle diffArea, long sequence, Viewer viewer)
|
||||
{
|
||||
if (encodedImageBytes.Length == 0)
|
||||
{
|
||||
@ -198,6 +212,7 @@ namespace Remotely.Desktop.Core.Services
|
||||
Left = diffArea.Left,
|
||||
Width = diffArea.Width,
|
||||
Height = diffArea.Height,
|
||||
Sequence = sequence
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -14,13 +14,23 @@ using System.Threading.Tasks;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Remotely.Desktop.Core.Services
|
||||
{
|
||||
public class Viewer : IDisposable
|
||||
{
|
||||
public const int DefaultQuality = 75;
|
||||
private const double MaxLatency = 300;
|
||||
private const double MaxMbps = 9;
|
||||
private const int MinQuality = 20;
|
||||
private readonly ConcurrentQueue<double> _sentMegabits = new();
|
||||
|
||||
private readonly ConcurrentQueue<DateTimeOffset> _sentTimestamps = new();
|
||||
|
||||
public Viewer(ICasterSocket casterSocket,
|
||||
IScreenCapturer screenCapturer,
|
||||
IScreenCapturer screenCapturer,
|
||||
IClipboardService clipboardService,
|
||||
IWebRtcSessionFactory webRtcSessionFactory,
|
||||
IAudioCapturer audioCapturer)
|
||||
@ -33,12 +43,12 @@ namespace Remotely.Desktop.Core.Services
|
||||
AudioCapturer = audioCapturer;
|
||||
AudioCapturer.AudioSampleReady += AudioCapturer_AudioSampleReady;
|
||||
}
|
||||
|
||||
public IScreenCapturer Capturer { get; }
|
||||
|
||||
public double CurrentMbps { get; private set; }
|
||||
public bool DisconnectRequested { get; set; }
|
||||
public EncoderParameters EncoderParams { get; private set; }
|
||||
public bool HasControl { get; set; } = true;
|
||||
public int ImageQuality { get; private set; } = DefaultQuality;
|
||||
public bool IsConnected => CasterSocket.IsConnected;
|
||||
|
||||
public bool IsStalled
|
||||
@ -66,9 +76,8 @@ namespace Remotely.Desktop.Core.Services
|
||||
}
|
||||
|
||||
public string Name { get; set; }
|
||||
|
||||
public ConcurrentQueue<SentFrame> PendingSentFrames { get; } = new();
|
||||
|
||||
public TimeSpan RoundTripLatency { get; private set; }
|
||||
public WebRtcSession RtcSession { get; set; }
|
||||
|
||||
public string ViewerConnectionID { get; set; }
|
||||
@ -80,6 +89,46 @@ namespace Remotely.Desktop.Core.Services
|
||||
private IClipboardService ClipboardService { get; }
|
||||
|
||||
private IWebRtcSessionFactory WebRtcSessionFactory { get; }
|
||||
public void ApplyAutoQuality()
|
||||
{
|
||||
if (ImageQuality < DefaultQuality)
|
||||
{
|
||||
ImageQuality = Math.Min(DefaultQuality, ImageQuality + 2);
|
||||
}
|
||||
|
||||
// Limit to 20 FPS.
|
||||
_ = TaskHelper.DelayUntil(() =>
|
||||
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp > TimeSpan.FromMilliseconds(50),
|
||||
TimeSpan.FromSeconds(5));
|
||||
|
||||
// Wait for pending frames to be received.
|
||||
_ = TaskHelper.DelayUntil(() =>
|
||||
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp < TimeSpan.FromSeconds(1),
|
||||
TimeSpan.FromSeconds(5));
|
||||
|
||||
// Limit max number of pending frames.
|
||||
_ = TaskHelper.DelayUntil(() => PendingSentFrames.Count < 5, TimeSpan.FromSeconds(5));
|
||||
|
||||
if (RoundTripLatency.TotalMilliseconds > MaxLatency)
|
||||
{
|
||||
ImageQuality = Math.Max(MinQuality, (int)(MaxLatency / RoundTripLatency.TotalMilliseconds * ImageQuality));
|
||||
}
|
||||
|
||||
if (CurrentMbps > MaxMbps)
|
||||
{
|
||||
var targetPercent = MaxMbps / CurrentMbps;
|
||||
ImageQuality = Math.Max(MinQuality, (int)(ImageQuality * targetPercent));
|
||||
Debug.WriteLine($"Current Mbps: {CurrentMbps}. Setting quality to {ImageQuality}");
|
||||
}
|
||||
}
|
||||
|
||||
public void DequeuePendingFrame()
|
||||
{
|
||||
if (PendingSentFrames.TryDequeue(out var frame))
|
||||
{
|
||||
RoundTripLatency = Time.Now - frame.Timestamp;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
@ -148,7 +197,6 @@ namespace Remotely.Desktop.Core.Services
|
||||
await SendToViewer(() => RtcSession.SendDto(dto),
|
||||
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
|
||||
}
|
||||
|
||||
public async Task SendFile(FileUpload fileUpload, CancellationToken cancelToken, Action<double> progressUpdateCallback)
|
||||
{
|
||||
try
|
||||
@ -207,16 +255,10 @@ namespace Remotely.Desktop.Core.Services
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendMachineName(string machineName)
|
||||
{
|
||||
var dto = new MachineNameDto(machineName);
|
||||
await SendToViewer(() => RtcSession.SendDto(dto),
|
||||
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
|
||||
}
|
||||
|
||||
public async Task SendScreenCapture(CaptureFrame screenFrame)
|
||||
{
|
||||
PendingSentFrames.Enqueue(new SentFrame(DateTimeOffset.Now, screenFrame.EncodedImageBytes.Length));
|
||||
|
||||
PendingSentFrames.Enqueue(new SentFrame(screenFrame.EncodedImageBytes.Length));
|
||||
|
||||
var left = screenFrame.Left;
|
||||
var top = screenFrame.Top;
|
||||
@ -227,37 +269,51 @@ namespace Remotely.Desktop.Core.Services
|
||||
{
|
||||
var dto = new CaptureFrameDto()
|
||||
{
|
||||
Id = screenFrame.Id,
|
||||
Left = left,
|
||||
Top = top,
|
||||
Width = width,
|
||||
Height = height,
|
||||
EndOfFrame = false,
|
||||
Sequence = screenFrame.Sequence,
|
||||
ImageBytes = screenFrame.EncodedImageBytes.Skip(i).Take(50_000).ToArray()
|
||||
};
|
||||
|
||||
await SendToViewer(() => RtcSession.SendDto(dto),
|
||||
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
|
||||
await SendToViewer(
|
||||
() => RtcSession.SendDto(dto),
|
||||
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
|
||||
}
|
||||
|
||||
var endOfFrameDto = new CaptureFrameDto()
|
||||
{
|
||||
Id = screenFrame.Id,
|
||||
Left = left,
|
||||
Top = top,
|
||||
Width = width,
|
||||
Height = height,
|
||||
EndOfFrame = true
|
||||
EndOfFrame = true,
|
||||
Sequence = screenFrame.Sequence,
|
||||
};
|
||||
|
||||
await SendToViewer(
|
||||
() => RtcSession.SendDto(endOfFrameDto),
|
||||
() => CasterSocket.SendDtoToViewer(endOfFrameDto, ViewerConnectionID));
|
||||
() => RtcSession.SendDto(endOfFrameDto),
|
||||
() => CasterSocket.SendDtoToViewer(endOfFrameDto, ViewerConnectionID));
|
||||
|
||||
UpdateMbps(screenFrame.EncodedImageBytes.Length);
|
||||
}
|
||||
|
||||
public async Task SendScreenData(string selectedScreen, string[] displayNames)
|
||||
public async Task SendScreenData(
|
||||
string selectedDisplay,
|
||||
IEnumerable<string> displayNames,
|
||||
int screenWidth,
|
||||
int screenHeight)
|
||||
{
|
||||
var dto = new ScreenDataDto(selectedScreen, displayNames);
|
||||
var dto = new ScreenDataDto()
|
||||
{
|
||||
MachineName = Environment.MachineName,
|
||||
DisplayNames = displayNames,
|
||||
SelectedDisplay = selectedDisplay,
|
||||
ScreenWidth = screenWidth,
|
||||
ScreenHeight = screenHeight
|
||||
};
|
||||
await SendToViewer(() => RtcSession.SendDto(dto),
|
||||
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
|
||||
}
|
||||
@ -273,6 +329,7 @@ namespace Remotely.Desktop.Core.Services
|
||||
{
|
||||
await CasterSocket.SendViewerConnected(ViewerConnectionID);
|
||||
}
|
||||
|
||||
public async Task SendWindowsSessions()
|
||||
{
|
||||
if (EnvironmentHelper.IsWindows)
|
||||
@ -282,20 +339,6 @@ namespace Remotely.Desktop.Core.Services
|
||||
() => CasterSocket.SendDtoToViewer(dto, ViewerConnectionID));
|
||||
}
|
||||
}
|
||||
|
||||
public void ThrottleIfNeeded()
|
||||
{
|
||||
// Limit to 20 FPS.
|
||||
TaskHelper.DelayUntil(() =>
|
||||
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp > TimeSpan.FromMilliseconds(50),
|
||||
TimeSpan.FromSeconds(5));
|
||||
|
||||
// Wait for pending frames to be received.
|
||||
TaskHelper.DelayUntil(() =>
|
||||
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp < TimeSpan.FromSeconds(1),
|
||||
TimeSpan.FromSeconds(5));
|
||||
}
|
||||
|
||||
public void ToggleWebRtcVideo(bool toggleOn)
|
||||
{
|
||||
RtcSession.ToggleWebRtcVideo(toggleOn);
|
||||
@ -330,5 +373,27 @@ namespace Remotely.Desktop.Core.Services
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateMbps(int frameSize)
|
||||
{
|
||||
while (_sentMegabits.Count > 10)
|
||||
{
|
||||
_sentMegabits.TryDequeue(out _);
|
||||
}
|
||||
while (_sentTimestamps.Count > 10)
|
||||
{
|
||||
_sentTimestamps.TryDequeue(out _);
|
||||
}
|
||||
var mb = (double)frameSize / 1024 / 1024 * 8;
|
||||
_sentMegabits.Enqueue(mb);
|
||||
_sentTimestamps.Enqueue(Time.Now);
|
||||
// Don't calculate Mbps until we have a decent sample size.
|
||||
if (_sentMegabits.Count < 5)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_sentTimestamps.TryPeek(out var oldestTime);
|
||||
CurrentMbps = _sentMegabits.Sum() / (Time.Now - oldestTime).TotalSeconds;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -128,10 +128,10 @@ namespace Remotely.Desktop.Core.Utilities
|
||||
{
|
||||
// Bounding box is valid. Padding is necessary to prevent artifacts from
|
||||
// moving windows.
|
||||
left = Math.Max(left - 5, 0);
|
||||
top = Math.Max(top - 5, 0);
|
||||
right = Math.Min(right + 5, width);
|
||||
bottom = Math.Min(bottom + 5, height);
|
||||
left = Math.Max(left - 2, 0);
|
||||
top = Math.Max(top - 2, 0);
|
||||
right = Math.Min(right + 2, width);
|
||||
bottom = Math.Min(bottom + 2, height);
|
||||
|
||||
return new Rectangle(left, top, right - left, bottom - top);
|
||||
}
|
||||
|
||||
@ -28,7 +28,8 @@ namespace Remotely.Desktop.Win.Models
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Disposer.TryDisposeAll(Adapter, Device, OutputDuplication, Texture2D);
|
||||
OutputDuplication.ReleaseFrame();
|
||||
Disposer.TryDisposeAll(OutputDuplication, Texture2D, Adapter, Device);
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
|
||||
18
Desktop.Win/Properties/PublishProfiles/install-folder.pubxml
Normal file
18
Desktop.Win/Properties/PublishProfiles/install-folder.pubxml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
https://go.microsoft.com/fwlink/?LinkID=208121.
|
||||
-->
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
<PublishDir>C:\Program Files\Remotely\Desktop</PublishDir>
|
||||
<PublishProtocol>FileSystem</PublishProtocol>
|
||||
<TargetFramework>net5.0-windows</TargetFramework>
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
<SelfContained>true</SelfContained>
|
||||
<PublishSingleFile>False</PublishSingleFile>
|
||||
<PublishReadyToRun>False</PublishReadyToRun>
|
||||
<PublishTrimmed>False</PublishTrimmed>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@ -84,13 +84,17 @@ namespace Remotely.Desktop.Win.Services
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!Win32Interop.SwitchToInputDesktop())
|
||||
{
|
||||
Logger.Write("SwitchToInputDesktop failed.", Shared.Enums.EventType.Warning);
|
||||
}
|
||||
|
||||
Win32Interop.SwitchToInputDesktop();
|
||||
|
||||
if (NeedsInit)
|
||||
{
|
||||
Logger.Write("Init needed in GetNextFrame.");
|
||||
Init();
|
||||
NeedsInit = false;
|
||||
}
|
||||
|
||||
// Sometimes DX will result in a timeout, even when there are changes
|
||||
@ -142,7 +146,10 @@ namespace Remotely.Desktop.Win.Services
|
||||
|
||||
public void Init()
|
||||
{
|
||||
Win32Interop.SwitchToInputDesktop();
|
||||
if (!Win32Interop.SwitchToInputDesktop())
|
||||
{
|
||||
Logger.Write("SwitchToInputDesktop failed.", Shared.Enums.EventType.Warning);
|
||||
}
|
||||
|
||||
CaptureFullscreen = true;
|
||||
InitBitBlt();
|
||||
@ -280,22 +287,32 @@ namespace Remotely.Desktop.Win.Services
|
||||
}
|
||||
catch (SharpDXException e)
|
||||
{
|
||||
if (e.ResultCode.Code != SharpDX.DXGI.ResultCode.WaitTimeout.Result.Code)
|
||||
if (e.ResultCode.Code == SharpDX.DXGI.ResultCode.WaitTimeout.Code)
|
||||
{
|
||||
Logger.Write(e);
|
||||
NeedsInit = true;
|
||||
return (GetDirectXFrameResult.Failure, null);
|
||||
return (GetDirectXFrameResult.Timeout, null);
|
||||
}
|
||||
return (GetDirectXFrameResult.Timeout, null);
|
||||
Logger.Write(e, "SharpDXException error.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Write(ex);
|
||||
}
|
||||
return (GetDirectXFrameResult.Failure, null);
|
||||
}
|
||||
|
||||
private void InitBitBlt()
|
||||
{
|
||||
_bitBltScreens.Clear();
|
||||
for (var i = 0; i < Screen.AllScreens.Length; i++)
|
||||
try
|
||||
{
|
||||
_bitBltScreens.Add(Screen.AllScreens[i].DeviceName, i);
|
||||
_bitBltScreens.Clear();
|
||||
for (var i = 0; i < Screen.AllScreens.Length; i++)
|
||||
{
|
||||
_bitBltScreens.Add(Screen.AllScreens[i].DeviceName, i);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Write(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@ -352,9 +369,6 @@ namespace Remotely.Desktop.Win.Services
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NeedsInit = false;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@ -26,7 +26,8 @@ namespace Remotely.Desktop.Win.ViewModels
|
||||
private readonly IConfigService _configService;
|
||||
private readonly ICursorIconWatcher _cursorIconWatcher;
|
||||
private string _host;
|
||||
private string _sessionID;
|
||||
private string _sessionId;
|
||||
private string _statusMessage;
|
||||
|
||||
public MainWindowViewModel()
|
||||
{
|
||||
@ -47,7 +48,6 @@ namespace Remotely.Desktop.Win.ViewModels
|
||||
|
||||
Services.GetRequiredService<IClipboardService>().BeginWatching();
|
||||
Services.GetRequiredService<IKeyboardMouseInput>().Init();
|
||||
_conductor.SessionIDChanged += SessionIDChanged;
|
||||
_conductor.ViewerRemoved += ViewerRemoved;
|
||||
_conductor.ViewerAdded += ViewerAdded;
|
||||
_conductor.ScreenCastRequested += ScreenCastRequested;
|
||||
@ -166,13 +166,12 @@ namespace Remotely.Desktop.Win.ViewModels
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public string SessionID
|
||||
public string StatusMessage
|
||||
{
|
||||
get => _sessionID;
|
||||
get => _statusMessage;
|
||||
set
|
||||
{
|
||||
_sessionID = value;
|
||||
_statusMessage = value;
|
||||
FirePropertyChanged();
|
||||
}
|
||||
}
|
||||
@ -181,18 +180,30 @@ namespace Remotely.Desktop.Win.ViewModels
|
||||
|
||||
public void CopyLink()
|
||||
{
|
||||
Clipboard.SetText($"{Host}/RemoteControl?sessionID={SessionID?.Replace(" ", "")}");
|
||||
Clipboard.SetText($"{Host}/RemoteControl?sessionID={StatusMessage?.Replace(" ", "")}");
|
||||
}
|
||||
|
||||
public async Task GetSessionID()
|
||||
{
|
||||
await _casterSocket.SendDeviceInfo(_conductor.ServiceID, Environment.MachineName, _conductor.DeviceID);
|
||||
await _casterSocket.GetSessionID();
|
||||
var sessionId = await _casterSocket.GetSessionID();
|
||||
|
||||
var formattedSessionID = "";
|
||||
for (var i = 0; i < sessionId.Length; i += 3)
|
||||
{
|
||||
formattedSessionID += sessionId.Substring(i, 3) + " ";
|
||||
}
|
||||
|
||||
App.Current?.Dispatcher?.Invoke(() =>
|
||||
{
|
||||
_sessionId = formattedSessionID.Trim();
|
||||
StatusMessage = _sessionId;
|
||||
});
|
||||
}
|
||||
|
||||
public async Task Init()
|
||||
{
|
||||
SessionID = "Retrieving...";
|
||||
StatusMessage = "Retrieving...";
|
||||
|
||||
Host = _configService.GetConfig().Host;
|
||||
|
||||
@ -215,7 +226,7 @@ namespace Remotely.Desktop.Win.ViewModels
|
||||
App.Current?.Dispatcher?.Invoke(() =>
|
||||
{
|
||||
Viewers.Clear();
|
||||
SessionID = "Disconnected";
|
||||
StatusMessage = "Disconnected";
|
||||
});
|
||||
return Task.CompletedTask;
|
||||
};
|
||||
@ -225,14 +236,15 @@ namespace Remotely.Desktop.Win.ViewModels
|
||||
App.Current?.Dispatcher?.Invoke(() =>
|
||||
{
|
||||
Viewers.Clear();
|
||||
SessionID = "Reconnecting";
|
||||
StatusMessage = "Reconnecting";
|
||||
});
|
||||
return Task.CompletedTask;
|
||||
};
|
||||
|
||||
_casterSocket.Connection.Reconnected += async (arg) =>
|
||||
_casterSocket.Connection.Reconnected += (id) =>
|
||||
{
|
||||
await GetSessionID();
|
||||
StatusMessage = _sessionId;
|
||||
return Task.CompletedTask;
|
||||
};
|
||||
|
||||
await DeviceInitService.GetInitParams();
|
||||
@ -249,7 +261,7 @@ namespace Remotely.Desktop.Win.ViewModels
|
||||
}
|
||||
|
||||
// If we got here, something went wrong.
|
||||
SessionID = "Failed";
|
||||
StatusMessage = "Failed";
|
||||
MessageBox.Show(Application.Current.MainWindow, "Failed to connect to server.", "Connection Failed", MessageBoxButton.OK, MessageBoxImage.Warning);
|
||||
}
|
||||
|
||||
@ -326,15 +338,6 @@ namespace Remotely.Desktop.Win.ViewModels
|
||||
}
|
||||
});
|
||||
}
|
||||
private void SessionIDChanged(object sender, string sessionID)
|
||||
{
|
||||
var formattedSessionID = "";
|
||||
for (var i = 0; i < sessionID.Length; i += 3)
|
||||
{
|
||||
formattedSessionID += sessionID.Substring(i, 3) + " ";
|
||||
}
|
||||
SessionID = formattedSessionID.Trim();
|
||||
}
|
||||
|
||||
private void ViewerAdded(object sender, Viewer viewer)
|
||||
{
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
<StackPanel Grid.Column="0" Margin="0,0,15,0">
|
||||
<TextBlock Style="{StaticResource SectionHeader}"><Run Text="Share Screen"/></TextBlock>
|
||||
<TextBlock FontSize="16" Margin="0,10,0,5"><Run Text="Your Session ID:"/></TextBlock>
|
||||
<TextBox FontSize="16" Text="{Binding SessionID}" IsReadOnly="True"/>
|
||||
<TextBox FontSize="16" Text="{Binding StatusMessage}" IsReadOnly="True"/>
|
||||
<Grid Margin="0,10,0,0">
|
||||
<TextBlock VerticalAlignment="Center">
|
||||
Invite Link:
|
||||
|
||||
@ -29,7 +29,8 @@ namespace Remotely.Desktop.XPlat.ViewModels
|
||||
private double _copyMessageOpacity;
|
||||
private string _host;
|
||||
private bool _isCopyMessageVisible;
|
||||
private string _sessionID;
|
||||
private string _sessionId;
|
||||
private string _statusMessage;
|
||||
|
||||
public MainWindowViewModel()
|
||||
{
|
||||
@ -39,7 +40,6 @@ namespace Remotely.Desktop.XPlat.ViewModels
|
||||
_conductor = Services.GetRequiredService<Conductor>();
|
||||
_casterSocket = Services.GetRequiredService<ICasterSocket>();
|
||||
|
||||
_conductor.SessionIDChanged += SessionIDChanged;
|
||||
_conductor.ViewerRemoved += ViewerRemoved;
|
||||
_conductor.ViewerAdded += ViewerAdded;
|
||||
_conductor.ScreenCastRequested += ScreenCastRequested;
|
||||
@ -70,7 +70,7 @@ namespace Remotely.Desktop.XPlat.ViewModels
|
||||
|
||||
public ICommand CopyLinkCommand => new Executor(async (param) =>
|
||||
{
|
||||
await App.Current.Clipboard.SetTextAsync($"{Host}/RemoteControl?sessionID={SessionID.Replace(" ", "")}");
|
||||
await App.Current.Clipboard.SetTextAsync($"{Host}/RemoteControl?sessionID={StatusMessage.Replace(" ", "")}");
|
||||
|
||||
CopyMessageOpacity = 1;
|
||||
IsCopyMessageVisible = true;
|
||||
@ -122,19 +122,31 @@ namespace Remotely.Desktop.XPlat.ViewModels
|
||||
await _casterSocket.DisconnectViewer(viewer, true);
|
||||
}
|
||||
});
|
||||
|
||||
public string SessionID
|
||||
public string StatusMessage
|
||||
{
|
||||
get => _sessionID;
|
||||
set => this.RaiseAndSetIfChanged(ref _sessionID, value);
|
||||
get => _statusMessage;
|
||||
set => this.RaiseAndSetIfChanged(ref _statusMessage, value);
|
||||
}
|
||||
|
||||
public ObservableCollection<Viewer> Viewers { get; } = new ObservableCollection<Viewer>();
|
||||
private static IServiceProvider Services => ServiceContainer.Instance;
|
||||
|
||||
public async Task GetSessionID()
|
||||
{
|
||||
await _casterSocket.SendDeviceInfo(_conductor.ServiceID, Environment.MachineName, _conductor.DeviceID);
|
||||
await _casterSocket.GetSessionID();
|
||||
var sessionId = await _casterSocket.GetSessionID();
|
||||
|
||||
var formattedSessionID = "";
|
||||
for (var i = 0; i < sessionId.Length; i += 3)
|
||||
{
|
||||
formattedSessionID += sessionId.Substring(i, 3) + " ";
|
||||
}
|
||||
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
_sessionId = formattedSessionID.Trim();
|
||||
StatusMessage = _sessionId;
|
||||
});
|
||||
}
|
||||
|
||||
public async Task Init()
|
||||
@ -147,11 +159,11 @@ namespace Remotely.Desktop.XPlat.ViewModels
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
SessionID = "Initializing...";
|
||||
StatusMessage = "Initializing...";
|
||||
|
||||
await InstallDependencies();
|
||||
|
||||
SessionID = "Retrieving...";
|
||||
StatusMessage = "Retrieving...";
|
||||
|
||||
Host = _configService.GetConfig().Host;
|
||||
|
||||
@ -176,7 +188,7 @@ namespace Remotely.Desktop.XPlat.ViewModels
|
||||
{
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
SessionID = "Disconnected";
|
||||
StatusMessage = "Disconnected";
|
||||
});
|
||||
};
|
||||
|
||||
@ -184,21 +196,20 @@ namespace Remotely.Desktop.XPlat.ViewModels
|
||||
{
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
SessionID = "Reconnecting";
|
||||
StatusMessage = "Reconnecting";
|
||||
});
|
||||
};
|
||||
|
||||
_casterSocket.Connection.Reconnected += async (arg) =>
|
||||
_casterSocket.Connection.Reconnected += (id) =>
|
||||
{
|
||||
await GetSessionID();
|
||||
StatusMessage = _sessionId;
|
||||
return Task.CompletedTask;
|
||||
};
|
||||
|
||||
await DeviceInitService.GetInitParams();
|
||||
|
||||
ApplyBranding();
|
||||
|
||||
await _casterSocket.SendDeviceInfo(_conductor.ServiceID, Environment.MachineName, _conductor.DeviceID);
|
||||
await _casterSocket.GetSessionID();
|
||||
await GetSessionID();
|
||||
|
||||
return;
|
||||
}
|
||||
@ -210,7 +221,7 @@ namespace Remotely.Desktop.XPlat.ViewModels
|
||||
}
|
||||
|
||||
// If we got here, something went wrong.
|
||||
_sessionID = "Failed";
|
||||
_statusMessage = "Failed";
|
||||
await MessageBox.Show("Failed to connect to server.", "Connection Failed", MessageBoxType.OK);
|
||||
}
|
||||
|
||||
@ -280,18 +291,6 @@ namespace Remotely.Desktop.XPlat.ViewModels
|
||||
}
|
||||
});
|
||||
}
|
||||
private async void SessionIDChanged(object sender, string sessionID)
|
||||
{
|
||||
await Dispatcher.UIThread.InvokeAsync(() =>
|
||||
{
|
||||
var formattedSessionID = "";
|
||||
for (var i = 0; i < sessionID.Length; i += 3)
|
||||
{
|
||||
formattedSessionID += sessionID.Substring(i, 3) + " ";
|
||||
}
|
||||
SessionID = formattedSessionID.Trim();
|
||||
});
|
||||
}
|
||||
|
||||
private void ViewerAdded(object sender, Viewer viewer)
|
||||
{
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
<StackPanel Grid.Column="0" Margin="0,0,15,0">
|
||||
<TextBlock Classes="SectionHeader">Share Screen</TextBlock>
|
||||
<TextBlock FontSize="16" Margin="0,10,0,5">Your Session ID:</TextBlock>
|
||||
<TextBox Name="SessionIDTextBox" FontSize="16" Text="{Binding SessionID}" IsReadOnly="True"/>
|
||||
<TextBox Name="SessionIDTextBox" FontSize="16" Text="{Binding StatusMessage}" IsReadOnly="True"/>
|
||||
<Grid Margin="0,10,0,0">
|
||||
<TextBlock VerticalAlignment="Center">
|
||||
Invite Link:
|
||||
|
||||
@ -61,7 +61,7 @@ namespace Remotely.Server.Hubs
|
||||
return _appConfig.IceServers;
|
||||
}
|
||||
|
||||
public Task GetSessionID()
|
||||
public string GetSessionID()
|
||||
{
|
||||
var random = new Random();
|
||||
var sessionId = "";
|
||||
@ -79,7 +79,7 @@ namespace Remotely.Server.Hubs
|
||||
|
||||
SessionInfoList[Context.ConnectionId].AttendedSessionID = sessionId;
|
||||
|
||||
return Clients.Caller.SendAsync("SessionID", sessionId);
|
||||
return sessionId;
|
||||
}
|
||||
|
||||
public Task NotifyRequesterUnattendedReady(string browserHubConnectionID)
|
||||
|
||||
@ -264,21 +264,6 @@ namespace Remotely.Server
|
||||
|
||||
private static void ConfigureStaticFiles(IApplicationBuilder app, IWebHostEnvironment env)
|
||||
{
|
||||
// TODO: This redirects downloads from the old location to the new one.
|
||||
// Remove after a few releases.
|
||||
app.Use(async (context, next) =>
|
||||
{
|
||||
if (context.Request.Path.HasValue &&
|
||||
context.Request.Path.Value.Contains("/Downloads/", StringComparison.OrdinalIgnoreCase) &&
|
||||
!context.Request.Path.Value.TrimEnd('/').EndsWith("downloads", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var redirectUrl = context.Request.GetDisplayUrl().Replace("/Downloads/", "/Content/");
|
||||
context.Response.Redirect(redirectUrl);
|
||||
return;
|
||||
}
|
||||
await next();
|
||||
});
|
||||
|
||||
var provider = new FileExtensionContentTypeProvider();
|
||||
// Add new mappings
|
||||
provider.Mappings[".ps1"] = "application/octet-stream";
|
||||
|
||||
@ -41,6 +41,7 @@ export const ViewerApp = {
|
||||
if (ViewerApp.CasterID) {
|
||||
ViewerApp.Mode = RemoteControlMode.Unattended;
|
||||
ViewerApp.ViewerHubConnection.Connect();
|
||||
UI.StatusMessage.innerHTML = "Connecting to remote device...";
|
||||
}
|
||||
else {
|
||||
UI.ConnectBox.style.removeProperty("display");
|
||||
@ -59,7 +60,7 @@ export const ViewerApp = {
|
||||
ViewerApp.RequesterName = UI.RequesterNameInput.value;
|
||||
ViewerApp.Mode = RemoteControlMode.Normal;
|
||||
ViewerApp.ViewerHubConnection.Connect();
|
||||
UI.StatusMessage.innerHTML = "Sending connection request...";
|
||||
UI.StatusMessage.innerHTML = "Request access on remote device...";
|
||||
ViewerApp.Settings.displayName = ViewerApp.RequesterName;
|
||||
SetSettings(ViewerApp.Settings);
|
||||
}
|
||||
|
||||
@ -1 +1 @@
|
||||
{"version":3,"file":"App.js","sourceRoot":"","sources":["App.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"App.js","sourceRoot":"","sources":["App.ts"],"names":[],"mappings":"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"}
|
||||
@ -48,6 +48,7 @@ export const ViewerApp = {
|
||||
if (ViewerApp.CasterID) {
|
||||
ViewerApp.Mode = RemoteControlMode.Unattended;
|
||||
ViewerApp.ViewerHubConnection.Connect();
|
||||
UI.StatusMessage.innerHTML = "Connecting to remote device...";
|
||||
}
|
||||
else {
|
||||
UI.ConnectBox.style.removeProperty("display");
|
||||
@ -67,7 +68,7 @@ export const ViewerApp = {
|
||||
ViewerApp.RequesterName = UI.RequesterNameInput.value;
|
||||
ViewerApp.Mode = RemoteControlMode.Normal;
|
||||
ViewerApp.ViewerHubConnection.Connect();
|
||||
UI.StatusMessage.innerHTML = "Sending connection request...";
|
||||
UI.StatusMessage.innerHTML = "Request access on remote device...";
|
||||
|
||||
ViewerApp.Settings.displayName = ViewerApp.RequesterName;
|
||||
SetSettings(ViewerApp.Settings);
|
||||
|
||||
76
Server/wwwroot/src/RemoteControl/CaptureProcessor.js
Normal file
76
Server/wwwroot/src/RemoteControl/CaptureProcessor.js
Normal file
@ -0,0 +1,76 @@
|
||||
import { ViewerApp } from "./App.js";
|
||||
import { Screen2DContext } from "./UI.js";
|
||||
const BitmapQueue = [];
|
||||
const ImagePartials = {};
|
||||
let CanvasLock = 1;
|
||||
let NextSequence = 0;
|
||||
export function HandleCaptureReceived(captureFrame) {
|
||||
// TODO: Move to OffscreenCanvas after it's fully supported.
|
||||
if (captureFrame.EndOfFrame) {
|
||||
var partials = ImagePartials[captureFrame.Sequence];
|
||||
let completedFrame = new Blob(partials);
|
||||
delete ImagePartials[captureFrame.Sequence];
|
||||
createImageBitmap(completedFrame).then(bitmap => {
|
||||
BitmapQueue.push({
|
||||
ImageContent: bitmap,
|
||||
FrameData: captureFrame
|
||||
});
|
||||
if (CanvasLock < 1) {
|
||||
return;
|
||||
}
|
||||
CanvasLock--;
|
||||
processQueue();
|
||||
});
|
||||
//let url = window.URL.createObjectURL(completedFrame);
|
||||
//let img = new Image(captureFrame.Width, captureFrame.Height);
|
||||
//img.onload = () => {
|
||||
// UI.Screen2DContext.drawImage(img,
|
||||
// captureFrame.Left,
|
||||
// captureFrame.Top,
|
||||
// captureFrame.Width,
|
||||
// captureFrame.Height);
|
||||
// window.URL.revokeObjectURL(url);
|
||||
//};
|
||||
}
|
||||
else {
|
||||
if (!ImagePartials[captureFrame.Sequence]) {
|
||||
ImagePartials[captureFrame.Sequence] = [];
|
||||
}
|
||||
ImagePartials[captureFrame.Sequence].push(captureFrame.ImageBytes);
|
||||
}
|
||||
}
|
||||
function processQueue() {
|
||||
try {
|
||||
if (BitmapQueue.length > 0) {
|
||||
let completedFrame = BitmapQueue.shift();
|
||||
let content = completedFrame.ImageContent;
|
||||
let data = completedFrame.FrameData;
|
||||
if (data.Sequence == 0) {
|
||||
NextSequence = 0;
|
||||
BitmapQueue.splice(0);
|
||||
}
|
||||
if (data.Sequence != NextSequence) {
|
||||
console.debug("Frame out of sequence. Putting it back in queue.");
|
||||
BitmapQueue.push(completedFrame);
|
||||
BitmapQueue.sort((a, b) => a.FrameData.Sequence - b.FrameData.Sequence);
|
||||
window.setTimeout(() => processQueue(), 1);
|
||||
return;
|
||||
}
|
||||
createImageBitmap(content).then(bitmap => {
|
||||
Screen2DContext.drawImage(bitmap, data.Left, data.Top, data.Width, data.Height);
|
||||
bitmap.close();
|
||||
ViewerApp.MessageSender.SendFrameReceived();
|
||||
NextSequence = data.Sequence + 1;
|
||||
window.setTimeout(() => processQueue(), 1);
|
||||
});
|
||||
}
|
||||
else {
|
||||
CanvasLock++;
|
||||
}
|
||||
}
|
||||
catch (ex) {
|
||||
CanvasLock = 1;
|
||||
console.error(ex);
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=CaptureProcessor.js.map
|
||||
1
Server/wwwroot/src/RemoteControl/CaptureProcessor.js.map
Normal file
1
Server/wwwroot/src/RemoteControl/CaptureProcessor.js.map
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"CaptureProcessor.js","sourceRoot":"","sources":["CaptureProcessor.ts"],"names":[],"mappings":"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"}
|
||||
97
Server/wwwroot/src/RemoteControl/CaptureProcessor.ts
Normal file
97
Server/wwwroot/src/RemoteControl/CaptureProcessor.ts
Normal file
@ -0,0 +1,97 @@
|
||||
import { ViewerApp } from "./App.js";
|
||||
import { CaptureFrameDto } from "./Interfaces/Dtos.js";
|
||||
import { CompletedFrame } from "./Models/CompletedFrame.js";
|
||||
import { Screen2DContext } from "./UI.js";
|
||||
|
||||
|
||||
const BitmapQueue: Array <CompletedFrame> =[];
|
||||
const ImagePartials: Record <string, Array<Uint8Array>> = { };
|
||||
let CanvasLock: number = 1;
|
||||
let NextSequence: number = 0;
|
||||
|
||||
export function HandleCaptureReceived(captureFrame: CaptureFrameDto) {
|
||||
// TODO: Move to OffscreenCanvas after it's fully supported.
|
||||
if (captureFrame.EndOfFrame) {
|
||||
|
||||
var partials = ImagePartials[captureFrame.Sequence];
|
||||
let completedFrame = new Blob(partials);
|
||||
delete ImagePartials[captureFrame.Sequence];
|
||||
|
||||
createImageBitmap(completedFrame).then(bitmap => {
|
||||
BitmapQueue.push({
|
||||
ImageContent: bitmap,
|
||||
FrameData: captureFrame
|
||||
});
|
||||
|
||||
if (CanvasLock < 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
CanvasLock--;
|
||||
|
||||
processQueue();
|
||||
});
|
||||
|
||||
//let url = window.URL.createObjectURL(completedFrame);
|
||||
//let img = new Image(captureFrame.Width, captureFrame.Height);
|
||||
//img.onload = () => {
|
||||
// UI.Screen2DContext.drawImage(img,
|
||||
// captureFrame.Left,
|
||||
// captureFrame.Top,
|
||||
// captureFrame.Width,
|
||||
// captureFrame.Height);
|
||||
// window.URL.revokeObjectURL(url);
|
||||
//};
|
||||
}
|
||||
else {
|
||||
if (!ImagePartials[captureFrame.Sequence]) {
|
||||
ImagePartials[captureFrame.Sequence] = [];
|
||||
}
|
||||
ImagePartials[captureFrame.Sequence].push(captureFrame.ImageBytes);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function processQueue() {
|
||||
try {
|
||||
if (BitmapQueue.length > 0) {
|
||||
let completedFrame = BitmapQueue.shift();
|
||||
let content = completedFrame.ImageContent;
|
||||
let data = completedFrame.FrameData;
|
||||
|
||||
if (data.Sequence == 0) {
|
||||
NextSequence = 0;
|
||||
BitmapQueue.splice(0);
|
||||
}
|
||||
|
||||
if (data.Sequence != NextSequence) {
|
||||
console.debug("Frame out of sequence. Putting it back in queue.")
|
||||
BitmapQueue.push(completedFrame);
|
||||
BitmapQueue.sort((a, b) => a.FrameData.Sequence - b.FrameData.Sequence);
|
||||
window.setTimeout(() => processQueue(), 1);
|
||||
return;
|
||||
}
|
||||
|
||||
createImageBitmap(content).then(bitmap => {
|
||||
Screen2DContext.drawImage(bitmap,
|
||||
data.Left,
|
||||
data.Top,
|
||||
data.Width,
|
||||
data.Height);
|
||||
|
||||
bitmap.close();
|
||||
|
||||
ViewerApp.MessageSender.SendFrameReceived();
|
||||
NextSequence = data.Sequence + 1;
|
||||
window.setTimeout(() => processQueue(), 1);
|
||||
})
|
||||
}
|
||||
else {
|
||||
CanvasLock++;
|
||||
}
|
||||
}
|
||||
catch (ex) {
|
||||
CanvasLock = 1;
|
||||
console.error(ex);
|
||||
}
|
||||
}
|
||||
@ -1,12 +1,17 @@
|
||||
import { ViewerApp } from "./App.js";
|
||||
import { ShowMessage } from "./UI.js";
|
||||
export class ClipboardWatcher {
|
||||
WatchClipboard() {
|
||||
if (navigator.clipboard.readText) {
|
||||
this.ClipboardTimer = setInterval(() => {
|
||||
if (this.PauseMonitoring) {
|
||||
if (!document.hasFocus()) {
|
||||
return;
|
||||
}
|
||||
if (!document.hasFocus()) {
|
||||
if (this.NewClipboardText && navigator.clipboard.writeText) {
|
||||
navigator.clipboard.writeText(this.NewClipboardText);
|
||||
this.LastClipboardText = this.NewClipboardText;
|
||||
this.NewClipboardText = null;
|
||||
ShowMessage("Clipboard updated.");
|
||||
return;
|
||||
}
|
||||
navigator.clipboard.readText().then(newText => {
|
||||
@ -15,19 +20,14 @@ export class ClipboardWatcher {
|
||||
ViewerApp.MessageSender.SendClipboardTransfer(newText, false);
|
||||
}
|
||||
});
|
||||
}, 100);
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
SetClipboardText(text) {
|
||||
if (text == this.LastClipboardText) {
|
||||
return;
|
||||
}
|
||||
if (navigator.clipboard.writeText) {
|
||||
this.PauseMonitoring = true;
|
||||
this.LastClipboardText = text;
|
||||
navigator.clipboard.writeText(text);
|
||||
this.PauseMonitoring = false;
|
||||
}
|
||||
this.NewClipboardText = text;
|
||||
}
|
||||
}
|
||||
//# sourceMappingURL=ClipboardWatcher.js.map
|
||||
@ -1 +1 @@
|
||||
{"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["ClipboardWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,OAAO,gBAAgB;IAKzB,cAAc;QACV,IAAI,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;YAE9B,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;gBACnC,IAAI,IAAI,CAAC,eAAe,EAAE;oBACtB,OAAO;iBACV;gBACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE;oBACtB,OAAO;iBACV;gBAED,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBAC1C,IAAI,IAAI,CAAC,iBAAiB,IAAI,OAAO,EAAE;wBACnC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;wBACjC,SAAS,CAAC,aAAa,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;qBACjE;gBACL,CAAC,CAAC,CAAA;YACN,CAAC,EAAE,GAAG,CAAC,CAAC;SACX;IACL,CAAC;IAED,gBAAgB,CAAC,IAAY;QACzB,IAAI,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAChC,OAAO;SACV;QAED,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;SAChC;IACL,CAAC;CACJ"}
|
||||
{"version":3,"file":"ClipboardWatcher.js","sourceRoot":"","sources":["ClipboardWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,OAAO,gBAAgB;IAKzB,cAAc;QACV,IAAI,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE;YAE9B,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;gBACnC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE;oBACtB,OAAO;iBACV;gBAED,IAAI,IAAI,CAAC,gBAAgB,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE;oBACxD,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBACrD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC;oBAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAC7B,WAAW,CAAC,oBAAoB,CAAC,CAAC;oBAClC,OAAO;iBACV;gBAED,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBAC1C,IAAI,IAAI,CAAC,iBAAiB,IAAI,OAAO,EAAE;wBACnC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC;wBACjC,SAAS,CAAC,aAAa,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;qBACjE;gBACL,CAAC,CAAC,CAAA;YACN,CAAC,EAAE,GAAG,CAAC,CAAC;SACX;IACL,CAAC;IAED,gBAAgB,CAAC,IAAY;QACzB,IAAI,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAChC,OAAO;SACV;QAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IACjC,CAAC;CACJ"}
|
||||
@ -1,18 +1,24 @@
|
||||
import { ViewerApp } from "./App.js";
|
||||
import { ShowMessage } from "./UI.js";
|
||||
|
||||
export class ClipboardWatcher {
|
||||
ClipboardTimer: number;
|
||||
LastClipboardText: string;
|
||||
PauseMonitoring: boolean;
|
||||
NewClipboardText: string;
|
||||
|
||||
WatchClipboard() {
|
||||
if (navigator.clipboard.readText) {
|
||||
|
||||
this.ClipboardTimer = setInterval(() => {
|
||||
if (this.PauseMonitoring) {
|
||||
if (!document.hasFocus()) {
|
||||
return;
|
||||
}
|
||||
if (!document.hasFocus()) {
|
||||
|
||||
if (this.NewClipboardText && navigator.clipboard.writeText) {
|
||||
navigator.clipboard.writeText(this.NewClipboardText);
|
||||
this.LastClipboardText = this.NewClipboardText;
|
||||
this.NewClipboardText = null;
|
||||
ShowMessage("Clipboard updated.");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -22,7 +28,7 @@ export class ClipboardWatcher {
|
||||
ViewerApp.MessageSender.SendClipboardTransfer(newText, false);
|
||||
}
|
||||
})
|
||||
}, 100);
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
|
||||
@ -31,11 +37,6 @@ export class ClipboardWatcher {
|
||||
return;
|
||||
}
|
||||
|
||||
if (navigator.clipboard.writeText) {
|
||||
this.PauseMonitoring = true;
|
||||
this.LastClipboardText = text;
|
||||
navigator.clipboard.writeText(text);
|
||||
this.PauseMonitoring = false;
|
||||
}
|
||||
this.NewClipboardText = text;
|
||||
}
|
||||
}
|
||||
@ -1,13 +1,12 @@
|
||||
import * as UI from "./UI.js";
|
||||
import { BaseDtoType } from "./Enums/BaseDtoType.js";
|
||||
import { ViewerApp } from "./App.js";
|
||||
import { ShowMessage } from "./UI.js";
|
||||
import { Sound } from "./Sound.js";
|
||||
import { ReceiveFile } from "./FileTransferService.js";
|
||||
import { HandleCaptureReceived } from "./CaptureProcessor.js";
|
||||
export class DtoMessageHandler {
|
||||
constructor() {
|
||||
this.MessagePack = window['msgpack5']();
|
||||
this.ImagePartials = {};
|
||||
}
|
||||
ParseBinaryMessage(data) {
|
||||
var model = this.MessagePack.decode(data);
|
||||
@ -24,9 +23,6 @@ export class DtoMessageHandler {
|
||||
case BaseDtoType.CursorChange:
|
||||
this.HandleCursorChange(model);
|
||||
break;
|
||||
case BaseDtoType.MachineName:
|
||||
this.HandleMachineName(model);
|
||||
break;
|
||||
case BaseDtoType.ScreenData:
|
||||
this.HandleScreenData(model);
|
||||
break;
|
||||
@ -46,37 +42,10 @@ export class DtoMessageHandler {
|
||||
Sound.Play(audioSample.Buffer);
|
||||
}
|
||||
HandleCaptureFrame(captureFrame) {
|
||||
if (captureFrame.EndOfFrame) {
|
||||
var partials = this.ImagePartials[captureFrame.Id];
|
||||
let completedFrame = new Blob(partials);
|
||||
this.ImagePartials[captureFrame.Id] = [];
|
||||
let url = window.URL.createObjectURL(completedFrame);
|
||||
let img = new Image(captureFrame.Width, captureFrame.Height);
|
||||
img.onload = () => {
|
||||
UI.Screen2DContext.drawImage(img, captureFrame.Left, captureFrame.Top, captureFrame.Width, captureFrame.Height);
|
||||
window.URL.revokeObjectURL(url);
|
||||
};
|
||||
img.src = url;
|
||||
//createImageBitmap(completedFrame).then(bitmap => {
|
||||
// UI.Screen2DContext.drawImage(bitmap,
|
||||
// captureFrame.Left,
|
||||
// captureFrame.Top,
|
||||
// captureFrame.Width,
|
||||
// captureFrame.Height);
|
||||
// bitmap.close();
|
||||
//})
|
||||
ViewerApp.MessageSender.SendFrameReceived();
|
||||
}
|
||||
else {
|
||||
if (!this.ImagePartials[captureFrame.Id]) {
|
||||
this.ImagePartials[captureFrame.Id] = [];
|
||||
}
|
||||
this.ImagePartials[captureFrame.Id].push(captureFrame.ImageBytes);
|
||||
}
|
||||
HandleCaptureReceived(captureFrame);
|
||||
}
|
||||
HandleClipboardText(clipboardText) {
|
||||
ViewerApp.ClipboardWatcher.SetClipboardText(clipboardText.ClipboardText);
|
||||
ShowMessage("Clipboard updated.");
|
||||
}
|
||||
HandleCursorChange(cursorChange) {
|
||||
UI.UpdateCursor(cursorChange.ImageBytes, cursorChange.HotSpotX, cursorChange.HotSpotY, cursorChange.CssOverride);
|
||||
@ -84,11 +53,11 @@ export class DtoMessageHandler {
|
||||
HandleFile(file) {
|
||||
ReceiveFile(file);
|
||||
}
|
||||
HandleMachineName(machineNameDto) {
|
||||
document.title = `${machineNameDto.MachineName} - Remotely Session`;
|
||||
}
|
||||
HandleScreenData(screenDataDto) {
|
||||
UI.UpdateDisplays(screenDataDto.SelectedScreen, screenDataDto.DisplayNames);
|
||||
document.title = `${screenDataDto.MachineName} - Remotely Session`;
|
||||
UI.ToggleConnectUI(false);
|
||||
UI.SetScreenSize(screenDataDto.ScreenWidth, screenDataDto.ScreenHeight);
|
||||
UI.UpdateDisplays(screenDataDto.SelectedDisplay, screenDataDto.DisplayNames);
|
||||
}
|
||||
HandleScreenSize(screenSizeDto) {
|
||||
UI.SetScreenSize(screenSizeDto.Width, screenSizeDto.Height);
|
||||
|
||||
@ -1 +1 @@
|
||||
{"version":3,"file":"DtoMessageHandler.js","sourceRoot":"","sources":["DtoMessageHandler.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"DtoMessageHandler.js","sourceRoot":"","sources":["DtoMessageHandler.ts"],"names":[],"mappings":"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"}
|
||||
@ -9,17 +9,16 @@ import {
|
||||
CaptureFrameDto,
|
||||
ClipboardTextDto,
|
||||
CursorChangeDto,
|
||||
MachineNameDto,
|
||||
ScreenDataDto,
|
||||
ScreenSizeDto,
|
||||
FileDto,
|
||||
WindowsSessionsDto
|
||||
} from "./Interfaces/Dtos.js";
|
||||
import { ReceiveFile } from "./FileTransferService.js";
|
||||
import { HandleCaptureReceived } from "./CaptureProcessor.js";
|
||||
|
||||
export class DtoMessageHandler {
|
||||
MessagePack: any = window['msgpack5']();
|
||||
ImagePartials: Record<string, Array<Uint8Array>> = {};
|
||||
|
||||
ParseBinaryMessage(data: ArrayBuffer) {
|
||||
var model = this.MessagePack.decode(data) as BaseDto;
|
||||
@ -36,9 +35,6 @@ export class DtoMessageHandler {
|
||||
case BaseDtoType.CursorChange:
|
||||
this.HandleCursorChange(model as unknown as CursorChangeDto);
|
||||
break;
|
||||
case BaseDtoType.MachineName:
|
||||
this.HandleMachineName(model as unknown as MachineNameDto);
|
||||
break;
|
||||
case BaseDtoType.ScreenData:
|
||||
this.HandleScreenData(model as unknown as ScreenDataDto);
|
||||
break;
|
||||
@ -60,48 +56,11 @@ export class DtoMessageHandler {
|
||||
}
|
||||
|
||||
HandleCaptureFrame(captureFrame: CaptureFrameDto) {
|
||||
|
||||
if (captureFrame.EndOfFrame) {
|
||||
|
||||
var partials = this.ImagePartials[captureFrame.Id];
|
||||
let completedFrame = new Blob(partials);
|
||||
this.ImagePartials[captureFrame.Id] = [];
|
||||
|
||||
let url = window.URL.createObjectURL(completedFrame);
|
||||
let img = new Image(captureFrame.Width, captureFrame.Height);
|
||||
img.onload = () => {
|
||||
UI.Screen2DContext.drawImage(img,
|
||||
captureFrame.Left,
|
||||
captureFrame.Top,
|
||||
captureFrame.Width,
|
||||
captureFrame.Height);
|
||||
window.URL.revokeObjectURL(url);
|
||||
};
|
||||
img.src = url;
|
||||
|
||||
//createImageBitmap(completedFrame).then(bitmap => {
|
||||
// UI.Screen2DContext.drawImage(bitmap,
|
||||
// captureFrame.Left,
|
||||
// captureFrame.Top,
|
||||
// captureFrame.Width,
|
||||
// captureFrame.Height);
|
||||
|
||||
// bitmap.close();
|
||||
//})
|
||||
|
||||
ViewerApp.MessageSender.SendFrameReceived();
|
||||
}
|
||||
else {
|
||||
if (!this.ImagePartials[captureFrame.Id]) {
|
||||
this.ImagePartials[captureFrame.Id] = [];
|
||||
}
|
||||
this.ImagePartials[captureFrame.Id].push(captureFrame.ImageBytes);
|
||||
}
|
||||
HandleCaptureReceived(captureFrame);
|
||||
}
|
||||
|
||||
HandleClipboardText(clipboardText: ClipboardTextDto) {
|
||||
ViewerApp.ClipboardWatcher.SetClipboardText(clipboardText.ClipboardText);
|
||||
ShowMessage("Clipboard updated.");
|
||||
}
|
||||
HandleCursorChange(cursorChange: CursorChangeDto) {
|
||||
UI.UpdateCursor(cursorChange.ImageBytes, cursorChange.HotSpotX, cursorChange.HotSpotY, cursorChange.CssOverride);
|
||||
@ -109,11 +68,11 @@ export class DtoMessageHandler {
|
||||
HandleFile(file: FileDto) {
|
||||
ReceiveFile(file);
|
||||
}
|
||||
HandleMachineName(machineNameDto: MachineNameDto) {
|
||||
document.title = `${machineNameDto.MachineName} - Remotely Session`;
|
||||
}
|
||||
HandleScreenData(screenDataDto: ScreenDataDto) {
|
||||
UI.UpdateDisplays(screenDataDto.SelectedScreen, screenDataDto.DisplayNames);
|
||||
document.title = `${screenDataDto.MachineName} - Remotely Session`;
|
||||
UI.ToggleConnectUI(false);
|
||||
UI.SetScreenSize(screenDataDto.ScreenWidth, screenDataDto.ScreenHeight);
|
||||
UI.UpdateDisplays(screenDataDto.SelectedDisplay, screenDataDto.DisplayNames);
|
||||
}
|
||||
|
||||
HandleScreenSize(screenSizeDto: ScreenSizeDto) {
|
||||
|
||||
@ -3,7 +3,6 @@ export var BaseDtoType;
|
||||
BaseDtoType[BaseDtoType["CaptureFrame"] = 0] = "CaptureFrame";
|
||||
BaseDtoType[BaseDtoType["ScreenData"] = 1] = "ScreenData";
|
||||
BaseDtoType[BaseDtoType["ScreenSize"] = 2] = "ScreenSize";
|
||||
BaseDtoType[BaseDtoType["MachineName"] = 3] = "MachineName";
|
||||
BaseDtoType[BaseDtoType["ClipboardText"] = 4] = "ClipboardText";
|
||||
BaseDtoType[BaseDtoType["AudioSample"] = 5] = "AudioSample";
|
||||
BaseDtoType[BaseDtoType["CursorChange"] = 6] = "CursorChange";
|
||||
|
||||
@ -1 +1 @@
|
||||
{"version":3,"file":"BaseDtoType.js","sourceRoot":"","sources":["BaseDtoType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,WA2BX;AA3BD,WAAY,WAAW;IACnB,6DAAgB,CAAA;IAChB,yDAAc,CAAA;IACd,yDAAc,CAAA;IACd,2DAAe,CAAA;IACf,+DAAiB,CAAA;IACjB,2DAAe,CAAA;IACf,6DAAgB,CAAA;IAChB,6DAAgB,CAAA;IAChB,uDAAa,CAAA;IACb,uDAAa,CAAA;IACb,oDAAY,CAAA;IACZ,4CAAQ,CAAA;IACR,0DAAe,CAAA;IACf,oDAAY,CAAA;IACZ,gDAAU,CAAA;IACV,0DAAe,CAAA;IACf,4DAAgB,CAAA;IAChB,sEAAqB,CAAA;IACrB,wEAAsB,CAAA;IACtB,sDAAa,CAAA;IACb,8CAAS,CAAA;IACT,oEAAoB,CAAA;IACpB,kEAAmB,CAAA;IACnB,gEAAkB,CAAA;IAClB,wEAAsB,CAAA;IACtB,kFAA2B,CAAA;AAC/B,CAAC,EA3BW,WAAW,KAAX,WAAW,QA2BtB"}
|
||||
{"version":3,"file":"BaseDtoType.js","sourceRoot":"","sources":["BaseDtoType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,WA0BX;AA1BD,WAAY,WAAW;IACnB,6DAAgB,CAAA;IAChB,yDAAc,CAAA;IACd,yDAAc,CAAA;IACd,+DAAiB,CAAA;IACjB,2DAAe,CAAA;IACf,6DAAgB,CAAA;IAChB,6DAAgB,CAAA;IAChB,uDAAa,CAAA;IACb,uDAAa,CAAA;IACb,oDAAY,CAAA;IACZ,4CAAQ,CAAA;IACR,0DAAe,CAAA;IACf,oDAAY,CAAA;IACZ,gDAAU,CAAA;IACV,0DAAe,CAAA;IACf,4DAAgB,CAAA;IAChB,sEAAqB,CAAA;IACrB,wEAAsB,CAAA;IACtB,sDAAa,CAAA;IACb,8CAAS,CAAA;IACT,oEAAoB,CAAA;IACpB,kEAAmB,CAAA;IACnB,gEAAkB,CAAA;IAClB,wEAAsB,CAAA;IACtB,kFAA2B,CAAA;AAC/B,CAAC,EA1BW,WAAW,KAAX,WAAW,QA0BtB"}
|
||||
@ -2,7 +2,6 @@
|
||||
CaptureFrame = 0,
|
||||
ScreenData = 1,
|
||||
ScreenSize = 2,
|
||||
MachineName = 3,
|
||||
ClipboardText = 4,
|
||||
AudioSample = 5,
|
||||
CursorChange = 6,
|
||||
|
||||
@ -6,7 +6,6 @@ import { RemoteControlMode } from "./Enums/RemoteControlMode.js";
|
||||
import { GetDistanceBetween } from "./Utilities.js";
|
||||
import { ShowMessage } from "./UI.js";
|
||||
import { SetSettings } from "./SettingsService.js";
|
||||
var lastPointerMove = Date.now();
|
||||
var isDragging;
|
||||
var currentPointerDevice;
|
||||
var currentTouchCount;
|
||||
@ -196,10 +195,6 @@ export function ApplyInputHandlers() {
|
||||
if (ViewerApp.ViewOnlyMode) {
|
||||
return;
|
||||
}
|
||||
if (Date.now() - lastPointerMove < 25) {
|
||||
return;
|
||||
}
|
||||
lastPointerMove = Date.now();
|
||||
var percentX = e.offsetX / viewer.clientWidth;
|
||||
var percentY = e.offsetY / viewer.clientHeight;
|
||||
ViewerApp.MessageSender.SendMouseMove(percentX, percentY);
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -41,7 +41,6 @@ import { GetDistanceBetween } from "./Utilities.js";
|
||||
import { ShowMessage } from "./UI.js";
|
||||
import { SetSettings } from "./SettingsService.js";
|
||||
|
||||
var lastPointerMove = Date.now();
|
||||
var isDragging: boolean;
|
||||
var currentPointerDevice: string;
|
||||
var currentTouchCount: number;
|
||||
@ -245,10 +244,6 @@ export function ApplyInputHandlers() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Date.now() - lastPointerMove < 25) {
|
||||
return;
|
||||
}
|
||||
lastPointerMove = Date.now();
|
||||
var percentX = e.offsetX / viewer.clientWidth;
|
||||
var percentY = e.offsetY / viewer.clientHeight;
|
||||
ViewerApp.MessageSender.SendMouseMove(percentX, percentY);
|
||||
|
||||
@ -1 +1 @@
|
||||
{"version":3,"file":"Dtos.js","sourceRoot":"","sources":["Dtos.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"Dtos.js","sourceRoot":"","sources":["Dtos.ts"],"names":[],"mappings":"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"}
|
||||
@ -8,13 +8,13 @@ export interface AudioSampleDto extends BaseDto {
|
||||
}
|
||||
|
||||
export interface CaptureFrameDto extends BaseDto {
|
||||
Id: string;
|
||||
EndOfFrame: boolean;
|
||||
Left: number;
|
||||
Top: number;
|
||||
Width: number;
|
||||
Height: number;
|
||||
ImageBytes: Uint8Array;
|
||||
Sequence: number;
|
||||
}
|
||||
|
||||
export interface ClipboardTextDto extends BaseDto {
|
||||
@ -102,10 +102,6 @@ export class KeyUpDto implements BaseDto {
|
||||
DtoType: BaseDtoType = BaseDtoType.KeyUp;
|
||||
}
|
||||
|
||||
export interface MachineNameDto extends BaseDto {
|
||||
MachineName: string;
|
||||
}
|
||||
|
||||
export class MouseDownDto implements BaseDto {
|
||||
constructor(button: number, percentX: number, percentY: number) {
|
||||
this.Button = button;
|
||||
@ -156,7 +152,10 @@ export class MouseWheelDto implements BaseDto {
|
||||
|
||||
export interface ScreenDataDto extends BaseDto {
|
||||
DisplayNames: string[];
|
||||
SelectedScreen: string;
|
||||
SelectedDisplay: string;
|
||||
MachineName: string;
|
||||
ScreenWidth: number;
|
||||
ScreenHeight: number;
|
||||
}
|
||||
|
||||
export interface ScreenSizeDto extends BaseDto {
|
||||
|
||||
@ -0,0 +1,3 @@
|
||||
export class CompletedFrame {
|
||||
}
|
||||
//# sourceMappingURL=CompletedFrame.js.map
|
||||
@ -0,0 +1 @@
|
||||
{"version":3,"file":"CompletedFrame.js","sourceRoot":"","sources":["CompletedFrame.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;CAG1B"}
|
||||
@ -0,0 +1,6 @@
|
||||
import { CaptureFrameDto } from "../Interfaces/Dtos.js";
|
||||
|
||||
export class CompletedFrame {
|
||||
ImageContent: ImageBitmap;
|
||||
FrameData: CaptureFrameDto;
|
||||
}
|
||||
@ -17,7 +17,6 @@ export class ViewerHubConnection {
|
||||
this.ApplyMessageHandlers(this.Connection);
|
||||
this.Connection.start().then(() => {
|
||||
this.SendScreenCastRequestToDevice();
|
||||
UI.ToggleConnectUI(false);
|
||||
}).catch(err => {
|
||||
console.error(err.toString());
|
||||
console.log("Connection closed.");
|
||||
|
||||
@ -1 +1 @@
|
||||
{"version":3,"file":"ViewerHubConnection.js","sourceRoot":"","sources":["ViewerHubConnection.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"ViewerHubConnection.js","sourceRoot":"","sources":["ViewerHubConnection.ts"],"names":[],"mappings":"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"}
|
||||
@ -29,7 +29,6 @@ export class ViewerHubConnection {
|
||||
|
||||
this.Connection.start().then(() => {
|
||||
this.SendScreenCastRequestToDevice();
|
||||
UI.ToggleConnectUI(false);
|
||||
}).catch(err => {
|
||||
console.error(err.toString());
|
||||
console.log("Connection closed.");
|
||||
|
||||
@ -11,8 +11,6 @@ namespace Remotely.Shared.Enums
|
||||
ScreenData = 1,
|
||||
[EnumMember(Value = "ScreenSize")]
|
||||
ScreenSize = 2,
|
||||
[EnumMember(Value = "MachineName")]
|
||||
MachineName = 3,
|
||||
[EnumMember(Value = "ClipboardText")]
|
||||
ClipboardText = 4,
|
||||
[EnumMember(Value = "AudioSample")]
|
||||
|
||||
@ -11,22 +11,22 @@ namespace Remotely.Shared.Models.RemoteControlDtos
|
||||
public new BaseDtoType DtoType { get; } = BaseDtoType.CaptureFrame;
|
||||
|
||||
[DataMember(Name = "EndOfFrame")]
|
||||
public bool EndOfFrame { get; set; }
|
||||
public bool EndOfFrame { get; init; }
|
||||
|
||||
[DataMember(Name = "Height")]
|
||||
public int Height { get; set; }
|
||||
|
||||
[DataMember(Name = "Id")]
|
||||
public Guid Id { get; set; }
|
||||
public int Height { get; init; }
|
||||
|
||||
[DataMember(Name = "ImageBytes")]
|
||||
public byte[] ImageBytes { get; set; }
|
||||
public byte[] ImageBytes { get; init; }
|
||||
|
||||
[DataMember(Name = "Left")]
|
||||
public int Left { get; set; }
|
||||
public int Left { get; init; }
|
||||
[DataMember(Name = "Top")]
|
||||
public int Top { get; set; }
|
||||
public int Top { get; init; }
|
||||
[DataMember(Name = "Width")]
|
||||
public int Width { get; set; }
|
||||
public int Width { get; init; }
|
||||
|
||||
[DataMember(Name = "Sequence")]
|
||||
public long Sequence { get; init; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,20 +0,0 @@
|
||||
using Remotely.Shared.Enums;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Remotely.Shared.Models.RemoteControlDtos
|
||||
{
|
||||
[DataContract]
|
||||
public class MachineNameDto : BaseDto
|
||||
{
|
||||
public MachineNameDto(string machineName)
|
||||
{
|
||||
MachineName = machineName;
|
||||
}
|
||||
|
||||
[DataMember(Name = "DtoType")]
|
||||
public new BaseDtoType DtoType { get; } = BaseDtoType.MachineName;
|
||||
|
||||
[DataMember(Name = "MachineName")]
|
||||
public string MachineName { get; }
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
using Remotely.Shared.Enums;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Remotely.Shared.Models.RemoteControlDtos
|
||||
@ -6,20 +7,23 @@ namespace Remotely.Shared.Models.RemoteControlDtos
|
||||
[DataContract]
|
||||
public class ScreenDataDto : BaseDto
|
||||
{
|
||||
public ScreenDataDto(string selectedScreen, string[] displayNames)
|
||||
{
|
||||
SelectedScreen = selectedScreen;
|
||||
DisplayNames = displayNames;
|
||||
}
|
||||
|
||||
[DataMember(Name = "DisplayNames")]
|
||||
public string[] DisplayNames { get; }
|
||||
public IEnumerable<string> DisplayNames { get; init; }
|
||||
|
||||
|
||||
[DataMember(Name = "DtoType")]
|
||||
public new BaseDtoType DtoType { get; } = BaseDtoType.ScreenData;
|
||||
|
||||
[DataMember(Name = "SelectedScreen")]
|
||||
public string SelectedScreen { get; }
|
||||
[DataMember(Name = "SelectedDisplay")]
|
||||
public string SelectedDisplay { get; init; }
|
||||
|
||||
[DataMember(Name = "MachineName")]
|
||||
public string MachineName { get; init; }
|
||||
|
||||
[DataMember(Name = "ScreenWidth")]
|
||||
public int ScreenWidth { get; init; }
|
||||
|
||||
[DataMember(Name = "ScreenHeight")]
|
||||
public int ScreenHeight { get; init; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using Remotely.Shared.Utilities;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@ -8,9 +9,9 @@ namespace Remotely.Shared.Models
|
||||
{
|
||||
public struct SentFrame
|
||||
{
|
||||
public SentFrame(DateTimeOffset timestamp, int frameSize)
|
||||
public SentFrame(int frameSize)
|
||||
{
|
||||
Timestamp = timestamp;
|
||||
Timestamp = Time.Now;
|
||||
FrameSize = frameSize;
|
||||
}
|
||||
|
||||
|
||||
@ -117,10 +117,10 @@ namespace Remotely.Shared.Utilities
|
||||
}
|
||||
}
|
||||
|
||||
public static void Write(Exception ex, string message, EventType eventType = EventType.Error)
|
||||
public static void Write(Exception ex, string message, EventType eventType = EventType.Error, [CallerMemberName] string callerName = "")
|
||||
{
|
||||
Write(message, eventType);
|
||||
Write(ex, eventType);
|
||||
Write(message, eventType, callerName);
|
||||
Write(ex, eventType, callerName);
|
||||
}
|
||||
|
||||
private static void CheckLogFileExists()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user