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