Skip to content

Instantly share code, notes, and snippets.

@gryf
Last active February 24, 2020 18:15
Show Gist options
  • Save gryf/fa460d5e728d22cdf87c72fd9183bbc1 to your computer and use it in GitHub Desktop.
Save gryf/fa460d5e728d22cdf87c72fd9183bbc1 to your computer and use it in GitHub Desktop.
example of dynamic window maker menu for freedesktop *desktop files.
#!/usr/bin/env python
import argparse
import configparser
from collections import defaultdict
import os
class WMMenu:
APP_DESK_PATH = '/usr/share/applications'
def __init__(self, name):
self._desktop = defaultdict(list)
self._app_map = {}
self.name = name
def _parse_desktop_files(self):
for fname in os.listdir(self.APP_DESK_PATH):
if not fname.endswith('.desktop'):
continue
config = configparser.ConfigParser()
config.read(os.path.join(self.APP_DESK_PATH, fname))
if not config.has_section('Desktop Entry'):
continue
if config['Desktop Entry'].get('nodisplay'):
continue
name = config['Desktop Entry'].get('name')
exe = config['Desktop Entry'].get('exec', raw=True)
if not exe:
continue
for x in ['%f', '%F', '%u', '%U']:
if x in exe:
exe = ' '.join([e.strip() for e in exe.split(x)])
category = config['Desktop Entry'].get('categories',
'').split(';')[0]
if not category:
category = 'uncategorized'
self._desktop[category].append(f'"{name}" EXEC "{exe}"')
def get_menu(self):
menu = ['#include "wmmacros"', f'"{self.name}" MENU']
self._parse_desktop_files()
for category in sorted(self._desktop):
menu.append(f'"{category}" MENU')
for item in sorted(self._desktop[category]):
menu.append(item)
menu.append(f'"{category}" END')
menu.append(f'"{self.name}" END')
return menu
def __str__(self):
return "\n".join(self.get_menu())
def run():
parser = argparse.ArgumentParser()
parser.add_argument("-n", "--name", help="Name of the menu",
default='Applications')
args = parser.parse_args()
wmmenu = WMMenu(args.name)
print(wmmenu)
if __name__ == "__main__":
run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment