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