Created
November 21, 2025 13:31
-
-
Save gryf/b995f0cda58ab3f2e700a58ea9a88624 to your computer and use it in GitHub Desktop.
Generate menu under Window Maker for installed flatpaks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| When wmaker_flatpak_apps.py is in PATH, create menu by adding "Generated Submenu" to the main menu, and as a command put: | |
| wmaker_flatpak_apps.py | |
| it should appear as: | |
| … | |
| (Flatpaks, OPEN_MENU, "|| wmaker_flatpak_apps.py"), | |
| … | |
| in ~/GNUstep/Defaults/WMRootMenu |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python3 | |
| import re | |
| import os | |
| import subprocess | |
| from collections import defaultdict | |
| class WMMenu(object): | |
| BEGIN = '"%s" MENU' | |
| END = '"%s" END' | |
| PAT = re.compile(r'^([a-z0-9_$]+)\s+"(.*)"$') | |
| def _get_names(self): | |
| """return all supported games""" | |
| names = {} | |
| res = subprocess.run(["flatpak", "list", "--app"], | |
| capture_output=True, encoding="utf-8") | |
| for line in res.stdout.split('\n'): | |
| if not line: | |
| continue | |
| name, exec_str, version, *_ = line.split("\t") | |
| names[name + ' ' + version] = exec_str | |
| return names | |
| def __init__(self, name): | |
| self.games = {} | |
| self.program = None | |
| self.path = None | |
| self.flat = False | |
| self.name = name | |
| def get_menu(self): | |
| """Return menu as a list""" | |
| menu = ['#include "wmmacros"', self.BEGIN % self.name] | |
| items = self._get_names() | |
| if len(items) > 25 and not self.flat: | |
| menu.extend(self._make_menu(items)) | |
| else: | |
| menu.extend(self._make_flat_menu(items)) | |
| menu.append(self.END % self.name) | |
| return menu | |
| def _make_menu(self, items): | |
| groups = defaultdict(list) | |
| menu = [] | |
| for key in sorted(items): | |
| groups[key[0].lower()].append((key, items[key])) | |
| groups = dict(groups) | |
| for key in sorted(groups.keys()): | |
| if len(groups[key]) < 4: | |
| menu.extend(self._make_submenu(groups[key])) | |
| continue | |
| menu.append(self.BEGIN % key) | |
| menu.extend(self._make_submenu(groups[key])) | |
| menu.append(self.END % key) | |
| return menu | |
| def _make_submenu(self, items): | |
| submenu = [] | |
| for key, item in items: | |
| submenu.append('"%s" EXEC %s "%s"' % (key, self.program, item)) | |
| return submenu | |
| def _make_flat_menu(self, items): | |
| menu = [] | |
| for key in sorted(items.keys()): | |
| menu.append('"%s" EXEC %s "%s"' % (key, self.program, items[key])) | |
| return menu | |
| def __str__(self): | |
| return "\n".join(self.get_menu()) | |
| def run(): | |
| wmmenu = WMMenu("Flatpak Apps") | |
| wmmenu.program = "flatpak run" | |
| print(wmmenu) | |
| if __name__ == "__main__": | |
| run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment