Add support for i3 modes in segment_info for bar

also fix the bar-renderer's argument handling
This commit is contained in:
S0lll0s 2015-05-16 16:46:40 +02:00
parent 32a278b8a8
commit e8b502bb42
3 changed files with 41 additions and 45 deletions

View File

@ -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)

View File

@ -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),
)

View File

@ -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