#!/usr/bin/env python import os import sys import time import glob import pkgutil import argparse import textwrap import importlib import bumblebee.theme import bumblebee.modules import bumblebee.outputs.i3 def print_module_list(): print "available modules:" path = os.path.dirname(bumblebee.modules.__file__) for mod in [ name for _, name, _ in pkgutil.iter_modules([path])]: m = importlib.import_module("bumblebee.modules.{}".format(mod)) desc = "n/a" if not hasattr(m, "description") else getattr(m, "description")() usage = "n/a" if not hasattr(m, "usage") else getattr(m, "usage")() notes = "n/a" if not hasattr(m, "notes") else getattr(m, "notes")() print " {}: ".format(mod) print textwrap.fill("Description: {}".format(desc), 80, initial_indent=" ", subsequent_indent=" ") print textwrap.fill("Usage : {}".format(usage), 80, initial_indent=" ", subsequent_indent=" ") print textwrap.fill("Notes : {}".format(notes), 80, initial_indent=" ", subsequent_indent=" ") print "" def print_theme_list(): d = bumblebee.theme.getpath() print "available themes:" print textwrap.fill(", ".join( [ os.path.basename(f).replace(".json", "") for f in glob.iglob("{}/*.json".format(d)) ]), 80, initial_indent = " ", subsequent_indent = " " ) def main(): parser = argparse.ArgumentParser(description="display system data in the i3bar") parser.add_argument("-m", "--modules", nargs="+", help="List of modules to load. The order of the list determines their order in the i3bar (from left to right)") parser.add_argument("-l", "--list", action="store_true", help="List all available modules and themes") parser.add_argument("-t", "--theme", help="Specify which theme to use for drawing the modules") parser.add_argument("-i", "--interval", help="Specify the update interval", default=1, type=int) parser.add_argument("-s", "--split", help="Specify string to use for splitting modules and their arguments", default="::") if len(sys.argv) == 1: parser.print_help() parser.exit() args = parser.parse_args() if args.list: print_module_list() print_theme_list() sys.exit(0) modules = [] s = args.split for m in args.modules: # TODO: how to cleanly handle errors here? # (useful error messages) module_name = m if not s in m else m.split(s)[0] module_args = None if not s in m else m.split(s)[1:] module = importlib.import_module("bumblebee.modules.{}".format(module_name)) modules.append(getattr(module, "Module")(module_args)) theme = bumblebee.theme.Theme(args.theme) if args.theme else bumblebee.theme.Theme() output = bumblebee.outputs.i3.i3bar(theme) print output.start() sys.stdout.flush() while True: theme.reset() for m in modules: output.add(m) theme.next() print output.get() sys.stdout.flush() time.sleep(args.interval) print output.stop() if __name__ == "__main__": main() # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4