By using this site, you agree to have cookies stored on your device, strictly for functional purposes, such as storing your session and preferences.

Dismiss

 __init__.py

View raw Download
text/x-script.python • 2.34 kiB
Python script, ASCII text executable
        
            
1
import asyncio
2
from xdg import DesktopEntry
3
from pathlib import Path
4
import subprocess
5
import logging
6
from gi.repository import Gio
7
import os
8
import gettext
9
10
_ = gettext.gettext
11
12
13
def _get_all_menu_entries():
14
if os.environ.get("XDG_DATA_HOME"):
15
user_directories = [Path(dir).expanduser() / "applications" for dir in os.environ["XDG_DATA_HOME"].split(":")]
16
else:
17
user_directories = [
18
Path.home() / ".local/share/applications",
19
]
20
21
if os.environ.get("XDG_DATA_DIRS"):
22
system_directories = [Path(dir) / "applications" for dir in os.environ["XDG_DATA_DIRS"].split(":")]
23
else:
24
system_directories = [
25
Path("/usr/share/applications"),
26
Path("/usr/local/share/applications"),
27
]
28
29
directories = user_directories + system_directories
30
31
for directory in directories:
32
if directory.exists():
33
for desktop_file in directory.glob("*.desktop"):
34
entry = DesktopEntry.DesktopEntry(str(desktop_file))
35
if entry.getHidden() or entry.getNoDisplay():
36
continue
37
yield entry, desktop_file
38
39
40
def _match_query(entry: DesktopEntry, query: str):
41
return (
42
query.lower() in entry.getName().lower()
43
or query.lower() in entry.getComment().lower()
44
or query.lower() in entry.getExec().lower()
45
or any(query.lower() in keyword.lower() for keyword in entry.getKeywords())
46
)
47
48
49
class Provider():
50
def __init__(self, config: dict):
51
self.config = config
52
self.name = _("Applications")
53
self.icon = "applications-system"
54
self.description = _("Search for installed applications on your device (the same you would find in your application menu).")
55
56
async def search(self, query: str):
57
for entry, desktop_file in _get_all_menu_entries():
58
if _match_query(entry, query):
59
def execute(desktop_file=desktop_file):
60
app_info = Gio.DesktopAppInfo.new_from_filename(str(desktop_file))
61
62
app_info.launch_uris([], None)
63
64
yield {
65
"name": entry.getName() or desktop_file.stem,
66
"description": entry.getComment() or "",
67
"image": ("logo", entry.getIcon() or "application-x-executable"),
68
"execute": execute
69
}
70