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