Merge pull request #3826 from DreamMaoMao/fix-hyprland-window-crash
fix: hyprland/window get empty ipc json data
This commit is contained in:
@ -12,10 +12,18 @@
|
|||||||
#include "util/rewrite_string.hpp"
|
#include "util/rewrite_string.hpp"
|
||||||
#include "util/sanitize_str.hpp"
|
#include "util/sanitize_str.hpp"
|
||||||
|
|
||||||
|
#include <shared_mutex>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
namespace waybar::modules::hyprland {
|
namespace waybar::modules::hyprland {
|
||||||
|
|
||||||
|
std::shared_mutex windowIpcSmtx;
|
||||||
|
|
||||||
Window::Window(const std::string& id, const Bar& bar, const Json::Value& config)
|
Window::Window(const std::string& id, const Bar& bar, const Json::Value& config)
|
||||||
: AAppIconLabel(config, "window", id, "{title}", 0, true), bar_(bar) {
|
: AAppIconLabel(config, "window", id, "{title}", 0, true), bar_(bar) {
|
||||||
|
|
||||||
|
std::unique_lock<std::shared_mutex> windowIpcUniqueLock(windowIpcSmtx);
|
||||||
|
|
||||||
modulesReady = true;
|
modulesReady = true;
|
||||||
separateOutputs_ = config["separate-outputs"].asBool();
|
separateOutputs_ = config["separate-outputs"].asBool();
|
||||||
|
|
||||||
@ -23,27 +31,28 @@ Window::Window(const std::string& id, const Bar& bar, const Json::Value& config)
|
|||||||
gIPC = std::make_unique<IPC>();
|
gIPC = std::make_unique<IPC>();
|
||||||
}
|
}
|
||||||
|
|
||||||
queryActiveWorkspace();
|
|
||||||
update();
|
|
||||||
dp.emit();
|
|
||||||
|
|
||||||
// register for hyprland ipc
|
// register for hyprland ipc
|
||||||
gIPC->registerForIPC("activewindow", this);
|
gIPC->registerForIPC("activewindow", this);
|
||||||
gIPC->registerForIPC("closewindow", this);
|
gIPC->registerForIPC("closewindow", this);
|
||||||
gIPC->registerForIPC("movewindow", this);
|
gIPC->registerForIPC("movewindow", this);
|
||||||
gIPC->registerForIPC("changefloatingmode", this);
|
gIPC->registerForIPC("changefloatingmode", this);
|
||||||
gIPC->registerForIPC("fullscreen", this);
|
gIPC->registerForIPC("fullscreen", this);
|
||||||
|
|
||||||
|
windowIpcUniqueLock.unlock();
|
||||||
|
|
||||||
|
queryActiveWorkspace();
|
||||||
|
update();
|
||||||
|
dp.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
Window::~Window() {
|
Window::~Window() {
|
||||||
|
std::unique_lock<std::shared_mutex> windowIpcUniqueLock(windowIpcSmtx);
|
||||||
gIPC->unregisterForIPC(this);
|
gIPC->unregisterForIPC(this);
|
||||||
// wait for possible event handler to finish
|
|
||||||
std::lock_guard<std::mutex> lg(mutex_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Window::update() -> void {
|
auto Window::update() -> void {
|
||||||
// fix ampersands
|
|
||||||
std::lock_guard<std::mutex> lg(mutex_);
|
std::shared_lock<std::shared_mutex> windowIpcShareLock(windowIpcSmtx);
|
||||||
|
|
||||||
std::string windowName = waybar::util::sanitize_string(workspace_.last_window_title);
|
std::string windowName = waybar::util::sanitize_string(workspace_.last_window_title);
|
||||||
std::string windowAddress = workspace_.last_window;
|
std::string windowAddress = workspace_.last_window;
|
||||||
@ -144,7 +153,8 @@ auto Window::WindowData::parse(const Json::Value& value) -> Window::WindowData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Window::queryActiveWorkspace() {
|
void Window::queryActiveWorkspace() {
|
||||||
std::lock_guard<std::mutex> lg(mutex_);
|
|
||||||
|
std::shared_lock<std::shared_mutex> windowIpcShareLock(windowIpcSmtx);
|
||||||
|
|
||||||
if (separateOutputs_) {
|
if (separateOutputs_) {
|
||||||
workspace_ = getActiveWorkspace(this->bar_.output->name);
|
workspace_ = getActiveWorkspace(this->bar_.output->name);
|
||||||
|
Reference in New Issue
Block a user