[gimp] libgimp: add read- and write-channel construct properties to GimpPlugIn
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] libgimp: add read- and write-channel construct properties to GimpPlugIn
- Date: Tue, 6 Aug 2019 19:30:20 +0000 (UTC)
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]