From e962bd3e249d63a00bebc0fb6d51b57fc8873f09 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 18 Feb 2015 19:10:38 +0530 Subject: [PATCH] Windows: When running on windows 8 and newer register with default programs so that users can more easily select calibre or its viewer/editor as the default program to launch ebook files. See #1422248 (calibre does not show up in win 8.1 default programs) --- src/calibre/gui_launch.py | 29 ++++++++++++++++---- src/calibre/utils/winreg/default_programs.py | 13 ++++++++- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/calibre/gui_launch.py b/src/calibre/gui_launch.py index 28ef8eaea3..afe0f33910 100644 --- a/src/calibre/gui_launch.py +++ b/src/calibre/gui_launch.py @@ -41,17 +41,33 @@ def init_dbus(): threads_init() DBusGMainLoop(set_as_default=True) +def register_with_default_programs(): + from calibre.constants import iswindows + if iswindows: + from calibre.utils.winreg.default_programs import Register + from calibre.gui2 import gprefs + return Register(gprefs) + else: + class Dummy(object): + def __enter__(self): + return self + def __exit__(self, *args): + pass + return Dummy() + def calibre(args=sys.argv): detach_gui() init_dbus() - from calibre.gui2.main import main - main(args) + with register_with_default_programs(): + from calibre.gui2.main import main + main(args) def ebook_viewer(args=sys.argv): detach_gui() init_dbus() - from calibre.gui2.viewer.main import main - main(args) + with register_with_default_programs(): + from calibre.gui2.viewer.main import main + main(args) def gui_ebook_edit(path=None, notify=None): ' For launching the editor from inside calibre ' @@ -62,8 +78,9 @@ def gui_ebook_edit(path=None, notify=None): def ebook_edit(args=sys.argv): detach_gui() init_dbus() - from calibre.gui2.tweak_book.main import main - main(args) + with register_with_default_programs(): + from calibre.gui2.tweak_book.main import main + main(args) def option_parser(basename): if basename == 'calibre': diff --git a/src/calibre/utils/winreg/default_programs.py b/src/calibre/utils/winreg/default_programs.py index f5dbb3087e..49d1d482e8 100644 --- a/src/calibre/utils/winreg/default_programs.py +++ b/src/calibre/utils/winreg/default_programs.py @@ -6,7 +6,7 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2015, Kovid Goyal ' -import os, sys +import os, sys, time from threading import Thread from calibre import guess_type, prints @@ -157,5 +157,16 @@ class Register(Thread): if self.prefs.get('windows_register_default_programs', None) != __version__: self.prefs['windows_register_default_programs'] = __version__ if DEBUG: + st = time.time() prints('Registering with default programs...') register() + if DEBUG: + prints('Registered with default programs in %.1f seconds' % (time.time() - st)) + + def __enter__(self): + return self + + def __exit__(self, *args): + # Give the thread some time to finish in case the user quit the + # application very quickly + self.join(4.0)