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 { public class BrowserWindow { 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; } /// /// Force closing the window, the unload and beforeunload event won’t be /// emitted for the web page, and close event will also not be emitted /// for this window, but it guarantees the closed event will be emitted. /// public void Destroy() { BridgeConnector.Socket.Emit("browserWindow-destroy", Id); } /// /// Try to close the window. This has the same effect as a user manually /// clicking the close button of the window. The web page may cancel the close though. /// public void Close() { BridgeConnector.Socket.Emit("browserWindow-close", Id); } /// /// Focuses on the window. /// public void Focus() { BridgeConnector.Socket.Emit("browserWindow-focus", Id); } /// /// Removes focus from the window. /// public void Blur() { BridgeConnector.Socket.Emit("browserWindow-blur", Id); } /// /// Whether the window is focused. /// /// public Task IsFocusedAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isFocused-completed", (isFocused) => { BridgeConnector.Socket.Off("browserWindow-isFocused-completed"); taskCompletionSource.SetResult((bool)isFocused); }); BridgeConnector.Socket.Emit("browserWindow-isFocused", Id); return taskCompletionSource.Task; } /// /// Whether the window is destroyed. /// /// public Task IsDestroyedAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isDestroyed-completed", (isDestroyed) => { BridgeConnector.Socket.Off("browserWindow-isDestroyed-completed"); taskCompletionSource.SetResult((bool)isDestroyed); }); BridgeConnector.Socket.Emit("browserWindow-isDestroyed", Id); return taskCompletionSource.Task; } /// /// Shows and gives focus to the window. /// public void Show() { BridgeConnector.Socket.Emit("browserWindow-show", Id); } /// /// Shows the window but doesn’t focus on it. /// public void ShowInactive() { BridgeConnector.Socket.Emit("browserWindow-showInactive", Id); } /// /// Hides the window. /// public void Hide() { BridgeConnector.Socket.Emit("browserWindow-hide", Id); } /// /// Whether the window is visible to the user. /// /// public Task IsVisibleAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isVisible-completed", (isVisible) => { BridgeConnector.Socket.Off("browserWindow-isVisible-completed"); taskCompletionSource.SetResult((bool)isVisible); }); BridgeConnector.Socket.Emit("browserWindow-isVisible", Id); return taskCompletionSource.Task; } /// /// Whether current window is a modal window. /// /// public Task IsModalAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isModal-completed", (isModal) => { BridgeConnector.Socket.Off("browserWindow-isModal-completed"); taskCompletionSource.SetResult((bool)isModal); }); BridgeConnector.Socket.Emit("browserWindow-isModal", Id); return taskCompletionSource.Task; } /// /// Maximizes the window. This will also show (but not focus) the window if it isn’t being displayed already. /// public void Maximize() { BridgeConnector.Socket.Emit("browserWindow-maximize", Id); } /// /// Unmaximizes the window. /// public void Unmaximize() { BridgeConnector.Socket.Emit("browserWindow-unmaximize", Id); } /// /// Whether the window is maximized. /// /// public Task IsMaximizedAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isMaximized-completed", (isMaximized) => { BridgeConnector.Socket.Off("browserWindow-isMaximized-completed"); taskCompletionSource.SetResult((bool)isMaximized); }); BridgeConnector.Socket.Emit("browserWindow-isMaximized", Id); return taskCompletionSource.Task; } /// /// Minimizes the window. On some platforms the minimized window will be shown in the Dock. /// public void Minimize() { BridgeConnector.Socket.Emit("browserWindow-minimize", Id); } /// /// Restores the window from minimized state to its previous state. /// public void Restore() { BridgeConnector.Socket.Emit("browserWindow-restore", Id); } /// /// Whether the window is minimized. /// /// public Task IsMinimizedAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isMinimized-completed", (isMinimized) => { BridgeConnector.Socket.Off("browserWindow-isMinimized-completed"); taskCompletionSource.SetResult((bool)isMinimized); }); BridgeConnector.Socket.Emit("browserWindow-isMinimized", Id); return taskCompletionSource.Task; } /// /// Sets whether the window should be in fullscreen mode. /// public void SetFullScreen(bool flag) { BridgeConnector.Socket.Emit("browserWindow-setFullScreen", Id, flag); } /// /// Whether the window is in fullscreen mode. /// /// public Task IsFullScreenAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isFullScreen-completed", (isFullScreen) => { BridgeConnector.Socket.Off("browserWindow-isFullScreen-completed"); taskCompletionSource.SetResult((bool)isFullScreen); }); BridgeConnector.Socket.Emit("browserWindow-isFullScreen", Id); return taskCompletionSource.Task; } /// /// This will make a window maintain an aspect ratio. The extra size allows a developer to have space, /// specified in pixels, not included within the aspect ratio calculations. This API already takes into /// account the difference between a window’s size and its content size. /// /// Consider a normal window with an HD video player and associated controls.Perhaps there are 15 pixels /// of controls on the left edge, 25 pixels of controls on the right edge and 50 pixels of controls below /// the player. In order to maintain a 16:9 aspect ratio (standard aspect ratio for HD @1920x1080) within /// the player itself we would call this function with arguments of 16/9 and[40, 50]. The second argument /// doesn’t care where the extra width and height are within the content view–only that they exist. Just /// sum any extra width and height areas you have within the overall content view. /// /// The aspect ratio to maintain for some portion of the content view. /// The extra size not to be included while maintaining the aspect ratio. public void SetAspectRatio(int aspectRatio, Size extraSize) { BridgeConnector.Socket.Emit("browserWindow-setAspectRatio", Id, aspectRatio, JObject.FromObject(extraSize, _jsonSerializer)); } /// /// Uses Quick Look to preview a file at a given path. /// /// The absolute path to the file to preview with QuickLook. This is important as /// Quick Look uses the file name and file extension on the path to determine the content type of the /// file to open. public void PreviewFile(string path) { BridgeConnector.Socket.Emit("browserWindow-previewFile", Id, path); } /// /// Uses Quick Look to preview a file at a given path. /// /// The absolute path to the file to preview with QuickLook. This is important as /// Quick Look uses the file name and file extension on the path to determine the content type of the /// file to open. /// The name of the file to display on the Quick Look modal view. This is /// purely visual and does not affect the content type of the file. Defaults to path. public void PreviewFile(string path, string displayname) { BridgeConnector.Socket.Emit("browserWindow-previewFile", Id, path, displayname); } /// /// Closes the currently open Quick Look panel. /// public void CloseFilePreview() { BridgeConnector.Socket.Emit("browserWindow-closeFilePreview", Id); } /// /// Resizes and moves the window to the supplied bounds /// /// public void SetBounds(Rectangle bounds) { BridgeConnector.Socket.Emit("browserWindow-setBounds", Id, JObject.FromObject(bounds, _jsonSerializer)); } /// /// Resizes and moves the window to the supplied bounds /// /// /// public void SetBounds(Rectangle bounds, bool animate) { BridgeConnector.Socket.Emit("browserWindow-setBounds", Id, JObject.FromObject(bounds, _jsonSerializer), animate); } public Task GetBoundsAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-getBounds-completed", (getBounds) => { BridgeConnector.Socket.Off("browserWindow-getBounds-completed"); taskCompletionSource.SetResult(((JObject)getBounds).ToObject()); }); BridgeConnector.Socket.Emit("browserWindow-getBounds", Id); return taskCompletionSource.Task; } /// /// Resizes and moves the window’s client area (e.g. the web page) to the supplied bounds. /// /// public void SetContentBounds(Rectangle bounds) { BridgeConnector.Socket.Emit("browserWindow-setContentBounds", Id, JObject.FromObject(bounds, _jsonSerializer)); } /// /// Resizes and moves the window’s client area (e.g. the web page) to the supplied bounds. /// /// /// public void SetContentBounds(Rectangle bounds, bool animate) { BridgeConnector.Socket.Emit("browserWindow-setContentBounds", Id, JObject.FromObject(bounds, _jsonSerializer), animate); } public Task GetContentBoundsAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-getContentBounds-completed", (getContentBounds) => { BridgeConnector.Socket.Off("browserWindow-getContentBounds-completed"); taskCompletionSource.SetResult(((JObject)getContentBounds).ToObject()); }); BridgeConnector.Socket.Emit("browserWindow-getContentBounds", Id); return taskCompletionSource.Task; } /// /// Resizes the window to width and height. /// /// /// /// public void SetSize(int width, int height) { BridgeConnector.Socket.Emit("browserWindow-setSize", Id, width, height); } /// /// Resizes the window to width and height. /// /// /// /// public void SetSize(int width, int height, bool animate) { BridgeConnector.Socket.Emit("browserWindow-setSize", Id, width, height, animate); } /// /// Contains the window’s width and height. /// /// public Task GetSizeAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-getSize-completed", (size) => { BridgeConnector.Socket.Off("browserWindow-getSize-completed"); taskCompletionSource.SetResult(((JArray)size).ToObject()); }); BridgeConnector.Socket.Emit("browserWindow-getSize", Id); return taskCompletionSource.Task; } /// /// Resizes the window’s client area (e.g. the web page) to width and height. /// /// /// /// public void SetContentSize(int width, int height) { BridgeConnector.Socket.Emit("browserWindow-setContentSize", Id, width, height); } /// /// Resizes the window’s client area (e.g. the web page) to width and height. /// /// /// /// public void SetContentSize(int width, int height, bool animate) { BridgeConnector.Socket.Emit("browserWindow-setContentSize", Id, width, height, animate); } /// /// Contains the window’s client area’s width and height. /// /// public Task GetContentSizeAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-getContentSize-completed", (size) => { BridgeConnector.Socket.Off("browserWindow-getContentSize-completed"); taskCompletionSource.SetResult(((JArray)size).ToObject()); }); BridgeConnector.Socket.Emit("browserWindow-getContentSize", Id); return taskCompletionSource.Task; } /// /// Sets the minimum size of window to width and height. /// /// /// public void SetMinimumSize(int width, int height) { BridgeConnector.Socket.Emit("browserWindow-setMinimumSize", Id, width, height); } /// /// Contains the window’s minimum width and height. /// /// public Task GetMinimumSizeAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-getMinimumSize-completed", (size) => { BridgeConnector.Socket.Off("browserWindow-getMinimumSize-completed"); taskCompletionSource.SetResult(((JArray)size).ToObject()); }); BridgeConnector.Socket.Emit("browserWindow-getMinimumSize", Id); return taskCompletionSource.Task; } /// /// Sets the maximum size of window to width and height. /// /// /// public void SetMaximumSize(int width, int height) { BridgeConnector.Socket.Emit("browserWindow-setMaximumSize", Id, width, height); } /// /// Contains the window’s maximum width and height. /// /// public Task GetMaximumSizeAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-getMaximumSize-completed", (size) => { BridgeConnector.Socket.Off("browserWindow-getMaximumSize-completed"); taskCompletionSource.SetResult(((JArray)size).ToObject()); }); BridgeConnector.Socket.Emit("browserWindow-getMaximumSize", Id); return taskCompletionSource.Task; } /// /// Sets whether the window can be manually resized by user. /// /// public void SetResizable(bool resizable) { BridgeConnector.Socket.Emit("browserWindow-setResizable", Id, resizable); } /// /// Whether the window can be manually resized by user. /// /// public Task IsResizableAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isResizable-completed", (resizable) => { BridgeConnector.Socket.Off("browserWindow-isResizable-completed"); taskCompletionSource.SetResult((bool)resizable); }); BridgeConnector.Socket.Emit("browserWindow-isResizable", Id); return taskCompletionSource.Task; } /// /// Sets whether the window can be moved by user. On Linux does nothing. /// /// public void SetMovable(bool movable) { BridgeConnector.Socket.Emit("browserWindow-setMovable", Id, movable); } /// /// Whether the window can be moved by user. /// /// On Linux always returns true. /// /// On Linux always returns true. public Task IsMovableAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isMovable-completed", (movable) => { BridgeConnector.Socket.Off("browserWindow-isMovable-completed"); taskCompletionSource.SetResult((bool)movable); }); BridgeConnector.Socket.Emit("browserWindow-isMovable", Id); return taskCompletionSource.Task; } /// /// Sets whether the window can be manually minimized by user. On Linux does nothing. /// /// public void SetMinimizable(bool minimizable) { BridgeConnector.Socket.Emit("browserWindow-setMinimizable", Id, minimizable); } /// /// Whether the window can be manually minimized by user. /// /// On Linux always returns true. /// /// On Linux always returns true. public Task IsMinimizableAsync() { var taskCompletionSource = new TaskCompletionSource(); BridgeConnector.Socket.On("browserWindow-isMinimizable-completed", (minimizable) => { BridgeConnector.Socket.Off("browserWindow-isMinimizable-completed"); taskCompletionSource.SetResult((bool)minimizable); }); BridgeConnector.Socket.Emit("browserWindow-isMinimizable", Id); return taskCompletionSource.Task; } /// /// Sets whether the window can be manually maximized by user. On Linux does nothing. /// /// public void SetMaximizable(bool maximizable) { 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 }; } }