SF.net SVN: geany:[5077] branches/bs2

elextr at users.sourceforge.net elextr at xxxxx
Thu Jul 1 12:08:38 UTC 2010


Revision: 5077
          http://geany.svn.sourceforge.net/geany/?rev=5077&view=rev
Author:   elextr
Date:     2010-07-01 12:08:38 +0000 (Thu, 01 Jul 2010)

Log Message:
-----------
   Add build config edit subdialog with extra fields.
   Change arrays to named struct fields.

Modified Paths:
--------------
    branches/bs2/ChangeLog
    branches/bs2/src/build.c
    branches/bs2/src/build.h

Modified: branches/bs2/ChangeLog
===================================================================
--- branches/bs2/ChangeLog	2010-07-01 11:49:30 UTC (rev 5076)
+++ branches/bs2/ChangeLog	2010-07-01 12:08:38 UTC (rev 5077)
@@ -1,3 +1,10 @@
+2010-07-01  Lex Trotman  <lex at linux-c6rk>
+
+ * src/build.c, src/build.h
+   Add build config edit subdialog with extra fields.
+   Change arrays to named struct fields.
+
+
 2010-06-29  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
 
  * src/ui_utils.c, THANKS, doc/geany.txt, doc/geany.html:

Modified: branches/bs2/src/build.c
===================================================================
--- branches/bs2/src/build.c	2010-07-01 11:49:30 UTC (rev 5076)
+++ branches/bs2/src/build.c	2010-07-01 12:08:38 UTC (rev 5077)
@@ -145,7 +145,7 @@
 			kb->key, kb->mods, GTK_ACCEL_VISIBLE);
 }
 
-
+#if 0
 /* convenience routines to access parts of GeanyBuildCommand */
 static gchar *id_to_str(GeanyBuildCommand *bc, gint id)
 {
@@ -176,7 +176,7 @@
 	[GEANY_BC_COMMAND] = "CM",
 	[GEANY_BC_WORKING_DIR] = "WD"
 };
-
+#endif
 /*-----------------------------------------------------
  *
  * Execute commands and handle results
@@ -196,102 +196,11 @@
 /* project non-fileregex string */
 static gchar *regex_proj = NULL;
 
-/* control if build commands are printed by get_build_cmd, for debug purposes only*/
-#ifndef PRINTBUILDCMDS
-#define PRINTBUILDCMDS FALSE
-#endif
-static gboolean printbuildcmds = PRINTBUILDCMDS;
-
-
-/* for debug only, print the commands structures in priority order */
-static void printfcmds(void)
-{
-	GeanyBuildCommand **cl[GEANY_GBG_COUNT][GEANY_BCS_COUNT] = {
-		/* GEANY_BCS_DEF, GEANY_BCS_FT, GEANY_BCS_HOME_FT, GEANY_BCS_PREF,
-		 * GEANY_BCS_FT_PROJ, GEANY_BCS_PROJ */
-		{ &ft_def, NULL, NULL, NULL, NULL, NULL },
-		{ &non_ft_def, NULL, NULL, &non_ft_pref, NULL, &non_ft_proj },
-		{ &exec_def, NULL, NULL, &exec_pref, NULL, &exec_proj }
-	};
-	GeanyFiletype *ft = NULL;
-	GeanyDocument *doc;
-	gint i, j, k, l, m;
-	enum GeanyBuildCmdEntries n;
-	gint cc[GEANY_BCS_COUNT];
-	gchar c;
-
-	doc = document_get_current();
-	if (doc != NULL)
-		ft = doc->file_type;
-	if (ft != NULL)
-	{
-		printf("filetype %s\n",ft->name);
-		cl[GEANY_GBG_FT][GEANY_BCS_FT] = &(ft->filecmds);
-		cl[GEANY_GBG_FT][GEANY_BCS_HOME_FT] = &(ft->homefilecmds);
-		cl[GEANY_GBG_FT][GEANY_BCS_PROJ] = &(ft->projfilecmds);
-		cl[GEANY_GBG_NON_FT][GEANY_BCS_FT] = &(ft->ftdefcmds);
-		cl[GEANY_GBG_EXEC][GEANY_BCS_FT] = &(ft->execcmds);
-		cl[GEANY_GBG_EXEC][GEANY_BCS_HOME_FT] = &(ft->homeexeccmds);
-		cl[GEANY_GBG_EXEC][GEANY_BCS_PROJ_FT] = &(ft->projexeccmds);
-	}
-	for (i = 0; i < GEANY_BCS_COUNT; ++i)
-	{
-		m = 1;
-		for (j = 0; j < GEANY_GBG_COUNT; ++j)
-		{
-			for (k = 0; k < build_groups_count[j]; ++k)
-				if (cl[j][i] != NULL && *(cl[j][i]) != NULL && (*(cl[j][i]))[k].exists)
-				{
-					for (n = 0; n < GEANY_BC_CMDENTRIES_COUNT; n++)
-					{
-						if ((*(cl[j][i]))[k].entries[n] != NULL &&
-							(l = strlen((*(cl[j][i]))[k].entries[n])) > m)
-						{
-							m = l;
-						}
-					}
-				}
-		}
-		cc[i] = m;
-	}
-	for (i = 0; i < GEANY_GBG_COUNT; ++i)
-	{
-		for (k = 0; k < build_groups_count[i]; ++k)
-		{
-			for (l = 0; l < 2; ++l)
-			{
-				c = ' ';
-				for (j = 0; j < GEANY_BCS_COUNT; ++j)
-				{
-					if (cl[i][j] != NULL && *(cl[i][j]) != NULL && (*(cl[i][j]))[k].exists)
-					{
-						for (n = 0; n < GEANY_BC_CMDENTRIES_COUNT; n++)
-						{
-							if ((*(cl[i][j]))[k].entries[i] != NULL)
-								printf("%c %*.*s",c,cc[j],cc[j],(*(cl[i][j]))[k].entries[i]);
-							else
-								printf("%c %*.*s",c,cc[j],cc[j]," ");
-						}
-					}
-					else
-						printf("%c %*.*s",c,cc[j],cc[j]," ");
-					c = ',';
-				}
-				printf("\n");
-			}
-		}
-		printf("\n");
-	}
-}
-
-
 /* macros to save typing and make the logic visible */
 #define return_cmd_if(src, cmds)\
 	if (cmds != NULL && cmds[cmdindex].exists && below>src)\
 	{ \
 		*fr=src; \
-		if (printbuildcmds) \
-			printf("cmd[%d,%d]=%d\n",cmdgrp,cmdindex,src); \
 		return &(cmds[cmdindex]); \
 	}
 
@@ -300,8 +209,6 @@
 		&& ft->cmds[cmdindex].exists && below>src)\
 		{ \
 			*fr=src; \
-			if (printbuildcmds) \
-				printf("cmd[%d,%d]=%d\n",cmdgrp,cmdindex,src); \
 			return &(ft->cmds[cmdindex]); \
 		}
 
@@ -314,8 +221,6 @@
 	GeanyFiletype *ft = NULL;
 	gint sink, *fr = &sink;
 
-	if (printbuildcmds)
-		printfcmds();
 	if (cmdgrp >= GEANY_GBG_COUNT)
 		return NULL;
 	if (from != NULL)
@@ -775,8 +680,8 @@
 	have_project = project != NULL;
 	cmd = get_build_cmd(doc, GEANY_GBG_EXEC, cmdindex, NULL);
 
-	cmd_string = build_replace_placeholder(doc, buildcmd_cmd(cmd));
-	cmd_working_dir =  buildcmd_working_dir(cmd);
+	cmd_string = build_replace_placeholder(doc, cmd->command);
+	cmd_working_dir =  cmd->wd;
 	if (! NZV(cmd_working_dir))
 		cmd_working_dir = "%d";
 	working_dir = build_replace_placeholder(doc, cmd_working_dir); /* in utf-8 */
@@ -1195,7 +1100,7 @@
 	if (buildcmd == NULL)
 		return;
 
-	cmdstr = buildcmd_cmd(buildcmd);
+	cmdstr = buildcmd->command;
 
 	if (cmd_cat != NULL)
 	{
@@ -1207,7 +1112,7 @@
 	else
 		full_command = cmdstr;
 
-	dir = build_replace_placeholder(doc, buildcmd_working_dir(buildcmd));
+	dir = build_replace_placeholder(doc, buildcmd->wd);
 	subs_command = build_replace_placeholder(doc, full_command);
 	build_info.grp = grp;
 	build_info.cmd = cmd;
@@ -1271,7 +1176,7 @@
 			return;
 		}
 		bc = get_build_cmd(doc, grp, cmd, NULL);
-		if (bc != NULL && strcmp(buildcmd_cmd(bc), "builtin") == 0)
+		if (bc != NULL && strcmp(bc->command, "builtin") == 0)
 		{
 			gchar *uri;
 			if (doc == NULL)
@@ -1406,14 +1311,14 @@
 			for (j = bs->build_cmd; j < build_groups_count[grp]; ++j)
 			{
 				GeanyBuildCommand *bc = get_build_cmd(NULL, grp, j, NULL);
-				const gchar *lbl = (bc == NULL) ? "" : buildcmd_label(bc);
+				const gchar *lbl = (bc == NULL) ? "" : bc->label;
 				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);
-			const gchar *lbl = (bc == NULL) ? "" : buildcmd_label(bc);
+			const gchar *lbl = (bc == NULL) ? "" : bc->label;
 			create_build_menu_item(menu, keygroup, accel_group, bs, lbl, bs->build_grp, bs->build_cmd);
 		}
 	}
@@ -1502,7 +1407,7 @@
 					const gchar *label;
 					bc = get_build_cmd(doc, grp, cmd, NULL);
 					if (bc)
-						label = buildcmd_label(bc);
+						label = bc->label;
 					else
 						label = NULL;
 
@@ -1722,7 +1627,9 @@
  *-------------------------------------------------------*/
 typedef struct RowWidgets
 {
-	GtkWidget *entries[GEANY_BC_CMDENTRIES_COUNT];
+	GtkWidget *label;
+	GtkWidget *command;
+	GtkWidget *wd;
 	GeanyBuildSource src;
 	GeanyBuildSource dst;
 	GeanyBuildCommand *cmdsrc;
@@ -1730,52 +1637,46 @@
 	gint cmd;
 	gboolean cleared;
 	gboolean used_dst;
+	gboolean use_terminal;
+	gboolean save_all;
 } RowWidgets;
 
 static GdkColor *insensitive_color;
+static const guint entry_x_padding = 3;
+static const guint entry_y_padding = 0;
 
 static void set_row_color(RowWidgets *r, GdkColor *color )
 {
-	enum GeanyBuildCmdEntries i;
-
-	for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-		gtk_widget_modify_text(r->entries[i], GTK_STATE_NORMAL, color);
+	gtk_widget_modify_text(r->label, GTK_STATE_NORMAL, color);
+	gtk_widget_modify_text(r->command, GTK_STATE_NORMAL, color);
+	gtk_widget_modify_text(r->wd, GTK_STATE_NORMAL, color);
 };
 
 
-static void set_build_command_entry_text(GtkWidget *wid, const gchar *text)
-{
-	if (GTK_IS_BUTTON(wid))
-		gtk_button_set_label(GTK_BUTTON(wid), text);
-	else
-		gtk_entry_set_text(GTK_ENTRY(wid), text);
-}
-
-
 static void on_clear_dialog_row(GtkWidget *unused, gpointer user_data)
 {
 	RowWidgets *r = (RowWidgets*)user_data;
 	gint src;
-	enum GeanyBuildCmdEntries i;
 	GeanyBuildCommand *bc = get_next_build_cmd(NULL, r->grp, r->cmd, r->dst, &src);
 
 	if (bc != NULL)
 	{
 		r->cmdsrc = bc;
 		r->src = src;
-		for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-		{
-			set_build_command_entry_text(r->entries[i],
-				id_to_str(bc,i) != NULL ? id_to_str(bc,i) : "");
-		}
+		gtk_label_set_text(GTK_LABEL(r->label), bc->label != NULL ? bc->label : "");
+		gtk_entry_set_text(GTK_ENTRY(r->command), bc->command != NULL ? bc->command : "");
+		gtk_entry_set_text(GTK_ENTRY(r->wd), bc->wd != NULL ? bc->wd : "" );
+		r->use_terminal = bc->use_terminal;
+		r->save_all = bc->save_all;
 	}
 	else
 	{
 		r->cmdsrc = NULL;
-		for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-		{
-			set_build_command_entry_text(r->entries[i], "");
-		}
+		gtk_label_set_text(GTK_LABEL(r->label), "");
+		gtk_entry_set_text(GTK_ENTRY(r->command), "");
+		gtk_entry_set_text(GTK_ENTRY(r->wd), "");
+		r->use_terminal = TRUE;
+		r->save_all = FALSE;
 	}
 	r->used_dst = FALSE;
 	set_row_color(r, insensitive_color);
@@ -1788,7 +1689,7 @@
 	gtk_entry_set_text(regex,"");
 }
 
-
+#if 0
 static void on_label_button_clicked(GtkWidget *wid, gpointer user_data)
 {
 	RowWidgets *r = (RowWidgets*)user_data;
@@ -1800,8 +1701,68 @@
 	r->used_dst = TRUE;
 	set_row_color(r, NULL);
 }
+#endif
 
 
+
+static void on_edit_row_clicked(GtkWidget *unused, gpointer user_data)
+{
+	/* Structure to save edit dialog widgets so it doesn't get re-made each use */
+	static struct EditDialogWidgets{
+		GtkWidget *dialog, *table, *label, *command, *wd, *use_term, *save_all;
+	} *dw = NULL;
+	GtkWidget *contents, *lb;
+	RowWidgets *r = (RowWidgets *)user_data;
+	gint response;
+	if (dw == NULL)
+	{
+		dw = g_new0(struct EditDialogWidgets, 1);
+		dw->dialog = gtk_dialog_new_with_buttons(_("Edit Build Command"), NULL,
+						GTK_DIALOG_MODAL,
+						GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+						GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+						NULL);
+		dw->table = gtk_table_new(5, 2, FALSE);
+		lb = gtk_label_new(_("Menu Item Label:"));
+		gtk_table_attach(GTK_TABLE(dw->table), lb, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL , GTK_FILL, 0, 0);
+		dw->label = gtk_entry_new();
+		gtk_table_attach(GTK_TABLE(dw->table), dw->label, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL , GTK_FILL, 0, 0);
+		lb = gtk_label_new(_("Command:"));
+		gtk_table_attach(GTK_TABLE(dw->table), lb, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL , GTK_FILL, 0, 0);
+		dw->command = gtk_entry_new();
+		gtk_table_attach(GTK_TABLE(dw->table), dw->command, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL , GTK_FILL, 0, 0);
+		lb = gtk_label_new(_("Working Directory:"));
+		gtk_table_attach(GTK_TABLE(dw->table), lb, 0, 1, 2, 3, GTK_EXPAND | GTK_FILL , GTK_FILL, 0, 0);
+		dw->wd = gtk_entry_new();
+		gtk_table_attach(GTK_TABLE(dw->table), dw->wd, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL , GTK_FILL, 0, 0);
+		dw->use_term = gtk_check_button_new_with_label(_("Run in Terminal"));
+		gtk_table_attach(GTK_TABLE(dw->table), dw->use_term, 0, 2, 3, 4, GTK_EXPAND | GTK_FILL , GTK_FILL, 0, 0);
+		dw->save_all = gtk_check_button_new_with_label(_("Save all changed documents"));
+		gtk_table_attach(GTK_TABLE(dw->table), dw->save_all, 0, 2, 4, 5, GTK_EXPAND | GTK_FILL , GTK_FILL, 0, 0);
+		contents = ui_dialog_vbox_new(GTK_DIALOG(dw->dialog));
+		gtk_box_pack_start(GTK_BOX(contents), dw->table, TRUE, TRUE, 0);
+		gtk_widget_show_all(dw->dialog);
+	}
+	gtk_entry_set_text(GTK_ENTRY(dw->label), gtk_label_get_text(GTK_LABEL(r->label)));
+	gtk_entry_set_text(GTK_ENTRY(dw->command), gtk_entry_get_text(GTK_ENTRY(r->command)));
+	gtk_entry_set_text(GTK_ENTRY(dw->wd), gtk_entry_get_text(GTK_ENTRY(r->wd)));
+	if (r->grp != GEANY_GBG_EXEC) gtk_widget_hide(dw->use_term);
+	else gtk_widget_show(dw->use_term);
+	response = gtk_dialog_run(GTK_DIALOG(dw->dialog));
+	if (response == GTK_RESPONSE_ACCEPT)
+	{
+		gtk_label_set_text(GTK_LABEL(r->label), gtk_entry_get_text(GTK_ENTRY(dw->label)));
+		gtk_entry_set_text(GTK_ENTRY(r->command), gtk_entry_get_text(GTK_ENTRY(dw->command)));
+		gtk_entry_set_text(GTK_ENTRY(r->wd), gtk_entry_get_text(GTK_ENTRY(dw->wd)));
+		r->use_terminal = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dw->use_term));
+		r->save_all = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dw->save_all));
+		r->used_dst = TRUE;
+		set_row_color(r, NULL);
+	}
+	gtk_widget_hide(dw->dialog);
+};
+
+
 static void on_entry_focus(GtkWidget *wid, GdkEventFocus *unused, gpointer user_data)
 {
 	RowWidgets *r = (RowWidgets*)user_data;
@@ -1818,26 +1779,25 @@
 	N_("Label"),
 	N_("Command"),
 	N_("Working directory"),
+	N_("Edit"),
 	N_("Clear"),
 	NULL };
 /* column names */
-#define DC_ITEM 0
-#define DC_ENTRIES 1
-#define DC_CLEAR 4
-#define DC_N_COL 5
+#define DC_ITEM  0
+#define DC_LABEL 1
+#define DC_CMD   2
+#define DC_WD    3
+#define DC_EDIT  4
+#define DC_CLEAR 5
+#define DC_N_COL 6
 
-static const guint entry_x_padding = 3;
-static const guint entry_y_padding = 0;
-
-
 static RowWidgets *build_add_dialog_row(GeanyDocument *doc, GtkTable *table, guint row,
 				GeanyBuildSource dst, gint grp, gint cmd, gboolean dir)
 {
-	GtkWidget *label, *clear, *clearicon;
+	GtkWidget *label, *edit, *editicon, *clear, *clearicon;
 	RowWidgets *roww;
 	GeanyBuildCommand *bc;
 	gint src;
-	enum GeanyBuildCmdEntries i;
 	guint column = 0;
 
 	label = gtk_label_new(g_strdup_printf("%d:", cmd + 1));
@@ -1849,56 +1809,52 @@
 	roww->grp = grp;
 	roww->cmd = cmd;
 	roww->dst = dst;
-	for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
+	roww->cmdsrc = bc = get_build_cmd(doc, grp, cmd, &src);
+	if (bc != NULL)
 	{
-		gint xflags = (i == GEANY_BC_COMMAND) ? GTK_FILL | GTK_EXPAND : GTK_FILL;
-
-		column += 1;
-		if (i == GEANY_BC_LABEL)
-		{
-			GtkWidget *wid = roww->entries[i] = gtk_button_new();
-			gtk_button_set_use_underline(GTK_BUTTON(wid), TRUE);
-			ui_widget_set_tooltip_text(wid, _("Click to set menu item label"));
-			g_signal_connect(wid, "clicked", G_CALLBACK(on_label_button_clicked), roww);
-		}
-		else
-		{
-			roww->entries[i] = gtk_entry_new();
-			g_signal_connect(roww->entries[i], "focus-in-event", G_CALLBACK(on_entry_focus), roww);
-		}
-		gtk_table_attach(table, roww->entries[i], column, column + 1, row, row + 1, xflags,
-			GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding);
+		roww->src = src;
+		if ((gint)dst == src)
+				roww->used_dst = TRUE;
 	}
-	column++;
+	roww->label = gtk_label_new(bc != NULL && bc->label != NULL ? bc->label : "");
+	gtk_misc_set_alignment(GTK_MISC(roww->label), 0.0, 0.5);
+	gtk_table_attach(table, roww->label, DC_LABEL, DC_LABEL + 1, row, row + 1,
+		GTK_FILL, GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding);
+
+	roww->command = gtk_entry_new();
+	gtk_entry_set_text(GTK_ENTRY(roww->command), bc != NULL && bc->command != NULL ? bc->command : "");
+	gtk_table_attach(table, roww->command, DC_CMD, DC_CMD + 1, row, row + 1,
+		GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding);
+	g_signal_connect(roww->command, "focus-in-event", G_CALLBACK(on_entry_focus), roww);
+
+	roww->wd = gtk_entry_new();
+	gtk_entry_set_text(GTK_ENTRY(roww->wd), bc != NULL && bc->wd != NULL ? bc->wd : "");
+	gtk_table_attach(table, roww->wd, DC_WD, DC_WD+ 1, row, row + 1,
+		GTK_FILL, GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding);
+	g_signal_connect(roww->wd, "focus-in-event", G_CALLBACK(on_entry_focus), roww);
+
+	editicon = gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU);
+	edit = gtk_button_new();
+	gtk_button_set_image(GTK_BUTTON(edit), editicon);
+	g_signal_connect(edit, "clicked", G_CALLBACK(on_edit_row_clicked), roww);
+	gtk_table_attach(table, edit, DC_EDIT, DC_EDIT + 1, row, row + 1, GTK_FILL,
+		GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding);
+
 	clearicon = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU);
 	clear = gtk_button_new();
 	gtk_button_set_image(GTK_BUTTON(clear), clearicon);
 	g_signal_connect(clear, "clicked", G_CALLBACK(on_clear_dialog_row), roww);
-	gtk_table_attach(table, clear, column, column + 1, row, row + 1, GTK_FILL,
+	gtk_table_attach(table, clear, DC_CLEAR, DC_CLEAR + 1, row, row + 1, GTK_FILL,
 		GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding);
-	roww->cmdsrc = bc = get_build_cmd(doc, grp, cmd, &src);
-	if (bc != NULL)
-		roww->src = src;
 
-	for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-	{
-		const gchar *str = "";
-
-		if (bc != NULL )
-		{
-			if ((str = bc->entries[i]) == NULL)
-				str = "";
-			else if ((gint)dst == src)
-				roww->used_dst = TRUE;
-		}
-		set_build_command_entry_text(roww->entries[i], str);
-	}
 	if (bc != NULL && ((gint)dst > src))
 		set_row_color(roww, insensitive_color);
 	if (bc != NULL && (src > (gint)dst || (grp == GEANY_GBG_FT && (doc == NULL || doc->file_type == NULL))))
 	{
-		for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-			gtk_widget_set_sensitive(roww->entries[i], FALSE);
+		gtk_widget_set_sensitive(roww->label, FALSE);
+		gtk_widget_set_sensitive(roww->command, FALSE);
+		gtk_widget_set_sensitive(roww->wd, FALSE);
+		gtk_widget_set_sensitive(edit, FALSE);
 		gtk_widget_set_sensitive(clear, FALSE);
 	}
 	return roww;
@@ -1953,7 +1909,7 @@
 	for (row = 3, cmdindex = 0, cmd = 0; cmd < build_groups_count[GEANY_GBG_FT]; ++row, ++cmdindex, ++cmd)
 		fields->rows[cmdindex] = build_add_dialog_row(doc, table, row, dst, GEANY_GBG_FT, cmd, FALSE);
 	label = gtk_label_new(_("Error Regular Expression:"));
-	gtk_table_attach(table, label, 0, DC_ENTRIES + 1, row, row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND,
+	gtk_table_attach(table, label, 0, DC_CMD, row, row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND,
 		entry_x_padding, entry_y_padding);
 	fields->fileregex = gtk_entry_new();
 	fields->fileregexstring = build_get_regex(GEANY_GBG_FT, NULL, &src);
@@ -1964,7 +1920,7 @@
 		if (src > (gint)dst)
 			sensitivity = FALSE;
 	}
-	gtk_table_attach(table, fields->fileregex, DC_ENTRIES + 1, DC_CLEAR, row, row + 1, GTK_FILL,
+	gtk_table_attach(table, fields->fileregex, DC_CMD, DC_EDIT, row, row + 1, GTK_FILL,
 		GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding);
 	clearicon = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU);
 	clear = gtk_button_new();
@@ -1988,7 +1944,7 @@
 		fields->rows[cmdindex] = build_add_dialog_row(
 			doc, table, row, dst, GEANY_GBG_NON_FT, cmd, TRUE);
 	label = gtk_label_new(_("Error Regular Expression:"));
-	gtk_table_attach(table, label, 0, DC_ENTRIES + 1, row, row + 1, GTK_FILL,
+	gtk_table_attach(table, label, 0, DC_CMD, row, row + 1, GTK_FILL,
 		GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding);
 	fields->nonfileregex = gtk_entry_new();
 	fields->nonfileregexstring = build_get_regex(GEANY_GBG_NON_FT, NULL, &src);
@@ -1998,7 +1954,7 @@
 		gtk_entry_set_text(GTK_ENTRY(fields->nonfileregex), *(fields->nonfileregexstring));
 		sensitivity = src > (gint)dst ? FALSE : TRUE;
 	}
-	gtk_table_attach(table, fields->nonfileregex, DC_ENTRIES + 1, DC_CLEAR, row, row + 1, GTK_FILL,
+	gtk_table_attach(table, fields->nonfileregex, DC_CMD, DC_EDIT, row, row + 1, GTK_FILL,
 		GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding);
 	clearicon = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU);
 	clear = gtk_button_new();
@@ -2064,9 +2020,9 @@
 		return strlen(a);
 	return strcmp(a, b);
 }
-#endif
 
 
+
 static const gchar *get_build_command_entry_text(GtkWidget *wid)
 {
 	if (GTK_IS_BUTTON(wid))
@@ -2075,20 +2031,19 @@
 		return gtk_entry_get_text(GTK_ENTRY(wid));
 }
 
-
+#endif
 static gboolean read_row(BuildDestination *dst, BuildTableData table_data, gint drow, gint grp, gint cmd)
 {
-	gchar *entries[GEANY_BC_CMDENTRIES_COUNT];
+	gchar *label, *command, *wd;
 	gboolean changed = FALSE;
 	GeanyBuildSource src;
-	enum GeanyBuildCmdEntries i;
 
 	src = table_data->rows[drow]->src;
 
-	for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-	{
-		entries[i] = g_strdup(get_build_command_entry_text(table_data->rows[drow]->entries[i]));
-	}
+	label = g_strdup(gtk_label_get_text(GTK_LABEL(table_data->rows[drow]->label)));
+	command = g_strdup(gtk_entry_get_text(GTK_ENTRY(table_data->rows[drow]->command)));
+	wd = g_strdup(gtk_entry_get_text(GTK_ENTRY(table_data->rows[drow]->wd)));
+
 	if (table_data->rows[drow]->cleared)
 	{
 		if (dst->dst[grp] != NULL)
@@ -2106,8 +2061,9 @@
 		{
 			if (*(dst->dst[grp]) == NULL)
 				*(dst->dst[grp]) = g_new0(GeanyBuildCommand, build_groups_count[grp]);
-			for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-				setptr((*(dst->dst[grp]))[cmd].entries[i], entries[i]);
+			setptr((*(dst->dst[grp]))[cmd].label, label);
+			setptr((*(dst->dst[grp]))[cmd].command, command);
+			setptr((*(dst->dst[grp]))[cmd].wd, wd);
 			(*(dst->dst[grp]))[cmd].exists = TRUE;
 			(*(dst->dst[grp]))[cmd].changed = TRUE;
 			changed = TRUE;
@@ -2115,8 +2071,9 @@
 	}
 	else
 	{
-		for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-			g_free(entries[i]);
+		g_free(label);
+		g_free(command);
+		g_free(wd);
 	}
 	return changed;
 }
@@ -2257,7 +2214,7 @@
 	start = build_groups_count[GEANY_GBG_FT];
 	end = start + build_groups_count[GEANY_GBG_NON_FT];
 	for (i = start; i < end; ++i)
-		gtk_entry_set_text(GTK_ENTRY(table_data->rows[i]->entries[GEANY_BC_WORKING_DIR]), "%p");
+		gtk_entry_set_text(GTK_ENTRY(table_data->rows[i]->wd), "%p");
 }
 
 
@@ -2271,7 +2228,7 @@
 /* config format for build-menu group is prefix_gg_nn_xx=value
  * where gg = FT, NF, EX for the command group
  *       nn = 2 digit command number
- *       xx = LB for label, CM for command and WD for working dir */
+ *       xx = LB for label, CM for command, WD for working dir, IT in terminal and SA save all */
 static const gchar *groups[GEANY_GBG_COUNT] = { "FT", "NF", "EX" };
 static const gchar *fixedkey="xx_xx_xx";
 
@@ -2308,13 +2265,15 @@
 		if (label != NULL)
 		{
 			dstcmd[cmd].exists = TRUE;
-			setptr(dstcmd[cmd].entries[GEANY_BC_LABEL], label);
-			set_key_fld(key,"CM");
-			setptr(dstcmd[cmd].entries[GEANY_BC_COMMAND],
-					g_key_file_get_string(config, build_grp_name, key, NULL));
-			set_key_fld(key,"WD");
-			setptr(dstcmd[cmd].entries[GEANY_BC_WORKING_DIR],
-					g_key_file_get_string(config, build_grp_name, key, NULL));
+			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));
+			set_key_fld(key, "WD");
+			setptr(dstcmd[cmd].wd, g_key_file_get_string(config, build_grp_name, key, NULL));
+			set_key_fld(key, "IT");
+			dstcmd[cmd].use_terminal = g_key_file_get_boolean(config, build_grp_name, key, NULL);
+			set_key_fld(key, "SA");
+			dstcmd[cmd].save_all = g_key_file_get_boolean(config, build_grp_name, key, NULL);
 		}
 		else dstcmd[cmd].exists = FALSE;
 	}
@@ -2402,9 +2361,11 @@
 #define ASSIGNIF(type, id, string, value) \
 	if (NZV(value) && ! type[GBO_TO_CMD(id)].exists) { \
 		type[GBO_TO_CMD(id)].exists = TRUE; \
-		setptr(type[GBO_TO_CMD(id)].entries[GEANY_BC_LABEL], g_strdup(string)); \
-		setptr(type[GBO_TO_CMD(id)].entries[GEANY_BC_COMMAND], (value)); \
-		setptr(type[GBO_TO_CMD(id)].entries[GEANY_BC_WORKING_DIR], NULL); \
+		setptr(type[GBO_TO_CMD(id)].label, g_strdup(string)); \
+		setptr(type[GBO_TO_CMD(id)].command, (value)); \
+		setptr(type[GBO_TO_CMD(id)].wd, NULL); \
+		type[GBO_TO_CMD(id)].use_terminal = TRUE; \
+		type[GBO_TO_CMD(id)].save_all = FALSE; \
 		type[GBO_TO_CMD(id)].old = TRUE; \
 	} else \
 		g_free(value);
@@ -2449,11 +2410,11 @@
 			else
 				makebasedir = g_strdup("%d");
 			if (non_ft_pref[GBO_TO_CMD(GEANY_GBO_MAKE_ALL)].old)
-				setptr(non_ft_pref[GBO_TO_CMD(GEANY_GBO_MAKE_ALL)].entries[GEANY_BC_WORKING_DIR], g_strdup(makebasedir));
+				setptr(non_ft_pref[GBO_TO_CMD(GEANY_GBO_MAKE_ALL)].wd, g_strdup(makebasedir));
 			if (non_ft_pref[GBO_TO_CMD(GEANY_GBO_CUSTOM)].old)
-				setptr(non_ft_pref[GBO_TO_CMD(GEANY_GBO_CUSTOM)].entries[GEANY_BC_WORKING_DIR], g_strdup(makebasedir));
+				setptr(non_ft_pref[GBO_TO_CMD(GEANY_GBO_CUSTOM)].wd, g_strdup(makebasedir));
 			if (non_ft_pref[GBO_TO_CMD(GEANY_GBO_MAKE_OBJECT)].old)
-				setptr(non_ft_pref[GBO_TO_CMD(GEANY_GBO_MAKE_OBJECT)].entries[GEANY_BC_WORKING_DIR], g_strdup("%d"));
+				setptr(non_ft_pref[GBO_TO_CMD(GEANY_GBO_MAKE_OBJECT)].wd, g_strdup("%d"));
 			value = g_key_file_get_string(config, "project", "run_cmd", NULL);
 			if (NZV(value))
 			{
@@ -2462,9 +2423,9 @@
 				if (! exec_proj[GBO_TO_CMD(GEANY_GBO_EXEC)].exists)
 				{
 					exec_proj[GBO_TO_CMD(GEANY_GBO_EXEC)].exists = TRUE;
-					setptr(exec_proj[GBO_TO_CMD(GEANY_GBO_EXEC)].entries[GEANY_BC_LABEL], g_strdup(_("_Execute")));
-					setptr(exec_proj[GBO_TO_CMD(GEANY_GBO_EXEC)].entries[GEANY_BC_COMMAND], value);
-					setptr(exec_proj[GBO_TO_CMD(GEANY_GBO_EXEC)].entries[GEANY_BC_WORKING_DIR], g_strdup(basedir));
+					setptr(exec_proj[GBO_TO_CMD(GEANY_GBO_EXEC)].label, g_strdup(_("_Execute")));
+					setptr(exec_proj[GBO_TO_CMD(GEANY_GBO_EXEC)].command, value);
+					setptr(exec_proj[GBO_TO_CMD(GEANY_GBO_EXEC)].wd, g_strdup(basedir));
 					exec_proj[GBO_TO_CMD(GEANY_GBO_EXEC)].old = TRUE;
 				}
 			}
@@ -2495,7 +2456,6 @@
 	gint cmd, prefixlen; /* NOTE prefixlen used in macros above */
 	gchar *key;
 	gint count = 0;
-	enum GeanyBuildCmdEntries i;
 
 	if (src == NULL)
 		return 0;
@@ -2514,19 +2474,29 @@
 			set_key_cmd(key, cmdbuf);
 			if (src[cmd].exists)
 			{
-				for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-				{
-					set_key_fld(key, config_keys[i]);
-					g_key_file_set_string(config, build_grp_name, key, src[cmd].entries[i]);
-				}
+				set_key_fld(key, "LB");
+				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);
+				set_key_fld(key, "WD");
+				g_key_file_set_string(config, build_grp_name, key, src[cmd].wd);
+				set_key_fld(key, "IT");
+				g_key_file_set_boolean(config, build_grp_name, key, src[cmd].use_terminal);
+				set_key_fld(key, "SA");
+				g_key_file_set_boolean(config, build_grp_name, key, src[cmd].save_all);
 			}
 			else
 			{
-				for (i = 0; i < GEANY_BC_CMDENTRIES_COUNT; i++)
-				{
-					set_key_fld(key, config_keys[i]);
-					g_key_file_remove_key(config, build_grp_name, key, NULL);
-				}
+				set_key_fld(key, "LB");
+				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);
+				set_key_fld(key, "WD");
+				g_key_file_remove_key(config, build_grp_name, key, NULL);
+				set_key_fld(key, "IT");
+				g_key_file_remove_key(config, build_grp_name, key, NULL);
+				set_key_fld(key, "SA");
+				g_key_file_remove_key(config, build_grp_name, key, NULL);
 			}
 		}
 	}
@@ -2648,15 +2618,17 @@
 
 static struct
 {
-	const gchar *entries[GEANY_BC_CMDENTRIES_COUNT];
+	const gchar *label;
+	const gchar *command;
+	const gchar *wd;
 	GeanyBuildCommand **ptr;
 	gint index;
 } default_cmds[] = {
-	{ {N_("_Make"), "make", NULL}, &non_ft_def, GBO_TO_CMD(GEANY_GBO_MAKE_ALL)},
-	{ {N_("Make Custom _Target"), "make ", NULL}, &non_ft_def, GBO_TO_CMD(GEANY_GBO_CUSTOM)},
-	{ {N_("Make _Object"), "make %e.o", NULL }, &non_ft_def, GBO_TO_CMD(GEANY_GBO_MAKE_OBJECT)},
-	{ {N_("_Execute"), "./%e", NULL }, &exec_def, GBO_TO_CMD(GEANY_GBO_EXEC)},
-	{ {NULL, NULL, NULL}, NULL, 0 }
+	{ N_("_Make"), "make", NULL, &non_ft_def, GBO_TO_CMD(GEANY_GBO_MAKE_ALL)},
+	{ N_("Make Custom _Target"), "make ", NULL, &non_ft_def, GBO_TO_CMD(GEANY_GBO_CUSTOM)},
+	{ N_("Make _Object"), "make %e.o", NULL, &non_ft_def, GBO_TO_CMD(GEANY_GBO_MAKE_OBJECT)},
+	{ N_("_Execute"), "./%e", NULL, &exec_def, GBO_TO_CMD(GEANY_GBO_EXEC)},
+	{ NULL, NULL, NULL, NULL, 0 }
 };
 
 
@@ -2672,15 +2644,15 @@
 	non_ft_def = g_new0(GeanyBuildCommand, build_groups_count[GEANY_GBG_NON_FT]);
 	exec_def = g_new0(GeanyBuildCommand, build_groups_count[GEANY_GBG_EXEC]);
 	run_info = g_new0(RunInfo, build_groups_count[GEANY_GBG_EXEC]);
-	for (cmdindex = 0; default_cmds[cmdindex].entries[GEANY_BC_COMMAND] != NULL; ++cmdindex)
+	for (cmdindex = 0; default_cmds[cmdindex].command != NULL; ++cmdindex)
 	{
-		enum GeanyBuildCmdEntries k;
 		GeanyBuildCommand *cmd = &((*(default_cmds[cmdindex].ptr))[ default_cmds[cmdindex].index ]);
 		cmd->exists = TRUE;
-		for (k = 0; k < GEANY_BC_CMDENTRIES_COUNT; k++)
-		{
-			cmd->entries[k] = g_strdup(default_cmds[cmdindex].entries[k]);
-		}
+		cmd->label = g_strdup(default_cmds[cmdindex].label);
+		cmd->command = g_strdup(default_cmds[cmdindex].command);
+		cmd->wd = g_strdup(default_cmds[cmdindex].wd);
+		cmd->use_terminal = TRUE;
+		cmd->save_all = FALSE;
 	}
 
 	/* create the toolbar Build item sub menu */

Modified: branches/bs2/src/build.h
===================================================================
--- branches/bs2/src/build.h	2010-07-01 11:49:30 UTC (rev 5076)
+++ branches/bs2/src/build.h	2010-07-01 12:08:38 UTC (rev 5077)
@@ -121,6 +121,7 @@
 
 extern GeanyBuildInfo build_info;
 
+#if 0
 /** The entries of a command for a menu item */
 typedef enum  GeanyBuildCmdEntries
 {
@@ -129,13 +130,18 @@
     GEANY_BC_WORKING_DIR,		/**< The directory to run in */
     GEANY_BC_CMDENTRIES_COUNT	/**< Count of entries */
 } GeanyBuildCmdEntries;
+#endif
 
 /** The command for a menu item. */
 typedef struct GeanyBuildCommand
 {
  	/** Pointers to g_string values of the command entries.
 	 * Must be freed if the pointer is changed. */
-	gchar 		*entries[GEANY_BC_CMDENTRIES_COUNT];
+	gchar 		*label;						/**< Menu item label */
+	gchar		*command;					/**< Command to run */
+	gchar		*wd;						/**< working directory */
+	gboolean	 use_terminal;				/**< execute commands run in a terminal */
+	gboolean	 save_all;					/**< save all files before running command */
 	gboolean	 exists;					/**< If the entries have valid values. */
 	gboolean	 changed;					/**< Save on exit if @c changed, remove if not @c exist. */
 	gboolean	 old;						/**< Converted from old format. */


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