[geany/geany-plugins] b80681: Merge branch 'master' of github.com:geany/geany-plugins

Enrico Tröger git-noreply at xxxxx
Thu Apr 12 20:44:12 UTC 2012


Branch:      refs/heads/master
Author:      Enrico Tröger <enrico.troeger at uvena.de>
Committer:   Enrico Tröger <enrico.troeger at uvena.de>
Date:        Thu, 12 Apr 2012 20:44:12
Commit:      b80681d13e07b28940ac287ba847a9c9c6de62ad
             https://github.com/geany/geany-plugins/commit/b80681d13e07b28940ac287ba847a9c9c6de62ad

Log Message:
-----------
Merge branch 'master' of github.com:geany/geany-plugins


Modified Paths:
--------------
    build/geanylua.m4
    debugger/ChangeLog
    debugger/TODO
    debugger/src/bptree.c
    debugger/src/callbacks.c
    debugger/src/cell_renderers/cellrendererbreakicon.c
    debugger/src/cell_renderers/cellrendererframeicon.c
    debugger/src/cell_renderers/cellrenderertoggle.c
    debugger/src/dbm_gdb.c
    debugger/src/debug.c
    debugger/src/envtree.c
    debugger/src/stree.c
    debugger/src/stree.h
    debugger/src/vtree.c
    debugger/src/wtree.c
    devhelp/devhelp/Makefile.am
    devhelp/src/Makefile.am
    geanylua/Makefile.am
    geanylua/wscript_build
    geanylua/wscript_configure
    geanymacro/src/geanymacro.c
    geanynumberedbookmarks/src/geanynumberedbookmarks.c
    po/POTFILES.in

Modified: build/geanylua.m4
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -16,6 +16,7 @@ AC_DEFUN([GP_CHECK_GEANYLUA],
     LUA_VERSION=5.1
     GP_CHECK_PLUGIN_DEPS([GeanyLua], [LUA],
                          [${LUA_PKG_NAME} >= ${LUA_VERSION}])
+    GP_CHECK_PLUGIN_DEPS([GeanyLua], [GMODULE], [gmodule-2.0])
     GP_STATUS_PLUGIN_ADD([GeanyLua], [$enable_geanylua])
 
     AC_CONFIG_FILES([


Modified: debugger/ChangeLog
19 files changed, 19 insertions(+), 0 deletions(-)
===================================================================
@@ -1,3 +1,22 @@
+08-04-2012 	Alexander Petukhov <devel at apetukhov.ru>
+
+	* fixed a bug with wrong error message when a breakpoint condition/hitscounr can't be set
+	* fixed a bug when gdb exits without a stop reason
+
+07-04-2012 	Alexander Petukhov <devel at apetukhov.ru>
+
+	* fixed a bug with calltips still being shown when a pointer leaves editor window
+
+04-04-2012 	Alexander Petukhov <devel at apetukhov.ru>
+
+	* fixing exiting with code case that was unhandled and caused SIGSEGV (gdb)
+	* set current directory to executable's one (gdb)
+	* handling spaces in target and breakpoints filenames (gdb)
+	* fixing memory leaks on gtk_tree_row_reference_get_path and tree/list stores
+	* fixing SIGSEGV when selecting a cell in custom cell renderers using a keyboard
+	* fixing lack of breakpoint/stack frame markers after plugin unload and load
+	* fixing "jump to current instruction" behaviour (does not change an active frame)
+
 10-03-2012 	Alexander Petukhov <devel at apetukhov.ru>
 
 	* switching between frames by clicking a frame arrow in the stack window


Modified: debugger/TODO
39 files changed, 20 insertions(+), 19 deletions(-)
===================================================================
@@ -1,26 +1,27 @@
 BUGS:
-- terminal stops to produce any output after some debug seesions
-- tooltip appears even if a pointer in no longer inside editor window
-- check possible memory leaks on a)gtk_tree_row_reference_get_path b)missing unrefs on tree/list stores
-- cell_renderer_toogle SIGSEGV in cell_renderer_toggle_activate when activating a cell using a keyboard (event->button == NULL)
-- debug geany with debugger project. switch frames then step over -> continue instead, then close geany being debugged -> dbm_gdb.c:502 (no step reason, probably the record from the previos step command???)
 
 FEATURES:
-- custom tooltip with sticking facilities
-- don't hide a tooltip until run hasn't happent, move it if document is being scrolled
-- use lexer to lookup for a symbol under cursor when presenting a tooltip
-- geany menu integration
-- toolbar buttons
-- margin context menu
-- step back
-- tree views column width/autowidth
-- attach functionality: dbm_ methods providing target lists, common dialog
-- android support
-- bashdb support
-- windows support
+
+- debug callbacks names (refactoring)
 - gdb backend step speed
-- debug callbacks names
+- windows support
+
+- attach functionality: dbm_ methods providing target lists, common dialog
 - interrupt thread using stack window
-- custom tooltip on breaks and stack trace windows with code snippet around break or frame
+- step back
+
+- margin context menu
+- editor context menu (add watch, add/remove breakpoint)
+
 - font from the geany settings for a message window
+- use left/right keys to collapse/expand in breakpoints tree
+- use lexer to lookup for a symbol under cursor when presenting a tooltip
 - a button in the upper right path of a right notebook for a hiding/showing button panel
+- minimum width of the debug panel notebooks
+- tree views column width/autowidth
+- custom tooltip on breaks and stack trace windows with code snippet around break or frame
+- custom tooltip(in an editor in debug mode) with sticking facilities
+- don't hide a tooltip until run hasn't happent, move it if document is being scrolled
+
+- android support
+- bashdb support


Modified: debugger/src/bptree.c
5 files changed, 4 insertions(+), 1 deletions(-)
===================================================================
@@ -616,6 +616,7 @@ gboolean bptree_init(move_to_line_cb cb)
 		G_TYPE_STRING);
 	model = GTK_TREE_MODEL(store);
 	tree = gtk_tree_view_new_with_model (model);
+	g_object_unref(store);
 	
 	/* set tree view properties */
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), 1);
@@ -802,7 +803,9 @@ void bptree_add_breakpoint(breakpoint* bp)
 	}
 	else
 	{
-		gtk_tree_model_get_iter(model, &file_iter, gtk_tree_row_reference_get_path(file_reference));
+		GtkTreePath *path = gtk_tree_row_reference_get_path(file_reference);
+		gtk_tree_model_get_iter(model, &file_iter, path);
+		gtk_tree_path_free(path);
 	}
 	
 	/* lookup where to insert new row */


Modified: debugger/src/callbacks.c
26 files changed, 23 insertions(+), 3 deletions(-)
===================================================================
@@ -155,6 +155,21 @@ void on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_data)
 }
 
 /*
+ * 	Handles mouse leave event to check if a calltip is still present and hides it if yes 
+ */
+static gint leave_signal;
+static gboolean on_mouse_leave(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+	ScintillaObject *so = (ScintillaObject*)widget;
+	if (scintilla_send_message (so, SCI_CALLTIPACTIVE, 0, 0))
+	{
+		g_signal_handler_disconnect(G_OBJECT(widget), leave_signal);
+		scintilla_send_message (so, SCI_CALLTIPCANCEL, 0, 0);
+	}
+	return FALSE;
+}
+
+/*
  * 	Occures on notify from editor.
  * 	Handles margin click to set/remove breakpoint 
  */
@@ -194,7 +209,7 @@ gboolean on_editor_notify(
 		{
 			if (DBS_STOPPED != debug_get_state ())
 				break;
-			
+
 			/* get a word under the cursor */
 			GString *word = get_word_at_position(editor->sci, nt->position);
 
@@ -203,6 +218,7 @@ gboolean on_editor_notify(
 				gchar *calltip = debug_get_calltip_for_expression(word->str);
 				if (calltip)
 				{
+					leave_signal = g_signal_connect(G_OBJECT(editor->sci), "leave-notify-event", G_CALLBACK(on_mouse_leave), NULL);
 					scintilla_send_message (editor->sci, SCI_CALLTIPSHOW, nt->position, (long)calltip);
 				}
 			}
@@ -216,7 +232,11 @@ gboolean on_editor_notify(
 			if (DBS_STOPPED != debug_get_state ())
 				break;
 
-			scintilla_send_message (editor->sci, SCI_CALLTIPCANCEL, 0, 0);
+			if (scintilla_send_message (editor->sci, SCI_CALLTIPACTIVE, 0, 0))
+			{
+				g_signal_handler_disconnect(G_OBJECT(editor->sci), leave_signal);
+				scintilla_send_message (editor->sci, SCI_CALLTIPCANCEL, 0, 0);
+			}
 			break;
 		}
 		case SCN_MODIFYATTEMPTRO:
@@ -330,7 +350,7 @@ gboolean keys_callback(guint key_id)
 			{
 				debug_jump_to_current_instruction();
 				gtk_widget_set_sensitive(tab_call_stack, FALSE);
-				stree_select_first_frame();
+				stree_select_first_frame(FALSE);
 				gtk_widget_set_sensitive(tab_call_stack, TRUE);
 			}
 		}


Modified: debugger/src/cell_renderers/cellrendererbreakicon.c
50 files changed, 31 insertions(+), 19 deletions(-)
===================================================================
@@ -261,8 +261,12 @@ static void cell_renderer_break_icon_render(GtkCellRenderer *cell, GdkDrawable *
 static gint cell_renderer_break_icon_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
 	GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState  flags)
 {
-	if (event->button.x >= cell_area->x &&
-		event->button.x < (cell_area->x + cell_area->width))
+	if (!event ||
+		(
+			event->button.x >= cell_area->x &&
+			event->button.x < (cell_area->x + cell_area->width)
+		)
+	)
 	{
 		g_signal_emit (cell, clicked_signal, 0, path);
 	}
@@ -411,24 +415,32 @@ GType cell_renderer_break_icon_get_type(void)
 	
 	if(0 == cell_break_icon_type)
 	{
-		static const GTypeInfo cell_break_icon_info =
+		if ( (cell_break_icon_type = g_type_from_name("CellRendererBreakIcon")) )
 		{
-			sizeof (CellRendererBreakIconClass),
-			NULL,                                                     /* base_init */
-			NULL,                                                     /* base_finalize */
-			(GClassInitFunc) cell_renderer_break_icon_class_init,
-			NULL,                                                     /* class_finalize */
-			NULL,                                                     /* class_data */
-			sizeof (CellRendererBreakIcon),
-			0,                                                        /* n_preallocs */
-			(GInstanceInitFunc) cell_renderer_break_icon_init,
-		};
-
-		/* Derive from GtkCellRenderer */
-		cell_break_icon_type = g_type_register_static (GTK_TYPE_CELL_RENDERER,
-			"CellRendererBreakIcon",
-			&cell_break_icon_info,
-			0);
+			parent_class = g_type_class_peek_static(g_type_parent(cell_break_icon_type));
+			clicked_signal = g_signal_lookup("clicked", cell_break_icon_type);
+		}
+		else
+		{
+			static const GTypeInfo cell_break_icon_info =
+			{
+				sizeof (CellRendererBreakIconClass),
+				NULL,                                                     /* base_init */
+				NULL,                                                     /* base_finalize */
+				(GClassInitFunc) cell_renderer_break_icon_class_init,
+				NULL,                                                     /* class_finalize */
+				NULL,                                                     /* class_data */
+				sizeof (CellRendererBreakIcon),
+				0,                                                        /* n_preallocs */
+				(GInstanceInitFunc) cell_renderer_break_icon_init,
+			};
+		
+			/* Derive from GtkCellRenderer */
+			cell_break_icon_type = g_type_register_static (GTK_TYPE_CELL_RENDERER,
+				"CellRendererBreakIcon",
+				&cell_break_icon_info,
+				0);
+		}
 	}
 	
 	return cell_break_icon_type;


Modified: debugger/src/cell_renderers/cellrendererframeicon.c
50 files changed, 31 insertions(+), 19 deletions(-)
===================================================================
@@ -45,8 +45,12 @@ enum {
 static gint cell_renderer_frame_icon_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
 	GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState  flags)
 {
-	if (event->button.x >= cell_area->x &&
-		event->button.x < (cell_area->x + cell_area->width))
+	if (!event ||
+		(
+			event->button.x >= cell_area->x &&
+			event->button.x < (cell_area->x + cell_area->width)
+		)
+	)
 	{
 		g_signal_emit (cell, clicked_signal, 0, path);
 	}
@@ -311,24 +315,32 @@ GType cell_renderer_frame_icon_get_type(void)
 	
 	if(0 == cell_frame_icon_type)
 	{
-		static const GTypeInfo cell_frame_icon_info =
+		if ( (cell_frame_icon_type = g_type_from_name("CellRendererFrameIcon")) )
 		{
-			sizeof (CellRendererFrameIconClass),
-			NULL,                                                     /* base_init */
-			NULL,                                                     /* base_finalize */
-			(GClassInitFunc) cell_renderer_frame_icon_class_init,
-			NULL,                                                     /* class_finalize */
-			NULL,                                                     /* class_data */
-			sizeof (CellRendererFrameIcon),
-			0,                                                        /* n_preallocs */
-			(GInstanceInitFunc) cell_renderer_frame_icon_init,
-		};
-
-		/* Derive from GtkCellRenderer */
-		cell_frame_icon_type = g_type_register_static (GTK_TYPE_CELL_RENDERER,
-			"CellRendererFrameIcon",
-			&cell_frame_icon_info,
-			0);
+			parent_class = g_type_class_peek_static(g_type_parent(cell_frame_icon_type));
+			clicked_signal = g_signal_lookup("clicked", cell_frame_icon_type);
+		}
+		else
+		{
+			static const GTypeInfo cell_frame_icon_info =
+			{
+				sizeof (CellRendererFrameIconClass),
+				NULL,                                                     /* base_init */
+				NULL,                                                     /* base_finalize */
+				(GClassInitFunc) cell_renderer_frame_icon_class_init,
+				NULL,                                                     /* class_finalize */
+				NULL,                                                     /* class_data */
+				sizeof (CellRendererFrameIcon),
+				0,                                                        /* n_preallocs */
+				(GInstanceInitFunc) cell_renderer_frame_icon_init,
+			};
+	
+			/* Derive from GtkCellRenderer */
+			cell_frame_icon_type = g_type_register_static (GTK_TYPE_CELL_RENDERER,
+				"CellRendererFrameIcon",
+				&cell_frame_icon_info,
+				0);
+		}
 	}
 	
 	return cell_frame_icon_type;


Modified: debugger/src/cell_renderers/cellrenderertoggle.c
16 files changed, 10 insertions(+), 6 deletions(-)
===================================================================
@@ -35,8 +35,12 @@
 static gint cell_renderer_toggle_activate(GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path,
 	GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState  flags)
 {
-	if (event->button.x >= cell_area->x &&
-		event->button.x < (cell_area->x + cell_area->width))
+	if (!event ||
+		(
+			event->button.x >= cell_area->x &&
+			event->button.x < (cell_area->x + cell_area->width)
+		)
+	)
 	{
 		g_signal_emit_by_name(cell, "toggled", path);
 	}
@@ -66,9 +70,9 @@ static void cell_renderer_toggle_class_init (GtkCellRendererToggleClass *class)
  */
 GType cell_renderer_toggle_get_type(void)
 {
-	static GType cell_brekpoint_type = 0;
+	static GType cell_break_toggle_type = 0;
 	
-	if(0 == cell_brekpoint_type)
+	if(0 == cell_break_toggle_type && !(cell_break_toggle_type = g_type_from_name("CellRendererToggle")))
 	{
 		static const GTypeInfo cell_file_info =
 		{
@@ -84,13 +88,13 @@ GType cell_renderer_toggle_get_type(void)
 		};
 
 		/* Derive from GtkToggleCellRenderer */
-		cell_brekpoint_type = g_type_register_static (GTK_TYPE_CELL_RENDERER_TOGGLE,
+		cell_break_toggle_type = g_type_register_static (GTK_TYPE_CELL_RENDERER_TOGGLE,
 			"CellRendererToggle",
 			&cell_file_info,
 			0);
 	}
 	
-	return cell_brekpoint_type;
+	return cell_break_toggle_type;
 }
 
 /*


Modified: debugger/src/dbm_gdb.c
44 files changed, 34 insertions(+), 10 deletions(-)
===================================================================
@@ -72,6 +72,7 @@ enum sr {
 	SR_EXITED_NORMALLY,
 	SR_SIGNAL_RECIEVED,
 	SR_EXITED_SIGNALLED,
+	SR_EXITED_WITH_CODE,
 } stop_reason;
 
 /* callbacks to use for messaging, error reporting and state change alerting */
@@ -490,11 +491,13 @@ static gboolean on_read_from_gdb(GIOChannel * src, GIOCondition cond, gpointer d
 					stop_reason = SR_EXITED_NORMALLY;
 				else if (!strcmp(reason, "exited-signalled"))
 					stop_reason = SR_EXITED_SIGNALLED;
+				else if (!strcmp(reason, "exited"))
+					stop_reason = SR_EXITED_WITH_CODE;
 			}
 			else
 			{
 				/* somehow, sometimes there can be no stop reason */
-				stop_reason = SR_END_STEPPING_RANGE;
+				stop_reason = SR_EXITED_NORMALLY;
 			}
 			
 			if (SR_BREAKPOINT_HIT == stop_reason || SR_END_STEPPING_RANGE == stop_reason || SR_SIGNAL_RECIEVED == stop_reason)
@@ -531,8 +534,18 @@ static gboolean on_read_from_gdb(GIOChannel * src, GIOCondition cond, gpointer d
 					dbg_cbs->set_stopped(atoi(thread_id));
 				}
 			}
-			else if (stop_reason == SR_EXITED_NORMALLY || stop_reason == SR_EXITED_SIGNALLED)
+			else if (stop_reason == SR_EXITED_NORMALLY || stop_reason == SR_EXITED_SIGNALLED || stop_reason == SR_EXITED_WITH_CODE)
 			{
+				if (stop_reason == SR_EXITED_WITH_CODE)
+				{
+					gchar *code = strstr(reason + strlen(reason) + 1,"exit-code=\"") + strlen("exit-code=\"");
+					*(strchr(code, '\"')) = '\0';
+					gchar *message = g_strdup_printf(_("Program exited with code \"%i\""), (int)(char)strtol(code, NULL, 8));
+					dbg_cbs->report_error(message);
+
+					g_free(message);
+				}
+
 				stop();
 			}
 		}
@@ -692,13 +705,17 @@ gboolean run(const gchar* file, const gchar* commandline, GList* env, GList *wit
 	/* spawn GDB */
 	const gchar *exclude[] = { "LANG", NULL };
 	gchar **gdb_env = utils_copy_environment(exclude, "LANG", "C", NULL);
-	if (!g_spawn_async_with_pipes(NULL, (gchar**)gdb_args, gdb_env,
+	gchar *working_directory = g_path_get_dirname(file);
+	if (!g_spawn_async_with_pipes(working_directory, (gchar**)gdb_args, gdb_env,
 				     GDB_SPAWN_FLAGS, NULL,
 				     NULL, &gdb_pid, &gdb_in, &gdb_out, NULL, &err))
 	{
 		dbg_cbs->report_error(_("Failed to spawn gdb process"));
+		g_free(working_directory);
+		g_strfreev(gdb_env);
 		return FALSE;
 	}
+	g_free(working_directory);
 	g_strfreev(gdb_env);
 	
 	/* move gdb to it's own process group */
@@ -743,8 +760,8 @@ gboolean run(const gchar* file, const gchar* commandline, GList* env, GList *wit
 
 	/* loading file */
 	GString *command = g_string_new("");
-	g_string_printf(command, "-file-exec-and-symbols %s", file);
-	commands = add_to_queue(commands, _("~\"Loading target file ...\""), command->str, _("Error loading file"), FALSE);
+	g_string_printf(command, "-file-exec-and-symbols \"%s\"", file);
+	commands = add_to_queue(commands, _("~\"Loading target file.\\n\""), command->str, _("Error loading file"), FALSE);
 	g_string_free(command, TRUE);
 
 	/* setting asyncronous mode */
@@ -792,7 +809,7 @@ gboolean run(const gchar* file, const gchar* commandline, GList* env, GList *wit
 	{
 		breakpoint *bp = (breakpoint*)biter->data;
 		command = g_string_new("");
-		g_string_printf(command, "-break-insert -f %s:%i", bp->file, bp->line);
+		g_string_printf(command, "-break-insert -f \"\\\"%s\\\":%i\"", bp->file, bp->line);
 
 		GString *error_message = g_string_new("");
 		g_string_printf(error_message, _("Breakpoint at %s:%i cannot be set\nDebugger message: %s"), bp->file, bp->line, "%s");
@@ -800,7 +817,6 @@ gboolean run(const gchar* file, const gchar* commandline, GList* env, GList *wit
 		commands = add_to_queue(commands, NULL, command->str, error_message->str, TRUE);
 
 		g_string_free(command, TRUE);
-		g_string_free(error_message, TRUE);
 
 		if (bp->hitscount)
 		{
@@ -824,6 +840,8 @@ gboolean run(const gchar* file, const gchar* commandline, GList* env, GList *wit
 			g_string_free(command, TRUE);
 		}
 
+		g_string_free(error_message, TRUE);
+
 		bp_index++;
 		biter = biter->next;
 	}
@@ -934,8 +952,14 @@ int get_break_number(char* file, int line)
 		*strchr(bstart, '\"') = '\0';
 		int bline = atoi(bstart);
 		
-		if (!strcmp(fname, file) && bline == line)
+		gchar *file_quoted = g_strdup_printf("\\\"%s\\\"", file);
+		int break_found = !strcmp(fname, file_quoted) && bline == line;
+		g_free(file_quoted);
+
+		if (break_found)
+		{
 			return num;
+		}
 		
 		bstart += strlen(bstart) + 1;
 	} 
@@ -957,11 +981,11 @@ gboolean set_break(breakpoint* bp, break_set_activity bsa)
 		gchar *record = NULL;
 		
 		/* 1. insert breakpoint */
-		sprintf (command, "-break-insert %s:%i", bp->file, bp->line);
+		sprintf (command, "-break-insert \"\\\"%s\\\":%i\"", bp->file, bp->line);
 		if (RC_DONE != exec_sync_command(command, TRUE, &record))
 		{
 			g_free(record);
-			sprintf (command, "-break-insert -f %s:%i", bp->file, bp->line);
+			sprintf (command, "-break-insert -f \"\\\"%s\\\":%i\"", bp->file, bp->line);
 			if (RC_DONE != exec_sync_command(command, TRUE, &record))
 			{
 				g_free(record);


Modified: debugger/src/debug.c
16 files changed, 13 insertions(+), 3 deletions(-)
===================================================================
@@ -240,7 +240,9 @@ static void on_watch_changed(GtkCellRendererText *renderer, gchar *path, gchar *
 		-1);
 
 	/* check if it is empty row */
-	gboolean is_empty_row = !gtk_tree_path_compare (tree_path, wtree_empty_path());
+	GtkTreePath *empty_path = wtree_empty_path();
+	gboolean is_empty_row = !gtk_tree_path_compare (tree_path, empty_path);
+	gtk_tree_path_free(empty_path);
 
    	gchar *striped = g_strstrip(g_strdup(new_text));
 	if (!strlen(striped) &&
@@ -447,6 +449,8 @@ static gboolean on_watch_key_pressed_callback(GtkWidget *widget, GdkEvent  *even
 
 
 				gtk_tree_store_remove(wstore, &titer);
+
+				gtk_tree_path_free(path);
 			}
 			
 			iter = iter->next;
@@ -455,7 +459,11 @@ static gboolean on_watch_key_pressed_callback(GtkWidget *widget, GdkEvent  *even
 		/* if all (with or without empty row) was selected - set empty row
 		as a path to be selected after deleting */
 		if (!reference_to_select)
-			reference_to_select = gtk_tree_row_reference_new (gtk_tree_view_get_model(GTK_TREE_VIEW(wtree)), wtree_empty_path());
+		{
+			GtkTreePath *path = wtree_empty_path();
+			reference_to_select = gtk_tree_row_reference_new (gtk_tree_view_get_model(GTK_TREE_VIEW(wtree)), path);
+			gtk_tree_path_free(path);
+		}
 
 		/* set selection */
 		gtk_tree_selection_unselect_all(selection);
@@ -471,6 +479,8 @@ static gboolean on_watch_key_pressed_callback(GtkWidget *widget, GdkEvent  *even
 		config_set_debug_changed();
 	}
 
+	gtk_tree_path_free(empty_path);
+
 	/* free rows list */
 	g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
 	g_list_free (rows);
@@ -669,7 +679,7 @@ static void on_debugger_stopped (int thread_id)
 		stree_add(f);
 		iter = g_list_next(iter);
 	}
-	stree_select_first_frame();
+	stree_select_first_frame(TRUE);
 
 	/* files */
 	GList *files = active_module->get_files();


Modified: debugger/src/envtree.c
23 files changed, 18 insertions(+), 5 deletions(-)
===================================================================
@@ -151,6 +151,7 @@ static void delete_selected_rows()
 			gtk_tree_model_get_iter(model, &titer, path);
 			gtk_list_store_remove(store, &titer);
 
+			gtk_tree_path_free(path);
 			iter = iter->next;
 		}
 
@@ -159,6 +160,7 @@ static void delete_selected_rows()
 		GtkTreePath *path = gtk_tree_row_reference_get_path(reference_to_select);
 		gtk_tree_selection_select_path(selection, path);
 		gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree), path, NULL, TRUE, 0.5, 0.5);
+		gtk_tree_path_free(path);
 
 		/* free references list */
 		g_list_foreach (references, (GFunc)gtk_tree_row_reference_free, NULL);
@@ -168,6 +170,8 @@ static void delete_selected_rows()
 	/* free selection reference */
 	gtk_tree_row_reference_free(reference_to_select);
 
+	gtk_tree_path_free(empty_path);
+
 	/* free rows list */
 	g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
 	g_list_free (rows);
@@ -213,9 +217,11 @@ static void on_render_value(GtkTreeViewColumn *tree_column,
 	{
 		/* do not allow to edit value for empty row */
 		GtkTreePath *path = gtk_tree_model_get_path(tree_model, iter);
-		gboolean empty = !gtk_tree_path_compare(path, gtk_tree_row_reference_get_path(empty_row));
+		GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
+		gboolean empty = !gtk_tree_path_compare(path, empty_path);
 		g_object_set (cell, "editable", entering_new_var || !empty, NULL);
 		gtk_tree_path_free(path);
+		gtk_tree_path_free(empty_path);
 	}
 }
 
@@ -226,8 +232,10 @@ static void on_value_changed(GtkCellRendererText *renderer, gchar *path, gchar *
 {
 	GtkTreeIter  iter;
 	GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
-    
-	gboolean empty = !gtk_tree_path_compare(tree_path, gtk_tree_row_reference_get_path(empty_row));
+
+    GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
+	gboolean empty = !gtk_tree_path_compare(tree_path, empty_path);
+	gtk_tree_path_free(empty_path);
 
 	gtk_tree_model_get_iter (
 		 model,
@@ -300,7 +308,8 @@ static void on_value_editing_cancelled(GtkCellRenderer *renderer, gpointer user_
 {
 	/* check whether escape was pressed when editing
 	new variable value cell */
-	if(!gtk_tree_path_compare(being_edited_value, gtk_tree_row_reference_get_path(empty_row)))
+	GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
+	if(!gtk_tree_path_compare(being_edited_value, empty_path))
 	{
 		/* if so - clear name sell */
 		GtkTreeIter iter;
@@ -318,6 +327,7 @@ static void on_value_editing_cancelled(GtkCellRenderer *renderer, gpointer user_
 	g_object_set (renderer_value, "editable", FALSE, NULL);
 
 	gtk_tree_path_free(being_edited_value);
+	gtk_tree_path_free(empty_path);
 }
 
 /*
@@ -327,8 +337,9 @@ static void on_name_changed(GtkCellRendererText *renderer, gchar *path, gchar *n
 {
 	GtkTreeIter  iter;
 	GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
+	GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
     
-	gboolean empty = !gtk_tree_path_compare(tree_path, gtk_tree_row_reference_get_path(empty_row));
+	gboolean empty = !gtk_tree_path_compare(tree_path, empty_path);
 
 	gtk_tree_model_get_iter (
 		 model,
@@ -371,6 +382,7 @@ static void on_name_changed(GtkCellRendererText *renderer, gchar *path, gchar *n
 	}
 	
 	gtk_tree_path_free(tree_path);
+	gtk_tree_path_free(empty_path);
 	g_free(oldvalue);
 	g_free(striped);
 }
@@ -387,6 +399,7 @@ static void on_name_changed(GtkCellRendererText *renderer, gchar *path, gchar *n
 		G_TYPE_STRING);
 	model = GTK_TREE_MODEL(store);
 	tree = gtk_tree_view_new_with_model (model);
+	g_object_unref(store);
 	
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE);
 	g_signal_connect(G_OBJECT(tree), "key-press-event", G_CALLBACK (on_envtree_keypressed), NULL);


Modified: debugger/src/stree.c
27 files changed, 19 insertions(+), 8 deletions(-)
===================================================================
@@ -136,7 +136,7 @@ static gboolean on_query_tooltip(GtkWidget *widget, gint x, gint y, gboolean key
 			}
 			else if (column == gtk_tree_view_get_column(GTK_TREE_VIEW(widget), S_ADRESS && bx >= start_pos && bx < start_pos + width))
 			{
-				gtk_tooltip_set_text(tooltip, gtk_tree_path_get_indices(tpath)[1] == active_frame_index ? _("Active frame") : _("Switch to a frame"));
+				gtk_tooltip_set_text(tooltip, gtk_tree_path_get_indices(tpath)[1] == active_frame_index ? _("Active frame") : _("Click an arrow to switch to a frame"));
 				gtk_tree_view_set_tooltip_row(GTK_TREE_VIEW(widget), tooltip, tpath);
 				show = TRUE;
 			}
@@ -333,6 +333,7 @@ static void on_selection_changed(GtkTreeSelection *treeselection, gpointer user_
 		
 	model = GTK_TREE_MODEL(store);
 	tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
+	g_object_unref(store);
 	
 	/* set tree view properties */
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), 1);
@@ -411,7 +412,9 @@ void stree_add(frame *f)
 {
 	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
 	GtkTreeIter thread_iter;
-	gtk_tree_model_get_iter(model, &thread_iter, gtk_tree_row_reference_get_path(reference));
+	GtkTreePath *path = gtk_tree_row_reference_get_path(reference);
+	gtk_tree_model_get_iter(model, &thread_iter, path);
+	gtk_tree_path_free(path);
 
 	GtkTreeIter frame_iter;
 	gtk_tree_store_insert_before(store, &frame_iter, &thread_iter, 0);
@@ -437,16 +440,22 @@ void stree_clear()
 /*
  *	select first frame in the stack
  */
-void stree_select_first_frame()
+void stree_select_first_frame(gboolean make_active)
 {
 	gtk_tree_view_expand_all(GTK_TREE_VIEW(tree));
 	
 	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
 	GtkTreeIter thread_iter, frame_iter;
-	gtk_tree_model_get_iter(model, &thread_iter, gtk_tree_row_reference_get_path(reference));
+	GtkTreePath *active_path = gtk_tree_row_reference_get_path(reference);
+	gtk_tree_model_get_iter(model, &thread_iter, active_path);
+	gtk_tree_path_free(active_path);
 	if(gtk_tree_model_iter_children(model, &frame_iter, &thread_iter))
 	{
-		gtk_tree_store_set (store, &frame_iter, S_ACTIVE, TRUE, -1);
+		if (make_active)
+		{
+			gtk_tree_store_set (store, &frame_iter, S_ACTIVE, TRUE, -1);
+			active_frame_index = 0;
+		}
 
 		GtkTreePath* path = gtk_tree_model_get_path(model, &frame_iter);
 		
@@ -455,8 +464,6 @@ void stree_select_first_frame()
 			path);
 
 		gtk_tree_path_free(path);
-
-		active_frame_index = 0;
 	}
 }
 
@@ -534,6 +541,8 @@ void stree_remove_thread(int thread_id)
 	gtk_tree_store_remove(store, &iter);
 
 	g_hash_table_remove(threads, (gpointer)(glong)thread_id);
+
+	gtk_tree_path_free(tpath);
 }
 
 /*
@@ -543,7 +552,9 @@ void stree_remove_frames()
 {
 	GtkTreeRowReference *reference = (GtkTreeRowReference*)g_hash_table_lookup(threads, (gpointer)active_thread_id);
 	GtkTreeIter thread_iter;
-	gtk_tree_model_get_iter(model, &thread_iter, gtk_tree_row_reference_get_path(reference));
+	GtkTreePath *tpath = gtk_tree_row_reference_get_path(reference);
+	gtk_tree_model_get_iter(model, &thread_iter, tpath);
+	gtk_tree_path_free(tpath);
 
 	GtkTreeIter child;
 	if (gtk_tree_model_iter_children(model, &child, &thread_iter))


Modified: debugger/src/stree.h
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -28,7 +28,7 @@
 void 			stree_add_thread(int thread_id);
 void 			stree_remove_thread(int thread_id);
 
-void 			stree_select_first_frame();
+void 			stree_select_first_frame(gboolean make_active);
 void 			stree_remove_frames();
 
 void			stree_set_active_thread_id(int thread_id);


Modified: debugger/src/vtree.c
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -148,6 +148,7 @@ void render_value(GtkTreeViewColumn *tree_column,
 		G_TYPE_INT,
 		G_TYPE_INT);
 	GtkWidget* tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
+	g_object_unref(store);
 		
 	/* set tree view parameters */
 	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE);


Modified: debugger/src/wtree.c
6 files changed, 4 insertions(+), 2 deletions(-)
===================================================================
@@ -99,10 +99,12 @@ static void on_render_name(GtkTreeViewColumn *tree_column,
 GtkTreeIter wtree_empty_row()
 {
 	GtkTreeIter empty;
-	
+
+	GtkTreePath *path = gtk_tree_row_reference_get_path(empty_row);
 	gtk_tree_model_get_iter(gtk_tree_view_get_model(GTK_TREE_VIEW(tree)),
 		&empty,
-		gtk_tree_row_reference_get_path(empty_row));
+		path);
+	gtk_tree_path_free(path);
 	
 	return empty;
 }


Modified: devhelp/devhelp/Makefile.am
6 files changed, 4 insertions(+), 2 deletions(-)
===================================================================
@@ -1,3 +1,7 @@
+if ENABLE_DEVHELP
+noinst_LTLIBRARIES = libdevhelp-2.la
+endif
+
 dh_headers = \
 	dh-assistant.h \
 	dh-assistant-view.h \
@@ -28,8 +32,6 @@ EXTRA_DIST = \
 	dh-enum-types.c.template \
 	dh-enum-types.h.template
 
-noinst_LTLIBRARIES = libdevhelp-2.la
-
 libdevhelp_2_la_SOURCES = \
 	dh-assistant.c \
 	dh-assistant-view.c \


Modified: devhelp/src/Makefile.am
1 files changed, 0 insertions(+), 1 deletions(-)
===================================================================
@@ -1,5 +1,4 @@
 include $(top_srcdir)/build/vars.build.mk
-include $(top_srcdir)/build/vars.docs.mk
 
 plugin = devhelp
 


Modified: geanylua/Makefile.am
2 files changed, 2 insertions(+), 0 deletions(-)
===================================================================
@@ -38,10 +38,12 @@ libgeanylua_la_SOURCES = \
 
 geanylua_la_CFLAGS = \
 	$(AM_CFLAGS) \
+	$(GMODULE_CFLAGS) \
 	$(LUA_CFLAGS)
 
 geanylua_la_LIBADD = \
 	$(COMMONLIBS) \
+	$(GMODULE_LIBS) \
 	$(LUA_LIBS)
 
 libgeanylua_la_CFLAGS = $(geanylua_la_CFLAGS)


Modified: geanylua/wscript_build
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -28,7 +28,7 @@ sources = ['geanylua.c']
 lua_sources = [ 'glspi_init.c', 'glspi_app.c', 'glspi_dlg.c',
                 'glspi_doc.c', 'glspi_kfile.c', 'glspi_run.c',
                 'glspi_sci.c', 'gsdlg_lua.c' ]
-libraries = ['LUA']
+libraries = ['LUA', 'GMODULE']
 
 build_plugin(bld, name, sources=sources, libraries=libraries)
 


Modified: geanylua/wscript_configure
6 files changed, 6 insertions(+), 0 deletions(-)
===================================================================
@@ -42,3 +42,9 @@ def try_to_find_lua_package():
 found_lua_package = try_to_find_lua_package()
 if not found_lua_package:
     raise ConfigurationError('You need Lua 5.1 for the GeanyLua plugin')
+
+check_cfg_cached(conf,
+    package='gmodule-2.0',
+    mandatory=True,
+    uselib_store='GMODULE',
+    args='--cflags --libs')


Modified: geanymacro/src/geanymacro.c
636 files changed, 504 insertions(+), 132 deletions(-)
===================================================================
@@ -29,10 +29,7 @@
 typedef struct
 {
 	gint message;
-	/* I'm leaving wparam commented out as this may prove useful if it's used by a Scintilla
-	 * message that's recorded in a macro that I'm not aware of yet
-	*/
-	/*	gulong wparam; */
+	gulong wparam;
 	glong lparam;
 } MacroEvent;
 
@@ -100,39 +97,39 @@
 {SCI_WORDLEFTEND,N_("Move Cursor to end of Word to the Left")},
 {SCI_WORDRIGHTEND,N_("Move Cursor to end of Word to the Right")},
 
-{SCI_LINEDOWNEXTEND,N_("Move Selection down a line")},
-{SCI_LINEUPEXTEND,N_("Move Selection up a line")},
-{SCI_CHARLEFTEXTEND,N_("Move Selection Left a line")},
-{SCI_CHARRIGHTEXTEND,N_("Move Selection Right a line")},
-{SCI_WORDLEFTEXTEND,N_("Move Selection to start of Word to the Left")},
-{SCI_WORDRIGHTEXTEND,N_("Move Selection to start of Word to the Right")},
-{SCI_WORDPARTLEFTEXTEND,N_("Move Selection to start of Part of Word to the Left")},
-{SCI_WORDPARTRIGHTEXTEND,N_("Move Selection to start of Part of Word to the Right")},
-{SCI_HOMEEXTEND,N_("Move Selection to start of line")},
-{SCI_LINEENDEXTEND,N_("Move Selection to end of line")},
-{SCI_DOCUMENTSTARTEXTEND,N_("Move Selection to start of document")},
-{SCI_DOCUMENTENDEXTEND,N_("Move Selection to end of document")},
-{SCI_PAGEUPEXTEND,N_("Move Selection up one Page")},
-{SCI_PAGEDOWNEXTEND,N_("Move Selection down one Page")},
-{SCI_HOMEDISPLAYEXTEND,N_("Move Selection to fist visible character")},
-{SCI_LINEENDDISPLAYEXTEND,N_("Move Selection to last visible character")},
-{SCI_VCHOMEEXTEND,N_("Move Selection to 1st non-whitespace character of line, or 1st character of\
+{SCI_LINEDOWNEXTEND,N_("Extend Selection down a line")},
+{SCI_LINEUPEXTEND,N_("Extend Selection up a line")},
+{SCI_CHARLEFTEXTEND,N_("Extend Selection Left a line")},
+{SCI_CHARRIGHTEXTEND,N_("Extend Selection Right a line")},
+{SCI_WORDLEFTEXTEND,N_("Extend Selection to start of Word to the Left")},
+{SCI_WORDRIGHTEXTEND,N_("Extend Selection to start of Word to the Right")},
+{SCI_WORDPARTLEFTEXTEND,N_("Extend Selection to start of Part of Word to the Left")},
+{SCI_WORDPARTRIGHTEXTEND,N_("Extend Selection to start of Part of Word to the Right")},
+{SCI_HOMEEXTEND,N_("Extend Selection to start of line")},
+{SCI_LINEENDEXTEND,N_("Extend Selection to end of line")},
+{SCI_DOCUMENTSTARTEXTEND,N_("Extend Selection to start of document")},
+{SCI_DOCUMENTENDEXTEND,N_("Extend Selection to end of document")},
+{SCI_PAGEUPEXTEND,N_("Extend Selection up one Page")},
+{SCI_PAGEDOWNEXTEND,N_("Extend Selection down one Page")},
+{SCI_HOMEDISPLAYEXTEND,N_("Extend Selection to fist visible character")},
+{SCI_LINEENDDISPLAYEXTEND,N_("Extend Selection to last visible character")},
+{SCI_VCHOMEEXTEND,N_("Extend Selection to 1st non-whitespace character of line, or 1st character of\
  line if already at 1st non-whitespace character")},
-{SCI_PARADOWNEXTEND,N_("Move Selection to begining of next paragraph")},
-{SCI_PARAUPEXTEND,N_("Move Selection up to beginning of current/previous paragraph")},
-{SCI_WORDLEFTENDEXTEND,N_("Move Selection to end of Word to the Left")},
-{SCI_WORDRIGHTENDEXTEND,N_("Move Selection to end of Word to the Right")},
-
-{SCI_LINEDOWNRECTEXTEND,N_("Move Rectangular Selection down a line")},
-{SCI_LINEUPRECTEXTEND,N_("Move Rectangular Selection up a line")},
-{SCI_CHARLEFTRECTEXTEND,N_("Move Rectangular Selection Left a line")},
-{SCI_CHARRIGHTRECTEXTEND,N_("Move Rectangular Selection Right a line")},
-{SCI_HOMERECTEXTEND,N_("Move Rectangular Selection to start of line")},
-{SCI_LINEENDRECTEXTEND,N_("Move Rectangular Selection to end of line")},
-{SCI_PAGEUPRECTEXTEND,N_("Move Rectangular Selection up one Page")},
-{SCI_PAGEDOWNRECTEXTEND,N_("Move Rectangular Selection down one Page")},
-{SCI_VCHOMERECTEXTEND,N_("Move Rectangular Selection to 1st non-whitespace character of line, or 1st\
- character of line if already at 1st non-whitespace character")},
+{SCI_PARADOWNEXTEND,N_("Extend Selection to begining of next paragraph")},
+{SCI_PARAUPEXTEND,N_("Extend Selection up to beginning of current/previous paragraph")},
+{SCI_WORDLEFTENDEXTEND,N_("Extend Selection to end of Word to the Left")},
+{SCI_WORDRIGHTENDEXTEND,N_("Extend Selection to end of Word to the Right")},
+
+{SCI_LINEDOWNRECTEXTEND,N_("Extend Rectangular Selection down a line")},
+{SCI_LINEUPRECTEXTEND,N_("Extend Rectangular Selection up a line")},
+{SCI_CHARLEFTRECTEXTEND,N_("Extend Rectangular Selection Left a line")},
+{SCI_CHARRIGHTRECTEXTEND,N_("Extend Rectangular Selection Right a line")},
+{SCI_HOMERECTEXTEND,N_("Extend Rectangular Selection to start of line")},
+{SCI_LINEENDRECTEXTEND,N_("Extend Rectangular Selection to end of line")},
+{SCI_PAGEUPRECTEXTEND,N_("Extend Rectangular Selection up one Page")},
+{SCI_PAGEDOWNRECTEXTEND,N_("Extend Rectangular Selection down one Page")},
+{SCI_VCHOMERECTEXTEND,N_("Extend Rectangular Selection to 1st non-whitespace character of line, or\
+ 1st character of line if already at 1st non-whitespace character")},
 
 {SCI_CANCEL,N_("Cancel Selection")},
 
@@ -150,7 +147,11 @@
 {SCI_SELECTIONDUPLICATE,N_("Insert duplicate of selected text after selection. If nothing selected,\
  duplicate line")},
 
-/* editor commands that don't seem to work well in editing 
+{SCI_SEARCHNEXT,"Search for next \"\""},
+{SCI_SEARCHPREV,"Search for previous \"\""},
+{SCI_SEARCHANCHOR,"Set start of search to beginning of selection"},
+
+/* editor commands that don't seem to work well in editing
  * {SCI_FORMFEED,N_("FormFeed")},
  *
  * other commands ommited as they don't appear to do anything different to existing commands
@@ -178,7 +179,7 @@ enum GEANY_MACRO_BUTTON {
 PLUGIN_VERSION_CHECK(147)
 
 PLUGIN_SET_INFO(_("Macros"),_("Macros for Geany"),
-                "1.0","William Fraser <william.fraser at virgin.net>");
+                "1.1","William Fraser <william.fraser at virgin.net>");
 
 /* Plugin user alterable settings */
 static gboolean bSaveMacros=TRUE;
@@ -207,20 +208,27 @@ enum GEANY_MACRO_BUTTON {
 	MacroEvent *me;
 	GSList * gslTemp=gsl;
 
+	/* free data held in GSLIST structure */
 	while(gslTemp!=NULL)
 	{
 		me=gslTemp->data;
-		/* check to see if it's a message that has string attached, and free it if so */
-		if(me->message==SCI_REPLACESEL)
+		/* check to see if it's a message that has string attached, and free it if so
+		 * lparam might be NULL for SCI_SEARCHNEXT or SCI_SEARCHPREV but g_free is ok
+		 * with this
+		*/
+		if(me->message==SCI_REPLACESEL ||
+		   me->message==SCI_SEARCHNEXT ||
+		   me->message==SCI_SEARCHPREV)
 			g_free((void*)(me->lparam));
 
 		g_free((void*)(gslTemp->data));
 		gslTemp=g_slist_next(gslTemp);
 	}
 
-		g_slist_free(gsl);
+	/* free SLIST structure */
+	g_slist_free(gsl);
 
-		return NULL;
+	return NULL;
 }
 
 
@@ -316,6 +324,7 @@ static void ClearAllMacros(void)
 		FreeMacro((Macro*)(gsl->data));
 		gsl=g_slist_next(gsl);
 	}
+
 	g_slist_free(mList);
 	mList=NULL;
 }
@@ -327,15 +336,46 @@ static void ReplayMacro(Macro *m)
 	MacroEvent *me;
 	GSList *gsl=m->MacroEvents;
 	ScintillaObject* sci=document_get_current()->editor->sci;
+	gchar *clipboardcontents;
+	gboolean bFoundAnchor=FALSE;
 
 	scintilla_send_message(sci,SCI_BEGINUNDOACTION,0,0);
 
 	while(gsl!=NULL)
 	{
 		me=gsl->data;
-/* may be needed if come across any scintilla messages that use wparam */
-/*        scintilla_send_message(sci,me->message,me->wparam,me->lparam); */
-		scintilla_send_message(sci,me->message,0,me->lparam);
+
+		/* make not if anchor has been found */
+		if(me->message==SCI_SEARCHANCHOR)
+			bFoundAnchor=TRUE;
+
+		/* possibility that user edited macros might not have anchor before search */
+		if((me->message==SCI_SEARCHNEXT || me->message==SCI_SEARCHPREV) &&
+		   bFoundAnchor==FALSE)
+		{
+			scintilla_send_message(sci,SCI_SEARCHANCHOR,0,0);
+			bFoundAnchor=TRUE;
+		}
+
+		/* search might use clipboard to look for: check & hanndle */
+		if((me->message==SCI_SEARCHNEXT || me->message==SCI_SEARCHPREV) &&
+		   ((gchar*)me->lparam)==NULL)
+		{
+			clipboardcontents=gtk_clipboard_wait_for_text(gtk_clipboard_get(
+			                  GDK_SELECTION_CLIPBOARD));
+			/* ensure there is something in the clipboard */
+			if(clipboardcontents==NULL)
+			{
+				dialogs_show_msgbox(GTK_MESSAGE_INFO,_("No text in clipboard!"));
+				break;
+			}
+
+			scintilla_send_message(sci,me->message,me->wparam,(glong)clipboardcontents);
+		}
+		else
+			scintilla_send_message(sci,me->message,me->wparam,me->lparam);
+
+		/* move to next macro event */
 		gsl=g_slist_next(gsl);
 	}
 
@@ -382,9 +422,26 @@ static void ReplayMacro(Macro *m)
 	/* get event number */
 	me->message=strtoll(s[(*k)++],NULL,10);
 
+	/* default to 0 */
+	me->wparam=0;
+
 	/* now handle lparam if required */
 	switch(me->message)
 	{
+		case SCI_SEARCHNEXT:
+		case SCI_SEARCHPREV:
+			/* get text */
+			me->lparam=(glong)(g_strcompress(s[(*k)++]));
+			/* if text is empty string replace with NULL to signify use clipboard */
+			if((*((gchar*)(me->lparam)))==0)
+			{
+				g_free((gchar*)me->lparam);
+				me->lparam=(glong)NULL;
+			}
+
+			/* get search flags */
+			me->wparam=strtoll(s[(*k)++],NULL,10);
+			break;
 		case SCI_REPLACESEL:
 			/* get text */
 			me->lparam=(glong)(g_strcompress(s[(*k)++]));
@@ -415,6 +472,27 @@ static void ReplayMacro(Macro *m)
 	/* now handle lparam if required */
 	switch(me->message)
 	{
+		case SCI_SEARCHNEXT:
+		case SCI_SEARCHPREV:
+			/* check if string is NULL */
+			if(((gchar*)(me->lparam))==NULL)
+			{
+				/* now merge code and data */
+				szNumberAndData=g_strdup_printf("%s,,%lu",szMacroNumber,me->wparam);
+				/* free memory */
+				g_free(szMacroNumber);
+				return szNumberAndData;
+			}
+
+			/* first get string reprisentation of data */
+			pTemp=MakeStringSaveable((gchar*)(me->lparam));
+			/* now merge code and data */
+			szNumberAndData=g_strdup_printf("%s,%s,%lu",szMacroNumber,pTemp,me->wparam);
+			/* free memory */
+			g_free(szMacroNumber);
+			g_free(pTemp);
+			return szNumberAndData;
+
 		case SCI_REPLACESEL:
 			/* first get string reprisentation of data */
 			pTemp=MakeStringSaveable((gchar*)(me->lparam));
@@ -424,6 +502,7 @@ static void ReplayMacro(Macro *m)
 			g_free(szMacroNumber);
 			g_free(pTemp);
 			return szNumberAndData;
+
 		/* default handler for messages without extra data */
 		default:
 			return szMacroNumber;
@@ -431,9 +510,15 @@ static void ReplayMacro(Macro *m)
 }
 
 
+/* Is there a document open in the editor */
+static gboolean DocumentPresent()
+{
+  return (document_get_current()!=NULL);
+}
+
+
 /* check editor notifications and remember editor events */
-static gboolean Notification_Handler(GObject *obj, GeanyEditor *editor, SCNotification *nt,
-                                     gpointer user_data)
+static gboolean Notification_Handler(GObject *obj,GeanyEditor *ed,SCNotification *nt,gpointer ud)
 {
 	MacroEvent *me;
 	gint i;
@@ -466,9 +551,12 @@ static gboolean Notification_Handler(GObject *obj, GeanyEditor *editor, SCNotifi
 	}
 	me=g_new0(MacroEvent,1);
 	me->message=nt->message;
-/*    me->wparam=nt->wParam; */
-	/* Special handling for text inserting, duplicate inserted string */
-	me->lparam=(me->message==SCI_REPLACESEL)?((glong) g_strdup((gchar *)(nt->lParam))) : nt->lParam;
+	me->wparam=nt->wParam;
+	/* Special handling for text in lparam */
+	me->lparam=(me->message==SCI_SEARCHNEXT ||
+	            me->message==SCI_SEARCHPREV ||
+	            me->message==SCI_REPLACESEL)
+		?((glong) g_strdup((gchar *)(nt->lParam))) : nt->lParam;
 
 	/* more efficient to create reverse list and reverse it at the end */
 	RecordingMacro->MacroEvents=g_slist_prepend(RecordingMacro->MacroEvents,me);
@@ -641,7 +729,7 @@ static void LoadSettings(void)
 
 	/* extract settings */
 	bQueryOverwriteMacros=utils_get_setting_boolean(config,"Settings",
-													"Question_Macro_Overwrite",FALSE);
+	                                                "Question_Macro_Overwrite",FALSE);
 	bSaveMacros=utils_get_setting_boolean(config,"Settings","Save_Macros",FALSE);
 
 	/* extract macros */
@@ -676,8 +764,10 @@ static void LoadSettings(void)
 		g_free(pcTemp);
 		/* now go through macro data generating macros */
 		for(k=0,m->MacroEvents=NULL;pcMacroCommands[k]!=NULL;)
-			m->MacroEvents=g_slist_prepend(m->MacroEvents,GetMacroEventFromString(pcMacroCommands,
-																				&k));
+			m->MacroEvents=g_slist_prepend(m->MacroEvents,
+			                               GetMacroEventFromString(pcMacroCommands,
+		                                       &k));
+
 		/* list created in reverse as more efficient, now turn it around */
 		m->MacroEvents=g_slist_reverse(m->MacroEvents);
 		/* macro now complete, add it to the list */
@@ -692,13 +782,6 @@ static void LoadSettings(void)
 }
 
 
-PluginCallback plugin_callbacks[] =
-{
-	{ "editor-notify", (GCallback) &Notification_Handler, FALSE, NULL },
-	{ NULL, NULL, FALSE, NULL }
-};
-
-
 /* handle button presses in the preferences dialog box */
 static void on_configure_response(GtkDialog *dialog, gint response, gpointer user_data)
 {
@@ -767,7 +850,7 @@ void plugin_help(void)
 		GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
 		NULL);
 
-/* setup help text */
+	/* setup help text */
 	cText=g_strconcat(
 _("This Plugin implements Macros in Geany.\n\n"),
 _("This plugin allows you to record and use your own macros. "),
@@ -830,7 +913,6 @@ void plugin_help(void)
 
 	/* free memory */
 	g_free(cText);
-
 }
 
 
@@ -1093,34 +1175,65 @@ static gboolean InitializeMacroRecord(void)
 }
 
 
+/* function to start the macro recording process */
+static void StartRecordingMacro()
+{
+	/* start recording process, but quit if error, or user cancels */
+	if(!InitializeMacroRecord())
+		return;
+
+	/* start actual recording */
+	scintilla_send_message(document_get_current()->editor->sci,SCI_STARTRECORD,0,0);
+	gtk_widget_hide(Record_Macro_menu_item);
+	gtk_widget_show(Stop_Record_Macro_menu_item);
+}
+
+
+/* function to finish recording a macro */
+static void StopRecordingMacro()
+{
+	scintilla_send_message(document_get_current()->editor->sci,SCI_STOPRECORD,0,0);
+	/* Recorded in reverse as more efficient */
+	RecordingMacro->MacroEvents=g_slist_reverse(RecordingMacro->MacroEvents);
+	/* add macro to list */
+	AddMacroToList(RecordingMacro);
+	/* set ready to record new macro (don't free as macro has been saved in macrolist) */
+	RecordingMacro=NULL;
+	gtk_widget_show(Record_Macro_menu_item);
+	gtk_widget_hide(Stop_Record_Macro_menu_item);
+
+	/* Macros have been changed */
+	bMacrosHaveChanged=TRUE;
+}
+
+
+/* check to see if we are recording a macro and stop it if we are */
+static void on_document_close(GObject *obj, GeanyDocument *doc, gpointer user_data)
+{
+	if(RecordingMacro!=NULL)
+		StopRecordingMacro();
+}
+
+
+PluginCallback plugin_callbacks[] =
+{
+	{ "editor-notify", (GCallback) &Notification_Handler, FALSE, NULL },
+	{ "document-close", (GCallback) &on_document_close, FALSE, NULL },
+	{ NULL, NULL, FALSE, NULL }
+};
+
+
 /* handle starting and stopping macro recording */
 static void DoMacroRecording(GtkMenuItem *menuitem, gpointer gdata)
 {
-	if(RecordingMacro==NULL)
-	{
-		/* start recording process, but quit if error, or user cancels */
-		if(!InitializeMacroRecord())
-			return;
+	/* can't record if in an empty editor */
+	if(!DocumentPresent())
+		return;
 
-		/* start actual recording */
-		scintilla_send_message(document_get_current()->editor->sci,SCI_STARTRECORD,0,0);
-		gtk_widget_hide(Record_Macro_menu_item);
-		gtk_widget_show(Stop_Record_Macro_menu_item);
-	}
-	else {
-		scintilla_send_message(document_get_current()->editor->sci,SCI_STOPRECORD,0,0);
-		/* Recorded in reverse as more efficient */
-		RecordingMacro->MacroEvents=g_slist_reverse(RecordingMacro->MacroEvents);
-		/* add macro to list */
-		AddMacroToList(RecordingMacro);
-		/* set ready to record new macro (don't free as macro has been saved in macrolist) */
-		RecordingMacro=NULL;
-		gtk_widget_show(Record_Macro_menu_item);
-		gtk_widget_hide(Stop_Record_Macro_menu_item);
-
-		/* Macros have been changed */
-		bMacrosHaveChanged=TRUE;
-	}
+	if(RecordingMacro==NULL)
+		StartRecordingMacro();
+	else
+		StopRecordingMacro();
 }
 
 
@@ -1214,6 +1327,200 @@ static void Accel_Render_Edited_CallBack(GtkCellRendererAccel *cell,gchar *iter_
 }
 
 
+/* Get Search Description string with search text and flags at end*/
+static gchar * GetSearchDescription(gint message,gchar *text,gint flags)
+{
+	return g_strdup_printf(_("Search %s, looking for %s%s%s.%s%s%s%s%s"),
+		message==SCI_SEARCHNEXT?"forewards":"backwards",
+		text==NULL?"":"\"",
+		text==NULL?"clipboard contents":text,
+		text==NULL?"":"\"",
+		(flags&SCFIND_MATCHCASE)==SCFIND_MATCHCASE?" Match case.":"",
+		(flags&SCFIND_WHOLEWORD)==SCFIND_WHOLEWORD?" Match whole word.":"",
+		(flags&SCFIND_WORDSTART)==SCFIND_WORDSTART?" Match start of word.":"",
+		(flags&SCFIND_REGEXP)==SCFIND_REGEXP?" Search by Regular Expression.":"",
+		(flags&SCFIND_POSIX)==SCFIND_POSIX?" Regular Expression is POSIX.":"");
+}
+
+
+/* handle button presses in the preferences dialog box */
+static void on_search_toggle(GtkToggleButton *cb,gpointer user_data)
+{
+	GtkEntry *gtke;
+	GtkLabel *gtkl;
+	gboolean bUseClipboard;
+
+	/* retreive pointers to entry & label */
+	gtke=(GtkEntry*)(g_object_get_data(G_OBJECT(cb),"GeanyMacros_e"));
+	gtkl=(GtkLabel*)(g_object_get_data(G_OBJECT(cb),"GeanyMacros_l"));
+
+	/* find out what we're searching for */
+	bUseClipboard=gtk_toggle_button_get_active(cb);
+
+	/* set entry & label depending on if we're looking for text or not */
+	gtk_widget_set_sensitive((GtkWidget*)gtke,!bUseClipboard);
+	gtk_widget_set_sensitive((GtkWidget*)gtkl,!bUseClipboard);
+}
+
+
+/* Handle editing of options for search */
+static void EditSearchOptions(GtkTreeModel *model,GtkTreeIter *iter)
+{
+	GtkWidget *dialog,*gtke,*hbox,*gtkl;
+	gchar *cTemp,*cData,*cText,*cTemp2;
+	gint iReply=GTK_RESPONSE_OK,i;
+	GtkWidget *vbox,*gtkcb;
+	GtkWidget *cbA,*cbB,*cbC,*cbD,*cbE,*cbF;
+	MacroDetailEntry *mde;
+	gulong flags;
+
+	/* get MacroDetail and data for this line */
+	gtk_tree_model_get(model,iter,2,&mde,3,&cData,-1);
+
+	/* make cText point to search text */
+	cText=strchr(cData,',');
+	cText++;
+
+	/* get search flags */
+	flags=strtoll(cData,NULL,10);
+
+	/* create dialog box */
+	dialog=gtk_dialog_new_with_buttons(_("Search Options:"),
+	                                   GTK_WINDOW(geany->main_widgets->window),
+	                                   GTK_DIALOG_DESTROY_WITH_PARENT,NULL);
+
+	/* create buttons */
+	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Ok"),GTK_RESPONSE_OK);
+	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Cancel"),GTK_RESPONSE_CANCEL);
+
+	/* create box to hold widgets */
+	vbox=gtk_vbox_new(FALSE, 6);
+	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),vbox);
+	gtk_widget_show(vbox);
+
+	/* create combobox to hold search direction */
+	gtkcb=gtk_combo_box_new_text();
+	gtk_combo_box_append_text((GtkComboBox*)gtkcb,_("Search Forwards"));
+	gtk_combo_box_append_text((GtkComboBox*)gtkcb,_("Search Backwards"));
+	gtk_combo_box_set_active((GtkComboBox*)gtkcb,(mde->message==SCI_SEARCHNEXT)?0:1);
+	gtk_box_pack_start(GTK_BOX(vbox),gtkcb,FALSE,FALSE,2);
+	gtk_widget_show(gtkcb);
+
+	/* create checkbox to check for search options */
+	cbA=gtk_check_button_new_with_label(_("Seach for contents of clipboard"));
+	/* if search text is empty then to seach for clipboard contents */
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbA),(*cText)==0);
+	gtk_box_pack_start(GTK_BOX(vbox),cbA,FALSE,FALSE,2);
+	/* ensure we monitor for change in this button */
+	g_signal_connect(cbA,"toggled",G_CALLBACK(on_search_toggle),dialog);
+	gtk_widget_show(cbA);
+
+
+	/* create box to hold search text entry box, and label */
+	hbox=gtk_hbox_new(FALSE,0);
+	gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,2);
+	gtk_widget_show(hbox);
+
+	gtkl=gtk_label_new(_("Seach for:"));
+	gtk_box_pack_start(GTK_BOX(hbox),gtkl,FALSE,FALSE,2);
+	gtk_widget_show(gtkl);
+	/* save pointer to label */
+	g_object_set_data(G_OBJECT(cbA),"GeanyMacros_l",gtkl);
+	gtk_widget_set_sensitive((GtkWidget*)gtkl,(*cText)!=0);
+
+	gtke=gtk_entry_new();
+	if((*cText)!=0)
+		gtk_entry_set_text(GTK_ENTRY(gtke),cText);
+
+	gtk_box_pack_start(GTK_BOX(hbox),gtke,FALSE,FALSE,2);
+	gtk_widget_show(gtke);
+	/* save pointer to entry */
+	g_object_set_data(G_OBJECT(cbA),"GeanyMacros_e",gtke);
+	gtk_widget_set_sensitive((GtkWidget*)gtke,(*cText)!=0);
+
+	/* create checkbox to check for search options */
+	cbB=gtk_check_button_new_with_label(_("Seach is case sensitive"));
+	/* if search text is empty then to seach for clipboard contents */
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbB),(flags&SCFIND_MATCHCASE)==SCFIND_MATCHCASE);
+	gtk_box_pack_start(GTK_BOX(vbox),cbB,FALSE,FALSE,2);
+
+	cbC=gtk_check_button_new_with_label(_("Seach for whole word"));
+	/* if search text is empty then to seach for clipboard contents */
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbC),(flags&SCFIND_WHOLEWORD)==SCFIND_WHOLEWORD);
+	gtk_box_pack_start(GTK_BOX(vbox),cbC,FALSE,FALSE,2);
+
+	cbD=gtk_check_button_new_with_label(_("Seach for start of word"));
+	/* if search text is empty then to seach for clipboard contents */
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbD),(flags&SCFIND_WORDSTART)==SCFIND_WORDSTART);
+	gtk_box_pack_start(GTK_BOX(vbox),cbD,FALSE,FALSE,2);
+
+	cbE=gtk_check_button_new_with_label(_("Seach text is regular expression"));
+	/* if search text is empty then to seach for clipboard contents */
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbE),(flags&SCFIND_REGEXP)==SCFIND_REGEXP);
+	gtk_box_pack_start(GTK_BOX(vbox),cbE,FALSE,FALSE,2);
+
+	cbF=gtk_check_button_new_with_label(_("Seach text is POSIX compatible"));
+	/* if search text is empty then to seach for clipboard contents */
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cbF),(flags&SCFIND_POSIX)==SCFIND_POSIX);
+	gtk_box_pack_start(GTK_BOX(vbox),cbF,FALSE,FALSE,2);
+
+	gtk_widget_show_all(vbox);
+
+	while(iReply==GTK_RESPONSE_OK)
+	{
+		iReply=gtk_dialog_run(GTK_DIALOG(dialog));
+
+		if(iReply==GTK_RESPONSE_OK)
+		{
+			/* handle change in options */
+
+			/* check search direction 0=foreward, 1=backwards */
+			iReply=gtk_combo_box_get_active((GtkComboBox*)gtkcb);
+
+			/* calculate macro detail of relavent detail */
+			i=0;
+			while(MacroDetails[i].message!=SCI_SEARCHNEXT) i++;
+			mde=(MacroDetailEntry *)(&MacroDetails[i+iReply]);
+
+			/* calculate flags */
+			flags=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cbB))?SCFIND_MATCHCASE:0;
+			flags|=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cbC))?SCFIND_WHOLEWORD:0;
+			flags|=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cbD))?SCFIND_WORDSTART:0;
+			flags|=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cbE))?SCFIND_REGEXP:0;
+			flags|=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cbF))?SCFIND_POSIX:0;
+
+			/* get search string or NULL if using clipboard */
+			cText=(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cbA)))?
+			           NULL:(gchar*)gtk_entry_get_text((GtkEntry*)(gtke));
+
+			/* get new data */
+			cData=g_strdup_printf("%lu,%s",flags,(cText==NULL)?"":cText);
+
+			/* get new text */
+			cText=GetSearchDescription(mde->message,cText,flags);
+
+			/* get old data for this line */
+			gtk_tree_model_get(model,iter,0,&cTemp,3,&cTemp2,-1);
+
+			/* set text and macro detail */
+			gtk_list_store_set(GTK_LIST_STORE(model),iter,0,cText,2,mde,3,cData,-1);
+
+			/* free up old text */
+			g_free(cTemp);
+			g_free(cTemp2);
+
+			/* break out of loop */
+			break;
+		}
+
+	}
+
+	/* tidy up */
+	gtk_widget_destroy(dialog);
+}
+
+
+/* Handle editing of text for SCI_REPLACESEL */
 static void EditSCIREPLACESELText(GtkTreeModel *model,GtkTreeIter *iter)
 {
 	GtkWidget *dialog,*gtke,*hbox,*gtkl;
@@ -1286,6 +1593,7 @@ static void combo_edited(GtkCellRendererText *cell,gchar *iter_id,gchar *new_tex
 	MacroDetailEntry *mde;
 	gint i;
 	gchar *cTemp,*cTemp2;
+	gboolean bNeedButtonUpdate=FALSE;
 
 	/* find MacroDetails that has the setting of new setting */
 	i=0;
@@ -1301,16 +1609,35 @@ static void combo_edited(GtkCellRendererText *cell,gchar *iter_id,gchar *new_tex
 
 	/* handle freeing of string if needed */
 	g_free(cTemp);
-	if(mde->message==SCI_REPLACESEL)
+	if(mde->message==SCI_REPLACESEL ||
+	   mde->message==SCI_SEARCHNEXT ||
+	   mde->message==SCI_SEARCHPREV)
+	{
 		g_free(cTemp2);
+		bNeedButtonUpdate=TRUE;
+	}
+
+	/* see what text will have to change into */
+	cTemp=(gchar*)(MacroDetails[i].description);
+	cTemp2=NULL;
+	if(MacroDetails[i].message==SCI_REPLACESEL)
+	{
+		cTemp=g_strdup_printf(_("Insert/replace with \"\""));
+		bNeedButtonUpdate=TRUE;
+	}
+	else if(MacroDetails[i].message==SCI_SEARCHNEXT ||
+	   MacroDetails[i].message==SCI_SEARCHPREV)
+	{
+		cTemp=GetSearchDescription(MacroDetails[i].message,NULL,0);
+		cTemp2=g_strdup("0,");
+		bNeedButtonUpdate=TRUE;
+	}
 
 	/* Update the model */
-	gtk_list_store_set(GTK_LIST_STORE(model),&iter,0,(MacroDetails[i].message==SCI_REPLACESEL?
-	                   g_strdup_printf(_("Insert/replace with \"\"")):MacroDetails[i].description),2,
-	                   &(MacroDetails[i]),3,NULL,-1);
+	gtk_list_store_set(GTK_LIST_STORE(model),&iter,0,cTemp,2,&(MacroDetails[i]),3,cTemp2,-1);
 
 	/* check if changing to or from SCI_REPLACESEL and enable/disable edit button as needed */
-	if(mde->message==SCI_REPLACESEL || MacroDetails[i].message==SCI_REPLACESEL)
+	if(bNeedButtonUpdate)
 		g_signal_emit_by_name(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)),"changed",
 		                      G_TYPE_NONE);
 }
@@ -1335,21 +1662,23 @@ static void DoEditMacroElementsSelectionChanged(GtkTreeSelection *selection,gpoi
 		gtk_tree_model_get(GTK_TREE_MODEL(model),&iter,2,&mde,-1);
 
 		/* find delete button & enable it*/
-		button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_DELETE);
+		button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bD"));
 		gtk_widget_set_sensitive(button,TRUE);
 
 		/* find edit text button & enable it if looking at a SCI_REPLACESEL item*/
-		button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_EDIT);
-		gtk_widget_set_sensitive(button,mde->message==SCI_REPLACESEL);
+		button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bC"));
+		gtk_widget_set_sensitive(button,mde->message==SCI_REPLACESEL ||
+		                                mde->message==SCI_SEARCHNEXT ||
+		                                mde->message==SCI_SEARCHPREV);
 
 		/* get copy of iteraton */
 		iter2=iter;
 		/* if can move to next node then it's not the last. use to set Move down */
-		button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_DOWN);
+		button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bB"));
 		gtk_widget_set_sensitive(button,gtk_tree_model_iter_next(GTK_TREE_MODEL(model),&iter2));
 
 		/* find Move up button & enable/disable it */
-		button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_UP);
+		button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bA"));
 		/* get the path of the current selected line */
 		tpTemp=gtk_tree_model_get_path(GTK_TREE_MODEL(model),&iter);
 		/* if has previous then can be moved up a line */
@@ -1361,19 +1690,19 @@ static void DoEditMacroElementsSelectionChanged(GtkTreeSelection *selection,gpoi
 	else
 	{
 		/* find delete button & diable it*/
-		button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_DELETE);
+		button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bD"));
 		gtk_widget_set_sensitive(button,FALSE);
 
 		/* find edit text button & diable it*/
-		button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_EDIT);
+		button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bC"));
 		gtk_widget_set_sensitive(button,FALSE);
 
 		/* find Move up button & diable it*/
-		button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_UP);
+		button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bA"));
 		gtk_widget_set_sensitive(button,FALSE);
 
 		/* find Move Down button & diable it*/
-		button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_DOWN);
+		button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bB"));
 		gtk_widget_set_sensitive(button,FALSE);
 	}
 
@@ -1383,7 +1712,7 @@ static void DoEditMacroElementsSelectionChanged(GtkTreeSelection *selection,gpoi
 /* edit individual existing macro */
 static void EditMacroElements(Macro *m)
 {
-	GtkWidget *table,*dialog;
+	GtkWidget *table,*dialog,*button;
 	GtkTreeViewColumn *column;
 	GtkCellRenderer *renderer;
 	GtkTreeSelection *selection;
@@ -1411,26 +1740,43 @@ static void EditMacroElements(Macro *m)
 	{
  		me=(MacroEvent*)(gsl->data);
 		i=0;
-		while(MacroDetails[i].description!=NULL) {
+		while(MacroDetails[i].description!=NULL)
+		{
 			if(MacroDetails[i].message==me->message) break;
 			i++;
 		}
 
 		gtk_list_store_append(ls,&iter);  /*  Acquire an iterator */
 		/* set text, pointer to macro detail, and any ascociated string */
-		gtk_list_store_set(ls,&iter,0,(me->message==SCI_REPLACESEL?
-		                   g_strdup_printf(_("Insert/replace with \"%s\""),(gchar*)(me->lparam)):
-		                   MacroDetails[i].description),2,&(MacroDetails[i]),3,
-		                   (me->message==SCI_REPLACESEL?g_strdup((gchar*)(me->lparam)):NULL),-1);
+		cTemp=(gchar*)(MacroDetails[i].description);
+		cTemp2=NULL;
+		if(me->message==SCI_REPLACESEL)
+		{
+			cTemp=g_strdup_printf(_("Insert/replace with \"%s\""),
+			                      (gchar*)(me->lparam));
+			cTemp2=g_strdup((gchar*)(me->lparam));
+		}
+		else if(MacroDetails[i].message==SCI_SEARCHNEXT ||
+		        MacroDetails[i].message==SCI_SEARCHPREV)
+		{
+			cTemp=GetSearchDescription(MacroDetails[i].message,(gchar*)(me->lparam),
+			                           me->wparam);
+			cTemp2=g_strdup_printf("%lu,%s",me->wparam,((gchar*)(me->lparam)==NULL)?
+			                       "":((gchar*)(me->lparam)));
+		}
+
+		gtk_list_store_set(ls,&iter,0,cTemp,2,&(MacroDetails[i]),3,cTemp2,-1);
 		gsl=g_slist_next(gsl);
 	}
 
 	/* create list store for combo renderer */
 	lsCombo=gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_POINTER);
 	i=0;
-	while(MacroDetails[i].description!=NULL) {
+	while(MacroDetails[i].description!=NULL)
+	{
 		gtk_list_store_append(lsCombo,&iter);
-		gtk_list_store_set(lsCombo,&iter,0,MacroDetails[i].description,1,&(MacroDetails[i]),-1);
+		gtk_list_store_set(lsCombo,&iter,0,MacroDetails[i].description,1,
+		                   &(MacroDetails[i]),-1);
 		i++;
 	}
 
@@ -1445,8 +1791,8 @@ static void EditMacroElements(Macro *m)
 	gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(table),GTK_TREE_VIEW_GRID_LINES_BOTH);
 
 	/* add column */
-	column=gtk_tree_view_column_new_with_attributes(_("Event"),renderer,"text",0,"text-column",1,
-	                                                NULL);
+	column=gtk_tree_view_column_new_with_attributes(_("Event"),renderer,"text",0,"text-column"
+	                                                ,1,NULL);
 	g_signal_connect(renderer,"edited",G_CALLBACK(combo_edited),table);
 	gtk_tree_view_append_column(GTK_TREE_VIEW(table),column);
 
@@ -1456,23 +1802,27 @@ static void EditMacroElements(Macro *m)
 
 	/* add table to dialog */
 	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),table);
-	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),table,FALSE,FALSE,2);
+//	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),table,FALSE,FALSE,2);
 	gtk_widget_show(table);
 
 	/* add buttons */
-	gtk_dialog_add_button(GTK_DIALOG(dialog),_("Move _Up"),GEANY_MACRO_BUTTON_UP);
-	gtk_dialog_add_button(GTK_DIALOG(dialog),_("Move Do_wn"),GEANY_MACRO_BUTTON_DOWN);
+	button=gtk_dialog_add_button(GTK_DIALOG(dialog),_("Move _Up"),GEANY_MACRO_BUTTON_UP);
+	g_object_set_data(G_OBJECT(dialog),"GeanyMacros_bA",button);
+	button=gtk_dialog_add_button(GTK_DIALOG(dialog),_("Move Do_wn"),GEANY_MACRO_BUTTON_DOWN);
+	g_object_set_data(G_OBJECT(dialog),"GeanyMacros_bB",button);
 	gtk_dialog_add_button(GTK_DIALOG(dialog),_("New _Above"),GEANY_MACRO_BUTTON_ABOVE);
 	gtk_dialog_add_button(GTK_DIALOG(dialog),_("New _Below"),GEANY_MACRO_BUTTON_BELOW);
-	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Edit Text"),GEANY_MACRO_BUTTON_EDIT);
-	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Delete"),GEANY_MACRO_BUTTON_DELETE);
+	button=gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Edit"),GEANY_MACRO_BUTTON_EDIT);
+	g_object_set_data(G_OBJECT(dialog),"GeanyMacros_bC",button);
+	button=gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Delete"),GEANY_MACRO_BUTTON_DELETE);
+	g_object_set_data(G_OBJECT(dialog),"GeanyMacros_bD",button);
 	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Ok"),GEANY_MACRO_BUTTON_APPLY);
 	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Cancel"),GEANY_MACRO_BUTTON_CANCEL);
 
 	/* listen for changes in selection */
 	selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(table));
-	g_signal_connect(G_OBJECT(selection),"changed",G_CALLBACK(DoEditMacroElementsSelectionChanged),
-	                 dialog);
+	g_signal_connect(G_OBJECT(selection),"changed",
+	                 G_CALLBACK(DoEditMacroElementsSelectionChanged),dialog);
 
 	/* call callback: this will set buttons acordingly */
 	DoEditMacroElementsSelectionChanged(selection,dialog);
@@ -1494,9 +1844,14 @@ static void EditMacroElements(Macro *m)
 			if(i==GEANY_MACRO_BUTTON_DELETE)
 			{
 				/* see if need to free non-static string */
-				gtk_tree_model_get(GTK_TREE_MODEL(ls),&iter,0,&cTemp,2,&mde,-1);
-				if(mde->message==SCI_REPLACESEL)
+				gtk_tree_model_get(GTK_TREE_MODEL(ls),&iter,0,&cTemp,2,&mde,3,&cTemp2,-1);
+				if(mde->message==SCI_REPLACESEL ||
+				   mde->message==SCI_SEARCHNEXT ||
+				   mde->message==SCI_SEARCHPREV)
+				{
 					g_free(cTemp);
+					g_free(cTemp2);
+				}
 
 				/* remove element */
 				gtk_list_store_remove(ls,&iter);
@@ -1569,6 +1924,9 @@ static void EditMacroElements(Macro *m)
 				gtk_tree_model_get(GTK_TREE_MODEL(ls),&iter,2,&mde,-1);
 				if(mde->message==SCI_REPLACESEL)
 					EditSCIREPLACESELText(GTK_TREE_MODEL(ls),&iter);
+				else if(mde->message==SCI_SEARCHNEXT || mde->message==SCI_SEARCHPREV)
+					EditSearchOptions(GTK_TREE_MODEL(ls),&iter);
+
 			}
 
 		} //end of commands that require line to be selected
@@ -1602,10 +1960,21 @@ static void EditMacroElements(Macro *m)
 
 				me->message=mde->message;
 				me->lparam=0;
+				me->wparam=0;
 
 				/* Special handling for text inserting, duplicate inserted string */
 				if(me->message==SCI_REPLACESEL)
-					me->lparam=(glong)((cTemp!=NULL)?g_strdup(cTemp):g_strdup_printf(""));
+					me->lparam=(glong)((cTemp!=NULL)?g_strdup(cTemp):g_strdup(""));
+
+				/* Special handling for search */
+				if(me->message==SCI_SEARCHNEXT || me->message==SCI_SEARCHPREV)
+				{
+					cTemp2=strchr(cTemp,',');
+					cTemp2++;
+
+					me->lparam=(glong)(((*cTemp2)==0)?NULL:g_strdup(cTemp2));
+					me->wparam=strtoll(cTemp,NULL,10);
+				}
 
 				/* more efficient to create reverse list and reverse it at the end */
 				m->MacroEvents=g_slist_prepend(m->MacroEvents,me);
@@ -1631,7 +2000,8 @@ static void EditMacroElements(Macro *m)
 
 		/* free any non-static text */
 		g_free((void*)(cTemp));
-		if(mde->message==SCI_REPLACESEL)
+		if(mde->message==SCI_REPLACESEL || mde->message==SCI_SEARCHNEXT ||
+		   mde->message==SCI_SEARCHPREV)
 			g_free(cTemp2);
 
 		/* get next event */
@@ -1661,11 +2031,11 @@ static void DoEditMacroSelectionChanged(GtkTreeSelection *selection,gpointer dat
 	bHasItemSelected=gtk_tree_selection_get_selected(selection,&model,&iter);
 
 	/* now set button sensitive or not depending if there is something for them to act on */
-	button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_RERECORD);
+	button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bA"));
 	gtk_widget_set_sensitive(button,bHasItemSelected);
-	button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_EDIT);
+	button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bB"));
 	gtk_widget_set_sensitive(button,bHasItemSelected);
-	button=gtk_dialog_get_widget_for_response(dialog,GEANY_MACRO_BUTTON_DELETE);
+	button=(GtkWidget*)(g_object_get_data(G_OBJECT(dialog),"GeanyMacros_bC"));
 	gtk_widget_set_sensitive(button,bHasItemSelected);
 }
 
@@ -1673,7 +2043,7 @@ static void DoEditMacroSelectionChanged(GtkTreeSelection *selection,gpointer dat
 /* do editing of existing macros */
 static void DoEditMacro(GtkMenuItem *menuitem, gpointer gdata)
 {
-	GtkWidget *table,*dialog;
+	GtkWidget *table,*dialog,*button;
 	GtkTreeViewColumn *column;
 	GtkCellRenderer *renderer;
 	GtkTreeSelection *selection;
@@ -1733,14 +2103,16 @@ static void DoEditMacro(GtkMenuItem *menuitem, gpointer gdata)
 	                            GTK_SELECTION_SINGLE);
 
 	/* add table to dialog */
-	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),table);
 	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),table,FALSE,FALSE,2);
 	gtk_widget_show(table);
 
 	/* add buttons */
-	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Re-Record"),GEANY_MACRO_BUTTON_RERECORD);
-	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Edit"),GEANY_MACRO_BUTTON_EDIT);
-	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Delete"),GEANY_MACRO_BUTTON_DELETE);
+	button=gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Re-Record"),GEANY_MACRO_BUTTON_RERECORD);
+	g_object_set_data(G_OBJECT(dialog),"GeanyMacros_bA",button);
+	button=gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Edit"),GEANY_MACRO_BUTTON_EDIT);
+	g_object_set_data(G_OBJECT(dialog),"GeanyMacros_bB",button);
+	button=gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Delete"),GEANY_MACRO_BUTTON_DELETE);
+	g_object_set_data(G_OBJECT(dialog),"GeanyMacros_bC",button);
 	gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Ok"),GEANY_MACRO_BUTTON_CANCEL);
 
 	/* listen for changes in selection */
@@ -1783,7 +2155,7 @@ static void DoEditMacro(GtkMenuItem *menuitem, gpointer gdata)
 			}
 
 			/* handle re-record macro */
-			if(i==GEANY_MACRO_BUTTON_RERECORD && bEditable)
+			if(i==GEANY_MACRO_BUTTON_RERECORD && bEditable && DocumentPresent())
 			{
 				m=FindMacroByName(cTemp);
 				/* ensure have empty recording macro */
@@ -1812,7 +2184,7 @@ static void DoEditMacro(GtkMenuItem *menuitem, gpointer gdata)
 				/* Signal that macros have changed (and need to be saved) */
 				bMacrosHaveChanged=TRUE;
 			}
-		
+
 			/* free memory */
 			g_free(cTemp);
 		}
@@ -1835,7 +2207,7 @@ void plugin_init(GeanyData *data)
 	/* Calculate what shift '0' to '9 will be (£ is above 3 on uk keyboard, but it's # or ~ on us
 	 * keyboard.)
 	 * there must be an easier way than this of working this out, but I've not figured it out.
-   * This is needed to play nicely with the Geany Numbered Bookmarks plugin
+	 * This is needed to play nicely with the Geany Numbered Bookmarks plugin
 	*/
 
 	/* go through '0' to '9', work out hardware keycode, then find out what shift+this keycode


Modified: geanynumberedbookmarks/src/geanynumberedbookmarks.c
81 files changed, 41 insertions(+), 40 deletions(-)
===================================================================
@@ -81,7 +81,7 @@
 	"[FileData]";
 
 /* Definitions for bookmark images */
-static gchar * aszMarkerImage0[] =
+static const gchar * aszMarkerImage0[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -102,7 +102,7 @@
 	"..B**********B...",
 	"...BBBBBBBBBB...."
 };
-static gchar * aszMarkerImage1[] =
+static const gchar * aszMarkerImage1[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -123,7 +123,7 @@
 	"..B**********B...",
 	"...BBBBBBBBBB...."
 };
-static gchar * aszMarkerImage2[] =
+static const gchar * aszMarkerImage2[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -144,7 +144,7 @@
 	"..B**********B...",
 	"...BBBBBBBBBB...."
 };
-static gchar * aszMarkerImage3[] =
+static const gchar * aszMarkerImage3[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -165,7 +165,7 @@
 	"..B**********B...",
 	"...BBBBBBBBBB...."
 };
-static gchar * aszMarkerImage4[] =
+static const gchar * aszMarkerImage4[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -186,7 +186,7 @@
 	"..B**********B...",
 	"...BBBBBBBBBB...."
 };
-static gchar * aszMarkerImage5[] =
+static const gchar * aszMarkerImage5[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -207,7 +207,7 @@
 	"..B**********B...",
 	"...BBBBBBBBBB...."
 };
-static gchar * aszMarkerImage6[] =
+static const gchar * aszMarkerImage6[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -228,7 +228,7 @@
 	"..B**********B...",
 	"...BBBBBBBBBB...."
 };
-static gchar * aszMarkerImage7[] =
+static const gchar * aszMarkerImage7[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -249,7 +249,7 @@
 	"..B**********B...",
 	"...BBBBBBBBBB...."
 };
-static gchar * aszMarkerImage8[] =
+static const gchar * aszMarkerImage8[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -270,7 +270,7 @@
 	"..B**********B...",
 	"...BBBBBBBBBB...."
 };
-static gchar * aszMarkerImage9[] =
+static const gchar * aszMarkerImage9[] =
 {
 	"17 14 3 1", /* width height colours characters-per-pixel */
 	". c None",
@@ -292,7 +292,7 @@
 	"...BBBBBBBBBB...."
 };
 
-static gchar ** aszMarkerImages[]=
+static const gchar ** aszMarkerImages[]=
 {
 	aszMarkerImage0,aszMarkerImage1,aszMarkerImage2,aszMarkerImage3,aszMarkerImage4,
 	aszMarkerImage5,aszMarkerImage6,aszMarkerImage7,aszMarkerImage8,aszMarkerImage9
@@ -463,7 +463,7 @@ static void LoadSettings(void)
 
 	/* extract settings */
 	bCenterWhenGotoBookmark=utils_get_setting_boolean(config,"Settings",
-													"Center_When_Goto_Bookmark",FALSE);
+	                        "Center_When_Goto_Bookmark",FALSE);
 	bRememberFolds=utils_get_setting_boolean(config,"Settings","Remember_Folds",FALSE);
 
 	/* extract data about files */
@@ -521,7 +521,7 @@ static void DefineMarkers(ScintillaObject* sci)
 	gint i;
 	for(i=0;i<10;i++)
 		scintilla_send_message(sci,SCI_MARKERDEFINEPIXMAP,i+BOOKMARK_BASE,
-							(glong)(aszMarkerImages[i]));
+		                       (glong)(aszMarkerImages[i]));
 }
 
 
@@ -586,7 +586,8 @@ static void on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_dat
 	struct stat sBuf;
 	GtkWidget *dialog;
 	gchar *cFoldData=NULL;
-	gint iBits,iFlags,iBitCounter;
+	/* keep compiler happy & initialise iBits: will logically be initiated anyway */
+	gint iBits=0,iFlags,iBitCounter;
 
 	/* ensure have markers set */
 	CheckEditorSetup();
@@ -595,16 +596,16 @@ static void on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_dat
 	/* check to see if file has changed since geany last saved it */
 	fd=GetFileData(doc->file_name);
 	if(stat(doc->file_name,&sBuf)==0 && fd!=NULL && fd->LastChangedTime!=-1 &&
-    fd->LastChangedTime!=sBuf.st_mtime)
+	   fd->LastChangedTime!=sBuf.st_mtime)
 	{
 		/* notify user that file has been changed */
 		dialog=gtk_message_dialog_new(GTK_WINDOW(geany->main_widgets->window),
-									GTK_DIALOG_DESTROY_WITH_PARENT,
-									GTK_MESSAGE_ERROR,
-									GTK_BUTTONS_NONE,
-									_("'%s' has been edited since it was last saved by geany. Marker positions may \
-be unreliable and will not be loaded.\nPress Ignore to try an load markers anyway."),
-									doc->file_name);
+		                              GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_ERROR,
+		                              GTK_BUTTONS_NONE,
+		                              _("'%s' has been edited since it was last saved by g\
+		                                eany. Marker positions may be unreliable and will \
+		                                not be loaded.\nPress Ignore to try an load marker\
+		                                s anyway."),doc->file_name);
 		gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Okay"),GTK_RESPONSE_OK);
 		gtk_dialog_add_button(GTK_DIALOG(dialog),_("_Ignore"),GTK_RESPONSE_REJECT);
 		l=gtk_dialog_run(GTK_DIALOG(dialog));
@@ -624,9 +625,9 @@ static void on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_dat
 			if(fd->pcFolding==NULL || bRememberFolds==FALSE)
 				break;
 
-      cFoldData=fd->pcFolding;
+			cFoldData=fd->pcFolding;
 
-		  /* first ensure fold positions exist */
+			/* first ensure fold positions exist */
 			scintilla_send_message(sci,SCI_COLOURISE,0,-1);
 
 			iLineCount=scintilla_send_message(sci,SCI_GETLINECOUNT,0,0);
@@ -637,14 +638,14 @@ static void on_document_open(GObject *obj, GeanyDocument *doc, gpointer user_dat
 				iFlags=scintilla_send_message(sci,SCI_GETFOLDLEVEL,i,0);
 				/* ignore non-folding lines */
 				if((iFlags & SC_FOLDLEVELHEADERFLAG)==0)
-          continue;
+					continue;
 
-        /* get next 6 fold states if needed */
+				/* get next 6 fold states if needed */
 				if(iBitCounter==6)
 				{
-				  iBitCounter=0;
-          iBits=base64_char_to_int[(gint)(*cFoldData)];
-          cFoldData++;
+					iBitCounter=0;
+					iBits=base64_char_to_int[(gint)(*cFoldData)];
+					cFoldData++;
 				}
 
 				/* set fold if needed */
@@ -715,8 +716,8 @@ static void on_document_save(GObject *obj, GeanyDocument *doc, gpointer user_dat
 	if(iBitCounter!=0)
 	{
 		guiFold=(guint8)base64_int_to_char[guiFold];
-    g_byte_array_append(gbaFoldData,&guiFold,1);
-  }
+		g_byte_array_append(gbaFoldData,&guiFold,1);
+	}
 
 	/* transfer data to text string */
 	fdTemp->pcFolding=g_strndup((gchar*)(gbaFoldData->data),gbaFoldData->len);
@@ -745,7 +746,7 @@ static void on_document_save(GObject *obj, GeanyDocument *doc, gpointer user_dat
 static gint GetLine(ScintillaObject* sci)
 {
 	return scintilla_send_message(sci,SCI_LINEFROMPOSITION,
-								scintilla_send_message(sci,SCI_GETCURRENTPOS,10,0),0);
+	                              scintilla_send_message(sci,SCI_GETCURRENTPOS,10,0),0);
 }
 
 
@@ -765,7 +766,7 @@ static void on_configure_response(GtkDialog *dialog, gint response, gpointer use
 	/* first see if settings are going to change */
 	bSettingsHaveChanged=(bRememberFolds!=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb1)));
 	bSettingsHaveChanged|=(bCenterWhenGotoBookmark!=gtk_toggle_button_get_active(
-														GTK_TOGGLE_BUTTON(cb2)));
+	                       GTK_TOGGLE_BUTTON(cb2)));
 
 	/* set new settings settings */
 	bRememberFolds=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cb1));
@@ -811,11 +812,10 @@ void plugin_help(void)
 	GtkWidget *dialog,*label,*scroll;
 
 	/* create dialog box */
-  dialog=gtk_dialog_new_with_buttons(_("Numbered Bookmarks help"),
-        GTK_WINDOW(geany->main_widgets->window),
-        GTK_DIALOG_DESTROY_WITH_PARENT,
-        GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,
-        NULL);
+	dialog=gtk_dialog_new_with_buttons(_("Numbered Bookmarks help"),
+	                                   GTK_WINDOW(geany->main_widgets->window),
+	                                   GTK_DIALOG_DESTROY_WITH_PARENT,
+	                                   GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,NULL);
 
 	/* create label */
 	label=gtk_label_new(
@@ -842,7 +842,7 @@ void plugin_help(void)
 	/* create scrolled window to display label */
 	scroll=gtk_scrolled_window_new(NULL,NULL);
 	gtk_scrolled_window_set_policy((GtkScrolledWindow*)scroll,GTK_POLICY_NEVER,
-								GTK_POLICY_AUTOMATIC);
+	                               GTK_POLICY_AUTOMATIC);
 	gtk_scrolled_window_add_with_viewport((GtkScrolledWindow*)scroll,label);
 
 	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),scroll);
@@ -882,6 +882,7 @@ static void GotoBookMark(gint iBookMark)
 	/* make sure view is not beyond start or end of document */
 	if(iLine+iLinesVisible>iLineCount)
 		iLine=iLineCount-iLinesVisible;
+		
 	if(iLine<0)
 		iLine=0;
 
@@ -1019,7 +1020,7 @@ void plugin_init(GeanyData *data)
 
 	/* set key press monitor handle */
 	key_release_signal_id=g_signal_connect(geany->main_widgets->window,"key-release-event",
-										G_CALLBACK(Key_Released_CallBack),NULL);
+	                                       G_CALLBACK(Key_Released_CallBack),NULL);
 }
 
 
@@ -1042,7 +1043,7 @@ void plugin_cleanup(void)
 		if(documents[i]->is_valid) {
 			sci=documents[i]->editor->sci;
 			for(k=0;k<9;k++)
-			  scintilla_send_message(sci,SCI_MARKERDELETEALL,BOOKMARK_BASE+k,0);
+				scintilla_send_message(sci,SCI_MARKERDELETEALL,BOOKMARK_BASE+k,0);
 
 		}
 


Modified: po/POTFILES.in
40 files changed, 39 insertions(+), 1 deletions(-)
===================================================================
@@ -50,9 +50,47 @@ debugger/src/atree.c
 devhelp/src/dhp.h
 devhelp/src/dhp-object.c
 devhelp/src/dhp-plugin.c
-devhelp/src/dhp-codesearch.c
 devhelp/src/dhp-manpages.c
 devhelp/src/dhp-settings.c
+# bundled libdevhelp2
+devhelp/devhelp/dh-assistant.c
+devhelp/devhelp/dh-assistant.h
+devhelp/devhelp/dh-assistant-view.c
+devhelp/devhelp/dh-assistant-view.h
+devhelp/devhelp/dh-base.c
+devhelp/devhelp/dh-base.h
+devhelp/devhelp/dh-book.c
+devhelp/devhelp/dh-book.h
+devhelp/devhelp/dh-book-manager.c
+devhelp/devhelp/dh-book-manager.h
+devhelp/devhelp/dh-book-tree.c
+devhelp/devhelp/dh-book-tree.h
+devhelp/devhelp/dh-enum-types.c
+devhelp/devhelp/dh-enum-types.h
+devhelp/devhelp/dh-error.c
+devhelp/devhelp/dh-error.h
+devhelp/devhelp/dh-keyword-model.c
+devhelp/devhelp/dh-keyword-model.h
+devhelp/devhelp/dh-link.c
+devhelp/devhelp/dh-link.h
+devhelp/devhelp/dh-marshal.c
+devhelp/devhelp/dh-marshal.h
+devhelp/devhelp/dh-parser.c
+devhelp/devhelp/dh-parser.h
+devhelp/devhelp/dh-preferences.c
+devhelp/devhelp/dh-preferences.h
+devhelp/devhelp/dh-search.c
+devhelp/devhelp/dh-search.h
+devhelp/devhelp/dh-util.c
+devhelp/devhelp/dh-util.h
+devhelp/devhelp/dh-window.c
+devhelp/devhelp/dh-window.h
+devhelp/devhelp/eggfindbar.c
+devhelp/devhelp/eggfindbar.h
+devhelp/devhelp/ige-conf.c
+devhelp/devhelp/ige-conf-gconf.c
+devhelp/devhelp/ige-conf.h
+devhelp/devhelp/ige-conf-private.h
 
 # geanydoc
 geanydoc/tests/unittests.c


@@ Diff output truncated at 100000 characters. @@


--------------
This E-Mail was brought to you by github_commit_mail.py (Source: TBD).



More information about the Plugins-Commits mailing list