feat(xkeyboard): Add variant support to layout label (#2163)

* Add variant support to xkeyboard layout label

Solves #316

* Run style checks, I guess?

* Add comment

* Return nothing if there is no variant

* Update CHANGELOG
This commit is contained in:
Nolan Prochnau 2020-12-19 12:22:27 -05:00 committed by GitHub
parent 6f13fe93a3
commit 0d2838fcd5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 14 deletions

View File

@ -33,6 +33,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([`#2294`](https://github.com/polybar/polybar/issues/2294)) ([`#2294`](https://github.com/polybar/polybar/issues/2294))
- `internal/network`: `speed-unit = B/s` can be used to customize how network - `internal/network`: `speed-unit = B/s` can be used to customize how network
speeds are displayed. speeds are displayed.
- `internal/xkeyboard`: `%variant%` can be used to parse the layout variant
([`#316`](https://github.com/polybar/polybar/issues/316))
### Changed ### Changed
- Slight changes to the value ranges the different ramp levels are responsible - Slight changes to the value ranges the different ramp levels are responsible

View File

@ -44,7 +44,7 @@ namespace evt {
using xkb_action_message = xpp::xkb::event::action_message<connection&>; using xkb_action_message = xpp::xkb::event::action_message<connection&>;
using xkb_access_x_notify = xpp::xkb::event::access_x_notify<connection&>; using xkb_access_x_notify = xpp::xkb::event::access_x_notify<connection&>;
using xkb_extension_device_notify = xpp::xkb::event::extension_device_notify<connection&>; using xkb_extension_device_notify = xpp::xkb::event::extension_device_notify<connection&>;
} } // namespace evt
class keyboard { class keyboard {
public: public:
@ -62,7 +62,9 @@ class keyboard {
}; };
explicit keyboard(vector<layout>&& layouts_, map<indicator::type, indicator>&& indicators_, unsigned char group) explicit keyboard(vector<layout>&& layouts_, map<indicator::type, indicator>&& indicators_, unsigned char group)
: layouts(forward<decltype(layouts)>(layouts_)), indicators(forward<decltype(indicators)>(indicators_)), current_group(group) {} : layouts(forward<decltype(layouts)>(layouts_))
, indicators(forward<decltype(indicators)>(indicators_))
, current_group(group) {}
const indicator& get(const indicator::type& i) const; const indicator& get(const indicator::type& i) const;
void set(unsigned int state); void set(unsigned int state);
@ -71,6 +73,7 @@ class keyboard {
unsigned char current() const; unsigned char current() const;
const string group_name(size_t index = 0) const; const string group_name(size_t index = 0) const;
const string layout_name(size_t index = 0) const; const string layout_name(size_t index = 0) const;
const string variant_name(size_t index = 0) const;
const string indicator_name(const indicator::type&) const; const string indicator_name(const indicator::type&) const;
size_t size() const; size_t size() const;
@ -90,6 +93,6 @@ namespace xkb_util {
vector<keyboard::layout> get_layouts(connection& conn, xcb_xkb_device_spec_t device); vector<keyboard::layout> get_layouts(connection& conn, xcb_xkb_device_spec_t device);
map<keyboard::indicator::type, keyboard::indicator> get_indicators(connection& conn, xcb_xkb_device_spec_t device); map<keyboard::indicator::type, keyboard::indicator> get_indicators(connection& conn, xcb_xkb_device_spec_t device);
string parse_layout_symbol(string&& name); string parse_layout_symbol(string&& name);
} } // namespace xkb_util
POLYBAR_NS_END POLYBAR_NS_END

View File

@ -1,12 +1,12 @@
#include "modules/xkeyboard.hpp" #include "modules/xkeyboard.hpp"
#include "drawtypes/iconset.hpp" #include "drawtypes/iconset.hpp"
#include "drawtypes/label.hpp" #include "drawtypes/label.hpp"
#include "modules/meta/base.inl"
#include "utils/factory.hpp" #include "utils/factory.hpp"
#include "x11/atoms.hpp" #include "x11/atoms.hpp"
#include "x11/connection.hpp" #include "x11/connection.hpp"
#include "modules/meta/base.inl"
POLYBAR_NS POLYBAR_NS
namespace modules { namespace modules {
@ -25,8 +25,6 @@ namespace modules {
*/ */
xkeyboard_module::xkeyboard_module(const bar_settings& bar, string name_) xkeyboard_module::xkeyboard_module(const bar_settings& bar, string name_)
: static_module<xkeyboard_module>(bar, move(name_)), m_connection(connection::make()) { : static_module<xkeyboard_module>(bar, move(name_)), m_connection(connection::make()) {
// Setup extension // Setup extension
// clang-format off // clang-format off
m_connection.xkb().select_events_checked(XCB_XKB_ID_USE_CORE_KBD, m_connection.xkb().select_events_checked(XCB_XKB_ID_USE_CORE_KBD,
@ -81,7 +79,7 @@ namespace modules {
m_indicator_icons_on = factory_util::shared<iconset>(); m_indicator_icons_on = factory_util::shared<iconset>();
auto icon_pair = string_util::tokenize(m_conf.get(name(), DEFAULT_INDICATOR_ICON, ""s), ';'); auto icon_pair = string_util::tokenize(m_conf.get(name(), DEFAULT_INDICATOR_ICON, ""s), ';');
if(icon_pair.size() == 2) { if (icon_pair.size() == 2) {
m_indicator_icons_off->add(DEFAULT_INDICATOR_ICON, factory_util::shared<label>(icon_pair[0])); m_indicator_icons_off->add(DEFAULT_INDICATOR_ICON, factory_util::shared<label>(icon_pair[0]));
m_indicator_icons_on->add(DEFAULT_INDICATOR_ICON, factory_util::shared<label>(icon_pair[1])); m_indicator_icons_on->add(DEFAULT_INDICATOR_ICON, factory_util::shared<label>(icon_pair[1]));
} else { } else {
@ -121,6 +119,7 @@ namespace modules {
if (m_layout) { if (m_layout) {
m_layout->reset_tokens(); m_layout->reset_tokens();
m_layout->replace_token("%name%", m_keyboard->group_name(m_keyboard->current())); m_layout->replace_token("%name%", m_keyboard->group_name(m_keyboard->current()));
m_layout->replace_token("%variant%", m_keyboard->variant_name(m_keyboard->current()));
auto const current_layout = m_keyboard->layout_name(m_keyboard->current()); auto const current_layout = m_keyboard->layout_name(m_keyboard->current());
auto icon = m_layout_icons->get(current_layout, DEFAULT_LAYOUT_ICON); auto icon = m_layout_icons->get(current_layout, DEFAULT_LAYOUT_ICON);
@ -141,9 +140,9 @@ namespace modules {
} }
auto indicator_on = m_keyboard->on(it); auto indicator_on = m_keyboard->on(it);
auto &indicator_labels = indicator_on ? m_indicator_on_labels : m_indicator_off_labels; auto& indicator_labels = indicator_on ? m_indicator_on_labels : m_indicator_off_labels;
auto &indicator_icons = indicator_on ? m_indicator_icons_on : m_indicator_icons_off; auto& indicator_icons = indicator_on ? m_indicator_icons_on : m_indicator_icons_off;
auto &indicator_state = indicator_on ? m_indicator_state_on : m_indicator_state_off; auto& indicator_state = indicator_on ? m_indicator_state_on : m_indicator_state_off;
label_t indicator; label_t indicator;
if (indicator_labels.find(it) != indicator_labels.end()) { if (indicator_labels.find(it) != indicator_labels.end()) {
@ -287,6 +286,6 @@ namespace modules {
update(); update();
} }
} }
} } // namespace modules
POLYBAR_NS_END POLYBAR_NS_END

View File

@ -64,6 +64,21 @@ const string keyboard::layout_name(size_t index) const {
return layouts[index].symbols[index]; return layouts[index].symbols[index];
} }
/**
* Get current variant name
* "GROUP (VARIANT)"
* ^^^^^^^
*/
const string keyboard::variant_name(size_t index) const {
string group_name = this->group_name(index);
if (int start = group_name.find('(') + 1) {
int num_chars = group_name.find(')') - start;
return group_name.substr(start, num_chars);
} else {
return "";
}
}
/** /**
* Get indicator name * Get indicator name
*/ */
@ -212,6 +227,6 @@ namespace xkb_util {
} }
return move(name); return move(name);
} }
} } // namespace xkb_util
POLYBAR_NS_END POLYBAR_NS_END