Merge pull request #1027 from alebastr/output-fixes

Fix more issues with duplicated bars
pull/1026/head
Alex 2021-02-09 11:17:16 +01:00 committed by GitHub
commit c5f875dc5f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 8 deletions

View File

@ -120,17 +120,26 @@ void waybar::Client::handleOutputDone(void *data, struct zxdg_output_v1 * /*xdg_
auto client = waybar::Client::inst(); auto client = waybar::Client::inst();
try { try {
auto &output = client->getOutput(data); auto &output = client->getOutput(data);
spdlog::debug("Output detection done: {} ({})", output.name, output.identifier); /**
* Multiple .done events may arrive in batch. In this case libwayland would queue
* xdg_output.destroy and dispatch all pending events, triggering this callback several times
* for the same output. .done events can also arrive after that for a scale or position changes.
* We wouldn't want to draw a duplicate bar for each such event either.
*
* All the properties we care about are immutable so it's safe to delete the xdg_output object
* on the first event and use the ptr value to check that the callback was already invoked.
*/
if (output.xdg_output) {
output.xdg_output.reset();
spdlog::debug("Output detection done: {} ({})", output.name, output.identifier);
auto configs = client->getOutputConfigs(output); auto configs = client->getOutputConfigs(output);
if (!configs.empty()) { if (!configs.empty()) {
wl_display_roundtrip(client->wl_display); for (const auto &config : configs) {
for (const auto &config : configs) { client->bars.emplace_back(std::make_unique<Bar>(&output, config));
client->bars.emplace_back(std::make_unique<Bar>(&output, config)); }
} }
} }
// unsubscribe
output.xdg_output.reset();
} catch (const std::exception &e) { } catch (const std::exception &e) {
std::cerr << e.what() << std::endl; std::cerr << e.what() << std::endl;
} }