From 69febfcea54cc734327ec65421fa7fcf9480fb84 Mon Sep 17 00:00:00 2001 From: Daniel Pavel Date: Mon, 12 Aug 2013 15:22:34 +0200 Subject: [PATCH] don't rely on upower to check devices after wake-up (#111) still use upower resume events to ping devices, just in case the old behaviour is available with a command-line option --- lib/solaar/cli/__init__.py | 5 +---- lib/solaar/cli/show.py | 14 ++++++++------ lib/solaar/gtk.py | 26 ++++++++++++++++++-------- lib/solaar/listener.py | 13 ++++++++++--- lib/solaar/upower.py | 2 +- 5 files changed, 38 insertions(+), 22 deletions(-) diff --git a/lib/solaar/cli/__init__.py b/lib/solaar/cli/__init__.py index a339acf3..1d2d25f5 100644 --- a/lib/solaar/cli/__init__.py +++ b/lib/solaar/cli/__init__.py @@ -73,6 +73,7 @@ def _create_parser(): _cli_parser, actions = _create_parser() +print_help = _cli_parser.print_help def _receivers(): @@ -130,10 +131,6 @@ def _find_device(receivers, name): def run(cli_args=None): - if cli_args == 'help': - _cli_parser.print_help() - return - if cli_args: action = cli_args[0] args = _cli_parser.parse_args(cli_args) diff --git a/lib/solaar/cli/show.py b/lib/solaar/cli/show.py index 906cb40c..52d723a5 100644 --- a/lib/solaar/cli/show.py +++ b/lib/solaar/cli/show.py @@ -128,12 +128,14 @@ def run(receivers, args, find_receiver, find_device): for r in receivers: _print_receiver(r) count = r.count() - for dev in r: - print ('') - _print_device(dev) - count -= 1 - if count == 0: - break + if count: + for dev in r: + print ('') + _print_device(dev) + count -= 1 + if not count: + break + print ('') return dev = find_receiver(receivers, device_name) diff --git a/lib/solaar/gtk.py b/lib/solaar/gtk.py index aabd35f5..f5bef6a8 100644 --- a/lib/solaar/gtk.py +++ b/lib/solaar/gtk.py @@ -42,6 +42,8 @@ def _parse_arguments(): arg_parser = argparse.ArgumentParser(prog=NAME.lower()) arg_parser.add_argument('-d', '--debug', action='count', default=0, help='print logging messages, for debugging purposes (may be repeated for extra verbosity)') + arg_parser.add_argument('--restart-on-wake-up', action='store_true', + help='restart Solaar on sleep wake-up (experimental)') arg_parser.add_argument('-V', '--version', action='version', version='%(prog)s ' + __version__) arg_parser.add_argument('--help-actions', action='store_true', help='print help for the optional actions') @@ -51,7 +53,8 @@ def _parse_arguments(): args = arg_parser.parse_args() if args.help_actions: - return 'help' + _cli.print_help() + return import logging if args.debug > 0: @@ -62,11 +65,11 @@ def _parse_arguments(): logging.root.addHandler(logging.NullHandler()) logging.root.setLevel(logging.ERROR) - if args.action: - return args.action + if not args.action: + if logging.root.isEnabledFor(logging.INFO): + logging.info("language %s (%s), translations path %s", _i18n.language, _i18n.encoding, _i18n.path) - if logging.root.isEnabledFor(logging.INFO): - logging.info("language %s (%s), translations path %s", _i18n.language, _i18n.encoding, _i18n.path) + return args def main(): @@ -76,9 +79,9 @@ def main(): import signal signal.signal(signal.SIGINT, signal.SIG_DFL) - cli_action = _parse_arguments() - if cli_action: - return _cli.run(cli_action) + args = _parse_arguments() + if not args: return + if args.action: return _cli.run(args.action) _require('gi.repository', 'python-gi') _require('gi.repository.Gtk', 'gir1.2-gtk-3.0') @@ -87,6 +90,13 @@ def main(): import solaar.ui as ui import solaar.listener as listener listener.setup_scanner(ui.status_changed, ui.error_dialog) + + import solaar.upower as _upower + if args.restart_on_wake_up: + _upower.watch(listener.start_all, listener.stop_all) + else: + _upower.watch(listener.ping_all) + # main UI event loop ui.run_loop(listener.start_all, listener.stop_all) except Exception as e: diff --git a/lib/solaar/listener.py b/lib/solaar/listener.py index 0c770d33..a7f9040d 100644 --- a/lib/solaar/listener.py +++ b/lib/solaar/listener.py @@ -268,9 +268,16 @@ def stop_all(): l.join() -# stop/start all receiver threads on suspend/resume events, if possible -from . import upower -upower.watch(start_all, stop_all) +def ping_all(): + for l in _all_listeners.values(): + count = l.receiver.count() + if count: + for dev in l.receiver: + dev.ping() + l._status_changed(dev) + count -= 1 + if not count: + break from logitech_receiver import base as _base diff --git a/lib/solaar/upower.py b/lib/solaar/upower.py index 3570e484..36fd782a 100644 --- a/lib/solaar/upower.py +++ b/lib/solaar/upower.py @@ -43,7 +43,7 @@ def _resume(): _resume_callback() -def watch(on_resume_callback, on_suspend_callback): +def watch(on_resume_callback=None, on_suspend_callback=None): """Register callback for suspend/resume events. They are called only if the system DBus is running, and the UPower daemon is available.""" global _resume_callback, _suspend_callback