diff options
| author | Arpit Chakladar <arpitchakladar+git@gmail.com> | 2026-08-30 01:01:48 +0530 |
|---|---|---|
| committer | Arpit Chakladar <arpitchakladar+git@gmail.com> | 2026-08-31 05:20:12 +0530 |
| commit | 42a02dea80094145bea4f07c72e84a5868d63e69 (patch) | |
| tree | 4c307e7a03b55f3ed2441cb4e759d6373b907a66 /modules/desktop/eww/activate-windows.py | |
| parent | 66e401fb6324c073a0770e0a4afe6d5cca830046 (diff) | |
| download | home-manager-config-42a02dea80094145bea4f07c72e84a5868d63e69.tar.gz home-manager-config-42a02dea80094145bea4f07c72e84a5868d63e69.zip | |
feat: replaced python scripts with lua
- using lua scripts where we previously used python for lower resource
consumption
Diffstat (limited to 'modules/desktop/eww/activate-windows.py')
| -rw-r--r-- | modules/desktop/eww/activate-windows.py | 118 |
1 files changed, 0 insertions, 118 deletions
diff --git a/modules/desktop/eww/activate-windows.py b/modules/desktop/eww/activate-windows.py deleted file mode 100644 index f07b6a2..0000000 --- a/modules/desktop/eww/activate-windows.py +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env python3 -"""active-windows: emit icons for windows on the currently active -niri workspace, driven by niri's event-stream instead of polling.""" -import json -import subprocess -import gi -from gi.repository import Gio, Gtk - -gi.require_version("Gtk", "3.0") - -icon_theme = Gtk.IconTheme.get_default() -_icon_cache: dict[str, str] = {} - - -def try_desktop_app_info(desktop_id: str): - try: - return Gio.DesktopAppInfo.new(desktop_id) - except TypeError: - return None - - -def resolve_icon_path(app_id: str) -> str: - if not app_id: - return "" - if app_id in _icon_cache: - return _icon_cache[app_id] - - app_info = try_desktop_app_info(f"{app_id}.desktop") \ - or try_desktop_app_info(f"{app_id.lower()}.desktop") - - if app_info is None: - for info in Gio.AppInfo.get_all(): - if isinstance(info, Gio.DesktopAppInfo): - wm_class = info.get_startup_wm_class() - if wm_class and wm_class.lower() == app_id.lower(): - app_info = info - break - - icon_path = "" - gicon = app_info.get_icon() if app_info else None - if gicon is not None: - lookup = icon_theme.lookup_by_gicon(gicon, 24, Gtk.IconLookupFlags.FORCE_SIZE) - if lookup: - icon_path = lookup.get_filename() or "" - if not icon_path: - lookup = icon_theme.lookup_icon(app_id, 24, Gtk.IconLookupFlags.FORCE_SIZE) - if lookup: - icon_path = lookup.get_filename() or "" - - _icon_cache[app_id] = icon_path - return icon_path - - -def niri_json(*args): - out = subprocess.run(["niri", "msg", "-j", *args], - capture_output=True, - text=True, - check=True) - return json.loads(out.stdout) - - -def emit_active_windows(): - workspaces = niri_json("workspaces") - windows = niri_json("windows") - - active_ws = next((w for w in workspaces if w.get("is_active")), None) - active_id = active_ws["id"] if active_ws else None - - on_workspace = [w for w in windows if w.get("workspace_id") == active_id] - - def sort_key(w): - pos = (w.get("layout") or {}).get("pos_in_scrolling_layout") - if pos is not None: - return (0, pos[0], pos[1]) - # floating / positionless windows: push to the end, stable by id - return (1, w["id"], 0) - - on_workspace.sort(key=sort_key) - - result = [ - { - "id": w["id"], - "title": w.get("title", ""), - "app_id": w.get("app_id") or "", - "is_focused": w.get("is_focused", False), - "icon": resolve_icon_path(w.get("app_id") or ""), - } - for w in on_workspace - ] - print(json.dumps(result), flush=True) - - -RELEVANT_EVENTS = { - "WindowOpenedOrChanged", "WindowClosed", "WindowFocusChanged", - "WorkspaceActivated", "WorkspacesChanged", "WindowsChanged", -} - - -def main(): - emit_active_windows() - proc = subprocess.Popen( - ["niri", "msg", "-j", "event-stream"], - stdout=subprocess.PIPE, text=True, bufsize=1, - ) - for line in proc.stdout: - try: - key = next(iter(json.loads(line))) - except (json.JSONDecodeError, StopIteration): - continue - if key in RELEVANT_EVENTS: - try: - emit_active_windows() - except subprocess.CalledProcessError: - pass - - -if __name__ == "__main__": - main() |
