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