code review

pull/2592/head
zjeffer 2023-10-21 18:15:22 +02:00
parent 7576611782
commit 2d614c68f5
2 changed files with 25 additions and 27 deletions

View File

@ -26,13 +26,13 @@ namespace waybar::modules::hyprland {
class Workspaces; class Workspaces;
class WorkspaceWindow { class WindowCreationPayload {
public: public:
WorkspaceWindow(std::string workspace_name, WindowAddress window_address, WindowCreationPayload(std::string workspace_name, WindowAddress window_address,
std::string window_repr); std::string window_repr);
WorkspaceWindow(std::string workspace_name, WindowAddress window_address, WindowCreationPayload(std::string workspace_name, WindowAddress window_address,
std::string window_class, std::string window_title); std::string window_class, std::string window_title);
WorkspaceWindow(Json::Value const& client_data); WindowCreationPayload(Json::Value const& client_data);
int increment_time_spent_uncreated(); int increment_time_spent_uncreated();
bool is_empty(Workspaces& workspace_manager); bool is_empty(Workspaces& workspace_manager);
@ -83,11 +83,11 @@ class Workspace {
void set_windows(uint value) { windows_ = value; }; void set_windows(uint value) { windows_ = value; };
void set_name(std::string const& value) { name_ = value; }; void set_name(std::string const& value) { name_ = value; };
bool contains_window(WindowAddress const& addr) const { return window_map_.contains(addr); } bool contains_window(WindowAddress const& addr) const { return window_map_.contains(addr); }
void insert_window(WorkspaceWindow create_window_paylod); void insert_window(WindowCreationPayload create_window_paylod);
std::string remove_window(WindowAddress const& addr); std::string remove_window(WindowAddress const& addr);
void initialize_window_map(const Json::Value& clients_data); void initialize_window_map(const Json::Value& clients_data);
bool on_window_opened(WorkspaceWindow const& create_window_paylod); bool on_window_opened(WindowCreationPayload const& create_window_paylod);
std::optional<std::string> on_window_closed(WindowAddress const& addr); std::optional<std::string> on_window_closed(WindowAddress const& addr);
void update(const std::string& format, const std::string& icon); void update(const std::string& format, const std::string& icon);
@ -178,7 +178,7 @@ class Workspaces : public AModule, public EventHandler {
std::vector<std::unique_ptr<Workspace>> workspaces_; std::vector<std::unique_ptr<Workspace>> workspaces_;
std::vector<Json::Value> workspaces_to_create_; std::vector<Json::Value> workspaces_to_create_;
std::vector<std::string> workspaces_to_remove_; std::vector<std::string> workspaces_to_remove_;
std::vector<WorkspaceWindow> windows_to_create_; std::vector<WindowCreationPayload> windows_to_create_;
std::vector<std::regex> ignore_workspaces_; std::vector<std::regex> ignore_workspaces_;

View File

@ -14,10 +14,6 @@
namespace waybar::modules::hyprland { namespace waybar::modules::hyprland {
namespace {
auto constexpr WINDOW_CREATION_TIMEOUT = 2;
}
int Workspaces::window_rewrite_priority_function(std::string const &window_rule) { int Workspaces::window_rewrite_priority_function(std::string const &window_rule) {
// Rules that match against title are prioritized // Rules that match against title are prioritized
// Rules that don't specify if they're matching against either title or class are deprioritized // Rules that don't specify if they're matching against either title or class are deprioritized
@ -200,7 +196,7 @@ auto Workspaces::update() -> void {
} }
bool any_window_created = false; bool any_window_created = false;
std::vector<WorkspaceWindow> not_created; std::vector<WindowCreationPayload> not_created;
for (auto &window_payload : windows_to_create_) { for (auto &window_payload : windows_to_create_) {
bool created = false; bool created = false;
@ -212,6 +208,7 @@ auto Workspaces::update() -> void {
} }
} }
if (!created) { if (!created) {
static auto const WINDOW_CREATION_TIMEOUT = 2;
if (window_payload.increment_time_spent_uncreated() < WINDOW_CREATION_TIMEOUT) { if (window_payload.increment_time_spent_uncreated() < WINDOW_CREATION_TIMEOUT) {
not_created.push_back(window_payload); not_created.push_back(window_payload);
} }
@ -429,7 +426,7 @@ void Workspace::initialize_window_map(const Json::Value &clients_data) {
} }
} }
void Workspace::insert_window(WorkspaceWindow create_window_paylod) { void Workspace::insert_window(WindowCreationPayload create_window_paylod) {
if (!create_window_paylod.is_empty(workspace_manager_)) { if (!create_window_paylod.is_empty(workspace_manager_)) {
window_map_[create_window_paylod.addr()] = create_window_paylod.repr(workspace_manager_); window_map_[create_window_paylod.addr()] = create_window_paylod.repr(workspace_manager_);
} }
@ -441,7 +438,7 @@ std::string Workspace::remove_window(WindowAddress const &addr) {
return window_repr; return window_repr;
} }
bool Workspace::on_window_opened(WorkspaceWindow const &create_window_paylod) { bool Workspace::on_window_opened(WindowCreationPayload const &create_window_paylod) {
if (create_window_paylod.workspace_name() == name()) { if (create_window_paylod.workspace_name() == name()) {
insert_window(create_window_paylod); insert_window(create_window_paylod);
return true; return true;
@ -864,8 +861,8 @@ std::string Workspaces::get_rewrite(std::string window_class, std::string window
return window_rewrite_rules_.get(window_repr_key); return window_rewrite_rules_.get(window_repr_key);
} }
WorkspaceWindow::WorkspaceWindow(std::string workspace_name, WindowAddress window_address, WindowCreationPayload::WindowCreationPayload(std::string workspace_name,
std::string window_repr) WindowAddress window_address, std::string window_repr)
: window_(std::move(window_repr)), : window_(std::move(window_repr)),
window_address_(std::move(window_address)), window_address_(std::move(window_address)),
workspace_name_(std::move(workspace_name)) { workspace_name_(std::move(workspace_name)) {
@ -873,8 +870,9 @@ WorkspaceWindow::WorkspaceWindow(std::string workspace_name, WindowAddress windo
clear_workspace_name(); clear_workspace_name();
} }
WorkspaceWindow::WorkspaceWindow(std::string workspace_name, WindowAddress window_address, WindowCreationPayload::WindowCreationPayload(std::string workspace_name,
std::string window_class, std::string window_title) WindowAddress window_address, std::string window_class,
std::string window_title)
: window_(std::make_pair(std::move(window_class), std::move(window_title))), : window_(std::make_pair(std::move(window_class), std::move(window_title))),
window_address_(std::move(window_address)), window_address_(std::move(window_address)),
workspace_name_(std::move(workspace_name)) { workspace_name_(std::move(workspace_name)) {
@ -882,7 +880,7 @@ WorkspaceWindow::WorkspaceWindow(std::string workspace_name, WindowAddress windo
clear_workspace_name(); clear_workspace_name();
} }
WorkspaceWindow::WorkspaceWindow(Json::Value const &client_data) WindowCreationPayload::WindowCreationPayload(Json::Value const &client_data)
: window_(std::make_pair(client_data["class"].asString(), client_data["title"].asString())), : window_(std::make_pair(client_data["class"].asString(), client_data["title"].asString())),
window_address_(client_data["address"].asString()), window_address_(client_data["address"].asString()),
workspace_name_(client_data["workspace"]["name"].asString()) { workspace_name_(client_data["workspace"]["name"].asString()) {
@ -890,7 +888,7 @@ WorkspaceWindow::WorkspaceWindow(Json::Value const &client_data)
clear_workspace_name(); clear_workspace_name();
} }
std::string WorkspaceWindow::repr(Workspaces &workspace_manager) { std::string WindowCreationPayload::repr(Workspaces &workspace_manager) {
if (std::holds_alternative<Repr>(window_)) { if (std::holds_alternative<Repr>(window_)) {
return std::get<Repr>(window_); return std::get<Repr>(window_);
} }
@ -903,7 +901,7 @@ std::string WorkspaceWindow::repr(Workspaces &workspace_manager) {
throw std::runtime_error("WorkspaceWindow::repr: Unreachable"); throw std::runtime_error("WorkspaceWindow::repr: Unreachable");
} }
bool WorkspaceWindow::is_empty(Workspaces &workspace_manager) { bool WindowCreationPayload::is_empty(Workspaces &workspace_manager) {
if (std::holds_alternative<Repr>(window_)) { if (std::holds_alternative<Repr>(window_)) {
return std::get<Repr>(window_).empty(); return std::get<Repr>(window_).empty();
} }
@ -917,9 +915,9 @@ bool WorkspaceWindow::is_empty(Workspaces &workspace_manager) {
throw std::runtime_error("WorkspaceWindow::is_empty: Unreachable"); throw std::runtime_error("WorkspaceWindow::is_empty: Unreachable");
} }
int WorkspaceWindow::increment_time_spent_uncreated() { return time_spent_uncreated_++; } int WindowCreationPayload::increment_time_spent_uncreated() { return time_spent_uncreated_++; }
void WorkspaceWindow::clear_addr() { void WindowCreationPayload::clear_addr() {
// substr(2, ...) is necessary because Hyprland's JSON follows this format: // substr(2, ...) is necessary because Hyprland's JSON follows this format:
// 0x{ADDR} // 0x{ADDR}
// While Hyprland's IPC follows this format: // While Hyprland's IPC follows this format:
@ -933,7 +931,7 @@ void WorkspaceWindow::clear_addr() {
} }
} }
void WorkspaceWindow::clear_workspace_name() { void WindowCreationPayload::clear_workspace_name() {
// The workspace name may optionally feature "special:" at the beginning. // The workspace name may optionally feature "special:" at the beginning.
// If so, we need to remove it because the workspace is saved WITHOUT the // If so, we need to remove it because the workspace is saved WITHOUT the
// special qualifier. The reasoning is that not all of Hyprland's IPC events // special qualifier. The reasoning is that not all of Hyprland's IPC events
@ -948,7 +946,7 @@ void WorkspaceWindow::clear_workspace_name() {
} }
} }
void WorkspaceWindow::move_to_worksace(std::string &new_workspace_name) { void WindowCreationPayload::move_to_worksace(std::string &new_workspace_name) {
workspace_name_ = new_workspace_name; workspace_name_ = new_workspace_name;
} }