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