void gimp_plug_in_manager_call_init (GimpPlugInManager *manager, GimpContext *context, GimpPlugInDef *plug_in_def) { GimpPlugIn *plug_in; g_return_if_fail (GIMP_IS_PLUG_IN_MANAGER (manager)); g_return_if_fail (GIMP_IS_PDB_CONTEXT (context)); g_return_if_fail (GIMP_IS_PLUG_IN_DEF (plug_in_def)); plug_in = gimp_plug_in_new (manager, context, NULL, NULL, plug_in_def->file); if (plug_in) { plug_in->plug_in_def = plug_in_def; if (gimp_plug_in_open (plug_in, GIMP_PLUG_IN_CALL_INIT, TRUE)) { while (plug_in->open) { GimpWireMessage msg; if (! gimp_wire_read_msg (plug_in->my_read, &msg, plug_in)) { gimp_plug_in_close (plug_in, TRUE); } else { gimp_plug_in_handle_message (plug_in, &msg); gimp_wire_destroy (&msg); } } } g_object_unref (plug_in); } }
static gboolean gimp_plug_in_recv_message (GIOChannel *channel, GIOCondition cond, gpointer data) { GimpPlugIn *plug_in = data; gboolean got_message = FALSE; #ifdef G_OS_WIN32 /* Workaround for GLib bug #137968: sometimes we are called for no * reason... */ if (cond == 0) return TRUE; #endif if (plug_in->my_read == NULL) return TRUE; g_object_ref (plug_in); if (cond & (G_IO_IN | G_IO_PRI)) { GimpWireMessage msg; memset (&msg, 0, sizeof (GimpWireMessage)); if (! gimp_wire_read_msg (plug_in->my_read, &msg, plug_in)) { gimp_plug_in_close (plug_in, TRUE); } else { gimp_plug_in_handle_message (plug_in, &msg); gimp_wire_destroy (&msg); got_message = TRUE; } } if (cond & (G_IO_ERR | G_IO_HUP)) { if (cond & G_IO_HUP) plug_in->hup = TRUE; if (plug_in->open) gimp_plug_in_close (plug_in, TRUE); } if (! got_message) { GimpPlugInProcFrame *frame = gimp_plug_in_get_proc_frame (plug_in); GimpProgress *progress = frame ? frame->progress : NULL; gimp_message (plug_in->manager->gimp, G_OBJECT (progress), GIMP_MESSAGE_ERROR, _("Plug-in crashed: \"%s\"\n(%s)\n\n" "The dying plug-in may have messed up GIMP's internal " "state. You may want to save your images and restart " "GIMP to be on the safe side."), gimp_object_get_name (plug_in), gimp_filename_to_utf8 (plug_in->prog)); } g_object_unref (plug_in); return TRUE; }