/*
Ouvre un fichier source C, chemin absolu.
-I/usr/include/gtksourceview-1.0 -lgtksourceview-1.0
*/
#include <gtk/gtk.h>
#include <gtksourceview/gtksourceview.h>
#include <gtksourceview/gtksourcebuffer.h>
#include <gtksourceview/gtksourcelanguage.h>
#include <gtksourceview/gtksourcelanguagesmanager.h>
/*==============================================================================
Create a GtkSourceBuffer ******************************************************
==============================================================================*/
static GtkSourceBuffer *create_source_buffer (GtkSourceLanguagesManager *manager)
{
GtkSourceBuffer *buffer;
buffer = GTK_SOURCE_BUFFER (gtk_source_buffer_new (NULL));
g_object_ref (manager);
g_object_set_data_full (G_OBJECT (buffer), "languages-manager",manager, (GDestroyNotify) g_object_unref);
return buffer;
}
/*==============================================================================
Load a file *******************************************************************
==============================================================================*/
static gboolean gtk_source_buffer_load_with_encoding (GtkSourceBuffer *source_buffer,
const gchar *filename, const gchar *encoding, GError **error)
{
GIOChannel *io;
GtkTextIter iter;
gchar *buffer;
gboolean reading;
g_return_val_if_fail (source_buffer != NULL, FALSE);
g_return_val_if_fail (filename != NULL, FALSE);
g_return_val_if_fail (GTK_IS_SOURCE_BUFFER (source_buffer), FALSE);
*error = NULL;
io = g_io_channel_new_file (filename, "r", error);
if (!io)
{
//error_dialog (NULL, "%s\nFile %s", (*error)->message, filename);
g_print("erreur: %s %s\n", (*error)->message, filename);
return FALSE;
}
if (g_io_channel_set_encoding (io, encoding, error) != G_IO_STATUS_NORMAL)
{
//error_dialog (NULL, "Failed to set encoding:\n%s\n%s", filename, (*error)->message);
g_print("erreur: Failed to set encoding:\n%s\n%s", filename, (*error)->message);
return FALSE;
}
gtk_source_buffer_begin_not_undoable_action (source_buffer);
gtk_text_buffer_set_text (GTK_TEXT_BUFFER (source_buffer), "", 0);
buffer = g_malloc (4096);
reading = TRUE;
while (reading)
{
gsize bytes_read;
GIOStatus status;
status = g_io_channel_read_chars (io, buffer, 4096, &bytes_read, error);
switch (status)
{
case G_IO_STATUS_EOF:
reading = FALSE;
/* fall through */
case G_IO_STATUS_NORMAL:
if (bytes_read == 0)
{
continue;
}
gtk_text_buffer_get_end_iter ( GTK_TEXT_BUFFER (source_buffer), &iter);
gtk_text_buffer_insert (GTK_TEXT_BUFFER (source_buffer), &iter, buffer, bytes_read);
break;
case G_IO_STATUS_AGAIN:
continue;
case G_IO_STATUS_ERROR:
default:
//error_dialog (NULL, "%s\nFile %s", (*error)->message, filename);
g_print("erreur:%s\nFile %s", (*error)->message, filename);
// because of error in input we clear already loaded text
gtk_text_buffer_set_text (GTK_TEXT_BUFFER (source_buffer), "", 0);
reading = FALSE;
break;
}
}
g_free (buffer);
gtk_source_buffer_end_not_undoable_action (source_buffer);
g_io_channel_unref (io);
if (*error) return FALSE;
gtk_text_buffer_set_modified (GTK_TEXT_BUFFER (source_buffer), FALSE);
/* move cursor to the beginning */
gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (source_buffer), &iter);
gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (source_buffer), &iter);
return TRUE;
}
/*==============================================================================
Create a GtkSourceBuffer ******************************************************
==============================================================================*/
static gboolean open_file (GtkSourceBuffer *buffer, const gchar *filename)
{
GtkSourceLanguagesManager *manager;
GtkSourceLanguage *language = NULL;
GError *err = NULL;
/* get the new language for the file mimetype */
manager = g_object_get_data (G_OBJECT (buffer), "languages-manager");
language = gtk_source_languages_manager_get_language_from_mime_type (manager, "text/x-csrc");
// gchar* gtk_source_language_get_name (GtkSourceLanguage *language);
g_print("Langage: [%s]\n", gtk_source_language_get_name(language));
if (language == NULL)
{
g_print ("No language found for mime type `%s'\n", "text/x-csrc");
g_object_set (G_OBJECT (buffer), "highlight", FALSE, NULL);
}
else
{
g_object_set (G_OBJECT (buffer), "highlight", TRUE, NULL);
gtk_source_buffer_set_language (buffer, language);
}
gtk_source_buffer_load_with_encoding (buffer, filename, "utf-8", &err);
g_object_set_data_full (G_OBJECT (buffer),"filename", g_strdup (filename),(GDestroyNotify) g_free);
if (err != NULL)
{
g_error_free (err);
return FALSE;
}
return TRUE;
}
/*==============================================================================
Entry point *******************************************************************
==============================================================================*/
int main( int argc, char *argv[] )
{
static GtkWidget *fenetre, *pScrollWin, *sView;
GtkSourceLanguagesManager *lm;
GtkSourceBuffer *sBuf;
// Creation fenetre
gtk_init (&argc, &argv);
fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(fenetre),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_container_set_border_width (GTK_CONTAINER (fenetre), 10);
gtk_window_set_default_size(GTK_WINDOW(fenetre), 800, 400);
gtk_window_set_position (GTK_WINDOW (fenetre), GTK_WIN_POS_CENTER);
// Charge scrolledWindow qui contient le sourceView
pScrollWin = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (pScrollWin),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
// Creation source_view
lm = gtk_source_languages_manager_new();
sBuf = create_source_buffer(lm);
sView = gtk_source_view_new_with_buffer(sBuf);
// Attache scrollWin a la fenetre
gtk_container_add (GTK_CONTAINER (pScrollWin), GTK_WIDGET (sView));
gtk_container_add (GTK_CONTAINER (fenetre), pScrollWin);
gtk_widget_show_all (pScrollWin);
//if (argc > 1) // Chargement d'un fichier
// open_file (sBuf, argv [1]);
//else
open_file (sBuf, (argc > 1)?argv[1]:"src.c");
gtk_widget_show (fenetre);
gtk_main();
g_object_unref (sBuf); // cleanup
return 0;
}