From 248ddde82bb31f39aedb9147a6d59e19cdabc857 Mon Sep 17 00:00:00 2001 From: Gregor Biswanger Date: Sat, 21 Oct 2017 04:37:01 +0200 Subject: [PATCH] implement Demo App sections: Dialogs, Menu, Tray, Shell, CrashHang, Notification, Shortcuts etc. Fix some API bugs and implement GlobalShortcut-, Shell- and WebContents-API. --- ElectronNET.API/BrowserWindow.cs | 10 +- ElectronNET.API/Electron.cs | 10 + ElectronNET.API/Entities/DevToolsMode.cs | 15 ++ ElectronNET.API/Entities/Error.cs | 7 + .../Entities/OpenDevToolsOptions.cs | 16 ++ .../Entities/OpenExternalOptions.cs | 13 + ElectronNET.API/Entities/ShortcutDetails.cs | 41 +++ .../Entities/ShortcutLinkOperation.cs | 20 ++ ElectronNET.API/GlobalShortcut.cs | 98 +++++++ ElectronNET.API/IpcMain.cs | 19 ++ ElectronNET.API/Menu.cs | 46 +++- ElectronNET.API/Shell.cs | 244 ++++++++++++++++++ ElectronNET.API/Tray.cs | 6 + ElectronNET.API/WebContents.cs | 99 +++++++ ElectronNET.CLI/Commands/BuildCommand.cs | 3 + .../Commands/StartElectronCommand.cs | 3 + ElectronNET.CLI/ElectronNET.CLI.csproj | 6 + ElectronNET.Host/api/browserWindows.js | 4 +- ElectronNET.Host/api/browserWindows.js.map | 2 +- ElectronNET.Host/api/browserWindows.ts | 5 +- ElectronNET.Host/api/globalShortcut.js | 24 ++ ElectronNET.Host/api/globalShortcut.js.map | 1 + ElectronNET.Host/api/globalShortcut.ts | 25 ++ ElectronNET.Host/api/ipc.js | 10 + ElectronNET.Host/api/ipc.js.map | 2 +- ElectronNET.Host/api/ipc.ts | 12 + ElectronNET.Host/api/menu.js | 29 +++ ElectronNET.Host/api/menu.js.map | 2 +- ElectronNET.Host/api/menu.ts | 43 ++- ElectronNET.Host/api/shell.js | 44 ++++ ElectronNET.Host/api/shell.js.map | 1 + ElectronNET.Host/api/shell.ts | 53 ++++ ElectronNET.Host/api/webContents.js | 31 +++ ElectronNET.Host/api/webContents.js.map | 1 + ElectronNET.Host/api/webContents.ts | 32 +++ ElectronNET.Host/main.js | 7 +- .../Controllers/CrashHangController.cs | 76 ++++++ .../Controllers/DialogsController.cs | 67 +++++ .../Controllers/HomeController.cs | 111 +++++++- .../Controllers/IpcController.cs | 25 ++ .../Controllers/ManageWindowsController.cs | 67 +++++ .../Controllers/MenusController.cs | 16 ++ .../Controllers/NotificationsController.cs | 40 +++ .../Controllers/ShellController.cs | 27 ++ .../Controllers/ShortcutsController.cs | 26 ++ .../Controllers/TrayController.cs | 34 +++ .../Controllers/WindowsController.cs | 5 +- ElectronNET.WebApp/ElectronNET.WebApp.csproj | 6 + .../Views/CrashHang/Index.cshtml | 113 ++++++++ .../Views/CrashHang/ProcessCrash.cshtml | 24 ++ .../Views/CrashHang/ProcessHang.cshtml | 29 +++ ElectronNET.WebApp/Views/Dialogs/Index.cshtml | 222 ++++++++++++++++ ElectronNET.WebApp/Views/Home/Index.cshtml | 8 + ElectronNET.WebApp/Views/Ipc/Index.cshtml | 104 ++++++++ ElectronNET.WebApp/Views/Menus/Index.cshtml | 189 ++++++++++++++ .../Views/Notifications/Index.cshtml | 78 ++++++ ElectronNET.WebApp/Views/Shell/Index.cshtml | 71 +++++ .../Views/Shortcuts/Index.cshtml | 74 ++++++ ElectronNET.WebApp/Views/Tray/Index.cshtml | 100 +++++++ .../Views/Windows/HandleErrorCrashes.cshtml | 1 + ElectronNET.WebApp/Views/Windows/Index.cshtml | 65 ++--- 61 files changed, 2505 insertions(+), 57 deletions(-) create mode 100644 ElectronNET.API/Entities/DevToolsMode.cs create mode 100644 ElectronNET.API/Entities/Error.cs create mode 100644 ElectronNET.API/Entities/OpenDevToolsOptions.cs create mode 100644 ElectronNET.API/Entities/OpenExternalOptions.cs create mode 100644 ElectronNET.API/Entities/ShortcutDetails.cs create mode 100644 ElectronNET.API/Entities/ShortcutLinkOperation.cs create mode 100644 ElectronNET.API/GlobalShortcut.cs create mode 100644 ElectronNET.API/Shell.cs create mode 100644 ElectronNET.API/WebContents.cs create mode 100644 ElectronNET.Host/api/globalShortcut.js create mode 100644 ElectronNET.Host/api/globalShortcut.js.map create mode 100644 ElectronNET.Host/api/globalShortcut.ts create mode 100644 ElectronNET.Host/api/shell.js create mode 100644 ElectronNET.Host/api/shell.js.map create mode 100644 ElectronNET.Host/api/shell.ts create mode 100644 ElectronNET.Host/api/webContents.js create mode 100644 ElectronNET.Host/api/webContents.js.map create mode 100644 ElectronNET.Host/api/webContents.ts create mode 100644 ElectronNET.WebApp/Controllers/CrashHangController.cs create mode 100644 ElectronNET.WebApp/Controllers/DialogsController.cs create mode 100644 ElectronNET.WebApp/Controllers/IpcController.cs create mode 100644 ElectronNET.WebApp/Controllers/ManageWindowsController.cs create mode 100644 ElectronNET.WebApp/Controllers/MenusController.cs create mode 100644 ElectronNET.WebApp/Controllers/NotificationsController.cs create mode 100644 ElectronNET.WebApp/Controllers/ShellController.cs create mode 100644 ElectronNET.WebApp/Controllers/ShortcutsController.cs create mode 100644 ElectronNET.WebApp/Controllers/TrayController.cs create mode 100644 ElectronNET.WebApp/Views/CrashHang/Index.cshtml create mode 100644 ElectronNET.WebApp/Views/CrashHang/ProcessCrash.cshtml create mode 100644 ElectronNET.WebApp/Views/CrashHang/ProcessHang.cshtml create mode 100644 ElectronNET.WebApp/Views/Dialogs/Index.cshtml create mode 100644 ElectronNET.WebApp/Views/Ipc/Index.cshtml create mode 100644 ElectronNET.WebApp/Views/Menus/Index.cshtml create mode 100644 ElectronNET.WebApp/Views/Notifications/Index.cshtml create mode 100644 ElectronNET.WebApp/Views/Shell/Index.cshtml create mode 100644 ElectronNET.WebApp/Views/Shortcuts/Index.cshtml create mode 100644 ElectronNET.WebApp/Views/Tray/Index.cshtml create mode 100644 ElectronNET.WebApp/Views/Windows/HandleErrorCrashes.cshtml diff --git a/ElectronNET.API/BrowserWindow.cs b/ElectronNET.API/BrowserWindow.cs index de023d0..77ccedf 100644 --- a/ElectronNET.API/BrowserWindow.cs +++ b/ElectronNET.API/BrowserWindow.cs @@ -156,7 +156,7 @@ namespace ElectronNET.API { if (_unresponsive == null) { - BridgeConnector.Socket.On("browserWindow-unresponsive", () => + BridgeConnector.Socket.On("browserWindow-unresponsive" + Id, () => { _unresponsive(); }); @@ -182,7 +182,7 @@ namespace ElectronNET.API { if (_responsive == null) { - BridgeConnector.Socket.On("browserWindow-responsive", () => + BridgeConnector.Socket.On("browserWindow-responsive" + Id, () => { _responsive(); }); @@ -807,6 +807,7 @@ namespace ElectronNET.API internal BrowserWindow(int id) { Id = id; + WebContents = new WebContents(id); } /// @@ -2148,6 +2149,11 @@ namespace ElectronNET.API BridgeConnector.Socket.Emit("browserWindowSetVibrancy", Id, type.GetDescription()); } + /// + /// Render and control web pages. + /// + public WebContents WebContents { get; internal set; } + private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), diff --git a/ElectronNET.API/Electron.cs b/ElectronNET.API/Electron.cs index 6002677..6e42e27 100644 --- a/ElectronNET.API/Electron.cs +++ b/ElectronNET.API/Electron.cs @@ -36,5 +36,15 @@ /// Add icons and context menus to the system’s notification area. /// public static Tray Tray { get { return Tray.Instance; } } + + /// + /// Detect keyboard events when the application does not have keyboard focus. + /// + public static GlobalShortcut GlobalShortcut { get { return GlobalShortcut.Instance; } } + + /// + /// Manage files and URLs using their default applications. + /// + public static Shell Shell { get { return Shell.Instance; } } } } diff --git a/ElectronNET.API/Entities/DevToolsMode.cs b/ElectronNET.API/Entities/DevToolsMode.cs new file mode 100644 index 0000000..b99af27 --- /dev/null +++ b/ElectronNET.API/Entities/DevToolsMode.cs @@ -0,0 +1,15 @@ +namespace ElectronNET.API.Entities +{ + /// + /// Opens the devtools with specified dock state, can be right, bottom, undocked, + /// detach.Defaults to last used dock state.In undocked mode it's possible to dock + /// back.In detach mode it's not. + /// + public enum DevToolsMode + { + right, + bottom, + undocked, + detach + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/Error.cs b/ElectronNET.API/Entities/Error.cs new file mode 100644 index 0000000..69def9c --- /dev/null +++ b/ElectronNET.API/Entities/Error.cs @@ -0,0 +1,7 @@ +namespace ElectronNET.API.Entities +{ + public class Error + { + public string Stack { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/OpenDevToolsOptions.cs b/ElectronNET.API/Entities/OpenDevToolsOptions.cs new file mode 100644 index 0000000..ebb7d32 --- /dev/null +++ b/ElectronNET.API/Entities/OpenDevToolsOptions.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace ElectronNET.API.Entities +{ + public class OpenDevToolsOptions + { + /// + /// Opens the devtools with specified dock state, can be right, bottom, undocked, + /// detach.Defaults to last used dock state.In undocked mode it's possible to dock + /// back.In detach mode it's not. + /// + [JsonConverter(typeof(StringEnumConverter))] + public DevToolsMode Mode { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/OpenExternalOptions.cs b/ElectronNET.API/Entities/OpenExternalOptions.cs new file mode 100644 index 0000000..4ad12ff --- /dev/null +++ b/ElectronNET.API/Entities/OpenExternalOptions.cs @@ -0,0 +1,13 @@ +using System.ComponentModel; + +namespace ElectronNET.API.Entities +{ + public class OpenExternalOptions + { + /// + /// true to bring the opened application to the foreground. The default is true. + /// + [DefaultValue(true)] + public bool Activate { get; set; } = true; + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/ShortcutDetails.cs b/ElectronNET.API/Entities/ShortcutDetails.cs new file mode 100644 index 0000000..accc7ac --- /dev/null +++ b/ElectronNET.API/Entities/ShortcutDetails.cs @@ -0,0 +1,41 @@ +namespace ElectronNET.API +{ + public class ShortcutDetails + { + /// + /// The Application User Model ID. Default is empty. + /// + public string AppUserModelId { get; set; } + + /// + /// The arguments to be applied to target when launching from this shortcut. Default is empty. + /// + public string Args { get; set; } + + /// + /// The working directory. Default is empty. + /// + public string Cwd { get; set; } + + /// + /// The description of the shortcut. Default is empty. + /// + public string Description { get; set; } + + /// + /// The path to the icon, can be a DLL or EXE. icon and iconIndex have to be set + /// together.Default is empty, which uses the target's icon. + /// + public string Icon { get; set; } + + /// + /// The resource ID of icon when icon is a DLL or EXE. Default is 0. + /// + public int IconIndex { get; set; } + + /// + /// The target to launch from this shortcut. + /// + public string Target { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/ShortcutLinkOperation.cs b/ElectronNET.API/Entities/ShortcutLinkOperation.cs new file mode 100644 index 0000000..258c2bb --- /dev/null +++ b/ElectronNET.API/Entities/ShortcutLinkOperation.cs @@ -0,0 +1,20 @@ +namespace ElectronNET.API +{ + public enum ShortcutLinkOperation + { + /// + /// Creates a new shortcut, overwriting if necessary. + /// + create, + + /// + /// Updates specified properties only on an existing shortcut. + /// + update, + + /// + /// Overwrites an existing shortcut, fails if the shortcut doesn’t exist. + /// + replace + } +} \ No newline at end of file diff --git a/ElectronNET.API/GlobalShortcut.cs b/ElectronNET.API/GlobalShortcut.cs new file mode 100644 index 0000000..a17668e --- /dev/null +++ b/ElectronNET.API/GlobalShortcut.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace ElectronNET.API +{ + /// + /// Detect keyboard events when the application does not have keyboard focus. + /// + public sealed class GlobalShortcut + { + private static GlobalShortcut _globalShortcut; + + internal GlobalShortcut() { } + + internal static GlobalShortcut Instance + { + get + { + if (_globalShortcut == null) + { + _globalShortcut = new GlobalShortcut(); + } + + return _globalShortcut; + } + } + + private Dictionary _shortcuts = new Dictionary(); + + /// + /// Registers a global shortcut of accelerator. + /// The callback is called when the registered shortcut is pressed by the user. + /// + /// When the accelerator is already taken by other applications, this call will + /// silently fail.This behavior is intended by operating systems, since they don’t + /// want applications to fight for global shortcuts. + /// + public void Register(string accelerator, Action function) + { + if (!_shortcuts.ContainsKey(accelerator)) + { + _shortcuts.Add(accelerator, function); + + BridgeConnector.Socket.Off("globalShortcut-pressed"); + BridgeConnector.Socket.On("globalShortcut-pressed", (shortcut) => + { + if (_shortcuts.ContainsKey(shortcut.ToString())) + { + _shortcuts[shortcut.ToString()](); + } + }); + + BridgeConnector.Socket.Emit("globalShortcut-register", accelerator); + } + } + + /// + /// When the accelerator is already taken by other applications, + /// this call will still return false. This behavior is intended by operating systems, + /// since they don’t want applications to fight for global shortcuts. + /// + /// Whether this application has registered accelerator. + public Task IsRegisteredAsync(string accelerator) + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("globalShortcut-isRegisteredCompleted", (isRegistered) => + { + BridgeConnector.Socket.Off("globalShortcut-isRegisteredCompleted"); + + taskCompletionSource.SetResult((bool)isRegistered); + }); + + BridgeConnector.Socket.Emit("globalShortcut-isRegistered", accelerator); + + return taskCompletionSource.Task; + } + + /// + /// Unregisters the global shortcut of accelerator. + /// + public void Unregister(string accelerator) + { + _shortcuts.Remove(accelerator); + BridgeConnector.Socket.Emit("globalShortcut-unregister", accelerator); + } + + /// + /// Unregisters all of the global shortcuts. + /// + public void UnregisterAll() + { + _shortcuts.Clear(); + BridgeConnector.Socket.Emit("globalShortcut-unregisterAll"); + } + } +} \ No newline at end of file diff --git a/ElectronNET.API/IpcMain.cs b/ElectronNET.API/IpcMain.cs index b0f56f9..48f9713 100644 --- a/ElectronNET.API/IpcMain.cs +++ b/ElectronNET.API/IpcMain.cs @@ -39,6 +39,25 @@ namespace ElectronNET.API BridgeConnector.Socket.On(channel, listener); } + /// + /// Send a message to the renderer process synchronously via channel, + /// you can also send arbitrary arguments. + /// + /// Note: Sending a synchronous message will block the whole renderer process, + /// unless you know what you are doing you should never use it. + /// + /// + /// + public void OnSync(string channel, Func listener) + { + BridgeConnector.Socket.Emit("registerSyncIpcMainChannel", channel); + BridgeConnector.Socket.On(channel, (args) => { + var result = listener(args); + + BridgeConnector.Socket.Emit(channel + "Sync", result); + }); + } + /// /// Adds a one time listener method for the event. This listener is invoked only /// the next time a message is sent to channel, after which it is removed. diff --git a/ElectronNET.API/Menu.cs b/ElectronNET.API/Menu.cs index e35ec4e..4d74ad3 100644 --- a/ElectronNET.API/Menu.cs +++ b/ElectronNET.API/Menu.cs @@ -4,6 +4,9 @@ using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Collections.Generic; using ElectronNET.API.Extensions; +using System.Linq; +using System.Collections.ObjectModel; +using System; namespace ElectronNET.API { @@ -26,22 +29,55 @@ namespace ElectronNET.API } } - public IReadOnlyCollection Items { get { return _items.AsReadOnly(); } } - private List _items = new List(); + public IReadOnlyCollection MenuItems { get { return _menuItems.AsReadOnly(); } } + private List _menuItems = new List(); public void SetApplicationMenu(MenuItem[] menuItems) { + _menuItems.Clear(); + menuItems.AddMenuItemsId(); BridgeConnector.Socket.Emit("menu-setApplicationMenu", JArray.FromObject(menuItems, _jsonSerializer)); - _items.AddRange(menuItems); + _menuItems.AddRange(menuItems); BridgeConnector.Socket.Off("menuItemClicked"); BridgeConnector.Socket.On("menuItemClicked", (id) => { - MenuItem menuItem = _items.GetMenuItem(id.ToString()); - menuItem?.Click(); + MenuItem menuItem = _menuItems.GetMenuItem(id.ToString()); + menuItem.Click?.Invoke(); }); } + public IReadOnlyDictionary> ContextMenuItems { get; internal set; } + private Dictionary> _contextMenuItems = new Dictionary>(); + + public void SetContextMenu(BrowserWindow browserWindow, MenuItem[] menuItems) + { + if (!_contextMenuItems.ContainsKey(browserWindow.Id)) + { + menuItems.AddMenuItemsId(); + BridgeConnector.Socket.Emit("menu-setContextMenu", browserWindow.Id, JArray.FromObject(menuItems, _jsonSerializer)); + _contextMenuItems.Add(browserWindow.Id, menuItems.ToList()); + + var x = _contextMenuItems.ToDictionary(kv => kv.Key, kv => kv.Value.AsReadOnly()); + ContextMenuItems = new ReadOnlyDictionary>(x); + + BridgeConnector.Socket.Off("contextMenuItemClicked"); + BridgeConnector.Socket.On("contextMenuItemClicked", (results) => + { + var id = ((JArray)results).First.ToString(); + var browserWindowId = (int)((JArray)results).Last; + + MenuItem menuItem = _contextMenuItems[browserWindowId].GetMenuItem(id); + menuItem.Click?.Invoke(); + }); + } + } + + public void ContextMenuPopup(BrowserWindow browserWindow) + { + BridgeConnector.Socket.Emit("menu-contextMenuPopup", browserWindow.Id); + } + private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), diff --git a/ElectronNET.API/Shell.cs b/ElectronNET.API/Shell.cs new file mode 100644 index 0000000..15406c3 --- /dev/null +++ b/ElectronNET.API/Shell.cs @@ -0,0 +1,244 @@ +using ElectronNET.API.Entities; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace ElectronNET.API +{ + /// + /// Manage files and URLs using their default applications. + /// + public sealed class Shell + { + private static Shell _shell; + + internal Shell() { } + + internal static Shell Instance + { + get + { + if (_shell == null) + { + _shell = new Shell(); + } + + return _shell; + } + } + + /// + /// Show the given file in a file manager. If possible, select the file. + /// + /// + /// Whether the item was successfully shown. + public Task ShowItemInFolderAsync(string fullPath) + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("shell-showItemInFolderCompleted", (success) => + { + BridgeConnector.Socket.Off("shell-showItemInFolderCompleted"); + + taskCompletionSource.SetResult((bool)success); + }); + + BridgeConnector.Socket.Emit("shell-showItemInFolder", fullPath); + + return taskCompletionSource.Task; + } + + /// + /// Open the given file in the desktop’s default manner. + /// + /// + /// Whether the item was successfully opened. + public Task OpenItemAsync(string fullPath) + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("shell-openItemCompleted", (success) => + { + BridgeConnector.Socket.Off("shell-openItemCompleted"); + + taskCompletionSource.SetResult((bool)success); + }); + + BridgeConnector.Socket.Emit("shell-openItem", fullPath); + + return taskCompletionSource.Task; + } + + /// + /// Open the given external protocol URL in the desktop’s default manner. + /// (For example, mailto: URLs in the user’s default mail agent). + /// + /// + /// Whether an application was available to open the URL. + /// If callback is specified, always returns true. + public Task OpenExternalAsync(string url) + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("shell-openExternalCompleted", (success) => + { + BridgeConnector.Socket.Off("shell-openExternalCompleted"); + + taskCompletionSource.SetResult((bool)success); + }); + + BridgeConnector.Socket.Emit("shell-openExternal", url); + + return taskCompletionSource.Task; + } + + /// + /// Open the given external protocol URL in the desktop’s default manner. + /// (For example, mailto: URLs in the user’s default mail agent). + /// + /// + /// macOS only + /// Whether an application was available to open the URL. + /// If callback is specified, always returns true. + public Task OpenExternalAsync(string url, OpenExternalOptions options) + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("shell-openExternalCompleted", (success) => + { + BridgeConnector.Socket.Off("shell-openExternalCompleted"); + + taskCompletionSource.SetResult((bool)success); + }); + + BridgeConnector.Socket.Emit("shell-openExternal", url, JObject.FromObject(options, _jsonSerializer)); + + return taskCompletionSource.Task; + } + + /// + /// Open the given external protocol URL in the desktop’s default manner. + /// (For example, mailto: URLs in the user’s default mail agent). + /// + /// + /// macOS only + /// macOS only + /// Whether an application was available to open the URL. + /// If callback is specified, always returns true. + public Task OpenExternalAsync(string url, OpenExternalOptions options, Action action) + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("shell-openExternalCompleted", (success) => + { + BridgeConnector.Socket.Off("shell-openExternalCompleted"); + + taskCompletionSource.SetResult((bool)success); + }); + + BridgeConnector.Socket.Off("shell-openExternalCallback"); + BridgeConnector.Socket.On("shell-openExternalCallback", (args) => { + var urlKey = ((JArray)args).First.ToString(); + var error = ((JArray)args).Last.ToObject(); + + if(_openExternalCallbacks.ContainsKey(urlKey)) + { + _openExternalCallbacks[urlKey](error); + } + }); + + _openExternalCallbacks.Add(url, action); + + BridgeConnector.Socket.Emit("shell-openExternal", url, JObject.FromObject(options, _jsonSerializer), true); + + return taskCompletionSource.Task; + } + + private Dictionary> _openExternalCallbacks = new Dictionary>(); + + /// + /// Move the given file to trash and returns a boolean status for the operation. + /// + /// + /// Whether the item was successfully moved to the trash. + public Task MoveItemToTrashAsync(string fullPath) + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("shell-moveItemToTrashCompleted", (success) => + { + BridgeConnector.Socket.Off("shell-moveItemToTrashCompleted"); + + taskCompletionSource.SetResult((bool)success); + }); + + BridgeConnector.Socket.Emit("shell-moveItemToTrash", fullPath); + + return taskCompletionSource.Task; + } + + /// + /// Play the beep sound. + /// + public void Beep() + { + BridgeConnector.Socket.Emit("shell-beep"); + } + + /// + /// Creates or updates a shortcut link at shortcutPath. + /// + /// + /// + /// + /// Whether the shortcut was created successfully. + public Task WriteShortcutLinkAsync(string shortcutPath, ShortcutLinkOperation operation, ShortcutDetails options) + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("shell-writeShortcutLinkCompleted", (success) => + { + BridgeConnector.Socket.Off("shell-writeShortcutLinkCompleted"); + + taskCompletionSource.SetResult((bool)success); + }); + + BridgeConnector.Socket.Emit("shell-writeShortcutLink", shortcutPath, operation.ToString(), JObject.FromObject(options, _jsonSerializer)); + + return taskCompletionSource.Task; + } + + /// + /// Resolves the shortcut link at shortcutPath. + /// + /// An exception will be thrown when any error happens. + /// + /// + /// + public Task ReadShortcutLinkAsync(string shortcutPath) + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("shell-readShortcutLinkCompleted", (shortcutDetails) => + { + BridgeConnector.Socket.Off("shell-readShortcutLinkCompleted"); + + taskCompletionSource.SetResult((ShortcutDetails)shortcutDetails); + }); + + BridgeConnector.Socket.Emit("shell-readShortcutLink", shortcutPath); + + return taskCompletionSource.Task; + } + + private JsonSerializer _jsonSerializer = new JsonSerializer() + { + ContractResolver = new CamelCasePropertyNamesContractResolver(), + NullValueHandling = NullValueHandling.Ignore, + DefaultValueHandling = DefaultValueHandling.Ignore + }; + } +} \ No newline at end of file diff --git a/ElectronNET.API/Tray.cs b/ElectronNET.API/Tray.cs index aa42268..fb5aac7 100644 --- a/ElectronNET.API/Tray.cs +++ b/ElectronNET.API/Tray.cs @@ -199,6 +199,11 @@ namespace ElectronNET.API public IReadOnlyCollection Items { get { return _items.AsReadOnly(); } } private List _items = new List(); + public void Show(string image, MenuItem menuItem) + { + Show(image, new MenuItem[] { menuItem }); + } + public void Show(string image, MenuItem[] menuItems) { menuItems.AddMenuItemsId(); @@ -218,6 +223,7 @@ namespace ElectronNET.API public void Destroy() { BridgeConnector.Socket.Emit("tray-destroy"); + _items.Clear(); } /// diff --git a/ElectronNET.API/WebContents.cs b/ElectronNET.API/WebContents.cs new file mode 100644 index 0000000..70fa998 --- /dev/null +++ b/ElectronNET.API/WebContents.cs @@ -0,0 +1,99 @@ +using ElectronNET.API.Entities; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using System; +using System.Diagnostics; + +namespace ElectronNET.API +{ + /// + /// Render and control web pages. + /// + public class WebContents + { + public int Id { get; private set; } + + /// + /// Emitted when the renderer process crashes or is killed. + /// + public event Action OnCrashed + { + add + { + if (_crashed == null) + { + BridgeConnector.Socket.On("webContents-crashed" + Id, (killed) => + { + _crashed((bool)killed); + }); + + BridgeConnector.Socket.Emit("register-webContents-crashed", Id); + } + _crashed += value; + } + remove + { + _crashed -= value; + } + } + + private event Action _crashed; + + /// + /// Emitted when the navigation is done, i.e. the spinner of the tab has + /// stopped spinning, and the onload event was dispatched. + /// + public event Action OnDidFinishLoad + { + add + { + if (_didFinishLoad == null) + { + BridgeConnector.Socket.On("webContents-didFinishLoad" + Id, () => + { + _didFinishLoad(); + }); + + BridgeConnector.Socket.Emit("register-webContents-didFinishLoad", Id); + } + _didFinishLoad += value; + } + remove + { + _didFinishLoad -= value; + } + } + + private event Action _didFinishLoad; + + internal WebContents(int id) + { + Id = id; + } + + /// + /// Opens the devtools. + /// + public void OpenDevTools() + { + BridgeConnector.Socket.Emit("webContentsOpenDevTools", Id); + } + + /// + /// Opens the devtools. + /// + /// + public void OpenDevTools(OpenDevToolsOptions openDevToolsOptions) + { + BridgeConnector.Socket.Emit("webContentsOpenDevTools", Id, JObject.FromObject(openDevToolsOptions, _jsonSerializer)); + } + + private JsonSerializer _jsonSerializer = new JsonSerializer() + { + ContractResolver = new CamelCasePropertyNamesContractResolver(), + NullValueHandling = NullValueHandling.Ignore, + DefaultValueHandling = DefaultValueHandling.Ignore + }; + } +} \ No newline at end of file diff --git a/ElectronNET.CLI/Commands/BuildCommand.cs b/ElectronNET.CLI/Commands/BuildCommand.cs index 757f05a..3c788ac 100644 --- a/ElectronNET.CLI/Commands/BuildCommand.cs +++ b/ElectronNET.CLI/Commands/BuildCommand.cs @@ -103,6 +103,9 @@ namespace ElectronNET.CLI.Commands EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "menu.js", "api."); EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "notification.js", "api."); EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "tray.js", "api."); + EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "webContents.js", "api."); + EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "globalShortcut.js", "api."); + EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "shell.js", "api."); Console.WriteLine("Start npm install..."); ProcessHelper.CmdExecute("npm install", tempPath); diff --git a/ElectronNET.CLI/Commands/StartElectronCommand.cs b/ElectronNET.CLI/Commands/StartElectronCommand.cs index 474e1da..3dc9213 100644 --- a/ElectronNET.CLI/Commands/StartElectronCommand.cs +++ b/ElectronNET.CLI/Commands/StartElectronCommand.cs @@ -65,6 +65,9 @@ namespace ElectronNET.CLI.Commands EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "menu.js", "api."); EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "notification.js", "api."); EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "tray.js", "api."); + EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "webContents.js", "api."); + EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "globalShortcut.js", "api."); + EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "shell.js", "api."); Console.WriteLine("Start npm install..."); ProcessHelper.CmdExecute("npm install", tempPath); diff --git a/ElectronNET.CLI/ElectronNET.CLI.csproj b/ElectronNET.CLI/ElectronNET.CLI.csproj index e82b091..7763b89 100644 --- a/ElectronNET.CLI/ElectronNET.CLI.csproj +++ b/ElectronNET.CLI/ElectronNET.CLI.csproj @@ -68,6 +68,12 @@ This package contains the dotnet tooling to electronize your application. + + + + + + diff --git a/ElectronNET.Host/api/browserWindows.js b/ElectronNET.Host/api/browserWindows.js index 43e30df..bb55ec4 100644 --- a/ElectronNET.Host/api/browserWindows.js +++ b/ElectronNET.Host/api/browserWindows.js @@ -31,12 +31,12 @@ module.exports = function (socket) { }); socket.on('register-browserWindow-unresponsive', function (id) { getWindowById(id).on('unresponsive', function () { - socket.emit('browserWindow-unresponsive'); + socket.emit('browserWindow-unresponsive' + id); }); }); socket.on('register-browserWindow-responsive', function (id) { getWindowById(id).on('responsive', function () { - socket.emit('browserWindow-responsive'); + socket.emit('browserWindow-responsive' + id); }); }); socket.on('register-browserWindow-blur', function (id) { diff --git a/ElectronNET.Host/api/browserWindows.js.map b/ElectronNET.Host/api/browserWindows.js.map index 67fa517..e2364dc 100644 --- a/ElectronNET.Host/api/browserWindows.js.map +++ b/ElectronNET.Host/api/browserWindows.js.map @@ -1 +1 @@ -{"version":3,"file":"browserWindows.js","sourceRoot":"","sources":["browserWindows.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browserWindows.js","sourceRoot":"","sources":["browserWindows.ts"],"names":[],"mappings":";;AAAA,qCAA4D;AAC5D,IAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7B,IAAM,OAAO,GAA6B,EAAE,CAAA;AAE5C,MAAM,CAAC,OAAO,GAAG,UAAC,MAAuB;IAErC,MAAM,CAAC,EAAE,CAAC,sCAAsC,EAAE,UAAC,EAAE;QACjD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,eAAe,EAAE;YAClC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,2CAA2C,EAAE,UAAC,EAAE;QACtD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,oBAAoB,EAAE,UAAC,KAAK,EAAE,KAAK;YACpD,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,UAAC,EAAE;QACzC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,UAAC,EAAE;QAC1C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE;YAC3B,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,oCAAoC,EAAE,UAAC,EAAE;QAC/C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE;YAChC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,qCAAqC,EAAE,UAAC,EAAE;QAChD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE;YACjC,MAAM,CAAC,IAAI,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mCAAmC,EAAE,UAAC,EAAE;QAC9C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE;YAC/B,MAAM,CAAC,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE;QACxC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,UAAC,EAAE;QACzC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE;QACxC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE;QACxC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,iCAAiC,EAAE,UAAC,EAAE;QAC5C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE;YAC7B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mCAAmC,EAAE,UAAC,EAAE;QAC9C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE;YAC/B,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,iCAAiC,EAAE,UAAC,EAAE;QAC5C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE;YAC7B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,gCAAgC,EAAE,UAAC,EAAE;QAC3C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE;YAC5B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,UAAC,EAAE;QAC1C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE;YAC3B,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE;QACxC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,UAAC,EAAE;QACzC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0CAA0C,EAAE,UAAC,EAAE;QACrD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,mBAAmB,EAAE;YACtC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0CAA0C,EAAE,UAAC,EAAE;QACrD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,mBAAmB,EAAE;YACtC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+CAA+C,EAAE,UAAC,EAAE;QAC1D,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+CAA+C,EAAE,UAAC,EAAE;QAC1D,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,wBAAwB,EAAE;YAC3C,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,oCAAoC,EAAE,UAAC,EAAE;QAC/C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,UAAC,KAAK,EAAE,OAAO;YAC/C,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,2CAA2C,EAAE,UAAC,EAAE;QACtD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,oBAAoB,EAAE;YACvC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yCAAyC,EAAE,UAAC,EAAE;QACpD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,kBAAkB,EAAE;YACrC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0CAA0C,EAAE,UAAC,EAAE;QACrD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,mBAAmB,EAAE;YACtC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,UAAC,EAAE;QACzC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,KAAK,EAAE,SAAS;YAC3C,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,oCAAoC,EAAE,UAAC,EAAE;QAC/C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE;YAChC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,kCAAkC,EAAE,UAAC,EAAE;QAC7C,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE;YAC9B,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,2CAA2C,EAAE,UAAC,EAAE;QACtD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,oBAAoB,EAAE;YACvC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,qBAAqB,EAAE,UAAC,OAAO,EAAE,OAAO;QAC9C,IAAI,MAAM,GAAG,IAAI,wBAAa,CAAC,OAAO,CAAC,CAAC;QAExC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAC,MAAM;;gBAEf,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,CAAC;oBACD,UAAU,CAAC,EAAE,CAAC;gBAClB,CAAC;gBAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBACb,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,2BAA2B,CAAC,CAAC,CAAC;wBAChD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;wBAEzB,IAAM,KAAG,GAAG,EAAE,CAAC;wBACf,OAAO,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,KAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAd,CAAc,CAAC,CAAC;wBACrC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAG,CAAC,CAAC;oBAC5C,CAAC;gBACL,CAAC;YACL,CAAC;gBAZO,UAAU;YADlB,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;;aAalD;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACV,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAC,EAAE;QACjC,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,oBAAoB,EAAE,UAAC,EAAE;QAC/B,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,oBAAoB,EAAE,UAAC,EAAE;QAC/B,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,UAAC,EAAE;QAC9B,aAAa,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,EAAE;QACnC,IAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE;QACrC,IAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAEpD,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,UAAC,EAAE;QAC9B,aAAa,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,UAAC,EAAE;QACtC,aAAa,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,UAAC,EAAE;QAC9B,aAAa,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,EAAE;QACnC,IAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAC,EAAE;QACjC,IAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAE5C,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,UAAC,EAAE;QAClC,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,UAAC,EAAE;QACpC,aAAa,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE;QACrC,IAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAEpD,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,UAAC,EAAE;QAClC,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAC,EAAE;QACjC,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE;QACrC,IAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAEpD,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,4BAA4B,EAAE,UAAC,EAAE,EAAE,UAAU;QACnD,aAAa,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,UAAC,EAAE;QACtC,IAAM,YAAY,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC;QAEtD,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,YAAY,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,WAAW,EAAE,SAAS;QAChE,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE,EAAE,IAAI,EAAE,WAAW;QACxD,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,UAAC,EAAE;QAC1C,aAAa,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,EAAE,EAAE,MAAM,EAAE,OAAO;QACpD,aAAa,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,EAAE;QACnC,IAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,UAAC,EAAE,EAAE,MAAM,EAAE,OAAO;QAC3D,aAAa,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,UAAC,EAAE;QAC1C,IAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAEvD,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,SAAS,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO;QACzD,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAC,EAAE;QACjC,IAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAEzC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO;QAChE,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE;QACxC,IAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,KAAK,EAAE,MAAM;QACvD,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE;QACxC,IAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,KAAK,EAAE,MAAM;QACvD,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE;QACxC,IAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,UAAC,EAAE,EAAE,SAAS;QACjD,aAAa,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE;QACrC,IAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAElD,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,UAAC,EAAE,EAAE,OAAO;QAC7C,aAAa,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,EAAE;QACnC,IAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QAE9C,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,WAAW;QACrD,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,4BAA4B,EAAE,UAAC,EAAE;QACvC,IAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QAEtD,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,WAAW;QACrD,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,4BAA4B,EAAE,UAAC,EAAE;QACvC,IAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QAEtD,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,gCAAgC,EAAE,UAAC,EAAE,EAAE,cAAc;QAC3D,aAAa,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,UAAC,EAAE;QAC1C,IAAM,cAAc,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAE5D,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,cAAc,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE,EAAE,QAAQ;QAC/C,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,UAAC,EAAE;QACpC,IAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,QAAQ,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa;QACpE,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,4BAA4B,EAAE,UAAC,EAAE;QACvC,IAAM,aAAa,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QAExD,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,aAAa,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,qBAAqB,EAAE,UAAC,EAAE;QAChC,aAAa,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO;QACpD,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE;QACrC,IAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAEjD,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,UAAC,EAAE,EAAE,KAAK;QACzC,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,UAAC,EAAE;QAClC,IAAM,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,UAAC,EAAE,EAAE,KAAK;QACzC,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,OAAO,EAAE,OAAO;QAC1D,EAAE,CAAA,CAAC,OAAO,CAAC,CAAC,CAAC;YACT,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,UAAC,EAAE,EAAE,IAAI;QAC1C,aAAa,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,IAAI;QAC9C,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,UAAC,EAAE,EAAE,IAAI;QACxC,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAC,EAAE;QACjC,IAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;QAE5C,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,qCAAqC,EAAE,UAAC,EAAE,EAAE,QAAQ;QAC1D,aAAa,CAAC,EAAE,CAAC,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,qCAAqC,EAAE,UAAC,EAAE;QAChD,IAAM,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,sBAAsB,EAAE,CAAC;QAE5D,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE,QAAQ,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,gCAAgC,EAAE,UAAC,EAAE,EAAE,MAAM;QACnD,aAAa,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,UAAC,EAAE;QAC1C,IAAM,MAAM,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAEpD,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE;QACxC,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE;QACrC,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAC,EAAE,EAAE,GAAG,EAAE,OAAO;QAC/C,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,qBAAqB,EAAE,UAAC,EAAE;QAChC,aAAa,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,sBAAsB,EAAE,UAAC,EAAE,EAAE,SAAS;QAC5C,IAAI,IAAI,GAAG,IAAI,CAAC;QAEhB,EAAE,CAAA,CAAC,SAAS,CAAC,CAAC,CAAC;YACX,IAAI,GAAG,eAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAEzC,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAC,EAAE;gBACrC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACP,CAAC;QAED,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,mCAAmC,SAAS,EAAE,QAAQ;QAClD,SAAS,CAAC,OAAO,CAAC,UAAC,IAAI;YACnB,EAAE,CAAA,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/C,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC;YAED,EAAE,CAAA,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,cAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,EAAE,EAAE,QAAQ;QAClD,aAAa,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,UAAC,EAAE,EAAE,SAAS;QACjD,aAAa,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,EAAE;QACnC,IAAM,SAAS,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,gCAAgC,EAAE,UAAC,EAAE,EAAE,cAAwC;QACrF,cAAc,CAAC,OAAO,CAAC,UAAA,aAAa;YAChC,IAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChG,aAAa,CAAC,IAAI,GAAG,sBAAW,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC3D,aAAa,CAAC,KAAK,GAAG;gBAClB,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,IAAM,OAAO,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,UAAC,EAAE,EAAE,SAAS;QACrD,aAAa,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,kCAAkC,EAAE,UAAC,EAAE,EAAE,OAAO;QACtD,aAAa,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,4BAA4B,EAAE,UAAC,EAAE,EAAE,OAAO;QAChD,aAAa,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yCAAyC,EAAE,UAAC,EAAE;QACpD,aAAa,CAAC,EAAE,CAAC,CAAC,0BAA0B,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,iCAAiC,EAAE,UAAC,EAAE,EAAE,IAAI;QAClD,aAAa,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,gCAAgC,EAAE,UAAC,EAAE;QAC3C,IAAM,iBAAiB,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC;QAEhE,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE,iBAAiB,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mCAAmC,EAAE,UAAC,EAAE,EAAE,OAAO;QACvD,aAAa,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,+BAA+B,EAAE,UAAC,EAAE;QAC1C,IAAM,gBAAgB,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAE9D,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,gBAAgB,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,wCAAwC,EAAE,UAAC,EAAE,EAAE,OAAO;QAC5D,aAAa,CAAC,EAAE,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,uCAAuC,EAAE,UAAC,EAAE;QAClD,IAAM,wBAAwB,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,wBAAwB,EAAE,CAAC;QAE9E,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE,wBAAwB,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mCAAmC,EAAE,UAAC,EAAE,EAAE,MAAM;QACtD,aAAa,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mCAAmC,EAAE,UAAC,EAAE,EAAE,MAAM;QACtD,aAAa,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,UAAC,EAAE,EAAE,SAAS;QACjD,aAAa,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,UAAC,EAAE,EAAE,MAAM;QACjD,IAAM,aAAa,GAAG,wBAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEtD,aAAa,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,UAAC,EAAE;QACzC,IAAM,aAAa,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;QAE1D,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,UAAC,EAAE;QACzC,IAAM,cAAc,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC;QAE3D,IAAM,GAAG,GAAG,EAAE,CAAC;QAEf,cAAc,CAAC,OAAO,CAAC,UAAA,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,gCAAgC,EAAE,UAAC,EAAE,EAAE,QAAQ;QACrD,aAAa,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,0BAA0B,EAAE,UAAC,EAAE,EAAE,IAAI;QAC3C,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,uBAAuB,EAAU;QAC7B,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YAClD,IAAI,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC7B,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACnB,MAAM,CAAC,OAAO,CAAC;YACnB,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC,CAAA"} \ No newline at end of file diff --git a/ElectronNET.Host/api/browserWindows.ts b/ElectronNET.Host/api/browserWindows.ts index ce57873..8db8422 100644 --- a/ElectronNET.Host/api/browserWindows.ts +++ b/ElectronNET.Host/api/browserWindows.ts @@ -3,6 +3,7 @@ const path = require('path'); const windows: Electron.BrowserWindow[] = [] module.exports = (socket: SocketIO.Server) => { + socket.on('register-browserWindow-ready-to-show', (id) => { getWindowById(id).on('ready-to-show', () => { socket.emit('browserWindow-ready-to-show'); @@ -35,13 +36,13 @@ module.exports = (socket: SocketIO.Server) => { socket.on('register-browserWindow-unresponsive', (id) => { getWindowById(id).on('unresponsive', () => { - socket.emit('browserWindow-unresponsive'); + socket.emit('browserWindow-unresponsive' + id); }); }); socket.on('register-browserWindow-responsive', (id) => { getWindowById(id).on('responsive', () => { - socket.emit('browserWindow-responsive'); + socket.emit('browserWindow-responsive' + id); }); }); diff --git a/ElectronNET.Host/api/globalShortcut.js b/ElectronNET.Host/api/globalShortcut.js new file mode 100644 index 0000000..b1f63a5 --- /dev/null +++ b/ElectronNET.Host/api/globalShortcut.js @@ -0,0 +1,24 @@ +"use strict"; +exports.__esModule = true; +var electron_1 = require("electron"); +module.exports = function (socket) { + socket.on('globalShortcut-register', function (accelerator) { + electron_1.globalShortcut.register(accelerator, function () { + socket.emit('globalShortcut-pressed', accelerator); + }); + }); + socket.on('globalShortcut-isRegistered', function (accelerator) { + var isRegistered = electron_1.globalShortcut.isRegistered(accelerator); + socket.emit('globalShortcut-isRegisteredCompleted', isRegistered); + }); + socket.on('globalShortcut-unregister', function (accelerator) { + electron_1.globalShortcut.unregister(accelerator); + }); + socket.on('globalShortcut-unregisterAll', function () { + try { + electron_1.globalShortcut.unregisterAll(); + } + catch (error) { } + }); +}; +//# sourceMappingURL=globalShortcut.js.map \ No newline at end of file diff --git a/ElectronNET.Host/api/globalShortcut.js.map b/ElectronNET.Host/api/globalShortcut.js.map new file mode 100644 index 0000000..243e38c --- /dev/null +++ b/ElectronNET.Host/api/globalShortcut.js.map @@ -0,0 +1 @@ +{"version":3,"file":"globalShortcut.js","sourceRoot":"","sources":["globalShortcut.ts"],"names":[],"mappings":";;AAAA,qCAA0C;AAE1C,MAAM,CAAC,OAAO,GAAG,UAAC,MAAuB;IACrC,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,UAAC,WAAW;QAC7C,yBAAc,CAAC,QAAQ,CAAC,WAAW,EAAE;YACjC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,6BAA6B,EAAE,UAAC,WAAW;QACjD,IAAM,YAAY,GAAG,yBAAc,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAE9D,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,YAAY,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,UAAC,WAAW;QAC/C,yBAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE;QACtC,IAAI,CAAC;YACD,yBAAc,CAAC,aAAa,EAAE,CAAC;QACnC,CAAC;QAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC,CAAA"} \ No newline at end of file diff --git a/ElectronNET.Host/api/globalShortcut.ts b/ElectronNET.Host/api/globalShortcut.ts new file mode 100644 index 0000000..cf6e2e3 --- /dev/null +++ b/ElectronNET.Host/api/globalShortcut.ts @@ -0,0 +1,25 @@ +import { globalShortcut } from "electron"; + +module.exports = (socket: SocketIO.Server) => { + socket.on('globalShortcut-register', (accelerator) => { + globalShortcut.register(accelerator, () => { + socket.emit('globalShortcut-pressed', accelerator); + }); + }); + + socket.on('globalShortcut-isRegistered', (accelerator) => { + const isRegistered = globalShortcut.isRegistered(accelerator); + + socket.emit('globalShortcut-isRegisteredCompleted', isRegistered); + }); + + socket.on('globalShortcut-unregister', (accelerator) => { + globalShortcut.unregister(accelerator); + }); + + socket.on('globalShortcut-unregisterAll', () => { + try { + globalShortcut.unregisterAll(); + } catch (error) { } + }); +} \ No newline at end of file diff --git a/ElectronNET.Host/api/ipc.js b/ElectronNET.Host/api/ipc.js index 81d465d..f20924e 100644 --- a/ElectronNET.Host/api/ipc.js +++ b/ElectronNET.Host/api/ipc.js @@ -7,6 +7,16 @@ module.exports = function (socket) { socket.emit(channel, [event.preventDefault(), args]); }); }); + socket.on('registerSyncIpcMainChannel', function (channel) { + electron_1.ipcMain.on(channel, function (event, args) { + var x = socket; + x.removeAllListeners(channel + 'Sync'); + socket.on(channel + 'Sync', function (result) { + event.returnValue = result; + }); + socket.emit(channel, [event.preventDefault(), args]); + }); + }); socket.on('registerOnceIpcMainChannel', function (channel) { electron_1.ipcMain.once(channel, function (event, args) { socket.emit(channel, [event.preventDefault(), args]); diff --git a/ElectronNET.Host/api/ipc.js.map b/ElectronNET.Host/api/ipc.js.map index dea2f4c..2a6d9eb 100644 --- a/ElectronNET.Host/api/ipc.js.map +++ b/ElectronNET.Host/api/ipc.js.map @@ -1 +1 @@ -{"version":3,"file":"ipc.js","sourceRoot":"","sources":["ipc.ts"],"names":[],"mappings":";;AAAA,qCAAkD;AAElD,MAAM,CAAC,OAAO,GAAG,UAAC,MAAuB;IACrC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,OAAO;QACxC,kBAAO,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,KAAK,EAAE,IAAI;YAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,4BAA4B,EAAE,UAAC,OAAO;QAC5C,kBAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAC,KAAK,EAAE,IAAI;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,kCAAkC,EAAE,UAAC,OAAO;QAClD,kBAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,UAAC,aAAa,EAAE,OAAO;QAAE,cAAO;aAAP,UAAO,EAAP,qBAAO,EAAP,IAAO;YAAP,6BAAO;;QAC3D,IAAM,MAAM,GAAG,wBAAa,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAEtD,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACT,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAA"} \ No newline at end of file +{"version":3,"file":"ipc.js","sourceRoot":"","sources":["ipc.ts"],"names":[],"mappings":";;AAAA,qCAAkD;AAElD,MAAM,CAAC,OAAO,GAAG,UAAC,MAAuB;IACrC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,OAAO;QACxC,kBAAO,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,KAAK,EAAE,IAAI;YAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,4BAA4B,EAAE,UAAC,OAAO;QAC5C,kBAAO,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,KAAK,EAAE,IAAI;YAC5B,IAAI,CAAC,GAAQ,MAAM,CAAC;YACpB,CAAC,CAAC,kBAAkB,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC;YACvC,MAAM,CAAC,EAAE,CAAC,OAAO,GAAG,MAAM,EAAE,UAAC,MAAM;gBAC/B,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC;YAC/B,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,4BAA4B,EAAE,UAAC,OAAO;QAC5C,kBAAO,CAAC,IAAI,CAAC,OAAO,EAAE,UAAC,KAAK,EAAE,IAAI;YAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,kCAAkC,EAAE,UAAC,OAAO;QAClD,kBAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,mBAAmB,EAAE,UAAC,aAAa,EAAE,OAAO;QAAE,cAAO;aAAP,UAAO,EAAP,qBAAO,EAAP,IAAO;YAAP,6BAAO;;QAC3D,IAAM,MAAM,GAAG,wBAAa,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAEtD,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACT,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAA"} \ No newline at end of file diff --git a/ElectronNET.Host/api/ipc.ts b/ElectronNET.Host/api/ipc.ts index b3a7b2b..8028c14 100644 --- a/ElectronNET.Host/api/ipc.ts +++ b/ElectronNET.Host/api/ipc.ts @@ -7,6 +7,18 @@ module.exports = (socket: SocketIO.Server) => { }); }); + socket.on('registerSyncIpcMainChannel', (channel) => { + ipcMain.on(channel, (event, args) => { + let x = socket; + x.removeAllListeners(channel + 'Sync'); + socket.on(channel + 'Sync', (result) => { + event.returnValue = result; + }); + + socket.emit(channel, [event.preventDefault(), args]); + }); + }); + socket.on('registerOnceIpcMainChannel', (channel) => { ipcMain.once(channel, (event, args) => { socket.emit(channel, [event.preventDefault(), args]); diff --git a/ElectronNET.Host/api/menu.js b/ElectronNET.Host/api/menu.js index 4eb7eb3..cc6a8c9 100644 --- a/ElectronNET.Host/api/menu.js +++ b/ElectronNET.Host/api/menu.js @@ -1,7 +1,36 @@ "use strict"; exports.__esModule = true; var electron_1 = require("electron"); +var contextMenuItems = []; module.exports = function (socket) { + socket.on('menu-setContextMenu', function (browserWindowId, menuItems) { + var menu = electron_1.Menu.buildFromTemplate(menuItems); + addContextMenuItemClickConnector(menu.items, browserWindowId, function (id, browserWindowId) { + socket.emit("contextMenuItemClicked", [id, browserWindowId]); + }); + contextMenuItems.push({ + menu: menu, + browserWindowId: browserWindowId + }); + }); + function addContextMenuItemClickConnector(menuItems, browserWindowId, callback) { + menuItems.forEach(function (item) { + if (item.submenu && item.submenu.items.length > 0) { + addContextMenuItemClickConnector(item.submenu.items, browserWindowId, callback); + } + if ("id" in item && item.id) { + item.click = function () { callback(item.id, browserWindowId); }; + } + }); + } + socket.on('menu-contextMenuPopup', function (browserWindowId) { + contextMenuItems.forEach(function (x) { + if (x.browserWindowId === browserWindowId) { + var browserWindow = electron_1.BrowserWindow.fromId(browserWindowId); + x.menu.popup(browserWindow); + } + }); + }); socket.on('menu-setApplicationMenu', function (menuItems) { var menu = electron_1.Menu.buildFromTemplate(menuItems); addMenuItemClickConnector(menu.items, function (id) { diff --git a/ElectronNET.Host/api/menu.js.map b/ElectronNET.Host/api/menu.js.map index 94adcce..87ab594 100644 --- a/ElectronNET.Host/api/menu.js.map +++ b/ElectronNET.Host/api/menu.js.map @@ -1 +1 @@ -{"version":3,"file":"menu.js","sourceRoot":"","sources":["menu.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAEhC,MAAM,CAAC,OAAO,GAAG,UAAC,MAAuB;IACrC,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,UAAC,SAAS;QAC3C,IAAM,IAAI,GAAG,eAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE/C,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAC,EAAE;YACrC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,eAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,mCAAmC,SAAS,EAAE,QAAQ;QAClD,SAAS,CAAC,OAAO,CAAC,UAAC,IAAI;YACnB,EAAE,CAAA,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/C,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC;YAED,EAAE,CAAA,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,KAAK,GAAG,cAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAA"} \ No newline at end of file +{"version":3,"file":"menu.js","sourceRoot":"","sources":["menu.ts"],"names":[],"mappings":";;AAAA,qCAA+C;AAC/C,IAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,MAAM,CAAC,OAAO,GAAG,UAAC,MAAuB;IACrC,MAAM,CAAC,EAAE,CAAC,qBAAqB,EAAE,UAAC,eAAe,EAAE,SAAS;QACxD,IAAM,IAAI,GAAG,eAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE/C,gCAAgC,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,EAAE,UAAC,EAAE,EAAE,eAAe;YAC9E,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,gBAAgB,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,IAAI;YACV,eAAe,EAAE,eAAe;SACnC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,0CAA0C,SAAS,EAAE,eAAe,EAAE,QAAQ;QAC1E,SAAS,CAAC,OAAO,CAAC,UAAC,IAAI;YACnB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChD,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;YACpF,CAAC;YAED,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,KAAK,GAAG,cAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,UAAC,eAAe;QAC/C,gBAAgB,CAAC,OAAO,CAAC,UAAA,CAAC;YACtB,EAAE,CAAA,CAAC,CAAC,CAAC,eAAe,KAAK,eAAe,CAAC,CAAC,CAAC;gBACvC,IAAI,aAAa,GAAG,wBAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBAC1D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAChC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,UAAC,SAAS;QAC3C,IAAM,IAAI,GAAG,eAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAE/C,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,UAAC,EAAE;YACrC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,eAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,mCAAmC,SAAS,EAAE,QAAQ;QAClD,SAAS,CAAC,OAAO,CAAC,UAAC,IAAI;YACnB,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAChD,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC;YAED,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,KAAK,GAAG,cAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;AACL,CAAC,CAAA"} \ No newline at end of file diff --git a/ElectronNET.Host/api/menu.ts b/ElectronNET.Host/api/menu.ts index 1d96344..41ba0d6 100644 --- a/ElectronNET.Host/api/menu.ts +++ b/ElectronNET.Host/api/menu.ts @@ -1,6 +1,41 @@ -import { Menu } from "electron"; +import { Menu, BrowserWindow } from "electron"; +const contextMenuItems = []; module.exports = (socket: SocketIO.Server) => { + socket.on('menu-setContextMenu', (browserWindowId, menuItems) => { + const menu = Menu.buildFromTemplate(menuItems); + + addContextMenuItemClickConnector(menu.items, browserWindowId, (id, browserWindowId) => { + socket.emit("contextMenuItemClicked", [id, browserWindowId]); + }); + + contextMenuItems.push({ + menu: menu, + browserWindowId: browserWindowId + }); + }); + + function addContextMenuItemClickConnector(menuItems, browserWindowId, callback) { + menuItems.forEach((item) => { + if (item.submenu && item.submenu.items.length > 0) { + addContextMenuItemClickConnector(item.submenu.items, browserWindowId, callback); + } + + if ("id" in item && item.id) { + item.click = () => { callback(item.id, browserWindowId); }; + } + }); + } + + socket.on('menu-contextMenuPopup', (browserWindowId) => { + contextMenuItems.forEach(x => { + if(x.browserWindowId === browserWindowId) { + let browserWindow = BrowserWindow.fromId(browserWindowId); + x.menu.popup(browserWindow); + } + }); + }); + socket.on('menu-setApplicationMenu', (menuItems) => { const menu = Menu.buildFromTemplate(menuItems); @@ -13,11 +48,11 @@ module.exports = (socket: SocketIO.Server) => { function addMenuItemClickConnector(menuItems, callback) { menuItems.forEach((item) => { - if(item.submenu && item.submenu.items.length > 0) { + if (item.submenu && item.submenu.items.length > 0) { addMenuItemClickConnector(item.submenu.items, callback); } - - if("id" in item && item.id) { + + if ("id" in item && item.id) { item.click = () => { callback(item.id); }; } }); diff --git a/ElectronNET.Host/api/shell.js b/ElectronNET.Host/api/shell.js new file mode 100644 index 0000000..e88c11b --- /dev/null +++ b/ElectronNET.Host/api/shell.js @@ -0,0 +1,44 @@ +"use strict"; +exports.__esModule = true; +var electron_1 = require("electron"); +module.exports = function (socket) { + socket.on('shell-showItemInFolder', function (fullPath) { + var success = electron_1.shell.showItemInFolder(fullPath); + socket.emit('shell-showItemInFolderCompleted', success); + }); + socket.on('shell-openItem', function (fullPath) { + var success = electron_1.shell.openItem(fullPath); + socket.emit('shell-openItemCompleted', success); + }); + socket.on('shell-openExternal', function (url, options, callback) { + var success = false; + if (options && callback) { + success = electron_1.shell.openExternal(url, options, function (error) { + socket.emit('shell-openExternalCallback', [url, error]); + }); + } + else if (options) { + success = electron_1.shell.openExternal(url, options); + } + else { + success = electron_1.shell.openExternal(url); + } + socket.emit('shell-openExternalCompleted', success); + }); + socket.on('shell-moveItemToTrash', function (fullPath) { + var success = electron_1.shell.moveItemToTrash(fullPath); + socket.emit('shell-moveItemToTrashCompleted', success); + }); + socket.on('shell-beep', function () { + electron_1.shell.beep(); + }); + socket.on('shell-writeShortcutLink', function (shortcutPath, operation, options) { + var success = electron_1.shell.writeShortcutLink(shortcutPath, operation, options); + socket.emit('shell-writeShortcutLinkCompleted', success); + }); + socket.on('shell-readShortcutLink', function (shortcutPath) { + var shortcutDetails = electron_1.shell.readShortcutLink(shortcutPath); + socket.emit('shell-readShortcutLinkCompleted', shortcutDetails); + }); +}; +//# sourceMappingURL=shell.js.map \ No newline at end of file diff --git a/ElectronNET.Host/api/shell.js.map b/ElectronNET.Host/api/shell.js.map new file mode 100644 index 0000000..e8a4b0e --- /dev/null +++ b/ElectronNET.Host/api/shell.js.map @@ -0,0 +1 @@ +{"version":3,"file":"shell.js","sourceRoot":"","sources":["shell.ts"],"names":[],"mappings":";;AAAA,qCAAiC;AAEjC,MAAM,CAAC,OAAO,GAAG,UAAC,MAAuB;IACrC,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,QAAQ;QACzC,IAAM,OAAO,GAAG,gBAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,UAAC,QAAQ;QACjC,IAAM,OAAO,GAAG,gBAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEzC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,oBAAoB,EAAE,UAAC,GAAG,EAAE,OAAO,EAAE,QAAQ;QACnD,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,EAAE,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC;YACtB,OAAO,GAAG,gBAAK,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,UAAC,KAAK;gBAC7C,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACjB,OAAO,GAAG,gBAAK,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,OAAO,GAAG,gBAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,uBAAuB,EAAE,UAAC,QAAQ;QACxC,IAAM,OAAO,GAAG,gBAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE;QACpB,gBAAK,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,UAAC,YAAY,EAAE,SAAS,EAAE,OAAO;QAClE,IAAM,OAAO,GAAG,gBAAK,CAAC,iBAAiB,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAE1E,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,YAAY;QAC7C,IAAM,eAAe,GAAG,gBAAK,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAE7D,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,eAAe,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACP,CAAC,CAAA"} \ No newline at end of file diff --git a/ElectronNET.Host/api/shell.ts b/ElectronNET.Host/api/shell.ts new file mode 100644 index 0000000..09260ff --- /dev/null +++ b/ElectronNET.Host/api/shell.ts @@ -0,0 +1,53 @@ +import { shell } from "electron"; + +module.exports = (socket: SocketIO.Server) => { + socket.on('shell-showItemInFolder', (fullPath) => { + const success = shell.showItemInFolder(fullPath); + + socket.emit('shell-showItemInFolderCompleted', success); + }); + + socket.on('shell-openItem', (fullPath) => { + const success = shell.openItem(fullPath); + + socket.emit('shell-openItemCompleted', success); + }); + + socket.on('shell-openExternal', (url, options, callback) => { + let success = false; + + if (options && callback) { + success = shell.openExternal(url, options, (error) => { + socket.emit('shell-openExternalCallback', [url, error]); + }); + } else if (options) { + success = shell.openExternal(url, options); + } else { + success = shell.openExternal(url); + } + + socket.emit('shell-openExternalCompleted', success); + }); + + socket.on('shell-moveItemToTrash', (fullPath) => { + const success = shell.moveItemToTrash(fullPath); + + socket.emit('shell-moveItemToTrashCompleted', success); + }); + + socket.on('shell-beep', () => { + shell.beep(); + }); + + socket.on('shell-writeShortcutLink', (shortcutPath, operation, options) => { + const success = shell.writeShortcutLink(shortcutPath, operation, options); + + socket.emit('shell-writeShortcutLinkCompleted', success); + }); + + socket.on('shell-readShortcutLink', (shortcutPath) => { + const shortcutDetails = shell.readShortcutLink(shortcutPath); + + socket.emit('shell-readShortcutLinkCompleted', shortcutDetails); + }); +} \ No newline at end of file diff --git a/ElectronNET.Host/api/webContents.js b/ElectronNET.Host/api/webContents.js new file mode 100644 index 0000000..1e00147 --- /dev/null +++ b/ElectronNET.Host/api/webContents.js @@ -0,0 +1,31 @@ +"use strict"; +exports.__esModule = true; +var electron_1 = require("electron"); +module.exports = function (socket) { + socket.on('register-webContents-crashed', function (id) { + var browserWindow = getWindowById(id); + browserWindow.webContents.removeAllListeners('crashed'); + browserWindow.webContents.on('crashed', function (event, killed) { + socket.emit('webContents-crashed' + id, killed); + }); + }); + socket.on('register-webContents-didFinishLoad', function (id) { + var browserWindow = getWindowById(id); + browserWindow.webContents.removeAllListeners('did-finish-load'); + browserWindow.webContents.on('did-finish-load', function () { + socket.emit('webContents-didFinishLoad' + id); + }); + }); + socket.on('webContentsOpenDevTools', function (id, options) { + if (options) { + getWindowById(id).webContents.openDevTools(options); + } + else { + getWindowById(id).webContents.openDevTools(); + } + }); + function getWindowById(id) { + return electron_1.BrowserWindow.fromId(id); + } +}; +//# sourceMappingURL=webContents.js.map \ No newline at end of file diff --git a/ElectronNET.Host/api/webContents.js.map b/ElectronNET.Host/api/webContents.js.map new file mode 100644 index 0000000..fdd23b7 --- /dev/null +++ b/ElectronNET.Host/api/webContents.js.map @@ -0,0 +1 @@ +{"version":3,"file":"webContents.js","sourceRoot":"","sources":["webContents.ts"],"names":[],"mappings":";;AAAA,qCAAyC;AACzC,MAAM,CAAC,OAAO,GAAG,UAAC,MAAuB;IACrC,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,UAAC,EAAE;QACzC,IAAI,aAAa,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QAEtC,aAAa,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACxD,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,UAAC,KAAK,EAAE,MAAM;YAClD,MAAM,CAAC,IAAI,CAAC,qBAAqB,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,oCAAoC,EAAE,UAAC,EAAE;QAC/C,IAAI,aAAa,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QAEtC,aAAa,CAAC,WAAW,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QAChE,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,iBAAiB,EAAE;YAC5C,MAAM,CAAC,IAAI,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,UAAC,EAAE,EAAE,OAAO;QAC7C,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACV,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,aAAa,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,uBAAuB,EAAU;QAC7B,MAAM,CAAC,wBAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;AACL,CAAC,CAAC"} \ No newline at end of file diff --git a/ElectronNET.Host/api/webContents.ts b/ElectronNET.Host/api/webContents.ts new file mode 100644 index 0000000..757503e --- /dev/null +++ b/ElectronNET.Host/api/webContents.ts @@ -0,0 +1,32 @@ +import { BrowserWindow } from 'electron'; +module.exports = (socket: SocketIO.Server) => { + socket.on('register-webContents-crashed', (id) => { + var browserWindow = getWindowById(id); + + browserWindow.webContents.removeAllListeners('crashed'); + browserWindow.webContents.on('crashed', (event, killed) => { + socket.emit('webContents-crashed' + id, killed); + }); + }); + + socket.on('register-webContents-didFinishLoad', (id) => { + var browserWindow = getWindowById(id); + + browserWindow.webContents.removeAllListeners('did-finish-load'); + browserWindow.webContents.on('did-finish-load', () => { + socket.emit('webContents-didFinishLoad' + id); + }); + }); + + socket.on('webContentsOpenDevTools', (id, options) => { + if (options) { + getWindowById(id).webContents.openDevTools(options); + } else { + getWindowById(id).webContents.openDevTools(); + } + }); + + function getWindowById(id: number): Electron.BrowserWindow { + return BrowserWindow.fromId(id); + } +}; \ No newline at end of file diff --git a/ElectronNET.Host/main.js b/ElectronNET.Host/main.js index 3437150..f8e884e 100644 --- a/ElectronNET.Host/main.js +++ b/ElectronNET.Host/main.js @@ -3,7 +3,9 @@ const fs = require('fs'); const path = require('path'); const process = require('child_process').spawn; const portfinder = require('detect-port'); -let io, browserWindows, ipc, apiProcess, loadURL, appApi, menu, dialog, notification, tray; +let io, browserWindows, ipc, apiProcess, loadURL; +let appApi, menu, dialog, notification, tray, webContents; +let globalShortcut, shell; app.on('ready', () => { portfinder(8000, (error, port) => { @@ -25,6 +27,9 @@ function startSocketApiBridge(port) { dialog = require('./api/dialog')(socket); notification = require('./api/notification')(socket); tray = require('./api/tray')(socket); + webContents = require('./api/webContents')(socket); + globalShortcut = require('./api/globalShortcut')(socket); + shell = require('./api/shell')(socket); }); } diff --git a/ElectronNET.WebApp/Controllers/CrashHangController.cs b/ElectronNET.WebApp/Controllers/CrashHangController.cs new file mode 100644 index 0000000..eae05e2 --- /dev/null +++ b/ElectronNET.WebApp/Controllers/CrashHangController.cs @@ -0,0 +1,76 @@ +using Microsoft.AspNetCore.Mvc; +using ElectronNET.API; +using ElectronNET.API.Entities; + +namespace ElectronNET.WebApp.Controllers +{ + public class CrashHangController : Controller + { + public IActionResult Index() + { + Electron.IpcMain.On("process-crash", async (args) => + { + string viewPath = $"http://localhost:{BridgeSettings.WebPort}/crashhang/processcrash"; + + var browserWindow = await Electron.WindowManager.CreateWindowAsync(viewPath); + browserWindow.WebContents.OnCrashed += async (killed) => + { + var options = new MessageBoxOptions("This process has crashed.") + { + Type = MessageBoxType.info, + Title = "Renderer Process Crashed", + Buttons = new string[] { "Reload", "Close" } + }; + var result = await Electron.Dialog.ShowMessageBoxAsync(options); + + if (result.Response == 0) + { + browserWindow.Reload(); + } + else + { + browserWindow.Close(); + } + }; + }); + + Electron.IpcMain.On("process-hang", async (args) => + { + string viewPath = $"http://localhost:{BridgeSettings.WebPort}/crashhang/processhang"; + + var browserWindow = await Electron.WindowManager.CreateWindowAsync(viewPath); + browserWindow.OnUnresponsive += async () => + { + var options = new MessageBoxOptions("This process is hanging.") + { + Type = MessageBoxType.info, + Title = "Renderer Process Hanging", + Buttons = new string[] { "Reload", "Close" } + }; + var result = await Electron.Dialog.ShowMessageBoxAsync(options); + + if (result.Response == 0) + { + browserWindow.Reload(); + } + else + { + browserWindow.Close(); + } + }; + }); + + return View(); + } + + public IActionResult ProcessCrash() + { + return View(); + } + + public IActionResult ProcessHang() + { + return View(); + } + } +} \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/DialogsController.cs b/ElectronNET.WebApp/Controllers/DialogsController.cs new file mode 100644 index 0000000..02a09c1 --- /dev/null +++ b/ElectronNET.WebApp/Controllers/DialogsController.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using ElectronNET.API; +using ElectronNET.API.Entities; + +namespace ElectronNET.WebApp.Controllers +{ + public class DialogsController : Controller + { + public IActionResult Index() + { + Electron.IpcMain.On("select-directory", async (args) => { + var mainWindow = Electron.WindowManager.BrowserWindows.First(); + var options = new OpenDialogOptions { + Properties = new OpenDialogProperty[] { + OpenDialogProperty.openFile, + OpenDialogProperty.openDirectory + } + }; + + string[] files = await Electron.Dialog.ShowOpenDialogAsync(mainWindow, options); + Electron.IpcMain.Send(mainWindow, "select-directory-reply", files); + }); + + Electron.IpcMain.On("error-dialog", (args) => + { + Electron.Dialog.ShowErrorBox("An Error Message", "Demonstrating an error message."); + }); + + Electron.IpcMain.On("information-dialog", async (args) => + { + var options = new MessageBoxOptions("This is an information dialog. Isn't it nice?") + { + Type = MessageBoxType.info, + Title = "Information", + Buttons = new string[] { "Yes", "No" } + }; + + var result = await Electron.Dialog.ShowMessageBoxAsync(options); + + var mainWindow = Electron.WindowManager.BrowserWindows.First(); + Electron.IpcMain.Send(mainWindow, "information-dialog-reply", result.Response); + }); + + Electron.IpcMain.On("save-dialog", async (args) => + { + var mainWindow = Electron.WindowManager.BrowserWindows.First(); + var options = new SaveDialogOptions + { + Title = "Save an Image", + Filters = new FileFilter[] + { + new FileFilter { Name = "Images", Extensions = new string[] {"jpg", "png", "gif" } } + } + }; + + var result = await Electron.Dialog.ShowSaveDialogAsync(mainWindow, options); + Electron.IpcMain.Send(mainWindow, "save-dialog-reply", result); + }); + + return View(); + } + } +} \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/HomeController.cs b/ElectronNET.WebApp/Controllers/HomeController.cs index e312471..03beca1 100644 --- a/ElectronNET.WebApp/Controllers/HomeController.cs +++ b/ElectronNET.WebApp/Controllers/HomeController.cs @@ -1,12 +1,119 @@ -using Microsoft.AspNetCore.Mvc; +using ElectronNET.API; +using ElectronNET.API.Entities; +using Microsoft.AspNetCore.Mvc; +using System.Linq; namespace ElectronNET.WebApp.Controllers { public class HomeController : Controller { public IActionResult Index() - { + { + var menu = new MenuItem[] { + new MenuItem { Label = "Edit", Submenu = new MenuItem[] { + new MenuItem { Label = "Undo", Accelerator = "CmdOrCtrl+Z", Role = MenuRole.undo }, + new MenuItem { Label = "Redo", Accelerator = "Shift+CmdOrCtrl+Z", Role = MenuRole.redo }, + new MenuItem { Type = MenuType.separator }, + new MenuItem { Label = "Cut", Accelerator = "CmdOrCtrl+X", Role = MenuRole.cut }, + new MenuItem { Label = "Copy", Accelerator = "CmdOrCtrl+C", Role = MenuRole.copy }, + new MenuItem { Label = "Paste", Accelerator = "CmdOrCtrl+V", Role = MenuRole.paste }, + new MenuItem { Label = "Select All", Accelerator = "CmdOrCtrl+A", Role = MenuRole.selectall } + } + }, + new MenuItem { Label = "View", Submenu = new MenuItem[] { + new MenuItem + { + Label = "Reload", + Accelerator = "CmdOrCtrl+R", + Click = () => + { + // on reload, start fresh and close any old + // open secondary windows + Electron.WindowManager.BrowserWindows.ToList().ForEach(browserWindow => { + if(browserWindow.Id != 1) + { + browserWindow.Close(); + } + else + { + browserWindow.Reload(); + } + }); + } + }, + new MenuItem + { + Label = "Toggle Full Screen", + Accelerator = "CmdOrCtrl+F", + Click = async () => + { + bool isFullScreen = await Electron.WindowManager.BrowserWindows.First().IsFullScreenAsync(); + Electron.WindowManager.BrowserWindows.First().SetFullScreen(!isFullScreen); + } + }, + new MenuItem + { + Label = "Open Developer Tools", + Accelerator = "CmdOrCtrl+I", + Click = () => Electron.WindowManager.BrowserWindows.First().WebContents.OpenDevTools() + }, + new MenuItem + { + Type = MenuType.separator + }, + new MenuItem + { + Label = "App Menu Demo", + Click = async () => { + var options = new MessageBoxOptions("This demo is for the Menu section, showing how to create a clickable menu item in the application menu."); + options.Type = MessageBoxType.info; + options.Title = "Application Menu Demo"; + await Electron.Dialog.ShowMessageBoxAsync(options); + } + } + } + }, + new MenuItem { Label = "Window", Role = MenuRole.window, Submenu = new MenuItem[] { + new MenuItem { Label = "Minimize", Accelerator = "CmdOrCtrl+M", Role = MenuRole.minimize }, + new MenuItem { Label = "Close", Accelerator = "CmdOrCtrl+W", Role = MenuRole.close } + } + }, + new MenuItem { Label = "Help", Role = MenuRole.help, Submenu = new MenuItem[] { + new MenuItem + { + Label = "Learn More", + Click = async () => await Electron.Shell.OpenExternalAsync("https://github.com/ElectronNET") + } + } + } + }; + + Electron.Menu.SetApplicationMenu(menu); + + CreateContextMenu(); + return View(); } + + private void CreateContextMenu() + { + var menu = new MenuItem[] + { + new MenuItem + { + Label = "Hello", + Click = async () => await Electron.Dialog.ShowMessageBoxAsync("Electron.NET rocks!") + }, + new MenuItem { Type = MenuType.separator }, + new MenuItem { Label = "Electron.NET", Type = MenuType.checkbox, Checked = true } + }; + + var mainWindow = Electron.WindowManager.BrowserWindows.First(); + Electron.Menu.SetContextMenu(mainWindow, menu); + + Electron.IpcMain.On("show-context-menu", (args) => { + Electron.Menu.ContextMenuPopup(mainWindow); + }); + } } } \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/IpcController.cs b/ElectronNET.WebApp/Controllers/IpcController.cs new file mode 100644 index 0000000..62889ee --- /dev/null +++ b/ElectronNET.WebApp/Controllers/IpcController.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Mvc; +using ElectronNET.API; +using System.Linq; + +namespace ElectronNET.WebApp.Controllers +{ + public class IpcController : Controller + { + public IActionResult Index() + { + Electron.IpcMain.On("async-msg", (args) => + { + var mainWindow = Electron.WindowManager.BrowserWindows.First(); + Electron.IpcMain.Send(mainWindow, "asynchronous-reply", "pong"); + }); + + Electron.IpcMain.OnSync("sync-msg", (args) => + { + return "pong"; + }); + + return View(); + } + } +} \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/ManageWindowsController.cs b/ElectronNET.WebApp/Controllers/ManageWindowsController.cs new file mode 100644 index 0000000..0749083 --- /dev/null +++ b/ElectronNET.WebApp/Controllers/ManageWindowsController.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using ElectronNET.API; +using ElectronNET.API.Entities; + +namespace ElectronNET.WebApp.Controllers +{ + public class WindowsController : Controller + { + public IActionResult Index() + { + string viewPath = $"http://localhost:{BridgeSettings.WebPort}/windows/demowindow"; + + Electron.IpcMain.On("new-window", async (args) => { + + await Electron.WindowManager.CreateWindowAsync(viewPath); + + }); + + Electron.IpcMain.On("manage-window", async (args) => { + + var browserWindow = await Electron.WindowManager.CreateWindowAsync(viewPath); + browserWindow.OnMove += UpdateReply; + browserWindow.OnResize += UpdateReply; + }); + + Electron.IpcMain.On("listen-to-window", async (args) => { + var mainBrowserWindow = Electron.WindowManager.BrowserWindows.First(); + + var browserWindow = await Electron.WindowManager.CreateWindowAsync(viewPath); + browserWindow.OnFocus += () => Electron.IpcMain.Send(mainBrowserWindow, "listen-to-window-focus"); + browserWindow.OnBlur += () => Electron.IpcMain.Send(mainBrowserWindow, "listen-to-window-blur"); + + Electron.IpcMain.On("listen-to-window-set-focus", (x) => browserWindow.Focus()); + }); + + Electron.IpcMain.On("frameless-window", async (args) => { + var options = new BrowserWindowOptions + { + Frame = false + }; + await Electron.WindowManager.CreateWindowAsync(options, viewPath); + }); + + return View(); + } + + private async void UpdateReply() + { + var browserWindow = Electron.WindowManager.BrowserWindows.Last(); + var size = await browserWindow.GetSizeAsync(); + var position = await browserWindow.GetPositionAsync(); + string message = $"Size: {size[0]},{size[1]} Position: {position[0]},{position[1]}"; + + var mainWindow = Electron.WindowManager.BrowserWindows.First(); + Electron.IpcMain.Send(mainWindow, "manage-window-reply", message); + } + + public IActionResult DemoWindow() + { + return View(); + } + } +} \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/MenusController.cs b/ElectronNET.WebApp/Controllers/MenusController.cs new file mode 100644 index 0000000..47b9c03 --- /dev/null +++ b/ElectronNET.WebApp/Controllers/MenusController.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace ElectronNET.WebApp.Controllers +{ + public class MenusController : Controller + { + public IActionResult Index() + { + return View(); + } + } +} \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/NotificationsController.cs b/ElectronNET.WebApp/Controllers/NotificationsController.cs new file mode 100644 index 0000000..8a112ce --- /dev/null +++ b/ElectronNET.WebApp/Controllers/NotificationsController.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using ElectronNET.API; +using ElectronNET.API.Entities; + +namespace ElectronNET.WebApp.Controllers +{ + public class NotificationsController : Controller + { + public IActionResult Index() + { + Electron.IpcMain.On("basic-noti", (args) => { + + var options = new NotificationOptions("Basic Notification", "Short message part") + { + OnClick = async () => await Electron.Dialog.ShowMessageBoxAsync("Notification clicked") + }; + + Electron.Notification.Show(options); + + }); + + Electron.IpcMain.On("advanced-noti", (args) => { + + var options = new NotificationOptions("Notification with image", "Short message plus a custom image") + { + OnClick = async () => await Electron.Dialog.ShowMessageBoxAsync("Notification clicked"), + Icon = "/assets/img/programming.png" + }; + + Electron.Notification.Show(options); + }); + + return View(); + } + } +} \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/ShellController.cs b/ElectronNET.WebApp/Controllers/ShellController.cs new file mode 100644 index 0000000..bd59553 --- /dev/null +++ b/ElectronNET.WebApp/Controllers/ShellController.cs @@ -0,0 +1,27 @@ +using ElectronNET.API; +using ElectronNET.API.Entities; +using Microsoft.AspNetCore.Mvc; + +namespace ElectronNET.WebApp.Controllers +{ + public class ShellController : Controller + { + public IActionResult Index() + { + Electron.IpcMain.On("open-file-manager", async (args) => { + + string path = await Electron.App.GetPathAsync(PathName.home); + await Electron.Shell.ShowItemInFolderAsync(path); + + }); + + Electron.IpcMain.On("open-ex-links", async (args) => { + + await Electron.Shell.OpenExternalAsync("https://github.com/ElectronNET"); + + }); + + return View(); + } + } +} \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/ShortcutsController.cs b/ElectronNET.WebApp/Controllers/ShortcutsController.cs new file mode 100644 index 0000000..7f0e83a --- /dev/null +++ b/ElectronNET.WebApp/Controllers/ShortcutsController.cs @@ -0,0 +1,26 @@ +using ElectronNET.API; +using ElectronNET.API.Entities; +using Microsoft.AspNetCore.Mvc; + +namespace ElectronNET.WebApp.Controllers +{ + public class ShortcutsController : Controller + { + public IActionResult Index() + { + Electron.GlobalShortcut.Register("CommandOrControl+Alt+K", async () => { + var options = new MessageBoxOptions("You pressed the registered global shortcut keybinding.") + { + Type = MessageBoxType.info, + Title = "Success!" + }; + + await Electron.Dialog.ShowMessageBoxAsync(options); + }); + + Electron.App.WillQuit += () => Electron.GlobalShortcut.UnregisterAll(); + + return View(); + } + } +} \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/TrayController.cs b/ElectronNET.WebApp/Controllers/TrayController.cs new file mode 100644 index 0000000..7166276 --- /dev/null +++ b/ElectronNET.WebApp/Controllers/TrayController.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Mvc; +using ElectronNET.API; +using ElectronNET.API.Entities; + +namespace ElectronNET.WebApp.Controllers +{ + public class TrayController : Controller + { + public IActionResult Index() + { + Electron.IpcMain.On("put-in-tray", (args) => { + + if (Electron.Tray.Items.Count == 0) + { + var menu = new MenuItem + { + Label = "Remove", + Click = () => Electron.Tray.Destroy() + }; + + Electron.Tray.Show("/Assets/electron_32x32.png", menu); + Electron.Tray.SetToolTip("Electron Demo in the tray."); + } + else + { + Electron.Tray.Destroy(); + } + + }); + + return View(); + } + } +} \ No newline at end of file diff --git a/ElectronNET.WebApp/Controllers/WindowsController.cs b/ElectronNET.WebApp/Controllers/WindowsController.cs index 0749083..8d7fac8 100644 --- a/ElectronNET.WebApp/Controllers/WindowsController.cs +++ b/ElectronNET.WebApp/Controllers/WindowsController.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; +using System.Linq; using Microsoft.AspNetCore.Mvc; using ElectronNET.API; using ElectronNET.API.Entities; diff --git a/ElectronNET.WebApp/ElectronNET.WebApp.csproj b/ElectronNET.WebApp/ElectronNET.WebApp.csproj index 7dc4635..d6b4472 100644 --- a/ElectronNET.WebApp/ElectronNET.WebApp.csproj +++ b/ElectronNET.WebApp/ElectronNET.WebApp.csproj @@ -4,6 +4,12 @@ netcoreapp2.0 win10-x64 + + + + + + diff --git a/ElectronNET.WebApp/Views/CrashHang/Index.cshtml b/ElectronNET.WebApp/Views/CrashHang/Index.cshtml new file mode 100644 index 0000000..26d9847 --- /dev/null +++ b/ElectronNET.WebApp/Views/CrashHang/Index.cshtml @@ -0,0 +1,113 @@ + diff --git a/ElectronNET.WebApp/Views/CrashHang/ProcessCrash.cshtml b/ElectronNET.WebApp/Views/CrashHang/ProcessCrash.cshtml new file mode 100644 index 0000000..fd2d41b --- /dev/null +++ b/ElectronNET.WebApp/Views/CrashHang/ProcessCrash.cshtml @@ -0,0 +1,24 @@ + + +

Click the text below to crash and then reload this process.

+Crash this process diff --git a/ElectronNET.WebApp/Views/CrashHang/ProcessHang.cshtml b/ElectronNET.WebApp/Views/CrashHang/ProcessHang.cshtml new file mode 100644 index 0000000..8b14321 --- /dev/null +++ b/ElectronNET.WebApp/Views/CrashHang/ProcessHang.cshtml @@ -0,0 +1,29 @@ + + +

Click the text below to hang and then reload this process.

+(This will take up to 30 seconds.) + +Hang this process diff --git a/ElectronNET.WebApp/Views/Dialogs/Index.cshtml b/ElectronNET.WebApp/Views/Dialogs/Index.cshtml new file mode 100644 index 0000000..887b030 --- /dev/null +++ b/ElectronNET.WebApp/Views/Dialogs/Index.cshtml @@ -0,0 +1,222 @@ + diff --git a/ElectronNET.WebApp/Views/Home/Index.cshtml b/ElectronNET.WebApp/Views/Home/Index.cshtml index 14bd45e..e315b48 100644 --- a/ElectronNET.WebApp/Views/Home/Index.cshtml +++ b/ElectronNET.WebApp/Views/Home/Index.cshtml @@ -14,6 +14,14 @@ + + + + + + + + diff --git a/ElectronNET.WebApp/Views/Ipc/Index.cshtml b/ElectronNET.WebApp/Views/Ipc/Index.cshtml new file mode 100644 index 0000000..51becaf --- /dev/null +++ b/ElectronNET.WebApp/Views/Ipc/Index.cshtml @@ -0,0 +1,104 @@ + diff --git a/ElectronNET.WebApp/Views/Menus/Index.cshtml b/ElectronNET.WebApp/Views/Menus/Index.cshtml new file mode 100644 index 0000000..7e48719 --- /dev/null +++ b/ElectronNET.WebApp/Views/Menus/Index.cshtml @@ -0,0 +1,189 @@ + diff --git a/ElectronNET.WebApp/Views/Notifications/Index.cshtml b/ElectronNET.WebApp/Views/Notifications/Index.cshtml new file mode 100644 index 0000000..02f0fbe --- /dev/null +++ b/ElectronNET.WebApp/Views/Notifications/Index.cshtml @@ -0,0 +1,78 @@ + diff --git a/ElectronNET.WebApp/Views/Shell/Index.cshtml b/ElectronNET.WebApp/Views/Shell/Index.cshtml new file mode 100644 index 0000000..1cdadd7 --- /dev/null +++ b/ElectronNET.WebApp/Views/Shell/Index.cshtml @@ -0,0 +1,71 @@ + diff --git a/ElectronNET.WebApp/Views/Shortcuts/Index.cshtml b/ElectronNET.WebApp/Views/Shortcuts/Index.cshtml new file mode 100644 index 0000000..45879d1 --- /dev/null +++ b/ElectronNET.WebApp/Views/Shortcuts/Index.cshtml @@ -0,0 +1,74 @@ + diff --git a/ElectronNET.WebApp/Views/Tray/Index.cshtml b/ElectronNET.WebApp/Views/Tray/Index.cshtml new file mode 100644 index 0000000..4899a85 --- /dev/null +++ b/ElectronNET.WebApp/Views/Tray/Index.cshtml @@ -0,0 +1,100 @@ + diff --git a/ElectronNET.WebApp/Views/Windows/HandleErrorCrashes.cshtml b/ElectronNET.WebApp/Views/Windows/HandleErrorCrashes.cshtml new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/ElectronNET.WebApp/Views/Windows/HandleErrorCrashes.cshtml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/ElectronNET.WebApp/Views/Windows/Index.cshtml b/ElectronNET.WebApp/Views/Windows/Index.cshtml index cca96a2..7c227ea 100644 --- a/ElectronNET.WebApp/Views/Windows/Index.cshtml +++ b/ElectronNET.WebApp/Views/Windows/Index.cshtml @@ -156,44 +156,45 @@ await Electron.WindowManager.CreateWindowAsync(options);