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