commit 62965391286c902008209a0ceb21557d103b6425 Author: fosslinux Date: Tue Jan 8 14:42:52 2019 +1100 initial commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..931c049 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +all: install + +.PHONY: install + +install: + install -m 755 -o root -g root obamenu /usr/bin/obamenu + install -d -m 755 -o root -g root /usr/share/doc/obamenu + install -m 644 -o root -g root obamenu.txt /usr/share/doc/obamenu/doc diff --git a/debian/README.source b/debian/README.source new file mode 100644 index 0000000..58a883d --- /dev/null +++ b/debian/README.source @@ -0,0 +1,31 @@ +obamenu for Debian +----------------- + + obamenu (New version 1.1.7) is a free open source utility that automagically + creates menus for openbox, an X window manager. + + openbox does have built-in menu capabilities. Unfortunately, though, those + menus must be created manually in openbox's menu.xml config file. While some + users (and potential users!) find this generally cumbersome it is also + unwieldy when installing new applications. + + That's where obamenu enters the scene. obamenu automagically creates complete + openbox menus based on looking at, analyzing, and working on xdg information + provided by most applications. Being badass fast obamenu can be included as a + dynamic item in menu.xml (example is in the docu) providing the user with an + always up to date menu. In case you install a new application, simply have + obox restart (which takes ~ 1 second) to find the new application right away + in the menu. + + While efforts were undertaken to keep obamenu small, resource friendly and + fast (i.e. in line with the philosophy of small windows manager) it is + actually quite capable and knows some tricks such as associating the proper + icons with a menu entry. + + Of course, obamenu does not interfere with any "hard wired" menu entries you + might have made but rather complements them and nicely fits in, either in the + root menu or in some sub menu like "Applications". + + + -- ***REMOVED*** Tue, 08 Jan 2019 13:37:54 +1100 + diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..8022a4c --- /dev/null +++ b/debian/changelog @@ -0,0 +1,7 @@ +obamenu (1.1.7-1) unstable; urgency=medium + + * Upstream release 1.1.7 + * add debian packaging + * add Makefile + + -- ***REMOVED*** Tue, 08 Jan 2019 13:37:54 +1100 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..b4de394 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +11 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..76585c1 --- /dev/null +++ b/debian/control @@ -0,0 +1,36 @@ +Source: obamenu +Section: x11 +Priority: optional +Maintainer: TildeLinux Maintainers +Build-Depends: debhelper (>= 11) +Standards-Version: 4.1.3 +Homepage: http://rmoe.anukis.de/obamenu.html + +Package: obamenu +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, openbox +Description: A utility that creates menus for openbox. + obamenu (New version 1.1.7) is a free open source utility that automagically + creates menus for openbox, an X window manager. + . + openbox does have built-in menu capabilities. Unfortunately, though, those + menus must be created manually in openbox's menu.xml config file. While some + users (and potential users!) find this generally cumbersome it is also + unwieldy when installing new applications. + . + That's where obamenu enters the scene. obamenu automagically creates complete + openbox menus based on looking at, analyzing, and working on xdg information + provided by most applications. Being badass fast obamenu can be included as a + dynamic item in menu.xml (example is in the docu) providing the user with an + always up to date menu. In case you install a new application, simply have + obox restart (which takes ~ 1 second) to find the new application right away + in the menu. + . + While efforts were undertaken to keep obamenu small, resource friendly and + fast (i.e. in line with the philosophy of small windows manager) it is + actually quite capable and knows some tricks such as associating the proper + icons with a menu entry. + . + Of course, obamenu does not interfere with any "hard wired" menu entries you + might have made but rather complements them and nicely fits in, either in the + root menu or in some sub menu like "Applications". diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..7aa6f19 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,36 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: obamenu +Source: + +Files: * +Copyright: 2018 rmoe +License: GPL-2+ + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Files: debian/* Makefile +Copyright: 2019 TildeLinux Maintainers +License: GPL-3+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . diff --git a/debian/obamenu-docs.docs b/debian/obamenu-docs.docs new file mode 100644 index 0000000..7fa9570 --- /dev/null +++ b/debian/obamenu-docs.docs @@ -0,0 +1 @@ +README.source diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..e1c367c --- /dev/null +++ b/debian/rules @@ -0,0 +1,25 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + + +%: + dh $@ + + +# dh_make generated override targets +# This is example for Cmake (See https://bugs.debian.org/641051 ) +#override_dh_auto_configure: +# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) + diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/obamenu b/obamenu new file mode 100755 index 0000000..445b7a6 --- /dev/null +++ b/obamenu @@ -0,0 +1,210 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Version 1.1.7 +# ---- config --- +applications_dirs = ("/usr/share/applications", ) +image_dir_base = "/usr/share" # without "pixmaps" -/usr/local/share in FreeBSD, /usr/share on linux +icon_Theme = "Humanity" +image_cat_prefix = "applications-" # if empty will create no icon text only menu +application_groups = ("Office", "Development", "Graphics", "Internet", "Games", "System", "Multimedia", "Utilities", "Settings") +group_aliases = {"Audio":"Multimedia","AudioVideo":"Multimedia","Network":"Internet","Game":"Games", "Utility":"Utilities", "GTK":"", "GNOME":""} +ignoreList = ("evince-previewer", "Ted", "wingide3.2", "python3.4", "feh","xfce4-power-manager-settings" ) +terminal_string = "evte -e" # your favourites terminal exec string +simpleOBheader = False # print full xml style OB header +# --- End of user config --- + +import glob + +class dtItem(object): + def __init__(self, fName): + self.fileName = fName + self.Name = "" + self.Comment = "" + self.Exec = "" + self.Terminal = None + self.Type = "" + self.Icon = "" + self.Categories = () + + def addName(self, data): + self.Name = xescape(data) + + def addComment(self, data): + self.Comment = data + + def addExec(self, data): + if len(data) > 3 and data[-2] == '%': # get rid of filemanager arguments in dt files + data = data[:-2].strip() + self.Exec = data + + def addIcon(self, data): + self.Icon = "" + if image_cat_prefix == "": + return + image_dir = image_dir_base + "/pixmaps/" + di = data.strip() + if len(di) < 3: + #"Error in %s: Invalid or no icon '%s'" % (self.fileName, di) + return + dix = di.find("/") # is it a full path? + if dix >= 0 and dix <= 2: # yes, its a path (./path or ../path or /path ...) + self.Icon = di + return + #else a short name like "myapp" + tmp = image_dir + di + ".*" + tmp = glob.glob(tmp) + if len(tmp) > 0: + self.Icon = tmp[0] + return + + def addTerminal(self, data): + if data == "True" or data == "true": + self.Terminal = True + else: + self.Terminal = False + + def addType(self, data): + self.Type = data + + def addCategories(self, data): + self.Categories = data + +def getCatIcon(cat): + iconDir = image_dir_base + "/icons/" + icon_Theme + "/categories/24/" + cat = image_cat_prefix + cat.lower() + tmp = glob.glob(iconDir + cat + ".*") + if len(tmp) > 0: + return tmp[0] + return "" + +def xescape(s): + Rep = {"&":"&", "<":"<", ">":">", "'":"'", "\"":"""} + for p in ("&", "<", ">", "'","\""): + sl = len(s); last = -1 + while last < sl: + i = s.find(p, last+1) + if i < 0: + done = True + break + last = i + l = s[:i] + r = s[i+1:] + s = l + Rep[p] + r + return s + +def process_category(cat, curCats, appGroups = application_groups, aliases = group_aliases ): + # first process aliases + if aliases.has_key(cat): + if aliases[cat] == "": + return "" # ignore this one + cat = aliases[cat] + if cat in appGroups and cat not in curCats: # valid categories only and no doublettes, please + curCats.append(cat) + return cat + return "" + + +def process_dtfile(dtf, catDict): # process this file & extract relevant info + active = False # parse only after "[Desktop Entry]" line + fh = open(dtf, "r") + lines = fh.readlines() + this = dtItem(dtf) + for l in lines: + l = l.strip() + if l == "[Desktop Entry]": + active = True + continue + if active == False: # we don't care about licenses or other comments + continue + if l == None or len(l) < 1 or l[0] == '#': + continue + if l[0]== '[' and l != "[Desktop Entry]": + active = False + continue + # else + eqi = l.split('=') + if len(eqi) < 2: + print "Error: Invalid .desktop line'" + l + "'" + continue + # Check what it is ... + if eqi[0] == "Name": + this.addName(eqi[1]) + elif eqi[0] == "Comment": + this.addComment(eqi[1]) + elif eqi[0] == "Exec": + this.addExec(eqi[1]) + elif eqi[0] == "Icon": + this.addIcon(eqi[1]) + elif eqi[0] == "Terminal": + this.addTerminal(eqi[1]) + elif eqi[0] == "Type": + if eqi[1] != "Application": + continue + this.addType(eqi[1]) + elif eqi[0] == "Categories": + if eqi[1][-1] == ';': + eqi[1] = eqi[1][0:-1] + cats = [] + # DEBUG + dtCats = eqi[1].split(';') + for cat in dtCats: + result = process_category(cat, cats) + this.addCategories(cats) + else: + continue + # add to catDict + #this.dprint() + if len(this.Categories) > 0: # don't care about stuff w/o category + for cat in this.Categories: + catDict[cat].append(this) + +categoryDict = {} + +if __name__ == "__main__": + # init the application group dict (which will contain list of apps) + for appGroup in application_groups: + categoryDict[appGroup] = [] + + # now let's look into the app dirs ... + for appDir in applications_dirs: + appDir += "/*.desktop" + dtFiles = glob.glob(appDir) + + # process each .desktop file in dir + for dtf in dtFiles: + skipFlag = False + for ifn in ignoreList: + if dtf.find(ifn) >= 0: + skipFlag = True + if skipFlag == False: + process_dtfile(dtf, categoryDict) + + # now, generate jwm menu include + if simpleOBheader == True: + print '' # magic header + else: + print '' # magic header + appGroupLen = len(application_groups) + for ag in range(appGroupLen ): + catList = categoryDict[application_groups[ag]] + if len(catList) < 1: + continue # don't create empty menus + catStr = "" + for app in catList: + progStr = "" % app.Exec + print progStr + print "" + print "" # magic footer + pass # done/debug break diff --git a/obamenu.txt b/obamenu.txt new file mode 100644 index 0000000..9674d2b --- /dev/null +++ b/obamenu.txt @@ -0,0 +1,101 @@ +obamenu + +(news and updates can be found at the bottom) + +obamenu (openbox automenu) is a menu generator for the openbox window manager. Rather than striving for full and complete xdg compliance +obamenu offers a reasonable basic level of xdg compliance and focuses on low resource usage and pragmatic issues. + +obamenu consists of a single python file without any exotic imports. It has been developed with Python 2.7 should, however, work fine with +any Python > 2.5 (possibly even older) and with Python's standard included batteries. + +Usage: + +obamenu + +That's it. No options, no parameters, simple as that. But ... + +As openbox users are not afraid of editing config files, a decision was taken to make obamenu's configuration powerful yet simple not by +command line üarameters or a config file but by having a short config section right within obamenu itself. + +The basic idea + +It seems reasonable to assume that openbox users are quite different from users of the more common and usually monstrous window managers. +And while obamenu is perfectly capable to just splash the usual full menu into your .jwmrc the authors needs (and assumptions on other +openbox users needs) and accordingly obamenu's capabilities are somewhat more refined. + +First some basics. On pretty much any halfway modern Unixoid OS, there is some directory with ".desktop" files which contain information +about applications needed by the OS; things like its name, the command, possibly some comment, and so on. On most linuxes and BSD +this directory is "/usr/share/applications". Of course, as with every standard, there's some idio^H^H^H^H players (like Gnome) who don't +care that much and dump their .desktop files elsewhere and anywhere. +Similarly there is also a place for all those nice application (not OS!) icons. Usually they are in "/usr/share/pixmaps". +Last but not least, there are "Categories" into which applications are grouped in menus. Btw, obamenu does not show empty categories to +avoid senseless clutter. + +So, let's have a look at a obamenu's config section and its bits and pieces: + +# ---- config --- +applications_dirs = ("/usr/share/applications", ) +image_dir = "/usr/share/pixmaps" +application_groups = ("Office", "Development", "Graphics", "Internet", "Games", "System", "Multimedia", "Utility", "Settings") +group_aliases = {"Audio":"Multimedia","AudioVideo":"Multimedia","Game":"Games", "GTK":""} +ignoreList = ("evince-previewer", "python3.4", "feh","xfce4-power-manager-settings" ) +terminal_string = "svte -e" # your favourites terminal exec string +# --- End of user config --- + +The first one, "applications_dirs" is a list of directories in which .desktop files are to be found. The default, which should be fine for most +users, is where .desktop files are usually put by linux or BSD. Feel free to add more, for instance some subdirectory within your $HOME. +The next one, "image_dir", is quite similar but is about icon images for applications. A small caveat, though: While most applications are +nicely putting their .desktop files into the standard directory, the story with icons is quite different. Particularly the wm behemoths like +Gnome tend to spread icon files all over the place. Often, for instance, icon files are to be found in some obscure subdirectory of +"/usr/share/icons" buried deep depending in the chosen theme and the icon size. The author of obamenu admits freely to have taken a +rather deliberate choice in that regard by having image_dir be a simple string rather than a list, which might seem to be a reasonable way +to some. The author, however, didn't consider it wise to play find and catch with ignorance and idiosyncrasies of some parties. He rather +chose to use the trusted Unix mechanism of links. In other words: You are advised to soft link all icon files outside the standard icon directory +to /usr/share/pixmaps or similar. ("find" is your friend, e.g. find /usr/share/icons -name 'foo.*'). + +The next setting, "application_groups" looks innocent enough but has some power with it. Obviously the entries in that list are "menu +groups" or categories into which xdg menus put the applications depending on some .desktop data. You might want to keep in mind +that obamenu keeps categories in the the order of this setting, i.e. you will find those categories in the menu in that order, too. +And then there are buts ... +The first but is that you almost certaintly don't want more categories than the number of citizens in your home town. Another and more +interesting but is that, obviously, usage profiles are different. For me as a developer, for instance, a "shows coloured stuff or makes sound" +category seems sensibly sufficient; some movie editing people though might have quite different views... which brings us to the next +setting. +"group_aliases" is a list of string pairs, the first one being what is put as category in the .desktop file(s) and the second one being the +category it will end up in. In other words: this is your chance to rearrange things the way you want them. The author, for instance, has a +rather frugal attitude regarding multimedia; accordingly, he simply throws anything audio or video related into one category "multimedia". +To illustrate, though admittedly somewhat construed, another potentially useful feature, have a look at "GTK" in those string pairs. Its second +string is empty which comes down to telling obamenu "ignore that stuff. Don't put it into my menu". The reason being that openbox *only* +creates menus for applications being sorted into a category. No category, no menu entry. +Hint: This setting may also be used to have translated strings in your menu; simply have the english cat. string aliased to a translated version. + +The second to last setting, "ignoreList" is what its name suggests. It's a list of .desktop file names (without the ".desktop" part) you wish to +ignore, i.e. to not have in your menu for whatever reason. +Finally the last setting, "terminal_string", is telling obamenu how to call your favourite terminal emulator for console applications like "htop". +(obamenu automagically takes care of having console applications called in a terminal emulator). + +Note that the auto-generated menu can be put right into the menu section of an openbox menu.xml +Last but not least you can, of course, also send obamenu's output to a file which can be edited, inserted manually, feed your cat, and all +the other things Unixoids can do with files. + +Just to avoid misunderstandings, here's an example (the authors usage) of obamenu in a ob menu.xml file: + + + + +License: + obamenu is under a dual license depending on who you are. If you are using it as a private person (which also means non-commercially) + it's under a 3 clause BSD license. If you are using it as or in the context of anything not private, for instance, in a business or an agency, + it's under GPL v.2. + +Disclaimer: The author uses mainly jwm. While obamenu has been tested to work properly it has been considerably less tested than the authors +jwmamenu (same thing but for jwm. In fact, obamenu has been derived from jwmamenu). + +The main motivation behind obamenu was the fact that openbox-menu (probably the most used menu generator for ob) doesn't compile properly on FreeBSD +and the author saw absolutely no reason why a menu generator couldn't - and shouldn't - be cross platform (e.g. using Python). + +News & Updates: + +- ported (from jwmamenu) smarts to get rid of '%x' target specifiers in Exec spec. (used for file managers but disturbing in menus) +- ported search for category icons in configurable Theme +- some cleaning up and small enhancements, mainly for speed.