Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#76 Le 17/02/2014, à 09:32

malbo

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

@Korak et Babdu89 : j'ai retrouvé ce post du 2 juillet 2012 où j'ai expérimenté pour la première fois la réparation d'une installation de Ubuntu en EFI. Depuis cette date, j'ai souvent proposé Boot-Repair pour réparer des installations de Ubuntu en mode EFI et je sais que ça fonctionne bien. Actuellement, je le propose moins parce que Ubuntu 13.10 (et versions suivantes) gère mieux l'UEFI et le recours à Boot-Repair n'est pas toujours opportun à mon avis. Par contre, le Boot-Info dans un système UEFI, moi j'en suis très friand et ça me fait gagner du temps pour aider les novices.

Dernière modification par malbo (Le 17/02/2014, à 09:39)

Hors ligne

#77 Le 17/02/2014, à 10:05

Babdu89

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour.
Merci  malbo. j'avais retrouvé ce sujet dont tu parles, mais je préférais posté la référence d'un écrit de YannUbuntu à ce sujet.

@ Korak . wink

@+.  Babdu89   .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#78 Le 17/02/2014, à 13:20

Korak

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Pour le rapport Boot-Info, pas de problème.

Je veux parler du côté réparation. Apparemment, il aurait tendance a faire pire que mieux quand on a un dualboot avec Windows 8.


OS: Ubuntu 22.04 64 bits + Windows 11 64 bits en dualboot (BIOS UEFI, Secure Boot activé et table de partitions GPT)
PC portable HP 17-CP0308NF   Processeur: AMD Ryzen 7 5700U avec carte graphique AMD Lucienne intégrée au processeur.   Mémoire vive: 16 Go RAM
Quand vous ne trouvez pas la solution à un problème, cherchez des pistes menant à la solution !

Hors ligne

#79 Le 17/02/2014, à 13:43

malbo

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Korak a écrit :

Je veux parler du côté réparation. Apparemment, il aurait tendance a faire pire que mieux quand on a un dualboot avec Windows 8.

Comme je le laissais entendre dans mon post précédent, la situation a évolué depuis la sortie de Ubuntu 13.10 : à présent, les installations de Ubuntu ont un menu Grub qui contient des entrées fonctionnelles pour Windows. Je donne des détails dans ce post dans lequel je conclus par "L'amélioration importante, c'est qu'après installation, le menu Grub propose une entrée "Windows Boot Manager (UEFI on /dev/sda2)" qui est fonctionnelle et qui permet bien de démarrer Windows 8 depuis le menu Grub. On n'a plus besoin d'utiliser Boot-Repair pour arriver à ce résultat". Autant l'utilisation de Boot-Repair semblait incontournable avant la sortie de Ubuntu 13.10, autant je la considère comme indésirable pour la 13.10 et pour la version à venir (14.04). Mais c'est mon avis et on a le droit de ne pas être d'accord.

Hors ligne

#80 Le 03/12/2014, à 10:57

Babdu89

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour.
@YannUbuntu.

J'ai eu connaissance de la création de la nouvelle manière de faire le boot-info
Alors, évidement, j'ai testé çà de suite. çà marchait. en session installé et en session live  avec l'iso BRD que j'ai reemasterisé.

Puis dans un sujet du forum, (il faut que je le retrouve) un utilisateur guidé parun contributeur , tente de faire un boot info nouvelle version. Donc ps depuis Boot-Repair.

Son boot info commence à

ADDITIONAL INFORMATION :

Bon, comme il fait çà en session live.
Je lance un live 14.04.1 , installe le boo-info et je teste.
Même résultat que lui.
Ha , pourquoi çà marche chez moi sur mes Os installé et session live BRD ?
Réflexion faite, quelle diférence il y entre les deux manières de faire?...
En live j'installe synaptic et je regarde le contenu du PPA.
Le paquet Boot-Repair n'est pas installé.
Je l'installe. Relance un boot info. Cette foi-ci il est complet. Je signale dans le sujet, l'utilisateur corrige et arrive à ses fins, un boot info complet.

Depuis je surveille la doc du boot info, jusqu'à voir que les commandes d'installation sont prévues pour le nouveau boot-info.
Je reste ce matin en session live... Sans installer le paquet boot-repair, çà ne marche toujours pas.
En ajoutant ce paquet, çà marche.

Voila, les log sont récupérables si il le faut. Là je ne peut rien envoyer je suis en session live.

http://paste.ubuntu.com/9353277/

http://paste.ubuntu.com/9353285/

EDIT;

Ha !!!. Çà y est, c'est corrigé. merci.

@+.   Babdu89   .

Dernière modification par Babdu89 (Le 03/12/2014, à 15:24)


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#81 Le 12/02/2015, à 16:33

GG84

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour
Nouveau venu dans la communauté, j'ai installé Ubuntu sur
1423745743.jpg
en suivant vos précieux conseils des forums et vous en remercie.
J'ai donc :
Sauvegardé Windows
Désactivé le démarrage rapide
Désactivé le Secure boot menu
Activé le Lauch CSM
Décoché les veilles
Libéré de l'espace disque
Téléchargé Ubuntu 14.04 LTS sur USB
Lancé la procédure Windows pour démarrer sur USB
Chargé Ubuntu pour essayer (c ok)
Installé Ubuntu avec l'icône du bureau
Redémarré comme demandé à la fin de l'installation
Et la ..... Impossible d'aller sur Ubuntu. Revient toujours sur Windows.

Visualisé le disque sur Windows 1423747542.jpg
Relancé la procédure Windows pour démarrer sur USB et installer Ubuntu
Arrêté et quitté l'installation d'Ubuntu quand j'ai vu qu'il était installé sur le disque  1423747050.jpg
Relancé une 2ème fois la procédure Windows pour démarrer sur USB et installer Ubuntu
Arrêté et quitté l'installation d'Ubuntu quand on me demande de supprimer Ubuntu.  1423747255.jpg

Voici l'URL du Boot Info : http://paste.ubuntu.com/10187207


Merci d'avance pour votre aide
GG

Hors ligne

#82 Le 12/02/2015, à 16:47

Babdu89

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour.
@GG84.
Stp, veux tu bien ouvrir un autre sujet en copiant comme premier post, le contenu du post ci-dessus.
Justification; ici le sujet traite de comment faire un boot info.
Pas comment venir en aide et réparer la config. Donc tu risques d'attendre longtemps de l'aide en restant ici...

@+.  Babdu89  .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#83 Le 12/02/2015, à 16:52

GG84

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Merci pour l'info mais je n'arrive pas à trouver comment faire ce message autrement qu'en faisant "répondre". Si tu peux me renseigner Merci

Hors ligne

#84 Le 12/02/2015, à 17:02

Babdu89

Re : [TUTORIEL] Créer un rapport Boot-Info facilement


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#85 Le 12/02/2015, à 17:28

GG84

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Merci
J'ai zappé "nouvelle discussion"

Sorry

Hors ligne

#86 Le 24/11/2015, à 20:20

Barbu37

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

edit my bad

Dernière modification par Barbu37 (Le 24/11/2015, à 20:27)

Hors ligne

#87 Le 03/12/2015, à 13:16

Bougron

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour
J'espère que M. YannUbuntu lit encore cette discussion.
Je pense qu'il serait bien d'ajouter, à l'occasion, 4 commandes qui permettraient  de fournir quelques informations supplémentaires parfois nécessaires.

Dans un environnement EFI, il peut être important d'être certain de la partition qui va servir à booter, On ne peut pas l'identifier.

Nous disposons bien de la commande

sudo efibootmgr -v

qui donne la réponse

Boot0001* ubuntu	HD(1,800,3f800,c175b09a-8451-420e-ba87-e3f06f233879)File(\EFI\ubuntu\shimx64.efi)
Boot0002* Windows Boot Manager	HD(8,14108800,3f40000,fcfadc16-94ac-43d9-8998-0de8fc2175bd)File(\EFI\Microsoft\Boot\bootmgfw.efi)RC

La commande permettant de savoir dans quel support est cette partition, n'est pas présente.
Ajouter la commande suivante. 

ls -l /dev/disk/by-uuid

permettrait d'être certain de nos dires.

lrwxrwxrwx 1 root root 10 déc.   3 01:23 c175b09a-8451-420e-ba87-e3f06f233879 -> ../../sda1
lrwxrwxrwx 1 root root 10 déc.   3 01:23 fcfadc16-94ac-43d9-8998-0de8fc2175bd -> ../../sda8


Il arrive que ubuntu ne mette pas en route suite à un manque de place disque.
Il y a bien la commande

 df -Th

qui est malheureusement souvent insuffisante.   Disposer aussi des trois commandes suivantes serait un plus.

df -Ti:
sudo du -sh /var   /boot
sudo du -sh /var/log

Dernière modification par Bougron (Le 03/12/2015, à 14:12)

Hors ligne

#88 Le 03/12/2015, à 13:59

moko138

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Je crains que Yannubuntu, après s'être énormément investi - il y a un message où il explique que la conception et la mise au point de cet outil génial -- encore merci, Yannubuntu ! -- lui ont demandé un an, quasi à temps plein - n'ait trouvé d'autres occupations.

Dernière modification par moko138 (Le 13/12/2015, à 18:11)


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#89 Le 06/01/2016, à 11:32

alcind_l

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour ,
je viens de m'inscrire sur ce forum , je lisais déja les discussion mais n'avais pas de problème particuliers .
Cependant suite a une mise a jour de "ohmyzsh" sur BLINUX lorsque j'ai reboot j'ai attérit immédiatement sur l'écran " Welcome to GRUB!"
J'ai alors crée un liveUSB de bootrepair comme indiqué sur un des tuto , ensuite j'ai fait un boot info et voici l'URL
: http://paste.ubuntu.com/14418651/
Il me conseillé de faire étudier ce boot-info par un expert de ce forum avant de me lancer sur le boot-repair voila .
J'ai besoin de mon pc en express étant étudiant en informatique, merci de votre compréhension.
Cordialement

Hors ligne

#90 Le 06/01/2016, à 12:18

malbo

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

@alcind_l : je ne suis pas sûr qu'il soit nécessaire de réparer quoi que ce soit. Il faut seulement que tu ailles dans le Boot Menu (*) au démarrage de ton ordi et que tu sélectionnes l'entrée "blinux" qu'on peut voir dans cet extrait :

efibootmgr -v
BootCurrent: 0000
Timeout: 0 seconds
BootOrder: 0000,0001
Boot0000* Notebook Hard Drive	BIOS(2,0,00).......................................................................
Boot0001* Notebook Ethernet	BIOS(80,0,00)........................E..............................................
Boot0002* Notebook Ethernet	BIOS(80,0,00)........................E..............................................
Boot0003* Windows Boot Manager	HD(1,800,32000,bff728f5-4529-4b2f-80d8-836f39a06a97)File(EFIBootbootx64.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}...a................
Boot0004* blinux	HD(1,800,32000,bff728f5-4529-4b2f-80d8-836f39a06a97)File(EFIblinuxgrubx64.efi)

Si ça ne fonctionne pas, je te prie de créer une nouvelle discussion (voir ici) pour ton problème parce que ça pourrait être long.

(*) il faut appuyer sur une certaine touche au démarrage de l'ordi : voir colonne "Boot Menu" dans le tableau de cette page : https://craftedflash.com/info/how-boot- … lash-drive
Pour un ordi Acer c'est la touche F12, pour un ordi Asus c'est la touche Echap, etc...

Dernière modification par malbo (Le 06/01/2016, à 12:24)

Hors ligne

#91 Le 20/03/2016, à 15:05

Bougron

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour
Est-il possible de savoir ce que deviendra boot-info avec la version 16.04 actuellement disponible  certainement en mode serveur???
Voir le problème dans cette discussion  https://forum.ubuntu-fr.org/viewtopic.p … #p21481073
L'erreur étant celle-ci

ubuntu@ubuntu:~$ sudo boot-info
Traceback (most recent call last):
  File "/usr/bin/glade2script", line 48, in <module>
    import gi
ImportError: No module named gi

Hors ligne

#92 Le 20/03/2016, à 15:48

Babdu89

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour.

Confirmation, j'ai voulu installer le PPA (BR et BI) en  usb live xenial releases en date du 4 mars 2016. J'ai le même message d'erreur que Bougron, au lancement d'un boot info.

Édit.

Comme expliqué ici;

https://forum.ubuntu-fr.org/viewtopic.p … #p21481777

J'ai testé avec un Cubuntu 16.04.
Boot-Repair, Os-Uninstaller   y sont intégrés.
J'ai fais un boot info avec Boot-Repair çà marche.
Depuis Synaptic, j'ai installé le paquet boot-info .Pas d'erreur. J'ai lancé le boot info en commande, pas d'erreur çà marche.
J'ai vérifié les PPA , les paquets sont à la bonne et dernière version.

https://launchpad.net/~yannubuntu/+arch … /+packages

l'URL du boot info fait depuis la live Cubuntu 16.04.

http://paste2.org/Iw8NJtXB

Le contenu du fichier  /usr/bin/glade2script . de la live Cubuntu 16.04 .

#!/usr/bin/python
# -*- coding:Utf­8 ­-*-
############################################################################
##                                                                        ##
##     GladeToScript is an engine that allows to simply use GTK           ##
##   functions from a script/software. Even without deep GTK knowledge    ##
##   you will be able to handle its widgets from a bash script for        ##
##   example.                                                             ##
##                                                                        ##
##     GladeToScript permet d'utiliser simplement des fonctions GTK       ##
##   depuis un script/logiciel. Il permet sans grande connaissances       ##
##   en GTK, de manier ses widgets depuis un script bash par exemple.     ##
##                                                                        ##
############################################################################
##                                                                        ##
##     Copyright (C) 2010-2011  AnsuzPeorth (ansuzpeorth@gmail.com)       ##
##                                                                        ##
## 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 <http://www.gnu.org/licenses/>.  ##
##                                                                        ##
############################################################################
##                                                                        ##
##               One file for the entire source code is a choice          ##
##                for easy integration into bash applications.            ##
##                                                                        ##
############################################################################
import os, os.path
import threading
import subprocess
import time
import shlex
import sys
import getopt
import gettext
import re
from xml.dom.minidom import parse
from ConfigParser import ConfigParser
import gi
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GdkPixbuf
from gi.repository import GObject
from gi.repository import Pango
from gi.repository import GLib
from gi.repository import Gio


DRAG_DEST_DEFAULT   = Gtk.DestDefaults.ALL
DRAG_ACTION_MOVE    = Gdk.DragAction.MOVE
DRAG_BTN_MASK       = Gdk.ModifierType.BUTTON1_MASK
DRAG_BEFORE         = Gtk.TreeViewDropPosition.BEFORE
DRAG_AFTER          = Gtk.TreeViewDropPosition.AFTER
DRAG_INTO_OR_BEFORE = Gtk.TreeViewDropPosition.INTO_OR_BEFORE
DRAG_INTO_OR_AFTER  = Gtk.TreeViewDropPosition.INTO_OR_AFTER

GObject.threads_init()


'''
@name glade2script
@authors AnsuzPeorth
@copyright GPL3
@version 3.2.0
@date 2010 2012
'''


'''
 ON-BOARD APPLICATION (work-in-progress !)
'''
class ThreadEmbed(threading.Thread):
    def __init__(self, cmd):        
        threading.Thread.__init__(self)
        self.Terminated = False
        self.cmd        = cmd

    def run(self):
        args     = shlex.split( self.cmd )
        sb       = subprocess.Popen(args,stderr=subprocess.STDOUT,
                                            stdout=subprocess.PIPE)
        self.PID = sb.pid
        #time.sleep(1)
        n=0
        '''
        while not self.Terminated:
            #print 'ok',self.Terminated
            #time.sleep(0.2)
            #self.win.set_title(str(n))
            #n+=1
            sortie=sb.stdout.readline().rstrip()
            print sortie
            if 'interrupted' in sortie or 'Exiting' in sortie: 
                print 'interrupt'
                self.win.set_title('Exiting ...')
                self.Terminated = True
            elif 'Error' in sortie:
                self.stop()
                self.win.set_title(sortie)
            elif 'Cache fill' in sortie:
                self.win.set_title('Buffering ...')
                
            elif 'Starting' in sortie:
                self.win.set_title(self.chaine)
                
            elif 'StreamTitle' in sortie:
                self.win.set_title(sortie.split("'")[1])
            #print 'ok2',self.Terminated
        '''

    def stop(self):
        #if not self.Terminated: 
        os.kill(self.PID,9)

class Embed(Gtk.Socket):
    def __init__(self, widget, cmd):
        self.cmd  = cmd % widget.window.xid
        GObject.GObject.__init__(self)
        self.flag = False
        self.go_embed()

    def go_embed(self):
        #self.embed=ThreadEmbed( self.cmd )
        #self.embed.start()
        args       = shlex.split( self.cmd )
        self.embed = subprocess.Popen(args,stderr=subprocess.STDOUT,
                                            stdout=subprocess.PIPE)
        self.flag  = True

    def stop_embed(self):
        if self.flag: self.embed.stop()


'''
    ***************************************************
    *** CONFIG PARSER
    ***************************************************
'''
class LoadConfig(object):
    def set_gobject_idle_add(self, widget, action, value):
        widget = getattr(self.gui, widget)
        method = getattr(widget, action)
        GObject.idle_add(method, *value)
    
    def set_bool_int_widgets(self, section, gettype, gtkfunction):
        for option in self.options(section):
            value = gettype(section, option)
            self.ENV['G2S%s'%option] = str(value)
            self.set_gobject_idle_add(option, gtkfunction, (value, ))
    
    def set_text_widgets(self, section, gettype, gtkfunction):
        for option in self.options(section):
            value = gettype(section, option)
            self.ENV['G2S%s'%option] = value
            self.set_gobject_idle_add(option, gtkfunction, (value, ))
    
    def set_color_widgets(self, section, gettype, gtkfunction):
        for option in self.options(section):
            value = gettype(section, option)
            color = Gdk.color_parse(value)
            self.ENV['G2S%s'%option] = value
            self.set_gobject_idle_add(option, gtkfunction, (color, ))
    
    def load_WINDOW(self, window):
        x = self.getint('WINDOW:%s'%window, 'x')
        y = self.getint('WINDOW:%s'%window, 'y')
        height = self.getint('WINDOW:%s'%window, 'height')
        width  = self.getint('WINDOW:%s'%window, 'width')
        if x != -1 or y != -1:
            self.set_gobject_idle_add(window, 'move', (x, y))
        if height != -1 or width != -1:
            self.set_gobject_idle_add(window, 'resize', (width, height))
        self.ENV['G2S%s_size'%window] = '%s %s' % (width, height)
        self.ENV['G2S%s_position'%window] = '%s %s' % (x, y)
    
    def load_ENTRY(self):
        self.set_text_widgets('ENTRY', self.get, 'set_text')
    
    def load_LABEL(self):
        self.set_text_widgets('LABEL', self.get, 'set_markup')
    
    def load_TOGGLE(self):
        self.set_bool_int_widgets('TOGGLE', self.getboolean, 'set_active')
    
    def load_COMBO(self):
        self.set_bool_int_widgets('COMBO', self.getint, 'set_active')
    
    def load_SPIN(self):
        self.set_bool_int_widgets('SPIN', self.getfloat, 'set_value')
    
    def load_PANED(self):
        self.set_bool_int_widgets('PANED', self.getint, 'set_position')

    def load_NOTEBOOK(self):
        self.set_bool_int_widgets('NOTEBOOK', self.getint, 'set_current_page')
    
    def load_COLORBUTTON(self):
        self.set_color_widgets('COLORBUTTON', self.get, 'set_color')
    
    def load_COLORDIALOG(self):
        self.set_color_widgets('COLORDIALOG', self.get, 'set_current_color')


class SaveConfig(object):
    def save_WINDOW(self, window):
        section = 'WINDOW:%s' % window
        window  = getattr(self.gui, window)
        x, y    = window.get_position()
        width, height = window.get_size()
        self.set(section, 'x', x)
        self.set(section, 'y', y)
        self.set(section, 'width', width)
        self.set(section, 'height', height)
    
    def get_widgets(self, section, gtkfunction):
        for widget_name in self.options(section):
            if widget_name in self.blackliste: continue
            widget = getattr(self.gui, widget_name)
            value = getattr(widget, gtkfunction)()
            self.set(section, widget_name, value)
    
    def save_ENTRY(self):
        self.get_widgets('ENTRY', 'get_text')
    
    def save_LABEL(self):
        self.get_widgets('LABEL', 'get_text')
    
    def save_COMBO(self):
        self.get_widgets('COMBO', 'get_active')
    
    def save_TOGGLE(self):
        self.get_widgets('TOGGLE', 'get_active')
    
    def save_SPIN(self):
        self.get_widgets('SPIN', 'get_value')
    
    def save_PANED(self):
        self.get_widgets('PANED', 'get_position')
    
    def save_COLORBUTTON(self):
        self.get_widgets('COLORBUTTON', 'get_color')
    
    def save_COLORDIALOG(self):
        self.get_widgets('COLORDIALOG', 'get_current_color')
    
    def save_NOTEBOOK(self):
        self.get_widgets('NOTEBOOK', 'get_current_page')


class ParseConfig(ConfigParser, LoadConfig, SaveConfig):
    def __init__(self, filepath):
        ConfigParser.__init__(self)
        self.filepath = filepath
        self.read(filepath)
        self.ENV = {}
        DEBUG('[[ INIT CONFIG ]]')
    
    def load_config(self, gui):
        self.gui = gui
        for section in self.sections():
            try:
                try:
                    getattr(self, 'load_%s' % section)()
                except:
                    function, widget = section.split(':')
                    getattr(self, 'load_%s' % function)(widget)
            except:
                #raise
                for variable, value in self.items(section):
                    self.ENV['G2S%s'%variable] = value
        DEBUG('[[ CONFIG LOADED ]]')
        return self.ENV
    
    def get_config(self):
        for section in self.sections():
            for variable, value in self.items(section):
                self.ENV['G2S%s'%variable] = value
        DEBUG('[[ CONFIG GOT ]]')
        return self.ENV
    
    def save_config(self, blackliste):
        self.blackliste = blackliste
        for section in self.sections():
            if section in blackliste: continue
            try:
                try:
                    getattr(self, 'save_%s' % section)()
                except:
                    function, widget = section.split(':')
                    getattr(self, 'save_%s' % function)(widget)
            except:
                #raise
                pass
        with file(self.filepath,'wb') as configfile:
            self.write(configfile)
        DEBUG('[[ CONFIG SAVED ]]')


'''
    ***************************************************
    *** CALLBACKS FROM USER ACTION
    ***************************************************
'''
class Callbacks(object):
    '''
    @page callbacks Signals and callbacks
    '''
    '''
    *** Closing interface
    '''
    def gtk_widget_destroy(self,*arg):
        '''
        @brief equivalent to EXIT@@, e.g. to be used for closing via the cross
        '''
        self.th.stop('no')

    def gtk_widget_destroy_save(self,*arg):
        '''
        @brief equivalent to EXIT@@SAVE
        '''
        self.th.stop('yes')

    '''
    *** notify icon
    '''
    def systray_show(self,widget,event=None,arg=None):
        '''
        @brief display the systray
        @info only availble with 'systray' name choosed
        '''
        self.systray.set_visible(True)

    def systray_hide(self,widget,event=None,arg=None):
        '''
        @brief hide the systray
        @info only availble with 'systray' name choosed
        '''
        self.systray.set_visible(False)    

    def on_blinking(self,widget,event=None,arg=None):
        '''
        @brief starts notify icon blinking
        @info only availble with 'systray' name choosed
        '''
        self.systray.set_blinking(True)

    def off_blinking(self,widget,event=None,arg=None):
        '''
        @brief stops notify icon blinking
        @info only availble with 'systray' name choosed
        '''
        self.systray.set_blinking(False)

    '''
    *** widgets couleurs
    '''
    def on_colorbutton(self,widget,event=None,arg=None):
        '''
        @brief the chosen colour
        @info signal: color-set
        '''
        color_gtk = widget.get_color()
        self.gtk_to_rgb(widget, color_gtk)

    def on_colorsel(self,widget,event=None,arg=None):
        '''
        @brief to be filled in for the colorselectiondialog, colorsel­color_selection
        @info signal: color-changed
        @return couleur (#FFEEFF)
        '''
        color_gtk = widget.get_current_color()
        self.gtk_to_rgb(widget, color_gtk)

    def gtk_to_rgb(self,widget, color_gtk):
        color = color_gtk.to_string()
        rgb='#%s%s%s' % ( color[1:3], color[5:7], color[9:11] )
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name()) (rgb.upper() )
            return
        self.send_data('%s %s' % (widget.get_name(), rgb.upper() ) )

    '''
    *** widget char font
    '''
    def on_font(self,widget,event=None,arg=None):
        '''
        @brief the chosen font
        @return pangoFontDescription
        '''
        nom  = widget.get_name()
        font = widget.get_font_name()
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name()) (font)
            return
        self.send_data('%s %s' % (nom, font ) )

    '''
    *** Widgets management (show, sensitive, active) on - off
    '''
    def on_hide(self,widget,event=None,arg=None):
        '''
        @brief hide a widget
        @info the widget must be indicated in the user data
        '''
        self.set_dic_widget(widget, 1)
        widget.hide()

    def on_show(self,widget,event=None,arg=None):
        '''
        @brief display a widget
        @info the widget must be indicated in the user data
        '''
        self.set_dic_widget(widget, 1)
        widget.show()

    def on_sensitive(self,widget,event=None,arg=None):
        '''
        @brief widget stops being grey
        @info the widget must be indicated in the user data
        '''
        self.set_dic_widget(widget, 0)
        widget.set_sensitive(True)

    def off_sensitive(self,widget,event=None,arg=None):
        '''
        @brief widget becomes grey
        @info the widget must be indicated in the user data
        '''
        self.set_dic_widget(widget, 0)
        widget.set_sensitive(False)

    def on_active(self,widget,event=None,arg=None):
        '''
        @brief toggle activate
        @info the widget must be indicated in the user data
        '''
        self.set_dic_widget(widget, 2)
        widget.set_active(True)

    def off_active(self,widget,event=None,arg=None):
        '''
        @brief toggle deactivate
        @info the widget must be indicated in the user data
        '''
        self.set_dic_widget(widget, 2)
        widget.set_active(False)

    '''
    *** Widgets management (show, sensitive, active) toggle, management via dictionnary
    '''                
    def toggle_sensitive(self, widget, event=None,arg=None):
        '''
        @brief toggle between grey/not-grey
        @info the widget must be indicated in the user data
        '''
        name = widget.get_name()
        self.set_dic_widget(widget, 0)
        widget.set_sensitive( self.dic_widget[name][0] )

    def toggle_visible(self, widget, event=None,arg=None):
        '''
        @brief toggle between show/hide
        @info the widget must be indicated in the user data
        '''
        name = widget.get_name()
        if self.dic_widget[name][1]:
            widget.hide()
        else:
            widget.show()
        self.set_dic_widget(widget, 1)

    def toggle_active(self, widget, event=None,arg=None):
        '''
        @brief toggle between activate/deactivate
        @info the widget must be indicated in the user data
        '''
        name = widget.get_name()
        self.set_dic_widget(widget, 2)
        widget.set_active( self.dic_widget[name][2] )    

    def set_dic_widget(self, widget, place):
        name = widget.get_name()
        if self.dic_widget[name][place]:
            self.dic_widget[name][place] = False
        else: 
            self.dic_widget[name][place] = True

    '''
    *** filechooser
    '''        
    def on_filechoose(self,widget,event=None,arg=None):
        '''
        @brief the filechooser selection
        @info signal: selection-changed
        @return selected file
        '''
        nom    = widget.get_name()
        valeur = widget.get_filename()
        if valeur == self.var_filechoose or valeur is None: return
        self.var_filechoose = valeur
        if import_py is not None:
            getattr(self.th.IMPORT, nom) (valeur)
            return
        self.send_data('%s %s' % (nom, valeur) )

    '''
    *** combobox, spinbutton, calendar, data input zone, scale,
          context menu, linkbutton, activate
    '''
    def on_combo(self,widget,event=None,arg=None):
        '''
        @brief the combobox selection
        @info signal: changed
        @return selection
        '''
        nom    = widget.get_name()
        #~FIXME GTK3
        #valeur = widget.get_active_text()
        try:
            valeur = widget.get_model()[widget.get_active()][0]
        except: return
        if valeur is not None:
            if import_py is not None:
                getattr(self.th.IMPORT, nom) (valeur)
                return
            self.send_data('%s %s' % (nom, valeur) )

    def on_spinbutton(self,widget,*arg):
        '''
        @brief the spinbutton value
        @return value (1.0)
        '''
        nom    = widget.get_name()
        valeur = widget.get_value()
        if import_py is not None:
            getattr(self.th.IMPORT, nom) (valeur)
            return
        self.send_data('%s %s' % (nom, valeur) )

    def on_calendar(self,widget,event=None,arg=None):
        '''
        @brief the chosen date
        @return (year, month, day)
        '''
        nom    = widget.get_name()
        valeur = widget.get_date()
        if import_py is not None:
            getattr(self.th.IMPORT, nom) (valeur)
            return
        self.send_data('%s %s' % (nom, valeur) )

    def on_entry(self,widget, icon=None, event=None):
        '''
        @brief the entry text, or click on primary or secondary icon
        @return sh: text or primary@text or secondary@text
        @return py: (arg, text)
        @return arg = '' or 'primary' or 'secondary'
        '''
        nom    = widget.get_name()
        valeur = widget.get_text()
        try:
            if icon   == Gtk.EntryIconPosition.PRIMARY:
                v = 'primary@'
            elif icon == Gtk.EntryIconPosition.SECONDARY:
                v = 'secondary@'
            else:
                v = ''
        except:
            v = ''
        if import_py is not None:
            getattr(self.th.IMPORT, nom) (valeur, v)
            return
        self.send_data('''%s %s%s''' % (nom, v, valeur) )

    def clear_entry(self,widget, event=None,arg=None):
        '''
        @brief delete the text of an entry
        '''
        widget.set_text('')

    def on_scale(self,widget,event=None,value=None):
        '''
        @brief when the cursor moves
        @info signal: value-changed
        @return (0 to 100)
        '''
        nom    = widget.get_name()
        valeur = widget.get_value()
        if import_py is not None:
            getattr(self.th.IMPORT, nom) (valeur)
            return
        self.send_data('%s %s' % (nom, valeur) )

    def on_menu(self,widget,event=None,arg=None):
        '''
        @brief launch contextmenu
        @info the widget menu must be indicated in the user data
        '''
        if event is not None:
            if event.button == 3:
                widget.popup(None,None,None,None,event.button,event.time)
    
    def on_menu_all(self,  widget, event=None, arg=None):
        '''
        @brief click launch contextmenu
        @info the widget menu must be indicated in the user data
        @info can be used from script:
        @example echo 'SET@on_menu_all(self._menu1)'
        '''
        widget.popup(None,None,None,1,0)
    
    def on_menu_right(self, widget, event=None, arg=None):
        '''
        @brief left click launch contextmenu
        @info the widget menu must be indicated in the user data
        @info signal: button_*_event
        '''
        if event is not None:
            if event.button == 3:
                widget.popup(None,None,None,event.button,event.time)
    
    def on_menu_left(self, widget, event=None, arg=None):
        '''
        @brief left click launch contextmenu
        @info the widget menu must be indicated in the user data
        @info signal: button_*_event
        '''
        if event is not None:
            if event.button == 1:
                widget.popup(None,None,None,event.button,event.time)
    
    def on_menu_middle(self, widget, event=None, arg=None):
        '''
        @brief middle click launch contextmenu
        @info the widget menu must be indicated in the user data
        @info signal: button_*_event
        '''
        if event is not None:
            if event.button == 2:
                widget.popup(None,None,None,event.button,event.time)
    
    def on_linkbutton(self,widget,event=None,arg=None):
        '''
        @brief web link
        @return http://...
        '''
        nom    = widget.get_name()
        valeur = widget.get_uri()
        if import_py is not None:
            getattr(self.th.IMPORT, nom) (valeur)
            return
        self.send_data('%s %s' % (nom, valeur) )

    '''
    *** user click
    '''
    def clic_droit(self,widget,event=None,arg=None):
        '''
        @brief when right click
        @return clic_droit
        '''
        if event is not None:
            if event.button == 3:
                if import_py is not None:
                    getattr(self.th.IMPORT, widget.get_name()) ('clic_droit')
                    return
                self.send_data('%s %s' % (widget.get_name() , 'clic_droit') )

    def double_clic(self,widget,path=None,view_colomn=None):
        '''
        @brief the treeview selection
        @info signal: row-activated
        @return sh: double_clic@line@data
        @return py: ((path), [row selected,], 'double_clic')
        '''
        self.on_treeview(widget,'dblc')

    def on_clicked(self, widget,event=None,arg=None):
        '''
        @brief can be used for any widget
        @return clicked
        '''
        if self.flag_right_clic:
            self.flag_right_clic = False
        else:
            if import_py is not None:
                getattr(self.th.IMPORT, widget.get_name()) ('clicked')
                return
            self.send_data( '%s %s' % (widget.get_name(), 'clicked') )

    def press_event(self, widget, event=None,arg=None):
        '''
        @brief can be used for any widget
        @return press_event
        '''
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name()) ('press_event')
            return
        self.send_data( '%s %s' % (widget.get_name(), 'press_event') )

    def release_event(self, widget, event=None,arg=None):
        '''
        @brief can be used for any widget
        @return release_event
        '''
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name()) ('release_event')
            return
        self.send_data( '%s %s' % (widget.get_name(), 'release_event') )

    def get_pointer(self, widget, event=None,arg=None):
        '''
        @brief Curseur location in the widget
        @return sh: pointer@x y
        @return py: ('pointer', x, y)
        '''
        name = widget.get_name()
        x, y = widget.get_pointer()
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name()) ('pointer', x, y)
            return
        self.send_data( '%s pointer@%s %s' % (name, x, y) )

    '''
    *** treeview
    '''
    def on_treeview(self,widget,event=None,arg=None):
        '''
        @brief the treeview selection
        @info signal: cursor-changed
        @return sh: line@data
        @return py: ((path), [row selected,])
        '''
        nom = widget.get_name()
        arg = self.th.retourne_selection(nom)
        pyarg = arg
        if arg:
            if event =='dblc':
                if import_py is not None: pyarg.append('double_clic')
                arg='double_clic@%s' % (arg)
            if import_py is not None:
                getattr(self.th.IMPORT, widget.get_name()) (*pyarg)
                return
            self.send_data('%s %s' % (nom, arg.encode('utf8')) )

    def select_up(self,widget,event=None,arg=None):
        '''
        @brief push up the selected line (not working with gtk3)
        '''
        self.th.TREEUP( '_@@_@@%s' % widget.get_name() )

    def select_down(self,widget,event=None,arg=None):
        '''
        @brief push down the selected line
        '''
        self.th.TREEDOWN( '_@@_@@%s' % widget.get_name() )

    def select_top(self,widget,event=None,arg=None):
        '''
        @brief push up the selected line in first position
        '''
        self.th.TREETOP( '_@@_@@%s' % widget.get_name() )

    def select_bottom(self,widget,event=None,arg=None):
        '''
        @brief push down the selected line in last position
        '''
        self.th.TREEBOTTOM( '_@@_@@%s' % widget.get_name() )

    '''
    *** radio, check, toggle button
    '''
    def on_toggled(self, widget,event=None,arg=None):
        '''
        @brief the status of a check/radio/togglebutton
        @info signal: toggled
        @return True or False
        '''
        nom   =widget.get_name()
        value = widget.get_active()
        self.dic_widget[nom][2] = value
        if import_py is not None:
            getattr(self.th.IMPORT, nom) (value)
            return
        self.send_data('%s %s' % (nom, value) )

    def my_callback(self, widget,event=None,arg=None):
        '''
        @brief can be used for any widget
        @return my_callback
        '''
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name()) ('my_callback')
            return
        self.send_data( '%s %s' % (widget.get_name(), 'my_callback') )

    '''
    *** cursor overflight
    '''        
    def enter_notify_event(self, widget,event=None,arg=None):
        '''
        @brief when the cursor enters above a widget
        @info signal: enter-notify-event
        @return enter_notify_event
        '''
        if widget:
            if import_py is not None:
                getattr(self.th.IMPORT, widget.get_name()) ('enter_notify_event')
                return
            self.send_data( '%s %s' % (widget.get_name(), 'enter_notify_event' ) )

    def leave_notify_event(self, widget,event=None,arg=None):
        '''
        @brief when the cursor goes out a widget
        @info signal: leave_notify_event
        @return leave_notify_event
        '''
        if widget:
            if import_py is not None:
                getattr(self.th.IMPORT, widget.get_name()) ('leave_notify_event')
                return
            self.send_data( '%s %s' % (widget.get_name(), 'leave_notify_event' ) )

    '''
    *** keyboard key
    '''
    def key_press(self,widget, event):
        '''
        @brief press a key
        @info signal: key_ press_event
        @return sh: press@key
        @return py: (press, key)
        '''
        key = Gdk.keyval_name(event.keyval)
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name()) ('press', key)
            return
        self.send_data( '%s %s' % (widget.get_name(), 'press@%s' % key) )

    def key_release(self,widget, event):
        '''
        @brief release a key
        @info signal: key_ release_event
        @return sh: release@key
        @return py: release, key
        '''
        key = Gdk.keyval_name(event.keyval)
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name()) ('release', key)
            return
        self.send_data( '%s %s' % (widget.get_name(), 'release@%s' % key) )

    '''
    *** expander
    '''
    def toggle_expander(self, widget, event=None,arg=None):
        '''
        @brief change the expander state
        @info the widget must be indicated in the user data
        '''
        if widget.get_expanded():
            widget.set_expanded(False)
        else:
            widget.set_expanded(True)

    def on_expander(self, widget, event=None,arg=None):
        '''
        @brief expand the expander
        @info the widget must be indicated in the user data
        '''
        widget.set_expanded(True)

    def off_expander(self, widget, event=None,arg=None):
        '''
        @brief close the expander
        @info the widget must be indicated in the user data
        '''
        widget.set_expanded(False)

    def expander_cb(self, widget, event=None,arg=None):
        '''
        @brief action on expander
        @info signal: activate
        @return True or False
        '''
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name()) (widget.get_expanded())
            return
        self.send_data( '%s %s' % (widget.get_name(), widget.get_expanded()))

    '''
    *** terminal
    '''
    def kill_term_child(self, widget, arg=9):
        '''
        @brief kills the process launched in terminal
        '''
        DEBUG('[terminal] kill: %s' % self.terminal_PID)
        try:
            os.kill( self.terminal_PID, arg)
            self.terminal_PID = self.terminal.fork_command()
        except:
            DEBUG('No process or unactive kill -9')

    '''
    *** notebook
    '''
    def on_page(self, widget, event=None,arg=None):
        '''
        @brief Displays a page of the notebook
        @info the page must be indicated in the user data
        '''
        notebook = widget.get_parent()
        num = notebook.page_num(widget)
        notebook.set_current_page( num )

    def page_next(self, widget, event=None,arg=None):
        '''
        @brief Displays next page of the notebook
        @info the notebook must be indicated in the user data
        '''
        widget.next_page()

    def page_prev(self, widget, event=None,arg=None):
        '''
        @brief Displays previous page of the notebook
        @info the notebook must be indicated in the user data
        '''
        widget.prev_page()

    def auto_scale(self, widget, rect=None,arg=None):
        '''
        @brief when the widget size is modified
        @info 
        @return sh: scale@width height
        @return py: ('scale', width, height)
        '''
        if (self.old_scale_width != rect.width or self.old_scale_height != rect.height):
            self.old_scale_width, self.old_scale_height = (rect.width, rect.height)
            if import_py is not None:
                getattr(self.th.IMPORT, widget.get_name()) ('scale', rect.width,
                                                             rect.height)
                return
            self.send_data( '%s scale@%s %s' % (widget.get_name(), rect.width,
                                                 rect.height) )

    def auto_scale_img(self, widget, rect=None,arg=None):
        '''
        @brief changes the size of a picture according to its container
        @info put the image in a box and connect the signal
        @info signal: size-allocate, user data: image
        @return sh: img_scale="width height"
        @return py: img_scale = (width, height)
        '''
        x, y, width, height = (rect.x, rect.y, rect.width, rect.height)
        if import_py is not None:
            setattr(self.th.IMPORT, widget.get_name()+'_scale', (width, height))
        else:
            self.send_data( 'GET@%s_scale="%s %s"' % (widget.get_name(),
                                                               width, height) )
        filename = self.dic_img[ widget.get_name() ]
        if (self.old_width_img != width or self.old_height_img != height):
            self.old_width_img, self.old_height_img = (width, height)
            size = width
            if height > width:
                size = height
            pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(filename, width,
                                                            height)
            GObject.idle_add(widget.set_from_pixbuf,pixbuf)
            DEBUG('[[ SCALE IMG ]] %s %s %s'% (width, height, filename))

class GuiWebkit(object):
    '''
    ************************
    *** Webkit navigator ***
    ************************
    '''
    def make_navigateur(self, name, box):
        nav = self.return_navigateur(name)
        box = eval('self.%s' % box)
        scrolled = Gtk.ScrolledWindow()
        scrolled.add(nav)
        box.add(scrolled)
        
        exec( 'self.%s = nav' % name)
        box.show_all()

    def return_navigateur(self, name):
        webview = webkit.WebView()
        webview.set_property('name', name)
        webview.connect("navigation-policy-decision-requested", self.nav_request)
        webview.connect("document-load-finished", self.document_load_finished_cb)
        if name in dic_webrequest:
            idc = webview.connect("resource-request-starting",
                                  self.resource_request_cb)
            #dic_websignal[name]["resource-request-starting"] = idc
            self.add_signal_to_dic(name, "webrequest", idc)
        if name in dic_webcache:
            try:
                l = [i for i in os.listdir(dic_webcache[name][0])]
            except: l =[]
            self.liste_cache = l
            idc = webview.connect("resource-request-starting",
                                  self.resource_cache_cb)
            #dic_websignal[name]["resource-request-starting"] = idc
            self.add_signal_to_dic(name, "webcache", idc)
        
        if name in dic_webdownload:
            idc = webview.connect("download-requested",
                                  self.download_requested_cb)
            #dic_websignal[name]["download-requested"] = idc
            self.add_signal_to_dic(name, "webdownload", idc)
        if name in l_weboverlink:
            idc = webview.connect("hovering-over-link",
                                  self.hovering_over_link_cb)
            self.add_signal_to_dic(name, "weboverlink", idc)
            self.old_hovering_link = None
        return webview

    def document_load_finished_cb(self, webview, webframe):
        webview.execute_script('''var oldTitle = document.title;
        function getMyElementAtPoint(value,x,y) {
        var elementPoint = document.elementFromPoint(x,y);
        if(elementPoint.nodeName == 'IMG' && elementPoint.parentNode.nodeName == 'A') {
            if(value == 'html') {
                document.title = elementPoint.parentNode.outerHTML;
            } else {
                /*alert(elementPoint.src);*/
                document.title = elementPoint.src + ' ' + elementPoint.parentNode;
            }
        } else {
            if(value == 'html') {
                document.title = elementPoint.outerHTML;
            } else {
                /*alert(elementPoint);*/
                document.title = elementPoint;
            }
        }
        }
        function createLinkCom()
        {
            var link =  document.createElement("a");
            link.href = '#';
            link.style.display = 'none';
            link.id = 'com_lien';
            document.getElementsByTagName('body')[0].appendChild(link);
            return link;
        }
        function injectJsFile(uri) {
            var arg = document.createElement('script');
            arg.type = "text/javascript";
            arg.src = uri;
            document.getElementsByTagName('body')[0].appendChild(arg);
        }
        function injectCssFile(uri) {
            var arg = document.createElement('link');
            arg.type = "text/css";
            arg.href = uri;
            arg.rel = "stylesheet";
            document.getElementsByTagName('body')[0].appendChild(arg);
        }
        function sendTo(fonction, arg, cmd) {
            var com_lien = document.getElementById("com_lien");
            if(!com_lien) { 
                var com_lien = createLinkCom();
            }
            com_lien.setAttribute("href", cmd + fonction + arg );
            var evt = document.createEvent("cursorEvents");
            evt.initEvent("click", true, true);
            com_lien.dispatchEvent(evt);
        }
        function sendToScript(fonction, arg) {
            sendTo(fonction, ' ' + arg, 'g2s:')
        }
        function sendToGtk(fonction) {
            sendTo(fonction, ' ', 'G2S:')
        }
        ''')
        name = webview.get_name()
        if name in l_webloaded:
            if import_py is not None:
                getattr(self.th.IMPORT, name) ('loaded')
            self.send_data('%s loaded' % name )

    def add_signal_to_dic(self, name, signal, idc):
        try:
            dic_websignal[name][signal] = idc
        except:
            dic_websignal[name] = {signal:idc}

    def append_menuitem(self, widget, dic, menu, name):
        '''
        widget =  window or webview
        dic = { name: [[item, function, value],[....]],}
        menu = Gtk.Menu
        name = widget name
        '''
        for elem in dic[name]:
            item, function, value = elem
            if item == 'separator':
                separator = Gtk.SeparatorMenuItem()
                menu.append( separator )
                separator.show()
            else:
                menuitem = Gtk.MenuItem(label=item)
                menuitem.connect('activate', self.call_function_from_webmenu,
                            item, function, value, widget.get_pointer(), widget)
                menu.append(menuitem)
                menuitem.show()
                try:
                    self.append_submenuitem(widget, menuitem, dic_websubmenu, 
                                         item, self.call_function_from_webmenu)
                except:
                    pass

    def append_submenuitem(self, widget, menuitem, dic, name, callback):
        '''
        widget =  window or webview
        menuitem = Gtk.MenuItem
        dic = { name: [[item, function, value],[....]],}
        name = item of Gtk.MenuItem
        callback = fonction to call
        '''
        menu = Gtk.Menu()
        for elem in dic[name]:
            item, function, value = elem
            if item == 'separator':
                separator = Gtk.SeparatorMenuItem()
                menuitem.append( separator )
            else:
                menuit = Gtk.MenuItem(label=item)
                menuit.connect('activate', callback, item, function, value,
                                widget.get_pointer(), widget)
                menu.append(menuit)
        menuitem.set_submenu(menu)
        menu.show_all()

    def populate_popup_cb(self, webview, menu):
        name = webview.get_name()
        if dic_webmenu[name]:
            for item in menu.get_children():
                item.hide()
        try:
            self.append_menuitem(webview, dic_webmenu, menu, name)
        except:
            pass
        menu.show()

    def call_function_from_webmenu(self, menuitem, name, function, value,
                                   t_place, webview):
        webview.execute_script("getMyElementAtPoint('%s', '%s', '%s');" % \
                                               (value, t_place[0], t_place[1]))
        #webview.execute_script("document.title=document.documentElement.innerHTML;")
        arg = webview.get_main_frame().get_title()
        webview.execute_script("document.title=oldTitle;")
        if import_py is not None:
            getattr(self.th.IMPORT, function) (name, arg)
            return
        self.send_data('%s %s@%s' % (function, name, arg) )
    
    def download_requested_cb(self, webview, download):
        uri         = download.get_uri()
        name        = webview.get_name()
        webdownload = dic_webdownload[name]
        if webdownload == "GetLink":
            if import_py is not None:
                getattr(self.th.IMPORT, name) ('GetLink', uri)
            else:
                self.send_data('%s GetLink@%s' % (name, uri) )
            return False
        dialog = Gtk.FileChooserDialog("Choose a destination", None,
                                       Gtk.FileChooserAction.SAVE,
                                       (Gtk.STOCK_CANCEL,
                                        Gtk.ResponseType.CANCEL,
                                        Gtk.STOCK_SAVE,
                                        Gtk.ResponseType.OK)
                                      )
        dialog.set_current_name(os.path.basename(uri))
        try:
            dialog.set_current_folder(self.path_folder_download_selected)
        except: pass
        if dialog.run() == Gtk.ResponseType.OK:
            filename = dialog.get_uri()
            self.path_folder_download_selected = \
                             os.path.dirname(filename.replace('file://',''))
            if webdownload == 'UserChoose':
                if import_py is not None:
                    getattr(self.th.IMPORT, name) ('UserChoose', uri, filename)
                else:
                    self.send_data('%s UserChoose@%s %s' % (name, uri, filename) )
                dialog.destroy()
                return False
            elif webdownload == 'UserSave':
                n=1
                while os.path.exists(filename.replace('file://','')):
                    path, ext = os.path.splitext(filename)
                    filename = path+str(n)+ext
                    n+=1
                download.set_destination_uri(filename)
                if import_py is not None:
                    getattr(self.th.IMPORT, name) ('UserSave', uri, filename)
                else:
                    self.send_data('%s UserSave@%s %s' % (name, uri, filename) )
                dialog.destroy()
                return True
        dialog.destroy()
        return False

    def resource_cache_cb(self, view, frame, source, request, response):
        name = view.get_name()
        path = source.get_uri ()
        #print '_____path', path
        base = path.split('/')[-1]
        try:
            dossier, pattern, dialog = dic_webcache[name]
            if re.search(pattern, path):
                if not base in self.liste_cache:
                    urllib.urlretrieve(path, os.path.join(dossier, base) )
                    self.liste_cache.append(base)
                    if dialog == 'verbose':
                        if import_py is not None:
                            getattr(self.th.IMPORT, name) ('cache', base)
                        else:
                            self.send_data('%s cache@%s' % (name, base) )
                request.set_uri(os.path.join('file://'+dossier, base) )
        except: pass

    def resource_request_cb(self, view, frame, source, request, response):
        name = view.get_name()
        path = source.get_uri ()
        #print '_____path', path
        base = path.split('/')[-1]
        try:
            pattern = dic_webrequest[name]
            if pattern == 'ALL':
                if import_py is not None:
                    getattr(self.th.IMPORT, name) ('request', base)
                else:
                    self.send_data('%s request@%s' % (name, base) )
            elif re.search(pattern, path):
                if import_py is not None:
                    getattr(self.th.IMPORT, name) ('request', base)
                else:
                    self.send_data('%s request@%s' % (name, base) )
                request.set_uri('about:blank')
        except: pass

    def nav_request(self, webview, frame, request, navigation_action,
                    policy_decision):
        uri  = request.get_uri()
        name = webview.get_name()
        try:
            if re.search( dic_weblinkfilter[name], uri):
                if import_py is not None:
                    getattr(self.th.IMPORT, name) ('linkfilter', uri)
                else:
                    self.send_data('%s linkfilter@%s' % (name, uri))
                return True
        except: pass 
        if uri.startswith("g2s:"):
            data = uri.replace('g2s:','')
            if import_py is not None:
                name, data = data.split(' ',1)
                getattr(self.th.IMPORT, name) ('linkfilter', urllib.unquote(data))
            else:
                self.send_data(  urllib.unquote(data) )
        elif uri.startswith("G2S:"):
            data = uri.replace('G2S:','')
            data = urllib.unquote(data)
            cmd = data.split('@')[0]
            getattr(self.th, cmd)(data)
        else: return False
        return True

    def hovering_over_link_cb(self, webview, title, uri):
        name = webview.get_name()
        if self.old_hovering_link != uri or uri is None:
            if import_py is not None:
                getattr(self.th.IMPORT, name) ('overlink', uri)
            else:
                self.send_data('%s overlink@%s' % (name, uri) )


class GuiXmlParser(object):
    '''
    ********************
    *** Parser glade ***
    ********************
    '''
    def parse_xml(self):
        self.dic_img = {}
        dom = parse(f_glade)
        l   = dom.getElementsByTagName(USERLIB)
        widgets2ref = ['GtkWindow', 'GtkEventBox', 'GtkTreeView',
                 'GtkStatusbar', 'GtkAboutDialog', 'GtkButton',
                 'GtkComboBoxEntry', 'GtkComboBox', 'GtkImage']
        child2ref = ['sensitive', 'visible', 'active', 'pixbuf']
        for node in l:
            widget = node.attributes['class'].value
            name = node.attributes['id'].value
            #add to dic for each widget 'sensitive', 'visible', 'active',
            # necessary to manage the commands and callback toggle 
            self.dic_widget[name] = [True, False, False]
            if widget in widgets2ref or name.startswith('_'):
                exec_widget = 'self.%s=self.widgets.get_%s("%s")' % (name, USERLIB, name)
                try:
                    exec(exec_widget)
                except:
                    DEBUG("[[ ERROR ]] can't assign widget, name: %s"% name)
                    continue
                if USERLIB == 'object':
                    wid = eval('self.%s' % name)
                    wid.set_name(name)
                DEBUG('[[ WIDGETS ]] ====>>>> %s' % name)
                try:
                    getattr(self, widget)(name)
                #except gi._glib.GError, e:
                #    raise
                except:
                    pass
                #except TypeError,e:
                    #print "Unexpected error:",e
            for child in node.childNodes:
                if (child.nodeType == child.TEXT_NODE 
                    or not child.hasAttributes() 
                    or child.nodeName == "child"): continue
                child_name = child.attributes['name'].value
                try:
                    child_data = child.firstChild.data
                    if child_name in child2ref: # launch function modif dico
                        getattr(self, child_name)(name, child_data)
                except:
                    if child_name in child2ref: raise
                    pass
                if child_name in ('drag-drop','drag_drop'):
                    self.set_drag_drop(name)

    def GtkTextView(self, nom):
        pass

    def GtkLabel(self, nom):
        pass

    def pixbuf(self, nom, data):
        self.dic_img[nom] = data

    def active(self, nom, data):
        if data =='True':
            self.dic_widget[nom][2] = True

    def visible(self, nom, data):
        if data =='True':
            self.dic_widget[nom][1] = True

    def sensitive(self, nom, data):
        if data =='False':
            self.dic_widget[nom][0] = False

    def GtkWindow(self, nom):
        window=eval('self.%s' % (nom) )
        window.connect('realize', self.window_realize_cb)
        if gtkrc is not None:
            self.apply_gtkrc( window, gtkrc )
        screen = window.get_screen()
        self.screen_width, self.screen_height = (screen.get_width(),
                                                    screen.get_height())
        DIC_ENV['G2S_SCREEN_HEIGHT'] = str(self.screen_height)
        DIC_ENV['G2S_SCREEN_WIDTH'] = str(self.screen_width)

    def window_realize_cb(self, window):
        self.window_realized = True

    def GtkTreeView(self, nom):
        exec( 'treeview=self.%s' % (nom) )
        try:
            self.make_treeview(nom, treeview)
        except ValueError, e: 
            DEBUG('==== [[ ERROR ]] ===>> %s' % e)
        treeview.enable_model_drag_dest([], DRAG_ACTION_MOVE)
        treeview.enable_model_drag_source(DRAG_BTN_MASK, [], DRAG_ACTION_MOVE)
        treeview.drag_dest_add_text_targets()
        treeview.drag_source_add_text_targets()

    def GtkStatusbar(self, nom):
        exec("self.context_%s = self.%s.get_context_id('context_description')" % (nom,nom) )

    def GtkComboBox(self, nom):
        exec( 'combo=self.%s' % (nom) )
        try:
            self.make_combo(nom, combo)
        except ValueError, e: 
            DEBUG('==== [[ ERROR COMBO ]] ===>> %s' % e)

    def GtkComboBoxEntry(self, nom):
        exec( 'combo=self.%s' % (nom) )
        combo.get_child().set_name('%s_entry' % nom)
        setattr(self, '%s_entry' % nom, combo.get_child())
        try:
            self.make_combo(nom, combo)
        except ValueError, e: 
            DEBUG('==== [[ ERROR COMBO ]] ===>> %s' % e)


class GuiTreeview(object):
    '''
    ****************************
    *** Treeview creation    ***
    ****************************
    '''
    def make_treeview(self,name,treeview):
        '''
        dic_treeview[name] = ['ICON%%5%%clic%%check|ICON%%clic%%radio|Colonne%%50%%editable|CHECK%%check|RADIO%%radio|Colonne%%50|FONT|COMBO%%combo%%mp3%%ogg%%défaut','data|dtat|dtat|....']
        store_base=['str', 'str', 'str', 'bool', 'bool', 'str', 'str', 'str']
        dic_entet={'RADIO4': ['radio'], 'ICON0': ['5', 'clic', 'check'], 'ICON1': ['clic', 'radio'], 'COMBO7': ['combo', 'mp3', 'ogg', 'd\xc3\xa9faut'], 'Colonne5': ['50'], 'Colonne2': ['50', 'editable'], 'FONT6': [], 'FONT': 6, 'CHECK3': ['check']}
        liste_base=['ICON_0', 'ICON_1', 'Colonne_2', 'CHECK_3', 'RADIO_4', 'Colonne_5', 'FONT_6', 'COMBO_7']    
        '''
        DEBUG('[[ TREEVIEW ]] ==> Start make')
        store_base = []
        liste_base = []
        value_ent  = []
        self.dic_entet = {}
        FBF = ['FONT', 'BACK', 'FORE']
        dic_elem_entet = {'FONT':'str', 'BACK':'str', 'FORE':'str', 'CHECK':'bool',
                          'RADIO':'bool', 'PROGRESS':'int', 'HIDE':'str', 'FORE':'str',
                          'COMBO':'str', 'ICON':'str', 'IMG':'GdkPixbuf.Pixbuf' }
        liste_treeview =  dic_treeview[name]
        #ref = ICON|colonne
        ref=liste_treeview.pop(0)
        liste_ref=ref.split('|')
        n=0
        for l in liste_ref:
            liste_l = l.split('%%')
            # ent = ICON, CHECK ...
            ent = liste_l.pop(0)
            # ent_n = ICON_1, CHECK_2 ...
            ent_n = '%s_%s' % (ent, n)
            try:
                # ajoute str, bool ...
                store_base.append( dic_elem_entet[ent] )
            except:
                store_base.append('str')
            liste_base.append( ent_n )
            self.dic_entet[ent_n] = liste_l
            if ent in FBF: #reference the column
                self.dic_entet[ent] = n
            n+=1
        DEBUG('[[ TREEVIEW ]] => %s colonnes' % n)
        
        var=','.join(store_base)
        exec( 'self.store_%s= Gtk.TreeStore(%s)' % (name,var) )
        exec( 'mystore=self.store_%s' % (name) )
        l = []
        for ent in liste_base:
            n = ent.split('_')[1]
            call_fonction = ent.split('_')[0]
            try: #test if the header is a function
                vv = dic_elem_entet[call_fonction]
                value_ent = self.dic_entet[ent]
            except: #if not, it is a text column
                value_ent = [call_fonction]+self.dic_entet[ent]
                call_fonction = 'TEXT'
            titre_col=' '
            getattr(self, call_fonction)(name, treeview, mystore, int(n),
                                                    value_ent, titre_col)
        if liste_treeview: # if lines are passed as arguments, loads the TreeStore
            for ligne in liste_treeview:
                path = ligne.split('|')[0]
                parent, position = self.try_path(path, mystore)
                mystore.append(parent, self.modif_type(ligne, mystore) )
        treeview.set_model(mystore)
        DEBUG('[[ TREEVIEW ]] ==> Treeview Loaded')

    def try_path(self, position, mystore):
        try:
            parent, position = position.split(':')
            iter = mystore.get_iter(parent)
        except:
            iter = None
        return (iter, position)

    def IMG(self, name, treeview, mystore, num_col, l_value, titre):
        DEBUG('[[ TREEVIEW ]] ==> Image %s' % num_col)
        self.ICON(name, treeview, mystore, num_col, l_value, titre, False)

    def ICON(self, name, treeview, mystore, num_col, l_value, titre, flag_icon=True):
        DEBUG('[[ TREEVIEW ]] ==> Icon %s' % num_col)
        CLIC = False
        render = Gtk.CellRendererPixbuf()
        for lm in l_value:
            try:  # if it is a number
                size = int(lm)
                render.set_property('stock_size', size )
                DEBUG('[[ TREEVIEW ]] => Icon > size %s' % size)
            except:
                if lm == 'clic': # make the icon clickable
                    DEBUG('[[ TREEVIEW ]] => Icon > clic')
                    CLIC=True
                else:
                    titre=lm
        if flag_icon:
            col = Gtk.TreeViewColumn(titre, render, icon_name=num_col)
        else: col = Gtk.TreeViewColumn(titre, render, pixbuf=num_col)
        if CLIC:
            treeview.connect_after('cursor-changed', self.rappel_clic, col, name, num_col)
        treeview.append_column(col)
        return True

    def CHECK(self, name, treeview, mystore, num_col, l_value, titre):
        DEBUG('[[ TREEVIEW ]] ==> Check %s' % num_col)
        if l_value: titre = l_value[0]
        render = Gtk.CellRendererToggle()
        render.connect('toggled', self.rappel_toggled, mystore, num_col, name)
        col = Gtk.TreeViewColumn(titre, render, active=num_col)
        treeview.append_column(col)

    def RADIO(self, name, treeview, mystore, num_col, l_value, titre):
        DEBUG('[[ TREEVIEW ]] ==> Radio %s' % num_col)
        if l_value: titre = l_value[0]
        render = Gtk.CellRendererToggle()
        render.set_property('radio',True)
        render.connect('toggled', self.rappel_radio, mystore, num_col, name)
        col = Gtk.TreeViewColumn(titre,render,active=num_col)
        treeview.append_column(col)
        self.DIC_RADIO[num_col]=0

    def COMBO(self, name, treeview, mystore, num_col, l_value, titre):
        DEBUG('[[ TREEVIEW ]] ==> Combo %s' % num_col)
        if l_value:
            titre = l_value.pop(0)
            for lm in l_value:
                try:
                    size = int(lm)
                    render.set_property('width', size )
                    DEBUG('[[ TREEVIEW ]] => Combo > size %s'% size)
                except:
                    pass
            liste_combo = [ [i] for i in l_value ]
        store_combo = Gtk.ListStore(str)
        for li in liste_combo:
            store_combo.append(li)
        render = Gtk.CellRendererCombo()
        render.set_property('model',store_combo)
        render.set_property('text-column', 0)
        render.set_property('editable',True)
        render.connect('edited', self.rappel_edited, name, mystore, num_col,
                                                            'combo',treeview)
        col=Gtk.TreeViewColumn(titre, render, text=num_col)
        try:
            col_font = self.dic_entet['FONT']
            col.add_attribute(render,'font', col_font)
        except: pass
        treeview.append_column(col)
        DEBUG('[[ TREEVIEW ]] => Loaded')

    def PROGRESS(self, name, treeview, mystore, num_col, l_value, titre):
        DEBUG('[[ TREEVIEW ]] ==> Progressbar %s' % num_col)
        render = Gtk.CellRendererProgress()
        if l_value:
            for lm in l_value:
                try:
                    size = int(lm)
                    render.set_property('width', size )
                    DEBUG('[[ TREEVIEW ]] => Progress > size %s'% size)
                except:
                    titre = lm
        col = Gtk.TreeViewColumn(titre, render, value=num_col)
        treeview.append_column(col)

    def TEXT(self, name, treeview, mystore, num_col, l_value, titre):
        DEBUG('[[ TREEVIEW ]] ==> Texte %s' % num_col)
        render = Gtk.CellRendererText()
        size = None
        self.column_sizing = True
        if l_value:
            titre = l_value.pop(0)
            for lm in l_value:
                try:
                    size = int(lm)
                    render.set_property('width', size )
                    self.column_sizing = False
                    DEBUG('[[ TREEVIEW ]] => Texte > colonne size %s'% size)
                except:
                    if lm == 'editable':
                        render.set_property('editable', True)
                        render.connect('edited', self.rappel_edited, name,
                                mystore, num_col, 'edit', treeview)
                        self.col_edit = num_col
                        DEBUG('[[ TREEVIEW ]] => Texte > editable %s'% num_col)
        #else: titre=elem
        col=Gtk.TreeViewColumn(titre,render,markup=num_col)
        try:
            col_font = self.dic_entet['FONT']
            col.add_attribute(render,'font', col_font)
            DEBUG('[[ TREEVIEW ]] => Texte > font %s'% col_font)
        except: pass
        try:
            col_back = self.dic_entet['BACK']
            col.add_attribute(render,'background', col_back)
            DEBUG('[[ TREEVIEW ]] => Texte > backg %s'% col_back)
        except: pass
        try:
            col_fore = self.dic_entet['FORE']
            col.add_attribute(render,'foreground', col_fore)
            DEBUG('[[ TREEVIEW ]] => Texte > fore %s'% col_fore)
        except: pass
        col.set_resizable(True)
        col.set_sort_column_id(num_col)
        treeview.append_column(col)
        sel=treeview.get_selection()
        sel.set_mode(Gtk.SelectionMode.SINGLE)

    def HIDE(self, name, treeview, mystore, num_col, l_value, titre):
        DEBUG('[[ TREEVIEW ]] ==> hide %s'% num_col)
        return

    def FONT(self, name, treeview, mystore, num_col, l_value, titre):
        return

    def BACK(self, name, treeview, mystore, num_col, l_value, titre):
        return

    def FORE(self, name, treeview, mystore, num_col, l_value, titre):
        return

    '''
    **************************************************************
    *** Actions treeview column → icon, radio, check, edited   ***
    **************************************************************
    '''        
    def rappel_clic(self, widget, tree_column, tree_name, num_col):
        self.th.iter_select = ' '
        # si la colonne est régler sur clic
        if widget.get_cursor()[1] == tree_column:  
            list_str = self.th.retourne_selection(tree_name)
            print list_str
            if import_py is not None:
                list_str.prepend(num_col)
                t = ( (num_col, list_str[0]), list_str[1], 'clic' )
                getattr(self.IMPORT, tree_name)(*t)
                return True
            liste    = list_str.split('@')
            print liste
            arg='%s,%s' % (liste.pop(0), num_col)
            #list_str_re = '|'.join(liste)
            #~FIXME encodage utf8 unicode
            l='%s'%liste[0]
            var = '%s clic@%s@%s' % (tree_name, arg, liste[0])
            #var = '%(tree_name)s clic@%(arg)s@%(liste)s' % locals()
            #var = tree_name+' clic@'+arg+'@'+list_str.decode('utf8')
            try:
                self.send_data(var)
            except:
                self.send_data( var.encode('utf8') )
        return True
    
    def rappel_radio(self, cellrender, path, store, col, name_tree):
        DEBUG(self.DIC_RADIO[col])
        self.th.iter_select = ' '
        old = self.DIC_RADIO[col]
        store[old][col]     = False
        store[path][col]    = True
        self.DIC_RADIO[col] = path
        DEBUG(self.DIC_RADIO[col])
        if import_py is not None:
            getattr(self.th.IMPORT, name_tree) (
                                                 (col, path),
                                                 list(store[path]),
                                                 'radio',
                                               )
            return
        liste = self.th.list_to_string( list(store[path]) )
        val = "%s radio@%s,%s@%s" % ( name_tree, path, col, liste )
        self.send_data( val )

    def rappel_toggled(self, cellrender, path, store, col, name_tree):
        etat = store[path][col]
        self.th.iter_select=' '
        if etat:
            cellrender.set_active(False)
            store[path][col]=False
        else:
            cellrender.set_active(True)
            store[path][col]=True
        if import_py is not None:
            getattr(self.th.IMPORT, name_tree) (
                                                 (col, path),
                                                 list(store[path]),
                                                 'toggle',
                                               )
            return
        liste = self.th.list_to_string( list(store[path]) )
        val   = "%s toggled@%s,%s@%s" % ( name_tree, path, col, liste )
        self.send_data( val )

    def rappel_edited(self,celltext, chemin, nouveau_texte, tree_name,
                                         mystore, col, style, treeview):
        ancien_texte = mystore[chemin][col]
        mystore[chemin][col] = nouveau_texte
        #ligne = self.th.list_to_string( list(mystore[chemin]) )
        ligne = '|'.join( map(str, list(mystore[chemin]) ))
        if import_py is not None:
            getattr(self.th.IMPORT, tree_name) ( 
                                        (col, chemin),
                                        (ancien_texte, ligne ),
                                        style,
                                                )
        else: #~FIXME encodage utf8 unicode
            try:
                val   = '%s %s@%s,%s@%s@%s' % (tree_name, style, chemin ,col,
                                                ancien_texte, ligne)
                self.send_data(val)
            except:
                val   = '%s %s@%s,%s@%s@%s' % (tree_name, style, chemin ,col,
                                                ancien_texte.decode('utf8'), 
                                                ligne.decode('utf8'))
                self.send_data( val.encode('utf8') )
        if self.column_sizing: treeview.columns_autosize()

    '''
    *******************************
    *** Tooltip of the treeview ***
    *******************************
    '''
    def query_tooltip(self,treeview, x, y, keyboard_mode, tooltip):
        y = y - self.size_cell  #To manage the lines lag
        store = treeview.get_model()
        name  = treeview.get_name()
        info  = treeview.get_path_at_pos(x, y)
        if info is None: return False  #If nothing in this position, we do not display
        line    = info[0].get_indices()[0] - 1
        #print info, line
        column  = info[1]
        columns = treeview.get_columns()  # gets all columns
        col     = columns.index(column)  # column number
        tuple_size = column.cell_get_size(None)[1]  # column size 4 = cell height
        self.size_cell = tuple_size
        if line == -1 or col == -1: return False # If we are outside
        colonne = col # save num column
        try:
            dic_tooltip_name=dic_tooltip[name]  # {'treeview':{0:1,1:5,}, }
            if col in dic_tooltip_name:  # If wa assign a text of another column
                col  = dic_tooltip_name[col]
                flag = False  # OK, we can display
            else: flag = True
        except:
            flag=False  #By default we display, no option
        if flag: return False
        label = str( store[line][col] )
        if line == self.tooltip_line and colonne == self.tooltip_col:  #we are in the same column
            tooltip.set_markup( label )
            return True    # display
        self.tooltip_line = line
        self.tooltip_col  = colonne
        return False
    '''
    ******************************
    *** Drag & drop management ***
    ******************************
    '''
    def return_selection(self, treeview):
        name          = treeview.get_name()
        modele, iter  = treeview.get_selection().get_selected()
        row           = list(modele[iter])
        return (name, modele, iter, row)
    
    def drag_data_get(self, treeview, context, selection, id_cible,
                           etime):  # slide from a treeview
        '''
        @brief The treeview can drag selection
        @info add this to drag-data-get signal
        '''
        name, modele, iter, row = self.return_selection(treeview)
        text = '''%s %s''' % (name, str(row))
        selection.set_text(text, -1)
        return
        treeselection = treeview.get_selection()
        name = treeview.get_name()
        #treeselection.set_mode(Gtk.SelectionMode.MULTIPLE)
        modele, iter  = treeselection.get_selected()
        donnees       = list(modele[iter])
        texte = ''
        selection.set(selection.target, 8, name+' '+str(donnees) )

    def drag_data_received(self, treeview, context, x, y, selection,
                                info, etime):  # deposit into a treeview
        '''
        @brief The treeview can received drag selection
        @info  add this to drag-data-received signal
        '''
        
        iter_to_copy = False
        model = treeview.get_model()
        name = selection.get_text()
        info_depot = treeview.get_dest_row_at_pos(x, y)
        try:
            tree_source  = getattr(self, name.split(' ')[0])
            ns, model_source, iter_to_copy, row_s = \
                                         self.return_selection(tree_source)
        except:
            row_s=[name]        
        if info_depot: # if we are between the treeview lines
            chemin, position = info_depot
            iter = model.get_iter(chemin)
            if iter_to_copy: # from a tree
                if iter_to_copy != iter:
                    self.iter_copy(model_source, model, iter_to_copy,
                                  iter, position)
            else:
                self.add_iter_to_tree(model, iter, row_s, position)
        else: # drop in a empty tree
            model.append(None, row_s)       
        if context.get_suggested_action() == DRAG_ACTION_MOVE:
            context.finish(True, True, etime)
            
        def check_path(model, path, iter, don): #search drop emplacement
            if list(model[iter]) == don[0]:
                DEBUG( '[[ D & D ]] => Find item, path: %s'% path)
                don[1].append(path.to_string())
        lref = []
        model.foreach(check_path, (row_s, lref) )
        chemin = lref[0]
        if import_py is not None:
            getattr(self.th.IMPORT, treeview.get_name()) (
                                                           chemin,
                                                           row_s,
                                                           'drop',
                                                         )
            return
        lt = self.th.list_to_string(row_s)
        self.send_data( '%s drop@%s@%s' % (  
                                          treeview.get_name(),
                                          chemin,
                                          lt.encode('utf8'),
                                          )
                      )
   
    def add_iter_to_tree(self, model, target_iter, data_to_copy, pos):
        if (pos == DRAG_INTO_OR_BEFORE or pos == DRAG_INTO_OR_AFTER):
            new_iter = model.prepend(target_iter)
            model[new_iter] = data_to_copy
        elif pos == DRAG_BEFORE:
            new_iter = model.insert_before(None, target_iter, data_to_copy)
        elif pos == DRAG_AFTER:
            new_iter = model.insert_after(None, target_iter, data_to_copy)
        return new_iter
        
    def iter_copy(self, model_source, model, iter_to_copy,
                 target_iter, pos):
        data_to_copy = list(model_source[iter_to_copy])
        new_iter = self.add_iter_to_tree(model, target_iter, data_to_copy, pos) 
        if model_source.iter_has_child(iter_to_copy):
            for i in range(0, model_source.iter_n_children(iter_to_copy)):
                next_iter_to_copy = model_source.iter_nth_child(iter_to_copy, i)
                self.iter_copy(model_source, model, next_iter_to_copy,
                              new_iter, DRAG_INTO_OR_BEFORE)    


class Gui(Callbacks, GuiWebkit, GuiXmlParser, GuiTreeview):
    '''
    @page callbacks Signals and callbacks
    '''
    '''
    *****************************************
    *** UI CREATION
    *****************************************
    '''
    DIC_RADIO={}
    def __init__(self):
        self.dic_widget        = {}
        self.size_cell         = 24
        self.tooltip_col       = -1
        self.tooltip_line      = -1
        self.send_drop         = True
        self.flag_tooltip      = False
        self.window_realized   = True
        self.flag_right_clic   = False
        self.var_filechoose    = None
        self.old_label_tooltip = None
        self.glade2script_PID  = os.getpid()
        self.old_width_img, self.old_height_img      = (0, 0)
        self.old_scale_width, self.old_scale_height  = (0, 0)
        if os.path.exists(local_path):  # charger traduction
            if USERLIB == 'widget':
                DEBUG('[[ GTK LIB ]] ==> libglade > locale')
                Gtk.glade.bindtextdomain(nom_appli, local_path)
                Gtk.glade.textdomain(nom_appli)
                gettext.install(nom_appli)
                self.widgets = Gtk.glade.XML(fname=f_glade, domain=nom_appli)
                self.widgets.signal_autoconnect(self)
            else:
                DEBUG('[[ GTK LIB ]] ==> GtkBuilder > locale')
                self.widgets = Gtk.Builder()
                import locale
                locale.setlocale(locale.LC_ALL, '')
                locale.bindtextdomain(nom_appli, local_path)
                gettext.bindtextdomain(nom_appli, local_path)
                gettext.textdomain(nom_appli)
                #msgfmt --output-file=Test.mo Test.po
                #lang = gettext.translation(nom_appli, path)
                #_ = lang.gettext 
                _ = gettext.gettext
                #gettext.install(nom_appli)
                self.widgets.set_translation_domain(nom_appli)
                self.widgets.add_from_file(f_glade)
                self.widgets.connect_signals(self)
        else:
            if USERLIB == 'object':
                DEBUG('[[ GTK LIB ]] ==> GtkBuilder')
                self.widgets = Gtk.Builder()
                self.widgets.add_from_file(f_glade)
                self.widgets.connect_signals(self)
            else:
                DEBUG('[[ GTK LIB ]] ==> libglade')
                self.widgets = Gtk.glade.XML( f_glade )
                self.widgets.signal_autoconnect(self)
        if systray_icon:
            DEBUG('[[ SYSTRAY ]]')
            self.set_systray_icon()

        if clip is not None:
            DEBUG('[[ CLIPBOARD ]]')
            self.clipboard = Gtk.Clipboard.get(eval('Gdk.SELECTION_%s'%clip))
        self.parse_xml()
        if dic_trans:
            self.widgets_trans()

        if term_box is not None:
            self.make_terminal()
            DEBUG('[[ TERMINAL ]]')
        
        if embed is not None:
            DEBUG('[[ EMBED ]]')
            name, cmd = embed.split('@@')
            widget    = eval('self.%s' % name)
            self.app_embed = Embed(widget, cmd)

        if l_webkit:
            DEBUG('[[ WEBKIT ]]')
            for nav in l_webkit:
                self.make_navigateur(nav[0], nav[1])
        
        if dic_sourceview:
            for name, box in dic_sourceview.iteritems():
                DEBUG('[[ SOURCEVIEW ]] ==>> %s, %s' % (name, box))
                self.add_sourceview(name, box)
        
        if auto_config is not None:
            DIC_ENV.update( CONFIG_PARSER.load_config(self) )
            self.window_realized = False
            
        if load_config is not None and auto_config is None:
            DIC_ENV.update( CONFIG_PARSER.get_config(self) )
        
        if lock_cb: self.window_realized = False
    
    '''
    ************************
    ***   GtkSourceView   ***
    ************************
    '''
    def add_sourceview(self, name, box):
        box  = getattr(self, box)
        style = GtkSource.StyleSchemeManager()
        lang = GtkSource.LanguageManager()
        buffer = GtkSource.Buffer()
        view = GtkSource.View()
        view.set_property('name', name)
        view.set_buffer(buffer)
        setattr(self, name, view)
        setattr(self, '%s_LanguageManager'%name, lang)
        setattr(self, '%s_StyleSchemeManager'%name, style)
        box.add(view)
        view.show()
        DIC_ENV['G2S_SOURCEVIEW_LANG']  = ','.join(lang.get_language_ids())
        DIC_ENV['G2S_SOURCEVIEW_STYLE'] = ','.join(style.get_scheme_ids())
        
    '''
    ************************
    ***   Transparency   ***
    ************************
    '''
    def widgets_trans(self):
        
        for widget_name in dic_trans:
            widget = eval('self.%s' % widget_name)
            #widget.connect('draw', self.expose)
            #widget.connect('configure-event', self.expose)
            widget.set_visual( self.get_screen_colormap(widget) )
            widget.set_app_paintable(True) 
            #widget.realize()

    def get_screen_colormap(self, window):
        screen   = window.get_screen()
        colormap = screen.get_rgba_visual()
        if colormap == None:
            colormap = screen.get_system_visual()
        return colormap

    def expose(self, window, cr):
        #if window.is_composited():
        print 'expose'
        while not window.is_composited():
            time.sleep(0.5)
        name = window.get_name()
        trans, color = dic_trans[name]
        #print dic_trans
        try:
            eval(color) # si eval passe, color = None, donc defaut noir
            r, g, b = (0.0, 0.0, 0.0)
        except:
            r, g, b = self.get_rgb_color(color)
        try:
            trans = float(trans)
        except:
            trans = eval(trans)
        #cr = window.window.cairo_create()
        if trans is not None:
            cr.set_source_rgba(r, g, b, trans )
        else:
            cr.set_source_rgba(r, g, b, 0.0)
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.paint()

    def get_rgb_color(self, full):
        """  split_col(full=24 bit color value) return tuple of three colour values being 0-1.
        Assume 0xFFFFFF=White=(1,1,1) 0x000000=Black=(0,0,0)
        http://www.linuxquestions.org/questions/programming-9/python-set_source_rgb-set_source_rgba-values-817981/ 
        """
        full    = full.replace('#','0x')
        full    = eval(full)
        r, g, b = ((full >> 16)/255.0,(255 & (full >> 8))/255.0,(255 & full)/255.0)
        return (r, g, b)
        
    '''
    *********************************
    *** Combobox list creation    ***
    *********************************
    '''
    def make_combo(self, nom, combo):
        DEBUG('[[ COMBO ]] ==> Start make')
        icon = False
        try:
            liste = dic_combo[nom]
        except:
            DEBUG('==== [[ ERROR COMBO ]] ===>> no list')
            return
        ref = liste.pop(0)
        combo.clear()
        try:
            item, icon = ref.split('|')
        except:
            item = ref
        if icon:
            self.add_icon_on_combo(item, icon, combo, liste)
            return
        liststore = Gtk.ListStore(str)
        combo.set_model(liststore)
        cell = Gtk.CellRendererText()
        combo.pack_end(cell, True)
        combo.add_attribute(cell, 'markup', 0)
        DEBUG('[[ COMBO ]] ==> Label')
        if liste:
            for item in liste:
                liststore.append( [item] )
            DEBUG('[[ COMBO ]] ==> Loaded')

    def add_icon_on_combo(self, item, icon, combo, liste):
        if 'ICON' in icon:
            DEBUG('[[ COMBO ]] ==> Icon')
            liststore = Gtk.ListStore(str, str)
            combo.set_model(liststore)
            cell = Gtk.CellRendererPixbuf()
            try:
                # si il y a un argument
                arg, size = icon.split('%%')
                size = int(size)
                cell.set_property('stock_size', size )
                DEBUG('[[ COMBO ]] => Icon > size %s'% size)
            except:
                pass
            self.pack_cells(cell, combo, 'icon_name')
            if liste:
                for item in liste:
                    liststore.append( item.split('|') )
                DEBUG('[[ COMBO ]] ==> Loaded')
        elif 'IMG' in icon:
            DEBUG('[[ COMBO ]] ==> Image')
            size      = False
            liststore = Gtk.ListStore(str, GdkPixbuf.Pixbuf)
            combo.set_model(liststore)
            cell = Gtk.CellRendererPixbuf()
            try:
                arg, size = icon.split('%%')
                size=int(size)
                DEBUG('[[ COMBO ]] => Image > size %s' % size)
            except: pass
            self.pack_cells(cell, combo, 'pixbuf')
            if liste:
                for item in liste:
                    item, filename = item.split('|')
                    if size:
                        pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(filename, size, size)
                    else:
                        pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename)
                    liststore.append( [item, pixbuf] )
                DEBUG('[[ COMBO ]] ==> Loaded')

    def pack_cells(self, cell, combo, arg):
        combo.pack_start(cell, False)
        combo.add_attribute(cell, arg, 1)
        cell = Gtk.CellRendererText()
        combo.pack_end(cell, True)
        combo.add_attribute(cell, 'markup', 0)
        DEBUG('[[ COMBO ]] ==> Label')


    '''
    ********************
    *** VTE terminal ***
    ********************
    '''
    def make_terminal(self):
        '''
        Add a vte terminal.
            option --terminal='_hbox1:55x10'
            Container and dimension (width,height) in parameters.
            A viewport with callabck must be added in it for the automatic resize (in glade)
        '''
        self.flag_term    = True
        self.flag_event   = True
        self.terminal     = Vte.Terminal()
        self.terminal_PID = []
        self.terminal.fork_command_full(
                                       Vte.PtyFlags.DEFAULT,
                                       os.environ['HOME'],
                                       ["/bin/sh"],
                                       [],
                                       GLib.SpawnFlags.DO_NOT_REAP_CHILD,
                                       None,
                                       None,
                                       )
        #self.terminal_PID = self.terminal.fork_command()
        DIC_ENV['G2S_TERMINAL_PID'] = str(self.terminal_PID)
        lbox, size = term_box.split(':')
        self.term_width, self.term_height = size.split('x')
        box = eval('self.%s' % lbox)
        box.pack_start(self.terminal,False, True, 0)
        if term_redim:
            self.terminal.connect('char-size-changed',
                                         self.redim_container_from_font) 
            self.terminal.connect('status-line-changed', self.child_exited)
        if term_font is not None:
            self.terminal.set_font_from_string(term_font)
        self.terminal.show()
        box.show()

    def child_exited(self, widget, arg1=None, arg2=None):
        #print widget, arg1, arg2
        pass

    def redim_container_from_font(self, widget, width, height):
        '''
        Callback called during the terminal fonts change.
            widget = terminal
            width, height = necessary size for the new font, in pixels
        '''
        pere  = widget.get_parent()
        Gpere = pere.get_parent()
        if type(Gpere ) == Gtk.Viewport:
            container_width  = width * widget.get_column_count()
            container_height = height * widget.get_row_count()
            GObject.idle_add(Gpere.set_size_request, container_width,
                             container_height)
            self.flag_term = True
    
    def redim_term(self, widget, rect):
        '''
        @brief Auto resize VTE terminal
        @info see <a href="options.html#--terminal-redim">--terminal-redim</a> option
        '''
        '''
        Callback of the size-allocate signal of the viewport.
        When the widget is resized
           widget = viewport
           rect = Gtk.rectangle
        '''
        # Loads the dimensions for calculous base and default values,
        # resizes viewport and terminal, only once at the beginning.
        # Reinitialized during the fonts change thanks to the flag
        if self.flag_term: # flag to avoid the first signal
            self.flag_term = False
            self.defaut_width, self.defaut_hight = int(self.term_width),int(self.term_height)
            self.col_size  = self.terminal.get_char_width()
            self.line_size = self.terminal.get_char_height()
            nb_col  = self.defaut_width / self.col_size
            nb_line = self.defaut_hight / self.line_size
            GObject.idle_add(self.terminal.set_size, nb_col, nb_line)
            self.old_nb_col, self.old_nb_row = nb_col, nb_line 
            GObject.idle_add(widget.set_size_request, self.defaut_width, self.defaut_hight)
            return
        x, y, w, h = (rect.x, rect.y, rect.width, rect.height)
        #x, y, w, h = list(rect)
        # col and row number for the new size
        new_w, new_h = int(float(w)/float(self.col_size)), int(float(h)/float(self.line_size))
        # if a dimension is changed
        if new_w != self.old_nb_col or new_h != self.old_nb_row: 
            if self.flag_event: self.flag_event = False # flag to avoid the first signal
            else: 
                GObject.idle_add(self.terminal.set_size, new_w, new_h )
        self.old_nb_col, self.old_nb_row = new_w, new_h

    '''
    ******************************
    *** Drag & drop management ***
    ******************************
    '''
    def set_drag_drop(self, nom):
        dd    = eval( "self.%s" % (nom) )
        dd.connect("drag-data-received", self.event_drag_data_received)
        dd.connect("drag-data-get", self.event_drag_data_get)
        dd.drag_dest_set(DRAG_DEST_DEFAULT, [], DRAG_ACTION_MOVE)
        dd.drag_source_set(DRAG_BTN_MASK, [], DRAG_ACTION_MOVE)
        dd.drag_dest_add_text_targets()
        dd.drag_source_add_text_targets()
        return
    
    def event_drag_data_get(self, widget, drag_context, data, info, time):
        text = "%s@drag" % widget.get_name()
        data.set_text(text, -1)

    def drag_drop(self, wid, context, x, y, time): 
        '''
        @brief Used for drop in a widget
        @info  add this to drag-drop signal
        @return sh: drop@text/row
        @return py: ('drop', text/row)
        '''
        return True

    def event_drag_data_received(self, widget, context, x, y, selection,
                                info, etime):  # deposit in a widget
        data = selection.get_text()
        try: # if it comes from a treeview, convert into string
            source_name, source_row = data.split(' ',1)
            data  = eval(source_row)
            st_lst = self.th.list_to_string(data)
            selec  = 'drop@%s' % st_lst
        except: selec='drop@%s' % data
        if import_py is not None:
            getattr(self.th.IMPORT, widget.get_name())('drop',data)
        else:
            self.send_data( '%s %s' % (widget.get_name(), selec.encode('utf8')) )
        
        if context.get_suggested_action() == DRAG_ACTION_MOVE:
            context.finish(True, True, etime)

    '''
    *********************
    *** Miscellaneous ***
    *********************
    '''
    def set_systray_icon(self):
        for name, menu, icon, bulle in systray_icon:
            self.new_systray_icon(name, menu, icon, bulle)
    
    def new_systray_icon(self, name, menu, icon, bulle):
        systray = Gtk.StatusIcon()
        systray.props.visible = False
        if '.' in icon:
            systray.set_from_file(icon)
        else:
            systray.set_from_icon_name(icon)
        if menu != 'None':
            menu = eval('self.widgets.get_%s' % USERLIB)(menu) 
            systray.connect('popup-menu', self.popup_menu_cb, menu)
        systray.connect('activate', self.send_data, name)
        setattr(self, name, systray)

    def popup_menu_cb(self, widget, button, time, menu=None):
        if button == 3:
            if menu:
                menu.show()
                menu.popup(None, None, widget.position_menu, widget, 3, time)
                #menu.popup(None, None, Gtk.status_icon_position_menu,
                #                                     3, time, widget)

    def apply_gtkrc(self, widget, gtkrc):
        screen = Gdk.Screen.get_default()
        provider = Gtk.CssProvider()
        provider.load_from_path(gtkrc)
        context = Gtk.StyleContext()
        context.add_provider_for_screen(screen, provider,
                                        Gtk.STYLE_PROVIDER_PRIORITY_USER)
        return
        #~FIXME can't do it for single widget/window
        context = widget.get_style_context()
        provider = Gtk.CssProvider()
        #provider.load_from_data(file(gtkrc,'r').read())
        provider.load_from_path(gtkrc)
        context.add_provider(provider, Gtk.STYLE_PROVIDER_PRIORITY_USER)
        print 'gtkrc',gtkrc

    def modif_type(self, ligne, store):
        list_ligne = ligne.split('|')
        n=0
        for elem in list_ligne:
            if 'gchararray' in str(store.get_column_type(n)):
                value = elem
            else:
                try:
                    value = eval(elem)
                except:
                    value = elem
            index = list_ligne.index(elem)
            list_ligne[index] = value
            n+=1
        return list_ligne

    def go_thread(self):
        self.th = MyThread(self)
        self.th.start()

    def send_data(self, data, arg=None):
        if arg is not None:
            data = arg
        self.th.send(data)

    def set_widget(self, cmd):
        arg = 'self.%s' % (cmd)
        exec( arg )

    def set_color(self, widget, etat, color):
        #~FIXME couleur = Gdk.RGBA.parse(color)
        rgba = Gdk.RGBA()
        couleur = rgba.parse(color)
        #self._entry_color.override_color(Gtk.StateFlags.NORMAL,rgba)
        #getattr(self, widget)(eval(etat), rgba)
        widget  = eval( 'self.%s' % (widget) )
        widget(eval(etat), rgba)

    def main(self):
        Gtk.main()


    '''
    **********************************************
    *** GLADE2SCRIPT COMMANDS INTERPRETATION 
    **********************************************
    '''
class CmdCOMBO(object):
    '''
    *** COMBOBOX
    '''
    def COMBO(self, sortie, arg=False):
        cmd='COMBO%s' % sortie.split('@@')[1]
        names = sortie.split('@@')[2].split(',')
        for name in names:
            try:
                item = sortie.split('@@')[3]
            except:
                item = None
            combo, modele = self.return_tree_store(name)
            nb = len(modele)
            GObject.idle_add(getattr(self, cmd), nb, combo, modele, item)

    def COMBOIMG(self, nb, combo, modele, item):
        '''
        @name COMBO@@IMG
        @param @@combobox@@item|filename[|size]
        @brief Adds a line with image to the combo.
        @info size: in pixel, optional
        @info filename: relative or absolute path of the picture
        '''
        try:
            item, filename, size = item.split('|')
            pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(filename, int(size), int(size) )
        except:
            item, filename = item.split('|')
            pixbuf = GdkPixbuf.Pixbuf.new_from_file(filename)
        modele.append( [item, pixbuf] )

    def COMBOEND(self, nb, combo, modele, item):
        '''
        @name COMBO@@END
        @param @@combobox@@item[|icon]
        @brief Adds a line to the combo.
        @info icon: name of the image (gtk theme), optional
        '''
        modele.append( item.split('|') )

    def COMBOCLEAR(self, nb, combo, modele, item):
        '''
        @name COMBO@@CLEAR
        @param @@combobox[,combobo,...]
        @brief Deletes all the elements of the combobox
        '''
        modele.clear()

    def COMBOFINDDEL(self, nb, combo, modele, item):
        '''
        @name COMBO@@FINDDEL
        @param @@combobox@@item
        @brief Deletes one combobox element by its item.
        @info item: Regular expression
        '''
        liste = self.find_tree_item(modele, '0', item)
        try:
            del modele[ liste[0].path ]
        except: pass

    def COMBOFINDSELECT(self, nb, combo, modele, item):
        '''
        @name COMBO@@FINDSELECT
        @param @@combobox@@item
        @brief Selects a combobox element by its item.
        @info item: Regular expression
        '''
        liste = self.find_tree_item(modele, '0', item)
        if not liste: return
        iter_active = combo.get_active_iter()
        iter = modele.get_iter(liste[0].path)
        if iter_active == iter:
            self.gui.on_combo(combo)
            return
        #~FIXME set_active(path) do not work !
        combo.set_active_iter(iter)
    
    def COMBODEL(self, nb, combo, modele, item):
        '''
        @name COMBO@@DEL
        @param @@combobox@@LineNumber
        @brief Deletes the element of the combobox by its number line.
        '''
        iter = modele.get_iter(item)
        modele.remove(iter)

    def COMBODELEND(self, nb, combo, modele, item):
        '''
        @name COMBO@@DELEND
        @param @@combobox
        @brief Deletes the last element of the combobox.
        '''
        # minus because the input number is higher than the real one
        nb = nb -1
        row = modele[nb]
        iter = modele.get_iter(nb)
        modele.remove(iter)


class CmdTREEVIEW(object):
    '''
    *** TREEVIEW
    '''
    def TREE(self, sortie, arg=False):
        cmd='TREE%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd), sortie)

    def TREEINSERT(self, sortie):
        '''
        @name TREE@@INSERT
        @param @@treeview@@line@@data
        @brief insert a line in the treeview
        @info Indicate the --tree/-t option
        @info line: path (1 or 1:0)
        @info data: text|text|text
        '''
        name, path, value = sortie.split('@@',4)[2:]
        treeview, mystore = self.return_tree_store(name)
        iter, path = self.gui.try_path(path, mystore)    
        mystore.insert(iter, int(path), self.gui.modif_type(value, mystore) )

    def TREELOAD(self, sortie):
        '''
        @name TREE@@LOAD
        @param @@treeview@@fichier
        @brief Loads the treeview from a file
        @info Indicate the --tree/-t option
        @info fichier: absolute or relative file path
        '''
        name, path = sortie.split('@@')[2:]
        try:
            treeview, mystore = self.return_tree_store(name)
            #mystore.clear()
            for ligne in file(path,'r'):
                ligne    = ligne.strip()
                liste    = self.gui.modif_type(ligne, mystore)
                #liste = map(str, ligne.rstrip().split('|'))
                #print liste
                position = liste[0]
                parent_iter, path = self.gui.try_path(position, mystore)
                mystore.append(parent_iter, liste)
        except ValueError, e: 
            if not ligne: return
            DEBUG('==== [[ ERROR ]] ===>> %s' % e)

    def TREEGET(self, sortie):
        '''
        @name TREE@@GET
        @param @@treeview
        @return variable and calls function, arg: line@data|data|data
        @brief Loads the selected line in a variable and calls the treeview function
        @info Python direct acces: <i>self.g2s.retourne_selection(treename)</i>
        @info Indicate the --tree/-t option
        '''
        name    = sortie.split('@@')[2]
        result  = self.retourne_selection(name)
        var_get = '''GET@%s="%s"''' % ( name,result )
        self.send( var_get )

    def TREECELL(self, sortie):
        '''
        @name TREE@@CELL
        @param @@treeview@@[line[,col]]@@[data]
        @brief Modify a cell or a line
        @info Indicate the --tree/-t option
        @info line: path (1 ou 1:0)
        @info col: colonne (optionnel)
        @info data: text|text|text
        @info if not `data', the line will be erased
        @info if not `col', line will be replaced 
        @info else the cellule will be modified
        '''
        # voir soucis path dans modif_cell_str
        name, place, value = sortie.split('@@',4)[2:]
        self.modif_cell_str(name, place, value)

    def TREEIMG(self, sortie):
        '''
        @name TREE@@IMG
        @param @@treeview@@data|data@@colonne@@size
        @example echo 'TREE@@IMG@@treeview1@@texte col 1|texte col 2|tux.png@@2@@150'
        @brief Adds a line containing an image
        @info Indicate the --tree/-t option
        @info column: where the image is
        @info size: in pixels
        '''
        # voir pour ne pas indiquer size
        name, value, col, size = sortie.split('@@')[2:]
        treeview, modele = self.return_tree_store(name)
        liste_data       = self.gui.modif_type(value, modele)
        filename         = liste_data[int(col)]
        pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(filename, int(size), int(size) )
        liste_data[int(col)] = pixbuf
        modele.append(None, liste_data)
        num_row = len(list(modele))-1
        if num_row > 0:
            gobject.idle_add(treeview.scroll_to_cell, num_row)

    def TREEEND(self, sortie):
        '''
        @name TREE@@END
        @param @@treeview@@data
        @brief Adds a line at the end of the treeview
        @info Indicate the --tree/-t option
        @info data: text|text|text
        '''
        name, value      = sortie.split('@@',3)[2:]
        treeview, modele = self.return_tree_store(name)
        liste            = self.gui.modif_type(value, modele)
        modele.append(None, liste )
        num_row = len(list(modele))-1
        if num_row > 0:
            gobject.idle_add(treeview.scroll_to_cell, num_row)

    def TREEUP(self, sortie):
        '''
        @name TREE@@UP
        @param @@treeview[@@line]
        @brief Push up the selected line or the indicated line (not working with gtk3)
        @info Indicate the --tree/-t option
        @info line: line number (optional)
        '''
        name = sortie.split('@@')[2]
        iter, path, model = self.tree_up_down(sortie)
        str_path = model.get_string_from_iter(iter)
        n = int(str_path[-1])
        n-=1
        if n == -1:
            next_iter = model.get_iter_from_string(str(len(model)-1))
            model.move_after(iter, next_iter)
            return
        prev_str_path = str_path[:-1]+str(n)
        prev_iter = model.get_iter_from_string(prev_str_path)
        model.move_before(iter, prev_iter)

    def TREEDOWN(self, sortie):
        '''
        @name TREE@@DOWN
        @param @@treeview[@@line]
        @brief Push down the selected line or the indicated line
        @info Indicate the --tree/-t option
        @info line: line number (optional)
        '''
        iter, path, model = self.tree_up_down(sortie)
        new_iter          = model.iter_next(iter)
        model.move_after(iter, new_iter)

    def TREETOP(self, sortie):
        '''
        @name TREE@@TOP
        @param @@treeview[@@line]
        @brief Push up in first position the selected line or the indicated line
        @info Indicate the --tree/-t option
        @info line: line number (optional)
        '''
        iter, path, model = self.tree_up_down(sortie)
        model.move_after(iter, None)

    def TREEBOTTOM(self, sortie):
        '''
        @name TREE@@BOTTOM
        @param @@treeview[@@line]
        @brief Push down in last position the selected line or the indicated line
        @info Indicate the --tree/-t option
        @info line: line number (optional)
        '''
        iter, path, model = self.tree_up_down(sortie)
        model.move_before(iter, None)

    def tree_up_down(self, sortie):
        base             = sortie.split('@@')
        name             = base[2]
        treeview, model  = self.return_tree_store(name)
        try:
            path = base[3]
            iter = model.get_iter(path)
        except:
            selection   = treeview.get_selection()
            model, iter = selection.get_selected()
            path        = model.get_path(iter)
        return (iter, path, model)

    def TREEPROG(self, sortie):
        '''
        @name TREE@@PROG
        @param @@treeview@@line,col@@value
        @example echo 'TREE@@PROG@@treeview1@@1,2@80'
        @brief Modify the value of a progressbar contained in the treeview
        @info Indicate the --tree/-t option
        @info value: 0 to 100
        '''
        name, place, value = sortie.split('@@')[2:]
        self.modif_cell_int(name, place, value)

    def TREESAVE(self, sortie):
        '''
        @name TREE@@SAVE
        @param @@treeview@@fichier
        @brief Saves the treeview in a file
        @info Indicate the --tree/-t option
        @info fichier: relative or absolute file path
        '''
        name, fichier    = sortie.split('@@')[2:]
        treeview, modele = self.return_tree_store(name)
        file(fichier,'w')
        self.fichier_save_tree = open(fichier,'a')
        modele.foreach(self.sauv_tree, fichier)
        self.fichier_save_tree.close()
        DEBUG('[[ TREE@@SAVE ]] Saved')

    def TREEHIZO(self, sortie, arg=False):
        '''
        @name TREE@@HIZO
        @param @@treeview
        @return sh: hizo@[path@]data|data@@[path@]data|data => the lines are separated by @@
        @return py: (None, [list], 'hizo')
        @brief Sends the treeview content to its function
        @info path will send if it's a real treeview (arborescence)
        @info With python to get return, call directly self.g2s.TREEHIZO('TREE@@HIZO@@treeview')
        @info Indicate the --tree/-t option
        '''
        name = sortie.split('@@')[2]
        self.list_hizo   = []
        treeview, modele = self.return_tree_store(name)
        modele.foreach(self.return_tree, None)
        if import_py is not None:
            if not arg:
                getattr(self.IMPORT, name) (None, self.list_hizo, 'hizo')
                return
            else:
                return (None, self.list_hizo, 'hizo')
        var  = '@@'.join(self.list_hizo)
        tree = """%s hizo@%s""" % (name, var)
        self.send(tree.encode('utf8'))

    def TREECLEAR(self, sortie):
        '''
        @name TREE@@CLEAR
        @param @@treeview
        @brief Deletes the treeview
        @info Indicate the --tree/-t option
        '''
        names = sortie.split('@@')[2].split(',')
        for name in names:
            mystore=eval('self.gui.store_%s' % (name) )
            mystore.clear()

    def TREEFIND(self, sortie, arg=False):
        '''
        @name TREE@@FIND
        @param @@treeview@@col/None@@motif
        @return sh: find@item|path|path|path...
        @return py: (None, [liste_find], 'find')
        @brief Finds and sends the lines according to a motif and a column
        @info Indicate the --tree/-t option
        @info col/None: if None, will be the entire line
        @info motif: Regular expression
        '''
        name, col, item  = sortie.split('@@',4)[2:]
        treeview, modele = self.return_tree_store(name)
        liste = []
        liste_find = [item]
        for line in modele:
            if col == 'None':
                text = ''.join(list(line))
            else:
                text = list(line)[int(col)]
            if re.search(item.replace('(','\(').replace(')','\)'), text):
                liste_find.append( line.path.to_string() )
        if import_py is not None:
            if not arg:
                getattr(self.IMPORT, name) (None, liste_find, 'find')
                return
            else:
                return (None, liste_find, 'find')
        liste_find = self.list_to_string(liste_find)
        cmd="""%s find@%s""" % (name, liste_find)
        self.send(cmd.encode('utf8'))

    def TREEFINDDEL(self, sortie, arg=False):
        '''
        @name TREE@@FINDDEL
        @param @@treeview@@col/None@@motif
        @return sh: finddel@path@linedata
        @return py: (path, [line], 'finddel')
        @brief Finds and deletes a line according to a motif and a column
        @info Indicate the --tree/-t option
        @info col/None: if None, will be the entire line
        @info motif: Regular expression
        '''
        name, col, item  = sortie.split('@@',4)[2:]
        treeview, modele = self.return_tree_store(name)
        liste_ligne = []
        str_path = None
        list_rows = self.find_tree_item(modele, col, item)
        if list_rows:
            line = list_rows[0]
            liste_ligne = list(line)
            str_path = line.path.to_string()
            liste_find  = self.list_to_string(liste_ligne)
            modele.remove(line.iter)
            text = """%s finddel@%s@%s""" % (name, str_path, liste_find)
        else:
            text = """%s finddel@NoItemFound""" % name
        if import_py is not None:
            if not arg:
                getattr(self.IMPORT, name) (str_path, liste_ligne, 'finddel')
                return
            else:
                return (str_path, liste_ligne, 'finddel')
        self.send(text.encode('utf8'))

    def TREEFINDSELECT(self, sortie):
        '''
        @name TREE@@FINDSELECT
        @param @@treeview@@col/None@@motif
        @brief Finds and selects a line according to a motif and a column
        @info Indicate the --tree/-t option
        @info col/None: if None, will be the entire line
        @info motif: Regular expression
        '''
        name, col, item  = sortie.split('@@',4)[2:]
        treeview, modele = self.return_tree_store(name)
        print modele, col, item
        list_rows = self.find_tree_item(modele, col, item)
        if list_rows:
            path = list_rows[0].path
            treeview.set_cursor(path, None, False)
        return

    def find_tree_item(self, modele, col, item):
        liste = []
        print  modele, str(col), item
        for line in modele:
            if eval(str(col)) is None:
                text = '|'.join(list(line))
            else:
                text = list(line)[int(str(col))]
            if re.search(item.replace('(','\(').replace(')','\)'), text):
                liste.append(line)
        return liste
    
    def TREESELECT(self, sortie):
        '''
        @name TREE@@SELECT
        @param @@treeview@@row
        @brief Select row in the treeview
        @info Indicate the --tree/-t option
        @info row: integrer
        '''
        name, row  = sortie.split('@@',3)[2:]
        treeview, modele = self.return_tree_store(name)
        iter = modele.get_iter_from_string(row)
        path = modele.get_path(iter)
        GObject.idle_add(treeview.set_cursor, path, None, False)

    def return_tree_store(self, name):
        treeview = eval('self.gui.%s' % (name) )
        modele   = treeview.get_model()
        return treeview, modele

    def TREEFORCE_SELECT(self, sortie):
        '''
        @name TREE@@FORCE_SELECT
        @param @@treeview
        @brief Force the variable selection (security block)
        @info Indicate the --tree/-t option
        '''
        self.iter_select = True
        
    '''
    *****************
    *** UTILITIES
    *****************
    '''
    '''
    Convert a list into string for the treeview
    '''
    def list_to_string(self, donnees):
        l = []
        li = ''
        for item in donnees:
            try:
                eval('%s'%item)
                #l.append(str(item))
                item = '%s' % str(item)
            except:
                item = '%s' % item.decode('utf8')
                pass
                #l.append(item)
            li += item+'|'
        return li[:-1]
        #return '|'.join(l)
        #return '|'.join( map(str, donnees) )

    def sauv_tree(self, liststore, path, iter, fichier):
        donnees = list(liststore[iter])
        ligne   = self.list_to_string(donnees)
        self.fichier_save_tree.write(ligne+'\n')
        
    def return_tree(self, liststore, path, iter, arg=None):
        donnees = list(liststore[iter])
        ligne   = self.list_to_string(donnees)
        path    = liststore.get_string_from_iter(iter)
        if ':' in path:
            if import_py is not None:
                ligne = (path, donnees)
            else:
                ligne = '%s@%s' % (path, ligne)
        self.list_hizo.append(ligne)
        #DEBUG('[return_tree] hizo@'+ligne)

    def modif_cell_int(self, name, place, value):
        store    = eval('self.gui.store_%s' % (name) )
        row, col = place.replace(' ','').split(',')
        store[row][int(col)] = int(value)
         
    def modif_cell_str(self, name, place, value):
        if self.iter_select is None: return
        store    = eval('self.gui.store_%s' % (name) )
        treeview = eval('self.gui.%s' % (name) )
        if place:  # 3,1
            try:
                row, col = place.replace(' ','').split(',')
                if ':' in row:
                    row = tuple([eval(i) for i in row.split(':')])
                else:
                    row = int(row)
                store[row][int(col)] = value  #modif cellule
                #print "modif celluel", value
            except:
                if value:
                    liste = self.gui.modif_type(value, store)
                    #row = eval( '(%s)' % row.replace(':',',') )
                    #print 'modif', row
                    store[int(place)] = liste  # modif ligne
                else:
                    try:
                        #print "in try"
                        iter = store.get_iter(place)
                        store.remove(iter)  # supprimer ligne par son numéro
                        self.iter_select = None  # plus de selection
                    except: pass
        elif self.iter_select is not None: # supprimer ligne sélectionnée
            store.remove(self.iter_select)  
            self.iter_select=None
        if self.gui.column_sizing: treeview.columns_autosize()

    def retourne_selection(self,name):
        treeview = eval('self.gui.%s' % (name) )
        modele   = treeview.get_model()
        sel      = treeview.get_selection()
        ( model,iter )   = sel.get_selected()
        self.iter_select = iter
        if iter is not None:
            path     = model.get_string_from_iter(iter)
            #print model.get_string_from_iter(iter)
            liste    = list(model[iter])
            ligne    = str(path[0])
            #list_str = self.list_to_string(liste)
            list_str = '|'.join(map(str, liste))
            DEBUG( '>> [[ retourne_selection ]] : %s %s' % (path, list_str ))
            if import_py is not None:
                return (path, liste)
            try:
                 return u'%s@%s' % (path, list_str)
            except:
                return u'%s@%s' % (path, list_str.decode('utf8'))
        else: return None  #['None']



class CmdTEXTVIEW(object):
    '''
    *** TEXTVIEW
    '''                
    def TEXT(self, sortie, arg=False):
        cmd = 'TEXT%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd), sortie)
        
    def TEXTAUTOUR(self, sortie, tag=False):
        '''
        @name TEXT@@AUTOUR
        @param @@textview@@texteAvant@@texteAprès
        @brief Circles a text selection
        '''
        name, avant, apres    = sortie.split('@@')[2:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        start, end            = buffertexte.get_selection_bounds()
        self.insert_text(buffertexte, start, avant, tag)
        start, end = buffertexte.get_selection_bounds()
        self.insert_text(buffertexte, end, apres, tag)

    def TEXTAUTOURTAG(self, sortie):
        '''
        @name TEXT@@AUTOURTAG
        @param @@textview@@tag@@texteAvant@@texteAprès
        @brief Circles a text selection with tag
        '''
        name, tag, avant, apres = sortie.split('@@')[2:]
        self.TEXTAUTOUR('''TEXT@@AUTOUR@@%s@@%s@@%s''' % (name, avant, apres), tag)

    def TEXTCLEAR(self, sortie):
        '''
        @name TEXT@@CLEAR
        @param @@textview
        @brief Deletes the textview
        '''
        names = sortie.split('@@')[2].replace(' ','').split(',')
        for name in names:
            textview, buffertexte = self.retourne_textview_buffer(name)
            start, end            = buffertexte.get_bounds()
            buffertexte.delete(start, end)


        
    def TEXTCREATETAG(self, sortie):
        '''
        @name TEXT@@CREATETAG
        @param @@textview@@tagname@@args
        @example echo 'TEXT@@CREATETAG@@textview[,textview,...]@@redItalic@@style=Pango.Style.ITALIC,foreground=red'
        @brief Creates a tag that can be used for the textview
        @info tagname: tag name
        @info args: see pygtk doc, e.g.: style=Pango.Style.ITALIC
        @info gtk2: pango.STYLE_ITALIC
        @info gtk3: Pango.Style.ITALIC
        '''
        name, tagname, args   = sortie.split('@@')[2:]
        for name in name.replace(' ','').split(','):
            textview, buffertexte = self.retourne_textview_buffer(name)
            tag_table             = buffertexte.get_tag_table()
            tag                   = Gtk.TextTag(name=tagname)
            for arg in args.replace(' ','').split(','):
                nom, value = arg.split('=')
                try:
                    value = eval(value)
                except: pass
                print nom, value, type(value)
                tag.set_property(nom, value)
            #tag.set_property('name', tagname)
            tag.set_data('balise', tagname)
            tag_table.add(tag)

    def TEXTCURSOR(self, sortie, tag=False):
        '''
        @name TEXT@@CURSOR
        @param @@textview@@text
        @brief Adds some text at the cursor location
        '''
        name, text            = sortie.split('@@')[2:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        iter = buffertexte.get_iter_at_mark( buffertexte.get_insert() )
        self.insert_text(buffertexte, iter, text, tag)

    def TEXTCURSORTAG(self, sortie):
        '''
        @name TEXT@@CURSORTAG
        @param @@textview@@tag@@text
        @brief Adds some text with tag at the cursor location
        '''
        name, tags, text = sortie.split('@@')[2:]
        self.TEXTCURSOR('''TEXT@@CURSOR@@%s@@%s''' % (name, text), tags)

    def TEXTDELEND(self,sortie):
        '''
        @name TEXT@@DELEND
        @param @@textview
        @brief Deletes the last line of the textview
        '''
        name                  = sortie.split('@@')[2]
        textview, buffertexte = self.retourne_textview_buffer(name)
        nombre_lignes         = buffertexte.get_line_count()
        debut_end  = buffertexte.get_iter_at_line(nombre_lignes-2)
        start, end = buffertexte.get_bounds()
        buffertexte.delete(debut_end, end)

    def TEXTDELTAG(self,sortie):
        '''
        @name TEXT@@DELTAG
        @param @@textview@@tag,tag
        @brief Deletes tag(s) of the textview
        @info Use ALL to delete all tags
        '''
        name, tags            = sortie.split('@@')[2:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        start, end            = buffertexte.get_bounds()
        l_tags = tags.replace(' ','').split(',')
        for tag in l_tags:
            if tag == 'ALL':
                buffertexte.remove_all_tags(start, end)
                break
            buffertexte.remove_tag_by_name(tag, start, end)

    def TEXTEND(self, sortie, tag=False):
        '''
        @name TEXT@@END
        @param @@textview@@text
        @brief Adds at the end of the textview
        '''
        name, text            = sortie.split('@@')[2:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        start, end            = buffertexte.get_bounds()
        text                  = text.replace('\\n', '\n')
        self.insert_text(buffertexte, end, text, tag)
        p_text_mark = buffertexte.create_mark ('p_buffer', end, False)
        textview.scroll_to_mark(p_text_mark,0.0, True, 0.5, 0.0)

    def TEXTENDTAG(self, sortie):
        '''
        @name TEXT@@ENDTAG
        @param @@textview@@text
        @example echo 'TEXT@@ENDTAG@@_textview1@@un text with &lt;redItalic&gt;tag&lt;/redItalic&gt;'
        @brief Adds at the end of the textview with a tag
        '''    
        def boucle(v):
            v   = v.split('<')
            deb = v.pop(0)
            self.insert_text(buffertexte, end, deb)
            v = '<'.join(v)
            v = v.split('>')
            tag  = v.pop(0)
            text = v.pop(0).split('</')[0]
            self.insert_text(buffertexte, end, text, tag)
            v = '>'.join(v)
            return v
        name, text            = sortie.split('@@')[2:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        start, end            = buffertexte.get_bounds()
        texte                 = text.replace('\\n', '\n')
        while True:
            if '</' in texte:
                texte = boucle(texte)
            else:
                self.insert_text(buffertexte, end, texte)
                break
            p_text_mark = buffertexte.create_mark ('p_buffer', end, False)
            textview.scroll_to_mark(p_text_mark,0.0, True, 0.5, 0.0)

    def TEXTFIND(self, sortie):
        '''
        @name TEXT@@FIND
        @param @@textview@@text@@action
        @brief Search text
        @info text: text to find, use ^ or $ for starts or ends line search
        @info action: scroll, select, or tag name
        '''
        name, text, actions   = sortie.split('@@')[2:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        start, end            = buffertexte.get_bounds()
        def get(iter, text):
            flag        = True
            starts_line = False
            ends_line   = False
            if text.startswith('^'):
                starts_line = True
                text = text[1:]
            elif text.endswith('$'):
                ends_line = True
                text = text[:-1]
            try:
                debut, fin = iter.forward_search(text, Gtk.TextSearchFlags.TEXT_ONLY)
            except:
                return (start, end, flag)
            if starts_line:
                flag = debut.starts_line()
            elif ends_line:
                flag = fin.ends_line()
            if flag:
                for action in actions.replace(' ','').split(','):
                    if action == 'select':
                        buffertexte.select_range(debut, fin)
                    elif action == 'scroll':
                        p_text_mark = buffertexte.create_mark ('p_buffer', fin, False)
                        textview.scroll_to_mark(p_text_mark,0.0, True, 0.5, 0.0)
                    else:
                        buffertexte.apply_tag_by_name(action, debut, fin)
            return (debut, fin, flag)
        
        debut, fin, flag = get(start, text)
        while not flag:
            debut, fin, flag = get(fin, text)
        '''
        debut, fin            = start.forward_search(text,
                                                     Gtk.TextSearchFlags.TEXT_ONLY,
                                                     limit=None)
        start_line = debut.starts_line()
        while not start_line:
            debut, fin = fin.forward_search(text,
                                            Gtk.TextSearchFlags.TEXT_ONLY,
                                            limit=None)
            start_line = debut.starts_line()
        p_text_mark = buffertexte.create_mark ('p_buffer', fin, False)
        textview.scroll_to_mark(p_text_mark,0.0, True, 0.5, 0.0)
        '''

    def TEXTHIZO(self, sortie, arg=False):
        '''
        @name TEXT@@HIZO
        @param @@treeview
        @brief Calls the textview function with its content as argument
        @info The end-of-line will be replaced by some @@
        @return sh: hizo@texte@@texte@@texte...
        @return py: ('hizo', texte)
        '''
        name                  = sortie.split('@@')[2]
        textview, buffertexte = self.retourne_textview_buffer(name)
        start, end            = buffertexte.get_bounds()
        texte = buffertexte.get_text(start,end,False)
        if import_py is not None:
            if not arg:
                getattr(self.IMPORT, name)('hizo', texte)
                return
            else:
                return ('hizo', texte)
        texte = texte.replace("'","\\'").replace('"','\\"').replace('\n','@@')
        self.send( """%s hizo@%s""" % (name, texte) )

    def TEXTLOAD(self, sortie):
        '''
        @name TEXT@@LOAD
        @param @@textview@@fichier
        @brief Loads the textview from a file
        @info fichier: absolute or relative file path
        '''
        name, path = sortie.split('@@')[2:]
        try:
            textview, buffertexte = self.retourne_textview_buffer(name)
            fichier               = open(path, "r")
            chaine                = fichier.read()
            fichier.close()
            buffertexte.set_text(chaine)
        except:
            raise
            pass

    def TEXTRSELECT(self, sortie, tag=False):
        '''
        @name TEXT@@RSELECT
        @param @@textview@@newText
        @brief Replace the selected text
        '''
        name, text            = sortie.split('@@')[2:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        start, end            = buffertexte.get_selection_bounds()
        buffertexte.delete(start, end)
        self.insert_text(buffertexte, start, text, tag)

    def TEXTRSELECTTAG(self, sortie, tag=False):
        '''
        @name TEXT@@RSELECTTAG
        @param @@textview@@tag@@newText
        @brief Replace the selected text with a tag
        '''
        name, tag, text = sortie.split('@@')[2:]
        self.TEXTSELECT( '''TEXT@@SELECT@@%s@@%s''' % (name,  text), tag)
        
    def TEXTSAVE(self, sortie):
        '''
        @name TEXT@@SAVE
        @param @@textview@@fichier
        @brief Saves the textview in a file
        @info fichier: absolute or relative file path
        '''
        name, path = sortie.split('@@')[2:]
        try:
            textview, buffertexte = self.retourne_textview_buffer(name)
            start, end            = buffertexte.get_bounds()
            texte                 = buffertexte.get_text(start,end,False)
            fichier = open(path, "w")
            fichier.writelines(texte)
            fichier.close()
        except:
            #raise
            pass
        
    def TEXTSELECTTAG(self, sortie):
        '''
        @name TEXT@@SELECTTAG
        @param @@textview@@tag
        @brief Adds/remove one or several tag(s) to the selection
        '''
        name, tags            = sortie.split('@@')[2:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        start, end            = buffertexte.get_selection_bounds()
        tag_table             = buffertexte.get_tag_table()
        
        for tag in tags.replace(' ','').split(','):
            tag = tag_table.lookup(tag)
            if start.begins_tag(tag) and end.ends_tag(tag):
                buffertexte.remove_tag(tag, start, end)
                continue
            buffertexte.apply_tag(tag, start, end)

    def TEXTAG(self, sortie):
        '''
        @name TEXT@@TAG
        @param @@textview@@tag,tag
        @brief Apply a tag to the entire textbuffer
        @info tag: name of the tag(s) previously created
        '''
        name, tags            = sortie.split('@@')[2:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        start, end            = buffertexte.get_bounds()
        for tag in tags.replace(' ','').split(','):
            buffertexte.apply_tag_by_name(start, end, tag)

    def insert_text(self, buffertexte, iter, text, tag=False):
        if tag:
            buffertexte.insert_with_tags_by_name(iter, text, tag)
        else:
            buffertexte.insert(iter, text)

    def retourne_textview_buffer(self, name):
        textview    = eval('self.gui.%s' % (name) )
        buffertexte = textview.get_buffer()
        return (textview, buffertexte)
    
    def TEXTHIZOTAG(self, sortie, arg=False):
        '''
        @name TEXT@@HIZOTAG
        @param @@textview
        @brief Calls the textview function with its content as argument
        @info The end-of-line will be replaced by some @@
        @return sh: hizotag@texte@@texte@@texte...
        @return py: ('hizotag', texte)
        '''
        name = sortie.split('@@')[2]
        l_tags = []
        def get_tags(textag, data):
            l_tags.append(textag)
        textview, buffertexte = self.retourne_textview_buffer(sortie.split('@@')[2])
        tag_table       = buffertexte.get_tag_table()
        tmpBuffer       = Gtk.TextBuffer.new(tag_table)
        deserialization = tmpBuffer.register_deserialize_tagset(None)
        tag_table.foreach(get_tags,None)
        start, end = buffertexte.get_bounds()

        tmpBuffer.deserialize(
                    tmpBuffer, deserialization, tmpBuffer.get_start_iter(),
                    buffertexte.serialize(
                                  buffertexte,
                                  Gdk.Atom.intern_static_string("application/x-gtk-text-buffer-rich-text"),
                                  start,
                                  end,
                                  #buffertexte.get_start_iter(), 
                                  #buffertexte.get_end_iter(),
                                  #Gtk.TextBuffer.get_end_iter(buffertexte),
                                         ),
                              )
        l_flags = []
        pos=0
        while pos != tmpBuffer.get_end_iter().get_offset():
            for tag in l_tags:
                bal = tag.get_data('balise')
                bo = "<%s>"%bal 
                bf = "</%s>"%bal
                #print bo, pos
                if (tmpBuffer.get_iter_at_offset(pos).begins_tag(tag)
                and bo not in l_flags):
                    tmpBuffer.insert(tmpBuffer.get_iter_at_offset(pos), bo)
                    pos=pos+len(bo)
                    l_flags.append(bo)
                if (tmpBuffer.get_iter_at_offset(pos).ends_tag(tag)
                and bo in l_flags):
                    tmpBuffer.insert(tmpBuffer.get_iter_at_offset(pos), bf)
                    #pos=pos+len(bf)
                    l_flags.remove(bo)
            pos=pos+1
        texte = tmpBuffer.get_text(tmpBuffer.get_start_iter(),
                                   tmpBuffer.get_end_iter(), False)
        #print texte
        #return
        if import_py is not None:
            if not arg:
                getattr(self.IMPORT, name)('hizotag', texte)
                return
            else:
                return ('hizotag', texte)
        texte = texte.replace("'","\\'").replace('"','\\"').replace('\n','@@')
        self.send( """%s hizotag@%s""" % (name, texte) )

    def TEXTSOURCE(self, sortie, arg=False):
        cmd = 'TEXTSOURCE%s' % sortie.split('@@')[2]
        getattr(self, cmd)(sortie)
        
    def TEXTSOURCELANG(self, sortie, arg=False):
        '''
        @name TEXT@@SOURCE@@LANG
        @param @@textview@@lang
        @brief Set the language code view
        @info Only with --sourceview option
        @info Environnement variable G2S_SOURCEVIEW_LANG loaded
        '''
        name, langname = sortie.split('@@')[3:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        lang = getattr(self.gui,'%s_LanguageManager'%name).get_language(langname)
        buffertexte.set_language(lang)
    
    def TEXTSOURCESTYLE(self, sortie, arg=False):
        '''
        @name TEXT@@SOURCE@@STYLE
        @param @@textview@@style
        @brief Set the language code view
        @info Only with --sourceview option
        @info Environnement variable G2S_SOURCEVIEW_STYLE loaded
        '''
        name, stylename = sortie.split('@@')[3:]
        textview, buffertexte = self.retourne_textview_buffer(name)
        ssm = getattr(self.gui,'%s_StyleSchemeManager'%name)
        style = ssm.get_scheme(stylename)
        buffertexte.set_style_scheme(style)

class CmdWEBKIT(object):
    def WEBKIT(self, sortie, arg=False):
        cmd = 'WEBKIT%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd),sortie)

    def WEBKITSAVE(self, sortie, arg=False):
        '''
        @name WEBKIT@@SAVE
        @param @@webview
        @brief Calls the webview function with its content as argument
        @return sh: save@html_quoted
        @return py: ('save', html)
        '''
        name      = sortie.split('@@')[2]
        webview   = eval('self.gui.%s' % name)    
        old_titre = webview.get_main_frame().get_title()
        webview.execute_script("document.title=document.documentElement.innerHTML;")
        html = webview.get_main_frame().get_title()
        webview.execute_script('''document.title=%s''' % old_titre)
        if import_py is not None:
            if not arg:
                getattr(self.IMPORT, name)('save', html)
                return
            else:
                return ('save', html)
        self.send( '''%s save@%s''' % ( name, urllib.quote(html) ) )

    def WEBKITLOAD(self, sortie):
        '''
        @name WEBKIT@@LOAD
        @param @@name@@uri/html
        @brief Loads the webview
        @info uri: http://something;com or /home/folder/file.html
        @info html: html raw text
        '''
        name, uri = sortie.split('@@')[2:]
        self.load_uri_or_html(name, uri)

    def WEBKITDOWNLOAD(self, sortie):
        '''
        @name WEBKIT@@DOWNLOAD
        @param @@webview@@choice
        @brief Action to perform during a download request
        @info choice: UserChoose/UserSave/GetLink
        @info UserChoose calls the function with the save destination user choice
        @info UserSave: saves a file directly from the user choice, also calls the function
        @info GetLink: simple function call
        @return sh: UserChoose@destination, UserSave@destination, GetLink@url 
        @return py: (arg, value)
        '''
        name, choice          = sortie.split('@@')[2:]
        webview               = eval('self.gui.%s' % name)
        dic_webdownload[name] = choice
        idc = webview.connect("download-requested", self.gui.download_requested_cb)
        self.gui.add_signal_to_dic(name, "webdownload", idc)

    def WEBKITREQUEST(self, sortie):
        '''
        @name WEBKIT@@REQUEST
        @param @@webview@@pattern
        @brief Filters the http requests
        @info pattern: `ALL' / item
        @info All: calls the function with all the requests as argument
        @info item: filters via the regular expression (does not display the filtered requests in the webview)
        @return sh: request@http://...
        @return py: (request, http//...)
        '''
        name, exts           = sortie.split('@@')[2:]
        webview              = eval('self.gui.%s' % name)
        dic_webrequest[name] = exts
        idc = webview.connect("resource-request-starting", self.gui.resource_request_cb)
        self.gui.add_signal_to_dic(name, "webrequest", idc)

    def WEBKITCACHE(self, sortie):
        '''
        @name WEBKIT@@CACHE
        @param @@webview@@folder@@pattern@@dialog
        @brief Puts in cache filtered via the pattern
        @info dossier: folder path or None (/tmp/webcache)
        @info pattern: Regular expression
        @info dialog: verbose / quiet
        @return sh: cache@url
        @return py: (cache, url)
        '''
        name, dossier, exts, dialog = sortie.split('@@')[2:]
        if dossier == 'None': dossier = '/tmp/webcache'
        webview              = eval('self.gui.%s' % name)
        dic_webcache[name]   = [dossier, exts, dialog]
        self.gui.liste_cache = [i for i in os.listdir(dossier)]
        idc = webview.connect("resource-request-starting", self.gui.resource_cache_cb)
        self.gui.add_signal_to_dic(name, "webcache", idc)

    def WEBKITJSFILE(self, sortie):
        '''
        @name WEBKIT@@JSFILE
        @param @@webview@@file
        @brief Loads a JS file in a html environnement
        @info file: absolute and relative file path
        '''
        name, fichier = sortie.split('@@')[2:]
        webview       = eval('self.gui.%s' % name)
        webview.execute_script('''%s''' % file(fichier,'r').read() )

    def WEBKITLINKFILTER(self, sortie):
        '''
        @name WEBKIT@@LINKFILTER
        @param @@webview@@pattern
        @brief Filters each user click on links via the pattern
        @info pattern: Regular expression
        @return linkfilter@url
        '''
        name, pattern           = sortie.split('@@')[2:]
        dic_weblinkfilter[name] = pattern

    def WEBKITLOADED(self, sortie):
        '''
        @name WEBKIT@@LOADED
        @param @@webview,webview
        @brief Calls the function when the html is loaded
        @return loaded
        '''
        #l_webloaded = []
        for i in range(len(l_webloaded)): l_webloaded.pop(0)
        for l in sortie.split('@@')[2].replace(' ','').split(','):
            l_webloaded.append(l)

    def WEBKITOVERLINK(self, sortie):
        '''
        @name WEBKIT@@OVERLINK
        @param @@webview,webview
        @brief Calls the function when cursor goes above the links
        @return sh: overlink@url
        @return py: (overlink, url)
        '''
        for i in range(len(l_weboverlink)): l_weboverlink.pop(0)
        self.gui.old_hovering_link = None
        for name in sortie.split('@@')[2].replace(' ','').split(','):
            webview = eval('self.gui.%s' % name)
            l_weboverlink.append(name)
            idc = webview.connect_after("hovering-over-link", self.gui.hovering_over_link_cb)
            self.gui.add_signal_to_dic(name, "weboverlink", idc)

    def WEBKITMENU(self, sortie):
        '''
        @name WEBKIT@@MENU
        @param @@webview@@item::function::value/html@@...
        @brief Creates a context menu
        @info item:function:value/html
        @info item: menu label
        @info function: function to call
        @info value: value of the element under the cursor
        @info html: html of the element under the cursor
        @info separator:None:None
        '''
        name = sortie.split('@@')[2]
        dic_webmenu[name] = []
        for elem in sortie.split('@@')[3:]:
            dic_webmenu[name] += [elem.split('::')]
        webview = eval('self.gui.%s' % name)
        idc = webview.connect_after("populate-popup", self.gui.populate_popup_cb)
        self.gui.add_signal_to_dic(name, "webmenu", idc)

    def WEBKITSUBMENU(self, sortie):
        '''
        @name WEBKIT@@SUBMENU
        @param @@menuitem@@item::function::value/html@@...
        @brief Creates a context sub-menu
        @info menuitem: label of the context menu from where the sub-menu will appear
        @info item:function:value/html
        @info item: menu label
        @info function: function to call
        @info value: value of the element under the cursor
        @info html: html of the element under the cursor
        @info separator:None:None
        '''
        name = sortie.split('@@')[2]
        dic_websubmenu[name] = []
        for elem in sortie.split('@@')[3:]:
            dic_websubmenu[name] += [elem.split('::')]

    def WEBKITDISCONNECT(self, sortie):
        '''
        @name WEBKIT@@DISCONNECT
        @param @@webview@@webcache,webrequest,webmenu,...
        @brief disconnects all signals
        '''
        name, signaux = sortie.split('@@')[2:]
        webview       = eval('self.gui.%s' % name)
        #print dic_websignal
        for signal in signaux.split(','):
            if signal == 'webcache':
                #signal = 'resource-request-starting'
                self.del_dic_webkit(dic_webcache, name)
            elif signal == 'webrequest':
                #signal = 'resource-request-starting'
                self.del_dic_webkit(dic_webrequest, name)
            elif signal == 'webmenu':
                #signal = 'populate-popup'
                self.del_dic_webkit(dic_webmenu, name)
            elif signal == 'webdownload':
                #signal = 'download-requested'
                self.del_dic_webkit(dic_webdownload, name)
            elif signal == 'weblinkfilter':
                self.del_dic_webkit(dic_weblinkfilter, name)
                continue
            elif signal == 'weboverlink':
                for i in range(len(l_weboverlink)): l_weboverlink.pop(0)
                #signal = 'hovering-over-link'
            elif signal == 'webloaded':
                for i in range(len(l_webloaded)): l_webloaded.pop(0)
                continue
            try:
                webview.disconnect( dic_websignal[name][signal] )
                del dic_websignal[name][signal]
            except: pass

    def del_dic_webkit(self, dic, name):
        try:
            del dic[name]
        except:
            pass

    def load_uri_or_html(self, name, arg, div=None):
        webview = eval('self.gui.%s' % name)
        if arg.startswith('/'):
            arg = 'file://'+arg
        if arg.startswith('<'):
            webview.load_string( arg, 'text/xml', 'UTF-8',  'file:///')
        else:
            webview.load_uri(arg)


class Commandes(CmdCOMBO, CmdTREEVIEW, CmdTEXTVIEW, CmdWEBKIT):
    '''
    @page commandes Glade2script commands
    '''
    '''
    *** APP INDICATOR
    '''
    def APPINDICATOR(self, sortie, arg=False):
        '''
        @name APPINDICATOR@@
        @param name@@icon@@menu@@icon-path
        @brief Init new app indicator (partial work with GTK3)
        @info name: acces name
        @info icon: the icon name
        @info menu: the context menu
        @info path: A custom path for finding icons additional or None
        @info see exemple for usage
        '''
        name, icon, menu, path = sortie.split('@@')[1:]
        menu = getattr(self.gui, menu)
        args = ["example-simple-client","indicator-messages",
                appindicator.IndicatorCategory.APPLICATION_STATUS]
        ind = appindicator.Indicator.new (*args)
        if path != 'None':
            ind.set_icon_theme_path (path)
        ind.set_icon(icon)
        ind.set_menu(menu)
        #~FIXME do not work
        #ind.set_attention_icon_full('gtk-yes','att_icon')
        setattr(self.gui, name, ind)
        
    '''
    *** CLIPBOARD
    '''    
    def CLIP(self, sortie, arg=False):
        self.current_clipboard_text = None
        cmd = 'CLIP%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd),sortie, arg)
        if import_py is not None:
            if arg:
                self.IMPORT.clipboard(self.current_clipboard_text)
                return
            else:
                return self.current_clipboard_text
        self.send( 'clipboard %s' % self.current_clipboard_text)
        #return self.current_clipboard_text
        

    def CLIPGET(self, data=None, arg=None):
        '''
        @name CLIP@@GET
        @return sh: 'clipboard' function will be called with the clipboard content as argument.
        @return py: clipboard content
        @brief Get the clipboard content. Indicate the --clipboard option
        '''
        self.gui.clipboard.request_text(self.clipboard_texte)
        return self.current_clipboard_text

    def clipboard_texte(self, clipboard, texte, donnees):
        self.current_clipboard_text = texte
        return
        if import_py is not None:
            self.IMPORT.clipboard(texte)
            return
        self.send( 'clipboard %s' % texte)

    def CLIPSET(self, data=None, arg=None):
        '''
        @name CLIP@@SET
        @param @@My text
        @brief Loads 'My text' in the clipboard. Indicate the --clipboard option
        '''
        texte = data.replace('CLIP@@SET@@','')
        self.gui.clipboard.set_text( texte, len(texte) )

    '''
    *** COLOR
    '''        
    def COLOR(self, sortie, arg=False):
        '''
        @name COLOR@@
        @param widget,widget@@modify@@gtk_state@@color
        @example echo 'COLOR@@_textview1@@color@@NORMAL@@black'
        @brief Changes the color of a widget
        @info #FFFFFF or name color
        @info modify gtk2: modify_fg, modify_text, modify_bg, modify_base
        @info modify gtk3: background_color, color
        @info gtk_state: NORMAL, SELECTED, ACTIVE, PRELIGHT
        '''
        widget, action, etat, color = sortie.split('@@')[1:]
        for wid in widget.replace(' ','').split(','):
            widget_action = '%s.override_%s' % (wid, action)
            GObject.idle_add(self.gui.set_color, widget_action,
                             'Gtk.StateFlags.%s'%etat, color)

    '''
    *** CONFIG
    '''
    def CONFIG(self, sortie, arg=False):
        cmd = 'CONFIG%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd), sortie)
    
    def CONFIGSAVE(self, sortie):
        '''
        @name CONFIG@@SAVE
        @param @@widget,section,...
        @info section: escape saving widgets/sections
        @brief Save widgets state into the configuration file
        @example echo 'CONFIG@@SAVE@@_hpaned1,WINDOW:window1'
        '''
        l = []
        try:
            blackliste = sortie.split('@@')[2]
            l = blackliste.replace(' ','').split(',')
        except:
            pass
        CONFIG_PARSER.save_config(l)

    def CONFIGSET(self, sortie):
        '''
        @name CONFIG@@SET
        @param @@section@@variable@@value
        @brief Set a variable in a section
        '''
        section, var, value = sortie.split('@@')[2:]
        CONFIG_PARSER.set(section, var, value)

    '''
    *** EXIT
    '''
    def EXIT(self, sortie, arg=False):
        '''
        @name EXIT@@
        @brief Exits without keeping variables
        @return EXIT='no' or exit code 1
        '''
        arg1 = sortie.split('@@')[1]
        if arg1:
            self.stop('yes')
        else: self.stop('no')

    def EXITSAVE(self, sortie, arg=False):
        '''
        @name EXIT@@SAVE
        @brief Exits with the variables
        @return EXIT='yes' or exit code 0
        '''
        self.EXIT(True)

    def EXEC(self, sortie, arg=False):
        arg = sortie.split('@@')[1]
        exec(arg)

    def EVAL(self, sortie, arg=False):
        arg = sortie.split('@@')[1]
        eval(arg)

    def FILE(self, sortie, arg=False):
        cmd = 'FILE%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd), sortie)

    def FILESETFILTER(self, sortie, arg=False):
        '''
        @name FILE@@FILTER
        @param @@filechooser@@add_mime_type@@text/plain,text/html
        @brief Adds a filter to fileselection
        @info add_mime_type => text/plain,text/html,...
        @info add_pattern   => *view*,*tray*,... (see pygtk doc for pattern syntax)
        '''
        nom, genre, filtre = sortie.split('@@')[2:]
        widget     = eval('self.gui.%s' % (nom) )
        filefilter = Gtk.FileFilter()
        filtres    = filtre.replace(' ','').split(',')
        for filtre in filtres:
            getattr(filefilter, genre)(filtre)
        widget.set_filter(filefilter)

    '''
    *** WINDOW DIMENSION
    '''
    def GEO(self, sortie, arg=False):
        cmd='GEO%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd), sortie)

    def GEOGET(self, sortie, arg=False):
        '''
        @name GEO@@GET
        @param @@window
        @return sh: geo@width height X Y
        @return py: ('geo', (width, height, X, Y))
        @return window_geo variable loaded too
        @brief Dimensions and location of the window
        '''
        nom           = sortie.split('@@')[2]
        widget        = eval('self.gui.%s' % (nom) )
        X, Y          = widget.get_position()
        width, height = widget.get_size()
        if import_py is not None:
            if not arg:
                getattr(self.IMPORT, nom) ('geo', (width, height, X, Y))
                return
            #setattr(self.IMPORT, nom+'_geo', (width, height, X, Y))
            else:
                return ('geo', (width, height, X, Y))
        self.send( '''GET@%s_geo="%s %s %s %s"''' % (nom, width, height, X, Y) )
        self.send( '''%s geo@%s %s %s %s''' % (nom, width, height, X, Y) )

    def GEOSET(self, sortie):
        '''
        @name GEO@@SET
        @param @@window@@width height X Y 
        @brief Resizes and moves a window
        '''
        nom    = sortie.split('@@')[2]
        widget = eval('self.gui.%s' % (nom) )
        width, height, X, Y = sortie.split('@@')[3].split(' ')
        widget.resize(int(width), int(height) )
        widget.move(int(X), int(Y) )

    '''
    *** PYGTK
    '''
    def GET(self, sortie, arg=False):
        '''
        @name GET@
        @param widget.cmd()
        @return sh: The widget.cmd() command will load the ${widget_cmd} variable
        @return py: (value)
        @brief Gets a widget value via a pygtk command and loads a variable in the environnement
        '''
        sortie  = sortie.split('GET@')[1]
        widget  = sortie.split('(')[0].replace('.','_')
        var     = 'self.gui.%s' % (sortie)
        #print '_____________', var, self.gui.myvar
        result  = eval(var)
        if import_py is not None:
            if not arg:
                setattr(self.IMPORT, widget, result)
                return
            else:
                return result
        var_get = 'GET@%s="%s"' % ( widget, result )
        self.send(var_get)

    '''
    *** GTKRC
    '''
    def GTKRC(self, sortie, arg=False):
        '''
        @name GTKRC@@
        @param stylefile
        @brief Loads a rc-style file (or css file in gtk3)
        @info stylefile: relative or absolute path of the gtk-style file
        '''
        gtkrc = sortie.split('@@')[1]
        screen = Gdk.Screen.get_default()
        provider = Gtk.CssProvider()
        if os.path.isfile(gtkrc):
            provider.load_from_path(gtkrc)
        else:
            provider.load_from_data(gtkrc)
        context = Gtk.StyleContext()
        GObject.idle_add(context.add_provider_for_screen, screen, provider,
                                        Gtk.STYLE_PROVIDER_PRIORITY_USER)
        return
        widget, rcfile = sortie.split('@@')[1:]
        widget = eval('self.gui.%s' % (widget) )
        self.gui.apply_gtkrc(widget, rcfile)

    '''
    *** IMAGE
    '''
    def IMG(self, sortie, arg=False):
        '''
        @name IMG@@
        @param img@@filename@@width@@height
        @example echo 'IMG@@_img_tux@@tux.png@@150@@150'
        @brief Modify an image
        @info filename: relatif or absolute path of the image
        @info width, height: image size in pixels
        '''
        widget, path, x, y = sortie.split('@@')[1:]
        if path:
            pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size( path, int(x), int(y) )
            self.gui.dic_img[widget] = path
            img = eval('self.gui.%s' % (widget) )
            GObject.idle_add(img.set_from_pixbuf, pixbuf)

    '''
    *** GET THE STATUS OF CHILD TOOGLE WIDGET
    '''
    def ISACTIVE(self, sortie, arg=False):
        '''
        @name ISACTIVE@@
        @param widget
        @brief Resends all the active toogles for the widget childs
        @return sh: isactive@widget widget widget
        @return py: (widgets_list)
        '''
        widget_name = sortie.split('@@')[1]
        self.list_is_active = []
        widget = eval( 'self.gui.%s' % widget_name )
        self.IS_container( widget )
        DEBUG('[ISACTIVE] %s'% self.list_is_active)
        if import_py is not None:
            if not arg:
                getattr(self.IMPORT, widget_name)(self.list_is_active)
                return
            else:
                return self.list_is_active
        self.send( '%s isactive@%s' % (widget_name, ' '.join(self.list_is_active) ) )

    def IS_container(self, widget):
        try:
            childs = widget.get_children()
        except:
            pass
        else:
            for child in childs:
                self.IS_container(child)
                self.IS_active(child)

    def IS_active(self, widget):
        try:
            value = widget.get_active()
        except:
            pass
        else:
            self.list_is_active.append( '%s:%s' % (widget.get_name(), value) )

    '''
    *** ITER
    '''
    def ITER(self, sortie, arg=False):
        '''
        @name ITER@@
        @param MyFunction
        @brief Calls a function of the associate script
        @info This allows to call a function in the environnement loaded with the new variables
        @info <a href="infos.html#ITER"> plus ...</a>
        '''
        arg = sortie.replace('ITER@@','')
        self.send( arg )

    '''
    *** MENU
    '''
    def MAKEMENU(self, sortie, arg=False):
        '''
        @name MAKEMENU@@
        @param widget@@menu_name@@item::fonction::arg@@...
        @brief Creates a context menu (is easier to use glade to create it ...)
        @info widget: the widget which will receive the menu
        @info menu_name: menu name
        @info item: menu label
        @info function: function to be called
        @info arg: function argument
        @info use `separator::None::None' to add separator
        '''
        widget = eval( 'self.gui.%s' % sortie.split('@@')[1])
        menu_name = sortie.split('@@')[2]
        menu = Gtk.Menu()
        idc  = widget.connect('button-press-event', self.dyn_menu_cb, menu)
        #widget.set_title('ouehhh')
        setattr(self.gui, menu_name, menu)
        for elem in sortie.split('@@')[3:]:
            item, function, arg = elem.split('::')
            if item == 'separator':
                separator = Gtk.SeparatorMenuItem()
                menu.append( separator )
                separator.show()
            else:
                menuitem = Gtk.MenuItem(label=item)
                menuitem.connect('activate', self.call_function_from_menu,
                                    item, function, arg)
                menuitem.props.name = item
                menu.append(menuitem)
                menuitem.show()

    def call_function_from_menu(self, menuitem, item, function, arg):
        if import_py is not None:
            getattr(self.IMPORT, function)(item, arg)
        else:
            self.send('%s %s@%s' % (function, item, arg) )

    def dyn_menu_cb(self, widget, event=None, menu=None, arg=None):
        if event.button == 3:
                menu.popup(None,None,None,None,event.button,event.time)

    def SUBMENU(self, sortie, arg=False):
        '''
        @name SUBMENU@@
        @param menu_name@@label_menuitem@@item::fonction::arg@@...
        @brief Creates a sub-menu
        @info menu_name: menu name
        @info label_menuitem: the menu label where the sub-menu will appear from
        '''
        top_menu       = eval('self.gui.%s' % sortie.split('@@')[1] )
        #print top_menu.get_children()
        label_menuitem = sortie.split('@@')[2]
        for menuitem in top_menu.get_children():
            #print menuitem.props.label, label_menuitem
            if type(menuitem) == Gtk.SeparatorMenuItem: 
                #if no control, menu separator remplaced by space !!!!????
                continue
            #print str(menuitem.get_label()).replace('_',''), menuitem.props.label
            if menuitem.props.label == label_menuitem:
                menu = Gtk.Menu()
                for elem in sortie.split('@@')[3:]:
                    item, function, arg = elem.split('::')
                    if item == 'separator':
                        separator = Gtk.SeparatorMenuItem()
                        menu.append( separator )
                    else:
                        menuit = Gtk.MenuItem(label=item, use_underline=False)
                        menuit.connect('activate', self.call_function_from_menu,
                                    item, function, arg)
                        menuit.props.name = item
                        menu.append(menuit)
                menuitem.set_submenu(menu)
                menu.show_all()
                break

    '''
    *** MULTIPLE COMMANDS
    '''
    def MULTI(self, sortie, arg=False):
        arg = sortie.replace('ITER@@','')
        cmd = 'MULTI%s' % sortie.split('@@')[1]
        return getattr(self, cmd)(sortie, arg)
    
    def MULTISET(self, sortie, arg):
        '''
        @name MULTI@@SET
        @param @@cmd()@@widget,widget
        @brief Runs the pygtk command on the widgets.
        @info Same principle as SET@, but simultaneously on several widgets
        '''
        cmd       = sortie.split('@@')[2]
        l_widgets = sortie.split('@@')[3].replace(' ','').split(',')
        for item in l_widgets:
            self.SET( 'SET@%s.%s' % (item, cmd) )

    def MULTIGET(self, sortie, arg):
        '''
        @name MULTI@@GET
        @param @@cmd()@@widget,widget
        @brief Runs the pygtk command on the widgets.
        @info Same principle as GET@, but simultaneously on several widgets
        @return same as GET@
        '''
        cmd       = sortie.split('@@')[2]
        l_widgets = sortie.split('@@')[3].replace(' ','').split(',')
        l = []
        if import_py is not None:
            for item in l_widgets:
                l.append(self.GET( 'GET@%s.%s' % (item, cmd), arg))
            return l
        else:
            for item in l_widgets:
                self.GET( 'GET@%s.%s' % (item, cmd))

    '''
    *** NOTIFY
    '''
    def NOTIFY(self, sortie, arg=False):
        '''
        @name NOTIFY@@
        @param timer@@titre@@texte@@icon
        @example echo 'NOTIFY@@2@@Titre@@Ligne1\\nLigne2\\n<i>Ligne3</i>@@dialog-yes'
        @brief Displays a notify message
        @info timer: display delay in millisecondes
        @info titre: message title
        @info texte: text to display
        @info icon: image path or icon name
        @info dependancies: pynotify and libnotify
        '''
        delay, titre, message, icon = sortie.split('@@')[1:]
        message = message.replace('\\n','\n')
        if not Notify.init("Multi Action Test"):
            return
        if icon:
            if '/' in icon:
                uri = "file://%s" % icon
            else:
                uri=icon
            n = Notify.Notification.new(titre, message, uri)
        else:
            n = Notify.Notification.new(titre, message)
        #if systray_icon is not None:
        #    n.attach_to_status_icon(self.gui.systray)
        if delay: t = int(delay)*1000
        else: t = 3000
        n.set_timeout(t)
        n.show()
        if not n.show():
            DEBUG("Failed to send notification")

    def PLUGIN(self, sortie, arg=False):
        cmd = 'PLUGIN%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd), sortie)
    
    def PLUGININIT(self, sortie):
        '''
        @name PLUGIN@@INIT
        @param @@plugin@@name@@arg@@arg@@...
        @brief Starts plugin
        @info plugin the plugin name
        @info name the name used for the plugin instance
        '''
        l = sortie.split('@@')[2:]
        plugin = l.pop(0)
        name = l[0]
        #print plugin
        #plug = __import__(plugin)
        exec('import %s.plugin as plug' % plugin)
        setattr(self, name, plug.Plugin(self,'@@'.join(l)) )
        
    def PLUGINCMD(self, sortie):
        '''
        @name PLUGIN@@CMD
        @param @@name@@cmd
        @brief Execute a plugin command
        '''
        name, cmd = sortie.split('@@')[2:]
        #exec('self.%(name)s.CMD(%(cmd)s)')
        getattr(self, name).CMD(cmd)
        
    def POINTER(self, sortie, arg=False):
        cmd = 'POINTER%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd), sortie)

    def POINTERSTART(self, sortie):
        '''
        @name POINTER@@START
        @param @@delay@@widget
        @brief Starts the cursor monitoring on a widget
        @info delay: milliseconds
        @return sh: move@x y
        @return py-cb: ('move', x, y)
        '''
        delay, name = sortie.split('@@')[2:]
        widget      = eval( 'self.gui.%s' % name )
        rootwin     = widget.get_screen().get_root_window()
        win, x, y, mask = rootwin.get_pointer()
        #self.flag_move  = True
        self.old_x_move = x
        self.old_y_move = y
        setattr(self, 'flag_move_%s' % name, True)
        GObject.timeout_add(int(delay), self.check_pointer, widget, name)

    def POINTERSTOP    (self, sortie):
        '''
        @name POINTER@@STOP
        @param @@widget
        @brief STops the cursor monitoring for the widget
        '''
        name = sortie.split('@@')[2]
        setattr(self, 'flag_move_%s' % name, False)
        self.flag_move = False

    def check_pointer(self, widget, name):
        rootwin = widget.get_screen().get_root_window()
        win, x, y, mods = rootwin.get_pointer()
        if x != self.old_x_move or y != self.old_y_move:
            self.old_x_move = x
            self.old_y_move = y
            if import_py is not None:
                getattr(self.IMPORT, name) ('move', x, y)
            else:
                self.send('%s move@%s %s' % (name, x, y) )
        return eval('self.flag_move_%s' % name)

    '''
    *** SCREEN DIMENSION
    '''
    def SCREEN(self, sortie, arg=False):
        '''
        @name SCREEN@@
        @brief Loads the screen dimensions in the environment
        @info keep for retro-compatibility since < 2.3.0
        @info otherwise G2S_SCREEN_HEIGHT, G2S_SCREEN_WIDTH variables was loaded
        @return screen_height="1200" screen_width="1800"
        @return py: (width, height)
        '''
        if import_py is not None:
            setattr(self.IMPORT, 'screen_width', self.gui.screen_width)
            setattr(self.IMPORT, 'screen_height', self.gui.screen_height)
            return (self.gui.screen_width, self.gui.screen_height)
        self.send('GET@screen_height="%s"' % self.gui.screen_height)
        self.send('GET@screen_width="%s"' % self.gui.screen_width)

    '''
    *** PYGTK
    '''
    def SET(self, sortie, arg=False):
        '''
        @name SET@
        @param widget.cmd()
        @brief runs a pygtk command (show(), hide(), ...)
        '''
        sortie = sortie.replace('SET@','')
        GObject.idle_add(self.gui.set_widget, sortie )

    '''
    *** STATUSBAR
    '''
    def STATUS(self, sortie, arg=False):
        '''
        @name STATUS@@
        @param statusbar@@My Text
        @brief Displays a text in a statusbar.
        '''
        widget, text = sortie.split('@@')[1:]
        statusbar = getattr(self.gui, widget)
        context   = getattr(self.gui, 'context_%s'%widget)
        GObject.idle_add(statusbar.push, context, text)

    '''
    *** SYSTRAY
    '''
    def SYSTRAY(self, sortie, arg=False):
        '''
        @name SYSTRAY@@
        @param name@@menu@@icon@@infobulle
        @brief Displays a systray icon.
        @info name: acces name
        @info icon: the icon name
        @info menu: associated contextmenu or None
        @info infobulle: tootltip text
        @info Default hide, use pygtk command to show it and more (see exemple)
        '''
        l = sortie.split('@@')[1:]
        GObject.idle_add(self.gui.new_systray_icon, *l)

    '''
    *** TOGGLE
    '''
    def TOGGLE(self, sortie, arg=False):
        cmd = 'TOGGLE%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd), sortie)

    def TOGGLESENSITIVE(self, sortie):
        '''
        @name TOGGLE@@SENSITIVE
        @param @@widget,widget
        @brief Toggles the sensitive (grey) status of one or several widget(s)
        '''
        l_widgets = sortie.split('@@')[2].replace(' ','').split(',')
        for item in l_widgets:
            widget = eval('self.gui.%s' % (item) )
            self.gui.toggle_sensitive(widget)

    def TOGGLEEXPANDER(self, sortie):
        '''
        @name TOGGLE@@EXPANDER
        @param @@widget,widget
        @brief Opens or closes one or several expander(s)
        '''
        l_widgets = sortie.split('@@')[2].replace(' ','').split(',')
        for item in l_widgets:
            widget = eval('self.gui.%s' % (item) )
            if widget.get_expanded():
                widget.set_expanded(False)
            else:
                widget.set_expanded(True)

    def TOGGLEVISIBLE(self, sortie):
        '''
        @name TOGGLE@@VISIBLE
        @param @@widget,widget
        @brief Toggles the visibility status of one or several widget(s)
        '''
        l_widgets = sortie.split('@@')[2].replace(' ','').split(',')
        for item in l_widgets:
            widget = eval('self.gui.%s' % (item) )
            self.gui.toggle_visible(widget)

    def TOGGLEACTIVE(self, sortie):
        '''
        @name TOGGLE@@ACTIVE
        @param @@widget,widget
        @brief Toggle the active status of one or several widget(s) (check, radio, toggle)
        '''
        l_widgets = sortie.split('@@')[2].replace(' ','').split(',')
        for item in l_widgets:
            widget = eval('self.gui.%s' % (item) )
            self.gui.toggle_active(widget)

    '''
    *** TERMINAL
    '''
    def TERM(self, sortie, arg=False):
        cmd='TERM%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd),sortie)

    def TERMFONT(self, sortie):
        '''
        @name TERM@@FONT
        @param @@font
        @brief Modify the terminal font
        @info Indicate the --terminal option
        @info font: pangoFontDescription ex: serif,monospace bold italic condensed 10
        '''
        font = sortie.split('@@')[2]
        self.gui.terminal.set_font_from_string(font)

    def TERMKILL(self, sortie):
        '''
        @name TERM@@KILL
        @param [@@sig]
        @brief Kills the process launched in the terminal (not avalaible with GTK3)
        @info sig: numerical kill signal
        @info Indicate the --terminal option
        '''
        try:
            sig = sortie.split('@@')[2]
        except:
            sig = '9'
        self.gui.kill_term_child(int(sig))

    def TERMWRITE(self, data=None):
        '''
        @name TERM@@WRITE
        @param @@text
        @brief Writes in the terminal
        '''
        cmd = data.replace('TERM@@WRITE@@','').replace('\\n','\n').replace('\\r','\r')
        self.gui.terminal.feed(cmd, len(cmd))

    def TERMSEND(self, data=None):
        '''
        @name TERM@@SEND
        @param @@commande
        @brief Runs a command in the terminal
        '''
        cmd = data.replace('TERM@@SEND@@','').replace('\\n','\n').replace('\\r','\r')
        self.gui.terminal.feed_child(cmd, len(cmd))
        self.gui.terminal.feed_child('', -1)

    def TIMER(self, sortie, arg=False):
        cmd='TIMER%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd), sortie)

    def TIMERSTART(self, sortie):
        '''
        @name TIMER@@START
        @param @@delay@@function
        @brief Loop call of a function
        @info delay: milliseconds
        '''
        delay, function = sortie.split('@@')[2:]
        setattr(self, 'flag_timer_%s' % function, True)
        GObject.timeout_add(int(delay), self.check_timer, function)

    def TIMERSTOP(self, sortie):
        '''
        @name TIMER@@STOP
        @param @@function
        @brief Stops the loop call
        '''
        function = sortie.split('@@')[2]
        setattr(self, 'flag_timer_%s' % function, False) 

    def check_timer(self, function):
        if import_py is not None:
            getattr(self.IMPORT, function)
        else:
            self.send(function)
        return eval('self.flag_timer_%s' % function)

    def WINDOW(self, sortie, arg=False):
        cmd = 'WINDOW%s' % sortie.split('@@')[1]
        GObject.idle_add(getattr(self, cmd),sortie)

    def WINDOWBACKGROUND(self, sortie):
        '''
        @name WINDOW@@BACKGROUND
        @param @@name@@image
        @brief Uses an image as window background (not available GTK3)
        @info this command must be run before the window display,
        @info set the window on invisible then run a show().
        @info name: window name
        @info image: relative or absolute image path
        '''
        name, img    = sortie.split('@@')[2:]
        widget       = eval('self.gui.%s' % name)
        pixbuf       = GdkPixbuf.Pixbuf.new_from_file(img)
        pixmap, mask = pixbuf.render_pixmap_and_mask()
        del pixbuf
        widget.set_app_paintable(True)
        widget.shape_combine_mask(mask, 0, 0)
        #widget.realize()    
        widget.window.set_back_pixmap(pixmap, False)

    def WINDOWTRANS(self, sortie):
        '''
        @name WINDOW@@TRANS
        @param @@name@@trans@@color
        @brief Ajusts the transparency and color of the window background (not available GTK3)
        @info add the --transparent option
        @info name: window name
        @info trans: transparency (0 to 1)
        @info color: #ffffff or color name
        '''
        name, trans, color = sortie.split('@@')[2:]
        widget             = eval('self.gui.%s' % name)
        dic_trans[name]    = [trans, color]
        widget.queue_draw()


class MyThread(threading.Thread, Commandes):
    '''
    ********************************************************
    *** GLADE2SCRIPT COMMANDS RECEPTION FROM THE FIFO
    ********************************************************
    '''
    def __init__(self, gui):  
        threading.Thread.__init__(self)
        self.gui=gui
        self.Terminated=False
        self.iter_select=None
        self.n_break=0

    def test_fichier(self, fichier):
        l_file_splitted = fichier.split(' ')
        n = 0
        fichier_t = l_file_splitted.pop(0)
        while True:
            if os.path.exists( fichier_t ):
                arg = '''%s %s''' % ( fichier_t.replace(' ','\ '),
                                      ' '.join(l_file_splitted) )
                break
            fichier_t = '''%s %s''' % ( fichier_t, l_file_splitted.pop(0) )
        return shlex.split(arg)

    def run(self):
        if import_py is not None:
            module = os.path.splitext(import_py)[0]
            if os.path.isfile(import_py):
                path, module = os.path.split(module)
                sys.path.append(path)
            exec('import %s as myimport' % module)
            self.IMPORT = myimport.Action(self)
            self.IMPORT.start()
        else:
            args = self.test_fichier( s_bash )
            sb   = subprocess.Popen(args,
                                    stderr = subprocess.STDOUT,
                                    stdout = subprocess.PIPE,
                                    env    = os.environ.update(DIC_ENV),
                                    )
            PID  = sb.pid
            self.path_FIFO = '/tmp/FIFO%s' % (PID)

            while not self.Terminated:
                sortie = sb.stdout.readline().rstrip()
                DEBUG('=> [[ PY ]] => %s' % sortie)
                if sortie == '':
                    self.n_break += 1
                    if self.n_break == 10:
                        os.kill(PID, 9)
                        break
                    continue
                self.n_break = 0
                try:
                    cmd = sortie.split('@')[0]
                    getattr(self, cmd)(sortie)
                except AttributeError,e: pass
                except:
                    raise
                    pass

    def from_import(self, sortie, arg=False):
        try:
            try:
                cmd = sortie.split('@')[0]
                return getattr(self, cmd)(sortie, arg)
            except:
                cmd = cmd+sortie.split('@')[1]
                return getattr(self, cmd)(sortie, arg)
        except ValueError, NameError:
            raise
        DEBUG('=> [[ PY ]] => : from import %s'% sortie)

    def send(self,data):
        if import_py is not None:
            DEBUG("=> [[ PY ]] => : Send from glade: %s"% data)
            #self.IMPORT.from_glade(data)
            return
        if data and self.gui.window_realized:
            time.sleep(0.001)
            i = open(self.path_FIFO,'w')
            i.write(data+'\n')
            #i.write(data)
            i.close()
            DEBUG("=> [[ PY ]] => :: FIFO write :: %s"% data)

    def stop(self,arg=None):
        if import_py is not None:
            self.IMPORT.quit_now()
        else:
            self.send('QuitNow')
            self.Terminated=True
            global EXIT
            if arg == 'no':
                #print 'EXIT="no"'
                EXIT = 'no'
            else:
                self.stop_save()
                print 'VERSION="glade2script 3.2.0, Copyright (C) 2010-2011, November 2011"'
                print 'EXIT="yes"'
                EXIT='yes'
        if term_box:
            self.gui.kill_term_child(9)
        Gtk.main_quit()
        try:
         os.remove(self.path_FIFO)
        except: pass

    def stop_save(self):
        for item in l_sortie:
            wid = eval('self.gui.%s' % (item) )
            if 'GtkTreeView' in str(wid):
                retour = self.retourne_selection(item)
                if retour:
                    print '''%s="%s"''' % (item, retour)
                continue
            widget = item.replace('.','_')
            var    = 'self.gui.%s ()' % (item)
            result = eval(var)
            print '%s="%s"' % (widget , result)

USAGE = '''
Usage: %s [OPTIONS]

OPTIONS:
 --clipboard= PRIMARY or CLIPBOARD
\t Activate the clipboard

 --combobox=  @@combobox1@@col|IMG
\t Lists the combobox elements (one per line or per option)

 --css= cssfile
\t css style file

 -d 
\t debug

 --embed= _drawingarea1@@app
\t Embeds an application that supports it natively

 -g/--glade= file
\t glade file

 --gtkbuilder
\t Use the GtkBuilder librairy instead of Libglade (default)

 --gtkrc= rcfile
\t rc style file

 -h/--help 
\t Display the help

 --import= path
\t Import as module instead of using the FIFO

 --infobulle= @@treeview@@col1:col2,col:col2
\t to manage the tiptool of a treeview

 --libglade
\t Use the Libglade librairy instead of GtkBuilder (depreciated)

 --locale= path
\t Change the 'locale' folder (used for translation)

 -r/--retour= _text1.get_text, window1.get_position, treeview1
\t gtk commands for outputs

 -s/--sh= file
\t sh file

 --sourceview= name,box
\t Add GtkSourceView for textview

 --systray= menu@img@infobulle
\t Notify zone icon

 --terminal-font= serif,monospace bold italic condensed 10
\t Loads a font name string

 --terminal-redim 
\t Automatic terminal resize

 --terminal= widget:widthxheight
\t VTE terminal

 --transparent= name:trans/None:color/None
\t Background transparency

 -t/--tree= @@treeview@@option@@option@@option
\t Treeview elements list (one per line or per option)

 --webcache= webview:folder:pattern:dialog
\t Puts in cache filtered via the pattern

 --webdownload= webview:choice
\t Action to perform during a download request

 --webkit= name,box
\t Add webkit html interpreter

 --weblinkfilter= webview:pattern
\t Filters each user click on links via the pattern

 --webloaded= webview,webview
\t Calls the function when the html is loaded

 --webmenu= webview:item:function:value/html
\t Creates a context menu

 --weboverlink= webview,webview
\t Calls the function when cursor goes above the links

 --webrequest= webview:pattern
\t Filters the http requests

 --websubmenu= menuitem:item:function:value/html
\t Creates a context sub-menu
''' % sys.argv[0]


if __name__ == '__main__':
    def DEBUG(arg):
        if debug: print arg

    l_sortie      = []
    l_webkit      = []
    l_webloaded   = []
    l_weboverlink = []
    systray_icon  = []
    DIC_ENV  = {
                'G2S_SCREEN_WIDTH'     : '0',
                'G2S_SCREEN_HEIGHT'    : '0',
                'G2S_TERMINAL_PID'     : '0',
                'G2S_SOURCEVIEW_LANG'  : 'None',
                'G2S_SOURCEVIEW_STYLE' : 'None',
                }
    init_dic  = [
                 'dic_treeview', 'dic_combo', 'dic_tooltip', 'dic_trans',
                 'dic_webcache','dic_webdownload', 'dic_webrequest',
                 'dic_weblinkfilter', 'dic_websignal', 'dic_webmenu',
                 'dic_websubmenu', 'dic_sourceview',
                 ]
    init_none = [
                 's_bash', 'gtkrc', 'clip', 'term_box', 'lock_cb',
                 'flag_term', 'embed', 'term_font', 'term_redim',
                 'import_py', 'local_path', 'auto_config', 'load_config',
                 ]

    for i in init_dic: exec('%s={}' % i)
    for i in init_none: exec('%s=None' % i)

    debug=False

    USERLIB = 'object'

    try:                                
        opts, args = getopt.getopt(sys.argv[1:], "hs:g:r:t:d",
            ["sh=", "glade=", "retour=","locale=","websubmenu=","libglade",
            "gtkrc=", "tree=","systray=","webcache=","webmenu=","auto-config=",
            "terminal=", "embed=", "import=","webrequest=","weboverlink=",
            "infobulle=","clipboard=", "webkit=","weblinkfilter=","lock-cb",
            "terminal-font=","terminal-redim","webdownload=","sourceview=",
            "gtkbuilder","combobox=","transparent=","webloaded=","load-config="]
                    )
    except getopt.GetoptError: 
        print 'error', USAGE
        sys.exit(2)
    for opt, arg in opts:
        if opt in ("-h", "--help"): 
            print USAGE
            sys.exit()
        elif opt in ("-s", "--sh"): 
            s_bash = arg
        elif opt == '-d':
            debug = True
        elif opt in ("-g", "--glade"): 
            f_glade = arg 
        elif opt in ("-r","--retour"):
            l_sortie=arg.replace(' ','').split(',')
        elif opt == "--gtkrc":
            gtkrc = arg
        elif opt == "--systray":
            systray_icon.append(arg.split('@'))
        elif opt == "--infobulle":
            name, coord= arg.split('@@')[1:]
            dic_tooltip[name]=eval('{%s}' % coord)
        elif opt in ("-t", "--tree"):
            liste_tree=[]
            for item in arg.split('\n'):
                if item.startswith('@@'):
                    if liste_tree:
                        dic_treeview[nom]=liste_tree
                        liste_tree=[]
                    nom, reference = item.split('@@')[1:]
                    liste_tree.append(reference)
                    continue
                liste_tree.append(item)
            dic_treeview[nom]=liste_tree
        elif opt == "--combobox":
            liste_combo=[]
            for item in arg.split('\n'):
                if item.startswith('@@'):
                    if liste_combo:
                        dic_treeview[nom]=liste_tree
                        liste_combo=[]
                    nom, reference = item.split('@@')[1:]
                    liste_combo.append(reference)
                    continue
                liste_combo.append(item)
            dic_combo[nom]=liste_combo
        elif opt == "--clipboard":
            clip = arg
        elif opt == "--terminal":
            from gi.repository import Vte
            term_box = arg
        elif opt == "--terminal-font":
            term_font = arg
        elif opt == "--terminal-redim":
            term_redim = True
        elif opt == "--embed":
            embed = arg
        elif opt == "--import":
            import_py = arg
        elif opt == '--gtkbuilder':
            USERLIB = 'object'
        elif opt == '--libglade':
            USERLIB = 'widget'
            import Gtk.glade
        elif opt == "--webkit":
            l_webkit.append( arg.replace(' ','').split(',') )
            from gi.repository import WebKit as webkit
            import urllib
        elif opt == "--sourceview":
            from gi.repository import GtkSource
            name, box = arg.replace(' ','').split(',')
            dic_sourceview[name] = box
        elif opt == '--transparent':
            name, trans, color = arg.split(':')
            dic_trans[name] = [ trans, color ]
        elif opt == '--locale':
            local_path = arg
        elif opt == '--webcache':
            name, dossier, ext, dialog = arg.split(':')
            if dossier == 'None':
                dossier = '/tmp/webcache'
                try:
                    os.mkdir(dossier)
                except: pass
            dic_webcache[name] = [dossier, ext, dialog]
        elif opt == '--webrequest':
            name, ext = arg.split(':').strip()
            dic_webrequest[name] = ext
        elif opt == '--webdownload':
            name, value = arg.split(':').strip()
            dic_webdownload[name] = value
        elif opt == '--weblinkfilter':
            l = arg.split(':').strip()
            name = l.pop(0)
            filtre = ':'.join(l)
            dic_weblinkfilter[name] = filtre
        elif opt == '--webmenu':
            name, item, function, value = arg.split('::')
            try:
                dic_webmenu[name] += [[item, function, value]]
            except:
                dic_webmenu[name] = [[item, function, value]]
        elif opt == '--websubmenu':
            menuitem, item, function, value = arg.split('::')
            try:
                dic_websubmenu[menuitem] += [[item, function, value]]
            except:
                dic_websubmenu[menuitem] = [[item, function, value]]
        elif opt == '--webloaded':
            l_webloaded += arg.replace(' ','').split(',')
        elif opt == '--weboverlink':
            l_weboverlink += arg.replace(' ','').split(',')
        elif opt == '--load-config':
            load_config = arg
        elif opt == '--auto-config':
            auto_config = arg
        elif opt == '--lock-cb':
            lock_cb = True

    try:
        from gi.repository import Notify
    except:
        DEBUG("You need to install pynotify to use notification")
    try:
        from gi.repository import AppIndicator3 as appindicator
    except:
        DEBUG("You need to install appinicator to use app indicator")


    path_appli, appli_name = os.path.split( f_glade )
    nom_appli= os.path.splitext(appli_name)[0]
    os.chdir(path_appli)

    if dic_trans: import cairo

    if s_bash is None:
        s_bash = '%s.sh' % os.path.join(os.path.realpath(os.getcwd()), nom_appli)

    if local_path is None:
        local_path = os.path.join(os.path.realpath(os.getcwd()), 'locale')
    
    if load_config is not None or auto_config is not None:
        if auto_config is None: path = load_config
        else: path = auto_config
        CONFIG_PARSER = ParseConfig(path)

    DEBUG("glade2script 3.2.0, Copyright (C) 2010-2012, Fevrier 2012")
    m = Gui()
    m.go_thread()
    m.main()
    if import_py is None:
        if EXIT == 'yes': sys.exit(0)
        elif EXIT == 'no': sys.exit(1)

Si çà aide à comprendre.

Édit
Je viens de tester sur un xenial installé à jour, même message d'erreur.

Le retour de commandes d'installation de boot-repair boot-info .

bernard@bernard-System-Product-Name:~$ sudo add-apt-repository ppa:yannubuntu/boot-repair
Mot de passe [sudo] pour bernard : 
 Simple tool to repair frequent boot problems.

Website: https://sourceforge.net/p/boot-repair/home
 Plus d’info : https://launchpad.net/~yannubuntu/+archive/ubuntu/boot-repair
Appuyez sur [ENTRÉE] pour continuer ou Ctrl-C pour annuler l’ajout

gpg: le porte-clefs « /tmp/tmpkvchn4nf/secring.gpg » a été créé
gpg: le porte-clefs « /tmp/tmpkvchn4nf/pubring.gpg » a été créé
gpg: demande de la clef 60D8DA0B sur le serveur hkp keyserver.ubuntu.com
gpg: /tmp/tmpkvchn4nf/trustdb.gpg : base de confiance créée
gpg: clef 60D8DA0B : clef publique « Launchpad PPA for YannUbuntu » importée
gpg: Quantité totale traitée : 1
gpg:               importées : 1  (RSA: 1)
OK

bernard@bernard-System-Product-Name:~$ sudo apt-get update
Ign:1 http://liveusb.info/multisystem/depot all InRelease
Réception de:2 http://ppa.launchpad.net/yannubuntu/boot-repair/ubuntu xenial InRelease [17,6 kB]
Atteint:3 http://liveusb.info/multisystem/depot all Release                                                            
Réception de:4 http://archive.ubuntu.com/ubuntu xenial InRelease [95,6 kB]                                             
Réception de:6 http://ppa.launchpad.net/yannubuntu/boot-repair/ubuntu xenial/main i386 Packages [1 978 B]
Réception de:7 http://ppa.launchpad.net/yannubuntu/boot-repair/ubuntu xenial/main Translation-en [2 123 B]
Atteint:8 http://archive.ubuntu.com/ubuntu xenial-updates InRelease        
Atteint:9 http://archive.ubuntu.com/ubuntu xenial-backports InRelease
Atteint:10 http://archive.ubuntu.com/ubuntu xenial-security InRelease
117 ko réceptionnés en 1s (95,0 ko/s)
AppStream cache update completed, but some metadata was ignored due to errors.
Lecture des listes de paquets... Fait
W: http://liveusb.info/multisystem/depot/dists/all/Release.gpg: Signature by key 32027DE3D67157C45E69C0AE4E940D7FDD7FB8CC uses weak digest algorithm (SHA1)

bernard@bernard-System-Product-Name:~$ sudo apt-get install boot-repair boot-info
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Le paquet suivant a été installé automatiquement et n'est plus nécessaire :
  libpth20
Veuillez utiliser « sudo apt autoremove » pour le supprimer.
The following additional packages will be installed:
  boot-sav boot-sav-extra gawk glade2script pastebinit
Paquets suggérés :
  dmraid lvm2 mbr mdadm clean-ubiquity os-uninstaller gawk-doc
Les NOUVEAUX paquets suivants seront installés :
  boot-info boot-repair boot-sav boot-sav-extra gawk glade2script pastebinit
0 mis à jour, 7 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 1 037 ko dans les archives.
Après cette opération, 5 082 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] 
Réception de:1 http://ppa.launchpad.net/yannubuntu/boot-repair/ubuntu xenial/main i386 glade2script all 3.2.2~ppa47~saucy [42,3 kB]
Réception de:2 http://archive.ubuntu.com/ubuntu xenial/main i386 gawk i386 1:4.1.3+dfsg-0.1 [407 kB]
Réception de:3 http://ppa.launchpad.net/yannubuntu/boot-repair/ubuntu xenial/main i386 boot-sav all 4ppa35 [414 kB]
Réception de:4 http://ppa.launchpad.net/yannubuntu/boot-repair/ubuntu xenial/main i386 boot-info all 4ppa35 [5 980 B]
Réception de:5 http://ppa.launchpad.net/yannubuntu/boot-repair/ubuntu xenial/main i386 boot-repair all 4ppa35 [11,6 kB]
Réception de:6 http://ppa.launchpad.net/yannubuntu/boot-repair/ubuntu xenial/main i386 boot-sav-extra all 4ppa35 [142 kB]
Réception de:7 http://archive.ubuntu.com/ubuntu xenial/main i386 pastebinit all 1.5-1 [14,6 kB]
1 037 ko réceptionnés en 5s (184 ko/s)
Sélection du paquet gawk précédemment désélectionné.
(Lecture de la base de données... 219657 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../gawk_1%3a4.1.3+dfsg-0.1_i386.deb ...
Dépaquetage de gawk (1:4.1.3+dfsg-0.1) ...
Sélection du paquet glade2script précédemment désélectionné.
Préparation du dépaquetage de .../glade2script_3.2.2~ppa47~saucy_all.deb ...
Dépaquetage de glade2script (3.2.2~ppa47~saucy) ...
Sélection du paquet boot-sav précédemment désélectionné.
Préparation du dépaquetage de .../boot-sav_4ppa35_all.deb ...
Dépaquetage de boot-sav (4ppa35) ...
Sélection du paquet boot-info précédemment désélectionné.
Préparation du dépaquetage de .../boot-info_4ppa35_all.deb ...
Dépaquetage de boot-info (4ppa35) ...
Sélection du paquet boot-repair précédemment désélectionné.
Préparation du dépaquetage de .../boot-repair_4ppa35_all.deb ...
Dépaquetage de boot-repair (4ppa35) ...
Sélection du paquet boot-sav-extra précédemment désélectionné.
Préparation du dépaquetage de .../boot-sav-extra_4ppa35_all.deb ...
Dépaquetage de boot-sav-extra (4ppa35) ...
Sélection du paquet pastebinit précédemment désélectionné.
Préparation du dépaquetage de .../pastebinit_1.5-1_all.deb ...
Dépaquetage de pastebinit (1.5-1) ...
Traitement des actions différées (« triggers ») pour man-db (2.7.5-1) ...
Traitement des actions différées (« triggers ») pour bamfdaemon (0.5.3~bzr0+16.04.20160322.1-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Traitement des actions différées (« triggers ») pour gnome-menus (3.13.3-6ubuntu3) ...
Traitement des actions différées (« triggers ») pour desktop-file-utils (0.22-1ubuntu4) ...
Traitement des actions différées (« triggers ») pour mime-support (3.59ubuntu1) ...
Paramétrage de gawk (1:4.1.3+dfsg-0.1) ...
Paramétrage de glade2script (3.2.2~ppa47~saucy) ...
Paramétrage de boot-sav (4ppa35) ...
Paramétrage de boot-info (4ppa35) ...
Paramétrage de boot-repair (4ppa35) ...
Paramétrage de boot-sav-extra (4ppa35) ...
Paramétrage de pastebinit (1.5-1) ...
bernard@bernard-System-Product-Name:~$ 
bernard@bernard-System-Product-Name:~$ boot-repair
bernard@bernard-System-Product-Name:~$   File "/usr/bin/glade2script", line 48, in <module>
    import gi
ImportError: No module named gi
bernard@bernard-System-Product-Name:~$ boot-info
bernard@bernard-System-Product-Name:~$   File "/usr/bin/glade2script", line 48, in <module>
    import gi
ImportError: No module named gi

@+.   Babdu89  .

Dernière modification par Babdu89 (Le 03/04/2016, à 23:08)


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#93 Le 03/04/2016, à 14:13

Bougron

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour
Est-il possible de savoir si 'boot-info' pensera à  pister une installation ubuntu réalisée sur un disque SSD de nouvelle génération ? (nvme01n1)
Voir discussion   https://forum.ubuntu-fr.org/viewtopic.p … #p21486435

Dernière modification par Bougron (Le 03/04/2016, à 14:15)

Hors ligne

#94 Le 04/04/2016, à 15:47

malbo

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Je ne sais pas ce qu'il en est depuis une session live mais je viens de vérifier que Boot-Info fonctionne depuis une session d'un Ubuntu 16.04 installé : http://paste2.org/8gILJyL8
Je colle ce Boot-Info :

     

 Boot Info Script e7fc706 + Boot-Repair extra info      [Boot-Info 9Feb2015]


============================= Boot Info Summary: ===============================

 => No boot loader is installed in the MBR of /dev/sda.

sda1: __________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows 8/2012: NTFS
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        

sda2: __________________________________________________________________________

    File system:       vfat
    Boot sector type:  Windows 8/2012: FAT32
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        /EFI/Boot/bkpbootx64.efi /EFI/Boot/bootx64.efi 
                       /EFI/ubuntu/MokManager.efi /EFI/ubuntu/fwupx64.efi 
                       /EFI/ubuntu/grubx64.efi /EFI/ubuntu/shimx64.efi 
                       /EFI/Microsoft/Boot/bootmgfw.efi 
                       /EFI/Microsoft/Boot/bootmgr.efi 
                       /EFI/Microsoft/Boot/memtest.efi 
                       /boot-sav/log/2015-05-11__09h59boot-repair28/sda2/bootx
                       64.efi

sda3: __________________________________________________________________________

    File system:       
    Boot sector type:  -
    Boot sector info: 
    Mounting failed:   mount: unknown filesystem type ''

sda4: __________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows 8/2012: NTFS
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        /bootmgr /Windows/System32/winload.exe

sda5: __________________________________________________________________________

    File system:       ext4
    Boot sector type:  -
    Boot sector info: 
    Operating System:  Ubuntu 15.10 
    Boot files:        /boot/grub/grub.cfg /etc/fstab

sda6: __________________________________________________________________________

    File system:       swap
    Boot sector type:  -
    Boot sector info: 

sda7: __________________________________________________________________________

    File system:       ext4
    Boot sector type:  -
    Boot sector info: 
    Operating System:  Ubuntu Xenial Xerus (development branch) 
    Boot files:        /boot/grub/grub.cfg /etc/fstab

============================ Drive/Partition Info: =============================

Drive: sda _____________________________________________________________________
Disk /dev/sda: 60 GiB, 64424509440 bytes, 125829120 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt

Partition  Boot  Start Sector    End Sector  # of Sectors  Id System

/dev/sda1                   1   125,829,119   125,829,119  ee GPT


GUID Partition Table detected.

Partition    Start Sector    End Sector  # of Sectors System
/dev/sda1           2,048       616,447       614,400 Windows Recovery Environment (Windows)
/dev/sda2         616,448       821,247       204,800 EFI System partition
/dev/sda3         821,248     1,083,391       262,144 Microsoft Reserved Partition (Windows)
/dev/sda4       1,083,392    79,538,175    78,454,784 Data partition (Windows/Linux)
/dev/sda5      79,538,176    99,069,425    19,531,250 Data partition (Linux)
/dev/sda6      99,069,952   102,975,487     3,905,536 Swap partition (Linux)
/dev/sda7     102,975,488   125,827,050    22,851,563 Data partition (Linux)

"blkid" output: ________________________________________________________________

Device           UUID                                   TYPE       LABEL

/dev/sda1        B0C0E8A5C0E872D0                       ntfs       Récupération
/dev/sda2        3EE8-FABA                              vfat       
/dev/sda3                                                          
/dev/sda4        8616053E160530AB                       ntfs       OS_WIN
/dev/sda5        d1b814c5-49a7-4478-b4cc-74f018296434   ext4       
/dev/sda6        d99b65df-e192-480c-9ac2-32c79d2a07fb   swap       
/dev/sda7        a87cfe05-7e34-4d80-987e-40fb7c15ea1e   ext4       

========================= "ls -l /dev/disk/by-id" output: ======================

total 0
lrwxrwxrwx 1 root root 9 Apr  4 15:32 ata-VMware_Virtual_SATA_CDRW_Drive_00000000000000000001 -> ../../sr0

================================ Mount points: =================================

Device           Mount_Point              Type       Options

/dev/sda2        /boot/efi                vfat       (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
/dev/sda7        /                        ext4       (rw,relatime,errors=remount-ro,data=ordered)


=========================== sda5/boot/grub/grub.cfg: ===========================

--------------------------------------------------------------------------------
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}
function recordfail {
  set recordfail=1
  if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}
function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod ext2
set root='hd0,gpt5'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
else
  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=fr_FR
  insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
    set timeout=10
  # Fallback normal timeout code in case the timeout_style feature is
  # unavailable.
  else
    set timeout=10
  fi
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30,0; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
	set gfxpayload="${1}"
	if [ "${1}" = "keep" ]; then
		set vt_handoff=vt.handoff=7
	else
		set vt_handoff=
	fi
}
if [ "${recordfail}" != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-d1b814c5-49a7-4478-b4cc-74f018296434' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_gpt
	insmod ext2
	set root='hd0,gpt5'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
	else
	  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
	fi
	linux	/boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro  quiet splash $vt_handoff
	initrd	/boot/initrd.img-4.2.0-35-generic
}
submenu 'Options avancées pour Ubuntu' $menuentry_id_option 'gnulinux-advanced-d1b814c5-49a7-4478-b4cc-74f018296434' {
	menuentry 'Ubuntu, avec Linux 4.2.0-35-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-35-generic-advanced-d1b814c5-49a7-4478-b4cc-74f018296434' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		echo	'Chargement de Linux 4.2.0-35-generic…'
		linux	/boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro  quiet splash $vt_handoff
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-35-generic-init-upstart-d1b814c5-49a7-4478-b4cc-74f018296434' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		echo	'Chargement de Linux 4.2.0-35-generic…'
		linux	/boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro  quiet splash $vt_handoff init=/sbin/upstart
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-35-generic-recovery-d1b814c5-49a7-4478-b4cc-74f018296434' {
		recordfail
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		echo	'Chargement de Linux 4.2.0-35-generic…'
		linux	/boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset 
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, avec Linux 4.2.0-32-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-32-generic-advanced-d1b814c5-49a7-4478-b4cc-74f018296434' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		echo	'Chargement de Linux 4.2.0-32-generic…'
		linux	/boot/vmlinuz-4.2.0-32-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro  quiet splash $vt_handoff
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.2.0-32-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-32-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-32-generic-init-upstart-d1b814c5-49a7-4478-b4cc-74f018296434' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		echo	'Chargement de Linux 4.2.0-32-generic…'
		linux	/boot/vmlinuz-4.2.0-32-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro  quiet splash $vt_handoff init=/sbin/upstart
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.2.0-32-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-32-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.2.0-32-generic-recovery-d1b814c5-49a7-4478-b4cc-74f018296434' {
		recordfail
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		echo	'Chargement de Linux 4.2.0-32-generic…'
		linux	/boot/vmlinuz-4.2.0-32-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset 
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.2.0-32-generic
	}
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###

### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Windows Boot Manager (sur /dev/sda2)' --class windows --class os $menuentry_id_option 'osprober-efi-3EE8-FABA' {
	insmod part_gpt
	insmod fat
	set root='hd0,gpt2'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  3EE8-FABA
	else
	  search --no-floppy --fs-uuid --set=root 3EE8-FABA
	fi
	chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
menuentry 'Ubuntu 14.04.4 LTS (14.04) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
	insmod part_gpt
	insmod ext2
	set root='hd0,gpt7'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
	else
	  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
	fi
	linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro quiet splash $vt_handoff
	initrd /boot/initrd.img-4.2.0-35-generic
}
submenu 'Options avancées pour Ubuntu 14.04.4 LTS (14.04) (sur /dev/sda7)' $menuentry_id_option 'osprober-gnulinux-advanced-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
	menuentry 'Ubuntu (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, avec Linux 4.2.0-35-generic (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (recovery mode) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed-root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro recovery nomodeset-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro recovery nomodeset
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, avec Linux 4.2.0-34-generic (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-34-generic.efi.signed--a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-34-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-34-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-34-generic (recovery mode) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-34-generic.efi.signed-root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro recovery nomodeset-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-34-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro recovery nomodeset
		initrd /boot/initrd.img-4.2.0-34-generic
	}
	menuentry 'Ubuntu 15.10 (15.10) (sur /dev/sda5) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu (sur /dev/sda5) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, avec Linux 4.2.0-35-generic (sur /dev/sda5) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (upstart) (sur /dev/sda5) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff init=/sbin/upstart
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (recovery mode) (sur /dev/sda5) (sur /dev/sda7)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed-root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset
		initrd /boot/initrd.img-4.2.0-35-generic
	}
}

menuentry 'Ubuntu Xenial Xerus (development branch) (16.04) (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-9f995e27-6d39-460d-a7f6-52a8c9796532' {
	insmod part_msdos
	insmod ext2
	set root='hd1,msdos5'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
	else
	  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
	fi
	linux /boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro quiet splash $vt_handoff
	initrd /boot/initrd.img-4.4.0-16-generic
}
submenu 'Options avancées pour Ubuntu Xenial Xerus (development branch) (16.04) (sur /dev/sdb5)' $menuentry_id_option 'osprober-gnulinux-advanced-9f995e27-6d39-460d-a7f6-52a8c9796532' {
	menuentry 'Ubuntu (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-16-generic.efi.signed--9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-16-generic
	}
	menuentry 'Ubuntu, avec Linux 4.4.0-16-generic (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-16-generic.efi.signed--9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-16-generic
	}
	menuentry 'Ubuntu, with Linux 4.4.0-16-generic (recovery mode) (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-16-generic.efi.signed-root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro recovery nomodeset-9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-16-generic
	}
	menuentry 'Ubuntu, avec Linux 4.4.0-15-generic (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-15-generic.efi.signed--9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-15-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-15-generic
	}
	menuentry 'Ubuntu, with Linux 4.4.0-15-generic (recovery mode) (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-15-generic.efi.signed-root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro recovery nomodeset-9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-15-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-15-generic
	}
}

set timeout_style=menu
if [ "${timeout}" = 0 ]; then
  set timeout=10
fi
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/30_uefi-firmware ###
### END /etc/grub.d/30_uefi-firmware ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
--------------------------------------------------------------------------------

=============================== sda5/etc/fstab: ================================

--------------------------------------------------------------------------------
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>

#Entry for /dev/sda5 :
UUID=d1b814c5-49a7-4478-b4cc-74f018296434	/	ext4	errors=remount-ro	0	1
#Entry for /dev/sda2 :
UUID=3EE8-FABA	/boot/efi	vfat	umask=0077	0	1
#Entry for /dev/sda4 :
UUID=8616053E160530AB	/media/OS_WIN	ntfs-3g	defaults,locale=fr_FR.UTF-8	0	0
#Entry for /dev/sda6 :
UUID=d99b65df-e192-480c-9ac2-32c79d2a07fb	none	swap	sw	0	0
#Entry for /dev/sdb2 (commenté par que c'est nuisible quand le disque sdb n'est pas connecté) :
#UUID=4a7e3bc9-9d16-4302-83cc-c4724848163c	none	swap	sw	0	0
#/dev/fd0	/media/floppy0	auto	rw,user,noauto,exec,utf8	0	0


--------------------------------------------------------------------------------

=========================== sda7/boot/grub/grub.cfg: ===========================

--------------------------------------------------------------------------------
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}
function recordfail {
  set recordfail=1
  if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}
function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod ext2
set root='hd0,gpt7'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
else
  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=fr_FR
  insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ] ; then
  set timeout=30
else
  if [ x$feature_timeout_style = xy ] ; then
    set timeout_style=menu
    set timeout=10
  # Fallback normal timeout code in case the timeout_style feature is
  # unavailable.
  else
    set timeout=10
  fi
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30,0; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
	set gfxpayload="${1}"
	if [ "${1}" = "keep" ]; then
		set vt_handoff=vt.handoff=7
	else
		set vt_handoff=
	fi
}
if [ "${recordfail}" != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_gpt
	insmod ext2
	set root='hd0,gpt7'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
	else
	  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
	fi
	linux	/boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro  quiet splash $vt_handoff
	initrd	/boot/initrd.img-4.4.0-16-generic
}
submenu 'Options avancées pour Ubuntu' $menuentry_id_option 'gnulinux-advanced-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
	menuentry 'Ubuntu, avec Linux 4.4.0-16-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-16-generic-advanced-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		echo	'Chargement de Linux 4.4.0-16-generic…'
		linux	/boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro  quiet splash $vt_handoff
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.4.0-16-generic
	}
	menuentry 'Ubuntu, with Linux 4.4.0-16-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-16-generic-init-upstart-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		echo	'Chargement de Linux 4.4.0-16-generic…'
		linux	/boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro  quiet splash $vt_handoff init=/sbin/upstart
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.4.0-16-generic
	}
	menuentry 'Ubuntu, with Linux 4.4.0-16-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.4.0-16-generic-recovery-a87cfe05-7e34-4d80-987e-40fb7c15ea1e' {
		recordfail
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt7'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt7 --hint-efi=hd0,gpt7 --hint-baremetal=ahci0,gpt7  a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		else
		  search --no-floppy --fs-uuid --set=root a87cfe05-7e34-4d80-987e-40fb7c15ea1e
		fi
		echo	'Chargement de Linux 4.4.0-16-generic…'
		linux	/boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro recovery nomodeset 
		echo	'Chargement du disque mémoire initial…'
		initrd	/boot/initrd.img-4.4.0-16-generic
	}
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###

### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Windows Boot Manager (sur /dev/sda2)' --class windows --class os $menuentry_id_option 'osprober-efi-3EE8-FABA' {
	insmod part_gpt
	insmod fat
	set root='hd0,gpt2'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  3EE8-FABA
	else
	  search --no-floppy --fs-uuid --set=root 3EE8-FABA
	fi
	chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
menuentry 'Ubuntu 15.10 (15.10) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-d1b814c5-49a7-4478-b4cc-74f018296434' {
	insmod part_gpt
	insmod ext2
	set root='hd0,gpt5'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
	else
	  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
	fi
	linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
	initrd /boot/initrd.img-4.2.0-35-generic
}
submenu 'Options avancées pour Ubuntu 15.10 (15.10) (sur /dev/sda5)' $menuentry_id_option 'osprober-gnulinux-advanced-d1b814c5-49a7-4478-b4cc-74f018296434' {
	menuentry 'Ubuntu (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, avec Linux 4.2.0-35-generic (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (upstart) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff init=/sbin/upstart
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (recovery mode) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed-root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset-d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, avec Linux 4.2.0-32-generic (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-32-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-32-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-32-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-32-generic (upstart) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-32-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-32-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff init=/sbin/upstart
		initrd /boot/initrd.img-4.2.0-32-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-32-generic (recovery mode) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-32-generic.efi.signed-root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset-d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-32-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset
		initrd /boot/initrd.img-4.2.0-32-generic
	}
	menuentry 'Ubuntu 14.04.4 LTS (14.04) (sur /dev/sda7) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu (sur /dev/sda7) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, avec Linux 4.2.0-35-generic (sur /dev/sda7) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (recovery mode) (sur /dev/sda7) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed-root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro recovery nomodeset-d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro recovery nomodeset
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu 15.10 (15.10) (sur /dev/sda5) (sur /dev/sda7) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu (sur /dev/sda5) (sur /dev/sda7) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, avec Linux 4.2.0-35-generic (sur /dev/sda5) (sur /dev/sda7) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (upstart) (sur /dev/sda5) (sur /dev/sda7) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed--d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro quiet splash $vt_handoff init=/sbin/upstart
		initrd /boot/initrd.img-4.2.0-35-generic
	}
	menuentry 'Ubuntu, with Linux 4.2.0-35-generic (recovery mode) (sur /dev/sda5) (sur /dev/sda7) (sur /dev/sda5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.2.0-35-generic.efi.signed-root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset-d1b814c5-49a7-4478-b4cc-74f018296434' {
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  d1b814c5-49a7-4478-b4cc-74f018296434
		else
		  search --no-floppy --fs-uuid --set=root d1b814c5-49a7-4478-b4cc-74f018296434
		fi
		linux /boot/vmlinuz-4.2.0-35-generic.efi.signed root=UUID=d1b814c5-49a7-4478-b4cc-74f018296434 ro recovery nomodeset
		initrd /boot/initrd.img-4.2.0-35-generic
	}
}

menuentry 'Ubuntu Xenial Xerus (development branch) (16.04) (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-9f995e27-6d39-460d-a7f6-52a8c9796532' {
	insmod part_msdos
	insmod ext2
	set root='hd1,msdos5'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
	else
	  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
	fi
	linux /boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro quiet splash $vt_handoff
	initrd /boot/initrd.img-4.4.0-16-generic
}
submenu 'Options avancées pour Ubuntu Xenial Xerus (development branch) (16.04) (sur /dev/sdb5)' $menuentry_id_option 'osprober-gnulinux-advanced-9f995e27-6d39-460d-a7f6-52a8c9796532' {
	menuentry 'Ubuntu (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-16-generic.efi.signed--9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-16-generic
	}
	menuentry 'Ubuntu, avec Linux 4.4.0-16-generic (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-16-generic.efi.signed--9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-16-generic
	}
	menuentry 'Ubuntu, with Linux 4.4.0-16-generic (recovery mode) (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-16-generic.efi.signed-root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro recovery nomodeset-9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-16-generic
	}
	menuentry 'Ubuntu, avec Linux 4.4.0-15-generic (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-15-generic.efi.signed--9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-15-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro quiet splash $vt_handoff
		initrd /boot/initrd.img-4.4.0-15-generic
	}
	menuentry 'Ubuntu, with Linux 4.4.0-15-generic (recovery mode) (sur /dev/sdb5)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-15-generic.efi.signed-root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro recovery nomodeset-9f995e27-6d39-460d-a7f6-52a8c9796532' {
		insmod part_msdos
		insmod ext2
		set root='hd1,msdos5'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos5 --hint-efi=hd1,msdos5 --hint-baremetal=ahci1,msdos5  9f995e27-6d39-460d-a7f6-52a8c9796532
		else
		  search --no-floppy --fs-uuid --set=root 9f995e27-6d39-460d-a7f6-52a8c9796532
		fi
		linux /boot/vmlinuz-4.4.0-15-generic.efi.signed root=UUID=9f995e27-6d39-460d-a7f6-52a8c9796532 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-15-generic
	}
}

set timeout_style=menu
if [ "${timeout}" = 0 ]; then
  set timeout=10
fi
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/30_uefi-firmware ###
### END /etc/grub.d/30_uefi-firmware ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
--------------------------------------------------------------------------------

=============================== sda7/etc/fstab: ================================

--------------------------------------------------------------------------------
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda7 during installation
UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda2 during installation
UUID=3EE8-FABA  /boot/efi       vfat    defaults        0       1
/dev/mapper/ubuntu--vg-swap_1 none            swap    sw              0       0
# swap was on /dev/sda6 during installation
UUID=d99b65df-e192-480c-9ac2-32c79d2a07fb none            swap    sw              0       0
# swap was on /dev/sdb2 during installation
UUID=4a7e3bc9-9d16-4302-83cc-c4724848163c none            swap    sw              0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
--------------------------------------------------------------------------------

=============================== StdErr Messages: ===============================

File descriptor 9 (/proc/2097/mounts) leaked on lvs invocation. Parent PID 11076: bash
File descriptor 63 (pipe:[28809]) leaked on lvs invocation. Parent PID 11076: bash

ADDITIONAL INFORMATION :
=================== log of boot-info 2016-04-04__15h32 ===================
boot-info version : 4ppa35
boot-sav version : 4ppa35
glade2script version : 3.2.2~ppa47~saucy
boot-sav-extra version : 4ppa35
File descriptor 9 (/proc/2097/mounts) leaked on lvs invocation. Parent PID 3762: /bin/sh
boot-info is executed in installed-session (Ubuntu Xenial Xerus (development branch), xenial, Ubuntu, x86_64)
CPU op-mode(s):        32-bit, 64-bit
BOOT_IMAGE=/boot/vmlinuz-4.4.0-16-generic.efi.signed root=UUID=a87cfe05-7e34-4d80-987e-40fb7c15ea1e ro quiet splash vt.handoff=7

=================== os-prober:
/dev/sda7:L'OS actuellement utilisé - Ubuntu Xenial Xerus (development branch) CurrentSession:linux
/dev/sda2@/EFI/Microsoft/Boot/bootmgfw.efi:Windows Boot Manager:Windows:efi
/dev/sda5:Ubuntu 15.10 (15.10):Ubuntu:linux

=================== blkid:
/dev/sda1: LABEL="RM-CM-)cupM-CM-)ration" UUID="B0C0E8A5C0E872D0" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="aee3c406-eb85-4d2e-adc3-ab50b8420b2e"
/dev/sda2: UUID="3EE8-FABA" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="1ccc0f6b-032a-45c8-b25e-b50e2dc5ee8d"
/dev/sda4: LABEL="OS_WIN" UUID="8616053E160530AB" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="b6ec2f42-64a7-4f17-bd18-c0cfb0e0a835"
/dev/sda5: UUID="d1b814c5-49a7-4478-b4cc-74f018296434" TYPE="ext4" PARTUUID="97033c4d-66ba-4c8c-8937-07209ee9c874"
/dev/sda6: UUID="d99b65df-e192-480c-9ac2-32c79d2a07fb" TYPE="swap" PARTUUID="17f24649-c115-4b2e-86dd-0e6f56908866"
/dev/sda7: UUID="a87cfe05-7e34-4d80-987e-40fb7c15ea1e" TYPE="ext4" PARTUUID="e5cf4e84-11c6-439a-aa86-8d2e66d4b228"
/dev/sda3: PARTLABEL="Microsoft reserved partition" PARTUUID="d3da2d26-2514-4862-94c4-a3d06ada0b66"


1 disks with OS, 3 OS : 2 Linux, 0 MacOS, 1 Windows, 0 unknown type OS.

Windows not detected by os-prober on sda4.

=================== /etc/grub.d/ :
drwxr-xr-x  2 root root     4096 avril  3 14:26 grub.d
total 76
-rwxr-xr-x 1 root root  9791 déc.  17 16:00 00_header
-rwxr-xr-x 1 root root  6258 mars  15 19:08 05_debian_theme
-rwxr-xr-x 1 root root 12261 mars  19 04:14 10_linux
-rwxr-xr-x 1 root root 11082 mars  19 04:14 20_linux_xen
-rwxr-xr-x 1 root root  1992 mars  12  2014 20_memtest86+
-rwxr-xr-x 1 root root 11692 déc.  17 16:00 30_os-prober
-rwxr-xr-x 1 root root  1418 mars  19 04:14 30_uefi-firmware
-rwxr-xr-x 1 root root   214 déc.  17 16:00 40_custom
-rwxr-xr-x 1 root root   216 déc.  17 16:00 41_custom
-rw-r--r-- 1 root root   483 déc.  17 16:00 README




=================== /etc/default/grub :

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"



/boot/efi detected in the fstab of sda7: UUID=3EE8-FABA   (sda2)
Presence of EFI/Microsoft file detected: /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi
Presence of EFI/Boot file detected: /boot/efi/EFI/Boot/bkpbootx64.efi
Presence of EFI/Boot file detected: /boot/efi/EFI/Boot/bootx64.efi
Presence of bkp file detected: /boot/efi/EFI/Boot/bkpbootx64.efi

=================== sda5/etc/grub.d/ :
drwxr-xr-x  2 root root    4096 févr. 23 16:35 grub.d
total 76
-rwxr-xr-x 1 root root  9791 sept.  6  2015 00_header
-rwxr-xr-x 1 root root  6058 sept.  4  2015 05_debian_theme
-rwxr-xr-x 1 root root 12261 sept.  6  2015 10_linux
-rwxr-xr-x 1 root root 11082 sept.  6  2015 20_linux_xen
-rwxr-xr-x 1 root root  1992 août  27  2015 20_memtest86+
-rwxr-xr-x 1 root root 11692 sept.  6  2015 30_os-prober
-rwxr-xr-x 1 root root  1418 sept.  6  2015 30_uefi-firmware
-rwxr-xr-x 1 root root   214 sept.  6  2015 40_custom
-rwxr-xr-x 1 root root   216 sept.  6  2015 41_custom
-rw-r--r-- 1 root root   483 sept.  6  2015 README




=================== sda5/etc/default/grub :

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"



/boot/efi detected in the fstab of sda5: UUID=3EE8-FABA	 (sda2)
ls /sys/firmware/efi/vars : RTC-378d7b65-8da9-4773-b6e4-a47826a833e1,PlatformLangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c,PlatformLang-8be4df61-93ca-11d2-aa0d-00e098032b8c,new_var,MTC-eb704011-1402-11d3-8e77-00a0c969723b,MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23,MemoryTypeInformation-4c19049f-4137-4dd3-9c10-8b97a83ffdfa,LangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c,Lang-8be4df61-93ca-11d2-aa0d-00e098032b8c,HDDP-fab7e9e1-39dd-4f2b-8408-e20e906cb6de,del_var,ConsoleOutMode-793d9786-44dc-4709-b57f-85b8e8fdbfd2,ConOutDev-8be4df61-93ca-11d2-aa0d-00e098032b8c,ConOut-8be4df61-93ca-11d2-aa0d-00e098032b8c,ConInDev-8be4df61-93ca-11d2-aa0d-00e098032b8c,ConIn-8be4df61-93ca-11d2-aa0d-00e098032b8c,BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8c,BootOptionSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c,BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0007-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0006-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0005-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c,
Veuillez indiquer ce message à boot.repair@gmail.com
ls /sys/firmware/efi/vars : RTC-378d7b65-8da9-4773-b6e4-a47826a833e1,PlatformLangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c,PlatformLang-8be4df61-93ca-11d2-aa0d-00e098032b8c,new_var,MTC-eb704011-1402-11d3-8e77-00a0c969723b,MokListRT-605dab50-e046-4300-abb6-3dd810dd8b23,MemoryTypeInformation-4c19049f-4137-4dd3-9c10-8b97a83ffdfa,LangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c,Lang-8be4df61-93ca-11d2-aa0d-00e098032b8c,HDDP-fab7e9e1-39dd-4f2b-8408-e20e906cb6de,del_var,ConsoleOutMode-793d9786-44dc-4709-b57f-85b8e8fdbfd2,ConOutDev-8be4df61-93ca-11d2-aa0d-00e098032b8c,ConOut-8be4df61-93ca-11d2-aa0d-00e098032b8c,ConInDev-8be4df61-93ca-11d2-aa0d-00e098032b8c,ConIn-8be4df61-93ca-11d2-aa0d-00e098032b8c,BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8c,BootOptionSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c,BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0007-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0006-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0005-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c,Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c,
Special SecureBoot. Veuillez indiquer ce message à boot.repair@gmail.com

=================== efibootmgr -v
BootCurrent: 0006
BootOrder: 0006,0007,0005,0000,0003,0004
Boot0000* EFI VMware Virtual SCSI Hard Drive (0.0)	PciRoot(0x0)/Pci(0x10,0x0)/SCSI(0,0)
Boot0003* EFI VMware Virtual SATA CDROM Drive (0.0)	PciRoot(0x0)/Pci(0x11,0x0)/Pci(0x5,0x0)/Sata(0,0,0)
Boot0004* EFI Network	PciRoot(0x0)/Pci(0x11,0x0)/Pci(0x1,0x0)/MAC(000c29696ad1,0)
Boot0005* EFI Internal Shell (Unsupported option)	MemoryMapped(11,0x3efba000,0x3f344fff)/FvFile(c57ad6b7-0515-40a8-9d21-551652854e37)
Boot0006* ubuntu	HD(2,GPT,1ccc0f6b-032a-45c8-b25e-b50e2dc5ee8d,0x96800,0x32000)/File(EFIubuntushimx64.efi)
Boot0007* Windows Boot Manager	HD(2,GPT,1ccc0f6b-032a-45c8-b25e-b50e2dc5ee8d,0x96800,0x32000)/File(EFIMicrosoftBootbootmgfw.efi)WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.{.9.d.e.a.8.6.2.c.-.5.c.d.d.-.4.e.7.0.-.a.c.c.1.-.f.3.2.b.3.4.4.d.4.7.9.5.}....................

=================== UEFI/Legacy mode:
BIOS is EFI-compatible, and is setup in EFI-mode for this installed-session.
SecureBoot enabled.


=================== PARTITIONS & DISKS:
sda7	: sda,	not-sepboot,	grubenv-ok	grub2,	signed grub-efi ,	update-grub,	64,	with-boot,	is-os,	not--efi--part,	fstab-without-boot,	fstab-has-goodEFI,	no-nt,	no-winload,	no-recov-nor-hid,	no-bmgr,	notwinboot,	apt-get,	grub-install,	with--usr,	fstab-without-usr,	not-sep-usr,	standard,	not-far,	.
sda1	: sda,	not-sepboot,	no-grubenv	nogrub,	no-docgrub,	no-update-grub,	32,	no-boot,	no-os,	not--efi--part,	part-has-no-fstab,	part-has-no-fstab,	no-nt,	no-winload,	recovery-or-hidden,	no-bmgr,	notwinboot,	nopakmgr,	nogrubinstall,	no---usr,	part-has-no-fstab,	not-sep-usr,	standard,	not-far,	/mnt/boot-sav/sda1.
sda2	: sda,	not-sepboot,	no-grubenv	nogrub,	no-docgrub,	no-update-grub,	32,	no-boot,	is-os,	is-correct-EFI,	part-has-no-fstab,	part-has-no-fstab,	no-nt,	no-winload,	no-recov-nor-hid,	no-bmgr,	notwinboot,	nopakmgr,	nogrubinstall,	no---usr,	part-has-no-fstab,	not-sep-usr,	standard,	not-far,	/boot/efi.
sda4	: sda,	not-sepboot,	no-grubenv	nogrub,	no-docgrub,	no-update-grub,	32,	no-boot,	is-os,	not--efi--part,	part-has-no-fstab,	part-has-no-fstab,	no-nt,	haswinload,	no-recov-nor-hid,	bootmgr,	notwinboot,	nopakmgr,	nogrubinstall,	no---usr,	part-has-no-fstab,	not-sep-usr,	standard,	not-far,	/mnt/boot-sav/sda4.
sda5	: sda,	not-sepboot,	grubenv-ok	grub2,	signed grub-efi ,	update-grub,	64,	with-boot,	is-os,	not--efi--part,	fstab-without-boot,	fstab-has-goodEFI,	no-nt,	no-winload,	no-recov-nor-hid,	no-bmgr,	notwinboot,	apt-get,	grub-install,	with--usr,	fstab-without-usr,	not-sep-usr,	standard,	not-far,	/mnt/boot-sav/sda5.

sda	: GPT,	no-BIOS_boot,	has-correctEFI, 	not-usb,	has-os,	2048 sectors * 512 bytes


=================== parted -l:

Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 64.4GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name                          Flags
1      1049kB  316MB   315MB   ntfs            Basic data partition          diag
2      316MB   420MB   105MB   fat32           EFI system partition          boot, esp
3      420MB   555MB   134MB                   Microsoft reserved partition  msftres
4      555MB   40.7GB  40.2GB  ntfs            Basic data partition          msftdata
5      40.7GB  50.7GB  10.0GB  ext4
6      50.7GB  52.7GB  2000MB  linux-swap(v1)
7      52.7GB  64.4GB  11.7GB  ext4

=================== parted -lm:

BYT;
/dev/sda:64.4GB:scsi:512:512:gpt:VMware, VMware Virtual S:;
1:1049kB:316MB:315MB:ntfs:Basic data partition:diag;
2:316MB:420MB:105MB:fat32:EFI system partition:boot, esp;
3:420MB:555MB:134MB::Microsoft reserved partition:msftres;
4:555MB:40.7GB:40.2GB:ntfs:Basic data partition:msftdata;
5:40.7GB:50.7GB:10.0GB:ext4::;
6:50.7GB:52.7GB:2000MB:linux-swap(v1)::;
7:52.7GB:64.4GB:11.7GB:ext4::;

=================== lsblk:
KNAME TYPE FSTYPE  SIZE LABEL
fd0   disk           4K
sda   disk          60G
sda1  part ntfs    300M Récupération
sda2  part vfat    100M
sda3  part         128M
sda4  part ntfs   37,4G OS_WIN
sda5  part ext4    9,3G
sda6  part swap    1,9G
sda7  part ext4   10,9G
sr0   rom          194M

KNAME ROTA RO RM STATE   MOUNTPOINT
fd0      1  0  1
sda      1  0  0 running
sda1     1  0  0         /mnt/boot-sav/sda1
sda2     1  0  0         /boot/efi
sda3     1  0  0
sda4     1  0  0         /mnt/boot-sav/sda4
sda5     1  0  0         /mnt/boot-sav/sda5
sda6     1  0  0         [SWAP]
sda7     1  0  0         /
sr0      1  0  1 running


=================== mount:
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=483608k,nr_inodes=120902,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=100704k,mode=755)
/dev/sda7 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (rw,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd,nsroot=/)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory,nsroot=/)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event,release_agent=/run/cgmanager/agents/cgm-release-agent.perf_event,nsroot=/)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids,release_agent=/run/cgmanager/agents/cgm-release-agent.pids,nsroot=/)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices,nsroot=/)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset,clone_children,nsroot=/)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio,nsroot=/)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct,nsroot=/)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio,nsroot=/)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer,nsroot=/)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb,release_agent=/run/cgmanager/agents/cgm-release-agent.hugetlb,nsroot=/)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=26,pgrp=1,timeout=0,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
/dev/sda2 on /boot/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
cgmfs on /run/cgmanager/fs type tmpfs (rw,relatime,size=100k,mode=755)
tmpfs on /run/user/112 type tmpfs (rw,nosuid,nodev,relatime,size=100704k,mode=700,uid=112,gid=118)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=100704k,mode=700,uid=1000,gid=1000)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
/dev/sda1 on /mnt/boot-sav/sda1 type fuseblk (rw,relatime,user_id=0,group_id=0,allow_other,blksize=4096)
/dev/sda4 on /mnt/boot-sav/sda4 type fuseblk (rw,relatime,user_id=0,group_id=0,allow_other,blksize=4096)
/dev/sda5 on /mnt/boot-sav/sda5 type ext4 (rw,relatime,data=ordered)


=================== ls:
/sys/block/fd0 (filtered):  alignment_offset bdi capability dev device discard_alignment events events_async events_poll_msecs ext_range holders inflight integrity power queue range removable ro size slaves stat subsystem trace uevent
/sys/block/sda (filtered):  alignment_offset bdi capability dev device discard_alignment events events_async events_poll_msecs ext_range holders inflight integrity power queue range removable ro sda1 sda2 sda3 sda4 sda5 sda6 sda7 size slaves stat subsystem trace uevent
/sys/block/sr0 (filtered):  alignment_offset bdi capability dev device discard_alignment events events_async events_poll_msecs ext_range holders inflight integrity power queue range removable ro size slaves stat subsystem trace uevent
/dev (filtered):  agpgart autofs block bsg btrfs-control bus cdrom cdrw char console core cpu cpu_dma_latency cuse disk dri dvd ecryptfs fb0 fd fd0 full fuse hidraw0 hidraw1 hpet hugepages hwrng initctl input kmsg lightnvm log lp0 mapper mcelog mem memory_bandwidth mqueue net network_latency network_throughput null parport0 port ppp psaux ptmx pts random rfkill rtc rtc0 sda sda1 sda2 sda3 sda4 sda5 sda6 sda7 sg0 sg1 shm snapshot snd sr0 stderr stdin stdout uhid uinput urandom userio vfio vga_arbiter vhci vhost-net vmci zero
ls /dev/mapper:  control
ls: impossible d'accéder à '': Aucun fichier ou dossier de ce type

=================== hexdump -n512 -C /dev/sda1
00000000  eb 52 90 4e 54 46 53 20  20 20 20 00 02 08 00 00  |.R.NTFS    .....|
00000010  00 00 00 00 00 f8 00 00  3f 00 ff 00 00 08 00 00  |........?.......|
00000020  00 00 00 00 80 00 80 00  ff 5f 09 00 00 00 00 00  |........._......|
00000030  00 64 00 00 00 00 00 00  02 00 00 00 00 00 00 00  |.d..............|
00000040  f6 00 00 00 01 00 00 00  d0 72 e8 c0 a5 e8 c0 b0  |.........r......|
00000050  00 00 00 00 fa 33 c0 8e  d0 bc 00 7c fb 68 c0 07  |.....3.....|.h..|
00000060  1f 1e 68 66 00 cb 88 16  0e 00 66 81 3e 03 00 4e  |..hf......f.>..N|
00000070  54 46 53 75 15 b4 41 bb  aa 55 cd 13 72 0c 81 fb  |TFSu..A..U..r...|
00000080  55 aa 75 06 f7 c1 01 00  75 03 e9 dd 00 1e 83 ec  |U.u.....u.......|
00000090  18 68 1a 00 b4 48 8a 16  0e 00 8b f4 16 1f cd 13  |.h...H..........|
000000a0  9f 83 c4 18 9e 58 1f 72  e1 3b 06 0b 00 75 db a3  |.....X.r.;...u..|
000000b0  0f 00 c1 2e 0f 00 04 1e  5a 33 db b9 00 20 2b c8  |........Z3... +.|
000000c0  66 ff 06 11 00 03 16 0f  00 8e c2 ff 06 16 00 e8  |f...............|
000000d0  4b 00 2b c8 77 ef b8 00  bb cd 1a 66 23 c0 75 2d  |K.+.w......f#.u-|
000000e0  66 81 fb 54 43 50 41 75  24 81 f9 02 01 72 1e 16  |f..TCPAu$....r..|
000000f0  68 07 bb 16 68 52 11 16  68 09 00 66 53 66 53 66  |h...hR..h..fSfSf|
00000100  55 16 16 16 68 b8 01 66  61 0e 07 cd 1a 33 c0 bf  |U...h..fa....3..|
00000110  0a 13 b9 f6 0c fc f3 aa  e9 fe 01 90 90 66 60 1e  |.............f`.|
00000120  06 66 a1 11 00 66 03 06  1c 00 1e 66 68 00 00 00  |.f...f.....fh...|
00000130  00 66 50 06 53 68 01 00  68 10 00 b4 42 8a 16 0e  |.fP.Sh..h...B...|
00000140  00 16 1f 8b f4 cd 13 66  59 5b 5a 66 59 66 59 1f  |.......fY[ZfYfY.|
00000150  0f 82 16 00 66 ff 06 11  00 03 16 0f 00 8e c2 ff  |....f...........|
00000160  0e 16 00 75 bc 07 1f 66  61 c3 a1 f6 01 e8 09 00  |...u...fa.......|
00000170  a1 fa 01 e8 03 00 f4 eb  fd 8b f0 ac 3c 00 74 09  |............<.t.|
00000180  b4 0e bb 07 00 cd 10 eb  f2 c3 0d 0a 45 72 72 65  |............Erre|
00000190  75 72 20 6c 65 63 74 75  72 65 20 64 69 73 71 75  |ur lecture disqu|
000001a0  65 00 0d 0a 42 4f 4f 54  4d 47 52 20 63 6f 6d 70  |e...BOOTMGR comp|
000001b0  72 65 73 73 82 00 0d 0a  43 74 72 6c 2b 41 6c 74  |ress....Ctrl+Alt|
000001c0  2b 53 75 70 70 72 20 70  6f 75 72 20 72 65 64 82  |+Suppr pour red.|
000001d0  6d 61 72 72 65 72 0d 0a  00 73 74 61 72 74 0d 0a  |marrer...start..|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 8a 01  a2 01 b6 01 00 00 55 aa  |..............U.|
00000200

=================== hexdump -n512 -C /dev/sda2
00000000  eb 58 90 4d 53 44 4f 53  35 2e 30 00 02 02 fe 19  |.X.MSDOS5.0.....|
00000010  02 00 00 00 00 f8 00 00  3f 00 ff 00 00 68 09 00  |........?....h..|
00000020  00 20 03 00 01 03 00 00  00 00 00 00 02 00 00 00  |. ..............|
00000030  01 00 06 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  80 01 29 ba fa e8 3e 4e  4f 20 4e 41 4d 45 20 20  |..)...>NO NAME  |
00000050  20 20 46 41 54 33 32 20  20 20 33 c9 8e d1 bc f4  |  FAT32   3.....|
00000060  7b 8e c1 8e d9 bd 00 7c  88 56 40 88 4e 02 8a 56  |{......|.V@.N..V|
00000070  40 b4 41 bb aa 55 cd 13  72 10 81 fb 55 aa 75 0a  |@.A..U..r...U.u.|
00000080  f6 c1 01 74 05 fe 46 02  eb 2d 8a 56 40 b4 08 cd  |...t..F..-.V@...|
00000090  13 73 05 b9 ff ff 8a f1  66 0f b6 c6 40 66 0f b6  |.s......f...@f..|
000000a0  d1 80 e2 3f f7 e2 86 cd  c0 ed 06 41 66 0f b7 c9  |...?.......Af...|
000000b0  66 f7 e1 66 89 46 f8 83  7e 16 00 75 39 83 7e 2a  |f..f.F..~..u9.~*|
000000c0  00 77 33 66 8b 46 1c 66  83 c0 0c bb 00 80 b9 01  |.w3f.F.f........|
000000d0  00 e8 2c 00 e9 a8 03 a1  f8 7d 80 c4 7c 8b f0 ac  |..,......}..|...|
000000e0  84 c0 74 17 3c ff 74 09  b4 0e bb 07 00 cd 10 eb  |..t.<.t.........|
000000f0  ee a1 fa 7d eb e4 a1 7d  80 eb df 98 cd 16 cd 19  |...}...}........|
00000100  66 60 80 7e 02 00 0f 84  20 00 66 6a 00 66 50 06  |f`.~.... .fj.fP.|
00000110  53 66 68 10 00 01 00 b4  42 8a 56 40 8b f4 cd 13  |Sfh.....B.V@....|
00000120  66 58 66 58 66 58 66 58  eb 33 66 3b 46 f8 72 03  |fXfXfXfX.3f;F.r.|
00000130  f9 eb 2a 66 33 d2 66 0f  b7 4e 18 66 f7 f1 fe c2  |..*f3.f..N.f....|
00000140  8a ca 66 8b d0 66 c1 ea  10 f7 76 1a 86 d6 8a 56  |..f..f....v....V|
00000150  40 8a e8 c0 e4 06 0a cc  b8 01 02 cd 13 66 61 0f  |@............fa.|
00000160  82 74 ff 81 c3 00 02 66  40 49 75 94 c3 42 4f 4f  |.t.....f@Iu..BOO|
00000170  54 4d 47 52 20 20 20 20  00 00 00 00 00 00 00 00  |TMGR    ........|
00000180  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001a0  00 00 00 00 00 00 00 00  00 00 00 00 0d 0a 45 72  |..............Er|
000001b0  72 2e 20 64 69 73 71 75  65 ff 0d 0a 50 72 65 73  |r. disque...Pres|
000001c0  73 65 7a 20 75 6e 65 20  74 6f 75 63 68 65 20 70  |sez une touche p|
000001d0  6f 75 72 20 72 65 64 82  6d 61 72 72 65 72 0d 0a  |our red.marrer..|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 00 00  ac 01 ba 01 00 00 55 aa  |..............U.|
00000200

=================== hexdump -n512 -C /dev/sda4
00000000  eb 52 90 4e 54 46 53 20  20 20 20 00 02 08 00 00  |.R.NTFS    .....|
00000010  00 00 00 00 00 f8 00 00  3f 00 ff 00 00 88 10 00  |........?.......|
00000020  00 00 00 00 80 00 80 00  ff 1f ad 04 00 00 00 00  |................|
00000030  00 00 0c 00 00 00 00 00  02 00 00 00 00 00 00 00  |................|
00000040  f6 00 00 00 01 00 00 00  ab 30 05 16 3e 05 16 86  |.........0..>...|
00000050  00 00 00 00 fa 33 c0 8e  d0 bc 00 7c fb 68 c0 07  |.....3.....|.h..|
00000060  1f 1e 68 66 00 cb 88 16  0e 00 66 81 3e 03 00 4e  |..hf......f.>..N|
00000070  54 46 53 75 15 b4 41 bb  aa 55 cd 13 72 0c 81 fb  |TFSu..A..U..r...|
00000080  55 aa 75 06 f7 c1 01 00  75 03 e9 dd 00 1e 83 ec  |U.u.....u.......|
00000090  18 68 1a 00 b4 48 8a 16  0e 00 8b f4 16 1f cd 13  |.h...H..........|
000000a0  9f 83 c4 18 9e 58 1f 72  e1 3b 06 0b 00 75 db a3  |.....X.r.;...u..|
000000b0  0f 00 c1 2e 0f 00 04 1e  5a 33 db b9 00 20 2b c8  |........Z3... +.|
000000c0  66 ff 06 11 00 03 16 0f  00 8e c2 ff 06 16 00 e8  |f...............|
000000d0  4b 00 2b c8 77 ef b8 00  bb cd 1a 66 23 c0 75 2d  |K.+.w......f#.u-|
000000e0  66 81 fb 54 43 50 41 75  24 81 f9 02 01 72 1e 16  |f..TCPAu$....r..|
000000f0  68 07 bb 16 68 52 11 16  68 09 00 66 53 66 53 66  |h...hR..h..fSfSf|
00000100  55 16 16 16 68 b8 01 66  61 0e 07 cd 1a 33 c0 bf  |U...h..fa....3..|
00000110  0a 13 b9 f6 0c fc f3 aa  e9 fe 01 90 90 66 60 1e  |.............f`.|
00000120  06 66 a1 11 00 66 03 06  1c 00 1e 66 68 00 00 00  |.f...f.....fh...|
00000130  00 66 50 06 53 68 01 00  68 10 00 b4 42 8a 16 0e  |.fP.Sh..h...B...|
00000140  00 16 1f 8b f4 cd 13 66  59 5b 5a 66 59 66 59 1f  |.......fY[ZfYfY.|
00000150  0f 82 16 00 66 ff 06 11  00 03 16 0f 00 8e c2 ff  |....f...........|
00000160  0e 16 00 75 bc 07 1f 66  61 c3 a1 f6 01 e8 09 00  |...u...fa.......|
00000170  a1 fa 01 e8 03 00 f4 eb  fd 8b f0 ac 3c 00 74 09  |............<.t.|
00000180  b4 0e bb 07 00 cd 10 eb  f2 c3 0d 0a 45 72 72 65  |............Erre|
00000190  75 72 20 6c 65 63 74 75  72 65 20 64 69 73 71 75  |ur lecture disqu|
000001a0  65 00 0d 0a 42 4f 4f 54  4d 47 52 20 63 6f 6d 70  |e...BOOTMGR comp|
000001b0  72 65 73 73 82 00 0d 0a  43 74 72 6c 2b 41 6c 74  |ress....Ctrl+Alt|
000001c0  2b 53 75 70 70 72 20 70  6f 75 72 20 72 65 64 82  |+Suppr pour red.|
000001d0  6d 61 72 72 65 72 0d 0a  00 73 74 61 72 74 0d 0a  |marrer...start..|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001f0  00 00 00 00 00 00 8a 01  a2 01 b6 01 00 00 55 aa  |..............U.|
00000200

=================== df -Th:

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  473M     0  473M   0% /dev
tmpfs          tmpfs      99M  6.4M   93M   7% /run
/dev/sda7      ext4       11G  4.1G  6.0G  41% /
tmpfs          tmpfs     492M  196K  492M   1% /dev/shm
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs          tmpfs     492M     0  492M   0% /sys/fs/cgroup
/dev/sda2      vfat       96M   35M   62M  36% /boot/efi
cgmfs          tmpfs     100K     0  100K   0% /run/cgmanager/fs
tmpfs          tmpfs      99M  4.0K   99M   1% /run/user/112
tmpfs          tmpfs      99M   40K   99M   1% /run/user/1000
/dev/sda1      fuseblk   300M  218M   83M  73% /mnt/boot-sav/sda1
/dev/sda4      fuseblk    38G   26G   13G  68% /mnt/boot-sav/sda4
/dev/sda5      ext4      9.1G  4.3G  4.4G  50% /mnt/boot-sav/sda5

=================== fdisk -l:
Disk /dev/ram0: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram1: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram2: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram3: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram4: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram5: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram6: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram7: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram8: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram9: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram10: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram11: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram12: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram13: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram14: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/ram15: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes




Disk /dev/sda: 60 GiB, 64424509440 bytes, 125829120 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 473666AF-D222-4098-891F-7CA5E326736D

Device         Start       End  Sectors  Size Type
/dev/sda1       2048    616447   614400  300M Windows recovery environment
/dev/sda2     616448    821247   204800  100M EFI System
/dev/sda3     821248   1083391   262144  128M Microsoft reserved
/dev/sda4    1083392  79538175 78454784 37.4G Microsoft basic data
/dev/sda5   79538176  99069425 19531250  9.3G Linux filesystem
/dev/sda6   99069952 102975487  3905536  1.9G Linux swap
/dev/sda7  102975488 125827050 22851563 10.9G Linux filesystem




=================== Suggested repair
The default repair of the Boot-Repair utility would reinstall the grub-efi-amd64-signed of sda7, using the following options:        sda2/boot/efi,
Additional repair would be performed: unhide-bootmenu-10s   fix-windows-boot use-standard-efi-file  restore-efi-backups


=================== Advice in case of suggested repair
Veuillez désactiver SecureBoot dans le BIOS. Puis réessayez.Voulez-vous continuer ?


=================== Final advice in case of suggested repair


Si votre ordinateur redémarre directement sur Windows, essayez de changer l'ordre de démarrage dans votre BIOS.
Si votre BIOS ne permet pas de changer l'ordre de démarrage, changez l'entrée de démarrage par défaut de l'amorceur Windows.
Par exemple, vous pouvez démarrer Windows, puis saisir la commande suivante dans une invite de commande en mode administrateur :
bcdedit /set {bootmgr} path \EFI\...\grub*.efi


=================== User settings
The settings chosen by the user will not act on the boot.




paste.ubuntu.com ko (), using paste.debian
paste.debian.net ko (), using paste2

Hors ligne

#95 Le 04/04/2016, à 17:23

Babdu89

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour.
@ malbo.
Tu as tester avec une iso 64 bits en mode UEFI.
Mes tests sont faits avec des iso 32 bits, sur machine Bios, sur un xenila à jour.
Bon, je ne sais pas si çà "joue" pour ce qui est indiqué dans le message d'erreur. ?.

@+.  Babdu89   .

Dernière modification par Babdu89 (Le 08/04/2016, à 16:56)


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#96 Le 08/04/2016, à 14:14

Bougron

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

malbo a écrit :

Je ne sais pas ce qu'il en est depuis une session live mais je viens de vérifier que Boot-Info fonctionne depuis une session d'un Ubuntu 16.04 installé : http://paste2.org/8gILJyL8
......

Bonjour à tous
Je ne partage pas votre optimisme. Voir cette discussion https://forum.ubuntu-fr.org/viewtopic.p … #p21492831
en complément dans mon propre micro

u1604btrfs@u1604btrfs:~$ sudo boot-info
[sudo] Mot de passe de u1604btrfs : 
Traceback (most recent call last):
  File "/usr/bin/glade2script", line 48, in <module>
    import gi
ImportError: No module named gi
u1604btrfs@u1604btrfs:~$ 
u1604btrfs@u1604btrfs:~$ 
u1604btrfs@u1604btrfs:~$ boot-info
u1604btrfs@u1604btrfs:~$ ImportError: No module named gi
):

u1604btrfs@u1604btrfs:~$ 
u1604btrfs@u1604btrfs:~$ sudo boot-info
Traceback (most recent call last):
  File "/usr/bin/glade2script", line 48, in <module>
    import gi
ImportError: No module named gi
u1604btrfs@u1604btrfs:~$ 
u1604btrfs@u1604btrfs:~$ 
u1604btrfs@u1604btrfs:~$ boot-repair
u1604btrfs@u1604btrfs:~$   File "/usr/bin/glade2script", line 48, in <module>
    import gi
ImportError: No module named gi

u1604btrfs@u1604btrfs:~$ 
u1604btrfs@u1604btrfs:~$ sudo boot-repair
Traceback (most recent call last):
  File "/usr/bin/glade2script", line 48, in <module>
    import gi
ImportError: No module named gi
u1604btrfs@u1604btrfs:~$ ^C
u1604btrfs@u1604btrfs:~$ 

A noter que si lancé sans la commande "sudo", on arrive à saisir le mot de passe et le valider  puis l'application se termine en indiquant ce petit message d'information.
===> http://ubuntuforums.org/showthread.php?t=2266101&page=2

Ajout: Certainement un bug en rapport https://bugs.debian.org/cgi-bin/bugrepo … bug=812181

Dernière modification par Bougron (Le 08/04/2016, à 17:19)

Hors ligne

#97 Le 08/04/2016, à 15:45

malbo

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

@Bougron  : dans le post #95, je suis dans une machine virtuelle (avec VMware Player) et après avoir installé Boot-Info, je lance Boot-Info depuis le tableau de bord car il est dans les applications (je ne le lance pas en ligne de commande comme toi). Je ne sais pas si ça peut avoir une importance mais je le précise.

Hors ligne

#98 Le 08/04/2016, à 17:01

Babdu89

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Bonjour.
@malbo et Bougron.

Mes tests de lancement de Boot-Info et Boot-Repair infructueux sont lancé soit depuis les menus de xenial, soit en commande.

@+.   Babdu89  .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#99 Le 08/04/2016, à 17:18

Bougron

Re : [TUTORIEL] Créer un rapport Boot-Info facilement

Certainement un bug en rapport https://bugs.debian.org/cgi-bin/bugrepo … bug=812181
Mais pour celui-ci, je n'en suis pas sûr https://sourceforge.net/p/pygobjectwin32/tickets/32/

La librairie 'Python" ne serait-elle pas au point ?

Dernière modification par Bougron (Le 08/04/2016, à 17:35)

Hors ligne