Merge pull request #1431 from S0lll0s/develop
Rename bar (bar-aint-recursive) to lemonbar
This commit is contained in:
commit
63af1456b4
|
@ -187,6 +187,10 @@ Common configuration is a subdictionary that is a value of ``ext`` key in
|
|||
``out`` and ``rewrite`` prompts (refer to IPython documentation for more
|
||||
details) while ``in`` prompt is the default.
|
||||
|
||||
For wm (:ref:`lemonbar <lemonbar-usage>` only) it is a dictionary
|
||||
``{output : theme_name}`` that maps the ``xrandr`` output names to the
|
||||
local themes to use on that output.
|
||||
|
||||
``components``
|
||||
Determines which extension components should be enabled. This key is highly
|
||||
extension-specific, here is the table of extensions and corresponding
|
||||
|
|
|
@ -6,6 +6,7 @@ import re
|
|||
import codecs
|
||||
|
||||
from collections import namedtuple
|
||||
from argparse import REMAINDER
|
||||
|
||||
from functools import reduce
|
||||
|
||||
|
@ -61,9 +62,9 @@ def parse_argument(*args, **kwargs):
|
|||
is_option = args[0].startswith('-')
|
||||
is_long_option = args[0].startswith('--')
|
||||
is_short_option = is_option and not is_long_option
|
||||
action = kwargs.get('action', 'store_true')
|
||||
multi = kwargs.get('action') in ('append',)
|
||||
nargs = kwargs.get('nargs') or (1 if kwargs.get('metavar') or action in ('append',) else 0)
|
||||
action = kwargs.get('action', 'store')
|
||||
multi = kwargs.get('action') in ('append',) or kwargs.get('nargs') is REMAINDER
|
||||
nargs = kwargs.get('nargs', (1 if action in ('append', 'store') else 0))
|
||||
return Argument(
|
||||
names=args,
|
||||
help=u(kwargs.get('help', '')),
|
||||
|
@ -165,9 +166,20 @@ def format_usage_arguments(arguments, base_length=None):
|
|||
# `--` is automatically transformed into – (EN DASH)
|
||||
# when parsing into HTML. We do not need this.
|
||||
line[-1] += [nodes.Text(char) for char in name]
|
||||
elif argument.nargs is REMAINDER:
|
||||
line.append(nodes.Text('['))
|
||||
line.append(nodes.strong())
|
||||
line[-1] += [nodes.Text(char) for char in '--']
|
||||
line.append(nodes.Text('] '))
|
||||
if argument.nargs:
|
||||
assert(argument.nargs in (1, '?'))
|
||||
with SurroundWith(line, argument.nargs == '?' and argument.is_option):
|
||||
assert(argument.nargs in (1, '?', REMAINDER))
|
||||
with SurroundWith(
|
||||
line, (
|
||||
True
|
||||
if argument.nargs is REMAINDER
|
||||
else (argument.nargs == '?' and argument.is_option)
|
||||
)
|
||||
):
|
||||
if argument.is_long_option:
|
||||
line.append(nodes.Text('='))
|
||||
line.append(nodes.emphasis(text=argument.metavar))
|
||||
|
@ -337,15 +349,21 @@ class AutoManParser(object):
|
|||
class AutoMan(Directive):
|
||||
required_arguments = 1
|
||||
optional_arguments = 0
|
||||
option_spec = dict(prog=unchanged_required)
|
||||
option_spec = dict(prog=unchanged_required, minimal=bool)
|
||||
has_content = False
|
||||
|
||||
def run(self):
|
||||
minimal = self.options.get('minimal')
|
||||
module = self.arguments[0]
|
||||
template_args = {}
|
||||
template_args.update(get_authors())
|
||||
get_argparser = __import__(str(module), fromlist=[str('get_argparser')]).get_argparser
|
||||
parser = get_argparser(AutoManParser)
|
||||
if minimal:
|
||||
container = nodes.container()
|
||||
container += parser.automan_usage(self.options['prog'])
|
||||
container += parser.automan_description()
|
||||
return [container]
|
||||
synopsis_section = nodes.section(
|
||||
'',
|
||||
nodes.title(text='Synopsis'),
|
||||
|
|
|
@ -50,26 +50,35 @@ Add the following to :file:`~/.config/qtile/config.py`:
|
|||
),
|
||||
]
|
||||
|
||||
.. _bar-usage:
|
||||
.. _lemonbar-usage:
|
||||
|
||||
bar-aint-recursive
|
||||
==================
|
||||
lemonbar (formerly bar-aint-recursive)
|
||||
======================================
|
||||
|
||||
To run the bar simply pipe the output of the binding script into ``bar`` and
|
||||
specify appropriate options, for example like this::
|
||||
To run the bar simply start the binding script:
|
||||
|
||||
python /path/to/powerline/bindings/bar/powerline-bar.py | bar
|
||||
python /path/to/powerline/bindings/lemonbar/powerline-lemonbar.py
|
||||
|
||||
to run with i3, simply ``exec`` this in i3 config file::
|
||||
You can specify options to be passed to ``lemonbar`` after ``--``, like so:
|
||||
|
||||
exec python /path/to/powerline/bindings/bar/powerline-bar.py --i3 | bar
|
||||
python /path/to/powerline/bindings/lemonbar/powerline-lemonbar.py --height 16 -- -f "Source Code Pro for Powerline-9"
|
||||
|
||||
to run with i3, simply ``exec`` this in the i3 config file and set the ``--i3`` switch:
|
||||
|
||||
exec python /path/to/powerline/bindings/lemonbar/powerline-lemonbar.py --i3
|
||||
|
||||
Running the binding in i3-mode will require `i3ipc <https://github.com/acrisci/i3ipc-python>`_
|
||||
(or the outdated `i3-py <https://github.com/ziberna/i3-py>`_).
|
||||
|
||||
See the `bar documentation <https://github.com/LemonBoy/bar>`_ for more
|
||||
See the `lemonbar documentation <https://github.com/LemonBoy/bar>`_ for more
|
||||
information and options.
|
||||
|
||||
All ``powerline-lemonbar.py`` arguments:
|
||||
|
||||
.. automan:: powerline.commands.lemonbar
|
||||
:prog: powerline-lemonbar.py
|
||||
:minimal: true
|
||||
|
||||
I3 bar
|
||||
======
|
||||
|
||||
|
|
|
@ -2,31 +2,27 @@
|
|||
# vim:fileencoding=utf-8:noet
|
||||
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
from threading import Lock, Timer
|
||||
from argparse import ArgumentParser
|
||||
|
||||
from powerline import Powerline
|
||||
from powerline.lemonbar import LemonbarPowerline
|
||||
from powerline.lib.encoding import get_unicode_writer
|
||||
|
||||
|
||||
class BarPowerline(Powerline):
|
||||
get_encoding = staticmethod(lambda: 'utf-8')
|
||||
|
||||
def init(self):
|
||||
super(BarPowerline, self).init(ext='wm', renderer_module='bar')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = ArgumentParser(description='Powerline BAR bindings.')
|
||||
parser = ArgumentParser(description='Powerline lemonbar bindings.')
|
||||
parser.add_argument(
|
||||
'--i3', action='store_true',
|
||||
help='Subscribe for i3 events.'
|
||||
)
|
||||
args = parser.parse_args()
|
||||
powerline = BarPowerline()
|
||||
powerline = LemonbarPowerline()
|
||||
powerline.update_renderer()
|
||||
powerline.pl.warn("The 'bar' bindings are deprecated, please switch to 'lemonbar'")
|
||||
lock = Lock()
|
||||
modes = ['default']
|
||||
write = get_unicode_writer(encoding='utf-8')
|
||||
|
@ -60,4 +56,4 @@ if __name__ == '__main__':
|
|||
conn.main()
|
||||
|
||||
while True:
|
||||
time.sleep(1e10)
|
||||
time.sleep(1e8)
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
#!/usr/bin/env python
|
||||
# vim:fileencoding=utf-8:noet
|
||||
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
||||
|
||||
import time
|
||||
import re
|
||||
import subprocess
|
||||
|
||||
from threading import Lock, Timer
|
||||
|
||||
from powerline.lemonbar import LemonbarPowerline
|
||||
from powerline.lib.shell import run_cmd
|
||||
from powerline.commands.lemonbar import get_argparser
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = get_argparser()
|
||||
args = parser.parse_args()
|
||||
|
||||
powerline = LemonbarPowerline()
|
||||
powerline.update_renderer()
|
||||
bars = []
|
||||
active_screens = [match.groupdict() for match in re.finditer(
|
||||
'^(?P<name>[0-9A-Za-z-]+) connected (?P<width>\d+)x(?P<height>\d+)\+(?P<x>\d+)\+(?P<y>\d+)',
|
||||
run_cmd(powerline.pl, ['xrandr', '-q']),
|
||||
re.MULTILINE
|
||||
)]
|
||||
|
||||
for screen in active_screens:
|
||||
command = [args.bar_command, '-g', '{0}x{1}+{2}'.format(screen['width'], args.height, screen['x'])] + args.args[1:]
|
||||
process = subprocess.Popen(command, stdin=subprocess.PIPE)
|
||||
bars.append((screen['name'], process, int(screen['width']) / 5))
|
||||
|
||||
lock = Lock()
|
||||
modes = ['default']
|
||||
|
||||
def render(reschedule=False):
|
||||
if reschedule:
|
||||
Timer(args.interval, render, kwargs={'reschedule': True}).start()
|
||||
|
||||
global lock
|
||||
with lock:
|
||||
for output, process, width in bars:
|
||||
process.stdin.write(powerline.render(mode=modes[0], width=width, matcher_info=output).encode('utf-8') + b'\n')
|
||||
process.stdin.flush()
|
||||
|
||||
def update(evt):
|
||||
modes[0] = evt.change
|
||||
render()
|
||||
|
||||
render(reschedule=True)
|
||||
|
||||
if args.i3:
|
||||
try:
|
||||
import i3ipc
|
||||
except ImportError:
|
||||
import i3
|
||||
i3.Subscription(lambda evt, data, sub: render(), 'workspace')
|
||||
else:
|
||||
conn = i3ipc.Connection()
|
||||
conn.on('workspace::focus', lambda conn, evt: render())
|
||||
conn.on('mode', lambda conn, evt: update(evt))
|
||||
conn.main()
|
||||
|
||||
while True:
|
||||
time.sleep(1e8)
|
|
@ -0,0 +1,35 @@
|
|||
# vim:fileencoding=utf-8:noet
|
||||
# WARNING: using unicode_literals causes errors in argparse
|
||||
from __future__ import (division, absolute_import, print_function)
|
||||
|
||||
import argparse
|
||||
|
||||
|
||||
def get_argparser(ArgumentParser=argparse.ArgumentParser):
|
||||
parser = ArgumentParser(
|
||||
description='Powerline BAR bindings.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--i3', action='store_true',
|
||||
help='Subscribe for i3 events.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--height', default='',
|
||||
metavar='PIXELS', help='Bar height.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--interval', '-i',
|
||||
type=float, default=0.5,
|
||||
metavar='SECONDS', help='Refresh interval.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--bar-command', '-C',
|
||||
default='lemonbar',
|
||||
metavar='CMD', help='Name of the lemonbar executable to use.'
|
||||
)
|
||||
parser.add_argument(
|
||||
'args', nargs=argparse.REMAINDER,
|
||||
help='Extra arguments for lemonbar. Should be preceded with ``--`` '
|
||||
'argument in order not to be confused with script own arguments.'
|
||||
)
|
||||
return parser
|
|
@ -0,0 +1,21 @@
|
|||
# vim:fileencoding=utf-8:noet
|
||||
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
||||
|
||||
from powerline import Powerline
|
||||
from powerline.lib.dict import mergedicts
|
||||
|
||||
|
||||
class LemonbarPowerline(Powerline):
|
||||
def init(self):
|
||||
super(LemonbarPowerline, self).init(ext='wm', renderer_module='lemonbar')
|
||||
|
||||
get_encoding = staticmethod(lambda: 'utf-8')
|
||||
|
||||
def get_local_themes(self, local_themes):
|
||||
if not local_themes:
|
||||
return {}
|
||||
|
||||
return dict((
|
||||
(key, {'config': self.load_theme_config(val)})
|
||||
for key, val in local_themes.items()
|
||||
))
|
|
@ -126,6 +126,12 @@ main_spec = (Spec(
|
|||
select=ext_theme_spec(),
|
||||
),
|
||||
).optional(),
|
||||
wm=ext_spec().update(
|
||||
local_themes=Spec().unknown_spec(
|
||||
Spec().re('^[0-9A-Za-z-]+$'),
|
||||
ext_theme_spec()
|
||||
).optional()
|
||||
).optional(),
|
||||
).unknown_spec(
|
||||
check_ext,
|
||||
ext_spec(),
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
# vim:fileencoding=utf-8:noet
|
||||
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
||||
|
||||
from powerline.renderer import Renderer
|
||||
from powerline.colorscheme import ATTR_UNDERLINE
|
||||
|
||||
|
||||
class BarRenderer(Renderer):
|
||||
'''bar (bar ain't recursive) renderer
|
||||
|
||||
|
||||
See documentation of `bar <https://github.com/LemonBoy/bar>`_ and :ref:`the usage instructions <bar-usage>`
|
||||
'''
|
||||
|
||||
character_translations = Renderer.character_translations.copy()
|
||||
character_translations[ord('%')] = '%%'
|
||||
|
||||
@staticmethod
|
||||
def hlstyle(*args, **kwargs):
|
||||
# We don’t need to explicitly reset attributes, so skip those calls
|
||||
return ''
|
||||
|
||||
def hl(self, contents, fg=None, bg=None, attrs=None):
|
||||
text = ''
|
||||
|
||||
if fg is not None:
|
||||
if fg is not False and fg[1] is not False:
|
||||
text += '%{{F#ff{0:06x}}}'.format(fg[1])
|
||||
if bg is not None:
|
||||
if bg is not False and bg[1] is not False:
|
||||
text += '%{{B#ff{0:06x}}}'.format(bg[1])
|
||||
|
||||
if attrs & ATTR_UNDERLINE:
|
||||
text += '%{+u}'
|
||||
|
||||
return text + contents + '%{F-B--u}'
|
||||
|
||||
def render(self, *args, **kwargs):
|
||||
return '%{{l}}{0}%{{r}}{1}'.format(
|
||||
super(BarRenderer, self).render(side='left', *args, **kwargs),
|
||||
super(BarRenderer, self).render(side='right', *args, **kwargs),
|
||||
)
|
||||
|
||||
|
||||
renderer = BarRenderer
|
|
@ -0,0 +1,61 @@
|
|||
# vim:fileencoding=utf-8:noet
|
||||
from __future__ import (unicode_literals, division, absolute_import, print_function)
|
||||
|
||||
from powerline.renderer import Renderer
|
||||
from powerline.theme import Theme
|
||||
from powerline.colorscheme import ATTR_UNDERLINE
|
||||
|
||||
|
||||
class LemonbarRenderer(Renderer):
|
||||
'''lemonbar (formerly bar/bar ain't recursive) renderer
|
||||
|
||||
|
||||
See documentation of `lemonbar <https://github.com/LemonBoy/bar>`_ and :ref:`the usage instructions <lemonbar-usage>`
|
||||
'''
|
||||
|
||||
character_translations = Renderer.character_translations.copy()
|
||||
character_translations[ord('%')] = '%%{}'
|
||||
|
||||
@staticmethod
|
||||
def hlstyle(*args, **kwargs):
|
||||
# We don’t need to explicitly reset attributes, so skip those calls
|
||||
return ''
|
||||
|
||||
def hl(self, contents, fg=None, bg=None, attrs=None):
|
||||
text = ''
|
||||
|
||||
if fg is not None:
|
||||
if fg is not False and fg[1] is not False:
|
||||
text += '%{{F#ff{0:06x}}}'.format(fg[1])
|
||||
if bg is not None:
|
||||
if bg is not False and bg[1] is not False:
|
||||
text += '%{{B#ff{0:06x}}}'.format(bg[1])
|
||||
|
||||
if attrs & ATTR_UNDERLINE:
|
||||
text += '%{+u}'
|
||||
|
||||
return text + contents + '%{F-B--u}'
|
||||
|
||||
def render(self, *args, **kwargs):
|
||||
return '%{{l}}{0}%{{r}}{1}'.format(
|
||||
super(LemonbarRenderer, self).render(side='left', segment_info={'output': kwargs.get('matcher_info')}, *args, **kwargs),
|
||||
super(LemonbarRenderer, self).render(side='right', segment_info={'output': kwargs.get('matcher_info')}, *args, **kwargs),
|
||||
)
|
||||
|
||||
def get_theme(self, matcher_info):
|
||||
if not matcher_info or matcher_info not in self.local_themes:
|
||||
return self.theme
|
||||
match = self.local_themes[matcher_info]
|
||||
|
||||
try:
|
||||
return match['theme']
|
||||
except KeyError:
|
||||
match['theme'] = Theme(
|
||||
theme_config=match['config'],
|
||||
main_theme_config=self.theme_config,
|
||||
**self.theme_kwargs
|
||||
)
|
||||
return match['theme']
|
||||
|
||||
|
||||
renderer = LemonbarRenderer
|
|
@ -19,7 +19,8 @@ def calcgrp(w):
|
|||
return group
|
||||
|
||||
|
||||
def workspaces(pl, only_show=None, output=None, strip=0):
|
||||
@requires_segment_info
|
||||
def workspaces(pl, segment_info, only_show=None, output=None, strip=0):
|
||||
'''Return list of used workspaces
|
||||
|
||||
:param list only_show:
|
||||
|
@ -28,7 +29,9 @@ def workspaces(pl, only_show=None, output=None, strip=0):
|
|||
are shown.
|
||||
|
||||
:param str output:
|
||||
If specified, only workspaces on this output are shown.
|
||||
May be set to the name of an X output. If specified, only workspaces
|
||||
on that output are shown. Overrides automatic output detection by
|
||||
the lemonbar renderer and bindings.
|
||||
|
||||
:param int strip:
|
||||
Specifies how many characters from the front of each workspace name
|
||||
|
@ -45,6 +48,8 @@ def workspaces(pl, only_show=None, output=None, strip=0):
|
|||
else:
|
||||
conn = i3ipc.Connection()
|
||||
|
||||
output = output or segment_info.get('output')
|
||||
|
||||
return [{
|
||||
'contents': w['name'][min(len(w['name']), strip):],
|
||||
'highlight_groups': calcgrp(w)
|
||||
|
|
|
@ -18,7 +18,9 @@ exit_suite() {
|
|||
echo "${FAIL_SUMMARY}"
|
||||
fi
|
||||
export POWERLINE_CURRENT_SUITE="${POWERLINE_CURRENT_SUITE%/*}"
|
||||
exit $FAILED
|
||||
if test "x$1" != "x--continue" ; then
|
||||
exit $FAILED
|
||||
fi
|
||||
}
|
||||
|
||||
fail() {
|
||||
|
|
|
@ -0,0 +1,201 @@
|
|||
#!/bin/sh
|
||||
. tests/common.sh
|
||||
|
||||
enter_suite bar
|
||||
|
||||
TEST_ROOT="$ROOT/tests/bar"
|
||||
TEST_PATH="$TEST_ROOT/path"
|
||||
TEST_STATIC_ROOT="$ROOT/tests/test_bar"
|
||||
|
||||
test -d "$TEST_ROOT" && rm -r "$TEST_ROOT"
|
||||
mkdir "$TEST_ROOT"
|
||||
cp -r "$TEST_STATIC_ROOT/path" "$TEST_ROOT"
|
||||
cp -r "$TEST_STATIC_ROOT/powerline" "$TEST_ROOT"
|
||||
|
||||
export PYTHONPATH="$ROOT${PYTHONPATH:+:}$PYTHONPATH"
|
||||
|
||||
ln -s "$(which "${PYTHON}")" "$TEST_PATH"/python
|
||||
ln -s "$(which sed)" "$TEST_PATH"
|
||||
ln -s "$(which cat)" "$TEST_PATH"
|
||||
ln -s "$(which mkdir)" "$TEST_PATH"
|
||||
ln -s "$(which basename)" "$TEST_PATH"
|
||||
ln -s "$TEST_PATH/lemonbar" "$TEST_PATH/bar-aint-recursive"
|
||||
|
||||
DEPRECATED_SCRIPT="$ROOT/powerline/bindings/bar/powerline-bar.py"
|
||||
|
||||
run() {
|
||||
env -i \
|
||||
LANG=C \
|
||||
PATH="$TEST_PATH" \
|
||||
XDG_CONFIG_HOME="$TEST_ROOT" \
|
||||
XDG_CONFIG_DIRS="$TEST_ROOT/dummy" \
|
||||
PYTHONPATH="$PYTHONPATH" \
|
||||
TEST_ROOT="$TEST_ROOT" \
|
||||
LD_LIBRARY_PATH="$LD_LIBRARY_PATH" \
|
||||
"$@" || true
|
||||
}
|
||||
|
||||
display_log() {
|
||||
local log_file="$1"
|
||||
echo "$log_file:"
|
||||
echo '============================================================'
|
||||
cat -v "$log_file"
|
||||
echo
|
||||
echo '____________________________________________________________'
|
||||
}
|
||||
|
||||
check_log() {
|
||||
local log_file="$1"
|
||||
local text="$2"
|
||||
local warns="$3"
|
||||
if test "$warns" = "warns" ; then
|
||||
local warning="$(head -n1 "$log_file" | sed 's/.*://')"
|
||||
local expwarning="The 'bar' bindings are deprecated, please switch to 'lemonbar'"
|
||||
if test "x$warning" != "x$expwarning" ; then
|
||||
echo "Got: $warning"
|
||||
echo "Exp: $expwarning"
|
||||
fail "warn" F "Expected warning"
|
||||
fi
|
||||
sed -r -i -e '1d' "$log_file"
|
||||
fi
|
||||
local line="$(head -n1 "$log_file")"
|
||||
local linenum="$(cat "$log_file" | wc -l)"
|
||||
if test $linenum -lt 5 ; then
|
||||
fail "log:lt" F "Script was run not enough times"
|
||||
return 1
|
||||
elif test $linenum -gt 15 ; then
|
||||
fail "log:gt" E "Script was run too many times"
|
||||
return 1
|
||||
fi
|
||||
local expline="%{l}%{F#ffd0d0d0}%{B#ff303030} $text-left %{F-B--u}%{F#ff303030} %{F-B--u}%{r}%{F#ff303030} %{F-B--u}%{F#ffd0d0d0}%{B#ff303030} $text-right %{F-B--u}"
|
||||
if test "x$expline" != "x$line" ; then
|
||||
echo "Line: '$line'"
|
||||
echo "Expected: '$expline'"
|
||||
fail "log:line" F "Unexpected line"
|
||||
return 1
|
||||
fi
|
||||
local ret=0
|
||||
while test $linenum -gt 0 ; do
|
||||
echo "$line" >> "$TEST_ROOT/ok"
|
||||
linenum=$(( linenum - 1 ))
|
||||
done
|
||||
if ! diff "$TEST_ROOT/ok" "$log_file" ; then
|
||||
fail "log:diff" F "Unexpected output"
|
||||
ret=1
|
||||
fi
|
||||
rm "$TEST_ROOT/ok"
|
||||
return $ret
|
||||
}
|
||||
|
||||
killscript() {
|
||||
kill -KILL $1 || true
|
||||
}
|
||||
|
||||
if ! test -e "$DEPRECATED_SCRIPT" ; then
|
||||
# TODO: uncomment when skip is available
|
||||
# skip "deprecated" "Missing deprecated bar bindings script"
|
||||
:
|
||||
else
|
||||
enter_suite "deprecated"
|
||||
run python "$DEPRECATED_SCRIPT" $args > "$TEST_ROOT/deprecated.log" 2>&1 &
|
||||
SPID=$!
|
||||
sleep 5
|
||||
killscript $SPID
|
||||
if ! check_log "$TEST_ROOT/deprecated.log" "default" warns ; then
|
||||
display_log "$TEST_ROOT/deprecated.log"
|
||||
fail "log" F "Checking log failed"
|
||||
fi
|
||||
rm "$TEST_ROOT/deprecated.log"
|
||||
exit_suite --continue
|
||||
fi
|
||||
|
||||
LEMONBAR_SCRIPT="$ROOT/powerline/bindings/lemonbar/powerline-lemonbar.py"
|
||||
|
||||
if ! test -e "$LEMONBAR_SCRIPT" ; then
|
||||
# TODO: uncomment when skip is available
|
||||
# skip "lemonbar" "Missing lemonbar bindings script"
|
||||
:
|
||||
else
|
||||
enter_suite "lemonbar"
|
||||
for args in "" "-i0.5" "--interval=0.5" "-- test args" "--bar-command bar-aint-recursive" "--height=10"; do
|
||||
rm -rf "$TEST_ROOT/results"
|
||||
run python "$LEMONBAR_SCRIPT" $args > "$TEST_ROOT/lemonbar.log" 2>&1 &
|
||||
SPID=$!
|
||||
sleep 5
|
||||
killscript $SPID
|
||||
sleep 0.5
|
||||
enter_suite "args($args)"
|
||||
fnum=0
|
||||
for file in "$TEST_ROOT/results"/*.log ; do
|
||||
if ! test -e "$file" ; then
|
||||
fail "log" E "Log file is missing"
|
||||
break
|
||||
fi
|
||||
fnum=$(( fnum + 1 ))
|
||||
args_file="${file%.log}.args"
|
||||
if ! test -e "$args_file" ; then
|
||||
fail "args" E "$args_file is missing"
|
||||
else
|
||||
cat "$args_file" >> "$TEST_ROOT/args.log"
|
||||
fi
|
||||
text="dvi"
|
||||
if cat "$args_file" | grep -q +1 ; then
|
||||
text="default"
|
||||
fi
|
||||
if ! check_log "$file" "$text" ; then
|
||||
display_log "$file"
|
||||
fail "log" F "Checking log failed"
|
||||
fi
|
||||
rm "$file"
|
||||
done
|
||||
if test "$fnum" -ne 2 ; then
|
||||
fail "fnum" F "Expected two output files"
|
||||
fi
|
||||
if test "x${args#--height}" != "x$args" ; then
|
||||
height="${args#--height}"
|
||||
height="${height# }"
|
||||
height="${height#=}"
|
||||
height="${height%% *}"
|
||||
fi
|
||||
command="lemonbar"
|
||||
if test "x${args#--bar-command}" != "x$args" ; then
|
||||
command="${args#--bar-command}"
|
||||
command="${command# }"
|
||||
command="${command#=}"
|
||||
command="${command%% *}"
|
||||
fi
|
||||
received_args="$(cat "$TEST_ROOT/args.log" | sort)"
|
||||
rm "$TEST_ROOT/args.log"
|
||||
script_args="${args#*-- }"
|
||||
script_args="${script_args# }"
|
||||
if test "x${script_args}" '=' "x$args" ; then
|
||||
script_args=
|
||||
fi
|
||||
expected_args="$command -g 1920x$height+0${script_args:+ }$script_args${NL}$command -g 1920x$height+1${script_args:+ }$script_args"
|
||||
if test "x$expected_args" != "x$received_args" ; then
|
||||
echo "args:${NL}<$received_args>"
|
||||
echo "expected:${NL}<$expected_args>"
|
||||
fail "args" F "Expected different args"
|
||||
fi
|
||||
if ! test -z "$(cat "$TEST_ROOT/lemonbar.log")" ; then
|
||||
display_log "$TEST_ROOT/lemonbar.log"
|
||||
fail "stderr" E "Unexpected script output"
|
||||
fi
|
||||
rm "$TEST_ROOT/lemonbar.log"
|
||||
exit_suite --continue
|
||||
done
|
||||
exit_suite --continue
|
||||
fi
|
||||
|
||||
if ! powerline-lint \
|
||||
-p "$ROOT/powerline/config_files" \
|
||||
-p "$TEST_STATIC_ROOT/powerline"
|
||||
then
|
||||
fail "lint" F "Checking test config failed"
|
||||
fi
|
||||
|
||||
if test $FAILED -eq 0 ; then
|
||||
rm -r "$TEST_ROOT"
|
||||
fi
|
||||
|
||||
exit_suite
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/sh
|
||||
|
||||
RES_DIR="$TEST_ROOT/results"
|
||||
mkdir -p "$RES_DIR"
|
||||
RES_FILE="$RES_DIR/$$"
|
||||
while test -e "$RES_FILE.log" ; do
|
||||
RES_FILE="$RES_FILE.${RANDOM:-`date +%N | sed s/^0*//`}"
|
||||
done
|
||||
|
||||
echo $(basename $0) "$@" > "$RES_FILE.args"
|
||||
cat > "$RES_FILE.log"
|
|
@ -0,0 +1,31 @@
|
|||
#!/bin/sh
|
||||
|
||||
cat << EOF
|
||||
Screen 0: minimum 8 x 8, current 1920 x 1200, maximum 16384 x 16384
|
||||
DVI-I-0 disconnected (normal left inverted right x axis y axis)
|
||||
VGA-0 connected 1920x1200+1+0 (normal left inverted right x axis y axis) 520mm x 330mm
|
||||
1920x1200 59.95*+
|
||||
1920x1080 60.00
|
||||
1680x1050 59.95
|
||||
1600x1200 60.00
|
||||
1440x900 59.89
|
||||
1280x1024 75.02 60.02
|
||||
1280x800 59.81
|
||||
1152x864 75.00
|
||||
1024x768 75.03 60.00
|
||||
800x600 75.00 60.32
|
||||
640x480 75.00 59.94
|
||||
DVI-I-1 connected 1920x1200+0+0 (normal left inverted right x axis y axis) 520mm x 330mm
|
||||
1920x1200 59.95*+
|
||||
1920x1080 60.00
|
||||
1680x1050 59.95
|
||||
1600x1200 60.00
|
||||
1440x900 59.89
|
||||
1280x1024 75.02 60.02
|
||||
1280x800 59.81
|
||||
1152x864 75.00
|
||||
1024x768 75.03 60.00
|
||||
800x600 75.00 60.32
|
||||
640x480 75.00 59.94
|
||||
HDMI-0 disconnected (normal left inverted right x axis y axis)
|
||||
EOF
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"ext": {
|
||||
"wm": {
|
||||
"local_themes": {
|
||||
"DVI-I-1": "dvi"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"segments": {
|
||||
"left": [
|
||||
{
|
||||
"type": "string",
|
||||
"highlight_groups": ["time"],
|
||||
"contents": "default-left"
|
||||
}
|
||||
],
|
||||
"right": [
|
||||
{
|
||||
"type": "string",
|
||||
"highlight_groups": ["time"],
|
||||
"contents": "default-right"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"segments": {
|
||||
"left": [
|
||||
{
|
||||
"type": "string",
|
||||
"highlight_groups": ["time"],
|
||||
"contents": "dvi-left"
|
||||
}
|
||||
],
|
||||
"right": [
|
||||
{
|
||||
"type": "string",
|
||||
"highlight_groups": ["time"],
|
||||
"contents": "dvi-right"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -825,28 +825,28 @@ class TestVim(TestCase):
|
|||
sys.path.pop(0)
|
||||
|
||||
|
||||
class TestBar(TestRender):
|
||||
def test_bar(self):
|
||||
class TestLemonbar(TestRender):
|
||||
def test_lemonbar(self):
|
||||
import powerline as powerline_module
|
||||
with swap_attributes(config, powerline_module):
|
||||
with get_powerline_raw(config, powerline_module.Powerline, replace_gcp=True, ext='wm', renderer_module='bar') as powerline:
|
||||
with get_powerline_raw(config, powerline_module.Powerline, replace_gcp=True, ext='wm', renderer_module='lemonbar') as powerline:
|
||||
self.assertRenderEqual(
|
||||
powerline,
|
||||
'%{l}%{F#ffc00000}%{B#ff008000}%{+u} A%{F-B--u}%{F#ff008000}%{B#ffc00000}>>%{F-B--u}%{F#ff008000}%{B#ffc00000}B%{F-B--u}%{F#ffc00000}>>%{F-B--u}%{r}%{F#ffc00000}<<%{F-B--u}%{F#ff804000}%{B#ffc00000}%{+u}C%{F-B--u}%{F#ff0000c0}%{B#ffc00000}<<%{F-B--u}%{F#ff008000}%{B#ff0000c0}D %{F-B--u}'
|
||||
)
|
||||
|
||||
@with_new_config
|
||||
def test_bar_escape(self, config):
|
||||
def test_lemonbar_escape(self, config):
|
||||
import powerline as powerline_module
|
||||
config['themes/wm/default']['segments']['left'] = (
|
||||
highlighted_string('%{asd}', 'hl1'),
|
||||
highlighted_string('10% %', 'hl2'),
|
||||
)
|
||||
with swap_attributes(config, powerline_module):
|
||||
with get_powerline_raw(config, powerline_module.Powerline, replace_gcp=True, ext='wm', renderer_module='bar') as powerline:
|
||||
with get_powerline_raw(config, powerline_module.Powerline, replace_gcp=True, ext='wm', renderer_module='lemonbar') as powerline:
|
||||
self.assertRenderEqual(
|
||||
powerline,
|
||||
'%{l}%{F#ffc00000}%{B#ff008000}%{+u} %%{asd}%{F-B--u}%{F#ff008000}%{B#ffc00000}>>%{F-B--u}%{F#ff008000}%{B#ffc00000}10%% %%%{F-B--u}%{F#ffc00000}>>%{F-B--u}%{r}%{F#ffc00000}<<%{F-B--u}%{F#ff804000}%{B#ffc00000}%{+u}C%{F-B--u}%{F#ff0000c0}%{B#ffc00000}<<%{F-B--u}%{F#ff008000}%{B#ff0000c0}D %{F-B--u}'
|
||||
'%{l}%{F#ffc00000}%{B#ff008000}%{+u} %%{}{asd}%{F-B--u}%{F#ff008000}%{B#ffc00000}>>%{F-B--u}%{F#ff008000}%{B#ffc00000}10%%{} %%{}%{F-B--u}%{F#ffc00000}>>%{F-B--u}%{r}%{F#ffc00000}<<%{F-B--u}%{F#ff804000}%{B#ffc00000}%{+u}C%{F-B--u}%{F#ff0000c0}%{B#ffc00000}<<%{F-B--u}%{F#ff008000}%{B#ff0000c0}D %{F-B--u}'
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -891,39 +891,48 @@ class TestI3WM(TestCase):
|
|||
{'name': '3: w3', 'output': 'HDMI1', 'focused': False, 'urgent': True, 'visible': True},
|
||||
{'name': '4: w4', 'output': 'DVI01', 'focused': True, 'urgent': True, 'visible': True},
|
||||
]))):
|
||||
self.assertEqual(i3wm.workspaces(pl=pl), [
|
||||
segment_info = {}
|
||||
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info), [
|
||||
{'contents': '1: w1', 'highlight_groups': ['workspace']},
|
||||
{'contents': '2: w2', 'highlight_groups': ['w_visible', 'workspace']},
|
||||
{'contents': '3: w3', 'highlight_groups': ['w_urgent', 'w_visible', 'workspace']},
|
||||
{'contents': '4: w4', 'highlight_groups': ['w_focused', 'w_urgent', 'w_visible', 'workspace']},
|
||||
])
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, only_show=None), [
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info, only_show=None), [
|
||||
{'contents': '1: w1', 'highlight_groups': ['workspace']},
|
||||
{'contents': '2: w2', 'highlight_groups': ['w_visible', 'workspace']},
|
||||
{'contents': '3: w3', 'highlight_groups': ['w_urgent', 'w_visible', 'workspace']},
|
||||
{'contents': '4: w4', 'highlight_groups': ['w_focused', 'w_urgent', 'w_visible', 'workspace']},
|
||||
])
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, only_show=['focused', 'urgent']), [
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info, only_show=['focused', 'urgent']), [
|
||||
{'contents': '3: w3', 'highlight_groups': ['w_urgent', 'w_visible', 'workspace']},
|
||||
{'contents': '4: w4', 'highlight_groups': ['w_focused', 'w_urgent', 'w_visible', 'workspace']},
|
||||
])
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, only_show=['visible']), [
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info, only_show=['visible']), [
|
||||
{'contents': '2: w2', 'highlight_groups': ['w_visible', 'workspace']},
|
||||
{'contents': '3: w3', 'highlight_groups': ['w_urgent', 'w_visible', 'workspace']},
|
||||
{'contents': '4: w4', 'highlight_groups': ['w_focused', 'w_urgent', 'w_visible', 'workspace']},
|
||||
])
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, only_show=['visible'], strip=3), [
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info, only_show=['visible'], strip=3), [
|
||||
{'contents': 'w2', 'highlight_groups': ['w_visible', 'workspace']},
|
||||
{'contents': 'w3', 'highlight_groups': ['w_urgent', 'w_visible', 'workspace']},
|
||||
{'contents': 'w4', 'highlight_groups': ['w_focused', 'w_urgent', 'w_visible', 'workspace']},
|
||||
])
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, only_show=['focused', 'urgent'], output='DVI01'), [
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info, only_show=['focused', 'urgent'], output='DVI01'), [
|
||||
{'contents': '4: w4', 'highlight_groups': ['w_focused', 'w_urgent', 'w_visible', 'workspace']},
|
||||
])
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, only_show=['visible'], output='HDMI1'), [
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info, only_show=['visible'], output='HDMI1'), [
|
||||
{'contents': '3: w3', 'highlight_groups': ['w_urgent', 'w_visible', 'workspace']},
|
||||
])
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, only_show=['visible'], strip=3, output='LVDS1'), [
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info, only_show=['visible'], strip=3, output='LVDS1'), [
|
||||
{'contents': 'w2', 'highlight_groups': ['w_visible', 'workspace']},
|
||||
])
|
||||
segment_info['output'] = 'LVDS1'
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info, only_show=['visible'], output='HDMI1'), [
|
||||
{'contents': '3: w3', 'highlight_groups': ['w_urgent', 'w_visible', 'workspace']},
|
||||
])
|
||||
self.assertEqual(i3wm.workspaces(pl=pl, segment_info=segment_info, only_show=['visible'], strip=3), [
|
||||
{'contents': 'w2', 'highlight_groups': ['w_visible', 'workspace']},
|
||||
])
|
||||
|
||||
|
|
Loading…
Reference in New Issue