diff --git a/Artemis/Artemis/Managers/DeviceManager.cs b/Artemis/Artemis/Managers/DeviceManager.cs
index 5e21c1579..474fe02f2 100644
--- a/Artemis/Artemis/Managers/DeviceManager.cs
+++ b/Artemis/Artemis/Managers/DeviceManager.cs
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Threading;
using System.Threading.Tasks;
using Artemis.DeviceProviders;
using Artemis.Events;
@@ -67,37 +66,20 @@ namespace Artemis.Managers
///
public async void EnableKeyboard(KeyboardProvider keyboardProvider)
{
- if (ChangingKeyboard)
+ if (keyboardProvider == null)
+ throw new ArgumentNullException(nameof(keyboardProvider));
+
+ if (ChangingKeyboard || ActiveKeyboard?.Name == keyboardProvider.Name)
return;
+ _logger.Debug("Trying to enable keyboard: {0}", keyboardProvider.Name);
+ ChangingKeyboard = true;
+
// Store the old keyboard so it can be used in the event we're raising later
var oldKeyboard = ActiveKeyboard;
- lock (this)
- {
- ChangingKeyboard = true;
-
- if (keyboardProvider == null)
- throw new ArgumentNullException(nameof(keyboardProvider));
-
- if (ActiveKeyboard?.Name == keyboardProvider.Name)
- {
- ChangingKeyboard = false;
- return;
- }
-
- var wasNull = false;
- if (ActiveKeyboard == null)
- {
- wasNull = true;
- ActiveKeyboard = keyboardProvider;
- }
-
- if (!wasNull)
- ReleaseActiveKeyboard();
- }
-
- _logger.Debug("Enabling keyboard: {0}", keyboardProvider.Name);
+ // Release the current keyboard
+ ReleaseActiveKeyboard();
// Create a dialog to let the user know Artemis hasn't frozen
ProgressDialogController dialog = null;
@@ -127,14 +109,16 @@ namespace Artemis.Managers
}
dialog?.SetMessage($"Enabling keyboard: {keyboardProvider.Name}...");
+
+ // Setup the new keyboard
ActiveKeyboard = keyboardProvider;
await ActiveKeyboard.EnableAsync(dialog);
+ EnableUsableDevices();
General.Default.LastKeyboard = ActiveKeyboard.Name;
General.Default.Save();
- EnableUsableDevices();
- _events.PublishOnUIThread(new ActiveKeyboardChanged(oldKeyboard, ActiveKeyboard));
+ await _events.PublishOnUIThreadAsync(new ActiveKeyboardChanged(oldKeyboard, ActiveKeyboard));
_logger.Debug("Enabled keyboard: {0}", keyboardProvider.Name);
if (dialog != null)
diff --git a/Artemis/Artemis/Managers/LoopManager.cs b/Artemis/Artemis/Managers/LoopManager.cs
index 759f0e1d0..73aa62ab3 100644
--- a/Artemis/Artemis/Managers/LoopManager.cs
+++ b/Artemis/Artemis/Managers/LoopManager.cs
@@ -3,6 +3,8 @@ using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Timers;
+using Artemis.Events;
+using Caliburn.Micro;
using Ninject.Extensions.Logging;
using Brush = System.Windows.Media.Brush;
@@ -11,7 +13,7 @@ namespace Artemis.Managers
///
/// Manages the main programn loop
///
- public class LoopManager : IDisposable
+ public class LoopManager : IDisposable, IHandle, IHandle
{
private readonly DeviceManager _deviceManager;
private readonly EffectManager _effectManager;
@@ -19,8 +21,9 @@ namespace Artemis.Managers
private readonly Timer _loopTimer;
private Bitmap _keyboardBitmap;
- public LoopManager(ILogger logger, EffectManager effectManager, DeviceManager deviceManager)
+ public LoopManager(IEventAggregator events, ILogger logger, EffectManager effectManager, DeviceManager deviceManager)
{
+ events.Subscribe(this);
_logger = logger;
_effectManager = effectManager;
_deviceManager = deviceManager;
@@ -77,9 +80,6 @@ namespace Artemis.Managers
_effectManager.ChangeEffect(lastEffect);
}
- // I assume that it's safe to use ActiveKeyboard and ActifeEffect here since both is checked above
- _keyboardBitmap = _deviceManager.ActiveKeyboard.KeyboardBitmap(_effectManager.ActiveEffect.KeyboardScale);
-
Running = true;
}
@@ -110,7 +110,7 @@ namespace Artemis.Managers
}
var renderEffect = _effectManager.ActiveEffect;
- if (_deviceManager.ChangingKeyboard)
+ if (_deviceManager.ChangingKeyboard || _keyboardBitmap == null)
return;
// Stop if no active keyboard
@@ -165,5 +165,17 @@ namespace Artemis.Managers
_deviceManager.ActiveKeyboard?.DrawBitmap(_keyboardBitmap);
}
}
+
+ public void Handle(ActiveKeyboardChanged message)
+ {
+ if (_deviceManager.ActiveKeyboard != null &&_effectManager.ActiveEffect != null)
+ _keyboardBitmap = _deviceManager.ActiveKeyboard.KeyboardBitmap(_effectManager.ActiveEffect.KeyboardScale);
+ }
+
+ public void Handle(ActiveEffectChanged message)
+ {
+ if (_deviceManager.ActiveKeyboard != null && _effectManager.ActiveEffect != null)
+ _keyboardBitmap = _deviceManager.ActiveKeyboard.KeyboardBitmap(_effectManager.ActiveEffect.KeyboardScale);
+ }
}
}
\ No newline at end of file