Blame gladeui/glade-signal.c

Packit 1e8aac
/*
Packit 1e8aac
 * Copyright (C) 2001 Ximian, Inc.
Packit 1e8aac
 *
Packit 1e8aac
 * This program is free software; you can redistribute it and/or modify
Packit 1e8aac
 * it under the terms of the GNU General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2 of the
Packit 1e8aac
 * License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This program is distributed in the hope that it will be useful,
Packit 1e8aac
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 1e8aac
 * GNU General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU General Public License
Packit 1e8aac
 * along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *   Chema Celorio <chema@celorio.com>
Packit 1e8aac
 *   Paolo Borelli <pborelli@katamail.com>
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include "config.h"
Packit 1e8aac
Packit 1e8aac
#include <string.h>
Packit 1e8aac
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
Packit 1e8aac
#include "glade.h"
Packit 1e8aac
#include "glade-signal.h"
Packit 1e8aac
#include "glade-xml-utils.h"
Packit 1e8aac
Packit 1e8aac
struct _GladeSignalPrivate
Packit 1e8aac
{
Packit 1e8aac
  const GladeSignalClass *class;   /* Pointer to the signal class */
Packit 1e8aac
  gchar    *detail;       /* Signal detail */
Packit 1e8aac
  gchar    *handler;      /* Handler function eg "gtk_main_quit" */
Packit 1e8aac
  gchar    *userdata;     /* User data signal handler argument   */
Packit 1e8aac
Packit 1e8aac
  gchar    *support_warning;/* Message to inform the user about signals introduced in future versions */
Packit 1e8aac
Packit 1e8aac
  guint8    after : 1;    /* Connect after TRUE or FALSE         */
Packit 1e8aac
  guint8    swapped : 1;  /* Connect swapped TRUE or FALSE (GtkBuilder only) */
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
enum {
Packit 1e8aac
  PROP_0,
Packit 1e8aac
  PROP_CLASS,
Packit 1e8aac
  PROP_DETAIL,
Packit 1e8aac
  PROP_HANDLER,
Packit 1e8aac
  PROP_USERDATA,
Packit 1e8aac
  PROP_SUPPORT_WARNING,
Packit 1e8aac
  PROP_AFTER,
Packit 1e8aac
  PROP_SWAPPED,
Packit 1e8aac
  N_PROPERTIES
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
/* We need these defines because GladeSignalClass is another object type!
Packit 1e8aac
 * So we use GladeSignalKlass as the class name for GladeSignal
Packit 1e8aac
 */
Packit 1e8aac
#define GladeSignalClass GladeSignalKlass
Packit 1e8aac
#define glade_signal_class_init glade_signal_klass_init
Packit 1e8aac
Packit 1e8aac
G_DEFINE_TYPE_WITH_PRIVATE (GladeSignal, glade_signal, G_TYPE_OBJECT)
Packit 1e8aac
Packit 1e8aac
#undef GladeSignalClass
Packit 1e8aac
#undef glade_signal_class_init
Packit 1e8aac
Packit 1e8aac
static GParamSpec *properties[N_PROPERTIES];
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_finalize (GObject *object)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignal *signal = GLADE_SIGNAL (object);
Packit 1e8aac
Packit 1e8aac
  g_free (signal->priv->detail);
Packit 1e8aac
  g_free (signal->priv->handler);
Packit 1e8aac
  g_free (signal->priv->userdata);
Packit 1e8aac
  g_free (signal->priv->support_warning);
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (glade_signal_parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_get_property (GObject *object,
Packit 1e8aac
			   guint prop_id,
Packit 1e8aac
			   GValue *value, GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignal *signal = GLADE_SIGNAL (object);
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_CLASS:
Packit 1e8aac
        g_value_set_pointer (value, (gpointer) signal->priv->class);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_DETAIL:
Packit 1e8aac
        g_value_set_string (value, signal->priv->detail);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_HANDLER:
Packit 1e8aac
        g_value_set_string (value, signal->priv->handler);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_USERDATA:
Packit 1e8aac
        g_value_set_string (value, signal->priv->userdata);
Packit 1e8aac
        break; 
Packit 1e8aac
      case PROP_SUPPORT_WARNING:
Packit 1e8aac
        g_value_set_string (value, signal->priv->support_warning);
Packit 1e8aac
        break; 
Packit 1e8aac
      case PROP_AFTER:
Packit 1e8aac
        g_value_set_boolean (value, signal->priv->after);
Packit 1e8aac
        break; 
Packit 1e8aac
      case PROP_SWAPPED:
Packit 1e8aac
        g_value_set_boolean (value, signal->priv->swapped);
Packit 1e8aac
        break; 
Packit 1e8aac
     default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_set_property (GObject *object,
Packit 1e8aac
			   guint prop_id,
Packit 1e8aac
			   const GValue *value, GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignal *signal = GLADE_SIGNAL (object);
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_CLASS:
Packit 1e8aac
	signal->priv->class = g_value_get_pointer (value);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_DETAIL:
Packit 1e8aac
	glade_signal_set_detail (signal, g_value_get_string (value));
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_HANDLER:
Packit 1e8aac
	glade_signal_set_handler (signal, g_value_get_string (value));
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_USERDATA:
Packit 1e8aac
	glade_signal_set_userdata (signal, g_value_get_string (value));
Packit 1e8aac
        break; 
Packit 1e8aac
      case PROP_SUPPORT_WARNING:
Packit 1e8aac
	glade_signal_set_support_warning (signal, g_value_get_string (value));
Packit 1e8aac
        break; 
Packit 1e8aac
      case PROP_AFTER:
Packit 1e8aac
	glade_signal_set_after (signal, g_value_get_boolean (value));
Packit 1e8aac
        break; 
Packit 1e8aac
      case PROP_SWAPPED:
Packit 1e8aac
	glade_signal_set_swapped (signal, g_value_get_boolean (value));
Packit 1e8aac
        break; 
Packit 1e8aac
      default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_init (GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  signal->priv = glade_signal_get_instance_private (signal);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_signal_klass_init (GladeSignalKlass *klass)
Packit 1e8aac
{
Packit 1e8aac
  GObjectClass *object_class;
Packit 1e8aac
Packit 1e8aac
  object_class = G_OBJECT_CLASS (klass);
Packit 1e8aac
  glade_signal_parent_class = g_type_class_peek_parent (klass);
Packit 1e8aac
Packit 1e8aac
  object_class->set_property = glade_signal_set_property;
Packit 1e8aac
  object_class->get_property = glade_signal_get_property;
Packit 1e8aac
  object_class->finalize     = glade_signal_finalize;
Packit 1e8aac
Packit 1e8aac
  /* Properties */
Packit 1e8aac
  properties[PROP_CLASS] =
Packit 1e8aac
    g_param_spec_pointer ("class",
Packit 1e8aac
                          _("SignalClass"),
Packit 1e8aac
                          _("The signal class of this signal"),
Packit 1e8aac
                          G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_DETAIL] =
Packit 1e8aac
    g_param_spec_string ("detail",
Packit 1e8aac
                         _("Detail"),
Packit 1e8aac
                         _("The detail for this signal"),
Packit 1e8aac
                         NULL, G_PARAM_READWRITE);
Packit 1e8aac
  
Packit 1e8aac
  properties[PROP_HANDLER] =
Packit 1e8aac
    g_param_spec_string ("handler",
Packit 1e8aac
                         _("Handler"),
Packit 1e8aac
                         _("The handler for this signal"),
Packit 1e8aac
                         NULL, G_PARAM_READWRITE);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_USERDATA] =
Packit 1e8aac
    g_param_spec_string ("userdata",
Packit 1e8aac
                         _("User Data"),
Packit 1e8aac
                         _("The user data for this signal"),
Packit 1e8aac
                         NULL, G_PARAM_READWRITE);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_SUPPORT_WARNING] =
Packit 1e8aac
    g_param_spec_string ("support-warning",
Packit 1e8aac
                         _("Support Warning"),
Packit 1e8aac
                         _("The versioning support warning for this signal"),
Packit 1e8aac
                         NULL, G_PARAM_READWRITE);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_AFTER] =
Packit 1e8aac
    g_param_spec_boolean ("after",
Packit 1e8aac
                          _("After"),
Packit 1e8aac
                          _("Whether this signal is run after default handlers"),
Packit 1e8aac
                          FALSE, G_PARAM_READWRITE);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_SWAPPED] =
Packit 1e8aac
    g_param_spec_boolean ("swapped",
Packit 1e8aac
                          _("Swapped"),
Packit 1e8aac
                          _("Whether the user data is swapped with the instance for the handler"),
Packit 1e8aac
                          FALSE, G_PARAM_READWRITE);
Packit 1e8aac
  
Packit 1e8aac
  /* Install all properties */
Packit 1e8aac
  g_object_class_install_properties (object_class, N_PROPERTIES, properties);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_signal_new:
Packit 1e8aac
 * @name: a name for the signal
Packit 1e8aac
 * @handler: a handler function for the signal
Packit 1e8aac
 * @userdata: the userdata for this signal
Packit 1e8aac
 * @after: whether this handler should be called after the default emission phase
Packit 1e8aac
 * @swapped: whether the handler's user data should be swapped with the emitter instance.
Packit 1e8aac
 *
Packit 1e8aac
 * Creates a new #GladeSignal with the given parameters.
Packit 1e8aac
 *
Packit 1e8aac
 * Returns: the new #GladeSignal
Packit 1e8aac
 */
Packit 1e8aac
GladeSignal *
Packit 1e8aac
glade_signal_new (const GladeSignalClass *sig_class,
Packit 1e8aac
                  const gchar            *handler,
Packit 1e8aac
                  const gchar            *userdata, 
Packit 1e8aac
		  gboolean                after, 
Packit 1e8aac
		  gboolean                swapped)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (sig_class != NULL, NULL);
Packit 1e8aac
Packit 1e8aac
  return GLADE_SIGNAL (g_object_new (GLADE_TYPE_SIGNAL,
Packit 1e8aac
                                     "class", sig_class,
Packit 1e8aac
                                     "handler", handler,
Packit 1e8aac
                                     "userdata", userdata,
Packit 1e8aac
                                     "after", after,
Packit 1e8aac
                                     "swapped", swapped,
Packit 1e8aac
                                     NULL));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_signal_equal:
Packit 1e8aac
 * @sig1: a #GladeSignal
Packit 1e8aac
 * @sig2: a #GladeSignal
Packit 1e8aac
 *
Packit 1e8aac
 * Returns: %TRUE if @sig1 and @sig2 have identical attributes, %FALSE otherwise
Packit 1e8aac
 */
Packit 1e8aac
gboolean
Packit 1e8aac
glade_signal_equal (const GladeSignal *sig1, const GladeSignal *sig2)
Packit 1e8aac
{
Packit 1e8aac
  gboolean ret = FALSE;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (sig1), FALSE);
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (sig2), FALSE);
Packit 1e8aac
Packit 1e8aac
  /* Intentionally ignore support_warning */
Packit 1e8aac
  if (!g_strcmp0 (glade_signal_get_name (sig1), glade_signal_get_name (sig2)) &&
Packit 1e8aac
      !g_strcmp0 (sig1->priv->handler, sig2->priv->handler) &&
Packit 1e8aac
      !g_strcmp0 (sig1->priv->detail, sig2->priv->detail) &&
Packit 1e8aac
      sig1->priv->after == sig2->priv->after && sig1->priv->swapped == sig2->priv->swapped)
Packit 1e8aac
    {
Packit 1e8aac
      if ((sig1->priv->userdata == NULL && sig2->priv->userdata == NULL) ||
Packit 1e8aac
          (sig1->priv->userdata != NULL && sig2->priv->userdata != NULL &&
Packit 1e8aac
           !g_strcmp0 (sig1->priv->userdata, sig2->priv->userdata)))
Packit 1e8aac
        ret = TRUE;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return ret;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_signal_clone:
Packit 1e8aac
 * @signal: a #GladeSignal
Packit 1e8aac
 *
Packit 1e8aac
 * Returns: a new #GladeSignal with the same attributes as @signal
Packit 1e8aac
 */
Packit 1e8aac
GladeSignal *
Packit 1e8aac
glade_signal_clone (const GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignal *dup;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (signal), NULL);
Packit 1e8aac
Packit 1e8aac
  dup = glade_signal_new (signal->priv->class,
Packit 1e8aac
                          signal->priv->handler,
Packit 1e8aac
                          signal->priv->userdata, 
Packit 1e8aac
			  signal->priv->after, 
Packit 1e8aac
			  signal->priv->swapped);
Packit 1e8aac
Packit 1e8aac
  glade_signal_set_detail (dup, signal->priv->detail);
Packit 1e8aac
  glade_signal_set_support_warning (dup, signal->priv->support_warning);
Packit 1e8aac
Packit 1e8aac
  return dup;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_signal_write:
Packit 1e8aac
 * @signal: The #GladeSignal
Packit 1e8aac
 * @context: A #GladeXmlContext
Packit 1e8aac
 * @node: A #GladeXmlNode
Packit 1e8aac
 *
Packit 1e8aac
 * Writes @signal to @node
Packit 1e8aac
 */
Packit 1e8aac
void
Packit 1e8aac
glade_signal_write (GladeSignal     *signal,
Packit 1e8aac
                    GladeXmlContext *context,
Packit 1e8aac
                    GladeXmlNode    *node)
Packit 1e8aac
{
Packit 1e8aac
  GladeXmlNode *signal_node;
Packit 1e8aac
  gchar *name;
Packit 1e8aac
Packit 1e8aac
  /*  Should assert GLADE_XML_TAG_WIDGET tag here, but no 
Packit 1e8aac
   * access to project, so not really seriosly needed 
Packit 1e8aac
   */
Packit 1e8aac
Packit 1e8aac
  if (signal->priv->detail)
Packit 1e8aac
    name = g_strdup_printf ("%s::%s",
Packit 1e8aac
                            glade_signal_get_name (signal),
Packit 1e8aac
                            signal->priv->detail);
Packit 1e8aac
  else
Packit 1e8aac
    name = g_strdup (glade_signal_get_name (signal));
Packit 1e8aac
Packit 1e8aac
  /* Now dump the node values... */
Packit 1e8aac
  signal_node = glade_xml_node_new (context, GLADE_XML_TAG_SIGNAL);
Packit 1e8aac
  glade_xml_node_append_child (node, signal_node);
Packit 1e8aac
Packit 1e8aac
  glade_xml_node_set_property_string (signal_node, GLADE_XML_TAG_NAME, name);
Packit 1e8aac
  glade_xml_node_set_property_string (signal_node, GLADE_XML_TAG_HANDLER,
Packit 1e8aac
                                      signal->priv->handler);
Packit 1e8aac
Packit 1e8aac
  if (signal->priv->userdata)
Packit 1e8aac
    glade_xml_node_set_property_string (signal_node,
Packit 1e8aac
                                        GLADE_XML_TAG_OBJECT, signal->priv->userdata);
Packit 1e8aac
Packit 1e8aac
  if (signal->priv->after)
Packit 1e8aac
    glade_xml_node_set_property_string (signal_node,
Packit 1e8aac
                                        GLADE_XML_TAG_AFTER,
Packit 1e8aac
                                        GLADE_XML_TAG_SIGNAL_TRUE);
Packit 1e8aac
Packit 1e8aac
  /* Always serialize swapped regardless of format (libglade should not complain about this
Packit 1e8aac
   * and we prefer to not lose data in conversions).
Packit 1e8aac
   */
Packit 1e8aac
  glade_xml_node_set_property_string (signal_node,
Packit 1e8aac
                                      GLADE_XML_TAG_SWAPPED,
Packit 1e8aac
                                      signal->priv->swapped ?
Packit 1e8aac
                                      GLADE_XML_TAG_SIGNAL_TRUE :
Packit 1e8aac
                                      GLADE_XML_TAG_SIGNAL_FALSE);
Packit 1e8aac
Packit 1e8aac
  g_free (name);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_signal_read:
Packit 1e8aac
 * @node: The #GladeXmlNode to read
Packit 1e8aac
 * @adaptor: The #GladeWidgetAdaptor for thw widget
Packit 1e8aac
 *
Packit 1e8aac
 * Reads and creates a ner #GladeSignal based on @node
Packit 1e8aac
 *
Packit 1e8aac
 * Returns: A newly created #GladeSignal
Packit 1e8aac
 */
Packit 1e8aac
GladeSignal *
Packit 1e8aac
glade_signal_read (GladeXmlNode *node, GladeWidgetAdaptor *adaptor)
Packit 1e8aac
{
Packit 1e8aac
  GladeSignal *signal = NULL;
Packit 1e8aac
  GladeSignalClass *signal_class;
Packit 1e8aac
  gchar *name, *handler, *userdata, *detail;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (glade_xml_node_verify_silent
Packit 1e8aac
                        (node, GLADE_XML_TAG_SIGNAL), NULL);
Packit 1e8aac
Packit 1e8aac
  if (!(name =
Packit 1e8aac
        glade_xml_get_property_string_required (node, GLADE_XML_TAG_NAME,
Packit 1e8aac
                                                NULL)))
Packit 1e8aac
    return NULL;
Packit 1e8aac
  glade_util_replace (name, '_', '-');
Packit 1e8aac
Packit 1e8aac
  /* Search for a detail, and strip it from the signal name */
Packit 1e8aac
  if ((detail = g_strstr_len (name, -1, "::"))) *detail = '\0';
Packit 1e8aac
  
Packit 1e8aac
  if (!(handler =
Packit 1e8aac
        glade_xml_get_property_string_required (node, GLADE_XML_TAG_HANDLER,
Packit 1e8aac
                                                NULL)))
Packit 1e8aac
    {
Packit 1e8aac
      g_free (name);
Packit 1e8aac
      return NULL;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  userdata     = glade_xml_get_property_string (node, GLADE_XML_TAG_OBJECT);
Packit 1e8aac
  signal_class = glade_widget_adaptor_get_signal_class (adaptor, name);
Packit 1e8aac
Packit 1e8aac
  if (signal_class)
Packit 1e8aac
    {
Packit 1e8aac
      signal = glade_signal_new (signal_class,
Packit 1e8aac
                                 handler, userdata,
Packit 1e8aac
                                 glade_xml_get_property_boolean (node, GLADE_XML_TAG_AFTER, FALSE),
Packit 1e8aac
                                 glade_xml_get_property_boolean (node, GLADE_XML_TAG_SWAPPED,
Packit 1e8aac
                                                                 userdata != NULL));
Packit 1e8aac
Packit 1e8aac
      if (detail && detail[2]) glade_signal_set_detail (signal, &detail[2]);
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      /* XXX These errors should be collected and reported to the user */
Packit 1e8aac
      g_warning ("No signal %s was found for class %s, skipping\n", 
Packit 1e8aac
		 name, glade_widget_adaptor_get_name (adaptor));
Packit 1e8aac
    }
Packit 1e8aac
	
Packit 1e8aac
  g_free (name);
Packit 1e8aac
  g_free (handler);
Packit 1e8aac
  g_free (userdata);
Packit 1e8aac
Packit 1e8aac
  return signal;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
G_CONST_RETURN gchar *
Packit 1e8aac
glade_signal_get_name (const GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (signal), NULL);
Packit 1e8aac
Packit 1e8aac
  return glade_signal_class_get_name (signal->priv->class);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
G_CONST_RETURN GladeSignalClass *
Packit 1e8aac
glade_signal_get_class (const GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
	return signal->priv->class;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_signal_set_detail (GladeSignal *signal, const gchar *detail)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_SIGNAL (signal));
Packit 1e8aac
  
Packit 1e8aac
  if (glade_signal_class_get_flags (signal->priv->class) & G_SIGNAL_DETAILED &&
Packit 1e8aac
      g_strcmp0 (signal->priv->detail, detail))
Packit 1e8aac
    {
Packit 1e8aac
      g_free (signal->priv->detail);
Packit 1e8aac
      signal->priv->detail = (detail && g_utf8_strlen (detail, -1)) ? g_strdup (detail) : NULL;
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (signal), properties[PROP_DETAIL]);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
G_CONST_RETURN gchar *
Packit 1e8aac
glade_signal_get_detail (const GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (signal), NULL);
Packit 1e8aac
Packit 1e8aac
  return signal->priv->detail;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_signal_set_handler (GladeSignal *signal, const gchar *handler)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_SIGNAL (signal));
Packit 1e8aac
Packit 1e8aac
  if (g_strcmp0 (signal->priv->handler, handler))
Packit 1e8aac
    {
Packit 1e8aac
      g_free (signal->priv->handler);
Packit 1e8aac
      signal->priv->handler =
Packit 1e8aac
          handler ? g_strdup (handler) : NULL;
Packit 1e8aac
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (signal), properties[PROP_HANDLER]);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
G_CONST_RETURN gchar *
Packit 1e8aac
glade_signal_get_handler (const GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (signal), NULL);
Packit 1e8aac
Packit 1e8aac
  return signal->priv->handler;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_signal_set_userdata (GladeSignal *signal, const gchar *userdata)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_SIGNAL (signal));
Packit 1e8aac
Packit 1e8aac
  if (g_strcmp0 (signal->priv->userdata, userdata))
Packit 1e8aac
    {
Packit 1e8aac
      g_free (signal->priv->userdata);
Packit 1e8aac
      signal->priv->userdata =
Packit 1e8aac
          userdata ? g_strdup (userdata) : NULL;
Packit 1e8aac
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (signal), properties[PROP_USERDATA]);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
G_CONST_RETURN gchar *
Packit 1e8aac
glade_signal_get_userdata (const GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (signal), NULL);
Packit 1e8aac
Packit 1e8aac
  return signal->priv->userdata;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_signal_set_after (GladeSignal *signal, gboolean after)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_SIGNAL (signal));
Packit 1e8aac
Packit 1e8aac
  if (signal->priv->after != after)
Packit 1e8aac
    {
Packit 1e8aac
      signal->priv->after = after;
Packit 1e8aac
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (signal), properties[PROP_AFTER]);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gboolean
Packit 1e8aac
glade_signal_get_after (const GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (signal), FALSE);
Packit 1e8aac
Packit 1e8aac
  return signal->priv->after;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_signal_set_swapped (GladeSignal *signal, gboolean swapped)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_SIGNAL (signal));
Packit 1e8aac
Packit 1e8aac
  if (signal->priv->swapped != swapped)
Packit 1e8aac
    {
Packit 1e8aac
      signal->priv->swapped = swapped;
Packit 1e8aac
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (signal), properties[PROP_SWAPPED]);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gboolean
Packit 1e8aac
glade_signal_get_swapped (const GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (signal), FALSE);
Packit 1e8aac
Packit 1e8aac
  return signal->priv->swapped;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_signal_set_support_warning (GladeSignal *signal,
Packit 1e8aac
                                  const gchar *support_warning)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_SIGNAL (signal));
Packit 1e8aac
Packit 1e8aac
  if (g_strcmp0 (signal->priv->support_warning, support_warning))
Packit 1e8aac
    {
Packit 1e8aac
      g_free (signal->priv->support_warning);
Packit 1e8aac
      signal->priv->support_warning =
Packit 1e8aac
          support_warning ? g_strdup (support_warning) : NULL;
Packit 1e8aac
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (signal), properties[PROP_SUPPORT_WARNING]);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
G_CONST_RETURN gchar *
Packit 1e8aac
glade_signal_get_support_warning (const GladeSignal *signal)
Packit 1e8aac
{
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_SIGNAL (signal), NULL);
Packit 1e8aac
Packit 1e8aac
  return signal->priv->support_warning;
Packit 1e8aac
}