def main(shm_name=None): import json import struct from calibre.utils.shm import SharedMemory # Ensure we can continue to function if GUI is closed os.environ.pop('CALIBRE_WORKER_TEMP_DIR', None) reset_base_dir() if iswindows: # Ensure that all instances are grouped together in the task bar. This # prevents them from being grouped with viewer/editor process when # launched from within calibre, as both use calibre-parallel.exe set_app_uid(TOC_DIALOG_APP_UID) with SharedMemory(name=shm_name) as shm: pos = struct.calcsize('>II') state, ok = struct.unpack('>II', shm.read(pos)) data = json.loads(shm.read_data_with_size()) title = data['title'] path = data['path'] s = struct.pack('>I', 1) shm.seek(0), shm.write(s), shm.flush() override = 'calibre-gui' if islinux else None app = Application([], override_program_name=override) d = TOCEditor(path, title=title, write_result_to=path + '.result') d.start() ok = 0 if d.exec() == QDialog.DialogCode.Accepted: ok = 1 s = struct.pack('>II', 2, ok) shm.seek(0), shm.write(s), shm.flush() del d del app raise SystemExit(0 if ok else 1)
def _run(args, notify=None): # Ensure we can continue to function if GUI is closed os.environ.pop('CALIBRE_WORKER_TEMP_DIR', None) reset_base_dir() if iswindows: # Ensure that all ebook editor instances are grouped together in the task # bar. This prevents them from being grouped with viewer process when # launched from within calibre, as both use calibre-parallel.exe set_app_uid(EDITOR_APP_UID) # The following two lines are needed to prevent circular imports causing # errors during initialization of plugins that use the polish container # infrastructure. importlib.import_module('calibre.customize.ui') from calibre.gui2.tweak_book import tprefs from calibre.gui2.tweak_book.ui import Main parser = option_parser() opts, args = parser.parse_args(args) decouple('edit-book-'), set_gui_prefs(tprefs) override = 'calibre-edit-book' if islinux else None app = Application(args, override_program_name=override, color_prefs=tprefs) app.file_event_hook = EventAccumulator() app.load_builtin_fonts() app.setWindowIcon(QIcon(I('tweak.png'))) main = Main(opts, notify=notify) main.set_exception_handler() main.show() app.shutdown_signal_received.connect(main.boss.quit) if len(args) > 1: main.boss.open_book(args[1], edit_file=args[2:], clear_notify_data=False) else: for path in reversed(app.file_event_hook.events): main.boss.open_book(path) break app.file_event_hook = main.boss.open_book app.exec_() # Ensure that the parse worker has quit so that temp files can be deleted # on windows st = time.time() from calibre.gui2.tweak_book.preview import parse_worker while parse_worker.is_alive() and time.time() - st < 120: time.sleep(0.1)
def main(args): # Ensure we can continue to function if GUI is closed os.environ.pop('CALIBRE_WORKER_TEMP_DIR', None) reset_base_dir() if iswindows: # Ensure that all instances are grouped together in the task bar. This # prevents them from being grouped with viewer/editor process when # launched from within calibre, as both use calibre-parallel.exe set_app_uid(STORE_DIALOG_APP_UID) data = args[-1] data = json.loads(from_base64_bytes(data)) override = 'calibre-gui' if islinux else None app = Application(args, override_program_name=override) m = Main(data) m.show(), m.raise_() app.exec() del m del app
def main(path=None, title=None): # Ensure we can continue to function if GUI is closed os.environ.pop('CALIBRE_WORKER_TEMP_DIR', None) reset_base_dir() if iswindows: # Ensure that all instances are grouped together in the task bar. This # prevents them from being grouped with viewer/editor process when # launched from within calibre, as both use calibre-parallel.exe set_app_uid(TOC_DIALOG_APP_UID) with ExclusiveFile(path + '.lock') as wf: override = 'calibre-gui' if islinux else None app = Application([], override_program_name=override) d = TOCEditor(path, title=title) d.start() ret = 1 if d.exec_() == QDialog.DialogCode.Accepted: ret = 0 wf.write('{}'.format(ret).encode('ascii')) del d del app raise SystemExit(ret)
def main(args=sys.argv): if os.environ.pop(b'CALIBRE_RESTARTING_FROM_GUI', None) == b'1': time.sleep(2) # give the parent process time to cleanup and close if iswindows and 'CALIBRE_REPAIR_CORRUPTED_DB' in os.environ: windows_repair() return 0 gui_debug = None if args[0] == '__CALIBRE_GUI_DEBUG__': gui_debug = args[1] args = ['calibre'] if iswindows: # Ensure that all ebook editor instances are grouped together in the task # bar. This prevents them from being grouped with viewer process when # launched from within calibre, as both use calibre-parallel.exe set_app_uid(MAIN_APP_UID) try: app, opts, args = init_qt(args) except AbortInit: return 1 try: si = singleinstance(singleinstance_name) except Exception: error_dialog(None, _('Cannot start calibre'), _( 'Failed to start calibre, single instance locking failed. Click "Show Details" for more information'), det_msg=traceback.format_exc(), show=True) return 1 if si and opts.shutdown_running_calibre: return 0 if si: try: listener = create_listener() except socket.error: if iswindows or islinux: cant_start(det_msg=traceback.format_exc(), listener_failed=True) if os.path.exists(gui_socket_address()): os.remove(gui_socket_address()) try: listener = create_listener() except socket.error: cant_start(det_msg=traceback.format_exc(), listener_failed=True) else: return run_gui(opts, args, listener, app, gui_debug=gui_debug) else: return run_gui(opts, args, listener, app, gui_debug=gui_debug) otherinstance = False try: listener = create_listener() except socket.error: # Good singleinstance is correct (on UNIX) otherinstance = True else: # On windows only singleinstance can be trusted otherinstance = True if iswindows else False if not otherinstance and not opts.shutdown_running_calibre: return run_gui(opts, args, listener, app, gui_debug=gui_debug) communicate(opts, args) return 0
def main(args=sys.argv): if os.environ.pop(b'CALIBRE_RESTARTING_FROM_GUI', None) == b'1': time.sleep(2) # give the parent process time to cleanup and close if iswindows and 'CALIBRE_REPAIR_CORRUPTED_DB' in os.environ: windows_repair() return 0 gui_debug = None if args[0] == '__CALIBRE_GUI_DEBUG__': gui_debug = args[1] args = ['calibre'] if iswindows: # Ensure that all ebook editor instances are grouped together in the task # bar. This prevents them from being grouped with viewer process when # launched from within calibre, as both use calibre-parallel.exe set_app_uid(MAIN_APP_UID) try: app, opts, args = init_qt(args) except AbortInit: return 1 try: si = singleinstance(singleinstance_name) except Exception: error_dialog( None, _('Cannot start calibre'), _('Failed to start calibre, single instance locking failed. Click "Show Details" for more information' ), det_msg=traceback.format_exc(), show=True) return 1 if si and opts.shutdown_running_calibre: return 0 if si: try: listener = create_listener() except socket.error: if iswindows or islinux: cant_start(det_msg=traceback.format_exc(), listener_failed=True) if os.path.exists(gui_socket_address()): os.remove(gui_socket_address()) try: listener = create_listener() except socket.error: cant_start(det_msg=traceback.format_exc(), listener_failed=True) else: return run_gui(opts, args, listener, app, gui_debug=gui_debug) else: return run_gui(opts, args, listener, app, gui_debug=gui_debug) otherinstance = False try: listener = create_listener() except socket.error: # Good singleinstance is correct (on UNIX) otherinstance = True else: # On windows only singleinstance can be trusted otherinstance = True if iswindows else False if not otherinstance and not opts.shutdown_running_calibre: return run_gui(opts, args, listener, app, gui_debug=gui_debug) communicate(opts, args) return 0