Beast said: > muppet wrote: >> >> This is very dangerous. A plain, unmagical, blessed perl hash cannot be >> used as a Gtk2::Widget, because there is no actual C GObject backing it. >> >> Either use Glib::Object::Subclass to subclass Gtk2::Dialog (or any >> widget), or rebless the actual widget like this: >> >> my $self = $class->SUPER::new(...); >> bless $self, $class; > > But I think I mistakenly your point (I though its dangerous to bless > hash, so I change it to scalar variable).
Hash versus scalar is not the point; you can't bless non-scalars, because you can't bless non-references. > I should use : > > my $self = {}; > $self->{win} = $class->SUPER::new($title, $parent, "modal"); > bless($self, $class); > > Instead of: > > my $self = {}; > bless($self, $class); > $self->{win} = $class->SUPER::new($title, $parent, "modal"); > > Is that correct? No. You should use $self = $class->SUPER::new (...); bless $self, $class; That way, $self, which will be initially created as a Gtk2::Dialog by SUPER::new(), will be reblessed as a $class. Since you've propertly set up @ISA = 'Gtk2::Dialog', this means that $thing = Properties->new (); isa_ok ($thing, 'Properties'); isa_ok ($thing, 'Gtk2::Dialog'); # and now you can use any Gtk2::Dialog method on $thing. $thing->run; Conversely, if you use the ->{win} technique: $thing = bless {}, $class; $thing->{win} = some widget instance; $thing->run; # BOOM! this won't work, because $thing isn't # actually a Gtk2::Dialog $thing->{win}->run; # this is what you have to do. because although you've blessed $thing as a Properties and set up the inheritance, when the bindings try to extract the underlying widget reference from the blessed scalar, they won't be able to find it. All you really need is a working understanding, but here's the technical reason: the bindings create a hash reference to represent each GObject; the hash reference is blessed into the corresponding package, and the actual C widget pointer is attached to a MAGIC vtable (see the perlguts manpage). That means that the widget pointer is attached to the reference in a way that you can't see (or break) at the perl level. Have a look at the article about Subclassing Widgets in Perl: http://gtk2-perl.sourceforge.net/doc/subclassing_widgets_in_perl.html -- muppet <scott at asofyet dot org> _______________________________________________ gtk-perl-list mailing list gtk-perl-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-perl-list