|
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 |
}
|