[OpenBox] Menus dynamiques.

Xorg, Compiz, KDE / Gnome / Xfce / Fluxbox / e17 / fvwm ... GDM/KDM/XDM...
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

[OpenBox] Menus dynamiques.

Message par mimas »

Une petite contribution pour permettre d'avoir des menus dynamiques dans OpenBox en utilisant les informations puisées dans les fichiers .desktop.

J'ai utilisé lua et j'ai essayé de garder à l'esprit d'avoir quelque chose de rapide et simple. Comparé avec un script php faisant la même chose il n'y a pas photo sur la rapidité de lua.

Il y a besoin de l'extension luafilesystem pour que ça fonctionne (pacman -S lua luafilesystem).

Code : Tout sélectionner

#!/usr/bin/env lua
--      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 version 3 (GPLv3)
--      
--      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.
require ("lfs")

-- Localisation désirée pour le nom, commentaire et nom générique.
local locale="fr"

-- Gestionnaire de fenêtres courant (utilisé pour OnlyShowIn).
local current_wm="openbox"

-- programme utilisé pour lancer les applications consoles.
local terminal="sakura -e"

-- Où sera stocké le menu.
local menu = {}


--- returnCategory
-- permet de donner un nom à une liste de catégories.
-- TODO: retourner aussi une image pour la catégorie.
function returnCategory(desktop)
	if desktop["categories"] == nil then
		return nil;
	end
	
	if string.find(desktop["categories"],"AudioVideo") then
		return "Audio/Video"
	end
	if string.find(desktop["categories"],"Education") then
		return "Éducation"
	end
	if string.find(desktop["categories"],"Development") then
		return "Développement"
	end
	if string.find(desktop["categories"],"Game") then
		return "Jeux"
	end
	if string.find(desktop["categories"],"Graphics") then
		return "Graphiques"
	end
	if string.find(desktop["categories"],"Network") then
		return "Réseau"
	end
	if string.find(desktop["categories"],"Office") then
		return "Bureautique"
	end
	if string.find(desktop["categories"],"Settings") then
		return "Réglages"
	end
	if string.find(desktop["categories"],"System") then
		return "Système"
	end
	if string.find(desktop["categories"],"Utility") then
		return "Utilitaires"
	end

	return "Autres"
end


--- loadDesktop
-- retourne une liste de propriétés pour un fichier .deskop.
-- arg: nom complet du fichier
-- ret: structure (terminal, exec, name, genericname, comment, icon,hidden)
--
-- name, genericname et comment sont localisés si possible. 
-- Pour avoir la version originale mettre la variable locale à c (de préférence)
function loadDesktop(filename)
	local desktop_file
	local line
	local pos
	local program={
			terminal=false,
			exec,
			name,
			genericname,
			comment,
			icon,
			hidden=false
		}
	
	if string.sub(filename,-7) ~= "desktop" then
		return nil
	end

	desktop_file=io.open(filename,"r")
	if desktop_file == nil then
		print ("Erreur : impossible de charger fichier", filename)
		return nil
	end
	
	line = desktop_file:read()
	while line ~= nil do
		pos = string.find(line,"=")
		if pos ~= nil then
			local key=string.lower(string.sub(line,1,pos-1))
			local value=string.sub(line,pos+1)
			
			if key == "type" then
				program.type=string.lower(value)
			
			elseif key == "terminal" and string.lower(value) == "true" then
				program.terminal=true
				
			elseif key == "name" and program.name == nil then
				program.name=value
			elseif key =="name["..locale.."]" then
				program.name=value
--[[				
			elseif key == "genericname" and program.genericname == nil then
				program.name=value
			elseif key == "genericname["..locale.."]" then
				program.genericname=value
				
			elseif key == "comment" and program.comment == nil then
				program.comment=value
			elseif key == "comment["..locale.."]" then
				program.comment=value
]]				
			elseif key == "icon" then
				program.icon=value
				
			elseif key == "categories" then
				program.categories=value
				
			elseif key == "exec" then
				pos = string.find(value," %%[fFuUdDnNickvm]")
				if pos ~= nil then 
					program.exec = string.sub(value,1,pos-1)
				else
					program.exec=value
				end
				
			elseif key=="onlyshowin" and current_wm then
				if not string.find(value,current_wm) then
					program.hidden=true
				end
			end
		end
		line=desktop_file:read() 
	end
	desktop_file:close()
	
	if program.terminal then
		program.exec = terminal .." ".. program.exec
	end
	
	return program
end


--- readDirectory(appdir)
-- lit non récursivement les fichiers .desktop du répertoire appdir.
function readDirectory(appdir)
	local appinfo
	local category
	local file
	local entry
	
	for file in lfs.dir(appdir) do
		if file ~= "." and file ~= ".." then
			appinfo = loadDesktop(appdir.."/"..file)
			if appinfo then
				if appinfo.type == "application" and not appinfo.hidden then
					category = returnCategory(appinfo)
					if category ~= nil then
						if menu[category] == nil then menu[category] = {} end
						menu[category][appinfo.name]={exec=appinfo.exec,icon=appinfo.icon}
					else
						menu[appinfo.name]={exec=appinfo.exec,icon=appinfo.icon}
					end
				end
			end
		end
	end
end


--- generateMenuJWM
-- génère un menu dynamique pour JWM à intégrer dans .jwmrc avec
-- <Include>exec:lua /path/nomfichier.lua</Include>
function generateMenuJWM()
	print ("<JWM>")
	for i,k in pairs(menu) do
		if k.exec == nil then
			print("<Menu label=\""..i.."\">")
			for name,data in pairs(k) do
				print("  <Program icon=\"".. data.icon .."\" label=\"".. name .."\">".. data.exec .."</Program>")
			end
			print("</Menu>")
		else 
			print("<Program icon=\"".. k.icon .."\" label=\"".. i .."\">".. k.exec .."</Program>")
			print("</item>")
		end
	end
	print("</JWM>")
end


--- generateMenuOpenBox
-- génère un menu dynamique pour OpenBox à intégrer dans menu.xml avec
-- <menu id="id" label="label" execute="lua /path/nomfichier.lua" />
-- et
-- <menu id="id" /> dans le menu "root-menu"
function generateMenuOpenBox()
	print ([[<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">]])
	for i,k in pairs(menu) do
		if k.exec == nil then
			print("<menu id=\"gnome-menu-".. i .."\" label=\"".. i .."\">")
			for name,data in pairs(k) do
				print("  <item label=\"".. name .."\">")
				print("    <action name=\"Execute\"><execute>".. data.exec .."</execute></action>")
				print("  </item>")
			end
			print("</menu>")
		else 
			print("<item label=\"".. i .."\">")
			print("  <action name=\"Execute\"><execute>".. k.exec .."</execute></action>")
			print("</item>")
		end
	end
	print("</openbox_pipe_menu>")
end

readDirectory("/usr/share/applications")
-- readDirectory("/home/mimas/.local/share/applications")

-- *** Choisir generateMenuJWM() ou generateMenuOpenBox ***
generateMenuOpenBox()
Comme vous pouvez vous en rendre compte cela fonctionne aussi pour JWM (mais les images sont encore moyennement supportées car pas trop ma préocupation).

Des questions ? Écrivez les à la suite.
Anarchy for the triple A.
Avatar de l’utilisateur
marc[i1]
Maître du Kyudo
Messages : 1753
Inscription : ven. 27 oct. 2006, 10:48
Localisation : Nantes (44)

Message par marc[i1] »

Mais … mais … mais … c'est génial !

par contre, question de neuneu !
pourquoi lua et pas bash ou C ou python ou ruby (pour le hype) ?
Ne vous emmerdez plus, emmerdez les autres.
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

marc[i1] a écrit :pourquoi lua et pas bash ou C ou python ou ruby (pour le hype) ?
Pourquoi lua ?

On va dire :
- la taille. Lua et l'extension font 700Ko tout mouillé, et j'ai prévu le script pour tourner sur une vieille machine (un P1).
- la vitesse de développement. C'est très rapide et c'est un langage simple.
- la vitesse d'exécution. Lua se montre bien plus véloce que python dans la plupart des cas. On peut aussi compiler le script en code lua natif pour ne pas avoir à l'interpréter à l'exécution, donc perdre un peu de temps.
- parce que c'est hype. Lua c'est Grim Fandango, World of Warcraft, Crysis, Far Cry, Xmoto, Celestia... C'est tellement hype que peu de personnes le sait. :)

En bash ? Non merci, c'est illisible ce truc là. :p
En C ? Heu... il me faudrait 3 à 4 fois plus de lignes, même en utilisant les fonctions de glib2 pour lire les fichiers desktop et tout ça pour un gain pas particulièrement significatif*.
En python ? pourquoi pas mais c'est 46Mo sur le disque. :)

*Il est possible d'écrire le résultat dans menu xml qui sera lu par openbox et de régénérer ce fichier à la demande au lieu que ce soit à chaque affichage du menu. C'est un peu ce que fait JWM, mais en mémoire.
Anarchy for the triple A.
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Gestion des bookmarks gtk

Message par mimas »

Autre exemple de script, cette fois pour afficher les bookmarks gtk et aller à l'emplacement avec thunar.

Un fichier menu.xml modifié pour l'occasion

Code : Tout sélectionner

<openbox_menu xmlns="http://openbox.org/3.4/menu">
	<menu id="bookmarks-menu" label="Bookmarks" execute="lua ~/.config/openbox/bookmarks.lua" />
[..]
<menu id="root-menu" label="Openbox 3">
  	[...]
  	<menu id="bookmarks-menu" />
  	<separator />
[...]
Le script LUA qui permet d'afficher les entrées du bookmark en entrées du menu openbox.

Code : Tout sélectionner

local bookmarks=io.open(os.getenv("HOME").."/.gtk-bookmarks","r")

-- simple vérification
if bookmarks == nil then
	os.exit(1)
end

print ([[<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">]])  	
while true do
	local bookmark=bookmarks:read()
	if bookmark == nil then break end
	
	for location, name in string.gmatch(bookmark, "(.+)%s(.+)") do
		print("<item label=\"".. name .."\">")
		print("  <action name=\"Execute\"><execute>thunar ".. location .."</execute></action>")
		print("</item>")
  end
end 
print("</openbox_pipe_menu>")

bookmarks:close()
Anarchy for the triple A.
PH
newbie
Messages : 3
Inscription : mar. 15 juil. 2008, 18:59

Message par PH »

Bjr,
Je suis nouveau sur le site, comme sur Linux, et je trouve très intéressant le script pour avoir des icônes dans le menu OpenBox.
Malheureusement je ne suis pas assez au fait pour mettre les choses à leurs bonnes places.
J'ai placé la première partie du script

Code : Tout sélectionner

 #!/usr/bin/env lua ...

... return program 
end 
dans un fichier "menu.lua'

Dans cette partie on trouve

Code : Tout sélectionner

-- Où sera stocké le menu.
local menu = {}
de quel menu s'agit-t-il ?

Ensuite (je laisse de coté JWM) la derniière partie

Code : Tout sélectionner

--- generateMenuOpenBox ....

-- *** Choisir generateMenuJWM() ou generateMenuOpenBox ***
generateMenuOpenBox(
c'est aussi problématique pour moi. J'ai tout mis dans menu.xml mais la syntaxe qui est dans le code ici n'est pas tout à fait la même que celle d'OpenBox

Si vous aviez 5 mn à consacrer à mon exercice en "brasse coulée" ?
Merci
@+
Dernière modification par PH le mer. 16 juil. 2008, 00:11, modifié 1 fois.
Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2784
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées

Message par mélodie »

PH a écrit :Bjr,
Je nouveau sur le site, comme sur Linux, et je trouve très intéressant le script pour avoir des icônes dans le menu OpenBox.
Malheureusement je ne suis pas assez au fait pour mettre les choses à leurs bonnes places.
J'ai placé la première partie du script

Code : Tout sélectionner

 #!/usr/bin/env lua ...

... return program 
end 
dans un fichier "menu.lua'

Dans cette partie on trouve

Code : Tout sélectionner

-- Où sera stocké le menu.
local menu = {}
de quel menu s'agit-t-il ?
Bonjour,

Je vais te donner une réponse qui vaut ce qu'elle vaut, étant donné que j'utilise ce script, quand je lance une session openbox, et étant donné que je ne lis pas du tout le lua.

Si tu prends un morceau du script et que tu l'isoles du contexte du reste du script, tu vas en perdre le sens. C'est un peu comme si tu sors un raisin sec d'une salade composée et que tu demandes s'il y apporte beaucoup de sucre. Vu comme ça, comment pourrait-on savoir ?

Il faut manger la salade telle qu'elle a été cuisinée par le chef, pour savoir si elle est bonne. ;)
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Message par tuxce »

PH a écrit :Bjr,
Je nouveau sur le site, comme sur Linux, et je trouve très intéressant le script pour avoir des icônes dans le menu OpenBox.
salut, les icones, c'est jwm, non pour openbox...
PH
newbie
Messages : 3
Inscription : mar. 15 juil. 2008, 18:59

Message par PH »

Re-
Ok merci.
Dommage, mais de toute façon je n'arrive pas à le faire fonctionner
@+
Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2784
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées

Message par mélodie »

PH a écrit :de toute façon je n'arrive pas à le faire fonctionner
As-tu suivi les instructions de mimas ?
Il y a besoin de l'extension luafilesystem pour que ça fonctionne (pacman -S lua luafilesystem).
PH
newbie
Messages : 3
Inscription : mar. 15 juil. 2008, 18:59

Message par PH »

Bjr,
J'ai regardé mais cette extension est peut être incluse dans un .deb plus général ?
Sur Ubuntu certains scripts sont en .lua, j'en ai déduit que celui-ci devait pouvoir être lu sans ajout.
Je vais refaire un tour.
Merci
@+
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Message par tuxce »

PH a écrit :Bjr,
J'ai regardé mais cette extension est peut être incluse dans un .deb plus général ?
.deb :shock: :?:
sous debian et cie, c'est liblua5.1-filesystem0 (vachement paratique quand on connait pas la version :))
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

Je viens de refaire mon menu dynamique pour openbox. Mais cette fois-ci sans lua, en vrai langage du barbu des Alpes, Vala. Et puis ça m'évitera de devoir compiler lua-filesystem quand je change de distro. :)

Ouais, Vala c'est bien. C'est mieux que C++ parce que ça ressemble à un C# sans menaces latentes de la part de Microsoft et parce qu'il ne faut pas installer 320Go de dépendances et de runtime.

Code : Tout sélectionner

using GLib;

/* Répertoires où il va lire les .desktop */
public const string[] directories = {
	"/usr/share/applications/",
	"/home/mimas/.local/share/applications/"
};

public
enum Category {
	AUDIOVIDEO,
	DEVELOPMENT,
	EDUCATION,
	GAME,
	GRAPHICS,
	MISC,
	NETWORK,
	SETTINGS,
	NONE,
	OFFICE,
	SYSTEM,
	UTILITY
}

public
struct DesktopEntry
{
	public string name;
	public string exec;
	public uint category;
}

private
string sanitize_execname(string exec)
{
	string new_exec = null;

	if (exec.contains("%"))
	{
		if (exec.contains("%f"))
			new_exec = exec.replace("%f","");
		else if (exec.contains("%F"))
			new_exec = exec.replace("%F","");
		else if (exec.contains("%u"))
			new_exec = exec.replace("%u","");
		else if (exec.contains("%U"))
			new_exec = exec.replace("%U","");
		else if (exec.contains("%d"))
			new_exec = exec.replace("%d","");
		else if (exec.contains("%D"))
			new_exec = exec.replace("%D","");
		else if (exec.contains("%n"))
			new_exec = exec.replace("%n","");
		else if (exec.contains("%N"))
			new_exec = exec.replace("%N","");
		else if (exec.contains("%i"))
			new_exec = exec.replace("%i","");
		else if (exec.contains("%c"))
			new_exec = exec.replace("%c","");
		else if (exec.contains("%k"))
			new_exec = exec.replace("%k","");
		else if (exec.contains("%v"))
			new_exec = exec.replace("%v","");
		else if (exec.contains("%m"))
			new_exec = exec.replace("%m","");

		return new_exec.chomp();
	}
	return exec;
}

private
void populate_menu_with_desktop(
				ref SList<DesktopEntry?> list,
				string filename)
{
	DesktopEntry d = DesktopEntry();
	string category;

	GLib.KeyFile desktop = new KeyFile();

	try
	{
		if( desktop.load_from_file(filename, GLib.KeyFileFlags.NONE))
		{
			d.name = desktop.get_locale_string("Desktop Entry", "Name", null);

			if (d.name==null)
				return;

			d.exec = sanitize_execname(desktop.get_string("Desktop Entry", "Exec"));

			if (desktop.has_key("Desktop Entry", "Categories"))
			{
				category = desktop.get_string("Desktop Entry", "Categories");

				if (category.contains("AudioVideo"))
					d.category = Category.AUDIOVIDEO;
				else if (category.contains("Development"))
					d.category = Category.DEVELOPMENT;
				else if (category.contains("Education"))
					d.category = Category.EDUCATION;
				else if (category.contains("Game"))
					d.category = Category.GAME;
				else if (category.contains("Graphics"))
					d.category = Category.GRAPHICS;
				else if (category.contains("Network"))
					d.category = Category.NETWORK;
				else if (category.contains("Settings"))
					d.category = Category.SETTINGS;
				else if (category.contains("Office"))
					d.category = Category.OFFICE;
				else if (category.contains("Utility"))
					d.category = Category.UTILITY;
				else if (category.contains("System"))
					d.category = Category.SYSTEM;
				else
					d.category = Category.MISC;
			}
			else
				d.category = Category.NONE;

			list.append(d);
			return;
		}
	}
	catch (Error e)
	{
		//stdout.printf("%s - %s\n", filename, e.message);
	}
	return;
}

private
void write_openbox_menu(
				SList<DesktopEntry?> list,
				string name,
				uint category)
{
	bool display_menu = true;
	bool in_menu = false;

	foreach (DesktopEntry de in list)
	{
		if (de.category == category)
		{
			if (display_menu == true && name != "") {
				stdout.printf("<menu id=\"menu-%s\" label=\"%s\">\n", name, name);
				display_menu = false;
				in_menu = true;
			}
			stdout.printf("  <item label=\"%s\">", de.name);
			stdout.printf("<action name=\"Execute\"><execute>%s</execute></action>", de.exec);
			stdout.printf("</item>\n");
		}
	}
	if (in_menu == true)
		stdout.printf("</menu>\n");
}

public
int main(string[] argv)
{
	string entry;
	SList<DesktopEntry?> menulist = new SList<DesktopEntry?>();

	foreach (string directory in directories)
	{
		try
		{
			Dir dir = GLib.Dir.open(directory);
			while ( (entry = dir.read_name()) != null )
				populate_menu_with_desktop(ref menulist, Path.build_filename(directory, entry));
		}
		catch (Error e)
		{
			stdout.printf("%s\n", e.message);
		}
	}

	stdout.printf("<openbox_pipe_menu xmlns=\"http://openbox.org/\"");
	stdout.printf(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
	stdout.printf("	xsi:schemaLocation=\"http://openbox.org/ file:///usr/share/openbox/menu.xsd\">\n");
	write_openbox_menu(menulist, "", Category.NONE);
	stdout.printf("<separator />");
	write_openbox_menu(menulist, "Developpement", Category.DEVELOPMENT);
	write_openbox_menu(menulist, "Jeux", Category.GAME);
	write_openbox_menu(menulist, "Audio/Vidéo", Category.AUDIOVIDEO);
	write_openbox_menu(menulist, "Éducation", Category.EDUCATION);
	write_openbox_menu(menulist, "Graphisme", Category.GRAPHICS);
	write_openbox_menu(menulist, "Bureautique", Category.OFFICE);
	write_openbox_menu(menulist, "Utilitaire", Category.UTILITY);
	write_openbox_menu(menulist, "Internet", Category.NETWORK);
	write_openbox_menu(menulist, "Système", Category.SYSTEM);
	write_openbox_menu(menulist, "réglages", Category.SETTINGS);
	write_openbox_menu(menulist, "Autres", Category.MISC);
	stdout.printf("</openbox_pipe_menu>");

	return 0;
}
Aouch ! Ça fait long quand même.

Je n'ai pas mis la détection si ça fonctionne dans un terminal, ni si on affiche uniquement dans un WM particulier. Je n'en ai jamais eu besoin depuis le temps.

PS : Puis Vala c'est la plus forte. Elle a cassé la gueule aux Goa'ulds et aux Oris.
Dernière modification par mimas le jeu. 26 févr. 2009, 23:42, modifié 3 fois.
Anarchy for the triple A.
Avatar de l’utilisateur
marc[i1]
Maître du Kyudo
Messages : 1753
Inscription : ven. 27 oct. 2006, 10:48
Localisation : Nantes (44)

Message par marc[i1] »

mimas a écrit :PS : Puis Vala c'est la plus forte. Elle a cassé la gueule aux Goa'ulds et aux Oris.
J’ai rien capté au code mais ça j’approuve :lol:
Ne vous emmerdez plus, emmerdez les autres.
maroxe
yeomen
Messages : 245
Inscription : jeu. 05 févr. 2009, 22:45

Re: [OpenBox] Menus dynamiques.

Message par maroxe »

comment utiliser le script? le lancer à chaque demarrage? a chaque installation?
Image
Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2784
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées

Re: [OpenBox] Menus dynamiques.

Message par mélodie »

maroxe a écrit :comment utiliser le script?
Salut,

C'est un programme, pas un script. Il faut le compiler, mais ne me demande pas comment, je n'en sais rien. C'est du côté de Vala qu'il faut regarder...
maroxe
yeomen
Messages : 245
Inscription : jeu. 05 févr. 2009, 22:45

Re: [OpenBox] Menus dynamiques.

Message par maroxe »

mélodie a écrit :
maroxe a écrit :comment utiliser le script?
Salut,

C'est un programme, pas un script. Il faut le compiler, mais ne me demande pas comment, je n'en sais rien. C'est du côté de Vala qu'il faut regarder...
lua c'est un langage de script à ce que je sache, non?
#!/usr/bin/env lua
Image
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17559
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [OpenBox] Menus dynamiques.

Message par benjarobin »

maroxe a écrit :lua c'est un langage de script à ce que je sache, non?
#!/usr/bin/env lua
Eu tu es sure d'avoir bien lu le fils de la discutions ?
Au début il y avait un script lua, puis il est passé à Vala
Ne m'en demande pas plus, je connais pas
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2784
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées

Re: [OpenBox] Menus dynamiques.

Message par mélodie »

Salut,

Pour le/les script lua, (deux scripts) tu peux les mettre sous ~/home/toi/.config/openbox

Il faut que lua et luafilesystem soient installés.
Avatar de l’utilisateur
ekyo
Hankyu
Messages : 16
Inscription : jeu. 23 juil. 2009, 15:59

Re: [OpenBox] Menus dynamiques.

Message par ekyo »

Merci mimas pour ta contribution =) Je m'en suis servi comme squelette pour mon menu personnalisé.

Aussi pour m'avoir fait découvrir vala, qui a l'air sympathique...

K.I.S.S !
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Re: [OpenBox] Menus dynamiques.

Message par mimas »

Je reviens avec une nouvelle version du programme de génération automatique du menu encore plus mieux bien. Cette fois c'est en C et la seule dépendance est le paquet menu-cache de LXDE.

Le démarrage du daemon menu-cached permet de diminuer le temps de génération du menu. Qui n'a jamais râlé sur les 100 millisecondes en trop à l'affichage d'un menu ? :). Les spécifications XDG sont respectées par la bibliothèque de menu-cache, la génération du menu est donc personnalisable au niveau du système.

Sur ma machine ça fonctionne parfaitement depuis 3 jours, j'aurais besoin de retour sur d'autres machines pour voir si c'est exploitable et qu'il n'y a pas de problème d'encodage (saleté d'encodage). Le tarball et une documentation rapide.
Anarchy for the triple A.
Répondre