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:
parent
54b1df69a9
commit
45988b3dbb
|
@ -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_;
|
||||||
|
|
|
@ -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);
|
||||||
|
} 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 {
|
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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue