[gimp] libgimp: add read- and write-channel construct properties to GimpPlugIn



commit 9a027140c895c3c2ad191f8b4d3000a6997a8ca7
Author: Michael Natterer <mitch gimp org>
Date:   Tue Aug 6 21:28:15 2019 +0200

    libgimp: add read- and write-channel construct properties to GimpPlugIn
    
    and change all GimpPlugIn-based code to get the channels from the
    plug-in singleton instead of from the global variables.

 libgimp/gimp.c                  |  23 ++++++---
 libgimp/gimppdb.c               |   3 +-
 libgimp/gimpplugin-private.c    |  34 ++++++++++---
 libgimp/gimpplugin-private.h    |  41 ++++++++-------
 libgimp/gimpplugin.c            | 109 ++++++++++++++++++++++++++++++++++++++--
 libgimp/gimpprocedure-private.c |  26 ++++++++--
 libgimp/gimptilebackendplugin.c |  61 +++++++++++++++++-----
 7 files changed, 242 insertions(+), 55 deletions(-)
---
diff --git a/libgimp/gimp.c b/libgimp/gimp.c
index 9314672de4..4f0dd90e5a 100644
--- a/libgimp/gimp.c
+++ b/libgimp/gimp.c
@@ -603,7 +603,10 @@ gimp_main_internal (GType                 plug_in_type,
 
   if (plug_in_type != G_TYPE_NONE)
     {
-      PLUG_IN = g_object_new (plug_in_type, NULL);
+      PLUG_IN = g_object_new (plug_in_type,
+                              "read-channel",  _gimp_readchannel,
+                              "write-channel", _gimp_writechannel,
+                              NULL);
 
       g_assert (GIMP_IS_PLUG_IN (PLUG_IN));
     }
@@ -752,13 +755,21 @@ gimp_run_procedure_with_array (const gchar    *name,
   proc_run.nparams = gimp_value_array_length (arguments);
   proc_run.params  = _gimp_value_array_to_gp_params (arguments, FALSE);
 
-  if (! gp_proc_run_write (_gimp_writechannel, &proc_run, NULL))
-    gimp_quit ();
-
   if (PLUG_IN)
-    _gimp_plug_in_read_expect_msg (PLUG_IN, &msg, GP_PROC_RETURN);
+    {
+      if (! gp_proc_run_write (_gimp_plug_in_get_write_channel (PLUG_IN),
+                               &proc_run, PLUG_IN))
+        gimp_quit ();
+
+      _gimp_plug_in_read_expect_msg (PLUG_IN, &msg, GP_PROC_RETURN);
+    }
   else
-    _gimp_read_expect_msg (&msg, GP_PROC_RETURN);
+    {
+      if (! gp_proc_run_write (_gimp_writechannel, &proc_run, NULL))
+        gimp_quit ();
+
+      _gimp_read_expect_msg (&msg, GP_PROC_RETURN);
+    }
 
   proc_return = msg.data;
 
diff --git a/libgimp/gimppdb.c b/libgimp/gimppdb.c
index d2ea0d5c19..af7a3ac909 100644
--- a/libgimp/gimppdb.c
+++ b/libgimp/gimppdb.c
@@ -263,7 +263,8 @@ gimp_pdb_run_procedure_array (GimpPDB        *pdb,
   proc_run.nparams = gimp_value_array_length (arguments);
   proc_run.params  = _gimp_value_array_to_gp_params (arguments, FALSE);
 
-  if (! gp_proc_run_write (_gimp_writechannel, &proc_run, NULL))
+  if (! gp_proc_run_write (_gimp_plug_in_get_write_channel (pdb->priv->plug_in),
+                           &proc_run, pdb->priv->plug_in))
     gimp_quit ();
 
   _gimp_plug_in_read_expect_msg (pdb->priv->plug_in, &msg, GP_PROC_RETURN);
diff --git a/libgimp/gimpplugin-private.c b/libgimp/gimpplugin-private.c
index 86ab46a096..769dd1f5bf 100644
--- a/libgimp/gimpplugin-private.c
+++ b/libgimp/gimpplugin-private.c
@@ -60,7 +60,7 @@ _gimp_plug_in_query (GimpPlugIn *plug_in)
   g_return_if_fail (GIMP_IS_PLUG_IN (plug_in));
 
   if (GIMP_PLUG_IN_GET_CLASS (plug_in)->init_procedures)
-    gp_has_init_write (_gimp_writechannel, NULL);
+    gp_has_init_write (plug_in->priv->write_channel, plug_in);
 
   if (GIMP_PLUG_IN_GET_CLASS (plug_in)->query_procedures)
     {
@@ -90,7 +90,7 @@ _gimp_plug_in_run (GimpPlugIn *plug_in)
 {
   g_return_if_fail (GIMP_IS_PLUG_IN (plug_in));
 
-  g_io_add_watch (_gimp_readchannel,
+  g_io_add_watch (plug_in->priv->read_channel,
                   G_IO_ERR | G_IO_HUP,
                   gimp_plug_in_io_error_handler,
                   NULL);
@@ -108,7 +108,23 @@ _gimp_plug_in_quit (GimpPlugIn *plug_in)
 
   _gimp_shm_close ();
 
-  gp_quit_write (_gimp_writechannel, NULL);
+  gp_quit_write (plug_in->priv->write_channel, plug_in);
+}
+
+GIOChannel *
+_gimp_plug_in_get_read_channel (GimpPlugIn *plug_in)
+{
+  g_return_val_if_fail (GIMP_IS_PLUG_IN (plug_in), NULL);
+
+  return plug_in->priv->read_channel;
+}
+
+GIOChannel *
+_gimp_plug_in_get_write_channel (GimpPlugIn *plug_in)
+{
+  g_return_val_if_fail (GIMP_IS_PLUG_IN (plug_in), NULL);
+
+  return plug_in->priv->write_channel;
 }
 
 void
@@ -120,7 +136,7 @@ _gimp_plug_in_read_expect_msg (GimpPlugIn      *plug_in,
 
   while (TRUE)
     {
-      if (! gimp_wire_read_msg (_gimp_readchannel, msg, NULL))
+      if (! gimp_wire_read_msg (plug_in->priv->read_channel, msg, NULL))
         gimp_quit ();
 
       if (msg->type == type)
@@ -215,7 +231,7 @@ gimp_plug_in_loop (GimpPlugIn *plug_in)
     {
       GimpWireMessage msg;
 
-      if (! gimp_wire_read_msg (_gimp_readchannel, &msg, NULL))
+      if (! gimp_wire_read_msg (plug_in->priv->read_channel, &msg, NULL))
         return;
 
       switch (msg.type)
@@ -270,7 +286,7 @@ _gimp_plug_in_single_message (GimpPlugIn *plug_in)
   GimpWireMessage msg;
 
   /* Run a temp function */
-  if (! gimp_wire_read_msg (_gimp_readchannel, &msg, NULL))
+  if (! gimp_wire_read_msg (plug_in->priv->read_channel, &msg, NULL))
     gimp_quit ();
 
   gimp_plug_in_process_message (plug_in, &msg);
@@ -332,7 +348,8 @@ gimp_plug_in_proc_run (GimpPlugIn *plug_in,
       g_object_unref (procedure);
     }
 
-  if (! gp_proc_return_write (_gimp_writechannel, &proc_return, NULL))
+  if (! gp_proc_return_write (plug_in->priv->write_channel,
+                              &proc_return, plug_in))
     gimp_quit ();
 }
 
@@ -351,7 +368,8 @@ gimp_plug_in_temp_proc_run (GimpPlugIn *plug_in,
                                       &proc_return);
     }
 
-  if (! gp_temp_proc_return_write (_gimp_writechannel, &proc_return, NULL))
+  if (! gp_temp_proc_return_write (plug_in->priv->write_channel,
+                                   &proc_return, plug_in))
     gimp_quit ();
 }
 
diff --git a/libgimp/gimpplugin-private.h b/libgimp/gimpplugin-private.h
index b1d86a90a4..a0239e09de 100644
--- a/libgimp/gimpplugin-private.h
+++ b/libgimp/gimpplugin-private.h
@@ -35,32 +35,37 @@ struct _GimpPlugInMenuBranch
 
 struct _GimpPlugInPrivate
 {
-  gchar *translation_domain_name;
-  GFile *translation_domain_path;
+  GIOChannel *read_channel;
+  GIOChannel *write_channel;
+  guint       extension_source_id;
 
-  gchar *help_domain_name;
-  GFile *help_domain_uri;
+  gchar      *translation_domain_name;
+  GFile      *translation_domain_path;
 
-  GList *menu_branches;
+  gchar      *help_domain_name;
+  GFile      *help_domain_uri;
 
-  GList *temp_procedures;
+  GList      *menu_branches;
 
-  guint  extension_source_id;
+  GList      *temp_procedures;
 };
 
 
-void       _gimp_plug_in_query           (GimpPlugIn      *plug_in);
-void       _gimp_plug_in_init            (GimpPlugIn      *plug_in);
-void       _gimp_plug_in_run             (GimpPlugIn      *plug_in);
-void       _gimp_plug_in_quit            (GimpPlugIn      *plug_in);
+void         _gimp_plug_in_query             (GimpPlugIn      *plug_in);
+void         _gimp_plug_in_init              (GimpPlugIn      *plug_in);
+void         _gimp_plug_in_run               (GimpPlugIn      *plug_in);
+void         _gimp_plug_in_quit              (GimpPlugIn      *plug_in);
 
-void       _gimp_plug_in_read_expect_msg (GimpPlugIn      *plug_in,
-                                          GimpWireMessage *msg,
-                                          gint             type);
-gboolean   _gimp_plug_in_extension_read  (GIOChannel      *channel,
-                                          GIOCondition     condition,
-                                          gpointer         data);
-void       _gimp_plug_in_single_message  (GimpPlugIn      *plug_in);
+GIOChannel * _gimp_plug_in_get_read_channel  (GimpPlugIn      *plug_in);
+GIOChannel * _gimp_plug_in_get_write_channel (GimpPlugIn      *plug_in);
+
+void         _gimp_plug_in_read_expect_msg   (GimpPlugIn      *plug_in,
+                                              GimpWireMessage *msg,
+                                              gint             type);
+gboolean     _gimp_plug_in_extension_read    (GIOChannel      *channel,
+                                              GIOCondition     condition,
+                                              gpointer         data);
+void         _gimp_plug_in_single_message    (GimpPlugIn      *plug_in);
 
 
 G_END_DECLS
diff --git a/libgimp/gimpplugin.c b/libgimp/gimpplugin.c
index 329c4128af..cd5533d866 100644
--- a/libgimp/gimpplugin.c
+++ b/libgimp/gimpplugin.c
@@ -46,20 +46,59 @@
  **/
 
 
-static void   gimp_plug_in_finalize (GObject *object);
+enum
+{
+  PROP_0,
+  PROP_READ_CHANNEL,
+  PROP_WRITE_CHANNEL,
+  N_PROPS
+};
+
+
+static void   gimp_plug_in_constructed   (GObject      *object);
+static void   gimp_plug_in_finalize      (GObject      *object);
+static void   gimp_plug_in_set_property  (GObject      *object,
+                                          guint         property_id,
+                                          const GValue *value,
+                                          GParamSpec   *pspec);
+static void   gimp_plug_in_get_property  (GObject      *object,
+                                          guint         property_id,
+                                          GValue       *value,
+                                          GParamSpec   *pspec);
 
 
 G_DEFINE_TYPE_WITH_PRIVATE (GimpPlugIn, gimp_plug_in, G_TYPE_OBJECT)
 
 #define parent_class gimp_plug_in_parent_class
 
+static GParamSpec *props[N_PROPS] = { NULL, };
+
 
 static void
 gimp_plug_in_class_init (GimpPlugInClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-  object_class->finalize = gimp_plug_in_finalize;
+  object_class->constructed  = gimp_plug_in_constructed;
+  object_class->finalize     = gimp_plug_in_finalize;
+  object_class->set_property = gimp_plug_in_set_property;
+  object_class->get_property = gimp_plug_in_get_property;
+
+  props[PROP_READ_CHANNEL] =
+    g_param_spec_pointer ("read-channel",
+                          "Read channel",
+                          "The GIOChanel to read from GIMP",
+                          GIMP_PARAM_READWRITE |
+                          G_PARAM_CONSTRUCT_ONLY);
+
+  props[PROP_WRITE_CHANNEL] =
+    g_param_spec_pointer ("write-channel",
+                          "Write channel",
+                          "The GIOChanel to write to GIMP",
+                          GIMP_PARAM_READWRITE |
+                          G_PARAM_CONSTRUCT_ONLY);
+
+  g_object_class_install_properties (object_class, N_PROPS, props);
 }
 
 static void
@@ -68,6 +107,17 @@ gimp_plug_in_init (GimpPlugIn *plug_in)
   plug_in->priv = gimp_plug_in_get_instance_private (plug_in);
 }
 
+static void
+gimp_plug_in_constructed (GObject *object)
+{
+  GimpPlugIn *plug_in = GIMP_PLUG_IN (object);
+
+  G_OBJECT_CLASS (parent_class)->constructed (object);
+
+  g_assert (plug_in->priv->read_channel != NULL);
+  g_assert (plug_in->priv->write_channel != NULL);
+}
+
 static void
 gimp_plug_in_finalize (GObject *object)
 {
@@ -106,6 +156,53 @@ gimp_plug_in_finalize (GObject *object)
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
+static void
+gimp_plug_in_set_property (GObject      *object,
+                           guint         property_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
+{
+  GimpPlugIn *plug_in = GIMP_PLUG_IN (object);
+
+  switch (property_id)
+    {
+    case PROP_READ_CHANNEL:
+      plug_in->priv->read_channel = g_value_get_pointer (value);
+      break;
+
+    case PROP_WRITE_CHANNEL:
+      plug_in->priv->write_channel = g_value_get_pointer (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+gimp_plug_in_get_property (GObject    *object,
+                           guint       property_id,
+                           GValue     *value,
+                           GParamSpec *pspec)
+{
+  GimpPlugIn *plug_in = GIMP_PLUG_IN (object);
+
+  switch (property_id)
+    {
+    case PROP_READ_CHANNEL:
+      g_value_set_pointer (value, plug_in->priv->read_channel);
+      break;
+
+    case PROP_WRITE_CHANNEL:
+      g_value_set_pointer (value, plug_in->priv->write_channel);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
 
 /*  public functions  */
 
@@ -402,7 +499,7 @@ gimp_plug_in_extension_enable (GimpPlugIn *plug_in)
   if (! plug_in->priv->extension_source_id)
     {
       plug_in->priv->extension_source_id =
-        g_io_add_watch (_gimp_readchannel, G_IO_IN | G_IO_PRI,
+        g_io_add_watch (plug_in->priv->read_channel, G_IO_IN | G_IO_PRI,
                         _gimp_plug_in_extension_read,
                         plug_in);
     }
@@ -452,7 +549,8 @@ gimp_plug_in_extension_process (GimpPlugIn *plug_in,
         tvp = NULL;
 
       FD_ZERO (&readfds);
-      FD_SET (g_io_channel_unix_get_fd (_gimp_readchannel), &readfds);
+      FD_SET (g_io_channel_unix_get_fd (plug_in->priv->read_channel),
+              &readfds);
 
       if ((select_val = select (FD_SETSIZE, &readfds, NULL, NULL, tvp)) > 0)
         {
@@ -479,7 +577,8 @@ gimp_plug_in_extension_process (GimpPlugIn *plug_in,
   if (timeout == 0)
     timeout = -1;
 
-  g_io_channel_win32_make_pollfd (_gimp_readchannel, G_IO_IN, &pollfd);
+  g_io_channel_win32_make_pollfd (plug_in->priv->read_channel, G_IO_IN,
+                                  &pollfd);
 
   if (g_io_channel_win32_poll (&pollfd, 1, timeout) == 1)
     {
diff --git a/libgimp/gimpprocedure-private.c b/libgimp/gimpprocedure-private.c
index 72a1e4bda6..97ef5a064a 100644
--- a/libgimp/gimpprocedure-private.c
+++ b/libgimp/gimpprocedure-private.c
@@ -28,6 +28,7 @@
 
 #include "gimp-private.h"
 #include "gimpgpparams.h"
+#include "gimpplugin-private.h"
 #include "gimpprocedure-private.h"
 
 
@@ -41,6 +42,7 @@ _gimp_procedure_register (GimpProcedure *procedure)
   gint           n_args;
   gint           n_return_vals;
   GList         *list;
+  GimpPlugIn    *plug_in;
   GPProcInstall  proc_install;
   GimpIconType   icon_type;
   const guint8  *icon_data;
@@ -78,7 +80,10 @@ _gimp_procedure_register (GimpProcedure *procedure)
                                         &proc_install.return_vals[i]);
     }
 
-  if (! gp_proc_install_write (_gimp_writechannel, &proc_install, NULL))
+  plug_in = gimp_procedure_get_plug_in (procedure);
+
+  if (! gp_proc_install_write (_gimp_plug_in_get_write_channel (plug_in),
+                               &proc_install, plug_in))
     gimp_quit ();
 
   icon_type = gimp_procedure_get_icon (procedure,
@@ -102,17 +107,30 @@ _gimp_procedure_register (GimpProcedure *procedure)
 void
 _gimp_procedure_unregister (GimpProcedure *procedure)
 {
-  GPProcUninstall proc_uninstall;
+  GimpPlugIn      *plug_in;
+  GPProcUninstall  proc_uninstall;
+
+  g_return_if_fail (GIMP_IS_PROCEDURE (procedure));
 
   proc_uninstall.name = (gchar *) gimp_procedure_get_name (procedure);
 
-  if (! gp_proc_uninstall_write (_gimp_writechannel, &proc_uninstall, NULL))
+  plug_in = gimp_procedure_get_plug_in (procedure);
+
+  if (! gp_proc_uninstall_write (_gimp_plug_in_get_write_channel (plug_in),
+                                 &proc_uninstall, plug_in))
     gimp_quit ();
 }
 
 void
 _gimp_procedure_extension_ready (GimpProcedure *procedure)
 {
-  if (! gp_extension_ack_write (_gimp_writechannel, NULL))
+  GimpPlugIn *plug_in;
+
+  g_return_if_fail (GIMP_IS_PROCEDURE (procedure));
+
+  plug_in = gimp_procedure_get_plug_in (procedure);
+
+  if (! gp_extension_ack_write (_gimp_plug_in_get_write_channel (plug_in),
+                                plug_in))
     gimp_quit ();
 }
diff --git a/libgimp/gimptilebackendplugin.c b/libgimp/gimptilebackendplugin.c
index 7c0f22c737..c0ec56a1f8 100644
--- a/libgimp/gimptilebackendplugin.c
+++ b/libgimp/gimptilebackendplugin.c
@@ -334,13 +334,22 @@ gimp_tile_get (GimpTileBackendPlugin *backend_plugin,
   tile_req.tile_num    = tile->tile_num;
   tile_req.shadow      = priv->shadow;
 
-  if (! gp_tile_req_write (_gimp_writechannel, &tile_req, NULL))
-    gimp_quit ();
 
   if (plug_in)
-    _gimp_plug_in_read_expect_msg (plug_in, &msg, GP_TILE_DATA);
+    {
+      if (! gp_tile_req_write (_gimp_plug_in_get_write_channel (plug_in),
+                               &tile_req, plug_in))
+        gimp_quit ();
+
+      _gimp_plug_in_read_expect_msg (plug_in, &msg, GP_TILE_DATA);
+    }
   else
-    _gimp_read_expect_msg (&msg, GP_TILE_DATA);
+    {
+      if (! gp_tile_req_write (_gimp_writechannel, &tile_req, NULL))
+        gimp_quit ();
+
+      _gimp_read_expect_msg (&msg, GP_TILE_DATA);
+    }
 
   tile_data = msg.data;
   if (tile_data->drawable_ID != priv->drawable_id ||
@@ -381,8 +390,17 @@ gimp_tile_get (GimpTileBackendPlugin *backend_plugin,
       tile_data->data = NULL;
     }
 
-  if (! gp_tile_ack_write (_gimp_writechannel, NULL))
-    gimp_quit ();
+  if (plug_in)
+    {
+      if (! gp_tile_ack_write (_gimp_plug_in_get_write_channel (plug_in),
+                               plug_in))
+        gimp_quit ();
+    }
+  else
+    {
+      if (! gp_tile_ack_write (_gimp_writechannel, NULL))
+        gimp_quit ();
+    }
 
   gimp_wire_destroy (&msg);
 }
@@ -402,13 +420,21 @@ gimp_tile_put (GimpTileBackendPlugin *backend_plugin,
   tile_req.tile_num    = 0;
   tile_req.shadow      = 0;
 
-  if (! gp_tile_req_write (_gimp_writechannel, &tile_req, NULL))
-    gimp_quit ();
-
   if (plug_in)
-    _gimp_plug_in_read_expect_msg (plug_in, &msg, GP_TILE_DATA);
+    {
+      if (! gp_tile_req_write (_gimp_plug_in_get_write_channel (plug_in),
+                               &tile_req, plug_in))
+        gimp_quit ();
+
+      _gimp_plug_in_read_expect_msg (plug_in, &msg, GP_TILE_DATA);
+    }
   else
-    _gimp_read_expect_msg (&msg, GP_TILE_DATA);
+    {
+      if (! gp_tile_req_write (_gimp_writechannel, &tile_req, NULL))
+        gimp_quit ();
+
+      _gimp_read_expect_msg (&msg, GP_TILE_DATA);
+    }
 
   tile_info = msg.data;
 
@@ -432,8 +458,17 @@ gimp_tile_put (GimpTileBackendPlugin *backend_plugin,
       tile_data.data = tile->data;
     }
 
-  if (! gp_tile_data_write (_gimp_writechannel, &tile_data, NULL))
-    gimp_quit ();
+  if (plug_in)
+    {
+      if (! gp_tile_data_write (_gimp_plug_in_get_write_channel (plug_in),
+                                &tile_data, plug_in))
+        gimp_quit ();
+    }
+  else
+    {
+      if (! gp_tile_data_write (_gimp_writechannel, &tile_data, NULL))
+        gimp_quit ();
+    }
 
   if (! tile_info->use_shm)
     tile_data.data = NULL;


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