Vous n'êtes pas identifié(e).
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 :
Et maintenant le fichier usr/share/alacarte/alacarte/menueditor.py :
Je vous remerci bien !
Dernière modification par Ulysse (26-07-2013 18:17:04)
Ulysse
Hors ligne
L'asso est lancée.
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]
Hors ligne
Il voulait aussi supprimer le paquet gnome j'ai répondu oui
puis j'ai fait
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
saque eud dun (patois chtimi : fonce dedans)
Hors ligne
mais regarde bien les recommendation du tuto
http://debian-facile.org/doc:systeme:ap … n_complete
et ensuite
a+
bract
L'asso est lancée.
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]
Hors ligne
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 "$" :
Dernière modification par Ulysse (22-07-2013 18:20:37)
Ulysse
Hors ligne
L'asso est lancée.
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]
Hors ligne
#! /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()
# -*- 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()
# -*- 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
L'asso est lancée.
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]
Hors ligne
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 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, Aller go je me couche moi aussi !
Dernière modification par Ulysse (22-07-2013 23:23:11)
Ulysse
Hors ligne
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 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 04:43:17)
Ulysse
Hors ligne
captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.
Hors ligne
Voici le contenu de celui situé dans mon home
L'asso est lancée.
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]
Hors ligne
Ulysse
Hors ligne
Ulysse
Hors ligne
L'asso est lancée.
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.[Albert Einstein]
Hors ligne
saque eud dun (patois chtimi : fonce dedans)
Hors ligne