From 40fb8748e1763edae09d7579b59e06e22f260da1 Mon Sep 17 00:00:00 2001 From: Jared Goodwin Date: Sat, 14 Dec 2019 09:08:14 -0800 Subject: [PATCH] Remove static screencaster. --- .../ViewModels/MainWindowViewModel.cs | 4 +-- Desktop.Win/ViewModels/MainWindowViewModel.cs | 27 ++++++++++++++++-- .../{ScreenCaster.cs => ScreenCasterBase.cs} | 9 ++++-- ScreenCast.Core/Conductor.cs | 6 ++-- ScreenCast.Core/Sockets/CasterSocket.cs | 14 +++++----- ScreenCast.Linux/Program.cs | 3 +- .../Services/LinuxScreenCaster.cs | 10 +++++-- ScreenCast.Win/Program.cs | 28 +++++++++++++++++-- ScreenCast.Win/Services/WinScreenCaster.cs | 24 +++------------- 9 files changed, 83 insertions(+), 42 deletions(-) rename ScreenCast.Core/Capture/{ScreenCaster.cs => ScreenCasterBase.cs} (95%) diff --git a/Desktop.Unix/ViewModels/MainWindowViewModel.cs b/Desktop.Unix/ViewModels/MainWindowViewModel.cs index 5e6dd684..ffe2e1b6 100644 --- a/Desktop.Unix/ViewModels/MainWindowViewModel.cs +++ b/Desktop.Unix/ViewModels/MainWindowViewModel.cs @@ -40,7 +40,7 @@ namespace Remotely.Desktop.Unix.ViewModels new X11Input(), new LinuxAudioCapturer(), new LinuxClipboardService(), - new LinuxScreenCaster()); + new LinuxScreenCaster(new X11Capture())); Conductor.SessionIDChanged += SessionIDChanged; Conductor.ViewerRemoved += ViewerRemoved; @@ -209,7 +209,7 @@ namespace Remotely.Desktop.Unix.ViewModels } await Conductor.CasterSocket.SendCursorChange(new CursorInfo(null, Point.Empty, "default"), new List() { screenCastRequest.ViewerID }); - _ = ScreenCaster.BeginScreenCasting(screenCastRequest.ViewerID, screenCastRequest.RequesterName, capturer); + _ = Conductor.ScreenCaster.BeginScreenCasting(screenCastRequest); }); } }); diff --git a/Desktop.Win/ViewModels/MainWindowViewModel.cs b/Desktop.Win/ViewModels/MainWindowViewModel.cs index 9080f7a5..18e761a4 100644 --- a/Desktop.Win/ViewModels/MainWindowViewModel.cs +++ b/Desktop.Win/ViewModels/MainWindowViewModel.cs @@ -36,7 +36,7 @@ namespace Remotely.Desktop.Win.ViewModels new WinInput(), new WinAudioCapturer(), new WinClipboardService(), - new WinScreenCaster(CursorIconWatcher)); + new WinScreenCaster(CursorIconWatcher, GetCapturer())); Conductor.SessionIDChanged += SessionIDChanged; Conductor.ViewerRemoved += ViewerRemoved; @@ -188,6 +188,29 @@ namespace Remotely.Desktop.Win.ViewModels await Conductor?.CasterSocket?.SendCursorChange(cursor, Conductor.Viewers.Keys.ToList()); } } + + private ICapturer GetCapturer() + { + ICapturer capturer; + try + { + if (Conductor.Current.Viewers.Count == 0) + { + capturer = new DXCapture(); + } + else + { + capturer = new BitBltCapture(); + } + } + catch (Exception ex) + { + Logger.Write(ex); + capturer = new BitBltCapture(); + } + + return capturer; + } private void ScreenCastRequested(object sender, ScreenCastRequest screenCastRequest) { App.Current.Dispatcher.Invoke(() => @@ -215,7 +238,7 @@ namespace Remotely.Desktop.Win.ViewModels capturer = new BitBltCapture(); } await Conductor.CasterSocket.SendCursorChange(CursorIconWatcher.GetCurrentCursor(), new List() { screenCastRequest.ViewerID }); - _ = ScreenCaster.BeginScreenCasting(screenCastRequest.ViewerID, screenCastRequest.RequesterName, capturer); + _ = Conductor.ScreenCaster.BeginScreenCasting(screenCastRequest); }); } }); diff --git a/ScreenCast.Core/Capture/ScreenCaster.cs b/ScreenCast.Core/Capture/ScreenCasterBase.cs similarity index 95% rename from ScreenCast.Core/Capture/ScreenCaster.cs rename to ScreenCast.Core/Capture/ScreenCasterBase.cs index 685138a0..d32d6ba6 100644 --- a/ScreenCast.Core/Capture/ScreenCaster.cs +++ b/ScreenCast.Core/Capture/ScreenCasterBase.cs @@ -16,9 +16,14 @@ using Remotely.ScreenCast.Core.Interfaces; namespace Remotely.ScreenCast.Core.Capture { - public class ScreenCaster + public class ScreenCasterBase { - public static async Task BeginScreenCasting(string viewerID, + protected ICapturer Capturer { get; } + public ScreenCasterBase(ICapturer capturer) + { + Capturer = capturer; + } + public async Task BeginScreenCasting(string viewerID, string requesterName, ICapturer capturer) { diff --git a/ScreenCast.Core/Conductor.cs b/ScreenCast.Core/Conductor.cs index 2585b98c..7a06bafe 100644 --- a/ScreenCast.Core/Conductor.cs +++ b/ScreenCast.Core/Conductor.cs @@ -19,14 +19,16 @@ namespace Remotely.ScreenCast.Core public class Conductor { public static Conductor Current { get; private set; } + public IScreenCaster ScreenCaster { get; } public Conductor(IKeyboardMouseInput keyboardMouse, IAudioCapturer audioService, IClipboardService clipboardService, - IScreenCaster screenCastService) + IScreenCaster screenCaster) { Current = this; - CasterSocket = new CasterSocket(this, keyboardMouse, screenCastService, audioService, clipboardService); + ScreenCaster = screenCaster; + CasterSocket = new CasterSocket(this, keyboardMouse, screenCaster, audioService, clipboardService); } public event EventHandler ScreenCastRequested; diff --git a/ScreenCast.Core/Sockets/CasterSocket.cs b/ScreenCast.Core/Sockets/CasterSocket.cs index 2ffb186d..66af36b7 100644 --- a/ScreenCast.Core/Sockets/CasterSocket.cs +++ b/ScreenCast.Core/Sockets/CasterSocket.cs @@ -25,18 +25,18 @@ namespace Remotely.ScreenCast.Core.Sockets Conductor conductor, IKeyboardMouseInput keyboardMouseInput, IScreenCaster screenCastService, - IAudioCapturer audioService, + IAudioCapturer audioCapturer, IClipboardService clipboardService) { Conductor = conductor; KeyboardMouseInput = keyboardMouseInput; ClipboardService = clipboardService; - AudioService = audioService; - ScreenCastService = screenCastService; + AudioCapturer = audioCapturer; + ScreenCaster = screenCastService; } - public IScreenCaster ScreenCastService { get; } - private IAudioCapturer AudioService { get; } + public IScreenCaster ScreenCaster { get; } + private IAudioCapturer AudioCapturer { get; } private IClipboardService ClipboardService { get; } private Conductor Conductor { get; } private HubConnection Connection { get; set; } @@ -153,7 +153,7 @@ namespace Remotely.ScreenCast.Core.Sockets { try { - ScreenCastService.BeginScreenCasting(new ScreenCastRequest() { ViewerID = viewerID, RequesterName = requesterName }); + ScreenCaster.BeginScreenCasting(new ScreenCastRequest() { ViewerID = viewerID, RequesterName = requesterName }); } catch (Exception ex) { @@ -277,7 +277,7 @@ namespace Remotely.ScreenCast.Core.Sockets { if (Conductor.Viewers.TryGetValue(viewerID, out var viewer) && viewer.HasControl) { - AudioService.ToggleAudio(toggleOn); + AudioCapturer.ToggleAudio(toggleOn); } }); diff --git a/ScreenCast.Linux/Program.cs b/ScreenCast.Linux/Program.cs index eea33e04..3be19e46 100644 --- a/ScreenCast.Linux/Program.cs +++ b/ScreenCast.Linux/Program.cs @@ -3,6 +3,7 @@ using Remotely.ScreenCast.Core.Services; using System; using System.Threading; using Remotely.ScreenCast.Linux.Services; +using Remotely.ScreenCast.Linux.Capture; namespace Remotely.ScreenCast.Linux { @@ -18,7 +19,7 @@ namespace Remotely.ScreenCast.Linux new X11Input(), new LinuxAudioCapturer(), new LinuxClipboardService(), - new LinuxScreenCaster()); + new LinuxScreenCaster(new X11Capture())); Conductor.ProcessArgs(args); Conductor.Connect().ContinueWith(async (task) => diff --git a/ScreenCast.Linux/Services/LinuxScreenCaster.cs b/ScreenCast.Linux/Services/LinuxScreenCaster.cs index 5dea5f3e..6636221b 100644 --- a/ScreenCast.Linux/Services/LinuxScreenCaster.cs +++ b/ScreenCast.Linux/Services/LinuxScreenCaster.cs @@ -12,15 +12,19 @@ using System.Threading.Tasks; namespace Remotely.ScreenCast.Linux.Services { - public class LinuxScreenCaster : IScreenCaster + public class LinuxScreenCaster : ScreenCasterBase, IScreenCaster { + public LinuxScreenCaster(ICapturer capturer) + : base(capturer) + { + + } public async Task BeginScreenCasting(ScreenCastRequest screenCastRequest) { try { - var capturer = new X11Capture(); await Conductor.Current.CasterSocket.SendCursorChange(new CursorInfo(null, Point.Empty, "default"), new List() { screenCastRequest.ViewerID }); - _ = ScreenCaster.BeginScreenCasting(screenCastRequest.ViewerID, screenCastRequest.RequesterName, capturer); + _ = BeginScreenCasting(screenCastRequest.ViewerID, screenCastRequest.RequesterName, Capturer); } catch (Exception ex) { diff --git a/ScreenCast.Win/Program.cs b/ScreenCast.Win/Program.cs index a3a87c3e..08e2f5d0 100644 --- a/ScreenCast.Win/Program.cs +++ b/ScreenCast.Win/Program.cs @@ -8,6 +8,8 @@ using System.Threading.Tasks; using Remotely.Shared.Win32; using System.Threading; using Remotely.ScreenCast.Win.Services; +using Remotely.ScreenCast.Core.Interfaces; +using Remotely.ScreenCast.Win.Capture; namespace Remotely.ScreenCast.Win { @@ -33,7 +35,7 @@ namespace Remotely.ScreenCast.Win new WinInput(), new WinAudioCapturer(), new WinClipboardService(), - new WinScreenCaster(CursorIconWatcher)); + new WinScreenCaster(CursorIconWatcher, GetCapturer())); Conductor.ProcessArgs(args); Conductor.Connect().ContinueWith(async (task) => @@ -57,8 +59,6 @@ namespace Remotely.ScreenCast.Win } } - - private static async Task CheckForRelaunch() { @@ -102,6 +102,28 @@ namespace Remotely.ScreenCast.Win Logger.Write((Exception)e.ExceptionObject); } + private static ICapturer GetCapturer() + { + ICapturer capturer; + try + { + if (Conductor.Current.Viewers.Count == 0) + { + capturer = new DXCapture(); + } + else + { + capturer = new BitBltCapture(); + } + } + catch (Exception ex) + { + Logger.Write(ex); + capturer = new BitBltCapture(); + } + + return capturer; + } private static async Task HandleConnection(Conductor conductor) { while (true) diff --git a/ScreenCast.Win/Services/WinScreenCaster.cs b/ScreenCast.Win/Services/WinScreenCaster.cs index 3bae027d..a2ee5cf0 100644 --- a/ScreenCast.Win/Services/WinScreenCaster.cs +++ b/ScreenCast.Win/Services/WinScreenCaster.cs @@ -14,9 +14,10 @@ using Remotely.ScreenCast.Win.Capture; namespace Remotely.ScreenCast.Win.Services { - public class WinScreenCaster : IScreenCaster + public class WinScreenCaster : ScreenCasterBase, IScreenCaster { - public WinScreenCaster(CursorIconWatcher cursorIconWatcher) + public WinScreenCaster(CursorIconWatcher cursorIconWatcher, ICapturer capturer) + : base(capturer) { CursorIconWatcher = cursorIconWatcher; } @@ -25,25 +26,8 @@ namespace Remotely.ScreenCast.Win.Services public async Task BeginScreenCasting(ScreenCastRequest screenCastRequest) { - ICapturer capturer; - try - { - if (Conductor.Current.Viewers.Count == 0) - { - capturer = new DXCapture(); - } - else - { - capturer = new BitBltCapture(); - } - } - catch (Exception ex) - { - Logger.Write(ex); - capturer = new BitBltCapture(); - } await Conductor.Current.CasterSocket.SendCursorChange(CursorIconWatcher.GetCurrentCursor(), new List() { screenCastRequest.ViewerID }); - _ = ScreenCaster.BeginScreenCasting(screenCastRequest.ViewerID, screenCastRequest.RequesterName, capturer); + _ = BeginScreenCasting(screenCastRequest.ViewerID, screenCastRequest.RequesterName, Capturer); } } }