Revision: 3681 http://geany.svn.sourceforge.net/geany/?rev=3681&view=rev Author: ntrel Date: 2009-04-03 14:23:45 +0000 (Fri, 03 Apr 2009)
Log Message: ----------- Merge reorder-filetypes branch: Make GEANY_FILETYPES_NONE = 0, sort filetype IDs randomly (so we can append randomly without breaking the ABI). Make None filetype name = title = _("None"). Add foreach_slist() macro. Add filetypes_by_title list to GeanyData for plugin API access - a list of filetype pointers, which includes the None filetype first. This list stays constant by the time plugins are initialized, so you can use e.g. g_slist_nth_data(filetypes_by_title, n) to index the sorted list.
Modified Paths: -------------- trunk/ChangeLog trunk/plugins/htmlchars.c trunk/plugins/saveactions.c trunk/src/dialogs.c trunk/src/filetypes.c trunk/src/filetypes.h trunk/src/highlighting.c trunk/src/plugindata.h trunk/src/plugins.c trunk/src/symbols.c trunk/src/templates.c trunk/src/ui_utils.c trunk/src/utils.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/ChangeLog 2009-04-03 14:23:45 UTC (rev 3681) @@ -3,6 +3,20 @@ * src/filetypes.c, doc/geany.txt: Move ActionScript to the Script group. Fix wording & typo. + * src/templates.c, src/utils.h, src/highlighting.c, src/dialogs.c, + src/plugindata.h, src/filetypes.c, src/filetypes.h, src/plugins.c, + src/symbols.c, src/ui_utils.c, plugins/saveactions.c, + plugins/htmlchars.c: + Merge reorder-filetypes branch: + Make GEANY_FILETYPES_NONE = 0, sort filetype IDs randomly (so we can + append randomly without breaking the ABI). + Make None filetype name = title = _("None"). + Add foreach_slist() macro. + Add filetypes_by_title list to GeanyData for plugin API access + - a list of filetype pointers, which includes the None filetype + first. This list stays constant by the time plugins are initialized, + so you can use e.g. g_slist_nth_data(filetypes_by_title, n) to + index the sorted list.
2009-03-31 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
Modified: trunk/plugins/htmlchars.c =================================================================== --- trunk/plugins/htmlchars.c 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/plugins/htmlchars.c 2009-04-03 14:23:45 UTC (rev 3681) @@ -26,6 +26,8 @@ /* HTML Characters plugin (Inserts HTML character entities like '&') */
#include "geany.h" +#include <string.h> + #include "support.h" #include "plugindata.h" #include "document.h"
Modified: trunk/plugins/saveactions.c =================================================================== --- trunk/plugins/saveactions.c 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/plugins/saveactions.c 2009-04-03 14:23:45 UTC (rev 3681) @@ -603,6 +603,8 @@ { GtkWidget *combo; guint i; + GSList *node; + GeanyFiletype *ft;
notebook_vbox = gtk_vbox_new(FALSE, 2); inner_vbox = gtk_vbox_new(FALSE, 5); @@ -624,14 +626,14 @@ gtk_box_pack_start(GTK_BOX(inner_vbox), label, FALSE, FALSE, 0);
pref_widgets.instantsave_ft_combo = combo = gtk_combo_box_new_text(); - for (i = 0; i < geany->filetypes_array->len; i++) + i = 0; + foreach_slist(ft, node, geany->filetypes_by_title) { - GeanyFiletype *ft = filetypes_index(i); - gtk_combo_box_append_text(GTK_COMBO_BOX(combo), ft->name);
if (utils_str_equal(ft->name, instantsave_default_ft)) gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i); + i++; } gtk_combo_box_set_wrap_width(GTK_COMBO_BOX(combo), 3); gtk_label_set_mnemonic_widget(GTK_LABEL(label), combo);
Modified: trunk/src/dialogs.c =================================================================== --- trunk/src/dialogs.c 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/dialogs.c 2009-04-03 14:23:45 UTC (rev 3681) @@ -90,8 +90,8 @@ gboolean ro = (response == GEANY_RESPONSE_VIEW); /* View clicked */
/* ignore detect from file item */ - if (filetype_idx >= 0 && filetype_idx < GEANY_FILETYPES_NONE) - ft = filetypes[filetype_idx]; + if (filetype_idx > 0 && filetype_idx < GEANY_MAX_BUILT_IN_FILETYPES) + ft = g_slist_nth_data(filetypes_by_title, filetype_idx); if (encoding_idx >= 0 && encoding_idx < GEANY_ENCODINGS_MAX) charset = encodings[encoding_idx].charset;
@@ -177,6 +177,8 @@ GtkWidget *viewbtn; guint i; gchar *encoding_string; + GeanyFiletype *ft; + GSList *node;
ui_widgets.open_filesel = gtk_file_chooser_dialog_new(_("Open File"), GTK_WINDOW(main_widgets.window), GTK_FILE_CHOOSER_ACTION_OPEN, NULL, NULL); @@ -207,23 +209,22 @@ add_file_open_extra_widget()); filetype_combo = ui_lookup_widget(ui_widgets.open_filesel, "filetype_combo");
+ gtk_combo_box_append_text(GTK_COMBO_BOX(filetype_combo), _("Detect by file extension")); /* add FileFilters(start with "All Files") */ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(ui_widgets.open_filesel), filetypes_create_file_filter(filetypes[GEANY_FILETYPES_NONE])); /* now create meta filter "All Source" */ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(ui_widgets.open_filesel), filetypes_create_file_filter_all_source()); - for (i = 0; i < filetypes_array->len; i++) + foreach_slist(ft, node, filetypes_by_title) { - if (i == GEANY_FILETYPES_NONE) + if (ft->id == GEANY_FILETYPES_NONE) continue; - - gtk_combo_box_append_text(GTK_COMBO_BOX(filetype_combo), filetypes[i]->title); + gtk_combo_box_append_text(GTK_COMBO_BOX(filetype_combo), ft->title); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(ui_widgets.open_filesel), - filetypes_create_file_filter(filetypes[i])); + filetypes_create_file_filter(ft)); } - gtk_combo_box_append_text(GTK_COMBO_BOX(filetype_combo), _("Detect by file extension")); - gtk_combo_box_set_active(GTK_COMBO_BOX(filetype_combo), filetypes_array->len - 1); + gtk_combo_box_set_active(GTK_COMBO_BOX(filetype_combo), 0);
/* fill encoding combo box */ encoding_combo = ui_lookup_widget(ui_widgets.open_filesel, "encoding_combo");
Modified: trunk/src/filetypes.c =================================================================== --- trunk/src/filetypes.c 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/filetypes.c 2009-04-03 14:23:45 UTC (rev 3681) @@ -67,18 +67,35 @@
GPtrArray *filetypes_array = NULL; /* Dynamic array of filetype pointers */
-GHashTable *filetypes_hash = NULL; /* Hash of filetype pointers based on name keys */ +static GHashTable *filetypes_hash = NULL; /* Hash of filetype pointers based on name keys */
+/** List of filetype pointers sorted by name, but with @c filetypes_index(GEANY_FILETYPES_NONE) + * first, as this is usually treated specially. + * The list does not change (after filetypes have been initialized), so you can use + * @code g_slist_nth_data(filetypes_by_title, n) @endcode and expect the same result at different times. */ +GSList *filetypes_by_title = NULL;
-static void create_radio_menu_item(GtkWidget *menu, const gchar *label, GeanyFiletype *ftype);
+static void create_radio_menu_item(GtkWidget *menu, GeanyFiletype *ftype);
+ /* Note: remember to update HACKING if this function is renamed. */ static void init_builtin_filetypes(void) { GeanyFiletype *ft;
-#define C /* these macros are only to ease navigation */ +#define NONE /* these macros are only to ease navigation */ + ft = filetypes[GEANY_FILETYPES_NONE]; + ft->lang = -2; + ft->name = g_strdup(_("None")); + ft->title = g_strdup(_("None")); + ft->extension = g_strdup("*"); + ft->pattern = utils_strv_new("*", NULL); + ft->comment_open = NULL; + ft->comment_close = NULL; + ft->group = GEANY_FILETYPE_GROUP_NONE; + +#define C ft = filetypes[GEANY_FILETYPES_C]; ft->lang = 0; ft->name = g_strdup("C"); @@ -560,17 +577,6 @@ ft->comment_open = g_strdup("--"); ft->comment_close = NULL; ft->group = GEANY_FILETYPE_GROUP_COMPILED; - -#define ALL - ft = filetypes[GEANY_FILETYPES_NONE]; - ft->lang = -2; - ft->name = g_strdup("None"); - ft->title = g_strdup(_("All files")); - ft->extension = g_strdup("*"); - ft->pattern = utils_strv_new("*", NULL); - ft->comment_open = NULL; - ft->comment_close = NULL; - ft->group = GEANY_FILETYPE_GROUP_NONE; }
@@ -588,7 +594,20 @@ }
-/* Add a filetype pointer to the list of available filetypes, +static gint cmp_filetype(gconstpointer pft1, gconstpointer pft2) +{ + const GeanyFiletype *ft1 = pft1, *ft2 = pft2; + + if (ft1->id == GEANY_FILETYPES_NONE) + return -1; + if (ft2->id == GEANY_FILETYPES_NONE) + return 1; + + return utils_str_casecmp(ft1->title, ft2->title); +} + + +/* Add a filetype pointer to the lists of available filetypes, * and set the filetype::id field. */ static void filetype_add(GeanyFiletype *ft) { @@ -598,6 +617,8 @@ ft->id = filetypes_array->len; /* len will be the index for filetype_array */ g_ptr_array_add(filetypes_array, ft); g_hash_table_insert(filetypes_hash, ft->name, ft); + + filetypes_by_title = g_slist_insert_sorted(filetypes_by_title, ft, cmp_filetype); }
@@ -646,61 +667,41 @@ }
-#define create_sub_menu(menu, item, title) \ - (menu) = gtk_menu_new(); \ - (item) = gtk_menu_item_new_with_mnemonic((title)); \ - gtk_menu_item_set_submenu(GTK_MENU_ITEM((item)), (menu)); \ - gtk_container_add(GTK_CONTAINER(filetype_menu), (item)); \ - gtk_widget_show((item)); +static GtkWidget *group_menus[GEANY_FILETYPE_GROUP_COUNT] = {NULL};
- -static void create_set_filetype_menu(void) +static void create_sub_menu(GtkWidget *parent, gsize group_id, const gchar *title) { - filetype_id ft_id; - GtkWidget *filetype_menu = ui_lookup_widget(main_widgets.window, "set_filetype1_menu"); - GtkWidget *sub_menu = filetype_menu; - GtkWidget *sub_menu_programming, *sub_menu_scripts, *sub_menu_markup, *sub_menu_misc; - GtkWidget *sub_item_programming, *sub_item_scripts, *sub_item_markup, *sub_item_misc; + GtkWidget *menu, *item;
- create_sub_menu(sub_menu_programming, sub_item_programming, _("_Programming Languages")); - create_sub_menu(sub_menu_scripts, sub_item_scripts, _("_Scripting Languages")); - create_sub_menu(sub_menu_markup, sub_item_markup, _("_Markup Languages")); - create_sub_menu(sub_menu_misc, sub_item_misc, _("M_iscellaneous Languages")); + menu = gtk_menu_new(); + item = gtk_menu_item_new_with_mnemonic((title)); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu); + gtk_container_add(GTK_CONTAINER(parent), item); + gtk_widget_show(item); + group_menus[group_id] = menu; +}
- /* Append all filetypes to the filetype menu */ - for (ft_id = 0; ft_id < filetypes_array->len; ft_id++) - { - GeanyFiletype *ft = filetypes[ft_id]; - const gchar *title = ft->title;
- /* insert separators for different filetype groups */ - switch (ft->group) - { - case GEANY_FILETYPE_GROUP_COMPILED: /* programming */ - sub_menu = sub_menu_programming; - break; +static void add_ft_menu_item(gpointer pft, gpointer user_data) +{ + GeanyFiletype *ft = pft;
- case GEANY_FILETYPE_GROUP_SCRIPT: /* scripts */ - sub_menu = sub_menu_scripts; - break; + create_radio_menu_item(group_menus[ft->group], ft); +}
- case GEANY_FILETYPE_GROUP_MARKUP: /* markup */ - sub_menu = sub_menu_markup; - break;
- case GEANY_FILETYPE_GROUP_MISC: /* misc */ - sub_menu = sub_menu_misc; - break; +static void create_set_filetype_menu(void) +{ + GtkWidget *filetype_menu = ui_lookup_widget(main_widgets.window, "set_filetype1_menu");
- case GEANY_FILETYPE_GROUP_NONE: /* none */ - sub_menu = filetype_menu; - title = _("None"); - break; + create_sub_menu(filetype_menu, GEANY_FILETYPE_GROUP_COMPILED, _("_Programming Languages")); + create_sub_menu(filetype_menu, GEANY_FILETYPE_GROUP_SCRIPT, _("_Scripting Languages")); + create_sub_menu(filetype_menu, GEANY_FILETYPE_GROUP_MARKUP, _("_Markup Languages")); + create_sub_menu(filetype_menu, GEANY_FILETYPE_GROUP_MISC, _("M_iscellaneous Languages"));
- default: break; - } - create_radio_menu_item(sub_menu, title, ft); - } + /* Append all filetypes to the filetype menu */ + filetypes_foreach_named(add_ft_menu_item, NULL); + create_radio_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_NONE]); }
@@ -712,11 +713,8 @@ }
-typedef gboolean FileTypesPredicate(GeanyFiletype *ft, gpointer user_data); - /* Find a filetype that predicate returns TRUE for, otherwise return NULL. */ -static GeanyFiletype *filetypes_find(gboolean source_only, - FileTypesPredicate predicate, gpointer user_data) +GeanyFiletype *filetypes_find(GCompareFunc predicate, gpointer user_data) { guint i;
@@ -724,9 +722,6 @@ { GeanyFiletype *ft = filetypes[i];
- if (source_only && i == GEANY_FILETYPES_NONE) - continue; /* None is not for source files */ - if (predicate(ft, user_data)) return ft; } @@ -734,12 +729,16 @@ }
-static gboolean match_basename(GeanyFiletype *ft, gpointer user_data) +static gboolean match_basename(gconstpointer pft, gconstpointer user_data) { + const GeanyFiletype *ft = pft; const gchar *base_filename = user_data; gint j; gboolean ret = FALSE;
+ if (ft->id == GEANY_FILETYPES_NONE) + return FALSE; + for (j = 0; ft->pattern[j] != NULL; j++) { GPatternSpec *pattern = g_pattern_spec_new(ft->pattern[j]); @@ -770,7 +769,7 @@ setptr(base_filename, g_utf8_strdown(base_filename, -1)); #endif
- ft = filetypes_find(TRUE, match_basename, base_filename); + ft = filetypes_find(match_basename, base_filename); if (ft == NULL) ft = filetypes[GEANY_FILETYPES_NONE];
@@ -982,12 +981,12 @@ }
-static void create_radio_menu_item(GtkWidget *menu, const gchar *label, GeanyFiletype *ftype) +static void create_radio_menu_item(GtkWidget *menu, GeanyFiletype *ftype) { static GSList *group = NULL; GtkWidget *tmp;
- tmp = gtk_radio_menu_item_new_with_label(group, label); + tmp = gtk_radio_menu_item_new_with_label(group, ftype->title); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(tmp)); ftype->priv->menu_item = tmp; gtk_widget_show(tmp); @@ -1240,7 +1239,7 @@ G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.", NULL); gint i;
- for (i = 0; i < GEANY_FILETYPES_NONE; i++) + for (i = 1; i < GEANY_MAX_BUILT_IN_FILETYPES; i++) { struct build_programs *bp = filetypes[i]->programs; GKeyFile *config_home; @@ -1301,11 +1300,13 @@ { GtkFileFilter *new_filter; gint i; + const gchar *title;
g_return_val_if_fail(ft != NULL, NULL);
new_filter = gtk_file_filter_new(); - gtk_file_filter_set_name(new_filter, ft->title); + title = ft->id == GEANY_FILETYPES_NONE ? _("All files") : ft->title; + gtk_file_filter_set_name(new_filter, title);
for (i = 0; ft->pattern[i]; i++) { @@ -1480,3 +1481,16 @@ }
+/* Does not include ft[GEANY_FILETYPES_NONE], as this is usually treated specially. */ +void filetypes_foreach_named(GFunc callback, gpointer user_data) +{ + GSList *node; + GeanyFiletype *ft; + + foreach_slist(ft, node, filetypes_by_title) + { + if (ft->id != GEANY_FILETYPES_NONE) + callback(ft, user_data); + } +} +
Modified: trunk/src/filetypes.h =================================================================== --- trunk/src/filetypes.h 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/filetypes.h 2009-04-03 14:23:45 UTC (rev 3681) @@ -29,66 +29,58 @@ #include "ScintillaWidget.h"
-/* Each group should be alpha-sorted, based on filetype::name (not enum name). - * Warning: remember to break the plugin ABI when adding items. */ -/* TODO: for a stable ABI put GEANY_FILETYPES_NONE first, and use a sorted duplicate - * filetypes array for GUI elements. */ typedef enum { - /* normally compiled languages */ - GEANY_FILETYPES_ADA = 0, - GEANY_FILETYPES_AS, - GEANY_FILETYPES_ASM, - GEANY_FILETYPES_C, - GEANY_FILETYPES_CPP, - GEANY_FILETYPES_CS, - GEANY_FILETYPES_CAML, - GEANY_FILETYPES_D, - GEANY_FILETYPES_F77, - GEANY_FILETYPES_FORTRAN, - GEANY_FILETYPES_BASIC, /* FreeBasic */ - GEANY_FILETYPES_GLSL, - GEANY_FILETYPES_HASKELL, - GEANY_FILETYPES_HAXE, - GEANY_FILETYPES_JAVA, - GEANY_FILETYPES_PASCAL, - GEANY_FILETYPES_VALA, - GEANY_FILETYPES_VHDL, + GEANY_FILETYPES_NONE = 0, /* first filetype is always None */
- /* script languages */ - GEANY_FILETYPES_FERITE, - GEANY_FILETYPES_JS, - GEANY_FILETYPES_LUA, - GEANY_FILETYPES_MAKE, - GEANY_FILETYPES_MATLAB, - GEANY_FILETYPES_PERL, GEANY_FILETYPES_PHP, - GEANY_FILETYPES_PYTHON, - GEANY_FILETYPES_R, + GEANY_FILETYPES_BASIC, /* FreeBasic */ + GEANY_FILETYPES_MATLAB, GEANY_FILETYPES_RUBY, - GEANY_FILETYPES_SH, + GEANY_FILETYPES_LUA, + GEANY_FILETYPES_FERITE, + GEANY_FILETYPES_YAML, + GEANY_FILETYPES_C, + GEANY_FILETYPES_NSIS, + GEANY_FILETYPES_GLSL, + GEANY_FILETYPES_PO, + GEANY_FILETYPES_MAKE, GEANY_FILETYPES_TCL, - - /* markup languages */ - GEANY_FILETYPES_CSS, - GEANY_FILETYPES_DOCBOOK, - GEANY_FILETYPES_HTML, GEANY_FILETYPES_XML, - - /* miscellaneous languages */ - GEANY_FILETYPES_CMAKE, - GEANY_FILETYPES_CONF, + GEANY_FILETYPES_CSS, + GEANY_FILETYPES_REST, + GEANY_FILETYPES_HASKELL, + GEANY_FILETYPES_JAVA, + GEANY_FILETYPES_CAML, + GEANY_FILETYPES_AS, + GEANY_FILETYPES_R, GEANY_FILETYPES_DIFF, - GEANY_FILETYPES_NSIS, - GEANY_FILETYPES_PO, + GEANY_FILETYPES_HTML, + GEANY_FILETYPES_PYTHON, + GEANY_FILETYPES_CS, + GEANY_FILETYPES_PERL, + GEANY_FILETYPES_VALA, + GEANY_FILETYPES_PASCAL, GEANY_FILETYPES_LATEX, - GEANY_FILETYPES_REST, + GEANY_FILETYPES_ASM, + GEANY_FILETYPES_CONF, + GEANY_FILETYPES_HAXE, + GEANY_FILETYPES_CPP, + GEANY_FILETYPES_SH, + GEANY_FILETYPES_FORTRAN, GEANY_FILETYPES_SQL, - GEANY_FILETYPES_YAML, + GEANY_FILETYPES_F77, + GEANY_FILETYPES_DOCBOOK, + GEANY_FILETYPES_D, + GEANY_FILETYPES_JS, + GEANY_FILETYPES_VHDL, + GEANY_FILETYPES_ADA, + GEANY_FILETYPES_CMAKE,
- GEANY_FILETYPES_NONE, /* must be last filetype */ - GEANY_MAX_BUILT_IN_FILETYPES /* Use filetypes_array->len instead */ -} filetype_id; + /* ^ append items here */ + GEANY_MAX_BUILT_IN_FILETYPES /* Don't use this, use filetypes_array->len instead */ +} +filetype_id;
typedef enum { @@ -96,7 +88,8 @@ GEANY_FILETYPE_GROUP_COMPILED, GEANY_FILETYPE_GROUP_SCRIPT, GEANY_FILETYPE_GROUP_MARKUP, - GEANY_FILETYPE_GROUP_MISC + GEANY_FILETYPE_GROUP_MISC, + GEANY_FILETYPE_GROUP_COUNT } GeanyFiletypeGroupID;
@@ -151,10 +144,16 @@ * Example: filetypes[GEANY_FILETYPES_C]->name = ...; */ #define filetypes ((GeanyFiletype **)filetypes_array->pdata)
+extern GSList *filetypes_by_title;
+ GeanyFiletype *filetypes_lookup_by_name(const gchar *name);
+void filetypes_foreach_named(GFunc callback, gpointer user_data);
+GeanyFiletype *filetypes_find(GCompareFunc predicate, gpointer user_data); + + void filetypes_init(void);
void filetypes_init_types(void);
Modified: trunk/src/highlighting.c =================================================================== --- trunk/src/highlighting.c 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/highlighting.c 2009-04-03 14:23:45 UTC (rev 3681) @@ -3435,7 +3435,7 @@ filetypes_load_config(filetype_idx, FALSE); /* load filetypes.ext */
/* load tags files (some lexers highlight global typenames) */ - if (filetype_idx < GEANY_FILETYPES_NONE) + if (filetype_idx != GEANY_FILETYPES_NONE) symbols_global_tags_loaded(filetype_idx);
switch (filetype_idx)
Modified: trunk/src/plugindata.h =================================================================== --- trunk/src/plugindata.h 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/plugindata.h 2009-04-03 14:23:45 UTC (rev 3681) @@ -45,13 +45,13 @@ enum { /** The Application Programming Interface (API) version, incremented * whenever any plugin data types are modified or appended to. */ - GEANY_API_VERSION = 137, + GEANY_API_VERSION = 138,
/** The Application Binary Interface (ABI) version, incremented whenever * existing fields in the plugin data types have to be changed or reordered. */ /* This should usually stay the same if fields are only appended, assuming only pointers to * structs and not structs themselves are declared by plugins. */ - GEANY_ABI_VERSION = 59 + GEANY_ABI_VERSION = 62 };
/** Check the plugin can be loaded by Geany. @@ -188,6 +188,7 @@ struct GeanyToolPrefs *tool_prefs; /**< Tool settings */ struct GeanyTemplatePrefs *template_prefs; /**< Template settings */ struct GeanyBuildInfo *build_info; /**< Current build information */ + GSList *filetypes_by_title; /**< See filetypes.h#filetypes_by_title. */ } GeanyData;
Modified: trunk/src/plugins.c =================================================================== --- trunk/src/plugins.c 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/plugins.c 2009-04-03 14:23:45 UTC (rev 3681) @@ -351,7 +351,8 @@ &search_prefs, &tool_prefs, &template_prefs, - &build_info + &build_info, + filetypes_by_title }; memcpy(&geany_data, &gd, sizeof(GeanyData)); }
Modified: trunk/src/symbols.c =================================================================== --- trunk/src/symbols.c 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/symbols.c 2009-04-03 14:23:45 UTC (rev 3681) @@ -1381,7 +1381,7 @@
g_free(utf8_fname);
- if (FILETYPE_ID(ft) < GEANY_FILETYPES_NONE) + if (FILETYPE_ID(ft) != GEANY_FILETYPES_NONE) { fnames = g_hash_table_lookup(hash, ft); /* may be NULL */ fnames = g_list_append(fnames, fname); @@ -1417,13 +1417,14 @@
static void load_user_tags(filetype_id ft_id) { - static guchar tags_loaded[GEANY_FILETYPES_NONE] = {0}; + static guchar tags_loaded[GEANY_MAX_BUILT_IN_FILETYPES - 1] = {0}; static GHashTable *lang_hash = NULL; GList *fnames; const GList *node; const GeanyFiletype *ft = filetypes[ft_id];
- g_return_if_fail(ft_id < GEANY_FILETYPES_NONE); + g_return_if_fail(ft_id > 0); + g_return_if_fail(ft_id < GEANY_MAX_BUILT_IN_FILETYPES);
if (tags_loaded[ft_id]) return;
Modified: trunk/src/templates.c =================================================================== --- trunk/src/templates.c 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/templates.c 2009-04-03 14:23:45 UTC (rev 3681) @@ -362,18 +362,17 @@ /* template items for the new file menu */ static void create_new_menu_items(void) { - filetype_id ft_id; + GeanyFiletype *ft; + GSList *node;
- for (ft_id = 0; ft_id < GEANY_MAX_BUILT_IN_FILETYPES; ft_id++) + foreach_slist(ft, node, filetypes_by_title) { + filetype_id ft_id = ft->id; GtkWidget *tmp_menu, *tmp_button; - GeanyFiletype *ft = filetypes[ft_id]; const gchar *label = ft->title;
if (ft_templates[ft_id] == NULL) continue; - if (ft_id == GEANY_FILETYPES_NONE) - label = _("None");
tmp_menu = gtk_menu_item_new_with_label(label); gtk_widget_show(tmp_menu);
Modified: trunk/src/ui_utils.c =================================================================== --- trunk/src/ui_utils.c 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/ui_utils.c 2009-04-03 14:23:45 UTC (rev 3681) @@ -134,6 +134,14 @@ }
+static GeanyFiletype *document_get_filetype(GeanyDocument *doc) +{ + g_return_val_if_fail(doc, NULL); + + return filetypes[FILETYPE_ID(doc->file_type)]; +} + + /* updates the status bar document statistics */ void ui_update_statusbar(GeanyDocument *doc, gint pos) { @@ -149,14 +157,8 @@ const gchar sp[] = " "; guint line, col; const gchar *cur_tag; - gchar *filetype_name; + gchar *filetype_name = document_get_filetype(doc)->name;
- /* workaround to make the name of filetype GEANY_FILETYPES_NONE translatable */ - if (doc->file_type == NULL || doc->file_type->id == GEANY_FILETYPES_NONE) - filetype_name = _("None"); - else - filetype_name = doc->file_type->name; - if (stats_str == NULL) stats_str = g_string_sized_new(120);
Modified: trunk/src/utils.h =================================================================== --- trunk/src/utils.h 2009-04-03 13:53:04 UTC (rev 3680) +++ trunk/src/utils.h 2009-04-03 14:23:45 UTC (rev 3681) @@ -57,7 +57,12 @@ for (ptr = ptr_array->pdata, item = *ptr; \ ptr < &ptr_array->pdata[ptr_array->len]; ++ptr, item = *ptr)
+/* @param node should be a (GSList*), needed for implementation. */ +#define foreach_slist(data_ptr, node, list) \ + for (node = list, data_ptr = node ? node->data : NULL; node != NULL; \ + node = g_slist_next(node), data_ptr = node ? node->data : NULL)
+ void utils_open_browser(const gchar *uri);
gint utils_get_line_endings(const gchar* buffer, glong size);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.