user@linuxtrack:~ $ python -c 'print("Soyez les bienvenus !")'

Vous n'êtes pas identifié(e).

#1 04-11-2014 13:37:57

WarLocG
#! modo de compet

[beta]convertisseur de menu fluxbox vers openbox

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:
1415101845.png

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>

1415103261.png

Référence m'ayant bien aidé pour la partie du linkage : http://openbox.org/wiki/Help:Menus


Avant de poser vos questions, jeter un oeil ici
Mon CodeVault et Wiki : ici
Les messages privés envers le staff sont uniquement pour les cas d'urgence ou affaires privées (personnelles). Les demandes se feront exclusivement sur le forum. Merci de respecter cette clause sous peine de sanctions.

Hors ligne

#2 04-11-2014 20:08:50

IceF0x
#! Gourou Linux

Re : [beta]convertisseur de menu fluxbox vers openbox

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

#3 04-11-2014 20:53:52

WarLocG
#! modo de compet

Re : [beta]convertisseur de menu fluxbox vers openbox

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 smile


Avant de poser vos questions, jeter un oeil ici
Mon CodeVault et Wiki : ici
Les messages privés envers le staff sont uniquement pour les cas d'urgence ou affaires privées (personnelles). Les demandes se feront exclusivement sur le forum. Merci de respecter cette clause sous peine de sanctions.

Hors ligne

#4 04-11-2014 21:52:52

IceF0x
#! Gourou Linux

Re : [beta]convertisseur de menu fluxbox vers openbox

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

#5 04-11-2014 22:12:21

WarLocG
#! modo de compet

Re : [beta]convertisseur de menu fluxbox vers openbox

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.


Avant de poser vos questions, jeter un oeil ici
Mon CodeVault et Wiki : ici
Les messages privés envers le staff sont uniquement pour les cas d'urgence ou affaires privées (personnelles). Les demandes se feront exclusivement sur le forum. Merci de respecter cette clause sous peine de sanctions.

Hors ligne

Pied de page des forums