Compare commits
1 Commits
v1.6.3
...
testing_ha
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bdabf68c9b |
@@ -13,27 +13,24 @@ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
|
|||||||
string(TIMESTAMP TIMESTAMP %s)
|
string(TIMESTAMP TIMESTAMP %s)
|
||||||
# set(CMAKE_AUTOUIC ON)
|
# set(CMAKE_AUTOUIC ON)
|
||||||
|
|
||||||
find_package(Qt5 COMPONENTS Widgets)
|
find_package(Qt5 CONFIG REQUIRED COMPONENTS
|
||||||
if (Qt5_FOUND)
|
Widgets
|
||||||
find_package(Qt5 CONFIG REQUIRED COMPONENTS Widgets WebEngineWidgets)
|
WebEngineWidgets
|
||||||
|
)
|
||||||
|
|
||||||
find_package(KF5Notifications)
|
find_package(KF5Notifications)
|
||||||
if(KF5Notifications_FOUND)
|
if(KF5Notifications_FOUND)
|
||||||
add_definitions( -DKNOTIFICATIONS )
|
add_definitions( -DKNOTIFICATIONS )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(KF5XmlGui)
|
find_package(KF5XmlGui)
|
||||||
if(KF5XmlGui_FOUND)
|
if(KF5XmlGui_FOUND)
|
||||||
add_definitions( -DKXMLGUI )
|
add_definitions( -DKXMLGUI )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(KF5GlobalAccel)
|
find_package(KF5GlobalAccel)
|
||||||
if(KF5GlobalAccel_FOUND)
|
if(KF5GlobalAccel_FOUND)
|
||||||
add_definitions( -DKGLOBALACCEL )
|
add_definitions( -DKGLOBALACCEL )
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(WARNING "Qt 5 was not found on your system and Qt 6 will be used. You will not be able to use any features using KDE Frameworks.")
|
|
||||||
find_package(Qt6 CONFIG REQUIRED COMPONENTS Widgets WebEngineWidgets)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(discord-screenaudio_SRC
|
set(discord-screenaudio_SRC
|
||||||
@@ -69,7 +66,7 @@ add_subdirectory(submodules/rohrkabel)
|
|||||||
|
|
||||||
add_executable(discord-screenaudio ${discord-screenaudio_SRC})
|
add_executable(discord-screenaudio ${discord-screenaudio_SRC})
|
||||||
|
|
||||||
target_link_libraries(discord-screenaudio Qt::Widgets Qt::WebEngineWidgets rohrkabel)
|
target_link_libraries(discord-screenaudio Qt5::Widgets Qt5::WebEngineWidgets rohrkabel)
|
||||||
|
|
||||||
if(KF5Notifications_FOUND)
|
if(KF5Notifications_FOUND)
|
||||||
target_link_libraries(discord-screenaudio KF5::Notifications)
|
target_link_libraries(discord-screenaudio KF5::Notifications)
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ Unlike a lot of other solutions, the audio here is directly fed into the
|
|||||||
screenshare and not passed to the user microphone
|
screenshare and not passed to the user microphone
|
||||||
([see explanation](#how-it-works)).
|
([see explanation](#how-it-works)).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
The purpose of this project is **not** to provide an alternative to the original
|
The purpose of this project is **not** to provide an alternative to the original
|
||||||
Discord client. Rather, it should be used in addition to the original client in
|
Discord client. Rather, it should be used in addition to the original client in
|
||||||
@@ -50,8 +50,6 @@ You have multiple options:
|
|||||||
### Requirements
|
### Requirements
|
||||||
|
|
||||||
- Basic building tools
|
- Basic building tools
|
||||||
- An up-to-date system (I can't guarantee that it works on Debian or Ubuntu
|
|
||||||
20/21)
|
|
||||||
- CMake
|
- CMake
|
||||||
- Qt5 and QtWebEngine
|
- Qt5 and QtWebEngine
|
||||||
- **PipeWire** (it currently doesn't work with PulseAudio)
|
- **PipeWire** (it currently doesn't work with PulseAudio)
|
||||||
@@ -59,7 +57,7 @@ You have multiple options:
|
|||||||
- _Kf5Notifications (optional, for better notifications)_
|
- _Kf5Notifications (optional, for better notifications)_
|
||||||
- _KXMLGui and KGlobalAccel (optional, for keybinds)_
|
- _KXMLGui and KGlobalAccel (optional, for keybinds)_
|
||||||
|
|
||||||
With apt:
|
On Debian:
|
||||||
`apt install -y build-essential cmake qtbase5-dev qtwebengine5-dev libkf5notifications-dev libkf5xmlgui-dev libkf5globalaccel-dev pkg-config libpipewire-0.3-dev git`
|
`apt install -y build-essential cmake qtbase5-dev qtwebengine5-dev libkf5notifications-dev libkf5xmlgui-dev libkf5globalaccel-dev pkg-config libpipewire-0.3-dev git`
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
<metadata_license>CC0-1.0</metadata_license>
|
<metadata_license>CC0-1.0</metadata_license>
|
||||||
<project_license>GPL-3.0+</project_license>
|
<project_license>GPL-3.0+</project_license>
|
||||||
<name>discord-screenaudio</name>
|
<name>discord-screenaudio</name>
|
||||||
<developer_name>Malte Jürgens</developer_name>
|
|
||||||
<releases>
|
<releases>
|
||||||
<release version="${DISCORD_SCEENAUDIO_VERSION_FULL}" timestamp="${TIMESTAMP}" />
|
<release version="${DISCORD_SCEENAUDIO_VERSION_FULL}" timestamp="${TIMESTAMP}" />
|
||||||
</releases>
|
</releases>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ const getAudioDevice = async (nameOfAudioDevice) => {
|
|||||||
return audioDevice;
|
return audioDevice;
|
||||||
};
|
};
|
||||||
|
|
||||||
function setGetDisplayMedia(video = true, overrideArgs = undefined) {
|
function setGetDisplayMedia(overrideArgs = undefined) {
|
||||||
const getDisplayMedia = async (...args) => {
|
const getDisplayMedia = async (...args) => {
|
||||||
var id;
|
var id;
|
||||||
try {
|
try {
|
||||||
@@ -63,7 +63,6 @@ function setGetDisplayMedia(video = true, overrideArgs = undefined) {
|
|||||||
: args || [{ video: true, audio: true }])
|
: args || [{ video: true, audio: true }])
|
||||||
);
|
);
|
||||||
gdm.addTrack(track);
|
gdm.addTrack(track);
|
||||||
if (!video) for (const track of gdm.getVideoTracks()) track.enabled = false;
|
|
||||||
return gdm;
|
return gdm;
|
||||||
};
|
};
|
||||||
navigator.mediaDevices.getDisplayMedia = getDisplayMedia;
|
navigator.mediaDevices.getDisplayMedia = getDisplayMedia;
|
||||||
@@ -75,52 +74,6 @@ const clonedElements = [];
|
|||||||
const hiddenElements = [];
|
const hiddenElements = [];
|
||||||
let wasStreamActive = false;
|
let wasStreamActive = false;
|
||||||
|
|
||||||
function createButton(text, onClick) {
|
|
||||||
const button = document.createElement("button");
|
|
||||||
button.style.marginBottom = "20px";
|
|
||||||
button.classList =
|
|
||||||
"button-f2h6uQ lookFilled-yCfaCM colorBrand-I6CyqQ sizeSmall-wU2dO- grow-2sR_-F";
|
|
||||||
button.innerText = text;
|
|
||||||
button.addEventListener("click", onClick);
|
|
||||||
return button;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createSwitch(text, enabled, onClick) {
|
|
||||||
const container = document.createElement("div");
|
|
||||||
container.style.marginBottom = "20px";
|
|
||||||
container.className = "labelRow-NnoUIp";
|
|
||||||
|
|
||||||
const label = document.createElement("label");
|
|
||||||
label.innerText = text;
|
|
||||||
label.className = "title-2yADjX";
|
|
||||||
container.appendChild(label);
|
|
||||||
|
|
||||||
const svg = document.createElement("div");
|
|
||||||
container.appendChild(svg);
|
|
||||||
|
|
||||||
function setSvgDisabled() {
|
|
||||||
svg.innerHTML = `<div class="container-1QtPKm default-colors disabled-3_3z1m" style="opacity: 0.3; background-color: rgb(114, 118, 125);"><svg class="slider-HJFN2i" viewBox="0 0 28 20" preserveAspectRatio="xMinYMid meet" aria-hidden="true" style="left: -3px;"><rect fill="white" x="4" y="0" height="20" width="20" rx="10"></rect><svg viewBox="0 0 20 20" fill="none"><path fill="rgba(114, 118, 125, 1)" d="M5.13231 6.72963L6.7233 5.13864L14.855 13.2704L13.264 14.8614L5.13231 6.72963Z"></path><path fill="rgba(114, 118, 125, 1)" d="M13.2704 5.13864L14.8614 6.72963L6.72963 14.8614L5.13864 13.2704L13.2704 5.13864Z"></path></svg></svg><input id="uid_75" type="checkbox" class="input-125oad" tabindex="-1" disabled=""></div>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function setSvgEnabled() {
|
|
||||||
svg.innerHTML = `<div class="container-1QtPKm default-colors checked-16gMAN" style="opacity: 1; background-color: rgb(59, 165, 92);"><svg class="slider-HJFN2i" viewBox="0 0 28 20" preserveAspectRatio="xMinYMid meet" aria-hidden="true" style="left: 12px;"><rect fill="white" x="4" y="0" height="20" width="20" rx="10"></rect><svg viewBox="0 0 20 20" fill="none"><path fill="rgba(59, 165, 92, 1)" d="M7.89561 14.8538L6.30462 13.2629L14.3099 5.25755L15.9009 6.84854L7.89561 14.8538Z"></path><path fill="rgba(59, 165, 92, 1)" d="M4.08643 11.0903L5.67742 9.49929L9.4485 13.2704L7.85751 14.8614L4.08643 11.0903Z"></path></svg></svg><input id="uid_74" type="checkbox" class="input-125oad" tabindex="0" checked=""></div>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateSvg() {
|
|
||||||
if (enabled) setSvgEnabled();
|
|
||||||
else setSvgDisabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
container.addEventListener("click", () => {
|
|
||||||
enabled = !enabled;
|
|
||||||
updateSvg();
|
|
||||||
onClick(enabled);
|
|
||||||
});
|
|
||||||
updateSvg();
|
|
||||||
|
|
||||||
return container;
|
|
||||||
}
|
|
||||||
|
|
||||||
setInterval(() => {
|
setInterval(() => {
|
||||||
const streamActive =
|
const streamActive =
|
||||||
document.getElementsByClassName("panel-2ZFCRb activityPanel-9icbyU")
|
document.getElementsByClassName("panel-2ZFCRb activityPanel-9icbyU")
|
||||||
@@ -158,16 +111,9 @@ setInterval(() => {
|
|||||||
|
|
||||||
const initialDisplay = el.style.display;
|
const initialDisplay = el.style.display;
|
||||||
|
|
||||||
window.discordScreenaudioStartStream = (
|
window.discordScreenaudioStartStream = (width, height, frameRate) => {
|
||||||
video,
|
window.discordScreenaudioResolutionString = `${height}p ${frameRate}FPS`;
|
||||||
width,
|
setGetDisplayMedia({
|
||||||
height,
|
|
||||||
frameRate
|
|
||||||
) => {
|
|
||||||
window.discordScreenaudioResolutionString = video
|
|
||||||
? `${height}p ${frameRate}FPS`
|
|
||||||
: "Audio Only";
|
|
||||||
setGetDisplayMedia(video, {
|
|
||||||
audio: true,
|
audio: true,
|
||||||
video: { width, height, frameRate },
|
video: { width, height, frameRate },
|
||||||
});
|
});
|
||||||
@@ -217,7 +163,7 @@ setInterval(() => {
|
|||||||
document
|
document
|
||||||
.getElementById("keybinds-tab")
|
.getElementById("keybinds-tab")
|
||||||
?.getElementsByClassName(
|
?.getElementsByClassName(
|
||||||
"container-3jbRo5 info-1hMolH browserNotice-1u-Y5o"
|
"container-3jbRo5 info-1hMolH fontSize16-3zr6Io browserNotice-1u-Y5o"
|
||||||
).length
|
).length
|
||||||
) {
|
) {
|
||||||
const el = document
|
const el = document
|
||||||
@@ -225,37 +171,26 @@ setInterval(() => {
|
|||||||
.getElementsByClassName("children-1xdcWE")[0];
|
.getElementsByClassName("children-1xdcWE")[0];
|
||||||
const div = document.createElement("div");
|
const div = document.createElement("div");
|
||||||
div.style.marginBottom = "50px";
|
div.style.marginBottom = "50px";
|
||||||
div.appendChild(
|
const button = document.createElement("button");
|
||||||
createButton("Edit Global Keybinds", () => {
|
button.classList =
|
||||||
console.log("!discord-screenaudio-keybinds");
|
"button-f2h6uQ lookFilled-yCfaCM colorBrand-I6CyqQ sizeSmall-wU2dO- grow-2sR_-F";
|
||||||
})
|
button.innerText = "Edit Global Keybinds";
|
||||||
);
|
button.addEventListener("click", () => {
|
||||||
|
console.log("!discord-screenaudio-keybinds");
|
||||||
|
});
|
||||||
|
div.appendChild(button);
|
||||||
el.innerHTML = "";
|
el.innerHTML = "";
|
||||||
el.appendChild(div);
|
el.appendChild(div);
|
||||||
}
|
}
|
||||||
|
|
||||||
const buttonContainer =
|
const muteBtn = document.getElementsByClassName(
|
||||||
document.getElementsByClassName("container-YkUktl")[0];
|
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
||||||
if (!buttonContainer) {
|
)[0];
|
||||||
console.log(
|
window.discordScreenaudioToggleMute = () => muteBtn.click();
|
||||||
"dsa: Cannot locate Mute/Deafen/Settings button container, please report this on GitHub"
|
const deafenBtn = document.getElementsByClassName(
|
||||||
);
|
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
||||||
}
|
)[1];
|
||||||
|
window.discordScreenaudioToggleDeafen = () => deafenBtn.click();
|
||||||
const muteBtn = buttonContainer
|
|
||||||
? buttonContainer.getElementsByClassName(
|
|
||||||
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
|
||||||
)[0]
|
|
||||||
: null;
|
|
||||||
window.discordScreenaudioToggleMute = () => muteBtn && muteBtn.click();
|
|
||||||
|
|
||||||
const deafenBtn = buttonContainer
|
|
||||||
? buttonContainer.getElementsByClassName(
|
|
||||||
"button-12Fmur enabled-9OeuTA button-f2h6uQ lookBlank-21BCro colorBrand-I6CyqQ grow-2sR_-F"
|
|
||||||
)[1]
|
|
||||||
: null;
|
|
||||||
|
|
||||||
window.discordScreenaudioToggleDeafen = () => deafenBtn && deafenBtn.click();
|
|
||||||
|
|
||||||
if (window.discordScreenaudioResolutionString) {
|
if (window.discordScreenaudioResolutionString) {
|
||||||
for (const el of document.getElementsByClassName(
|
for (const el of document.getElementsByClassName(
|
||||||
@@ -264,52 +199,6 @@ setInterval(() => {
|
|||||||
el.innerHTML = window.discordScreenaudioResolutionString;
|
el.innerHTML = window.discordScreenaudioResolutionString;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const accountTab = document.getElementById("my-account-tab");
|
|
||||||
if (accountTab) {
|
|
||||||
const discordScreenaudioSettings = document.getElementById(
|
|
||||||
"discord-screenaudio-settings"
|
|
||||||
);
|
|
||||||
if (!discordScreenaudioSettings) {
|
|
||||||
const firstDivider = accountTab.getElementsByClassName(
|
|
||||||
"divider-3nqZNm marginTop40-Q4o1tS"
|
|
||||||
)[0];
|
|
||||||
if (firstDivider) {
|
|
||||||
const section = document.createElement("div");
|
|
||||||
section.className = "marginTop40-Q4o1tS";
|
|
||||||
section.id = "discord-screenaudio-settings";
|
|
||||||
|
|
||||||
const title = document.createElement("h2");
|
|
||||||
title.className =
|
|
||||||
"h1-3iMExa title-lXcL8p defaultColor-3Olr-9 defaultMarginh1-1UYutH";
|
|
||||||
title.innerText = "discord-screenaudio";
|
|
||||||
section.appendChild(title);
|
|
||||||
|
|
||||||
section.appendChild(
|
|
||||||
createButton("Edit Global Keybinds", () => {
|
|
||||||
console.log("!discord-screenaudio-keybinds");
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
section.appendChild(
|
|
||||||
createSwitch(
|
|
||||||
"Move discord-screenaudio to the system tray instead of closing",
|
|
||||||
window.discordScreenaudioTrayEnabled,
|
|
||||||
(enabled) => {
|
|
||||||
window.discordScreenaudioTrayEnabled = enabled;
|
|
||||||
console.log(`!discord-screenaudio-tray-${enabled}`);
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
const divider = document.createElement("div");
|
|
||||||
divider.className = "divider-3nqZNm marginTop40-Q4o1tS";
|
|
||||||
|
|
||||||
firstDivider.after(section);
|
|
||||||
section.after(divider);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 500);
|
}, 500);
|
||||||
|
|
||||||
// Fix for broken discord notifications after restart
|
// Fix for broken discord notifications after restart
|
||||||
|
|||||||
@@ -55,14 +55,9 @@ DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) {
|
|||||||
|
|
||||||
injectScriptFile("userscript.js", ":/assets/userscript.js");
|
injectScriptFile("userscript.js", ":/assets/userscript.js");
|
||||||
|
|
||||||
injectScriptText("vars.js",
|
injectScriptText("version.js",
|
||||||
QString("window.discordScreenaudioVersion = '%1'; "
|
QString("window.discordScreenaudioVersion = '%1';")
|
||||||
"window.discordScreenaudioTrayEnabled = %2;")
|
.arg(QApplication::applicationVersion()));
|
||||||
.arg(QApplication::applicationVersion())
|
|
||||||
.arg(MainWindow::instance()
|
|
||||||
->settings()
|
|
||||||
->value("trayIcon", false)
|
|
||||||
.toBool()));
|
|
||||||
|
|
||||||
#ifdef KXMLGUI
|
#ifdef KXMLGUI
|
||||||
injectScriptText("xmlgui.js", "window.discordScreenaudioKXMLGUI = true;");
|
injectScriptText("xmlgui.js", "window.discordScreenaudioKXMLGUI = true;");
|
||||||
@@ -191,8 +186,10 @@ void DiscordPage::stopVirtmic() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DiscordPage::startVirtmic(QString target) {
|
void DiscordPage::startVirtmic(QString target) {
|
||||||
qDebug(virtmicLog) << "Starting Virtmic with target" << target;
|
if (target != "None") {
|
||||||
m_virtmicProcess.start(QApplication::arguments()[0], {"--virtmic", target});
|
qDebug(virtmicLog) << "Starting Virtmic with target" << target;
|
||||||
|
m_virtmicProcess.start(QApplication::arguments()[0], {"--virtmic", target});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiscordPage::javaScriptConsoleMessage(
|
void DiscordPage::javaScriptConsoleMessage(
|
||||||
@@ -226,10 +223,6 @@ void DiscordPage::javaScriptConsoleMessage(
|
|||||||
"(KXmlGui and KGlobalAccel are not available).",
|
"(KXmlGui and KGlobalAccel are not available).",
|
||||||
QMessageBox::Ok);
|
QMessageBox::Ok);
|
||||||
#endif
|
#endif
|
||||||
} else if (message == "!discord-screenaudio-tray-true") {
|
|
||||||
MainWindow::instance()->setTrayIcon(true);
|
|
||||||
} else if (message == "!discord-screenaudio-tray-false") {
|
|
||||||
MainWindow::instance()->setTrayIcon(false);
|
|
||||||
} else if (message.startsWith("dsa: ")) {
|
} else if (message.startsWith("dsa: ")) {
|
||||||
qDebug(userscriptLog) << message.mid(5).toUtf8().constData();
|
qDebug(userscriptLog) << message.mid(5).toUtf8().constData();
|
||||||
} else {
|
} else {
|
||||||
@@ -237,18 +230,16 @@ void DiscordPage::javaScriptConsoleMessage(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiscordPage::startStream(bool video, bool audio, uint width, uint height,
|
void DiscordPage::startStream(QString target, uint width, uint height,
|
||||||
uint frameRate, QString target) {
|
uint frameRate) {
|
||||||
stopVirtmic();
|
stopVirtmic();
|
||||||
startVirtmic(audio ? target : "[None]");
|
startVirtmic(target);
|
||||||
// Wait a bit for the virtmic to start
|
// Wait a bit for the virtmic to start
|
||||||
QTimer::singleShot(200, [=]() {
|
QTimer::singleShot(target == "None" ? 0 : 200, [=]() {
|
||||||
runJavaScript(
|
runJavaScript(QString("window.discordScreenaudioStartStream(%1, %2, %3);")
|
||||||
QString("window.discordScreenaudioStartStream(%1, %2, %3, %4);")
|
.arg(width)
|
||||||
.arg(video)
|
.arg(height)
|
||||||
.arg(video ? width : 32)
|
.arg(frameRate));
|
||||||
.arg(video ? height : 16)
|
|
||||||
.arg(video ? frameRate : 1));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,8 +47,7 @@ private:
|
|||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void featurePermissionRequested(const QUrl &securityOrigin,
|
void featurePermissionRequested(const QUrl &securityOrigin,
|
||||||
QWebEnginePage::Feature feature);
|
QWebEnginePage::Feature feature);
|
||||||
void startStream(bool video, bool audio, uint width, uint height,
|
void startStream(QString target, uint width, uint height, uint frameRate);
|
||||||
uint frameRate, QString target);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Will immediately get destroyed again but is needed for navigation to
|
// Will immediately get destroyed again but is needed for navigation to
|
||||||
|
|||||||
@@ -30,9 +30,6 @@ int main(int argc, char *argv[]) {
|
|||||||
QCommandLineOption degubOption("remote-debugging",
|
QCommandLineOption degubOption("remote-debugging",
|
||||||
"Open Chromium Remote Debugging on port 9222");
|
"Open Chromium Remote Debugging on port 9222");
|
||||||
parser.addOption(degubOption);
|
parser.addOption(degubOption);
|
||||||
QCommandLineOption notifySendOption(
|
|
||||||
"notify-send", "Use notify-send instead of QT/KF5 notifications");
|
|
||||||
parser.addOption(notifySendOption);
|
|
||||||
|
|
||||||
parser.process(app);
|
parser.process(app);
|
||||||
|
|
||||||
@@ -41,6 +38,8 @@ int main(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
qputenv("QTWEBENGINE_CHROMIUM_FLAGS",
|
qputenv("QTWEBENGINE_CHROMIUM_FLAGS",
|
||||||
|
"--ignore-gpu-blacklist --enable-gpu-rasterization "
|
||||||
|
"--enable-native-gpu-memory-buffers --num-raster-threads=4 "
|
||||||
"--enable-features=WebRTCPipeWireCapturer " +
|
"--enable-features=WebRTCPipeWireCapturer " +
|
||||||
qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"));
|
qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"));
|
||||||
|
|
||||||
@@ -49,7 +48,7 @@ int main(int argc, char *argv[]) {
|
|||||||
"--remote-debugging-port=9222 " +
|
"--remote-debugging-port=9222 " +
|
||||||
qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"));
|
qgetenv("QTWEBENGINE_CHROMIUM_FLAGS"));
|
||||||
|
|
||||||
MainWindow w(parser.isSet(notifySendOption));
|
MainWindow w;
|
||||||
w.show();
|
w.show();
|
||||||
|
|
||||||
return app.exec();
|
return app.exec();
|
||||||
|
|||||||
@@ -24,14 +24,10 @@
|
|||||||
|
|
||||||
MainWindow *MainWindow::m_instance = nullptr;
|
MainWindow *MainWindow::m_instance = nullptr;
|
||||||
|
|
||||||
MainWindow::MainWindow(bool useNotifySend, QWidget *parent)
|
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
|
||||||
: QMainWindow(parent) {
|
|
||||||
assert(MainWindow::m_instance == nullptr);
|
assert(MainWindow::m_instance == nullptr);
|
||||||
MainWindow::m_instance = this;
|
MainWindow::m_instance = this;
|
||||||
m_useNotifySend = useNotifySend;
|
|
||||||
setupSettings();
|
|
||||||
setupWebView();
|
setupWebView();
|
||||||
setupTrayIcon();
|
|
||||||
resize(1000, 700);
|
resize(1000, 700);
|
||||||
showMaximized();
|
showMaximized();
|
||||||
}
|
}
|
||||||
@@ -44,37 +40,22 @@ void MainWindow::setupWebView() {
|
|||||||
m_webView = new QWebEngineView(this);
|
m_webView = new QWebEngineView(this);
|
||||||
m_webView->setPage(page);
|
m_webView->setPage(page);
|
||||||
|
|
||||||
if (m_useKF5Notifications || m_useNotifySend)
|
|
||||||
QWebEngineProfile::defaultProfile()->setNotificationPresenter(
|
|
||||||
[&](std::unique_ptr<QWebEngineNotification> notificationInfo) {
|
|
||||||
if (m_useNotifySend) {
|
|
||||||
auto title = notificationInfo->title();
|
|
||||||
auto message = notificationInfo->message();
|
|
||||||
auto image_path =
|
|
||||||
QString("/tmp/discord-screenaudio-%1.png").arg(title);
|
|
||||||
notificationInfo->icon().save(image_path);
|
|
||||||
QProcess::execute("notify-send",
|
|
||||||
{"--icon", image_path, "--app-name",
|
|
||||||
"discord-screenaudio", title, message});
|
|
||||||
} else if (m_useKF5Notifications) {
|
|
||||||
#ifdef KNOTIFICATIONS
|
#ifdef KNOTIFICATIONS
|
||||||
KNotification *notification =
|
QWebEngineProfile::defaultProfile()->setNotificationPresenter(
|
||||||
new KNotification("discordNotification");
|
[&](std::unique_ptr<QWebEngineNotification> notificationInfo) {
|
||||||
notification->setTitle(notificationInfo->title());
|
KNotification *notification = new KNotification("discordNotification");
|
||||||
notification->setText(notificationInfo->message());
|
notification->setTitle(notificationInfo->title());
|
||||||
notification->setPixmap(
|
notification->setText(notificationInfo->message());
|
||||||
QPixmap::fromImage(notificationInfo->icon()));
|
notification->setPixmap(QPixmap::fromImage(notificationInfo->icon()));
|
||||||
notification->setDefaultAction("View");
|
notification->setDefaultAction("View");
|
||||||
connect(notification, &KNotification::defaultActivated,
|
connect(notification, &KNotification::defaultActivated,
|
||||||
[&, notificationInfo = std::move(notificationInfo)]() {
|
[&, notificationInfo = std::move(notificationInfo)]() {
|
||||||
notificationInfo->click();
|
notificationInfo->click();
|
||||||
show();
|
activateWindow();
|
||||||
activateWindow();
|
});
|
||||||
});
|
notification->sendEvent();
|
||||||
notification->sendEvent();
|
});
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
setCentralWidget(m_webView);
|
setCentralWidget(m_webView);
|
||||||
}
|
}
|
||||||
@@ -90,72 +71,6 @@ void MainWindow::fullScreenRequested(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::setupTrayIcon() {
|
void MainWindow::closeEvent(QCloseEvent *event) { QApplication::quit(); }
|
||||||
if (m_settings->value("trayIcon", false).toBool() == false ||
|
|
||||||
m_trayIcon != nullptr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto aboutAction = new QAction(
|
|
||||||
"discord-screenaudio v" + QString(DISCORD_SCEENAUDIO_VERSION_FULL), this);
|
|
||||||
aboutAction->setIcon(QIcon(":assets/de.shorsh.discord-screenaudio.png"));
|
|
||||||
aboutAction->setEnabled(false);
|
|
||||||
|
|
||||||
auto exitAction = new QAction("Exit", this);
|
|
||||||
connect(exitAction, &QAction::triggered, []() { QApplication::quit(); });
|
|
||||||
|
|
||||||
m_trayIconMenu = new QMenu(this);
|
|
||||||
m_trayIconMenu->addAction(aboutAction);
|
|
||||||
m_trayIconMenu->addAction(exitAction);
|
|
||||||
|
|
||||||
m_trayIcon = new QSystemTrayIcon(this);
|
|
||||||
m_trayIcon->setContextMenu(m_trayIconMenu);
|
|
||||||
m_trayIcon->setIcon(QIcon(":assets/de.shorsh.discord-screenaudio.png"));
|
|
||||||
m_trayIcon->show();
|
|
||||||
|
|
||||||
connect(m_trayIcon, &QSystemTrayIcon::activated, [this](auto reason) {
|
|
||||||
if (reason == QSystemTrayIcon::Trigger) {
|
|
||||||
if (isVisible()) {
|
|
||||||
hide();
|
|
||||||
} else {
|
|
||||||
show();
|
|
||||||
activateWindow();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::cleanTrayIcon() {
|
|
||||||
if (m_trayIcon == nullptr)
|
|
||||||
return;
|
|
||||||
m_trayIcon->hide();
|
|
||||||
m_trayIconMenu->deleteLater();
|
|
||||||
m_trayIcon->deleteLater();
|
|
||||||
m_trayIconMenu = nullptr;
|
|
||||||
m_trayIcon = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::setupSettings() {
|
|
||||||
m_settings = new QSettings("maltejur", "discord-screenaudio", this);
|
|
||||||
m_settings->beginGroup("settings");
|
|
||||||
m_settings->endGroup();
|
|
||||||
}
|
|
||||||
|
|
||||||
QSettings *MainWindow::settings() const { return m_settings; }
|
|
||||||
|
|
||||||
void MainWindow::setTrayIcon(bool enabled) {
|
|
||||||
m_settings->setValue("trayIcon", enabled);
|
|
||||||
if (enabled) {
|
|
||||||
setupTrayIcon();
|
|
||||||
} else {
|
|
||||||
cleanTrayIcon();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::closeEvent(QCloseEvent *event) {
|
|
||||||
if (m_settings->value("trayIcon", false).toBool()) {
|
|
||||||
hide();
|
|
||||||
} else
|
|
||||||
QApplication::quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
MainWindow *MainWindow::instance() { return m_instance; }
|
MainWindow *MainWindow::instance() { return m_instance; }
|
||||||
|
|||||||
@@ -3,11 +3,8 @@
|
|||||||
#include "discordpage.h"
|
#include "discordpage.h"
|
||||||
|
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
#include <QMenu>
|
|
||||||
#include <QScopedPointer>
|
#include <QScopedPointer>
|
||||||
#include <QSettings>
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QSystemTrayIcon>
|
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <QWebEnginePage>
|
#include <QWebEnginePage>
|
||||||
#include <QWebEngineProfile>
|
#include <QWebEngineProfile>
|
||||||
@@ -17,33 +14,17 @@ class MainWindow : public QMainWindow {
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MainWindow(bool useNotifySend = false, QWidget *parent = nullptr);
|
explicit MainWindow(QWidget *parent = nullptr);
|
||||||
static MainWindow *instance();
|
static MainWindow *instance();
|
||||||
QSettings *settings() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setupWebView();
|
void setupWebView();
|
||||||
void setupTrayIcon();
|
|
||||||
void cleanTrayIcon();
|
|
||||||
void setupSettings();
|
|
||||||
QWebEngineView *m_webView;
|
QWebEngineView *m_webView;
|
||||||
QWebEngineProfile *prepareProfile();
|
QWebEngineProfile *prepareProfile();
|
||||||
DiscordPage *m_discordPage;
|
DiscordPage *m_discordPage;
|
||||||
void closeEvent(QCloseEvent *event) override;
|
void closeEvent(QCloseEvent *event) override;
|
||||||
QSystemTrayIcon *m_trayIcon = nullptr;
|
|
||||||
QMenu *m_trayIconMenu;
|
|
||||||
QSettings *m_settings;
|
|
||||||
bool m_wasMaximized;
|
bool m_wasMaximized;
|
||||||
static MainWindow *m_instance;
|
static MainWindow *m_instance;
|
||||||
bool m_useNotifySend;
|
|
||||||
#ifdef KNOTIFICATIONS
|
|
||||||
bool m_useKF5Notifications = true;
|
|
||||||
#else
|
|
||||||
bool m_useKF5Notifications = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
|
||||||
void setTrayIcon(bool enabled);
|
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest);
|
void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest);
|
||||||
|
|||||||
@@ -12,96 +12,70 @@
|
|||||||
StreamDialog::StreamDialog() : QWidget() {
|
StreamDialog::StreamDialog() : QWidget() {
|
||||||
setAttribute(Qt::WA_QuitOnClose, false);
|
setAttribute(Qt::WA_QuitOnClose, false);
|
||||||
|
|
||||||
{
|
auto layout = new QVBoxLayout(this);
|
||||||
auto layout = new QVBoxLayout(this);
|
layout->setSizeConstraint(QLayout::SetFixedSize);
|
||||||
layout->setSizeConstraint(QLayout::SetFixedSize);
|
|
||||||
|
|
||||||
m_videoGroupBox = new QGroupBox(this);
|
auto targetLabel = new QLabel(this);
|
||||||
m_videoGroupBox->setTitle("Video");
|
targetLabel->setText("Which app do you want to stream sound from?");
|
||||||
m_videoGroupBox->setCheckable(true);
|
layout->addWidget(targetLabel);
|
||||||
layout->addWidget(m_videoGroupBox);
|
|
||||||
|
|
||||||
{
|
auto targetHBox = new QHBoxLayout(this);
|
||||||
auto videoLayout = new QVBoxLayout(this);
|
layout->addLayout(targetHBox);
|
||||||
m_videoGroupBox->setLayout(videoLayout);
|
|
||||||
|
|
||||||
auto resolutionLabel = new QLabel(this);
|
m_targetComboBox = new QComboBox(this);
|
||||||
resolutionLabel->setText("Resolution");
|
updateTargets();
|
||||||
videoLayout->addWidget(resolutionLabel);
|
targetHBox->addWidget(m_targetComboBox);
|
||||||
|
|
||||||
m_resolutionComboBox = new QComboBox(this);
|
auto refreshTargetsButton = new QPushButton(this);
|
||||||
m_resolutionComboBox->addItem("2160p", "3840x2160");
|
refreshTargetsButton->setFixedSize(30, 30);
|
||||||
m_resolutionComboBox->addItem("1440p", "2560x1440");
|
refreshTargetsButton->setIcon(QIcon::fromTheme("view-refresh"));
|
||||||
m_resolutionComboBox->addItem("1080p", "1920x1080");
|
connect(refreshTargetsButton, &QPushButton::clicked, this,
|
||||||
m_resolutionComboBox->addItem("720p", "1280x720");
|
&StreamDialog::updateTargets);
|
||||||
m_resolutionComboBox->addItem("480p", "854x480");
|
targetHBox->addWidget(refreshTargetsButton);
|
||||||
m_resolutionComboBox->addItem("360p", "640x360");
|
|
||||||
m_resolutionComboBox->addItem("240p", "426x240");
|
|
||||||
m_resolutionComboBox->setCurrentText("720p");
|
|
||||||
videoLayout->addWidget(m_resolutionComboBox);
|
|
||||||
|
|
||||||
auto framerateLabel = new QLabel(this);
|
auto qualityLabel = new QLabel(this);
|
||||||
framerateLabel->setText("Framerate");
|
qualityLabel->setText("Stream Quality");
|
||||||
videoLayout->addWidget(framerateLabel);
|
layout->addWidget(qualityLabel);
|
||||||
|
|
||||||
m_framerateComboBox = new QComboBox(this);
|
auto qualityHBox = new QHBoxLayout(this);
|
||||||
m_framerateComboBox->addItem("144 FPS", 144);
|
layout->addLayout(qualityHBox);
|
||||||
m_framerateComboBox->addItem("60 FPS", 60);
|
|
||||||
m_framerateComboBox->addItem("30 FPS", 30);
|
|
||||||
m_framerateComboBox->addItem("15 FPS", 15);
|
|
||||||
m_framerateComboBox->addItem("5 FPS", 5);
|
|
||||||
m_framerateComboBox->setCurrentText("30 FPS");
|
|
||||||
videoLayout->addWidget(m_framerateComboBox);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_audioGroupBox = new QGroupBox(this);
|
m_qualityResolutionComboBox = new QComboBox(this);
|
||||||
m_audioGroupBox->setCheckable(true);
|
m_qualityResolutionComboBox->addItem("2160p", "3840x2160");
|
||||||
m_audioGroupBox->setTitle("Audio");
|
m_qualityResolutionComboBox->addItem("1440p", "2560x1440");
|
||||||
layout->addWidget(m_audioGroupBox);
|
m_qualityResolutionComboBox->addItem("1080p", "1920x1080");
|
||||||
|
m_qualityResolutionComboBox->addItem("720p", "1280x720");
|
||||||
|
m_qualityResolutionComboBox->addItem("480p", "854x480");
|
||||||
|
m_qualityResolutionComboBox->addItem("360p", "640x360");
|
||||||
|
m_qualityResolutionComboBox->addItem("240p", "426x240");
|
||||||
|
m_qualityResolutionComboBox->setCurrentText("720p");
|
||||||
|
qualityHBox->addWidget(m_qualityResolutionComboBox);
|
||||||
|
|
||||||
{
|
m_qualityFPSComboBox = new QComboBox(this);
|
||||||
auto audioLayout = new QVBoxLayout(this);
|
m_qualityFPSComboBox->addItem("144 FPS", 144);
|
||||||
m_audioGroupBox->setLayout(audioLayout);
|
m_qualityFPSComboBox->addItem("60 FPS", 60);
|
||||||
|
m_qualityFPSComboBox->addItem("30 FPS", 30);
|
||||||
|
m_qualityFPSComboBox->addItem("15 FPS", 15);
|
||||||
|
m_qualityFPSComboBox->addItem("5 FPS", 5);
|
||||||
|
m_qualityFPSComboBox->setCurrentText("30 FPS");
|
||||||
|
qualityHBox->addWidget(m_qualityFPSComboBox);
|
||||||
|
|
||||||
auto targetLabel = new QLabel(this);
|
auto button = new QPushButton(this);
|
||||||
targetLabel->setText("Audio Source");
|
button->setText("Start Stream");
|
||||||
audioLayout->addWidget(targetLabel);
|
connect(button, &QPushButton::clicked, this, &StreamDialog::startStream);
|
||||||
|
layout->addWidget(button, Qt::AlignRight | Qt::AlignBottom);
|
||||||
|
|
||||||
{
|
setLayout(layout);
|
||||||
auto targetLayout = new QHBoxLayout(this);
|
|
||||||
audioLayout->addLayout(targetLayout);
|
|
||||||
|
|
||||||
m_targetComboBox = new QComboBox(this);
|
|
||||||
updateTargets();
|
|
||||||
targetLayout->addWidget(m_targetComboBox);
|
|
||||||
|
|
||||||
auto refreshTargetsButton = new QPushButton(this);
|
|
||||||
refreshTargetsButton->setFixedSize(30, 30);
|
|
||||||
refreshTargetsButton->setIcon(QIcon::fromTheme("view-refresh"));
|
|
||||||
connect(refreshTargetsButton, &QPushButton::clicked, this,
|
|
||||||
&StreamDialog::updateTargets);
|
|
||||||
targetLayout->addWidget(refreshTargetsButton);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto button = new QPushButton(this);
|
|
||||||
button->setText("Start Stream");
|
|
||||||
connect(button, &QPushButton::clicked, this, &StreamDialog::startStream);
|
|
||||||
layout->addWidget(button, Qt::AlignRight | Qt::AlignBottom);
|
|
||||||
|
|
||||||
setLayout(layout);
|
|
||||||
}
|
|
||||||
|
|
||||||
setWindowTitle("discord-screenaudio Stream Dialog");
|
setWindowTitle("discord-screenaudio Stream Dialog");
|
||||||
}
|
}
|
||||||
|
|
||||||
void StreamDialog::startStream() {
|
void StreamDialog::startStream() {
|
||||||
auto resolution = m_resolutionComboBox->currentData().toString().split('x');
|
auto resolution =
|
||||||
emit requestedStreamStart(m_videoGroupBox->isChecked(),
|
m_qualityResolutionComboBox->currentData().toString().split('x');
|
||||||
m_audioGroupBox->isChecked(),
|
emit requestedStreamStart(m_targetComboBox->currentText(),
|
||||||
resolution[0].toUInt(), resolution[1].toUInt(),
|
resolution[0].toUInt(), resolution[1].toUInt(),
|
||||||
m_framerateComboBox->currentData().toUInt(),
|
m_qualityFPSComboBox->currentData().toUInt());
|
||||||
m_targetComboBox->currentText());
|
|
||||||
setHidden(true);
|
setHidden(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,6 +83,7 @@ void StreamDialog::updateTargets() {
|
|||||||
auto lastTarget = m_targetComboBox->currentText();
|
auto lastTarget = m_targetComboBox->currentText();
|
||||||
|
|
||||||
m_targetComboBox->clear();
|
m_targetComboBox->clear();
|
||||||
|
m_targetComboBox->addItem("[None]");
|
||||||
m_targetComboBox->addItem("[All Desktop Audio]");
|
m_targetComboBox->addItem("[All Desktop Audio]");
|
||||||
for (auto target : Virtmic::getTargets()) {
|
for (auto target : Virtmic::getTargets()) {
|
||||||
m_targetComboBox->addItem(target);
|
m_targetComboBox->addItem(target);
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
#include <QComboBox>
|
#include <QComboBox>
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QGroupBox>
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
|
||||||
class StreamDialog : public QWidget {
|
class StreamDialog : public QWidget {
|
||||||
@@ -13,14 +12,12 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QComboBox *m_targetComboBox;
|
QComboBox *m_targetComboBox;
|
||||||
QComboBox *m_resolutionComboBox;
|
QComboBox *m_qualityResolutionComboBox;
|
||||||
QComboBox *m_framerateComboBox;
|
QComboBox *m_qualityFPSComboBox;
|
||||||
QGroupBox *m_videoGroupBox;
|
|
||||||
QGroupBox *m_audioGroupBox;
|
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void requestedStreamStart(bool video, bool audio, uint width, uint height,
|
void requestedStreamStart(QString target, uint width, uint height,
|
||||||
uint frameRate, QString target);
|
uint frameRate);
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void updateTargets();
|
void updateTargets();
|
||||||
|
|||||||
@@ -22,13 +22,7 @@ QVector<QString> getTargets() {
|
|||||||
if (global.type == pipewire::node::type) {
|
if (global.type == pipewire::node::type) {
|
||||||
auto node = reg.bind<pipewire::node>(global.id);
|
auto node = reg.bind<pipewire::node>(global.id);
|
||||||
auto info = node.info();
|
auto info = node.info();
|
||||||
QString name;
|
auto name = QString::fromStdString(info.props["application.name"]);
|
||||||
if (info.props.count("application.name") &&
|
|
||||||
info.props["application.name"] != "")
|
|
||||||
name = QString::fromStdString(info.props["application.name"]);
|
|
||||||
else
|
|
||||||
name = QString::fromStdString(
|
|
||||||
info.props["application.process.binary"]);
|
|
||||||
|
|
||||||
if (name != "" && !EXCLUDE_TARGETS.contains(name) &&
|
if (name != "" && !EXCLUDE_TARGETS.contains(name) &&
|
||||||
!targets.contains(name)) {
|
!targets.contains(name)) {
|
||||||
@@ -73,12 +67,7 @@ void start(QString _target) {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto &parent = nodes.at(parent_id);
|
auto &parent = nodes.at(parent_id);
|
||||||
std::string name;
|
auto name = parent.props["application.name"];
|
||||||
if (parent.props.count("application.name") &&
|
|
||||||
parent.props["application.name"] != "")
|
|
||||||
name = parent.props["application.name"];
|
|
||||||
else
|
|
||||||
name = parent.props["application.process.binary"];
|
|
||||||
|
|
||||||
if (name == target ||
|
if (name == target ||
|
||||||
(target == "[All Desktop Audio]" &&
|
(target == "[All Desktop Audio]" &&
|
||||||
@@ -89,7 +78,8 @@ void start(QString _target) {
|
|||||||
core.create<pipewire::link_factory>(
|
core.create<pipewire::link_factory>(
|
||||||
{fl ? virt_fl->info().id : virt_fr->info().id, port_id}));
|
{fl ? virt_fl->info().id : virt_fr->info().id, port_id}));
|
||||||
qDebug(virtmicLog) << QString("Link: %1:%2 -> %3")
|
qDebug(virtmicLog) << QString("Link: %1:%2 -> %3")
|
||||||
.arg(QString::fromStdString(name))
|
.arg(QString::fromStdString(
|
||||||
|
parent.props["application.name"]))
|
||||||
.arg(port_id)
|
.arg(port_id)
|
||||||
.arg(fl ? virt_fl->info().id
|
.arg(fl ? virt_fl->info().id
|
||||||
: virt_fr->info().id)
|
: virt_fr->info().id)
|
||||||
@@ -122,17 +112,11 @@ void start(QString _target) {
|
|||||||
[&](const pipewire::global &global) {
|
[&](const pipewire::global &global) {
|
||||||
if (global.type == pipewire::node::type) {
|
if (global.type == pipewire::node::type) {
|
||||||
auto node = reg.bind<pipewire::node>(global.id);
|
auto node = reg.bind<pipewire::node>(global.id);
|
||||||
auto info = node.info();
|
if (!node.info().props.count("application.name"))
|
||||||
std::string name;
|
|
||||||
if (info.props.count("application.name") &&
|
|
||||||
info.props["application.name"] != "")
|
|
||||||
name = info.props["application.name"];
|
|
||||||
else if (info.props.count("application.process.binary")) {
|
|
||||||
name = info.props["application.process.binary"];
|
|
||||||
} else
|
|
||||||
return;
|
return;
|
||||||
qDebug(virtmicLog) << QString("Added: %1")
|
qDebug(virtmicLog) << QString("Added: %1")
|
||||||
.arg(QString::fromStdString(name))
|
.arg(QString::fromStdString(
|
||||||
|
node.info().props["application.name"]))
|
||||||
.toUtf8()
|
.toUtf8()
|
||||||
.data();
|
.data();
|
||||||
|
|
||||||
@@ -168,14 +152,9 @@ void start(QString _target) {
|
|||||||
[&](const std::uint32_t id) {
|
[&](const std::uint32_t id) {
|
||||||
if (nodes.count(id)) {
|
if (nodes.count(id)) {
|
||||||
auto info = nodes.at(id);
|
auto info = nodes.at(id);
|
||||||
std::string name;
|
|
||||||
if (info.props.count("application.name") &&
|
|
||||||
info.props["application.name"] != "")
|
|
||||||
name = info.props["application.name"];
|
|
||||||
else
|
|
||||||
name = info.props["application.process.binary"];
|
|
||||||
qDebug(virtmicLog) << QString("Removed: %1")
|
qDebug(virtmicLog) << QString("Removed: %1")
|
||||||
.arg(QString::fromStdString(name))
|
.arg(QString::fromStdString(
|
||||||
|
info.props["application.name"].data()))
|
||||||
.toUtf8()
|
.toUtf8()
|
||||||
.data();
|
.data();
|
||||||
nodes.erase(id);
|
nodes.erase(id);
|
||||||
|
|||||||
1
submodules/Vencord
Submodule
1
submodules/Vencord
Submodule
Submodule submodules/Vencord added at 0d996633f2
Reference in New Issue
Block a user