Vous n'êtes pas identifié(e).
Pages : 1
Script en python pour convertir vos fichiers menu de fluxbox vers fluxbox-menu.xml pour openbox.
Avertissement : ce script est encore en développement, tout n'est pas encore géré, néanmoins il gère la plupart des options se trouvant dans un fichier menu personnalisé par l'utilisateur.
Recommandation : éviter si possible de placer dans vos labels des caractères tels que '(',')','{','}','<','>' qui sont utilisé comme "balises" par fluxbox, ainsi que les caractères '/' servent dans le menu xml de openbox pour les <menu id="/XXX/YYY/ZZZ" /> et le caractère '&' causant des soucis pour valider le fichier xml. Si cela ne peut être éviter, créer un fichier de script par exemple en .sh et appeler votre script dans la partie "command" de fluxbox en {gksu -S bash /xx/yy/zz/script.sh} par exemple.
Si le fichier ne peut être ouvert par obMenu, ouvrez le depuis le navigateur via l'adresse file:///chemin_vers_fichier afin de vérifier si le xml est bien formé. Si le xml est malformé ca expliquerait que obMenu ne veuille pas l'ouvrir.
Note: le fichier sera directement créé dans votre $HOME/.config/openbox/fluxbox-menu.xml
Voici la source:
#! $(which python)
# -*- coding:utf-8 -*-
#
# author: WarLocG (tm)
# Description: convert menu file from fluxbox to openbox to use with obmenu
#
# Default menu fluxbox: ~/.fluxbox/menu
# Else menu fluxbox: /etc/X11/fluxbox/*menu* (exemple: fluxbox-menu, fluxbox.menu-user, window.menu, system.fluxbox-menu)
# Default menu openbox: ~/.config/openbox/menu.xml
# Else menu openbox: /var/lib/openbox/*.xml (example: Debian-menu.xml)
import os, sys
menu = ''
lvl = []
user = os.environ['HOME']
target = user+'/.fluxbox/'
destination = user+'/.config/openbox/'
#destination = '/var/lib/openbox/'
def convert_fluxObject_obObject(line):
fluxObj = ["[exec]","[separator]","[end]","[begin]","[submenu]","[include]","[exit]"]
for obj in range(len(fluxObj)):
if ((obj == 0) and (fluxObj[obj] in line)):
# [exec] -> <item ... ></item>
label=line.split('(')[1].split(')')[0]
cmd=line.split('{')[1].split('}')[0]
line='<item label="'+label+'">\n'
line+=' <action name="Execute">\n'
line+=' <execute>'+cmd+'</execute>\n'
line+=' </action>\n'
line+='</item>\n'
if ((obj == 1) and (fluxObj[obj] in line)):
# [separator] -> <separator/>
line='<separator/>\n'
if ((obj == 2) and (fluxObj[obj] in line)):
# [end] -> </menu>
line='</menu>\n'
if len(lvl) > 1:
del lvl[len(lvl)-1]
if ((obj == 3) and (fluxObj[obj] in line)):
# [begin] -> <menu id="/Fluxbox" label="Fluxbox">
line='<menu id="/Fluxbox" label="Fluxbox">\n'
if ((obj == 4) and (fluxObj[obj] in line)):
# [submenu] (label) -> <menu id="/chemin" label="label">
label=line.split('(')[1].split(')')[0]
if (len(label) == 0):
label='fluxbox'
older=''
for s in range(len(lvl)):
older+=('/'+lvl[s])
line='<menu id="'+older+'/'+label+'" label="'+label+'">\n'
lvl.append(label);
if ((obj == 5) and (fluxObj[obj] in line)):
# [include] (chemin) -> <menu id="/include" label="menu">
ri = raw_input( "Un [include] a ete decouvert. Rajouter l'entree ? ('O'ui ou 'Y'es pour activer) : ")
if ri in ['o','y','O','Y']:
p=line.split('(')[1].split(')')[0] #path
f=p.split('/') #file ' custom-include [.-] (menu|menu-user|fluxbox-menu) '
line="<!-- This requires the presence of the 'menu' package to work -->\n"
line='<menu id="'+f[len(f)-1]+'" />\n'
else:
line=''
if ((obj == 6) and (fluxObj[obj] in line)):
line='<item label="Exit">\n'
line+=' <action name="Exit"/>\n'
line+='</item>\n'
return line
def search_existing_menu(fluxMenuFile):
return os.path.exists(fluxMenuFile)
fluxMenuFile = target+'menu'
if (search_existing_menu(fluxMenuFile) == True):
print "menu fluxbox trouvé : "+fluxMenuFile
f = open(fluxMenuFile,"r")
menu = '<?xml version="1.0" encoding="utf-8"?>\n'
menu += '<openbox_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">\n'
for line in f:
menu+=convert_fluxObject_obObject(line)
menu+='</openbox_menu>'
f.close()
sys.stdout = open(destination+'fluxbox-menu.xml','w')
print menu
else:
print "menu fluxbox non trouve"
Capture pour prouver que la convertion a correctement été effectuée:
Afin de rattacher le nouveau menu dans openbox (et qu'il soit reconnu), ouvrez votre $HOME/.config/openbox/rc.xml et insérer une ligne <file>fluxbox-menu.xml</file> parmis celles déjà existantes, comme suit:
<file>/var/lib/openbox/debian-menu.xml</file>
<file>fluxbox-menu.xml</file>
<file>menu.xml</file>
Référence m'ayant bien aidé pour la partie du linkage : http://openbox.org/wiki/Help:Menus
Hors ligne
Super tuto par contre pour intégrer le menu j'ai rajouté fluxbox-menu.xml dans rc.xml, mais après avoir fait un update-menu il n’apparaît pas et je ne sais pas comment l'ajouter avec obmenu, j'ai bien tenté un "add link" mais rien à faire.
Utiliser des logiciels propriétaires, c'est comme les plats préparés, on est incapable de dire les conservateurs qu'ils contiennent, on dira toujours que c'est bon, mais ça ne remplacera jamais le repas fait maison par sa maman.
]:D #! Crunchbang & Archlinux GNU/Linux User ]:D
Hors ligne
mais après avoir fait un update-menu il n’apparaît pas et je ne sais pas comment l'ajouter avec obmenu
Je vais me pencher sur ce problème. Est-ce que le <file>fluxbox-menu.xml</file> se trouve encore dans rc.xml ou est-ce qu'il a été supprimé ?
Sinon j'ai complètement refondu le code en le transformant en orienté objet à partir d'une classe. Je déposerai la source quand elle ne me lâchera plus d'erreurs
Hors ligne
maintenant je suis rentré donc j'ai plus la même machine virtuelle.
mais elle est encore dans rc.xml
Utiliser des logiciels propriétaires, c'est comme les plats préparés, on est incapable de dire les conservateurs qu'ils contiennent, on dira toujours que c'est bon, mais ça ne remplacera jamais le repas fait maison par sa maman.
]:D #! Crunchbang & Archlinux GNU/Linux User ]:D
Hors ligne
Nouvelle version:
Je n'ai pas encore rajouté de nouvelles balises mais j'ai retravaillé la structure pour passer en orienté objet, voici la source:
#! $(which python)
# -*- coding:utf-8 -*-
#
# author: WarLocG (tm)
# Description: convert menu file from fluxbox to openbox to use with obmenu
# convertit un fichier de menu de fluxbox vers openbox afin de l'importer sous obmenu
#
# Version 2beta
#
# Default menu fluxbox: ~/.fluxbox/menu
# Else menu fluxbox: /etc/X11/fluxbox/*menu* (exemple: fluxbox-menu, fluxbox.menu-user, window.menu, system.fluxbox-menu)
# Default menu openbox: ~/.config/openbox/menu.xml
# Else menu openbox: /var/lib/openbox/*.xml (example: Debian-menu.xml)
#
# Special thanks to boost and Manon for object oriented sample sources
import os, sys
class cfom(): # _C_onvert _F_luxbox to _O_penbox _M_enu
def __init__(self):
self.menu = ''
self.flag_begin = False
self.lvl = []
#balises fluxbox
self.balise = ["[exec]","[separator]","[end]","[begin]","[submenu]","[include]","[exit]"]
self.user = os.environ['HOME']
self.filename = 'fluxbox-menu.xml' # change name here if you want another name
self.target = self.user+'/.fluxbox/'
self.destination = self.user+'/.config/openbox/'
#self.destination = '/var/lib/openbox/' # Permission denied !
def lvl_size(self):
return len(self.lvl)
def lvl_add(self,obj):
self.lvl.append(obj)
def lvl_remove(self):
if len(self.lvl) > 0:
del self.lvl[len(self.lvl)-1]
return True
else:
return False
def convert_line(self,line):
space=(' '*self.lvl_size()) # indentation devant des balises xml
for obj in range(len(self.balise)):
# [exec] -> <item ... ></item>
if ((obj == 0) and (self.balise[obj] in line)):
label=line.split('(')[1].split(')')[0]
cmd=line.split('{')[1].split('}')[0]
line=space+' <item label="'+label+'">\n'
line+=space+' <action name="Execute">\n'
line+=space+' <execute>'+cmd+'</execute>\n'
line+=space+' </action>\n'
line+=space+' </item>\n'
# [separator] -> <separator/>
if ((obj == 1) and (self.balise[obj] in line)):
line=space+' <separator/>\n'
# [end] -> </menu>
if ((obj == 2) and (self.balise[obj] in line)):
self.lvl_remove()
space=(' '*self.lvl_size()) # indentation devant des balises xml
if ((self.lvl_size() == 0) and (self.flag_begin == True)):
line=space+'</menu>\n' # si c est le [END] qui termine [BEGIN]
self.flag_begin = False
else:
line=space+' </menu>\n' # autrement c est un [END] qui termine [SUBMENU]
# [begin] -> <menu id="/Fluxbox" label="Fluxbox">
if ((obj == 3) and (self.balise[obj] in line)):
line=space+'<menu id="/Fluxbox" label="Fluxbox">\n'
self.flag_begin = True
# [submenu] (label) -> <menu id="/chemin" label="label">
if ((obj == 4) and (self.balise[obj] in line)):
label=line.split('(')[1].split(')')[0]
if (len(label) == 0):
label='fluxbox'
older=''
for s in range(self.lvl_size()):
older+=('/'+self.lvl[s])
line=space+' <menu id="'+older+'/'+label+'" label="'+label+'">\n'
self.lvl_add(label)
# [include] (chemin) -> <menu id="/include" label="menu">
if ((obj == 5) and (self.balise[obj] in line)):
ri = raw_input( "Un [include] a ete decouvert. Rajouter l'entree ? ('O'ui ou 'Y'es pour activer) : ")
if ri in ['o','y','O','Y']:
p=line.split('(')[1].split(')')[0] #path
f=p.split('/') #file ' custom-include [.-] (menu|menu-user|fluxbox-menu) '
line=space+" <!-- This requires the presence of the 'menu' package to work -->\n"
line=space+' <menu id="'+f[len(f)-1]+'" />\n'
else:
line=''
# [exit] -> <item label="Exit">
if ((obj == 6) and (self.balise[obj] in line)):
line=space+' <item label="Exit">\n'
line+=space+' <action name="Exit"/>\n'
line+=space+' </item>\n'
return line
def get_header(self):
head='<?xml version="1.0" encoding="utf-8"?>\n'
head+='<openbox_menu xmlns="http://openbox.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
head+=' xsi:schemaLocation="http://openbox.org/ file:///usr/share/openbox/menu.xsd">\n'
return head
def get_footer(self):
foot='</openbox_menu>\n'
return foot
def append_menu(self,line):
self.menu += line
def get_menu(self):
return self.menu
def search_existing_menu(self,menuFile):
return os.path.exists(menuFile)
def process(self,menuFile):
if (self.search_existing_menu(menuFile) == True):
print "Un menu fluxbox a été trouvé a l'emplacement "+menuFile+".\n"
f = open(menuFile,"r")
self.append_menu(self.get_header())
for line in f:
self.append_menu(self.convert_line(line))
self.append_menu(self.get_footer())
f.close()
#print self.get_menu() #debug test: sortie sur stdout
results = "Un fichier "+self.filename+" a été créé dans "+self.destination+".\n"
results += "Dans le dossier "+self.destination+", ouvrez rc.xml et rajoutez la ligne "
results += "<file>"+self.filename+"</file> avant ou apres <file>menu.xml</file>.\n"
results += "Ensuite vous pourrez rajouter un Link dans votre menu via obmenu.\n"
f = open(self.destination+self.filename,'w')
f.write(self.get_menu())
f.close()
else:
results = "Aucun menu fluxbox n'a été trouvé. Avez-vous installé fluxbox ?"
return results
if (__name__ == '__main__'):
cfom() # on appelle la classe cfom (Convert Fluxbox to Openbox Menu)
fluxMenuFile = cfom().target+'menu' # fichier cible
print cfom().process(fluxMenuFile) # on construit le fichier et renvoit le résultat
Sinon pour l integration,
je ne sais pas comment l'ajouter avec obmenu, j'ai bien tenté un "add link" mais rien à faire.
Essaie en Nommant ton Link "/Fluxbox" (sans les guillemets), comme dans la capture de mon bureau en fait, puis clic Reconfigure et Restart depuis ton menu.
Hors ligne
Pages : 1