diff --git a/Changelog.md b/Changelog.md index 64214b1..0528fed 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,10 @@ # Not released +# 8.31.3 +ElectronNET.API: + +* New Feature: PowerMonitor API Support (thanks [gustavo-lara-molina](https://github.com/gustavo-lara-molina)) [\#399](https://github.com/ElectronNET/Electron.NET/pull/399) # Released diff --git a/ElectronNET.API/Electron.cs b/ElectronNET.API/Electron.cs index 4206f89..730287d 100644 --- a/ElectronNET.API/Electron.cs +++ b/ElectronNET.API/Electron.cs @@ -73,5 +73,15 @@ /// electronize add HostHook /// public static HostHook HostHook { get { return HostHook.Instance; } } + + /// + /// Allows you to execute native Lock and Unlock process. + /// + public static PowerMonitor PowerMonitor { get { return PowerMonitor.Instance; } } + + /// + /// Read and respond to changes in Chromium's native color theme. + /// + public static NativeTheme NativeTheme { get { return NativeTheme.Instance; } } } } diff --git a/ElectronNET.API/NativeTheme.cs b/ElectronNET.API/NativeTheme.cs new file mode 100644 index 0000000..3b1721a --- /dev/null +++ b/ElectronNET.API/NativeTheme.cs @@ -0,0 +1,55 @@ +using System.Threading.Tasks; + +namespace ElectronNET.API +{ + /// + /// Read and respond to changes in Chromium's native color theme. + /// + public sealed class NativeTheme + { + private static NativeTheme _nativeTheme; + private static object _syncRoot = new object(); + + internal NativeTheme() { } + + internal static NativeTheme Instance + { + get + { + if (_nativeTheme == null) + { + lock (_syncRoot) + { + if (_nativeTheme == null) + { + _nativeTheme = new NativeTheme(); + } + } + } + + return _nativeTheme; + } + } + + /// + /// A `Boolean` for if the OS / Chromium currently has a dark mode enabled or is + /// being instructed to show a dark-style UI.If you want to modify this value you + /// should use `themeSource` below. + /// + /// + public Task ShouldUseDarkColorsAsync() + { + var taskCompletionSource = new TaskCompletionSource(); + + BridgeConnector.Socket.On("nativeTheme-shouldUseDarkColors-completed", (shouldUseDarkColors) => { + BridgeConnector.Socket.Off("nativeTheme-shouldUseDarkColors-completed"); + + taskCompletionSource.SetResult((bool)shouldUseDarkColors); + }); + + BridgeConnector.Socket.Emit("nativeTheme-shouldUseDarkColors"); + + return taskCompletionSource.Task; + } + } +} diff --git a/ElectronNET.API/PowerMonitor.cs b/ElectronNET.API/PowerMonitor.cs new file mode 100644 index 0000000..2b1c802 --- /dev/null +++ b/ElectronNET.API/PowerMonitor.cs @@ -0,0 +1,91 @@ +using System; + +namespace ElectronNET.API +{ + /// + /// Monitor power state changes.. + /// + public sealed class PowerMonitor + { + /// + /// Emitted when the system is about to lock the screen. + /// + public event Action OnLockScreen + { + add + { + if (_lockScreen == null) + { + BridgeConnector.Socket.On("pm-lock-screen" , () => + { + _lockScreen(); + }); + + BridgeConnector.Socket.Emit("register-pm-lock-screen"); + } + _lockScreen += value; + } + remove + { + _lockScreen -= value; + + if (_lockScreen == null) + BridgeConnector.Socket.Off("pm-lock-screen"); + } + } + + private event Action _lockScreen; + + /// + /// Emitted when the system is about to unlock the screen. + /// + public event Action OnUnLockScreen + { + add + { + if (_unlockScreen == null) + { + BridgeConnector.Socket.On("pm-unlock-screen", () => + { + _unlockScreen(); + }); + + BridgeConnector.Socket.Emit("register-pm-unlock-screen"); + } + _unlockScreen += value; + } + remove + { + _unlockScreen -= value; + + if (_unlockScreen == null) + BridgeConnector.Socket.Off("pm-unlock-screen"); + } + } + + private event Action _unlockScreen; + private static PowerMonitor _powerMonitor; + private static object _syncRoot = new object(); + + internal PowerMonitor() { } + + internal static PowerMonitor Instance + { + get + { + if (_powerMonitor == null) + { + lock (_syncRoot) + { + if (_powerMonitor == null) + { + _powerMonitor = new PowerMonitor(); + } + } + } + + return _powerMonitor; + } + } + } +} diff --git a/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs b/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs index 95e086a..a82775d 100644 --- a/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs +++ b/ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs @@ -30,6 +30,8 @@ namespace ElectronNET.CLI.Commands.Actions EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "clipboard.js", "api."); EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "autoUpdater.js", "api."); EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "browserView.js", "api."); + EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "powerMonitor.js", "api."); + EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "nativeTheme.js", "api."); string splashscreenFolder = Path.Combine(tempPath, "splashscreen"); if (Directory.Exists(splashscreenFolder) == false) diff --git a/ElectronNET.CLI/ElectronNET.CLI.csproj b/ElectronNET.CLI/ElectronNET.CLI.csproj index 4f72713..8caf82d 100644 --- a/ElectronNET.CLI/ElectronNET.CLI.csproj +++ b/ElectronNET.CLI/ElectronNET.CLI.csproj @@ -71,6 +71,8 @@ + + diff --git a/ElectronNET.Host/api/clipboard.js b/ElectronNET.Host/api/clipboard.js index 5eedc7e..f7e7ef1 100644 --- a/ElectronNET.Host/api/clipboard.js +++ b/ElectronNET.Host/api/clipboard.js @@ -49,19 +49,20 @@ module.exports = (socket) => { electron_1.clipboard.write(data, type); }); socket.on('clipboard-readImage', (type) => { - var image = electron_1.clipboard.readImage(type); + const image = electron_1.clipboard.readImage(type); electronSocket.emit('clipboard-readImage-Completed', { 1: image.toPNG().toString('base64') }); }); socket.on('clipboard-writeImage', (data, type) => { - var data = JSON.parse(data); - const ni = electron_1.nativeImage.createEmpty(); - for (var i in data) { - var scaleFactor = i; - var bytes = data[i]; - var buff = Buffer.from(bytes, 'base64'); - ni.addRepresentation({ scaleFactor: +scaleFactor, buffer: buff }); + const dataContent = JSON.parse(data); + const image = electron_1.nativeImage.createEmpty(); + // tslint:disable-next-line: forin + for (const key in dataContent) { + const scaleFactor = key; + const bytes = data[key]; + const buffer = Buffer.from(bytes, 'base64'); + image.addRepresentation({ scaleFactor: +scaleFactor, buffer: buffer }); } - electron_1.clipboard.writeImage(ni, type); + electron_1.clipboard.writeImage(image, type); }); }; //# sourceMappingURL=clipboard.js.map \ No newline at end of file diff --git a/ElectronNET.Host/api/clipboard.js.map b/ElectronNET.Host/api/clipboard.js.map index b3bd84b..447f1c0 100644 --- a/ElectronNET.Host/api/clipboard.js.map +++ b/ElectronNET.Host/api/clipboard.js.map @@ -1 +1 @@ -{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["clipboard.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["clipboard.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/ElectronNET.Host/api/clipboard.ts b/ElectronNET.Host/api/clipboard.ts index 0cbca39..1ad82bf 100644 --- a/ElectronNET.Host/api/clipboard.ts +++ b/ElectronNET.Host/api/clipboard.ts @@ -62,20 +62,22 @@ export = (socket: SocketIO.Socket) => { }); socket.on('clipboard-readImage', (type) => { - var image = clipboard.readImage(type); + const image = clipboard.readImage(type); electronSocket.emit('clipboard-readImage-Completed', { 1: image.toPNG().toString('base64') }); }); socket.on('clipboard-writeImage', (data, type) => { - var data = JSON.parse(data); - const ni = nativeImage.createEmpty(); - for (var i in data) { - var scaleFactor = i; - var bytes = data[i]; - var buff = Buffer.from(bytes, 'base64'); - ni.addRepresentation({ scaleFactor: +scaleFactor, buffer: buff }); + const dataContent = JSON.parse(data); + const image = nativeImage.createEmpty(); + + // tslint:disable-next-line: forin + for (const key in dataContent) { + const scaleFactor = key; + const bytes = data[key]; + const buffer = Buffer.from(bytes, 'base64'); + image.addRepresentation({ scaleFactor: +scaleFactor, buffer: buffer }); } - - clipboard.writeImage(ni, type); + + clipboard.writeImage(image, type); }); }; diff --git a/ElectronNET.Host/api/nativeTheme.js b/ElectronNET.Host/api/nativeTheme.js new file mode 100644 index 0000000..e18bde2 --- /dev/null +++ b/ElectronNET.Host/api/nativeTheme.js @@ -0,0 +1,11 @@ +"use strict"; +const electron_1 = require("electron"); +let electronSocket; +module.exports = (socket) => { + electronSocket = socket; + socket.on('nativeTheme-shouldUseDarkColors', () => { + const shouldUseDarkColors = electron_1.nativeTheme.shouldUseDarkColors; + electronSocket.emit('nativeTheme-shouldUseDarkColors-completed', shouldUseDarkColors); + }); +}; +//# sourceMappingURL=nativeTheme.js.map \ No newline at end of file diff --git a/ElectronNET.Host/api/nativeTheme.js.map b/ElectronNET.Host/api/nativeTheme.js.map new file mode 100644 index 0000000..4da7e71 --- /dev/null +++ b/ElectronNET.Host/api/nativeTheme.js.map @@ -0,0 +1 @@ +{"version":3,"file":"nativeTheme.js","sourceRoot":"","sources":["nativeTheme.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,IAAI,cAAc,CAAC;AAEnB,iBAAS,CAAC,MAAuB,EAAE,EAAE;IACjC,cAAc,GAAG,MAAM,CAAC;IAExB,MAAM,CAAC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC9C,MAAM,mBAAmB,GAAG,sBAAW,CAAC,mBAAmB,CAAC;QAE5D,cAAc,CAAC,IAAI,CAAC,2CAA2C,EAAE,mBAAmB,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"} \ No newline at end of file diff --git a/ElectronNET.Host/api/nativeTheme.ts b/ElectronNET.Host/api/nativeTheme.ts new file mode 100644 index 0000000..9781ffa --- /dev/null +++ b/ElectronNET.Host/api/nativeTheme.ts @@ -0,0 +1,12 @@ +import { nativeTheme } from 'electron'; +let electronSocket; + +export = (socket: SocketIO.Socket) => { + electronSocket = socket; + + socket.on('nativeTheme-shouldUseDarkColors', () => { + const shouldUseDarkColors = nativeTheme.shouldUseDarkColors; + + electronSocket.emit('nativeTheme-shouldUseDarkColors-completed', shouldUseDarkColors); + }); +}; diff --git a/ElectronNET.Host/api/powerMonitor.js b/ElectronNET.Host/api/powerMonitor.js new file mode 100644 index 0000000..be876e4 --- /dev/null +++ b/ElectronNET.Host/api/powerMonitor.js @@ -0,0 +1,17 @@ +"use strict"; +const electron_1 = require("electron"); +let electronSocket; +module.exports = (socket) => { + electronSocket = socket; + socket.on('register-pm-lock-screen', () => { + electron_1.powerMonitor.on('lock-screen', () => { + electronSocket.emit('pm-lock-screen'); + }); + }); + socket.on('register-pm-unlock-screen', () => { + electron_1.powerMonitor.on('unlock-screen', () => { + electronSocket.emit('pm-unlock-screen'); + }); + }); +}; +//# sourceMappingURL=powerMonitor.js.map \ No newline at end of file diff --git a/ElectronNET.Host/api/powerMonitor.js.map b/ElectronNET.Host/api/powerMonitor.js.map new file mode 100644 index 0000000..35ffbfd --- /dev/null +++ b/ElectronNET.Host/api/powerMonitor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"powerMonitor.js","sourceRoot":"","sources":["powerMonitor.ts"],"names":[],"mappings":";AAAA,uCAAwC;AACxC,IAAI,cAAc,CAAC;AAEnB,iBAAS,CAAC,MAAuB,EAAE,EAAE;IACjC,cAAc,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACtC,uBAAY,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YAChC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACxC,uBAAY,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;YAClC,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"} \ No newline at end of file diff --git a/ElectronNET.Host/api/powerMonitor.ts b/ElectronNET.Host/api/powerMonitor.ts new file mode 100644 index 0000000..f630a0a --- /dev/null +++ b/ElectronNET.Host/api/powerMonitor.ts @@ -0,0 +1,16 @@ +import { powerMonitor } from 'electron'; +let electronSocket; + +export = (socket: SocketIO.Socket) => { + electronSocket = socket; + socket.on('register-pm-lock-screen', () => { + powerMonitor.on('lock-screen', () => { + electronSocket.emit('pm-lock-screen'); + }); + }); + socket.on('register-pm-unlock-screen', () => { + powerMonitor.on('unlock-screen', () => { + electronSocket.emit('pm-unlock-screen'); + }); + }); +}; diff --git a/ElectronNET.Host/main.js b/ElectronNET.Host/main.js index 2442d05..60b4037 100644 --- a/ElectronNET.Host/main.js +++ b/ElectronNET.Host/main.js @@ -8,8 +8,9 @@ let io, server, browserWindows, ipc, apiProcess, loadURL; let appApi, menu, dialogApi, notification, tray, webContents; let globalShortcut, shellApi, screen, clipboard, autoUpdater; let commandLine, browserView; +let powerMonitor; let splashScreen, hostHook; -let mainWindowId; +let mainWindowId, nativeTheme; let manifestJsonFileName = 'electron.manifest.json'; let watchable = false; @@ -152,6 +153,8 @@ function startSocketApiBridge(port) { delete require.cache[require.resolve('./api/screen')]; delete require.cache[require.resolve('./api/clipboard')]; delete require.cache[require.resolve('./api/browserView')]; + delete require.cache[require.resolve('./api/powerMonitor')]; + delete require.cache[require.resolve('./api/nativeTheme')]; }); global['electronsocket'] = socket; @@ -173,8 +176,8 @@ function startSocketApiBridge(port) { screen = require('./api/screen')(socket); clipboard = require('./api/clipboard')(socket); browserView = require('./api/browserView')(socket); - - + powerMonitor = require('./api/powerMonitor')(socket); + nativeTheme = require('./api/nativeTheme')(socket); try { const hostHookScriptFilePath = path.join(__dirname, 'ElectronHostHook', 'index.js'); diff --git a/ElectronNET.WebApp/Controllers/HomeController.cs b/ElectronNET.WebApp/Controllers/HomeController.cs index 3d997ef..92a0441 100644 --- a/ElectronNET.WebApp/Controllers/HomeController.cs +++ b/ElectronNET.WebApp/Controllers/HomeController.cs @@ -1,4 +1,6 @@ using Microsoft.AspNetCore.Mvc; +using ElectronNET.API; +using System; namespace ElectronNET.WebApp.Controllers { @@ -6,6 +8,19 @@ namespace ElectronNET.WebApp.Controllers { public IActionResult Index() { + if (HybridSupport.IsElectronActive) + { + Electron.PowerMonitor.OnLockScreen += () => + { + Console.WriteLine("Screen Locked detected from C#"); + }; + + Electron.PowerMonitor.OnUnLockScreen += () => + { + Console.WriteLine("Screen unlocked detected from C# "); + }; + } + return View(); } } diff --git a/README.md b/README.md index 37f9975..e2368ac 100644 --- a/README.md +++ b/README.md @@ -54,13 +54,13 @@ PM> Install-Package ElectronNET.API You start Electron.NET up with an `UseElectron` WebHostBuilder-Extension. ```csharp - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseElectron(args); - webBuilder.UseStartup(); - }); +public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseElectron(args); + webBuilder.UseStartup(); + }); ``` ### Startup.cs @@ -167,6 +167,8 @@ Please make sure all commits are properly documented. ## 🧪 Working with this Repo +This video provides an introduction to development for Electron.NET: [Electron.NET - Contributing Getting Started](https://youtu.be/Po-saU_Z6Ws) + This repository consists of the main parts (API & CLI) and it's own "playground" ASP.NET Core application. Both main parts produce local NuGet packages, that are versioned with 99.0.0. The first thing you will need is to run one of the buildAll scripts (.cmd for Windows, the other for macOS/Linux). If you look for pure __[demo projects](https://github.com/ElectronNET)__ checkout the other repositories.