refactor(config): Deduce return type from default value

This commit is contained in:
Michael Carlberg 2016-12-30 23:32:05 +01:00
parent a0f1d97c2b
commit 78bb3695e6
33 changed files with 184 additions and 196 deletions
src/components

View file

@ -1,6 +1,5 @@
#include <xcb/xcb_icccm.h>
#include <algorithm>
#include <string>
#include "components/bar.hpp"
#include "components/config.hpp"
@ -69,9 +68,9 @@ bar::bar(connection& conn, signal_emitter& emitter, const config& config, const
string bs{m_conf.section()};
// Get available RandR outputs
auto monitor_name = m_conf.get<string>(bs, "monitor", "");
auto monitor_name_fallback = m_conf.get<string>(bs, "monitor-fallback", "");
auto monitor_strictmode = m_conf.get<bool>(bs, "monitor-strict", false);
auto monitor_name = m_conf.get(bs, "monitor", ""s);
auto monitor_name_fallback = m_conf.get(bs, "monitor-fallback", ""s);
auto monitor_strictmode = m_conf.get(bs, "monitor-strict", false);
auto monitors = randr_util::get_monitors(m_connection, m_connection.screen()->root, monitor_strictmode);
if (monitors.empty()) {
@ -123,46 +122,44 @@ bar::bar(connection& conn, signal_emitter& emitter, const config& config, const
m_opts.override_redirect = m_conf.get<bool>(bs, "dock");
m_conf.warn_deprecated(bs, "dock", "override-redirect");
} catch (const key_error& err) {
m_opts.override_redirect = m_conf.get<bool>(bs, "override-redirect", m_opts.override_redirect);
m_opts.override_redirect = m_conf.get(bs, "override-redirect", m_opts.override_redirect);
}
m_opts.dimvalue = m_conf.get<double>(bs, "dim-value", 1.0);
m_opts.dimvalue = m_conf.get(bs, "dim-value", 1.0);
m_opts.dimvalue = math_util::cap(m_opts.dimvalue, 0.0, 1.0);
// Build WM_NAME
m_opts.wmname = m_conf.get<string>(bs, "wm-name", "polybar-" + bs.substr(4) + "_" + m_opts.monitor->name);
m_opts.wmname = m_conf.get(bs, "wm-name", "polybar-" + bs.substr(4) + "_" + m_opts.monitor->name);
m_opts.wmname = string_util::replace(m_opts.wmname, " ", "-");
// Load configuration values
m_opts.origin = m_conf.get<bool>(bs, "bottom", false) ? edge::BOTTOM : edge::TOP;
m_opts.spacing = m_conf.get<decltype(m_opts.spacing)>(bs, "spacing", m_opts.spacing);
m_opts.padding.left = m_conf.get<decltype(m_opts.padding.left)>(bs, "padding-left", m_opts.padding.left);
m_opts.padding.right = m_conf.get<decltype(m_opts.padding.right)>(bs, "padding-right", m_opts.padding.right);
m_opts.module_margin.left =
m_conf.get<decltype(m_opts.module_margin.left)>(bs, "module-margin-left", m_opts.module_margin.left);
m_opts.module_margin.right =
m_conf.get<decltype(m_opts.module_margin.right)>(bs, "module-margin-right", m_opts.module_margin.right);
m_opts.separator = string_util::trim(m_conf.get<string>(bs, "separator", ""), '"');
m_opts.locale = m_conf.get<string>(bs, "locale", "");
m_opts.origin = m_conf.get(bs, "bottom", false) ? edge::BOTTOM : edge::TOP;
m_opts.spacing = m_conf.get(bs, "spacing", m_opts.spacing);
m_opts.padding.left = m_conf.get(bs, "padding-left", m_opts.padding.left);
m_opts.padding.right = m_conf.get(bs, "padding-right", m_opts.padding.right);
m_opts.module_margin.left = m_conf.get(bs, "module-margin-left", m_opts.module_margin.left);
m_opts.module_margin.right = m_conf.get(bs, "module-margin-right", m_opts.module_margin.right);
m_opts.separator = string_util::trim(m_conf.get(bs, "separator", ""s), '"');
m_opts.locale = m_conf.get(bs, "locale", ""s);
if (only_initialize_values) {
return;
}
// Load values used to adjust the struts atom
m_opts.strut.top = m_conf.get<int>("global/wm", "margin-top", 0);
m_opts.strut.bottom = m_conf.get<int>("global/wm", "margin-bottom", 0);
m_opts.strut.top = m_conf.get("global/wm", "margin-top", 0);
m_opts.strut.bottom = m_conf.get("global/wm", "margin-bottom", 0);
// Load commands used for fallback click handlers
vector<action> actions;
actions.emplace_back(action{mousebtn::LEFT, m_conf.get<string>(bs, "click-left", "")});
actions.emplace_back(action{mousebtn::MIDDLE, m_conf.get<string>(bs, "click-middle", "")});
actions.emplace_back(action{mousebtn::RIGHT, m_conf.get<string>(bs, "click-right", "")});
actions.emplace_back(action{mousebtn::SCROLL_UP, m_conf.get<string>(bs, "scroll-up", "")});
actions.emplace_back(action{mousebtn::SCROLL_DOWN, m_conf.get<string>(bs, "scroll-down", "")});
actions.emplace_back(action{mousebtn::DOUBLE_LEFT, m_conf.get<string>(bs, "double-click-left", "")});
actions.emplace_back(action{mousebtn::DOUBLE_MIDDLE, m_conf.get<string>(bs, "double-click-middle", "")});
actions.emplace_back(action{mousebtn::DOUBLE_RIGHT, m_conf.get<string>(bs, "double-click-right", "")});
actions.emplace_back(action{mousebtn::LEFT, m_conf.get(bs, "click-left", ""s)});
actions.emplace_back(action{mousebtn::MIDDLE, m_conf.get(bs, "click-middle", ""s)});
actions.emplace_back(action{mousebtn::RIGHT, m_conf.get(bs, "click-right", ""s)});
actions.emplace_back(action{mousebtn::SCROLL_UP, m_conf.get(bs, "scroll-up", ""s)});
actions.emplace_back(action{mousebtn::SCROLL_DOWN, m_conf.get(bs, "scroll-down", ""s)});
actions.emplace_back(action{mousebtn::DOUBLE_LEFT, m_conf.get(bs, "double-click-left", ""s)});
actions.emplace_back(action{mousebtn::DOUBLE_MIDDLE, m_conf.get(bs, "double-click-middle", ""s)});
actions.emplace_back(action{mousebtn::DOUBLE_RIGHT, m_conf.get(bs, "double-click-right", ""s)});
for (auto&& act : actions) {
if (!act.command.empty()) {
@ -171,42 +168,42 @@ bar::bar(connection& conn, signal_emitter& emitter, const config& config, const
}
// Load foreground/background
m_opts.background = color::parse(m_conf.get<string>(bs, "background", color_util::hex<uint16_t>(m_opts.background)));
m_opts.foreground = color::parse(m_conf.get<string>(bs, "foreground", color_util::hex<uint16_t>(m_opts.foreground)));
m_opts.background = color::parse(m_conf.get(bs, "background", color_util::hex<uint16_t>(m_opts.background)));
m_opts.foreground = color::parse(m_conf.get(bs, "foreground", color_util::hex<uint16_t>(m_opts.foreground)));
// Load over-/underline color and size (warn about deprecated params if used)
m_conf.warn_deprecated(bs, "linecolor", "{underline,overline}-color");
m_conf.warn_deprecated(bs, "lineheight", "{underline,overline}-size");
auto linecolor = color::parse(m_conf.get<string>(bs, "linecolor", "#f00"));
auto lineheight = m_conf.get<int>(bs, "lineheight", 0);
m_opts.overline.size = m_conf.get<int16_t>(bs, "overline-size", lineheight);
m_opts.overline.color = color::parse(m_conf.get<string>(bs, "overline-color", linecolor));
m_opts.underline.size = m_conf.get<uint16_t>(bs, "underline-size", lineheight);
m_opts.underline.color = color::parse(m_conf.get<string>(bs, "underline-color", linecolor));
auto linecolor = color::parse(m_conf.get(bs, "linecolor", "#f00"s));
auto lineheight = m_conf.get(bs, "lineheight", 0);
m_opts.overline.size = m_conf.get(bs, "overline-size", lineheight);
m_opts.overline.color = color::parse(m_conf.get(bs, "overline-color", linecolor));
m_opts.underline.size = m_conf.get(bs, "underline-size", lineheight);
m_opts.underline.color = color::parse(m_conf.get(bs, "underline-color", linecolor));
// Load border settings
auto bsize = m_conf.get<int>(bs, "border-size", 0);
auto bcolor = m_conf.get<string>(bs, "border-color", "#00000000");
auto bsize = m_conf.get(bs, "border-size", 0);
auto bcolor = m_conf.get(bs, "border-color", "#00000000"s);
m_opts.borders.emplace(edge::TOP, border_settings{});
m_opts.borders[edge::TOP].size = m_conf.get<int>(bs, "border-top", bsize);
m_opts.borders[edge::TOP].color = color::parse(m_conf.get<string>(bs, "border-top-color", bcolor));
m_opts.borders[edge::TOP].size = m_conf.get(bs, "border-top", bsize);
m_opts.borders[edge::TOP].color = color::parse(m_conf.get(bs, "border-top-color", bcolor));
m_opts.borders.emplace(edge::BOTTOM, border_settings{});
m_opts.borders[edge::BOTTOM].size = m_conf.get<int>(bs, "border-bottom", bsize);
m_opts.borders[edge::BOTTOM].color = color::parse(m_conf.get<string>(bs, "border-bottom-color", bcolor));
m_opts.borders[edge::BOTTOM].size = m_conf.get(bs, "border-bottom", bsize);
m_opts.borders[edge::BOTTOM].color = color::parse(m_conf.get(bs, "border-bottom-color", bcolor));
m_opts.borders.emplace(edge::LEFT, border_settings{});
m_opts.borders[edge::LEFT].size = m_conf.get<int>(bs, "border-left", bsize);
m_opts.borders[edge::LEFT].color = color::parse(m_conf.get<string>(bs, "border-left-color", bcolor));
m_opts.borders[edge::LEFT].size = m_conf.get(bs, "border-left", bsize);
m_opts.borders[edge::LEFT].color = color::parse(m_conf.get(bs, "border-left-color", bcolor));
m_opts.borders.emplace(edge::RIGHT, border_settings{});
m_opts.borders[edge::RIGHT].size = m_conf.get<int>(bs, "border-right", bsize);
m_opts.borders[edge::RIGHT].color = color::parse(m_conf.get<string>(bs, "border-right-color", bcolor));
m_opts.borders[edge::RIGHT].size = m_conf.get(bs, "border-right", bsize);
m_opts.borders[edge::RIGHT].color = color::parse(m_conf.get(bs, "border-right-color", bcolor));
// Load geometry values
auto w = m_conf.get<string>(m_conf.section(), "width", "100%");
auto h = m_conf.get<string>(m_conf.section(), "height", "24");
auto offsetx = m_conf.get<string>(m_conf.section(), "offset-x", "");
auto offsety = m_conf.get<string>(m_conf.section(), "offset-y", "");
auto w = m_conf.get(m_conf.section(), "width", "100%"s);
auto h = m_conf.get(m_conf.section(), "height", "24"s);
auto offsetx = m_conf.get(m_conf.section(), "offset-x", ""s);
auto offsety = m_conf.get(m_conf.section(), "offset-y", ""s);
if ((m_opts.size.w = atoi(w.c_str())) && w.find('%') != string::npos) {
m_opts.size.w = math_util::percentage_to_value<int>(m_opts.size.w, m_opts.monitor->w);
@ -251,7 +248,7 @@ bar::bar(connection& conn, signal_emitter& emitter, const config& config, const
m_opts.center.x += m_opts.borders[edge::LEFT].size;
m_log.trace("bar: Create renderer");
auto fonts = m_conf.get_list<string>(m_conf.section(), "font", {});
auto fonts = m_conf.get_list(m_conf.section(), "font", {});
m_renderer = renderer::make(m_opts, move(fonts));
m_log.trace("bar: Attaching sink to registry");
@ -315,7 +312,7 @@ const bar_settings bar::settings() const {
* @param data Input string
* @param force Unless true, do not parse unchanged data
*/
void bar::parse(const string& data, bool force) {
void bar::parse(string&& data) {
if (!m_mutex.try_lock()) {
return;
}
@ -326,7 +323,7 @@ void bar::parse(const string& data, bool force) {
return m_log.trace("bar: Ignoring update (shaded)");
}
if (data == m_lastinput && !force) {
if (data == m_lastinput) {
return;
}
@ -362,7 +359,7 @@ void bar::restack_window() {
string wm_restack;
try {
wm_restack = m_conf.get<string>(m_conf.section(), "wm-restack");
wm_restack = m_conf.get(m_conf.section(), "wm-restack");
} catch (const key_error& err) {
return;
}