SF.net SVN: geany:[3970] branches/build-system
elextr at users.sourceforge.net
elextr at xxxxx
Wed Jul 15 06:55:15 UTC 2009
Revision: 3970
http://geany.svn.sourceforge.net/geany/?rev=3970&view=rev
Author: elextr
Date: 2009-07-15 06:55:12 +0000 (Wed, 15 Jul 2009)
Log Message:
-----------
Implement multiple execute commands & minor fixes
Modified Paths:
--------------
branches/build-system/ChangeLog
branches/build-system/data/filetypes.latex
branches/build-system/src/build.c
branches/build-system/src/build.h
branches/build-system/src/filetypes.h
Modified: branches/build-system/ChangeLog
===================================================================
--- branches/build-system/ChangeLog 2009-07-14 18:49:31 UTC (rev 3969)
+++ branches/build-system/ChangeLog 2009-07-15 06:55:12 UTC (rev 3970)
@@ -1,3 +1,13 @@
+2009-07-15 Lex Trotman <elextr(at)gmail(dot)com>
+
+ * src/build.h, src/build.c
+ Changed to itterate over entries in build commands dialog to allow
+ additional fields to be added
+ Implement support for multiple run commands
+ * data/filetypes.latex
+ Implement configured commands and labels for latex.
+
+
2009-07-14 Lex Trotman <elextr(at)gmail(dot)com>
* src/build.h, src/build.c
Modified: branches/build-system/data/filetypes.latex
===================================================================
--- branches/build-system/data/filetypes.latex 2009-07-14 18:49:31 UTC (rev 3969)
+++ branches/build-system/data/filetypes.latex 2009-07-15 06:55:12 UTC (rev 3970)
@@ -43,3 +43,17 @@
linker=pdflatex --file-line-error-style "%f"
run_cmd=xdvi "%f"
run_cmd2=xpdf "%f"
+
+[build-menu]
+FT_00_LB=LaTeX -> _DVI
+FT_00_CM=latex --file-line-error-style "%f"
+FT_00_BD=false
+FT_01_LB=LaTeX -> _PDF
+FT_01_CM=pdflatex --file-line-error-style "%f"
+FT_01_BD=false
+EX_00_LB=V_iew PDF File
+EX_00_CM=xpdf "%f"
+EX_00_BD=false
+EX_01_LB=_View DVI File
+EX_01_CM=xdvi "%f"
+EX_01_BD=false
Modified: branches/build-system/src/build.c
===================================================================
--- branches/build-system/src/build.c 2009-07-14 18:49:31 UTC (rev 3969)
+++ branches/build-system/src/build.c 2009-07-15 06:55:12 UTC (rev 3970)
@@ -64,24 +64,26 @@
static gchar *current_dir_entered = NULL;
-static struct
+typedef struct RunInfo
{
GPid pid;
gint file_type_id;
-} run_info = {0, GEANY_FILETYPES_NONE};
+}RunInfo;
+static RunInfo *run_info;
+
#ifdef G_OS_WIN32
static const gchar RUN_SCRIPT_CMD[] = "geany_run_script.bat";
#else
static const gchar RUN_SCRIPT_CMD[] = "./geany_run_script.sh";
#endif
-
/* 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 FOREACH_GEANYBUILDCMD_ENTRY(i) for(i = 0; i < BC_CMDENTRIES_COUNT; i++)
static gpointer last_toolbutton_action = GBO_TO_POINTER(GBO_BUILD);
@@ -102,8 +104,8 @@
}
widgets;
-static gint build_groups_count[GBG_COUNT] = { 3, 4, 1 };
-static gint build_items_count = 8;
+static gint build_groups_count[GBG_COUNT] = { 3, 4, 2 };
+static gint build_items_count = 9;
#ifndef G_OS_WIN32
static void build_exit_cb(GPid child_pid, gint status, gpointer user_data);
@@ -144,6 +146,27 @@
kb->key, kb->mods, GTK_ACCEL_VISIBLE);
}
+/* convenience routines to access parts of GeanyBuildCommand */
+static gchar* id_to_str(GeanyBuildCommand *bc, gint id)
+{
+ return bc->entries[id];
+}
+
+static gchar* buildcmd_label(GeanyBuildCommand *bc)
+{
+ return id_to_str(bc, BC_LABEL);
+}
+
+static gchar* buildcmd_cmd(GeanyBuildCommand *bc)
+{
+ return id_to_str(bc, BC_COMMAND);
+}
+
+static const gchar* config_keys[] = {
+ [BC_LABEL] = "CM",
+ [BC_COMMAND] = "BD",
+};
+
/*-----------------------------------------------------
*
* Execute commands and handle results
@@ -173,9 +196,10 @@
GeanyFiletype *ft=NULL;
GeanyDocument *doc;
gint i,j,k,l,m;
+ enum GeanyBuildCmdEntries n;
gint cc[BCS_COUNT];
gchar c;
- if (doc==NULL)doc=document_get_current();
+ doc=document_get_current();
if (doc!=NULL)ft = doc->file_type;
if(ft!=NULL)
{
@@ -194,9 +218,12 @@
{
for(k=0;k<build_groups_count[j];++k)
if(cl[j][i]!=NULL && *(cl[j][i])!=NULL && (*(cl[j][i]))[k].exists)
- {
- if((*(cl[j][i]))[k].label!=NULL && (l=strlen((*(cl[j][i]))[k].label))>m)m=l;
- if((*(cl[j][i]))[k].command!=NULL && (l=strlen((*(cl[j][i]))[k].command))>m)m=l;
+ {
+ int n;
+ FOREACH_GEANYBUILDCMD_ENTRY(n)
+ {
+ if((*(cl[j][i]))[k].entries[n]!=NULL && (l=strlen((*(cl[j][i]))[k].entries[n]))>m)m=l;
+ }
}
}
cc[i]=m;
@@ -212,16 +239,13 @@
{
if(cl[i][j]!=NULL && *(cl[i][j])!=NULL && (*(cl[i][j]))[k].exists)
{
- if(l==0)
- if((*(cl[i][j]))[k].label!=NULL)
- printf("%c %*.*s",c,cc[j],cc[j],(*(cl[i][j]))[k].label);
- else
- printf("%c %*.*s",c,cc[j],cc[j]," ");
- else
- if((*(cl[i][j]))[k].command!=NULL)
- printf("%c %*.*s",c,cc[j],cc[j],(*(cl[i][j]))[k].command);
- else
- printf("%c %*.*s",c,cc[j],cc[j]," ");
+ FOREACH_GEANYBUILDCMD_ENTRY(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]," ");
@@ -537,38 +561,38 @@
return build_info.pid;
}
-
/* Returns: NULL if there was an error, or the working directory the script was created in.
* vte_cmd_nonscript is the location of a string which is filled with the command to be used
* when vc->skip_run_script is set, otherwise it will be set to NULL */
-static gchar *prepare_run_script(GeanyDocument *doc, gchar **vte_cmd_nonscript)
+static gchar *prepare_run_script(GeanyDocument *doc, gchar **vte_cmd_nonscript, gint cmdindex)
{
- gchar *locale_filename = NULL;
- gboolean have_project;
- GeanyProject *project = app->project;
- GeanyFiletype *ft = doc->file_type;
- gchar *cmd = NULL;
- gchar *executable = NULL;
- gchar *working_dir = NULL;
- gboolean autoclose = FALSE;
- gboolean result = FALSE;
- gchar *tmp;
+ gchar *locale_filename = NULL;
+ gboolean have_project;
+ GeanyProject *project = app->project;
+ GeanyFiletype *ft = doc->file_type;
+ GeanyBuildCommand *cmd = NULL;
+ gchar *cmdstr;
+ gchar *executable = NULL;
+ gchar *working_dir = NULL;
+ gboolean autoclose = FALSE;
+ gboolean result = FALSE;
+ gchar *tmp;
if (vte_cmd_nonscript != NULL)
*vte_cmd_nonscript = NULL;
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;
- /* TODO fix all this stuff */
+ have_project = project != NULL;
+ cmd = get_build_cmd(doc, GBG_EXEC, cmdindex, NULL);
- if (strstr(cmd, "%e") != NULL)
+ if (strstr(buildcmd_cmd(cmd), "%e") != NULL)
{
executable = utils_remove_ext_from_filename(locale_filename);
setptr(executable, g_path_get_basename(executable));
}
+/* replace this with substitute into cmd->entries[BC_DIR] (or whatever it will be called) when available */
if (have_project)
{
gchar *project_base_path = project_get_base_path();
@@ -592,11 +616,11 @@
}
/* replace %f and %e in the run_cmd string */
- cmd = g_strdup(cmd);
+ cmdstr = g_strdup(buildcmd_cmd(cmd));
tmp = g_path_get_basename(locale_filename);
- cmd = utils_str_replace(cmd, "%f", tmp);
+ cmdstr = utils_str_replace(cmdstr, "%f", tmp);
g_free(tmp);
- cmd = utils_str_replace(cmd, "%e", executable);
+ cmdstr = utils_str_replace(cmdstr, "%e", executable);
#ifdef HAVE_VTE
if (vte_info.load_vte && vc != NULL && vc->run_in_vte)
@@ -604,7 +628,7 @@
if (vc->skip_run_script)
{
if (vte_cmd_nonscript != NULL)
- *vte_cmd_nonscript = cmd;
+ *vte_cmd_nonscript = cmdstr;
utils_free_pointers(2, executable, locale_filename, NULL);
return working_dir;
@@ -618,17 +642,17 @@
/* RUN_SCRIPT_CMD should be ok in UTF8 without converting in locale because it
* contains no umlauts */
tmp = g_build_filename(working_dir, RUN_SCRIPT_CMD, NULL);
- result = build_create_shellscript(tmp, cmd, autoclose);
+ result = build_create_shellscript(tmp, cmdstr, autoclose);
if (! result)
{
- gchar *utf8_cmd = utils_get_utf8_from_locale(cmd);
+ gchar *utf8_cmd = utils_get_utf8_from_locale(cmdstr);
ui_set_statusbar(TRUE, _("Failed to execute \"%s\" (start-script could not be created)"),
utf8_cmd);
g_free(utf8_cmd);
}
- utils_free_pointers(4, tmp, cmd, executable, locale_filename, NULL);
+ utils_free_pointers(4, tmp, cmdstr, executable, locale_filename, NULL);
if (result)
return working_dir;
@@ -638,7 +662,7 @@
}
-static GPid build_run_cmd(GeanyDocument *doc)
+static GPid build_run_cmd(GeanyDocument *doc, gint cmdindex)
{
gchar *working_dir;
gchar *vte_cmd_nonscript = NULL;
@@ -647,11 +671,11 @@
if (doc == NULL || doc->file_name == NULL)
return (GPid) 0;
- working_dir = prepare_run_script(doc, &vte_cmd_nonscript);
+ working_dir = prepare_run_script(doc, &vte_cmd_nonscript, cmdindex);
if (working_dir == NULL)
return (GPid) 0;
- run_info.file_type_id = FILETYPE_ID(doc->file_type);
+ run_info[cmdindex].file_type_id = FILETYPE_ID(doc->file_type);
#ifdef HAVE_VTE
if (vte_info.load_vte && vc != NULL && vc->run_in_vte)
@@ -689,7 +713,7 @@
gtk_widget_grab_focus(vc->vte);
msgwin_show_hide(TRUE);
- run_info.pid = 1;
+ run_info[cmdindex].pid = 1;
g_free(vte_cmd);
}
@@ -720,7 +744,7 @@
ui_set_statusbar(TRUE,
_("Could not find terminal \"%s\" "
"(check path for Terminal tool setting in Preferences)"), tool_prefs.term_cmd);
- run_info.pid = (GPid) 1;
+ run_info[cmdindex].pid = (GPid) 1;
goto free_strings;
}
@@ -748,19 +772,19 @@
argv[term_argv_len + 2] = NULL;
if (! g_spawn_async(working_dir, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
- NULL, NULL, &(run_info.pid), &error))
+ NULL, NULL, &(run_info[cmdindex].pid), &error))
{
geany_debug("g_spawn_async() failed: %s", error->message);
ui_set_statusbar(TRUE, _("Process failed (%s)"), error->message);
g_unlink(RUN_SCRIPT_CMD);
g_error_free(error);
error = NULL;
- run_info.pid = (GPid) 0;
+ run_info[cmdindex].pid = (GPid) 0;
}
- if (run_info.pid > 0)
+ if (run_info[cmdindex].pid > 0)
{
- g_child_watch_add(run_info.pid, (GChildWatchFunc) run_exit_cb, NULL);
+ g_child_watch_add(run_info[cmdindex].pid, (GChildWatchFunc) run_exit_cb, (gpointer)&(run_info[cmdindex]));
build_menu_update(doc);
}
free_strings:
@@ -770,7 +794,7 @@
}
g_free(working_dir);
- return run_info.pid;
+ return run_info[cmdindex].pid;
}
@@ -944,9 +968,11 @@
static void run_exit_cb(GPid child_pid, gint status, gpointer user_data)
{
+ RunInfo *run_info = (RunInfo*)user_data;
+
g_spawn_close_pid(child_pid);
- run_info.pid = 0;
+ run_info->pid = 0;
/* reset the stop button and menu item to the original meaning */
build_menu_update(NULL);
}
@@ -987,17 +1013,22 @@
gchar *dir;
gchar *full_command;
GeanyBuildCommand *buildcmd = get_build_cmd(doc, grp, cmd, NULL);
+ gchar* cmdstr;
- if (buildcmd==NULL)return;
+ if (buildcmd==NULL)
+ return;
+
+ cmdstr = buildcmd_cmd(buildcmd);
+
if (cmd_cat != NULL)
{
- if (buildcmd->command != NULL)
- full_command = g_strconcat(buildcmd->command, cmd_cat, NULL);
+ if (cmdstr != NULL)
+ full_command = g_strconcat(cmdstr, cmd_cat, NULL);
else
full_command = g_strdup(cmd_cat);
}
else
- full_command = buildcmd->command;
+ full_command = cmdstr;
if (grp == GBG_FT)
{
dir=NULL; /* allways run in doc dir */
@@ -1038,7 +1069,7 @@
GeanyFiletype *ft;
gint grp=GPOINTER_TO_GRP(user_data);
gint cmd=GPOINTER_TO_CMD(user_data);
-
+
if (doc && doc->changed)
document_save_file(doc, FALSE);
if (grp == GBG_NON_FT && cmd == GBO_TO_CMD(GBO_MAKE_CUSTOM))
@@ -1055,15 +1086,15 @@
}
return;
}
- else if (grp == GBG_EXEC && cmd == GBO_TO_CMD(GBO_EXEC))
+ else if (grp == GBG_EXEC)
{
- if (run_info.pid > (GPid) 1)
+ if (run_info[cmd].pid > (GPid) 1)
{
- kill_process(&run_info.pid);
+ kill_process(&run_info[cmd].pid);
return;
}
GeanyBuildCommand *bc = get_build_cmd(doc, grp, cmd, NULL);
- if (bc!=NULL && strcmp(bc->command, "builtin")==0)
+ if (bc!=NULL && strcmp(buildcmd_cmd(bc), "builtin")==0)
{
if (doc==NULL)return;
gchar *uri = g_strconcat("file:///", g_path_skip_root(doc->file_name), NULL);
@@ -1072,7 +1103,7 @@
}
else
- build_run_cmd(doc);
+ build_run_cmd(doc, cmd);
}
else
build_command(doc, grp, cmd, NULL);
@@ -1101,23 +1132,23 @@
const gchar *fix_label;
callback *cb;
} build_menu_specs[] = {
- { GTK_STOCK_CONVERT, GEANY_KEYS_BUILD_COMPILE, GBO_TO_GBG(GBO_COMPILE), GBO_TO_CMD(GBO_COMPILE), NULL, on_build_menu_item },
- { GEANY_STOCK_BUILD, GEANY_KEYS_BUILD_LINK, GBO_TO_GBG(GBO_BUILD), GBO_TO_CMD(GBO_BUILD), NULL, on_build_menu_item },
- { NULL, -1, MENU_FT_REST, GBO_TO_CMD(GBO_BUILD)+1, NULL, on_build_menu_item },
- { NULL, -1, MENU_SEPARATOR, GBF_SEP_1, NULL, NULL },
- { NULL, GEANY_KEYS_BUILD_MAKE, GBO_TO_GBG(GBO_MAKE_ALL), GBO_TO_CMD(GBO_MAKE_ALL), NULL, on_build_menu_item },
- { NULL, GEANY_KEYS_BUILD_MAKEOWNTARGET, GBO_TO_GBG(GBO_MAKE_CUSTOM),GBO_TO_CMD(GBO_MAKE_CUSTOM), NULL, on_build_menu_item },
- { NULL, GEANY_KEYS_BUILD_MAKEOBJECT, GBO_TO_GBG(GBO_MAKE_OBJECT),GBO_TO_CMD(GBO_MAKE_OBJECT), NULL, on_build_menu_item },
- { NULL, -1, MENU_NON_FT_REST, GBO_TO_CMD(GBO_MAKE_OBJECT)+1, NULL, on_build_menu_item },
- { NULL, -1, MENU_SEPARATOR, GBF_SEP_2, NULL, NULL },
- { NULL, GEANY_KEYS_BUILD_NEXTERROR, MENU_NEXT_ERROR, GBF_NEXT_ERROR, N_("_Next Error"), on_build_next_error },
- { NULL, GEANY_KEYS_BUILD_PREVIOUSERROR, MENU_PREV_ERROR, GBF_PREV_ERROR, N_("_Previous Error"), on_build_previous_error },
- { NULL, -1, MENU_SEPARATOR, GBF_SEP_3, NULL, NULL },
- { GTK_STOCK_EXECUTE, GEANY_KEYS_BUILD_RUN, GBO_TO_GBG(GBO_EXEC), GBO_TO_CMD(GBO_EXEC), NULL, on_build_menu_item },
- { NULL, -1, MENU_EXEC_REST, GBO_TO_CMD(GBO_EXEC)+1, NULL, NULL },
- { NULL, -1, MENU_SEPARATOR, GBF_SEP_4, NULL, NULL },
- { GTK_STOCK_PREFERENCES, GEANY_KEYS_BUILD_OPTIONS, MENU_COMMANDS, GBF_COMMANDS, N_("_Set Build Commands"), on_set_build_commands_activate },
- { NULL, -1, MENU_DONE, 0, NULL, NULL }
+ { GTK_STOCK_CONVERT, GEANY_KEYS_BUILD_COMPILE, GBO_TO_GBG(GBO_COMPILE), GBO_TO_CMD(GBO_COMPILE), NULL, on_build_menu_item },
+ { GEANY_STOCK_BUILD, GEANY_KEYS_BUILD_LINK, GBO_TO_GBG(GBO_BUILD), GBO_TO_CMD(GBO_BUILD), NULL, on_build_menu_item },
+ { NULL, -1, MENU_FT_REST, GBO_TO_CMD(GBO_BUILD)+1, NULL, on_build_menu_item },
+ { NULL, -1, MENU_SEPARATOR, GBF_SEP_1, NULL, NULL },
+ { NULL, GEANY_KEYS_BUILD_MAKE, GBO_TO_GBG(GBO_MAKE_ALL), GBO_TO_CMD(GBO_MAKE_ALL), NULL, on_build_menu_item },
+ { NULL, GEANY_KEYS_BUILD_MAKEOWNTARGET, GBO_TO_GBG(GBO_MAKE_CUSTOM), GBO_TO_CMD(GBO_MAKE_CUSTOM), NULL, on_build_menu_item },
+ { NULL, GEANY_KEYS_BUILD_MAKEOBJECT, GBO_TO_GBG(GBO_MAKE_OBJECT), GBO_TO_CMD(GBO_MAKE_OBJECT), NULL, on_build_menu_item },
+ { NULL, -1, MENU_NON_FT_REST, GBO_TO_CMD(GBO_MAKE_OBJECT)+1, NULL, on_build_menu_item },
+ { NULL, -1, MENU_SEPARATOR, GBF_SEP_2, NULL, NULL },
+ { NULL, GEANY_KEYS_BUILD_NEXTERROR, MENU_NEXT_ERROR, GBF_NEXT_ERROR, N_("_Next Error"), on_build_next_error },
+ { NULL, GEANY_KEYS_BUILD_PREVIOUSERROR, MENU_PREV_ERROR, GBF_PREV_ERROR, N_("_Previous Error"), on_build_previous_error },
+ { NULL, -1, MENU_SEPARATOR, GBF_SEP_3, NULL, NULL },
+ { GTK_STOCK_EXECUTE, GEANY_KEYS_BUILD_RUN, GBO_TO_GBG(GBO_EXEC), GBO_TO_CMD(GBO_EXEC), NULL, on_build_menu_item },
+ { NULL, -1, MENU_EXEC_REST, GBO_TO_CMD(GBO_EXEC)+1, NULL, on_build_menu_item },
+ { NULL, -1, MENU_SEPARATOR, GBF_SEP_4, NULL, NULL },
+ { GTK_STOCK_PREFERENCES, GEANY_KEYS_BUILD_OPTIONS, MENU_COMMANDS, GBF_COMMANDS, N_("_Set Build Commands"), on_set_build_commands_activate },
+ { NULL, -1, MENU_DONE, 0, NULL, NULL }
};
static void create_build_menu_item(GtkWidget *menu, GeanyKeyGroup *group, GtkAccelGroup *ag,
@@ -1174,14 +1205,14 @@
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;
+ gchar *lbl = (bc==NULL)?"":buildcmd_label(bc);
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;
+ gchar *lbl = (bc==NULL)?"":buildcmd_label(bc);
create_build_menu_item(menu, keygroup, accel_group, bs, lbl, bs->build_grp, bs->build_cmd);
}
}
@@ -1214,7 +1245,6 @@
doc = document_get_current();
have_path = doc!=NULL && doc->file_name != NULL;
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)
{
@@ -1252,16 +1282,23 @@
for (cmd=bs->build_cmd; cmd<cmdcount; ++cmd)
{
GtkWidget *menu_item = menu_items.menu_item[grp][cmd];
+ gchar* label;
bc = get_build_cmd(doc, grp, cmd, NULL);
+ if (bc)
+ label = buildcmd_label(bc);
+ else
+ label = 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)
+ if (bc != NULL && label != NULL
+ && strlen(label) > 0)
{
- geany_menu_item_set_label(menu_item, bc->label);
+ geany_menu_item_set_label(menu_item, label);
gtk_widget_show_all(menu_item);
vis |= TRUE;
}
@@ -1271,6 +1308,8 @@
else
{
GtkWidget *image;
+ gint cmdindex;
+ exec_running = run_info[cmd].pid>1;
cmd_sensitivity = bc!=NULL || exec_running;
gtk_widget_set_sensitive(menu_item, cmd_sensitivity);
if (!exec_running)
@@ -1282,9 +1321,10 @@
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)
+ if (bc != NULL && label != NULL
+ && strlen(label) > 0)
{
- geany_menu_item_set_label(menu_item, bc->label);
+ geany_menu_item_set_label(menu_item, label);
gtk_widget_show_all(menu_item);
vis |= TRUE;
}
@@ -1298,7 +1338,7 @@
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 (run_info[0].pid>1)
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);
@@ -1415,7 +1455,8 @@
*-------------------------------------------------------*/
typedef struct RowWidgets {
- GtkWidget *label, *command, *dir;
+ GtkWidget *entries[BC_CMDENTRIES_COUNT];
+ GtkWidget *dir;
GeanyBuildSource src, dst;
GeanyBuildCommand *cmdsrc;
gint grp,cmd;
@@ -1426,19 +1467,24 @@
{
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)
+ if(bc != NULL)
{
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:"");
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ {
+ gtk_entry_set_text(GTK_ENTRY(r->entries[i]), id_to_str(bc,i) != NULL? id_to_str(bc,i):"");
+ }
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(r->dir), bc->run_in_base_dir);
}
else
{
- gtk_entry_set_text(GTK_ENTRY(r->label), "");
- gtk_entry_set_text(GTK_ENTRY(r->command), "");
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ {
+ gtk_entry_set_text(GTK_ENTRY(r->entries[i]), "");
+ }
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(r->dir), FALSE);
}
r->cleared = TRUE;
@@ -1457,55 +1503,70 @@
gchar *labeltxt, *cmdtxt;
GeanyBuildCommand *bc;
gint src;
+ enum GeanyBuildCmdEntries i;
gboolean ribd; /* run in base directory */
+
+ gint column = 0;
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);
+ gtk_table_attach(table, label, column, column+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);
- roww->command = gtk_entry_new();
- gtk_table_attach(table, roww->command, 2, 3, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ {
+ column+=1;
+ roww->entries[i] = gtk_entry_new();
+ gtk_table_attach(table, roww->entries[i], column, column+1, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+ }
+ column++;
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, column, column+1,row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
}
else check = NULL;
+
+ column++;
roww->dir = check;
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);
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);
+ gtk_table_attach(table, clear, column, column+1, 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="";
- 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);
+
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ {
+ gchar *str;
+ if (bc!=NULL)
+ {
+ if ((str = bc->entries[i])==NULL)str="";
+ if (i == 0)
+ {
+ ribd = bc->run_in_base_dir;
+ roww->src = src;
+ }
+ }
+ else
+ {
+ str = "";
+ if (i == 0)
+ ribd = FALSE;
+ }
+ gtk_entry_set_text(GTK_ENTRY(roww->entries[i]), str);
+ }
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);
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ gtk_widget_set_sensitive(roww->entries[i], FALSE);
gtk_widget_set_sensitive(check, FALSE);
gtk_widget_set_sensitive(clear, FALSE);
}
@@ -1629,8 +1690,8 @@
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);
+ if (a==NULL && b!=NULL) return -1;
+ if (a!=NULL && b==NULL) return 1;
return strcmp(a, b);
}
@@ -1645,14 +1706,18 @@
static gboolean read_row(BuildDestination *dst, TableData table_data, gint drow, gint grp, gint cmd)
{
- gchar *label, *command;
+ gchar *entries[BC_CMDENTRIES_COUNT];
gboolean dir;
gboolean changed = FALSE;
GeanyBuildSource src;
+ enum GeanyBuildCmdEntries i;
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)));
+
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ {
+ entries[i] = g_strdup(gtk_entry_get_text(GTK_ENTRY(table_data->rows[drow]->entries[i])));
+ }
dir = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table_data->rows[drow]->dir));
if (table_data->rows[drow]->cleared)
{
@@ -1665,18 +1730,18 @@
}
}
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 */
+ (strlen(entries[BC_LABEL])>0 || strlen(entries[BC_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 */
+ (stcmp(entries[BC_LABEL], table_data->rows[drow]->cmdsrc->entries[BC_LABEL])!=0 || /* label is different or */
+ stcmp(entries[BC_COMMAND], table_data->rows[drow]->cmdsrc->entries[BC_COMMAND])!=0 || /* command is different or */
dir != table_data->rows[drow]->cmdsrc->run_in_base_dir))) /* runinbasedir is different */
{
if (dst->dst[grp]!=NULL)
{
if (*(dst->dst[grp])==NULL)
*(dst->dst[grp]) = g_new0(GeanyBuildCommand, build_groups_count[grp]);
- setptr((*(dst->dst[grp]))[cmd].label, label);
- setptr((*(dst->dst[grp]))[cmd].command, command);
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ setptr((*(dst->dst[grp]))[cmd].entries[i], entries[i]);
(*(dst->dst[grp]))[cmd].run_in_base_dir = dir;
(*(dst->dst[grp]))[cmd].exists = TRUE;
(*(dst->dst[grp]))[cmd].changed=TRUE;
@@ -1685,7 +1750,8 @@
}
else
{
- g_free(label); g_free(command);
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ g_free(entries[i]);
}
return changed;
}
@@ -1696,7 +1762,7 @@
gchar *reg = g_strdup(gtk_entry_get_text(GTK_ENTRY(regexentry)));
if (
(
- ( src==NULL /* originally there was no regex or */
+ ( src==NULL /* originally there was no regex */
|| *src==NULL /* or it was NULL*/
)
&& strlen(reg)>0 /* and something was typed */
@@ -1812,7 +1878,7 @@
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 */
+ gint i, cmd, prefixlen; /* NOTE prefixlen used in macros above */
GeanyBuildCommand *dstcmd;
gchar *key;
static gchar cmdbuf[3]=" ";
@@ -1836,10 +1902,10 @@
if (label!=NULL)
{
dstcmd[cmd].exists = TRUE;
- 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,"BD");
+ setptr(dstcmd[cmd].entries[BC_LABEL], label);
+ set_key_fld(key,"CM");
+ setptr(dstcmd[cmd].entries[BC_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);
}
else dstcmd[cmd].exists = FALSE;
@@ -1917,6 +1983,13 @@
gchar *value;
gboolean bvalue;
gint cmd;
+#define ASSIGN(type, id, string, value) \
+ { \
+ type[GBO_TO_CMD(id)].exists = TRUE; \
+ type[GBO_TO_CMD(id)].entries[BC_LABEL] = g_strdup(_(string)); \
+ type[GBO_TO_CMD(id)].entries[BC_COMMAND] = value; \
+ }
+
switch(src)
{
case BCS_FT:
@@ -1925,24 +1998,18 @@
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)].command = value;
+ ASSIGN(ft->filecmds, GBO_COMPILE, "_Compile", value);
}
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)].command = value;
+ ASSIGN(ft->filecmds, GBO_BUILD, "_Build", 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)
{
- 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;
+ ASSIGN(ft->execcmds, GBO_EXEC, "_Execute", value);
}
setptr(ft->error_regex_string, g_key_file_get_string(config, "build_settings", "error_regex", NULL));
break;
@@ -1958,9 +2025,7 @@
if (value !=NULL)
{
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;
+ ASSIGN(exec_proj, GBO_EXEC, "Execute", value);
}
break;
case BCS_PREF:
@@ -1968,15 +2033,9 @@
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"));
- non_ft_pref[GBO_TO_CMD(GBO_MAKE_ALL)].command = value;
- non_ft_pref[GBO_TO_CMD(GBO_MAKE_CUSTOM)].exists = TRUE;
- non_ft_pref[GBO_TO_CMD(GBO_MAKE_CUSTOM)].label = g_strdup(_("Make Custom _Target"));
- non_ft_pref[GBO_TO_CMD(GBO_MAKE_CUSTOM)].command = g_strdup_printf("%s ",value);
- non_ft_pref[GBO_TO_CMD(GBO_MAKE_OBJECT)].exists = TRUE;
- non_ft_pref[GBO_TO_CMD(GBO_MAKE_OBJECT)].label = g_strdup(_("Make _Object"));
- non_ft_pref[GBO_TO_CMD(GBO_MAKE_OBJECT)].command = g_strdup_printf("%s %%e.o",value);
+ ASSIGN(non_ft_pref, GBO_MAKE_ALL, g_strdup(_("_Make All")), value);
+ ASSIGN(non_ft_pref, GBO_MAKE_CUSTOM, g_strdup(_("Make Custom _Target")), g_strdup_printf("%s ",value));
+ ASSIGN(non_ft_pref, GBO_MAKE_OBJECT, g_strdup(_("Make _Object")), g_strdup_printf("%s %%e.o",value));
}
break;
default:
@@ -1990,6 +2049,7 @@
gint cmd, prefixlen; /* NOTE prefixlen used in macros above */
gchar *key;
gint count=0;
+ enum GeanyBuildCmdEntries i;
if (src==NULL)return;
prefixlen = prefix==NULL?0:strlen(prefix);
@@ -2006,20 +2066,22 @@
set_key_fld(key, "LB");
if (src[cmd].exists)
{
- 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,"BD");
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ {
+ g_key_file_set_string(config, build_grp_name, key, src[cmd].entries[i]);
+ set_key_fld(key, config_keys[i]);
+ }
g_key_file_set_boolean(config, build_grp_name, key, src[cmd].run_in_base_dir);
++count;
}
else
{
+ FOREACH_GEANYBUILDCMD_ENTRY(i)
+ {
+ g_key_file_remove_key(config, build_grp_name, key, NULL);
+ set_key_fld(key, config_keys[i]);
+ }
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,"BD");
- g_key_file_remove_key(config, build_grp_name, key, NULL);
}
}
}
@@ -2093,7 +2155,7 @@
data.ft_names = g_ptr_array_new();
g_ptr_array_foreach(pj->build_filetypes_list, foreach_project_filetype, (gpointer)(&data));
if (data.ft_names->pdata!=NULL)
- g_key_file_set_string_list(config, build_grp_name, "filetypes", (gchar**)(data.ft_names->pdata), data.ft_names->len);
+ g_key_file_set_string_list(config, build_grp_name, "filetypes", (const gchar**)(data.ft_names->pdata), data.ft_names->len);
else
g_key_file_remove_key(config, build_grp_name, "filetypes", NULL);
g_ptr_array_free(data.ft_names, TRUE);
@@ -2113,33 +2175,37 @@
}
static struct {
- gchar *label,*command;
+ gchar *entries[BC_CMDENTRIES_COUNT];
gboolean dir;
GeanyBuildCommand **ptr;
gint index;
} default_cmds[] = {
- {N_("_Make"), "make", FALSE, &non_ft_def, GBO_TO_CMD(GBO_MAKE_ALL)},
- {N_("Make Custom _Target"), "make ", FALSE, &non_ft_def, GBO_TO_CMD(GBO_MAKE_CUSTOM)},
- {N_("Make _Object"), "make %e.o", FALSE, &non_ft_def, GBO_TO_CMD(GBO_MAKE_OBJECT)},
- {N_("_Execute"), "./%e", FALSE, &exec_def, GBO_TO_CMD(GBO_EXEC)},
- {NULL, NULL, FALSE, NULL, 0 }
+ { {N_("_Make"), "make"}, FALSE, &non_ft_def, GBO_TO_CMD(GBO_MAKE_ALL)},
+ { {N_("Make Custom _Target"), "make "}, FALSE, &non_ft_def, GBO_TO_CMD(GBO_MAKE_CUSTOM)},
+ { {N_("Make _Object"), "make %e.o" }, FALSE, &non_ft_def, GBO_TO_CMD(GBO_MAKE_OBJECT)},
+ { {N_("_Execute"), "./%e" }, FALSE, &exec_def, GBO_TO_CMD(GBO_EXEC)},
+ { {NULL, NULL}, FALSE, NULL, 0 }
};
void build_init()
{
GtkWidget *item;
GtkWidget *toolmenu;
- gint cmdindex, defindex;
+ gint i, 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)
+ run_info = g_new0(RunInfo, build_groups_count[GBG_EXEC]);
+ for (cmdindex=0; default_cmds[cmdindex].entries[i] != NULL; ++cmdindex)
{
+ enum GeanyBuildCmdEntries k;
GeanyBuildCommand *cmd = &((*(default_cmds[cmdindex].ptr))[ default_cmds[cmdindex].index ]);
cmd->exists = TRUE;
- cmd->label = g_strdup(default_cmds[cmdindex].label);
- cmd->command = g_strdup(default_cmds[cmdindex].command);
+ FOREACH_GEANYBUILDCMD_ENTRY(k)
+ {
+ cmd->entries[k] = g_strdup(default_cmds[cmdindex].entries[k]);
+ }
cmd->run_in_base_dir = default_cmds[cmdindex].dir;
}
Modified: branches/build-system/src/build.h
===================================================================
--- branches/build-system/src/build.h 2009-07-14 18:49:31 UTC (rev 3969)
+++ branches/build-system/src/build.h 2009-07-15 06:55:12 UTC (rev 3970)
@@ -91,10 +91,16 @@
extern GeanyBuildInfo build_info;
+typedef enum GeanyBuildCmdEntries
+{
+ BC_LABEL,
+ BC_COMMAND,
+ BC_CMDENTRIES_COUNT,
+} GeanyBuildCmdEntries;
+
typedef struct GeanyBuildCommand
{
- gchar *label;
- gchar *command;
+ gchar *entries[BC_CMDENTRIES_COUNT];
gboolean exists;
gboolean run_in_base_dir;
gboolean changed;
Modified: branches/build-system/src/filetypes.h
===================================================================
--- branches/build-system/src/filetypes.h 2009-07-14 18:49:31 UTC (rev 3969)
+++ branches/build-system/src/filetypes.h 2009-07-15 06:55:12 UTC (rev 3970)
@@ -32,7 +32,7 @@
typedef enum
{
- GEANY_FILETYPES_NONE = 0, /* first filetype is always None */
+ GEANY_FILETYPES_NONE = 0, /* first filetype is always None & must be 0*/
GEANY_FILETYPES_PHP,
GEANY_FILETYPES_BASIC, /* FreeBasic */
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