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 bcadf64031.

Fixes #1464, #1474
This commit is contained in:
Felix Weilbach 2022-04-17 22:55:58 +02:00
parent 54b1df69a9
commit 45988b3dbb
2 changed files with 25 additions and 6 deletions

View File

@ -25,6 +25,7 @@ class Window : public AIconLabel, public sigc::trackable {
std::string& output); std::string& output);
void getTree(); void getTree();
std::string rewriteTitle(const std::string& title); std::string rewriteTitle(const std::string& title);
void updateAppIconName();
void updateAppIcon(); void updateAppIcon();
const Bar& bar_; const Bar& bar_;
@ -33,6 +34,8 @@ class Window : public AIconLabel, public sigc::trackable {
std::string app_id_; std::string app_id_;
std::string old_app_id_; std::string old_app_id_;
std::size_t app_nb_; std::size_t app_nb_;
bool update_app_icon_{true};
std::string app_icon_name_;
util::JsonParser parser_; util::JsonParser parser_;
std::mutex mutex_; std::mutex mutex_;
Ipc ipc_; Ipc ipc_;

View File

@ -38,7 +38,7 @@ void Window::onCmd(const struct Ipc::ipc_response& res) {
auto payload = parser_.parse(res.payload); auto payload = parser_.parse(res.payload);
auto output = payload["output"].isString() ? payload["output"].asString() : ""; auto output = payload["output"].isString() ? payload["output"].asString() : "";
std::tie(app_nb_, windowId_, window_, app_id_) = getFocusedNode(payload["nodes"], output); std::tie(app_nb_, windowId_, window_, app_id_) = getFocusedNode(payload["nodes"], output);
updateAppIcon(); updateAppIconName();
dp.emit(); dp.emit();
} catch (const std::exception& e) { } catch (const std::exception& e) {
spdlog::error("Window: {}", e.what()); spdlog::error("Window: {}", e.what());
@ -79,17 +79,30 @@ std::optional<Glib::ustring> getIconName(const std::string& app_id) {
return {}; return {};
} }
void Window::updateAppIcon() { void Window::updateAppIconName() {
if (!iconEnabled()) { if (!iconEnabled()) {
return; return;
} }
const auto icon_name = getIconName(app_id_); const auto icon_name = getIconName(app_id_);
if (icon_name.has_value()) { if (icon_name.has_value()) {
image_.set_from_icon_name(icon_name.value(), Gtk::ICON_SIZE_LARGE_TOOLBAR); app_icon_name_ = icon_name.value();
image_.set_visible(true); } else {
return; 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); image_.set_visible(false);
} else {
image_.set_from_icon_name(app_icon_name_, Gtk::ICON_SIZE_LARGE_TOOLBAR);
image_.set_visible(true);
}
}
} }
auto Window::update() -> void { auto Window::update() -> void {
@ -119,6 +132,9 @@ auto Window::update() -> void {
if (tooltipEnabled()) { if (tooltipEnabled()) {
label_.set_tooltip_text(window_); label_.set_tooltip_text(window_);
} }
updateAppIcon();
// Call parent update // Call parent update
AIconLabel::update(); AIconLabel::update();
} }