code review
parent
7576611782
commit
2d614c68f5
|
@ -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_;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue