From 6108436176d83a50db0bcad70aaffc18c7c8bb94 Mon Sep 17 00:00:00 2001 From: Lex Trotman Date: Tue, 28 Jul 2009 01:38:41 +0000 Subject: [PATCH] Fix warnings, build API and execute toolbutton git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/branches/build-system@4033 ea778897-0a13-0410-b9d1-a72fbfd435f5 --- ChangeLog | 9 +++ src/build.c | 185 ++++++++++++++++++++++-------------------------- src/build.h | 62 +++++++++++----- src/filetypes.c | 8 +-- src/keyfile.c | 10 +-- src/project.c | 34 +-------- 6 files changed, 147 insertions(+), 161 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1b708a73a..f6be77085 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2009-07-28 Lex Trotman + + * src/build.c, src/build.h, src/project.c, src/keyfile.c, src/filetypes.c + Fix some more warnings. + Fix commented out execute/stop toolbar code in build.c. + Add extra plugins documentation for GBO_TO_CMD and GBO_TO_GBG macros. + Changed build.h api so all functions prefixed with build_. + + 2009-07-27 Nick Treleaven * src/build.c, src/build.h, src/project.c: diff --git a/src/build.c b/src/build.c index f0c78fcf5..027716bcd 100644 --- a/src/build.c +++ b/src/build.c @@ -113,7 +113,7 @@ static gboolean build_iofunc(GIOChannel *ioc, GIOCondition cond, gpointer data); #endif static gboolean build_create_shellscript(const gchar *fname, const gchar *cmd, gboolean autoclose); static GPid build_spawn_cmd(GeanyDocument *doc, const gchar *cmd, const gchar *dir); -/* static void set_stop_button(gboolean stop); */ +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_build_next_error(GtkWidget *menuitem, gpointer user_data); @@ -174,9 +174,9 @@ static const gchar* config_keys[] = { }; /*----------------------------------------------------- - * + * * Execute commands and handle results - * + * *-----------------------------------------------------*/ /* the various groups of commands not in the filetype struct */ @@ -333,7 +333,7 @@ static GeanyBuildCommand *get_build_cmd(GeanyDocument *doc, gint grp, gint cmdin #define return_nonblank_regex(src, ptr) if ((ptr)!=NULL && strlen(ptr)>0){ *fr = (src); return &(ptr); } /* like get_build_cmd, but for regexen, used by filetypes */ -gchar **get_build_regex(GeanyBuildGroup grp, GeanyFiletype *ft, gint *from) +gchar **build_get_regex(GeanyBuildGroup grp, GeanyFiletype *ft, gint *from) { gint sink, *fr = &sink; if (from!=NULL) fr=from; @@ -362,7 +362,7 @@ GeanyBuildCommand *get_build_group(GeanyBuildSource src, GeanyBuildGroup grp) { GeanyDocument *doc; GeanyFiletype *ft; - + switch(grp) { case GBG_FT: @@ -398,7 +398,7 @@ GeanyBuildCommand *get_build_group(GeanyBuildSource src, GeanyBuildGroup grp) case BCS_PREF: return exec_pref; case BCS_PROJ: return exec_proj; default: return NULL; - + } break; default: @@ -524,7 +524,7 @@ static gchar* build_replace_placeholder(const GeanyDocument* doc, const gchar* s utils_string_replace_all(stack, "%e", replacement); g_free(replacement); } - + /* replace %p with the current project's (absolute) base directory */ replacement = NULL; /* prevent double free if no replacement found */ if (app->project) @@ -656,7 +656,7 @@ static gchar *prepare_run_script(GeanyDocument *doc, gchar **vte_cmd_nonscript, GeanyProject *project = app->project; GeanyBuildCommand *cmd = NULL; gchar *executable = NULL; - gchar *working_dir = NULL; + gchar *working_dir = NULL, *cmd_working_dir; gboolean autoclose = FALSE; gboolean result = FALSE; gchar *tmp; @@ -672,7 +672,9 @@ static gchar *prepare_run_script(GeanyDocument *doc, gchar **vte_cmd_nonscript, cmd_string = build_replace_placeholder(doc, buildcmd_cmd(cmd)); - working_dir = build_replace_placeholder(doc, buildcmd_working_dir(cmd)); /* in utf-8 */ + cmd_working_dir = buildcmd_working_dir(cmd); + if (!NZV(cmd_working_dir)) cmd_working_dir = "%d"; + working_dir = build_replace_placeholder(doc, cmd_working_dir); /* in utf-8 */ /* only test whether working dir exists, don't change it or else Windows support will break * (gspawn-win32-helper.exe is used by GLib and must be in $PATH which means current working @@ -1031,7 +1033,7 @@ static void build_exit_cb(GPid child_pid, gint status, gpointer user_data) static void run_exit_cb(GPid child_pid, gint status, gpointer user_data) { RunInfo *run_info_data = (RunInfo*)user_data; - + g_spawn_close_pid(child_pid); run_info_data->pid = 0; @@ -1077,7 +1079,7 @@ static void build_command(GeanyDocument *doc, GeanyBuildGroup grp, gint cmd, gch gchar *full_command, *subs_command; GeanyBuildCommand *buildcmd = get_build_cmd(doc, grp, cmd, NULL); gchar* cmdstr; - + if (buildcmd==NULL) return; @@ -1108,9 +1110,9 @@ static void build_command(GeanyDocument *doc, GeanyBuildGroup grp, gint cmd, gch /*---------------------------------------------------------------- - * + * * Create build menu and handle callbacks (&toolbar callbacks) - * + * *----------------------------------------------------------------*/ static void on_make_custom_input_response(const gchar *input) @@ -1190,7 +1192,7 @@ static struct build_menu_item_spec { const gint build_grp, build_cmd; const gchar *fix_label; callback *cb; -} build_menu_specs[] = { +} 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), @@ -1227,7 +1229,7 @@ static struct build_menu_item_spec { 0, NULL, NULL } }; -static void create_build_menu_item(GtkWidget *menu, GeanyKeyGroup *group, GtkAccelGroup *ag, +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); @@ -1235,7 +1237,7 @@ static void create_build_menu_item(GtkWidget *menu, GeanyKeyGroup *group, GtkAcc { 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) @@ -1260,7 +1262,7 @@ static void create_build_menu(BuildMenuItems *build_menu_items) build_menu_items->menu_item[GBG_NON_FT] = g_new0(GtkWidget*, build_groups_count[GBG_NON_FT]); build_menu_items->menu_item[GBG_EXEC] = g_new0(GtkWidget*, build_groups_count[GBG_EXEC]); build_menu_items->menu_item[GBG_FIXED] = g_new0(GtkWidget*, GBF_COUNT); - + for (i=0; build_menu_specs[i].build_grp != MENU_DONE; ++i) { struct build_menu_item_spec *bs = &(build_menu_specs[i]); @@ -1314,9 +1316,9 @@ void build_menu_update(GeanyDocument *doc) gint i, cmdcount, cmd, grp; gboolean vis=FALSE; gboolean have_path, build_running, exec_running, have_errors, cmd_sensitivity; - gboolean can_compile, can_make; + gboolean can_compile, can_make, run_sensitivity, run_running; GeanyBuildCommand *bc; - + if (menu_items.menu==NULL) create_build_menu(&menu_items); if (doc == NULL) @@ -1369,7 +1371,7 @@ void build_menu_update(GeanyDocument *doc) if (grp < GBG_EXEC) { - cmd_sensitivity = + 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); @@ -1389,6 +1391,7 @@ void build_menu_update(GeanyDocument *doc) exec_running = run_info[cmd].pid>1; cmd_sensitivity = bc!=NULL || exec_running; gtk_widget_set_sensitive(menu_item, cmd_sensitivity); + if (cmd==GBO_TO_CMD(GBO_EXEC)) run_sensitivity = cmd_sensitivity; if (!exec_running) { image = gtk_image_new_from_stock(bs->stock_id, GTK_ICON_SIZE_MENU); @@ -1397,6 +1400,7 @@ void build_menu_update(GeanyDocument *doc) { image = gtk_image_new_from_stock(GTK_STOCK_STOP, GTK_ICON_SIZE_MENU); } + if (cmd==GBO_TO_CMD(GBO_EXEC)) run_running = exec_running; gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image); if (bc != NULL && label != NULL && strlen(label) > 0) @@ -1411,44 +1415,41 @@ void build_menu_update(GeanyDocument *doc) } } } - + can_compile = get_build_cmd(doc, GBG_FT, GBO_TO_CMD(GBO_BUILD), NULL)!=NULL && have_path && ! build_running; if (widgets.toolitem_build != NULL) gtk_widget_set_sensitive(widgets.toolitem_build, can_compile); can_make = FALSE; if (widgets.toolitem_make_all != NULL) - gtk_widget_set_sensitive(widgets.toolitem_make_all, - (can_make |= get_build_cmd(doc, GBG_FT, GBO_TO_CMD(GBO_MAKE_ALL), NULL)!=NULL + gtk_widget_set_sensitive(widgets.toolitem_make_all, + (can_make |= get_build_cmd(doc, GBG_FT, GBO_TO_CMD(GBO_MAKE_ALL), NULL)!=NULL && ! build_running)); if (widgets.toolitem_make_custom != NULL) - gtk_widget_set_sensitive(widgets.toolitem_make_custom, - (can_make |= get_build_cmd(doc, GBG_FT, GBO_TO_CMD(GBO_MAKE_CUSTOM), NULL)!=NULL + gtk_widget_set_sensitive(widgets.toolitem_make_custom, + (can_make |= get_build_cmd(doc, GBG_FT, GBO_TO_CMD(GBO_MAKE_CUSTOM), NULL)!=NULL && ! build_running)); if (widgets.toolitem_make_object != NULL) gtk_widget_set_sensitive(widgets.toolitem_make_object, - (can_make |= get_build_cmd(doc, GBG_FT, GBO_TO_CMD(GBO_MAKE_OBJECT), NULL)!=NULL + (can_make |= get_build_cmd(doc, GBG_FT, GBO_TO_CMD(GBO_MAKE_OBJECT), NULL)!=NULL && ! build_running)); if (widgets.toolitem_set_args != NULL) gtk_widget_set_sensitive(widgets.toolitem_set_args, TRUE); gtk_action_set_sensitive(widgets.compile_action, can_compile); gtk_action_set_sensitive(widgets.build_action, can_make ); -/* gtk_action_set_sensitive(widgets.run_action, can_run || can_stop); */ + gtk_action_set_sensitive(widgets.run_action, run_sensitivity); - /* show the stop command if a program is running, otherwise show run command - set_stop_button(can_stop); */ + /* show the stop command if a program is running from execute 0 , otherwise show run command */ + set_stop_button(run_running); } /* Call build_menu_update() instead of calling this directly. */ -#if 0 static void set_stop_button(gboolean stop) { const gchar *button_stock_id = NULL; - GtkStockItem sitem; GtkToolButton *run_button; - GtkWidget *menuitem = build_get_menu_items(run_info.file_type_id)->item_exec; run_button = GTK_TOOL_BUTTON(toolbar_get_widget_by_name("Run")); if (run_button != NULL) @@ -1459,38 +1460,18 @@ static void set_stop_button(gboolean stop) if (! stop && utils_str_equal(button_stock_id, "gtk-execute")) return; - /* use the run button also as stop button */ + /* use the run button also as stop button */ if (stop) { if (run_button != NULL) gtk_tool_button_set_stock_id(run_button, "gtk-stop"); - - if (menuitem != NULL) - { - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), - gtk_image_new_from_stock("gtk-stop", GTK_ICON_SIZE_MENU)); - gtk_stock_lookup("gtk-stop", &sitem); - gtk_label_set_text_with_mnemonic(GTK_LABEL(gtk_bin_get_child(GTK_BIN(menuitem))), - sitem.label); - } } else { if (run_button != NULL) gtk_tool_button_set_stock_id(run_button, "gtk-execute"); - - if (menuitem != NULL) - { - gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), - gtk_image_new_from_stock("gtk-execute", GTK_ICON_SIZE_MENU)); - - gtk_stock_lookup("gtk-execute", &sitem); - gtk_label_set_text_with_mnemonic(GTK_LABEL(gtk_bin_get_child(GTK_BIN(menuitem))), - sitem.label); - } } } -#endif static void on_set_build_commands_activate(GtkWidget *w, gpointer u) { @@ -1596,9 +1577,9 @@ void build_toolbutton_build_clicked(GtkAction *action, gpointer unused) } /*------------------------------------------------------ - * + * * Create and handle the build menu configuration dialog - * + * *-------------------------------------------------------*/ typedef struct RowWidgets { @@ -1663,11 +1644,11 @@ static RowWidgets *build_add_dialog_row(GeanyDocument *doc, GtkTable *table, gin GtkWidget *label, *clear, *clearicon; RowWidgets *roww; GeanyBuildCommand *bc; - guint src; + gint src; enum GeanyBuildCmdEntries i; gint column = 0; - + label = gtk_label_new(g_strdup_printf("%d:", cmd+1)); gtk_table_attach(table, label, column, column+1, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding); @@ -1722,7 +1703,7 @@ GtkWidget *build_commands_table(GeanyDocument *doc, GeanyBuildSource dst, TableD GtkTable *table; gchar **ch, *txt; gint col, row, cmdindex, cmd; - guint src; + gint src; gboolean sensitivity; table = GTK_TABLE(gtk_table_new(build_items_count+12, 5, FALSE)); @@ -1752,7 +1733,7 @@ GtkWidget *build_commands_table(GeanyDocument *doc, GeanyBuildSource dst, TableD gtk_table_attach(table, label, 0, DC_ENTRIES+1, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding); fields->fileregex = gtk_entry_new(); - fields->fileregexstring = get_build_regex(GBG_FT, NULL, &src); + fields->fileregexstring = build_get_regex(GBG_FT, NULL, &src); sensitivity = ft==NULL?FALSE:TRUE; if (fields->fileregexstring!=NULL && *(fields->fileregexstring)!=NULL) { @@ -1785,7 +1766,7 @@ GtkWidget *build_commands_table(GeanyDocument *doc, GeanyBuildSource dst, TableD gtk_table_attach(table, label, 0, DC_ENTRIES+1, row, row+1, GTK_FILL, GTK_FILL | GTK_EXPAND, entry_x_padding, entry_y_padding); fields->nonfileregex = gtk_entry_new(); - fields->nonfileregexstring = get_build_regex(GBG_NON_FT, NULL, &src); + fields->nonfileregexstring = build_get_regex(GBG_NON_FT, NULL, &src); sensitivity = TRUE; if (fields->nonfileregexstring!=NULL && *(fields->nonfileregexstring)!=NULL) { @@ -1882,7 +1863,7 @@ static gboolean read_row(BuildDestination *dst, TableData table_data, gint drow, && ( strlen(entries[BC_LABEL])>0 /* but now one field has some */ - || strlen(entries[BC_COMMAND])>0 + || strlen(entries[BC_COMMAND])>0 || strlen(entries[BC_WORKING_DIR])>0 ) ) @@ -1948,7 +1929,7 @@ gboolean read_build_commands(BuildDestination *dst, TableData table_data, gint r { gint cmdindex, cmd; gboolean changed = FALSE; - + if (response == GTK_RESPONSE_ACCEPT) { for (cmdindex=0, cmd=0; cmdfilecmds), 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); + build_load_menu_grp(config, &(ft->filecmds), GBG_FT, NULL, TRUE); + build_load_menu_grp(config, &(ft->ftdefcmds), GBG_NON_FT, NULL, TRUE); + build_load_menu_grp(config, &(ft->execcmds), GBG_EXEC, NULL, TRUE); setptr(ft->error_regex_string, g_key_file_get_string(config, build_grp_name, "error_regex", NULL)); 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); + build_load_menu_grp(config, &(ft->homefilecmds), GBG_FT, NULL, FALSE); + build_load_menu_grp(config, &(ft->homeexeccmds), GBG_EXEC, NULL, FALSE); setptr(ft->homeerror_regex_string, g_key_file_get_string(config, build_grp_name, "error_regex", NULL)); 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); + build_load_menu_grp(config, &non_ft_pref, GBG_NON_FT, NULL, FALSE); + build_load_menu_grp(config, &exec_pref, GBG_EXEC, NULL, FALSE); setptr(regex_pref, g_key_file_get_string(config, build_grp_name, "error_regex", NULL)); 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); + build_load_menu_grp(config, &non_ft_proj, GBG_NON_FT, NULL, FALSE); + build_load_menu_grp(config, &exec_proj, GBG_EXEC, NULL, FALSE); setptr(regex_proj, g_key_file_get_string(config, build_grp_name, "error_regex", NULL)); pj = (GeanyProject*)p; if (p==NULL)return; @@ -2141,7 +2122,7 @@ void load_build_menu(GKeyFile *config, GeanyBuildSource src, gpointer p) { gchar *regkey = g_strdup_printf("%serror_regex", *ftname); g_ptr_array_add(pj->build_filetypes_list, ft); - load_build_menu_grp(config, &(ft->projfilecmds), GBG_FT, *ftname, FALSE); + build_load_menu_grp(config, &(ft->projfilecmds), GBG_FT, *ftname, FALSE); setptr(ft->projerror_regex_string, g_key_file_get_string(config, build_grp_name, regkey, NULL)); g_free(regkey); @@ -2154,9 +2135,9 @@ void load_build_menu(GKeyFile *config, GeanyBuildSource src, gpointer p) break; } } - + /* load old [build_settings] values if there is no value defined by [build-menu] */ - + /* set GeanyBuildCommand if it doesn't already exist and there is a command */ #define ASSIGNIF(type, id, string, value) \ if (value!=NULL && !type[GBO_TO_CMD(id)].exists && strlen(value)>0) { \ @@ -2167,7 +2148,7 @@ void load_build_menu(GKeyFile *config, GeanyBuildSource src, gpointer p) type[GBO_TO_CMD(id)].old = TRUE; \ } else \ g_free(value); - + switch(src) { case BCS_FT: @@ -2214,13 +2195,13 @@ void load_build_menu(GKeyFile *config, GeanyBuildSource src, gpointer p) } } -static gint save_build_menu_grp(GKeyFile *config, GeanyBuildCommand *src, gint grp, gchar *prefix) +static gint build_save_menu_grp(GKeyFile *config, GeanyBuildCommand *src, gint grp, gchar *prefix) { gint cmd, prefixlen; /* NOTE prefixlen used in macros above */ gchar *key; gint count=0; enum GeanyBuildCmdEntries i; - + if (src==NULL)return 0; prefixlen = prefix==NULL?0:strlen(prefix); key = g_strconcat(prefix==NULL?"":prefix, fixedkey, NULL); @@ -2245,7 +2226,7 @@ static gint save_build_menu_grp(GKeyFile *config, GeanyBuildCommand *src, gint g else { FOREACH_GEANYBUILDCMD_ENTRY(i) - { + { set_key_fld(key, config_keys[i]); g_key_file_remove_key(config, build_grp_name, key, NULL); } @@ -2268,8 +2249,8 @@ static void foreach_project_filetype(gpointer data, gpointer user_data) ForEachData *d = (ForEachData*)user_data; gint i=0; gchar *regkey = g_strdup_printf("%serror_regex", ft->name); - - i += save_build_menu_grp(d->config, ft->projfilecmds, GBG_FT, ft->name); + + i += build_save_menu_grp(d->config, ft->projfilecmds, GBG_FT, ft->name); if (ft->projerror_regex_string!=NULL && strlen(ft->projerror_regex_string)>0) { g_key_file_set_string(d->config, build_grp_name, regkey, ft->projerror_regex_string); @@ -2281,20 +2262,20 @@ static void foreach_project_filetype(gpointer data, gpointer user_data) if (i>0)g_ptr_array_add(d->ft_names, ft->name); } -void save_build_menu(GKeyFile *config, gpointer ptr, GeanyBuildSource src) +void build_save_menu(GKeyFile *config, gpointer ptr, GeanyBuildSource src) { GeanyFiletype *ft; GeanyProject *pj; ForEachData data; gchar *regkey; - + switch(src) { 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); + build_save_menu_grp(config, ft->homefilecmds, GBG_FT, NULL); + build_save_menu_grp(config, ft->homeexeccmds, GBG_EXEC, NULL); regkey = g_strdup_printf("%serror_regex", ft->name); if (ft->homeerror_regex_string!=NULL && strlen(ft->homeerror_regex_string)>0) g_key_file_set_string(config, build_grp_name, regkey, ft->projerror_regex_string); @@ -2303,8 +2284,8 @@ void save_build_menu(GKeyFile *config, gpointer ptr, GeanyBuildSource src) g_free(regkey); 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); + build_save_menu_grp(config, non_ft_pref, GBG_NON_FT, NULL); + build_save_menu_grp(config, exec_pref, GBG_EXEC, NULL); if (regex_pref!=NULL && strlen(regex_pref)>0) g_key_file_set_string(config, build_grp_name, "error_regex", regex_pref); else @@ -2312,8 +2293,8 @@ void save_build_menu(GKeyFile *config, gpointer ptr, GeanyBuildSource src) 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); + build_save_menu_grp(config, non_ft_proj, GBG_NON_FT, NULL); + build_save_menu_grp(config, exec_proj, GBG_EXEC, NULL); if (regex_proj!=NULL && strlen(regex_proj)>0) g_key_file_set_string(config, build_grp_name, "error_regex", regex_proj); else @@ -2336,7 +2317,7 @@ void save_build_menu(GKeyFile *config, gpointer ptr, GeanyBuildSource src) } } -void set_build_grp_count(GeanyBuildGroup grp, gint count) +void build_set_group_count(GeanyBuildGroup grp, gint count) { gint i, sum; if (count>build_groups_count[grp]) @@ -2345,7 +2326,7 @@ void set_build_grp_count(GeanyBuildGroup grp, gint count) build_items_count = sum; } -gint get_build_group_count(GeanyBuildGroup grp) +gint build_get_group_count(GeanyBuildGroup grp) { return build_groups_count[grp]; } @@ -2354,9 +2335,9 @@ static struct { gchar *entries[BC_CMDENTRIES_COUNT]; GeanyBuildCommand **ptr; gint index; -} default_cmds[] = { - { {N_("_Make"), "make", NULL}, &non_ft_def, GBO_TO_CMD(GBO_MAKE_ALL)}, - { {N_("Make Custom _Target"), "make ", NULL}, &non_ft_def, GBO_TO_CMD(GBO_MAKE_CUSTOM)}, +} default_cmds[] = { + { {N_("_Make"), "make", NULL}, &non_ft_def, GBO_TO_CMD(GBO_MAKE_ALL)}, + { {N_("Make Custom _Target"), "make ", NULL}, &non_ft_def, GBO_TO_CMD(GBO_MAKE_CUSTOM)}, { {N_("Make _Object"), "make %e.o", NULL }, &non_ft_def, GBO_TO_CMD(GBO_MAKE_OBJECT)}, { {N_("_Execute"), "./%e", NULL }, &exec_def, GBO_TO_CMD(GBO_EXEC)}, { {NULL, NULL, NULL}, NULL, 0 } diff --git a/src/build.h b/src/build.h index 2b19be0de..9ebd3d91d 100644 --- a/src/build.h +++ b/src/build.h @@ -28,17 +28,20 @@ #define GEANY_BUILD_ERR_HIGHLIGHT_MAX 100 -/* Geany Known Build Commands, currently only these can have keybindings - * Order is important (see GBO_TO_GBG, GBO_TO_CMD below) */ +/* Order is important (see GBO_TO_GBG, GBO_TO_CMD below) */ +/** Geany Known Build Commands. + * These commands are named after their default use. + * Only these commands can currently have keybindings. + **/ typedef enum { - GBO_COMPILE, - GBO_BUILD, - GBO_MAKE_ALL, - GBO_MAKE_CUSTOM, - GBO_MAKE_OBJECT, - GBO_EXEC, - GBO_COUNT /* count of how many */ + GBO_COMPILE, /**< default compile file */ + GBO_BUILD, /**< default build file */ + GBO_MAKE_ALL, /**< default make */ + GBO_MAKE_CUSTOM, /**< default make user specified target */ + GBO_MAKE_OBJECT, /**< default make object, make %e.o */ + GBO_EXEC, /**< default execute ./%e */ + GBO_COUNT /**< count of how many */ } GeanyBuildType; /** Groups of Build menu items. */ @@ -53,10 +56,33 @@ typedef enum /* include the fixed widgets in an array indexed by groups */ #define GBG_FIXED GBG_COUNT -/* convert GBO_xxx to GBG_xxx and command number - * Note they are macros so they can be used in static initialisers */ -#define GBO_TO_GBG(gbo) ((gbo)>GBO_EXEC?GBG_COUNT:((gbo)>=GBO_EXEC?GBG_EXEC:((gbo)>=GBO_MAKE_ALL?GBG_NON_FT:GBG_FT))) -#define GBO_TO_CMD(gbo) ((gbo)>=GBO_COUNT?(gbo)-GBO_COUNT:((gbo)>=GBO_EXEC?(gbo)-GBO_EXEC:((gbo)>=GBO_MAKE_ALL?(gbo)-GBO_MAKE_ALL:(gbo)))) +/** Convert @c GeanyBuildType to @c GeanyBuildGroup . + * + * This macro converts @c GeanyBiuildType enum values (the "known" commands) + * to the group they are part of. + * + * @param gbo the @c GeanyBuildType value. + * + * @return the @c GeanyBuildGroup group that @a gbo is in. + * + * Note this is a macro so that it can be used in static initialisers + **/ +#define GBO_TO_GBG(gbo) ((gbo)>GBO_EXEC?GBG_COUNT:((gbo)>=GBO_EXEC?GBG_EXEC: \ + ((gbo)>=GBO_MAKE_ALL?GBG_NON_FT:GBG_FT))) + +/** Convert @c GeanyBuildType to command index. + * + * This macro converts @c GeanyBuildType enum values (the "known" commands) + * to the index within the group. + * + * @param gbo the @c GeanyBuildType value. + * + * @return the index of the @a gbo command in its group. + * + * Note this is a macro so that it can be used in static initialisers + **/ +#define GBO_TO_CMD(gbo) ((gbo)>=GBO_COUNT?(gbo)-GBO_COUNT:((gbo)>=GBO_EXEC?(gbo)-GBO_EXEC: \ + ((gbo)>=GBO_MAKE_ALL?(gbo)-GBO_MAKE_ALL:(gbo)))) enum GeanyBuildFixedMenuItems { @@ -230,14 +256,14 @@ GeanyBuildCommand *build_get_current_menu_item(GeanyBuildGroup grp, gint cmd, gi BuildMenuItems *build_get_menu_items(gint filetype_idx); /* load and store menu configuration */ -void load_build_menu( GKeyFile *config, GeanyBuildSource dst, gpointer ptr); +void build_load_menu( GKeyFile *config, GeanyBuildSource dst, gpointer ptr); -void save_build_menu( GKeyFile *config, gpointer ptr, GeanyBuildSource src); +void build_save_menu( GKeyFile *config, gpointer ptr, GeanyBuildSource src); -void set_build_grp_count(GeanyBuildGroup grp, gint count); +void build_set_group_count(GeanyBuildGroup grp, gint count); -gint get_build_group_count(GeanyBuildGroup grp); +gint build_get_group_count(GeanyBuildGroup grp); -gchar **get_build_regex(GeanyBuildGroup grp, GeanyFiletype *ft, gint *from); +gchar **build_get_regex(GeanyBuildGroup grp, GeanyFiletype *ft, gint *from); #endif diff --git a/src/filetypes.c b/src/filetypes.c index aafb0c2fa..4e5de1fea 100644 --- a/src/filetypes.c +++ b/src/filetypes.c @@ -1126,8 +1126,8 @@ static void load_settings(gint ft_id, GKeyFile *config, GKeyFile *configh) } /* read build settings */ - load_build_menu( config, BCS_FT, (gpointer)ft ); - load_build_menu( configh, BCS_HOME_FT, (gpointer)ft ); + build_load_menu( config, BCS_FT, (gpointer)ft ); + build_load_menu( configh, BCS_HOME_FT, (gpointer)ft ); } @@ -1226,7 +1226,7 @@ void filetypes_save_commands(void) 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); + build_save_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); @@ -1346,7 +1346,7 @@ gboolean filetypes_parse_error_message(GeanyFiletype *ft, const gchar *message, doc = document_get_current(); if(doc!=NULL)ft = doc->file_type; } - tmp = get_build_regex(build_info.grp, ft, NULL); + tmp = build_get_regex(build_info.grp, ft, NULL); if (tmp==NULL) return FALSE; regstr = *tmp; #ifndef HAVE_REGCOMP diff --git a/src/keyfile.c b/src/keyfile.c index 9a19ca743..62da4ac5a 100644 --- a/src/keyfile.c +++ b/src/keyfile.c @@ -407,7 +407,7 @@ static void save_dialog_prefs(GKeyFile *config) g_key_file_set_string(config, PACKAGE, "context_action_cmd", tool_prefs.context_action_cmd); /* build menu */ - save_build_menu( config, NULL, BCS_PREF ); + build_save_menu( config, NULL, BCS_PREF ); /* printing */ g_key_file_set_string(config, "printing", "print_cmd", printing_prefs.external_print_cmd ? printing_prefs.external_print_cmd : ""); @@ -773,10 +773,10 @@ static void load_dialog_prefs(GKeyFile *config) tool_prefs.context_action_cmd = utils_get_setting_string(config, PACKAGE, "context_action_cmd", ""); /* build menu */ - set_build_grp_count( GBG_FT, utils_get_setting_integer( config, "build-menu", "number_ft_menu_items", 0 )); - set_build_grp_count( GBG_NON_FT, utils_get_setting_integer( config, "build-menu", "number_non_ft_menu_items", 0 )); - set_build_grp_count( GBG_EXEC, utils_get_setting_integer( config, "build-menu", "number_exec_menu_items", 0 )); - load_build_menu( config, BCS_PREF, NULL ); + build_set_group_count( GBG_FT, utils_get_setting_integer( config, "build-menu", "number_ft_menu_items", 0 )); + build_set_group_count( GBG_NON_FT, utils_get_setting_integer( config, "build-menu", "number_non_ft_menu_items", 0 )); + build_set_group_count( GBG_EXEC, utils_get_setting_integer( config, "build-menu", "number_exec_menu_items", 0 )); + build_load_menu( config, BCS_PREF, NULL ); /* printing */ tmp_string2 = g_find_program_in_path(GEANY_DEFAULT_TOOLS_PRINTCMD); diff --git a/src/project.c b/src/project.c index c0071295d..e10b83aae 100644 --- a/src/project.c +++ b/src/project.c @@ -86,7 +86,6 @@ typedef struct _PropertyDialogElements static gboolean update_config(const PropertyDialogElements *e); static void on_file_save_button_clicked(GtkButton *button, PropertyDialogElements *e); -static void on_file_open_button_clicked(GtkButton *button, PropertyDialogElements *e); static gboolean load_config(const gchar *filename); static gboolean write_config(gboolean emit_signal); static void on_name_entry_changed(GtkEditable *editable, PropertyDialogElements *e); @@ -868,35 +867,6 @@ static void on_file_save_button_clicked(GtkButton *button, PropertyDialogElement } -static void on_file_open_button_clicked(GtkButton *button, PropertyDialogElements *e) -{ -#ifdef G_OS_WIN32 - gchar *path = win32_show_project_open_dialog(e->dialog, _("Choose Project Run Command"), - gtk_entry_get_text(GTK_ENTRY(e->run_cmd)), FALSE, FALSE); - if (path != NULL) - { - gtk_entry_set_text(GTK_ENTRY(e->run_cmd), path); - g_free(path); - } -#else - GtkWidget *dialog; - - /* initialise the dialog */ - dialog = gtk_file_chooser_dialog_new(_("Choose Project Run Command"), NULL, - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); - gtk_widget_set_name(dialog, "GeanyDialog"); - gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); - gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT); - - run_dialog(dialog, e->run_cmd); -#endif -} - - /* sets the project base path and the project file name according to the project name */ static void on_name_entry_changed(GtkEditable *editable, PropertyDialogElements *e) { @@ -999,7 +969,7 @@ static gboolean load_config(const gchar *filename) p->run_cmd = utils_get_setting_string(config, "project", "run_cmd", ""); p->file_patterns = g_key_file_get_string_list(config, "project", "file_patterns", NULL, NULL); - load_build_menu( config, BCS_PROJ, (gpointer)p ); + build_load_menu( config, BCS_PROJ, (gpointer)p ); if (project_prefs.project_session) { /* save current (non-project) session (it could has been changed since program startup) */ @@ -1056,7 +1026,7 @@ static gboolean write_config(gboolean emit_signal) /* store the session files into the project too */ if (project_prefs.project_session) configuration_save_session_files(config); - save_build_menu( config, (gpointer)p, BCS_PROJ ); + build_save_menu( config, (gpointer)p, BCS_PROJ ); if (emit_signal) { g_signal_emit_by_name(geany_object, "project-save", config);