[openbox] Sorry
Stoffe
stoffepojken at gmail.com
Sun Jul 1 09:29:46 EDT 2007
Mikael Magnusson skrev:
> On Sun, 1 Jul 2007, Stoffe wrote:
>
>> I am sorry that I replied to a thread that I was not involved in.
>> About the website both links about the Gnome menus are dead. Thats
>> why I send the original message. I dont wanted to be rude or
>> something. I love the work you guys do and Openbox is the best window
>> manager I have tried. I am sorry if I offended you.
>>
>> Stoffe
>
> Sorry if I sounded like I was offended, I just usually do not use so
> many words. You didn't say you had checked the web site so I assumed
> you hadn't (this is usually the case :). I'll attach the script I have.
>
> --
> Mikael Magnusson
> ------------------------------------------------------------------------
>
> #!/usr/bin/env php
> <?php
>
> $dirs = array (
> "/usr/share/applications",
> "/usr/share/control-center-2.0/capplets",
> $_SERVER["HOME"] . "/.gnome2/vfolders/applications"
> );
>
> function parseDesktopFile($path)
> // {{{
> {
> $desktop = array ();
> $booleans = array ("false" => false, "true" => true);
> $data = file_get_contents($path);
> $data = str_replace("&", "&", $data);
> $lines = explode("\n", $data);
> foreach ($lines as $l => $line) {
> $line = rtrim($line);
> $pos = strpos($line, "=");
> if (!$pos) continue;
> $field = substr($line, 0, $pos);
> $value = substr($line, ($pos + 1));
> if ($value === false) $value = "";
> if (array_key_exists($value, $booleans)) {
> $value = $booleans[$value];
> }
>
> $pos = strpos($field, "[");
> if ($pos) {
> $field_name = strtolower(substr($field, 0, $pos));
> $key = substr($field, ($pos + 1), -1);
> } else {
> $field_name = strtolower($field);
> }
> if ($field_name == "categories") {
> if (substr($value, -1) == ";")
> $value = substr($value, 0, -1);
> $value = explode(";", strtolower($value));
> }
> if (!array_key_exists($field_name, $desktop)) {
> $desktop[$field_name] = $value;
> } else if (!is_array($desktop[$field_name])) {
> $default = $desktop[$field_name];
> $desktop[$field_name] = array ("default" => $default);
> } else {
> $desktop[$field_name][$key] = $value;
> }
> }
> if (!array_key_exists("terminal", $desktop))
> $desktop["terminal"] = false;
> return $desktop;
> }
> // }}}
>
> function storeEntry($name, $exec, $categories, $menu, $indexes = null, $core = false)
> // {{{
> {
> if (is_null($indexes)) { // first call of this function for this desktop file
> $indexes = array ();
> $indexes["c"] = 0;
> $indexes["nc"] = count($categories);
> $indexes["lc"] = $indexes["nc"] - 1;
> }
>
> for ($c =& $indexes["c"]; $c < $indexes["nc"]; $c++) { // loop through each category
> $category =& $categories[$c];
> if ($category == "application") {
> $core = true;
> continue;
> }
> $is_last = ($c == $indexes["lc"]);
> if (array_key_exists($category, $menu)) {
> $core = false;
> if ($is_last) { // put entry in current (sub)menu
> $menu[$category][] = array (
> "appname" => $name,
> "appexec" => $exec
> );
> } else { // look for a matching submenu
> ++$c;
> $menu[$category] = storeEntry($name, $exec, $categories, $menu[$category], $indexes, $core);
> }
> return $menu;
> } else { // unknown category
> if (!$is_last) {
> $core = false;
> continue;
> } else if ($core && $category != "core") { // not a "core" app, not a supported category
> $menu["other"][] = array (
> "appname" => $name,
> "appexec" => $exec
> );
> return $menu;
> } else { // last category, put it in current (sub)menu
> $menu[] = array (
> "appname" => $name,
> "appexec" => $exec
> );
> return $menu;
> }
> }
> }
> return $menu;
> }
> // }}}
>
> function genXML(&$menu, &$labels, $i = 0)
> // {{{
> {
> static $x = 0;
> $xml = "";
> foreach ($menu as $key => $value) {
> $indentation = str_repeat(" ", $i);
> if (is_string($key)) { // recursion
> list ($label,) = each($labels); // advance pointer no matter what
> if (empty($value)) continue; // menu is empty, there's no point in displaying it
> $xml .= $indentation . "<menu id=\"gnome-menu-$x\" label=\"$label\">\n";
> $xml .= genXML($menu[$key], $labels[$label], $i + 1, ++$x);
> $xml .= $indentation . "</menu>\n";
> } else {
> if (empty($value)) continue;
> $xml .= $indentation . "<item label=\"{$value["appname"]}\"><action name=\"Execute\">"
> . "<execute>{$value["appexec"]}</execute></action></item>\n";
> }
> }
> return $xml;
> }
> // }}}
>
> $categories = array (
> "utility" => array (),
> "settings" => array (
> "accessibility" => array (),
> "advancedsettings" => array ()
> ),
> "education" => array (),
> "game" => array (),
> "graphics" => array (),
> "network" => array (),
> "audiovideo" => array (
> "audio" => array (),
> "video" => array ()
> ),
> "office" => array (),
> "other" => array (),
> "development" => array (),
> "science" => array (),
> "system" => array ()
> );
>
> $menu = array (
> "Accessories" => null,
> "Desktop Preferences" => array (
> "Accessibility" => null,
> "Advanced" => null
> ),
> "Education" => null,
> "Games" => null,
> "Graphics" => null,
> "Internet" => null,
> "Multimedia" => array (
> "Audio" => null,
> "Video" => null,
> ),
> "Office" => null,
> "Other" => null,
> "Programming" => null,
> "Scientific Tools" => null,
> "System Tools" => null
> );
>
> $modifiers = array ("%f", "%F", "%u", "%U", "%d", "%D", "%n", "%N", "%i", "%c", "%k", "%v");
>
> $desktops = array ();
> $names = array ();
> foreach ($dirs as $path) {
> $dir = dir($path);
> while (($entry = $dir->read()) !== false) {
> if (substr($entry, -8) != ".desktop") continue;
> $desktop = parseDesktopFile($path . DIRECTORY_SEPARATOR . $entry);
> if ($desktop === false || !array_key_exists("categories", $desktop)) continue;
> !is_array($desktop["name"]) ? $name = $desktop["name"] : $name = $desktop["name"]["default"];
> $key =& $desktop["exec"];
> $desktops[$key] = $desktop;
> $names[$key] = $name;
> }
> }
> asort($names);
> reset($names);
>
> foreach ($names as $key => $name) {
> $desktop =& $desktops[$key];
> $exec = str_replace($modifiers, "", $desktop["exec"]);
> if ($desktop["terminal"]) $exec = "xterm -e $exec";
> $categories = storeEntry($name, $exec, $desktop["categories"], $categories);
> }
> ?>
> <openbox_pipe_menu xmlns="http://openbox.org/"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xsi:schemaLocation="http://openbox.org/
> file:///usr/share/openbox/menu.xsd">
>
> <?php echo genXML($categories, $menu, 1); ?>
>
> </openbox_pipe_menu>
>
> ------------------------------------------------------------------------
>
>
> ---
> To unsubscribe, send a blank email to openbox-unsubscribe at icculus.org
> Mailing list archives: http://icculus.org/cgi-bin/ezmlm/ezmlm-cgi?24
>
I can host that scripts for you if the original host of the Gnome menu
scripts no longer is here. I have spray.se (not very good) with some
unused space. Tell me if you need my help.
Stoffe
More information about the openbox
mailing list