Glib
view release on metacpan or search on metacpan
G_PARAM_SPEC_VALUE_TYPE (pspec));
/* note: this croaks if there is a problem. this is
* usually the right thing to do, because if it
* doesn't know how to convert the value, then there's
* something seriously wrong; however, it means that
* if there is a problem, all non-trivial values we've
* converted will be leaked. */
gperl_value_from_sv (¶ms[i].value,
ST (FIRST_ARG+i*2+1));
params[i].name = key; /* will be valid until this
* xsub is finished */
}
}
#undef FIRST_ARG
object = g_object_newv (object_type, n_params, params);
G_GNUC_END_IGNORE_DEPRECATIONS
/* this wrapper *must* own this object!
* because we've been through initialization, the perl object
* will already exist at this point --- but this still causes
* gperl_object_take_ownership to be called. */
RETVAL = gperl_new_object (object, TRUE);
if (n_params) {
int i;
for (i = 0 ; i < n_params ; i++)
g_value_unset (¶ms[i].value);
g_free (params);
}
if (oclass)
g_type_class_unref (oclass);
OUTPUT:
RETVAL
=for apidoc Glib::Object::get
=for arg ... (list) list of property names
Alias for C<get_property> (see L</get and set> above).
=cut
=for apidoc Glib::Object::get_property
=for arg ... (__hide__)
Fetch and return the values for the object properties named in I<...>.
=cut
void
g_object_get (object, ...)
GObject * object
ALIAS:
Glib::Object::get = 0
Glib::Object::get_property = 1
PREINIT:
GValue value = {0,};
int i;
CODE:
/* Use CODE: instead of PPCODE: so we can handle the stack ourselves in
* order to avoid that xsubs called by g_object_get_property or
* _gperl_sv_from_value_internal overwrite what we put on the stack. */
PERL_UNUSED_VAR (ix);
for (i = 1; i < items; i++) {
char *name = SvPV_nolen (ST (i));
init_property_value (object, name, &value);
g_object_get_property (object, name, &value);
ST (i - 1) =
sv_2mortal (
_gperl_sv_from_value_internal (&value, TRUE));
g_value_unset (&value);
}
XSRETURN (items - 1);
=for apidoc Glib::Object::set
=for signature $object->set (key => $value, ...)
=for arg ... key/value pairs
Alias for C<set_property> (see L</get and set> above).
=cut
=for apidoc Glib::Object::set_property
=for signature $object->set_property (key => $value, ...)
=for arg ... (__hide__)
Set object properties.
=cut
void
g_object_set (object, ...)
GObject * object
ALIAS:
Glib::Object::set = 0
Glib::Object::set_property = 1
PREINIT:
GValue value = {0,};
int i;
CODE:
PERL_UNUSED_VAR (ix);
if (0 != ((items - 1) % 2))
croak ("set method expects name => value pairs "
"(odd number of arguments detected)");
for (i = 1; i < items; i += 2) {
char *name = SvPV_nolen (ST (i));
SV *newval = ST (i + 1);
init_property_value (object, name, &value);
gperl_value_from_sv (&value, newval);
g_object_set_property (object, name, &value);
g_value_unset (&value);
}
=for apidoc
Emits a "notify" signal for the property I<$property> on I<$object>.
=cut
void g_object_freeze_notify (GObject * object)
=for apidoc
Reverts the effect of a previous call to C<freeze_notify>. This causes all
queued "notify" signals on I<$object> to be emitted.
=cut
void g_object_thaw_notify (GObject * object)
=for apidoc Glib::Object::list_properties
=for signature list = $object_or_class_name->list_properties
=for arg ... (__hide__)
List all the object properties for I<$object_or_class_name>; returns them as
a list of hashes, containing these keys:
=over
=item name
The name of the property
=item type
The type of the property
=item owner_type
The type that owns the property
=item descr
The description of the property
=item flags
The Glib::ParamFlags of the property
=back
=cut
=for apidoc Glib::Object::find_property
=for signature pspec or undef = $object_or_class_name->find_property ($name)
=for arg name (string)
=for arg ... (__hide__)
Find the definition of object property I<$name> for I<$object_or_class_name>.
Return C<undef> if no such property. For
the returned data see L<Glib::Object::list_properties>.
=cut
void
g_object_find_property (object_or_class_name, ...)
SV * object_or_class_name
ALIAS:
Glib::Object::list_properties = 1
PREINIT:
GType type = G_TYPE_INVALID;
gchar *name = NULL;
PPCODE:
if (gperl_sv_is_ref (object_or_class_name)) {
GObject * object = SvGObject (object_or_class_name);
if (!object)
croak ("wha? NULL object in list_properties");
type = G_OBJECT_TYPE (object);
} else {
type = gperl_object_type_from_package
(SvPV_nolen (object_or_class_name));
if (!type)
croak ("package %s is not registered with GPerl",
SvPV_nolen (object_or_class_name));
}
if (ix == 0 && items == 2) {
name = SvGChar (ST (1));
#ifdef NOISY
warn ("Glib::Object::find_property ('%s', '%s')\n",
g_type_name (type),
name);
#endif
}
else if (ix == 0 && items != 2)
croak ("Usage: Glib::Object::find_property (class, name)");
else if (ix == 1 && items != 1)
croak ("Usage: Glib::Object::list_properties (class)");
if (G_TYPE_IS_OBJECT (type))
{
/* classes registered by perl are kept alive by the bindings.
* those coming straight from C are not. if we had an actual
* object, the class will be alive, but if we just had a
* package, the class may not exist yet. thus, we'll have to
* do an honest ref here, rather than a peek.
*/
GObjectClass *object_class = g_type_class_ref (type);
if (ix == 0) {
GParamSpec *pspec;
pspec = g_object_class_find_property (object_class, name);
if (pspec)
XPUSHs (sv_2mortal (newSVGParamSpec (pspec)));
else
XPUSHs (newSVsv (&PL_sv_undef));
}
else if (ix == 1) {
GParamSpec **props;
guint n_props, i;
props = g_object_class_list_properties (object_class, &n_props);
#ifdef NOISY
warn ("list_properties: %d properties\n", n_props);
#endif
if (n_props) {
EXTEND (SP, (int) n_props);
for (i = 0; i < n_props; i++)
PUSHs (sv_2mortal (newSVGParamSpec (props[i])));
}
( run in 0.640 second using v1.01-cache-2.11-cpan-5511b514fd6 )