From 999547f794f7027bb493f5ccd12181e1c4032a61 Mon Sep 17 00:00:00 2001 From: Tobi-wan Kenobi Date: Sun, 11 Dec 2016 15:00:13 +0100 Subject: [PATCH] [modules/layout] Re-enable keyboard layout switcher Displays the current layout and allows switching to next/previous configured layout via mouse clicks. --- bumblebee/modules/layout.py | 71 +++++++++++++++++++++++++++++++++ themes/icons/awesome-fonts.json | 1 + 2 files changed, 72 insertions(+) create mode 100644 bumblebee/modules/layout.py diff --git a/bumblebee/modules/layout.py b/bumblebee/modules/layout.py new file mode 100644 index 0000000..cb4f87d --- /dev/null +++ b/bumblebee/modules/layout.py @@ -0,0 +1,71 @@ +# pylint: disable=C0111,R0903 + +"""Displays and changes the current keyboard layout + +Parameters: + * layout.lang: pipe-separated list of languages to cycle through (e.g. us|rs|de). Default: en +""" + +import bumblebee.util +import bumblebee.input +import bumblebee.output +import bumblebee.engine + +class Module(bumblebee.engine.Module): + def __init__(self, engine, config): + super(Module, self).__init__(engine, config, + bumblebee.output.Widget(full_text=self.layout) + ) + self._languages = self.parameter("lang", "us").split("|") + self._idx = 0 + + engine.input.register_callback(self, button=bumblebee.input.LEFT_MOUSE, + cmd=self._next_keymap) + engine.input.register_callback(self, button=bumblebee.input.RIGHT_MOUSE, + cmd=self._prev_keymap) + + def _next_keymap(self, event): + self._idx = (self._idx + 1) % len(self._languages) + self._set_keymap() + + def _prev_keymap(self, event): + self._idx = self._idx - 1 if self._idx > 0 else len(self._languages) - 1 + self._set_keymap() + + def _set_keymap(self): + tmp = self._languages[self._idx].split(":") + layout = tmp[0] + variant = "" + if len(tmp) > 1: + variant = "-variant {}".format(tmp[1]) + try: + bumblebee.util.execute("setxkbmap -layout {} {}".format(layout, variant)) + except RuntimeError: + pass + + def layout(self, widget): + try: + res = bumblebee.util.execute("setxkbmap -query") + except RuntimeError: + return "n/a" + layout = "" + variant = None + for line in res.split("\n"): + if not line: + continue + if "layout" in line: + layout = line.split(":")[1].strip() + if "variant" in line: + variant = line.split(":")[1].strip() + if variant: + layout += ":" + variant + + if layout in self._languages: + self._idx = self._languages.index(layout) + else: + self._languages.append(layout) + self._idx = len(self._languages) - 1 + + return layout + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 diff --git a/themes/icons/awesome-fonts.json b/themes/icons/awesome-fonts.json index b3784eb..664551f 100644 --- a/themes/icons/awesome-fonts.json +++ b/themes/icons/awesome-fonts.json @@ -11,6 +11,7 @@ "dnf": { "prefix": "" }, "brightness": { "prefix": "" }, "load": { "prefix": "" }, + "layout": { "prefix": "" }, "cmus": { "playing": { "prefix": "" }, "paused": { "prefix": "" },