SF.net SVN: geany:[3947] branches/build-system

elextr at users.sourceforge.net elextr at xxxxx
Fri Jul 10 09:00:38 UTC 2009


Revision: 3947
          http://geany.svn.sourceforge.net/geany/?rev=3947&view=rev
Author:   elextr
Date:     2009-07-10 09:00:37 +0000 (Fri, 10 Jul 2009)

Log Message:
-----------
Fixed load/save filetypes build config, implemented Build Commands Dialog clear button

Modified Paths:
--------------
    branches/build-system/ChangeLog
    branches/build-system/src/build.c
    branches/build-system/src/build.h
    branches/build-system/src/filetypes.c
    branches/build-system/src/project.c

Modified: branches/build-system/ChangeLog
===================================================================
--- branches/build-system/ChangeLog	2009-07-09 15:25:26 UTC (rev 3946)
+++ branches/build-system/ChangeLog	2009-07-10 09:00:37 UTC (rev 3947)
@@ -1,3 +1,13 @@
+2009-07-10  geany test  <elextr(at)gmail(dot)com>
+
+ * src/build.c
+   fixed problem loading old format filetype files, some formatting fixes
+   fixed saving new format files
+   added operation for clear button on build commands dialog
+ * src/filetypes.c
+   fixed loading and saving filetype files
+
+
 2009-07-09  geany test  <elextr(at)gmail(dot)com>
 
 Configurable Build Menu Changes

Modified: branches/build-system/src/build.c
===================================================================
--- branches/build-system/src/build.c	2009-07-09 15:25:26 UTC (rev 3946)
+++ branches/build-system/src/build.c	2009-07-10 09:00:37 UTC (rev 3947)
@@ -78,10 +78,10 @@
 
 
 /* pack group (<8) and command (<32) into a user_data pointer */
-#define GRP_CMD_TO_POINTER( grp, cmd ) GINT_TO_POINTER((((grp)&7)<<5)|((cmd)&0x1f))
-#define GBO_TO_POINTER( gbo ) (GRP_CMD_TO_POINTER( GBO_TO_GBG(gbo), GBO_TO_CMD(gbo) ))
-#define GPOINTER_TO_CMD( gptr ) (GPOINTER_TO_INT(gptr)&0x1f)
-#define GPOINTER_TO_GRP( gptr ) ((GPOINTER_TO_INT(gptr)&0xe0)>>5)
+#define GRP_CMD_TO_POINTER(grp, cmd) GINT_TO_POINTER((((grp)&7)<<5)|((cmd)&0x1f))
+#define GBO_TO_POINTER(gbo) (GRP_CMD_TO_POINTER(GBO_TO_GBG(gbo), GBO_TO_CMD(gbo)))
+#define GPOINTER_TO_CMD(gptr) (GPOINTER_TO_INT(gptr)&0x1f)
+#define GPOINTER_TO_GRP(gptr) ((GPOINTER_TO_INT(gptr)&0xe0)>>5)
 
 static gpointer last_toolbutton_action = GBO_TO_POINTER(GBO_BUILD);
 
@@ -113,7 +113,7 @@
 static GPid build_spawn_cmd(GeanyDocument *doc, const gchar *cmd, const gchar *dir);
 static void set_stop_button(gboolean stop);
 static void run_exit_cb(GPid child_pid, gint status, gpointer user_data);
-static void on_set_build_commands_activate( GtkWidget *w, gpointer u );
+static void on_set_build_commands_activate(GtkWidget *w, gpointer u);
 static void on_build_next_error(GtkWidget *menuitem, gpointer user_data);
 static void on_build_previous_error(GtkWidget *menuitem, gpointer user_data);
 static void kill_process(GPid *pid);
@@ -153,41 +153,46 @@
 /* the various groups of commands not in the filetype struct */
 GeanyBuildCommand *ft_def=NULL, *non_ft_proj=NULL, *non_ft_pref=NULL, *non_ft_def=NULL, *exec_proj=NULL, *exec_pref=NULL, *exec_def=NULL;
 
-/* get the command taking priority into account */
-static GeanyBuildCommand *get_build_cmd( GeanyDocument *doc, gint cmdgrp, gint cmdindex, gint *from )
+#define return_cmd_if(src, cmds) if (cmds!=NULL && cmds[cmdindex].exists && below>src)\
+									{*fr=src; return &(cmds[cmdindex]);}
+#define return_ft_cmd_if(src, cmds) if (ft!=NULL && ft->cmds!=NULL && ft->cmds[cmdindex].exists && below>src)\
+										{*fr=src; return &(ft->cmds[cmdindex]);}
+
+/* get the next lowest command taking priority into account */
+static GeanyBuildCommand *get_next_build_cmd(GeanyDocument *doc, gint cmdgrp, gint cmdindex, gint below, gint *from)
 {
 	GeanyBuildSource	 srcindex;
 	GeanyFiletype		*ft=NULL;
 	gint				 sink, *fr = &sink;
 	
-	if(cmdgrp>=GBG_COUNT)return NULL;
-	if( from!=NULL )fr=from;
-	if( doc==NULL )doc=document_get_current();
-	if( doc!=NULL )ft = doc->file_type;
-	switch( cmdgrp )
+	if (cmdgrp>=GBG_COUNT)return NULL;
+	if (from!=NULL)fr=from;
+	if (doc==NULL)doc=document_get_current();
+	if (doc!=NULL)ft = doc->file_type;
+	switch(cmdgrp)
 	{
 		case GBG_FT: /* order proj ft, home ft, ft, defft */
-			if( ft!=NULL )
+			if (ft!=NULL)
 			{
-				if( ft->projfilecmds!=NULL && ft->projfilecmds[cmdindex].exists ){ *fr=BCS_PROJ; return &(ft->projfilecmds[cmdindex]); }
-				if( ft->homefilecmds!=NULL && ft->homefilecmds[cmdindex].exists ){ *fr=BCS_FT; return &(ft->homefilecmds[cmdindex]); }
-				if( ft->filecmds!=NULL && ft->filecmds[cmdindex].exists ){ *fr=BCS_FT; return &(ft->filecmds[cmdindex]); }
+				return_ft_cmd_if(BCS_PROJ_FT, projfilecmds);
+				return_ft_cmd_if(BCS_PREF, homefilecmds);
+				return_ft_cmd_if(BCS_FT, filecmds);
 			}
-			if( ft_def!=NULL && ft_def[cmdindex].exists ){ *fr=BCS_DEF; return &(ft_def[cmdindex]); }
+			return_cmd_if(BCS_DEF, ft_def);
 			break;
 		case GBG_NON_FT: /* order proj, pref, def */
-			if( non_ft_proj!=NULL && non_ft_proj[cmdindex].exists ){ *fr=BCS_PROJ; return &(non_ft_proj[cmdindex]); }
-			if( non_ft_pref!=NULL && non_ft_pref[cmdindex].exists ){ *fr=BCS_PREF; return &(non_ft_pref[cmdindex]); }
-			if( ft!=NULL && ft->ftdefcmds!=NULL && ft->ftdefcmds[cmdindex].exists ){ *fr=BCS_FT; return &(ft->ftdefcmds[cmdindex]); }
-			if( non_ft_def!=NULL && non_ft_def[cmdindex].exists ){ *fr=BCS_DEF; return &(non_ft_def[cmdindex]); }
+			return_cmd_if(BCS_PROJ, non_ft_proj);
+			return_cmd_if(BCS_PREF, non_ft_pref);
+			return_ft_cmd_if(BCS_FT, ftdefcmds);
+			return_cmd_if(BCS_DEF, non_ft_def);
 			break;
 		case GBG_EXEC: /* order proj, proj ft, pref, home ft, ft, def */
-			if( exec_proj!=NULL && exec_proj[cmdindex].exists ){ *fr=BCS_PROJ; return &(exec_proj[cmdindex]); }
-			if( ft!=NULL && ft->projexeccmds!=NULL && ft->projexeccmds[cmdindex].exists ){ *fr=BCS_PROJ_FT; return &(ft->projexeccmds[cmdindex]); }
-			if( exec_pref!=NULL && exec_pref[cmdindex].exists ){ *fr=BCS_PREF; return &(exec_pref[cmdindex]); }
-			if( ft!=NULL && ft->homeexeccmds!=NULL && ft->homeexeccmds[cmdindex].exists ){ *fr=BCS_FT; return &(ft->homeexeccmds[cmdindex]); }
-			if( ft!=NULL && ft->execcmds!=NULL && ft->execcmds[cmdindex].exists ){ *fr=BCS_FT; return &(ft->execcmds[cmdindex]); }
-			if( exec_def!=NULL && exec_def[cmdindex].exists ){ *fr=BCS_DEF; return &(exec_def[cmdindex]); }
+			return_cmd_if(BCS_PROJ, exec_proj);
+			return_ft_cmd_if(BCS_PROJ_FT, projexeccmds);
+			return_cmd_if(BCS_PREF, exec_pref);
+			return_ft_cmd_if(BCS_FT, homeexeccmds);
+			return_ft_cmd_if(BCS_FT, execcmds);
+			return_cmd_if(BCS_DEF, exec_def);
 			break;
 		default:
 			break;
@@ -195,8 +200,14 @@
 	return NULL;
 }
 
+/* shortcut to start looking at the top */
+static GeanyBuildCommand *get_build_cmd(GeanyDocument *doc, gint grp, gint index, gint *from)
+{
+	return get_next_build_cmd(doc, grp, index, BCS_COUNT, from);
+}
+
 /* remove the specified command, cmd<0 remove whole group */
-void remove_command( GeanyBuildSource src, GeanyBuildGroup grp, gint cmd )
+void remove_command(GeanyBuildSource src, GeanyBuildGroup grp, gint cmd)
 {
 	GeanyBuildCommand *bc;
 	gint i;
@@ -206,8 +217,8 @@
 	switch(grp)
 	{
 		case GBG_FT:
-			if((doc=document_get_current())==NULL)return;
-			if((ft=doc->file_type)==NULL)return;
+			if ((doc=document_get_current())==NULL)return;
+			if ((ft=doc->file_type)==NULL)return;
 			switch(src)
 			{
 				case BCS_DEF:     bc=ft->ftdefcmds; break;
@@ -229,8 +240,8 @@
 			}
 			break;
 		case GBG_EXEC:
-			if((doc=document_get_current())==NULL)return;
-			if((ft=doc->file_type)==NULL)return;
+			if ((doc=document_get_current())==NULL)return;
+			if ((ft=doc->file_type)==NULL)return;
 			switch(src)
 			{
 				case BCS_DEF:     bc=exec_def; break;
@@ -246,9 +257,9 @@
 		default:
 			return;
 	}
-	if(bc==NULL)return;
-	if(cmd<0)
-		for(i=0; i<build_groups_count[grp]; ++i )
+	if (bc==NULL)return;
+	if (cmd<0)
+		for (i=0; i<build_groups_count[grp]; ++i)
 			bc[i].exists=FALSE;
 	else
 		bc[cmd].exists=FALSE;
@@ -331,7 +342,7 @@
 
 	g_return_val_if_fail(doc!=NULL || dir!=NULL, (GPid) 1);
 
-	if(doc!=NULL)clear_errors(doc);
+	if (doc!=NULL)clear_errors(doc);
 	setptr(current_dir_entered, NULL);
 
 	locale_filename = utils_get_locale_from_utf8(doc->file_name);
@@ -442,7 +453,7 @@
 	locale_filename = utils_get_locale_from_utf8(doc->file_name);
 
 	have_project = (project != NULL && NZV(project->run_cmd));
-	cmd = get_build_cmd( doc, GBG_EXEC, 0, NULL )->command;
+	cmd = get_build_cmd(doc, GBG_EXEC, 0, NULL)->command;
 	/* TODO fix all this stuff */
 
 	if (strstr(cmd, "%e") != NULL)
@@ -861,41 +872,41 @@
 	return TRUE;
 }
 
-typedef void callback( GtkWidget *w, gpointer u );
+typedef void callback(GtkWidget *w, gpointer u);
 
 /* run the command catenating cmd_cat if present */
-static void build_command( GeanyDocument *doc, GeanyBuildGroup grp, gint cmd, gchar *cmd_cat )
+static void build_command(GeanyDocument *doc, GeanyBuildGroup grp, gint cmd, gchar *cmd_cat)
 {
 	gchar *dir;
 	gchar *full_command;
-	GeanyBuildCommand *buildcmd = get_build_cmd( doc, grp, cmd, NULL );
+	GeanyBuildCommand *buildcmd = get_build_cmd(doc, grp, cmd, NULL);
 	
-	if( buildcmd==NULL )return;
-	if( cmd_cat != NULL )
+	if (buildcmd==NULL)return;
+	if (cmd_cat != NULL)
 	{
-		if( buildcmd->command != NULL )
-			full_command = g_strconcat( buildcmd->command, cmd_cat, NULL );
+		if (buildcmd->command != NULL)
+			full_command = g_strconcat(buildcmd->command, cmd_cat, NULL);
 		else
-			full_command = g_strdup(cmd_cat );
+			full_command = g_strdup(cmd_cat);
 	}
 	else
 		full_command = buildcmd->command;
-	if( grp == GBG_FT )
+	if (grp == GBG_FT)
 	{
 		dir=NULL; /* allways run in doc dir */
 	}
 	else
 	{
 		dir = NULL;
-		if( buildcmd->run_in_base_dir )
+		if (buildcmd->run_in_base_dir)
 			dir =  project_get_make_dir();
 	}
 	build_info.grp = grp;
 	build_info.cmd = cmd;
 	build_spawn_cmd(doc, full_command, dir);
-	g_free( dir );
-	if( cmd_cat != NULL ) g_free(full_command);
-	build_menu_update( doc );
+	g_free(dir);
+	if (cmd_cat != NULL) g_free(full_command);
+	build_menu_update(doc);
 
 }
 
@@ -913,7 +924,7 @@
 	build_command(doc, GBO_TO_GBG(GBO_MAKE_CUSTOM), GBO_TO_CMD(GBO_MAKE_CUSTOM), build_info.custom_target);
 }
 
-static void on_build_menu_item( GtkWidget *w, gpointer user_data )
+static void on_build_menu_item(GtkWidget *w, gpointer user_data)
 {
 	GeanyDocument *doc = document_get_current();
 	filetype_id ft_id;
@@ -923,7 +934,7 @@
 	
 	if (doc && doc->changed)
 		document_save_file(doc, FALSE);
-	if( grp == GBG_NON_FT && cmd == GBO_TO_CMD(GBO_MAKE_CUSTOM) )
+	if (grp == GBG_NON_FT && cmd == GBO_TO_CMD(GBO_MAKE_CUSTOM))
 	{
 		static GtkWidget *dialog = NULL;	/* keep dialog for combo history */
 
@@ -937,17 +948,17 @@
 		}
 		return;
 	}
-	else if( grp == GBG_EXEC && cmd == GBO_TO_CMD(GBO_EXEC) )
+	else if (grp == GBG_EXEC && cmd == GBO_TO_CMD(GBO_EXEC))
 	{
 		if (run_info.pid > (GPid) 1)
 		{
 			kill_process(&run_info.pid);
 			return;
 		}
-		GeanyBuildCommand *bc = get_build_cmd( doc, grp, cmd, NULL );
-		if( bc!=NULL && strcmp( bc->command, "builtin" )==0 )
+		GeanyBuildCommand *bc = get_build_cmd(doc, grp, cmd, NULL);
+		if (bc!=NULL && strcmp(bc->command, "builtin")==0)
 		{
-			if( doc==NULL )return;
+			if (doc==NULL)return;
 			gchar *uri = g_strconcat("file:///", g_path_skip_root(doc->file_name), NULL);
 			utils_open_browser(uri);
 			g_free(uri);
@@ -957,7 +968,7 @@
 			build_run_cmd(doc);
 	}
 	else
-		build_command( doc, grp, cmd, NULL );
+		build_command(doc, grp, cmd, NULL);
 };
 
 /* group codes for menu items other than the known commands
@@ -1002,28 +1013,28 @@
 		{ NULL,              -1,                       MENU_DONE,               0,                         NULL, NULL }
 };
 
-static void create_build_menu_item( GtkWidget *menu, GeanyKeyGroup *group, GtkAccelGroup *ag, 
-							struct build_menu_item_spec *bs, gchar *lbl, gint grp, gint cmd )
+static void create_build_menu_item(GtkWidget *menu, GeanyKeyGroup *group, GtkAccelGroup *ag, 
+							struct build_menu_item_spec *bs, gchar *lbl, gint grp, gint cmd)
 {
 	GtkWidget *item = gtk_image_menu_item_new_with_mnemonic(lbl);
-	if( bs->stock_id!=NULL )
+	if (bs->stock_id!=NULL)
 	{
-		GtkWidget *image = gtk_image_new_from_stock( bs->stock_id, GTK_ICON_SIZE_MENU );
-		gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM( item ), image );
+		GtkWidget *image = gtk_image_new_from_stock(bs->stock_id, GTK_ICON_SIZE_MENU);
+		gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
 		
 	}
 	gtk_widget_show(item);
-	if( bs->key_binding>0 )
+	if (bs->key_binding>0)
 		add_menu_accel(group, bs->key_binding, ag, item);
 	gtk_container_add(GTK_CONTAINER(menu), item);
-	if(bs->cb!=NULL)
+	if (bs->cb!=NULL)
 	{
 		g_signal_connect(item, "activate", G_CALLBACK(bs->cb), GRP_CMD_TO_POINTER(grp,cmd));
 	}
 	menu_items.menu_item[grp][cmd] = item;
 }
 
-static void create_build_menu( BuildMenuItems *menu_items )
+static void create_build_menu(BuildMenuItems *menu_items)
 {
 	GtkWidget *menu;
 	GtkAccelGroup *accel_group = gtk_accel_group_new();
@@ -1031,40 +1042,40 @@
 	gint i,j;
 
 	menu = gtk_menu_new();
-	menu_items->menu_item[GBG_FT] = g_new0( GtkWidget*, build_groups_count[GBG_FT]);
-	menu_items->menu_item[GBG_NON_FT] = g_new0( GtkWidget*, build_groups_count[GBG_NON_FT]);
-	menu_items->menu_item[GBG_EXEC] = g_new0( GtkWidget*, build_groups_count[GBG_EXEC]);
-	menu_items->menu_item[GBG_FIXED] = g_new0( GtkWidget*, GBF_COUNT);
+	menu_items->menu_item[GBG_FT] = g_new0(GtkWidget*, build_groups_count[GBG_FT]);
+	menu_items->menu_item[GBG_NON_FT] = g_new0(GtkWidget*, build_groups_count[GBG_NON_FT]);
+	menu_items->menu_item[GBG_EXEC] = g_new0(GtkWidget*, build_groups_count[GBG_EXEC]);
+	menu_items->menu_item[GBG_FIXED] = g_new0(GtkWidget*, GBF_COUNT);
 	
-	for( i=0; build_menu_specs[i].build_grp != MENU_DONE; ++i )
+	for (i=0; build_menu_specs[i].build_grp != MENU_DONE; ++i)
 	{
 		struct build_menu_item_spec *bs = &(build_menu_specs[i]);
-		if( bs->build_grp == MENU_SEPARATOR )
+		if (bs->build_grp == MENU_SEPARATOR)
 		{
 			GtkWidget *item = gtk_separator_menu_item_new();
 			gtk_widget_show(item);
 			gtk_container_add(GTK_CONTAINER(menu), item);
 			menu_items->menu_item[GBG_FIXED][bs->build_cmd] = item;
 		}
-		else if( bs->fix_label!=NULL )
+		else if (bs->fix_label!=NULL)
 		{
-			create_build_menu_item( menu, keygroup, accel_group, bs, gettext(bs->fix_label), GBG_FIXED, bs->build_cmd );
+			create_build_menu_item(menu, keygroup, accel_group, bs, gettext(bs->fix_label), GBG_FIXED, bs->build_cmd);
 		}
-		else if(bs->build_grp >= MENU_FT_REST && bs->build_grp <= MENU_SEPARATOR )
+		else if (bs->build_grp >= MENU_FT_REST && bs->build_grp <= MENU_SEPARATOR)
 		{
 			gint grp = bs->build_grp-GBG_COUNT;
-			for( j=bs->build_cmd; j<build_groups_count[grp]; ++j )
+			for (j=bs->build_cmd; j<build_groups_count[grp]; ++j)
 			{
 				GeanyBuildCommand *bc = get_build_cmd(NULL, grp, j, NULL);
 				gchar *lbl = (bc==NULL)?"":bc->label;
-				create_build_menu_item( menu, keygroup, accel_group, bs, lbl, grp, j );
+				create_build_menu_item(menu, keygroup, accel_group, bs, lbl, grp, j);
 			}
 		}
 		else
 		{
 			GeanyBuildCommand *bc = get_build_cmd(NULL, bs->build_grp, bs->build_cmd, NULL);
 			gchar *lbl = (bc==NULL)?"":bc->label;
-			create_build_menu_item( menu, keygroup, accel_group, bs, lbl, bs->build_grp, bs->build_cmd );
+			create_build_menu_item(menu, keygroup, accel_group, bs, lbl, bs->build_grp, bs->build_cmd);
 		}
 	}
 	menu_items->menu = menu;
@@ -1074,10 +1085,10 @@
 
 /* portability to various GTK versions needs checking
  * conforms to description of gtk_accel_label as child of menu item */
-static void geany_menu_item_set_label( GtkWidget *w, gchar *label )
+static void geany_menu_item_set_label(GtkWidget *w, gchar *label)
 {
-	GtkWidget *c=gtk_bin_get_child( GTK_BIN(w) );
-	gtk_label_set_text_with_mnemonic( GTK_LABEL(c), label );
+	GtkWidget *c=gtk_bin_get_child(GTK_BIN(w));
+	gtk_label_set_text_with_mnemonic(GTK_LABEL(c), label);
 }
 
 /* Call this whenever build menu items need to be enabled/disabled.
@@ -1090,7 +1101,7 @@
 	gboolean have_path, build_running, exec_running, have_errors, cmd_sensitivity;
 	GeanyBuildCommand *bc;
 	
-	if( menu_items.menu==NULL)
+	if (menu_items.menu==NULL)
 		create_build_menu(&menu_items);
 	if (doc == NULL)
 		doc = document_get_current();
@@ -1098,20 +1109,19 @@
 	build_running =  build_info.pid > (GPid) 1;
 	exec_running = run_info.pid > (GPid) 1;
 	have_errors = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(msgwindow.store_compiler), NULL) > 0;
-	
-	for( i=0; build_menu_specs[i].build_grp != MENU_DONE; ++i )
+	for (i=0; build_menu_specs[i].build_grp != MENU_DONE; ++i)
 	{
 		struct build_menu_item_spec *bs = &(build_menu_specs[i]);
-		switch( bs->build_grp )
+		switch(bs->build_grp)
 		{
 			case MENU_SEPARATOR:
-				if( vis==TRUE )
+				if (vis==TRUE)
 				{
-					gtk_widget_show_all( menu_items.menu_item[GBG_FIXED][bs->build_cmd] );
+					gtk_widget_show_all(menu_items.menu_item[GBG_FIXED][bs->build_cmd]);
 					vis=FALSE;
 				}
 				else
-					gtk_widget_hide_all( menu_items.menu_item[GBG_FIXED][bs->build_cmd] );
+					gtk_widget_hide_all(menu_items.menu_item[GBG_FIXED][bs->build_cmd]);
 				break;
 			case MENU_NEXT_ERROR:
 			case MENU_PREV_ERROR:
@@ -1122,7 +1132,7 @@
 				vis |= TRUE;
 				break;
 			default: /* all configurable commands */
-				if( bs->build_grp >=GBG_COUNT )
+				if (bs->build_grp >=GBG_COUNT)
 				{
 					grp = bs->build_grp-GBG_COUNT;
 					cmdcount = build_groups_count[grp];
@@ -1132,64 +1142,64 @@
 					grp = bs->build_grp;
 					cmdcount = bs->build_cmd+1;
 				}
-				for( cmd=bs->build_cmd; cmd<cmdcount; ++cmd )
+				for (cmd=bs->build_cmd; cmd<cmdcount; ++cmd)
 				{
 					GtkWidget *menu_item = menu_items.menu_item[grp][cmd];
-					bc = get_build_cmd( doc, grp, cmd, NULL );
-					if( grp < GBG_EXEC )
+					bc = get_build_cmd(doc, grp, cmd, NULL);
+					if (grp < GBG_EXEC)
 					{
 						cmd_sensitivity = 
-							( grp == GBG_FT && bc!=NULL && have_path && ! build_running ) ||
-							( grp == GBG_NON_FT && bc!=NULL && ! build_running );
-						gtk_widget_set_sensitive( menu_item, cmd_sensitivity );
-						if( bc!=NULL && bc->label!=NULL && strlen(bc->label)>0 )
+							(grp == GBG_FT && bc!=NULL && have_path && ! build_running) ||
+							(grp == GBG_NON_FT && bc!=NULL && ! build_running);
+						gtk_widget_set_sensitive(menu_item, cmd_sensitivity);
+						if (bc!=NULL && bc->label!=NULL && strlen(bc->label)>0)
 						{
-							geany_menu_item_set_label( menu_item, bc->label );
-							gtk_widget_show_all( menu_item );
+							geany_menu_item_set_label(menu_item, bc->label);
+							gtk_widget_show_all(menu_item);
 							vis |= TRUE;
 						}
 						else
-							gtk_widget_hide_all( menu_item );
+							gtk_widget_hide_all(menu_item);
 					}
 					else
 					{
 						GtkWidget *image;
 						cmd_sensitivity = bc!=NULL || exec_running;
-						gtk_widget_set_sensitive( menu_item, cmd_sensitivity );
-						if( !exec_running )
+						gtk_widget_set_sensitive(menu_item, cmd_sensitivity);
+						if (!exec_running)
 						{
-							image = gtk_image_new_from_stock( bs->stock_id, GTK_ICON_SIZE_MENU );
+							image = gtk_image_new_from_stock(bs->stock_id, GTK_ICON_SIZE_MENU);
 						}
 						else
 						{
-							image = gtk_image_new_from_stock( GTK_STOCK_STOP, GTK_ICON_SIZE_MENU );
+							image = gtk_image_new_from_stock(GTK_STOCK_STOP, GTK_ICON_SIZE_MENU);
 						}
-						gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM( menu_item ), image );
-						if( bc!=NULL && bc->label!=NULL && strlen(bc->label)>0 )
+						gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
+						if (bc!=NULL && bc->label!=NULL && strlen(bc->label)>0)
 						{
-							geany_menu_item_set_label( menu_item, bc->label );
-							gtk_widget_show_all( menu_item );
+							geany_menu_item_set_label(menu_item, bc->label);
+							gtk_widget_show_all(menu_item);
 							vis |= TRUE;
 						}
 						else
-							gtk_widget_hide_all( menu_item );
+							gtk_widget_hide_all(menu_item);
 					}
 				}
 		}
 	}
-	ui_widget_set_sensitive(widgets.compile_button, get_build_cmd( doc, GBG_FT, GBO_TO_CMD(GBO_COMPILE), NULL )!=NULL && have_path && ! build_running);
-	ui_widget_set_sensitive(widgets.build_button, get_build_cmd( doc, GBG_FT, GBO_TO_CMD(GBO_BUILD), NULL )!=NULL && have_path && ! build_running);
-	if(widgets.run_button!=NULL)
+	ui_widget_set_sensitive(widgets.compile_button, get_build_cmd(doc, GBG_FT, GBO_TO_CMD(GBO_COMPILE), NULL)!=NULL && have_path && ! build_running);
+	ui_widget_set_sensitive(widgets.build_button, get_build_cmd(doc, GBG_FT, GBO_TO_CMD(GBO_BUILD), NULL)!=NULL && have_path && ! build_running);
+	if (widgets.run_button!=NULL)
 	{
-		if( exec_running )
+		if (exec_running)
 			gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(widgets.run_button), GTK_STOCK_STOP);
 		else
 			gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(widgets.run_button), GTK_STOCK_EXECUTE);
 	}
-	ui_widget_set_sensitive(widgets.run_button, get_build_cmd( doc, GBG_EXEC, GBO_TO_CMD(GBO_EXEC), NULL )!=NULL || exec_running);
+	ui_widget_set_sensitive(widgets.run_button, get_build_cmd(doc, GBG_EXEC, GBO_TO_CMD(GBO_EXEC), NULL)!=NULL || exec_running);
 }
 
-static void on_set_build_commands_activate( GtkWidget *w, gpointer u )
+static void on_set_build_commands_activate(GtkWidget *w, gpointer u)
 {
 	show_build_commands_dialog();
 }
@@ -1211,11 +1221,11 @@
 
 	last_toolbutton_action = user_data;
 	grp = GPOINTER_TO_GRP(user_data); cmd = GPOINTER_TO_CMD(user_data);
-	if(  last_toolbutton_action==GBO_TO_POINTER(GBO_MAKE_ALL))
+	if ( last_toolbutton_action==GBO_TO_POINTER(GBO_MAKE_ALL))
 			msg = _("Build the current file with Make and the default target");
-	else if( last_toolbutton_action==GBO_TO_POINTER(GBO_MAKE_CUSTOM))
+	else if (last_toolbutton_action==GBO_TO_POINTER(GBO_MAKE_CUSTOM))
 			msg = _("Build the current file with Make and the specified target");
-	else if( last_toolbutton_action==GBO_TO_POINTER(GBO_MAKE_OBJECT))
+	else if (last_toolbutton_action==GBO_TO_POINTER(GBO_MAKE_OBJECT))
 			msg = _("Compile the current file with Make");
 	else
 			msg = NULL;
@@ -1299,13 +1309,39 @@
 
 typedef struct RowWidgets {
 	GtkWidget *label, *command, *dir;
-	GeanyBuildSource src;
+	GeanyBuildSource src, dst;
 	GeanyBuildCommand *cmdsrc;
+	gint grp,cmd;
+	gboolean cleared;
 }RowWidgets;
 
-static RowWidgets *build_add_dialog_row( GeanyDocument *doc, GtkTable *table, gint row,
-				GeanyBuildSource dst, gint grp, gint cmd, gboolean dir )
+static void on_clear_dialog_row( GtkWidget *unused, gpointer user_data )
 {
+	RowWidgets *r = (RowWidgets*)user_data;
+	gint src;
+	GeanyBuildCommand *bc = get_next_build_cmd(NULL, r->grp, r->cmd, r->dst, &src);
+	if(bc!=NULL)
+	{
+		printf("clear here %d, %d, %d\n", r->dst, r->src, src);
+		r->cmdsrc = bc;
+		r->src = src;
+		gtk_entry_set_text(GTK_ENTRY(r->label), bc->label!=NULL?bc->label:"");
+		gtk_entry_set_text(GTK_ENTRY(r->command), bc->command!=NULL?bc->command:"");
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(r->dir), bc->run_in_base_dir);
+	}
+	else
+	{
+		printf("clear there\n");
+		gtk_entry_set_text(GTK_ENTRY(r->label), "");
+		gtk_entry_set_text(GTK_ENTRY(r->command), "");
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(r->dir), FALSE);
+	}
+	r->cleared = TRUE;
+}
+
+static RowWidgets *build_add_dialog_row(GeanyDocument *doc, GtkTable *table, gint row,
+				GeanyBuildSource dst, gint grp, gint cmd, gboolean dir)
+{
 	GtkWidget *label, *check, *clear, *clearicon;
 	RowWidgets *roww;
 	gchar 	*labeltxt, *cmdtxt;
@@ -1313,51 +1349,55 @@
 	gint src;
 	gboolean ribd; /* run in base directory */
 	
-	if( grp == GBO_TO_GBG(GBO_MAKE_CUSTOM) && cmd == GBO_TO_CMD(GBO_MAKE_CUSTOM) ){ labeltxt = g_strdup_printf( "%d:*", cmd+1 ); }
-	else labeltxt = g_strdup_printf( "%d:", cmd+1 );
-	label = gtk_label_new( labeltxt );
+	if (grp == GBO_TO_GBG(GBO_MAKE_CUSTOM) && cmd == GBO_TO_CMD(GBO_MAKE_CUSTOM)){ labeltxt = g_strdup_printf("%d:*", cmd+1); }
+	else labeltxt = g_strdup_printf("%d:", cmd+1);
+	label = gtk_label_new(labeltxt);
 	g_free(labeltxt);
-	gtk_table_attach( table, label, 0, 1, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
-	roww = g_new( RowWidgets, 1 );
+	gtk_table_attach(table, label, 0, 1, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+	roww = g_new0(RowWidgets, 1);
 	roww->src = BCS_COUNT;
+	roww->grp = grp;
+	roww->cmd = cmd;
+	roww->dst = dst;
 	roww->label = gtk_entry_new();
-	gtk_table_attach( table, roww->label, 1, 2, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+	gtk_table_attach(table, roww->label, 1, 2, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 	roww->command = gtk_entry_new();
-	gtk_table_attach( table, roww->command, 2, 3, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
-	if(dir)
+	gtk_table_attach(table, roww->command, 2, 3, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+	if (dir)
 	{
 		check = gtk_check_button_new();
-		gtk_table_attach( table, check, 3, 4, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+		gtk_table_attach(table, check, 3, 4, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 	}
-	else check=NULL;
+	else check = NULL;
 	roww->dir = check;
-	clearicon = gtk_image_new_from_stock( GTK_STOCK_CLEAR, GTK_ICON_SIZE_SMALL_TOOLBAR );
+	clearicon = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_SMALL_TOOLBAR);
 	clear = gtk_button_new();
-	gtk_button_set_image( GTK_BUTTON(clear), clearicon );
-	/* TODO clear callback */
-	gtk_table_attach( table, clear, 4, 5, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
-	roww->cmdsrc = bc = get_build_cmd( doc, grp, cmd, &src );
-	if( bc!=NULL )
+	gtk_button_set_image(GTK_BUTTON(clear), clearicon);
+	g_signal_connect((gpointer)clear, "clicked", G_CALLBACK(on_clear_dialog_row), (gpointer)roww);
+	gtk_table_attach(table, clear, 4, 5, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+	roww->cmdsrc = bc = get_build_cmd(doc, grp, cmd, &src);
+	if (bc!=NULL)
 	{
-		if((labeltxt = bc->label)==NULL)labeltxt="";
-		if((cmdtxt = bc->command)==NULL)cmdtxt="";
+		if ((labeltxt = bc->label)==NULL)labeltxt="";
+		if ((cmdtxt = bc->command)==NULL)cmdtxt="";
 		ribd = bc->run_in_base_dir;
+		roww->src = src;
 	}
 	else
 	{
 		labeltxt = cmdtxt = "";
 		ribd = FALSE;
 	}
-	gtk_entry_set_text( GTK_ENTRY(roww->label), labeltxt );
-	gtk_entry_set_text( GTK_ENTRY(roww->command), cmdtxt );
-	if(dir)
-		gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(check), ribd );
-	if(src>dst || ( grp==GBG_FT && ( doc==NULL || doc->file_type==NULL ) ) )
+	gtk_entry_set_text(GTK_ENTRY(roww->label), labeltxt);
+	gtk_entry_set_text(GTK_ENTRY(roww->command), cmdtxt);
+	if (dir)
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), ribd);
+	if (src>dst || (grp==GBG_FT && (doc==NULL || doc->file_type==NULL)))
 	{
-		gtk_widget_set_sensitive( roww->label, FALSE );
-		gtk_widget_set_sensitive( roww->command, FALSE );
-		gtk_widget_set_sensitive( check, FALSE );
-		gtk_widget_set_sensitive( clear, FALSE );
+		gtk_widget_set_sensitive(roww->label, FALSE);
+		gtk_widget_set_sensitive(roww->command, FALSE);
+		gtk_widget_set_sensitive(check, FALSE);
+		gtk_widget_set_sensitive(clear, FALSE);
 	}
 	return roww;
 }
@@ -1369,7 +1409,7 @@
 	GtkWidget	*regex;
 } TableFields;
 
-GtkWidget *build_commands_table( GeanyDocument *doc, GeanyBuildSource dst, TableData *table_data, GeanyFiletype *ft )
+GtkWidget *build_commands_table(GeanyDocument *doc, GeanyBuildSource dst, TableData *table_data, GeanyFiletype *ft)
 {
 	GtkWidget		*label, *sep, *regex, *clearicon, *clear;
 	TableFields		*fields;
@@ -1377,68 +1417,68 @@
 	gchar			**ch, *txt;
 	gint			 col, row, cmdindex, cmd;
 	
-	table = GTK_TABLE(gtk_table_new( build_items_count+12, 5, FALSE ));
-	fields = g_new0( TableFields, 1 );
-	fields->rows = g_new0( RowWidgets *, build_items_count );
-	for( ch= colheads, col=0; *ch!=NULL; ch++, col++ )
+	table = GTK_TABLE(gtk_table_new(build_items_count+12, 5, FALSE));
+	fields = g_new0(TableFields, 1);
+	fields->rows = g_new0(RowWidgets *, build_items_count);
+	for (ch= colheads, col=0; *ch!=NULL; ch++, col++)
 	{
-		label = gtk_label_new( gettext(*ch) );
-		gtk_table_attach( table, label, col, col+1, 0, 1,
-							GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+		label = gtk_label_new(gettext(*ch));
+		gtk_table_attach(table, label, col, col+1, 0, 1,
+							GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 	}
 	sep = gtk_hseparator_new();
-	gtk_table_attach( table, sep, 0, 6, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
-	if( ft!=NULL ){
-		txt = g_strdup_printf( _("%s commands"), ft->title );
+	gtk_table_attach(table, sep, 0, 6, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+	if (ft!=NULL){
+		txt = g_strdup_printf(_("%s commands"), ft->title);
 	} else
 		txt = g_strdup(_("No Filetype"));
-	label = gtk_label_new( txt );
+	label = gtk_label_new(txt);
 	g_free(txt);
-	gtk_misc_set_alignment( GTK_MISC(label), 0.0, 0.5 );
-	gtk_table_attach( table, label, 0, 6, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
-	for( row=3, cmdindex=0, cmd=0; cmd<build_groups_count[GBG_FT]; ++row, ++cmdindex, ++cmd )
-		fields->rows[cmdindex] = build_add_dialog_row( doc, table, row, dst, GBG_FT, cmd, FALSE );
+	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+	gtk_table_attach(table, label, 0, 6, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+	for (row=3, cmdindex=0, cmd=0; cmd<build_groups_count[GBG_FT]; ++row, ++cmdindex, ++cmd)
+		fields->rows[cmdindex] = build_add_dialog_row(doc, table, row, dst, GBG_FT, cmd, FALSE);
 	sep = gtk_hseparator_new();
-	gtk_table_attach( table, sep, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+	gtk_table_attach(table, sep, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 	++row;
-	label = gtk_label_new( _("Non Filetype Comamnds") );
-	gtk_misc_set_alignment( GTK_MISC(label), 0.0, 0.5 );
-	gtk_table_attach( table, label, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
-	for( ++row, cmd=0; cmd<build_groups_count[GBG_NON_FT]; ++row,++cmdindex, ++cmd )
-		fields->rows[cmdindex] = build_add_dialog_row( doc, table, row, dst, GBG_NON_FT, cmd, TRUE );
+	label = gtk_label_new(_("Non Filetype Comamnds"));
+	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+	gtk_table_attach(table, label, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+	for (++row, cmd=0; cmd<build_groups_count[GBG_NON_FT]; ++row,++cmdindex, ++cmd)
+		fields->rows[cmdindex] = build_add_dialog_row(doc, table, row, dst, GBG_NON_FT, cmd, TRUE);
 	sep = gtk_hseparator_new();
-	gtk_table_attach( table, sep, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+	gtk_table_attach(table, sep, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 	++row;
-	label = gtk_label_new( _("Execute Comamnds") );
-	gtk_misc_set_alignment( GTK_MISC(label), 0.0, 0.5 );
-	gtk_table_attach( table, label, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
-	for( ++row, cmd=0; cmd<build_groups_count[GBG_EXEC]; ++row,++cmdindex, ++cmd )
-		fields->rows[cmdindex] = build_add_dialog_row( doc, table, row, dst, GBG_EXEC, cmd, TRUE );
+	label = gtk_label_new(_("Execute Comamnds"));
+	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+	gtk_table_attach(table, label, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+	for (++row, cmd=0; cmd<build_groups_count[GBG_EXEC]; ++row,++cmdindex, ++cmd)
+		fields->rows[cmdindex] = build_add_dialog_row(doc, table, row, dst, GBG_EXEC, cmd, TRUE);
 	sep = gtk_hseparator_new();
-	gtk_table_attach( table, sep, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+	gtk_table_attach(table, sep, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 	++row;
-	label = gtk_label_new( _("Error Regular Expression") );
-	gtk_table_attach( table, label, 0, 2, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+	label = gtk_label_new(_("Error Regular Expression"));
+	gtk_table_attach(table, label, 0, 2, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 	fields->regex = gtk_entry_new();
-	gtk_table_attach( table, fields->regex, 2, 4, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
-	clearicon = gtk_image_new_from_stock( GTK_STOCK_CLEAR, GTK_ICON_SIZE_SMALL_TOOLBAR );
+	gtk_table_attach(table, fields->regex, 2, 4, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+	clearicon = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_SMALL_TOOLBAR);
 	clear = gtk_button_new();
-	gtk_button_set_image( GTK_BUTTON(clear), clearicon );
+	gtk_button_set_image(GTK_BUTTON(clear), clearicon);
 	/* TODO clear callback */
-	gtk_table_attach( table, clear, 4, 5, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+	gtk_table_attach(table, clear, 4, 5, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 	++row;
 	sep = gtk_hseparator_new();
-	gtk_table_attach( table, sep, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+	gtk_table_attach(table, sep, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 	++row;
-	label = gtk_label_new( _(
+	label = gtk_label_new(_(
 				"* Notes:\n"
 				"  In commands, %f is replaced by filename and\n"
 				"   %e is replaced by filename without extension\n"
 				"  Base executes command in base directory\n"
 				"  Non-filetype menu Item 2 opens a dialog\n"
-				"   and appends the reponse to the command" ) );
-	gtk_misc_set_alignment( GTK_MISC(label), 0.0, 0.5 );
-	gtk_table_attach( table, label, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0 );
+				"   and appends the reponse to the command"));
+	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+	gtk_table_attach(table, label, 0, 6, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
 /*	printf("%d extra rows in dialog\n", row-build_items_count); */
 	++row;
 	*table_data = fields;
@@ -1446,28 +1486,28 @@
 }
 
 /* string compare where null pointers match null or 0 length strings */
-static int stcmp( const gchar *a, const gchar *b )
+static int stcmp(const gchar *a, const gchar *b)
 {
-	if( a==NULL && b==NULL ) return 0;
-	if( a==NULL && b!=NULL ) return strlen(b);
-	if( a!=NULL && b==NULL ) return strlen(a);
-	return strcmp( a, b );
+	if (a==NULL && b==NULL) return 0;
+	if (a==NULL && b!=NULL) return strlen(b);
+	if (a!=NULL && b==NULL) return strlen(a);
+	return strcmp(a, b);
 }
 
-void free_build_fields( TableData table_data )
+void free_build_fields(TableData table_data)
 {
 	gint cmdindex;
-	for( cmdindex=0; cmdindex<build_items_count; ++cmdindex )
-		g_free( table_data->rows[cmdindex] );
-	g_free( table_data->rows );
-	g_free( table_data );
+	for (cmdindex=0; cmdindex<build_items_count; ++cmdindex)
+		g_free(table_data->rows[cmdindex]);
+	g_free(table_data->rows);
+	g_free(table_data);
 }
 
 /* sets of commands to get from the build dialog, NULL gets filetype pointer later */
 static GeanyBuildCommand **proj_cmds[GBG_COUNT]={ NULL, &non_ft_proj, &exec_proj }; /* indexed by GBG */
 static GeanyBuildCommand **pref_cmds[GBG_COUNT]={ NULL, &non_ft_pref, &exec_pref };
 
-static gboolean read_row( GeanyBuildCommand ***dstcmds, GeanyBuildSource dst, TableData table_data, gint drow, gint grp, gint cmd )
+static gboolean read_row(GeanyBuildCommand ***dstcmds, TableData table_data, gint drow, gint grp, gint cmd)
 {
 	gchar			*label, *command;
 	gboolean		 dir;
@@ -1475,22 +1515,32 @@
 	GeanyBuildSource src;
 
 	src = table_data->rows[drow]->src;
-	label = g_strdup( gtk_entry_get_text( GTK_ENTRY( table_data->rows[drow]->label ) ) );
-	command = g_strdup( gtk_entry_get_text( GTK_ENTRY( table_data->rows[drow]->command ) ) );
-	dir = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( table_data->rows[drow]->dir ) );
-	if( ( table_data->rows[drow]->cmdsrc==NULL &&
-		  ( strlen(label)>0 || strlen(command)>0  || dir ) ) ||
-		( table_data->rows[drow]->cmdsrc!=NULL &&
-		  ( stcmp( label, table_data->rows[drow]->cmdsrc->label )!=0 ||
-		    stcmp( command, table_data->rows[drow]->cmdsrc->command )!=0 ||
-		    dir != table_data->rows[drow]->cmdsrc->run_in_base_dir ) ) )
+	label = g_strdup(gtk_entry_get_text(GTK_ENTRY(table_data->rows[drow]->label)));
+	command = g_strdup(gtk_entry_get_text(GTK_ENTRY(table_data->rows[drow]->command)));
+	dir = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table_data->rows[drow]->dir));
+	if (table_data->rows[drow]->cleared)
 	{
-		if(dstcmds[grp]!=NULL)
+		if (dstcmds[grp]!=NULL)
 		{
-			if(*(dstcmds[grp])==NULL)
+			if (*(dstcmds[grp])==NULL)*(dstcmds[grp])=g_new0(GeanyBuildCommand, build_groups_count[grp]);
+			(*(dstcmds[grp]))[cmd].exists=FALSE;
+			(*(dstcmds[grp]))[cmd].changed=TRUE;
+			changed=TRUE;
+		}
+	}
+	if ((table_data->rows[drow]->cmdsrc==NULL &&                          /* originally there was no content */
+		  (strlen(label)>0 || strlen(command)>0  || dir)) ||              /* and now there is some  or */
+		(table_data->rows[drow]->cmdsrc!=NULL &&                          /* originally there was content and */
+		  (stcmp(label, table_data->rows[drow]->cmdsrc->label)!=0 ||      /* label is different or */
+		    stcmp(command, table_data->rows[drow]->cmdsrc->command)!=0 || /* command is different or */
+		    dir != table_data->rows[drow]->cmdsrc->run_in_base_dir)))     /* runinbasedir is different */
+	{
+		if (dstcmds[grp]!=NULL)
+		{
+			if (*(dstcmds[grp])==NULL)
 				*(dstcmds[grp]) = g_new0(GeanyBuildCommand, build_groups_count[grp]);
-			setptr((*(dstcmds[grp]))[cmd].label, label );
-			setptr((*(dstcmds[grp]))[cmd].command, command );
+			setptr((*(dstcmds[grp]))[cmd].label, label);
+			setptr((*(dstcmds[grp]))[cmd].command, command);
 			(*(dstcmds[grp]))[cmd].run_in_base_dir = dir;
 			(*(dstcmds[grp]))[cmd].exists = TRUE;
 			(*(dstcmds[grp]))[cmd].changed=TRUE;
@@ -1504,25 +1554,25 @@
 	return changed;
 }
 
-gboolean read_build_commands( GeanyBuildCommand ***dstcmds, GeanyBuildSource dst, TableData table_data, gint response )
+gboolean read_build_commands(GeanyBuildCommand ***dstcmds, TableData table_data, gint response)
 {
 	gint			 cmdindex, grp, cmd;
 	gboolean		 changed = FALSE;
 	
-	if( response == GTK_RESPONSE_ACCEPT )
+	if (response == GTK_RESPONSE_ACCEPT)
 	{
-		for( cmdindex=0, cmd=0; cmd<build_groups_count[GBG_FT]; ++cmdindex, ++cmd )
-			changed |= read_row( dstcmds, dst, table_data, cmdindex, GBG_FT, cmd );
-		for( cmd=0; cmd<build_groups_count[GBG_NON_FT]; ++cmdindex, ++cmd )
-			changed |= read_row( dstcmds, dst, table_data, cmdindex, GBG_NON_FT, cmd );
-		for( cmd=0; cmd<build_groups_count[GBG_EXEC]; ++cmdindex, ++cmd )
-			changed |= read_row( dstcmds, dst, table_data, cmdindex, GBG_EXEC, cmd );
+		for (cmdindex=0, cmd=0; cmd<build_groups_count[GBG_FT]; ++cmdindex, ++cmd)
+			changed |= read_row(dstcmds, table_data, cmdindex, GBG_FT, cmd);
+		for (cmd=0; cmd<build_groups_count[GBG_NON_FT]; ++cmdindex, ++cmd)
+			changed |= read_row(dstcmds, table_data, cmdindex, GBG_NON_FT, cmd);
+		for (cmd=0; cmd<build_groups_count[GBG_EXEC]; ++cmdindex, ++cmd)
+			changed |= read_row(dstcmds, table_data, cmdindex, GBG_EXEC, cmd);
 		/* regex */
 	}
 	return changed;
 }
 
-static void show_build_commands_dialog( )
+static void show_build_commands_dialog()
 {
 	GtkWidget		*dialog, *table;
 	GeanyDocument	*doc = document_get_current();
@@ -1533,20 +1583,20 @@
 
 	if (doc != NULL)
 		ft = doc->file_type;
-	if( ft!=NULL )pref_cmds[GBG_FT]= &(ft->homefilecmds);
+	if (ft!=NULL)pref_cmds[GBG_FT]= &(ft->homefilecmds);
 	else pref_cmds[GBG_FT] = NULL;
 	dialog = gtk_dialog_new_with_buttons(title, GTK_WINDOW(main_widgets.window),
 										GTK_DIALOG_DESTROY_WITH_PARENT,
 										GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 										GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
-	table = build_commands_table( doc, BCS_PREF, &table_data, ft );
-	gtk_box_pack_start( GTK_BOX( GTK_DIALOG(dialog)->vbox ), table, TRUE, TRUE, 0 ); 
+	table = build_commands_table(doc, BCS_PREF, &table_data, ft);
+	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), table, TRUE, TRUE, 0); 
 	gtk_widget_show_all(dialog);
 	/* run modally to prevent user changing idx filetype */
 	response = gtk_dialog_run(GTK_DIALOG(dialog));
-	read_build_commands( pref_cmds, BCS_PREF, table_data, response );
+	read_build_commands(pref_cmds, table_data, response);
 	build_menu_update(doc);
-	free_build_fields( table_data );
+	free_build_fields(table_data);
 	gtk_widget_destroy(dialog);
 }
 
@@ -1579,37 +1629,37 @@
 #define set_key_cmd(key,cmd) (key[prefixlen+3]=cmd[0], key[prefixlen+4]=cmd[1])
 #define set_key_fld(key,fld) (key[prefixlen+6]=fld[0], key[prefixlen+7]=fld[1])
 
-static void load_build_menu_grp( GKeyFile *config, GeanyBuildCommand **dst, gint grp, gchar *prefix, gboolean loc )
+static void load_build_menu_grp(GKeyFile *config, GeanyBuildCommand **dst, gint grp, gchar *prefix, gboolean loc)
 {
 	gint cmd, prefixlen; /* NOTE prefixlen used in macros above */
 	GeanyBuildCommand *dstcmd;
 	gchar *key;
 	static gchar cmdbuf[3]="  ";
 	
-	if(*dst==NULL)*dst = g_new0( GeanyBuildCommand, build_groups_count[grp] );
+	if (*dst==NULL)*dst = g_new0(GeanyBuildCommand, build_groups_count[grp]);
 	dstcmd = *dst;
 	prefixlen = prefix==NULL?0:strlen(prefix);
-	key = g_strconcat( prefix==NULL?"":prefix, fixedkey, NULL );
-	for( cmd=0; cmd<build_groups_count[grp]; ++cmd )
+	key = g_strconcat(prefix==NULL?"":prefix, fixedkey, NULL);
+	for (cmd=0; cmd<build_groups_count[grp]; ++cmd)
 	{
 		gchar *label;
-		if(cmd<0 || cmd>=100)return; /* ensure no buffer overflow */
-		sprintf(cmdbuf, "%02d", cmd );
+		if (cmd<0 || cmd>=100)return; /* ensure no buffer overflow */
+		sprintf(cmdbuf, "%02d", cmd);
 		set_key_grp(key, groups[grp]);
 		set_key_cmd(key, cmdbuf);
 		set_key_fld(key, "LB");
-		if( loc )
-			label = g_key_file_get_locale_string( config, build_grp_name, key, NULL, NULL );
+		if (loc)
+			label = g_key_file_get_locale_string(config, build_grp_name, key, NULL, NULL);
 		else
-			label = g_key_file_get_string( config, build_grp_name, key, NULL );
-		if( label!=NULL )
+			label = g_key_file_get_string(config, build_grp_name, key, NULL);
+		if (label!=NULL)
 		{
 			dstcmd[cmd].exists = TRUE;
-			setptr( dstcmd[cmd].label, label);
+			setptr(dstcmd[cmd].label, label);
 			set_key_fld(key,"CM");
-			setptr(dstcmd[cmd].command, g_key_file_get_string( config, build_grp_name, key, NULL ));
+			setptr(dstcmd[cmd].command, g_key_file_get_string(config, build_grp_name, key, NULL));
 			set_key_fld(key,"BD");
-			dstcmd[cmd].run_in_base_dir = g_key_file_get_boolean( config, build_grp_name, key, NULL );
+			dstcmd[cmd].run_in_base_dir = g_key_file_get_boolean(config, build_grp_name, key, NULL);
 		}
 		else dstcmd[cmd].exists = FALSE;
 	}
@@ -1618,54 +1668,54 @@
 
 /* for the specified source load new format build menu items or try to make some sense of 
  * old format setings, not done perfectly but better than ignoring them */
-void load_build_menu( GKeyFile *config, GeanyBuildSource src, gpointer p )
+void load_build_menu(GKeyFile *config, GeanyBuildSource src, gpointer p)
 {
 /*	gint grp;*/
 	GeanyFiletype 	*ft;
 	GeanyProject  	*pj;
 	gchar 			**ftlist;
 
-	if( g_key_file_has_group( config, build_grp_name ) )
+	if (g_key_file_has_group(config, build_grp_name))
 	{
 		switch(src)
 		{
 			case BCS_FT:
 				ft = (GeanyFiletype*)p;
-				if(ft==NULL)return;
-				load_build_menu_grp( config, &(ft->filecmds), GBG_FT, NULL, TRUE );
-				load_build_menu_grp( config, &(ft->ftdefcmds), GBG_NON_FT, NULL, TRUE );
-				load_build_menu_grp( config, &(ft->execcmds), GBG_EXEC, NULL, TRUE );
+				if (ft==NULL)return;
+				load_build_menu_grp(config, &(ft->filecmds), GBG_FT, NULL, TRUE);
+				load_build_menu_grp(config, &(ft->ftdefcmds), GBG_NON_FT, NULL, TRUE);
+				load_build_menu_grp(config, &(ft->execcmds), GBG_EXEC, NULL, TRUE);
 				break;
 			case BCS_HOME_FT:
 				ft = (GeanyFiletype*)p;
-				if(ft==NULL)return;
-				load_build_menu_grp( config, &(ft->homefilecmds), GBG_FT, NULL, FALSE );
-				load_build_menu_grp( config, &(ft->homeexeccmds), GBG_EXEC, NULL, FALSE );
+				if (ft==NULL)return;
+				load_build_menu_grp(config, &(ft->homefilecmds), GBG_FT, NULL, FALSE);
+				load_build_menu_grp(config, &(ft->homeexeccmds), GBG_EXEC, NULL, FALSE);
 				break;
 			case BCS_PREF:
-				load_build_menu_grp( config, &non_ft_pref, GBG_NON_FT, NULL, FALSE );
-				load_build_menu_grp( config, &exec_pref, GBG_EXEC, NULL, FALSE );
+				load_build_menu_grp(config, &non_ft_pref, GBG_NON_FT, NULL, FALSE);
+				load_build_menu_grp(config, &exec_pref, GBG_EXEC, NULL, FALSE);
 				break;
 			case BCS_PROJ:
-				load_build_menu_grp( config, &non_ft_proj, GBG_NON_FT, NULL, FALSE );
-				load_build_menu_grp( config, &exec_proj, GBG_EXEC, NULL, FALSE );
+				load_build_menu_grp(config, &non_ft_proj, GBG_NON_FT, NULL, FALSE);
+				load_build_menu_grp(config, &exec_proj, GBG_EXEC, NULL, FALSE);
 				pj = (GeanyProject*)p;
-				if(p==NULL)return;
-				ftlist = g_key_file_get_string_list( config, build_grp_name, "filetypes", NULL, NULL );
-				if( ftlist!=NULL )
+				if (p==NULL)return;
+				ftlist = g_key_file_get_string_list(config, build_grp_name, "filetypes", NULL, NULL);
+				if (ftlist!=NULL)
 				{
 					gchar **ftname;
 					GeanyFiletype *ft;
-					if(pj->build_filetypes_list==NULL) pj->build_filetypes_list = g_ptr_array_new();
-					g_ptr_array_set_size( pj->build_filetypes_list, 0 );
-					for( ftname=ftlist; ftname!=NULL; ++ftname )
+					if (pj->build_filetypes_list==NULL) pj->build_filetypes_list = g_ptr_array_new();
+					g_ptr_array_set_size(pj->build_filetypes_list, 0);
+					for (ftname=ftlist; ftname!=NULL; ++ftname)
 					{
 						ft=filetypes_lookup_by_name(*ftname);
-						if(ft!=NULL)
+						if (ft!=NULL)
 						{
-							g_ptr_array_add( pj->build_filetypes_list, ft );
-							load_build_menu_grp( config, &(ft->projfilecmds), GBG_FT, *ftname, FALSE );
-							load_build_menu_grp( config, &(ft->projexeccmds), GBG_EXEC, *ftname, FALSE );
+							g_ptr_array_add(pj->build_filetypes_list, ft);
+							load_build_menu_grp(config, &(ft->projfilecmds), GBG_FT, *ftname, FALSE);
+							load_build_menu_grp(config, &(ft->projexeccmds), GBG_EXEC, *ftname, FALSE);
 						}
 					}
 					g_free(ftlist);
@@ -1684,51 +1734,51 @@
 		{
 			case BCS_FT:
 				ft = (GeanyFiletype*)p;
-				if(ft->filecmds==NULL)ft->filecmds = g_new0( GeanyBuildCommand, build_groups_count[GBG_FT] );
-				value = g_key_file_get_string( config, "build-settings", "compiler", NULL );
-				if( value != NULL )
+				if (ft->filecmds==NULL)ft->filecmds = g_new0(GeanyBuildCommand, build_groups_count[GBG_FT]);
+				value = g_key_file_get_string(config, "build_settings", "compiler", NULL);
+				if (value != NULL)
 				{
 					ft->filecmds[GBO_TO_CMD(GBO_COMPILE)].exists = TRUE;
-					ft->filecmds[GBO_TO_CMD(GBO_COMPILE)].label = g_strdup(_("Compile"));
+					ft->filecmds[GBO_TO_CMD(GBO_COMPILE)].label = g_strdup(_("_Compile"));
 					ft->filecmds[GBO_TO_CMD(GBO_COMPILE)].command = value;
 				}
-				value = g_key_file_get_string( config, "build-settings", "linker", NULL );
-				if( value != NULL )
+				value = g_key_file_get_string(config, "build_settings", "linker", NULL);
+				if (value != NULL)
 				{
 					ft->filecmds[GBO_TO_CMD(GBO_BUILD)].exists = TRUE;
-					ft->filecmds[GBO_TO_CMD(GBO_BUILD)].label = g_strdup(_("Build"));
+					ft->filecmds[GBO_TO_CMD(GBO_BUILD)].label = g_strdup(_("_Build"));
 					ft->filecmds[GBO_TO_CMD(GBO_BUILD)].command = value;
 				}
-				if(ft->execcmds==NULL)ft->execcmds = g_new0( GeanyBuildCommand, build_groups_count[GBG_EXEC] );
-				value = g_key_file_get_string( config, "build-settings", "run_cmd", NULL );
-				if( value != NULL )
+				if (ft->execcmds==NULL)ft->execcmds = g_new0(GeanyBuildCommand, build_groups_count[GBG_EXEC]);
+				value = g_key_file_get_string(config, "build_settings", "run_cmd", NULL);
+				if (value != NULL)
 				{
-					ft->filecmds[GBO_TO_CMD(GBO_EXEC)].exists = TRUE;
-					ft->filecmds[GBO_TO_CMD(GBO_EXEC)].label = g_strdup(_("Execute"));
-					ft->filecmds[GBO_TO_CMD(GBO_EXEC)].command = value;
+					ft->execcmds[GBO_TO_CMD(GBO_EXEC)].exists = TRUE;
+					ft->execcmds[GBO_TO_CMD(GBO_EXEC)].label = g_strdup(_("_Execute"));
+					ft->execcmds[GBO_TO_CMD(GBO_EXEC)].command = value;
 				}
 				break;
 			case BCS_PROJ:
-				if(non_ft_proj==NULL)non_ft_proj = g_new0( GeanyBuildCommand, build_groups_count[GBG_NON_FT] );
-				bvalue = g_key_file_get_boolean( config, "project", "make_in_base_path", NULL );
+				if (non_ft_proj==NULL)non_ft_proj = g_new0(GeanyBuildCommand, build_groups_count[GBG_NON_FT]);
+				bvalue = g_key_file_get_boolean(config, "project", "make_in_base_path", NULL);
 				non_ft_proj[GBO_TO_CMD(GBO_MAKE_ALL)].run_in_base_dir = bvalue;
 				non_ft_proj[GBO_TO_CMD(GBO_MAKE_CUSTOM)].run_in_base_dir = bvalue;
 				non_ft_proj[GBO_TO_CMD(GBO_MAKE_OBJECT)].run_in_base_dir = bvalue;
-				for( cmd=GBO_TO_CMD(GBO_MAKE_OBJECT)+1; cmd<build_groups_count[GBG_NON_FT]; ++cmd )
+				for (cmd=GBO_TO_CMD(GBO_MAKE_OBJECT)+1; cmd<build_groups_count[GBG_NON_FT]; ++cmd)
 					non_ft_proj[cmd].run_in_base_dir = bvalue;
-				value = g_key_file_get_string( config, "project", "run_cmd", NULL );
-				if( value !=NULL )
+				value = g_key_file_get_string(config, "project", "run_cmd", NULL);
+				if (value !=NULL)
 				{
-					if(exec_proj==NULL)exec_proj = g_new0( GeanyBuildCommand, build_groups_count[GBG_EXEC] );
+					if (exec_proj==NULL)exec_proj = g_new0(GeanyBuildCommand, build_groups_count[GBG_EXEC]);
 					exec_proj[GBO_TO_CMD(GBO_EXEC)].exists = TRUE;
 					exec_proj[GBO_TO_CMD(GBO_EXEC)].label = g_strdup(_("Execute"));
 					exec_proj[GBO_TO_CMD(GBO_EXEC)].command = value;
 				}
 				break;
 			case BCS_PREF:
-				if(non_ft_pref==NULL)non_ft_pref = g_new0( GeanyBuildCommand, build_groups_count[GBG_NON_FT] );
-				value = g_key_file_get_string( config, "tools", "make_cmd", NULL );
-				if( value!=NULL )
+				if (non_ft_pref==NULL)non_ft_pref = g_new0(GeanyBuildCommand, build_groups_count[GBG_NON_FT]);
+				value = g_key_file_get_string(config, "tools", "make_cmd", NULL);
+				if (value!=NULL)
 				{
 					non_ft_pref[GBO_TO_CMD(GBO_MAKE_ALL)].exists = TRUE;
 					non_ft_pref[GBO_TO_CMD(GBO_MAKE_ALL)].label = g_strdup(_("_Make All"));
@@ -1747,39 +1797,39 @@
 	}
 }
 
-static void save_build_menu_grp( GKeyFile *config, GeanyBuildCommand *src, gint grp, gchar *prefix )
+static void save_build_menu_grp(GKeyFile *config, GeanyBuildCommand *src, gint grp, gchar *prefix)
 {
 	gint cmd, prefixlen; /* NOTE prefixlen used in macros above */
 	gchar *key;
 	
-	if(src==NULL)return;
+	if (src==NULL)return;
 	prefixlen = prefix==NULL?0:strlen(prefix);
-	key = g_strconcat( prefix==NULL?"":prefix, fixedkey, NULL );
-	for( cmd=0; cmd<build_groups_count[grp]; ++cmd )
+	key = g_strconcat(prefix==NULL?"":prefix, fixedkey, NULL);
+	for (cmd=0; cmd<build_groups_count[grp]; ++cmd)
 	{
-		if( src[cmd].changed )
+		if (src[cmd].changed)
 		{
 			static gchar cmdbuf[3]="  ";
-			if(cmd<0 || cmd>=100)return; /* ensure no buffer overflow */
-			sprintf(cmdbuf, "%02d", cmd );
+			if (cmd<0 || cmd>=100)return; /* ensure no buffer overflow */
+			sprintf(cmdbuf, "%02d", cmd);
 			set_key_grp(key, groups[grp]);
 			set_key_cmd(key, cmdbuf);
 			set_key_fld(key, "LB");
-			if( src[cmd].exists )
+			if (src[cmd].exists)
 			{
-				g_key_file_set_string( config, build_grp_name, key, src[cmd].label );
+				g_key_file_set_string(config, build_grp_name, key, src[cmd].label);
 				set_key_fld(key,"CM");
-				g_key_file_set_string( config, build_grp_name, key, src[cmd].command );
+				g_key_file_set_string(config, build_grp_name, key, src[cmd].command);
 				set_key_fld(key,"BD");
-				g_key_file_set_boolean( config, build_grp_name, key, src[cmd].run_in_base_dir );
+				g_key_file_set_boolean(config, build_grp_name, key, src[cmd].run_in_base_dir);
 			}
 			else
 			{
-				g_key_file_remove_key( config, build_grp_name, key, NULL );
+				g_key_file_remove_key(config, build_grp_name, key, NULL);
 				set_key_fld(key,"CM");
-				g_key_file_remove_key( config, build_grp_name, key, NULL );
+				g_key_file_remove_key(config, build_grp_name, key, NULL);
 				set_key_fld(key,"BD");
-				g_key_file_remove_key( config, build_grp_name, key, NULL );
+				g_key_file_remove_key(config, build_grp_name, key, NULL);
 			}
 		}
 	}
@@ -1787,15 +1837,15 @@
 	
 }
 
-static void foreach_project_filetype( gpointer data, gpointer user_data )
+static void foreach_project_filetype(gpointer data, gpointer user_data)
 {
 	GeanyFiletype *ft = (GeanyFiletype*)data;
 	GKeyFile *config = (GKeyFile*)user_data;
-	save_build_menu_grp( config, ft->projfilecmds, GBG_FT, ft->name );
-	save_build_menu_grp( config, ft->projexeccmds, GBG_EXEC, ft->name );
+	save_build_menu_grp(config, ft->projfilecmds, GBG_FT, ft->name);
+	save_build_menu_grp(config, ft->projexeccmds, GBG_EXEC, ft->name);
 }
 
-void save_build_menu( GKeyFile *config, gpointer ptr, GeanyBuildSource src )
+void save_build_menu(GKeyFile *config, gpointer ptr, GeanyBuildSource src)
 {
 	GeanyFiletype *ft;
 	GeanyProject  *pj;
@@ -1803,31 +1853,31 @@
 	{
 		case BCS_HOME_FT:
 			ft = (GeanyFiletype*)ptr;
-			if(ft==NULL)return;
-			save_build_menu_grp( config, ft->homefilecmds, GBG_FT, NULL );
-			save_build_menu_grp( config, ft->homeexeccmds, GBG_EXEC, NULL );
+			if (ft==NULL)return;
+			save_build_menu_grp(config, ft->homefilecmds, GBG_FT, NULL);
+			save_build_menu_grp(config, ft->homeexeccmds, GBG_EXEC, NULL);
 			break;
 		case BCS_PREF:
-			save_build_menu_grp( config, non_ft_pref, GBG_NON_FT, NULL );
-			save_build_menu_grp( config, exec_pref, GBG_EXEC, NULL );
+			save_build_menu_grp(config, non_ft_pref, GBG_NON_FT, NULL);
+			save_build_menu_grp(config, exec_pref, GBG_EXEC, NULL);
 			break;
 		case BCS_PROJ:
 			pj = (GeanyProject*)ptr;
-			save_build_menu_grp( config, non_ft_proj, GBG_NON_FT, NULL );
-			save_build_menu_grp( config, exec_proj, GBG_EXEC, NULL );
-			g_ptr_array_foreach( pj->build_filetypes_list, foreach_project_filetype, (gpointer)config );
+			save_build_menu_grp(config, non_ft_proj, GBG_NON_FT, NULL);
+			save_build_menu_grp(config, exec_proj, GBG_EXEC, NULL);
+			g_ptr_array_foreach(pj->build_filetypes_list, foreach_project_filetype, (gpointer)config);
 			break;
 		default: /* defaults and BCS_FT can't save */
 			break;
 	}
 }
 
-void set_build_grp_count( GeanyBuildGroup grp, guint count )
+void set_build_grp_count(GeanyBuildGroup grp, guint count)
 {
 	gint i, sum;
-	if( count>build_groups_count[grp] )
+	if (count>build_groups_count[grp])
 		build_groups_count[grp]=count;
-	for( i=0, sum=0; i<GBG_COUNT; ++i )sum+=build_groups_count[i];
+	for (i=0, sum=0; i<GBG_COUNT; ++i)sum+=build_groups_count[i];
 	build_items_count = sum;
 }
 
@@ -1850,10 +1900,10 @@
 	GtkWidget *toolmenu;
 	gint cmdindex, defindex;
 
-	ft_def = g_new0( GeanyBuildCommand, build_groups_count[GBG_FT]);
-	non_ft_def = g_new0( GeanyBuildCommand, build_groups_count[GBG_NON_FT]);
-	exec_def = g_new0( GeanyBuildCommand, build_groups_count[GBG_EXEC]);
-	for( cmdindex=0; default_cmds[cmdindex].label!=NULL; ++cmdindex )
+	ft_def = g_new0(GeanyBuildCommand, build_groups_count[GBG_FT]);
+	non_ft_def = g_new0(GeanyBuildCommand, build_groups_count[GBG_NON_FT]);
+	exec_def = g_new0(GeanyBuildCommand, build_groups_count[GBG_EXEC]);
+	for (cmdindex=0; default_cmds[cmdindex].label!=NULL; ++cmdindex)
 	{
 		GeanyBuildCommand *cmd = &((*(default_cmds[cmdindex].ptr))[ default_cmds[cmdindex].index ]);
 		cmd->exists = TRUE;

Modified: branches/build-system/src/build.h
===================================================================
--- branches/build-system/src/build.h	2009-07-09 15:25:26 UTC (rev 3946)
+++ branches/build-system/src/build.h	2009-07-10 09:00:37 UTC (rev 3947)
@@ -118,7 +118,7 @@
 /* menu configuration dialog functions */
 GtkWidget *build_commands_table( GeanyDocument *doc, GeanyBuildSource dst, TableData *data, GeanyFiletype *ft );
 
-gboolean read_build_commands( GeanyBuildCommand ***dstcmd, GeanyBuildSource dst, TableData data, gint response );
+gboolean read_build_commands( GeanyBuildCommand ***dstcmd, TableData data, gint response );
 
 void free_build_data( TableData data );
 

Modified: branches/build-system/src/filetypes.c
===================================================================
--- branches/build-system/src/filetypes.c	2009-07-09 15:25:26 UTC (rev 3946)
+++ branches/build-system/src/filetypes.c	2009-07-10 09:00:37 UTC (rev 3947)
@@ -1253,9 +1253,9 @@
 		ext = filetypes_get_conf_extension(i);
 		fname = g_strconcat(conf_prefix, ext, NULL);
 		g_free(ext);
-
 		config_home = g_key_file_new();
 		g_key_file_load_from_file(config_home, fname, G_KEY_FILE_KEEP_COMMENTS, NULL);
+		save_build_menu(config_home, (gpointer)(filetypes[i]), BCS_HOME_FT);
 		data = g_key_file_to_data(config_home, NULL, NULL);
 		utils_write_file(fname, data);
 		g_free(data);

Modified: branches/build-system/src/project.c
===================================================================
--- branches/build-system/src/project.c	2009-07-09 15:25:26 UTC (rev 3946)
+++ branches/build-system/src/project.c	2009-07-10 09:00:37 UTC (rev 3947)
@@ -762,7 +762,7 @@
 		}
 		rbc_array[GBG_NON_FT] = &non_ft_proj;
 		rbc_array[GBG_EXEC] = &exec_proj;
-		read_build_commands( rbc_array, BCS_PROJ, e->build_properties,  GTK_RESPONSE_ACCEPT );
+		read_build_commands( rbc_array, e->build_properties,  GTK_RESPONSE_ACCEPT );
 		if(ft!=NULL&&ft->projfilecmds!=oldvalue && ft->project_list_entry<0)
 		{
 			ft->project_list_entry = p->build_filetypes_list->len; 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list