using ElectronNET.API.Entities;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using System;
using System.Threading.Tasks;
namespace ElectronNET.API
{
///
/// Retrieve information about screen size, displays, cursor position, etc.
///
public sealed class Screen
{
///
/// Emitted when an new Display has been added.
///
public event Action OnDisplayAdded
{
add
{
if (_onDisplayAdded == null)
{
BridgeConnector.On("screen-display-added-event" + GetHashCode(), (display) =>
{
_onDisplayAdded(display);
});
BridgeConnector.Emit("register-screen-display-added", GetHashCode());
}
_onDisplayAdded += value;
}
remove
{
_onDisplayAdded -= value;
if (_onDisplayAdded == null)
BridgeConnector.Off("screen-display-added-event" + GetHashCode());
}
}
private event Action _onDisplayAdded;
///
/// Emitted when oldDisplay has been removed.
///
public event Action OnDisplayRemoved
{
add
{
if (_onDisplayRemoved == null)
{
BridgeConnector.On("screen-display-removed-event" + GetHashCode(), (display) =>
{
_onDisplayRemoved(display);
});
BridgeConnector.Emit("register-screen-display-removed", GetHashCode());
}
_onDisplayRemoved += value;
}
remove
{
_onDisplayRemoved -= value;
if (_onDisplayRemoved == null)
BridgeConnector.Off("screen-display-removed-event" + GetHashCode());
}
}
private event Action _onDisplayRemoved;
///
/// Emitted when one or more metrics change in a display.
/// The changedMetrics is an array of strings that describe the changes.
/// Possible changes are bounds, workArea, scaleFactor and rotation.
///
public event Action OnDisplayMetricsChanged
{
add
{
if (_onDisplayMetricsChanged == null)
{
BridgeConnector.On("screen-display-metrics-changed-event" + GetHashCode(), (args) =>
{
_onDisplayMetricsChanged(args.display, args.metrics);
});
BridgeConnector.Emit("register-screen-display-metrics-changed", GetHashCode());
}
_onDisplayMetricsChanged += value;
}
remove
{
_onDisplayMetricsChanged -= value;
if (_onDisplayMetricsChanged == null)
BridgeConnector.Off("screen-display-metrics-changed-event" + GetHashCode());
}
}
private event Action _onDisplayMetricsChanged;
private static Screen _screen;
private static readonly object _syncRoot = new();
internal Screen() { }
internal static Screen Instance
{
get
{
if (_screen == null)
{
lock (_syncRoot)
{
if (_screen == null)
{
_screen = new Screen();
}
}
}
return _screen;
}
}
///
/// The current absolute position of the mouse pointer.
///
///
public Task GetCursorScreenPointAsync() => BridgeConnector.OnResult("screen-getCursorScreenPoint", "screen-getCursorScreenPointCompleted");
///
/// macOS: The height of the menu bar in pixels.
///
/// The height of the menu bar in pixels.
public Task GetMenuBarHeightAsync() => BridgeConnector.OnResult("screen-getMenuBarHeight", "screen-getMenuBarHeightCompleted");
///
/// The primary display.
///
///
public Task GetPrimaryDisplayAsync() => BridgeConnector.OnResult("screen-getPrimaryDisplay", "screen-getPrimaryDisplayCompleted");
///
/// An array of displays that are currently available.
///
/// An array of displays that are currently available.
public Task GetAllDisplaysAsync() => BridgeConnector.OnResult("screen-getAllDisplays", "screen-getAllDisplaysCompleted");
///
/// The display nearest the specified point.
///
/// The display nearest the specified point.
public Task GetDisplayNearestPointAsync(Point point) => BridgeConnector.OnResult("screen-getDisplayNearestPoint", "screen-getDisplayNearestPointCompleted", point);
///
/// The display that most closely intersects the provided bounds.
///
///
/// The display that most closely intersects the provided bounds.
public Task GetDisplayMatchingAsync(Rectangle rectangle) => BridgeConnector.OnResult("screen-getDisplayMatching", "screen-getDisplayMatchingCompleted", rectangle);
}
}