Make all filetypes except LaTeX use the same build menu, disabling
any items that don't apply for the current document. Move BuildMenuItems struct type to build.h. git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@1038 ea778897-0a13-0410-b9d1-a72fbfd435f5master
parent
df70d928a8
commit
e458304ce3
|
@ -3,6 +3,11 @@
|
|||
* src/main.c:
|
||||
Disable open toolbutton recent files menu for now because on
|
||||
GTK+2.10 packing the recent files menu twice causes warnings.
|
||||
* src/build.c, src/build.h, src/keybindings.c, src/callbacks.c,
|
||||
src/filetypes.c, src/filetypes.h, src/dialogs.c:
|
||||
Make all filetypes except LaTeX use the same build menu, disabling
|
||||
any items that don't apply for the current document.
|
||||
Move BuildMenuItems struct type to build.h.
|
||||
|
||||
|
||||
2006-11-29 Nick Treleaven <nick.treleaven@btinternet.com>
|
||||
|
|
246
src/build.c
246
src/build.c
|
@ -62,6 +62,11 @@ enum
|
|||
LATEX_CMD_VIEW_PDF
|
||||
};
|
||||
|
||||
static BuildMenuItems default_menu_items =
|
||||
{NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
||||
static BuildMenuItems latex_menu_items =
|
||||
{NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
|
||||
|
||||
|
||||
static gboolean build_iofunc(GIOChannel *ioc, GIOCondition cond, gpointer data);
|
||||
static gboolean build_create_shellscript(const gint idx, const gchar *fname, const gchar *cmd,
|
||||
|
@ -82,6 +87,11 @@ void build_finalize()
|
|||
{
|
||||
g_free(build_info.dir);
|
||||
g_free(build_info.custom_target);
|
||||
|
||||
if (default_menu_items.menu != NULL && GTK_IS_WIDGET(default_menu_items.menu))
|
||||
gtk_widget_destroy(default_menu_items.menu);
|
||||
if (latex_menu_items.menu != NULL && GTK_IS_WIDGET(latex_menu_items.menu))
|
||||
gtk_widget_destroy(latex_menu_items.menu);
|
||||
}
|
||||
|
||||
|
||||
|
@ -793,49 +803,40 @@ static gboolean build_create_shellscript(const gint idx, const gchar *fname, con
|
|||
gtk_widget_add_accelerator(menuitem, "activate", accel_group, \
|
||||
keys[(gkey)]->key, keys[(gkey)]->mods, GTK_ACCEL_VISIBLE)
|
||||
|
||||
static GtkWidget *create_build_menu_gen(gint idx)
|
||||
static void create_build_menu_gen(BuildMenuItems *menu_items)
|
||||
{
|
||||
GtkWidget *menu, *item = NULL, *image, *separator;
|
||||
GtkAccelGroup *accel_group = gtk_accel_group_new();
|
||||
GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips"));
|
||||
filetype *ft = doc_list[idx].file_type;
|
||||
|
||||
menu = gtk_menu_new();
|
||||
|
||||
#ifndef G_OS_WIN32
|
||||
if (ft->menu_items->can_compile)
|
||||
{
|
||||
// compile the code
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("_Compile"));
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
gtk_tooltips_set_tip(tooltips, item, _("Compiles the current file"), NULL);
|
||||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_COMPILE, item);
|
||||
image = gtk_image_new_from_stock("gtk-convert", GTK_ICON_SIZE_MENU);
|
||||
gtk_widget_show(image);
|
||||
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_compile_activate), NULL);
|
||||
ft->menu_items->item_compile = item;
|
||||
}
|
||||
// compile the code
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("_Compile"));
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
gtk_tooltips_set_tip(tooltips, item, _("Compiles the current file"), NULL);
|
||||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_COMPILE, item);
|
||||
image = gtk_image_new_from_stock("gtk-convert", GTK_ICON_SIZE_MENU);
|
||||
gtk_widget_show(image);
|
||||
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_compile_activate), NULL);
|
||||
menu_items->item_compile = item;
|
||||
|
||||
if (ft->menu_items->can_link)
|
||||
{ // build the code
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("_Build"));
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
gtk_tooltips_set_tip(tooltips, item,
|
||||
_("Builds the current file (generate an executable file)"), NULL);
|
||||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_LINK, item);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_build_activate), NULL);
|
||||
ft->menu_items->item_link = item;
|
||||
}
|
||||
// build the code
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("_Build"));
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
gtk_tooltips_set_tip(tooltips, item,
|
||||
_("Builds the current file (generate an executable file)"), NULL);
|
||||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_LINK, item);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_build_activate), NULL);
|
||||
menu_items->item_link = item;
|
||||
|
||||
if (item != NULL)
|
||||
{
|
||||
item = gtk_separator_menu_item_new();
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
}
|
||||
item = gtk_separator_menu_item_new();
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
|
||||
// build the code with make all
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("_Make all"));
|
||||
|
@ -846,7 +847,7 @@ static GtkWidget *create_build_menu_gen(gint idx)
|
|||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_MAKE, item);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_make_activate),
|
||||
GINT_TO_POINTER(GBO_MAKE_ALL));
|
||||
ft->menu_items->item_make_all = item;
|
||||
menu_items->item_make_all = item;
|
||||
|
||||
// build the code with make custom
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("Make custom _target"));
|
||||
|
@ -857,7 +858,7 @@ static GtkWidget *create_build_menu_gen(gint idx)
|
|||
"make tool and the specified target"), NULL);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_make_activate),
|
||||
GINT_TO_POINTER(GBO_MAKE_CUSTOM));
|
||||
ft->menu_items->item_make_custom = item;
|
||||
menu_items->item_make_custom = item;
|
||||
|
||||
// build the code with make object
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("Make _object"));
|
||||
|
@ -868,56 +869,51 @@ static GtkWidget *create_build_menu_gen(gint idx)
|
|||
"make tool"), NULL);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_make_activate),
|
||||
GINT_TO_POINTER(GBO_MAKE_OBJECT));
|
||||
ft->menu_items->item_make_object = item;
|
||||
menu_items->item_make_object = item;
|
||||
#endif
|
||||
|
||||
if (ft->menu_items->can_exec)
|
||||
{ // execute the code
|
||||
item = gtk_separator_menu_item_new();
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
item = gtk_separator_menu_item_new();
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
|
||||
item = gtk_image_menu_item_new_from_stock("gtk-execute", accel_group);
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
gtk_tooltips_set_tip(tooltips, item, _("Run or view the current file"), NULL);
|
||||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_RUN, item);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_execute_activate), NULL);
|
||||
ft->menu_items->item_exec = item;
|
||||
}
|
||||
// execute the code
|
||||
item = gtk_image_menu_item_new_from_stock("gtk-execute", accel_group);
|
||||
gtk_widget_show(item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
gtk_tooltips_set_tip(tooltips, item, _("Run or view the current file"), NULL);
|
||||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_RUN, item);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_execute_activate), NULL);
|
||||
menu_items->item_exec = item;
|
||||
|
||||
separator = gtk_separator_menu_item_new();
|
||||
gtk_widget_show(separator);
|
||||
gtk_container_add(GTK_CONTAINER(menu), separator);
|
||||
gtk_widget_set_sensitive(separator, FALSE);
|
||||
|
||||
// arguments
|
||||
if (ft->menu_items->can_compile || ft->menu_items->can_link || ft->menu_items->can_exec)
|
||||
{
|
||||
// separator
|
||||
separator = gtk_separator_menu_item_new();
|
||||
gtk_widget_show(separator);
|
||||
gtk_container_add(GTK_CONTAINER(menu), separator);
|
||||
gtk_widget_set_sensitive(separator, FALSE);
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("_Set Includes and Arguments"));
|
||||
gtk_widget_show(item);
|
||||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_OPTIONS, item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
gtk_tooltips_set_tip(tooltips, item,
|
||||
_("Sets the includes and library paths for the compiler and "
|
||||
"the program arguments for execution"), NULL);
|
||||
image = gtk_image_new_from_stock("gtk-preferences", GTK_ICON_SIZE_MENU);
|
||||
gtk_widget_show(image);
|
||||
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_arguments_activate), NULL);
|
||||
menu_items->item_set_args = item;
|
||||
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("_Set Includes and Arguments"));
|
||||
gtk_widget_show(item);
|
||||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_OPTIONS, item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), item);
|
||||
gtk_tooltips_set_tip(tooltips, item,
|
||||
_("Sets the includes and library paths for the compiler and "
|
||||
"the program arguments for execution"), NULL);
|
||||
image = gtk_image_new_from_stock("gtk-preferences", GTK_ICON_SIZE_MENU);
|
||||
gtk_widget_show(image);
|
||||
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_arguments_activate), NULL);
|
||||
}
|
||||
|
||||
return menu;
|
||||
menu_items->menu = menu;
|
||||
g_object_ref((gpointer)menu_items->menu); // to hold it after removing
|
||||
}
|
||||
|
||||
|
||||
static GtkWidget *create_build_menu_tex()
|
||||
static void create_build_menu_tex(BuildMenuItems *menu_items)
|
||||
{
|
||||
GtkWidget *menu, *item, *image, *separator;
|
||||
GtkAccelGroup *accel_group = gtk_accel_group_new();
|
||||
GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips"));
|
||||
filetype *ft = filetypes[GEANY_FILETYPES_LATEX];
|
||||
|
||||
menu = gtk_menu_new();
|
||||
|
||||
|
@ -935,7 +931,7 @@ static GtkWidget *create_build_menu_tex()
|
|||
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
|
||||
g_signal_connect((gpointer) item, "activate",
|
||||
G_CALLBACK(on_build_tex_activate), GINT_TO_POINTER(LATEX_CMD_TO_DVI));
|
||||
ft->menu_items->item_compile = item;
|
||||
menu_items->item_compile = item;
|
||||
|
||||
// PDF
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("LaTeX -> PDF"));
|
||||
|
@ -950,7 +946,7 @@ static GtkWidget *create_build_menu_tex()
|
|||
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
|
||||
g_signal_connect((gpointer) item, "activate",
|
||||
G_CALLBACK(on_build_tex_activate), GINT_TO_POINTER(LATEX_CMD_TO_PDF));
|
||||
ft->menu_items->item_link = item;
|
||||
menu_items->item_link = item;
|
||||
|
||||
if (item != NULL)
|
||||
{
|
||||
|
@ -968,7 +964,7 @@ static GtkWidget *create_build_menu_tex()
|
|||
GEANY_ADD_WIDGET_ACCEL(GEANY_KEYS_BUILD_MAKE, item);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_make_activate),
|
||||
GINT_TO_POINTER(GBO_MAKE_ALL));
|
||||
ft->menu_items->item_make_all = item;
|
||||
menu_items->item_make_all = item;
|
||||
|
||||
// build the code with make custom
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("Make custom _target"));
|
||||
|
@ -979,7 +975,7 @@ static GtkWidget *create_build_menu_tex()
|
|||
"make tool and the specified target"), NULL);
|
||||
g_signal_connect((gpointer) item, "activate", G_CALLBACK(on_build_make_activate),
|
||||
GINT_TO_POINTER(GBO_MAKE_CUSTOM));
|
||||
ft->menu_items->item_make_custom = item;
|
||||
menu_items->item_make_custom = item;
|
||||
|
||||
if (item != NULL)
|
||||
{
|
||||
|
@ -1003,7 +999,7 @@ static GtkWidget *create_build_menu_tex()
|
|||
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
|
||||
g_signal_connect((gpointer) item, "activate",
|
||||
G_CALLBACK(on_build_execute_activate), GINT_TO_POINTER(LATEX_CMD_VIEW_DVI));
|
||||
ft->menu_items->item_exec = item;
|
||||
menu_items->item_exec = item;
|
||||
|
||||
// PDF view
|
||||
item = gtk_image_menu_item_new_with_mnemonic(_("View PDF file"));
|
||||
|
@ -1018,7 +1014,7 @@ static GtkWidget *create_build_menu_tex()
|
|||
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
|
||||
g_signal_connect((gpointer) item, "activate",
|
||||
G_CALLBACK(on_build_execute_activate), GINT_TO_POINTER(LATEX_CMD_VIEW_PDF));
|
||||
ft->menu_items->item_exec2 = item;
|
||||
menu_items->item_exec2 = item;
|
||||
|
||||
// separator
|
||||
separator = gtk_separator_menu_item_new();
|
||||
|
@ -1039,11 +1035,13 @@ static GtkWidget *create_build_menu_tex()
|
|||
gtk_widget_show(image);
|
||||
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
|
||||
g_signal_connect((gpointer) item, "activate",
|
||||
G_CALLBACK(on_build_arguments_activate), ft);
|
||||
G_CALLBACK(on_build_arguments_activate), filetypes[GEANY_FILETYPES_LATEX]);
|
||||
menu_items->item_set_args = item;
|
||||
|
||||
gtk_window_add_accel_group(GTK_WINDOW(app->window), accel_group);
|
||||
|
||||
return menu;
|
||||
menu_items->menu = menu;
|
||||
g_object_ref((gpointer)menu_items->menu); // to hold it after removing
|
||||
}
|
||||
|
||||
|
||||
|
@ -1059,10 +1057,13 @@ static gboolean is_c_header(const gchar *fname)
|
|||
}
|
||||
|
||||
|
||||
/* Call this whenever build menu items need to be enabled/disabled.
|
||||
* Uses current document (if there is one) when idx == -1 */
|
||||
void build_menu_update(gint idx)
|
||||
{
|
||||
filetype *ft;
|
||||
gboolean have_path, can_build, can_make;
|
||||
gboolean have_path, can_build, can_make, can_run, can_set_args;
|
||||
BuildMenuItems *menu_items;
|
||||
|
||||
if (idx == -1)
|
||||
idx = document_get_cur_idx();
|
||||
|
@ -1080,6 +1081,7 @@ void build_menu_update(gint idx)
|
|||
gtk_widget_set_sensitive(lookup_widget(app->window, "menu_build1"), TRUE);
|
||||
|
||||
ft = doc_list[idx].file_type;
|
||||
g_return_if_fail(ft != NULL);
|
||||
|
||||
#ifdef G_OS_WIN32
|
||||
// disable compile and link under Windows until it is implemented
|
||||
|
@ -1087,16 +1089,11 @@ void build_menu_update(gint idx)
|
|||
ft->menu_items->can_link = FALSE;
|
||||
#endif
|
||||
|
||||
if (ft->menu_items->menu == NULL)
|
||||
{
|
||||
ft->menu_items->menu = (ft->id == GEANY_FILETYPES_LATEX) ?
|
||||
create_build_menu_tex() : create_build_menu_gen(idx);
|
||||
g_object_ref((gpointer)ft->menu_items->menu); // to hold it after removing
|
||||
}
|
||||
menu_items = build_get_menu_items(ft);
|
||||
/* Note: don't remove the submenu first because it can now cause an X hang if
|
||||
* the menu is already open when called from build_exit_cb(). */
|
||||
gtk_menu_item_set_submenu(GTK_MENU_ITEM(lookup_widget(app->window, "menu_build1")),
|
||||
ft->menu_items->menu);
|
||||
menu_items->menu);
|
||||
|
||||
have_path = (doc_list[idx].file_name != NULL);
|
||||
|
||||
|
@ -1108,30 +1105,35 @@ void build_menu_update(gint idx)
|
|||
else
|
||||
can_build = can_make;
|
||||
|
||||
if (ft->menu_items->can_compile)
|
||||
gtk_widget_set_sensitive(ft->menu_items->item_compile, can_build);
|
||||
if (ft->menu_items->can_link)
|
||||
gtk_widget_set_sensitive(ft->menu_items->item_link, can_build);
|
||||
if (ft->menu_items->item_make_all)
|
||||
gtk_widget_set_sensitive(ft->menu_items->item_make_all, can_make);
|
||||
if (ft->menu_items->item_make_custom)
|
||||
gtk_widget_set_sensitive(ft->menu_items->item_make_custom, can_make);
|
||||
if (ft->menu_items->item_make_object)
|
||||
gtk_widget_set_sensitive(ft->menu_items->item_make_object, can_make);
|
||||
if (ft->menu_items->can_exec)
|
||||
{
|
||||
gboolean can_run = have_path && run_info.pid <= 1;
|
||||
if (menu_items->item_compile)
|
||||
gtk_widget_set_sensitive(menu_items->item_compile, can_build && ft->actions->can_compile);
|
||||
if (menu_items->item_link)
|
||||
gtk_widget_set_sensitive(menu_items->item_link, can_build && ft->actions->can_link);
|
||||
if (menu_items->item_make_all)
|
||||
gtk_widget_set_sensitive(menu_items->item_make_all, can_make);
|
||||
if (menu_items->item_make_custom)
|
||||
gtk_widget_set_sensitive(menu_items->item_make_custom, can_make);
|
||||
if (menu_items->item_make_object)
|
||||
gtk_widget_set_sensitive(menu_items->item_make_object, can_make);
|
||||
|
||||
/* can_run only applies item_exec2
|
||||
* item_exec is enabled for both run and stop commands */
|
||||
if (ft->menu_items->item_exec)
|
||||
gtk_widget_set_sensitive(ft->menu_items->item_exec, have_path);
|
||||
if (ft->menu_items->item_exec2)
|
||||
gtk_widget_set_sensitive(ft->menu_items->item_exec2, can_run);
|
||||
}
|
||||
can_run = have_path && run_info.pid <= 1;
|
||||
/* can_run only applies item_exec2
|
||||
* item_exec is enabled for both run and stop commands */
|
||||
if (menu_items->item_exec)
|
||||
gtk_widget_set_sensitive(menu_items->item_exec, have_path && ft->actions->can_exec);
|
||||
if (menu_items->item_exec2)
|
||||
gtk_widget_set_sensitive(menu_items->item_exec2, can_run && ft->actions->can_exec);
|
||||
|
||||
gtk_widget_set_sensitive(app->compile_button, can_build && ft->menu_items->can_compile);
|
||||
gtk_widget_set_sensitive(app->run_button, have_path && ft->menu_items->can_exec);
|
||||
can_set_args =
|
||||
((ft->actions->can_compile ||
|
||||
ft->actions->can_link ||
|
||||
ft->actions->can_exec) &&
|
||||
FILETYPE_ID(ft) != GEANY_FILETYPES_ALL);
|
||||
if (menu_items->item_set_args)
|
||||
gtk_widget_set_sensitive(menu_items->item_set_args, can_set_args);
|
||||
|
||||
gtk_widget_set_sensitive(app->compile_button, can_build && ft->actions->can_compile);
|
||||
gtk_widget_set_sensitive(app->run_button, have_path && ft->actions->can_exec);
|
||||
|
||||
// show the stop command if a program is running, otherwise show run command
|
||||
set_stop_button(run_info.pid > 1);
|
||||
|
@ -1143,7 +1145,7 @@ static void set_stop_button(gboolean stop)
|
|||
{
|
||||
GtkStockItem sitem;
|
||||
GtkWidget *menuitem =
|
||||
filetypes[run_info.file_type_id]->menu_items->item_exec;
|
||||
build_get_menu_items(filetypes[run_info.file_type_id])->item_exec;
|
||||
|
||||
if (stop && utils_str_equal(
|
||||
gtk_tool_button_get_stock_id(GTK_TOOL_BUTTON(app->run_button)), "gtk-stop")) return;
|
||||
|
@ -1192,6 +1194,27 @@ static void set_stop_button(gboolean stop)
|
|||
}
|
||||
|
||||
|
||||
// Creates the relevant build menu if necessary.
|
||||
BuildMenuItems *build_get_menu_items(const filetype *ft)
|
||||
{
|
||||
BuildMenuItems *items;
|
||||
|
||||
if (FILETYPE_ID(ft) == GEANY_FILETYPES_LATEX)
|
||||
{
|
||||
items = &latex_menu_items;
|
||||
if (items->menu == NULL)
|
||||
create_build_menu_tex(items);
|
||||
}
|
||||
else
|
||||
{
|
||||
items = &default_menu_items;
|
||||
if (items->menu == NULL)
|
||||
create_build_menu_gen(items);
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
on_build_compile_activate (GtkMenuItem *menuitem,
|
||||
gpointer user_data)
|
||||
|
@ -1405,3 +1428,4 @@ static void free_pointers(gpointer first, ...)
|
|||
g_free(first);
|
||||
}
|
||||
|
||||
|
||||
|
|
18
src/build.h
18
src/build.h
|
@ -24,6 +24,8 @@
|
|||
#ifndef GEANY_BUILD_H
|
||||
#define GEANY_BUILD_H 1
|
||||
|
||||
#include "filetypes.h"
|
||||
|
||||
typedef enum // Geany Build Options
|
||||
{
|
||||
GBO_COMPILE,
|
||||
|
@ -44,6 +46,20 @@ typedef struct
|
|||
|
||||
extern BuildInfo build_info;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GtkWidget *menu;
|
||||
GtkWidget *item_compile;
|
||||
GtkWidget *item_link;
|
||||
GtkWidget *item_make_all;
|
||||
GtkWidget *item_make_custom;
|
||||
GtkWidget *item_make_object;
|
||||
GtkWidget *item_exec;
|
||||
GtkWidget *item_exec2;
|
||||
GtkWidget *item_set_args;
|
||||
} BuildMenuItems;
|
||||
|
||||
|
||||
|
||||
void build_finalize();
|
||||
|
||||
|
@ -61,6 +77,8 @@ GPid build_run_cmd(gint idx);
|
|||
|
||||
void build_menu_update(gint idx);
|
||||
|
||||
BuildMenuItems *build_get_menu_items(const filetype *ft);
|
||||
|
||||
|
||||
void
|
||||
on_build_compile_activate (GtkMenuItem *menuitem,
|
||||
|
|
|
@ -1685,7 +1685,7 @@ on_includes_arguments_dialog_response (GtkDialog *dialog,
|
|||
const gchar *newstr;
|
||||
struct build_programs *programs = ft->programs;
|
||||
|
||||
if (ft->menu_items->can_compile)
|
||||
if (ft->actions->can_compile)
|
||||
{
|
||||
newstr = gtk_entry_get_text(
|
||||
GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "includes_entry1")));
|
||||
|
@ -1696,7 +1696,7 @@ on_includes_arguments_dialog_response (GtkDialog *dialog,
|
|||
programs->modified = TRUE;
|
||||
}
|
||||
}
|
||||
if (ft->menu_items->can_link)
|
||||
if (ft->actions->can_link)
|
||||
{
|
||||
newstr = gtk_entry_get_text(
|
||||
GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "includes_entry2")));
|
||||
|
@ -1707,7 +1707,7 @@ on_includes_arguments_dialog_response (GtkDialog *dialog,
|
|||
programs->modified = TRUE;
|
||||
}
|
||||
}
|
||||
if (ft->menu_items->can_exec)
|
||||
if (ft->actions->can_exec)
|
||||
{
|
||||
newstr = gtk_entry_get_text(
|
||||
GTK_ENTRY(lookup_widget(GTK_WIDGET(dialog), "includes_entry3")));
|
||||
|
|
|
@ -716,7 +716,7 @@ void dialogs_show_includes_arguments_gen()
|
|||
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
|
||||
gtk_container_add(GTK_CONTAINER(vbox), label);
|
||||
|
||||
if (ft->menu_items->can_compile || ft->menu_items->can_link || ft->menu_items->can_exec)
|
||||
if (ft->actions->can_compile || ft->actions->can_link || ft->actions->can_exec)
|
||||
{
|
||||
GtkWidget *align, *frame;
|
||||
gchar *frame_title = g_strconcat(ft->title, _(" commands"), NULL);
|
||||
|
@ -732,7 +732,7 @@ void dialogs_show_includes_arguments_gen()
|
|||
}
|
||||
|
||||
// include-args
|
||||
if (ft->menu_items->can_compile)
|
||||
if (ft->actions->can_compile)
|
||||
{
|
||||
label = gtk_label_new(_("Compile:"));
|
||||
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
|
||||
|
@ -753,7 +753,7 @@ void dialogs_show_includes_arguments_gen()
|
|||
}
|
||||
|
||||
// lib-args
|
||||
if (ft->menu_items->can_link)
|
||||
if (ft->actions->can_link)
|
||||
{
|
||||
label = gtk_label_new(_("Build:"));
|
||||
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
|
||||
|
@ -774,7 +774,7 @@ void dialogs_show_includes_arguments_gen()
|
|||
}
|
||||
|
||||
// program-args
|
||||
if (ft->menu_items->can_exec)
|
||||
if (ft->actions->can_exec)
|
||||
{
|
||||
label = gtk_label_new(_("Execute:"));
|
||||
gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
|
||||
|
|
|
@ -710,7 +710,7 @@ static void filetypes_init_build_programs(filetype *ftype)
|
|||
{
|
||||
ftype->programs = g_new0(struct build_programs, 1);
|
||||
|
||||
ftype->menu_items = g_new0(struct build_menu_items, 1);
|
||||
ftype->actions = g_new0(struct build_actions, 1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -864,10 +864,7 @@ void filetypes_free_types()
|
|||
g_free(filetypes[i]->programs->run_cmd);
|
||||
g_free(filetypes[i]->programs->run_cmd2);
|
||||
g_free(filetypes[i]->programs);
|
||||
if (filetypes[i]->menu_items->menu != NULL &&
|
||||
GTK_IS_WIDGET(filetypes[i]->menu_items->menu))
|
||||
gtk_widget_destroy(filetypes[i]->menu_items->menu);
|
||||
g_free(filetypes[i]->menu_items);
|
||||
g_free(filetypes[i]->actions);
|
||||
|
||||
g_strfreev(filetypes[i]->pattern);
|
||||
g_free(filetypes[i]);
|
||||
|
@ -918,7 +915,7 @@ void filetypes_get_config(GKeyFile *config, GKeyFile *configh, gint ft)
|
|||
if (result != NULL)
|
||||
{
|
||||
filetypes[ft]->programs->compiler = result;
|
||||
filetypes[ft]->menu_items->can_compile = TRUE;
|
||||
filetypes[ft]->actions->can_compile = TRUE;
|
||||
}
|
||||
|
||||
result = g_key_file_get_string(configh, "build_settings", "linker", NULL);
|
||||
|
@ -926,7 +923,7 @@ void filetypes_get_config(GKeyFile *config, GKeyFile *configh, gint ft)
|
|||
if (result != NULL)
|
||||
{
|
||||
filetypes[ft]->programs->linker = result;
|
||||
filetypes[ft]->menu_items->can_link = TRUE;
|
||||
filetypes[ft]->actions->can_link = TRUE;
|
||||
}
|
||||
|
||||
result = g_key_file_get_string(configh, "build_settings", "run_cmd", NULL);
|
||||
|
@ -934,7 +931,7 @@ void filetypes_get_config(GKeyFile *config, GKeyFile *configh, gint ft)
|
|||
if (result != NULL)
|
||||
{
|
||||
filetypes[ft]->programs->run_cmd = result;
|
||||
filetypes[ft]->menu_items->can_exec = TRUE;
|
||||
filetypes[ft]->actions->can_exec = TRUE;
|
||||
}
|
||||
|
||||
result = g_key_file_get_string(configh, "build_settings", "run_cmd2", NULL);
|
||||
|
@ -942,7 +939,7 @@ void filetypes_get_config(GKeyFile *config, GKeyFile *configh, gint ft)
|
|||
if (result != NULL)
|
||||
{
|
||||
filetypes[ft]->programs->run_cmd2 = result;
|
||||
filetypes[ft]->menu_items->can_exec = TRUE;
|
||||
filetypes[ft]->actions->can_exec = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -69,19 +69,11 @@ enum
|
|||
(((filetype_ptr) != NULL) ? (filetype_ptr)->id : GEANY_FILETYPES_ALL)
|
||||
|
||||
|
||||
struct build_menu_items
|
||||
struct build_actions
|
||||
{
|
||||
GtkWidget *menu;
|
||||
GtkWidget *item_compile;
|
||||
GtkWidget *item_link;
|
||||
GtkWidget *item_exec;
|
||||
GtkWidget *item_exec2;
|
||||
GtkWidget *item_make_all;
|
||||
GtkWidget *item_make_custom;
|
||||
GtkWidget *item_make_object;
|
||||
gboolean can_compile;
|
||||
gboolean can_link;
|
||||
gboolean can_exec;
|
||||
gboolean can_compile:1;
|
||||
gboolean can_link:1;
|
||||
gboolean can_exec:1;
|
||||
};
|
||||
|
||||
struct build_programs
|
||||
|
@ -108,8 +100,8 @@ typedef struct filetype
|
|||
gchar *comment_open;
|
||||
gchar *comment_close;
|
||||
gboolean comment_use_indent;
|
||||
struct build_programs *programs;
|
||||
struct build_menu_items *menu_items;
|
||||
struct build_programs *programs;
|
||||
struct build_actions *actions;
|
||||
void (*style_func_ptr) (ScintillaObject*);
|
||||
} filetype;
|
||||
|
||||
|
|
|
@ -75,7 +75,6 @@ static void cb_func_menu_replacetabs(guint key_id);
|
|||
static void cb_func_menu_foldall(guint key_id);
|
||||
static void cb_func_menu_unfoldall(guint key_id);
|
||||
static void cb_func_build_action(guint key_id);
|
||||
static void cb_func_build_options(guint key_id);
|
||||
static void cb_func_reloadtaglist(guint key_id);
|
||||
static void cb_func_switch_editor(guint key_id);
|
||||
static void cb_func_switch_scribble(guint key_id);
|
||||
|
@ -172,7 +171,7 @@ void keybindings_init(void)
|
|||
GDK_F5, 0, "build_run", _("Run"));
|
||||
keys[GEANY_KEYS_BUILD_RUN2] = fill(cb_func_build_action,
|
||||
0, 0, "build_run2", _("Run (alternative command)"));
|
||||
keys[GEANY_KEYS_BUILD_OPTIONS] = fill(cb_func_build_options,
|
||||
keys[GEANY_KEYS_BUILD_OPTIONS] = fill(cb_func_build_action,
|
||||
0, 0, "build_options", _("Build options"));
|
||||
keys[GEANY_KEYS_RELOADTAGLIST] = fill(cb_func_reloadtaglist,
|
||||
GDK_r, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "reloadtaglist", _("Reload symbol list"));
|
||||
|
@ -570,40 +569,46 @@ static void cb_func_build_action(guint key_id)
|
|||
gint idx = document_get_cur_idx();
|
||||
GtkWidget *item;
|
||||
filetype *ft;
|
||||
BuildMenuItems *menu_items;
|
||||
|
||||
if (! DOC_IDX_VALID(idx)) return;
|
||||
|
||||
ft = doc_list[idx].file_type;
|
||||
if (! ft || ! ft->menu_items) return;
|
||||
if (! ft) return;
|
||||
menu_items = build_get_menu_items(ft);
|
||||
|
||||
switch (key_id)
|
||||
{
|
||||
case GEANY_KEYS_BUILD_COMPILE:
|
||||
item = ft->menu_items->item_compile;
|
||||
item = menu_items->item_compile;
|
||||
break;
|
||||
|
||||
case GEANY_KEYS_BUILD_LINK:
|
||||
item = ft->menu_items->item_link;
|
||||
item = menu_items->item_link;
|
||||
break;
|
||||
|
||||
case GEANY_KEYS_BUILD_MAKE:
|
||||
item = ft->menu_items->item_make_all;
|
||||
item = menu_items->item_make_all;
|
||||
break;
|
||||
|
||||
case GEANY_KEYS_BUILD_MAKEOWNTARGET:
|
||||
item = ft->menu_items->item_make_custom;
|
||||
item = menu_items->item_make_custom;
|
||||
break;
|
||||
|
||||
case GEANY_KEYS_BUILD_MAKEOBJECT:
|
||||
item = ft->menu_items->item_make_object;
|
||||
item = menu_items->item_make_object;
|
||||
break;
|
||||
|
||||
case GEANY_KEYS_BUILD_RUN:
|
||||
item = ft->menu_items->item_exec;
|
||||
item = menu_items->item_exec;
|
||||
break;
|
||||
|
||||
case GEANY_KEYS_BUILD_RUN2:
|
||||
item = ft->menu_items->item_exec2;
|
||||
item = menu_items->item_exec2;
|
||||
break;
|
||||
|
||||
case GEANY_KEYS_BUILD_OPTIONS:
|
||||
item = menu_items->item_set_args;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -613,24 +618,6 @@ static void cb_func_build_action(guint key_id)
|
|||
gtk_menu_item_activate(GTK_MENU_ITEM(item));
|
||||
}
|
||||
|
||||
static void cb_func_build_options(G_GNUC_UNUSED guint key_id)
|
||||
{
|
||||
gint idx = document_get_cur_idx();
|
||||
document *doc;
|
||||
filetype *ft;
|
||||
|
||||
if (! DOC_IDX_VALID(idx)) return;
|
||||
doc = &doc_list[idx];
|
||||
ft = doc->file_type;
|
||||
if (! ft || ! ft->menu_items) return;
|
||||
if ((ft->menu_items->can_compile ||
|
||||
ft->menu_items->can_link ||
|
||||
ft->menu_items->can_exec) &&
|
||||
(doc->file_name != NULL ||
|
||||
FILETYPE_ID(ft) != GEANY_FILETYPES_ALL))
|
||||
on_build_arguments_activate(NULL, ft);
|
||||
}
|
||||
|
||||
static void cb_func_reloadtaglist(G_GNUC_UNUSED guint key_id)
|
||||
{
|
||||
gint idx = document_get_cur_idx();
|
||||
|
|
Loading…
Reference in New Issue