1#!/usr/local/bin/python3.8 2 3import subprocess 4import os 5import json 6import sys 7 8CLI = sys.argv 9 10def parse_args(command): 11 return command.split(' ') 12 13def spawn(command): 14 try: 15 process = subprocess.run( 16 parse_args(command), 17 stdout=subprocess.PIPE, 18 check=True 19 ) 20 except Exception: 21 raise subprocess.CalledProcessError(1, command) 22 out = process.stdout.decode('utf-8') 23 return out 24 25# Utility script that creates GDesktop files for Wine and other window backed applications. 26def handle_cli(): 27 28 if CLI[1] == 'get_process': 29 process = spawn('cat /proc/{}/cmdline'.format(CLI[2])) 30 31 if '.exe' in process: 32 if 'Z:' in process: 33 process = process.split('Z:')[1] 34 35 process = process.replace('\\', '/') 36 process = process.split('.exe')[0] + '.exe' 37 process = 'wine '+process.replace(' ', r'\ ') 38 39 process = json.dumps(process) 40 if '\\u0000' in process: 41 process = process.replace('\\u0000', ' ') 42 process = json.loads(process) 43 44 if not '.exe' in process: 45 process = process[:-1] 46 47 if process == 'python mainwindow.py': 48 process = 'playonlinux' 49 50 try: 51 proc_array = process.split('/') 52 pa_len = len(proc_array) 53 process_name = proc_array[pa_len - 1].title() 54 55 # Since this is a window backed app, make sure it has an icon association. 56 57 icons_dir = '{}/.local/share/icons/hicolor/48x48/apps/'.format(os.getenv('HOME')) 58 59 if '\\ ' in process_name: 60 process_name = process_name.replace('\\ ', ' ') 61 62 if '.Exe' in process_name: 63 process_name = process_name.replace('.Exe', '') 64 65 icon_file = process_name+'.png' 66 67 if ' ' in icon_file: 68 icon_file = icon_file.replace(' ', '') 69 70 icon = icons_dir+icon_file 71 72 try: 73 try: 74 spawn('gnome-exe-thumbnailer {} {}'.format(process.split('wine ')[1], icon)) 75 except IndexError: 76 spawn('gnome-exe-thumbnailer {} {}'.format(process, icon)) 77 except subprocess.CalledProcessError: 78 icon = None 79 80 g_menu = '[Desktop Entry]\n' \ 81 'Type=Application\n' \ 82 'Encoding=UTF-8\n' \ 83 'Name={}\n' \ 84 'Comment={}\n' \ 85 'Exec={}\n' \ 86 'Terminal=false\n' \ 87 'StartupNotify=true\n'.format(process_name, process_name, process) 88 89 if icon: 90 g_menu += 'Icon={}\n'.format(icon) 91 92 93 if '.exe' in process: 94 g_menu += 'GenericName=Wine application\n' \ 95 'Categories=Wine;\n' \ 96 'MimeType=application/x-ms-dos-executable;' \ 97 'application/x-msi;application/x-ms-shortcut; \n' \ 98 99 desktop_file = '{}.cinnamon-generated.desktop'.format(process_name) 100 desktop_path = '{}/.local/share/applications/{}'.format(os.getenv('HOME'), desktop_file) 101 102 with open(desktop_path, 'w', encoding='utf-8') as desktop: 103 print(g_menu) 104 desktop.write(g_menu) 105 spawn('chmod +x {}'.format(desktop_path)) 106 print(desktop_file) 107 108 except KeyError as err: 109 print(err) 110 return 111 112handle_cli() 113