diff --git a/bumblebee-ctl b/bumblebee-ctl new file mode 100755 index 0000000..c470d0e --- /dev/null +++ b/bumblebee-ctl @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +import os +import argparse +import json +import glob +import socket + +button = { + 'left-mouse': 1, + 'middle-mouse': 2, + 'right-mouse': 3, + 'wheel-up': 4, + 'wheel-down': 5, +} + +def main(): + parser = argparse.ArgumentParser(description='send commands to bumblebee-status') + parser.add_argument('-b', '--button', choices=['left-mouse', 'right-mouse', 'middle-mouse', 'wheel-up', 'wheel-down'], help='button to emulate', default='left-mouse') + parser.add_argument('-i', '--id', help='ID of widget to trigger') + parser.add_argument('-m', '--module', help='name of the module to trigger', required=True) + + args = parser.parse_args() + + for f in glob.glob('/tmp/.bumblebee-status.*'): + s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + try: + s.connect(f) + s.sendall(json.dumps({ + 'name': args.module, + 'instance': args.id, + 'button': button[args.button], + }).encode('ascii')) + except Exception as e: + os.remove(f) + +if __name__ == '__main__': + main() + +# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 diff --git a/bumblebee-status b/bumblebee-status index c516fdd..e9cd545 100755 --- a/bumblebee-status +++ b/bumblebee-status @@ -3,6 +3,7 @@ import os import sys import json +import socket import select import logging import threading @@ -13,30 +14,53 @@ import core.module import core.input import core.event +class CommandSocket(object): + def __init__(self): + self.__name = '/tmp/.bumblebee-status.{}'.format(os.getpid()) + self.__socket = None + + def __enter__(self): + self.__socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.__socket.bind(self.__name) + self.__socket.listen(5) + return self.__socket + + def __exit__(self, type, value, traceback): + self.__socket.close() + os.unlink(self.__name) + def handle_input(output): - poll = select.poll() - poll.register(sys.stdin.fileno(), select.POLLIN) + with CommandSocket() as cmdsocket: + poll = select.poll() + poll.register(sys.stdin.fileno(), select.POLLIN) + poll.register(cmdsocket, select.POLLIN) - while True: - events = poll.poll() + while True: + events = poll.poll() - modules = {} - for fileno, event in events: - line = '[' - while line.startswith('['): - line = sys.stdin.readline().strip(',').strip() - logging.info('input event: {}'.format(line)) - try: - event = json.loads(line) - core.input.trigger(event) - if 'name' in event: - modules[event['name']] = True - except ValueError: - pass - core.event.trigger('update', modules.keys()) - core.event.trigger('draw') + modules = {} + for fileno, event in events: + if fileno == cmdsocket.fileno(): + tmp, _ = cmdsocket.accept() + line = tmp.recv(4096).decode() + tmp.close() + logging.debug('socket event {}'.format(line)) + else: + line = '[' + while line.startswith('['): + line = sys.stdin.readline().strip(',').strip() + logging.info('input event: {}'.format(line)) + try: + event = json.loads(line) + core.input.trigger(event) + if 'name' in event: + modules[event['name']] = True + except ValueError: + pass + core.event.trigger('update', modules.keys()) + core.event.trigger('draw') - poll.unregister(sys.stdin.fileno()) + poll.unregister(sys.stdin.fileno()) def main(): config = core.config.Config(sys.argv[1:])