1

Im trying to write a basic text editor with GTK3 and GtkSourceView but im running into some issues when loading a file into my buffer. Im new to both Gtk and GtkSourceView so apologies if im missing something obvious.
Here is the function in question:

void open_file(GtkSourceBuffer *buffer,kideWindow *self,const char *filename)
{
  GtkSourceLanguageManager *lm;
  GtkSourceLanguage *language = NULL;
  GError *err = NULL;
  gboolean reading;
  GtkTextIter iter;
  GIOChannel *io;
  gchar *gbuffer;

  g_return_val_if_fail (buffer != NULL, FALSE);
  g_return_val_if_fail (filename != NULL, FALSE);
  g_return_val_if_fail (GTK_SOURCE_BUFFER (buffer), FALSE);

  /* get the Language for C source mimetype */
  lm = g_object_get_data (G_OBJECT (buffer), "languages-manager");

  language = gtk_source_language_manager_get_language (lm,"c");
  g_print("Language: [%s]\n", gtk_source_language_get_name(language));

  if (language == NULL)
  {
    g_print ("No language found for mime type `%s'\n", "text/x-c");
    g_object_set (G_OBJECT (buffer), "highlight", FALSE, NULL);
  }
  else
  {
   gtk_source_buffer_set_language (buffer, language);
   g_object_set (G_OBJECT (buffer), "highlight", TRUE, NULL);
  }

  /* Now load the file from Disk */
  io = g_io_channel_new_file (filename, "r", &err);
  if (!io)
  {
    g_print("error: %s %s\n", (err)->message, filename);
    return FALSE;
  }

  if (g_io_channel_set_encoding (io, "utf-8", &err) != G_IO_STATUS_NORMAL)
  {
   g_print("err: Failed to set encoding:\n%s\n%s", filename, (err)->message);
   return FALSE;
  }

  gtk_source_buffer_begin_not_undoable_action (buffer);

  gtk_text_buffer_set_text (GTK_TEXT_BUFFER (buffer), "", 0);
  gbuffer = g_malloc (4096);
  reading = TRUE;
  while (reading)
  {
    gsize bytes_read;
    GIOStatus status;

    status = g_io_channel_read_chars (io, gbuffer, 4096, &bytes_read, &err);
    switch (status)
    {
      case G_IO_STATUS_EOF: reading = FALSE;

      case G_IO_STATUS_NORMAL:
        if (bytes_read == 0) continue;      
        gtk_text_buffer_get_end_iter ( GTK_TEXT_BUFFER (buffer), &iter);
        gtk_text_buffer_insert (GTK_TEXT_BUFFER(buffer),&iter,gbuffer,bytes_read);
        break;

      case G_IO_STATUS_AGAIN: continue;

      case G_IO_STATUS_ERROR:

      default:
        g_print("err (%s): %s", filename, (err)->message);
        /* because of error in input we clear already loaded text */
        gtk_text_buffer_set_text (GTK_TEXT_BUFFER (buffer), "", 0);

        reading = FALSE;
        break;
      }
  }
  g_free (gbuffer);

  gtk_source_buffer_end_not_undoable_action (buffer);
  g_io_channel_unref (io);

  if (err)
  {
   g_error_free (err);
   return FALSE;
  }

  gtk_text_buffer_set_modified (GTK_TEXT_BUFFER (buffer), FALSE);

  /* move cursor to the beginning */
  gtk_text_buffer_get_start_iter (GTK_TEXT_BUFFER (buffer), &iter);
  gtk_text_buffer_place_cursor (GTK_TEXT_BUFFER (buffer), &iter);

  g_object_set_data_full (G_OBJECT (buffer),"filename", g_strdup (filename),
                        (GDestroyNotify) g_free);

  return TRUE;
}  

The error being returned is:

** (kide:5813): CRITICAL **: open_file: assertion 'buffer != NULL' failed  

Any help would be greatly appreciated, Thanks in advance :)

Hamish
  • 11
  • 2
  • The error is coming from the `g_return_val_if_fail()`s within your own function: you're passing `NULL` as the first parameter of your `open_buffer()` function. The problem is elsewhere. – andlabs May 01 '15 at 01:26
  • Can you post the code that calls `open_buffer()`? The problem is likely there, not in `open_buffer()` itself. – andlabs May 05 '15 at 17:19

0 Answers0