waybar/include/modules/wlr/workspace_manager.hpp

173 lines
5.3 KiB
C++
Raw Permalink Normal View History

2020-08-05 22:10:08 +02:00
#pragma once
#include <fmt/format.h>
2020-08-06 00:42:57 +02:00
#include <gtkmm/button.h>
2020-08-05 22:10:08 +02:00
#include <gtkmm/image.h>
2020-08-06 00:42:57 +02:00
#include <gtkmm/label.h>
2020-08-05 22:10:08 +02:00
2021-11-23 01:10:44 +01:00
#include <functional>
2020-08-07 01:45:08 +02:00
#include <map>
2020-08-05 22:10:08 +02:00
#include <memory>
#include <vector>
#include "AModule.hpp"
#include "bar.hpp"
2021-11-21 13:01:25 +01:00
#include "ext-workspace-unstable-v1-client-protocol.h"
2020-08-05 22:10:08 +02:00
namespace waybar::modules::wlr {
class WorkspaceManager;
class WorkspaceGroup;
class Workspace {
public:
Workspace(const waybar::Bar &bar, const Json::Value &config, WorkspaceGroup &workspace_group,
2023-03-24 18:41:47 +01:00
zext_workspace_handle_v1 *workspace, uint32_t id, std::string name);
2020-08-05 22:10:08 +02:00
~Workspace();
auto update() -> void;
auto id() const -> uint32_t { return id_; }
2020-08-07 01:45:08 +02:00
auto is_active() const -> bool { return state_ & static_cast<uint32_t>(State::ACTIVE); }
auto is_urgent() const -> bool { return state_ & static_cast<uint32_t>(State::URGENT); }
auto is_hidden() const -> bool { return state_ & static_cast<uint32_t>(State::HIDDEN); }
auto is_empty() const -> bool { return state_ & static_cast<uint32_t>(State::EMPTY); }
2023-03-24 18:41:47 +01:00
auto is_persistent() const -> bool { return persistent_; }
2020-08-06 00:42:57 +02:00
// wlr stuff
2020-08-07 22:46:47 +02:00
auto handle_name(const std::string &name) -> void;
auto handle_coordinates(const std::vector<uint32_t> &coordinates) -> void;
2020-08-05 22:10:08 +02:00
auto handle_state(const std::vector<uint32_t> &state) -> void;
auto handle_remove() -> void;
2023-03-24 18:41:47 +01:00
auto make_persistent() -> void;
auto handle_duplicate() -> void;
2020-08-05 22:10:08 +02:00
2020-08-07 01:45:08 +02:00
auto handle_done() -> void;
auto handle_clicked(GdkEventButton *bt) -> bool;
2021-11-23 01:10:44 +01:00
auto show() -> void;
auto hide() -> void;
2020-08-07 22:46:47 +02:00
auto get_button_ref() -> Gtk::Button & { return button_; }
auto get_name() -> std::string & { return name_; }
auto get_coords() -> std::vector<uint32_t> & { return coordinates_; }
2020-08-07 01:45:08 +02:00
2021-11-23 01:10:44 +01:00
enum class State {
ACTIVE = (1 << 0),
URGENT = (1 << 1),
HIDDEN = (1 << 2),
EMPTY = (1 << 3),
};
2020-08-05 22:10:08 +02:00
private:
2020-08-07 01:45:08 +02:00
auto get_icon() -> std::string;
2022-04-06 08:37:19 +02:00
const Bar &bar_;
2020-08-05 22:10:08 +02:00
const Json::Value &config_;
2022-04-06 08:37:19 +02:00
WorkspaceGroup &workspace_group_;
2020-08-05 22:10:08 +02:00
// wlr stuff
2021-11-21 13:01:25 +01:00
zext_workspace_handle_v1 *workspace_handle_;
2022-04-06 08:37:19 +02:00
uint32_t state_ = 0;
2020-08-05 22:10:08 +02:00
2022-04-06 08:37:19 +02:00
uint32_t id_;
std::string name_;
std::vector<uint32_t> coordinates_;
2020-08-07 01:45:08 +02:00
static std::map<std::string, std::string> icons_map_;
2022-04-06 08:37:19 +02:00
std::string format_;
bool with_icon_ = false;
2023-03-24 18:41:47 +01:00
bool persistent_ = false;
2020-08-05 22:10:08 +02:00
2020-08-06 00:42:57 +02:00
Gtk::Button button_;
2022-04-06 08:37:19 +02:00
Gtk::Box content_;
Gtk::Label label_;
2020-08-05 22:10:08 +02:00
};
class WorkspaceGroup {
public:
2020-08-07 22:46:47 +02:00
WorkspaceGroup(const waybar::Bar &bar, Gtk::Box &box, const Json::Value &config,
2021-11-21 13:01:25 +01:00
WorkspaceManager &manager, zext_workspace_group_handle_v1 *workspace_group_handle,
2020-08-07 22:46:47 +02:00
uint32_t id);
2020-08-05 22:10:08 +02:00
~WorkspaceGroup();
auto update() -> void;
auto id() const -> uint32_t { return id_; }
auto is_visible() const -> bool;
2020-08-05 22:10:08 +02:00
auto remove_workspace(uint32_t id_) -> void;
2021-11-23 01:10:44 +01:00
auto active_only() const -> bool;
auto creation_delayed() const -> bool;
auto workspaces() -> std::vector<std::unique_ptr<Workspace>> & { return workspaces_; }
2023-03-24 18:41:47 +01:00
auto persistent_workspaces() -> std::vector<std::string> & { return persistent_workspaces_; }
2021-11-23 01:10:44 +01:00
auto sort_workspaces() -> void;
auto set_need_to_sort() -> void { need_to_sort = true; }
auto add_button(Gtk::Button &button) -> void;
auto remove_button(Gtk::Button &button) -> void;
2023-03-24 18:41:47 +01:00
auto fill_persistent_workspaces() -> void;
auto create_persistent_workspaces() -> void;
2020-08-05 22:10:08 +02:00
// wlr stuff
2021-11-21 13:01:25 +01:00
auto handle_workspace_create(zext_workspace_handle_v1 *workspace_handle) -> void;
2020-08-05 22:10:08 +02:00
auto handle_remove() -> void;
auto handle_output_enter(wl_output *output) -> void;
auto handle_output_leave() -> void;
2020-08-07 01:45:08 +02:00
auto handle_done() -> void;
auto commit() -> void;
2020-08-06 00:42:57 +02:00
2020-08-05 22:10:08 +02:00
private:
2022-04-06 08:37:19 +02:00
static uint32_t workspace_global_id;
2020-08-05 22:10:08 +02:00
const waybar::Bar &bar_;
2022-04-06 08:37:19 +02:00
Gtk::Box &box_;
2020-08-05 22:10:08 +02:00
const Json::Value &config_;
2022-04-06 08:37:19 +02:00
WorkspaceManager &workspace_manager_;
2020-08-05 22:10:08 +02:00
// wlr stuff
2021-11-21 13:01:25 +01:00
zext_workspace_group_handle_v1 *workspace_group_handle_;
2022-04-06 08:37:19 +02:00
wl_output *output_ = nullptr;
2020-08-05 22:10:08 +02:00
2022-04-06 08:37:19 +02:00
uint32_t id_;
2020-08-05 22:10:08 +02:00
std::vector<std::unique_ptr<Workspace>> workspaces_;
2022-04-06 08:37:19 +02:00
bool need_to_sort = false;
2023-03-24 18:41:47 +01:00
std::vector<std::string> persistent_workspaces_;
bool persistent_created_ = false;
2020-08-05 22:10:08 +02:00
};
class WorkspaceManager : public AModule {
public:
WorkspaceManager(const std::string &id, const waybar::Bar &bar, const Json::Value &config);
~WorkspaceManager() override;
auto update() -> void override;
2021-11-23 01:10:44 +01:00
auto all_outputs() const -> bool { return all_outputs_; }
auto active_only() const -> bool { return active_only_; }
auto workspace_comparator() const
-> std::function<bool(std::unique_ptr<Workspace> &, std::unique_ptr<Workspace> &)>;
auto creation_delayed() const -> bool { return creation_delayed_; }
auto sort_workspaces() -> void;
2020-08-05 22:10:08 +02:00
auto remove_workspace_group(uint32_t id_) -> void;
// wlr stuff
auto register_manager(wl_registry *registry, uint32_t name, uint32_t version) -> void;
2021-11-21 13:01:25 +01:00
auto handle_workspace_group_create(zext_workspace_group_handle_v1 *workspace_group_handle)
2020-08-05 22:10:08 +02:00
-> void;
auto handle_done() -> void;
auto handle_finished() -> void;
2020-08-07 01:45:08 +02:00
auto commit() -> void;
2020-08-06 00:42:57 +02:00
2020-08-05 22:10:08 +02:00
private:
2022-04-06 08:37:19 +02:00
const waybar::Bar &bar_;
Gtk::Box box_;
2020-08-05 22:10:08 +02:00
std::vector<std::unique_ptr<WorkspaceGroup>> groups_;
// wlr stuff
2021-11-21 13:01:25 +01:00
zext_workspace_manager_v1 *workspace_manager_ = nullptr;
2020-08-07 22:46:47 +02:00
static uint32_t group_global_id;
2021-11-23 01:10:44 +01:00
bool sort_by_name_ = true;
bool sort_by_coordinates_ = true;
bool sort_by_number_ = false;
2021-11-23 01:10:44 +01:00
bool all_outputs_ = false;
bool active_only_ = false;
bool creation_delayed_ = false;
2020-08-05 22:10:08 +02:00
};
} // namespace waybar::modules::wlr