2022-10-26 21:15:14 +00:00
|
|
|
#pragma once
|
2021-01-04 09:25:52 +00:00
|
|
|
#include <cassert>
|
|
|
|
|
2016-11-20 22:04:31 +00:00
|
|
|
#include "components/builder.hpp"
|
2017-01-11 00:42:55 +00:00
|
|
|
#include "components/logger.hpp"
|
2016-12-22 21:11:03 +00:00
|
|
|
#include "events/signal.hpp"
|
|
|
|
#include "events/signal_emitter.hpp"
|
2019-08-06 17:35:07 +00:00
|
|
|
#include "modules/meta/base.hpp"
|
2021-01-04 09:25:52 +00:00
|
|
|
#include "utils/action_router.hpp"
|
2016-11-20 22:04:31 +00:00
|
|
|
|
|
|
|
POLYBAR_NS
|
|
|
|
|
|
|
|
namespace modules {
|
2021-01-04 09:25:52 +00:00
|
|
|
|
2016-11-20 22:04:31 +00:00
|
|
|
// module<Impl> public {{{
|
|
|
|
|
|
|
|
template <typename Impl>
|
2023-05-01 12:58:52 +00:00
|
|
|
module<Impl>::module(const bar_settings& bar, string name, const config& conf)
|
2017-01-11 00:42:55 +00:00
|
|
|
: m_sig(signal_emitter::make())
|
|
|
|
, m_bar(bar)
|
|
|
|
, m_log(logger::make())
|
2023-05-01 12:58:52 +00:00
|
|
|
, m_conf(conf)
|
2021-10-03 00:57:49 +00:00
|
|
|
, m_router(make_unique<action_router>())
|
2017-01-11 00:42:55 +00:00
|
|
|
, m_name("module/" + name)
|
2020-05-30 22:09:44 +00:00
|
|
|
, m_name_raw(name)
|
2017-01-11 00:42:55 +00:00
|
|
|
, m_builder(make_unique<builder>(bar))
|
2017-04-02 16:12:07 +00:00
|
|
|
, m_formatter(make_unique<module_formatter>(m_conf, m_name))
|
2021-01-03 01:43:50 +00:00
|
|
|
, m_handle_events(m_conf.get(m_name, "handle-events", true))
|
2021-07-07 19:43:49 +00:00
|
|
|
, m_visible(!m_conf.get(m_name, "hidden", false)) {
|
2021-10-03 00:57:49 +00:00
|
|
|
m_router->register_action(EVENT_MODULE_TOGGLE, [this]() { action_module_toggle(); });
|
|
|
|
m_router->register_action(EVENT_MODULE_SHOW, [this]() { action_module_show(); });
|
|
|
|
m_router->register_action(EVENT_MODULE_HIDE, [this]() { action_module_hide(); });
|
2021-10-02 23:27:11 +00:00
|
|
|
}
|
2016-11-20 22:04:31 +00:00
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
module<Impl>::~module() noexcept {
|
|
|
|
m_log.trace("%s: Deconstructing", name());
|
|
|
|
|
2021-10-02 23:27:11 +00:00
|
|
|
if (running()) {
|
|
|
|
/*
|
|
|
|
* We can't stop in the destructor because we have to call the subclasses which at this point already have been
|
|
|
|
* destructed.
|
|
|
|
*/
|
|
|
|
m_log.err("%s: Module was not stopped before deconstructing.", name());
|
2016-12-19 21:01:37 +00:00
|
|
|
}
|
2016-11-20 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
string module<Impl>::name() const {
|
|
|
|
return m_name;
|
|
|
|
}
|
|
|
|
|
2020-05-30 22:09:44 +00:00
|
|
|
template <typename Impl>
|
|
|
|
string module<Impl>::name_raw() const {
|
|
|
|
return m_name_raw;
|
|
|
|
}
|
|
|
|
|
2020-05-15 17:59:08 +00:00
|
|
|
template <typename Impl>
|
|
|
|
string module<Impl>::type() const {
|
2020-12-13 14:24:31 +00:00
|
|
|
return string(Impl::TYPE);
|
2020-05-15 17:59:08 +00:00
|
|
|
}
|
|
|
|
|
2016-11-20 22:04:31 +00:00
|
|
|
template <typename Impl>
|
|
|
|
bool module<Impl>::running() const {
|
2016-12-19 21:01:37 +00:00
|
|
|
return static_cast<bool>(m_enabled);
|
2016-11-20 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
2021-10-15 08:33:10 +00:00
|
|
|
template <class Impl>
|
|
|
|
void module<Impl>::start() {
|
|
|
|
m_enabled = true;
|
|
|
|
}
|
|
|
|
|
2019-06-01 23:23:36 +00:00
|
|
|
template <class Impl>
|
|
|
|
void module<Impl>::join() {
|
|
|
|
for (auto&& thread_ : m_threads) {
|
|
|
|
if (thread_.joinable()) {
|
|
|
|
thread_.join();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (m_mainthread.joinable()) {
|
|
|
|
m_mainthread.join();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-27 15:05:26 +00:00
|
|
|
template <typename Impl>
|
|
|
|
bool module<Impl>::visible() const {
|
|
|
|
return static_cast<bool>(m_visible);
|
|
|
|
}
|
|
|
|
|
2016-11-20 22:04:31 +00:00
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::stop() {
|
2016-12-23 04:18:58 +00:00
|
|
|
if (!static_cast<bool>(m_enabled)) {
|
2016-11-20 22:04:31 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_log.info("%s: Stopping", name());
|
2016-12-19 21:01:37 +00:00
|
|
|
m_enabled = false;
|
2016-11-20 22:04:31 +00:00
|
|
|
|
2016-12-19 21:01:37 +00:00
|
|
|
std::lock(m_buildlock, m_updatelock);
|
|
|
|
std::lock_guard<std::mutex> guard_a(m_buildlock, std::adopt_lock);
|
|
|
|
std::lock_guard<std::mutex> guard_b(m_updatelock, std::adopt_lock);
|
2016-11-20 22:04:31 +00:00
|
|
|
{
|
2016-12-19 21:01:37 +00:00
|
|
|
CAST_MOD(Impl)->wakeup();
|
2016-11-20 22:04:31 +00:00
|
|
|
CAST_MOD(Impl)->teardown();
|
|
|
|
|
2017-01-12 15:34:14 +00:00
|
|
|
m_sig.emit(signals::eventqueue::check_state{});
|
2016-11-20 22:04:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::halt(string error_message) {
|
|
|
|
m_log.err("%s: %s", name(), error_message);
|
2020-04-21 22:14:02 +00:00
|
|
|
m_log.notice("Stopping '%s'...", name());
|
2016-11-20 22:04:31 +00:00
|
|
|
stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::teardown() {}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
string module<Impl>::contents() {
|
2024-04-28 19:10:12 +00:00
|
|
|
if (m_changed.exchange(false)) {
|
2017-01-01 07:58:33 +00:00
|
|
|
m_log.info("%s: Rebuilding cache", name());
|
2016-12-23 04:19:45 +00:00
|
|
|
m_cache = CAST_MOD(Impl)->get_output();
|
2019-01-12 13:51:54 +00:00
|
|
|
// Make sure builder is really empty
|
|
|
|
m_builder->flush();
|
2019-08-21 22:55:13 +00:00
|
|
|
if (!m_cache.empty()) {
|
|
|
|
// Add a reset tag after the module
|
2020-12-17 19:37:28 +00:00
|
|
|
m_builder->control(tags::controltag::R);
|
2019-08-21 22:55:13 +00:00
|
|
|
m_cache += m_builder->flush();
|
|
|
|
}
|
2016-12-23 04:19:45 +00:00
|
|
|
}
|
2016-11-20 22:04:31 +00:00
|
|
|
return m_cache;
|
|
|
|
}
|
|
|
|
|
2019-12-02 18:14:26 +00:00
|
|
|
template <typename Impl>
|
2021-01-04 09:25:52 +00:00
|
|
|
bool module<Impl>::input(const string& name, const string& data) {
|
|
|
|
if (!m_router->has_action(name)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
m_router->invoke(name, data);
|
|
|
|
} catch (const exception& err) {
|
|
|
|
m_log.err("%s: Failed to handle command '%s' with data '%s' (%s)", this->name(), name, data, err.what());
|
|
|
|
}
|
|
|
|
return true;
|
2019-12-02 18:14:26 +00:00
|
|
|
}
|
|
|
|
|
2016-11-20 22:04:31 +00:00
|
|
|
// }}}
|
|
|
|
// module<Impl> protected {{{
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::broadcast() {
|
2016-12-23 04:19:45 +00:00
|
|
|
m_changed = true;
|
2017-01-12 15:34:14 +00:00
|
|
|
m_sig.emit(signals::eventqueue::notify_change{});
|
2016-11-20 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::idle() {
|
2017-01-27 12:29:10 +00:00
|
|
|
if (running()) {
|
|
|
|
CAST_MOD(Impl)->sleep(25ms);
|
|
|
|
}
|
2016-11-20 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::sleep(chrono::duration<double> sleep_duration) {
|
2017-01-27 12:29:10 +00:00
|
|
|
if (running()) {
|
|
|
|
std::unique_lock<std::mutex> lck(m_sleeplock);
|
|
|
|
m_sleephandler.wait_for(lck, sleep_duration);
|
|
|
|
}
|
2016-11-20 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
2020-06-20 20:15:25 +00:00
|
|
|
template <typename Impl>
|
|
|
|
template <class Clock, class Duration>
|
|
|
|
void module<Impl>::sleep_until(chrono::time_point<Clock, Duration> point) {
|
|
|
|
if (running()) {
|
|
|
|
std::unique_lock<std::mutex> lck(m_sleeplock);
|
|
|
|
m_sleephandler.wait_until(lck, point);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-20 22:04:31 +00:00
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::wakeup() {
|
|
|
|
m_log.trace("%s: Release sleep lock", name());
|
|
|
|
m_sleephandler.notify_all();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
string module<Impl>::get_format() const {
|
|
|
|
return DEFAULT_FORMAT;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
string module<Impl>::get_output() {
|
2016-12-16 09:23:54 +00:00
|
|
|
std::lock_guard<std::mutex> guard(m_buildlock);
|
2016-11-20 22:04:31 +00:00
|
|
|
auto format_name = CONST_MOD(Impl).get_format();
|
|
|
|
auto format = m_formatter->get(format_name);
|
Add units support (POINT, PIXEL, SPACE) (#2578)
* add units support (POINT, PIXEL, SPACE) for polybar
- add a size_with_unit struct
- add a geometry_format_values struct
- move dpi initialisation from renderer.cpp to bar.cpp
- add a string to size_with_unit converter
- add point support (with pt)
- add pixel support (with px)
* Fix unit test compilation
* clang-format
* Better names
The old names didn't really capture the purpose of the structs and
function.
space_type -> spacing_type
space_size -> spacing_val
size_type -> extent_type
geometry -> extent_val
geometry_format_values -> percentage_with_offset
* Remove parse_size_with_unit
No longer needed. The convert<spacing_val> function in config.cpp
already does all the work for us and always setting the type to pixel
was wrong.
In addition, line-size should not be of type spacing_val but extent_val.
* Cleanup
I tried to address most of my comments on the old PR
* Fix renderer width calculation
We can't just blindly add the x difference to the width because for
example the width should increase if x < width and the increase keeps
x < width.
Similarly, we can't just add the offset to the width.
* Rename geom_format_to_pixels to percentage_with_offset_to_pixel
* Cleanup
* Apply suggested changes from Patrick on GitHub
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/bar.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/config.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* config: Use stod for parsing percentage
* Use stof instead of strtof
* units: Fix test edge cases
* Remove unnecessary clang-format toggle
* Use percentage_with_offset for margin-{top,bottom}
* Support negative extent values
* Rename unit to units and create a cpp file
* Move percentage_with_offset_to_pixel unit test to units
* Add unit tests for units_utils
* Clarify when and how negative spacing/extent is allowed
Negative spacing is never allowed and produces a config error.
Extents allow negative values in theory, but only a few use-cases accept
it.
Only the extent value used for the `%{O}` tag and the offset value in
percentage_with_offset can be negative. Everything else is capped below
at 0.
The final pixel value of percentage_with_offset also caps below at 0.
* Fix parsing errors not being caught in config
* Print a proper error message for uncaught exceptions
* Cleanup module::get_output
All changes preserve the existing semantics
* Stop using remove_trailing_space in module::get_output
Instead, we first check if the current tag is built, and only if it is,
the spacing is prepended.
* Remove unused imports
* Restore old behavior
If there are two tags and the second one isn't built (module::build
returns false), the space in between them is removed.
For example in the mpd module:
format-online = <toggle> <label-song> foo
If mpd is not running, the mpd module will return false when trying to
build the `<label-song>` tag. If we don't remove the space between
`<toggle>` and `<label-song>`, we end up with two spaces between
`<toggle>` and `foo`.
This change is to match the old behavior where at least one trailing
space character was removed from the builder.
* Add changelog entry
* Remove unused setting
* Use percentage with offset for tray-offset
Co-authored-by: Jérôme BOULMIER <jerome.boulmier@outlook.fr>
Co-authored-by: Joe Groocock <github@frebib.net>
2022-02-20 20:08:57 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Builder for building individual tags isolated, so that we can
|
|
|
|
*/
|
|
|
|
builder tag_builder(m_bar);
|
|
|
|
|
|
|
|
// Whether any tags have been processed yet
|
|
|
|
bool has_tags = false;
|
|
|
|
|
|
|
|
// Cursor pointing into 'value'
|
|
|
|
size_t cursor = 0;
|
|
|
|
const string& value{format->value};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Search for all tags in the format definition. A tag is enclosed in '<' and '>'.
|
|
|
|
* Each tag is given to the module to produce some output for it. All other text is added as-is.
|
|
|
|
*/
|
|
|
|
while (cursor < value.size()) {
|
|
|
|
// Check if there are any tags left
|
|
|
|
|
|
|
|
// Start index of next tag
|
|
|
|
size_t start = value.find('<', cursor);
|
|
|
|
|
|
|
|
if (start == string::npos) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// End index (inclusive) of next tag
|
|
|
|
size_t end = value.find('>', start + 1);
|
|
|
|
|
|
|
|
if (end == string::npos) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Potential regular text that appears before the tag.
|
|
|
|
string non_tag;
|
|
|
|
|
|
|
|
// There is some non-tag text
|
|
|
|
if (start > cursor) {
|
|
|
|
/*
|
|
|
|
* Produce anything between the previous and current tag as regular text.
|
|
|
|
*/
|
|
|
|
non_tag = value.substr(cursor, start - cursor);
|
|
|
|
if (!has_tags) {
|
|
|
|
/*
|
|
|
|
* If no module tag has been built we do not want to add
|
|
|
|
* whitespace defined between the format tags, but we do still
|
|
|
|
* want to output other non-tag content
|
|
|
|
*/
|
|
|
|
non_tag = string_util::ltrim(move(non_tag), ' ');
|
2017-01-13 09:54:40 +00:00
|
|
|
}
|
2017-01-11 00:42:55 +00:00
|
|
|
}
|
Add units support (POINT, PIXEL, SPACE) (#2578)
* add units support (POINT, PIXEL, SPACE) for polybar
- add a size_with_unit struct
- add a geometry_format_values struct
- move dpi initialisation from renderer.cpp to bar.cpp
- add a string to size_with_unit converter
- add point support (with pt)
- add pixel support (with px)
* Fix unit test compilation
* clang-format
* Better names
The old names didn't really capture the purpose of the structs and
function.
space_type -> spacing_type
space_size -> spacing_val
size_type -> extent_type
geometry -> extent_val
geometry_format_values -> percentage_with_offset
* Remove parse_size_with_unit
No longer needed. The convert<spacing_val> function in config.cpp
already does all the work for us and always setting the type to pixel
was wrong.
In addition, line-size should not be of type spacing_val but extent_val.
* Cleanup
I tried to address most of my comments on the old PR
* Fix renderer width calculation
We can't just blindly add the x difference to the width because for
example the width should increase if x < width and the increase keeps
x < width.
Similarly, we can't just add the offset to the width.
* Rename geom_format_to_pixels to percentage_with_offset_to_pixel
* Cleanup
* Apply suggested changes from Patrick on GitHub
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/bar.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/config.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* config: Use stod for parsing percentage
* Use stof instead of strtof
* units: Fix test edge cases
* Remove unnecessary clang-format toggle
* Use percentage_with_offset for margin-{top,bottom}
* Support negative extent values
* Rename unit to units and create a cpp file
* Move percentage_with_offset_to_pixel unit test to units
* Add unit tests for units_utils
* Clarify when and how negative spacing/extent is allowed
Negative spacing is never allowed and produces a config error.
Extents allow negative values in theory, but only a few use-cases accept
it.
Only the extent value used for the `%{O}` tag and the offset value in
percentage_with_offset can be negative. Everything else is capped below
at 0.
The final pixel value of percentage_with_offset also caps below at 0.
* Fix parsing errors not being caught in config
* Print a proper error message for uncaught exceptions
* Cleanup module::get_output
All changes preserve the existing semantics
* Stop using remove_trailing_space in module::get_output
Instead, we first check if the current tag is built, and only if it is,
the spacing is prepended.
* Remove unused imports
* Restore old behavior
If there are two tags and the second one isn't built (module::build
returns false), the space in between them is removed.
For example in the mpd module:
format-online = <toggle> <label-song> foo
If mpd is not running, the mpd module will return false when trying to
build the `<label-song>` tag. If we don't remove the space between
`<toggle>` and `<label-song>`, we end up with two spaces between
`<toggle>` and `foo`.
This change is to match the old behavior where at least one trailing
space character was removed from the builder.
* Add changelog entry
* Remove unused setting
* Use percentage with offset for tray-offset
Co-authored-by: Jérôme BOULMIER <jerome.boulmier@outlook.fr>
Co-authored-by: Joe Groocock <github@frebib.net>
2022-02-20 20:08:57 +00:00
|
|
|
|
|
|
|
string tag = value.substr(start, end - start + 1);
|
|
|
|
bool tag_built = CONST_MOD(Impl).build(&tag_builder, tag);
|
|
|
|
string tag_content = tag_builder.flush();
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Remove exactly one space between two tags if the second tag was not built.
|
|
|
|
*/
|
|
|
|
if (!tag_built && has_tags && !format->spacing) {
|
|
|
|
if (!non_tag.empty() && non_tag.back() == ' ') {
|
|
|
|
non_tag.erase(non_tag.size() - 1);
|
|
|
|
}
|
2016-11-20 22:04:31 +00:00
|
|
|
}
|
Add units support (POINT, PIXEL, SPACE) (#2578)
* add units support (POINT, PIXEL, SPACE) for polybar
- add a size_with_unit struct
- add a geometry_format_values struct
- move dpi initialisation from renderer.cpp to bar.cpp
- add a string to size_with_unit converter
- add point support (with pt)
- add pixel support (with px)
* Fix unit test compilation
* clang-format
* Better names
The old names didn't really capture the purpose of the structs and
function.
space_type -> spacing_type
space_size -> spacing_val
size_type -> extent_type
geometry -> extent_val
geometry_format_values -> percentage_with_offset
* Remove parse_size_with_unit
No longer needed. The convert<spacing_val> function in config.cpp
already does all the work for us and always setting the type to pixel
was wrong.
In addition, line-size should not be of type spacing_val but extent_val.
* Cleanup
I tried to address most of my comments on the old PR
* Fix renderer width calculation
We can't just blindly add the x difference to the width because for
example the width should increase if x < width and the increase keeps
x < width.
Similarly, we can't just add the offset to the width.
* Rename geom_format_to_pixels to percentage_with_offset_to_pixel
* Cleanup
* Apply suggested changes from Patrick on GitHub
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/bar.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/config.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* config: Use stod for parsing percentage
* Use stof instead of strtof
* units: Fix test edge cases
* Remove unnecessary clang-format toggle
* Use percentage_with_offset for margin-{top,bottom}
* Support negative extent values
* Rename unit to units and create a cpp file
* Move percentage_with_offset_to_pixel unit test to units
* Add unit tests for units_utils
* Clarify when and how negative spacing/extent is allowed
Negative spacing is never allowed and produces a config error.
Extents allow negative values in theory, but only a few use-cases accept
it.
Only the extent value used for the `%{O}` tag and the offset value in
percentage_with_offset can be negative. Everything else is capped below
at 0.
The final pixel value of percentage_with_offset also caps below at 0.
* Fix parsing errors not being caught in config
* Print a proper error message for uncaught exceptions
* Cleanup module::get_output
All changes preserve the existing semantics
* Stop using remove_trailing_space in module::get_output
Instead, we first check if the current tag is built, and only if it is,
the spacing is prepended.
* Remove unused imports
* Restore old behavior
If there are two tags and the second one isn't built (module::build
returns false), the space in between them is removed.
For example in the mpd module:
format-online = <toggle> <label-song> foo
If mpd is not running, the mpd module will return false when trying to
build the `<label-song>` tag. If we don't remove the space between
`<toggle>` and `<label-song>`, we end up with two spaces between
`<toggle>` and `foo`.
This change is to match the old behavior where at least one trailing
space character was removed from the builder.
* Add changelog entry
* Remove unused setting
* Use percentage with offset for tray-offset
Co-authored-by: Jérôme BOULMIER <jerome.boulmier@outlook.fr>
Co-authored-by: Joe Groocock <github@frebib.net>
2022-02-20 20:08:57 +00:00
|
|
|
|
|
|
|
m_builder->node(non_tag);
|
|
|
|
|
|
|
|
if (tag_built) {
|
|
|
|
if (has_tags) {
|
|
|
|
// format-spacing is added between all tags
|
|
|
|
m_builder->spacing(format->spacing);
|
|
|
|
}
|
|
|
|
|
2022-03-14 17:39:34 +00:00
|
|
|
m_builder->node(tag_content);
|
Add units support (POINT, PIXEL, SPACE) (#2578)
* add units support (POINT, PIXEL, SPACE) for polybar
- add a size_with_unit struct
- add a geometry_format_values struct
- move dpi initialisation from renderer.cpp to bar.cpp
- add a string to size_with_unit converter
- add point support (with pt)
- add pixel support (with px)
* Fix unit test compilation
* clang-format
* Better names
The old names didn't really capture the purpose of the structs and
function.
space_type -> spacing_type
space_size -> spacing_val
size_type -> extent_type
geometry -> extent_val
geometry_format_values -> percentage_with_offset
* Remove parse_size_with_unit
No longer needed. The convert<spacing_val> function in config.cpp
already does all the work for us and always setting the type to pixel
was wrong.
In addition, line-size should not be of type spacing_val but extent_val.
* Cleanup
I tried to address most of my comments on the old PR
* Fix renderer width calculation
We can't just blindly add the x difference to the width because for
example the width should increase if x < width and the increase keeps
x < width.
Similarly, we can't just add the offset to the width.
* Rename geom_format_to_pixels to percentage_with_offset_to_pixel
* Cleanup
* Apply suggested changes from Patrick on GitHub
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/bar.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/config.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* config: Use stod for parsing percentage
* Use stof instead of strtof
* units: Fix test edge cases
* Remove unnecessary clang-format toggle
* Use percentage_with_offset for margin-{top,bottom}
* Support negative extent values
* Rename unit to units and create a cpp file
* Move percentage_with_offset_to_pixel unit test to units
* Add unit tests for units_utils
* Clarify when and how negative spacing/extent is allowed
Negative spacing is never allowed and produces a config error.
Extents allow negative values in theory, but only a few use-cases accept
it.
Only the extent value used for the `%{O}` tag and the offset value in
percentage_with_offset can be negative. Everything else is capped below
at 0.
The final pixel value of percentage_with_offset also caps below at 0.
* Fix parsing errors not being caught in config
* Print a proper error message for uncaught exceptions
* Cleanup module::get_output
All changes preserve the existing semantics
* Stop using remove_trailing_space in module::get_output
Instead, we first check if the current tag is built, and only if it is,
the spacing is prepended.
* Remove unused imports
* Restore old behavior
If there are two tags and the second one isn't built (module::build
returns false), the space in between them is removed.
For example in the mpd module:
format-online = <toggle> <label-song> foo
If mpd is not running, the mpd module will return false when trying to
build the `<label-song>` tag. If we don't remove the space between
`<toggle>` and `<label-song>`, we end up with two spaces between
`<toggle>` and `foo`.
This change is to match the old behavior where at least one trailing
space character was removed from the builder.
* Add changelog entry
* Remove unused setting
* Use percentage with offset for tray-offset
Co-authored-by: Jérôme BOULMIER <jerome.boulmier@outlook.fr>
Co-authored-by: Joe Groocock <github@frebib.net>
2022-02-20 20:08:57 +00:00
|
|
|
has_tags = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
cursor = end + 1;
|
2017-01-11 00:42:55 +00:00
|
|
|
}
|
|
|
|
|
Add units support (POINT, PIXEL, SPACE) (#2578)
* add units support (POINT, PIXEL, SPACE) for polybar
- add a size_with_unit struct
- add a geometry_format_values struct
- move dpi initialisation from renderer.cpp to bar.cpp
- add a string to size_with_unit converter
- add point support (with pt)
- add pixel support (with px)
* Fix unit test compilation
* clang-format
* Better names
The old names didn't really capture the purpose of the structs and
function.
space_type -> spacing_type
space_size -> spacing_val
size_type -> extent_type
geometry -> extent_val
geometry_format_values -> percentage_with_offset
* Remove parse_size_with_unit
No longer needed. The convert<spacing_val> function in config.cpp
already does all the work for us and always setting the type to pixel
was wrong.
In addition, line-size should not be of type spacing_val but extent_val.
* Cleanup
I tried to address most of my comments on the old PR
* Fix renderer width calculation
We can't just blindly add the x difference to the width because for
example the width should increase if x < width and the increase keeps
x < width.
Similarly, we can't just add the offset to the width.
* Rename geom_format_to_pixels to percentage_with_offset_to_pixel
* Cleanup
* Apply suggested changes from Patrick on GitHub
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/bar.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/config.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* config: Use stod for parsing percentage
* Use stof instead of strtof
* units: Fix test edge cases
* Remove unnecessary clang-format toggle
* Use percentage_with_offset for margin-{top,bottom}
* Support negative extent values
* Rename unit to units and create a cpp file
* Move percentage_with_offset_to_pixel unit test to units
* Add unit tests for units_utils
* Clarify when and how negative spacing/extent is allowed
Negative spacing is never allowed and produces a config error.
Extents allow negative values in theory, but only a few use-cases accept
it.
Only the extent value used for the `%{O}` tag and the offset value in
percentage_with_offset can be negative. Everything else is capped below
at 0.
The final pixel value of percentage_with_offset also caps below at 0.
* Fix parsing errors not being caught in config
* Print a proper error message for uncaught exceptions
* Cleanup module::get_output
All changes preserve the existing semantics
* Stop using remove_trailing_space in module::get_output
Instead, we first check if the current tag is built, and only if it is,
the spacing is prepended.
* Remove unused imports
* Restore old behavior
If there are two tags and the second one isn't built (module::build
returns false), the space in between them is removed.
For example in the mpd module:
format-online = <toggle> <label-song> foo
If mpd is not running, the mpd module will return false when trying to
build the `<label-song>` tag. If we don't remove the space between
`<toggle>` and `<label-song>`, we end up with two spaces between
`<toggle>` and `foo`.
This change is to match the old behavior where at least one trailing
space character was removed from the builder.
* Add changelog entry
* Remove unused setting
* Use percentage with offset for tray-offset
Co-authored-by: Jérôme BOULMIER <jerome.boulmier@outlook.fr>
Co-authored-by: Joe Groocock <github@frebib.net>
2022-02-20 20:08:57 +00:00
|
|
|
if (cursor < value.size()) {
|
2022-03-14 17:39:34 +00:00
|
|
|
m_builder->node(value.substr(cursor));
|
2016-11-20 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
2016-12-27 03:03:46 +00:00
|
|
|
return format->decorate(&*m_builder, m_builder->flush());
|
2016-11-20 22:04:31 +00:00
|
|
|
}
|
|
|
|
|
2021-07-07 19:43:49 +00:00
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::set_visible(bool value) {
|
|
|
|
m_log.notice("%s: Visibility changed (state=%s)", m_name, value ? "shown" : "hidden");
|
|
|
|
m_visible = value;
|
|
|
|
broadcast();
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::action_module_toggle() {
|
|
|
|
set_visible(!m_visible);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::action_module_show() {
|
|
|
|
set_visible(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <typename Impl>
|
|
|
|
void module<Impl>::action_module_hide() {
|
|
|
|
set_visible(false);
|
|
|
|
}
|
|
|
|
|
2016-11-20 22:04:31 +00:00
|
|
|
// }}}
|
Add units support (POINT, PIXEL, SPACE) (#2578)
* add units support (POINT, PIXEL, SPACE) for polybar
- add a size_with_unit struct
- add a geometry_format_values struct
- move dpi initialisation from renderer.cpp to bar.cpp
- add a string to size_with_unit converter
- add point support (with pt)
- add pixel support (with px)
* Fix unit test compilation
* clang-format
* Better names
The old names didn't really capture the purpose of the structs and
function.
space_type -> spacing_type
space_size -> spacing_val
size_type -> extent_type
geometry -> extent_val
geometry_format_values -> percentage_with_offset
* Remove parse_size_with_unit
No longer needed. The convert<spacing_val> function in config.cpp
already does all the work for us and always setting the type to pixel
was wrong.
In addition, line-size should not be of type spacing_val but extent_val.
* Cleanup
I tried to address most of my comments on the old PR
* Fix renderer width calculation
We can't just blindly add the x difference to the width because for
example the width should increase if x < width and the increase keeps
x < width.
Similarly, we can't just add the offset to the width.
* Rename geom_format_to_pixels to percentage_with_offset_to_pixel
* Cleanup
* Apply suggested changes from Patrick on GitHub
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/bar.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/config.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* Update src/components/builder.cpp
Co-authored-by: Patrick Ziegler <p.ziegler96@gmail.com>
* config: Use stod for parsing percentage
* Use stof instead of strtof
* units: Fix test edge cases
* Remove unnecessary clang-format toggle
* Use percentage_with_offset for margin-{top,bottom}
* Support negative extent values
* Rename unit to units and create a cpp file
* Move percentage_with_offset_to_pixel unit test to units
* Add unit tests for units_utils
* Clarify when and how negative spacing/extent is allowed
Negative spacing is never allowed and produces a config error.
Extents allow negative values in theory, but only a few use-cases accept
it.
Only the extent value used for the `%{O}` tag and the offset value in
percentage_with_offset can be negative. Everything else is capped below
at 0.
The final pixel value of percentage_with_offset also caps below at 0.
* Fix parsing errors not being caught in config
* Print a proper error message for uncaught exceptions
* Cleanup module::get_output
All changes preserve the existing semantics
* Stop using remove_trailing_space in module::get_output
Instead, we first check if the current tag is built, and only if it is,
the spacing is prepended.
* Remove unused imports
* Restore old behavior
If there are two tags and the second one isn't built (module::build
returns false), the space in between them is removed.
For example in the mpd module:
format-online = <toggle> <label-song> foo
If mpd is not running, the mpd module will return false when trying to
build the `<label-song>` tag. If we don't remove the space between
`<toggle>` and `<label-song>`, we end up with two spaces between
`<toggle>` and `foo`.
This change is to match the old behavior where at least one trailing
space character was removed from the builder.
* Add changelog entry
* Remove unused setting
* Use percentage with offset for tray-offset
Co-authored-by: Jérôme BOULMIER <jerome.boulmier@outlook.fr>
Co-authored-by: Joe Groocock <github@frebib.net>
2022-02-20 20:08:57 +00:00
|
|
|
} // namespace modules
|
2016-11-20 22:04:31 +00:00
|
|
|
|
|
|
|
POLYBAR_NS_END
|