[gtksourceview/wip/loader-saver: 42/42] FileSaver: do not depend on GtkSourceFile



commit 6a9a282bfbde57f1ba9dbe1e609b8ff302d9cbb7
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Fri Mar 14 18:55:41 2014 +0100

    FileSaver: do not depend on GtkSourceFile

 gtksourceview/gtksourcebufferinputstream.h |    1 -
 gtksourceview/gtksourcefile.h              |    1 -
 gtksourceview/gtksourcefilesaver.c         |  261 ++++++++++++++++++---------
 gtksourceview/gtksourcefilesaver.h         |   28 +---
 4 files changed, 180 insertions(+), 111 deletions(-)
---
diff --git a/gtksourceview/gtksourcebufferinputstream.h b/gtksourceview/gtksourcebufferinputstream.h
index d3d990e..5c0940a 100644
--- a/gtksourceview/gtksourcebufferinputstream.h
+++ b/gtksourceview/gtksourcebufferinputstream.h
@@ -27,7 +27,6 @@
 #include <gtk/gtk.h>
 #include "gtksourcetypes-private.h"
 #include "gtksourcebuffer.h"
-#include "gtksourcefile.h"
 
 G_BEGIN_DECLS
 
diff --git a/gtksourceview/gtksourcefile.h b/gtksourceview/gtksourcefile.h
index 3c45f8c..3b1bcf2 100644
--- a/gtksourceview/gtksourcefile.h
+++ b/gtksourceview/gtksourcefile.h
@@ -44,7 +44,6 @@ typedef struct _GtkSourceFilePrivate  GtkSourceFilePrivate;
 /* TODO document the errors */
 enum
 {
-       GTK_SOURCE_FILE_ERROR_EXTERNALLY_MODIFIED,
        GTK_SOURCE_FILE_ERROR_TOO_BIG,
        GTK_SOURCE_FILE_ERROR_ENCODING_AUTO_DETECTION_FAILED,
        GTK_SOURCE_FILE_ERROR_CONVERSION_FALLBACK
diff --git a/gtksourceview/gtksourcefilesaver.c b/gtksourceview/gtksourcefilesaver.c
index 73cf2b0..81bf8c9 100644
--- a/gtksourceview/gtksourcefilesaver.c
+++ b/gtksourceview/gtksourcefilesaver.c
@@ -26,15 +26,13 @@
  * It uses a GtkSourceBufferInputStream as input, create converter(s) if needed
  * for the encoding and the compression, and write the contents to a
  * GOutputStream (the file).
- * The FileSaver has properties for all the settings relevant for saving a file.
- * It can not rely on a GtkSourceFile, because its properties can change during
- * the saving.
  */
 
 #include "gtksourcefilesaver.h"
 #include "gtksourcebufferinputstream.h"
 #include "gtksourceencoding.h"
 #include "gtksourceview-typebuiltins.h"
+#include "gtksourceview-i18n.h"
 
 #if 0
 #define DEBUG(x) (x)
@@ -49,23 +47,31 @@
 enum
 {
        PROP_0,
+       PROP_BUFFER,
        PROP_FILE,
        PROP_ENCODING,
        PROP_NEWLINE_TYPE,
        PROP_COMPRESSION_TYPE,
        PROP_ENSURE_TRAILING_NEWLINE,
-       PROP_FLAGS
+       PROP_CREATE_BACKUP
 };
 
 struct _GtkSourceFileSaverPrivate
 {
-       GtkSourceFile *file;
+       /* Weak reference to the source_buffer. A subclass of GtkSourceBuffer
+        * can have the ownership of the FileSaver. And a FileSaver can be used
+        * several times, so the object can be kept around until the subclass of
+        * GtkSourceBuffer is disposed.
+        */
+       GtkSourceBuffer *source_buffer;
+       GFile *file;
+
        const GtkSourceEncoding *encoding;
        GtkSourceNewlineType newline_type;
        GtkSourceCompressionType compression_type;
-       GtkSourceFileSaveFlags flags;
 
-       GTimeVal old_mtime;
+       GtkSourceMountOperationFactory mount_operation_factory;
+       gpointer mount_operation_userdata;
 
        GTask *task;
 
@@ -93,6 +99,7 @@ struct _GtkSourceFileSaverPrivate
        GFileInfo *info;
 
        guint ensure_trailing_newline : 1;
+       guint create_backup : 1;
        guint tried_mount : 1;
 };
 
@@ -112,16 +119,23 @@ gtk_source_file_saver_set_property (GObject      *object,
 
        switch (prop_id)
        {
+               case PROP_BUFFER:
+                       g_assert (saver->priv->source_buffer == NULL);
+                       saver->priv->source_buffer = g_value_get_object (value);
+                       g_object_add_weak_pointer (G_OBJECT (saver->priv->source_buffer),
+                                                  (gpointer *)&saver->priv->source_buffer);
+                       break;
+
                case PROP_FILE:
                        g_assert (saver->priv->file == NULL);
-                       saver->priv->file = g_value_get_object (value);
+                       saver->priv->file = g_value_dup_object (value);
                        break;
 
                case PROP_ENCODING:
-                       g_assert (saver->priv->encoding == NULL);
                        saver->priv->encoding = g_value_get_boxed (value);
                        if (saver->priv->encoding == NULL)
                        {
+                               /* FIXME ok? */
                                saver->priv->encoding = gtk_source_encoding_get_utf8 ();
                        }
                        break;
@@ -138,8 +152,8 @@ gtk_source_file_saver_set_property (GObject      *object,
                        saver->priv->ensure_trailing_newline = g_value_get_boolean (value);
                        break;
 
-               case PROP_FLAGS:
-                       saver->priv->flags = g_value_get_flags (value);
+               case PROP_CREATE_BACKUP:
+                       saver->priv->create_backup = g_value_get_boolean (value);
                        break;
 
                default:
@@ -150,14 +164,18 @@ gtk_source_file_saver_set_property (GObject      *object,
 
 static void
 gtk_source_file_saver_get_property (GObject    *object,
-                                  guint       prop_id,
-                                  GValue     *value,
-                                  GParamSpec *pspec)
+                                   guint       prop_id,
+                                   GValue     *value,
+                                   GParamSpec *pspec)
 {
        GtkSourceFileSaver *saver = GTK_SOURCE_FILE_SAVER (object);
 
        switch (prop_id)
        {
+               case PROP_BUFFER:
+                       g_value_set_object (value, saver->priv->source_buffer);
+                       break;
+
                case PROP_FILE:
                        g_value_set_object (value, saver->priv->file);
                        break;
@@ -178,8 +196,8 @@ gtk_source_file_saver_get_property (GObject    *object,
                        g_value_set_boolean (value, saver->priv->ensure_trailing_newline);
                        break;
 
-               case PROP_FLAGS:
-                       g_value_set_flags (value, saver->priv->flags);
+               case PROP_CREATE_BACKUP:
+                       g_value_set_boolean (value, saver->priv->create_backup);
                        break;
 
                default:
@@ -193,14 +211,21 @@ gtk_source_file_saver_dispose (GObject *object)
 {
        GtkSourceFileSaverPrivate *priv = GTK_SOURCE_FILE_SAVER (object)->priv;
 
+       if (priv->source_buffer != NULL)
+       {
+               g_object_remove_weak_pointer (G_OBJECT (priv->source_buffer),
+                                             (gpointer *)&priv->source_buffer);
+
+               priv->source_buffer = NULL;
+       }
+
+       g_clear_object (&priv->file);
        g_clear_object (&priv->output_stream);
        g_clear_object (&priv->input_stream);
        g_clear_object (&priv->task);
        g_clear_object (&priv->info);
        g_clear_error (&priv->error);
 
-       priv->file = NULL;
-
        G_OBJECT_CLASS (gtk_source_file_saver_parent_class)->dispose (object);
 }
 
@@ -213,68 +238,126 @@ gtk_source_file_saver_class_init (GtkSourceFileSaverClass *klass)
        object_class->set_property = gtk_source_file_saver_set_property;
        object_class->get_property = gtk_source_file_saver_get_property;
 
+       /**
+        * GtkSourceFileSaver:buffer:
+        *
+        * The #GtkSourceBuffer to save.
+        *
+        * Since: 3.14
+        */
+       g_object_class_install_property (object_class,
+                                        PROP_BUFFER,
+                                        g_param_spec_object ("buffer",
+                                                             "GtkSourceBuffer",
+                                                             NULL,
+                                                             GTK_SOURCE_TYPE_BUFFER,
+                                                             G_PARAM_READWRITE |
+                                                             G_PARAM_CONSTRUCT_ONLY |
+                                                             G_PARAM_STATIC_STRINGS));
+
+       /**
+        * GtkSourceFileSaver:file:
+        *
+        * The #GFile where to save the buffer.
+        *
+        * Since: 3.14
+        */
        g_object_class_install_property (object_class,
                                         PROP_FILE,
                                         g_param_spec_object ("file",
-                                                             "File",
-                                                             "The associated GtkSourceFile",
-                                                             GTK_SOURCE_TYPE_FILE,
+                                                             "GFile",
+                                                             NULL,
+                                                             G_TYPE_FILE,
                                                              G_PARAM_READWRITE |
                                                              G_PARAM_CONSTRUCT_ONLY |
                                                              G_PARAM_STATIC_STRINGS));
 
+       /**
+        * GtkSourceFileSaver:encoding:
+        *
+        * The file's encoding.
+        *
+        * Since: 3.14
+        */
        g_object_class_install_property (object_class,
                                         PROP_ENCODING,
                                         g_param_spec_boxed ("encoding",
-                                                            "Encoding",
-                                                            "The encoding of the saved file",
+                                                            "GtkSourceEncoding",
+                                                            NULL,
                                                             GTK_SOURCE_TYPE_ENCODING,
                                                             G_PARAM_READWRITE |
-                                                            G_PARAM_CONSTRUCT_ONLY |
+                                                            G_PARAM_CONSTRUCT |
                                                             G_PARAM_STATIC_STRINGS));
 
+       /**
+        * GtkSourceFileSaver:newline-type:
+        *
+        * The newline type.
+        *
+        * Since: 3.14
+        */
        g_object_class_install_property (object_class,
                                         PROP_NEWLINE_TYPE,
                                         g_param_spec_enum ("newline-type",
-                                                           "Newline type",
-                                                           "The type of line ending",
+                                                           _("Newline Type"),
+                                                           NULL,
                                                            GTK_SOURCE_TYPE_NEWLINE_TYPE,
                                                            GTK_SOURCE_NEWLINE_TYPE_LF,
                                                            G_PARAM_READWRITE |
-                                                           G_PARAM_CONSTRUCT_ONLY |
+                                                           G_PARAM_CONSTRUCT |
                                                            G_PARAM_STATIC_STRINGS));
 
+       /**
+        * GtkSourceFileSaver:compression-type:
+        *
+        * The compression type.
+        *
+        * Since: 3.14
+        */
        g_object_class_install_property (object_class,
                                         PROP_COMPRESSION_TYPE,
                                         g_param_spec_enum ("compression-type",
-                                                           "Compression type",
-                                                           "The compression type",
+                                                           _("Compression Type"),
+                                                           NULL,
                                                            GTK_SOURCE_TYPE_COMPRESSION_TYPE,
                                                            GTK_SOURCE_COMPRESSION_TYPE_NONE,
                                                            G_PARAM_READWRITE |
-                                                           G_PARAM_CONSTRUCT_ONLY |
+                                                           G_PARAM_CONSTRUCT |
                                                            G_PARAM_STATIC_STRINGS));
 
+       /**
+        * GtkSourceFileSaver:ensure-trailing-newline:
+        *
+        * Ensure the file ends with a trailing newline.
+        *
+        * Since: 3.14
+        */
        g_object_class_install_property (object_class,
                                         PROP_ENSURE_TRAILING_NEWLINE,
                                         g_param_spec_boolean ("ensure-trailing-newline",
-                                                              "Ensure Trailing Newline",
-                                                              "Ensure the buffer ends with a trailing 
newline",
+                                                              _("Ensure Trailing Newline"),
+                                                              NULL,
                                                               TRUE,
                                                               G_PARAM_READWRITE |
-                                                              G_PARAM_CONSTRUCT_ONLY |
+                                                              G_PARAM_CONSTRUCT |
                                                               G_PARAM_STATIC_STRINGS));
 
+       /**
+        * GtkSourceFileSaver:create-backup:
+        *
+        * Create a backup before saving the file.
+        *
+        * Since: 3.14
+        */
        g_object_class_install_property (object_class,
-                                        PROP_FLAGS,
-                                        g_param_spec_flags ("flags",
-                                                            "Flags",
-                                                            "The flags for the saving operation",
-                                                            GTK_SOURCE_TYPE_FILE_SAVE_FLAGS,
-                                                            0,
-                                                            G_PARAM_READWRITE |
-                                                            G_PARAM_CONSTRUCT_ONLY |
-                                                            G_PARAM_STATIC_STRINGS));
+                                        PROP_CREATE_BACKUP,
+                                        g_param_spec_boolean ("create-backup",
+                                                              _("Create Backup"),
+                                                              NULL,
+                                                              FALSE,
+                                                              G_PARAM_READWRITE |
+                                                              G_PARAM_CONSTRUCT |
+                                                              G_PARAM_STATIC_STRINGS));
 }
 
 static void
@@ -349,7 +432,7 @@ cancel_output_stream (GtkSourceFileSaver *saver)
  */
 
 static void
-query_info_cb (GFile              *location,
+query_info_cb (GFile              *file,
               GAsyncResult       *result,
               GtkSourceFileSaver *saver)
 {
@@ -359,8 +442,9 @@ query_info_cb (GFile              *location,
               g_print ("Finished query info on file\n");
        });
 
+       /* TODO update mtime stored in GtkSourceBuffer */
        g_clear_object (&saver->priv->info);
-       saver->priv->info = g_file_query_info_finish (location, result, &error);
+       saver->priv->info = g_file_query_info_finish (file, result, &error);
 
        if (error != NULL)
        {
@@ -381,7 +465,6 @@ close_output_stream_cb (GOutputStream      *output_stream,
                        GtkSourceFileSaver *saver)
 {
        GError *error = NULL;
-       GFile *location;
 
        DEBUG ({
               g_print ("%s\n", G_STRFUNC);
@@ -407,9 +490,7 @@ close_output_stream_cb (GOutputStream      *output_stream,
               g_print ("Query info on file\n");
        });
 
-       location = gtk_source_file_get_location (saver->priv->file);
-
-       g_file_query_info_async (location,
+       g_file_query_info_async (saver->priv->file,
                                 QUERY_ATTRIBUTES,
                                 G_FILE_QUERY_INFO_NONE,
                                 g_task_get_priority (saver->priv->task),
@@ -564,21 +645,20 @@ read_file_chunk (GtkSourceFileSaver *saver)
 }
 
 static void
-replace_file_cb (GFile              *location,
+replace_file_cb (GFile              *file,
                 GAsyncResult       *result,
                 GtkSourceFileSaver *saver)
 {
        GFileOutputStream *file_output_stream;
        GOutputStream *output_stream;
        GtkSourceBufferInputStream *buffer_stream;
-       GtkTextBuffer *buffer;
        GError *error = NULL;
 
        DEBUG ({
               g_print ("%s\n", G_STRFUNC);
        });
 
-       file_output_stream = g_file_replace_finish (location, result, &error);
+       file_output_stream = g_file_replace_finish (file, result, &error);
 
        if (error != NULL)
        {
@@ -646,9 +726,7 @@ replace_file_cb (GFile              *location,
                saver->priv->output_stream = G_OUTPUT_STREAM (output_stream);
        }
 
-       buffer = GTK_TEXT_BUFFER (gtk_source_file_get_buffer (saver->priv->file));
-
-       saver->priv->input_stream = _gtk_source_buffer_input_stream_new (buffer,
+       saver->priv->input_stream = _gtk_source_buffer_input_stream_new (GTK_TEXT_BUFFER 
(saver->priv->source_buffer),
                                                                         saver->priv->newline_type,
                                                                         
saver->priv->ensure_trailing_newline);
 
@@ -665,19 +743,14 @@ replace_file_cb (GFile              *location,
 static void
 begin_write (GtkSourceFileSaver *saver)
 {
-       GFile *location;
-       gboolean create_backup = (saver->priv->flags & GTK_SOURCE_FILE_SAVE_CREATE_BACKUP) != 0;
-
        DEBUG ({
               g_print ("Start replacing file contents\n");
               g_print ("Make backup: %s\n", make_backup ? "yes" : "no");
        });
 
-       location = gtk_source_file_get_location (saver->priv->file);
-
-       g_file_replace_async (location,
+       g_file_replace_async (saver->priv->file,
                              NULL,
-                             create_backup,
+                             saver->priv->create_backup,
                              G_FILE_CREATE_NONE,
                              g_task_get_priority (saver->priv->task),
                              g_task_get_cancellable (saver->priv->task),
@@ -686,7 +759,7 @@ begin_write (GtkSourceFileSaver *saver)
 }
 
 static void
-mount_cb (GFile              *location,
+mount_cb (GFile              *file,
          GAsyncResult       *result,
          GtkSourceFileSaver *saver)
 {
@@ -696,7 +769,7 @@ mount_cb (GFile              *location,
               g_print ("%s\n", G_STRFUNC);
        });
 
-       g_file_mount_enclosing_volume_finish (location, result, &error);
+       g_file_mount_enclosing_volume_finish (file, result, &error);
 
        if (error != NULL)
        {
@@ -706,11 +779,18 @@ mount_cb (GFile              *location,
        begin_write (saver);
 }
 
+static GMountOperation *
+create_mount_operation (GtkSourceFileSaver *saver)
+{
+       return saver->priv->mount_operation_factory != NULL ?
+               saver->priv->mount_operation_factory (saver->priv->mount_operation_userdata) :
+               g_mount_operation_new ();
+}
+
 static void
 recover_not_mounted (GtkSourceFileSaver *saver)
 {
-       GFile *location;
-       GMountOperation *mount_operation = _gtk_source_file_create_mount_operation (saver->priv->file);
+       GMountOperation *mount_operation = create_mount_operation (saver);
 
        DEBUG ({
               g_print ("%s\n", G_STRFUNC);
@@ -718,9 +798,7 @@ recover_not_mounted (GtkSourceFileSaver *saver)
 
        saver->priv->tried_mount = TRUE;
 
-       location = gtk_source_file_get_location (saver->priv->file);
-
-       g_file_mount_enclosing_volume (location,
+       g_file_mount_enclosing_volume (saver->priv->file,
                                       G_MOUNT_MOUNT_NONE,
                                       mount_operation,
                                       g_task_get_cancellable (saver->priv->task),
@@ -731,22 +809,15 @@ recover_not_mounted (GtkSourceFileSaver *saver)
 }
 
 GtkSourceFileSaver *
-gtk_source_file_saver_new (GtkSourceFile            *file,
-                          const GtkSourceEncoding  *encoding,
-                          GtkSourceNewlineType      newline_type,
-                          GtkSourceCompressionType  compression_type,
-                          gboolean                  ensure_trailing_newline,
-                          GtkSourceFileSaveFlags    flags)
+gtk_source_file_saver_new (GtkSourceBuffer *buffer,
+                          GFile           *file)
 {
-       g_return_val_if_fail (GTK_SOURCE_IS_FILE (file), NULL);
+       g_return_val_if_fail (GTK_SOURCE_IS_BUFFER (buffer), NULL);
+       g_return_val_if_fail (G_IS_FILE (file), NULL);
 
        return g_object_new (GTK_SOURCE_TYPE_FILE_SAVER,
+                            "buffer", buffer,
                             "file", file,
-                            "encoding", encoding,
-                            "newline_type", newline_type,
-                            "compression_type", compression_type,
-                            "ensure-trailing-newline", ensure_trailing_newline,
-                            "flags", flags,
                             NULL);
 }
 
@@ -762,14 +833,14 @@ gtk_source_file_saver_save_async (GtkSourceFileSaver     *saver,
        g_return_if_fail (GTK_SOURCE_IS_FILE_SAVER (saver));
        g_return_if_fail (saver->priv->task == NULL);
 
-       saver->priv->task = g_task_new (saver->priv->file, cancellable, callback, user_data);
+       saver->priv->task = g_task_new (saver, cancellable, callback, user_data);
        g_task_set_priority (saver->priv->task, io_priority);
 
        saver->priv->progress_cb = progress_callback;
        saver->priv->progress_cb_data = progress_callback_data;
 
        DEBUG ({
-              g_print ("Starting  save\n");
+              g_print ("Start saving\n");
        });
 
        begin_write (saver);
@@ -782,15 +853,31 @@ gtk_source_file_saver_save_finish (GtkSourceFileSaver  *saver,
 {
        g_return_val_if_fail (GTK_SOURCE_IS_FILE_SAVER (saver), FALSE);
        g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-       g_return_val_if_fail (g_task_is_valid (result, saver->priv->file), FALSE);
+       g_return_val_if_fail (g_task_is_valid (result, saver), FALSE);
 
        return g_task_propagate_boolean (G_TASK (result), error);
 }
 
-GFileInfo *
-gtk_source_file_saver_get_info (GtkSourceFileSaver *saver)
+/**
+ * gtk_source_file_saver_set_mount_operation_factory:
+ * @saver: a #GtkSourceFileSaver.
+ * @callback: a #GtkSourceMountOperationFactory to call when a #GMountOperation
+ * is needed.
+ * @user_data: the data to pass to the @callback function.
+ *
+ * Sets a #GtkSourceMountOperationFactory function that will be called when a
+ * #GMountOperation must be created. This is useful for creating a
+ * #GtkMountOperation with the parent #GtkWindow.
+ *
+ * Since: 3.14
+ */
+void
+gtk_source_file_saver_set_mount_operation_factory (GtkSourceFileSaver             *saver,
+                                                  GtkSourceMountOperationFactory  callback,
+                                                  gpointer                        user_data)
 {
-       g_return_val_if_fail (GTK_SOURCE_IS_FILE_SAVER (saver), NULL);
+       g_return_if_fail (GTK_SOURCE_IS_FILE_SAVER (saver));
 
-       return saver->priv->info;
+       saver->priv->mount_operation_factory = callback;
+       saver->priv->mount_operation_userdata = user_data;
 }
diff --git a/gtksourceview/gtksourcefilesaver.h b/gtksourceview/gtksourcefilesaver.h
index 46952de..fdcb5b8 100644
--- a/gtksourceview/gtksourcefilesaver.h
+++ b/gtksourceview/gtksourcefilesaver.h
@@ -41,21 +41,6 @@ G_BEGIN_DECLS
 typedef struct _GtkSourceFileSaverClass   GtkSourceFileSaverClass;
 typedef struct _GtkSourceFileSaverPrivate GtkSourceFileSaverPrivate;
 
-/**
- * GtkSourceFileSaveFlags:
- * @GTK_SOURCE_FILE_SAVE_CREATE_BACKUP: create a backup before saving the file.
- * @GTK_SOURCE_FILE_SAVE_IGNORE_INVALID_CHARS: do not save invalid characters.
- *
- * FIXME ignore invalid chars is not yet used in gsv
- *
- * Since: 3.14
- */
-typedef enum
-{
-       GTK_SOURCE_FILE_SAVE_CREATE_BACKUP              = 1 << 0,
-       GTK_SOURCE_FILE_SAVE_IGNORE_INVALID_CHARS       = 1 << 1
-} GtkSourceFileSaveFlags;
-
 struct _GtkSourceFileSaver
 {
        GObject object;
@@ -70,12 +55,8 @@ struct _GtkSourceFileSaverClass
 
 GType                   gtk_source_file_saver_get_type         (void) G_GNUC_CONST;
 
-GtkSourceFileSaver     *gtk_source_file_saver_new              (GtkSourceFile            *file,
-                                                                const GtkSourceEncoding  *encoding,
-                                                                GtkSourceNewlineType      newline_type,
-                                                                GtkSourceCompressionType  compression_type,
-                                                                gboolean                  
ensure_trailing_newline,
-                                                                GtkSourceFileSaveFlags    flags);
+GtkSourceFileSaver     *gtk_source_file_saver_new              (GtkSourceBuffer          *buffer,
+                                                                GFile                    *file);
 
 void                    gtk_source_file_saver_save_async       (GtkSourceFileSaver       *saver,
                                                                 gint                      io_priority,
@@ -89,7 +70,10 @@ gboolean              gtk_source_file_saver_save_finish      (GtkSourceFileSaver       
*saver,
                                                                 GAsyncResult             *result,
                                                                 GError                  **error);
 
-GFileInfo              *gtk_source_file_saver_get_info         (GtkSourceFileSaver       *saver);
+void                    gtk_source_file_saver_set_mount_operation_factory
+                                                               (GtkSourceFileSaver             *saver,
+                                                                GtkSourceMountOperationFactory  callback,
+                                                                gpointer                        user_data);
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]