fix bar crashing on monitor add/remove

This commit is contained in:
2026-02-09 13:49:52 +01:00
parent a90d1c2f6c
commit e1217305a5
30 changed files with 1186 additions and 247 deletions

View File

@@ -10,7 +10,10 @@
#include "giomm/dbusproxy.h"
std::shared_ptr<MprisController> MprisController::getInstance() {
static std::shared_ptr<MprisController> instance = std::shared_ptr<MprisController>(new MprisController());
static std::shared_ptr<MprisController> instance;
if (!instance) {
instance = std::shared_ptr<MprisController>(new MprisController());
}
return instance;
}
@@ -18,7 +21,7 @@ std::shared_ptr<MprisController> MprisController::createForPlayer(const std::str
return std::shared_ptr<MprisController>(new MprisController(bus_name));
}
MprisController::MprisController() {
MprisController::MprisController() : m_player_bus_name() {
connect_session_async(sigc::mem_fun(*this, &MprisController::on_bus_connected));
}
@@ -63,6 +66,33 @@ void MprisController::on_bus_connected(const Glib::RefPtr<Gio::AsyncResult> &res
try {
connection = Gio::DBus::Connection::get_finish(result);
// Per-player instances only need to create their own player proxy,
// not monitor all players on the bus.
if (!m_player_bus_name.empty()) {
if (!m_proxy) {
try {
m_proxy = Gio::DBus::Proxy::create_sync(
connection,
m_player_bus_name,
"/org/mpris/MediaPlayer2",
"org.mpris.MediaPlayer2.Player");
if (m_proxy) {
m_proxy->signal_properties_changed().connect(
sigc::mem_fun(*this, &MprisController::on_properties_changed));
signalNotification();
emit_cached_playback_status();
emit_cached_position();
emit_cached_can_seek();
}
} catch (const Glib::Error &ex) {
spdlog::error("DBus Connection Error for player {}: {}", m_player_bus_name, ex.what());
}
}
return;
}
// Singleton instance: monitor all MPRIS players on the bus.
if (!m_dbus_proxy) {
m_dbus_proxy = Gio::DBus::Proxy::create_sync(
connection,