Gtk
view release on metacpan or search on metacpan
h = newHV();
s = newSViv((int)object);
hv_store(h, "_gtk", 4, s, 0);
result = newRV((SV*)h);
RegisterGtkObject(h, object);
/*printf("Setting hv %d up for destruction on object %d\n", h, object);*/
gtk_signal_connect(object, "destroy", (GtkSignalFunc)DisconnectGtkObject, (gpointer)h);
/*gtk_object_weakref(object, (GtkDestroyNotify)DisconnectGtkObject, (gpointer)h);*/
sv_bless(result, gv_stashpv(classname, FALSE));
SvREFCNT_dec(h);
/*gtk_object_ref(object);*/
/*printf("Creating new PO %p referencing GO %p\n", h, object);*/
}
return result;
}
GtkObject * SvGtkObjectRef(SV * o, char * name)
{
HV * q;
SV ** r;
if (!o || !SvOK(o) || !(q=(HV*)SvRV(o)) || (SvTYPE(q) != SVt_PVHV))
return 0;
if (name && !sv_derived_from(o, name))
croak("variable is not of type %s", name);
r = hv_fetch(q, "_gtk", 4, 0);
if (!r || !SvIV(*r))
croak("variable is damaged %s", name);
return (GtkObject*)SvIV(*r);
}
void disconnect_GtkObjectRef(SV * o)
{
#if 0
HV * q;
SV ** r;
GtkObject * object;
printf("DESTROY PO %p\n", o);
/*printf("Trying to delete GtkObject %d\n", o);*/
if (!o || !SvOK(o) || !(q=(HV*)SvRV(o)) || (SvTYPE(q) != SVt_PVHV))
return;
r = hv_fetch(q, "_gtk", 4, 0);
if (!r || !SvIV(*r))
return;
object = (GtkObject*)SvIV(*r);
printf("(And thus GO %p)\n", object);
#endif
#if 0
HV * q;
SV ** r;
/*printf("Trying to delete GtkObject %d\n", o);*/
if (!o || !SvOK(o) || !(q=(HV*)SvRV(o)) || (SvTYPE(q) != SVt_PVHV))
return;
r = hv_fetch(q, "_gtk", 4, 0);
if (!r || !SvIV(*r))
return;
UnregisterGtkObject(q, (GtkObject*)SvIV(*r));
hv_delete(q, "_gtk", 4, G_DISCARD);
#endif
}
GtkMenuEntry * SvGtkMenuEntry(SV * data, GtkMenuEntry * e)
{
HV * h;
SV ** s;
if ((!data) || (!SvOK(data)) || (!SvRV(data)) || (SvTYPE(SvRV(data)) != SVt_PVHV))
return 0;
if (!e)
e = alloc_temp(sizeof(GtkMenuEntry));
h = (HV*)SvRV(data);
if (s=hv_fetch(h, "path", 4, 0))
e->path = SvPV(*s,na);
else
croak("menu entry must contain path");
if (s=hv_fetch(h, "accelerator", 11, 0))
e->accelerator = SvPV(*s, na);
else
croak("menu entry must contain accelerator");
if (s=hv_fetch(h, "widget", 6, 0))
e->widget = GTK_WIDGET(SvGtkObjectRef(*s, "Gtk::Widget"));
else
croak("menu entry must contain widget");
if (s=hv_fetch(h, "callback", 8, 0))
e->callback_data = newSVsv(*s);
else
croak("menu entry must contain callback");
return e;
}
SV * newSVGtkMenuEntry(GtkMenuEntry * e)
{
HV * h;
SV * r;
if (!e)
return &sv_undef;
h = newHV();
r = newRV((SV*)h);
SvREFCNT_dec(h);
hv_store(h, "path", 4, newSVpv(e->path,0), 0);
hv_store(h, "accelerator", 11, newSVpv(e->accelerator,0), 0);
hv_store(h, "widget", 6, newSVGtkObjectRef(GTK_OBJECT(e->widget), 0), 0);
hv_store(h, "callback", 11, newSVsv(e->callback_data ? e->callback_data : &sv_undef), 0);
return r;
}
SV * newSVGtkSelectionDataRef(GdkWindow * w) { return newSVMiscRef(w, "Gtk::SelectionData",0); }
GdkWindow * SvGtkSelectionDataRef(SV * data) { return SvMiscRef(data, "Gtk::SelectionData"); }
/*SV * newSVGtkMenuPath(GtkMenuPath * e)
{
HV * h;
SV * r;
if (!e)
return &sv_undef;
h = newHV();
r = newRV((SV*)h);
SvREFCNT_dec(h);
hv_store(h, "path", 4, newSVpv(e->path), 0);
hv_store(h, "widget", 6, newSVGtkObjectRef(e->widget, 0), 0);
return r;
}
*/
( run in 0.810 second using v1.01-cache-2.11-cpan-39bf76dae61 )