From 45988b3dbbc69566c58454eeb4d240056e681329 Mon Sep 17 00:00:00 2001 From: Felix Weilbach Date: Sun, 17 Apr 2022 22:55:58 +0200 Subject: [PATCH] Sway/window: Only update icon from main thread If Gtk objects get updated from other threads than the main thread GTK can get confused. This is a regression of bcadf64031ee0520212aa8f092f5ac14122cd924. Fixes #1464, #1474 --- include/modules/sway/window.hpp | 3 +++ src/modules/sway/window.cpp | 28 ++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/include/modules/sway/window.hpp b/include/modules/sway/window.hpp index 2b3f95a1..db80afef 100644 --- a/include/modules/sway/window.hpp +++ b/include/modules/sway/window.hpp @@ -25,6 +25,7 @@ class Window : public AIconLabel, public sigc::trackable { std::string& output); void getTree(); std::string rewriteTitle(const std::string& title); + void updateAppIconName(); void updateAppIcon(); const Bar& bar_; @@ -33,6 +34,8 @@ class Window : public AIconLabel, public sigc::trackable { std::string app_id_; std::string old_app_id_; std::size_t app_nb_; + bool update_app_icon_{true}; + std::string app_icon_name_; util::JsonParser parser_; std::mutex mutex_; Ipc ipc_; diff --git a/src/modules/sway/window.cpp b/src/modules/sway/window.cpp index b220de10..f8821067 100644 --- a/src/modules/sway/window.cpp +++ b/src/modules/sway/window.cpp @@ -38,7 +38,7 @@ void Window::onCmd(const struct Ipc::ipc_response& res) { auto payload = parser_.parse(res.payload); auto output = payload["output"].isString() ? payload["output"].asString() : ""; std::tie(app_nb_, windowId_, window_, app_id_) = getFocusedNode(payload["nodes"], output); - updateAppIcon(); + updateAppIconName(); dp.emit(); } catch (const std::exception& e) { spdlog::error("Window: {}", e.what()); @@ -79,17 +79,30 @@ std::optional getIconName(const std::string& app_id) { return {}; } -void Window::updateAppIcon() { +void Window::updateAppIconName() { if (!iconEnabled()) { return; } + const auto icon_name = getIconName(app_id_); if (icon_name.has_value()) { - image_.set_from_icon_name(icon_name.value(), Gtk::ICON_SIZE_LARGE_TOOLBAR); - image_.set_visible(true); - return; + app_icon_name_ = icon_name.value(); + } else { + app_icon_name_ = ""; + } + update_app_icon_ = true; +} + +void Window::updateAppIcon() { + if (update_app_icon_) { + update_app_icon_ = false; + if (app_icon_name_.empty()) { + image_.set_visible(false); + } else { + image_.set_from_icon_name(app_icon_name_, Gtk::ICON_SIZE_LARGE_TOOLBAR); + image_.set_visible(true); + } } - image_.set_visible(false); } auto Window::update() -> void { @@ -119,6 +132,9 @@ auto Window::update() -> void { if (tooltipEnabled()) { label_.set_tooltip_text(window_); } + + updateAppIcon(); + // Call parent update AIconLabel::update(); }