mirror of
https://github.com/scorpion-26/gBar.git
synced 2024-11-25 04:32:10 +00:00
SNI: Add Icon positioning config options
This commit is contained in:
parent
79e78826e0
commit
e9c9d3abb1
5 changed files with 91 additions and 5 deletions
|
@ -27,6 +27,14 @@ void ApplyProperty<uint32_t>(uint32_t& propertyToSet, const std::string_view& va
|
||||||
propertyToSet = atoi(valStr.c_str());
|
propertyToSet = atoi(valStr.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void ApplyProperty<int32_t>(int32_t& propertyToSet, const std::string_view& value)
|
||||||
|
{
|
||||||
|
// Why, C++?
|
||||||
|
std::string valStr = std::string(value);
|
||||||
|
propertyToSet = atoi(valStr.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
void ApplyProperty<double>(double& propertyToSet, const std::string_view& value)
|
void ApplyProperty<double>(double& propertyToSet, const std::string_view& value)
|
||||||
{
|
{
|
||||||
|
@ -53,6 +61,30 @@ void ApplyProperty<bool>(bool& propertyToSet, const std::string_view& value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void ApplyProperty<std::pair<std::string, uint32_t>>(std::pair<std::string, uint32_t>& propertyToSet, const std::string_view& value)
|
||||||
|
{
|
||||||
|
// TODO: Ignore escaped delimiter (e.g. \, is the same as ,)
|
||||||
|
const char delim = ',';
|
||||||
|
const char* whitespace = " \t";
|
||||||
|
size_t delimPos = value.find(delim);
|
||||||
|
if (delimPos == std::string::npos)
|
||||||
|
{
|
||||||
|
propertyToSet = {std::string(value), 0};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::string_view before = value.substr(0, delimPos);
|
||||||
|
std::string_view after = value.substr(delimPos + 1);
|
||||||
|
|
||||||
|
// Strip whitespaces for before
|
||||||
|
size_t beginBefore = before.find_first_not_of(whitespace);
|
||||||
|
size_t endBefore = before.find_last_not_of(whitespace);
|
||||||
|
before = before.substr(beginBefore, endBefore - beginBefore + 1);
|
||||||
|
|
||||||
|
ApplyProperty(propertyToSet.first, before);
|
||||||
|
ApplyProperty(propertyToSet.second, after);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
void AddConfigVar(const std::string& propertyName, T& propertyToSet, std::string_view line, bool& setConfig)
|
void AddConfigVar(const std::string& propertyName, T& propertyToSet, std::string_view line, bool& setConfig)
|
||||||
{
|
{
|
||||||
|
@ -161,6 +193,21 @@ void Config::Load()
|
||||||
AddConfigVar("AudioMinVolume", config.audioMinVolume, lineView, foundProperty);
|
AddConfigVar("AudioMinVolume", config.audioMinVolume, lineView, foundProperty);
|
||||||
AddConfigVar("AudioMaxVolume", config.audioMaxVolume, lineView, foundProperty);
|
AddConfigVar("AudioMaxVolume", config.audioMaxVolume, lineView, foundProperty);
|
||||||
|
|
||||||
|
std::pair<std::string, uint32_t> buf;
|
||||||
|
bool hasntFoundProperty = !foundProperty;
|
||||||
|
AddConfigVar("SNIIconSize", buf, lineView, foundProperty);
|
||||||
|
if (foundProperty && hasntFoundProperty)
|
||||||
|
{
|
||||||
|
// This was found
|
||||||
|
config.sniIconSizes[buf.first] = buf.second;
|
||||||
|
}
|
||||||
|
hasntFoundProperty = !foundProperty;
|
||||||
|
AddConfigVar("SNIPaddingTop", buf, lineView, foundProperty);
|
||||||
|
if (foundProperty && hasntFoundProperty)
|
||||||
|
{
|
||||||
|
config.sniPaddingTop[buf.first] = buf.second;
|
||||||
|
}
|
||||||
|
|
||||||
if (foundProperty == false)
|
if (foundProperty == false)
|
||||||
{
|
{
|
||||||
LOG("Warning: unknown config var: " << lineView);
|
LOG("Warning: unknown config var: " << lineView);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
class Config
|
class Config
|
||||||
{
|
{
|
||||||
|
@ -39,6 +40,10 @@ public:
|
||||||
|
|
||||||
uint32_t checkUpdateInterval = 5 * 60; // Interval to run the "checkPackagesCommand". In seconds
|
uint32_t checkUpdateInterval = 5 * 60; // Interval to run the "checkPackagesCommand". In seconds
|
||||||
|
|
||||||
|
// SNIIconSize: ["Title String"], ["Size"]
|
||||||
|
std::unordered_map<std::string, uint32_t> sniIconSizes;
|
||||||
|
std::unordered_map<std::string, int32_t> sniPaddingTop;
|
||||||
|
|
||||||
// Only affects outputs (i.e.: speakers, not microphones). This remaps the range of the volume; In percent
|
// Only affects outputs (i.e.: speakers, not microphones). This remaps the range of the volume; In percent
|
||||||
double audioMinVolume = 0.f; // Map the minimum volume to this value
|
double audioMinVolume = 0.f; // Map the minimum volume to this value
|
||||||
double audioMaxVolume = 100.f; // Map the maximum volume to this value
|
double audioMaxVolume = 100.f; // Map the maximum volume to this value
|
||||||
|
|
27
src/SNI.cpp
27
src/SNI.cpp
|
@ -326,6 +326,33 @@ namespace SNI
|
||||||
|
|
||||||
LOG("SNI: Add " << item.name << " to widget");
|
LOG("SNI: Add " << item.name << " to widget");
|
||||||
auto texture = Widget::Create<Texture>();
|
auto texture = Widget::Create<Texture>();
|
||||||
|
bool wasExplicitOverride = false;
|
||||||
|
for (auto& [filter, size] : Config::Get().sniIconSizes)
|
||||||
|
{
|
||||||
|
if (item.tooltip.find(filter) != std::string::npos)
|
||||||
|
{
|
||||||
|
wasExplicitOverride = true;
|
||||||
|
texture->ForceHeight(size);
|
||||||
|
}
|
||||||
|
else if (filter == "*" && !wasExplicitOverride)
|
||||||
|
{
|
||||||
|
texture->ForceHeight(size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wasExplicitOverride = false;
|
||||||
|
for (auto& [filter, padding] : Config::Get().sniPaddingTop)
|
||||||
|
{
|
||||||
|
if (item.tooltip.find(filter) != std::string::npos)
|
||||||
|
{
|
||||||
|
LOG("Padding " << padding);
|
||||||
|
wasExplicitOverride = true;
|
||||||
|
texture->AddPaddingTop(padding);
|
||||||
|
}
|
||||||
|
else if (filter == "*" && !wasExplicitOverride)
|
||||||
|
{
|
||||||
|
texture->AddPaddingTop(padding);
|
||||||
|
}
|
||||||
|
}
|
||||||
texture->SetHorizontalTransform({0, true, Alignment::Fill});
|
texture->SetHorizontalTransform({0, true, Alignment::Fill});
|
||||||
texture->SetBuf(item.w, item.h, item.iconData);
|
texture->SetBuf(item.w, item.h, item.iconData);
|
||||||
texture->SetTooltip(item.tooltip);
|
texture->SetTooltip(item.tooltip);
|
||||||
|
|
|
@ -520,13 +520,15 @@ void Texture::Draw(cairo_t* cr)
|
||||||
{
|
{
|
||||||
GtkAllocation dim;
|
GtkAllocation dim;
|
||||||
gtk_widget_get_allocation(m_Widget, &dim);
|
gtk_widget_get_allocation(m_Widget, &dim);
|
||||||
double ratio = (double)m_Width / (double)m_Height;
|
|
||||||
gtk_widget_set_size_request(m_Widget, dim.height * ratio, dim.height);
|
|
||||||
|
|
||||||
double scale = (double)dim.height / (double)m_Height;
|
double height = m_ForcedHeight != 0 ? m_ForcedHeight : dim.height;
|
||||||
|
double scale = (double)height / (double)m_Height;
|
||||||
|
double width = (double)m_Width * scale;
|
||||||
|
|
||||||
|
gtk_widget_set_size_request(m_Widget, width + 2, height);
|
||||||
cairo_scale(cr, scale, scale);
|
cairo_scale(cr, scale, scale);
|
||||||
cairo_rectangle(cr, 0.f, 0.f, m_Width, m_Height);
|
cairo_rectangle(cr, (dim.width - width) / 2.0, m_Padding + (dim.height - height) / 2.0, m_Width, m_Height);
|
||||||
gdk_cairo_set_source_pixbuf(cr, m_Pixbuf, 0, 0);
|
gdk_cairo_set_source_pixbuf(cr, m_Pixbuf, (dim.width - width) / 2.0, m_Padding + (dim.height - height) / 2.0);
|
||||||
cairo_fill(cr);
|
cairo_fill(cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -277,11 +277,16 @@ public:
|
||||||
// Non-Owning, ARGB32
|
// Non-Owning, ARGB32
|
||||||
void SetBuf(size_t width, size_t height, uint8_t* buf);
|
void SetBuf(size_t width, size_t height, uint8_t* buf);
|
||||||
|
|
||||||
|
void ForceHeight(size_t height) { m_ForcedHeight = height; };
|
||||||
|
void AddPaddingTop(int32_t topPadding) { m_Padding = topPadding; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Draw(cairo_t* cr) override;
|
void Draw(cairo_t* cr) override;
|
||||||
|
|
||||||
size_t m_Width;
|
size_t m_Width;
|
||||||
size_t m_Height;
|
size_t m_Height;
|
||||||
|
size_t m_ForcedHeight = 0;
|
||||||
|
int32_t m_Padding = 0;
|
||||||
GBytes* m_Bytes;
|
GBytes* m_Bytes;
|
||||||
GdkPixbuf* m_Pixbuf;
|
GdkPixbuf* m_Pixbuf;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue