[geany/geany-plugins] 682e10: Merge pull request #22 from WilliamFraser/master

Frank Lanitz git-noreply at xxxxx
Fri Mar 30 20:42:49 UTC 2012


Branch:      refs/heads/master
Author:      Frank Lanitz <frank at frank.uvena.de>
Committer:   Frank Lanitz <frank at frank.uvena.de>
Date:        Fri, 30 Mar 2012 20:42:49
Commit:      682e101cc9e06561f74f2fca0823ef26ed9273dc
             https://github.com/geany/geany-plugins/commit/682e101cc9e06561f74f2fca0823ef26ed9273dc

Log Message:
-----------
Merge pull request #22 from WilliamFraser/master

Added search to macros and couple more little changes


Modified Paths:
--------------
    geanymacro/src/geanymacro.c
    geanynumberedbookmarks/src/geanynumberedbookmarks.c

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);
 
 		}
 



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



More information about the Plugins-Commits mailing list