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