Skip to content

Commit 68d4360

Browse files
authored
Merge pull request #4905 from sw1nn/master
fix(mpris): disconnect GLib signals before destroying objects
2 parents 22b2aff + a816218 commit 68d4360

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/modules/mpris/mpris.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ Mpris::Mpris(const std::string& id, const Json::Value& config)
162162
if (player) {
163163
g_object_connect(player, "signal::play", G_CALLBACK(onPlayerPlay), this, "signal::pause",
164164
G_CALLBACK(onPlayerPause), this, "signal::stop", G_CALLBACK(onPlayerStop),
165-
this, "signal::stop", G_CALLBACK(onPlayerStop), this, "signal::metadata",
166-
G_CALLBACK(onPlayerMetadata), this, NULL);
165+
this, "signal::metadata", G_CALLBACK(onPlayerMetadata), this, NULL);
167166
}
168167

169168
// allow setting an interval count that triggers periodic refreshes
@@ -179,9 +178,17 @@ Mpris::Mpris(const std::string& id, const Json::Value& config)
179178
}
180179

181180
Mpris::~Mpris() {
182-
if (last_active_player_ && last_active_player_ != player) g_object_unref(last_active_player_);
183-
if (manager != nullptr) g_object_unref(manager);
184-
if (player != nullptr) g_object_unref(player);
181+
if (manager != nullptr) {
182+
g_signal_handlers_disconnect_by_data(manager, this);
183+
}
184+
if (player != nullptr) {
185+
g_signal_handlers_disconnect_by_data(player, this);
186+
}
187+
if (last_active_player_ != nullptr && last_active_player_ != player) {
188+
g_object_unref(last_active_player_);
189+
}
190+
g_clear_object(&manager);
191+
g_clear_object(&player);
185192
}
186193

187194
auto Mpris::getIconFromJson(const Json::Value& icons, const std::string& key) -> std::string {
@@ -412,11 +419,14 @@ auto Mpris::onPlayerNameAppeared(PlayerctlPlayerManager* manager, PlayerctlPlaye
412419
return;
413420
}
414421

422+
if (mpris->player != nullptr) {
423+
g_signal_handlers_disconnect_by_data(mpris->player, mpris);
424+
g_clear_object(&mpris->player);
425+
}
415426
mpris->player = playerctl_player_new_from_name(player_name, nullptr);
416427
g_object_connect(mpris->player, "signal::play", G_CALLBACK(onPlayerPlay), mpris, "signal::pause",
417428
G_CALLBACK(onPlayerPause), mpris, "signal::stop", G_CALLBACK(onPlayerStop),
418-
mpris, "signal::stop", G_CALLBACK(onPlayerStop), mpris, "signal::metadata",
419-
G_CALLBACK(onPlayerMetadata), mpris, NULL);
429+
mpris, "signal::metadata", G_CALLBACK(onPlayerMetadata), mpris, NULL);
420430

421431
mpris->dp.emit();
422432
}

0 commit comments

Comments
 (0)