Skip to content

Commit 09fa662

Browse files
Merge pull request #1 from ElectronNET/master
Updating fork
2 parents 6ddce85 + 05de407 commit 09fa662

File tree

18 files changed

+275
-30
lines changed

18 files changed

+275
-30
lines changed

Changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Not released
22

3+
# 8.31.3
34

5+
ElectronNET.API:
6+
7+
* New Feature: PowerMonitor API Support (thanks [gustavo-lara-molina](https://github.com/gustavo-lara-molina)) [\#399](https://github.com/ElectronNET/Electron.NET/pull/399)
48

59
# Released
610

ElectronNET.API/Electron.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,15 @@ public static class Electron
7373
/// <c>electronize add HostHook</c>
7474
/// </summary>
7575
public static HostHook HostHook { get { return HostHook.Instance; } }
76+
77+
/// <summary>
78+
/// Allows you to execute native Lock and Unlock process.
79+
/// </summary>
80+
public static PowerMonitor PowerMonitor { get { return PowerMonitor.Instance; } }
81+
82+
/// <summary>
83+
/// Read and respond to changes in Chromium's native color theme.
84+
/// </summary>
85+
public static NativeTheme NativeTheme { get { return NativeTheme.Instance; } }
7686
}
7787
}

ElectronNET.API/NativeTheme.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System.Threading.Tasks;
2+
3+
namespace ElectronNET.API
4+
{
5+
/// <summary>
6+
/// Read and respond to changes in Chromium's native color theme.
7+
/// </summary>
8+
public sealed class NativeTheme
9+
{
10+
private static NativeTheme _nativeTheme;
11+
private static object _syncRoot = new object();
12+
13+
internal NativeTheme() { }
14+
15+
internal static NativeTheme Instance
16+
{
17+
get
18+
{
19+
if (_nativeTheme == null)
20+
{
21+
lock (_syncRoot)
22+
{
23+
if (_nativeTheme == null)
24+
{
25+
_nativeTheme = new NativeTheme();
26+
}
27+
}
28+
}
29+
30+
return _nativeTheme;
31+
}
32+
}
33+
34+
/// <summary>
35+
/// A `Boolean` for if the OS / Chromium currently has a dark mode enabled or is
36+
/// being instructed to show a dark-style UI.If you want to modify this value you
37+
/// should use `themeSource` below.
38+
/// </summary>
39+
/// <returns></returns>
40+
public Task<bool> ShouldUseDarkColorsAsync()
41+
{
42+
var taskCompletionSource = new TaskCompletionSource<bool>();
43+
44+
BridgeConnector.Socket.On("nativeTheme-shouldUseDarkColors-completed", (shouldUseDarkColors) => {
45+
BridgeConnector.Socket.Off("nativeTheme-shouldUseDarkColors-completed");
46+
47+
taskCompletionSource.SetResult((bool)shouldUseDarkColors);
48+
});
49+
50+
BridgeConnector.Socket.Emit("nativeTheme-shouldUseDarkColors");
51+
52+
return taskCompletionSource.Task;
53+
}
54+
}
55+
}

ElectronNET.API/PowerMonitor.cs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
using System;
2+
3+
namespace ElectronNET.API
4+
{
5+
/// <summary>
6+
/// Monitor power state changes..
7+
/// </summary>
8+
public sealed class PowerMonitor
9+
{
10+
/// <summary>
11+
/// Emitted when the system is about to lock the screen.
12+
/// </summary>
13+
public event Action OnLockScreen
14+
{
15+
add
16+
{
17+
if (_lockScreen == null)
18+
{
19+
BridgeConnector.Socket.On("pm-lock-screen" , () =>
20+
{
21+
_lockScreen();
22+
});
23+
24+
BridgeConnector.Socket.Emit("register-pm-lock-screen");
25+
}
26+
_lockScreen += value;
27+
}
28+
remove
29+
{
30+
_lockScreen -= value;
31+
32+
if (_lockScreen == null)
33+
BridgeConnector.Socket.Off("pm-lock-screen");
34+
}
35+
}
36+
37+
private event Action _lockScreen;
38+
39+
/// <summary>
40+
/// Emitted when the system is about to unlock the screen.
41+
/// </summary>
42+
public event Action OnUnLockScreen
43+
{
44+
add
45+
{
46+
if (_unlockScreen == null)
47+
{
48+
BridgeConnector.Socket.On("pm-unlock-screen", () =>
49+
{
50+
_unlockScreen();
51+
});
52+
53+
BridgeConnector.Socket.Emit("register-pm-unlock-screen");
54+
}
55+
_unlockScreen += value;
56+
}
57+
remove
58+
{
59+
_unlockScreen -= value;
60+
61+
if (_unlockScreen == null)
62+
BridgeConnector.Socket.Off("pm-unlock-screen");
63+
}
64+
}
65+
66+
private event Action _unlockScreen;
67+
private static PowerMonitor _powerMonitor;
68+
private static object _syncRoot = new object();
69+
70+
internal PowerMonitor() { }
71+
72+
internal static PowerMonitor Instance
73+
{
74+
get
75+
{
76+
if (_powerMonitor == null)
77+
{
78+
lock (_syncRoot)
79+
{
80+
if (_powerMonitor == null)
81+
{
82+
_powerMonitor = new PowerMonitor();
83+
}
84+
}
85+
}
86+
87+
return _powerMonitor;
88+
}
89+
}
90+
}
91+
}

ElectronNET.CLI/Commands/Actions/DeployEmbeddedElectronFiles.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ public static void Do(string tempPath)
3030
EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "clipboard.js", "api.");
3131
EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "autoUpdater.js", "api.");
3232
EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "browserView.js", "api.");
33+
EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "powerMonitor.js", "api.");
34+
EmbeddedFileHelper.DeployEmbeddedFile(hostApiFolder, "nativeTheme.js", "api.");
3335

3436
string splashscreenFolder = Path.Combine(tempPath, "splashscreen");
3537
if (Directory.Exists(splashscreenFolder) == false)

ElectronNET.CLI/ElectronNET.CLI.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@
7171
<EmbeddedResource Include="..\ElectronNET.Host\api\clipboard.js" Link="ElectronHost\api\clipboard.js" />
7272
<EmbeddedResource Include="..\ElectronNET.Host\api\autoUpdater.js" Link="ElectronHost\api\autoUpdater.js" />
7373
<EmbeddedResource Include="..\ElectronNET.Host\api\browserView.js" Link="ElectronHost\api\browserView.js" />
74+
<EmbeddedResource Include="..\ElectronNET.Host\api\powerMonitor.js" Link="ElectronHost\api\powerMonitor.js" />
75+
<EmbeddedResource Include="..\ElectronNET.Host\api\nativeTheme.js" Link="ElectronHost\api\nativeTheme.js" />
7476
</ItemGroup>
7577

7678
<ItemGroup>

ElectronNET.Host/api/clipboard.js

Lines changed: 10 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ElectronNET.Host/api/clipboard.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ElectronNET.Host/api/clipboard.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,22 @@ export = (socket: SocketIO.Socket) => {
6262
});
6363

6464
socket.on('clipboard-readImage', (type) => {
65-
var image = clipboard.readImage(type);
65+
const image = clipboard.readImage(type);
6666
electronSocket.emit('clipboard-readImage-Completed', { 1: image.toPNG().toString('base64') });
6767
});
6868

6969
socket.on('clipboard-writeImage', (data, type) => {
70-
var data = JSON.parse(data);
71-
const ni = nativeImage.createEmpty();
72-
for (var i in data) {
73-
var scaleFactor = i;
74-
var bytes = data[i];
75-
var buff = Buffer.from(bytes, 'base64');
76-
ni.addRepresentation({ scaleFactor: +scaleFactor, buffer: buff });
70+
const dataContent = JSON.parse(data);
71+
const image = nativeImage.createEmpty();
72+
73+
// tslint:disable-next-line: forin
74+
for (const key in dataContent) {
75+
const scaleFactor = key;
76+
const bytes = data[key];
77+
const buffer = Buffer.from(bytes, 'base64');
78+
image.addRepresentation({ scaleFactor: +scaleFactor, buffer: buffer });
7779
}
78-
79-
clipboard.writeImage(ni, type);
80+
81+
clipboard.writeImage(image, type);
8082
});
8183
};

ElectronNET.Host/api/nativeTheme.js

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ElectronNET.Host/api/nativeTheme.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ElectronNET.Host/api/nativeTheme.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { nativeTheme } from 'electron';
2+
let electronSocket;
3+
4+
export = (socket: SocketIO.Socket) => {
5+
electronSocket = socket;
6+
7+
socket.on('nativeTheme-shouldUseDarkColors', () => {
8+
const shouldUseDarkColors = nativeTheme.shouldUseDarkColors;
9+
10+
electronSocket.emit('nativeTheme-shouldUseDarkColors-completed', shouldUseDarkColors);
11+
});
12+
};

ElectronNET.Host/api/powerMonitor.js

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ElectronNET.Host/api/powerMonitor.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ElectronNET.Host/api/powerMonitor.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { powerMonitor } from 'electron';
2+
let electronSocket;
3+
4+
export = (socket: SocketIO.Socket) => {
5+
electronSocket = socket;
6+
socket.on('register-pm-lock-screen', () => {
7+
powerMonitor.on('lock-screen', () => {
8+
electronSocket.emit('pm-lock-screen');
9+
});
10+
});
11+
socket.on('register-pm-unlock-screen', () => {
12+
powerMonitor.on('unlock-screen', () => {
13+
electronSocket.emit('pm-unlock-screen');
14+
});
15+
});
16+
};

ElectronNET.Host/main.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ let io, server, browserWindows, ipc, apiProcess, loadURL;
88
let appApi, menu, dialogApi, notification, tray, webContents;
99
let globalShortcut, shellApi, screen, clipboard, autoUpdater;
1010
let commandLine, browserView;
11+
let powerMonitor;
1112
let splashScreen, hostHook;
12-
let mainWindowId;
13+
let mainWindowId, nativeTheme;
1314

1415
let manifestJsonFileName = 'electron.manifest.json';
1516
let watchable = false;
@@ -152,6 +153,8 @@ function startSocketApiBridge(port) {
152153
delete require.cache[require.resolve('./api/screen')];
153154
delete require.cache[require.resolve('./api/clipboard')];
154155
delete require.cache[require.resolve('./api/browserView')];
156+
delete require.cache[require.resolve('./api/powerMonitor')];
157+
delete require.cache[require.resolve('./api/nativeTheme')];
155158
});
156159

157160
global['electronsocket'] = socket;
@@ -173,8 +176,8 @@ function startSocketApiBridge(port) {
173176
screen = require('./api/screen')(socket);
174177
clipboard = require('./api/clipboard')(socket);
175178
browserView = require('./api/browserView')(socket);
176-
177-
179+
powerMonitor = require('./api/powerMonitor')(socket);
180+
nativeTheme = require('./api/nativeTheme')(socket);
178181

179182
try {
180183
const hostHookScriptFilePath = path.join(__dirname, 'ElectronHostHook', 'index.js');

ElectronNET.WebApp/Controllers/HomeController.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
11
using Microsoft.AspNetCore.Mvc;
2+
using ElectronNET.API;
3+
using System;
24

35
namespace ElectronNET.WebApp.Controllers
46
{
57
public class HomeController : Controller
68
{
79
public IActionResult Index()
810
{
11+
if (HybridSupport.IsElectronActive)
12+
{
13+
Electron.PowerMonitor.OnLockScreen += () =>
14+
{
15+
Console.WriteLine("Screen Locked detected from C#");
16+
};
17+
18+
Electron.PowerMonitor.OnUnLockScreen += () =>
19+
{
20+
Console.WriteLine("Screen unlocked detected from C# ");
21+
};
22+
}
23+
924
return View();
1025
}
1126
}

0 commit comments

Comments
 (0)