From ee18cdb1c4fd7d637c702b83e5c3bff87fd4c71f Mon Sep 17 00:00:00 2001 From: Hamed <36635653+Hamedrz004@users.noreply.github.com> Date: Thu, 4 Dec 2025 16:53:59 +0330 Subject: [PATCH] multiple instance --- app.lock | 1 + src/main.pyw | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 app.lock diff --git a/app.lock b/app.lock new file mode 100644 index 0000000..43e6ba5 --- /dev/null +++ b/app.lock @@ -0,0 +1 @@ +9512 \ No newline at end of file diff --git a/src/main.pyw b/src/main.pyw index c78c872..95c7f50 100644 --- a/src/main.pyw +++ b/src/main.pyw @@ -10,6 +10,9 @@ from PIL import Image import re from config import load_config, save_config, get_shortcut from startup import add_to_startup, remove_from_startup, is_in_startup +import os +import signal +import atexit def convert_en_characters(input_str): """ @@ -131,6 +134,7 @@ def on_shortcut(): threading.Thread(target=process_shortcut).start() def quit_app(icon, item): icon.stop() + cleanup_lock() import os os._exit(0) @@ -165,7 +169,38 @@ def setup_tray(config): icon = pystray.Icon("oopswronglang", image, "OopsWrongLang", menu) icon.run() +LOCK_FILE = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'app.lock') + +def cleanup_lock(): + if os.path.exists(LOCK_FILE): + try: + os.remove(LOCK_FILE) + except OSError: + pass + +def ensure_single_instance(): + if os.path.exists(LOCK_FILE): + try: + with open(LOCK_FILE, 'r') as f: + pid = int(f.read().strip()) + + if pid != os.getpid(): + try: + os.kill(pid, signal.SIGTERM) + print(f"Killed existing instance with PID {pid}") + time.sleep(0.5) + except OSError: + pass + except (ValueError, OSError): + pass + + with open(LOCK_FILE, 'w') as f: + f.write(str(os.getpid())) + + atexit.register(cleanup_lock) + def main(): + ensure_single_instance() config = load_config() # Sync startup state just in case it was changed externally config["run_on_startup"] = is_in_startup()