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.39 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
import izvor_utils as izvor
10
11
_ = gettext.gettext
12
13
14
def _get_all_menu_entries():
15
if os.environ.get("XDG_DATA_HOME"):
16
user_directories = [Path(dir).expanduser() / "applications" for dir in os.environ["XDG_DATA_HOME"].split(":")]
17
else:
18
user_directories = [
19
Path.home() / ".local/share/applications",
20
]
21
22
if os.environ.get("XDG_DATA_DIRS"):
23
system_directories = [Path(dir) / "applications" for dir in os.environ["XDG_DATA_DIRS"].split(":")]
24
else:
25
system_directories = [
26
Path("/usr/share/applications"),
27
Path("/usr/local/share/applications"),
28
]
29
30
directories = user_directories + system_directories
31
32
for directory in directories:
33
if directory.exists():
34
for desktop_file in directory.glob("*.desktop"):
35
entry = DesktopEntry.DesktopEntry(str(desktop_file))
36
if entry.getHidden() or entry.getNoDisplay():
37
continue
38
yield entry, desktop_file
39
40
41
def _match_query(entry: DesktopEntry, query: str):
42
return (
43
query.lower() in entry.getName().lower()
44
or query.lower() in entry.getComment().lower()
45
or query.lower() in entry.getExec().lower()
46
or any(query.lower() in keyword.lower() for keyword in entry.getKeywords())
47
)
48
49
50
class Provider(izvor.Provider):
51
def __init__(self, config: dict):
52
self.config = config
53
self.name = _("Applications")
54
self.icon = "applications-system"
55
self.description = _("Search for installed applications on your device (the same you would find in your application menu).")
56
57
async def search(self, query: str):
58
for entry, desktop_file in _get_all_menu_entries():
59
if _match_query(entry, query):
60
def execute(desktop_file=desktop_file):
61
app_info = Gio.DesktopAppInfo.new_from_filename(str(desktop_file))
62
izvor.run_desktop_entry(app_info)
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