using ElectronNET.API.Entities; using ElectronNET.API.Serialization; using ElectronNET.Common; using System; using System.Text.Json; 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 => ApiEventManager.AddEvent("screen-display-added", GetHashCode(), _onDisplayAdded, value, (args) => args.Deserialize(ElectronJsonContext.Default.Display)); remove => ApiEventManager.RemoveEvent("screen-display-added", GetHashCode(), _onDisplayAdded, value); } private event Action _onDisplayAdded; /// /// Emitted when oldDisplay has been removed. /// public event Action OnDisplayRemoved { add => ApiEventManager.AddEvent("screen-display-removed", GetHashCode(), _onDisplayRemoved, value, (args) => args.Deserialize(ElectronJsonContext.Default.Display)); remove => ApiEventManager.RemoveEvent("screen-display-removed", GetHashCode(), _onDisplayRemoved, value); } 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 => ApiEventManager.AddScreenEvent("screen-display-metrics-changed", GetHashCode(), _onDisplayMetricsChanged, value); remove => ApiEventManager.RemoveScreenEvent("screen-display-metrics-changed", GetHashCode(), _onDisplayMetricsChanged, value); } private event Action _onDisplayMetricsChanged; private static Screen _screen; private static object _syncRoot = new object(); 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() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getCursorScreenPointCompleted", (point) => { BridgeConnector.Socket.Off("screen-getCursorScreenPointCompleted"); taskCompletionSource.SetResult(point.Deserialize(ElectronJson.Options)); }); BridgeConnector.Socket.Emit("screen-getCursorScreenPoint"); return taskCompletionSource.Task; } /// /// macOS: The height of the menu bar in pixels. /// /// The height of the menu bar in pixels. public Task GetMenuBarHeightAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getMenuBarHeightCompleted", (height) => { BridgeConnector.Socket.Off("screen-getMenuBarHeightCompleted"); taskCompletionSource.SetResult(height.GetInt32()); }); BridgeConnector.Socket.Emit("screen-getMenuBarHeight"); return taskCompletionSource.Task; } /// /// The primary display. /// /// public Task GetPrimaryDisplayAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getPrimaryDisplayCompleted", (display) => { BridgeConnector.Socket.Off("screen-getPrimaryDisplayCompleted"); taskCompletionSource.SetResult(display.Deserialize(ElectronJsonContext.Default.Display)); }); BridgeConnector.Socket.Emit("screen-getPrimaryDisplay"); return taskCompletionSource.Task; } /// /// An array of displays that are currently available. /// /// An array of displays that are currently available. public Task GetAllDisplaysAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getAllDisplaysCompleted", (displays) => { BridgeConnector.Socket.Off("screen-getAllDisplaysCompleted"); taskCompletionSource.SetResult(displays.Deserialize(ElectronJson.Options)); }); BridgeConnector.Socket.Emit("screen-getAllDisplays"); return taskCompletionSource.Task; } /// /// The display nearest the specified point. /// /// The display nearest the specified point. public Task GetDisplayNearestPointAsync(Point point) { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getDisplayNearestPointCompleted", (display) => { BridgeConnector.Socket.Off("screen-getDisplayNearestPointCompleted"); taskCompletionSource.SetResult(display.Deserialize(ElectronJsonContext.Default.Display)); }); BridgeConnector.Socket.Emit("screen-getDisplayNearestPoint", point); return taskCompletionSource.Task; } /// /// The display that most closely intersects the provided bounds. /// /// /// The display that most closely intersects the provided bounds. public Task GetDisplayMatchingAsync(Rectangle rectangle) { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("screen-getDisplayMatching", (display) => { BridgeConnector.Socket.Off("screen-getDisplayMatching"); taskCompletionSource.SetResult(display.Deserialize(ElectronJsonContext.Default.Display)); }); BridgeConnector.Socket.Emit("screen-getDisplayMatching", rectangle); return taskCompletionSource.Task; } } }