Patch author: Wen-Yen Chuang <caleb AT calno DOT com>
--- leafpad-0.8.18.1.orig/configure.ac
+++ leafpad-0.8.18.1/configure.ac
@@ -9,19 +9,19 @@
 fi
 AM_PROG_CC_C_O
 
-PKG_CHECK_MODULES(GTK, gtk+-2.0)
+PKG_CHECK_MODULES(GTK, gtk+-3.0)
 
 AC_ARG_ENABLE(chooser,
 	AC_HELP_STRING([--disable-chooser], [force to use GtkFileSelector]))
 if test "$enable_chooser" != "no"; then
-	PKG_CHECK_EXISTS(gtk+-2.0 >= 2.4.0,
+	PKG_CHECK_EXISTS(gtk+-3.0 >= 2.4.0,
 		AC_DEFINE(ENABLE_CHOOSER, 1, [Define if GtkFileChooser is enabled.]))
 fi
 
 AC_ARG_ENABLE(print,
 	AC_HELP_STRING([--disable-print], [force to disable print feature]))
 if test "$enable_print" != "no"; then
-	PKG_CHECK_EXISTS(gtk+-2.0 >= 2.10.0, have_print=yes, [
+	PKG_CHECK_EXISTS(gtk+-3.0 >= 2.10.0, have_print=yes, [
 		PKG_CHECK_MODULES(GNOMEPRINT, libgnomeprintui-2.2,
 			have_print=yes, have_print=no)])
 	if test "$have_print" = "yes"; then
--- leafpad-0.8.18.1.orig/src/callback.c
+++ leafpad-0.8.18.1/src/callback.c
@@ -225,10 +225,10 @@
 	if (!flag) {
 		ifactory = gtk_item_factory_from_widget(pub->mw->menubar);
 		gtk_widget_set_sensitive(
-			gtk_item_factory_get_widget(ifactory, "/Search/Find Next"),
+			gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/FindNext"),
 			TRUE);
 		gtk_widget_set_sensitive(
-			gtk_item_factory_get_widget(ifactory, "/Search/Find Previous"),
+			gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/FindPrevious"),
 			TRUE);
 		flag = TRUE;
 	}
@@ -273,7 +273,7 @@
 	
 	ifactory = gtk_item_factory_from_widget(pub->mw->menubar);
 	state = gtk_check_menu_item_get_active(
-		GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory, "/Options/Word Wrap")));
+		GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory, "/MenuBar/OptionsMenu/WordWrap")));
 	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(pub->mw->view),
 		state ? GTK_WRAP_WORD : GTK_WRAP_NONE);
 }
@@ -285,7 +285,7 @@
 	
 	ifactory = gtk_item_factory_from_widget(pub->mw->menubar);
 	state = gtk_check_menu_item_get_active(
-		GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory, "/Options/Line Numbers")));
+		GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory, "/MenuBar/OptionsMenu/LineNumbers")));
 	show_line_numbers(pub->mw->view, state);
 }
 
@@ -306,7 +306,7 @@
 	
 	ifactory = gtk_item_factory_from_widget(pub->mw->menubar);
 	state = gtk_check_menu_item_get_active(
-		GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory, "/Options/Auto Indent")));
+		GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory, "/MenuBar/OptionsMenu/AutoIndent")));
 	indent_set_state(state);
 }
 
--- leafpad-0.8.18.1.orig/src/dnd.c
+++ leafpad-0.8.18.1/src/dnd.c
@@ -54,10 +54,12 @@
 {
 	gtk_drag_dest_set(widget, GTK_DEST_DEFAULT_ALL,
 		drag_types, n_drag_types, GDK_ACTION_COPY);
+#if !GTK_CHECK_VERSION(3, 0, 0)
 	g_signal_connect(G_OBJECT(widget), "drag_data_received",
 		G_CALLBACK(dnd_drag_data_recieved_handler), NULL);
 	g_signal_connect(G_OBJECT(widget), "drag_motion",
 		G_CALLBACK(dnd_drag_motion_handler), NULL);
+#endif
 }
 
 
@@ -83,6 +85,7 @@
 	}
 }	
 
+#if !GTK_CHECK_VERSION(3, 0, 0)
 static void dnd_drag_data_recieved_handler(GtkWidget *widget,
 	GdkDragContext *context, gint x, gint y,
 	GtkSelectionData *selection_data, guint info, guint time)
@@ -99,7 +102,7 @@
 #endif
 DV(g_print("DND start!\n"));
 	
-#if GTK_CHECK_VERSION(2, 10, 0)
+#if GTK_CHECK_VERSION(2, 10, 0) && !GTK_CHECK_VERSION(3, 0, 0)
 	if (g_strcasecmp(gdk_atom_name(context->targets->data),
 	    "GTK_TEXT_BUFFER_CONTENTS") != 0) {
 #else
@@ -225,4 +228,5 @@
 */	
 	return flag;
 }
+#endif
 
--- leafpad-0.8.18.1.orig/src/emacs.c
+++ leafpad-0.8.18.1/src/emacs.c
@@ -56,7 +56,7 @@
 		case GDK_s:
 		case GDK_S:
 			if (GTK_WIDGET_IS_SENSITIVE(gtk_item_factory_get_widget(
-				gtk_item_factory_from_widget(pub->mw->menubar), "/File/Save")
+				gtk_item_factory_from_widget(pub->mw->menubar), "/Menubar/FileMenu/Save")
 				))
 				on_file_save();
 			break;
@@ -159,54 +159,54 @@
 	);
 	
 /*	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/File/New"),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/FileMenu/New"),
 		accel_group, GDK_N, GDK_CONTROL_MASK);
 	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/File/Open..."),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/FileMenu/Open"),
 		accel_group, GDK_O, GDK_CONTROL_MASK);
 	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/File/Save"),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/FileMenu/Save"),
 		accel_group, GDK_S, GDK_CONTROL_MASK);
 	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/File/Save As..."),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/FileMenu/SaveAs"),
 		accel_group, GDK_S, GDK_SHIFT_MASK | GDK_CONTROL_MASK);
 #ifdef ENABLE_PRINT
 	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/File/Print..."),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/FileMenu/Print"),
 		accel_group, GDK_P, GDK_CONTROL_MASK);
 #endif
 	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Edit/Undo"),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/EditMenu/Undo"),
 		accel_group, GDK_Z, GDK_CONTROL_MASK);
 */	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Edit/Undo"),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/EditMenu/Undo"),
 		"activate", accel_group, GDK_underscore, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
 /*	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Edit/Select All"),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/EditMenu/SelectAll"),
 		accel_group, GDK_A, GDK_CONTROL_MASK);
 	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Find..."),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/Find"),
 		accel_group, GDK_F, GDK_CONTROL_MASK);
 */	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Find..."),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/Find"),
 		"activate", accel_group, GDK_S, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
 /*	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Find Next"),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/FindNext"),
 		"activate", accel_group, GDK_S, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
 */	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Find Previous"),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/FindPrevious"),
 		"activate", accel_group, GDK_R, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
 /*	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Replace..."),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/Replace"),
 		accel_group, GDK_H, GDK_CONTROL_MASK);
 */	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Replace..."),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/Replace"),
 		"activate", accel_group, GDK_percent, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
 /*	gtk_widget_remove_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Jump To..."),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/JumpTo"),
 		accel_group, GDK_J, GDK_CONTROL_MASK);
 */	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Jump To..."),
+		gtk_item_factory_get_widget(ifactory, "/Menubar/SearchMenu/JumpTo"),
 		"activate", accel_group, GDK_G, GDK_MOD1_MASK, GTK_ACCEL_VISIBLE);
 	
 	gtk_accel_group_connect(
--- leafpad-0.8.18.1.orig/src/emacs.h
+++ leafpad-0.8.18.1/src/emacs.h
@@ -20,6 +20,6 @@
 #ifndef _EMACS_H
 #define _EMACS_H
 
-gboolean check_emacs_key_theme(GtkWindow *window, GtkItemFactory *ifactory);
+gboolean check_emacs_key_theme(GtkWindow *window, GtkUIManager *ifactory);
 
 #endif /* _EMACS_H */
--- leafpad-0.8.18.1.orig/src/leafpad.h
+++ leafpad-0.8.18.1/src/leafpad.h
@@ -59,6 +59,26 @@
 #	endif
 #endif
 
+#undef GTK_CHECK_MENU_ITEM
+#define GTK_CHECK_MENU_ITEM
+#define GtkItemFactory GtkUIManager
+#define gtk_check_menu_item_get_active gtk_toggle_action_get_active
+#define gtk_item_factory_from_widget (GtkUIManager*)
+#define gtk_item_factory_get_item(x,y) GTK_TOGGLE_ACTION(gtk_ui_manager_get_action(x,y))
+#define gtk_item_factory_get_widget gtk_ui_manager_get_widget
+#if GTK_CHECK_VERSION(3, 0, 0)
+#	include <gdk/gdkkeysyms-compat.h>
+#	define GTK_OPTION_MENU GTK_COMBO_BOX
+#	define GTK_WIDGET_IS_SENSITIVE gtk_widget_is_sensitive
+#	define GTK_WIDGET_VISIBLE gtk_widget_get_visible
+#	define GtkOptionMenu GtkComboBox
+#	define gtk_dialog_set_has_separator(x,y)
+#	define gtk_option_menu_get_history gtk_combo_box_get_active
+#	define gtk_option_menu_new gtk_combo_box_text_new
+#	define gtk_option_menu_set_history gtk_combo_box_set_active
+#	define gtk_option_menu_set_menu(x,y)
+#endif
+
 typedef struct {
 	FileInfo *fi;
 	MainWin *mw;
--- leafpad-0.8.18.1.orig/src/linenum.c
+++ leafpad-0.8.18.1/src/linenum.c
@@ -19,6 +19,10 @@
 
 #include <gtk/gtk.h>
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+#	define GTK_WIDGET_STATE gtk_widget_get_state
+#endif
+
 #define	DV(x)
 
 static gint min_number_window_width;
@@ -109,7 +113,11 @@
 
 static gint
 line_numbers_expose (GtkWidget      *widget,
+#if !GTK_CHECK_VERSION(3, 0, 0)
                      GdkEventExpose *event)
+#else
+                     cairo_t *event)
+#endif
 {
 	GtkTextView *text_view;
 	GdkWindow *win;
@@ -126,7 +134,11 @@
 	gint i;
 //	gchar *str;
 	gchar str [8];  /* we don't expect more than ten million lines */
+#if !GTK_CHECK_VERSION(3, 0, 0)
 	GdkGC *gc;
+#else
+	cairo_t *gc;
+#endif
 	gint height;
 	
 	if (line_number_visible){{{{{	// omit calculation
@@ -154,6 +166,7 @@
 */	
 	win = gtk_text_view_get_window (text_view,
 	                                GTK_TEXT_WINDOW_LEFT);
+#if !GTK_CHECK_VERSION(3, 0, 0)
 	if (event->window != win)
 		return FALSE;
 	
@@ -162,6 +175,7 @@
 	
 	y1 = event->area.y;
 	y2 = y1 + event->area.height;
+#endif
 	
 	gtk_text_view_window_to_buffer_coords (text_view,
 	                                       GTK_TEXT_WINDOW_LEFT,
@@ -207,7 +221,7 @@
 	
 //	str = g_strdup_printf ("%d", gtk_text_buffer_get_line_count(text_view->buffer));
 	g_snprintf (str, sizeof (str),
-			"%d", MAX (99, gtk_text_buffer_get_line_count(text_view->buffer)));
+			"%d", MAX (99, gtk_text_buffer_get_line_count(gtk_text_view_get_buffer(text_view))));
 	pango_layout_set_text (layout, str, -1);
 //	g_free (str);
 	
@@ -230,9 +244,15 @@
 	
 	alist = pango_attr_list_new();
 	attr = pango_attr_foreground_new(
+#if GTK_CHECK_VERSION(3, 0, 0)
+		0,
+		0,
+		0);
+#else
 		widget->style->text_aa->red,
 		widget->style->text_aa->green,
 		widget->style->text_aa->blue);
+#endif
 	attr->start_index = 0;
 	attr->end_index = G_MAXUINT;
 	pango_attr_list_insert(alist, attr);
@@ -259,11 +279,17 @@
 		
 		pango_layout_set_text (layout, str, -1);
 		
-		gtk_paint_layout (widget->style,
+		gtk_paint_layout (gtk_widget_get_style(widget),
+#if !GTK_CHECK_VERSION(3, 0, 0)
 		                  win,
+#else
+		                  event,
+#endif
 		                  GTK_WIDGET_STATE (widget),
 		                  FALSE,
+#if !GTK_CHECK_VERSION(3, 0, 0)
 		                  NULL,
+#endif
 		                  widget,
 		                  NULL,
 #if GTK_CHECK_VERSION(2, 6, 0)  // Is this solution???
@@ -288,6 +314,7 @@
 	
 	}}}}}
 	
+#if !GTK_CHECK_VERSION(3, 0, 0)
 	gc = gdk_gc_new(event->window);
 	gdk_gc_set_foreground(gc, widget->style->base);
 	gdk_window_get_geometry(event->window, NULL, NULL, NULL, &height, NULL);
@@ -298,6 +325,7 @@
 		height);
 	
 	g_object_unref(gc);
+#endif
 	
 	return FALSE;
 }
@@ -323,7 +351,11 @@
 	min_number_window_width = calculate_min_number_window_width(text_view);
 	g_signal_connect(
 		G_OBJECT(text_view),
+#if !GTK_CHECK_VERSION(3, 0, 0)
 		"expose_event",
+#else
+		"draw",
+#endif
 		G_CALLBACK(line_numbers_expose),
 		NULL);
 	show_line_numbers(text_view, FALSE);
@@ -344,7 +376,11 @@
 //			submargin);
 		g_signal_connect(
 			G_OBJECT(text_view),
+#if !GTK_CHECK_VERSION(3, 0, 0)
 			"expose_event",
+#else
+			"draw",
+#endif
 			G_CALLBACK(line_numbers_expose),
 			NULL);
 	} else {
--- leafpad-0.8.18.1.orig/src/main.c
+++ leafpad-0.8.18.1/src/main.c
@@ -92,13 +92,13 @@
 	ifactory = gtk_item_factory_from_widget(pub->mw->menubar);
 	wordwrap = gtk_check_menu_item_get_active(
 		GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory,
-			"/Options/Word Wrap")));
+			"/MenuBar/OptionsMenu/WordWrap")));
 	linenumbers = gtk_check_menu_item_get_active(
 		GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory,
-			"/Options/Line Numbers")));
+			"/MenuBar/OptionsMenu/LineNumbers")));
 	autoindent = gtk_check_menu_item_get_active(
 		GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ifactory,
-			"/Options/Auto Indent")));
+			"/MenuBar/OptionsMenu/AutoIndent")));
 	
 #if GLIB_CHECK_VERSION(2, 6, 0)
 	path = g_build_filename(g_get_user_config_dir(), PACKAGE, NULL);
@@ -319,14 +319,14 @@
 	
 	ifactory = gtk_item_factory_from_widget(pub->mw->menubar);
 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
-		gtk_item_factory_get_widget(ifactory, "/Options/Word Wrap")),
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/OptionsMenu/WordWrap")),
 		conf->wordwrap);
 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
-		gtk_item_factory_get_widget(ifactory, "/Options/Line Numbers")),
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/OptionsMenu/LineNumbers")),
 		conf->linenumbers);
 	indent_refresh_tab_width(pub->mw->view);
 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(
-		gtk_item_factory_get_widget(ifactory, "/Options/Auto Indent")),
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/OptionsMenu/AutoIndent")),
 		conf->autoindent);
 	
 	gtk_widget_show_all(pub->mw->window);
@@ -339,8 +339,8 @@
 	
 	hlight_init(pub->mw->buffer);
 	undo_init(pub->mw->view,
-		gtk_item_factory_get_widget(ifactory, "/Edit/Undo"),
-		gtk_item_factory_get_widget(ifactory, "/Edit/Redo"));
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/EditMenu/Undo"),
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/EditMenu/Redo"));
 //	hlight_init(pub->mw->buffer);
 	dnd_init(pub->mw->view);
 	
--- leafpad-0.8.18.1.orig/src/menu.c
+++ leafpad-0.8.18.1/src/menu.c
@@ -20,97 +20,107 @@
 #include "leafpad.h"
 #include <gdk/gdkkeysyms.h>
 
+#define accel_group gtk_ui_manager_get_accel_group(ifactory)
+
 static GtkWidget *menu_item_save;
 static GtkWidget *menu_item_cut;
 static GtkWidget *menu_item_copy;
 static GtkWidget *menu_item_paste;
 static GtkWidget *menu_item_delete;
 
-static GtkItemFactoryEntry menu_items[] =
+static GtkActionEntry menu_items[] =
 {
-	{ N_("/_File"), NULL,
-		NULL, 0, "<Branch>" },
-	{ N_("/File/_New"), "<control>N",
-		G_CALLBACK(on_file_new), 0, "<StockItem>", GTK_STOCK_NEW },
-	{ N_("/File/_Open..."), "<control>O",
-		G_CALLBACK(on_file_open), 0, "<StockItem>", GTK_STOCK_OPEN },
-	{ N_("/File/_Save"), "<control>S",
-		G_CALLBACK(on_file_save), 0, "<StockItem>", GTK_STOCK_SAVE },
-	{ N_("/File/Save _As..."), "<shift><control>S",
-		G_CALLBACK(on_file_save_as), 0, "<StockItem>", GTK_STOCK_SAVE_AS },
-	{ "/File/---", NULL,
-		NULL, 0, "<Separator>" },
+	{ "FileMenu", NULL, N_("_File"), NULL, NULL, NULL },
+	{ "EditMenu", NULL, N_("_Edit"), NULL, NULL, NULL },
+	{ "SearchMenu", NULL, N_("_Search"), NULL, NULL, NULL },
+	{ "OptionsMenu", NULL, N_("_Options"), NULL, NULL, NULL },
+	{ "HelpMenu", NULL, N_("_Help"), NULL, NULL, NULL },
+	{ "New", GTK_STOCK_NEW, N_("_New"), "<control>N", NULL, G_CALLBACK(on_file_new) },
+	{ "Open", GTK_STOCK_OPEN, N_("_Open..."), "<control>O", NULL, G_CALLBACK(on_file_open) },
+	{ "Save", GTK_STOCK_SAVE, N_("_Save"), "<control>S", NULL, G_CALLBACK(on_file_save) },
+	{ "SaveAs", GTK_STOCK_SAVE_AS, N_("Save _As..."), "<shift><control>S", NULL, G_CALLBACK(on_file_save_as) },
 #ifdef ENABLE_PRINT
 #	if GTK_CHECK_VERSION(2, 10, 0)
-	{ N_("/File/Print Pre_view"), "<shift><control>P",
-		G_CALLBACK(on_file_print_preview), 0, "<StockItem>", GTK_STOCK_PRINT_PREVIEW },
-#	endif
-	{ N_("/File/_Print..."), "<control>P",
-		G_CALLBACK(on_file_print), 0, "<StockItem>", GTK_STOCK_PRINT },
-#	if GTK_CHECK_VERSION(2, 10, 0)
-	{ "/File/---", NULL,
-		NULL, 0, "<Separator>" },
+	{ "PrintPreview", GTK_STOCK_PRINT_PREVIEW, N_("Print Pre_view"), "<shift><control>P", NULL, G_CALLBACK(on_file_print_preview) },
 #	endif
+	{ "Print", GTK_STOCK_PRINT, N_("_Print..."), "<control>P", NULL, G_CALLBACK(on_file_print) },
 #endif
-	{ N_("/File/_Quit"), "<control>Q",
-		G_CALLBACK(on_file_quit), 0, "<StockItem>", GTK_STOCK_QUIT },
-	{ N_("/_Edit"),	 NULL,
-		NULL, 0, "<Branch>" },
-	{ N_("/Edit/_Undo"), "<control>Z",
-		G_CALLBACK(on_edit_undo), 0, "<StockItem>", GTK_STOCK_UNDO },
-	{ N_("/Edit/_Redo"), "<shift><control>Z",
-		G_CALLBACK(on_edit_redo), 0, "<StockItem>", GTK_STOCK_REDO },
-	{ "/Edit/---", NULL,
-		NULL, 0, "<Separator>" },
-	{ N_("/Edit/Cu_t"), "<control>X",
-		G_CALLBACK(on_edit_cut), 0, "<StockItem>", GTK_STOCK_CUT },
-	{ N_("/Edit/_Copy"), "<control>C",
-		G_CALLBACK(on_edit_copy), 0, "<StockItem>", GTK_STOCK_COPY },
-	{ N_("/Edit/_Paste"), "<control>V",
-		G_CALLBACK(on_edit_paste), 0, "<StockItem>", GTK_STOCK_PASTE },
-	{ N_("/Edit/_Delete"), NULL,
-		G_CALLBACK(on_edit_delete), 0, "<StockItem>", GTK_STOCK_DELETE },
-	{ "/Edit/---", NULL,
-		NULL, 0, "<Separator>" },
-	{ N_("/Edit/Select _All"), "<control>A",
-		G_CALLBACK(on_edit_select_all), 0 },
-	{ N_("/_Search"),	 NULL,
-		NULL, 0, "<Branch>" },
-	{ N_("/Search/_Find..."), "<control>F",
-		G_CALLBACK(on_search_find), 0, "<StockItem>", GTK_STOCK_FIND },
-	{ N_("/Search/Find _Next"), "<control>G",
-		G_CALLBACK(on_search_find_next), 0 },
-	{ N_("/Search/Find _Previous"), "<shift><control>G",
-		G_CALLBACK(on_search_find_previous), 0 },
-	{ N_("/Search/_Replace..."), "<control>H",
-		G_CALLBACK(on_search_replace), 0, "<StockItem>", GTK_STOCK_FIND_AND_REPLACE },
-	{ "/Search/---", NULL,
-		NULL, 0, "<Separator>" },
-	{ N_("/Search/_Jump To..."), "<control>J",
-		G_CALLBACK(on_search_jump_to), 0, "<StockItem>", GTK_STOCK_JUMP_TO },
-	{ N_("/_Options"), NULL,
-		NULL, 0, "<Branch>" },
-	{ N_("/Options/_Font..."), NULL,
-		G_CALLBACK(on_option_font), 0, "<StockItem>", GTK_STOCK_SELECT_FONT },
-	{ N_("/Options/_Word Wrap"), NULL,
-		G_CALLBACK(on_option_word_wrap), 0, "<CheckItem>" },
-	{ N_("/Options/_Line Numbers"), NULL,
-		G_CALLBACK(on_option_line_numbers), 0, "<CheckItem>" },
-	{ "/Options/---", NULL,
-		NULL, 0, "<Separator>" },
-	{ N_("/Options/_Auto Indent"), NULL,
-		G_CALLBACK(on_option_auto_indent), 0, "<CheckItem>" },
-	{ N_("/_Help"), NULL,
-		NULL, 0, "<Branch>" },
-	{ N_("/Help/_About"), NULL,
+	{ "Quit", GTK_STOCK_QUIT, N_("_Quit"), "<control>Q", NULL, G_CALLBACK(on_file_quit) },
+	{ "Undo", GTK_STOCK_UNDO, N_("_Undo"), "<control>Z", NULL, G_CALLBACK(on_edit_undo) },
+	{ "Redo", GTK_STOCK_REDO, N_("_Redo"), "<shift><control>Z", NULL, G_CALLBACK(on_edit_redo) },
+	{ "Cut", GTK_STOCK_CUT, N_("Cu_t"), "<control>X", NULL, G_CALLBACK(on_edit_cut) },
+	{ "Copy", GTK_STOCK_COPY, N_("_Copy"), "<control>C", NULL, G_CALLBACK(on_edit_copy) },
+	{ "Paste", GTK_STOCK_PASTE, N_("_Paste"), "<control>V", NULL, G_CALLBACK(on_edit_paste) },
+	{ "Delete", GTK_STOCK_DELETE, N_("_Delete"), NULL, NULL, G_CALLBACK(on_edit_delete) },
+	{ "SelectAll", NULL, N_("Select _All"), "<control>A", NULL, G_CALLBACK(on_edit_select_all) },
+	{ "Find", GTK_STOCK_FIND, N_("_Find..."), "<control>F", NULL, G_CALLBACK(on_search_find) },
+	{ "FindNext", NULL, N_("Find _Next"), "<control>G", NULL, G_CALLBACK(on_search_find_next) },
+	{ "FindPrevious", NULL, N_("Find _Previous"), "<shift><control>G", NULL, G_CALLBACK(on_search_find_previous) },
+	{ "Replace", GTK_STOCK_FIND_AND_REPLACE, N_("_Replace..."), "<control>H", NULL, G_CALLBACK(on_search_replace) },
+	{ "JumpTo", GTK_STOCK_JUMP_TO, N_("_Jump To..."), "<control>J", NULL, G_CALLBACK(on_search_jump_to) },
+	{ "Font", GTK_STOCK_SELECT_FONT, N_("_Font..."), NULL, NULL, G_CALLBACK(on_option_font) },
 #if GTK_CHECK_VERSION(2, 6, 0)
-		G_CALLBACK(on_help_about), 0, "<StockItem>", GTK_STOCK_ABOUT },
+	{ "About", GTK_STOCK_ABOUT, N_("_About"), NULL, NULL, G_CALLBACK(on_help_about) },
 #else
-		G_CALLBACK(on_help_about), 0, "<StockItem>", "my-gtk-about" },
+	{ "About", "my-gtk-about", N_("_About"), NULL, NULL, G_CALLBACK(on_help_about) },
 #endif
 };
 
-static gint nmenu_items = sizeof(menu_items) / sizeof(GtkItemFactoryEntry);
+static guint nmenu_items = G_N_ELEMENTS (menu_items);
+
+static GtkToggleActionEntry toggle_entries[] =
+{
+	{ "WordWrap", NULL, N_("_Word Wrap"), NULL, NULL, G_CALLBACK (on_option_word_wrap), FALSE },
+	{ "LineNumbers", NULL, N_("_Line Numbers"), NULL, NULL, G_CALLBACK (on_option_line_numbers), FALSE },
+	{ "AutoIndent", NULL, N_("_Auto Indent"), NULL, NULL, G_CALLBACK (on_option_auto_indent), FALSE },
+};
+static guint n_toggle_entries = G_N_ELEMENTS (toggle_entries);
+
+static const gchar *ui_info = 
+"<ui>"
+"  <menubar name='MenuBar'>"
+"    <menu action='FileMenu'>"
+"      <menuitem action='New'/>"
+"      <menuitem action='Open'/>"
+"      <menuitem action='Save'/>"
+"      <menuitem action='SaveAs'/>"
+"      <separator/>"
+"      <menuitem action='PrintPreview'/>"
+"      <menuitem action='Print'/>"
+"      <separator/>"
+"      <menuitem action='Quit'/>"
+"    </menu>"
+"    <menu action='EditMenu'>"
+"      <menuitem action='Undo'/>"
+"      <menuitem action='Redo'/>"
+"      <separator/>"
+"      <menuitem action='Cut'/>"
+"      <menuitem action='Copy'/>"
+"      <menuitem action='Paste'/>"
+"      <menuitem action='Delete'/>"
+"      <separator/>"
+"      <menuitem action='SelectAll'/>"
+"    </menu>"
+"    <menu action='SearchMenu'>"
+"      <menuitem action='Find'/>"
+"      <menuitem action='FindNext'/>"
+"      <menuitem action='FindPrevious'/>"
+"      <menuitem action='Replace'/>"
+"      <separator/>"
+"      <menuitem action='JumpTo'/>"
+"    </menu>"
+"    <menu action='OptionsMenu'>"
+"      <menuitem action='Font'/>"
+"      <menuitem action='WordWrap'/>"
+"      <menuitem action='LineNumbers'/>"
+"      <separator/>"
+"      <menuitem action='AutoIndent'/>"
+"    </menu>"
+"    <menu action='HelpMenu'>"
+"      <menuitem action='About'/>"
+"    </menu>"
+"  </menubar>"
+"</ui>";
 
 static gchar *menu_translate(const gchar *path, gpointer data)
 {
@@ -144,7 +154,6 @@
 
 GtkWidget *create_menu_bar(GtkWidget *window)
 {
-	GtkAccelGroup *accel_group;
 	GtkItemFactory *ifactory;
 	gboolean flag_emacs = FALSE;
 	
@@ -159,10 +168,13 @@
 		}
 	}
 	
-	accel_group = gtk_accel_group_new();
-	ifactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group);
-	gtk_item_factory_set_translate_func(ifactory, menu_translate, NULL, NULL);
-	gtk_item_factory_create_items(ifactory, nmenu_items, menu_items, NULL);
+	ifactory = gtk_ui_manager_new();
+	GtkActionGroup *actions = gtk_action_group_new("Actions");
+	gtk_action_group_add_actions(actions, menu_items, nmenu_items, NULL);
+	gtk_action_group_add_toggle_actions (actions, toggle_entries, n_toggle_entries, NULL);
+	gtk_ui_manager_insert_action_group(ifactory, actions, 0);
+	g_object_unref(actions);
+	gtk_ui_manager_add_ui_from_string(ifactory, ui_info, -1, NULL);
 	gtk_window_add_accel_group(GTK_WINDOW(window), accel_group);
 	
 	/* hidden keybinds */
@@ -173,32 +185,32 @@
 		accel_group, GDK_T, GDK_CONTROL_MASK, 0,
 		g_cclosure_new_swap(G_CALLBACK(on_option_always_on_top), NULL, NULL));
 	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Edit/Redo"),
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/EditMenu/Redo"),
 		"activate", accel_group, GDK_Y, GDK_CONTROL_MASK, 0);
 	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Find Next"),
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/SearchMenu/FindNext"),
 		"activate", accel_group, GDK_F3, 0, 0);
 	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Find Previous"),
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/SearchMenu/FindPrevious"),
 		"activate", accel_group, GDK_F3, GDK_SHIFT_MASK, 0);
 	gtk_widget_add_accelerator(
-		gtk_item_factory_get_widget(ifactory, "/Search/Replace..."),
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/SearchMenu/Replace"),
 		"activate", accel_group, GDK_R, GDK_CONTROL_MASK, 0);
 	
 	/* initialize sensitivities */
 	gtk_widget_set_sensitive(
-		gtk_item_factory_get_widget(ifactory, "/Search/Find Next"),
-		FALSE);
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/SearchMenu/FindNext"),
+		TRUE);
 	gtk_widget_set_sensitive(
-		gtk_item_factory_get_widget(ifactory, "/Search/Find Previous"),
-		FALSE);
+		gtk_item_factory_get_widget(ifactory, "/MenuBar/SearchMenu/FindPrevious"),
+		TRUE);
 	
-	menu_item_save   = gtk_item_factory_get_widget(ifactory, "/File/Save");
-	menu_item_cut    = gtk_item_factory_get_widget(ifactory, "/Edit/Cut");
-	menu_item_copy   = gtk_item_factory_get_widget(ifactory, "/Edit/Copy");
-	menu_item_paste  = gtk_item_factory_get_widget(ifactory, "/Edit/Paste");
-	menu_item_delete = gtk_item_factory_get_widget(ifactory, "/Edit/Delete");
+	menu_item_save   = gtk_item_factory_get_widget(ifactory, "/MenuBar/FileMenu/Save");
+	menu_item_cut    = gtk_item_factory_get_widget(ifactory, "/MenuBar/EditMenu/Cut");
+	menu_item_copy   = gtk_item_factory_get_widget(ifactory, "/MenuBar/EditMenu/Copy");
+	menu_item_paste  = gtk_item_factory_get_widget(ifactory, "/MenuBar/EditMenu/Paste");
+	menu_item_delete = gtk_item_factory_get_widget(ifactory, "/MenuBar/EditMenu/Delete");
 	menu_sensitivity_from_selection_bound(FALSE);
 	
-	return gtk_item_factory_get_widget(ifactory, "<main>");
+	return (GtkWidget*)ifactory;
 }
--- leafpad-0.8.18.1.orig/src/search.c
+++ leafpad-0.8.18.1/src/search.c
@@ -33,10 +33,15 @@
 #include "search.h"
 #include "hlight.h"
 
-#if !GTK_CHECK_VERSION(2, 4, 0)
+#if !GTK_CHECK_VERSION(2, 4, 0) || GTK_CHECK_VERSION(3, 0, 0)
 #	define gtk_dialog_set_has_separator(Dialog, Setting)
 #endif
 
+#if GTK_CHECK_VERSION(3, 0, 0)
+#	define GTK_OBJECT
+#	define GTK_WIDGET_SET_FLAGS(x,y) gtk_widget_set_can_default(x,1)
+#endif
+
 static gchar *string_find    = NULL;
 static gchar *string_replace = NULL;
 static gboolean match_case, replace_all;//, replace_mode = FALSE;
@@ -95,11 +100,11 @@
 	
 //	if (direction == 0 || !hlight_check_searched())
 	if (direction == 0 || (direction != 2 && !hlight_check_searched()))
-		hlight_searched_strings(GTK_TEXT_VIEW(textview)->buffer, string_find);
+		hlight_searched_strings(gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)), string_find);
 	
 	gtk_text_mark_set_visible(
 		gtk_text_buffer_get_selection_bound(
-			GTK_TEXT_VIEW(textview)->buffer), FALSE);
+			gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview))), FALSE);
 	
 	gtk_text_buffer_get_iter_at_mark(textbuffer, &iter, gtk_text_buffer_get_insert(textbuffer));
 	if (direction < 0) {
@@ -322,7 +327,7 @@
 	 gtk_table_set_row_spacings(GTK_TABLE(table), 8);
 	 gtk_table_set_col_spacings(GTK_TABLE(table), 8);
 	 gtk_container_set_border_width(GTK_CONTAINER(table), 8);
-	 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, FALSE, FALSE, 0);
+	 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), table, FALSE, FALSE, 0);
 	label_find = gtk_label_new_with_mnemonic(_("Fi_nd what:"));
 	 gtk_misc_set_alignment(GTK_MISC(label_find), 0, 0.5);
 	 gtk_table_attach_defaults(GTK_TABLE(table), label_find, 0, 1, 0, 1);
@@ -424,7 +429,7 @@
 	table = gtk_table_new(1, 2, FALSE);
 	 gtk_table_set_col_spacings(GTK_TABLE(table), 8);
 	 gtk_container_set_border_width (GTK_CONTAINER(table), 8);
-	 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, FALSE, FALSE, 0);
+	 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), table, FALSE, FALSE, 0);
 	label = gtk_label_new_with_mnemonic(_("_Line number:"));
 	spinner_adj = (GtkAdjustment *) gtk_adjustment_new(num, 1, max_num, 1, 1, 0);
 	spinner = gtk_spin_button_new(spinner_adj, 1, 0);
--- leafpad-0.8.18.1.orig/src/selector.c
+++ leafpad-0.8.18.1/src/selector.c
@@ -135,7 +135,7 @@
 	
 	if (!menu_item_manual_charset) {
 		menu_item_manual_charset = gtk_menu_item_new_with_label(str);
-		label = GTK_LABEL(GTK_BIN(menu_item_manual_charset)->child);
+		label = GTK_LABEL(gtk_bin_get_child(GTK_BIN(menu_item_manual_charset)));
 	} else
 //		gtk_label_set_text(GTK_LABEL(GTK_BIN(menu_item_manual_charset)->child), str);
 		gtk_label_set_text(label, str);
@@ -165,7 +165,7 @@
 	
 	vbox = gtk_vbox_new(FALSE, 0);
 	gtk_container_set_border_width(GTK_CONTAINER(vbox), 8);
-	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vbox, FALSE, FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), vbox, FALSE, FALSE, 0);
 	
 	label = gtk_label_new_with_mnemonic(_("Code_set:"));
 	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
--- leafpad-0.8.18.1.orig/src/undo.c
+++ leafpad-0.8.18.1/src/undo.c
@@ -19,6 +19,7 @@
 
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
+#include <gdk/gdkkeysyms-compat.h>
 #include "view.h"
 #include "undo.h"
 
@@ -256,7 +257,7 @@
 
 void undo_init(GtkWidget *view, GtkWidget *undo_button, GtkWidget *redo_button)
 {
-	GtkTextBuffer *buffer = GTK_TEXT_VIEW(view)->buffer;
+	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
 	 
 	undo_w = undo_button;
 	redo_w = redo_button;
--- leafpad-0.8.18.1.orig/src/view.c
+++ leafpad-0.8.18.1/src/view.c
@@ -76,6 +76,7 @@
 	return 0;
 }
 
+#if !GTK_CHECK_VERSION(3, 0, 0)
 static gint check_preedit(GtkWidget *view)
 {
 	gint cursor_pos;
@@ -85,6 +86,7 @@
 	
 	return cursor_pos;
 }
+#endif
 
 static gboolean check_selection_bound(GtkTextBuffer *buffer)
 {
@@ -109,8 +111,10 @@
 	GtkTextIter iter;
 	GdkRectangle prev_rect;
 	
+#if !GTK_CHECK_VERSION(3, 0, 0)
 	if (check_preedit(view))
 		return FALSE;
+#endif
 	
 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
 	mark = gtk_text_buffer_get_insert(buffer);
@@ -159,7 +163,7 @@
 				mark, 0, TRUE, 0, pos);
 			if (!(event->state & GDK_SHIFT_MASK)) {
 				gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark);
-				gtk_text_buffer_place_cursor(GTK_TEXT_VIEW(view)->buffer, &iter);
+				gtk_text_buffer_place_cursor(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)), &iter);
 			}
 			return TRUE;
 		}
@@ -177,11 +181,11 @@
 		}
 	case GDK_ISO_Left_Tab:
 		if (event->state & GDK_SHIFT_MASK)
-			indent_multi_line_unindent(GTK_TEXT_VIEW(view)->buffer);
-		else if (!check_selection_bound(GTK_TEXT_VIEW(view)->buffer))
+			indent_multi_line_unindent(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)));
+		else if (!check_selection_bound(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view))))
 			break;
 		else
-			indent_multi_line_indent(GTK_TEXT_VIEW(view)->buffer);
+			indent_multi_line_indent(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)));
 		return TRUE;
 	}
 	keyval = event->keyval;
@@ -240,18 +244,18 @@
 
 void force_call_cb_modified_changed(GtkWidget *view)
 {
-	cb_modified_changed(GTK_TEXT_VIEW(view)->buffer, view);
+	cb_modified_changed(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)), view);
 }
 
 void force_block_cb_modified_changed(GtkWidget *view)
 {
-	g_signal_handlers_block_by_func(G_OBJECT(GTK_TEXT_VIEW(view)->buffer), 
+	g_signal_handlers_block_by_func(G_OBJECT(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view))),
 		G_CALLBACK(cb_modified_changed), view);
 }
 
 void force_unblock_cb_modified_changed(GtkWidget *view)
 {
-	g_signal_handlers_unblock_by_func(G_OBJECT(GTK_TEXT_VIEW(view)->buffer), 
+	g_signal_handlers_unblock_by_func(G_OBJECT(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view))),
 		G_CALLBACK(cb_modified_changed), view);
 }
 /*
@@ -272,10 +276,10 @@
 
 static void cb_focus_event(GtkWidget *view, GdkEventFocus *event)
 {
-	if (!gtk_text_buffer_get_selection_bounds(GTK_TEXT_VIEW(view)->buffer, NULL, NULL))
+	if (!gtk_text_buffer_get_selection_bounds(gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)), NULL, NULL))
 		gtk_text_mark_set_visible(
 			gtk_text_buffer_get_selection_bound(
-				GTK_TEXT_VIEW(view)->buffer), !event->in);
+				gtk_text_view_get_buffer(GTK_TEXT_VIEW(view))), !event->in);
 	if (event->in)
 		menu_sensitivity_from_clipboard();
 }
--- leafpad-0.8.18.1.orig/src/window.c
+++ leafpad-0.8.18.1/src/window.c
@@ -70,7 +70,7 @@
 	gtk_container_add(GTK_CONTAINER(window), vbox);
 	
 	menubar = create_menu_bar(window);
-	gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(vbox), gtk_item_factory_get_widget(GTK_UI_MANAGER(menubar), "/MenuBar"), FALSE, FALSE, 0);
 	
 	sw = gtk_scrolled_window_new(NULL, NULL);
 	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
