diff --git a/src/calibre/gui2/viewer/ui.py b/src/calibre/gui2/viewer/ui.py index 9d4bdb6e25..fe468aeecc 100644 --- a/src/calibre/gui2/viewer/ui.py +++ b/src/calibre/gui2/viewer/ui.py @@ -118,6 +118,7 @@ class EbookViewer(MainWindow): self.web_view.toggle_bookmarks.connect(self.toggle_bookmarks) self.web_view.toggle_inspector.connect(self.toggle_inspector) self.web_view.toggle_lookup.connect(self.toggle_lookup) + self.web_view.quit.connect(self.quit) self.web_view.update_current_toc_nodes.connect(self.toc.update_current_toc_nodes) self.web_view.toggle_full_screen.connect(self.toggle_full_screen) self.web_view.ask_for_open.connect(self.ask_for_open, type=Qt.QueuedConnection) @@ -356,6 +357,9 @@ class EbookViewer(MainWindow): self.restoreState(state, self.MAIN_WINDOW_STATE_VERSION) self.inspector_dock.setVisible(False) + def quit(self): + self.close() + def closeEvent(self, ev): try: self.save_annotations() diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index 389cbfb384..c53a33a1a3 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -222,6 +222,7 @@ class ViewerBridge(Bridge): toggle_bookmarks = from_js() toggle_inspector = from_js() toggle_lookup = from_js() + quit = from_js() update_current_toc_nodes = from_js(object, object) toggle_full_screen = from_js() report_cfi = from_js(object, object) @@ -364,6 +365,7 @@ class WebView(RestartingWebEngineView): toggle_bookmarks = pyqtSignal() toggle_inspector = pyqtSignal() toggle_lookup = pyqtSignal() + quit = pyqtSignal() update_current_toc_nodes = pyqtSignal(object, object) toggle_full_screen = pyqtSignal() ask_for_open = pyqtSignal(object) @@ -388,6 +390,7 @@ class WebView(RestartingWebEngineView): self.bridge.toggle_bookmarks.connect(self.toggle_bookmarks) self.bridge.toggle_inspector.connect(self.toggle_inspector) self.bridge.toggle_lookup.connect(self.toggle_lookup) + self.bridge.quit.connect(self.quit) self.bridge.update_current_toc_nodes.connect(self.update_current_toc_nodes) self.bridge.toggle_full_screen.connect(self.toggle_full_screen) self.bridge.ask_for_open.connect(self.ask_for_open) diff --git a/src/pyj/read_book/shortcuts.pyj b/src/pyj/read_book/shortcuts.pyj index 106a1434f9..9bd6dda0d1 100644 --- a/src/pyj/read_book/shortcuts.pyj +++ b/src/pyj/read_book/shortcuts.pyj @@ -237,6 +237,7 @@ SHORTCUTS = { def add_standalone_viewer_shortcuts(): + ismacos = 'macos' in window.navigator.userAgent SHORTCUTS['toggle_bookmarks'] = desc( v"['Ctrl+b']", 'ui', @@ -255,6 +256,12 @@ def add_standalone_viewer_shortcuts(): _('Show/hide the word lookup panel'), ) + quit_shortcut = 'Meta+q' if ismacos else 'Ctrl+q' + SHORTCUTS['quit'] = desc( + quit_shortcut, + 'ui', + _('Quit the viewer'), + ) def create_shortcut_map(custom_shortcuts): ans = {} diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index 7dae1d7635..2c789a5780 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -296,6 +296,8 @@ class View: ui_operations.toggle_inspector() elif data.name is 'toggle_lookup': ui_operations.toggle_lookup() + elif data.name is 'quit': + ui_operations.quit() elif data.name is 'start_search': self.show_search() elif data.name is 'next_match': diff --git a/src/pyj/viewer-main.pyj b/src/pyj/viewer-main.pyj index a14ee81769..111d8961f3 100644 --- a/src/pyj/viewer-main.pyj +++ b/src/pyj/viewer-main.pyj @@ -304,6 +304,8 @@ if window is window.top: to_python.view_image(name) ui_operations.change_background_image = def(img_id): to_python.change_background_image(img_id) + ui_operations.quit = def(): + to_python.quit() document.body.appendChild(E.div(id='view')) window.onerror = onerror