static void
remove_all_marks (GtkTextBuffer *buffer)
{
GtkTextIter s, e;
gtk_text_buffer_get_bounds (buffer, &s, &e);
gtk_source_buffer_remove_source_marks (GTK_SOURCE_BUFFER(buffer), &s, &e, NULL);
}
static GtkSourceLanguage *
get_language_for_file (GtkTextBuffer *buffer, const gchar *filename)
{
GtkSourceLanguageManager *manager;
GtkSourceLanguage *language;
GtkTextIter start, end;
gchar *text;
gchar *content_type;
gboolean result_uncertain;
gtk_text_buffer_get_start_iter (buffer, &start);
if (gtk_text_buffer_get_char_count (buffer) < 1024)
gtk_text_buffer_get_end_iter (buffer, &end);
else
gtk_text_buffer_get_iter_at_offset (buffer, &end, 1024);
text = gtk_text_buffer_get_slice (buffer, &start, &end, TRUE);
content_type = g_content_type_guess (filename,
(guchar*) text,
strlen (text),
&result_uncertain);
if (result_uncertain)
{
g_free (content_type);
content_type = NULL;
}
manager = gtk_source_language_manager_get_default ();
language = gtk_source_language_manager_guess_language (manager,
filename,
content_type);
g_message ("Detected '%s' mime type for file %s, chose language %s",
content_type ? content_type : "(null)",
filename,
language ? gtk_source_language_get_id (language) : "(none)");
g_free (content_type);
g_free (text);
return language;
}
static GtkSourceLanguage *
get_language_by_id (const gchar *id)
{
GtkSourceLanguageManager *manager;
manager = gtk_source_language_manager_get_default ();
return gtk_source_language_manager_get_language (manager, id);
}
static GtkSourceLanguage *
get_language (GtkTextBuffer *buffer, const gchar *filename)
{
GtkSourceLanguage *language = NULL;
GtkTextIter start, end;
gchar *text;
gchar *lang_string;
gtk_text_buffer_get_start_iter (buffer, &start);
end = start;
gtk_text_iter_forward_line (&end);
#define LANG_STRING "gtk-source-lang:"
text = gtk_text_iter_get_slice (&start, &end);
lang_string = strstr (text, LANG_STRING);
if (lang_string != NULL)
{
gchar **tokens;
lang_string += strlen (LANG_STRING);
g_strchug (lang_string);
tokens = g_strsplit_set (lang_string, " \t\n", 2);
if (tokens != NULL && tokens[0] != NULL)
language = get_language_by_id (tokens[0]);
g_strfreev (tokens);
}
if (!language)
language = get_language_for_file (buffer, filename);
g_free (text);
return language;
}
void on_syntax(gint tabcount)
{
GtkSourceLanguage *language = NULL;
gchar *freeme = NULL;
gchar *filename = tab[tabcount].filename;
GtkTextBuffer *buffer=GTK_TEXT_BUFFER(tab[tabcount].buffer);
if (!g_path_is_absolute(filename))
{
gchar *curdir = g_get_current_dir ();
freeme = g_build_filename (curdir, filename, NULL);
filename = freeme;
g_free (curdir);
}
remove_all_marks(buffer);
language = get_language(GTK_TEXT_BUFFER(buffer), filename);
if (language == NULL)
g_print ("No language found for file `%s'\n", filename);
gtk_source_buffer_set_language (tab[tabcount].buffer, language);
/*g_object_set_data_full (G_OBJECT (tab[tabcount].buffer),
"filename", g_strdup (filename),
(GDestroyNotify) g_free);*/
/*if (language != NULL)
{
gchar **styles;
styles = gtk_source_language_get_style_ids (language);
if (styles == NULL)
g_print ("No styles in language '%s'\n", gtk_source_language_get_name (language));
else
{
gchar **ids;
g_print ("Styles in in language '%s':\n", gtk_source_language_get_name (language));
ids = styles;
while (*ids != NULL)
{
const gchar *name;
name = gtk_source_language_get_style_name (language, *ids);
g_print ("- %s (name: '%s')\n", *ids, name);
++ids;
}
g_strfreev (styles);
}
g_print("\n");
}*/
g_free(freeme);
}