[output] Create preliminary framework for output handling
Prepare a framework for having modular outputs. Essentially, the main
application uses a output-type object to format strings for the
preamble, the actual data items, and a "postamble" (finalizer). The
printing of that representation, again, is up to the main application,
not the output framework.
Probably, at some point in the future, an interface class will be in
order, but right now, I want to keep it lean - seeing as for the
forseeable future, i3bar is going to be the one and only consumer of
this.
2016-10-30 15:58:35 +01:00
#!/usr/bin/env python
2016-10-31 15:49:15 +01:00
import os
2016-10-30 17:30:09 +01:00
import sys
import time
2016-10-31 16:47:34 +01:00
import glob
2016-10-31 15:49:15 +01:00
import pkgutil
2016-10-30 17:30:09 +01:00
import argparse
2016-10-31 15:49:15 +01:00
import textwrap
2016-11-04 19:11:10 +01:00
import threading
2016-10-30 17:30:09 +01:00
import importlib
2016-10-31 07:18:57 +01:00
import bumblebee.theme
2016-10-31 15:49:15 +01:00
import bumblebee.modules
[output] Create preliminary framework for output handling
Prepare a framework for having modular outputs. Essentially, the main
application uses a output-type object to format strings for the
preamble, the actual data items, and a "postamble" (finalizer). The
printing of that representation, again, is up to the main application,
not the output framework.
Probably, at some point in the future, an interface class will be in
order, but right now, I want to keep it lean - seeing as for the
forseeable future, i3bar is going to be the one and only consumer of
this.
2016-10-30 15:58:35 +01:00
import bumblebee.outputs.i3
2016-10-30 17:30:09 +01:00
def print_module_list():
2016-10-31 15:49:15 +01:00
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)
2016-10-31 16:51:34 +01:00
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=" ")
2016-10-31 16:47:34 +01:00
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 = " "
)
2016-10-30 17:30:09 +01:00
2016-11-04 18:56:45 +01:00
def init_argument_parser():
2016-10-30 17:30:09 +01:00
parser = argparse.ArgumentParser(description="display system data in the i3bar")
2016-11-01 08:09:10 +01:00
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)", default=[])
parser.add_argument("-e", "--events", nargs="+", help="List of click events that should be handled. Format is: <module name><splitter, see -s><button ID><splitter><command to execute>", default=[])
2016-10-30 17:56:04 +01:00
parser.add_argument("-l", "--list", action="store_true", help="List all available modules and themes")
2016-10-31 17:29:32 +01:00
parser.add_argument("-t", "--theme", help="Specify which theme to use for drawing the modules")
2016-10-31 15:49:15 +01:00
parser.add_argument("-i", "--interval", help="Specify the update interval", default=1, type=int)
2016-10-31 16:51:34 +01:00
parser.add_argument("-s", "--split", help="Specify string to use for splitting modules and their arguments", default="::")
2016-10-31 15:49:15 +01:00
2016-11-04 18:56:45 +01:00
return parser
def getmodule(args, output, modulespec):
s = args.split
module_name = modulespec if not s in modulespec else modulespec.split(s)[0]
module_args = None if not s in modulespec else modulespec.split(s)[1:]
module = importlib.import_module("bumblebee.modules.{}".format(module_name))
return getattr(module, "Module")(output, module_args)
def register_event(args, output, event):
ev = event.split(args.split)
if len(ev) < 3:
sys.stderr.write("invalid format for click event, expect 3 parameters")
return
output.add_callback(
module=ev[0],
button=int(ev[1]),
cmd=ev[2],
)
def main():
parser = init_argument_parser()
2016-10-31 15:49:15 +01:00
if len(sys.argv) == 1:
parser.print_help()
parser.exit()
2016-10-30 17:30:09 +01:00
args = parser.parse_args()
if args.list:
print_module_list()
2016-10-31 16:47:34 +01:00
print_theme_list()
2016-10-30 17:30:09 +01:00
sys.exit(0)
2016-11-04 19:11:10 +01:00
refresh = threading.Condition()
2016-11-01 08:09:10 +01:00
theme = bumblebee.theme.Theme(args.theme) if args.theme else bumblebee.theme.Theme()
2016-11-04 19:11:10 +01:00
output = bumblebee.outputs.i3.i3bar(refresh, theme)
2016-11-01 08:09:10 +01:00
2016-10-30 17:30:09 +01:00
modules = []
for m in args.modules:
2016-11-04 18:56:45 +01:00
modules.append(getmodule(args, output, m))
[output] Create preliminary framework for output handling
Prepare a framework for having modular outputs. Essentially, the main
application uses a output-type object to format strings for the
preamble, the actual data items, and a "postamble" (finalizer). The
printing of that representation, again, is up to the main application,
not the output framework.
Probably, at some point in the future, an interface class will be in
order, but right now, I want to keep it lean - seeing as for the
forseeable future, i3bar is going to be the one and only consumer of
this.
2016-10-30 15:58:35 +01:00
2016-11-01 07:59:39 +01:00
for e in args.events:
2016-11-04 18:56:45 +01:00
register_event(args, output, e)
2016-11-01 07:59:39 +01:00
2016-10-30 17:30:09 +01:00
print output.start()
sys.stdout.flush()
[output] Create preliminary framework for output handling
Prepare a framework for having modular outputs. Essentially, the main
application uses a output-type object to format strings for the
preamble, the actual data items, and a "postamble" (finalizer). The
printing of that representation, again, is up to the main application,
not the output framework.
Probably, at some point in the future, an interface class will be in
order, but right now, I want to keep it lean - seeing as for the
forseeable future, i3bar is going to be the one and only consumer of
this.
2016-10-30 15:58:35 +01:00
2016-11-04 19:11:10 +01:00
refresh.acquire()
[output] Create preliminary framework for output handling
Prepare a framework for having modular outputs. Essentially, the main
application uses a output-type object to format strings for the
preamble, the actual data items, and a "postamble" (finalizer). The
printing of that representation, again, is up to the main application,
not the output framework.
Probably, at some point in the future, an interface class will be in
order, but right now, I want to keep it lean - seeing as for the
forseeable future, i3bar is going to be the one and only consumer of
this.
2016-10-30 15:58:35 +01:00
while True:
2016-10-31 10:45:15 +01:00
theme.reset()
2016-10-30 17:30:09 +01:00
for m in modules:
output.add(m)
2016-10-31 10:45:15 +01:00
theme.next()
2016-10-30 17:30:09 +01:00
print output.get()
sys.stdout.flush()
2016-11-04 19:11:10 +01:00
refresh.wait(args.interval)
[output] Create preliminary framework for output handling
Prepare a framework for having modular outputs. Essentially, the main
application uses a output-type object to format strings for the
preamble, the actual data items, and a "postamble" (finalizer). The
printing of that representation, again, is up to the main application,
not the output framework.
Probably, at some point in the future, an interface class will be in
order, but right now, I want to keep it lean - seeing as for the
forseeable future, i3bar is going to be the one and only consumer of
this.
2016-10-30 15:58:35 +01:00
2016-10-30 17:30:09 +01:00
print output.stop()
[output] Create preliminary framework for output handling
Prepare a framework for having modular outputs. Essentially, the main
application uses a output-type object to format strings for the
preamble, the actual data items, and a "postamble" (finalizer). The
printing of that representation, again, is up to the main application,
not the output framework.
Probably, at some point in the future, an interface class will be in
order, but right now, I want to keep it lean - seeing as for the
forseeable future, i3bar is going to be the one and only consumer of
this.
2016-10-30 15:58:35 +01:00
if __name__ == "__main__":
main()
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4