mirror of
				https://github.com/yeongpin/cursor-free-vip.git
				synced 2025-10-31 12:36:27 +08:00 
			
		
		
		
	 d852bcff50
			
		
	
	d852bcff50
	
	
	
		
			
			- Add automatic system language detection for Windows and Unix-like systems - Update localization files with new translation keys - Improve language handling in various modules - Translate more UI messages to English - Add GitHub link to logo display - Bump version to 1.4.04
		
			
				
	
	
		
			89 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import psutil
 | ||
| import time
 | ||
| from colorama import Fore, Style, init
 | ||
| import sys
 | ||
| import os
 | ||
| 
 | ||
| # Initialize colorama
 | ||
| init()
 | ||
| 
 | ||
| # Define emoji constants
 | ||
| EMOJI = {
 | ||
|     "PROCESS": "⚙️",
 | ||
|     "SUCCESS": "✅",
 | ||
|     "ERROR": "❌",
 | ||
|     "INFO": "ℹ️",
 | ||
|     "WAIT": "⏳"
 | ||
| }
 | ||
| 
 | ||
| class CursorQuitter:
 | ||
|     def __init__(self, timeout=5, translator=None):
 | ||
|         self.timeout = timeout
 | ||
|         self.translator = translator  # Use the passed translator
 | ||
|         
 | ||
|     def quit_cursor(self):
 | ||
|         """Gently close Cursor processes"""
 | ||
|         try:
 | ||
|             print(f"{Fore.CYAN}{EMOJI['PROCESS']} {self.translator.get('quit_cursor.start')}...{Style.RESET_ALL}")
 | ||
|             cursor_processes = []
 | ||
|             
 | ||
|             # Collect all Cursor processes
 | ||
|             for proc in psutil.process_iter(['pid', 'name']):
 | ||
|                 try:
 | ||
|                     if proc.info['name'].lower() in ['cursor.exe', 'cursor']:
 | ||
|                         cursor_processes.append(proc)
 | ||
|                 except (psutil.NoSuchProcess, psutil.AccessDenied):
 | ||
|                     continue
 | ||
| 
 | ||
|             if not cursor_processes:
 | ||
|                 print(f"{Fore.GREEN}{EMOJI['INFO']} {self.translator.get('quit_cursor.no_process')}{Style.RESET_ALL}")
 | ||
|                 return True
 | ||
| 
 | ||
|             # Gently request processes to terminate
 | ||
|             for proc in cursor_processes:
 | ||
|                 try:
 | ||
|                     if proc.is_running():
 | ||
|                         print(f"{Fore.YELLOW}{EMOJI['PROCESS']} {self.translator.get('quit_cursor.terminating', pid=proc.pid)}...{Style.RESET_ALL}")
 | ||
|                         proc.terminate()
 | ||
|                 except (psutil.NoSuchProcess, psutil.AccessDenied):
 | ||
|                     continue
 | ||
| 
 | ||
|             # Wait for processes to terminate naturally
 | ||
|             print(f"{Fore.CYAN}{EMOJI['WAIT']} {self.translator.get('quit_cursor.waiting')}...{Style.RESET_ALL}")
 | ||
|             start_time = time.time()
 | ||
|             while time.time() - start_time < self.timeout:
 | ||
|                 still_running = []
 | ||
|                 for proc in cursor_processes:
 | ||
|                     try:
 | ||
|                         if proc.is_running():
 | ||
|                             still_running.append(proc)
 | ||
|                     except (psutil.NoSuchProcess, psutil.AccessDenied):
 | ||
|                         continue
 | ||
|                 
 | ||
|                 if not still_running:
 | ||
|                     print(f"{Fore.GREEN}{EMOJI['SUCCESS']} {self.translator.get('quit_cursor.success')}{Style.RESET_ALL}")
 | ||
|                     return True
 | ||
|                     
 | ||
|                 time.sleep(0.5)
 | ||
|                 
 | ||
|             # If processes are still running after timeout
 | ||
|             if still_running:
 | ||
|                 process_list = ", ".join([str(p.pid) for p in still_running])
 | ||
|                 print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('quit_cursor.timeout', pids=process_list)}{Style.RESET_ALL}")
 | ||
|                 return False
 | ||
|                 
 | ||
|             return True
 | ||
| 
 | ||
|         except Exception as e:
 | ||
|             print(f"{Fore.RED}{EMOJI['ERROR']} {self.translator.get('quit_cursor.error', error=str(e))}{Style.RESET_ALL}")
 | ||
|             return False
 | ||
| 
 | ||
| def quit_cursor(translator=None, timeout=5):
 | ||
|     """Convenient function for directly calling the quit function"""
 | ||
|     quitter = CursorQuitter(timeout, translator)
 | ||
|     return quitter.quit_cursor()
 | ||
| 
 | ||
| if __name__ == "__main__":
 | ||
|     # If run directly, use the default translator
 | ||
|     from main import translator as main_translator
 | ||
|     quit_cursor(main_translator) |