commit 2ae7324066aceb00302848f26c52d86a260b0999
Author: sam <sam@mazes-i5.bauer-le.fr.to>
Date:   Sun Feb 16 00:39:05 2020 +0100

    Migrate editor to gtk3/python3

diff --git a/new-editor/cb-editor b/new-editor/cb-editor
index 2cd5625..f0f19ed 100644
--- a/new-editor/cb-editor
+++ b/new-editor/cb-editor
@@ -1,11 +1,15 @@
-import gtk, gobject, re
+import gi
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk
+from gi.repository import GObject
+import re
 from cb_itemtypes import *
 from cbmenu import *
 from cbutil import TabButton, CommandText
 from lxml import etree
 from xdg import BaseDirectory
 import os,re
-import ConfigParser
+import configparser
 import shlex
 
 try:
@@ -13,53 +17,53 @@ try:
 except ImportError:
 	 dbus = None
 
-class CBEditor(gtk.Window):
+class CBEditor(Gtk.Window):
 	def __init__(self):
-		gtk.Window.__init__(self)
+		GObject.GObject.__init__(self)
 		self.set_title("Compiz Boxmenu Editor")
 		self.set_icon_name('cbmenu')
 		self.set_border_width(5)
 		self.set_size_request(600, 400)
-		self.vbox=gtk.VBox(False, 2)
-		self.connect('destroy', gtk.main_quit)
-		hbox_main=gtk.HPaned()
+		self.vbox=Gtk.VBox(False, 2)
+		self.connect('destroy', Gtk.main_quit)
+		hbox_main=Gtk.HPaned()
 
-		toolbar=gtk.Toolbar()
+		toolbar=Gtk.Toolbar()
 
-		new_button = gtk.MenuToolButton(gtk.STOCK_NEW)
+		new_button = Gtk.MenuToolButton(Gtk.STOCK_NEW)
 		new_button.set_menu(self.make_new_menu())
 		new_button.connect('clicked', self.new_item_dialog)
 		new_button.set_tooltip_text("Create a new menu file or menu item")
 
-		#edit_button = gtk.ToolButton(gtk.STOCK_EDIT) # necessary?
+		#edit_button = Gtk.ToolButton(Gtk.STOCK_EDIT) # necessary?
 
-		save_button = gtk.MenuToolButton(gtk.STOCK_SAVE)
+		save_button = Gtk.MenuToolButton(Gtk.STOCK_SAVE)
 		save_button.set_menu(self.make_save_menu())
 		save_button.connect('clicked', self.save_one)
 		save_button.set_tooltip_text("Save the current menu")
 
-		generate_button = gtk.ToolButton(gtk.STOCK_CONVERT)
+		generate_button = Gtk.ToolButton(Gtk.STOCK_CONVERT)
 		generate_button.connect('clicked', self.generated_item) #need to import other menus
 		generate_button.set_tooltip_text('Generate menu entries from a pipemenu script')
 
-		delete_button = gtk.MenuToolButton(gtk.STOCK_DELETE)
+		delete_button = Gtk.MenuToolButton(Gtk.STOCK_DELETE)
 		delete_button.set_menu(self.make_delete_menu())
 		delete_button.connect('clicked', self.delete_item)
 		delete_button.set_tooltip_text('Delete the current menu item')
 
-		reload_button = gtk.ToolButton(gtk.STOCK_REFRESH)
+		reload_button = Gtk.ToolButton(Gtk.STOCK_REFRESH)
 		reload_button.connect('clicked', self.reload_menu)
 		reload_button.set_tooltip_text('Reload the daemon')
 
-		#settings_button = gtk.ToolButton(gtk.STOCK_PREFERENCES)
+		#settings_button = Gtk.ToolButton(Gtk.STOCK_PREFERENCES)
 		#settings_button.connect('clicked', self.show_settings)
 
-		about_button = gtk.ToolButton(gtk.STOCK_ABOUT)
+		about_button = Gtk.ToolButton(Gtk.STOCK_ABOUT)
 		about_button.connect('clicked', self.show_about_dialog)
 		about_button.set_tooltip_text('Show some information about this program')
 
-		sep=gtk.SeparatorToolItem()
-		sep2=gtk.SeparatorToolItem()
+		sep=Gtk.SeparatorToolItem()
+		sep2=Gtk.SeparatorToolItem()
 		sep.set_draw(False)
 		sep.set_expand(True)
 		sep2.set_draw(False)
@@ -77,66 +81,66 @@ class CBEditor(gtk.Window):
 		#toolbar.insert(settings_button, 8)
 		toolbar.insert(about_button, 7)
 
-		self.vbox.pack_start(toolbar, expand=False)
+		self.vbox.pack_start(toolbar, expand=False, fill=True, padding=0)
 
-		listview=gtk.TreeView()
+		listview=Gtk.TreeView()
 		self.list_menus()
 		listview.set_model(self.menu_list)
 		listview.connect('row-activated',self.open_menu_file)
-		scrolled=gtk.ScrolledWindow()
+		scrolled=Gtk.ScrolledWindow()
 		scrolled.add(listview)
 
-		scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+		scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
 		scrolled.set_size_request(150,-1)
 
 		hbox_main.add(scrolled)
 
-		cached = gtk.TreeViewColumn('Cached?')
+		cached = Gtk.TreeViewColumn('Cached?')
 		listview.append_column(cached)
-		cell = gtk.CellRendererToggle()
+		cell = Gtk.CellRendererToggle()
 		cell.set_activatable(True)
 		cell.connect('toggled', self.update_cache)
-		cached.pack_start(cell)
+		cached.pack_start(cell, expand=True) #, True, 0)
 		cached.add_attribute(cell, "active", 0)
 
-		name = gtk.TreeViewColumn('Menu')
+		name = Gtk.TreeViewColumn('Menu')
 		listview.append_column(name)
-		cell = gtk.CellRendererText()
-		name.pack_start(cell)
+		cell = Gtk.CellRendererText()
+		name.pack_start(cell, expand=True) #, True, 0)
 		name.add_attribute(cell,"text", 1)
 
-		self.tabs=gtk.Notebook()
+		self.tabs=Gtk.Notebook()
 		self.tabs.set_size_request(340,240)
 		self.tabs.set_scrollable(True)
 		self.tabs.connect('switch-page', self.get_current_menu)
 		hbox_main.add(self.tabs)
 		self.tabs.set_show_tabs(True)
-		self.tabs.set_tab_pos(gtk.POS_TOP)
+		self.tabs.set_tab_pos(Gtk.PositionType.TOP)
 
-		#self.hbox_item=gtk.HBox(False, 2)
+		#self.hbox_item=Gtk.HBox(False, 2)
 
-		self.vbox.pack_start(hbox_main)
+		self.vbox.pack_start(hbox_main, expand=True, fill=True, padding=0)
 		#self.vbox.pack_end(self.hbox_item, expand=False, fill=False)
 		self.add(self.vbox)
 		self.show_all()
 
 	def make_new_menu(self):
-		new_menu=gtk.Menu()
+		new_menu=Gtk.Menu()
 		for i in elementlist:
-			new_item = gtk.ImageMenuItem(i, gtk.STOCK_NEW)
+			new_item = Gtk.ImageMenuItem(i, Gtk.STOCK_NEW)
 			new_item.connect('activate', self.make_new_item, i)
 			new_menu.append(new_item)
 		new_menu.show_all()
 		return new_menu
 
 	def make_delete_menu(self):
-		delete_menu=gtk.Menu()
+		delete_menu=Gtk.Menu()
 
-		delete_item=gtk.ImageMenuItem("Current Item")
+		delete_item=Gtk.ImageMenuItem("Current Item")
 		delete_item.connect('activate', self.delete_item)
 		delete_menu.append(delete_item)
 
-		delete_item=gtk.ImageMenuItem("Current Menu")
+		delete_item=Gtk.ImageMenuItem("Current Menu")
 		delete_item.connect('activate', self.delete_menu)
 		delete_menu.append(delete_item)
 
@@ -144,13 +148,13 @@ class CBEditor(gtk.Window):
 		return delete_menu
 
 	def make_save_menu(self):
-		save_menu=gtk.Menu()
+		save_menu=Gtk.Menu()
 
-		save_item=gtk.ImageMenuItem("Current Menu")
+		save_item=Gtk.ImageMenuItem("Current Menu")
 		save_item.connect('activate', self.save_one)
 		save_menu.append(save_item)
 
-		save_item=gtk.ImageMenuItem("All")
+		save_item=Gtk.ImageMenuItem("All")
 		save_item.connect('activate', self.save_all)
 		save_menu.append(save_item)
 
@@ -158,13 +162,13 @@ class CBEditor(gtk.Window):
 		return save_menu
 
 	def delete_menu(self, widget):
-		dialog = gtk.MessageDialog(self,  gtk.DIALOG_MODAL, gtk.MESSAGE_WARNING, \
-				gtk.BUTTONS_NONE, \
+		dialog = Gtk.MessageDialog(self,  Gtk.DialogFlags.MODAL, Gtk.MessageType.WARNING, \
+				Gtk.ButtonsType.NONE, \
 				"Are you sure you want to delete the current menu? You cannot recover it after you do this!")
-		dialog.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_DELETE, gtk.RESPONSE_ACCEPT)
+		dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_DELETE, Gtk.ResponseType.ACCEPT)
 		response = dialog.run()
 		dialog.destroy()
-		if response == gtk.RESPONSE_ACCEPT:
+		if response == Gtk.ResponseType.ACCEPT:
 			idx=self.tabs.get_current_page()
 			menu=self.tabs.get_nth_page(idx)
 			for i in self.menu_list:
@@ -202,36 +206,36 @@ class CBEditor(gtk.Window):
 					self.make_new_item(widget, element.attrib['type'].title(), nd=element, parent=pt)
 
 	def new_item_dialog(self, widget):
-		dialog=gtk.Dialog('New Item', self,gtk.DIALOG_MODAL, \
-		buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
+		dialog=Gtk.Dialog('New Item', self,Gtk.DialogFlags.MODAL, \
+		buttons=(Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT, Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT))
 		dialog.set_size_request(250, 250)
 
 		dialog.props.border_width = 6
 		dialog.vbox.props.spacing = 6
 		dialog.set_has_separator(False)
 
-		model = gtk.ListStore(str)
+		model = Gtk.ListStore(str)
 		for el in elementlist:
 			model.append([el])
 
-		treeview = gtk.TreeView(model)
-		column = gtk.TreeViewColumn(None, gtk.CellRendererText(), text=0)
+		treeview = Gtk.TreeView(model)
+		column = Gtk.TreeViewColumn(None, Gtk.CellRendererText(), text=0)
 		treeview.set_headers_visible(False)
 		treeview.append_column(column)
 
 		treeview.connect('row-activated', self.on_row_activated)
 
-		scroll = gtk.ScrolledWindow()
+		scroll = Gtk.ScrolledWindow()
 		scroll.add(treeview)
-		scroll.props.hscrollbar_policy = gtk.POLICY_NEVER
-		scroll.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
-		dialog.vbox.pack_start(scroll, True, True)
+		scroll.props.hscrollbar_policy = Gtk.PolicyType.NEVER
+		scroll.props.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC
+		dialog.vbox.pack_start(scroll, expand=True, fill=True, padding=0)
 
 		dialog.action_area.props.border_width = 0
 
 		dialog.show_all()
 
-		if dialog.run() == gtk.RESPONSE_ACCEPT:
+		if dialog.run() == Gtk.ResponseType.ACCEPT:
 			m, r = treeview.get_selection().get_selected()
 			if r:
 				elementname = m[r][0]
@@ -242,17 +246,17 @@ class CBEditor(gtk.Window):
 		dialog.destroy()
 
 	def on_row_activated(self, treeview, path, view_column):
-		self.response(gtk.RESPONSE_ACCEPT)
+		self.response(Gtk.ResponseType.ACCEPT)
 
 	def generated_item(self, widget):
-		dialog=gtk.Dialog("Add generated items from pipemenu", self, gtk.DIALOG_MODAL, \
-		buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
+		dialog=Gtk.Dialog("Add generated items from pipemenu", self, Gtk.DialogFlags.MODAL, \
+		buttons=(Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT, Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT))
 		input=CommandText(label_text="Command", mode="Pipe Menu" , alternate_mode="Pipe Menu")
 		dialog.vbox.add(input)
 		dialog.vbox.show_all()
 		input.combobox.hide()
 		response=dialog.run()
-		if response==gtk.RESPONSE_ACCEPT:
+		if response==Gtk.ResponseType.ACCEPT:
 			process=subprocess.Popen(shlex.split(os.path.expanduser(input.entry.props.text)), \
 				stdout=subprocess.PIPE)
 			try:
@@ -262,9 +266,9 @@ class CBEditor(gtk.Window):
 				self.recursive_generate(widget, dummy_menu)
 				dialog.destroy()
 			except etree.XMLSyntaxError as e:
-				message = gtk.MessageDialog(parent=self, flags=0, 
-				    type=gtk.MESSAGE_ERROR, 
-				    buttons=gtk.BUTTONS_OK, message_format=None)
+				message = Gtk.MessageDialog(parent=self, flags=0, 
+				    type=Gtk.MessageType.ERROR, 
+				    buttons=Gtk.ButtonsType.OK, message_format=None)
 				msg = ("{}\n\nClick the gear icon in the dialog to check"
 				" pipe output.").format(e.msg)
 				message.set_markup(msg)
@@ -308,18 +312,18 @@ class CBEditor(gtk.Window):
 			else:
 				new_row=model.append(parent, row=(element,))
 				parentelement.node.append(element.node)
-			print "New %s created" % element_type
+			print("New %s created" % element_type)
 			return new_row
 		else:
 			menu_path=BaseDirectory.xdg_config_home + "/compiz/boxmenu"
-			dialog=gtk.Dialog("Add a new file", self, gtk.DIALOG_MODAL, \
-			buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT, gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
-			input=gtk.Entry()
-			dialog.vbox.add(gtk.Label("Name of the new menu to be created, with .xml at the end:"))
+			dialog=Gtk.Dialog("Add a new file", self, Gtk.DialogFlags.MODAL, \
+			buttons=(Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT, Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT))
+			input=Gtk.Entry()
+			dialog.vbox.add(Gtk.Label("Name of the new menu to be created, with .xml at the end:"))
 			dialog.vbox.add(input)
 			dialog.vbox.show_all()
 			response=dialog.run()
-			if response != gtk.RESPONSE_ACCEPT or \
+			if response != Gtk.ResponseType.ACCEPT or \
 				input.props.text == "" or \
 				not input.props.text.endswith(".xml"):
 				dialog.destroy()
@@ -330,7 +334,7 @@ class CBEditor(gtk.Window):
 			f.close()
 			self.menu_list.append([False,input.props.text, path])
 			dialog.destroy()
-			print "New %s created" % element_type
+			print("New %s created" % element_type)
 
 	def save_one(self, widget):
 		idx=self.tabs.get_current_page()
@@ -343,7 +347,7 @@ class CBEditor(gtk.Window):
 		label.label.set_text(current_text.replace("*",""))
 
 	def save_all(self, widget):
-		for i in xrange(self.tabs.get_n_pages()):
+		for i in range(self.tabs.get_n_pages()):
 			widget=self.tabs.get_nth_page(i)
 			widget.write_menu()
 			label=self.tabs.get_tab_label(widget)
@@ -351,7 +355,7 @@ class CBEditor(gtk.Window):
 			label.label.set_text(current_text.replace("*",""))
 
 	def get_current_menu(self, notebook, page, page_num):
-		for i in xrange(self.tabs.get_n_pages()):
+		for i in range(self.tabs.get_n_pages()):
 			widget=self.tabs.get_nth_page(i)
 			if hasattr(widget, 'currently_editing'):
 				if i != page_num:
@@ -368,9 +372,9 @@ class CBEditor(gtk.Window):
 			label.set_text("*"+label.get_text())
 
 	def get_edit_panel(self, treeview, path, view_column, menufile):
-		self.vbox.pack_end(menufile.currently_editing, expand=False)
+		self.vbox.pack_end(menufile.currently_editing, False, True, 0)
 		page_num=self.tabs.get_current_page()
-		for i in xrange(self.tabs.get_n_pages()):
+		for i in range(self.tabs.get_n_pages()):
 			widget=self.tabs.get_nth_page(i)
 			if hasattr(widget, 'currently_editing'):
 				if i != page_num:
@@ -382,7 +386,7 @@ class CBEditor(gtk.Window):
 		self.get_edit_panel(None, None, None, menufile)
 
 	def open_menu_file(self,treeview, path, view_column):
-		for i in xrange(self.tabs.get_n_pages()):
+		for i in range(self.tabs.get_n_pages()):
 			widget=self.tabs.get_nth_page(i)
 			if self.menu_list[path[0]][2] == widget.filename:
 				return
@@ -402,9 +406,9 @@ class CBEditor(gtk.Window):
 		pagenum = self.tabs.page_num(menufile)
 		menu=self.tabs.get_nth_page(pagenum)
 		if re.match("\*",widget.get_text()):
-			warning = gtk.MessageDialog(self, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_NONE, 'Close %s with unsaved changes?' % os.path.basename(menu.filename))
-			warning.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)
-			if warning.run() != gtk.RESPONSE_ACCEPT:
+			warning = Gtk.MessageDialog(self, Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.NONE, 'Close %s with unsaved changes?' % os.path.basename(menu.filename))
+			warning.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)
+			if warning.run() != Gtk.ResponseType.ACCEPT:
 				warning.destroy()
 				return
 			warning.destroy()
@@ -419,7 +423,7 @@ class CBEditor(gtk.Window):
 		j=0
 		for i in self.menu_list:
 			if i[1] == "menu.xml":
-				print "Compiz Boxmenu caches menu.xml by default"
+				print("Compiz Boxmenu caches menu.xml by default")
 				continue
 			if i[0]:
 				parser.set("Files", "file_%s" % j, i[2])
@@ -435,7 +439,7 @@ class CBEditor(gtk.Window):
 				return
 
 	def show_about_dialog(self, widget):
-		dialog=gtk.AboutDialog()
+		dialog=Gtk.AboutDialog()
 		dialog.set_name("Compiz Boxmenu Editor")
 		dialog.set_version("1.1.6")
 		dialog.set_authors(["ShadowKyogre","crdlb"])
@@ -450,9 +454,9 @@ class CBEditor(gtk.Window):
 		return False
 
 	def list_menus(self):
-		self.menu_list=gtk.ListStore(gobject.TYPE_BOOLEAN, \
-				gobject.TYPE_STRING, \
-				gobject.TYPE_STRING)
+		self.menu_list=Gtk.ListStore(GObject.TYPE_BOOLEAN, \
+				GObject.TYPE_STRING, \
+				GObject.TYPE_STRING)
 		menu_path=BaseDirectory.xdg_config_home + "/compiz/boxmenu"
 		for checking in os.listdir(menu_path):
 			path="%s/%s" %(menu_path, checking)
@@ -480,7 +484,7 @@ if __name__ == '__main__':
 		copyfile(starting_file, menu_path+"/menu.xml")
 	try:
 		cache_file=menu_path+"/precache.ini"
-		parser=ConfigParser.SafeConfigParser()
+		parser=configparser.SafeConfigParser()
 		parser.readfp(open(cache_file))
 		cache=parser.items("Files")
 		allnotcache=False
@@ -490,4 +494,4 @@ if __name__ == '__main__':
 	               'Desktops List','Viewports List', 'Recent Documents', 
 				   'Reload', 'Menu File']
 	CBEditor()
-	gtk.main()
+	Gtk.main()
diff --git a/new-editor/cb_itemtypes.py b/new-editor/cb_itemtypes.py
index 9443126..fca9ed8 100644
--- a/new-editor/cb_itemtypes.py
+++ b/new-editor/cb_itemtypes.py
@@ -1,4 +1,4 @@
-import gtk
+from gi.repository import Gtk
 from lxml import etree
 from cbutil import *
 
@@ -124,7 +124,7 @@ class Launcher(Item):
 
 		retlist.append(widget)
 
-		widget = gtk.CheckButton("Cache output of pipe")
+		widget = Gtk.CheckButton("Cache output of pipe")
 		widget.props.active = commandnode is not None and commandnode.attrib.get('mode2') == 'pipe' and commandnode.attrib.get('cache') == 'true'
 		widget.connect('toggled', self.on_cached_changed)
 		retlist.append(widget)
@@ -143,7 +143,7 @@ class Launcher(Item):
 
 	def on_name_mode_changed(self, widget, text):
 		namenode = self.node.find('name')
-		print text
+		print(text)
 		if text == "Execute":
 			if namenode is None:
 				namenode = etree.SubElement(self.node, 'name')
@@ -205,12 +205,12 @@ class Windowlist(Item):
 		icons = []
 		retlist = []
 
-		widget = gtk.CheckButton("Show windows only on current viewport")
+		widget = Gtk.CheckButton("Show windows only on current viewport")
 		widget.props.active = self.get_thisvp()
 		widget.connect('toggled', self.on_thisvp_changed)
 		retlist.append(widget)
 
-		widget = gtk.CheckButton("Show only minimized windows")
+		widget = Gtk.CheckButton("Show only minimized windows")
 		widget.props.active = self.get_minionly()
 		widget.connect('toggled', self.on_minionly_changed)
 		retlist.append(widget)
@@ -314,7 +314,7 @@ class Viewportlist(Item):
 		retlist = []
 		icons = []
 
-		widget = gtk.CheckButton("Wrap Viewports")
+		widget = Gtk.CheckButton("Wrap Viewports")
 		widget.props.active = self.get_wrap()
 		widget.connect('toggled', self.on_wrap_changed)
 		retlist.append(widget)
@@ -518,13 +518,13 @@ class Documents(Item):
 	def get_options(self):
 		retlist = []
 		icons = []
-		sgroup = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
+		sgroup = Gtk.SizeGroup(Gtk.SizeGroupMode.HORIZONTAL)
 
-		label = gtk.Label()
+		label = Gtk.Label()
 		label.set_alignment(0, 0.5)
 		sgroup.add_widget(label)
 		label.set_markup('<b>Open method:</b>')
-		widget = gtk.Entry()
+		widget = Gtk.Entry()
 		commandnode = self.node.find('command')
 		if commandnode is not None:
 			command = commandnode.text
@@ -534,9 +534,9 @@ class Documents(Item):
 		widget.set_tooltip_text('If you need a more complicated command, type in that command and %f, which will tell compiz-boxmenu where to place the file name.')
 		widget.connect('changed', self.on_subnode_changed, 'command')
 
-		hbox = gtk.HBox()
-		hbox.pack_start(label)
-		hbox.pack_start(widget, True, True)
+		hbox = Gtk.HBox()
+		hbox.pack_start(label, expand=True, fill=True, padding=0)
+		hbox.pack_start(widget, expand=True, fill=True, padding=0)
 		retlist.append(hbox)
 
 		iconnode = self.node.find('icon')
@@ -556,11 +556,11 @@ class Documents(Item):
 
 		icons.append(widget)
 
-		label = gtk.Label()
+		label = Gtk.Label()
 		label.set_alignment(0, 0.5)
 		sgroup.add_widget(label)
 		label.set_markup('<b>Days from today:</b>')
-		widget = gtk.Entry()
+		widget = Gtk.Entry()
 
 		agenode = self.node.find('age')
 		if agenode is not None:
@@ -570,16 +570,16 @@ class Documents(Item):
 		widget.props.text = age
 		widget.connect('changed', self.on_subnode_changed, 'age')
 
-		hbox = gtk.HBox()
-		hbox.pack_start(label)
-		hbox.pack_start(widget, True, True)
+		hbox = Gtk.HBox()
+		hbox.pack_start(label, expand=True, fill=True, padding=0)
+		hbox.pack_start(widget, expand=True, fill=True, padding=0)
 		retlist.append(hbox)
 
-		label = gtk.Label()
+		label = Gtk.Label()
 		label.set_alignment(0, 0.5)
 		sgroup.add_widget(label)
 		label.set_markup('<b>Items to display:</b>')
-		widget = gtk.Entry()
+		widget = Gtk.Entry()
 
 		quantitynode = self.node.find('quantity')
 		if quantitynode is not None:
@@ -589,18 +589,18 @@ class Documents(Item):
 		widget.props.text = quantity
 		widget.connect('changed', self.on_subnode_changed, 'quantity')
 
-		hbox = gtk.HBox()
-		hbox.pack_start(label)
-		hbox.pack_start(widget, True, True)
+		hbox = Gtk.HBox()
+		hbox.pack_start(label, expand=True, fill=True, padding=0)
+		hbox.pack_start(widget, expand=True, fill=True, padding=0)
 		retlist.append(hbox)
 
 		sortnode = self.node.find('sort')
 
-		label = gtk.Label()
+		label = Gtk.Label()
 		label.set_alignment(0, 0.5)
 		sgroup.add_widget(label)
 		label.set_markup('<b>Sort mode:</b>')
-		widget = gtk.combo_box_new_text()
+		widget = Gtk.ComboBoxText()
 		widget.append_text('None')
 		widget.append_text('Most Used')
 		widget.append_text('Least Used')
@@ -614,9 +614,9 @@ class Documents(Item):
 			widget.set_active(-1)
 		widget.connect('changed', self.on_sort_mode_changed)
 
-		hbox = gtk.HBox()
-		hbox.pack_start(label)
-		hbox.pack_start(widget, True, True)
+		hbox = Gtk.HBox()
+		hbox.pack_start(label, expand=True, fill=True, padding=0)
+		hbox.pack_start(widget, expand=True, fill=True, padding=0)
 		retlist.append(hbox)
 
 		return icons,retlist
@@ -650,7 +650,7 @@ class Documents(Item):
 		sortnode = self.node.find('sort')
 		sorttype = widget.get_active_text()
 		if sorttype != 'None':
-			print sorttype
+			print(sorttype)
 			if sortnode is None:
 				sortnode = etree.SubElement(self.node, 'sort')
 			if sorttype == 'Most Used':
diff --git a/new-editor/cbmenu.py b/new-editor/cbmenu.py
index 0fd3b98..ba0a310 100644
--- a/new-editor/cbmenu.py
+++ b/new-editor/cbmenu.py
@@ -1,58 +1,59 @@
-import gtk
+from gi.repository import Gtk
+from gi.repository import Gdk
 import os
-import glib
+from gi.repository import GLib
 from xdg import BaseDirectory
 import re #This is to autoset file mode for *.desktop icons
-import ConfigParser
+import configparser
 from lxml import etree
 from cb_itemtypes import *
 
 #test lines:
 #import cbmenu,cb_itemtypes
-#import gtk
+#from gi.repository import Gtk
 #blah=cbmenu.MenuFile("/home/shadowkyogre/.config/compiz/boxmenu/menu.xml")
-#blurg=gtk.Window()
+#blurg=Gtk.Window()
 #blurg.add(blah)
 #blurg.show_all()
 
-class MenuFile(gtk.ScrolledWindow):
+class MenuFile(Gtk.ScrolledWindow):
 
 	def __init__(self,filename):
-		gtk.ScrolledWindow.__init__(self)
+		GObject.GObject.__init__(self)
 
-		self.model = gtk.TreeStore(object)
+		self.model = Gtk.TreeStore(object)
 		self.add_menu_file(filename)
 		self.filename=filename
 
-		self.props.hscrollbar_policy = gtk.POLICY_AUTOMATIC #because you really might want to read some of the stuff hanging off
-		self.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
-		self.treeview = gtk.TreeView(self.model)
+		self.props.hscrollbar_policy = Gtk.PolicyType.AUTOMATIC #because you really might want to read some of the stuff hanging off
+		self.props.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC
+		self.treeview = Gtk.TreeView(self.model)
 		self.treeview.set_reorderable(True)
-		cell = gtk.CellRendererText()
-		elements = gtk.TreeViewColumn('Item', cell)
+		cell = Gtk.CellRendererText()
+		elements = Gtk.TreeViewColumn('Item', cell)
 		elements.set_cell_data_func(cell, self.get_type)
 		self.treeview.append_column(elements)
 
-		name = gtk.TreeViewColumn('Name')
+		name = Gtk.TreeViewColumn('Name')
 
-		cell = gtk.CellRendererPixbuf()
-		name.pack_start(cell, False)
+		cell = Gtk.CellRendererPixbuf()
+		name.pack_start(cell, expand=False)
 		name.set_cell_data_func(cell, self.get_icon)
 
-		cell = gtk.CellRendererText()
-		name.pack_start(cell)
+		cell = Gtk.CellRendererText()
+		name.pack_start(cell, expand=True) #, True, 0)
 		name.set_cell_data_func(cell, self.get_name)
 
 		self.treeview.append_column(name)
 		self.add(self.treeview)
 		targets = [
-			('deskmenu-element', gtk.TARGET_SAME_WIDGET, 0),
-			#('deskmenu-element', gtk.TARGET_SAME_APP, 0),
-			#('deskmenu-element', gtk.TREE_VIEW_ITEM, 0),
+			('deskmenu-element', Gtk.TargetFlags.SAME_WIDGET, 0),
+			#('deskmenu-element', Gtk.TargetFlags.SAME_APP, 0),
+			#('deskmenu-element', Gtk.TREE_VIEW_ITEM, 0),
 			('text/uri-list', 0, 1),
 		]
-		self.treeview.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, targets, gtk.gdk.ACTION_DEFAULT|gtk.gdk.ACTION_MOVE)
-		self.treeview.enable_model_drag_dest(targets, gtk.gdk.ACTION_MOVE)
+		self.treeview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, targets, Gdk.DragAction.DEFAULT|Gdk.DragAction.MOVE)
+		self.treeview.enable_model_drag_dest(targets, Gdk.DragAction.MOVE)
 
 		self.treeview.connect('drag-data-get', self.on_drag_data_get)
 		self.treeview.connect('drag-data-received', self.on_drag_data_received)
@@ -65,11 +66,11 @@ class MenuFile(gtk.ScrolledWindow):
 		self.selection = self.treeview.get_selection()
 		self.selection.connect('changed', self.on_selection_changed)
 
-		self.popup = gtk.Menu()
-		self.edit_menu = gtk.ImageMenuItem(stock_id=gtk.STOCK_EDIT)
+		self.popup = Gtk.Menu()
+		self.edit_menu = Gtk.MenuItem.new_with_mnemonic("_EDIT")
 		self.edit_menu.connect('activate', self.on_edit_clicked)
 		self.popup.append(self.edit_menu)
-		self.delete_menu = gtk.ImageMenuItem(stock_id=gtk.STOCK_DELETE)
+		self.delete_menu = Gtk.MenuItem.new_with_mnemonic("_DELETE")
 		self.delete_menu.connect('activate', self.on_delete_clicked)
 		self.popup.append(self.delete_menu)
 		self.popup.show_all()
@@ -87,29 +88,29 @@ class MenuFile(gtk.ScrolledWindow):
 			if item.node.tag == 'menu':
 				self.add_menu(item, iter)
 
-	def get_name(self, column, cell, model, iter):
+	def get_name(self, column, cell, model, iter, face):
 		name = model.get_value(iter, 0).get_name()
 		if name is None:
 			name = ''
 		cell.set_property('text', name)
 
-	def get_type(self, column, cell, model, iter):
+	def get_type(self, column, cell, model, iter, face):
 		typ = model.get_value(iter, 0).get_type()
 		if typ is None:
 			typ = ''
 		cell.set_property('text', typ)
 
-	def get_icon(self, column, cell, model, iter):
+	def get_icon(self, column, cell, model, iter, face):
 		icon = model.get_value(iter, 0).get_icon()
 		icon_mode = model.get_value(iter, 0).get_icon_mode()
 		#somehow does not set icon until selection change with things that don't have icons originally!
 		if icon is not None:
 			if icon_mode is not None:
-				w = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU)
+				w = Gtk.icon_size_lookup(Gtk.IconSize.MENU)
 				try:
-					cell.set_property('pixbuf', gtk.gdk.pixbuf_new_from_file_at_size(os.path.expanduser(icon), w[0], w[0]))
+					cell.set_property('pixbuf', GdkPixbuf.Pixbuf.new_from_file_at_size(os.path.expanduser(icon), w[0], w[0]))
 					cell.set_property('icon-name', None) #possibly reduntant safety measure
-				except glib.GError:
+				except GLib.GError:
 					cell.set_property('icon-name', None)
 					cell.set_property('pixbuf', None)
 			else:
@@ -135,11 +136,11 @@ class MenuFile(gtk.ScrolledWindow):
 			current = model[row][0].node
 
 			if current.tag == 'menu' and len(current):
-				warning = gtk.MessageDialog(self.get_toplevel(), \
-				gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_NONE, \
+				warning = Gtk.MessageDialog(self.get_toplevel(), \
+				Gtk.DialogFlags.MODAL, Gtk.MessageType.INFO, Gtk.ButtonsType.NONE, \
 				'Delete menu element with %s children?' %len(current))
-				warning.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_DELETE, gtk.RESPONSE_ACCEPT)
-				if warning.run() != gtk.RESPONSE_ACCEPT:
+				warning.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_DELETE, Gtk.ResponseType.ACCEPT)
+				if warning.run() != Gtk.ResponseType.ACCEPT:
 					warning.destroy()
 					return
 				warning.destroy()
@@ -183,17 +184,17 @@ class MenuFile(gtk.ScrolledWindow):
 					return
 
 				dest = model[path][0]
-				if context.action == gtk.gdk.ACTION_MOVE:
+				if context.action == Gdk.DragAction.MOVE:
 					source.node.getparent().remove(source.node)
 
-				if dest.node.tag == 'menu' and position in (gtk.TREE_VIEW_DROP_INTO_OR_BEFORE,
-					gtk.TREE_VIEW_DROP_INTO_OR_AFTER):
+				if dest.node.tag == 'menu' and position in (Gtk.TreeViewDropPosition.INTO_OR_BEFORE,
+					Gtk.TreeViewDropPosition.INTO_OR_AFTER):
 					dest.node.append(source.node)
 					fiter = model.append(diter, row=(source,))
 				else:
 					i = dest.node.getparent().index(dest.node)
-					if position in (gtk.TREE_VIEW_DROP_INTO_OR_BEFORE,
-						gtk.TREE_VIEW_DROP_BEFORE):
+					if position in (Gtk.TreeViewDropPosition.INTO_OR_BEFORE,
+						Gtk.TreeViewDropPosition.BEFORE):
 						dest.node.getparent().insert(i, source.node)
 						fiter = model.insert_before(None, diter, row=(source,))
 					else:
@@ -205,17 +206,17 @@ class MenuFile(gtk.ScrolledWindow):
 					while citer is not None:
 						model.append(fiter, row=(model[citer][0],))
 						citer = model.iter_next(citer)
-				if context.action == gtk.gdk.ACTION_MOVE:
+				if context.action == Gdk.DragAction.MOVE:
 					context.finish(True, True, etime)
 
 		elif selection.type == 'text/uri-list':
-			print selection.data, drop_info
+			print(selection.data, drop_info)
 			#uri = selection.data.replace('file:///', '/').replace("%20"," ").replace("\x00","").strip()
 			uris = selection.data.replace('file:///', '/').strip('\r\n\x00').split()
 			launchers = []
 			for uri in uris:
 				uri=uri.replace("%20", " ")
-				entry = ConfigParser.ConfigParser()
+				entry = configparser.ConfigParser()
 				entry.read(uri)
 				launcher = Launcher()
 				launcher.name = etree.SubElement(launcher.node, 'name')
@@ -227,7 +228,7 @@ class MenuFile(gtk.ScrolledWindow):
 						launcher.icon.attrib['mode1'] = 'file'
 					launcher.icon.text = entry.get('Desktop Entry', 'Icon')
 					launcher.command.text = entry.get('Desktop Entry', 'Exec').split('%')[0]
-				except ConfigParser.Error:
+				except configparser.Error:
 					return
 				launchers.append(launcher)
 			if drop_info:
@@ -235,16 +236,16 @@ class MenuFile(gtk.ScrolledWindow):
 				dest = model[path][0]
 				diter = model.get_iter(path)
 				#print(dest.node, dest.node.getroot())
-				if dest.node.tag == 'menu' and position in (gtk.TREE_VIEW_DROP_INTO_OR_BEFORE,
-					gtk.TREE_VIEW_DROP_INTO_OR_AFTER):
+				if dest.node.tag == 'menu' and position in (Gtk.TreeViewDropPosition.INTO_OR_BEFORE,
+					Gtk.TreeViewDropPosition.INTO_OR_AFTER):
 					for launcher in launchers:
 						dest.node.append(launcher.node)
 						fiter = model.append(diter, row=(launcher,))
 				else:
 					i = dest.node.getparent().index(dest.node)
 					for launcher in launchers:
-						if position in (gtk.TREE_VIEW_DROP_INTO_OR_BEFORE,
-							gtk.TREE_VIEW_DROP_BEFORE):
+						if position in (Gtk.TreeViewDropPosition.INTO_OR_BEFORE,
+							Gtk.TreeViewDropPosition.BEFORE):
 							dest.node.getparent().insert(i, launcher.node)
 							fiter = model.insert_before(None, diter, row=(launcher,))
 						else:
@@ -252,7 +253,7 @@ class MenuFile(gtk.ScrolledWindow):
 							fiter = model.insert_after(None, diter, row=(launcher,))
 							diter = fiter
 						i+=1
-				if context.action == gtk.gdk.ACTION_MOVE:
+				if context.action == Gdk.DragAction.MOVE:
 					context.finish(True, True, etime)
 			else:
 				for launcher in launchers:
@@ -315,15 +316,15 @@ class MenuFile(gtk.ScrolledWindow):
 		self.indent(self.menu.node)
 		self.menufile.write(open(self.filename, 'w'))
 
-class EditItemPanel(gtk.HBox):
+class EditItemPanel(Gtk.HBox):
 
 	def __init__(self, model=None, row=None, element=None):
-		gtk.HBox.__init__(self)
-		self.vbox_image_grid=gtk.VBox(False, 2)
-		self.vbox_other_options=gtk.VBox(False, 2)
+		GObject.GObject.__init__(self)
+		self.vbox_image_grid=Gtk.VBox(False, 2)
+		self.vbox_other_options=Gtk.VBox(False, 2)
 
-		self.pack_start(self.vbox_image_grid)
-		self.pack_end(self.vbox_other_options)
+		self.pack_start(self.vbox_image_grid, expand=True, fill=True, padding=0)
+		self.pack_end(self.vbox_other_options, expand=True, fill=True, padding=0)
 
 		self.props.spacing = 6
 
@@ -338,9 +339,9 @@ class EditItemPanel(gtk.HBox):
 		icons,widgets=element.get_options()
 
 		for icon in icons:
-			self.vbox_image_grid.pack_start(icon, fill=False)
+			self.vbox_image_grid.pack_start(icon, expand=True, fill=True, padding=0)
 
 		for widget in widgets:
-			self.vbox_other_options.pack_start(widget, fill=False)
+			self.vbox_other_options.pack_start(widget, expand=True, fill=True, padding=0)
 
 		self.show_all()
diff --git a/new-editor/cbutil.py b/new-editor/cbutil.py
index 2be7fd0..2ea71ec 100644
--- a/new-editor/cbutil.py
+++ b/new-editor/cbutil.py
@@ -1,67 +1,67 @@
 import os, gtk, glib
 from pyicon_browser import *
-import gobject
+from gi.repository import GObject
 import subprocess
 import shlex
 import os
 
-class TabButton(gtk.HBox):
+class TabButton(Gtk.HBox):
 	def __init__(self, text):
-		gtk.HBox.__init__(self)
+		GObject.GObject.__init__(self)
 		#http://www.eurion.net/python-snippets/snippet/Notebook%20close%20button.html
-		self.label = gtk.Label(text)
-		self.pack_start(self.label)
+		self.label = Gtk.Label(label=text)
+		self.pack_start(self.label, expand=True, fill=True, padding=0)
 
 		#get a stock close button image
-		close_image = gtk.image_new_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_MENU)
-		image_w, image_h = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU)
+		close_image = Gtk.Image.new_from_stock(Gtk.STOCK_CLOSE, Gtk.IconSize.MENU)
+		b_val, image_w, image_h = Gtk.icon_size_lookup(Gtk.IconSize.MENU)
 
 		#make the close button
-		self.btn = gtk.Button()
-		self.btn.set_relief(gtk.RELIEF_NONE)
+		self.btn = Gtk.Button()
+		self.btn.set_relief(Gtk.ReliefStyle.NONE)
 		self.btn.set_focus_on_click(False)
 		self.btn.add(close_image)
-		self.pack_start(self.btn, False, False)
+		self.pack_start(self.btn, expand=False, fill=False, padding=0)
 
 		#this reduces the size of the button
-		style = gtk.RcStyle()
-		style.xthickness = 0
-		style.ythickness = 0
-		self.btn.modify_style(style)
+		#style = Gtk.RcStyle()
+		#style.xthickness = 0
+		#style.ythickness = 0
+		#self.btn.modify_style(style)
 
 		self.show_all()
 
 #test code
 #from cbutil import *
-#import gtk
-#d=gtk.Dialog()
+#from gi.repository import Gtk
+#d=Gtk.Dialog()
 #d.vbox.add(CommandText())
 #d.run()
 
-class CommandText(gtk.HBox):
+class CommandText(Gtk.HBox):
 	def __init__(self, label_text="Name", mode="Normal", text="", alternate_mode="Execute"):
-			gtk.HBox.__init__(self)
+			GObject.GObject.__init__(self)
 
-			label=gtk.Label(label_text)
+			label=Gtk.Label(label=label_text)
 
-			self.entry=gtk.Entry()
+			self.entry=Gtk.Entry()
 			self.entry.props.text=text
 
-			self.button=gtk.Button()
-			image=gtk.image_new_from_icon_name("gtk-execute",gtk.ICON_SIZE_LARGE_TOOLBAR)
+			self.button=Gtk.Button()
+			image=Gtk.Image.new_from_icon_name("gtk-execute",Gtk.IconSize.LARGE_TOOLBAR)
 			self.button.set_image(image)
 			#known bug
 			self.button.set_tooltip_markup("See the output this command generates")
 
-			self.combobox=gtk.combo_box_new_text()
+			self.combobox=Gtk.ComboBoxText()
 			self.combobox.append_text("Normal")
 			self.combobox.append_text(alternate_mode)
 			self.combobox.props.active = mode != "Normal"
 
-			self.pack_start(label,expand=False)
-			self.pack_start(self.entry)
-			self.pack_end(self.button,expand=False)
-			self.pack_end(self.combobox)
+			self.pack_start(label,expand=False,fill=True,padding=0)
+			self.pack_start(self.entry, True, True, 0)
+			self.pack_end(self.button,expand=False,fill=True,padding=0)
+			self.pack_end(self.combobox, True, True, 0)
 
 			self.combobox.connect('changed', self._emit_mode_signal)
 			self.entry.connect('changed', self._emit_text_signal)
@@ -76,7 +76,7 @@ class CommandText(gtk.HBox):
 				self.button.props.sensitive=1
 
 			if alternate_mode != "Execute" or get_mode != "Normal":
-				completion = gtk.EntryCompletion()
+				completion = Gtk.EntryCompletion()
 				self.entry.set_completion(completion)
 				completion.set_model(POSSIBILITY_STORE)
 				completion.set_text_column(0)
@@ -87,7 +87,7 @@ class CommandText(gtk.HBox):
 			self.entry.set_completion(None)
 			self.button.props.sensitive=0
 		else:
-			completion = gtk.EntryCompletion()
+			completion = Gtk.EntryCompletion()
 			self.entry.set_completion(completion)
 			completion.set_model(POSSIBILITY_STORE)
 			completion.set_text_column(0)
@@ -98,9 +98,9 @@ class CommandText(gtk.HBox):
 		self.emit('text-changed', widget.props.text)
 
 	def _preview_text(self, widget):
-		print "Generating preview, please wait..."
-		buffer=gtk.TextBuffer()
-		buffer_errors=gtk.TextBuffer()
+		print("Generating preview, please wait...")
+		buffer=Gtk.TextBuffer()
+		buffer_errors=Gtk.TextBuffer()
 		full_text=' '.join(['/usr/bin/env',os.path.expanduser(self.entry.props.text)])
 		cmd=subprocess.Popen(shlex.split(full_text),stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 		text,errors=cmd.communicate()
@@ -114,20 +114,20 @@ class CommandText(gtk.HBox):
 		else:
 			buffer_errors.set_text("")
 
-		dialog=gtk.Dialog(title="Preview of %s" %(self.entry.props.text), \
-			buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
+		dialog=Gtk.Dialog(title="Preview of %s" %(self.entry.props.text), \
+			buttons=(Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
 
-		tabs=gtk.Notebook()
+		tabs=Gtk.Notebook()
 		tabs.set_scrollable(True)
 
-		scrolled=gtk.ScrolledWindow()
-		scrolled.add(gtk.TextView(buffer))
+		scrolled=Gtk.ScrolledWindow()
+		scrolled.add(Gtk.TextView(buffer))
 
-		scrolled_errors=gtk.ScrolledWindow()
-		scrolled_errors.add(gtk.TextView(buffer_errors))
+		scrolled_errors=Gtk.ScrolledWindow()
+		scrolled_errors.add(Gtk.TextView(buffer_errors))
 
-		tabs.append_page(scrolled, gtk.Label("Output"))
-		tabs.append_page(scrolled_errors, gtk.Label("Errors"))
+		tabs.append_page(scrolled, Gtk.Label(label="Output"))
+		tabs.append_page(scrolled_errors, Gtk.Label(label="Errors"))
 
 		dialog.vbox.add(tabs)
 		dialog.show_all()
@@ -136,58 +136,58 @@ class CommandText(gtk.HBox):
 
 #test code
 #from cbutil import *
-#import gtk
-#d=gtk.Dialog()
+#from gi.repository import Gtk
+#d=Gtk.Dialog()
 #d.vbox.add(IconSelector())
 #d.run()
 
-class IconSelector(gtk.HBox):
+class IconSelector(Gtk.HBox):
 	def __init__(self, label_text="Icon", mode="Normal", text=""):
-			gtk.HBox.__init__(self)
+			GObject.GObject.__init__(self)
 
-			label=gtk.Label(label_text)
+			label=Gtk.Label(label=label_text)
 			self.text=text
 
-			self.combobox=gtk.combo_box_new_text()
+			self.combobox=Gtk.ComboBoxText()
 			self.combobox.append_text("Normal")
 			self.combobox.append_text("File path")
 			self.combobox.props.active = mode != "Normal"
-			self.button=gtk.Button()
-			self.image=gtk.Image()
+			self.button=Gtk.Button()
+			self.image=Gtk.Image()
 
-			self.pack_start(label, expand=False)
-			self.pack_start(self.button,expand=False)
-			self.pack_end(self.combobox, expand=True)
+			self.pack_start(label, False, True, 0)
+			self.pack_start(self.button,expand=False,fill=True,padding=0)
+			self.pack_end(self.combobox, True, True, 0)
 			self.button.set_image(self.image)
 
 			self.combobox.connect('changed', self._emit_mode_signal)
 			self.button.connect('pressed', self._emit_text_signal)
 
 			if mode == "File path":
-				size=gtk.icon_size_lookup(gtk.ICON_SIZE_LARGE_TOOLBAR)[0]
+				size=Gtk.icon_size_lookup(Gtk.IconSize.LARGE_TOOLBAR)[0]
 				try:
-					pixbuf=gtk.gdk.pixbuf_new_from_file_at_size(os.path.expanduser(self.text), size, size)
+					pixbuf=GdkPixbuf.Pixbuf.new_from_file_at_size(os.path.expanduser(self.text), size, size)
 					self.image.set_from_pixbuf(pixbuf)
-				except glib.GError:
+				except GLib.GError:
 					self.image.set_from_pixbuf(None)
-					print "Couldn't set icon from file: %s" %(self.text)
+					print("Couldn't set icon from file: %s" %(self.text))
 			else:
-				self.image.set_from_icon_name(self.text,gtk.ICON_SIZE_LARGE_TOOLBAR)
+				self.image.set_from_icon_name(self.text,Gtk.IconSize.LARGE_TOOLBAR)
 			self.button.set_tooltip_text(self.text)
 
 			self.show_all()
 
 	def _change_image(self, mode):
 		if mode == "File path":
-			size=gtk.icon_size_lookup(gtk.ICON_SIZE_LARGE_TOOLBAR)[0]
+			size=Gtk.icon_size_lookup(Gtk.IconSize.LARGE_TOOLBAR)[0]
 			try:
-				pixbuf=gtk.gdk.pixbuf_new_from_file_at_size(os.path.expanduser(self.text), size, size)
+				pixbuf=GdkPixbuf.Pixbuf.new_from_file_at_size(os.path.expanduser(self.text), size, size)
 				self.image.set_from_pixbuf(pixbuf)
-			except glib.GError:
+			except GLib.GError:
 				self.image.set_from_pixbuf(None)
-				print "Couldn't set icon from file: %s" %(self.text)
+				print("Couldn't set icon from file: %s" %(self.text))
 		else:
-			self.image.set_from_icon_name(self.text,gtk.ICON_SIZE_LARGE_TOOLBAR)
+			self.image.set_from_icon_name(self.text,Gtk.IconSize.LARGE_TOOLBAR)
 		self.emit('image-changed', mode)
 
 	def _emit_mode_signal(self, widget):
@@ -201,14 +201,14 @@ class IconSelector(gtk.HBox):
 			dialog=IcoBrowse()
 			dialog.set_defaults(self.text)
 			response = dialog.run()
-			if response == gtk.RESPONSE_ACCEPT:
+			if response == Gtk.ResponseType.ACCEPT:
 				text=dialog.get_icon_name(None)
 			dialog.destroy()
 		else:
-			btns=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT)
-			dialog=gtk.FileChooserDialog(title="Select Icon", buttons=btns)
+			btns=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.ACCEPT)
+			dialog=Gtk.FileChooserDialog(title="Select Icon", buttons=btns)
 			dialog.set_filename(text)
-			filter = gtk.FileFilter()
+			filter = Gtk.FileFilter()
 			filter.set_name("Images")
 			filter.add_mime_type("image/png")
 			filter.add_mime_type("image/jpeg")
@@ -220,7 +220,7 @@ class IconSelector(gtk.HBox):
 			filter.add_pattern("*.xpm")
 			dialog.add_filter(filter)
 			response = dialog.run()
-			if response == gtk.RESPONSE_ACCEPT:
+			if response == Gtk.ResponseType.ACCEPT:
 				text=dialog.get_filename()
 			dialog.destroy()
 		if text != self.text and (text != "" and text != None):
@@ -230,27 +230,27 @@ class IconSelector(gtk.HBox):
 			self.emit('text-changed', text)
 
 def set_up():
-	gobject.type_register(CommandText)
-	gobject.type_register(IconSelector)
+	GObject.type_register(CommandText)
+	GObject.type_register(IconSelector)
 
-	gobject.signal_new("text-changed", CommandText, gobject.SIGNAL_RUN_FIRST,  gobject.TYPE_NONE, (gobject.TYPE_STRING,))
-	gobject.signal_new("mode-changed", CommandText, gobject.SIGNAL_RUN_FIRST,  gobject.TYPE_NONE, (gobject.TYPE_STRING,))
+	GObject.signal_new("text-changed", CommandText, GObject.SignalFlags.RUN_FIRST,  None, (GObject.TYPE_STRING,))
+	GObject.signal_new("mode-changed", CommandText, GObject.SignalFlags.RUN_FIRST,  None, (GObject.TYPE_STRING,))
 
-	gobject.signal_new("image-changed", IconSelector, gobject.SIGNAL_RUN_FIRST,  gobject.TYPE_NONE, (gobject.TYPE_STRING,))
-	gobject.signal_new("text-changed", IconSelector, gobject.SIGNAL_RUN_FIRST,  gobject.TYPE_NONE, (gobject.TYPE_STRING,))
-	gobject.signal_new("mode-changed", IconSelector, gobject.SIGNAL_RUN_FIRST,  gobject.TYPE_NONE, (gobject.TYPE_STRING,))
+	GObject.signal_new("image-changed", IconSelector, GObject.SignalFlags.RUN_FIRST,  None, (GObject.TYPE_STRING,))
+	GObject.signal_new("text-changed", IconSelector, GObject.SignalFlags.RUN_FIRST,  None, (GObject.TYPE_STRING,))
+	GObject.signal_new("mode-changed", IconSelector, GObject.SignalFlags.RUN_FIRST,  None, (GObject.TYPE_STRING,))
 
 def completion_setup():
-	print "Setting up command auto completion for best experience"
+	print("Setting up command auto completion for best experience")
 	for i in os.path.expandvars("$PATH").split(":"):
 		if os.path.exists(i):
-			print "Looking in %s" %i
+			print("Looking in %s" %i)
 			for j in os.listdir(i):
 				path="%s/%s" %(i,j)
 				if not os.path.isdir(path) and \
 				os.access(path, os.X_OK):
 					POSSIBILITY_STORE.append([j])
 
-POSSIBILITY_STORE = gtk.ListStore(str)
+POSSIBILITY_STORE = Gtk.ListStore(str)
 set_up()
 completion_setup()
diff --git a/new-editor/pyicon_browser.py b/new-editor/pyicon_browser.py
index 556c15b..14951e6 100644
--- a/new-editor/pyicon_browser.py
+++ b/new-editor/pyicon_browser.py
@@ -1,39 +1,43 @@
-import gtk, gobject, re
-from glib import GError
+from gi.repository import Gtk
+from gi.repository import GdkPixbuf
+from gi.repository import GObject
+import re
+from gi.repository import GLib
+#from GLib import GError
 from sys import stderr
 
 #http://developer.gnome.org/pygtk/2.22/class-gtkicontheme.html#method-gtkicontheme--list-contexts
 
-class IcoBrowse(gtk.Dialog):
+class IcoBrowse(Gtk.Dialog):
 	def __init__(self, message="", default_text='', modal=True):
-		gtk.Dialog.__init__(self)
-		self.add_buttons(gtk.STOCK_CANCEL, gtk.RESPONSE_CLOSE,
-		      gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)
+		GObject.GObject.__init__(self)
+		self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CLOSE,
+		      Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)
 		#self.set_title("Icon search")
 		if modal:
 			self.set_modal(True)
 		self.set_border_width(5)
 		self.set_size_request(400, 300)
-		self.combobox=gtk.combo_box_new_text()
+		self.combobox=Gtk.ComboBoxText()
 		self.combobox.set_size_request(200, 20)
-		hbox=gtk.HBox(False,2)
+		hbox=Gtk.HBox(False,2)
 		
 		#format: actual icon, name, context
-		#self.model=gtk.ListStore(gtk.gdk.Pixbuf, gobject.TYPE_STRING, gobject.TYPE_STRING)
+		#self.model=Gtk.ListStore(GdkPixbuf.Pixbuf, GObject.TYPE_STRING, GObject.TYPE_STRING)
 		#self.modelfilter=self.model.filter_new()
 		self.modelfilter=ICON_STORE.filter_new()
-		self.iconview=gtk.IconView()
+		self.iconview=Gtk.IconView()
 		self.iconview.set_model(self.modelfilter)
 		self.iconview.set_pixbuf_column(0)
 		self.iconview.set_text_column(1)
-		self.iconview.set_selection_mode(gtk.SELECTION_SINGLE)
+		self.iconview.set_selection_mode(Gtk.SelectionMode.SINGLE)
 		self.iconview.set_item_width(72)
 		self.iconview.set_size_request(200, 220)
-		defaulttheme=gtk.icon_theme_get_default()
+		defaulttheme=Gtk.IconTheme.get_default()
 		self.combobox.connect('changed', self.category_changed)
-		self.refine=gtk.Entry()
+		self.refine=Gtk.Entry()
 		self.refine.connect('changed', self.category_changed)
-		self.refine.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, gtk.STOCK_FIND)
+		self.refine.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY, Gtk.STOCK_FIND)
 		self.refine.set_size_request(200, 30)
 		self.modelfilter.set_visible_func(self.search_icons)
 		#catted_icons=[]
@@ -44,19 +48,19 @@ class IcoBrowse(gtk.Dialog):
 			#for i in current:
 			#	try:
 			#		self.model.append([defaulttheme.load_icon(i, 32,
-			#						  gtk.ICON_LOOKUP_USE_BUILTIN),
+			#						  Gtk.IconLookupFlags.USE_BUILTIN),
 			#						  i,c])
 			#	except GError as err: stderr.write('Error loading "%s": %s\n' % (i, err.args[0]))
 		#other=list(set(defaulttheme.list_icons())-(set(catted_icons)))
 		#for i in other:
 		#	self.model.append([defaulttheme.load_icon(i, 32,
-		#							  gtk.ICON_LOOKUP_USE_BUILTIN),
+		#							  Gtk.IconLookupFlags.USE_BUILTIN),
 		#							  i,"Other"])
 		self.combobox.prepend_text("Other")
-		scrolled = gtk.ScrolledWindow()
+		scrolled = Gtk.ScrolledWindow()
 		scrolled.add(self.iconview)
-		scrolled.props.hscrollbar_policy = gtk.POLICY_NEVER
-		scrolled.props.vscrollbar_policy = gtk.POLICY_AUTOMATIC
+		scrolled.props.hscrollbar_policy = Gtk.PolicyType.NEVER
+		scrolled.props.vscrollbar_policy = Gtk.PolicyType.AUTOMATIC
 		hbox.add(self.combobox)
 		hbox.add(self.refine)
 		self.vbox.add(hbox)
@@ -70,12 +74,12 @@ class IcoBrowse(gtk.Dialog):
 	def set_defaults(self, icon_name):
 		if icon_name != "" and icon_name != None:
 			cmodel = self.combobox.get_model()
-			for i in xrange(len(ICON_STORE)):
+			for i in range(len(ICON_STORE)):
 				if ICON_STORE[i][1] == icon_name:
 					self.refine.props.text=icon_name
-					for j in xrange(len(cmodel)):
+					for j in range(len(cmodel)):
 						if ICON_STORE[i][2] == cmodel[j][0]:
-							print cmodel[j]
+							print(cmodel[j])
 							self.combobox.set_active(j)
 							break
 					break
@@ -88,7 +92,7 @@ class IcoBrowse(gtk.Dialog):
 	def category_changed(self, widget):
 		self.modelfilter.refilter()
 
-	def search_icons(self, tree, iter):
+	def search_icons(self, tree, iter, face):
 		search_term = self.combobox.get_active_text()
 		search_term2 = self.refine.props.text
 		if ICON_STORE.get_value(iter, 2) == search_term:
@@ -99,33 +103,33 @@ class IcoBrowse(gtk.Dialog):
 			return False
 
 def set_up():
-	print "Preloading icons"
-	defaulttheme=gtk.icon_theme_get_default()
+	print("Preloading icons")
+	defaulttheme=Gtk.IconTheme.get_default()
 	catted_icons=set()
 	for c in defaulttheme.list_contexts():
 		current=defaulttheme.list_icons(context=c)
 		catted_icons=catted_icons.union(set(current))
-		print "Found {} icons in {}".format(len(current),c)
+		print("Found {} icons in {}".format(len(current),c))
 		#self.combobox.append_text(c)
 		for i in current:
 			try:
 				ICON_STORE.append([defaulttheme.load_icon(i, 32,
-								  gtk.ICON_LOOKUP_USE_BUILTIN),
+								  Gtk.IconLookupFlags.USE_BUILTIN),
 								  i,c])
 			except GError as err: stderr.write('Error loading "%s": %s\n' % (i, err.args[0]))
 	other=list(set(defaulttheme.list_icons())-catted_icons)
-	print "Placing misc. icons in Other"
+	print("Placing misc. icons in Other")
 	for i in other:
 		ICON_STORE.append([defaulttheme.load_icon(i, 32,
-								  gtk.ICON_LOOKUP_USE_BUILTIN),
+								  Gtk.IconLookupFlags.USE_BUILTIN),
 								  i,"Other"])
 
 
-ICON_STORE=gtk.ListStore(gtk.gdk.Pixbuf, gobject.TYPE_STRING, gobject.TYPE_STRING)
+ICON_STORE=Gtk.ListStore(GdkPixbuf.Pixbuf, GObject.TYPE_STRING, GObject.TYPE_STRING)
 set_up()
 
 if __name__ == '__main__':
 	icobrowse = IcoBrowse()
-	icobrowse.connect('destroy', gtk.main_quit)
+	icobrowse.connect('destroy', Gtk.main_quit)
 	icobrowse.run()
-	gtk.main()
+	Gtk.main()
