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