Skip to content

Commit

Permalink
Merge pull request #1642 from ZyX-I/wm-daemon
Browse files Browse the repository at this point in the history
Use powerline daemon for running awesome bindings
  • Loading branch information
ZyX-I committed Apr 1, 2017
2 parents 0eb2bae + 2565708 commit 5fa5041
Show file tree
Hide file tree
Showing 21 changed files with 503 additions and 120 deletions.
7 changes: 7 additions & 0 deletions docs/source/configuration/reference.rst
Expand Up @@ -215,6 +215,13 @@ Common configuration is a subdictionary that is a value of ``ext`` key in

All components are enabled by default.

.. _config-ext-update_interval:

``update_interval``
Determines how often WM status bars need to be updated, in seconds. Only
valid for WM extensions which use ``powerline-daemon``. Defaults to
2 seconds.

.. _config-colors:

Color definitions
Expand Down
7 changes: 7 additions & 0 deletions powerline/__init__.py
Expand Up @@ -419,6 +419,11 @@ def _get_log_keys(common_config):
))


DEFAULT_UPDATE_INTERVAL = 2
'''Default value for :ref:`update_interval <config-ext-update_interval>`
'''


class Powerline(object):
'''Main powerline class, entrance point for all powerline uses. Sets
powerline up and loads the configuration.
Expand Down Expand Up @@ -514,6 +519,7 @@ def init(self,
self.setup_args = ()
self.setup_kwargs = {}
self.imported_modules = set()
self.update_interval = DEFAULT_UPDATE_INTERVAL

get_encoding = staticmethod(get_preferred_output_encoding)
'''Get encoding used by the current application
Expand Down Expand Up @@ -638,6 +644,7 @@ def create_renderer(self, load_main=False, load_colors=False, load_colorscheme=F
or self.ext_config.get('local_themes') != self.prev_ext_config.get('local_themes')
):
self.renderer_options['local_themes'] = self.get_local_themes(self.ext_config.get('local_themes'))
self.update_interval = self.ext_config.get('update_interval', 2)
load_colorscheme = (
load_colorscheme
or not self.prev_ext_config
Expand Down
41 changes: 10 additions & 31 deletions powerline/bindings/awesome/powerline-awesome.py
Expand Up @@ -4,38 +4,17 @@

import sys

from time import sleep
from subprocess import Popen, PIPE
from powerline.bindings.wm import DEFAULT_UPDATE_INTERVAL
from powerline.bindings.wm.awesome import run

from powerline import Powerline
from powerline.lib.monotonic import monotonic

powerline = Powerline('wm', renderer_module='pango_markup')
powerline.update_renderer()
def main():
try:
interval = float(sys.argv[1])
except IndexError:
interval = DEFAULT_UPDATE_INTERVAL
run(interval=interval)

try:
interval = float(sys.argv[1])
except IndexError:
interval = 2


def read_to_log(pl, client):
for line in client.stdout:
if line:
pl.info(line, prefix='awesome-client')
for line in client.stderr:
if line:
pl.error(line, prefix='awesome-client')
if client.wait():
pl.error('Client exited with {0}', client.returncode, prefix='awesome')


while True:
start_time = monotonic()
s = powerline.render(side='right')
request = 'powerline_widget:set_markup(\'' + s.replace('\\', '\\\\').replace('\'', '\\\'') + '\')\n'
client = Popen(['awesome-client'], shell=False, stdout=PIPE, stderr=PIPE, stdin=PIPE)
client.stdin.write(request.encode('utf-8'))
client.stdin.close()
read_to_log(powerline.pl, client)
sleep(max(interval - (monotonic() - start_time), 0.1))
if __name__ == '__main__':
main()
5 changes: 2 additions & 3 deletions powerline/bindings/awesome/powerline.lua
Expand Up @@ -6,6 +6,5 @@ powerline_widget:set_align('right')

function powerline(mode, widget) end

bindings_path = string.gsub(debug.getinfo(1).source:match('@(.*)$'), '/[^/]+$', '')
powerline_cmd = bindings_path .. '/powerline-awesome.py'
awful.util.spawn_with_shell('ps -C powerline-awesome.py || ' .. powerline_cmd)
awful.util.spawn_with_shell('powerline-daemon -q')
awful.util.spawn_with_shell('powerline wm.awesome')
3 changes: 2 additions & 1 deletion powerline/bindings/bar/powerline-bar.py
Expand Up @@ -11,6 +11,7 @@

from powerline.lemonbar import LemonbarPowerline
from powerline.lib.encoding import get_unicode_writer
from powerline.bindings.wm import DEFAULT_UPDATE_INTERVAL


if __name__ == '__main__':
Expand All @@ -29,7 +30,7 @@

def render(reschedule=False):
if reschedule:
Timer(0.5, render, kwargs={'reschedule': True}).start()
Timer(DEFAULT_UPDATE_INTERVAL, render, kwargs={'reschedule': True}).start()

global lock
with lock:
Expand Down
2 changes: 1 addition & 1 deletion powerline/bindings/config.py
Expand Up @@ -99,7 +99,7 @@ def __getattr__(self, attr):
def init_tmux_environment(pl, args, set_tmux_environment=set_tmux_environment):
'''Initialize tmux environment from tmux configuration
'''
powerline = ShellPowerline(finish_args(os.environ, EmptyArgs('tmux', args.config_path)))
powerline = ShellPowerline(finish_args(None, os.environ, EmptyArgs('tmux', args.config_path)))
# TODO Move configuration files loading out of Powerline object and use it
# directly
powerline.update_renderer()
Expand Down
9 changes: 9 additions & 0 deletions powerline/bindings/wm/__init__.py
Expand Up @@ -5,6 +5,10 @@

from powerline.theme import requires_segment_info
from powerline.lib.shell import run_cmd
from powerline.bindings.wm.awesome import AwesomeThread


DEFAULT_UPDATE_INTERVAL = 0.5


conn = None
Expand Down Expand Up @@ -36,3 +40,8 @@ def get_connected_xrandr_outputs(pl):
return (match.groupdict() for match in XRANDR_OUTPUT_RE.finditer(
run_cmd(pl, ['xrandr', '-q'])
))


wm_threads = {
'awesome': AwesomeThread,
}
59 changes: 59 additions & 0 deletions powerline/bindings/wm/awesome.py
@@ -0,0 +1,59 @@
# vim:fileencoding=utf-8:noet
from __future__ import (unicode_literals, division, absolute_import, print_function)

import sys

from threading import Thread, Event
from time import sleep
from subprocess import Popen, PIPE

from powerline import Powerline
from powerline.lib.monotonic import monotonic


def read_to_log(pl, client):
for line in client.stdout:
if line:
pl.info(line, prefix='awesome-client')
for line in client.stderr:
if line:
pl.error(line, prefix='awesome-client')
if client.wait():
pl.error('Client exited with {0}', client.returncode, prefix='awesome')


def run(thread_shutdown_event=None, pl_shutdown_event=None, pl_config_loader=None,
interval=None):
powerline = Powerline(
'wm',
renderer_module='pango_markup',
shutdown_event=pl_shutdown_event,
config_loader=pl_config_loader,
)
powerline.update_renderer()

if not thread_shutdown_event:
thread_shutdown_event = powerline.shutdown_event

while not thread_shutdown_event.is_set():
# powerline.update_interval may change over time
used_interval = interval or powerline.update_interval
start_time = monotonic()
s = powerline.render(side='right')
request = 'powerline_widget:set_markup(\'' + s.translate({'\'': '\\\'', '\\': '\\\\'}) + '\')\n'
client = Popen(['awesome-client'], shell=False, stdout=PIPE, stderr=PIPE, stdin=PIPE)
client.stdin.write(request.encode('utf-8'))
client.stdin.close()
read_to_log(powerline.pl, client)
thread_shutdown_event.wait(max(used_interval - (monotonic() - start_time), 0.1))


class AwesomeThread(Thread):
__slots__ = ('powerline_shutdown_event',)

def __init__(self, **kwargs):
super(AwesomeThread, self).__init__()
self.powerline_run_kwargs = kwargs

def run(self):
run(**self.powerline_run_kwargs)
5 changes: 5 additions & 0 deletions powerline/bindings/zsh/powerline.zsh
Expand Up @@ -25,6 +25,11 @@ _powerline_tmux_pane() {
echo "${TMUX_PANE:-`tmux display -p "#D"`}" | tr -d ' %'
}

_powerline_tmux_pane() {
local -x TMUX="$_POWERLINE_TMUX"
echo "${TMUX_PANE:-`tmux display -p "#D"`}" | tr -d ' %'
}

_powerline_init_tmux_support() {
emulate -L zsh
if test -n "$TMUX" && tmux refresh -S &>/dev/null ; then
Expand Down
18 changes: 13 additions & 5 deletions powerline/commands/main.py
Expand Up @@ -11,6 +11,7 @@
from powerline.lib.dict import mergeargs
from powerline.lib.encoding import get_preferred_arguments_encoding
from powerline.lib.unicode import u, unicode
from powerline.bindings.wm import wm_threads


if sys.version_info < (3,):
Expand All @@ -23,7 +24,7 @@ def arg_to_unicode(s):
return s


def finish_args(environ, args):
def finish_args(parser, environ, args, is_daemon=False):
'''Do some final transformations
Transforms ``*_override`` arguments into dictionaries, adding overrides from
Expand Down Expand Up @@ -61,7 +62,13 @@ def finish_args(environ, args):
[path for path in environ.get('POWERLINE_CONFIG_PATHS', '').split(':') if path]
+ (args.config_path or [])
)
args.side = args.side[0]
if args.ext[0].startswith('wm.'):
if not is_daemon:
parser.error('WM bindings must be used with daemon only')
elif args.ext[0][3:] not in wm_threads:
parser.error('WM binding not found')
elif not args.side:
parser.error('expected one argument')
return args


Expand All @@ -77,15 +84,16 @@ def get_argparser(ArgumentParser=argparse.ArgumentParser):
parser.add_argument(
'ext', nargs=1,
help='Extension: application for which powerline command is launched '
'(usually `shell\' or `tmux\').'
'(usually `shell\' or `tmux\'). Also supports `wm.\' extensions: '
+ ', '.join(('`wm.' + key + '\'' for key in wm_threads.keys())) + '.'
)
parser.add_argument(
'side', nargs=1, choices=('left', 'right', 'above', 'aboveleft'),
'side', nargs='?', choices=('left', 'right', 'above', 'aboveleft'),
help='Side: `left\' and `right\' represent left and right side '
'respectively, `above\' emits lines that are supposed to be printed '
'just above the prompt and `aboveleft\' is like concatenating '
'`above\' with `left\' with the exception that only one Python '
'instance is used in this case.'
'instance is used in this case. May be omitted for `wm.*\' extensions.'
)
parser.add_argument(
'-r', '--renderer-module', metavar='MODULE', type=str,
Expand Down
3 changes: 2 additions & 1 deletion powerline/config_files/config.json
Expand Up @@ -46,7 +46,8 @@
},
"wm": {
"colorscheme": "default",
"theme": "default"
"theme": "default",
"update_interval": 2
}
}
}
3 changes: 2 additions & 1 deletion powerline/lint/__init__.py
Expand Up @@ -130,7 +130,8 @@ def load_json_config(config_file_path, load=load, open_file=open_file):
local_themes=Spec().unknown_spec(
Spec().re('^[0-9A-Za-z-]+$'),
ext_theme_spec()
).optional()
).optional(),
update_interval=Spec().cmp('gt', 0.0).optional(),
).optional(),
).unknown_spec(
check_ext,
Expand Down

0 comments on commit 5fa5041

Please sign in to comment.