summaryrefslogtreecommitdiffstats
path: root/powerline/bindings/wm
diff options
context:
space:
mode:
Diffstat (limited to 'powerline/bindings/wm')
-rw-r--r--powerline/bindings/wm/__init__.py72
-rw-r--r--powerline/bindings/wm/awesome.py59
2 files changed, 131 insertions, 0 deletions
diff --git a/powerline/bindings/wm/__init__.py b/powerline/bindings/wm/__init__.py
new file mode 100644
index 0000000..d2c6f30
--- /dev/null
+++ b/powerline/bindings/wm/__init__.py
@@ -0,0 +1,72 @@
+# vim:fileencoding=utf-8:noet
+from __future__ import (unicode_literals, division, absolute_import, print_function)
+
+import re
+
+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
+
+
+def i3_subscribe(conn, event, callback):
+ '''Subscribe to i3 workspace event
+
+ :param conn:
+ Connection returned by :py:func:`get_i3_connection`.
+ :param str event:
+ Event to subscribe to, e.g. ``'workspace'``.
+ :param func callback:
+ Function to run on event.
+ '''
+ conn.on(event, callback)
+
+ from threading import Thread
+
+ class I3Thread(Thread):
+ daemon = True
+
+ def __init__(self, conn):
+ super(I3Thread, self).__init__()
+ self.__conn = conn
+
+ def run(self):
+ self.__conn.main()
+
+ thread = I3Thread(conn=conn)
+
+ thread.start()
+
+
+def get_i3_connection():
+ '''Return a valid, cached i3 Connection instance
+ '''
+ global conn
+ if not conn:
+ import i3ipc
+ conn = i3ipc.Connection()
+ return conn
+
+
+XRANDR_OUTPUT_RE = re.compile(r'^(?P<name>[0-9A-Za-z-]+) connected(?P<primary> primary)? (?P<width>\d+)x(?P<height>\d+)\+(?P<x>\d+)\+(?P<y>\d+)', re.MULTILINE)
+
+
+def get_connected_xrandr_outputs(pl):
+ '''Iterate over xrandr outputs
+
+ Outputs are represented by a dictionary with ``name``, ``width``,
+ ``height``, ``primary``, ``x`` and ``y`` keys.
+ '''
+ return (match.groupdict() for match in XRANDR_OUTPUT_RE.finditer(
+ run_cmd(pl, ['xrandr', '-q'])
+ ))
+
+
+wm_threads = {
+ 'awesome': AwesomeThread,
+}
diff --git a/powerline/bindings/wm/awesome.py b/powerline/bindings/wm/awesome.py
new file mode 100644
index 0000000..b6e07f2
--- /dev/null
+++ b/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)