[alacarte/vala+garcon: 1/6] initial commit of vala+gdesktopmenu branch



commit a0359bad4d0ee2e915923e783896357f2d5d9b50
Author: Travis Watkins <amaranth ubuntu com>
Date:   Wed May 6 01:47:21 2009 -0500

    initial commit of vala+gdesktopmenu branch
    
    This is a rewrite of alacarte using vala and other modern
    technologies. The main goal is to create a cleaner and simpler
    code base that solves several design probems with alacarte.
    Changes made to menus using the old version of alacarte will
    mostly still work in this version but the plan is to no
    longer show NoDisplay items in alacarte as these tend to
    confuse users. Through xdg-list I am currently working out
    a better way to handle hiding things specifically for or in
    a menu editor like alacarte.
    
    Oh, and this version of alacarte depends on libxfce4menu.
    This clean and fast library is actively maintained and I am
    working with the main developer to make it more suitable for
    use in GNOME applications. We will soon be renaming it
    gdesktopmenu to reflect this goal. Currently it depends on
    the parser-rewrite branch [1] but hopefully this will be
    merged to master soon or moved to a completely new location
    once the rename is finished.
    
    [1] http://git.xfce.org/jannis/libxfce4menu/log/?h=parser-rewrite
---
 .gitignore                 |  122 +++++++
 AUTHORS                    |    2 +-
 Alacarte/.cvsignore        |    4 -
 Alacarte/MainWindow.py     |  617 -----------------------------------
 Alacarte/Makefile.am       |   23 --
 Alacarte/MenuEditor.py     |  771 --------------------------------------------
 Alacarte/config.py.in      |    8 -
 Alacarte/util.py           |  244 --------------
 COPYING                    |  211 +++++++------
 INSTALL                    |   94 +++++--
 Makefile.am                |   46 ++-
 acinclude.m4               |  132 --------
 alacarte.in                |   37 ---
 alacarte.png               |  Bin 1036 -> 0 bytes
 alacarte.svg               |  406 -----------------------
 autogen.sh                 |   37 +--
 configure.ac               |   87 ++----
 data/Makefile.am           |    3 +-
 data/alacarte.ui           |  675 +++++++++++++++------------------------
 po/POTFILES.in             |    3 +-
 po/POTFILES.skip           |    1 -
 src/Makefile.am            |   53 +++
 src/config.vala.in         |   12 +
 src/mainwindow.vala        |  399 +++++++++++++++++++++++
 vapi/libxfce4menu-0.1.vapi |  259 +++++++++++++++
 25 files changed, 1351 insertions(+), 2895 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1712261
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,122 @@
+Makefile
+Makefile.in
+aclocal.m4
+autom4te.cache/
+compile
+config.guess
+config.h
+config.h.in
+config.log
+config.status
+config.sub
+configure
+data/Makefile
+data/Makefile.in
+data/alacarte.desktop
+data/alacarte.desktop.in
+data/icons/Makefile
+data/icons/Makefile.in
+depcomp
+install-sh
+intltool-extract.in
+intltool-merge.in
+intltool-update.in
+libtool
+ltmain.sh
+missing
+mkinstalldirs
+po/.intltool-merge-cache
+po/Makefile
+po/Makefile.in
+po/Makefile.in.in
+po/POTFILES
+po/ar.gmo
+po/as.gmo
+po/ast.gmo
+po/be.gmo
+po/be latin gmo
+po/bem.gmo
+po/bg.gmo
+po/bn.gmo
+po/bn_IN.gmo
+po/ca.gmo
+po/crh.gmo
+po/cs.gmo
+po/da.gmo
+po/de.gmo
+po/dz.gmo
+po/el.gmo
+po/en_CA.gmo
+po/en_GB.gmo
+po/eo.gmo
+po/es.gmo
+po/et.gmo
+po/eu.gmo
+po/fa.gmo
+po/fi.gmo
+po/fr.gmo
+po/fur.gmo
+po/ga.gmo
+po/gl.gmo
+po/gu.gmo
+po/he.gmo
+po/hi.gmo
+po/hr.gmo
+po/hu.gmo
+po/id.gmo
+po/io.gmo
+po/it.gmo
+po/ja.gmo
+po/ka.gmo
+po/kk.gmo
+po/kn.gmo
+po/ko.gmo
+po/ku.gmo
+po/lt.gmo
+po/lv.gmo
+po/mg.gmo
+po/mk.gmo
+po/ml.gmo
+po/mn.gmo
+po/mr.gmo
+po/nb.gmo
+po/nl.gmo
+po/nn.gmo
+po/oc.gmo
+po/or.gmo
+po/pa.gmo
+po/pl.gmo
+po/ps.gmo
+po/pt.gmo
+po/pt_BR.gmo
+po/ro.gmo
+po/ru.gmo
+po/si.gmo
+po/sk.gmo
+po/sl.gmo
+po/sq.gmo
+po/sr.gmo
+po/sr latin gmo
+po/stamp-it
+po/sv.gmo
+po/ta.gmo
+po/te.gmo
+po/th.gmo
+po/tr.gmo
+po/uk.gmo
+po/uz cyrillic gmo
+po/vi.gmo
+po/zh_CN.gmo
+po/zh_HK.gmo
+po/zh_TW.gmo
+src/.deps/
+src/Makefile
+src/Makefile.in
+src/alacarte
+src/alacarte.vala.stamp
+src/config.c
+src/config.o
+src/config.vala
+src/mainwindow.c
+src/mainwindow.o
+stamp-h1
diff --git a/AUTHORS b/AUTHORS
index d188ce8..6d3dd7d 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1 +1 @@
-Travis Watkins <alleykat gmail com>
+Travis Watkins <amaranth ubuntu com>
diff --git a/Alacarte/.cvsignore b/Alacarte/.cvsignore
deleted file mode 100644
index 73da978..0000000
--- a/Alacarte/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-Makefile.in
-config.py
-*.pyc
diff --git a/Alacarte/MainWindow.py b/Alacarte/MainWindow.py
deleted file mode 100644
index 734ba46..0000000
--- a/Alacarte/MainWindow.py
+++ /dev/null
@@ -1,617 +0,0 @@
-# -*- 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 gtk, gmenu, gobject, gio
-import cgi, os
-import gettext
-import subprocess
-import urllib
-try:
-	from Alacarte import config
-	gettext.bindtextdomain('alacarte',config.localedir)
-	gettext.textdomain('alacarte')
-except:
-	pass
-_ = gettext.gettext
-from Alacarte.MenuEditor import MenuEditor
-from Alacarte import util
-
-class MainWindow:
-	timer = None
-	#hack to make editing menu properties work
-	allow_update = True
-	#drag-and-drop stuff
-	dnd_items = [('ALACARTE_ITEM_ROW', gtk.TARGET_SAME_APP, 0), ('text/plain', 0, 1)]
-	dnd_menus = [('ALACARTE_MENU_ROW', gtk.TARGET_SAME_APP, 0)]
-	dnd_both = [dnd_items[0],] + dnd_menus
-	drag_data = None
-	edit_pool = []
-
-	def __init__(self, datadir, version, argv):
-		self.file_path = datadir
-		self.version = version
-		self.editor = MenuEditor()
-		gtk.window_set_default_icon_name('alacarte')
-		self.tree = gtk.Builder()
-                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('<Ctrl>Z')
-		accelgroup.connect_group(keyval, modifier, gtk.ACCEL_VISIBLE, self.on_mainwindow_undo)
-		keyval, modifier = gtk.accelerator_parse('<Ctrl><Shift>Z')
-		accelgroup.connect_group(keyval, modifier, gtk.ACCEL_VISIBLE, self.on_mainwindow_redo)
-		keyval, modifier = gtk.accelerator_parse('F1')
-		accelgroup.connect_group(keyval, modifier, gtk.ACCEL_VISIBLE, self.on_help_button_clicked)
-		self.tree.get_object('mainwindow').add_accel_group(accelgroup)
-
-	def run(self):
-		self.loadMenus()
-		self.editor.applications.tree.add_monitor(self.menuChanged, None)
-		self.editor.settings.tree.add_monitor(self.menuChanged, None)
-		self.tree.get_object('mainwindow').show_all()
-		gtk.main()
-
-	def menuChanged(self, *a):
-		if self.timer:
-			gobject.source_remove(self.timer)
-			self.timer = None
-		self.timer = gobject.timeout_add(3, self.loadUpdates)
-
-	def loadUpdates(self):
-		if not self.allow_update:
-			return False
-		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
-		item_id, separator_path = None, None
-		if iter:
-			update_items = True
-			if items[iter][3].get_type() == gmenu.TYPE_DIRECTORY:
-				item_id = os.path.split(items[iter][3].get_desktop_file_path())[1]
-				update_items = True
-			elif items[iter][3].get_type() == gmenu.TYPE_ENTRY:
-				item_id = items[iter][3].get_desktop_file_id()
-				update_items = True
-			elif items[iter][3].get_type() == gmenu.TYPE_SEPARATOR:
-				item_id = items.get_path(iter)
-				update_items = True
-		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 item[3].get_type() == gmenu.TYPE_ENTRY and item[3].get_desktop_file_id() == item_id:
-					found = True
-				if item[3].get_type() == gmenu.TYPE_DIRECTORY and item[3].get_desktop_file_path():
-					if os.path.split(item[3].get_desktop_file_path())[1] == item_id:
-						found = True
-				if item[3].get_type() == gmenu.TYPE_SEPARATOR:
-					if not isinstance(item_id, tuple):
-						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(gtk.gdk.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.set_attributes(cell, pixbuf=0)
-		cell = gtk.CellRendererText()
-		cell.set_fixed_size(-1, 25)
-		column.pack_start(cell, True)
-		column.set_attributes(cell, markup=1)
-		column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
-		menus.append_column(column)
-		menus.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, self.dnd_menus, gtk.gdk.ACTION_COPY)
-		menus.enable_model_drag_dest(self.dnd_both, gtk.gdk.ACTION_PRIVATE)
-
-	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.set_attributes(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.set_attributes(cell, pixbuf=1)
-		cell = gtk.CellRendererText()
-		cell.set_fixed_size(-1, 25)
-		column.pack_start(cell, True)
-		column.set_attributes(cell, markup=2)
-		items.append_column(column)
-		self.item_store = gtk.ListStore(bool, gtk.gdk.Pixbuf, str, object)
-		items.set_model(self.item_store)
-		items.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, self.dnd_items, gtk.gdk.ACTION_COPY)
-		items.enable_model_drag_dest(self.dnd_items, gtk.gdk.ACTION_PRIVATE)
-
-	def _cell_data_toggle_func(self, tree_column, renderer, model, treeiter):
-		if model[treeiter][3].get_type() == gmenu.TYPE_SEPARATOR:
-			renderer.set_property('visible', False)
-		else:
-			renderer.set_property('visible', True)
-
-	def loadMenus(self):
-		self.menu_store.clear()
-		for menu in self.editor.getMenus():
-			iters = [None]*20
-			self.loadMenu(iters, menu)
-		menu_tree = self.tree.get_object('menu_tree')
-		menu_tree.set_model(self.menu_store)
-		for menu in self.menu_store:
-			#this might not work for some reason
-			try:
-				menu_tree.expand_to_path(menu.path)
-			except:
-				pass
-		menu_tree.get_selection().select_path((0,))
-		self.on_menu_tree_cursor_changed(menu_tree)
-
-	def loadMenu(self, iters, parent, depth=0):
-		if depth == 0:
-			icon = util.getIcon(parent)
-			iters[depth] = self.menu_store.append(None, (icon, cgi.escape(parent.get_name()), parent))
-		depth += 1
-		for menu, show in self.editor.getMenus(parent):
-			if show:
-				name = cgi.escape(menu.get_name())
-			else:
-				name = '<small><i>' + cgi.escape(menu.get_name()) + '</i></small>'
-			icon = util.getIcon(menu)
-			iters[depth] = self.menu_store.append(iters[depth-1], (icon, name, menu))
-			self.loadMenu(iters, menu, depth)
-		depth -= 1
-
-	def loadItems(self, menu, menu_path):
-		self.item_store.clear()
-		for item, show in self.editor.getItems(menu):
-			menu_icon = None
-			if item.get_type() == gmenu.TYPE_SEPARATOR:
-				name = '---'
-				icon = None
-			else:
-				if show:
-					name = cgi.escape(item.get_name())
-				else:
-					name = '<small><i>' + cgi.escape(item.get_name()) + '</i></small>'
-				icon = util.getIcon(item)
-			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() != 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() != None:
-			#hack for broken gnome-desktop-item-edit
-			broken_path = os.path.join(os.path.split(file_path)[0], '.directory')
-			if os.path.isfile(broken_path):
-				os.rename(broken_path, file_path)
-			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() != 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.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.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 item.get_type() == gmenu.TYPE_ENTRY:
-			self.editor.deleteItem(item)
-		elif item.get_type() == gmenu.TYPE_DIRECTORY:
-			self.editor.deleteMenu(item)
-		elif item.get_type() == gmenu.TYPE_SEPARATOR:
-			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 item.get_type() == gmenu.TYPE_ENTRY:
-			self.editor.revertItem(item)
-		elif item.get_type() == gmenu.TYPE_DIRECTORY:
-			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 item.get_type() not in (gmenu.TYPE_ENTRY, gmenu.TYPE_DIRECTORY):
-			return
-
-		if item.get_type() == gmenu.TYPE_ENTRY:
-			file_path = os.path.join(util.getUserItemPath(), item.get_desktop_file_id())
-			file_type = 'Item'
-		elif item.get_type() == gmenu.TYPE_DIRECTORY:
-			if item.get_desktop_file_path() == None:
-				file_path = util.getUniqueFileId('alacarte-made', '.directory')
-				parser = util.DesktopParser(file_path, 'Directory')
-				parser.set('Name', item.get_name())
-				parser.set('Comment', item.get_comment())
-				parser.set('Icon', item.get_icon())
-				parser.write(open(file_path))
-			else:
-				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)
-			self.editor._MenuEditor__addUndo([(file_type, os.path.split(file_path)[1]),])
-		else:
-			self.editor._MenuEditor__addUndo([item,])
-		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):
-		menus, iter = treeview.get_selection().get_selected()
-		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)
-
-	def on_menu_tree_drag_data_get(self, treeview, context, selection, target_id, etime):
-		menus, iter = treeview.get_selection().get_selected()
-		self.drag_data = menus[iter][2]
-
-	def on_menu_tree_drag_data_received(self, treeview, context, x, y, selection, info, etime):
-		menus = treeview.get_model()
-		drop_info = treeview.get_dest_row_at_pos(x, y)
-		if drop_info:
-			path, position = drop_info
-			types = (gtk.TREE_VIEW_DROP_INTO_OR_BEFORE, gtk.TREE_VIEW_DROP_INTO_OR_AFTER)
-			if position not in types:
-				context.finish(False, False, etime)
-				return False
-			if selection.target in ('ALACARTE_ITEM_ROW', 'ALACARTE_MENU_ROW'):
-				if self.drag_data == None:
-					return False
-				item = self.drag_data
-				new_parent = menus[path][2]
-				treeview.get_selection().select_path(path)
-				if item.get_type() == gmenu.TYPE_ENTRY:
-					self.editor.copyItem(item, new_parent)
-				elif item.get_type() == gmenu.TYPE_DIRECTORY:
-					if self.editor.moveMenu(item, new_parent) == False:
-						self.loadUpdates()
-				else:
-					context.finish(False, False, etime) 
-				context.finish(True, True, etime)
-		self.drag_data = None
-
-	def on_item_tree_show_toggled(self, cell, path):
-		item = self.item_store[path][3]
-		if item.get_type() == gmenu.TYPE_SEPARATOR:
-			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):
-		items, iter = treeview.get_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)
-		if self.editor.canRevert(item):
-			self.tree.get_object('edit_revert_to_original').set_sensitive(True)
-		else:
-			self.tree.get_object('edit_revert_to_original').set_sensitive(False)
-		if not item.get_type() == gmenu.TYPE_SEPARATOR:
-			self.tree.get_object('edit_properties').set_sensitive(True)
-		else:
-			self.tree.get_object('edit_properties').set_sensitive(False)
-
-		# If first item...
-		if items.get_path(iter)[0] == 0:
-			self.tree.get_object('move_up_button').set_sensitive(False)
-		else:
-			self.tree.get_object('move_up_button').set_sensitive(True)
-
-		# If last item...
-		if items.get_path(iter)[0] == (len(items)-1):
-			self.tree.get_object('move_down_button').set_sensitive(False)
-		else:
-			self.tree.get_object('move_down_button').set_sensitive(True)
-
-	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 != 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, button, event_time)
-		#without this shift-f10 won't work
-		return True
-
-	def on_item_tree_drag_data_get(self, treeview, context, selection, target_id, etime):
-		items, iter = treeview.get_selection().get_selected()
-		self.drag_data = items[iter][3]
-
-	def on_item_tree_drag_data_received(self, treeview, context, x, y, selection, info, etime):
-		items = treeview.get_model()
-		types = (gtk.TREE_VIEW_DROP_BEFORE,	gtk.TREE_VIEW_DROP_INTO_OR_BEFORE)
-		if selection.target == 'ALACARTE_ITEM_ROW':
-			drop_info = treeview.get_dest_row_at_pos(x, y)
-			before = None
-			after = None
-			if self.drag_data == None:
-				return False
-			item = self.drag_data
-			if drop_info:
-				path, position = drop_info
-				if position in types:
-					before = items[path][3]
-				else:
-					after = items[path][3]
-			else:
-				path = (len(items) - 1,)
-				after = items[path][3]
-			if item.get_type() == gmenu.TYPE_ENTRY:
-				self.editor.moveItem(item, item.get_parent(), before, after)
-			elif item.get_type() == gmenu.TYPE_DIRECTORY:
-				if self.editor.moveMenu(item, item.get_parent(), before, after) == False:
-					self.loadUpdates()
-			elif item.get_type() == gmenu.TYPE_SEPARATOR:
-				self.editor.moveSeparator(item, item.get_parent(), before, after)
-			context.finish(True, True, etime)
-		elif selection.target == 'text/plain':
-			if selection.data == None:
-				return False
-			menus, iter = self.tree.get_object('menu_tree').get_selection().get_selected()
-			parent = menus[iter][2]
-			drop_info = treeview.get_dest_row_at_pos(x, y)
-			before = None
-			after = None
-			if drop_info:
-				path, position = drop_info
-				if position in types:
-					before = items[path][3]
-				else:
-					after = items[path][3]
-			else:
-				path = (len(items) - 1,)
-				after = items[path][3]
-			file_path = urllib.unquote(selection.data).strip()
-			if not file_path.startswith('file:'):
-				return
-			myfile = gio.File(uri=file_path)
-			file_info = myfile.query_info(gio.FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE)
-			content_type = file_info.get_content_type()
-			if content_type == 'application/x-desktop':
-				input_stream = myfile.read()
-				open('/tmp/alacarte-dnd.desktop', 'w').write(input_stream.read())
-				parser = util.DesktopParser('/tmp/alacarte-dnd.desktop')
-				self.editor.createItem(parent, parser.get('Icon'), parser.get('Name', self.editor.locale), parser.get('Comment', self.editor.locale), parser.get('Exec'), parser.get('Terminal'), before, after)
-			elif content_type in ('application/x-shellscript', 'application/x-executable'):
-				self.editor.createItem(parent, None, os.path.split(file_path)[1].strip(), None, file_path.replace('file://', '').strip(), False, before, after)
-		self.drag_data = None
-
-	def on_item_tree_key_press_event(self, item_tree, event):
-		if event.keyval == gtk.keysyms.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[0] == 0:
-			return
-		item = items[path][3]
-		before = items[(path[0] - 1,)][3]
-		if item.get_type() == gmenu.TYPE_ENTRY:
-			self.editor.moveItem(item, item.get_parent(), before=before)
-		elif item.get_type() == gmenu.TYPE_DIRECTORY:
-			self.editor.moveMenu(item, item.get_parent(), before=before)
-		elif item.get_type() == gmenu.TYPE_SEPARATOR:
-			self.editor.moveSeparator(item, item.get_parent(), 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[0] == (len(items) - 1):
-			return
-		item = items[path][3]
-		after = items[path][3]
-		if item.get_type() == gmenu.TYPE_ENTRY:
-			self.editor.moveItem(item, item.get_parent(), after=after)
-		elif item.get_type() == gmenu.TYPE_DIRECTORY:
-			self.editor.moveMenu(item, item.get_parent(), after=after)
-		elif item.get_type() == gmenu.TYPE_SEPARATOR:
-			self.editor.moveSeparator(item, item.get_parent(), after=after)
-
-	def on_mainwindow_undo(self, accelgroup, window, keyval, modifier):
-		self.editor.undo()
-
-	def on_mainwindow_redo(self, accelgroup, window, keyval, modifier):
-		self.editor.redo()
-
-	def on_help_button_clicked(self, *args):
-		gtk.show_uri(gtk.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.RESPONSE_YES:
-			self.editor.revert()
-		dialog.hide()
-
-	def on_close_button_clicked(self, button):
-		try:
-			self.tree.get_object('mainwindow').hide()
-		except:
-			pass
-		gobject.timeout_add(10, self.quit)
-
-	def on_style_set(self, *args):
-		self.loadUpdates()
-
-	def quit(self):
-		self.editor.quit()
-		gtk.main_quit()		
diff --git a/Alacarte/Makefile.am b/Alacarte/Makefile.am
deleted file mode 100644
index af6ddd6..0000000
--- a/Alacarte/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-## Process this file with automake to produce Makefile.in
-
-appdir = $(pythondir)/Alacarte
-app_PYTHON = __init__.py MainWindow.py MenuEditor.py util.py
-nodist_app_PYTHON = config.py
-
-config.py: config.py.in
-	sed						\
-		-e s!\ prefix\@!$(prefix)!		\
-		-e s!\ datadir\@!$(datadir)!		\
-		-e s!\ pkgdatadir\@!$(pkgdatadir)!	\
-		-e s!\ libexecdir\@!$(libexecdir)!	\
-		-e s!\ libdir\@!$(libdir)!		\
-		-e s!\ PACKAGE\@!$(PACKAGE)!		\
-		-e s!\ VERSION\@!$(VERSION)!		\
-		< $< > $@
-config.py: Makefile
-
-CLEANFILES = config.py
-EXTRA_DIST = config.py.in
-
-all-local: config.py
-
diff --git a/Alacarte/MenuEditor.py b/Alacarte/MenuEditor.py
deleted file mode 100644
index 16c732d..0000000
--- a/Alacarte/MenuEditor.py
+++ /dev/null
@@ -1,771 +0,0 @@
-# -*- 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, re, xml.dom.minidom, locale
-import gmenu
-from Alacarte import util
-
-class Menu:
-	tree = None
-	visible_tree = None
-	path = None
-	dom = None
-
-class MenuEditor:
-	#lists for undo/redo functionality
-	__undo = []
-	__redo = []
-
-	def __init__(self):
-		self.locale = locale.getdefaultlocale()[0]
-		self.__loadMenus()
-
-	def __loadMenus(self):
-		self.applications = Menu()
-		self.applications.tree = gmenu.lookup_tree('applications.menu', gmenu.FLAGS_SHOW_EMPTY|gmenu.FLAGS_INCLUDE_EXCLUDED|gmenu.FLAGS_INCLUDE_NODISPLAY|gmenu.FLAGS_SHOW_ALL_SEPARATORS)
-		self.applications.visible_tree = gmenu.lookup_tree('applications.menu')
-		self.applications.path = os.path.join(util.getUserMenuPath(), self.applications.tree.get_menu_file())
-		if not os.path.isfile(self.applications.path):
-			self.applications.dom = xml.dom.minidom.parseString(util.getUserMenuXml(self.applications.tree))
-		else:
-			self.applications.dom = xml.dom.minidom.parse(self.applications.path)
-		self.__remove_whilespace_nodes(self.applications.dom)
-
-		self.settings = Menu() 	 
-		self.settings.tree = gmenu.lookup_tree('settings.menu', gmenu.FLAGS_SHOW_EMPTY|gmenu.FLAGS_INCLUDE_EXCLUDED|gmenu.FLAGS_INCLUDE_NODISPLAY|gmenu.FLAGS_SHOW_ALL_SEPARATORS)
-		self.settings.visible_tree = gmenu.lookup_tree('settings.menu') 	 
-		self.settings.path = os.path.join(util.getUserMenuPath(), self.settings.tree.get_menu_file()) 	 
-		if not os.path.isfile(self.settings.path): 	 
-			self.settings.dom = xml.dom.minidom.parseString(util.getUserMenuXml(self.settings.tree)) 	 
-		else: 	 
-			self.settings.dom = xml.dom.minidom.parse(self.settings.path) 	 
-		self.__remove_whilespace_nodes(self.settings.dom)
-
-		self.save(True)
-
-	def save(self, from_loading=False):
-		for menu in ('applications', 'settings'):
-			fd = open(getattr(self, menu).path, 'w')
-			fd.write(re.sub("\n[\s]*([^\n<]*)\n[\s]*</", "\\1</", getattr(self, menu).dom.toprettyxml().replace('<?xml version="1.0" ?>\n', '')))
-			fd.close()
-		if not from_loading:
-			self.__loadMenus()
-
-	def quit(self):
-		for file_name in os.listdir(util.getUserItemPath()):
-			if file_name[-6:-2] in ('redo', 'undo'):
-				file_path = os.path.join(util.getUserItemPath(), file_name)
-				os.unlink(file_path)
-		for file_name in os.listdir(util.getUserDirectoryPath()):
-			if file_name[-6:-2] in ('redo', 'undo'):
-				file_path = os.path.join(util.getUserDirectoryPath(), file_name)
-				os.unlink(file_path)
-		for file_name in os.listdir(util.getUserMenuPath()):
-			if file_name[-6:-2] in ('redo', 'undo'):
-				file_path = os.path.join(util.getUserMenuPath(), file_name)
-				os.unlink(file_path)
-
-	def revert(self):
-		for name in ('applications', 'settings'):
-			menu = getattr(self, name)
-			self.revertTree(menu.tree.root)
-			path = os.path.join(util.getUserMenuPath(), menu.tree.get_menu_file())
-			try:
-				os.unlink(path)
-			except OSError:
-				pass
-			#reload DOM for each menu
-			if not os.path.isfile(menu.path):
-				menu.dom = xml.dom.minidom.parseString(util.getUserMenuXml(menu.tree))
-			else:
-				menu.dom = xml.dom.minidom.parse(menu.path)
-			self.__remove_whilespace_nodes(menu.dom)
-		#reset undo/redo, no way to recover from this
-		self.__undo, self.__redo = [], []
-		self.save()
-
-	def revertTree(self, menu):
-		for child in menu.get_contents():
-			if child.get_type() == gmenu.TYPE_DIRECTORY:
-				self.revertTree(child)
-			elif child.get_type() == gmenu.TYPE_ENTRY:
-				self.revertItem(child)
-		self.revertMenu(menu)
-
-	def undo(self):
-		if len(self.__undo) == 0:
-			return
-		files = self.__undo.pop()
-		redo = []
-		for file_path in files:
-			new_path = file_path.rsplit('.', 1)[0]
-			redo_path = util.getUniqueRedoFile(new_path)
-			data = open(new_path).read()
-			open(redo_path, 'w').write(data)
-			data = open(file_path).read()
-			open(new_path, 'w').write(data)
-			os.unlink(file_path)
-			redo.append(redo_path)
-		#reload DOM to make changes stick
-		for name in ('applications', 'settings'):
-			menu = getattr(self, name)
-			if not os.path.isfile(menu.path):
-				menu.dom = xml.dom.minidom.parseString(util.getUserMenuXml(menu.tree))
-			else:
-				menu.dom = xml.dom.minidom.parse(menu.path)
-			self.__remove_whilespace_nodes(menu.dom)
-		self.__redo.append(redo)
-
-	def redo(self):
-		if len(self.__redo) == 0:
-			return
-		files = self.__redo.pop()
-		undo = []
-		for file_path in files:
-			new_path = file_path.rsplit('.', 1)[0]
-			undo_path = util.getUniqueUndoFile(new_path)
-			data = open(new_path).read()
-			open(undo_path, 'w').write(data)
-			data = open(file_path).read()
-			open(new_path, 'w').write(data)
-			os.unlink(file_path)
-			undo.append(undo_path)
-		#reload DOM to make changes stick
-		for name in ('applications', 'settings'):
-			menu = getattr(self, name)
-			if not os.path.isfile(menu.path):
-				menu.dom = xml.dom.minidom.parseString(util.getUserMenuXml(menu.tree))
-			else:
-				menu.dom = xml.dom.minidom.parse(menu.path)
-			self.__remove_whilespace_nodes(menu.dom)
-		self.__undo.append(undo)
-
-	def getMenus(self, parent=None):
-		if parent == None:
-			yield self.applications.tree.root
-			yield self.settings.tree.root
-		else:
-			for menu in parent.get_contents():
-				if menu.get_type() == gmenu.TYPE_DIRECTORY:
-					yield (menu, self.__isVisible(menu))
-
-	def getItems(self, menu):
-		for item in menu.get_contents():
-			if item.get_type() == gmenu.TYPE_SEPARATOR:
-				yield (item, True)
-			else:
-				if item.get_type() == gmenu.TYPE_ENTRY and item.get_desktop_file_id()[-19:] == '-usercustom.desktop':
-					continue
-				yield (item, self.__isVisible(item))
-
-	def canRevert(self, item):
-		if item.get_type() == gmenu.TYPE_ENTRY:
-			if util.getItemPath(item.get_desktop_file_id()):
-				path = util.getUserItemPath()
-				if os.path.isfile(os.path.join(path, item.get_desktop_file_id())):
-					return True
-		elif item.get_type() == gmenu.TYPE_DIRECTORY:
-			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):
-				path = util.getUserDirectoryPath()
-				if os.path.isfile(os.path.join(path, file_id)):
-					return True
-		return False
-
-	def setVisible(self, item, visible):
-		dom = self.__getMenu(item).dom
-		if item.get_type() == gmenu.TYPE_ENTRY:
-			self.__addUndo([self.__getMenu(item), item])
-			menu_xml = self.__getXmlMenu(self.__getPath(item.get_parent()), dom, dom)
-			if visible:
-				self.__addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Include')
-				self.__writeItem(item, no_display=False)
-			else:
-				self.__addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Exclude')
-			self.__addXmlTextElement(menu_xml, 'AppDir', util.getUserItemPath(), dom)
-		elif item.get_type() == gmenu.TYPE_DIRECTORY:
-			self.__addUndo([self.__getMenu(item), item])
-			#don't mess with it if it's empty
-			if len(item.get_contents()) == 0:
-				return
-			menu_xml = self.__getXmlMenu(self.__getPath(item), dom, dom)
-			for node in self.__getXmlNodesByName(['Deleted', 'NotDeleted'], menu_xml):
-				node.parentNode.removeChild(node)
-			if visible:
-				self.__writeMenu(item, no_display=False)
-			else:
-				self.__writeMenu(item, no_display=True)
-			self.__addXmlTextElement(menu_xml, 'DirectoryDir', util.getUserDirectoryPath(), dom)
-		self.save()
-
-	def createItem(self, parent, icon, name, comment, command, use_term, before=None, after=None):
-		file_id = self.__writeItem(None, icon, name, comment, command, use_term)
-		self.insertExternalItem(file_id, parent.menu_id, before, after)
-
-	def insertExternalItem(self, file_id, parent_id, before=None, after=None):
-		parent = self.__findMenu(parent_id)
-		dom = self.__getMenu(parent).dom
-		self.__addItem(parent, file_id, dom)
-		self.__positionItem(parent, ('Item', file_id), before, after)
-		self.__addUndo([self.__getMenu(parent), ('Item', file_id)])
-		self.save()
-
-	def createMenu(self, parent, icon, name, comment, before=None, after=None):
-		file_id = self.__writeMenu(None, icon, name, comment)
-		self.insertExternalMenu(file_id, parent.menu_id, before, after)
-
-	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.__getMenu(parent).dom
-		self.__addXmlDefaultLayout(self.__getXmlMenu(self.__getPath(parent), dom, dom) , dom)
-		menu_xml = self.__getXmlMenu(self.__getPath(parent) + '/' + menu_id, dom, dom)
-		self.__addXmlTextElement(menu_xml, 'Directory', file_id, dom)
-		self.__positionItem(parent, ('Menu', menu_id), before, after)
-		self.__addUndo([self.__getMenu(parent), ('Menu', file_id)])
-		self.save()
-
-	def createSeparator(self, parent, before=None, after=None):
-		self.__positionItem(parent, ('Separator',), before, after)
-		self.__addUndo([self.__getMenu(parent), ('Separator',)])
-		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
-		if icon == item.get_icon() and name == item.get_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()
-		if final:
-			self.__addUndo([self.__getMenu(parent), item])
-		self.__writeItem(item, icon, name, comment, command, use_term)
-		if final:
-			dom = self.__getMenu(parent).dom
-			menu_xml = self.__getXmlMenu(self.__getPath(parent), dom, 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.__getMenu(menu).dom
-		menu_xml = self.__getXmlMenu(self.__getPath(menu), dom, dom)
-		file_id = self.__writeMenu(menu, icon, name, comment)
-		if final:
-			self.__addXmlTextElement(menu_xml, 'DirectoryDir', util.getUserDirectoryPath(), dom)
-			self.__addUndo([self.__getMenu(menu), menu])
-		self.save()
-
-	def copyItem(self, item, new_parent, before=None, after=None):
-		dom = self.__getMenu(new_parent).dom
-		file_path = item.get_desktop_file_path()
-		keyfile = util.DesktopParser(file_path)
-		#erase Categories in new file
-		keyfile.set('Categories', ('',))
-		keyfile.set('Hidden', False)
-		file_id = util.getUniqueFileId(item.get_name(), '.desktop')
-		out_path = os.path.join(util.getUserItemPath(), file_id)
-		keyfile.write(open(out_path, 'w'))
-		self.__addItem(new_parent, file_id, dom)
-		self.__positionItem(new_parent, ('Item', file_id), before, after)
-		self.__addUndo([self.__getMenu(new_parent), ('Item', file_id)])
-		self.save()
-		return file_id
-
-	def moveItem(self, item, new_parent, before=None, after=None):
-		undo = []
-		if item.get_parent() != new_parent:
-			#hide old item
-			self.deleteItem(item)
-			undo.append(item)
-			file_id = self.copyItem(item, new_parent)
-			item = ('Item', file_id)
-			undo.append(item)
-		self.__positionItem(new_parent, item, before, after)
-		undo.append(self.__getMenu(new_parent))
-		self.__addUndo(undo)
-		self.save()
-
-	def moveMenu(self, menu, new_parent, before=None, after=None):
-		parent = new_parent
-		#don't move a menu into it's child
-		while parent.get_parent():
-			parent = parent.get_parent()
-			if parent == menu:
-				return False
-
-		#don't move a menu into itself
-		if new_parent == menu:
-			return False
-
-		#can't move between top-level menus
-		if self.__getMenu(menu) != self.__getMenu(new_parent):
-			return False
-		if menu.get_parent() != new_parent:
-			dom = self.__getMenu(menu).dom
-			root_path = self.__getPath(menu).split('/', 1)[0]
-			xml_root = self.__getXmlMenu(root_path, dom, dom)
-			old_path = self.__getPath(menu).split('/', 1)[1]
-			#root menu's path has no /
-			if '/' in self.__getPath(new_parent):
-				new_path = self.__getPath(new_parent).split('/', 1)[1] + '/' + menu.get_menu_id()
-			else:
-				new_path = menu.get_menu_id()
-			self.__addXmlMove(xml_root, old_path, new_path, dom)
-		self.__positionItem(new_parent, menu, before, after)
-		self.__addUndo([self.__getMenu(new_parent),])
-		self.save()
-
-	def moveSeparator(self, separator, new_parent, before=None, after=None):
-		self.__positionItem(new_parent, separator, before, after)
-		self.__addUndo([self.__getMenu(new_parent),])
-		self.save()
-
-	def deleteItem(self, item):
-		self.__writeItem(item, hidden=True)
-		self.__addUndo([item,])
-		self.save()
-
-	def deleteMenu(self, menu):
-		dom = self.__getMenu(menu).dom
-		menu_xml = self.__getXmlMenu(self.__getPath(menu), dom, dom)
-		self.__addDeleted(menu_xml, dom)
-		self.__addUndo([self.__getMenu(menu),])
-		self.save()
-
-	def deleteSeparator(self, item):
-		parent = item.get_parent()
-		contents = parent.get_contents()
-		contents.remove(item)
-		layout = self.__createLayout(contents)
-		dom = self.__getMenu(parent).dom
-		menu_xml = self.__getXmlMenu(self.__getPath(parent), dom, dom)
-		self.__addXmlLayout(menu_xml, layout, dom)
-		self.__addUndo([self.__getMenu(item.get_parent()),])
-		self.save()
-
-	def revertItem(self, item):
-		if not self.canRevert(item):
-			return
-		self.__addUndo([item,])
-		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
-		self.__addUndo([menu,])
-		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()
-
-	#private stuff
-	def __addUndo(self, items):
-		self.__undo.append([])
-		for item in items:
-			if isinstance(item, Menu):
-				file_path = item.path
-			elif isinstance(item, tuple):
-				if item[0] == 'Item':
-					file_path = os.path.join(util.getUserItemPath(), item[1])
-					if not os.path.isfile(file_path):
-						file_path = util.getItemPath(item[1])
-				elif item[0] == 'Menu':
-					file_path = os.path.join(util.getUserDirectoryPath(), item[1])
-					if not os.path.isfile(file_path):
-						file_path = util.getDirectoryPath(item[1])
-				else:
-					continue
-			elif item.get_type() == gmenu.TYPE_DIRECTORY:
-				if item.get_desktop_file_path() == None:
-					continue
-				file_path = os.path.join(util.getUserDirectoryPath(), os.path.split(item.get_desktop_file_path())[1])
-				if not os.path.isfile(file_path):
-					file_path = item.get_desktop_file_path()
-			elif item.get_type() == gmenu.TYPE_ENTRY:
-				file_path = os.path.join(util.getUserItemPath(), item.get_desktop_file_id())
-				if not os.path.isfile(file_path):
-					file_path = item.get_desktop_file_path()
-			else:
-				continue
-			data = open(file_path).read()
-			undo_path = util.getUniqueUndoFile(file_path)
-			open(undo_path, 'w').write(data)
-			self.__undo[-1].append(undo_path)
-
-	def __getMenu(self, item):
-		root = item.get_parent()
-		if not root:
-			#already at the top
-			root = item
-		else:
-			while True:
-				if root.get_parent():
-					root = root.get_parent()
-				else:
-					break
-		if root.menu_id == self.applications.tree.root.menu_id:
-			return self.applications
-		return self.settings
-
-	def __findMenu(self, menu_id, parent=None):
-		if parent == None:
-			menu = self.__findMenu(menu_id, self.applications.tree.root)
-			if menu != None:
-				return menu
-			else:
-				return self.__findMenu(menu_id, self.settings.tree.root)
-		if menu_id == self.applications.tree.root.menu_id:
-			return self.applications.tree.root
-		if menu_id == self.settings.tree.root.menu_id:
-			return self.settings.tree.root
-		for item in parent.get_contents():
-			if item.get_type() == gmenu.TYPE_DIRECTORY:
-				if item.menu_id == menu_id:
-					return item
-				menu = self.__findMenu(menu_id, item)
-				if menu != None:
-					return menu
-
-	def __isVisible(self, item):
-		if item.get_type() == gmenu.TYPE_ENTRY:
-			return not (item.get_is_excluded() or item.get_is_nodisplay())
-		menu = self.__getMenu(item)
-		if menu == self.applications:
-			root = self.applications.visible_tree.root
-		elif menu == self.settings:
-			root = self.settings.visible_tree.root
-		if item.get_type() == gmenu.TYPE_DIRECTORY:
-			if self.__findMenu(item.menu_id, root) == None:
-				return False
-		return True
-
-	def __getPath(self, menu, path=None):
-		if not path:
-                        path = menu.tree.root.get_menu_id()
-		if menu.get_parent():
-			path = self.__getPath(menu.get_parent(), path)
-			path += '/'
-			path += menu.menu_id
-		return path
-
-	def __getXmlMenu(self, path, element, dom):
-		if '/' in path:
-			(name, path) = path.split('/', 1)
-		else:
-			name = path
-			path = ''
-
-		found = None
-		for node in self.__getXmlNodesByName('Menu', element):
-			for child in self.__getXmlNodesByName('Name', node):
-				if child.childNodes[0].nodeValue == name:
-					if path:
-						found = self.__getXmlMenu(path, node, dom)
-					else:
-						found = node
-					break
-			if found:
-				break
-		if not found:
-			node = self.__addXmlMenuElement(element, name, dom)
-			if path:
-				found = self.__getXmlMenu(path, node, dom)
-			else:
-				found = node
-
-		return found
-
-	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 __writeItem(self, item=None, icon=None, name=None, comment=None, command=None, use_term=None, no_display=None, startup_notify=None, hidden=None):
-		if item:
-			file_path = item.get_desktop_file_path()
-			file_id = item.get_desktop_file_id()
-			keyfile = util.DesktopParser(file_path)
-		elif item == None and name == None:
-			raise Exception('New menu items need a name')
-		else:
-			file_id = util.getUniqueFileId(name, '.desktop')
-			keyfile = util.DesktopParser()
-		if icon:
-			keyfile.set('Icon', icon)
-			keyfile.set('Icon', icon, self.locale)
-		if name:
-			keyfile.set('Name', name)
-			keyfile.set('Name', name, self.locale)
-		if comment:
-			keyfile.set('Comment', comment)
-			keyfile.set('Comment', comment, self.locale)
-		if command:
-			keyfile.set('Exec', command)
-		if use_term != None:
-			keyfile.set('Terminal', use_term)
-		if no_display != None:
-			keyfile.set('NoDisplay', no_display)
-		if startup_notify != None:
-			keyfile.set('StartupNotify', startup_notify)
-		if hidden != None:
-			keyfile.set('Hidden', hidden)
-		out_path = os.path.join(util.getUserItemPath(), file_id)
-		keyfile.write(open(out_path, 'w'))
-		return file_id
-
-	def __writeMenu(self, menu=None, icon=None, name=None, comment=None, no_display=None):
-		if menu:
-			file_id = os.path.split(menu.get_desktop_file_path())[1]
-			file_path = menu.get_desktop_file_path()
-			keyfile = util.DesktopParser(file_path)
-		elif menu == None and name == None:
-			raise Exception('New menus need a name')
-		else:
-			file_id = util.getUniqueFileId(name, '.directory')
-			keyfile = util.DesktopParser(file_type='Directory')
-		if icon:
-			keyfile.set('Icon', icon)
-		if name:
-			keyfile.set('Name', name)
-			keyfile.set('Name', name, self.locale)
-		if comment:
-			keyfile.set('Comment', comment)
-			keyfile.set('Comment', comment, self.locale)
-		if no_display != None:
-			keyfile.set('NoDisplay', no_display)
-		out_path = os.path.join(util.getUserDirectoryPath(), file_id)
-		keyfile.write(open(out_path, 'w'))
-		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 __remove_whilespace_nodes(self, node):
-		remove_list = []
-		for child in node.childNodes:
-			if child.nodeType == xml.dom.minidom.Node.TEXT_NODE:
-				child.data = child.data.strip()
-				if not child.data.strip():
-					remove_list.append(child)
-			elif child.hasChildNodes():
-				self.__remove_whilespace_nodes(child)
-		for node in remove_list:
-			node.parentNode.removeChild(node)
-
-	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.order:
-			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()
-		layout.order = []
-
-		layout.order.append(['Merge', 'menus'])
-		for item in items:
-			if isinstance(item, tuple):
-				if item[0] == 'Separator':
-					layout.parseSeparator()
-				elif item[0] == 'Menu':
-					layout.parseMenuname(item[1])
-				elif item[0] == 'Item':
-					layout.parseFilename(item[1])
-			elif item.get_type() == gmenu.TYPE_DIRECTORY:
-				layout.parseMenuname(item.get_menu_id())
-			elif item.get_type() == gmenu.TYPE_ENTRY:
-				layout.parseFilename(item.get_desktop_file_id())
-			elif item.get_type() == gmenu.TYPE_SEPARATOR:
-				layout.parseSeparator()
-		layout.order.append(['Merge', 'files'])
-		return layout
-
-	def __addItem(self, parent, file_id, dom):
-		xml_parent = self.__getXmlMenu(self.__getPath(parent), dom, dom)
-		self.__addXmlFilename(xml_parent, dom, file_id, 'Include')
-
-	def __deleteItem(self, parent, file_id, dom, before=None, after=None):
-		xml_parent = self.__getXmlMenu(self.__getPath(parent), dom, dom)
-		self.__addXmlFilename(xml_parent, dom, file_id, 'Exclude')
-
-	def __positionItem(self, parent, item, before=None, after=None):
-		if not before and not after:
-			return
-		if after:
-			index = parent.contents.index(after) + 1
-		elif before:
-			index = parent.contents.index(before)
-		contents = parent.contents
-		#if this is a move to a new parent you can't remove the item
-		try:
-			contents.remove(item)
-		except:
-			pass
-		contents.insert(index, item)
-		layout = self.__createLayout(contents)
-		dom = self.__getMenu(parent).dom
-		menu_xml = self.__getXmlMenu(self.__getPath(parent), dom, 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, 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)
-
-class Layout:
-	def __init__(self, node=None):
-		self.order = []
-
-	def parseMenuname(self, value):
-		self.order.append(['Menuname', value])
-
-	def parseSeparator(self):
-		self.order.append(['Separator'])
-
-	def parseFilename(self, value):
-		self.order.append(['Filename', value])
-
-	def parseMerge(self, merge_type='all'):
-		self.order.append(['Merge', merge_type])
diff --git a/Alacarte/__init__.py b/Alacarte/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/Alacarte/config.py.in b/Alacarte/config.py.in
deleted file mode 100644
index 408781e..0000000
--- a/Alacarte/config.py.in
+++ /dev/null
@@ -1,8 +0,0 @@
-prefix="@prefix@"
-datadir="@datadir@"
-localedir=datadir+"/locale"
-pkgdatadir="@pkgdatadir@"
-libdir="@libdir@"
-libexecdir="@libexecdir@"
-PACKAGE="@PACKAGE@"
-VERSION="@VERSION@"
diff --git a/Alacarte/util.py b/Alacarte/util.py
deleted file mode 100644
index 33f02f4..0000000
--- a/Alacarte/util.py
+++ /dev/null
@@ -1,244 +0,0 @@
-# -*- 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 os
-import gtk, gmenu
-from ConfigParser import ConfigParser
-
-class DesktopParser(ConfigParser):
-	def __init__(self, filename=None, file_type='Application'):
-		ConfigParser.__init__(self)
-		self.filename = filename
-		self.file_type = file_type
-		if filename:
-			if len(self.read(filename)) == 0:
-				#file doesn't exist
-				self.add_section('Desktop Entry')
-		else:
-			self.add_section('Desktop Entry')
-		self._list_separator = ';'
-
-	def optionxform(self, option):
-		#makes keys not be lowercase
-		return option
-
-	def get(self, option, locale=None):
-		locale_option = option + '[%s]' % locale
-		try:
-			value = ConfigParser.get(self, 'Desktop Entry', locale_option)
-		except:
-			try:
-				value = ConfigParser.get(self, 'Desktop Entry', option)
-			except:
-				return None
-		if self._list_separator in value:
-			value = value.split(self._list_separator)
-		if value == 'true':
-			value = True
-		if value == 'false':
-			value = False
-		return value
-
-	def set(self, option, value, locale=None):
-		if locale:
-			option = option + '[%s]' % locale
-		if value == True:
-			value = 'true'
-		if value == False:
-			value = 'false'
-		if isinstance(value, tuple) or isinstance(value, list):
-			value = self._list_separator.join(value) + ';'
-		ConfigParser.set(self, 'Desktop Entry', option, value)
-
-	def write(self, file_object):
-		file_object.write('[Desktop Entry]\n')
-		items = []
-		if not self.filename:
-			file_object.write('Encoding=UTF-8\n')
-			file_object.write('Type=' + str(self.file_type) + '\n')
-		for item in self.items('Desktop Entry'):
-			items.append(item)
-		items.sort()
-		for item in items:
-			file_object.write(item[0] + '=' + item[1] + '\n')
-
-def getUniqueFileId(name, extension):
-	append = 0
-	while 1:
-		if append == 0:
-			filename = name + extension
-		else:
-			filename = name + '-' + str(append) + extension
-		if extension == '.desktop':
-			path = getUserItemPath()
-			if not os.path.isfile(os.path.join(path, filename)) and not getItemPath(filename):
-				break
-		elif extension == '.directory':
-			path = getUserDirectoryPath()
-			if not os.path.isfile(os.path.join(path, filename)) and not getDirectoryPath(filename):
-				break
-		append += 1
-	return filename
-
-def getUniqueRedoFile(filepath):
-	append = 0
-	while 1:
-		new_filepath = filepath + '.redo-' + str(append)
-		if not os.path.isfile(new_filepath):
-			break
-		else:
-			append += 1
-	return new_filepath
-
-def getUniqueUndoFile(filepath):
-	filename, extension = os.path.split(filepath)[1].rsplit('.', 1)
-	append = 0
-	while 1:
-		if extension == 'desktop':
-			path = getUserItemPath()
-		elif extension == 'directory':
-			path = getUserDirectoryPath()
-		elif extension == 'menu':
-			path = getUserMenuPath()
-		new_filepath = os.path.join(path, filename + '.' + extension + '.undo-' + str(append))
-		if not os.path.isfile(new_filepath):
-			break
-		else:
-			append += 1
-	return new_filepath
-
-def getUserMenuPath():
-	menu_dir = None
-	if os.environ.has_key('XDG_CONFIG_HOME'):
-		menu_dir = os.path.join(os.environ['XDG_CONFIG_HOME'], 'menus')
-	else:
-		menu_dir = os.path.join(os.environ['HOME'], '.config', 'menus')
-	#move .config out of the way if it's not a dir, it shouldn't be there
-	if os.path.isfile(os.path.split(menu_dir)[0]):
-		os.rename(os.path.split(menu_dir)[0], os.path.split(menu_dir)[0] + '.old')
-	if not os.path.isdir(menu_dir):
-		os.makedirs(menu_dir)
-	return menu_dir
-
-def getItemPath(file_id):
-	if os.environ.has_key('XDG_DATA_DIRS'):
-		for system_path in os.environ['XDG_DATA_DIRS'].split(':'):
-			file_path = os.path.join(system_path, 'applications', file_id)
-			if os.path.isfile(file_path):
-				return file_path
-	file_path = os.path.join('/', 'usr', 'share', 'applications', file_id)
-	if os.path.isfile(file_path):
-		return file_path
-	return False
-
-def getUserItemPath():
-	item_dir = None
-	if os.environ.has_key('XDG_DATA_HOME'):
-		item_dir = os.path.join(os.environ['XDG_DATA_HOME'], 'applications')
-	else:
-		item_dir = os.path.join(os.environ['HOME'], '.local', 'share', 'applications')
-	if not os.path.isdir(item_dir):
-		os.makedirs(item_dir)
-	return item_dir
-
-def getDirectoryPath(file_id):
-	home = getUserDirectoryPath()
-	file_path = os.path.join(home, file_id)
-	if os.path.isfile(file_path):
-		return file_path
-	if os.environ.has_key('XDG_DATA_DIRS'):
-		for system_path in os.environ['XDG_DATA_DIRS'].split(':'):
-			file_path = os.path.join(system_path, 'desktop-directories', file_id)
-			if os.path.isfile(file_path):
-				return file_path
-	file_path = os.path.join('/', 'usr', 'share', 'desktop-directories', file_id)
-	if os.path.isfile(file_path):
-		return file_path
-	return False
-
-def getUserDirectoryPath():
-	menu_dir = None
-	if os.environ.has_key('XDG_DATA_HOME'):
-		menu_dir = os.path.join(os.environ['XDG_DATA_HOME'], 'desktop-directories')
-	else:
-		menu_dir = os.path.join(os.environ['HOME'], '.local', 'share', 'desktop-directories')
-	if not os.path.isdir(menu_dir):
-		os.makedirs(menu_dir)
-	return menu_dir
-
-def getSystemMenuPath(file_name):
-	if os.environ.has_key('XDG_CONFIG_DIRS'):
-		for system_path in os.environ['XDG_CONFIG_DIRS'].split(':'):
-			file_path = os.path.join(system_path, 'menus', file_name)
-			if os.path.isfile(file_path):
-				return file_path
-	file_path = os.path.join('/', 'etc', 'xdg', 'menus', file_name)
-	if os.path.isfile(file_path):
-		return file_path
-	return False
-
-def getUserMenuXml(tree):
-	system_file = getSystemMenuPath(tree.get_menu_file())
-	name = tree.root.get_menu_id()
-	menu_xml = "<!DOCTYPE Menu PUBLIC '-//freedesktop//DTD Menu 1.0//EN' 'http://standards.freedesktop.org/menu-spec/menu-1.0.dtd'>\n"
-	menu_xml += "<Menu>\n  <Name>" + name + "</Name>\n  "
-	menu_xml += "<MergeFile type=\"parent\">" + system_file +	"</MergeFile>\n</Menu>\n"
-	return menu_xml
-
-def getIcon(item, for_properties=False):
-	pixbuf, path = None, None
-	if item == None:
-		if for_properties:
-			return None, None
-		return None
-	if isinstance(item, str):
-		iconName = item
-	else:
-		iconName = item.get_icon()
-	if iconName and not '/' in iconName and iconName[-3:] in ('png', 'svg', 'xpm'):
-		iconName = iconName[:-4]
-	icon_theme = gtk.icon_theme_get_default()
-	try:
-		pixbuf = icon_theme.load_icon(iconName, 24, 0)
-		path = icon_theme.lookup_icon(iconName, 24, 0).get_filename()
-	except:
-		if iconName and '/' in iconName:
-			try:
-				pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(iconName, 24, 24)
-				path = iconName
-			except:
-				pass
-		if pixbuf == None:
-			if for_properties:
-				return None, None
-			if item.get_type() == gmenu.TYPE_DIRECTORY:
-				iconName = 'gnome-fs-directory'
-			elif item.get_type() == gmenu.TYPE_ENTRY:
-				iconName = 'application-default-icon'
-			try:
-				pixbuf = icon_theme.load_icon(iconName, 24, 0)
-				path = icon_theme.lookup_icon(iconName, 24, 0).get_filename()
-			except:
-				return None
-	if pixbuf == None:
-		return None
-	if pixbuf.get_width() != 24 or pixbuf.get_height() != 24:
-		pixbuf = pixbuf.scale_simple(24, 24, gtk.gdk.INTERP_HYPER)
-	if for_properties:
-		return pixbuf, path
-	return pixbuf
diff --git a/COPYING b/COPYING
index eb685a5..5ab7695 100644
--- a/COPYING
+++ b/COPYING
@@ -1,13 +1,14 @@
-		  GNU LIBRARY GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
 
- Copyright (C) 1991 Free Software Foundation, Inc.
-                    675 Mass Ave, Cambridge, MA 02139, USA
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-[This is the first released version of the library GPL.  It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
 
 			    Preamble
 
@@ -16,97 +17,109 @@ freedom to share and change it.  By contrast, the GNU General Public
 Licenses are intended to guarantee your freedom to share and change
 free software--to make sure the software is free for all its users.
 
-  This license, the Library General Public License, applies to some
-specially designated Free Software Foundation software, and to any
-other libraries whose authors decide to use it.  You can use it for
-your libraries, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
 
   To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if
-you distribute copies of the library, or if you modify it.
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
 
   For example, if you distribute copies of the library, whether gratis
 or for a fee, you must give the recipients all the rights that we gave
 you.  You must make sure that they, too, receive or can get the source
-code.  If you link a program with the library, you must provide
-complete object files to the recipients so that they can relink them
-with the library, after making changes to the library and recompiling
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
 it.  And you must show them these terms so they know their rights.
 
-  Our method of protecting your rights has two steps: (1) copyright
-the library, and (2) offer you this license which gives you legal
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
 permission to copy, distribute and/or modify the library.
 
-  Also, for each distributor's protection, we want to make certain
-that everyone understands that there is no warranty for this free
-library.  If the library is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original
-version, so that any problems introduced by others will not reflect on
-the original authors' reputations.
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
 
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that companies distributing free
-software will individually obtain patent licenses, thus in effect
-transforming the program into proprietary software.  To prevent this,
-we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
-  Most GNU software, including some libraries, is covered by the ordinary
-GNU General Public License, which was designed for utility programs.  This
-license, the GNU Library General Public License, applies to certain
-designated libraries.  This license is quite different from the ordinary
-one; be sure to read it in full, and don't assume that anything in it is
-the same as in the ordinary license.
-
-  The reason we have a separate public license for some libraries is that
-they blur the distinction we usually make between modifying or adding to a
-program and simply using it.  Linking a program with a library, without
-changing the library, is in some sense simply using the library, and is
-analogous to running a utility program or application program.  However, in
-a textual and legal sense, the linked executable is a combined work, a
-derivative of the original library, and the ordinary General Public License
-treats it as such.
-
-  Because of this blurred distinction, using the ordinary General
-Public License for libraries did not effectively promote software
-sharing, because most developers did not use the libraries.  We
-concluded that weaker conditions might promote sharing better.
-
-  However, unrestricted linking of non-free programs would deprive the
-users of those programs of all benefit from the free status of the
-libraries themselves.  This Library General Public License is intended to
-permit developers of non-free programs to use free libraries, while
-preserving your freedom as a user of such programs to change the free
-libraries that are incorporated in them.  (We have not seen how to achieve
-this as regards changes in header files, but we have achieved it as regards
-changes in the actual functions of the Library.)  The hope is that this
-will lead to faster development of free libraries.
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
 
   The precise terms and conditions for copying, distribution and
 modification follow.  Pay close attention to the difference between a
 "work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, while the latter only
-works together with the library.
-
-  Note that it is possible for a library to be covered by the ordinary
-General Public License rather than by this special one.
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
 
-		  GNU LIBRARY GENERAL PUBLIC LICENSE
+		  GNU LESSER GENERAL PUBLIC LICENSE
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
-  0. This License Agreement applies to any software library which
-contains a notice placed by the copyright holder or other authorized
-party saying it may be distributed under the terms of this Library
-General Public License (also called "this License").  Each licensee is
-addressed as "you".
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
 
   A "library" means a collection of software functions and/or data
 prepared so as to be conveniently linked with application programs
@@ -255,7 +268,7 @@ distribute the object code for the work under the terms of Section 6.
 Any executables containing that work also fall under Section 6,
 whether or not they are linked directly with the Library itself.
 
-  6. As an exception to the Sections above, you may also compile or
+  6. As an exception to the Sections above, you may also combine or
 link a "work that uses the Library" with the Library to produce a
 work containing portions of the Library, and distribute that work
 under terms of your choice, provided that the terms permit
@@ -282,23 +295,31 @@ of these things:
     Library will not necessarily be able to recompile the application
     to use the modified definitions.)
 
-    b) Accompany the work with a written offer, valid for at
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
     least three years, to give the same user the materials
     specified in Subsection 6a, above, for a charge no more
     than the cost of performing this distribution.
 
-    c) If distribution of the work is made by offering access to copy
+    d) If distribution of the work is made by offering access to copy
     from a designated place, offer equivalent access to copy the above
     specified materials from the same place.
 
-    d) Verify that the user has already received a copy of these
+    e) Verify that the user has already received a copy of these
     materials or that you have already sent this user a copy.
 
   For an executable, the required form of the "work that uses the
 Library" must include any data and utility programs needed for
 reproducing the executable from it.  However, as a special exception,
-the source code distributed need not include anything that is normally
-distributed (in either source or binary form) with the major
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
 components (compiler, kernel, and so on) of the operating system on
 which the executable runs, unless that component itself accompanies
 the executable.
@@ -347,7 +368,7 @@ Library), the recipient automatically receives a license from the
 original licensor to copy, distribute, link with or modify the Library
 subject to these terms and conditions.  You may not impose any further
 restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
+You are not responsible for enforcing compliance by third parties with
 this License.
 
   11. If, as a consequence of a court judgment or allegation of patent
@@ -390,7 +411,7 @@ excluded.  In such case, this License incorporates the limitation as if
 written in the body of this License.
 
   13. The Free Software Foundation may publish revised and/or new
-versions of the Library General Public License from time to time.
+versions of the Lesser General Public License from time to time.
 Such new versions will be similar in spirit to the present version,
 but may differ in detail to address new problems or concerns.
 
@@ -436,7 +457,7 @@ DAMAGES.
 
 		     END OF TERMS AND CONDITIONS
 
-     Appendix: How to Apply These Terms to Your New Libraries
+           How to Apply These Terms to Your New Libraries
 
   If you develop a new library, and you want it to be of the greatest
 possible use to the public, we recommend making it free software that
@@ -453,18 +474,18 @@ convey the exclusion of warranty; and each file should have at least the
     Copyright (C) <year>  <name of author>
 
     This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Library General Public
+    modify it under the terms of the GNU Lesser General Public
     License as published by the Free Software Foundation; either
-    version 2 of the License, or (at your option) any later version.
+    version 2.1 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.
+    Lesser 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
 Also add information on how to contact you by electronic and paper mail.
 
@@ -479,3 +500,5 @@ necessary.  Here is a sample; alter the names:
   Ty Coon, President of Vice
 
 That's all there is to it!
+
+
diff --git a/INSTALL b/INSTALL
index d3c5b40..8b82ade 100644
--- a/INSTALL
+++ b/INSTALL
@@ -2,15 +2,15 @@ Installation Instructions
 *************************
 
 Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
-2006, 2007 Free Software Foundation, Inc.
+2006, 2007, 2008 Free Software Foundation, Inc.
 
-This file is free documentation; the Free Software Foundation gives
+   This file is free documentation; the Free Software Foundation gives
 unlimited permission to copy, distribute and modify it.
 
 Basic Installation
 ==================
 
-Briefly, the shell commands `./configure; make; make install' should
+   Briefly, the shell commands `./configure; make; make install' should
 configure, build, and install this package.  The following
 more-detailed instructions are generic; see the `README' file for
 instructions specific to this package.
@@ -73,9 +73,9 @@ The simplest way to compile this package is:
 Compilers and Options
 =====================
 
-Some systems require unusual options for compilation or linking that the
-`configure' script does not know about.  Run `./configure --help' for
-details on some of the pertinent environment variables.
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
 
    You can give `configure' initial values for configuration parameters
 by setting variables in the command line or in the environment.  Here
@@ -88,7 +88,7 @@ is an example:
 Compiling For Multiple Architectures
 ====================================
 
-You can compile the package for more than one kind of computer at the
+   You can compile the package for more than one kind of computer at the
 same time, by placing the object files for each architecture in their
 own directory.  To do this, you can use GNU `make'.  `cd' to the
 directory where you want the object files and executables to go and run
@@ -100,10 +100,24 @@ architecture at a time in the source code directory.  After you have
 installed the package for one architecture, use `make distclean' before
 reconfiguring for another architecture.
 
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
 Installation Names
 ==================
 
-By default, `make install' installs the package's commands under
+   By default, `make install' installs the package's commands under
 `/usr/local/bin', include files under `/usr/local/include', etc.  You
 can specify an installation prefix other than `/usr/local' by giving
 `configure' the option `--prefix=PREFIX'.
@@ -126,7 +140,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
 Optional Features
 =================
 
-Some packages pay attention to `--enable-FEATURE' options to
+   Some packages pay attention to `--enable-FEATURE' options to
 `configure', where FEATURE indicates an optional part of the package.
 They may also pay attention to `--with-PACKAGE' options, where PACKAGE
 is something like `gnu-as' or `x' (for the X Window System).  The
@@ -138,14 +152,36 @@ find the X include and library files automatically, but if it doesn't,
 you can use the `configure' options `--x-includes=DIR' and
 `--x-libraries=DIR' to specify their locations.
 
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
 Specifying the System Type
 ==========================
 
-There may be some features `configure' cannot figure out automatically,
-but needs to determine by the type of machine the package will run on.
-Usually, assuming the package is built to be run on the _same_
-architectures, `configure' can figure that out, but if it prints a
-message saying it cannot guess the machine type, give it the
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
 `--build=TYPE' option.  TYPE can either be a short name for the system
 type, such as `sun4', or a canonical name which has the form:
 
@@ -171,9 +207,9 @@ eventually be run) with `--host=TYPE'.
 Sharing Defaults
 ================
 
-If you want to set default values for `configure' scripts to share, you
-can create a site shell script called `config.site' that gives default
-values for variables like `CC', `cache_file', and `prefix'.
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
 `configure' looks for `PREFIX/share/config.site' if it exists, then
 `PREFIX/etc/config.site' if it exists.  Or, you can set the
 `CONFIG_SITE' environment variable to the location of the site script.
@@ -182,7 +218,7 @@ A warning: not all `configure' scripts look for a site script.
 Defining Variables
 ==================
 
-Variables not defined in a site shell script can be set in the
+   Variables not defined in a site shell script can be set in the
 environment passed to `configure'.  However, some packages may run
 configure again during the build, and the customized values of these
 variables may be lost.  In order to avoid this problem, you should set
@@ -201,11 +237,19 @@ an Autoconf bug.  Until the bug is fixed you can use this workaround:
 `configure' Invocation
 ======================
 
-`configure' recognizes the following options to control how it operates.
+   `configure' recognizes the following options to control how it
+operates.
 
 `--help'
 `-h'
-     Print a summary of the options to `configure', and exit.
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
 
 `--version'
 `-V'
@@ -232,6 +276,16 @@ an Autoconf bug.  Until the bug is fixed you can use this workaround:
      Look for the package's source code in directory DIR.  Usually
      `configure' can determine that directory automatically.
 
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *Note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
 `configure' also accepts some other, not widely useful, options.  Run
 `configure --help' for more details.
 
diff --git a/Makefile.am b/Makefile.am
index 9611bc7..6962579 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,24 +1,40 @@
-## Process this file with automake to produce Makefile.in
+NULL = 
 
-SUBDIRS = data po Alacarte
+#Build in these directories:
 
-CLEANFILES=
-
-bin_SCRIPTS = alacarte
-CLEANFILES += alacarte
+SUBDIRS = \
+	data \
+	src \
+	po \
+	$(NULL)
 
-DISTCLEANFILES = ChangeLog
+CLEANFILES=
 
-alacarte: alacarte.in
-	sed -e s!\ PYTHON\@! PYTHON@!		\
-	    -e s!\ PYOPTIONS\@!-OOt!		\
-	    < $< > $@
-alacarte: Makefile
+alacartedocdir = ${prefix}/doc/alacarte
+alacartedoc_DATA = \
+	ChangeLog.pre-git \
+	README \
+	COPYING \
+	AUTHORS \
+	INSTALL \
+	NEWS \
+	$(NULL)
 
 EXTRA_DIST = \
-	alacarte.in \
+	$(alacartedoc_DATA) \
+	intltool-extract.in \
+	intltool-merge.in \
+	intltool-update.in \
 	MAINTAINERS \
-	ChangeLog.pre-git
+	$(NULL)
+
+DISTCLEANFILES = \
+	intltool-extract \
+	intltool-merge \
+	intltool-update
+	po/.intltool-merge-cache \
+	ChangeLog \
+	$(NULL)
 
 ChangeLog:
 	@echo Creating $@
@@ -35,4 +51,4 @@ ChangeLog:
 	fi
 
 .PHONY: ChangeLog
-	
+
diff --git a/acinclude.m4 b/acinclude.m4
deleted file mode 100644
index 1227123..0000000
--- a/acinclude.m4
+++ /dev/null
@@ -1,132 +0,0 @@
-# Copyright 1999, 2000, 2001, 2002, 2003  Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# AM_PATH_PYTHON_VERSION(ABI-VERSION1, [MINIMUM-VERSION1 [, ABI-VERSION2, [MINIMUM-VERSION2 ...]]])
-#
-# An alternative to AM_PATH_PYTHON that checks for specific python ABI/version pairs.
-# Example:
-#    AM_PATH_PYTHON_VERSION(2.3, 2.3.5, 2.4, 2.4.0)
-# checks for a python2.3 binary returning python version >= 2.3.5, and
-# if that fails it looks for python2.4 containing version >= 2.4.0
-# It aborts configure with an error if no statisfying version is found.
-# Env. var. PYTHON can be used to point a specific/laternate version to configure.
-
-AC_DEFUN([AM_PATH_PYTHON_VERSION],
- [
-  m4_pattern_allow([m4_shift])
-  _python_save="$PYTHON"
-  dnl Find a Python interpreter with corresponding ABI version.
-
-  m4_define(PYTHON_var, PYTHON[]m4_translit($1,[.],[_]))
-
-  if test -z "$PYTHON"; then
-    AC_PATH_PROG(PYTHON_var, python$1, [])
-  else
-    PYTHON_var="$PYTHON"
-  fi
-
-  PYTHON="$PYTHON_var"
-  AC_SUBST(PYTHON)
-
-  if test -n "$PYTHON"; then
-
-  m4_if([$2],[],[
-  ], [
-      dnl A version check is needed.
-      AC_MSG_CHECKING([whether $PYTHON version is >= $2])
-      AM_PYTHON_CHECK_VERSION([$PYTHON], [$2],
-			      [AC_MSG_RESULT(yes)],
-			      [AC_MSG_RESULT([no]); PYTHON=""])
-  ])
-
-  fi
-
-  if test -z "$PYTHON"; then
-    dnl if more arguments, shift/recurse, else fail
-    m4_if([$3],[],[
-        AC_MSG_ERROR([no suitable Python interpreter found])
-    ], [
-        PYTHON="$_python_save"
-        AM_PATH_PYTHON_VERSION(m4_shift(m4_shift($@)))
-    ])
-
-  else
-
-  dnl Query Python for its version number.  Getting [:3] seems to be
-  dnl the best way to do this; it's what "site.py" does in the standard
-  dnl library.
-
-  AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],
-    [am_cv_python_version=`$PYTHON -c "import sys; print sys.version[[:3]]"`])
-  AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])
-
-  dnl Use the values of $prefix and $exec_prefix for the corresponding
-  dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX.  These are made
-  dnl distinct variables so they can be overridden if need be.  However,
-  dnl general consensus is that you shouldn't need this ability.
-
-  AC_SUBST([PYTHON_PREFIX], ['${prefix}'])
-  AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}'])
-
-  dnl At times (like when building shared libraries) you may want
-  dnl to know which OS platform Python thinks this is.
-
-  AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],
-    [am_cv_python_platform=`$PYTHON -c "import sys; print sys.platform"`])
-  AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])
-
-
-  dnl Set up 4 directories:
-
-  dnl pythondir -- where to install python scripts.  This is the
-  dnl   site-packages directory, not the python standard library
-  dnl   directory like in previous automake betas.  This behavior
-  dnl   is more consistent with lispdir.m4 for example.
-  dnl Query distutils for this directory.  distutils does not exist in
-  dnl Python 1.5, so we fall back to the hardcoded directory if it
-  dnl doesn't work.
-  AC_CACHE_CHECK([for $am_display_PYTHON script directory],
-    [am_cv_python_pythondir],
-    [am_cv_python_pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(0,0,prefix='$PYTHON_PREFIX')" 2>/dev/null ||
-     echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`])
-  AC_SUBST([pythondir], [$am_cv_python_pythondir])
-
-  dnl pkgpythondir -- $PACKAGE directory under pythondir.  Was
-  dnl   PYTHON_SITE_PACKAGE in previous betas, but this naming is
-  dnl   more consistent with the rest of automake.
-
-  AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])
-
-  dnl pyexecdir -- directory for installing python extension modules
-  dnl   (shared libraries)
-  dnl Query distutils for this directory.  distutils does not exist in
-  dnl Python 1.5, so we fall back to the hardcoded directory if it
-  dnl doesn't work.
-  AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],
-    [am_cv_python_pyexecdir],
-    [am_cv_python_pyexecdir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix='$PYTHON_EXEC_PREFIX')" 2>/dev/null ||
-     echo "${PYTHON_EXEC_PREFIX}/lib/python${PYTHON_VERSION}/site-packages"`])
-  AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
-
-  dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
-
-  AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])
-
-  fi
-
-])
-
diff --git a/alacarte.in b/alacarte.in
deleted file mode 100644
index 3ec4cfe..0000000
--- a/alacarte.in
+++ /dev/null
@@ -1,37 +0,0 @@
-#! @PYTHON@ @PYOPTIONS@
-# -*- 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
-from Alacarte.MainWindow import MainWindow
-
-def main():
-	try:
-		from Alacarte import config
-		datadir = config.pkgdatadir
-		version = config.VERSION
-	except:
-		datadir = '.'
-		version = '0.9'
-	app = MainWindow(datadir, version, sys.argv)
-	app.run()
-
-if __name__ == '__main__':
-	main()
-
diff --git a/alacarte.png b/alacarte.png
deleted file mode 100644
index 0320b59..0000000
Binary files a/alacarte.png and /dev/null differ
diff --git a/alacarte.svg b/alacarte.svg
deleted file mode 100644
index 71cfa90..0000000
--- a/alacarte.svg
+++ /dev/null
@@ -1,406 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/";
-   xmlns:cc="http://web.resource.org/cc/";
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
-   xmlns:svg="http://www.w3.org/2000/svg";
-   xmlns="http://www.w3.org/2000/svg";
-   xmlns:xlink="http://www.w3.org/1999/xlink";
-   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd";
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
-   width="48px"
-   height="48px"
-   id="svg1307"
-   sodipodi:version="0.32"
-   inkscape:version="0.43"
-   sodipodi:docbase="/home/andreas/projekt/tango/scalable"
-   sodipodi:docname="menu-editor.svg">
-  <defs
-     id="defs1309">
-    <linearGradient
-       id="linearGradient4966">
-      <stop
-         style="stop-color:#2e3436;stop-opacity:1;"
-         offset="0"
-         id="stop4968" />
-      <stop
-         style="stop-color:#2e3436;stop-opacity:0;"
-         offset="1"
-         id="stop4970" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient4936">
-      <stop
-         style="stop-color:#eeeeec"
-         offset="0"
-         id="stop4938" />
-      <stop
-         style="stop-color:#d3d7cf"
-         offset="1"
-         id="stop4940" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient2994">
-      <stop
-         style="stop-color:#000000;stop-opacity:1;"
-         offset="0"
-         id="stop2996" />
-      <stop
-         style="stop-color:#c9c9c9;stop-opacity:1;"
-         offset="1"
-         id="stop2998" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2994"
-       id="linearGradient2326"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.866025,-0.5,0.5,0.866025,-7.891136,19.22495)"
-       x1="25.71875"
-       y1="31.046875"
-       x2="25.514589"
-       y2="30.703125" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient2984">
-      <stop
-         style="stop-color:#e7e2b8;stop-opacity:1;"
-         offset="0"
-         id="stop2986" />
-      <stop
-         style="stop-color:#e7e2b8;stop-opacity:0;"
-         offset="1"
-         id="stop2988" />
-    </linearGradient>
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2984"
-       id="radialGradient2324"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(2.531882,-1.461783,1.014859,1.757786,-70.15912,22.83318)"
-       cx="29.053354"
-       cy="27.640751"
-       fx="29.053354"
-       fy="27.640751"
-       r="3.2408544" />
-    <linearGradient
-       id="linearGradient2974">
-      <stop
-         style="stop-color:#c1c1c1;stop-opacity:1;"
-         offset="0"
-         id="stop2976" />
-      <stop
-         style="stop-color:#acacac;stop-opacity:1;"
-         offset="1"
-         id="stop2978" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2974"
-       id="linearGradient2322"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.866025,-0.5,0.5,0.866025,-7.818316,19.03857)"
-       x1="46"
-       y1="19.8125"
-       x2="47.6875"
-       y2="22.625" />
-    <linearGradient
-       id="linearGradient2966">
-      <stop
-         style="stop-color:#ffd1d1;stop-opacity:1;"
-         offset="0"
-         id="stop2968" />
-      <stop
-         id="stop3006"
-         offset="0.5"
-         style="stop-color:#ff1d1d;stop-opacity:1;" />
-      <stop
-         style="stop-color:#6f0000;stop-opacity:1;"
-         offset="1"
-         id="stop2970" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient2966"
-       id="linearGradient2320"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(0.866025,-0.5,0.5,0.866025,-7.818316,19.03857)"
-       x1="48.90625"
-       y1="17.376184"
-       x2="50.988335"
-       y2="22.250591" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4936"
-       id="linearGradient4942"
-       x1="20.07143"
-       y1="7.7857146"
-       x2="20.214283"
-       y2="35.92857"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4966"
-       id="radialGradient4972"
-       cx="23.223421"
-       cy="43.927216"
-       fx="23.223421"
-       fy="43.927216"
-       r="20.708128"
-       gradientTransform="matrix(1.010133,-7.890436e-3,1.565376e-3,0.101415,-0.293998,39.78877)"
-       gradientUnits="userSpaceOnUse" />
-    <radialGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient4966"
-       id="radialGradient4976"
-       gradientUnits="userSpaceOnUse"
-       gradientTransform="matrix(1.010133,-7.890436e-3,1.565376e-3,0.101415,-0.293998,39.78877)"
-       cx="23.223421"
-       cy="43.927216"
-       fx="23.223421"
-       fy="43.927216"
-       r="20.708128" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="7"
-     inkscape:cx="36.905448"
-     inkscape:cy="36.294049"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     stroke="#eeeeec"
-     fill="#2e3436"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:window-width="1270"
-     inkscape:window-height="945"
-     inkscape:window-x="0"
-     inkscape:window-y="25" />
-  <metadata
-     id="metadata1312">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
-        <dc:title>Menu editor</dc:title>
-        <dc:date>April 2006</dc:date>
-        <dc:creator>
-          <cc:Agent>
-            <dc:title>Andreas Nilsson</dc:title>
-          </cc:Agent>
-        </dc:creator>
-        <dc:publisher>
-          <cc:Agent>
-            <dc:title></dc:title>
-          </cc:Agent>
-        </dc:publisher>
-        <dc:source>http://tango-project.org</dc:source>
-        <dc:subject>
-          <rdf:Bag>
-            <rdf:li>menu-editor</rdf:li>
-            <rdf:li>menu</rdf:li>
-          </rdf:Bag>
-        </dc:subject>
-        <cc:license
-           rdf:resource="http://creativecommons.org/licenses/GPL/2.0/"; />
-      </cc:Work>
-      <cc:License
-         rdf:about="http://creativecommons.org/licenses/GPL/2.0/";>
-        <cc:permits
-           rdf:resource="http://web.resource.org/cc/Reproduction"; />
-        <cc:permits
-           rdf:resource="http://web.resource.org/cc/Distribution"; />
-        <cc:requires
-           rdf:resource="http://web.resource.org/cc/Notice"; />
-        <cc:permits
-           rdf:resource="http://web.resource.org/cc/DerivativeWorks"; />
-        <cc:requires
-           rdf:resource="http://web.resource.org/cc/ShareAlike"; />
-        <cc:requires
-           rdf:resource="http://web.resource.org/cc/SourceCode"; />
-      </cc:License>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       sodipodi:type="arc"
-       style="opacity:0.7;fill:url(#radialGradient4972);fill-opacity:1;stroke:none;stroke-width:1.08584559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4956"
-       sodipodi:cx="23.233509"
-       sodipodi:cy="44.060406"
-       sodipodi:rx="20.708128"
-       sodipodi:ry="2.5253813"
-       d="M 43.941637 44.060406 A 20.708128 2.5253813 0 1 1  2.5253811,44.060406 A 20.708128 2.5253813 0 1 1  43.941637 44.060406 z"
-       transform="matrix(0.893369,0,0,1.187939,-1.256097,-8.341083)" />
-    <rect
-       style="opacity:1;fill:url(#linearGradient4942);fill-opacity:1.0;stroke:#888a85;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1315"
-       width="27.979967"
-       height="40.984352"
-       x="5.5100136"
-       y="3.5078206" />
-    <rect
-       style="opacity:1;fill:#729fcf;fill-opacity:1;stroke:#3465a4;stroke-width:1.0000006;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect1321"
-       width="26.036121"
-       height="7.0718627"
-       x="6.4863005"
-       y="12.465624" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1.30954063;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path1339"
-       sodipodi:cx="8.4642859"
-       sodipodi:cy="16.678572"
-       sodipodi:rx="1.3928572"
-       sodipodi:ry="1.3928572"
-       d="M 9.857143 16.678572 A 1.3928572 1.3928572 0 1 1  7.0714287,16.678572 A 1.3928572 1.3928572 0 1 1  9.857143 16.678572 z"
-       transform="matrix(1.401969,0,0,1.401971,-1.913924,-15.33562)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1.30954063;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path2214"
-       sodipodi:cx="8.4642859"
-       sodipodi:cy="16.678572"
-       sodipodi:rx="1.3928572"
-       sodipodi:ry="1.3928572"
-       d="M 9.857143 16.678572 A 1.3928572 1.3928572 0 1 1  7.0714287,16.678572 A 1.3928572 1.3928572 0 1 1  9.857143 16.678572 z"
-       transform="matrix(1.401969,0,0,1.401971,-1.913924,-7.335619)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1.30954063;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path2218"
-       sodipodi:cx="8.4642859"
-       sodipodi:cy="16.678572"
-       sodipodi:rx="1.3928572"
-       sodipodi:ry="1.3928572"
-       d="M 9.857143 16.678572 A 1.3928572 1.3928572 0 1 1  7.0714287,16.678572 A 1.3928572 1.3928572 0 1 1  9.857143 16.678572 z"
-       transform="matrix(1.401969,0,0,1.401971,-1.913924,0.569872)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1.30954063;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path2220"
-       sodipodi:cx="8.4642859"
-       sodipodi:cy="16.678572"
-       sodipodi:rx="1.3928572"
-       sodipodi:ry="1.3928572"
-       d="M 9.857143 16.678572 A 1.3928572 1.3928572 0 1 1  7.0714287,16.678572 A 1.3928572 1.3928572 0 1 1  9.857143 16.678572 z"
-       transform="matrix(1.401969,0,0,1.401971,-1.913924,7.569872)" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:1;fill:#2e3436;fill-opacity:1;stroke:none;stroke-width:1.30954063;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path2222"
-       sodipodi:cx="8.4642859"
-       sodipodi:cy="16.678572"
-       sodipodi:rx="1.3928572"
-       sodipodi:ry="1.3928572"
-       d="M 9.857143 16.678572 A 1.3928572 1.3928572 0 1 1  7.0714287,16.678572 A 1.3928572 1.3928572 0 1 1  9.857143 16.678572 z"
-       transform="matrix(1.401969,0,0,1.401971,-1.913924,15.56987)" />
-    <rect
-       style="opacity:0.5;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:1.00000107;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect2226"
-       width="25.963591"
-       height="38.975361"
-       x="6.5220456"
-       y="4.5096369" />
-    <rect
-       style="opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4952"
-       width="18"
-       height="2"
-       x="13"
-       y="30" />
-    <rect
-       style="opacity:0.3;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.9999997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4954"
-       width="11.980886"
-       height="2.9486477"
-       x="13.499928"
-       y="37.514267" />
-    <g
-       style="display:inline"
-       id="g2311"
-       transform="translate(-2.348519,3.049312)">
-      <path
-         sodipodi:nodetypes="cccccc"
-         id="path2960"
-         d="M 28.359316,35.679164 L 30.418209,27.995272 L 42.944906,9.504649 C 45.134489,6.797118 49.124913,9.833735 47.44759,12.678526 L 34.787519,30.813139 L 28.359316,35.679164 z "
-         style="opacity:1;color:#000000;fill:#cb9022;fill-opacity:1;fill-rule:evenodd;stroke:#5c410c;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
-      <path
-         style="opacity:1;color:#000000;fill:url(#linearGradient2320);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
-         d="M 40.286798,14.359073 C 40.286798,14.359073 41.578584,13.721513 42.690724,14.522794 C 43.83646,15.348282 44.018849,16.823174 44.018849,16.823174 L 47.141664,12.169549 C 47.141664,12.169549 47.958477,10.680247 46.288118,9.378665 C 44.640576,8.094862 43.38255,9.721073 43.38255,9.721073 L 40.286798,14.359073 z "
-         id="path2964"
-         sodipodi:nodetypes="czcczcc" />
-      <path
-         sodipodi:nodetypes="czcczcc"
-         id="path2962"
-         d="M 40.286798,14.359073 C 40.286798,14.359073 41.578584,13.721513 42.690724,14.522794 C 43.83646,15.348282 44.018849,16.823174 44.018849,16.823174 L 45.2509,14.957149 C 45.2509,14.957149 45.307697,13.401461 44.096593,12.520331 C 42.852202,11.614983 41.518849,12.493047 41.518849,12.493047 L 40.286798,14.359073 z "
-         style="opacity:1;color:#000000;fill:url(#linearGradient2322);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
-      <path
-         sodipodi:nodetypes="cccc"
-         id="path2982"
-         d="M 29.235801,34.343185 L 30.882915,28.19607 C 32.588203,28.149716 33.936661,28.922813 34.366088,30.479102 L 29.235801,34.343185 z "
-         style="opacity:1;color:#000000;fill:url(#radialGradient2324);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
-      <path
-         sodipodi:nodetypes="cccc"
-         id="path2992"
-         d="M 29.696398,32.453461 L 29.085981,34.646189 L 30.959478,33.203681 C 30.789546,32.471851 30.265849,32.377279 29.696398,32.453461 z "
-         style="opacity:1;color:#000000;fill:url(#linearGradient2326);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
-      <path
-         sodipodi:nodetypes="ccccc"
-         id="path3002"
-         d="M 30.86729,28.169007 L 32.845455,28.470289 L 42.511947,14.438465 C 41.699036,13.919325 40.894247,14.12006 40.282442,14.383606 L 30.86729,28.169007 z "
-         style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:0.36363639;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
-      <path
-         sodipodi:nodetypes="ccccc"
-         id="path3004"
-         d="M 34.397338,30.533229 L 34.184718,29.78996 L 43.810429,16 C 43.810429,16 44.021841,16.586497 43.998147,16.756896 L 34.397338,30.533229 z "
-         style="opacity:1;color:#000000;fill:#000000;fill-opacity:0.36363639;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
-    </g>
-    <rect
-       style="opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4946"
-       width="18"
-       height="2"
-       x="13"
-       y="7" />
-    <rect
-       style="opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4948"
-       width="18"
-       height="2"
-       x="13"
-       y="15" />
-    <rect
-       style="opacity:0.3;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="rect4950"
-       width="18"
-       height="2"
-       x="13"
-       y="23" />
-    <path
-       sodipodi:type="arc"
-       style="opacity:0.3;fill:url(#radialGradient4976);fill-opacity:1;stroke:none;stroke-width:1.08584559;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-       id="path4974"
-       sodipodi:cx="23.233509"
-       sodipodi:cy="44.060406"
-       sodipodi:rx="20.708128"
-       sodipodi:ry="2.5253813"
-       d="M 43.941637 44.060406 A 20.708128 2.5253813 0 1 1  2.5253811,44.060406 A 20.708128 2.5253813 0 1 1  43.941637 44.060406 z"
-       transform="matrix(0.531192,0,0,0.79196,23.65854,11.10592)" />
-  </g>
-</svg>
diff --git a/autogen.sh b/autogen.sh
index b30cd59..04d635f 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -5,40 +5,5 @@ srcdir=`dirname $0`
 test -z "$srcdir" && srcdir=.
 
 PKG_NAME="alacarte"
-REQUIRED_AUTOCONF_VERSION=2.53
-REQUIRED_AUTOMAKE_VERSION=${REQUIRED_AUTOMAKE_VERSION:-1.9}
 
-(test -f $srcdir/configure.ac \
-  && test -f $srcdir/autogen.sh) || {
-    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
-    echo " top-level $PKG_NAME directory"
-    exit 1
-}
-
-DIE=0
-
-# This is a bit complicated here since we can't use gnome-config yet.
-# It'll be easier after switching to pkg-config since we can then
-# use pkg-config to find the gnome-autogen.sh script.
-
-gnome_autogen=
-gnome_datadir=
-
-ifs_save="$IFS"; IFS=":"
-for dir in $PATH ; do
-  test -z "$dir" && dir=.
-  if test -f $dir/gnome-autogen.sh ; then
-    gnome_autogen="$dir/gnome-autogen.sh"
-    gnome_datadir=`echo $dir | sed -e 's,/bin$,/share,'`
-    break
-  fi
-done
-IFS="$ifs_save"
-
-if test -z "$gnome_autogen" ; then
-  echo "You need to install the gnome-common module and make"
-  echo "sure the gnome-autogen.sh script is in your \$PATH."
-  exit 1
-fi
-
-GNOME_DATADIR="$gnome_datadir" USE_GNOME2_MACROS=1 . $gnome_autogen
+. gnome-autogen.sh
diff --git a/configure.ac b/configure.ac
index 1140f45..250a97b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,79 +1,42 @@
-dnl -*- Mode: autoconf -*-
-dnl Process this file with autoconf to produce a configure script.
-AC_PREREQ(2.53)
+AC_PREREQ(2.59)
+
 AC_INIT(alacarte, 0.12.2, http://bugzilla.gnome.org/enter_bug.cgi?product=alacarte)
-AC_CONFIG_SRCDIR(alacarte.in)
-AM_INIT_AUTOMAKE([1.7])
+AC_CONFIG_SRCDIR([Makefile.am])
+AC_CONFIG_HEADERS(config.h)
+AM_INIT_AUTOMAKE([1.8 dist-bzip2 no-dist-gzip])
 AM_MAINTAINER_MODE
 
-m4_define(required_pygobject_version, 2.15.1)
-m4_define(required_pygtk_version, 2.13.0)
-
-dnl put the ACLOCAL flags in the makefile
-ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
+AC_PROG_CC
+AM_PROG_CC_C_O
+AC_DISABLE_STATIC
+AC_PROG_LIBTOOL
 
+AC_PATH_PROG(VALAC, valac, valac)
+AC_SUBST(VALAC)
 
+AH_TEMPLATE([GETTEXT_PACKAGE], [Package name for gettext])
 GETTEXT_PACKAGE=alacarte
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE")
 AC_SUBST(GETTEXT_PACKAGE)
-AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package])
 AM_GLIB_GNU_GETTEXT
 IT_PROG_INTLTOOL([0.40.0])
 
-AM_PATH_PYTHON_VERSION(2.6, 2.6.0, 2.5, 2.5.0, 2.4, 2.4.0)
-
-PKG_CHECK_MODULES(ALACARTE, libgnome-menu >= 2.22.2)
-
-dnl Check for correctly installed pygobject
-AC_MSG_CHECKING(for pygobject required_pygobject_version installed for python required_python_abi)
-prog="
-import pygtk; pygtk.require('2.0')
-import gobject
-assert gobject.pygobject_version >= tuple(map(int, 'required_pygobject_version'.split('.')))
-"
+AC_SUBST(CFLAGS)
+AC_SUBST(CPPFLAGS)
+AC_SUBST(LDFLAGS)
 
-if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC; then
-    AC_MSG_RESULT(found)
-else
-    AC_MSG_RESULT(not found)
-    AC_MSG_ERROR(required pygobject version not found)
-fi
+GLIB_REQUIRED=2.12.0
+GTK_REQUIRED=2.10.0
 
-dnl Check for correctly installed pygtk
-AC_MSG_CHECKING(for pygtk required_pygtk_version installed for python ${PYTHON_VERSION})
-prog="
-import pygtk; pygtk.require('2.0')
-import gobject
-assert gobject.pygtk_version >= tuple(map(int, 'required_pygtk_version'.split('.')))
-"
+PKG_CHECK_MODULES(ALACARTE, glib-2.0 >= $GLIB_REQUIRED gobject-2.0 >= $GLIB_REQUIRED gtk+-2.0 >= $GTK_REQUIRED gmodule-2.0 libxfce4menu-0.1)
+AC_SUBST(ALACARTE_CFLAGS)
+AC_SUBST(ALACARTE_LIBS)
 
-if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC; then
-    AC_MSG_RESULT(found)
-else
-    AC_MSG_RESULT(not found)
-    AC_MSG_ERROR(required pygtk version not found)
-fi
-
-dnl Check for correctly installed python-glade
-dnl AC_MSG_CHECKING(for pyglade required_pygtk_version installed for python ${PYTHON_VERSION})
-dnl prog="
-dnl import pygtk; pygtk.require('2.0')
-dnl import gtk.glade
-dnl "
-dnl if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC; then
-dnl    AC_MSG_RESULT(found)
-dnl else
-dnl    AC_MSG_RESULT(not found)
-dnl    AC_MSG_ERROR(required pyglade version not found)
-dnl fi
-
-AC_CONFIG_FILES([
-        Makefile
-        po/Makefile.in
-        Alacarte/Makefile
-        data/alacarte.desktop.in
+AC_CONFIG_FILES([Makefile
 	data/Makefile
+	data/alacarte.desktop.in
 	data/icons/Makefile
-        ])
+	src/Makefile
+	po/Makefile.in])
 
 AC_OUTPUT
-
diff --git a/data/Makefile.am b/data/Makefile.am
index 625b2af..9e92f7c 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -1,10 +1,9 @@
 SUBDIRS = icons
 
- INTLTOOL_DESKTOP_RULE@
-
 desktopdir = $(datadir)/applications
 desktop_in_files = alacarte.desktop.in
 desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
+ INTLTOOL_DESKTOP_RULE@
 
 pkgdata_DATA = alacarte.ui
 
diff --git a/data/alacarte.ui b/data/alacarte.ui
index a8214ad..e70b708 100644
--- a/data/alacarte.ui
+++ b/data/alacarte.ui
@@ -1,145 +1,85 @@
 <?xml version="1.0"?>
-<!--*- mode: xml -*-->
 <interface>
-  <object class="GtkUIManager" id="uimanager1">
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy toplevel-contextual -->
+  <object class="GtkMenu" id="edit_menu">
     <child>
-      <object class="GtkActionGroup" id="actiongroup1">
-        <child>
-          <object class="GtkAction" id="edit_properties">
-            <property name="stock_id">gtk-properties</property>
-            <property name="name">edit_properties</property>
-            <signal handler="on_edit_properties_activate" last_modification_time="Sun, 23 Apr 2006 02:16:34 GMT" name="activate"/>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="edit_revert_to_original">
-            <property name="stock_id">gtk-revert-to-saved</property>
-            <property name="name">edit_revert_to_original</property>
-            <property name="label" translatable="yes">_Revert to Original</property>
-            <signal handler="on_edit_revert_to_original_activate" last_modification_time="Sun, 23 Apr 2006 02:16:34 GMT" name="activate"/>
-          </object>
-        </child>
-        <child>
-          <object class="GtkAction" id="edit_delete">
-            <property name="stock_id">gtk-delete</property>
-            <property name="name">edit_delete</property>
-            <signal handler="on_edit_delete_activate" last_modification_time="Sun, 23 Apr 2006 02:16:34 GMT" name="activate"/>
-          </object>
-        </child>
+      <object class="GtkImageMenuItem" id="edit_delete">
+        <property name="label">gtk-delete</property>
+        <property name="visible">True</property>
+        <property name="use_underline">True</property>
+        <property name="use_stock">True</property>
+        <signal name="activate" handler="on_edit_delete_activate"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkSeparatorMenuItem" id="separator4">
+        <property name="visible">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkImageMenuItem" id="edit_revert_to_original">
+        <property name="label">_Revert to Original</property>
+        <property name="visible">True</property>
+        <property name="use_underline">True</property>
+        <property name="use_stock">True</property>
+        <signal name="activate" handler="on_edit_revert_to_original_activate"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkImageMenuItem" id="edit_properties">
+        <property name="label">gtk-properties</property>
+        <property name="visible">True</property>
+        <property name="use_underline">True</property>
+        <property name="use_stock">True</property>
+        <signal name="activate" handler="on_edit_properties_activate"/>
       </object>
     </child>
-    <ui>
-      <popup name="edit_menu">
-        <menuitem action="edit_properties"/>
-        <menuitem action="edit_revert_to_original"/>
-        <separator/>
-        <menuitem action="edit_delete"/>
-      </popup>
-    </ui>
   </object>
-  <object class="GtkMenu" constructor="uimanager1" id="edit_menu">
-
-  
-
-  
-
-  
-
-  
-</object>
-  <object class="GtkDialog" id="mainwindow">
-    <property name="border_width">5</property>
+  <object class="GtkTreeStore" id="menu_tree_store">
+    <columns>
+      <!-- column-name menu_icon -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name menu_name -->
+      <column type="gchararray"/>
+      <!-- column-name menu_object -->
+      <column type="gpointer"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="item_tree_store">
+    <columns>
+      <!-- column-name item_show -->
+      <column type="gboolean"/>
+      <!-- column-name item_icon -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name item_name -->
+      <column type="gchararray"/>
+      <!-- column-name item_object -->
+      <column type="gpointer"/>
+    </columns>
+  </object>
+  <object class="GtkDialog" id="main_window">
     <property name="width_request">675</property>
     <property name="height_request">530</property>
     <property name="visible">True</property>
+    <property name="border_width">5</property>
     <property name="title" translatable="yes">Main Menu</property>
-    <property name="type">GTK_WINDOW_TOPLEVEL</property>
-    <property name="window_position">GTK_WIN_POS_CENTER</property>
-    <property name="modal">False</property>
-    <property name="resizable">True</property>
-    <property name="destroy_with_parent">False</property>
-    <property name="decorated">True</property>
-    <property name="skip_taskbar_hint">False</property>
-    <property name="skip_pager_hint">False</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-    <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-    <property name="focus_on_map">True</property>
-    <property name="urgency_hint">False</property>
+    <property name="window_position">center</property>
+    <property name="type_hint">normal</property>
     <property name="has_separator">False</property>
-    <signal handler="on_close_button_clicked" last_modification_time="Wed, 26 Apr 2006 18:46:45 GMT" name="close"/>
-    <signal handler="on_close_button_clicked" last_modification_time="Fri, 28 Apr 2006 10:49:37 GMT" name="destroy"/>
-    <signal handler="on_style_set" name="style-set"/>
-    <accelerator key="Escape" modifiers="0" signal="close"/>
+    <signal name="destroy" handler="on_close_button_clicked"/>
+    <signal name="style_set" handler="on_style_set"/>
+    <signal name="close" handler="on_close_button_clicked"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox5">
         <property name="visible">True</property>
-        <property name="homogeneous">False</property>
         <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area5">
-            <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
-            <child>
-              <object class="GtkButton" id="help_button">
-                <property name="visible">True</property>
-                <property name="can_default">True</property>
-                <property name="can_focus">True</property>
-                <property name="label">gtk-help</property>
-                <property name="use_stock">True</property>
-                <property name="relief">GTK_RELIEF_NORMAL</property>
-                <property name="focus_on_click">True</property>
-                <signal handler="on_help_button_clicked" last_modification_time="Wed, 26 Apr 2006 18:38:33 GMT" name="clicked"/>
-              </object>
-            </child>
-            <child>
-              <object class="GtkButton" id="revert_button">
-                <property name="visible">True</property>
-                <property name="tooltip-text" translatable="yes">Restore the default menu layout</property>
-                <property name="can_default">True</property>
-                <property name="can_focus">True</property>
-                <property name="label">gtk-revert-to-saved</property>
-                <property name="use_stock">True</property>
-                <property name="relief">GTK_RELIEF_NORMAL</property>
-                <property name="focus_on_click">True</property>
-                <signal handler="on_revert_button_clicked" last_modification_time="Wed, 26 Apr 2006 18:38:17 GMT" name="clicked"/>
-              </object>
-            </child>
-            <child>
-              <object class="GtkButton" id="close_button">
-                <property name="visible">True</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="can_focus">True</property>
-                <property name="label">gtk-close</property>
-                <property name="use_stock">True</property>
-                <property name="relief">GTK_RELIEF_NORMAL</property>
-                <property name="focus_on_click">True</property>
-                <signal handler="on_close_button_clicked" last_modification_time="Wed, 26 Apr 2006 18:38:03 GMT" name="clicked"/>
-              </object>
-            </child>
-          </object>
-          <packing>
-            <property name="padding">0</property>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">GTK_PACK_END</property>
-          </packing>
-        </child>
         <child>
           <object class="GtkAlignment" id="alignment9">
-            <property name="border_width">5</property>
             <property name="visible">True</property>
-            <property name="xalign">0.5</property>
-            <property name="yalign">0.5</property>
-            <property name="xscale">1</property>
-            <property name="yscale">1</property>
-            <property name="top_padding">0</property>
-            <property name="bottom_padding">0</property>
-            <property name="left_padding">0</property>
-            <property name="right_padding">0</property>
+            <property name="border_width">5</property>
             <child>
               <object class="GtkHBox" id="hbox2">
-                <property name="homogeneous">False</property>
                 <property name="spacing">6</property>
                 <child>
                   <object class="GtkHPaned" id="hpaned1">
@@ -149,190 +89,155 @@
                     <child>
                       <object class="GtkVBox" id="vbox4">
                         <property name="visible">True</property>
-                        <property name="homogeneous">False</property>
                         <property name="spacing">6</property>
                         <child>
                           <object class="GtkLabel" id="label20">
                             <property name="visible">True</property>
+                            <property name="xalign">0</property>
                             <property name="label" translatable="yes">_Menus:</property>
                             <property name="use_underline">True</property>
-                            <property name="use_markup">False</property>
-                            <property name="justify">GTK_JUSTIFY_LEFT</property>
-                            <property name="wrap">False</property>
-                            <property name="selectable">False</property>
-                            <property name="xalign">0</property>
-                            <property name="yalign">0.5</property>
-                            <property name="xpad">0</property>
-                            <property name="ypad">0</property>
                             <property name="mnemonic_widget">menu_tree</property>
-                            <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-                            <property name="width_chars">-1</property>
                             <property name="single_line_mode">True</property>
-                            <property name="angle">0</property>
                           </object>
                           <packing>
-                            <property name="padding">0</property>
                             <property name="expand">False</property>
                             <property name="fill">False</property>
+                            <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
                           <object class="GtkScrolledWindow" id="scrolledwindow3">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                            <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                            <property name="shadow_type">GTK_SHADOW_IN</property>
-                            <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+                            <property name="hscrollbar_policy">automatic</property>
+                            <property name="vscrollbar_policy">automatic</property>
+                            <property name="shadow_type">in</property>
                             <child>
                               <object class="GtkTreeView" id="menu_tree">
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="has_focus">True</property>
+                                <property name="model">menu_tree_store</property>
                                 <property name="headers_visible">False</property>
-                                <property name="rules_hint">False</property>
-                                <property name="reorderable">False</property>
-                                <property name="enable_search">True</property>
-                                <property name="fixed_height_mode">False</property>
-                                <property name="hover_selection">False</property>
-                                <property name="hover_expand">False</property>
-                                <signal handler="on_menu_tree_cursor_changed" name="cursor-changed"/>
-                                <signal handler="on_menu_tree_drag_data_received" last_modification_time="Tue, 18 Apr 2006 01:13:34 GMT" name="drag_data_received"/>
-                                <signal handler="on_menu_tree_drag_data_get" last_modification_time="Tue, 18 Apr 2006 23:58:24 GMT" name="drag_data_get"/>
+                                <signal name="cursor_changed" handler="on_menu_tree_cursor_changed"/>
+                                <signal name="drag_data_received" handler="on_menu_tree_drag_data_received"/>
+                                <signal name="drag_data_get" handler="on_menu_tree_drag_data_get"/>
+                                <child>
+                                  <object class="GtkTreeViewColumn" id="menu_column">
+                                    <property name="title">Name</property>
+                                    <property name="expand">True</property>
+                                  </object>
+                                </child>
                               </object>
                             </child>
                           </object>
                           <packing>
-                            <property name="padding">0</property>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
+                            <property name="position">1</property>
                           </packing>
                         </child>
                       </object>
                       <packing>
-                        <property name="shrink">True</property>
                         <property name="resize">False</property>
+                        <property name="shrink">True</property>
                       </packing>
                     </child>
                     <child>
                       <object class="GtkVBox" id="vbox5">
                         <property name="visible">True</property>
-                        <property name="homogeneous">False</property>
                         <property name="spacing">6</property>
                         <child>
                           <object class="GtkLabel" id="label21">
                             <property name="visible">True</property>
+                            <property name="xalign">0</property>
                             <property name="label" translatable="yes">It_ems:</property>
                             <property name="use_underline">True</property>
-                            <property name="use_markup">False</property>
-                            <property name="justify">GTK_JUSTIFY_LEFT</property>
-                            <property name="wrap">False</property>
-                            <property name="selectable">False</property>
-                            <property name="xalign">0</property>
-                            <property name="yalign">0.5</property>
-                            <property name="xpad">0</property>
-                            <property name="ypad">0</property>
                             <property name="mnemonic_widget">item_tree</property>
-                            <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-                            <property name="width_chars">-1</property>
                             <property name="single_line_mode">True</property>
-                            <property name="angle">0</property>
                           </object>
                           <packing>
-                            <property name="padding">0</property>
                             <property name="expand">False</property>
                             <property name="fill">False</property>
+                            <property name="position">0</property>
                           </packing>
                         </child>
                         <child>
                           <object class="GtkHBox" id="hbox16">
                             <property name="visible">True</property>
-                            <property name="homogeneous">False</property>
                             <property name="spacing">6</property>
                             <child>
                               <object class="GtkScrolledWindow" id="scrolledwindow2">
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
-                                <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                                <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                                <property name="shadow_type">GTK_SHADOW_IN</property>
-                                <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+                                <property name="hscrollbar_policy">automatic</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <property name="shadow_type">in</property>
                                 <child>
                                   <object class="GtkTreeView" id="item_tree">
                                     <property name="visible">True</property>
                                     <property name="can_focus">True</property>
-                                    <property name="headers_visible">True</property>
+                                    <property name="model">item_tree_store</property>
                                     <property name="rules_hint">True</property>
-                                    <property name="reorderable">False</property>
-                                    <property name="enable_search">True</property>
-                                    <property name="fixed_height_mode">False</property>
-                                    <property name="hover_selection">False</property>
-                                    <property name="hover_expand">False</property>
-                                    <signal handler="on_item_tree_row_activated" name="row-activated"/>
-                                    <signal handler="on_item_tree_popup_menu" name="popup-menu"/>
-                                    <signal handler="on_item_tree_cursor_changed" name="cursor-changed"/>
-                                    <signal handler="on_item_tree_popup_menu" last_modification_time="Thu, 06 Apr 2006 01:25:48 GMT" name="button_press_event"/>
-                                    <signal handler="on_item_tree_drag_data_get" last_modification_time="Tue, 18 Apr 2006 01:13:21 GMT" name="drag_data_get"/>
-                                    <signal handler="on_item_tree_cursor_changed" last_modification_time="Tue, 18 Apr 2006 15:32:26 GMT" name="cursor_changed"/>
-                                    <signal handler="on_item_tree_drag_data_received" last_modification_time="Tue, 18 Apr 2006 23:58:15 GMT" name="drag_data_received"/>
-                                    <signal handler="on_item_tree_key_press_event" last_modification_time="Sun, 23 Apr 2006 02:21:53 GMT" name="key_press_event"/>
+                                    <signal name="button_press_event" handler="on_item_tree_button_press_event"/>
+                                    <signal name="key_press_event" handler="on_item_tree_key_press_event"/>
+                                    <signal name="cursor_changed" handler="on_item_tree_cursor_changed"/>
+                                    <signal name="cursor_changed" handler="on_item_tree_cursor_changed"/>
+                                    <signal name="row_activated" handler="on_item_tree_row_activated"/>
+                                    <signal name="popup_menu" handler="on_item_tree_popup_menu"/>
+                                    <signal name="drag_data_get" handler="on_item_tree_drag_data_get"/>
+                                    <signal name="drag_data_received" handler="on_item_tree_drag_data_received"/>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="show_column">
+                                        <property name="title">Show</property>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkTreeViewColumn" id="item_column">
+                                        <property name="title">Item</property>
+                                        <property name="expand">True</property>
+                                      </object>
+                                    </child>
                                   </object>
                                 </child>
                               </object>
                               <packing>
-                                <property name="padding">0</property>
-                                <property name="expand">True</property>
-                                <property name="fill">True</property>
+                                <property name="position">0</property>
                               </packing>
                             </child>
                             <child>
                               <object class="GtkVBox" id="vbox6">
                                 <property name="visible">True</property>
-                                <property name="homogeneous">False</property>
                                 <property name="spacing">6</property>
                                 <child>
                                   <object class="GtkVButtonBox" id="vbuttonbox1">
                                     <property name="visible">True</property>
-                                    <property name="layout_style">GTK_BUTTONBOX_START</property>
                                     <property name="spacing">6</property>
+                                    <property name="layout_style">start</property>
                                     <child>
                                       <object class="GtkButton" id="new_menu_button">
                                         <property name="visible">True</property>
-                                        <property name="can_default">True</property>
                                         <property name="can_focus">True</property>
-                                        <property name="relief">GTK_RELIEF_NORMAL</property>
-                                        <property name="focus_on_click">True</property>
-                                        <signal handler="on_new_menu_button_clicked" last_modification_time="Wed, 26 Apr 2006 18:04:38 GMT" name="clicked"/>
+                                        <property name="can_default">True</property>
+                                        <property name="receives_default">True</property>
+                                        <signal name="clicked" handler="on_new_menu_button_clicked"/>
                                         <child>
                                           <object class="GtkAlignment" id="alignment7">
                                             <property name="visible">True</property>
-                                            <property name="xalign">0.5</property>
-                                            <property name="yalign">0.5</property>
                                             <property name="xscale">0</property>
                                             <property name="yscale">0</property>
-                                            <property name="top_padding">0</property>
-                                            <property name="bottom_padding">0</property>
-                                            <property name="left_padding">0</property>
-                                            <property name="right_padding">0</property>
                                             <child>
                                               <object class="GtkHBox" id="hbox14">
                                                 <property name="visible">True</property>
-                                                <property name="homogeneous">False</property>
                                                 <property name="spacing">2</property>
                                                 <child>
                                                   <object class="GtkImage" id="image21">
                                                     <property name="visible">True</property>
                                                     <property name="stock">gtk-new</property>
-                                                    <property name="icon_size">4</property>
-                                                    <property name="xalign">0.5</property>
-                                                    <property name="yalign">0.5</property>
-                                                    <property name="xpad">0</property>
-                                                    <property name="ypad">0</property>
+                                                    <property name="icon-size">4</property>
                                                   </object>
                                                   <packing>
-                                                    <property name="padding">0</property>
                                                     <property name="expand">False</property>
                                                     <property name="fill">False</property>
+                                                    <property name="position">0</property>
                                                   </packing>
                                                 </child>
                                                 <child>
@@ -340,23 +245,11 @@
                                                     <property name="visible">True</property>
                                                     <property name="label" translatable="yes">_New Menu</property>
                                                     <property name="use_underline">True</property>
-                                                    <property name="use_markup">False</property>
-                                                    <property name="justify">GTK_JUSTIFY_LEFT</property>
-                                                    <property name="wrap">False</property>
-                                                    <property name="selectable">False</property>
-                                                    <property name="xalign">0.5</property>
-                                                    <property name="yalign">0.5</property>
-                                                    <property name="xpad">0</property>
-                                                    <property name="ypad">0</property>
-                                                    <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-                                                    <property name="width_chars">-1</property>
-                                                    <property name="single_line_mode">False</property>
-                                                    <property name="angle">0</property>
                                                   </object>
                                                   <packing>
-                                                    <property name="padding">0</property>
                                                     <property name="expand">False</property>
                                                     <property name="fill">False</property>
+                                                    <property name="position">1</property>
                                                   </packing>
                                                 </child>
                                               </object>
@@ -364,45 +257,38 @@
                                           </object>
                                         </child>
                                       </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="position">0</property>
+                                      </packing>
                                     </child>
                                     <child>
                                       <object class="GtkButton" id="new_item_button">
                                         <property name="visible">True</property>
-                                        <property name="can_default">True</property>
                                         <property name="can_focus">True</property>
-                                        <property name="relief">GTK_RELIEF_NORMAL</property>
-                                        <property name="focus_on_click">True</property>
-                                        <signal handler="on_new_item_button_clicked" last_modification_time="Wed, 26 Apr 2006 18:04:43 GMT" name="clicked"/>
+                                        <property name="can_default">True</property>
+                                        <property name="receives_default">True</property>
+                                        <signal name="clicked" handler="on_new_item_button_clicked"/>
                                         <child>
                                           <object class="GtkAlignment" id="alignment8">
                                             <property name="visible">True</property>
-                                            <property name="xalign">0.5</property>
-                                            <property name="yalign">0.5</property>
                                             <property name="xscale">0</property>
                                             <property name="yscale">0</property>
-                                            <property name="top_padding">0</property>
-                                            <property name="bottom_padding">0</property>
-                                            <property name="left_padding">0</property>
-                                            <property name="right_padding">0</property>
                                             <child>
                                               <object class="GtkHBox" id="hbox15">
                                                 <property name="visible">True</property>
-                                                <property name="homogeneous">False</property>
                                                 <property name="spacing">2</property>
                                                 <child>
                                                   <object class="GtkImage" id="image22">
                                                     <property name="visible">True</property>
                                                     <property name="stock">gtk-add</property>
-                                                    <property name="icon_size">4</property>
-                                                    <property name="xalign">0.5</property>
-                                                    <property name="yalign">0.5</property>
-                                                    <property name="xpad">0</property>
-                                                    <property name="ypad">0</property>
+                                                    <property name="icon-size">4</property>
                                                   </object>
                                                   <packing>
-                                                    <property name="padding">0</property>
                                                     <property name="expand">False</property>
                                                     <property name="fill">False</property>
+                                                    <property name="position">0</property>
                                                   </packing>
                                                 </child>
                                                 <child>
@@ -410,23 +296,11 @@
                                                     <property name="visible">True</property>
                                                     <property name="label" translatable="yes">Ne_w Item</property>
                                                     <property name="use_underline">True</property>
-                                                    <property name="use_markup">False</property>
-                                                    <property name="justify">GTK_JUSTIFY_LEFT</property>
-                                                    <property name="wrap">False</property>
-                                                    <property name="selectable">False</property>
-                                                    <property name="xalign">0.5</property>
-                                                    <property name="yalign">0.5</property>
-                                                    <property name="xpad">0</property>
-                                                    <property name="ypad">0</property>
-                                                    <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-                                                    <property name="width_chars">-1</property>
-                                                    <property name="single_line_mode">False</property>
-                                                    <property name="angle">0</property>
                                                   </object>
                                                   <packing>
-                                                    <property name="padding">0</property>
                                                     <property name="expand">False</property>
                                                     <property name="fill">False</property>
+                                                    <property name="position">1</property>
                                                   </packing>
                                                 </child>
                                               </object>
@@ -434,80 +308,69 @@
                                           </object>
                                         </child>
                                       </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="position">1</property>
+                                      </packing>
                                     </child>
                                     <child>
                                       <object class="GtkButton" id="new_separator_button">
+                                        <property name="label" translatable="yes">New _Separator</property>
                                         <property name="visible">True</property>
-                                        <property name="can_default">True</property>
                                         <property name="can_focus">True</property>
-                                        <property name="label" translatable="yes">New _Separator</property>
+                                        <property name="can_default">True</property>
+                                        <property name="receives_default">True</property>
                                         <property name="use_underline">True</property>
-                                        <property name="relief">GTK_RELIEF_NORMAL</property>
-                                        <property name="focus_on_click">True</property>
-                                        <signal handler="on_new_separator_button_clicked" last_modification_time="Wed, 26 Apr 2006 18:04:48 GMT" name="clicked"/>
+                                        <signal name="clicked" handler="on_new_separator_button_clicked"/>
                                       </object>
+                                      <packing>
+                                        <property name="expand">False</property>
+                                        <property name="fill">False</property>
+                                        <property name="position">2</property>
+                                      </packing>
                                     </child>
                                   </object>
                                   <packing>
-                                    <property name="padding">0</property>
                                     <property name="expand">False</property>
-                                    <property name="fill">True</property>
+                                    <property name="position">0</property>
                                   </packing>
                                 </child>
                                 <child>
                                   <object class="GtkAlignment" id="alignment12">
                                     <property name="visible">True</property>
-                                    <property name="xalign">0.5</property>
-                                    <property name="yalign">0.5</property>
-                                    <property name="xscale">1</property>
-                                    <property name="yscale">1</property>
                                     <property name="top_padding">12</property>
-                                    <property name="bottom_padding">0</property>
-                                    <property name="left_padding">0</property>
-                                    <property name="right_padding">0</property>
                                     <child>
                                       <object class="GtkVButtonBox" id="vbuttonbox2">
                                         <property name="visible">True</property>
-                                        <property name="layout_style">GTK_BUTTONBOX_START</property>
                                         <property name="spacing">6</property>
+                                        <property name="layout_style">start</property>
                                         <child>
                                           <object class="GtkButton" id="move_up_button">
                                             <property name="visible">True</property>
-                                            <property name="can_default">True</property>
                                             <property name="can_focus">True</property>
-                                            <property name="relief">GTK_RELIEF_NORMAL</property>
-                                            <property name="focus_on_click">True</property>
-                                            <signal handler="on_move_up_button_clicked" last_modification_time="Wed, 26 Apr 2006 22:09:11 GMT" name="clicked"/>
+                                            <property name="can_default">True</property>
+                                            <property name="receives_default">True</property>
+                                            <signal name="clicked" handler="on_move_up_button_clicked"/>
                                             <child>
                                               <object class="GtkAlignment" id="alignment10">
                                                 <property name="visible">True</property>
-                                                <property name="xalign">0.5</property>
-                                                <property name="yalign">0.5</property>
                                                 <property name="xscale">0</property>
                                                 <property name="yscale">0</property>
-                                                <property name="top_padding">0</property>
-                                                <property name="bottom_padding">0</property>
-                                                <property name="left_padding">0</property>
-                                                <property name="right_padding">0</property>
                                                 <child>
                                                   <object class="GtkHBox" id="hbox17">
                                                     <property name="visible">True</property>
-                                                    <property name="homogeneous">False</property>
                                                     <property name="spacing">2</property>
                                                     <child>
                                                       <object class="GtkImage" id="image23">
                                                         <property name="visible">True</property>
                                                         <property name="stock">gtk-go-up</property>
-                                                        <property name="icon_size">4</property>
-                                                        <property name="xalign">0.5</property>
-                                                        <property name="yalign">0.5</property>
-                                                        <property name="xpad">0</property>
-                                                        <property name="ypad">0</property>
+                                                        <property name="icon-size">4</property>
                                                       </object>
                                                       <packing>
-                                                        <property name="padding">0</property>
                                                         <property name="expand">False</property>
                                                         <property name="fill">False</property>
+                                                        <property name="position">0</property>
                                                       </packing>
                                                     </child>
                                                     <child>
@@ -515,23 +378,11 @@
                                                         <property name="visible">True</property>
                                                         <property name="label" translatable="yes">Move Up</property>
                                                         <property name="use_underline">True</property>
-                                                        <property name="use_markup">False</property>
-                                                        <property name="justify">GTK_JUSTIFY_LEFT</property>
-                                                        <property name="wrap">False</property>
-                                                        <property name="selectable">False</property>
-                                                        <property name="xalign">0.5</property>
-                                                        <property name="yalign">0.5</property>
-                                                        <property name="xpad">0</property>
-                                                        <property name="ypad">0</property>
-                                                        <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-                                                        <property name="width_chars">-1</property>
-                                                        <property name="single_line_mode">False</property>
-                                                        <property name="angle">0</property>
                                                       </object>
                                                       <packing>
-                                                        <property name="padding">0</property>
                                                         <property name="expand">False</property>
                                                         <property name="fill">False</property>
+                                                        <property name="position">1</property>
                                                       </packing>
                                                     </child>
                                                   </object>
@@ -539,45 +390,38 @@
                                               </object>
                                             </child>
                                           </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="position">0</property>
+                                          </packing>
                                         </child>
                                         <child>
                                           <object class="GtkButton" id="move_down_button">
                                             <property name="visible">True</property>
-                                            <property name="can_default">True</property>
                                             <property name="can_focus">True</property>
-                                            <property name="relief">GTK_RELIEF_NORMAL</property>
-                                            <property name="focus_on_click">True</property>
-                                            <signal handler="on_move_down_button_clicked" last_modification_time="Wed, 26 Apr 2006 22:09:15 GMT" name="clicked"/>
+                                            <property name="can_default">True</property>
+                                            <property name="receives_default">True</property>
+                                            <signal name="clicked" handler="on_move_down_button_clicked"/>
                                             <child>
                                               <object class="GtkAlignment" id="alignment11">
                                                 <property name="visible">True</property>
-                                                <property name="xalign">0.5</property>
-                                                <property name="yalign">0.5</property>
                                                 <property name="xscale">0</property>
                                                 <property name="yscale">0</property>
-                                                <property name="top_padding">0</property>
-                                                <property name="bottom_padding">0</property>
-                                                <property name="left_padding">0</property>
-                                                <property name="right_padding">0</property>
                                                 <child>
                                                   <object class="GtkHBox" id="hbox18">
                                                     <property name="visible">True</property>
-                                                    <property name="homogeneous">False</property>
                                                     <property name="spacing">2</property>
                                                     <child>
                                                       <object class="GtkImage" id="image24">
                                                         <property name="visible">True</property>
                                                         <property name="stock">gtk-go-down</property>
-                                                        <property name="icon_size">4</property>
-                                                        <property name="xalign">0.5</property>
-                                                        <property name="yalign">0.5</property>
-                                                        <property name="xpad">0</property>
-                                                        <property name="ypad">0</property>
+                                                        <property name="icon-size">4</property>
                                                       </object>
                                                       <packing>
-                                                        <property name="padding">0</property>
                                                         <property name="expand">False</property>
                                                         <property name="fill">False</property>
+                                                        <property name="position">0</property>
                                                       </packing>
                                                     </child>
                                                     <child>
@@ -585,23 +429,11 @@
                                                         <property name="visible">True</property>
                                                         <property name="label" translatable="yes">Move Down</property>
                                                         <property name="use_underline">True</property>
-                                                        <property name="use_markup">False</property>
-                                                        <property name="justify">GTK_JUSTIFY_LEFT</property>
-                                                        <property name="wrap">False</property>
-                                                        <property name="selectable">False</property>
-                                                        <property name="xalign">0.5</property>
-                                                        <property name="yalign">0.5</property>
-                                                        <property name="xpad">0</property>
-                                                        <property name="ypad">0</property>
-                                                        <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-                                                        <property name="width_chars">-1</property>
-                                                        <property name="single_line_mode">False</property>
-                                                        <property name="angle">0</property>
                                                       </object>
                                                       <packing>
-                                                        <property name="padding">0</property>
                                                         <property name="expand">False</property>
                                                         <property name="fill">False</property>
+                                                        <property name="position">1</property>
                                                       </packing>
                                                     </child>
                                                   </object>
@@ -609,173 +441,176 @@
                                               </object>
                                             </child>
                                           </object>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="position">1</property>
+                                          </packing>
                                         </child>
                                       </object>
                                     </child>
                                   </object>
                                   <packing>
-                                    <property name="padding">0</property>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkAlignment" id="alignment1">
+                                    <property name="visible">True</property>
+                                    <property name="top_padding">12</property>
+                                    <child>
+                                      <placeholder/>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">2</property>
                                   </packing>
                                 </child>
                               </object>
                               <packing>
-                                <property name="padding">0</property>
                                 <property name="expand">False</property>
-                                <property name="fill">True</property>
+                                <property name="position">1</property>
                               </packing>
                             </child>
                           </object>
                           <packing>
-                            <property name="padding">0</property>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
+                            <property name="position">1</property>
                           </packing>
                         </child>
                       </object>
                       <packing>
-                        <property name="shrink">True</property>
                         <property name="resize">True</property>
+                        <property name="shrink">True</property>
                       </packing>
                     </child>
                   </object>
                   <packing>
-                    <property name="padding">0</property>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
+                    <property name="position">0</property>
                   </packing>
                 </child>
               </object>
             </child>
           </object>
           <packing>
-            <property name="padding">0</property>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
+            <property name="position">1</property>
           </packing>
         </child>
-      </object>
-    </child>
-    <action-widgets>
-      <action-widget response="-11">help_button</action-widget>
-      <action-widget response="0">revert_button</action-widget>
-      <action-widget response="-7">close_button</action-widget>
-    </action-widgets>
-  </object>
-  <object class="GtkDialog" id="revertdialog">
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">Revert Changes?</property>
-    <property name="type">GTK_WINDOW_TOPLEVEL</property>
-    <property name="window_position">GTK_WIN_POS_NONE</property>
-    <property name="modal">False</property>
-    <property name="resizable">False</property>
-    <property name="destroy_with_parent">False</property>
-    <property name="decorated">True</property>
-    <property name="skip_taskbar_hint">False</property>
-    <property name="skip_pager_hint">False</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
-    <property name="focus_on_map">True</property>
-    <property name="urgency_hint">False</property>
-    <property name="has_separator">False</property>
-    <child internal-child="vbox">
-      <object class="GtkVBox" id="dialog-vbox6">
-        <property name="visible">True</property>
-        <property name="homogeneous">False</property>
-        <property name="spacing">2</property>
         <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area6">
+          <object class="GtkHButtonBox" id="dialog-action_area5">
             <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="cancel_revert_button">
+              <object class="GtkButton" id="help_button">
+                <property name="label">gtk-help</property>
                 <property name="visible">True</property>
-                <property name="can_default">True</property>
                 <property name="can_focus">True</property>
-                <property name="label">gtk-cancel</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">True</property>
                 <property name="use_stock">True</property>
-                <property name="relief">GTK_RELIEF_NORMAL</property>
-                <property name="focus_on_click">True</property>
+                <signal name="clicked" handler="on_help_button_clicked"/>
               </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
             </child>
             <child>
-              <object class="GtkButton" id="button2">
+              <object class="GtkButton" id="close_button">
+                <property name="label">gtk-close</property>
                 <property name="visible">True</property>
-                <property name="can_default">True</property>
                 <property name="can_focus">True</property>
-                <property name="label">gtk-revert-to-saved</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">False</property>
                 <property name="use_stock">True</property>
-                <property name="relief">GTK_RELIEF_NORMAL</property>
-                <property name="focus_on_click">True</property>
+                <signal name="clicked" handler="on_close_button_clicked"/>
               </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
             </child>
           </object>
           <packing>
-            <property name="padding">0</property>
             <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">GTK_PACK_END</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
-        <child>
-          <object class="GtkHBox" id="hbox19">
-            <property name="border_width">5</property>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-11">help_button</action-widget>
+      <action-widget response="-7">close_button</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkMessageDialog" id="revert_dialog">
+    <property name="border_width">5</property>
+    <property name="type_hint">normal</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="has_separator">False</property>
+    <property name="message_type">question</property>
+    <property name="text">Are you sure you want to revert all menus to their original configuration?</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox5">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area5">
             <property name="visible">True</property>
-            <property name="homogeneous">False</property>
-            <property name="spacing">8</property>
+            <property name="layout_style">end</property>
             <child>
-              <object class="GtkImage" id="image25">
+              <object class="GtkButton" id="cancel_revert_button">
+                <property name="label" translatable="yes">gtk-cancel</property>
                 <property name="visible">True</property>
-                <property name="icon_size">6</property>
-                <property name="icon_name">gtk-dialog-question</property>
-                <property name="xalign">0</property>
-                <property name="yalign">0.5</property>
-                <property name="xpad">0</property>
-                <property name="ypad">0</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
               </object>
               <packing>
-                <property name="padding">0</property>
                 <property name="expand">False</property>
-                <property name="fill">True</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="label24">
+              <object class="GtkButton" id="confirm_revert_button">
+                <property name="label" translatable="yes">gtk-revert-to-saved</property>
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">Revert all menus to original settings?</property>
-                <property name="use_underline">False</property>
-                <property name="use_markup">False</property>
-                <property name="justify">GTK_JUSTIFY_LEFT</property>
-                <property name="wrap">False</property>
-                <property name="selectable">False</property>
-                <property name="xalign">0</property>
-                <property name="yalign">0</property>
-                <property name="xpad">0</property>
-                <property name="ypad">0</property>
-                <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
-                <property name="width_chars">-1</property>
-                <property name="single_line_mode">False</property>
-                <property name="angle">0</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
               </object>
               <packing>
-                <property name="padding">0</property>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
               </packing>
             </child>
           </object>
           <packing>
-            <property name="padding">0</property>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
       </object>
     </child>
     <action-widgets>
-      <action-widget response="-6">cancel_revert_button</action-widget>
-      <action-widget response="-8">button2</action-widget>
+      <action-widget response="-1">cancel_revert_button</action-widget>
+      <action-widget response="0">confirm_revert_button</action-widget>
     </action-widgets>
   </object>
 </interface>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 9cd7e73..a9ccc46 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,5 +1,4 @@
 [encoding: UTF-8]
-Alacarte/MainWindow.py
-Alacarte/MenuEditor.py
 data/alacarte.desktop.in.in
 [type: gettext/glade]data/alacarte.ui
+src/mainwindow.vala
diff --git a/po/POTFILES.skip b/po/POTFILES.skip
deleted file mode 100644
index e418131..0000000
--- a/po/POTFILES.skip
+++ /dev/null
@@ -1 +0,0 @@
-data/alacarte.desktop.in
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..895b353
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,53 @@
+NULL = 
+
+AM_CPPFLAGS = \
+	$(ALACARTE_CFLAGS) \
+	$(NULL)
+
+BUILT_SOURCES = alacarte.vala.stamp
+
+bin_PROGRAMS = alacarte
+
+alacarte_VALASOURCES = \
+	mainwindow.vala \
+	config.vala \
+	$(NULL)
+
+alacarte_SOURCES = \
+	$(alacarte_VALASOURCES:.vala=.c) \
+	$(alacarte_VALASOURCES:.vala=.h) \
+	$(NULL)
+
+alacarte.vala.stamp: $(alacarte_VALASOURCES)
+	$(VALAC) -C --pkg gtk+-2.0 --pkg glib-2.0 --pkg gmodule-2.0 --vapidir=$(top_srcdir)/vapi --pkg libxfce4menu-0.1 --basedir $(top_srcdir)/src $^
+	touch $@
+
+alacarte_LDADD = \
+	$(ALACARTE_LIBS) \
+	$(NULL)
+
+config.vala: config.vala.in
+	sed						\
+		-e s!\ prefix\@!$(prefix)!		\
+		-e s!\ datadir\@!$(datadir)!		\
+		-e s!\ pkgdatadir\@!$(pkgdatadir)!	\
+		-e s!\ libexecdir\@!$(libexecdir)!	\
+		-e s!\ libdir\@!$(libdir)!		\
+		-e s!\ PACKAGE\@!$(PACKAGE)!		\
+		-e s!\ VERSION\@!$(VERSION)!		\
+		< $< > $@
+config.vala: Makefile
+
+EXTRA_DIST = \
+	$(alacarte_VALASOURCES) \
+	alacarte.vala.stamp \
+	config.vala.in \
+	$(NULL)
+
+CLEANFILES = config.vala
+
+all-local: config.vala
+
+DISTCLEANFILES = \
+	$(NULL)
+
diff --git a/src/config.vala.in b/src/config.vala.in
new file mode 100644
index 0000000..2d56585
--- /dev/null
+++ b/src/config.vala.in
@@ -0,0 +1,12 @@
+namespace Config
+{
+	public static const string prefix = "@prefix@";
+	public static const string datadir = "@datadir@";
+	public static const string localedir = datadir + "/locale";
+	public static const string pkgdatadir = "@pkgdatadir@";
+	public static const string libdir = "@libdir@";
+	public static const string libexecdir = "@libexecdir@";
+	public static const string PACKAGE = "@PACKAGE@";
+	public static const string VERSION = "@VERSION@";
+}
+
diff --git a/src/mainwindow.vala b/src/mainwindow.vala
new file mode 100644
index 0000000..f6a834c
--- /dev/null
+++ b/src/mainwindow.vala
@@ -0,0 +1,399 @@
+/* mainwindow.vala
+ *
+ * Copyright (C) 2009 Travis Watkins
+ *
+ * This library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 2.1 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ *      Travis Watkins <amaranth ubuntu com>
+ */
+
+using GLib;
+using Gtk;
+using Gdk;
+using Xfce;
+using Config;
+
+
+public class MainWindow
+{
+	private Builder builder;
+	private Xfce.Menu applications;
+
+	private Gdk.Pixbuf? get_icon (Xfce.MenuElement item)
+	{
+		Gdk.Pixbuf pixbuf = null;
+
+		var icon_name = item.get_icon_name ();
+
+		if (icon_name == null)
+		{
+			if (item is Xfce.Menu)
+				icon_name = "gnome-fs-directory";
+			else if (item is Xfce.MenuItem)
+				icon_name = "application-default-icon";
+		}
+
+		if (icon_name != null)
+		{
+			// Strip extension if it is not an absolute path
+			if (!GLib.Path.is_absolute (icon_name))
+			{
+				var basename = GLib.Path.get_basename (icon_name);
+				var extension = basename.rchr (-1, '.');
+
+				if (extension != null)
+					icon_name = basename.substring (0, basename.size () - extension.size ());
+			}
+
+			var icon_theme = Gtk.IconTheme.get_default ();
+			try
+			{
+				pixbuf = icon_theme.load_icon (icon_name, 24, Gtk.IconLookupFlags.USE_BUILTIN);
+			}
+			catch (Error e)
+			{
+				if (GLib.Path.is_absolute (icon_name) && GLib.FileUtils.test (icon_name, GLib.FileTest.EXISTS))
+					pixbuf = new Gdk.Pixbuf.from_file_at_scale (icon_name, 24, 24, true);
+			}
+		}
+
+		if (pixbuf != null)
+			pixbuf = pixbuf.scale_simple (24, 24, Gdk.InterpType.BILINEAR);
+
+		return pixbuf;
+	}
+
+	private void update_icons (Gtk.TreeIter iter)
+	{
+		Gtk.TreeIter child_iter;
+		unowned Xfce.Menu menu;
+
+		var tree_store = builder.get_object ("menu_tree_store") as Gtk.TreeStore;
+		tree_store.get (iter, 2, out menu, -1);
+		tree_store.set (iter, 0, get_icon (menu), -1);
+
+		if (tree_store.iter_has_child (iter))
+		{
+			tree_store.iter_children (out child_iter, iter);
+			do
+			{
+				update_icons (child_iter);
+			} while (tree_store.iter_next (ref child_iter));
+		}
+	}
+
+	private void show_menus (Gtk.TreeIter? parent, List<Xfce.MenuElement>? items)
+	{
+		Gtk.TreeIter iter;
+		var tree_store = builder.get_object ("menu_tree_store") as Gtk.TreeStore;
+
+		foreach (Xfce.MenuElement item in items)
+		{
+			if (!item.get_show_in_environment ())
+				continue;
+			if (item.get_no_display ())
+				continue;
+
+			if (item is Xfce.Menu)
+			{
+				var name = GLib.Markup.escape_text (item.get_name ());
+				if (!item.get_visible ())
+					name = "<small><i>" + name + "</i></small>";
+
+				tree_store.append (out iter, parent);
+				tree_store.set (iter, 0, get_icon (item), -1);
+				tree_store.set (iter, 1, name, -1);
+				tree_store.set (iter, 2, item);
+
+				show_menus (iter, (item as Xfce.Menu).get_elements ());
+			}
+		}
+	}
+
+	private void show_items (Xfce.Menu parent)
+	{
+		Gtk.TreeIter iter;
+		var list_store = builder.get_object ("item_tree_store") as Gtk.ListStore;
+		list_store.clear ();
+
+		unowned List<Xfce.MenuElement> items = parent.get_elements ();
+		foreach (Xfce.MenuElement item in items)
+		{
+			if (!item.get_show_in_environment ())
+				continue;
+			if (item.get_no_display ())
+				continue;
+
+			list_store.append (out iter);
+
+			var name = item.get_name ();
+			if (name == null)
+				name = "---";
+			name = GLib.Markup.escape_text (name);
+
+			if (!item.get_visible ())
+				name = "<small><i>" + name + "</i></small>";
+
+			list_store.set (iter, 0, item.get_visible (), -1);
+			list_store.set (iter, 1, get_icon (item), -1);
+			list_store.set (iter, 2, name, -1);
+			list_store.set (iter, 3, item);
+		}
+	}
+
+	private void fill_trees ()
+	{
+		//menu tree
+		var column = builder.get_object ("menu_column") as Gtk.TreeViewColumn;
+		column.set_spacing (4);
+
+		var pixbuf_cell = new Gtk.CellRendererPixbuf ();
+		column.pack_start (pixbuf_cell, false);
+		column.add_attribute (pixbuf_cell, "pixbuf", 0);
+
+		var text_cell = new Gtk.CellRendererText ();
+		text_cell.set_fixed_size (-1, 25);
+		column.pack_start (text_cell, true);
+		column.add_attribute (text_cell, "markup", 1);
+
+		//item tree
+		column = builder.get_object ("show_column") as Gtk.TreeViewColumn;
+		var toggle_cell = new Gtk.CellRendererToggle ();
+		//toggle_cell.connect ("toggled", (GLib.Callback) on_item_tree_show_toggled);
+		column.pack_start (toggle_cell, true);
+		column.add_attribute (toggle_cell, "active", 0);
+		// Hide toggle for separators
+		column.set_cell_data_func (toggle_cell, toggle_cell_data_toggle_func);
+
+		column = builder.get_object ("item_column") as Gtk.TreeViewColumn;
+		column.set_spacing (4);
+
+		var pixbuf_cell2 = new Gtk.CellRendererPixbuf ();
+		column.pack_start (pixbuf_cell2, false);
+		column.add_attribute (pixbuf_cell2, "pixbuf", 1);
+
+		var text_cell2 = new Gtk.CellRendererText ();
+		text_cell2.set_fixed_size (-1, 25);
+		column.pack_start (text_cell2, true);
+		column.add_attribute (text_cell2, "markup", 2);
+
+
+		//start adding the menus here
+		applications = new Xfce.Menu.applications ();
+		applications.load (null);
+		unowned List<Xfce.MenuElement> items = applications.get_elements ();
+
+		Gtk.TreeIter iter;
+		var tree_store = builder.get_object ("menu_tree_store") as Gtk.TreeStore;
+		tree_store.append (out iter, null);
+		tree_store.set (iter, 0, get_icon (applications), -1);
+		tree_store.set (iter, 1, GLib.Markup.escape_text (applications.get_name ()), -1);
+		tree_store.set (iter, 2, applications);
+
+		show_menus (iter, items);
+
+		// automatically expand top level and select the first item
+		var path = tree_store.get_path (iter);
+		var tree_view = builder.get_object ("menu_tree") as Gtk.TreeView;
+		var selection = tree_view.get_selection ();
+		selection.select_path (path);
+		tree_view.expand_row (path, false);
+		on_menu_tree_cursor_changed (tree_view);
+	}
+
+	[CCode (instance_pos = -1)]
+	private void connect_signals (Builder builder, GLib.Object object,
+								  string signal_name, string handler_name,
+								  GLib.Object? connect_object,
+								  ConnectFlags flags)
+	{
+		var module = Module.open (null, ModuleFlags.BIND_LAZY);
+		void* sym;
+
+		var real_handler_name = "main_window_" + handler_name;
+
+		if (!module.symbol (real_handler_name, out sym))
+		{
+			stdout.printf ("Symbol %s not found!\n", real_handler_name);
+		}
+		else
+		{
+			Signal.connect (object, signal_name, (GLib.Callback) sym, this);
+		}
+	}
+
+	public void run ()
+	{
+		try
+		{
+			builder = new Builder ();
+			builder.add_from_file (Config.pkgdatadir + "/alacarte.ui");
+			builder.connect_signals_full (connect_signals);
+			var window = builder.get_object ("main_window") as Gtk.Window;
+			window.show_all ();
+			fill_trees ();
+			Gtk.main ();
+		}
+		catch (Error e)
+		{
+			var msg = new MessageDialog (null, DialogFlags.MODAL,
+										 MessageType.ERROR, ButtonsType.CLOSE,
+										 "Failed to load UI\n%s", e.message);
+			msg.run ();
+		}
+	}
+
+	private void toggle_cell_data_toggle_func (Gtk.CellLayout cell_layout,
+												Gtk.CellRenderer cell,
+												Gtk.TreeModel tree_model,
+												Gtk.TreeIter iter)
+	{
+		unowned Xfce.MenuElement item;
+		tree_model.get (iter, 3, out item, -1);
+		if (item is Xfce.MenuSeparator)
+			cell.visible = false;
+		else
+			cell.visible = true;
+	}
+
+	[CCode (instance_pos = -1)]
+	public void on_style_set (Gtk.Window window, Gtk.Style prev_style)
+	{
+		Gtk.TreeIter iter;
+		Gtk.TreeIter selected_iter;
+		Gtk.TreePath selected_path;
+		weak Gtk.TreeModel model;
+
+		var tree_store = builder.get_object ("menu_tree_store") as Gtk.TreeStore;
+		tree_store.get_iter_first (out iter);
+		do
+		{
+			update_icons (iter);
+		} while (tree_store.iter_next (ref iter));
+
+		//first get the selection for the item tree
+		var list_view = builder.get_object ("item_tree") as Gtk.TreeView;
+		var selection = list_view.get_selection ();
+		selection.get_selected (out model, out selected_iter);
+		//iters don't work after you clear the model, get the path
+		selected_path = model.get_path (selected_iter);
+
+		//reloading the item tree will update the icons...
+		var tree_view = builder.get_object ("menu_tree") as Gtk.TreeView;
+		on_menu_tree_cursor_changed (tree_view);
+
+		//now selected the previously selected item
+		selection.select_path (selected_path);
+	}
+
+	[CCode (instance_pos = -1)]
+	public void on_help_button_clicked (Gtk.Button button)
+	{
+		var main_window = builder.get_object ("main_window") as Gtk.Window;
+		var screen = main_window.get_screen ();
+
+		try
+		{
+			Gtk.show_uri (screen, "ghelp:user-guide#menu-editor", 
+						  Gtk.get_current_event_time ());
+		}
+		catch (Error e)
+		{
+			var msg = new MessageDialog (null, DialogFlags.MODAL,
+										 MessageType.ERROR, ButtonsType.CLOSE,
+										 "%s", "Unable to open help file");
+			msg.format_secondary_text ("%s", e.message);
+			msg.run ();
+		}
+	}
+
+	[CCode (instance_pos = -1)]
+	public void on_close_button_clicked (GLib.Object garbage)
+	{
+		Gtk.main_quit ();
+	}
+
+
+
+	//start of menu tree signal handlers
+	[CCode (instance_pos = -1)]
+	public void on_menu_tree_cursor_changed (Gtk.TreeView tree_view)
+	{
+		Gtk.TreeIter iter;
+		weak Gtk.TreeModel model;
+		unowned Xfce.Menu menu;
+
+		var selection = tree_view.get_selection ();
+		selection.get_selected (out model, out iter);
+
+		model.get (iter, 2, out menu, -1);
+		show_items (menu);
+	}
+
+
+	//start of item tree signal handlers
+	public bool do_popup_menu (Gtk.Widget widget, Gdk.EventButton? event)
+	{
+		uint button;
+		uint event_time;
+
+		var menu = builder.get_object ("edit_menu") as Gtk.Menu;
+
+		if (event != null)
+		{
+			//ignore double-clicks and triple-clicks
+			if (event.button != 3 || event.type != Gdk.EventType.BUTTON_PRESS)
+				return false;
+
+			button = event.button;
+			event_time = event.time;
+		}
+		else
+		{
+			button = 0;
+			event_time = Gtk.get_current_event_time ();
+		}
+
+		//menu.attach_to_widget (widget, Gtk.Object.destroy);
+		menu.popup (null, null, null, button, event_time);
+
+		return true;
+	}
+
+	[CCode (instance_pos = -1)]
+	public bool on_item_tree_popup_menu (Gtk.Widget widget)
+	{
+		return do_popup_menu (widget, null);
+	}
+
+	[CCode (instance_pos = -1)]
+	public bool on_item_tree_button_press_event (Gtk.Widget widget, Gdk.EventButton event)
+	{
+		return do_popup_menu (widget, event);
+	}
+}
+
+static int main (string[] args)
+{
+	libxfce4menu_init ("GNOME");
+	Gtk.init (ref args);
+
+	var main_window = new MainWindow ();
+	main_window.run ();
+	libxfce4menu_shutdown ();
+
+	return 0;
+}
+
diff --git a/vapi/libxfce4menu-0.1.vapi b/vapi/libxfce4menu-0.1.vapi
new file mode 100644
index 0000000..b98f8dc
--- /dev/null
+++ b/vapi/libxfce4menu-0.1.vapi
@@ -0,0 +1,259 @@
+/* libxfce4menu-0.1.vapi generated by vapigen, do not modify. */
+
+[CCode (cprefix = "Xfce", lower_case_cprefix = "xfce_")]
+namespace Xfce {
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class Menu : GLib.Object, Xfce.MenuElement {
+		[CCode (has_construct_function = false)]
+		public Menu.applications ();
+		[CCode (has_construct_function = false)]
+		public Menu.for_file (GLib.File file);
+		public unowned Xfce.MenuDirectory get_directory ();
+		public unowned GLib.List get_elements ();
+		public unowned GLib.File get_file ();
+		public unowned Xfce.Menu get_menu_with_name (string name);
+		public unowned GLib.List get_menus ();
+		public unowned Xfce.Menu get_parent ();
+		public bool load (GLib.Cancellable? cancellable) throws GLib.Error;
+		[CCode (has_construct_function = false)]
+		public Menu (string filename);
+		public GLib.File file { get; construct; }
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuDirectory : GLib.Object {
+		public bool equal (Xfce.MenuDirectory other);
+		public unowned string get_comment ();
+		public unowned GLib.File get_file ();
+		public bool get_hidden ();
+		public unowned string get_icon ();
+		public unowned string get_name ();
+		public bool get_no_display ();
+		public bool get_show_in_environment ();
+		public bool get_visible ();
+		public void set_comment (string comment);
+		public void set_hidden (bool hidden);
+		public void set_icon (string icon);
+		public void set_name (string name);
+		public void set_no_display (bool no_display);
+		public GLib.File file { get; construct; }
+		public bool hidden { get; set; }
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuItem : GLib.Object, Xfce.MenuElement {
+		public void decrement_allocated ();
+		public int get_allocated ();
+		public unowned GLib.List get_categories ();
+		public unowned string get_command ();
+		public unowned string get_desktop_id ();
+		public unowned string get_filename ();
+		public unowned string get_generic_name ();
+		public unowned string get_path ();
+		public unowned string get_try_exec ();
+		public bool has_category (string category);
+		public void increment_allocated ();
+		[CCode (has_construct_function = false)]
+		public MenuItem (string filename);
+		public bool only_show_in_environment ();
+		public void set_categories (GLib.List categories);
+		public void set_command (string command);
+		public void set_comment (string comment);
+		public void set_desktop_id (string desktop_id);
+		public void set_filename (string filename);
+		public void set_generic_name (string generic_name);
+		public void set_hidden (bool hidden);
+		public void set_icon_name (string icon_name);
+		public void set_name (string name);
+		public void set_no_display (bool no_display);
+		public void set_path (string path);
+		public void set_requires_terminal (bool requires_terminal);
+		public void set_supports_startup_notification (bool supports_startup_notification);
+		public void set_try_exec (string try_exec);
+		public bool hidden { get; set; }
+		[NoAccessorMethod]
+		public bool requires_terminal { get; set; }
+		[NoAccessorMethod]
+		public bool supports_startup_notification { get; set; }
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuItemCache : GLib.Object {
+		public void @foreach (GLib.HFunc func);
+		public static unowned Xfce.MenuItemCache get_default ();
+		public void invalidate ();
+		public unowned Xfce.MenuItem lookup (string filename, string desktop_id);
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuItemPool : GLib.Object {
+		public void apply_exclude_rule (GLib.Node node);
+		public void @foreach (GLib.HFunc func);
+		public bool get_empty ();
+		public void insert (Xfce.MenuItem item);
+		public unowned Xfce.MenuItem lookup (string desktop_id);
+		[CCode (has_construct_function = false)]
+		public MenuItemPool ();
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuMerger : GLib.Object, Xfce.MenuTreeProvider {
+		[CCode (has_construct_function = false)]
+		public MenuMerger (Xfce.MenuTreeProvider provider);
+		public bool run (GLib.Cancellable cancellable) throws GLib.Error;
+		[NoAccessorMethod]
+		public Xfce.MenuTreeProvider tree_provider { owned get; construct; }
+	}
+	[Compact]
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuMonitor {
+		public void* add_directory (string directory);
+		public void* add_file (string filename);
+		public void* add_item (Xfce.MenuItem item);
+		public static Xfce.MenuMonitorFlags get_flags ();
+		public static bool has_flags (Xfce.MenuMonitorFlags flags);
+		public void remove_directory (string directory);
+		public void remove_file (string filename);
+		public void remove_item (Xfce.MenuItem item);
+		public static void set_flags (Xfce.MenuMonitorFlags flags);
+		public static void set_vtable (Xfce.MenuMonitorVTable vtable);
+	}
+	[Compact]
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuMonitorVTable {
+		public weak GLib.Callback monitor_directory;
+		public weak GLib.Callback monitor_file;
+		public weak GLib.Callback remove_monitor;
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuNode : GLib.Object {
+		public unowned Xfce.MenuNode copy ();
+		public static unowned Xfce.MenuNode create (Xfce.MenuNodeType node_type, ...);
+		public unowned string get_merge_file_filename ();
+		public Xfce.MenuMergeFileType get_merge_file_type ();
+		public Xfce.MenuNodeType get_node_type ();
+		public unowned string get_string ();
+		[CCode (has_construct_function = false)]
+		public MenuNode (Xfce.MenuNodeType node_type);
+		public void set_merge_file_filename (string filename);
+		public void set_merge_file_type (Xfce.MenuMergeFileType type);
+		public void set_string (string value);
+		public static int tree_compare (GLib.Node tree, GLib.Node other_tree);
+		public static unowned GLib.Node tree_copy (GLib.Node tree);
+		public static void tree_free (GLib.Node tree);
+		public static void tree_free_data (GLib.Node tree);
+		public static bool tree_get_boolean_child (GLib.Node tree, Xfce.MenuNodeType type);
+		public static unowned GLib.Node tree_get_child_node (GLib.Node tree, Xfce.MenuNodeType type, bool reverse);
+		public static unowned GLib.List tree_get_child_nodes (GLib.Node tree, Xfce.MenuNodeType type, bool reverse);
+		public static Xfce.MenuLayoutMergeType tree_get_layout_merge_type (GLib.Node tree);
+		public static unowned string tree_get_merge_file_filename (GLib.Node tree);
+		public static Xfce.MenuMergeFileType tree_get_merge_file_type (GLib.Node tree);
+		public static Xfce.MenuNodeType tree_get_node_type (GLib.Node tree);
+		public static unowned string tree_get_string (GLib.Node tree);
+		public static unowned string tree_get_string_child (GLib.Node tree, Xfce.MenuNodeType type);
+		public static unowned GLib.List tree_get_string_children (GLib.Node tree, Xfce.MenuNodeType type, bool reverse);
+		public static bool tree_rule_matches (GLib.Node tree, Xfce.MenuItem item);
+		public static void tree_set_merge_file_filename (GLib.Node tree, string filename);
+		public static void tree_set_string (GLib.Node tree, string value);
+		[NoAccessorMethod]
+		public Xfce.MenuNodeType node_type { get; set; }
+	}
+	[Compact]
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuNodeData {
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuParser : GLib.Object, Xfce.MenuTreeProvider {
+		[CCode (has_construct_function = false)]
+		public MenuParser (GLib.File file);
+		public bool run (GLib.Cancellable cancellable) throws GLib.Error;
+		[NoAccessorMethod]
+		public GLib.File file { owned get; construct; }
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public class MenuSeparator : GLib.Object, Xfce.MenuElement {
+		public static unowned Xfce.MenuSeparator get_default ();
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public interface MenuElement : GLib.Object {
+		public abstract unowned string get_comment ();
+		public abstract bool get_hidden ();
+		public abstract unowned string get_icon_name ();
+		public abstract unowned string get_name ();
+		public abstract bool get_no_display ();
+		public abstract bool get_show_in_environment ();
+		public abstract bool get_visible ();
+	}
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public interface MenuTreeProvider : GLib.Object {
+		public abstract unowned GLib.File get_file ();
+		public abstract unowned GLib.Node get_tree ();
+	}
+	[CCode (cprefix = "XFCE_MENU_LAYOUT_MERGE_", has_type_id = "0", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public enum MenuLayoutMergeType {
+		MENUS,
+		FILES,
+		ALL
+	}
+	[CCode (cprefix = "XFCE_MENU_MERGE_FILE_", has_type_id = "0", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public enum MenuMergeFileType {
+		PATH,
+		PARENT
+	}
+	[CCode (cprefix = "XFCE_MENU_MONITOR_", has_type_id = "0", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public enum MenuMonitorFlags {
+		DIRECTORIES,
+		MENU_FILES,
+		DIRECTORY_FILES,
+		DESKTOP_FILES
+	}
+	[CCode (cprefix = "XFCE_MENU_NODE_TYPE_", has_type_id = "0", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public enum MenuNodeType {
+		INVALID,
+		MENU,
+		NAME,
+		DIRECTORY,
+		DIRECTORY_DIR,
+		DEFAULT_DIRECTORY_DIRS,
+		APP_DIR,
+		DEFAULT_APP_DIRS,
+		ONLY_UNALLOCATED,
+		NOT_ONLY_UNALLOCATED,
+		DELETED,
+		NOT_DELETED,
+		INCLUDE,
+		EXCLUDE,
+		ALL,
+		FILENAME,
+		CATEGORY,
+		OR,
+		AND,
+		NOT,
+		MOVE,
+		OLD,
+		NEW,
+		DEFAULT_LAYOUT,
+		LAYOUT,
+		MENUNAME,
+		SEPARATOR,
+		MERGE,
+		MERGE_FILE,
+		MERGE_DIR,
+		DEFAULT_MERGE_DIRS
+	}
+	[CCode (cname = "xfce_menu_config_lookup", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static unowned string config_lookup (string filename);
+	[CCode (cname = "g_file_get_uri_relative_to_file", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static unowned string g_file_get_uri_relative_to_file (string path, GLib.File file);
+	[CCode (cname = "g_file_new_for_unknown_input", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static unowned GLib.File g_file_new_for_unknown_input (string path, GLib.File parent);
+	[CCode (cname = "g_file_new_relative_to_file", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static unowned GLib.File g_file_new_relative_to_file (string path, GLib.File file);
+	[CCode (cname = "libxfce4menu_init", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static void libxfce4menu_init (string env);
+	[CCode (cname = "libxfce4menu_shutdown", cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static void libxfce4menu_shutdown ();
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static unowned string menu_get_environment ();
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static void menu_init (string env);
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static void menu_set_environment (string env);
+	[CCode (cheader_filename = "libxfce4menu/libxfce4menu.h")]
+	public static void menu_shutdown ();
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]