mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-26 15:36:14 +01:00
61b0e1c8d4
In some cases, signal arguments have to be collected, even if there are i no signal handlers connected (e.g. for GVariant parameters, where collection consumes a floating variant). Based on a patch by Christian Persch. Bug #643624.
92 lines
1.9 KiB
C
92 lines
1.9 KiB
C
#include <glib-object.h>
|
|
|
|
typedef struct _Test Test;
|
|
typedef struct _TestClass TestClass;
|
|
|
|
struct _Test
|
|
{
|
|
GObject parent_instance;
|
|
};
|
|
|
|
struct _TestClass
|
|
{
|
|
GObjectClass parent_class;
|
|
|
|
void (* variant_changed) (Test *, GVariant *);
|
|
};
|
|
|
|
static GType test_get_type (void);
|
|
G_DEFINE_TYPE (Test, test, G_TYPE_OBJECT)
|
|
|
|
static void
|
|
test_init (Test *test)
|
|
{
|
|
}
|
|
|
|
static void
|
|
test_class_init (TestClass *klass)
|
|
{
|
|
g_signal_new ("variant-changed-no-slot",
|
|
G_TYPE_FROM_CLASS (klass),
|
|
G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
|
|
0,
|
|
NULL, NULL,
|
|
g_cclosure_marshal_VOID__VARIANT,
|
|
G_TYPE_NONE,
|
|
1,
|
|
G_TYPE_VARIANT);
|
|
g_signal_new ("variant-changed",
|
|
G_TYPE_FROM_CLASS (klass),
|
|
G_SIGNAL_RUN_LAST | G_SIGNAL_MUST_COLLECT,
|
|
G_STRUCT_OFFSET (TestClass, variant_changed),
|
|
NULL, NULL,
|
|
g_cclosure_marshal_VOID__VARIANT,
|
|
G_TYPE_NONE,
|
|
1,
|
|
G_TYPE_VARIANT);
|
|
}
|
|
|
|
static void
|
|
test_variant_signal (void)
|
|
{
|
|
Test *test;
|
|
GVariant *v;
|
|
|
|
/* Tests that the signal emission consumes the variant,
|
|
* even if there are no handlers connected.
|
|
*/
|
|
|
|
test = g_object_new (test_get_type (), NULL);
|
|
|
|
v = g_variant_new_boolean (TRUE);
|
|
g_variant_ref (v);
|
|
g_assert (g_variant_is_floating (v));
|
|
g_signal_emit_by_name (test, "variant-changed-no-slot", v);
|
|
g_assert (!g_variant_is_floating (v));
|
|
g_variant_unref (v);
|
|
|
|
v = g_variant_new_boolean (TRUE);
|
|
g_variant_ref (v);
|
|
g_assert (g_variant_is_floating (v));
|
|
g_signal_emit_by_name (test, "variant-changed", v);
|
|
g_assert (!g_variant_is_floating (v));
|
|
g_variant_unref (v);
|
|
|
|
g_object_unref (test);
|
|
}
|
|
|
|
/* --- */
|
|
|
|
int
|
|
main (int argc,
|
|
char *argv[])
|
|
{
|
|
g_type_init ();
|
|
|
|
g_test_init (&argc, &argv, NULL);
|
|
|
|
g_test_add_func ("/gobject/signals/variant", test_variant_signal);
|
|
|
|
return g_test_run ();
|
|
}
|