Skip to content

Commit e425423

Browse files
authored
Merge pull request #4911 from khaneliman/gtkmenu
fix(menu): keep popup menus alive after builder teardown
2 parents 68d4360 + 790101f commit e425423

7 files changed

Lines changed: 22 additions & 11 deletions

File tree

include/modules/sway/ipc/client.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313

1414
#include "ipc.hpp"
1515
#include "util/SafeSignal.hpp"
16-
#include "util/sleeper_thread.hpp"
1716
#include "util/scoped_fd.hpp"
17+
#include "util/sleeper_thread.hpp"
1818

1919
namespace waybar::modules::sway {
2020

src/ALabel.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ ALabel::ALabel(const Json::Value& config, const std::string& name, const std::st
100100
g_object_unref(builder);
101101
throw std::runtime_error("Failed to get 'menu' object from GtkBuilder");
102102
}
103+
// Keep the menu alive after dropping the transient GtkBuilder.
104+
g_object_ref(menu_);
103105
submenus_ = std::map<std::string, GtkMenuItem*>();
104106
menuActionsMap_ = std::map<std::string, std::string>();
105107

src/AModule.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ AModule::~AModule() {
8888
killpg(pid, SIGTERM);
8989
}
9090
}
91+
if (menu_ != nullptr) {
92+
g_object_unref(menu_);
93+
menu_ = nullptr;
94+
}
9195
}
9296

9397
auto AModule::update() -> void {

src/modules/custom.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "modules/custom.hpp"
22

33
#include <spdlog/spdlog.h>
4+
45
#include <utility>
56

67
#include "util/scope_guard.hpp"

src/modules/hyprland/window.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,9 @@ void Window::queryActiveWorkspace() {
189189
if (workspace_.windows > 0) {
190190
const auto clients = m_ipc.getSocket1JsonReply("clients");
191191
if (clients.isArray()) {
192-
auto activeWindow = std::ranges::find_if(
193-
clients, [&](const Json::Value& window) { return window["address"] == workspace_.last_window; });
192+
auto activeWindow = std::ranges::find_if(clients, [&](const Json::Value& window) {
193+
return window["address"] == workspace_.last_window;
194+
});
194195

195196
if (activeWindow == std::end(clients)) {
196197
focused_ = false;
@@ -200,17 +201,19 @@ void Window::queryActiveWorkspace() {
200201
windowData_ = WindowData::parse(*activeWindow);
201202
updateAppIconName(windowData_.class_name, windowData_.initial_class_name);
202203
std::vector<Json::Value> workspaceWindows;
203-
std::ranges::copy_if(clients, std::back_inserter(workspaceWindows), [&](const Json::Value& window) {
204-
return window["workspace"]["id"] == workspace_.id && window["mapped"].asBool();
205-
});
204+
std::ranges::copy_if(
205+
clients, std::back_inserter(workspaceWindows), [&](const Json::Value& window) {
206+
return window["workspace"]["id"] == workspace_.id && window["mapped"].asBool();
207+
});
206208
swallowing_ = std::ranges::any_of(workspaceWindows, [&](const Json::Value& window) {
207209
return !window["swallowing"].isNull() && window["swallowing"].asString() != "0x0";
208210
});
209211
std::vector<Json::Value> visibleWindows;
210212
std::ranges::copy_if(workspaceWindows, std::back_inserter(visibleWindows),
211213
[&](const Json::Value& window) { return !window["hidden"].asBool(); });
212-
solo_ = 1 == std::count_if(visibleWindows.begin(), visibleWindows.end(),
213-
[&](const Json::Value& window) { return !window["floating"].asBool(); });
214+
solo_ = 1 == std::count_if(
215+
visibleWindows.begin(), visibleWindows.end(),
216+
[&](const Json::Value& window) { return !window["floating"].asBool(); });
214217
allFloating_ = std::ranges::all_of(
215218
visibleWindows, [&](const Json::Value& window) { return window["floating"].asBool(); });
216219
fullscreen_ = windowData_.fullscreen;

src/modules/niri/backend.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
#include <string>
1414
#include <thread>
1515

16-
#include "util/scoped_fd.hpp"
1716
#include "giomm/datainputstream.h"
1817
#include "giomm/dataoutputstream.h"
1918
#include "giomm/unixinputstream.h"
2019
#include "giomm/unixoutputstream.h"
20+
#include "util/scoped_fd.hpp"
2121

2222
namespace waybar::modules::niri {
2323

test/utils/command.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
#include <catch2/catch.hpp>
55
#endif
66

7+
#include <sys/wait.h>
8+
#include <unistd.h>
9+
710
#include <cerrno>
811
#include <list>
912
#include <mutex>
10-
#include <sys/wait.h>
11-
#include <unistd.h>
1213

1314
std::mutex reap_mtx;
1415
std::list<pid_t> reap;

0 commit comments

Comments
 (0)