Skip to content

Commit d23bfe9

Browse files
committed
v3
1 parent 768ec7b commit d23bfe9

File tree

5 files changed

+109
-32
lines changed

5 files changed

+109
-32
lines changed

plugins/in-app-menu/front.js

+7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const { ipcRenderer } = require("electron");
22
const config = require("../../config");
33
const { Titlebar, Color } = require("custom-electron-titlebar");
4+
const { isEnabled } = require("../../config/plugins");
45
function $(selector) { return document.querySelector(selector); }
56

67
module.exports = () => {
@@ -25,6 +26,12 @@ module.exports = () => {
2526
}
2627
});
2728

29+
if (isEnabled("picture-in-picture")) {
30+
ipcRenderer.on("pip-toggle", (_, pipEnabled) => {
31+
bar.refreshMenu();
32+
});
33+
}
34+
2835
// Increases the right margin of Navbar background when the scrollbar is visible to avoid blocking it (z-index doesn't affect it)
2936
document.addEventListener('apiLoaded', () => {
3037
setNavbarMargin();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
const { Menu, app } = require("electron");
2+
const { setApplicationMenu } = require("../../../menu");
3+
4+
module.exports = (win, options, setOptions, togglePip, isInPip) => {
5+
if (isInPip) {
6+
Menu.setApplicationMenu(Menu.buildFromTemplate([
7+
{
8+
label: "App",
9+
submenu: [
10+
{
11+
label: "Exit Picture in Picture",
12+
click: togglePip,
13+
},
14+
{
15+
label: "Always on top",
16+
type: "checkbox",
17+
checked: options.alwaysOnTop,
18+
click: (item) => {
19+
setOptions({ alwaysOnTop: item.checked });
20+
win.setAlwaysOnTop(item.checked);
21+
},
22+
},
23+
{
24+
label: "Restart",
25+
click: () => {
26+
app.relaunch();
27+
app.quit();
28+
},
29+
},
30+
{ role: "quit" },
31+
],
32+
},
33+
]));
34+
} else {
35+
setApplicationMenu(win);
36+
}
37+
};

plugins/picture-in-picture/back.js

+19-31
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const path = require("path");
22

33
const { app, ipcMain } = require("electron");
44

5-
const { setOptions } = require("../../config/plugins");
5+
const { setOptions, isEnabled } = require("../../config/plugins");
66
const { injectCSS } = require("../utils");
77

88
let isInPiP = false;
@@ -22,6 +22,15 @@ const setLocalOptions = (_options) => {
2222
setOptions("picture-in-picture", _options);
2323
}
2424

25+
26+
const adaptors = [];
27+
const runAdaptors = () => adaptors.forEach(a => a());
28+
29+
if (isEnabled("in-app-menu")) {
30+
let adaptor = require("./adaptors/in-app-menu");
31+
adaptors.push(() => adaptor(win, options, setLocalOptions, togglePiP, isInPiP));
32+
}
33+
2534
const togglePiP = async () => {
2635
isInPiP = !isInPiP;
2736
setLocalOptions({ isInPiP });
@@ -38,44 +47,24 @@ const togglePiP = async () => {
3847
win.webContents.on("before-input-event", blockShortcutsInPiP);
3948

4049
win.setFullScreenable(false);
41-
await win.webContents.executeJavaScript(
42-
// Go fullscreen
43-
`
44-
var exitButton = document.querySelector(".exit-fullscreen-button");
45-
exitButton.replaceWith(exitButton.cloneNode(true));
46-
document.querySelector(".exit-fullscreen-button").onclick = () => togglePictureInPicture();
47-
48-
var onPlayerDblClick = document.querySelector('#player').onDoubleClick_
49-
document.querySelector('#player').onDoubleClick_ = () => {};
50-
document.querySelector('#expanding-menu').onmouseleave = () => document.querySelector('.middle-controls').click();
51-
if (!document.querySelector("ytmusic-player-page").playerPageOpen_) {
52-
document.querySelector(".toggle-player-page-button").click();
53-
}
54-
document.querySelector(".fullscreen-button").click();
55-
document.querySelector("ytmusic-player-bar").classList.add("pip");
56-
`
57-
);
58-
win.setFullScreenable(true);
50+
51+
runAdaptors();
52+
win.webContents.send("pip-toggle", true);
5953

6054
app.dock?.hide();
6155
win.setVisibleOnAllWorkspaces(true, {
6256
visibleOnFullScreen: true,
6357
});
6458
app.dock?.show();
65-
win.setAlwaysOnTop(true, "screen-saver", 1);
59+
if (options.alwaysOnTop) {
60+
win.setAlwaysOnTop(true, "screen-saver", 1);
61+
}
6662
} else {
6763
win.webContents.removeListener("before-input-event", blockShortcutsInPiP);
64+
win.setFullScreenable(true);
6865

69-
await win.webContents.executeJavaScript(
70-
// Exit fullscreen
71-
`
72-
document.querySelector('#player').onDoubleClick_ = onPlayerDblClick;
73-
document.querySelector('#expanding-menu').onmouseleave = undefined;
74-
document.querySelector(".exit-fullscreen-button").replaceWith(exitButton);
75-
document.querySelector(".exit-fullscreen-button").click();
76-
document.querySelector("ytmusic-player-bar").classList.remove("pip");
77-
`
78-
);
66+
runAdaptors();
67+
win.webContents.send("pip-toggle", false);
7968

8069
win.setVisibleOnAllWorkspaces(false);
8170
win.setAlwaysOnTop(false);
@@ -114,4 +103,3 @@ module.exports = (_win, _options) => {
114103
};
115104

116105
module.exports.setOptions = setLocalOptions;
117-

plugins/picture-in-picture/front.js

+36
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,46 @@ global.togglePictureInPicture = () => {
2828
ipcRenderer.send("picture-in-picture");
2929
};
3030

31+
const listenForToggle = () => {
32+
const originalExitButton = $(".exit-fullscreen-button");
33+
const clonedExitButton = originalExitButton.cloneNode(true);
34+
clonedExitButton.onclick = () => togglePictureInPicture();
35+
36+
const player = $('#player');
37+
const onPlayerDblClick = player.onDoubleClick_;
38+
39+
const playerBar = $("ytmusic-player-bar");
40+
const expandMenu = $('#expanding-menu');
41+
const middleControls = $('.middle-controls');
42+
const playerPage = $("ytmusic-player-page");
43+
const togglePlayerPageButton = $(".toggle-player-page-button");
44+
const fullScreenButton = $(".fullscreen-button");
45+
46+
ipcRenderer.on('pip-toggle', (_, isPip) => {
47+
if (isPip) {
48+
$(".exit-fullscreen-button").replaceWith(clonedExitButton);
49+
player.onDoubleClick_ = () => {};
50+
expandMenu.onmouseleave = () => middleControls.click();
51+
if (!playerPage.playerPageOpen_) {
52+
togglePlayerPageButton.click();
53+
}
54+
fullScreenButton.click();
55+
playerBar.classList.add("pip");
56+
} else {
57+
$(".exit-fullscreen-button").replaceWith(originalExitButton);
58+
player.onDoubleClick_ = onPlayerDblClick;
59+
expandMenu.onmouseleave = undefined;
60+
originalExitButton.click();
61+
playerBar.classList.remove("pip");
62+
}
63+
});
64+
}
65+
3166
function observeMenu(options) {
3267
document.addEventListener(
3368
"apiLoaded",
3469
() => {
70+
listenForToggle();
3571
const minButton = $(".player-minimize-button");
3672
// remove native listeners
3773
minButton.replaceWith(minButton.cloneNode(true));

plugins/picture-in-picture/menu.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
const { setOptions } = require("./back.js");
22

3-
module.exports = (_win, options) => [
3+
module.exports = (win, options) => [
4+
{
5+
label: "Always on top",
6+
type: "checkbox",
7+
checked: options.alwaysOnTop,
8+
click: (item) => {
9+
setOptions({ alwaysOnTop: item.checked });
10+
win.setAlwaysOnTop(item.checked);
11+
},
12+
},
413
{
514
label: "Save window position",
615
type: "checkbox",

0 commit comments

Comments
 (0)