From e8b502bb4216ece81243f37b44aee620aeb70a5a Mon Sep 17 00:00:00 2001 From: S0lll0s Date: Sat, 16 May 2015 16:46:40 +0200 Subject: [PATCH] Add support for i3 modes in segment_info for bar also fix the bar-renderer's argument handling --- powerline/bindings/bar/powerline-bar.py | 33 +++++++++-------- powerline/renderers/bar.py | 6 ++-- powerline/segments/i3wm.py | 47 +++++++++++-------------- 3 files changed, 41 insertions(+), 45 deletions(-) diff --git a/powerline/bindings/bar/powerline-bar.py b/powerline/bindings/bar/powerline-bar.py index 3e000da5..22cb6e61 100755 --- a/powerline/bindings/bar/powerline-bar.py +++ b/powerline/bindings/bar/powerline-bar.py @@ -20,17 +20,6 @@ class BarPowerline(Powerline): super(BarPowerline, self).init(ext='wm', renderer_module='bar') -def render(reschedule=False): - if reschedule: - Timer(0.5, render, kwargs={"reschedule": True}).start() - - global lock - with lock: - write(powerline.render()) - write('\n') - sys.stdout.flush() - - if __name__ == '__main__': parser = ArgumentParser(description='Powerline BAR bindings.') parser.add_argument( @@ -39,10 +28,24 @@ if __name__ == '__main__': ) args = parser.parse_args() powerline = BarPowerline() - lock = Lock() - + modes = [None] write = get_unicode_writer(encoding='utf-8') + + def render(reschedule=False): + if reschedule: + Timer(0.5, render, kwargs={"reschedule": True}).start() + + global lock + with lock: + write(powerline.render(mode=modes[0])) + write('\n') + sys.stdout.flush() + + def update(evt): + modes[0] = evt.change + render() + render(reschedule=True) if args.i3: @@ -54,8 +57,8 @@ if __name__ == '__main__': else: conn = i3ipc.Connection() conn.on('workspace::focus', lambda conn, evt: render()) - conn.on('mode', lambda conn, evt: render()) + conn.on('mode', lambda conn, evt: update(evt)) conn.main() while True: - time.sleep(0.5) + time.sleep(1e10) diff --git a/powerline/renderers/bar.py b/powerline/renderers/bar.py index 7e1e5d36..1a0684aa 100644 --- a/powerline/renderers/bar.py +++ b/powerline/renderers/bar.py @@ -35,10 +35,10 @@ class BarRenderer(Renderer): return text + contents + '%{F-B--u}' - def render(self): + def render(self, *args, **kwargs): return '%{{l}}{0}%{{r}}{1}'.format( - super(BarRenderer, self).render(side='left'), - super(BarRenderer, self).render(side='right'), + super(BarRenderer, self).render(side='left', *args, **kwargs), + super(BarRenderer, self).render(side='right', *args, **kwargs), ) diff --git a/powerline/segments/i3wm.py b/powerline/segments/i3wm.py index 87ecfdb8..b6c847f9 100644 --- a/powerline/segments/i3wm.py +++ b/powerline/segments/i3wm.py @@ -3,6 +3,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_funct from threading import Thread +from powerline.theme import requires_segment_info from powerline.segments import Segment, with_docstring @@ -25,9 +26,14 @@ def calcgrp(w): return group -def workspaces(pl, strip=0): +def workspaces(pl, only_show=None, strip=0): '''Return list of used workspaces + :param list only_show: + Specifies which workspaces to show. + Valid entries are "visible", "urgent" and "focused". + If omitted or ``null`` all workspaces are shown. + :param int strip: Specifies how many characters from the front of each workspace name should be stripped (e.g. to remove workspace numbers). Defaults to zero. @@ -40,33 +46,20 @@ def workspaces(pl, strip=0): return [{ 'contents': w['name'][min(len(w['name']),strip):], 'highlight_groups': calcgrp(w) - } for w in conn.get_workspaces()] - -class ModeSegment(Segment): - def startup(self, pl, shutdown_event): - self.mode = 'default' - - def callback(conn, e): - self.mode = e.change - - conn = i3ipc.Connection() - conn.on('mode', callback) - self.thread = Thread(target=conn.main) - self.thread.daemon = True - self.thread.start() - - def __call__(self, pl, default=None): - if self.mode == 'default': - return default - return self.mode + } for w in conn.get_workspaces() if not only_show or any(w[typ] for typ in only_show)] -mode = with_docstring(ModeSegment(), -'''Returns the current i3 mode +@requires_segment_info +def mode(pl, segment_info, names={"default": None}): + '''Returns current i3 mode -:param str default: - Specifies the name to be displayed instead of "default". - By default the segment is left out in the default mode. + :param dict names: + Specifies the string to show for various modes. + Use ``null`` to hide a mode (``default`` is hidden by default). -Highligh groups used: ``mode`` -''') + Highligh groups used: ``mode`` + ''' + mode = segment_info['mode'] + if mode in names: + return names[mode] + return mode