diff --git a/Mamesaver/BlankScreen.cs b/Mamesaver/BlankScreen.cs
index 69dea49..52cddf6 100644
--- a/Mamesaver/BlankScreen.cs
+++ b/Mamesaver/BlankScreen.cs
@@ -10,7 +10,7 @@
namespace Mamesaver
{
- internal class BlankScreen
+ internal class BlankScreen : IDisposable
{
private readonly PowerManager _powerManager;
public BackgroundForm BackgroundForm { get; }
@@ -96,5 +96,21 @@ private void ReleaseDeviceContext()
Log.Error(ex, "Error releasing device context for {screen}", Screen.DeviceName);
}
}
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (!disposing) return;
+
+ _powerManager?.Dispose();
+ BackgroundForm?.Dispose();
+ }
+
+ ~BlankScreen() => Dispose(false);
}
}
\ No newline at end of file
diff --git a/Mamesaver/CaptureScreen.cs b/Mamesaver/CaptureScreen.cs
index 5dbe190..b20d39f 100644
--- a/Mamesaver/CaptureScreen.cs
+++ b/Mamesaver/CaptureScreen.cs
@@ -33,7 +33,7 @@ public void Dispose()
GC.SuppressFinalize(this);
}
- public virtual void Dispose(bool disposing) => ReleaseUnmanagedResources();
+ protected virtual void Dispose(bool disposing) => ReleaseUnmanagedResources();
~CaptureScreen() => Dispose(false);
private void ReleaseUnmanagedResources()
diff --git a/Mamesaver/GamePlayManager.cs b/Mamesaver/GamePlayManager.cs
index e60b7af..d8c3e81 100644
--- a/Mamesaver/GamePlayManager.cs
+++ b/Mamesaver/GamePlayManager.cs
@@ -26,9 +26,9 @@ internal class GamePlayManager : IDisposable
private readonly PowerManager _powerManager;
private readonly MameInvoker _invoker;
- public delegate void PlayGameEventHandler(object sender, EventArgs args);
- public delegate void StartGameEventHandler(object sender, EventArgs args);
- public delegate void GameStartedEventHandler(object sender, EventArgs args);
+ public delegate void PlayGameEventHandler(object sender, EventArgs e);
+ public delegate void StartGameEventHandler(object sender, EventArgs e);
+ public delegate void GameStartedEventHandler(object sender, EventArgs e);
///
/// Game has been started by MAME.
diff --git a/Mamesaver/MameScreen.cs b/Mamesaver/MameScreen.cs
index 10d1541..140e03d 100644
--- a/Mamesaver/MameScreen.cs
+++ b/Mamesaver/MameScreen.cs
@@ -12,7 +12,7 @@ namespace Mamesaver
/// A screen that will launch MAME with a random game from the list. If configured, this screen also handles hotkey events which
/// affect the MAME process.
///
- internal class MameScreen : BlankScreen, IDisposable
+ internal class MameScreen : BlankScreen
{
private readonly Settings _settings;
private readonly GamePlayManager _gamePlayManager;
@@ -163,8 +163,10 @@ private void GameTimerTick(object sender, EventArgs e)
/// Stop the timer, set cancelled flag, close any current process and close the background form.
/// Once this has all been done, the application should end.
///
- public virtual void Dispose(bool disposing)
+ protected override void Dispose(bool disposing)
{
+ base.Dispose(disposing);
+
if (!disposing || !_initialised) return;
Log.Information("Closing primary MAME screen {screen}", Screen.DeviceName);
@@ -187,12 +189,6 @@ private void DisposeTimers()
_gameTimer = _splashTimer = null;
}
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
~MameScreen() => Dispose(false);
}
}
\ No newline at end of file
diff --git a/Mamesaver/Power/PowerEventWatcher.cs b/Mamesaver/Power/PowerEventWatcher.cs
index 1d06f38..3adfd34 100644
--- a/Mamesaver/Power/PowerEventWatcher.cs
+++ b/Mamesaver/Power/PowerEventWatcher.cs
@@ -8,7 +8,7 @@ namespace Mamesaver.Power
/// Listens for power source change events, firing a event
/// if received.
///
- public class PowerEventWatcher
+ public class PowerEventWatcher : IDisposable
{
///
/// Value of event corresponding to a power state change.
@@ -21,7 +21,7 @@ public class PowerEventWatcher
private ManagementEventWatcher _managementEventWatcher;
public event PowerEventHandler PowerStateChanged;
- public delegate void PowerEventHandler(object sender, EventArgs args);
+ public delegate void PowerEventHandler(object sender, EventArgs e);
///
/// Initialises the power event watcher to fire
@@ -51,7 +51,7 @@ private void PowerEventArrived(object sender, EventArrivedEventArgs args)
}
}
- public virtual void Dispose(bool disposing)
+ protected virtual void Dispose(bool disposing)
{
if (!disposing) return;
diff --git a/Mamesaver/Power/PowerManager.cs b/Mamesaver/Power/PowerManager.cs
index 71a0e51..3c25e05 100644
--- a/Mamesaver/Power/PowerManager.cs
+++ b/Mamesaver/Power/PowerManager.cs
@@ -21,7 +21,7 @@ public class PowerManager : IDisposable
private readonly PowerEventWatcher _eventWatcher;
private Timer _sleepTimer;
- public delegate void SleepTriggerManager(object sender, EventArgs args);
+ public delegate void SleepTriggerManager(object sender, EventArgs e);
///
/// Fired when the screensaver should turn the display to sleep.
@@ -165,7 +165,7 @@ public void Dispose()
GC.SuppressFinalize(this);
}
- public virtual void Dispose(bool disposing)
+ protected virtual void Dispose(bool disposing)
{
if (!disposing) return;
_sleepTimer?.Dispose();
diff --git a/Mamesaver/Windows/PlatformInvokeGDI32.cs b/Mamesaver/Windows/PlatformInvokeGDI32.cs
index 10aba38..bb0b2e1 100644
--- a/Mamesaver/Windows/PlatformInvokeGDI32.cs
+++ b/Mamesaver/Windows/PlatformInvokeGDI32.cs
@@ -4,38 +4,38 @@
namespace Mamesaver.Windows
{
- public class PlatformInvokeGdi32
+ internal class PlatformInvokeGdi32
{
- public const int SRCOPY = 13369376;
+ internal const int SRCOPY = 13369376;
[DllImport("gdi32.dll", EntryPoint = "DeleteDC")]
- public static extern IntPtr DeleteDC(IntPtr hDc);
+ internal static extern IntPtr DeleteDC(IntPtr hDc);
[DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
- public static extern IntPtr DeleteObject(IntPtr hDc);
+ internal static extern IntPtr DeleteObject(IntPtr hDc);
[DllImport("gdi32.dll", EntryPoint = "BitBlt")]
- public static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, int rasterOp);
+ internal static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, int rasterOp);
[DllImport("gdi32.dll", EntryPoint = "StretchBlt")]
- public static extern bool StretchBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, int wSrc, int hSrc, int RasterOp);
+ internal static extern bool StretchBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, int wSrc, int hSrc, int RasterOp);
[DllImport("gdi32.dll")]
- public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
+ internal static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll")]
- public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
+ internal static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll", EntryPoint = "SelectObject")]
- public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
+ internal static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
- public static extern int GetDeviceCaps(IntPtr hDC, int nIndex);
+ internal static extern int GetDeviceCaps(IntPtr hDC, int nIndex);
///
/// DeviceCap - Device capabilities
///
- public enum DeviceCap
+ internal enum DeviceCap
{
///
/// Logical pixels inch in X
diff --git a/Mamesaver/Windows/PlatformInvokeUSER32.cs b/Mamesaver/Windows/PlatformInvokeUSER32.cs
index 4d94ac3..d539329 100644
--- a/Mamesaver/Windows/PlatformInvokeUSER32.cs
+++ b/Mamesaver/Windows/PlatformInvokeUSER32.cs
@@ -4,51 +4,51 @@
namespace Mamesaver.Windows
{
- public class PlatformInvokeUser32
+ internal class PlatformInvokeUser32
{
- public const int SM_CXSCREEN = 0;
- public const int SM_CYSCREEN = 1;
- public const int SW_MINIMIZE = 6;
+ internal const int SM_CXSCREEN = 0;
+ internal const int SM_CYSCREEN = 1;
+ internal const int SW_MINIMIZE = 6;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
- public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);
+ internal static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, IntPtr lParam);
[DllImport("user32.dll")]
- public static extern void SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags);
+ internal static extern void SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags);
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
- public static extern IntPtr GetDesktopWindow();
+ internal static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll", EntryPoint = "GetDC")]
- public static extern IntPtr GetDC(IntPtr ptr);
+ internal static extern IntPtr GetDC(IntPtr ptr);
[DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
- public static extern int GetSystemMetrics(int abc);
+ internal static extern int GetSystemMetrics(int abc);
[DllImport("user32.dll", EntryPoint = "GetWindowDC")]
- public static extern IntPtr GetWindowDC(Int32 ptr);
+ internal static extern IntPtr GetWindowDC(Int32 ptr);
[DllImport("user32.dll", EntryPoint = "ReleaseDC")]
- public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
+ internal static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
+ internal static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
+ internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[StructLayout(LayoutKind.Sequential)]
- public struct RECT
+ internal struct RECT
{
- public int Left; // x position of upper-left corner
- public int Top; // y position of upper-left corner
- public int Right; // x position of lower-right corner
- public int Bottom; // y position of lower-right corner
+ internal int Left; // x position of upper-left corner
+ internal int Top; // y position of upper-left corner
+ internal int Right; // x position of lower-right corner
+ internal int Bottom; // y position of lower-right corner
}
[DllImport("user32.dll")]
- public static extern bool SetProcessDPIAware();
+ internal static extern bool SetProcessDPIAware();
}
}
diff --git a/Mamesaver/Windows/UserActivityHook.cs b/Mamesaver/Windows/UserActivityHook.cs
index dda76f1..9e1a6b0 100644
--- a/Mamesaver/Windows/UserActivityHook.cs
+++ b/Mamesaver/Windows/UserActivityHook.cs
@@ -480,18 +480,21 @@ public UserActivityHook(bool InstallMouseHook, bool InstallKeyboardHook)
}
public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
{
//uninstall hooks and do not throw exceptions
- Stop(true, true, false);
+ Stop(true, true, false);
}
///
/// Destruction.
///
- ~UserActivityHook()
- {
- Dispose();
- }
+ ~UserActivityHook() => Dispose(false);
///
/// Occurs when the user moves the mouse, presses any mouse button or scrolls the wheel