How To Save Content of GTKTextBuffer to a File
Asked Answered
S

2

6

I'm writing on Ubuntu 12.04 in Anjuta with C and GTK a program. It's a graphical interface for the nbc (Lego NXT Compiler). I have a GTKTextView. Now I want to save the content of the textview to a file, which could be chosen by a GTKFileChooser. Now I don't know how to get the text from the TextView and write it to the file. How do i do this?

Slusher answered 18/6, 2012 at 17:53 Comment(0)
C
6

First, get the GtkTextBuffer from the GtkTextView using gtk_text_view_get_buffer(). Then get the start and end GtkTextIters from the buffer to use to get the text of the buffer. Finally, write that text to the file using the API of your choice, however, I would recommend Gio. Here's a snippet from my old tutorial:

gtk_widget_set_sensitive (text_view, FALSE);
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (editor->text_view));
gtk_text_buffer_get_start_iter (buffer, &start);
gtk_text_buffer_get_end_iter (buffer, &end);
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);       
gtk_text_buffer_set_modified (buffer, FALSE);
gtk_widget_set_sensitive (editor->text_view, TRUE);

/* set the contents of the file to the text from the buffer */
if (filename != NULL)        
    result = g_file_set_contents (filename, text, -1, &err);
else
    result = g_file_set_contents (editor->filename, text, -1, &err);

if (result == FALSE)
{
    /* error saving file, show message to user */
    error_message (err->message);
    g_error_free (err);
}        

g_free (text); 

Check out the following API documentation:

  1. http://developer.gnome.org/gtk3/stable/GtkTextBuffer.html
  2. http://developer.gnome.org/glib/stable/glib-File-Utilities.html
Capers answered 18/6, 2012 at 18:31 Comment(4)
By the way, result is a gboolean, buffer is a GtkTextBuffer, err is a GError, and start/end are GtkTextIter. It's taken from this code: micahcarrick.com/files/gtk-glade-tutorial/C/main.cCapers
I implemented the code in my program, but it crashes with Error code 11 (segmentation fault). What's wrong? This is my function:Slusher
Can you paste in the function you actually used?Capers
Does this solution also take the TAGS into account? What if I use tags and I want to store my rich text to a file?Technicolor
S
2
void on_toolbutton3_clicked(GtkToolButton *toolbutton, gpointer data)
{   


    GtkWidget *dialog;
    dialog = gtk_file_chooser_dialog_new ("Abspeichern...",
                      NULL,
                      GTK_FILE_CHOOSER_ACTION_SAVE,
                      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                      GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
                      NULL);
    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
    {
    char *filename;
    char *text;
    GtkTextIter *start;
    GtkTextIter *end;
    gboolean result;
    GError *err;
    filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
    gtk_widget_set_sensitive (data, FALSE);
    savebuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (data));
gtk_text_buffer_get_start_iter (savebuffer, &start);
gtk_text_buffer_get_end_iter (savebuffer, &end);
text = gtk_text_buffer_get_text (savebuffer, &start, &end, FALSE);       
gtk_text_buffer_set_modified (savebuffer, FALSE);
gtk_widget_set_sensitive (data, TRUE);

/* set the contents of the file to the text from the buffer */
if (filename != NULL)        
    result = g_file_set_contents (filename, text, -1, &err);
else
    result = g_file_set_contents (filename, text, -1, &err);

if (result == FALSE)
{
    /* error saving file, show message to user */

}        

g_free (text); 
    }
    gtk_widget_destroy (dialog);

}

data points on textview1.

Slusher answered 19/6, 2012 at 13:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.