Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

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

#1 21-07-2013 10:57:24

Ulysse
Membre
Distrib. : Wheezy x64
Noyau : Linux 3.2.0-4-amd64
(G)UI : Gnome 3
Inscription : 21-07-2013

[résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Bonjour,

J'ai fait une fausse manipulation et j'ai cliqué au mauvais endroit dans l'application : "Menu principal". Et maintenant lorsque je me connecte sur ma session je n'ai plus aucune application ! Il n'y a plus rien du tout... Je vous écris ce message grâce à un autre compte utilisateur sur mon pc...
Savez-vous comment faire pour récupérer toutes ses applications ?
Ce que je faisais au moment de tout supprimer : j'avais des vieilles applications qui ne me servaient plus à rien et je cherchais à les supprimer du menu. Sauf qu'au moment où je voulais supprimer un raccourcie vers une application, j'ai en fait tout supprimer. Je n'ai plus aucun menu, je n'ai plus rien du tout...

Grâce à cette session j'ai pu chercher le nom de l'application à travers le "menu principal" c'est la commande et le programme appelé : "alacarte"
Je vais essayer de restaurer tout ça !

Me voilà à présent sur ma session par défaut. Je lance la commande Alt + F2 = alacarte. Je n'ai aucune réponse ... J'ouvre un terminal grâce à la commande alt+f2="gnome-terminal" puis je recommence dessus :

$ alacarte
Traceback (most recent call last):
  File "/usr/bin/alacarte", line 37, in <module>
    main()
  File "/usr/bin/alacarte", line 33, in main
    app = MainWindow(datadir, version)
  File "/usr/share/alacarte/Alacarte/MainWindow.py", line 43, in __init__
    self.editor = MenuEditor()
  File "/usr/share/alacarte/Alacarte/MenuEditor.py", line 33, in __init__
    self.load()
  File "/usr/share/alacarte/Alacarte/MenuEditor.py", line 47, in load
    raise ValueError("can not load menu tree %r" % (self.name,))
ValueError: can not load menu tree 'gnome-applications.menu'



J'essaie à présent "iceweasel" pour aller sur internet et vous rapporter tout cela : alt+f2="iceweasel" et ce programme là fonctionne.
Avez-vous une idée ?

Je viens de lancer le nautilus et j'ai été voir dans usr/bin/alacarte. Je l'ai ouvert avec gedit et voilà ce qu'il en ressort :

#! /usr/bin/python -OOt
# -*- python -*-
# -*- coding: utf-8 -*-
#   Alacarte Menu Editor - Simple fd.o Compliant Menu Editor
#   Copyright (C) 2006  Travis Watkins
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Library General Public
#   License as published by the Free Software Foundation; either
#   version 2 of the License, or (at your option) any later version.
#
#   This library 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
#   Library General Public License for more details.
#
#   You should have received a copy of the GNU Library General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

import sys
sys.path.insert(0,'/usr/share/alacarte')
from Alacarte.MainWindow import MainWindow

def main():
   try:
      from Alacarte import config
      datadir = config.pkgdatadir
      version = config.VERSION
   except ImportError:
      datadir = '.'
      version = '0.9'
   app = MainWindow(datadir, version)
   app.run()

if __name__ == '__main__':
   main()



Et maintenant le fichier usr/share/alacarte/alacarte/menueditor.py :

# -*- coding: utf-8 -*-
#   Alacarte Menu Editor - Simple fd.o Compliant Menu Editor
#   Copyright (C) 2006  Travis Watkins, Heinrich Wendel
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Library General Public
#   License as published by the Free Software Foundation; either
#   version 2 of the License, or (at your option) any later version.
#
#   This library 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
#   Library General Public License for more details.
#
#   You should have received a copy of the GNU Library General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

import os
import xml.dom.minidom
import xml.parsers.expat
from gi.repository import GMenu, GLib
from Alacarte import util

class MenuEditor(object):
    def __init__(self, name='applications.menu'):
        menu_prefix = os.getenv('XDG_MENU_PREFIX') or 'gnome-'
        name = menu_prefix + name
        self.name = name

        self.tree = GMenu.Tree.new(name, GMenu.TreeFlags.SHOW_EMPTY|GMenu.TreeFlags.INCLUDE_EXCLUDED|GMenu.TreeFlags.INCLUDE_NODISPLAY|GMenu.TreeFlags.SHOW_ALL_SEPARATORS|GMenu.TreeFlags.SORT_DISPLAY_NAME)
        self.tree.connect('changed', self.menuChanged)
        self.load()

        self.path = os.path.join(util.getUserMenuPath(), self.tree.props.menu_basename)
        self.loadDOM()

    def loadDOM(self):
        try:
            self.dom = xml.dom.minidom.parse(self.path)
        except (IOError, xml.parsers.expat.ExpatError), e:
            self.dom = xml.dom.minidom.parseString(util.getUserMenuXml(self.tree))
        util.removeWhitespaceNodes(self.dom)

    def load(self):
        if not self.tree.load_sync():
            raise ValueError("can not load menu tree %r" % (self.name,))

    def menuChanged(self, *a):
        self.load()

    def save(self):
        fd = open(self.path, 'w')
        fd.write(self.dom.toprettyxml())
        fd.close()

    def revert(self):
        self.revertTree(self.tree.get_root_directory())
        path = os.path.join(util.getUserMenuPath(), os.path.basename(self.tree.get_canonical_menu_path()))
        try:
            os.unlink(path)
        except OSError:
            pass

        self.loadDOM()
        self.save()

    def revertTree(self, menu):
        item_iter = menu.iter()
        item_type = item_iter.next()
        while item_type != GMenu.TreeItemType.INVALID:
            if item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
                self.revertTree(item)
            elif item_type == GMenu.TreeItemType.ENTRY:
                item = item_iter.get_entry()
                self.revertItem(item)
            item_type = item_iter.next()
        self.revertMenu(menu)

    def revertItem(self, item):
        if not self.canRevert(item):
            return
        try:
            os.remove(item.get_desktop_file_path())
        except OSError:
            pass
        self.save()

    def revertMenu(self, menu):
        if not self.canRevert(menu):
            return
        #wtf happened here? oh well, just bail
        if not menu.get_desktop_file_path():
            return
        file_id = os.path.split(menu.get_desktop_file_path())[1]
        path = os.path.join(util.getUserDirectoryPath(), file_id)
        try:
            os.remove(path)
        except OSError:
            pass
        self.save()

    def getMenus(self, parent):
        if parent is None:
            yield (self.tree.get_root_directory(), True)
            return

        item_iter = parent.iter()
        item_type = item_iter.next()
        while item_type != GMenu.TreeItemType.INVALID:
            if item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
                yield (item, self.isVisible(item))
            item_type = item_iter.next()

    def getContents(self, item):
        contents = []
        item_iter = item.iter()
        item_type = item_iter.next()

        while item_type != GMenu.TreeItemType.INVALID:
            item = None
            if item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
            elif item_type == GMenu.TreeItemType.ENTRY:
                item = item_iter.get_entry()
            elif item_type == GMenu.TreeItemType.HEADER:
                item = item_iter.get_header()
            elif item_type == GMenu.TreeItemType.ALIAS:
                item = item_iter.get_alias()
            elif item_type == GMenu.TreeItemType.SEPARATOR:
                item = item_iter.get_separator()
            if item:
                contents.append(item)
            item_type = item_iter.next()
        return contents

    def getItems(self, menu):
        item_iter = menu.iter()
        item_type = item_iter.next()
        while item_type != GMenu.TreeItemType.INVALID:
            item = None
            if item_type == GMenu.TreeItemType.ENTRY:
                item = item_iter.get_entry()
            elif item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
            elif item_type == GMenu.TreeItemType.HEADER:
                item = item_iter.get_header()
            elif item_type == GMenu.TreeItemType.ALIAS:
                item = item_iter.get_alias()
            elif item_type == GMenu.TreeItemType.SEPARATOR:
                item = item_iter.get_separator()
            yield (item, self.isVisible(item))
            item_type = item_iter.next()

    def canRevert(self, item):
        if isinstance(item, GMenu.TreeEntry):
            if util.getItemPath(item.get_desktop_file_id()) is not None:
                path = util.getUserItemPath()
                if os.path.isfile(os.path.join(path, item.get_desktop_file_id())):
                    return True
        elif isinstance(item, GMenu.TreeDirectory):
            if item.get_desktop_file_path():
                file_id = os.path.split(item.get_desktop_file_path())[1]
            else:
                file_id = item.get_menu_id() + '.directory'
            if util.getDirectoryPath(file_id) is not None:
                path = util.getUserDirectoryPath()
                if os.path.isfile(os.path.join(path, file_id)):
                    return True
        return False

    def setVisible(self, item, visible):
        dom = self.dom
        if isinstance(item, GMenu.TreeEntry):
            menu_xml = self.getXmlMenu(self.getPath(item.get_parent()), dom.documentElement, dom)
            if visible:
                self.addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Include')
                self.writeItem(item, NoDisplay=False)
            else:
                self.addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Exclude')
            self.addXmlTextElement(menu_xml, 'AppDir', util.getUserItemPath(), dom)
        elif isinstance(item, GMenu.TreeDirectory):
            item_iter = item.iter()
            first_child_type = item_iter.next()
            #don't mess with it if it's empty
            if first_child_type == GMenu.TreeItemType.INVALID:
                return
            menu_xml = self.getXmlMenu(self.getPath(item), dom.documentElement, dom)
            for node in self.getXmlNodesByName(['Deleted', 'NotDeleted'], menu_xml):
                node.parentNode.removeChild(node)
            self.writeMenu(item, NoDisplay=not visible)
            self.addXmlTextElement(menu_xml, 'DirectoryDir', util.getUserDirectoryPath(), dom)
        self.save()

    def createItem(self, parent, before, after, **kwargs):
        file_id = self.writeItem(None, **kwargs)
        self.insertExternalItem(file_id, parent.get_menu_id(), before, after)

    def insertExternalItem(self, file_id, parent_id, before=None, after=None):
        parent = self.findMenu(parent_id)
        dom = self.dom
        self.addItem(parent, file_id, dom)
        self.positionItem(parent, ('Item', file_id), before, after)
        self.save()

    def insertExternalMenu(self, file_id, parent_id, before=None, after=None):
        menu_id = file_id.rsplit('.', 1)[0]
        parent = self.findMenu(parent_id)
        dom = self.dom
        self.addXmlDefaultLayout(self.getXmlMenu(self.getPath(parent), dom.documentElement, dom) , dom)
        menu_xml = self.getXmlMenu(self.getPath(parent) + [menu_id], dom.documentElement, dom)
        self.addXmlTextElement(menu_xml, 'Directory', file_id, dom)
        self.positionItem(parent, ('Menu', menu_id), before, after)
        self.save()

    def createSeparator(self, parent, before=None, after=None):
        self.positionItem(parent, ('Separator',), before, after)
        self.save()

    def editItem(self, item, icon, name, comment, command, use_term, parent=None, final=True):
        #if nothing changed don't make a user copy
        app_info = item.get_app_info()
        if icon == app_info.get_icon() and name == app_info.get_display_name() and comment == item.get_comment() and command == item.get_exec() and use_term == item.get_launch_in_terminal():
            return
        #hack, item.get_parent() seems to fail a lot
        if not parent:
            parent = item.get_parent()
        self.writeItem(item, Icon=icon, Name=name, Comment=comment, Exec=command, Terminal=use_term)
        if final:
            dom = self.dom
            menu_xml = self.getXmlMenu(self.getPath(parent), dom.documentElement, dom)
            self.addXmlTextElement(menu_xml, 'AppDir', util.getUserItemPath(), dom)
        self.save()

    def editMenu(self, menu, icon, name, comment, final=True):
        #if nothing changed don't make a user copy
        if icon == menu.get_icon() and name == menu.get_name() and comment == menu.get_comment():
            return
        #we don't use this, we just need to make sure the <Menu> exists
        #otherwise changes won't show up
        dom = self.dom
        menu_xml = self.getXmlMenu(self.getPath(menu), dom.documentElement, dom)
        self.writeMenu(menu, Icon=icon, Name=name, Comment=comment)
        if final:
            self.addXmlTextElement(menu_xml, 'DirectoryDir', util.getUserDirectoryPath(), dom)
        self.save()

    def copyItem(self, item, new_parent, before=None, after=None):
        dom = self.dom
        file_path = item.get_desktop_file_path()
        keyfile = GLib.KeyFile()
        keyfile.load_from_file(file_path, util.KEY_FILE_FLAGS)

        util.fillKeyFile(keyfile, dict(Categories=[], Hidden=False))

        app_info = item.get_app_info()
        file_id = util.getUniqueFileId(app_info.get_name().replace(os.sep, '-'), '.desktop')
        out_path = os.path.join(util.getUserItemPath(), file_id)

        contents, length = keyfile.to_data()

        f = open(out_path, 'w')
        f.write(contents)
        f.close()

        self.addItem(new_parent, file_id, dom)
        self.positionItem(new_parent, ('Item', file_id), before, after)
        self.save()
        return file_id

    def deleteItem(self, item):
        self.writeItem(item, Hidden=True)
        self.save()

    def deleteMenu(self, menu):
        dom = self.dom
        menu_xml = self.getXmlMenu(self.getPath(menu), dom.documentElement, dom)
        self.addDeleted(menu_xml, dom)
        self.save()

    def deleteSeparator(self, item):
        parent = item.get_parent()
        contents = self.getContents(parent)
        contents.remove(item)
        layout = self.createLayout(contents)
        dom = self.dom
        menu_xml = self.getXmlMenu(self.getPath(parent), dom.documentElement, dom)
        self.addXmlLayout(menu_xml, layout, dom)
        self.save()

    def findMenu(self, menu_id, parent=None):
        if parent is None:
            parent = self.tree.get_root_directory()

        if menu_id == parent.get_menu_id():
            return parent

        item_iter = parent.iter()
        item_type = item_iter.next()
        while item_type != GMenu.TreeItemType.INVALID:
            if item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
                if item.get_menu_id() == menu_id:
                    return item
                menu = self.findMenu(menu_id, item)
                if menu is not None:
                    return menu
            item_type = item_iter.next()

    def isVisible(self, item):
        if isinstance(item, GMenu.TreeEntry):
            app_info = item.get_app_info()
            return not (item.get_is_excluded() or app_info.get_nodisplay())
        elif isinstance(item, GMenu.TreeDirectory):
            return not item.get_is_nodisplay()
        return True

    def getPath(self, menu):
        names = []
        current = menu
        while current is not None:
            names.append(current.get_menu_id())
            current = current.get_parent()

        # XXX - don't append root menu name, alacarte doesn't
        # expect it. look into this more.
        names.pop(-1)
        return names[::-1]

    def getXmlMenuPart(self, element, name):
        for node in self.getXmlNodesByName('Menu', element):
            for child in self.getXmlNodesByName('Name', node):
                if child.childNodes[0].nodeValue == name:
                    return node
        return None

    def getXmlMenu(self, path, element, dom):
        for name in path:
            found = self.getXmlMenuPart(element, name)
            if found is not None:
                element = found
            else:
                element = self.addXmlMenuElement(element, name, dom)
        return element

    def addXmlMenuElement(self, element, name, dom):
        node = dom.createElement('Menu')
        self.addXmlTextElement(node, 'Name', name, dom)
        return element.appendChild(node)

    def addXmlTextElement(self, element, name, text, dom):
        for temp in element.childNodes:
            if temp.nodeName == name:
                if temp.childNodes[0].nodeValue == text:
                    return
        node = dom.createElement(name)
        text = dom.createTextNode(text)
        node.appendChild(text)
        return element.appendChild(node)

    def addXmlFilename(self, element, dom, filename, type = 'Include'):
        # remove old filenames
        for node in self.getXmlNodesByName(['Include', 'Exclude'], element):
            if node.childNodes[0].nodeName == 'Filename' and node.childNodes[0].childNodes[0].nodeValue == filename:
                element.removeChild(node)

        # add new filename
        node = dom.createElement(type)
        node.appendChild(self.addXmlTextElement(node, 'Filename', filename, dom))
        return element.appendChild(node)

    def addDeleted(self, element, dom):
        node = dom.createElement('Deleted')
        return element.appendChild(node)

    def makeKeyFile(self, file_path, kwargs):
        if 'KeyFile' in kwargs:
            return kwargs['KeyFile']

        keyfile = GLib.KeyFile()

        if file_path is not None:
            keyfile.load_from_file(file_path, util.KEY_FILE_FLAGS)

        util.fillKeyFile(keyfile, kwargs)
        return keyfile

    def writeItem(self, item, **kwargs):
        if item is not None:
            file_path = item.get_desktop_file_path()
        else:
            file_path = None

        keyfile = self.makeKeyFile(file_path, kwargs)

        if item is not None:
            file_id = item.get_desktop_file_id()
        else:
            file_id = util.getUniqueFileId(keyfile.get_string(GLib.KEY_FILE_DESKTOP_GROUP, 'Name'), '.desktop')

        contents, length = keyfile.to_data()

        f = open(os.path.join(util.getUserItemPath(), file_id), 'w')
        f.write(contents)
        f.close()
        return file_id

    def writeMenu(self, menu, **kwargs):
        if menu is not None:
            file_id = os.path.split(menu.get_desktop_file_path())[1]
            file_path = menu.get_desktop_file_path()
            keyfile = GLib.KeyFile()
            keyfile.load_from_file(file_path, util.KEY_FILE_FLAGS)
        elif menu is None and 'Name' not in kwargs:
            raise Exception('New menus need a name')
        else:
            file_id = util.getUniqueFileId(kwargs['Name'], '.directory')
            keyfile = GLib.KeyFile()

        util.fillKeyFile(keyfile, kwargs)

        contents, length = keyfile.to_data()

        f = open(os.path.join(util.getUserDirectoryPath(), file_id), 'w')
        f.write(contents)
        f.close()
        return file_id

    def getXmlNodesByName(self, name, element):
        for child in element.childNodes:
            if child.nodeType == xml.dom.Node.ELEMENT_NODE:
                if isinstance(name, str) and child.nodeName == name:
                    yield child
                elif isinstance(name, list) or isinstance(name, tuple):
                    if child.nodeName in name:
                        yield child

    def addXmlMove(self, element, old, new, dom):
        if not self.undoMoves(element, old, new, dom):
            node = dom.createElement('Move')
            node.appendChild(self.addXmlTextElement(node, 'Old', old, dom))
            node.appendChild(self.addXmlTextElement(node, 'New', new, dom))
            #are parsed in reverse order, need to put at the beginning
            return element.insertBefore(node, element.firstChild)

    def addXmlLayout(self, element, layout, dom):
        # remove old layout
        for node in self.getXmlNodesByName('Layout', element):
            element.removeChild(node)

        # add new layout
        node = dom.createElement('Layout')
        for order in layout:
            if order[0] == 'Separator':
                child = dom.createElement('Separator')
                node.appendChild(child)
            elif order[0] == 'Filename':
                child = self.addXmlTextElement(node, 'Filename', order[1], dom)
            elif order[0] == 'Menuname':
                child = self.addXmlTextElement(node, 'Menuname', order[1], dom)
            elif order[0] == 'Merge':
                child = dom.createElement('Merge')
                child.setAttribute('type', order[1])
                node.appendChild(child)
        return element.appendChild(node)

    def addXmlDefaultLayout(self, element, dom):
        # remove old default layout
        for node in self.getXmlNodesByName('DefaultLayout', element):
            element.removeChild(node)

        # add new layout
        node = dom.createElement('DefaultLayout')
        node.setAttribute('inline', 'false')
        return element.appendChild(node)

    def createLayout(self, items):
        layout = []
        layout.append(('Merge', 'menus'))
        for item in items:
            if isinstance(item, GMenu.TreeDirectory):
                layout.append(('Menuname', item.get_menu_id()))
            elif isinstance(item, GMenu.TreeEntry):
                layout.append(('Filename', item.get_desktop_file_id()))
            elif isinstance(item, GMenu.TreeSeparator):
                layout.append(('Separator',))
            else:
                layout.append(item)
        layout.append(('Merge', 'files'))
        return layout

    def addItem(self, parent, file_id, dom):
        xml_parent = self.getXmlMenu(self.getPath(parent), dom.documentElement, dom)
        self.addXmlFilename(xml_parent, dom, file_id, 'Include')

    def moveItem(self, parent, item, before=None, after=None):
        self.positionItem(parent, item, before=before, after=after)
        self.save()

    def positionItem(self, parent, item, before=None, after=None):
        contents = self.getContents(parent)
        if after:
            index = contents.index(after) + 1
        elif before:
            index = contents.index(before)
        else:
            # append the item to the list
            index = len(contents)
        #if this is a move to a new parent you can't remove the item
        if item in contents:
            # decrease the destination index, if we shorten the list
            if (before and (contents.index(item) < index)) \
                    or (after and (contents.index(item) < index - 1)):
                index -= 1
            contents.remove(item)
        contents.insert(index, item)
        layout = self.createLayout(contents)
        dom = self.dom
        menu_xml = self.getXmlMenu(self.getPath(parent), dom.documentElement, dom)
        self.addXmlLayout(menu_xml, layout, dom)

    def undoMoves(self, element, old, new, dom):
        nodes = []
        matches = []
        original_old = old
        final_old = old
        #get all <Move> elements
        for node in self.getXmlNodesByName(['Move'], element):
            nodes.insert(0, node)
        #if the <New> matches our old parent we've found a stage to undo
        for node in nodes:
            xml_old = node.getElementsByTagName('Old')[0]
            xml_new = node.getElementsByTagName('New')[0]
            if xml_new.childNodes[0].nodeValue == old:
                matches.append(node)
                #we should end up with this path when completed
                final_old = xml_old.childNodes[0].nodeValue
        #undoing <Move>s
        for node in matches:
            element.removeChild(node)
        if len(matches) > 0:
            for node in nodes:
                xml_old = node.getElementsByTagName('Old')[0]
                xml_new = node.getElementsByTagName('New')[0]
                path = os.path.split(xml_new.childNodes[0].nodeValue)
                if path[0] == original_old:
                    element.removeChild(node)
                    for node in dom.getElementsByTagName('Menu'):
                        name_node = node.getElementsByTagName('Name')[0]
                        name = name_node.childNodes[0].nodeValue
                        if name == os.path.split(new)[1]:
                            #copy app and dir directory info from old <Menu>
                            root_path = dom.getElementsByTagName('Menu')[0].getElementsByTagName('Name')[0].childNodes[0].nodeValue
                            xml_menu = self.getXmlMenu(root_path + '/' + new, dom.documentElement, dom)
                            for app_dir in node.getElementsByTagName('AppDir'):
                                xml_menu.appendChild(app_dir)
                            for dir_dir in node.getElementsByTagName('DirectoryDir'):
                                xml_menu.appendChild(dir_dir)
                            parent = node.parentNode
                            parent.removeChild(node)
                    node = dom.createElement('Move')
                    node.appendChild(self.addXmlTextElement(node, 'Old', xml_old.childNodes[0].nodeValue, dom))
                    node.appendChild(self.addXmlTextElement(node, 'New', os.path.join(new, path[1]), dom))
                    element.appendChild(node)
            if final_old == new:
                return True
            node = dom.createElement('Move')
            node.appendChild(self.addXmlTextElement(node, 'Old', final_old, dom))
            node.appendChild(self.addXmlTextElement(node, 'New', new, dom))
            return element.appendChild(node)



Je vous remerci bien !

Dernière modification par Ulysse (26-07-2013 19:17:04)


Ulysse

Hors ligne

#2 21-07-2013 18:36:44

bract
Modérateur
Lieu : Pays du kiwi
Distrib. : wheezy
Noyau : 3.2.0-3 amd64
(G)UI : gnome 3.4.2 + lxde(eeepc)
Inscription : 05-02-2011

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Bonjour ulisse,
mes fichiers sont identiques aux tiens roll
as-tu essayé de réinstaller alacarte?

L'asso est lancée. cool
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]

Hors ligne

#3 22-07-2013 14:39:33

Ulysse
Membre
Distrib. : Wheezy x64
Noyau : Linux 3.2.0-4-amd64
(G)UI : Gnome 3
Inscription : 21-07-2013

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Bonjour bract
Justement je l'ai fait ! J'ai fait :

$ su
# apt-get remove alacarte


Il voulait aussi supprimer le paquet gnome j'ai répondu oui
puis j'ai fait

$ sur
# apt-get install alacarte gnome


voilà ! Et j'en suis au même point...
Rassure moi que je n'ai pas besoin de réinstaller tout le système >< Ou sinon on ne peut pas revenir à une configuration connu comme dans windows ?


Ulysse

Hors ligne

#4 22-07-2013 17:16:04

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 4.6.0-0.bpo.1-amd64
(G)UI : gnome 3.14.1
Inscription : 21-10-2008

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Ulysse,

gnome n'est pas un paquet mais un metapaquet, c'est à dire que c'est un ensemble de paquets regroupés avec leurs dépendances.
Voir le tuto ici :
aptitude et la gestion des metapaquets avec leurs dépendances. C'est l'meilleur !

"Définition d'eric besson : S'il fallait en chier des tonnes pour devenir ministre, il aurait 2 trous du cul." - JP Douillon
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

En ligne

#5 22-07-2013 17:55:36

bract
Modérateur
Lieu : Pays du kiwi
Distrib. : wheezy
Noyau : 3.2.0-3 amd64
(G)UI : gnome 3.4.2 + lxde(eeepc)
Inscription : 05-02-2011

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Bonjour,
je te propose plutôt de faire:

 aptitude purge --purge-unused alacarte


mais regarde bien les recommendation du tuto
http://debian-facile.org/doc:systeme:ap … n_complete

et ensuite

aptitude install alacarte



a+

bract


L'asso est lancée. cool
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]

Hors ligne

#6 22-07-2013 19:15:11

Ulysse
Membre
Distrib. : Wheezy x64
Noyau : Linux 3.2.0-4-amd64
(G)UI : Gnome 3
Inscription : 21-07-2013

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

adrien@Adrien:~$ su
Mot de passe :
root@Adrien:/home/adrien# aptitude purge --purge-unused alacarte
Les paquets suivants seront ENLEVÉS :        
  alacarte{p}
0 paquets mis à jour, 0 nouvellement installés, 1 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 0 o d'archives. Après dépaquetage, 293 ko seront libérés.
Les paquets suivants ont des dépendances non satisfaites :
 gnome : Dépend: alacarte (>= 0.13.4) mais il ne sera pas installé.
Les actions suivantes permettront de résoudre ces dépendances :

     Supprimer les paquets suivants :                  
1)     gnome                                            

     Laisser les dépendances suivantes non satisfaites :
2)     gnome-panel recommande alacarte                  
3)     task-gnome-desktop recommande gnome              


Accepter cette solution ? [Y/n/q/?] Y
Les paquets suivants seront ENLEVÉS :
  alacarte{p} gnome{a}
0 paquets mis à jour, 0 nouvellement installés, 2 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 0 o d'archives. Après dépaquetage, 346 ko seront libérés.
Voulez-vous continuer ? [Y/n/?] Y
(Lecture de la base de données... 140433 fichiers et répertoires déjà installés.)
Suppression de gnome ...
(Lecture de la base de données... 140427 fichiers et répertoires déjà installés.)
Suppression de alacarte ...
Traitement des actions différées (« triggers ») pour « hicolor-icon-theme »...
Traitement des actions différées (« triggers ») pour « desktop-file-utils »...
Traitement des actions différées (« triggers ») pour « gnome-menus »...
Traitement des actions différées (« triggers ») pour « man-db »...
root@Adrien:/home/adrien# aptitude install alacarte
Les NOUVEAUX paquets suivants vont être installés :
  alacarte
0 paquets mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 0 o/105 ko d'archives. Après dépaquetage, 293 ko seront utilisés.
Sélection du paquet alacarte précédemment désélectionné.
(Lecture de la base de données... 140304 fichiers et répertoires déjà installés.)
Dépaquetage de alacarte (à partir de .../alacarte_3.5.3-1_all.deb) ...
Traitement des actions différées (« triggers ») pour « man-db »...
Traitement des actions différées (« triggers ») pour « desktop-file-utils »...
Traitement des actions différées (« triggers ») pour « gnome-menus »...
Traitement des actions différées (« triggers ») pour « hicolor-icon-theme »...
Paramétrage de alacarte (3.5.3-1) ...

 



Je redémarre le PC et je vous dit ce qu'il en ait !

Ça ne fonctionne pas, mais je pense avoir une petite idée qui pourrait faire avancer les choses !
Lorsque je suis dans mon terminal en root je peux démarrer alacarte. Mais quand je suis sur ma session je ne peux pas ! En faite lorsque je désinstalle alacarte en root c'est le programme et configuration du root qui sont changés je crois ! Alors il faut pouvoir arriver à le désinstaller puis l'installer depuis ma session donc en "$" et pas en "#". Voilà l'erreur que j'ai (qui est normale) lorsque j'essaie en "$" :


adrien@Adrien:~$ aptitude purge --purge-unused alacarte
E: Impossible d'ouvrir le fichier verrou /var/lib/dpkg/lock - open (13: Permission non accordée)
E: Impossible de verrouiller le répertoire d'administration (/var/lib/dpkg/). Avez-vous les privilèges du superutilisateur ?
 

Dernière modification par Ulysse (22-07-2013 19:20:37)


Ulysse

Hors ligne

#7 22-07-2013 20:32:02

bract
Modérateur
Lieu : Pays du kiwi
Distrib. : wheezy
Noyau : 3.2.0-3 amd64
(G)UI : gnome 3.4.2 + lxde(eeepc)
Inscription : 05-02-2011

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

En fait, tu ne peux gérer tes applications qu'en étant "superutilisateur"
http://debian-facile.org/doc:systeme:superutilisateur

cependant, comme tu arrives a ouvrir alacarte en root, as-tu essayé le bouton "rétablir" en bas à droite de la fenêtre?

L'asso est lancée. cool
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]

Hors ligne

#8 22-07-2013 21:34:10

Ulysse
Membre
Distrib. : Wheezy x64
Noyau : Linux 3.2.0-4-amd64
(G)UI : Gnome 3
Inscription : 21-07-2013

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Je viens de le faire, il ne s'est rien passé sad
Est-ce que tu crois que je dois réinstaller ma debian ? Ou est-ce que je peux créer en super utilisateur un autre compte utilisateur "normal" et ensuite d'une session A d'origine basculer tout vers la session B ? Ou alors peut-on réinitialiser une session ?
On peut essayer de comparer nos fichiers ?

adrien@Adrien:~$ alacarte
Traceback (most recent call last):
  File "/usr/bin/alacarte", line 37, in <module>
    main()
  File "/usr/bin/alacarte", line 33, in main
    app = MainWindow(datadir, version)
  File "/usr/share/alacarte/Alacarte/MainWindow.py", line 43, in __init__
    self.editor = MenuEditor()
  File "/usr/share/alacarte/Alacarte/MenuEditor.py", line 33, in __init__
    self.load()
  File "/usr/share/alacarte/Alacarte/MenuEditor.py", line 47, in load
    raise ValueError("can not load menu tree %r" % (self.name,))
ValueError: can not load menu tree 'gnome-applications.menu'


"usr/bin/alacarte a écrit :


#! /usr/bin/python -OOt
# -*- python -*-
# -*- coding: utf-8 -*-
#   Alacarte Menu Editor - Simple fd.o Compliant Menu Editor
#   Copyright (C) 2006  Travis Watkins
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Library General Public
#   License as published by the Free Software Foundation; either
#   version 2 of the License, or (at your option) any later version.
#
#   This library 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
#   Library General Public License for more details.
#
#   You should have received a copy of the GNU Library General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

import sys
sys.path.insert(0,'/usr/share/alacarte')
from Alacarte.MainWindow import MainWindow

def main():
    try:
        from Alacarte import config
        datadir = config.pkgdatadir
        version = config.VERSION
    except ImportError:
        datadir = '.'
        version = '0.9'
    app = MainWindow(datadir, version)
    app.run()

if __name__ == '__main__':
    main()


"usr/share/alacarte/alacarte/Mainwindow.py a écrit :

# -*- coding: utf-8 -*-
# vim: set noexpandtab:
#   Alacarte Menu Editor - Simple fd.o Compliant Menu Editor
#   Copyright (C) 2006  Travis Watkins
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Library General Public
#   License as published by the Free Software Foundation; either
#   version 2 of the License, or (at your option) any later version.
#
#   This library 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
#   Library General Public License for more details.
#
#   You should have received a copy of the GNU Library General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

from gi.repository import Gtk, GObject, Gio, GdkPixbuf, Gdk, GMenu, GLib
import cgi
import os
import gettext, locale
import subprocess

from Alacarte import config
gettext.bindtextdomain(config.GETTEXT_PACKAGE, config.localedir)
gettext.textdomain(config.GETTEXT_PACKAGE)
locale.bind_textdomain_codeset(config.GETTEXT_PACKAGE,'UTF-8')

_ = gettext.gettext
from Alacarte.MenuEditor import MenuEditor
from Alacarte import util

class MainWindow(object):
    timer = None
    #hack to make editing menu properties work
    edit_pool = []

    def __init__(self, datadir, version):
        self.file_path = datadir
        self.version = version
        self.editor = MenuEditor()
        self.editor.tree.connect("changed", self.menuChanged)
        Gtk.Window.set_default_icon_name('alacarte')
        self.tree = Gtk.Builder()
        self.tree.set_translation_domain(config.GETTEXT_PACKAGE)
        self.tree.add_from_file(os.path.join(self.file_path, 'alacarte.ui'))
        self.tree.connect_signals(self)
        self.setupMenuTree()
        self.setupItemTree()
        self.tree.get_object('edit_delete').set_sensitive(False)
        self.tree.get_object('edit_revert_to_original').set_sensitive(False)
        self.tree.get_object('edit_properties').set_sensitive(False)
        self.tree.get_object('move_up_button').set_sensitive(False)
        self.tree.get_object('move_down_button').set_sensitive(False)
        self.tree.get_object('new_separator_button').set_sensitive(False)
        accelgroup = Gtk.AccelGroup()
        keyval, modifier = Gtk.accelerator_parse('F1')
        accelgroup.connect(keyval, modifier, Gtk.AccelFlags.VISIBLE, self.on_help_button_clicked)
        self.tree.get_object('mainwindow').add_accel_group(accelgroup)

    def run(self):
        self.loadMenus()
        self.tree.get_object('mainwindow').show_all()
        Gtk.main()

    def menuChanged(self, *a):
        self.loadUpdates()

    def loadUpdates(self):
        menu_tree = self.tree.get_object('menu_tree')
        item_tree = self.tree.get_object('item_tree')
        items, iter = item_tree.get_selection().get_selected()
        update_items = False
        update_type = None
        item_id = None
        if iter:
            update_items = True
            if isinstance(items[iter][3], GMenu.TreeEntry):
                item_id = items[iter][3].get_desktop_file_id()
                update_type = GMenu.TreeItemType.ENTRY
            elif isinstance(items[iter][3], GMenu.TreeDirectory):
                item_id = os.path.split(items[iter][3].get_desktop_file_path())[1]
                update_type = GMenu.TreeItemType.DIRECTORY
            elif isinstance(items[iter][3], GMenu.TreeSeparator):
                item_id = items.get_path(iter)
                update_type = GMenu.TreeItemType.SEPARATOR
        menus, iter = menu_tree.get_selection().get_selected()
        update_menus = False
        menu_id = None
        if iter:
            if menus[iter][2].get_desktop_file_path():
                menu_id = os.path.split(menus[iter][2].get_desktop_file_path())[1]
            else:
                menu_id = menus[iter][2].get_menu_id()
            update_menus = True
        self.loadMenus()
        #find current menu in new tree
        if update_menus:
            menu_tree.get_model().foreach(self.findMenu, menu_id)
            menus, iter = menu_tree.get_selection().get_selected()
            if iter:
                self.on_menu_tree_cursor_changed(menu_tree)
        #find current item in new list
        if update_items:
            i = 0
            for item in item_tree.get_model():
                found = False
                if update_type != GMenu.TreeItemType.SEPARATOR:
                    if isinstance (item[3], GMenu.TreeEntry) and item[3].get_desktop_file_id() == item_id:
                        found = True
                    if isinstance (item[3], GMenu.TreeDirectory) and item[3].get_desktop_file_path() and update_type == GMenu.TreeItemType.DIRECTORY:
                        if os.path.split(item[3].get_desktop_file_path())[1] == item_id:
                            found = True
                if isinstance(item[3], GMenu.TreeSeparator):
                    if not isinstance(item_id, tuple):
                        #we may not skip the increment via "continue"
                        i += 1
                        continue
                    #separators have no id, have to find them manually
                    #probably won't work with two separators together
                    if (item_id[0] - 1,) == (i,):
                        found = True
                    elif (item_id[0] + 1,) == (i,):
                        found = True
                    elif (item_id[0],) == (i,):
                        found = True
                if found:
                    item_tree.get_selection().select_path((i,))
                    self.on_item_tree_cursor_changed(item_tree)
                    break
                i += 1
        return False

    def findMenu(self, menus, path, iter, menu_id):
        if not menus[path][2].get_desktop_file_path():
            if menu_id == menus[path][2].get_menu_id():
                menu_tree = self.tree.get_object('menu_tree')
                menu_tree.expand_to_path(path)
                menu_tree.get_selection().select_path(path)
                return True
            return False
        if os.path.split(menus[path][2].get_desktop_file_path())[1] == menu_id:
            menu_tree = self.tree.get_object('menu_tree')
            menu_tree.expand_to_path(path)
            menu_tree.get_selection().select_path(path)
            return True

    def setupMenuTree(self):
        self.menu_store = Gtk.TreeStore(GdkPixbuf.Pixbuf, str, object)
        menus = self.tree.get_object('menu_tree')
        column = Gtk.TreeViewColumn(_('Name'))
        column.set_spacing(4)
        cell = Gtk.CellRendererPixbuf()
        column.pack_start(cell, False)
        column.add_attribute(cell, 'pixbuf', 0)
        cell = Gtk.CellRendererText()
        column.pack_start(cell, True)
        column.add_attribute(cell, 'markup', 1)
        menus.append_column(column)
        menus.get_selection().set_mode(Gtk.SelectionMode.BROWSE)

    def setupItemTree(self):
        items = self.tree.get_object('item_tree')
        column = Gtk.TreeViewColumn(_('Show'))
        cell = Gtk.CellRendererToggle()
        cell.connect('toggled', self.on_item_tree_show_toggled)
        column.pack_start(cell, True)
        column.add_attribute(cell, 'active', 0)
        #hide toggle for separators
        column.set_cell_data_func(cell, self._cell_data_toggle_func)
        items.append_column(column)
        column = Gtk.TreeViewColumn(_('Item'))
        column.set_spacing(4)
        cell = Gtk.CellRendererPixbuf()
        column.pack_start(cell, False)
        column.add_attribute(cell, 'pixbuf', 1)
        cell = Gtk.CellRendererText()
        column.pack_start(cell, True)
        column.add_attribute(cell, 'markup', 2)
        items.append_column(column)
        self.item_store = Gtk.ListStore(bool, GdkPixbuf.Pixbuf, str, object)
        items.set_model(self.item_store)

    def _cell_data_toggle_func(self, tree_column, renderer, model, treeiter, data=None):
        if isinstance(model[treeiter][3], GMenu.TreeSeparator):
            renderer.set_property('visible', False)
        else:
            renderer.set_property('visible', True)

    def loadMenus(self):
        self.menu_store.clear()
        self.loadMenu({ None: None })

        menu_tree = self.tree.get_object('menu_tree')
        menu_tree.set_model(self.menu_store)
        for menu in self.menu_store:
            menu_tree.expand_to_path(menu.path)
        menu_tree.get_selection().select_path((0,))
        self.on_menu_tree_cursor_changed(menu_tree)

    def loadMenu(self, iters, parent=None):
        for menu, show in self.editor.getMenus(parent):
            name = cgi.escape(menu.get_name())
            if not show:
                name = "<small><i>%s</i></small>" % (name,)

            icon = util.getIcon(menu)
            iters[menu] = self.menu_store.append(iters[parent], (icon, name, menu))
            self.loadMenu(iters, menu)

    def loadItems(self, menu, menu_path):
        self.item_store.clear()
        for item, show in self.editor.getItems(menu):
            icon = util.getIcon(item)
            if isinstance(item, GMenu.TreeDirectory):
                name = item.get_name()
            elif isinstance(item, GMenu.TreeEntry):
                name = item.get_app_info().get_display_name()
            elif isinstance(item, GMenu.TreeSeparator):
                name = '---'
            else:
                assert False, 'should not be reached'

            name = cgi.escape(name)
            if not show:
                name = "<small><i>%s</i></small>" % (name,)

            self.item_store.append((show, icon, name, item))

    #this is a little timeout callback to insert new items after
    #gnome-desktop-item-edit has finished running
    def waitForNewItemProcess(self, process, parent_id, file_path):
        if process.poll() is not None:
            if os.path.isfile(file_path):
                self.editor.insertExternalItem(os.path.split(file_path)[1], parent_id)
            return False
        return True

    def waitForNewMenuProcess(self, process, parent_id, file_path):
        if process.poll() is not None:
            if os.path.isfile(file_path):
                self.editor.insertExternalMenu(os.path.split(file_path)[1], parent_id)
            return False
        return True

    #this callback keeps you from editing the same item twice
    def waitForEditProcess(self, process, file_path):
        if process.poll() is not None:
            self.edit_pool.remove(file_path)
            return False
        return True

    def on_new_menu_button_clicked(self, button):
        menu_tree = self.tree.get_object('menu_tree')
        menus, iter = menu_tree.get_selection().get_selected()
        if not iter:
            parent = menus[(0,)][2]
            menu_tree.expand_to_path((0,))
            menu_tree.get_selection().select_path((0,))
        else:
            parent = menus[iter][2]
        file_path = os.path.join(util.getUserDirectoryPath(), util.getUniqueFileId('alacarte-made', '.directory'))
        process = subprocess.Popen(['gnome-desktop-item-edit', file_path], env=os.environ)
        GObject.timeout_add(100, self.waitForNewMenuProcess, process, parent.get_menu_id(), file_path)

    def on_new_item_button_clicked(self, button):
        menu_tree = self.tree.get_object('menu_tree')
        menus, iter = menu_tree.get_selection().get_selected()
        if not iter:
            parent = menus[(0,)][2]
            menu_tree.expand_to_path((0,))
            menu_tree.get_selection().select_path((0,))
        else:
            parent = menus[iter][2]
        file_path = os.path.join(util.getUserItemPath(), util.getUniqueFileId('alacarte-made', '.desktop'))
        process = subprocess.Popen(['gnome-desktop-item-edit', file_path], env=os.environ)
        GObject.timeout_add(100, self.waitForNewItemProcess, process, parent.get_menu_id(), file_path)

    def on_new_separator_button_clicked(self, button):
        item_tree = self.tree.get_object('item_tree')
        items, iter = item_tree.get_selection().get_selected()
        if not iter:
            return
        else:
            after = items[iter][3]
            menu_tree = self.tree.get_object('menu_tree')
            menus, iter = menu_tree.get_selection().get_selected()
            parent = menus[iter][2]
            self.editor.createSeparator(parent, after=after)

    def on_edit_delete_activate(self, menu):
        item_tree = self.tree.get_object('item_tree')
        items, iter = item_tree.get_selection().get_selected()
        if not iter:
            return
        item = items[iter][3]
        if isinstance(item, GMenu.TreeEntry):
            self.editor.deleteItem(item)
        elif isinstance(item, GMenu.TreeDirectory):
            self.editor.deleteMenu(item)
        elif isinstance(item, GMenu.TreeSeparator):
            self.editor.deleteSeparator(item)

    def on_edit_revert_to_original_activate(self, menu):
        item_tree = self.tree.get_object('item_tree')
        items, iter = item_tree.get_selection().get_selected()
        if not iter:
            return
        item = items[iter][3]
        if isinstance(item, GMenu.TreeEntry):
            self.editor.revertItem(item)
        elif isinstance(item, GMenu.TreeDirectory):
            self.editor.revertMenu(item)

    def on_edit_properties_activate(self, menu):
        item_tree = self.tree.get_object('item_tree')
        items, iter = item_tree.get_selection().get_selected()
        if not iter:
            return
        item = items[iter][3]
        if not isinstance(item, GMenu.TreeEntry) and not isinstance(item, GMenu.TreeDirectory):
            return

        if isinstance(item, GMenu.TreeEntry):
            file_path = os.path.join(util.getUserItemPath(), item.get_desktop_file_id())
            file_type = 'Item'
        elif isinstance(item, GMenu.TreeDirectory):
            file_path = os.path.join(util.getUserDirectoryPath(), os.path.split(item.get_desktop_file_path())[1])
            file_type = 'Menu'

        if not os.path.isfile(file_path):
            data = open(item.get_desktop_file_path()).read()
            open(file_path, 'w').write(data)

        if file_path not in self.edit_pool:
            self.edit_pool.append(file_path)
            process = subprocess.Popen(['gnome-desktop-item-edit', file_path], env=os.environ)
            GObject.timeout_add(100, self.waitForEditProcess, process, file_path)

    def on_menu_tree_cursor_changed(self, treeview):
        selection = treeview.get_selection()
        if selection is None:
            return
        menus, iter = selection.get_selected()
        if iter is None:
            return
        menu_path = menus.get_path(iter)
        item_tree = self.tree.get_object('item_tree')
        item_tree.get_selection().unselect_all()
        self.loadItems(self.menu_store[menu_path][2], menu_path)
        self.tree.get_object('edit_delete').set_sensitive(False)
        self.tree.get_object('edit_revert_to_original').set_sensitive(False)
        self.tree.get_object('edit_properties').set_sensitive(False)
        self.tree.get_object('move_up_button').set_sensitive(False)
        self.tree.get_object('move_down_button').set_sensitive(False)
        self.tree.get_object('new_separator_button').set_sensitive(False)
        self.tree.get_object('properties_button').set_sensitive(False)
        self.tree.get_object('delete_button').set_sensitive(False)

    def on_item_tree_show_toggled(self, cell, path):
        item = self.item_store[path][3]
        if isinstance(item, GMenu.TreeSeparator):
            return
        if self.item_store[path][0]:
            self.editor.setVisible(item, False)
        else:
            self.editor.setVisible(item, True)
        self.item_store[path][0] = not self.item_store[path][0]

    def on_item_tree_cursor_changed(self, treeview):
        selection = treeview.get_selection()
        if selection is None:
            return
        items, iter = selection.get_selected()
        if iter is None:
            return

        item = items[iter][3]
        self.tree.get_object('edit_delete').set_sensitive(True)
        self.tree.get_object('new_separator_button').set_sensitive(True)
        self.tree.get_object('delete_button').set_sensitive(True)

        can_revert = self.editor.canRevert(item)
        self.tree.get_object('edit_revert_to_original').set_sensitive(can_revert)

        can_edit = not isinstance(item, GMenu.TreeSeparator)
        self.tree.get_object('edit_properties').set_sensitive(can_edit)
        self.tree.get_object('properties_button').set_sensitive(can_edit)

        index = items.get_path(iter).get_indices()[0]
        can_go_up = index > 0
        can_go_down = index < len(items) - 1
        self.tree.get_object('move_up_button').set_sensitive(can_go_up)
        self.tree.get_object('move_down_button').set_sensitive(can_go_down)

    def on_item_tree_row_activated(self, treeview, path, column):
        self.on_edit_properties_activate(None)

    def on_item_tree_popup_menu(self, item_tree, event=None):
        model, iter = item_tree.get_selection().get_selected()
        if event:
            #don't show if it's not the right mouse button
            if event.button != 3:
                return
            button = event.button
            event_time = event.time
            info = item_tree.get_path_at_pos(int(event.x), int(event.y))
            if info is not None:
                path, col, cellx, celly = info
                item_tree.grab_focus()
                item_tree.set_cursor(path, col, 0)
        else:
            path = model.get_path(iter)
            button = 0
            event_time = 0
            item_tree.grab_focus()
            item_tree.set_cursor(path, item_tree.get_columns()[0], 0)
        popup = self.tree.get_object('edit_menu')
        popup.popup(None, None, None, None, button, event_time)
        #without this shift-f10 won't work
        return True

    def on_item_tree_key_press_event(self, item_tree, event):
        if event.keyval == Gdk.KEY_Delete:
            self.on_edit_delete_activate(item_tree)

    def on_move_up_button_clicked(self, button):
        item_tree = self.tree.get_object('item_tree')
        items, iter = item_tree.get_selection().get_selected()
        if not iter:
            return
        path = items.get_path(iter)
        #at top, can't move up
        if path.get_indices()[0] == 0:
            return
        item = items[path][3]
        before = items[(path.get_indices()[0] - 1,)][3]
        self.editor.moveItem(item.get_parent(), item, before=before)

    def on_move_down_button_clicked(self, button):
        item_tree = self.tree.get_object('item_tree')
        items, iter = item_tree.get_selection().get_selected()
        if not iter:
            return
        path = items.get_path(iter)
        #at bottom, can't move down
        if path.get_indices()[0] == (len(items) - 1):
            return
        item = items[path][3]
        after = items[path][3]
        self.editor.moveItem(item.get_parent(), item, after=after)

    def on_help_button_clicked(self, *args):
        Gtk.show_uri(Gdk.Screen.get_default(), "ghelp:user-guide#menu-editor", Gtk.get_current_event_time())

    def on_revert_button_clicked(self, button):
        dialog = self.tree.get_object('revertdialog')
        dialog.set_transient_for(self.tree.get_object('mainwindow'))
        dialog.show_all()
        if dialog.run() == Gtk.ResponseType.YES:
            self.editor.revert()
        dialog.hide()

    def on_close_button_clicked(self, button):
        self.quit()

    def on_properties_button_clicked(self, button):
        self.on_edit_properties_activate(None)
    def on_delete_button_clicked(self, button):
        self.on_edit_delete_activate(None)

    def quit(self):
        Gtk.main_quit()


"usr/share/alacarte/alacarte/MenuEditor.py a écrit :

# -*- coding: utf-8 -*-
#   Alacarte Menu Editor - Simple fd.o Compliant Menu Editor
#   Copyright (C) 2006  Travis Watkins, Heinrich Wendel
#
#   This library is free software; you can redistribute it and/or
#   modify it under the terms of the GNU Library General Public
#   License as published by the Free Software Foundation; either
#   version 2 of the License, or (at your option) any later version.
#
#   This library 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
#   Library General Public License for more details.
#
#   You should have received a copy of the GNU Library General Public
#   License along with this library; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

import os
import xml.dom.minidom
import xml.parsers.expat
from gi.repository import GMenu, GLib
from Alacarte import util

class MenuEditor(object):
    def __init__(self, name='applications.menu'):
        menu_prefix = os.getenv('XDG_MENU_PREFIX') or 'gnome-'
        name = menu_prefix + name
        self.name = name

        self.tree = GMenu.Tree.new(name, GMenu.TreeFlags.SHOW_EMPTY|GMenu.TreeFlags.INCLUDE_EXCLUDED|GMenu.TreeFlags.INCLUDE_NODISPLAY|GMenu.TreeFlags.SHOW_ALL_SEPARATORS|GMenu.TreeFlags.SORT_DISPLAY_NAME)
        self.tree.connect('changed', self.menuChanged)
        self.load()

        self.path = os.path.join(util.getUserMenuPath(), self.tree.props.menu_basename)
        self.loadDOM()

    def loadDOM(self):
        try:
            self.dom = xml.dom.minidom.parse(self.path)
        except (IOError, xml.parsers.expat.ExpatError), e:
            self.dom = xml.dom.minidom.parseString(util.getUserMenuXml(self.tree))
        util.removeWhitespaceNodes(self.dom)

    def load(self):
        if not self.tree.load_sync():
            raise ValueError("can not load menu tree %r" % (self.name,))

    def menuChanged(self, *a):
        self.load()

    def save(self):
        fd = open(self.path, 'w')
        fd.write(self.dom.toprettyxml())
        fd.close()

    def revert(self):
        self.revertTree(self.tree.get_root_directory())
        path = os.path.join(util.getUserMenuPath(), os.path.basename(self.tree.get_canonical_menu_path()))
        try:
            os.unlink(path)
        except OSError:
            pass

        self.loadDOM()
        self.save()

    def revertTree(self, menu):
        item_iter = menu.iter()
        item_type = item_iter.next()
        while item_type != GMenu.TreeItemType.INVALID:
            if item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
                self.revertTree(item)
            elif item_type == GMenu.TreeItemType.ENTRY:
                item = item_iter.get_entry()
                self.revertItem(item)
            item_type = item_iter.next()
        self.revertMenu(menu)

    def revertItem(self, item):
        if not self.canRevert(item):
            return
        try:
            os.remove(item.get_desktop_file_path())
        except OSError:
            pass
        self.save()

    def revertMenu(self, menu):
        if not self.canRevert(menu):
            return
        #wtf happened here? oh well, just bail
        if not menu.get_desktop_file_path():
            return
        file_id = os.path.split(menu.get_desktop_file_path())[1]
        path = os.path.join(util.getUserDirectoryPath(), file_id)
        try:
            os.remove(path)
        except OSError:
            pass
        self.save()

    def getMenus(self, parent):
        if parent is None:
            yield (self.tree.get_root_directory(), True)
            return

        item_iter = parent.iter()
        item_type = item_iter.next()
        while item_type != GMenu.TreeItemType.INVALID:
            if item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
                yield (item, self.isVisible(item))
            item_type = item_iter.next()

    def getContents(self, item):
        contents = []
        item_iter = item.iter()
        item_type = item_iter.next()

        while item_type != GMenu.TreeItemType.INVALID:
            item = None
            if item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
            elif item_type == GMenu.TreeItemType.ENTRY:
                item = item_iter.get_entry()
            elif item_type == GMenu.TreeItemType.HEADER:
                item = item_iter.get_header()
            elif item_type == GMenu.TreeItemType.ALIAS:
                item = item_iter.get_alias()
            elif item_type == GMenu.TreeItemType.SEPARATOR:
                item = item_iter.get_separator()
            if item:
                contents.append(item)
            item_type = item_iter.next()
        return contents

    def getItems(self, menu):
        item_iter = menu.iter()
        item_type = item_iter.next()
        while item_type != GMenu.TreeItemType.INVALID:
            item = None
            if item_type == GMenu.TreeItemType.ENTRY:
                item = item_iter.get_entry()
            elif item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
            elif item_type == GMenu.TreeItemType.HEADER:
                item = item_iter.get_header()
            elif item_type == GMenu.TreeItemType.ALIAS:
                item = item_iter.get_alias()
            elif item_type == GMenu.TreeItemType.SEPARATOR:
                item = item_iter.get_separator()
            yield (item, self.isVisible(item))
            item_type = item_iter.next()

    def canRevert(self, item):
        if isinstance(item, GMenu.TreeEntry):
            if util.getItemPath(item.get_desktop_file_id()) is not None:
                path = util.getUserItemPath()
                if os.path.isfile(os.path.join(path, item.get_desktop_file_id())):
                    return True
        elif isinstance(item, GMenu.TreeDirectory):
            if item.get_desktop_file_path():
                file_id = os.path.split(item.get_desktop_file_path())[1]
            else:
                file_id = item.get_menu_id() + '.directory'
            if util.getDirectoryPath(file_id) is not None:
                path = util.getUserDirectoryPath()
                if os.path.isfile(os.path.join(path, file_id)):
                    return True
        return False

    def setVisible(self, item, visible):
        dom = self.dom
        if isinstance(item, GMenu.TreeEntry):
            menu_xml = self.getXmlMenu(self.getPath(item.get_parent()), dom.documentElement, dom)
            if visible:
                self.addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Include')
                self.writeItem(item, NoDisplay=False)
            else:
                self.addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Exclude')
            self.addXmlTextElement(menu_xml, 'AppDir', util.getUserItemPath(), dom)
        elif isinstance(item, GMenu.TreeDirectory):
            item_iter = item.iter()
            first_child_type = item_iter.next()
            #don't mess with it if it's empty
            if first_child_type == GMenu.TreeItemType.INVALID:
                return
            menu_xml = self.getXmlMenu(self.getPath(item), dom.documentElement, dom)
            for node in self.getXmlNodesByName(['Deleted', 'NotDeleted'], menu_xml):
                node.parentNode.removeChild(node)
            self.writeMenu(item, NoDisplay=not visible)
            self.addXmlTextElement(menu_xml, 'DirectoryDir', util.getUserDirectoryPath(), dom)
        self.save()

    def createItem(self, parent, before, after, **kwargs):
        file_id = self.writeItem(None, **kwargs)
        self.insertExternalItem(file_id, parent.get_menu_id(), before, after)

    def insertExternalItem(self, file_id, parent_id, before=None, after=None):
        parent = self.findMenu(parent_id)
        dom = self.dom
        self.addItem(parent, file_id, dom)
        self.positionItem(parent, ('Item', file_id), before, after)
        self.save()

    def insertExternalMenu(self, file_id, parent_id, before=None, after=None):
        menu_id = file_id.rsplit('.', 1)[0]
        parent = self.findMenu(parent_id)
        dom = self.dom
        self.addXmlDefaultLayout(self.getXmlMenu(self.getPath(parent), dom.documentElement, dom) , dom)
        menu_xml = self.getXmlMenu(self.getPath(parent) + [menu_id], dom.documentElement, dom)
        self.addXmlTextElement(menu_xml, 'Directory', file_id, dom)
        self.positionItem(parent, ('Menu', menu_id), before, after)
        self.save()

    def createSeparator(self, parent, before=None, after=None):
        self.positionItem(parent, ('Separator',), before, after)
        self.save()

    def editItem(self, item, icon, name, comment, command, use_term, parent=None, final=True):
        #if nothing changed don't make a user copy
        app_info = item.get_app_info()
        if icon == app_info.get_icon() and name == app_info.get_display_name() and comment == item.get_comment() and command == item.get_exec() and use_term == item.get_launch_in_terminal():
            return
        #hack, item.get_parent() seems to fail a lot
        if not parent:
            parent = item.get_parent()
        self.writeItem(item, Icon=icon, Name=name, Comment=comment, Exec=command, Terminal=use_term)
        if final:
            dom = self.dom
            menu_xml = self.getXmlMenu(self.getPath(parent), dom.documentElement, dom)
            self.addXmlTextElement(menu_xml, 'AppDir', util.getUserItemPath(), dom)
        self.save()

    def editMenu(self, menu, icon, name, comment, final=True):
        #if nothing changed don't make a user copy
        if icon == menu.get_icon() and name == menu.get_name() and comment == menu.get_comment():
            return
        #we don't use this, we just need to make sure the <Menu> exists
        #otherwise changes won't show up
        dom = self.dom
        menu_xml = self.getXmlMenu(self.getPath(menu), dom.documentElement, dom)
        self.writeMenu(menu, Icon=icon, Name=name, Comment=comment)
        if final:
            self.addXmlTextElement(menu_xml, 'DirectoryDir', util.getUserDirectoryPath(), dom)
        self.save()

    def copyItem(self, item, new_parent, before=None, after=None):
        dom = self.dom
        file_path = item.get_desktop_file_path()
        keyfile = GLib.KeyFile()
        keyfile.load_from_file(file_path, util.KEY_FILE_FLAGS)

        util.fillKeyFile(keyfile, dict(Categories=[], Hidden=False))

        app_info = item.get_app_info()
        file_id = util.getUniqueFileId(app_info.get_name().replace(os.sep, '-'), '.desktop')
        out_path = os.path.join(util.getUserItemPath(), file_id)

        contents, length = keyfile.to_data()

        f = open(out_path, 'w')
        f.write(contents)
        f.close()

        self.addItem(new_parent, file_id, dom)
        self.positionItem(new_parent, ('Item', file_id), before, after)
        self.save()
        return file_id

    def deleteItem(self, item):
        self.writeItem(item, Hidden=True)
        self.save()

    def deleteMenu(self, menu):
        dom = self.dom
        menu_xml = self.getXmlMenu(self.getPath(menu), dom.documentElement, dom)
        self.addDeleted(menu_xml, dom)
        self.save()

    def deleteSeparator(self, item):
        parent = item.get_parent()
        contents = self.getContents(parent)
        contents.remove(item)
        layout = self.createLayout(contents)
        dom = self.dom
        menu_xml = self.getXmlMenu(self.getPath(parent), dom.documentElement, dom)
        self.addXmlLayout(menu_xml, layout, dom)
        self.save()

    def findMenu(self, menu_id, parent=None):
        if parent is None:
            parent = self.tree.get_root_directory()

        if menu_id == parent.get_menu_id():
            return parent

        item_iter = parent.iter()
        item_type = item_iter.next()
        while item_type != GMenu.TreeItemType.INVALID:
            if item_type == GMenu.TreeItemType.DIRECTORY:
                item = item_iter.get_directory()
                if item.get_menu_id() == menu_id:
                    return item
                menu = self.findMenu(menu_id, item)
                if menu is not None:
                    return menu
            item_type = item_iter.next()

    def isVisible(self, item):
        if isinstance(item, GMenu.TreeEntry):
            app_info = item.get_app_info()
            return not (item.get_is_excluded() or app_info.get_nodisplay())
        elif isinstance(item, GMenu.TreeDirectory):
            return not item.get_is_nodisplay()
        return True

    def getPath(self, menu):
        names = []
        current = menu
        while current is not None:
            names.append(current.get_menu_id())
            current = current.get_parent()

        # XXX - don't append root menu name, alacarte doesn't
        # expect it. look into this more.
        names.pop(-1)
        return names[::-1]

    def getXmlMenuPart(self, element, name):
        for node in self.getXmlNodesByName('Menu', element):
            for child in self.getXmlNodesByName('Name', node):
                if child.childNodes[0].nodeValue == name:
                    return node
        return None

    def getXmlMenu(self, path, element, dom):
        for name in path:
            found = self.getXmlMenuPart(element, name)
            if found is not None:
                element = found
            else:
                element = self.addXmlMenuElement(element, name, dom)
        return element

    def addXmlMenuElement(self, element, name, dom):
        node = dom.createElement('Menu')
        self.addXmlTextElement(node, 'Name', name, dom)
        return element.appendChild(node)

    def addXmlTextElement(self, element, name, text, dom):
        for temp in element.childNodes:
            if temp.nodeName == name:
                if temp.childNodes[0].nodeValue == text:
                    return
        node = dom.createElement(name)
        text = dom.createTextNode(text)
        node.appendChild(text)
        return element.appendChild(node)

    def addXmlFilename(self, element, dom, filename, type = 'Include'):
        # remove old filenames
        for node in self.getXmlNodesByName(['Include', 'Exclude'], element):
            if node.childNodes[0].nodeName == 'Filename' and node.childNodes[0].childNodes[0].nodeValue == filename:
                element.removeChild(node)

        # add new filename
        node = dom.createElement(type)
        node.appendChild(self.addXmlTextElement(node, 'Filename', filename, dom))
        return element.appendChild(node)

    def addDeleted(self, element, dom):
        node = dom.createElement('Deleted')
        return element.appendChild(node)

    def makeKeyFile(self, file_path, kwargs):
        if 'KeyFile' in kwargs:
            return kwargs['KeyFile']

        keyfile = GLib.KeyFile()

        if file_path is not None:
            keyfile.load_from_file(file_path, util.KEY_FILE_FLAGS)

        util.fillKeyFile(keyfile, kwargs)
        return keyfile

    def writeItem(self, item, **kwargs):
        if item is not None:
            file_path = item.get_desktop_file_path()
        else:
            file_path = None

        keyfile = self.makeKeyFile(file_path, kwargs)

        if item is not None:
            file_id = item.get_desktop_file_id()
        else:
            file_id = util.getUniqueFileId(keyfile.get_string(GLib.KEY_FILE_DESKTOP_GROUP, 'Name'), '.desktop')

        contents, length = keyfile.to_data()

        f = open(os.path.join(util.getUserItemPath(), file_id), 'w')
        f.write(contents)
        f.close()
        return file_id

    def writeMenu(self, menu, **kwargs):
        if menu is not None:
            file_id = os.path.split(menu.get_desktop_file_path())[1]
            file_path = menu.get_desktop_file_path()
            keyfile = GLib.KeyFile()
            keyfile.load_from_file(file_path, util.KEY_FILE_FLAGS)
        elif menu is None and 'Name' not in kwargs:
            raise Exception('New menus need a name')
        else:
            file_id = util.getUniqueFileId(kwargs['Name'], '.directory')
            keyfile = GLib.KeyFile()

        util.fillKeyFile(keyfile, kwargs)

        contents, length = keyfile.to_data()

        f = open(os.path.join(util.getUserDirectoryPath(), file_id), 'w')
        f.write(contents)
        f.close()
        return file_id

    def getXmlNodesByName(self, name, element):
        for child in element.childNodes:
            if child.nodeType == xml.dom.Node.ELEMENT_NODE:
                if isinstance(name, str) and child.nodeName == name:
                    yield child
                elif isinstance(name, list) or isinstance(name, tuple):
                    if child.nodeName in name:
                        yield child

    def addXmlMove(self, element, old, new, dom):
        if not self.undoMoves(element, old, new, dom):
            node = dom.createElement('Move')
            node.appendChild(self.addXmlTextElement(node, 'Old', old, dom))
            node.appendChild(self.addXmlTextElement(node, 'New', new, dom))
            #are parsed in reverse order, need to put at the beginning
            return element.insertBefore(node, element.firstChild)

    def addXmlLayout(self, element, layout, dom):
        # remove old layout
        for node in self.getXmlNodesByName('Layout', element):
            element.removeChild(node)

        # add new layout
        node = dom.createElement('Layout')
        for order in layout:
            if order[0] == 'Separator':
                child = dom.createElement('Separator')
                node.appendChild(child)
            elif order[0] == 'Filename':
                child = self.addXmlTextElement(node, 'Filename', order[1], dom)
            elif order[0] == 'Menuname':
                child = self.addXmlTextElement(node, 'Menuname', order[1], dom)
            elif order[0] == 'Merge':
                child = dom.createElement('Merge')
                child.setAttribute('type', order[1])
                node.appendChild(child)
        return element.appendChild(node)

    def addXmlDefaultLayout(self, element, dom):
        # remove old default layout
        for node in self.getXmlNodesByName('DefaultLayout', element):
            element.removeChild(node)

        # add new layout
        node = dom.createElement('DefaultLayout')
        node.setAttribute('inline', 'false')
        return element.appendChild(node)

    def createLayout(self, items):
        layout = []
        layout.append(('Merge', 'menus'))
        for item in items:
            if isinstance(item, GMenu.TreeDirectory):
                layout.append(('Menuname', item.get_menu_id()))
            elif isinstance(item, GMenu.TreeEntry):
                layout.append(('Filename', item.get_desktop_file_id()))
            elif isinstance(item, GMenu.TreeSeparator):
                layout.append(('Separator',))
            else:
                layout.append(item)
        layout.append(('Merge', 'files'))
        return layout

    def addItem(self, parent, file_id, dom):
        xml_parent = self.getXmlMenu(self.getPath(parent), dom.documentElement, dom)
        self.addXmlFilename(xml_parent, dom, file_id, 'Include')

    def moveItem(self, parent, item, before=None, after=None):
        self.positionItem(parent, item, before=before, after=after)
        self.save()

    def positionItem(self, parent, item, before=None, after=None):
        contents = self.getContents(parent)
        if after:
            index = contents.index(after) + 1
        elif before:
            index = contents.index(before)
        else:
            # append the item to the list
            index = len(contents)
        #if this is a move to a new parent you can't remove the item
        if item in contents:
            # decrease the destination index, if we shorten the list
            if (before and (contents.index(item) < index)) \
                    or (after and (contents.index(item) < index - 1)):
                index -= 1
            contents.remove(item)
        contents.insert(index, item)
        layout = self.createLayout(contents)
        dom = self.dom
        menu_xml = self.getXmlMenu(self.getPath(parent), dom.documentElement, dom)
        self.addXmlLayout(menu_xml, layout, dom)

    def undoMoves(self, element, old, new, dom):
        nodes = []
        matches = []
        original_old = old
        final_old = old
        #get all <Move> elements
        for node in self.getXmlNodesByName(['Move'], element):
            nodes.insert(0, node)
        #if the <New> matches our old parent we've found a stage to undo
        for node in nodes:
            xml_old = node.getElementsByTagName('Old')[0]
            xml_new = node.getElementsByTagName('New')[0]
            if xml_new.childNodes[0].nodeValue == old:
                matches.append(node)
                #we should end up with this path when completed
                final_old = xml_old.childNodes[0].nodeValue
        #undoing <Move>s
        for node in matches:
            element.removeChild(node)
        if len(matches) > 0:
            for node in nodes:
                xml_old = node.getElementsByTagName('Old')[0]
                xml_new = node.getElementsByTagName('New')[0]
                path = os.path.split(xml_new.childNodes[0].nodeValue)
                if path[0] == original_old:
                    element.removeChild(node)
                    for node in dom.getElementsByTagName('Menu'):
                        name_node = node.getElementsByTagName('Name')[0]
                        name = name_node.childNodes[0].nodeValue
                        if name == os.path.split(new)[1]:
                            #copy app and dir directory info from old <Menu>
                            root_path = dom.getElementsByTagName('Menu')[0].getElementsByTagName('Name')[0].childNodes[0].nodeValue
                            xml_menu = self.getXmlMenu(root_path + '/' + new, dom.documentElement, dom)
                            for app_dir in node.getElementsByTagName('AppDir'):
                                xml_menu.appendChild(app_dir)
                            for dir_dir in node.getElementsByTagName('DirectoryDir'):
                                xml_menu.appendChild(dir_dir)
                            parent = node.parentNode
                            parent.removeChild(node)
                    node = dom.createElement('Move')
                    node.appendChild(self.addXmlTextElement(node, 'Old', xml_old.childNodes[0].nodeValue, dom))
                    node.appendChild(self.addXmlTextElement(node, 'New', os.path.join(new, path[1]), dom))
                    element.appendChild(node)
            if final_old == new:
                return True
            node = dom.createElement('Move')
            node.appendChild(self.addXmlTextElement(node, 'Old', final_old, dom))
            node.appendChild(self.addXmlTextElement(node, 'New', new, dom))
            return element.appendChild(node)



Et je n'ai pas ce fichier : gnome-applications.menu ??


Merci pour ton aide ! Si jamais d'autres utilisateurs ont fait la même bêtise que moi... ça va aider beaucoup de gens je pense !


Ulysse

Hors ligne

#9 22-07-2013 22:23:41

bract
Modérateur
Lieu : Pays du kiwi
Distrib. : wheezy
Noyau : 3.2.0-3 amd64
(G)UI : gnome 3.4.2 + lxde(eeepc)
Inscription : 05-02-2011

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

c'est une bonne idée de créer un nouvel utilisateur, et voir si alacarte démarre avec lui

pour la comparaison des fichiers, je verrai demain soir car 33° dehors et la journée dans un bureau non rafraîchi me donne envie d'aller vite au lit pour récupérer.

bonne soirée cool

L'asso est lancée. cool
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]

Hors ligne

#10 22-07-2013 23:49:19

Ulysse
Membre
Distrib. : Wheezy x64
Noyau : Linux 3.2.0-4-amd64
(G)UI : Gnome 3
Inscription : 21-07-2013

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

D'accord voici un début de réponse à mon problème ! https://bbs.archlinux.org/viewtopic.php?id=143342
J'ai trouvé ça, je vais contacter la personne qui a eu exactement le même problème que moi. Nous avons fait la même connerie et nous avons fait tout exactement pareil ! Tiens moi au courant à demain et bonne nuit smile

edit :j'essaie de m'inscrire mais je ne réussi pas cette étape... : What is the output of "date -u +%V$(uname)|sha256sum|sed 's/\W//g'"?(Required)
je l'ai marqué dans ma console et apparemment ce n'est pas le bon code... il faut avoir archlinux je suppose pour que ça fonctionne --' ?
Edit 2 : peut-être un bug, j'ai recommencé et ça fonctionne j'envoie un MP !

Subject : help for :  alacarte totally messed up my Gnome 3 menu
Message :

Ulysse a écrit :

Hello,

I'd like to speak with you about your issue on "alacarte". I've the same issue like you because I've make the same manipulation on my computer. Nevertheless, I'm not on Archlinux but on Debian 7.0 : wheezy. I've posted my issue on different French forums but anyone have find the solution to resolve the problem. Have you resolved your issue ? How have you do ? If it is possible, can you explain me how to resolve it ?

Thank You very much !

Ulysse,

Ps : You can see my issue on our forum (in French) : http://debian-facile.org/viewtopic.php?pid=64041#p64041



Héhé ! Eh ouais le mec trop bilingue tongue Bon je plaisante bien sûr ! Je l'ai rédigé sans brouillon au file de la plume donc il est possible qu'il contienne des erreurs...
C'est beau la technologie lorsque l'on peut communiquer à travers le monde pour résoudre ses problèmes ! Haha, big_smile Aller go je me couche moi aussi !

Dernière modification par Ulysse (23-07-2013 00:23:11)


Ulysse

Hors ligne

#11 23-07-2013 05:34:08

Ulysse
Membre
Distrib. : Wheezy x64
Noyau : Linux 3.2.0-4-amd64
(G)UI : Gnome 3
Inscription : 21-07-2013

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Bonjour !

Je suis bien matinal : 5h30... J'ai eu beaucoup de mal à dormir... Bref, ce qui m'amène ici c'est la réponse que j'ai déjà reçu ! big_smile

blackout23 a écrit :

Hello,

I managed to restore my menu by launching "gnome-simple-menu". I don't
know if the command is exactly that (type gnome and autocomplete a bit
till you find it). It's like alacarte and I was somehow able to restore
it to the defaults. Alacarte always messed the menu up, when trying to
hide one specific item. I just ended up deleting the *.desktop file for
that entry. I'm on KDE 4.10 now, anyway.

Regards,

Tim



Je tiens à préciser que moi aussi tout comme Tim, j'ai installé KDE (mais c'est en attendant de réinstaller Gnome, si possible !). Je vais essayer ça wink Même avec l’auto-complétion, il ne trouve pas ? Quelqu'un a une idée ?

Dernière modification par Ulysse (23-07-2013 05:43:17)


Ulysse

Hors ligne

#12 23-07-2013 07:23:36

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

À mon avis, ça ne changerait rien de réinstaller Gnome. Les changements effectués sont côté utilisateurs, donc dans ton home.

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#13 23-07-2013 20:36:24

bract
Modérateur
Lieu : Pays du kiwi
Distrib. : wheezy
Noyau : 3.2.0-3 amd64
(G)UI : gnome 3.4.2 + lxde(eeepc)
Inscription : 05-02-2011

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Bonjour smile ,
les fichiers sont identiques (a part 4 espaces au début de quelques lignes, mais je pense que c'est du à ton copié-collé)

et pour les fichiers : gnome-applications.menu, voici où ils se trouvent chez moi

root@debian:/# find -name gnome-applications.menu
./home/bruno/.config/menus/gnome-applications.menu
./etc/xdg/menus/gnome-applications.menu



Voici le contenu de celui situé dans mon home

<?xml version="1.0" ?>
<!DOCTYPE Menu
  PUBLIC '-//freedesktop//DTD Menu 1.0//EN'
  'http://standards.freedesktop.org/menu-spec/menu-1.0.dtd'>
<Menu>
  <Name>Applications</Name>
  <MergeFile type="parent">/etc/xdg/menus/gnome-applications.menu</MergeFile>
  <Menu>
    <Name>Multimedia</Name>
    <Include>
      <Filename>Kino.desktop</Filename>
    </Include>
    <AppDir>/home/bruno/.local/share/applications</AppDir>
  </Menu>
  <Menu>
    <Name>System</Name>
    <Menu>
      <Name>Preferences</Name>
      <AppDir>/home/bruno/.local/share/applications</AppDir>
      <Exclude>
        <Filename>gcm-calibrate.desktop</Filename>
      </Exclude>
    </Menu>
  </Menu>
  <Menu>
    <Name>Other</Name>
    <Include>
      <Filename>gnome-shell-extension-prefs.desktop</Filename>
    </Include>
    <AppDir>/home/bruno/.local/share/applications</AppDir>
  </Menu>
</Menu>


L'asso est lancée. cool
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]

Hors ligne

#14 24-07-2013 18:06:21

Ulysse
Membre
Distrib. : Wheezy x64
Noyau : Linux 3.2.0-4-amd64
(G)UI : Gnome 3
Inscription : 21-07-2013

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Hey ! C'est exactement cela qu'il me manque !!! Je vais recréer le fichier et réinstaller gnome tongue Je suis totalement perdu sur KDE... Merci wink Je redonne des nouvelles si cela fonctionne ! Restez sur le feu smile

Ulysse

Hors ligne

#15 26-07-2013 10:09:05

Ulysse
Membre
Distrib. : Wheezy x64
Noyau : Linux 3.2.0-4-amd64
(G)UI : Gnome 3
Inscription : 21-07-2013

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

Nickel !!!! Merci beaucoup ! Ca fonctionne !! Merci big_smile

Ulysse

Hors ligne

#16 26-07-2013 14:53:40

bract
Modérateur
Lieu : Pays du kiwi
Distrib. : wheezy
Noyau : 3.2.0-3 amd64
(G)UI : gnome 3.4.2 + lxde(eeepc)
Inscription : 05-02-2011

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

parfait smile , j'en suis content pour toi.

un petit résolu en passant big_smile
atelier:resolu


et il est pour qui ce chocolat aux piments? cool

L'asso est lancée. cool
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]

Hors ligne

#17 26-07-2013 19:18:56

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 4.6.0-0.bpo.1-amd64
(G)UI : gnome 3.14.1
Inscription : 21-10-2008

Re : [résolu] Toutes mes applications du menu ont disparu [Gnome 3]

tongue

"Définition d'eric besson : S'il fallait en chier des tonnes pour devenir ministre, il aurait 2 trous du cul." - JP Douillon
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

En ligne

Pied de page des forums