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.23 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
import os
7
import gettext
8
import izvor_utils as izvor
9
10
_ = gettext.gettext
11
12
13
def _get_all_menu_entries():
14
user_directories = [
15
Path.home() / ".local/share/applications",
16
]
17
18
system_directories = [
19
Path("/usr/share/applications"),
20
Path("/var/lib/flatpak/exports/share/applications/"),
21
Path("/var/lib/snapd/desktop/applications"),
22
]
23
24
if os.getenv("FLATPAK_SANDBOX_DIR"):
25
system_directories = [Path("/run/host") / directory.relative_to("/") if str(directory).startswith("/usr/") else directory for directory in system_directories]
26
27
directories = user_directories + system_directories
28
29
for directory in directories:
30
if directory.exists():
31
for desktop_file in directory.glob("*.desktop"):
32
entry = DesktopEntry.DesktopEntry(str(desktop_file))
33
if entry.getHidden() or entry.getNoDisplay():
34
continue
35
yield entry, desktop_file
36
37
38
def _match_query(entry: DesktopEntry, query: str):
39
return (
40
query.lower() in entry.getName().lower()
41
or query.lower() in entry.getComment().lower()
42
or query.lower() in entry.getExec().lower()
43
or any(query.lower() in keyword.lower() for keyword in entry.getKeywords())
44
)
45
46
47
class Provider(izvor.Provider):
48
def __init__(self, config: dict):
49
self.config = config
50
self.name = _("Applications")
51
self.icon = "applications-system"
52
self.description = _("Search for installed applications on your device (the same you would find in your application menu).")
53
54
async def search(self, query: str):
55
for entry, desktop_file in _get_all_menu_entries():
56
if _match_query(entry, query):
57
def execute(desktop_file=desktop_file):
58
izvor.run_desktop_entry(str(desktop_file).removeprefix("/run/host"))
59
60
yield {
61
"name": entry.getName() or desktop_file.stem,
62
"description": entry.getComment() or "",
63
"image": ("logo", entry.getIcon() or "application-x-executable"),
64
"execute": execute
65
}
66