From c5229d1d00c4060ebb6dd95ebb11ba67893df3f3 Mon Sep 17 00:00:00 2001 From: Gregor Biswanger Date: Mon, 16 Oct 2017 16:53:35 +0200 Subject: [PATCH] implement BrowserWindow-API functions --- ElectronNET.API/BrowserWindow.cs | 722 +++++++++++++++++- ElectronNET.API/Entities/AppDetailsOptions.cs | 30 + .../Entities/BrowserWindowOptions.cs | 35 +- ElectronNET.API/Entities/LoadURLOptions.cs | 22 + .../Entities/ProgressBarOptions.cs | 10 + ElectronNET.API/Menu.cs | 3 +- ElectronNET.API/Tray.cs | 1 + ElectronNET.API/WindowManager.cs | 15 + ElectronNET.Host/api/browserWindows.js | 271 ++++++- ElectronNET.Host/api/browserWindows.js.map | 2 +- ElectronNET.Host/api/browserWindows.ts | 260 ++++++- ElectronNET.WebApp/Startup.cs | 8 +- 12 files changed, 1358 insertions(+), 21 deletions(-) create mode 100644 ElectronNET.API/Entities/AppDetailsOptions.cs create mode 100644 ElectronNET.API/Entities/LoadURLOptions.cs create mode 100644 ElectronNET.API/Entities/ProgressBarOptions.cs diff --git a/ElectronNET.API/BrowserWindow.cs b/ElectronNET.API/BrowserWindow.cs index 790f0f0..d08319d 100644 --- a/ElectronNET.API/BrowserWindow.cs +++ b/ElectronNET.API/BrowserWindow.cs @@ -1,7 +1,11 @@ using ElectronNET.API.Entities; +using ElectronNET.API.Extensions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; namespace ElectronNET.API @@ -10,6 +14,29 @@ namespace ElectronNET.API { public int Id { get; private set; } + public event Action ReadyToShow + { + add + { + if (_readyToShow == null) + { + BridgeConnector.Socket.On("browserWindow-ready-to-show", () => + { + _readyToShow(); + }); + + BridgeConnector.Socket.Emit("register-browserWindow-ready-to-show", Id); + } + _readyToShow += value; + } + remove + { + _readyToShow -= value; + } + } + + private event Action _readyToShow; + internal BrowserWindow(int id) { Id = id; } @@ -602,11 +629,702 @@ namespace ElectronNET.API BridgeConnector.Socket.Emit("browserWindow-setMaximizable", Id, maximizable); } + /// + /// Whether the window can be manually maximized by user. + /// + /// On Linux always returns true. + /// + /// On Linux always returns true. + public Task IsMaximizableAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-isMaximizable-completed", (maximizable) => { + BridgeConnector.Socket.Off("browserWindow-isMaximizable-completed"); + + taskCompletionSource.SetResult((bool)maximizable); + }); + + BridgeConnector.Socket.Emit("browserWindow-isMaximizable", Id); + + return taskCompletionSource.Task; + } + + /// + /// Sets whether the maximize/zoom window button toggles fullscreen mode or maximizes the window. + /// + /// + public void SetFullScreenable(bool fullscreenable) + { + BridgeConnector.Socket.Emit("browserWindow-setFullScreenable", Id, fullscreenable); + } + + /// + /// Whether the maximize/zoom window button toggles fullscreen mode or maximizes the window. + /// + /// + public Task IsFullScreenableAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-isFullScreenable-completed", (fullscreenable) => { + BridgeConnector.Socket.Off("browserWindow-isFullScreenable-completed"); + + taskCompletionSource.SetResult((bool)fullscreenable); + }); + + BridgeConnector.Socket.Emit("browserWindow-isFullScreenable", Id); + + return taskCompletionSource.Task; + } + + /// + /// Sets whether the window can be manually closed by user. On Linux does nothing. + /// + /// + public void SetClosable(bool closable) + { + BridgeConnector.Socket.Emit("browserWindow-setClosable", Id, closable); + } + + /// + /// Whether the window can be manually closed by user. + /// + /// On Linux always returns true. + /// + /// On Linux always returns true. + public Task IsClosableAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-isClosable-completed", (closable) => { + BridgeConnector.Socket.Off("browserWindow-isClosable-completed"); + + taskCompletionSource.SetResult((bool)closable); + }); + + BridgeConnector.Socket.Emit("browserWindow-isClosable", Id); + + return taskCompletionSource.Task; + } + + /// + /// Sets whether the window should show always on top of other windows. + /// After setting this, the window is still a normal window, not a toolbox + /// window which can not be focused on. + /// + /// + public void SetAlwaysOnTop(bool flag) + { + BridgeConnector.Socket.Emit("browserWindow-setAlwaysOnTop", Id, flag); + } + + /// + /// Sets whether the window should show always on top of other windows. + /// After setting this, the window is still a normal window, not a toolbox + /// window which can not be focused on. + /// + /// + /// Values include normal, floating, torn-off-menu, modal-panel, main-menu, + /// status, pop-up-menu and screen-saver. The default is floating. + /// See the macOS docs + public void SetAlwaysOnTop(bool flag, string level) + { + BridgeConnector.Socket.Emit("browserWindow-setAlwaysOnTop", Id, flag, level); + } + + /// + /// Sets whether the window should show always on top of other windows. + /// After setting this, the window is still a normal window, not a toolbox + /// window which can not be focused on. + /// + /// + /// Values include normal, floating, torn-off-menu, modal-panel, main-menu, + /// status, pop-up-menu and screen-saver. The default is floating. + /// See the macOS docs + /// The number of layers higher to set this window relative to the given level. + /// The default is 0. Note that Apple discourages setting levels higher than 1 above screen-saver. + public void SetAlwaysOnTop(bool flag, string level, int relativeLevel) + { + BridgeConnector.Socket.Emit("browserWindow-setAlwaysOnTop", Id, flag, level, relativeLevel); + } + + /// + /// Whether the window is always on top of other windows. + /// + /// + public Task IsAlwaysOnTopAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-isAlwaysOnTop-completed", (isAlwaysOnTop) => { + BridgeConnector.Socket.Off("browserWindow-isAlwaysOnTop-completed"); + + taskCompletionSource.SetResult((bool)isAlwaysOnTop); + }); + + BridgeConnector.Socket.Emit("browserWindow-isAlwaysOnTop", Id); + + return taskCompletionSource.Task; + } + + /// + /// Moves window to the center of the screen. + /// + public void Center() + { + BridgeConnector.Socket.Emit("browserWindow-center", Id); + } + + /// + /// Moves window to x and y. + /// + /// + /// + public void SetPosition(int x, int y) + { + BridgeConnector.Socket.Emit("browserWindow-setPosition", Id, x, y); + } + + /// + /// Moves window to x and y. + /// + /// + /// + /// + public void SetPosition(int x, int y, bool animate) + { + BridgeConnector.Socket.Emit("browserWindow-setPosition", Id, x, y, animate); + } + + /// + /// Contains the window’s current position. + /// + /// + public Task GetPositionAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-getPosition-completed", (position) => { + BridgeConnector.Socket.Off("browserWindow-getPosition-completed"); + + taskCompletionSource.SetResult(((JArray)position).ToObject()); + }); + + BridgeConnector.Socket.Emit("browserWindow-getPosition", Id); + + return taskCompletionSource.Task; + } + + /// + /// Changes the title of native window to title. + /// + /// + public void SetTitle(string title) + { + BridgeConnector.Socket.Emit("browserWindow-setTitle", Id, title); + } + + /// + /// The title of the native window. + /// + /// Note: The title of web page can be different from the title of the native window. + /// + /// + public Task GetTitleAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-getTitle-completed", (title) => { + BridgeConnector.Socket.Off("browserWindow-getTitle-completed"); + + taskCompletionSource.SetResult(title.ToString()); + }); + + BridgeConnector.Socket.Emit("browserWindow-getTitle", Id); + + return taskCompletionSource.Task; + } + + /// + /// Changes the attachment point for sheets on macOS. + /// By default, sheets are attached just below the window frame, + /// but you may want to display them beneath a HTML-rendered toolbar. + /// + /// + public void SetSheetOffset(float offsetY) + { + BridgeConnector.Socket.Emit("browserWindow-setSheetOffset", Id, offsetY); + } + + /// + /// Changes the attachment point for sheets on macOS. + /// By default, sheets are attached just below the window frame, + /// but you may want to display them beneath a HTML-rendered toolbar. + /// + /// + /// + public void SetSheetOffset(float offsetY, float offsetX) + { + BridgeConnector.Socket.Emit("browserWindow-setSheetOffset", Id, offsetY, offsetX); + } + + /// + /// Starts or stops flashing the window to attract user’s attention. + /// + /// + public void FlashFrame(bool flag) + { + BridgeConnector.Socket.Emit("browserWindow-flashFrame", Id, flag); + } + + /// + /// Makes the window not show in the taskbar. + /// + /// + public void SetSkipTaskbar(bool skip) + { + BridgeConnector.Socket.Emit("browserWindow-setSkipTaskbar", Id, skip); + } + + /// + /// Enters or leaves the kiosk mode. + /// + /// + public void SetKiosk(bool flag) + { + BridgeConnector.Socket.Emit("browserWindow-setKiosk", Id, flag); + } + + /// + /// Whether the window is in kiosk mode. + /// + /// + public Task IsKioskAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-isKiosk-completed", (isKiosk) => { + BridgeConnector.Socket.Off("browserWindow-isKiosk-completed"); + + taskCompletionSource.SetResult((bool)isKiosk); + }); + + BridgeConnector.Socket.Emit("browserWindow-isKiosk", Id); + + return taskCompletionSource.Task; + } + + /// + /// Sets the pathname of the file the window represents, + /// and the icon of the file will show in window’s title bar. + /// + /// + public void SetRepresentedFilename(string filename) + { + BridgeConnector.Socket.Emit("browserWindow-setRepresentedFilename", Id, filename); + } + + /// + /// The pathname of the file the window represents. + /// + /// + public Task GetRepresentedFilenameAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-getRepresentedFilename-completed", (pathname) => { + BridgeConnector.Socket.Off("browserWindow-getRepresentedFilename-completed"); + + taskCompletionSource.SetResult(pathname.ToString()); + }); + + BridgeConnector.Socket.Emit("browserWindow-getRepresentedFilename", Id); + + return taskCompletionSource.Task; + } + + /// + /// Specifies whether the window’s document has been edited, + /// and the icon in title bar will become gray when set to true. + /// + /// + public void SetDocumentEdited(bool edited) + { + BridgeConnector.Socket.Emit("browserWindow-setDocumentEdited", Id, edited); + } + + /// + /// Whether the window’s document has been edited. + /// + /// + public Task IsDocumentEditedAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-isDocumentEdited-completed", (edited) => { + BridgeConnector.Socket.Off("browserWindow-isDocumentEdited-completed"); + + taskCompletionSource.SetResult((bool)edited); + }); + + BridgeConnector.Socket.Emit("browserWindow-isDocumentEdited", Id); + + return taskCompletionSource.Task; + } + + public void FocusOnWebView() + { + BridgeConnector.Socket.Emit("browserWindow-focusOnWebView", Id); + } + + public void BlurWebView() + { + BridgeConnector.Socket.Emit("browserWindow-blurWebView", Id); + } + + /// + /// The url can be a remote address (e.g. http://) or + /// a path to a local HTML file using the file:// protocol. + /// + /// + public void LoadURL(string url) + { + BridgeConnector.Socket.Emit("browserWindow-loadURL", Id, url); + } + + /// + /// The url can be a remote address (e.g. http://) or + /// a path to a local HTML file using the file:// protocol. + /// + /// + /// + public void LoadURL(string url, LoadURLOptions options) + { + BridgeConnector.Socket.Emit("browserWindow-loadURL", Id, url, JObject.FromObject(options, _jsonSerializer)); + } + + /// + /// Same as webContents.reload. + /// + public void Reload() + { + BridgeConnector.Socket.Emit("browserWindow-reload", Id); + } + + public IReadOnlyCollection Items { get { return _items.AsReadOnly(); } } + private List _items = new List(); + + /// + /// Sets the menu as the window’s menu bar, + /// setting it to null will remove the menu bar. + /// + /// + public void SetMenu(MenuItem[] menuItems) + { + menuItems.AddMenuItemsId(); + BridgeConnector.Socket.Emit("browserWindow-setMenu", JArray.FromObject(menuItems, _jsonSerializer)); + _items.AddRange(menuItems); + + BridgeConnector.Socket.Off("windowMenuItemClicked"); + BridgeConnector.Socket.On("windowMenuItemClicked", (id) => { + MenuItem menuItem = _items.GetMenuItem(id.ToString()); + menuItem?.Click(); + }); + } + + /// + /// Sets progress value in progress bar. Valid range is [0, 1.0]. Remove progress + /// bar when progress < 0; Change to indeterminate mode when progress > 1. On Linux + /// platform, only supports Unity desktop environment, you need to specify the + /// .desktop file name to desktopName field in package.json.By default, it will + /// assume app.getName().desktop.On Windows, a mode can be passed.Accepted values + /// are none, normal, indeterminate, error, and paused. If you call setProgressBar + /// without a mode set (but with a value within the valid range), normal will be + /// assumed. + /// + /// + public void SetProgressBar(int progress) + { + BridgeConnector.Socket.Emit("browserWindow-setProgressBar", Id, progress); + } + + /// + /// Sets progress value in progress bar. Valid range is [0, 1.0]. Remove progress + /// bar when progress < 0; Change to indeterminate mode when progress > 1. On Linux + /// platform, only supports Unity desktop environment, you need to specify the + /// .desktop file name to desktopName field in package.json.By default, it will + /// assume app.getName().desktop.On Windows, a mode can be passed.Accepted values + /// are none, normal, indeterminate, error, and paused. If you call setProgressBar + /// without a mode set (but with a value within the valid range), normal will be + /// assumed. + /// + /// + /// + public void SetProgressBar(int progress, ProgressBarOptions progressBarOptions) + { + BridgeConnector.Socket.Emit("browserWindow-setProgressBar", Id, progress, JObject.FromObject(progressBarOptions, _jsonSerializer)); + } + + /// + /// Sets whether the window should have a shadow. On Windows and Linux does nothing. + /// + /// + public void SetHasShadow(bool hasShadow) + { + BridgeConnector.Socket.Emit("browserWindow-setHasShadow", Id, hasShadow); + } + + /// + /// Whether the window has a shadow. + /// + /// On Windows and Linux always returns true. + /// + /// + public Task HasShadowAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-hasShadow-completed", (hasShadow) => { + BridgeConnector.Socket.Off("browserWindow-hasShadow-completed"); + + taskCompletionSource.SetResult((bool)hasShadow); + }); + + BridgeConnector.Socket.Emit("browserWindow-hasShadow", Id); + + return taskCompletionSource.Task; + } + + /// + /// Sets the properties for the window’s taskbar button. + /// + /// Note: relaunchCommand and relaunchDisplayName must always be set together. + /// If one of those properties is not set, then neither will be used. + /// + /// + public void SetAppDetails(AppDetailsOptions options) + { + BridgeConnector.Socket.Emit("browserWindow-setAppDetails", Id, JObject.FromObject(options, _jsonSerializer)); + } + + /// + /// Same as webContents.showDefinitionForSelection(). + /// + public void ShowDefinitionForSelection() + { + BridgeConnector.Socket.Emit("browserWindow-showDefinitionForSelection", Id); + } + + /// + /// Sets whether the window menu bar should hide itself automatically. + /// Once set the menu bar will only show when users press the single Alt key. + /// + /// If the menu bar is already visible, calling setAutoHideMenuBar(true) won’t hide it immediately. + /// + /// + public void SetAutoHideMenuBar(bool hide) + { + BridgeConnector.Socket.Emit("browserWindow-setAutoHideMenuBar", Id, hide); + } + + /// + /// Whether menu bar automatically hides itself. + /// + /// + public Task IsMenuBarAutoHideAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-isMenuBarAutoHide-completed", (isMenuBarAutoHide) => { + BridgeConnector.Socket.Off("browserWindow-isMenuBarAutoHide-completed"); + + taskCompletionSource.SetResult((bool)isMenuBarAutoHide); + }); + + BridgeConnector.Socket.Emit("browserWindow-isMenuBarAutoHide", Id); + + return taskCompletionSource.Task; + } + + /// + /// Sets whether the menu bar should be visible. If the menu bar is auto-hide, + /// users can still bring up the menu bar by pressing the single Alt key. + /// + /// + public void SetMenuBarVisibility(bool visible) + { + BridgeConnector.Socket.Emit("browserWindow-setMenuBarVisibility", Id, visible); + } + + /// + /// Whether the menu bar is visible. + /// + /// + public Task IsMenuBarVisibleAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-isMenuBarVisible-completed", (isMenuBarVisible) => { + BridgeConnector.Socket.Off("browserWindow-isMenuBarVisible-completed"); + + taskCompletionSource.SetResult((bool)isMenuBarVisible); + }); + + BridgeConnector.Socket.Emit("browserWindow-isMenuBarVisible", Id); + + return taskCompletionSource.Task; + } + + /// + /// Sets whether the window should be visible on all workspaces. + /// + /// Note: This API does nothing on Windows. + /// + /// + public void SetVisibleOnAllWorkspaces(bool visible) + { + BridgeConnector.Socket.Emit("browserWindow-setVisibleOnAllWorkspaces", Id, visible); + } + + /// + /// Whether the window is visible on all workspaces. + /// + /// Note: This API always returns false on Windows. + /// + /// + public Task IsVisibleOnAllWorkspacesAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-isVisibleOnAllWorkspaces-completed", (isVisibleOnAllWorkspaces) => { + BridgeConnector.Socket.Off("browserWindow-isVisibleOnAllWorkspaces-completed"); + + taskCompletionSource.SetResult((bool)isVisibleOnAllWorkspaces); + }); + + BridgeConnector.Socket.Emit("browserWindow-isVisibleOnAllWorkspaces", Id); + + return taskCompletionSource.Task; + } + + /// + /// Makes the window ignore all mouse events. + /// + /// All mouse events happened in this window will be passed to the window + /// below this window, but if this window has focus, it will still receive keyboard events. + /// + /// + public void SetIgnoreMouseEvents(bool ignore) + { + BridgeConnector.Socket.Emit("browserWindow-setIgnoreMouseEvents", Id, ignore); + } + + /// + /// Prevents the window contents from being captured by other apps. + /// + /// On macOS it sets the NSWindow’s sharingType to NSWindowSharingNone. + /// On Windows it calls SetWindowDisplayAffinity with WDA_MONITOR. + /// + /// + public void SetContentProtection(bool enable) + { + BridgeConnector.Socket.Emit("browserWindow-setContentProtection", Id, enable); + } + + /// + /// Changes whether the window can be focused. + /// + /// + public void SetFocusable(bool focusable) + { + BridgeConnector.Socket.Emit("browserWindow-setFocusable", Id, focusable); + } + + /// + /// Sets parent as current window’s parent window, + /// passing null will turn current window into a top-level window. + /// + /// + public void SetParentWindow(BrowserWindow parent) + { + BridgeConnector.Socket.Emit("browserWindow-setParentWindow", Id, JObject.FromObject(parent, _jsonSerializer)); + } + + /// + /// The parent window. + /// + /// + public Task GetParentWindowAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("browserWindow-getParentWindow-completed", (id) => { + BridgeConnector.Socket.Off("browserWindow-getParentWindow-completed"); + var browserWindowId = int.Parse(id.ToString()); + var browserWindow = Electron.WindowManager.BrowserWindows.ToList().Single(x => x.Id == browserWindowId); + + taskCompletionSource.SetResult(browserWindow); + }); + + BridgeConnector.Socket.Emit("browserWindow-getParentWindow", Id); + + return taskCompletionSource.Task; + } + + /// + /// All child windows. + /// + /// + public Task> GetChildWindowsAsync() + { + var taskCompletionSource = new TaskCompletionSource>(); + + BridgeConnector.Socket.On("browserWindow-getChildWindows-completed", (ids) => { + BridgeConnector.Socket.Off("browserWindow-getChildWindows-completed"); + var browserWindowIds = ((JArray)ids).ToObject(); + var browserWindows = new List(); + + browserWindowIds.ToList().ForEach(id => + { + var browserWindow = Electron.WindowManager.BrowserWindows.ToList().Single(x => x.Id == id); + browserWindows.Add(browserWindow); + }); + + + taskCompletionSource.SetResult(browserWindows); + }); + + BridgeConnector.Socket.Emit("browserWindow-getChildWindows", Id); + + return taskCompletionSource.Task; + } + + /// + /// Controls whether to hide cursor when typing. + /// + /// + public void SetAutoHideCursor(bool autoHide) + { + BridgeConnector.Socket.Emit("browserWindow-setAutoHideCursor", Id, autoHide); + } + + /// + /// Adds a vibrancy effect to the browser window. + /// Passing null or an empty string will remove the vibrancy effect on the window. + /// + /// Can be appearance-based, light, dark, titlebar, selection, + /// menu, popover, sidebar, medium-light or ultra-dark. + /// See the macOS documentation for more details. + public void SetVibrancy(string type) + { + BridgeConnector.Socket.Emit("browserWindow-setVibrancy", Id, type); + } + private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore + NullValueHandling = NullValueHandling.Ignore }; } } diff --git a/ElectronNET.API/Entities/AppDetailsOptions.cs b/ElectronNET.API/Entities/AppDetailsOptions.cs new file mode 100644 index 0000000..e05417c --- /dev/null +++ b/ElectronNET.API/Entities/AppDetailsOptions.cs @@ -0,0 +1,30 @@ +namespace ElectronNET.API.Entities +{ + public class AppDetailsOptions + { + /// + /// Window’s App User Model ID. It has to be set, otherwise the other options will have no effect. + /// + public string AppId { get; set; } + + /// + /// Window’s Relaunch Icon. + /// + public string AppIconPath { get; set; } + + /// + /// Index of the icon in appIconPath. Ignored when appIconPath is not set. Default is 0. + /// + public int AppIconIndex { get; set; } + + /// + /// Window’s Relaunch Command. + /// + public string RelaunchCommand { get; set; } + + /// + /// Window’s Relaunch Display Name. + /// + public string RelaunchDisplayName { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/BrowserWindowOptions.cs b/ElectronNET.API/Entities/BrowserWindowOptions.cs index 9e6ed33..975f767 100644 --- a/ElectronNET.API/Entities/BrowserWindowOptions.cs +++ b/ElectronNET.API/Entities/BrowserWindowOptions.cs @@ -1,4 +1,6 @@ -namespace ElectronNET.API.Entities +using System.ComponentModel; + +namespace ElectronNET.API.Entities { public class BrowserWindowOptions { @@ -26,7 +28,7 @@ /// /// The width and height would be used as web page's size, which means the actual - /// window's size will include window frame's size and be slightly larger.Default + /// window's size will include window frame's size and be slightly larger. Default /// is false. /// public bool UseContentSize { get; set; } @@ -59,27 +61,32 @@ /// /// Whether window is resizable. Default is true. /// - public bool Resizable { get; set; } + [DefaultValue(true)] + public bool Resizable { get; set; } = true; /// /// Whether window is movable. This is not implemented on Linux. Default is true. /// - public bool Movable { get; set; } + [DefaultValue(true)] + public bool Movable { get; set; } = true; /// /// Whether window is minimizable. This is not implemented on Linux. Default is true. /// - public bool Minimizable { get; set; } + [DefaultValue(true)] + public bool Minimizable { get; set; } = true; /// /// Whether window is maximizable. This is not implemented on Linux. Default is true. /// - public bool Maximizable { get; set; } + [DefaultValue(true)] + public bool Maximizable { get; set; } = true; /// /// Whether window is closable. This is not implemented on Linux. Default is true. /// - public bool Closable { get; set; } + [DefaultValue(true)] + public bool Closable { get; set; } = true; /// /// Whether the window can be focused. Default is true. On Windows setting @@ -87,7 +94,8 @@ /// focusable: false makes the window stop interacting with wm, so the window will /// always stay on top in all workspaces. /// - public bool Focusable { get; set; } + [DefaultValue(true)] + public bool Focusable { get; set; } = true; /// /// Whether the window should always stay on top of other windows. Default is false. @@ -131,12 +139,14 @@ /// /// Whether window should be shown when created. Default is true. /// - public bool Show { get; set; } + [DefaultValue(true)] + public bool Show { get; set; } = true; /// /// Specify false to create a . Default is true. /// - public bool Frame { get; set; } + [DefaultValue(true)] + public bool Frame { get; set; } = true; /// /// Whether this is a modal window. This only works when the window is a child @@ -208,9 +218,10 @@ /// /// Use WS_THICKFRAME style for frameless windows on Windows, which adds standard /// window frame.Setting it to false will remove window shadow and window - /// animations.Default is true. + /// animations. Default is true. /// - public bool ThickFrame { get; set; } + [DefaultValue(true)] + public bool ThickFrame { get; set; } = true; /// /// Add a type of vibrancy effect to the window, only on macOS. Can be diff --git a/ElectronNET.API/Entities/LoadURLOptions.cs b/ElectronNET.API/Entities/LoadURLOptions.cs new file mode 100644 index 0000000..bd897ab --- /dev/null +++ b/ElectronNET.API/Entities/LoadURLOptions.cs @@ -0,0 +1,22 @@ +namespace ElectronNET.API.Entities +{ + public class LoadURLOptions + { + /// + /// A HTTP Referrer url. + /// + public string HttpReferrer { get; set; } + + /// + /// A user agent originating the request. + /// + public string UserAgent { get; set; } + + /// + /// Base url (with trailing path separator) for files to be loaded by the data url. + /// This is needed only if the specified url is a data url and needs to load other + /// files. + /// + public string BaseURLForDataURL { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Entities/ProgressBarOptions.cs b/ElectronNET.API/Entities/ProgressBarOptions.cs new file mode 100644 index 0000000..af2023c --- /dev/null +++ b/ElectronNET.API/Entities/ProgressBarOptions.cs @@ -0,0 +1,10 @@ +namespace ElectronNET.API.Entities +{ + public class ProgressBarOptions + { + /// + /// Mode for the progress bar. Can be 'none' | 'normal' | 'indeterminate' | 'error' | 'paused'. + /// + public string Mode { get; set; } + } +} \ No newline at end of file diff --git a/ElectronNET.API/Menu.cs b/ElectronNET.API/Menu.cs index cfd1af5..e35ec4e 100644 --- a/ElectronNET.API/Menu.cs +++ b/ElectronNET.API/Menu.cs @@ -3,8 +3,6 @@ using Newtonsoft.Json.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Collections.Generic; -using System; -using System.Linq; using ElectronNET.API.Extensions; namespace ElectronNET.API @@ -37,6 +35,7 @@ namespace ElectronNET.API BridgeConnector.Socket.Emit("menu-setApplicationMenu", JArray.FromObject(menuItems, _jsonSerializer)); _items.AddRange(menuItems); + BridgeConnector.Socket.Off("menuItemClicked"); BridgeConnector.Socket.On("menuItemClicked", (id) => { MenuItem menuItem = _items.GetMenuItem(id.ToString()); menuItem?.Click(); diff --git a/ElectronNET.API/Tray.cs b/ElectronNET.API/Tray.cs index 01599d9..bbb23dc 100644 --- a/ElectronNET.API/Tray.cs +++ b/ElectronNET.API/Tray.cs @@ -35,6 +35,7 @@ namespace ElectronNET.API BridgeConnector.Socket.Emit("create-tray", image, JArray.FromObject(menuItems, _jsonSerializer)); _items.AddRange(menuItems); + BridgeConnector.Socket.Off("trayMenuItemClicked"); BridgeConnector.Socket.On("trayMenuItemClicked", (id) => { MenuItem menuItem = _items.GetMenuItem(id.ToString()); menuItem?.Click(); diff --git a/ElectronNET.API/WindowManager.cs b/ElectronNET.API/WindowManager.cs index 2103041..7c91da0 100644 --- a/ElectronNET.API/WindowManager.cs +++ b/ElectronNET.API/WindowManager.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; namespace ElectronNET.API @@ -49,6 +50,20 @@ namespace ElectronNET.API taskCompletionSource.SetResult(browserWindow); }); + BridgeConnector.Socket.Off("BrowserWindowClosed"); + BridgeConnector.Socket.On("BrowserWindowClosed", (ids) => + { + var browserWindowIds = ((JArray)ids).ToObject(); + + for (int index = 0; index < _browserWindows.Count; index++) + { + if (!browserWindowIds.Contains(_browserWindows[index].Id)) + { + _browserWindows.RemoveAt(index); + } + } + }); + if (loadUrl.ToUpper() == "HTTP://LOCALHOST") { loadUrl = $"{loadUrl}:{BridgeSettings.WebPort}"; diff --git a/ElectronNET.Host/api/browserWindows.js b/ElectronNET.Host/api/browserWindows.js index 9ff87d5..c7e4161 100644 --- a/ElectronNET.Host/api/browserWindows.js +++ b/ElectronNET.Host/api/browserWindows.js @@ -3,19 +3,31 @@ exports.__esModule = true; var electron_1 = require("electron"); var windows = []; module.exports = function (socket) { + socket.on('register-browserWindow-ready-to-show', function (id) { + getWindowById(id).on('ready-to-show', function () { + socket.emit('browserWindow-ready-to-show'); + }); + }); socket.on('createBrowserWindow', function (options, loadUrl) { var window = new electron_1.BrowserWindow(options); window.on('closed', function (sender) { - for (var index = 0; index < windows.length; index++) { - var windowItem = windows[index]; + var _loop_1 = function () { + windowItem = windows[index]; try { windowItem.id; } catch (error) { if (error.message === 'Object has been destroyed') { windows.splice(index, 1); + var ids_1 = []; + windows.forEach(function (x) { return ids_1.push(x.id); }); + socket.emit('BrowserWindowClosed', ids_1); } } + }; + var windowItem; + for (var index = 0; index < windows.length; index++) { + _loop_1(); } }); if (loadUrl) { @@ -88,6 +100,261 @@ module.exports = function (socket) { var isFullScreen = getWindowById(id).isFullScreen(); socket.emit('browserWindow-isFullScreen-completed', isFullScreen); }); + socket.on('browserWindow-setAspectRatio', function (id, aspectRatio, extraSize) { + getWindowById(id).setAspectRatio(aspectRatio, extraSize); + }); + socket.on('browserWindow-previewFile', function (id, path, displayname) { + getWindowById(id).previewFile(path, displayname); + }); + socket.on('browserWindow-closeFilePreview', function (id) { + getWindowById(id).closeFilePreview(); + }); + socket.on('browserWindow-setBounds', function (id, bounds, animate) { + getWindowById(id).setBounds(bounds, animate); + }); + socket.on('browserWindow-getBounds', function (id) { + var rectangle = getWindowById(id).getBounds(); + socket.emit('browserWindow-getBounds-completed', rectangle); + }); + socket.on('browserWindow-setContentBounds', function (id, bounds, animate) { + getWindowById(id).setContentBounds(bounds, animate); + }); + socket.on('browserWindow-getContentBounds', function (id) { + var rectangle = getWindowById(id).getContentBounds(); + socket.emit('browserWindow-getContentBounds-completed', rectangle); + }); + socket.on('browserWindow-setSize', function (id, width, height, animate) { + getWindowById(id).setSize(width, height, animate); + }); + socket.on('browserWindow-getSize', function (id) { + var size = getWindowById(id).getSize(); + socket.emit('browserWindow-getSize-completed', size); + }); + socket.on('browserWindow-setContentSize', function (id, width, height, animate) { + getWindowById(id).setContentSize(width, height, animate); + }); + socket.on('browserWindow-getContentSize', function (id) { + var size = getWindowById(id).getContentSize(); + socket.emit('browserWindow-getContentSize-completed', size); + }); + socket.on('browserWindow-setMinimumSize', function (id, width, height) { + getWindowById(id).setMinimumSize(width, height); + }); + socket.on('browserWindow-getMinimumSize', function (id) { + var size = getWindowById(id).getMinimumSize(); + socket.emit('browserWindow-getMinimumSize-completed', size); + }); + socket.on('browserWindow-setMaximumSize', function (id, width, height) { + getWindowById(id).setMaximumSize(width, height); + }); + socket.on('browserWindow-getMaximumSize', function (id) { + var size = getWindowById(id).getMaximumSize(); + socket.emit('browserWindow-getMaximumSize-completed', size); + }); + socket.on('browserWindow-setResizable', function (id, resizable) { + getWindowById(id).setResizable(resizable); + }); + socket.on('browserWindow-isResizable', function (id) { + var resizable = getWindowById(id).isResizable(); + socket.emit('browserWindow-isResizable-completed', resizable); + }); + socket.on('browserWindow-setMovable', function (id, movable) { + getWindowById(id).setMovable(movable); + }); + socket.on('browserWindow-isMovable', function (id) { + var movable = getWindowById(id).isMovable(); + socket.emit('browserWindow-isMovable-completed', movable); + }); + socket.on('browserWindow-setMinimizable', function (id, minimizable) { + getWindowById(id).setMinimizable(minimizable); + }); + socket.on('browserWindow-isMinimizable', function (id) { + var minimizable = getWindowById(id).isMinimizable(); + socket.emit('browserWindow-isMinimizable-completed', minimizable); + }); + socket.on('browserWindow-setMaximizable', function (id, maximizable) { + getWindowById(id).setMaximizable(maximizable); + }); + socket.on('browserWindow-isMaximizable', function (id) { + var maximizable = getWindowById(id).isMaximizable(); + socket.emit('browserWindow-isMaximizable-completed', maximizable); + }); + socket.on('browserWindow-setFullScreenable', function (id, fullscreenable) { + getWindowById(id).setFullScreenable(fullscreenable); + }); + socket.on('browserWindow-isFullScreenable', function (id) { + var fullscreenable = getWindowById(id).isFullScreenable(); + socket.emit('browserWindow-isFullScreenable-completed', fullscreenable); + }); + socket.on('browserWindow-setClosable', function (id, closable) { + getWindowById(id).setClosable(closable); + }); + socket.on('browserWindow-isClosable', function (id) { + var closable = getWindowById(id).isClosable(); + socket.emit('browserWindow-isClosable-completed', closable); + }); + socket.on('browserWindow-setAlwaysOnTop', function (id, flag, level, relativeLevel) { + getWindowById(id).setAlwaysOnTop(flag, level, relativeLevel); + }); + socket.on('browserWindow-isAlwaysOnTop', function (id) { + var isAlwaysOnTop = getWindowById(id).isAlwaysOnTop(); + socket.emit('browserWindow-isAlwaysOnTop-completed', isAlwaysOnTop); + }); + socket.on('browserWindow-center', function (id) { + getWindowById(id).center(); + }); + socket.on('browserWindow-setPosition', function (id, x, y, animate) { + getWindowById(id).setPosition(x, y, animate); + }); + socket.on('browserWindow-getPosition', function (id) { + var position = getWindowById(id).getPosition(); + socket.emit('browserWindow-getPosition-completed', position); + }); + socket.on('browserWindow-setTitle', function (id, title) { + getWindowById(id).setTitle(title); + }); + socket.on('browserWindow-getTitle', function (id) { + var title = getWindowById(id).getTitle(); + socket.emit('browserWindow-getTitle-completed', title); + }); + socket.on('browserWindow-setTitle', function (id, title) { + getWindowById(id).setTitle(title); + }); + socket.on('browserWindow-setSheetOffset', function (id, offsetY, offsetX) { + if (offsetX) { + getWindowById(id).setSheetOffset(offsetY, offsetX); + } + else { + getWindowById(id).setSheetOffset(offsetY); + } + }); + socket.on('browserWindow-flashFrame', function (id, flag) { + getWindowById(id).flashFrame(flag); + }); + socket.on('browserWindow-setSkipTaskbar', function (id, skip) { + getWindowById(id).setSkipTaskbar(skip); + }); + socket.on('browserWindow-setKiosk', function (id, flag) { + getWindowById(id).setKiosk(flag); + }); + socket.on('browserWindow-isKiosk', function (id) { + var isKiosk = getWindowById(id).isKiosk(); + socket.emit('browserWindow-isKiosk-completed', isKiosk); + }); + socket.on('browserWindow-setRepresentedFilename', function (id, filename) { + getWindowById(id).setRepresentedFilename(filename); + }); + socket.on('browserWindow-getRepresentedFilename', function (id) { + var pathname = getWindowById(id).getRepresentedFilename(); + socket.emit('browserWindow-getRepresentedFilename-completed', pathname); + }); + socket.on('browserWindow-setDocumentEdited', function (id, edited) { + getWindowById(id).setDocumentEdited(edited); + }); + socket.on('browserWindow-isDocumentEdited', function (id) { + var edited = getWindowById(id).isDocumentEdited(); + socket.emit('browserWindow-isDocumentEdited-completed', edited); + }); + socket.on('browserWindow-focusOnWebView', function (id) { + getWindowById(id).focusOnWebView(); + }); + socket.on('browserWindow-blurWebView', function (id) { + getWindowById(id).blurWebView(); + }); + socket.on('browserWindow-loadURL', function (id, url, options) { + getWindowById(id).loadURL(url, options); + }); + socket.on('browserWindow-reload', function (id) { + getWindowById(id).reload(); + }); + socket.on('browserWindow-setMenu', function (id, menuItems) { + var menu = null; + if (menuItems) { + menu = electron_1.Menu.buildFromTemplate(menuItems); + addMenuItemClickConnector(menu.items, function (id) { + socket.emit("windowMenuItemClicked", id); + }); + } + getWindowById(id).setMenu(menu); + }); + function addMenuItemClickConnector(menuItems, callback) { + menuItems.forEach(function (item) { + if (item.submenu && item.submenu.items.length > 0) { + addMenuItemClickConnector(item.submenu.items, callback); + } + if ("id" in item && item.id) { + item.click = function () { callback(item.id); }; + } + }); + } + socket.on('browserWindow-setProgressBar', function (id, progress) { + getWindowById(id).setProgressBar(progress); + }); + socket.on('browserWindow-setHasShadow', function (id, hasShadow) { + getWindowById(id).setHasShadow(hasShadow); + }); + socket.on('browserWindow-hasShadow', function (id) { + var hasShadow = getWindowById(id).hasShadow(); + socket.emit('browserWindow-hasShadow-completed', hasShadow); + }); + socket.on('browserWindow-setAppDetails', function (id, options) { + getWindowById(id).setAppDetails(options); + }); + socket.on('browserWindow-showDefinitionForSelection', function (id) { + getWindowById(id).showDefinitionForSelection(); + }); + socket.on('browserWindow-setAutoHideMenuBar', function (id, hide) { + getWindowById(id).setAutoHideMenuBar(hide); + }); + socket.on('browserWindow-isMenuBarAutoHide', function (id) { + var isMenuBarAutoHide = getWindowById(id).isMenuBarAutoHide(); + socket.emit('browserWindow-isMenuBarAutoHide-completed', isMenuBarAutoHide); + }); + socket.on('browserWindow-setMenuBarVisibility', function (id, visible) { + getWindowById(id).setMenuBarVisibility(visible); + }); + socket.on('browserWindow-isMenuBarVisible', function (id) { + var isMenuBarVisible = getWindowById(id).isMenuBarVisible(); + socket.emit('browserWindow-isMenuBarVisible-completed', isMenuBarVisible); + }); + socket.on('browserWindow-setVisibleOnAllWorkspaces', function (id, visible) { + getWindowById(id).setVisibleOnAllWorkspaces(visible); + }); + socket.on('browserWindow-isVisibleOnAllWorkspaces', function (id) { + var isVisibleOnAllWorkspaces = getWindowById(id).isVisibleOnAllWorkspaces(); + socket.emit('browserWindow-isVisibleOnAllWorkspaces-completed', isVisibleOnAllWorkspaces); + }); + socket.on('browserWindow-setIgnoreMouseEvents', function (id, ignore) { + getWindowById(id).setIgnoreMouseEvents(ignore); + }); + socket.on('browserWindow-setContentProtection', function (id, enable) { + getWindowById(id).setContentProtection(enable); + }); + socket.on('browserWindow-setFocusable', function (id, focusable) { + getWindowById(id).setFocusable(focusable); + }); + socket.on('browserWindow-setParentWindow', function (id, parent) { + var browserWindow = electron_1.BrowserWindow.fromId(parent.id); + getWindowById(id).setParentWindow(browserWindow); + }); + socket.on('browserWindow-getParentWindow', function (id) { + var browserWindow = getWindowById(id).getParentWindow(); + socket.emit('browserWindow-getParentWindow-completed', browserWindow.id); + }); + socket.on('browserWindow-getChildWindows', function (id) { + var browserWindows = getWindowById(id).getChildWindows(); + var ids = []; + browserWindows.forEach(function (x) { + ids.push(x.id); + }); + socket.emit('browserWindow-getChildWindows-completed', ids); + }); + socket.on('browserWindow-setAutoHideCursor', function (id, autoHide) { + getWindowById(id).setAutoHideCursor(autoHide); + }); + socket.on('browserWindow-setVibrancy', function (id, type) { + getWindowById(id).setVibrancy(type); + }); function getWindowById(id) { for (var index = 0; index < windows.length; index++) { var element = windows[index]; diff --git a/ElectronNET.Host/api/browserWindows.js.map b/ElectronNET.Host/api/browserWindows.js.map index b819a5b..117d108 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":"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"} \ No newline at end of file diff --git a/ElectronNET.Host/api/browserWindows.ts b/ElectronNET.Host/api/browserWindows.ts index 0614241..fe59047 100644 --- a/ElectronNET.Host/api/browserWindows.ts +++ b/ElectronNET.Host/api/browserWindows.ts @@ -1,7 +1,13 @@ -import { BrowserWindow } from "electron"; +import { BrowserWindow, Menu } from "electron"; 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'); + }); + }); + socket.on('createBrowserWindow', (options, loadUrl) => { let window = new BrowserWindow(options); @@ -13,6 +19,10 @@ module.exports = (socket: SocketIO.Server) => { } catch (error) { if (error.message === 'Object has been destroyed') { windows.splice(index, 1); + + const ids = []; + windows.forEach(x => ids.push(x.id)); + socket.emit('BrowserWindowClosed', ids); } } } @@ -222,6 +232,254 @@ module.exports = (socket: SocketIO.Server) => { getWindowById(id).setMaximizable(maximizable); }); + socket.on('browserWindow-isMaximizable', (id) => { + const maximizable = getWindowById(id).isMaximizable(); + + socket.emit('browserWindow-isMaximizable-completed', maximizable); + }); + + socket.on('browserWindow-setFullScreenable', (id, fullscreenable) => { + getWindowById(id).setFullScreenable(fullscreenable); + }); + + socket.on('browserWindow-isFullScreenable', (id) => { + const fullscreenable = getWindowById(id).isFullScreenable(); + + socket.emit('browserWindow-isFullScreenable-completed', fullscreenable); + }); + + socket.on('browserWindow-setClosable', (id, closable) => { + getWindowById(id).setClosable(closable); + }); + + socket.on('browserWindow-isClosable', (id) => { + const closable = getWindowById(id).isClosable(); + + socket.emit('browserWindow-isClosable-completed', closable); + }); + + socket.on('browserWindow-setAlwaysOnTop', (id, flag, level, relativeLevel) => { + getWindowById(id).setAlwaysOnTop(flag, level, relativeLevel); + }); + + socket.on('browserWindow-isAlwaysOnTop', (id) => { + const isAlwaysOnTop = getWindowById(id).isAlwaysOnTop(); + + socket.emit('browserWindow-isAlwaysOnTop-completed', isAlwaysOnTop); + }); + + socket.on('browserWindow-center', (id) => { + getWindowById(id).center(); + }); + + socket.on('browserWindow-setPosition', (id, x, y, animate) => { + getWindowById(id).setPosition(x, y, animate); + }); + + socket.on('browserWindow-getPosition', (id) => { + const position = getWindowById(id).getPosition(); + + socket.emit('browserWindow-getPosition-completed', position); + }); + + socket.on('browserWindow-setTitle', (id, title) => { + getWindowById(id).setTitle(title); + }); + + socket.on('browserWindow-getTitle', (id) => { + const title = getWindowById(id).getTitle(); + + socket.emit('browserWindow-getTitle-completed', title); + }); + + socket.on('browserWindow-setTitle', (id, title) => { + getWindowById(id).setTitle(title); + }); + + socket.on('browserWindow-setSheetOffset', (id, offsetY, offsetX) => { + if(offsetX) { + getWindowById(id).setSheetOffset(offsetY, offsetX); + } else { + getWindowById(id).setSheetOffset(offsetY); + } + }); + + socket.on('browserWindow-flashFrame', (id, flag) => { + getWindowById(id).flashFrame(flag); + }); + + socket.on('browserWindow-setSkipTaskbar', (id, skip) => { + getWindowById(id).setSkipTaskbar(skip); + }); + + socket.on('browserWindow-setKiosk', (id, flag) => { + getWindowById(id).setKiosk(flag); + }); + + socket.on('browserWindow-isKiosk', (id) => { + const isKiosk = getWindowById(id).isKiosk(); + + socket.emit('browserWindow-isKiosk-completed', isKiosk); + }); + + socket.on('browserWindow-setRepresentedFilename', (id, filename) => { + getWindowById(id).setRepresentedFilename(filename); + }); + + socket.on('browserWindow-getRepresentedFilename', (id) => { + const pathname = getWindowById(id).getRepresentedFilename(); + + socket.emit('browserWindow-getRepresentedFilename-completed', pathname); + }); + + socket.on('browserWindow-setDocumentEdited', (id, edited) => { + getWindowById(id).setDocumentEdited(edited); + }); + + socket.on('browserWindow-isDocumentEdited', (id) => { + const edited = getWindowById(id).isDocumentEdited(); + + socket.emit('browserWindow-isDocumentEdited-completed', edited); + }); + + socket.on('browserWindow-focusOnWebView', (id) => { + getWindowById(id).focusOnWebView(); + }); + + socket.on('browserWindow-blurWebView', (id) => { + getWindowById(id).blurWebView(); + }); + + socket.on('browserWindow-loadURL', (id, url, options) => { + getWindowById(id).loadURL(url, options); + }); + + socket.on('browserWindow-reload', (id) => { + getWindowById(id).reload(); + }); + + socket.on('browserWindow-setMenu', (id, menuItems) => { + let menu = null; + + if(menuItems) { + menu = Menu.buildFromTemplate(menuItems); + + addMenuItemClickConnector(menu.items, (id) => { + socket.emit("windowMenuItemClicked", id); + }); + } + + getWindowById(id).setMenu(menu); + }); + + function addMenuItemClickConnector(menuItems, callback) { + menuItems.forEach((item) => { + if(item.submenu && item.submenu.items.length > 0) { + addMenuItemClickConnector(item.submenu.items, callback); + } + + if("id" in item && item.id) { + item.click = () => { callback(item.id); }; + } + }); + } + + socket.on('browserWindow-setProgressBar', (id, progress) => { + getWindowById(id).setProgressBar(progress); + }); + + socket.on('browserWindow-setHasShadow', (id, hasShadow) => { + getWindowById(id).setHasShadow(hasShadow); + }); + + socket.on('browserWindow-hasShadow', (id) => { + const hasShadow = getWindowById(id).hasShadow(); + + socket.emit('browserWindow-hasShadow-completed', hasShadow); + }); + + socket.on('browserWindow-setAppDetails', (id, options) => { + getWindowById(id).setAppDetails(options); + }); + + socket.on('browserWindow-showDefinitionForSelection', (id) => { + getWindowById(id).showDefinitionForSelection(); + }); + + socket.on('browserWindow-setAutoHideMenuBar', (id, hide) => { + getWindowById(id).setAutoHideMenuBar(hide); + }); + + socket.on('browserWindow-isMenuBarAutoHide', (id) => { + const isMenuBarAutoHide = getWindowById(id).isMenuBarAutoHide(); + + socket.emit('browserWindow-isMenuBarAutoHide-completed', isMenuBarAutoHide); + }); + + socket.on('browserWindow-setMenuBarVisibility', (id, visible) => { + getWindowById(id).setMenuBarVisibility(visible); + }); + + socket.on('browserWindow-isMenuBarVisible', (id) => { + const isMenuBarVisible = getWindowById(id).isMenuBarVisible(); + + socket.emit('browserWindow-isMenuBarVisible-completed', isMenuBarVisible); + }); + + socket.on('browserWindow-setVisibleOnAllWorkspaces', (id, visible) => { + getWindowById(id).setVisibleOnAllWorkspaces(visible); + }); + + socket.on('browserWindow-isVisibleOnAllWorkspaces', (id) => { + const isVisibleOnAllWorkspaces = getWindowById(id).isVisibleOnAllWorkspaces(); + + socket.emit('browserWindow-isVisibleOnAllWorkspaces-completed', isVisibleOnAllWorkspaces); + }); + + socket.on('browserWindow-setIgnoreMouseEvents', (id, ignore) => { + getWindowById(id).setIgnoreMouseEvents(ignore); + }); + + socket.on('browserWindow-setContentProtection', (id, enable) => { + getWindowById(id).setContentProtection(enable); + }); + + socket.on('browserWindow-setFocusable', (id, focusable) => { + getWindowById(id).setFocusable(focusable); + }); + + socket.on('browserWindow-setParentWindow', (id, parent) => { + const browserWindow = BrowserWindow.fromId(parent.id); + + getWindowById(id).setParentWindow(browserWindow); + }); + + socket.on('browserWindow-getParentWindow', (id) => { + const browserWindow = getWindowById(id).getParentWindow(); + + socket.emit('browserWindow-getParentWindow-completed', browserWindow.id); + }); + + socket.on('browserWindow-getChildWindows', (id) => { + const browserWindows = getWindowById(id).getChildWindows(); + + const ids = []; + + browserWindows.forEach(x => { + ids.push(x.id); + }) + + socket.emit('browserWindow-getChildWindows-completed', ids); + }); + + socket.on('browserWindow-setAutoHideCursor', (id, autoHide) => { + getWindowById(id).setAutoHideCursor(autoHide); + }); + + socket.on('browserWindow-setVibrancy', (id, type) => { + getWindowById(id).setVibrancy(type); + }); + function getWindowById(id: number): Electron.BrowserWindow { for (var index = 0; index < windows.length; index++) { var element = windows[index]; diff --git a/ElectronNET.WebApp/Startup.cs b/ElectronNET.WebApp/Startup.cs index c7c3b49..ad5260f 100644 --- a/ElectronNET.WebApp/Startup.cs +++ b/ElectronNET.WebApp/Startup.cs @@ -71,7 +71,13 @@ namespace ElectronNET.WebApp Electron.Menu.SetApplicationMenu(menuItems); Electron.Tray.Show("/Assets/electron_32x32.png", menuItems); - var browserWindow = await Electron.WindowManager.CreateWindowAsync(); + var browserWindow = await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions { + Show = false + }); + + browserWindow.ReadyToShow += () => { + browserWindow.Show(); + }; } } }