Skip to content

Instantly share code, notes, and snippets.

@gryf
Created November 21, 2025 13:31
Show Gist options
  • Select an option

  • Save gryf/b995f0cda58ab3f2e700a58ea9a88624 to your computer and use it in GitHub Desktop.

Select an option

Save gryf/b995f0cda58ab3f2e700a58ea9a88624 to your computer and use it in GitHub Desktop.
Generate menu under Window Maker for installed flatpaks
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
#!/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