Merge pull request #4705 from rwwiv/fix/duplicate-layers-on-monitor-hotplug
fix: prevent duplicate layer surfaces on monitor hotplug
This commit is contained in:
commit
374ccbb878
|
|
@ -56,6 +56,8 @@ class Client {
|
||||||
std::list<struct waybar_output> outputs_;
|
std::list<struct waybar_output> outputs_;
|
||||||
std::unique_ptr<CssReloadHelper> m_cssReloadHelper;
|
std::unique_ptr<CssReloadHelper> m_cssReloadHelper;
|
||||||
std::string m_cssFile;
|
std::string m_cssFile;
|
||||||
|
sigc::connection monitor_added_connection_;
|
||||||
|
sigc::connection monitor_removed_connection_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar
|
} // namespace waybar
|
||||||
|
|
|
||||||
|
|
@ -219,13 +219,22 @@ void waybar::Client::bindInterfaces() {
|
||||||
if (xdg_output_manager == nullptr) {
|
if (xdg_output_manager == nullptr) {
|
||||||
throw std::runtime_error("Failed to acquire required resources.");
|
throw std::runtime_error("Failed to acquire required resources.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Disconnect previous signal handlers to prevent duplicate handlers on reload
|
||||||
|
monitor_added_connection_.disconnect();
|
||||||
|
monitor_removed_connection_.disconnect();
|
||||||
|
|
||||||
|
// Clear stale outputs from previous run
|
||||||
|
outputs_.clear();
|
||||||
|
|
||||||
// add existing outputs and subscribe to updates
|
// add existing outputs and subscribe to updates
|
||||||
for (auto i = 0; i < gdk_display->get_n_monitors(); ++i) {
|
for (auto i = 0; i < gdk_display->get_n_monitors(); ++i) {
|
||||||
auto monitor = gdk_display->get_monitor(i);
|
auto monitor = gdk_display->get_monitor(i);
|
||||||
handleMonitorAdded(monitor);
|
handleMonitorAdded(monitor);
|
||||||
}
|
}
|
||||||
gdk_display->signal_monitor_added().connect(sigc::mem_fun(*this, &Client::handleMonitorAdded));
|
monitor_added_connection_ = gdk_display->signal_monitor_added().connect(
|
||||||
gdk_display->signal_monitor_removed().connect(
|
sigc::mem_fun(*this, &Client::handleMonitorAdded));
|
||||||
|
monitor_removed_connection_ = gdk_display->signal_monitor_removed().connect(
|
||||||
sigc::mem_fun(*this, &Client::handleMonitorRemoved));
|
sigc::mem_fun(*this, &Client::handleMonitorRemoved));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue