workspace taskbars: More config options

- orientation
- icon-size
- icon-theme
This commit is contained in:
Pol Rivero
2024-12-31 20:15:21 +01:00
parent 1c07ca0099
commit fdb9004048
5 changed files with 35 additions and 8 deletions

View File

@ -63,7 +63,6 @@ class Workspace {
std::optional<WindowRepr> closeWindow(WindowAddress const& addr); std::optional<WindowRepr> closeWindow(WindowAddress const& addr);
void update(const std::string& workspace_icon); void update(const std::string& workspace_icon);
void updateTaskbar(const std::string& workspace_icon);
private: private:
Workspaces& m_workspaceManager; Workspaces& m_workspaceManager;
@ -85,6 +84,8 @@ class Workspace {
Gtk::Box m_content; Gtk::Box m_content;
Gtk::Label m_labelBefore; Gtk::Label m_labelBefore;
Gtk::Label m_labelAfter; Gtk::Label m_labelAfter;
void updateTaskbar(const std::string& workspace_icon);
}; };
} // namespace waybar::modules::hyprland } // namespace waybar::modules::hyprland

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <gtkmm/button.h> #include <gtkmm/button.h>
#include <gtkmm/enums.h>
#include <gtkmm/label.h> #include <gtkmm/label.h>
#include <json/value.h> #include <json/value.h>
@ -46,6 +47,8 @@ class Workspaces : public AModule, public EventHandler {
auto formatAfter() const -> std::string { return m_formatAfter; } auto formatAfter() const -> std::string { return m_formatAfter; }
auto taskbarFormatBefore() const -> std::string { return m_taskbarFormatBefore; } auto taskbarFormatBefore() const -> std::string { return m_taskbarFormatBefore; }
auto taskbarFormatAfter() const -> std::string { return m_taskbarFormatAfter; } auto taskbarFormatAfter() const -> std::string { return m_taskbarFormatAfter; }
auto taskbarIconSize() const -> int { return m_taskbarIconSize; }
auto taskbarOrientation() const -> Gtk::Orientation { return m_taskbarOrientation; }
std::string getRewrite(std::string window_class, std::string window_title); std::string getRewrite(std::string window_class, std::string window_title);
std::string& getWindowSeparator() { return m_formatWindowSeparator; } std::string& getWindowSeparator() { return m_formatWindowSeparator; }
@ -160,6 +163,8 @@ class Workspaces : public AModule, public EventHandler {
bool m_taskbarWithIcon = false; bool m_taskbarWithIcon = false;
std::string m_taskbarFormatBefore; std::string m_taskbarFormatBefore;
std::string m_taskbarFormatAfter; std::string m_taskbarFormatAfter;
int m_taskbarIconSize = 16;
Gtk::Orientation m_taskbarOrientation = Gtk::ORIENTATION_HORIZONTAL;
std::vector<std::regex> m_ignoreWorkspaces; std::vector<std::regex> m_ignoreWorkspaces;

View File

@ -24,6 +24,13 @@ inline std::string capitalize(const std::string& str) {
return result; return result;
} }
inline std::string toLower(const std::string& str) {
std::string result = str;
std::transform(result.begin(), result.end(), result.begin(),
[](unsigned char c) { return std::tolower(c); });
return result;
}
inline std::vector<std::string> split(std::string_view s, std::string_view delimiter, inline std::vector<std::string> split(std::string_view s, std::string_view delimiter,
int max_splits = -1) { int max_splits = -1) {
std::vector<std::string> result; std::vector<std::string> result;

View File

@ -32,9 +32,8 @@ Workspace::Workspace(const Json::Value &workspace_data, Workspaces &workspace_ma
false); false);
m_button.set_relief(Gtk::RELIEF_NONE); m_button.set_relief(Gtk::RELIEF_NONE);
if (true) { if (m_workspaceManager.enableWorkspaceTaskbar()) {
// TODO-WorkspaceTaskbar: Allow vertical? m_content.set_orientation(m_workspaceManager.taskbarOrientation());
m_content.set_orientation(Gtk::ORIENTATION_HORIZONTAL);
m_content.pack_start(m_labelBefore, false, false); m_content.pack_start(m_labelBefore, false, false);
} else { } else {
m_content.set_center_widget(m_labelBefore); m_content.set_center_widget(m_labelBefore);
@ -251,12 +250,10 @@ void Workspace::updateTaskbar(const std::string &workspace_icon) {
} }
if (m_workspaceManager.taskbarWithIcon()) { if (m_workspaceManager.taskbarWithIcon()) {
// TODO-WorkspaceTaskbar: support themes
auto app_info_ = IconLoader::get_app_info_from_app_id_list(window_repr.window_class); auto app_info_ = IconLoader::get_app_info_from_app_id_list(window_repr.window_class);
int icon_size = m_workspaceManager.taskbarIconSize();
// TODO-WorkspaceTaskbar: icon size
auto window_icon = Gtk::make_managed<Gtk::Image>(); auto window_icon = Gtk::make_managed<Gtk::Image>();
m_workspaceManager.iconLoader().image_load_icon(*window_icon, app_info_, 24); m_workspaceManager.iconLoader().image_load_icon(*window_icon, app_info_, icon_size);
window_box->pack_start(*window_icon, false, false); window_box->pack_start(*window_icon, false, false);
} }

View File

@ -685,6 +685,23 @@ auto Workspaces::populateWorkspaceTaskbarConfig(const Json::Value &config) -> vo
/* The default is to only show the icon */ /* The default is to only show the icon */
m_taskbarWithIcon = true; m_taskbarWithIcon = true;
} }
auto iconTheme = workspaceTaskbar["icon-theme"];
if (iconTheme.isArray()) {
for (auto &c : iconTheme) {
m_iconLoader.add_custom_icon_theme(c.asString());
}
} else if (iconTheme.isString()) {
m_iconLoader.add_custom_icon_theme(iconTheme.asString());
}
if (workspaceTaskbar["icon-size"].isInt()) {
m_taskbarIconSize = workspaceTaskbar["icon-size"].asInt();
}
if (workspaceTaskbar["orientation"].isString() &&
toLower(workspaceTaskbar["orientation"].asString()) == "vertical") {
m_taskbarOrientation = Gtk::ORIENTATION_VERTICAL;
}
} }
void Workspaces::registerOrphanWindow(WindowCreationPayload create_window_payload) { void Workspaces::registerOrphanWindow(WindowCreationPayload create_window_payload) {