SF.net SVN: geany:[4070] branches/custom-filetypes
ntrel at users.sourceforge.net
ntrel at xxxxx
Wed Aug 12 11:19:54 UTC 2009
Revision: 4070
http://geany.svn.sourceforge.net/geany/?rev=4070&view=rev
Author: ntrel
Date: 2009-08-12 11:19:54 +0000 (Wed, 12 Aug 2009)
Log Message:
-----------
Support adding custom filetype files e.g. filetype.Foo.conf. (Only
tested with empty file so far).
Allow GeanyFiletype::extension to be NULL.
Modified Paths:
--------------
branches/custom-filetypes/ChangeLog
branches/custom-filetypes/src/dialogs.c
branches/custom-filetypes/src/document.c
branches/custom-filetypes/src/filetypes.c
branches/custom-filetypes/src/filetypes.h
branches/custom-filetypes/src/highlighting.c
branches/custom-filetypes/src/symbols.c
branches/custom-filetypes/src/templates.c
Modified: branches/custom-filetypes/ChangeLog
===================================================================
--- branches/custom-filetypes/ChangeLog 2009-08-12 11:11:37 UTC (rev 4069)
+++ branches/custom-filetypes/ChangeLog 2009-08-12 11:19:54 UTC (rev 4070)
@@ -1,3 +1,12 @@
+2009-08-12 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/templates.c, src/highlighting.c, src/dialogs.c, src/filetypes.c,
+ src/filetypes.h, src/document.c, src/symbols.c:
+ Support adding custom filetype files e.g. filetype.Foo.conf. (Only
+ tested with empty file so far).
+ Allow GeanyFiletype::extension to be NULL.
+
+
2009-08-11 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/highlighting.c:
Modified: branches/custom-filetypes/src/dialogs.c
===================================================================
--- branches/custom-filetypes/src/dialogs.c 2009-08-12 11:11:37 UTC (rev 4069)
+++ branches/custom-filetypes/src/dialogs.c 2009-08-12 11:19:54 UTC (rev 4070)
@@ -88,7 +88,7 @@
gboolean ro = (response == GEANY_RESPONSE_VIEW); /* View clicked */
/* ignore detect from file item */
- if (filetype_idx > 0 && filetype_idx < GEANY_MAX_BUILT_IN_FILETYPES)
+ if (filetype_idx > 0)
ft = g_slist_nth_data(filetypes_by_title, filetype_idx);
if (encoding_idx >= 0 && encoding_idx < GEANY_ENCODINGS_MAX)
charset = encodings[encoding_idx].charset;
@@ -511,8 +511,7 @@
{
gchar *fname = NULL;
- if (doc->file_type != NULL && doc->file_type->id != GEANY_FILETYPES_NONE &&
- doc->file_type->extension != NULL)
+ if (doc->file_type != NULL && doc->file_type->extension != NULL)
fname = g_strconcat(GEANY_STRING_UNTITLED, ".",
doc->file_type->extension, NULL);
else
Modified: branches/custom-filetypes/src/document.c
===================================================================
--- branches/custom-filetypes/src/document.c 2009-08-12 11:11:37 UTC (rev 4069)
+++ branches/custom-filetypes/src/document.c 2009-08-12 11:19:54 UTC (rev 4070)
@@ -1461,7 +1461,11 @@
g_return_if_fail(doc != NULL);
g_return_if_fail(doc->file_type != NULL);
- filebase = g_strconcat(GEANY_STRING_UNTITLED, ".", (doc->file_type)->extension, NULL);
+ if (doc->file_type->extension)
+ filebase = g_strconcat(GEANY_STRING_UNTITLED, ".", doc->file_type->extension, NULL);
+ else
+ filebase = g_strdup(GEANY_STRING_UNTITLED);
+
filename = g_path_get_basename(doc->file_name);
/* only search the first 3 lines */
Modified: branches/custom-filetypes/src/filetypes.c
===================================================================
--- branches/custom-filetypes/src/filetypes.c 2009-08-12 11:11:37 UTC (rev 4069)
+++ branches/custom-filetypes/src/filetypes.c 2009-08-12 11:19:54 UTC (rev 4070)
@@ -112,7 +112,7 @@
ft->lang = -2;
ft->name = g_strdup(_("None"));
ft->title = g_strdup(_("None"));
- ft->extension = g_strdup("*");
+ ft->extension = NULL;
ft->pattern = utils_strv_new("*", NULL);
ft->comment_open = NULL;
ft->comment_close = NULL;
@@ -656,6 +656,51 @@
}
+static void add_custom_filetype(const gchar *filename)
+{
+ gchar *fn = utils_strdupa(strstr(filename, ".") + 1);
+ gchar *dot = g_strrstr(fn, ".conf");
+ GeanyFiletype *ft;
+
+ g_return_if_fail(dot);
+
+ *dot = 0x0;
+
+ geany_debug("Adding filetype %s.", fn);
+ ft = filetype_new();
+ ft->name = g_strdup(fn);
+ filetype_make_title(ft, TITLE_FILE);
+ ft->pattern = g_new0(gchar*, 1);
+ filetype_add(ft);
+}
+
+
+static void init_custom_filetypes(const gchar *path)
+{
+ GDir *dir;
+
+ g_return_if_fail(path);
+
+ dir = g_dir_open(path, 0, NULL);
+ if (dir == NULL)
+ return;
+
+ while (1)
+ {
+ const gchar *filename = g_dir_read_name(dir);
+
+ if (filename == NULL)
+ break;
+
+ if (g_str_has_prefix(filename, "filetype.") && g_str_has_suffix(filename + 9, ".conf"))
+ {
+ add_custom_filetype(filename);
+ }
+ }
+ g_dir_close(dir);
+}
+
+
/* Create the filetypes array and fill it with the known filetypes. */
void filetypes_init_types()
{
@@ -679,6 +724,8 @@
{
filetype_add(filetypes[ft_id]);
}
+ init_custom_filetypes(app->datadir);
+ init_custom_filetypes(utils_build_path(app->configdir, GEANY_FILEDEFS_SUBDIR, NULL));
}
@@ -745,16 +792,18 @@
{
GeanyFiletype *ft = node->data;
- if (ft->id != GEANY_FILETYPES_NONE)
+ if (ft->group != GEANY_FILETYPE_GROUP_NONE)
create_radio_menu_item(group_menus[ft->group], ft);
+ else
+ create_radio_menu_item(filetype_menu, ft);
}
- create_radio_menu_item(filetype_menu, filetypes[GEANY_FILETYPES_NONE]);
}
void filetypes_init()
{
filetypes_init_types();
+
create_set_filetype_menu();
setup_config_file_menus();
}
@@ -1284,9 +1333,9 @@
{
gchar *conf_prefix = g_strconcat(app->configdir,
G_DIR_SEPARATOR_S GEANY_FILEDEFS_SUBDIR G_DIR_SEPARATOR_S "filetypes.", NULL);
- gint i;
+ guint i;
- for (i = 1; i < GEANY_MAX_BUILT_IN_FILETYPES; i++)
+ for (i = 1; i < filetypes_array->len; i++)
{
struct build_programs *bp = filetypes[i]->programs;
GKeyFile *config_home;
Modified: branches/custom-filetypes/src/filetypes.h
===================================================================
--- branches/custom-filetypes/src/filetypes.h 2009-08-12 11:11:37 UTC (rev 4069)
+++ branches/custom-filetypes/src/filetypes.h 2009-08-12 11:19:54 UTC (rev 4070)
@@ -125,7 +125,7 @@
langType lang;
gchar *name; /**< Used as name for tagmanager. E.g. "C". */
gchar *title; /**< Shown in the file open dialog. E.g. "C source file". */
- gchar *extension; /**< Default file extension for new files. */
+ gchar *extension; /**< Default file extension for new files, or @c NULL. */
gchar **pattern; /**< Array of filename-matching wildcard strings. */
gchar *context_action_cmd;
gchar *comment_open;
Modified: branches/custom-filetypes/src/highlighting.c
===================================================================
--- branches/custom-filetypes/src/highlighting.c 2009-08-12 11:11:37 UTC (rev 4069)
+++ branches/custom-filetypes/src/highlighting.c 2009-08-12 11:19:54 UTC (rev 4070)
@@ -3497,6 +3497,9 @@
/* Called by filetypes_load_config(). */
void highlighting_init_styles(gint filetype_idx, GKeyFile *config, GKeyFile *configh)
{
+ if (filetype_idx >= GEANY_MAX_BUILT_IN_FILETYPES)
+ return; /* not supported yet */
+
/* Clear old information if necessary - e.g. reloading config */
styleset_free(filetype_idx);
Modified: branches/custom-filetypes/src/symbols.c
===================================================================
--- branches/custom-filetypes/src/symbols.c 2009-08-12 11:11:37 UTC (rev 4069)
+++ branches/custom-filetypes/src/symbols.c 2009-08-12 11:19:54 UTC (rev 4070)
@@ -1487,15 +1487,16 @@
static void load_user_tags(filetype_id ft_id)
{
- static guchar tags_loaded[GEANY_MAX_BUILT_IN_FILETYPES] = {0};
+ static guchar *tags_loaded = NULL;
static GHashTable *lang_hash = NULL;
GList *fnames;
const GList *node;
GeanyFiletype *ft = filetypes[ft_id];
g_return_if_fail(ft_id > 0);
- g_return_if_fail(ft_id < GEANY_MAX_BUILT_IN_FILETYPES);
+ if (!tags_loaded)
+ tags_loaded = g_new0(guchar, filetypes_array->len);
if (tags_loaded[ft_id])
return;
tags_loaded[ft_id] = TRUE; /* prevent reloading */
Modified: branches/custom-filetypes/src/templates.c
===================================================================
--- branches/custom-filetypes/src/templates.c 2009-08-12 11:11:37 UTC (rev 4069)
+++ branches/custom-filetypes/src/templates.c 2009-08-12 11:19:54 UTC (rev 4070)
@@ -240,6 +240,8 @@
";
static gchar *templates[GEANY_MAX_TEMPLATES];
+
+/* TODO: remove filetype templates, use custom file templates instead. */
static gchar *ft_templates[GEANY_MAX_BUILT_IN_FILETYPES] = {NULL};
@@ -684,7 +686,7 @@
if (fname == NULL)
{
- if (ft_id == GEANY_FILETYPES_NONE)
+ if (!ft->extension)
shortname = g_strdup(GEANY_STRING_UNTITLED);
else
shortname = g_strconcat(GEANY_STRING_UNTITLED, ".", ft->extension, NULL);
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