Re: destroying widgets and Gtk2::GladeXML



On Sun, 2003-08-03 at 10:00, Ross McFarland wrote:
the following code:
##############################################

use Gtk2 '-init';
use Gtk2::GladeXML;

$gld = Gtk2::GladeXML->new('glade_test.pl.glade');

$gld->signal_autoconnect_from_package('main');

$btn = $gld->get_widget("button1");

sub on_button1_clicked
{
      my $dialog = new Gtk2::Dialog;
      $dialog->set_title("New Dialog");
      # create ok button, connect signals etc
      $dialog->run;

      $dialog->destroy;
}

Gtk2->main;
##############################################
seems to behave as would be expected. i created a trivial glade-2
project with 1 button and added a clicked callback. 

Yes, I would think so, since you aren't creating the widget with
libglade.

it also seems to work when i remove the signal handler from the glade-2
project and grab the button myself and connect the callback

$btn = $gld->get_widget("button1");
$btn->signal_connect( clicked => \&on_button1_clicked );

Same situation, just handling the callback yourself.

i click the button as many times as i wish and it seems to pop up the
dialog and it goes away at the destroy, the next time around it's all
new and works as expected

so the way you used to do it works, but as for the glade stuff my best
explanation is that it creates the widget when new is called. it then
destroys the widget when you call destroy. destroy does just that after
called it will no longer exist so the next time you try use it nothing
is there to use. it's somewhat of a problem with glade and the way
dialogs work. hide is probably the best workaround, but won't suffice in
all situations, mainly when you would want to have a completely new
dialog without the changes made last time. 

Yes, it seems libglade creates all widgets at startup. muppet emailed me
but forgot to CC it to the list:

(muppet said:)
a quick perusal of the C source for libglade shows that 
glade_xml_get_widget is implemented as a call to g_hash_table_lookup
-- 
there's no magic to re-create dead widgets.  all the widgets are 
created by glade_xml_new.  thus, when you call ->destroy on it, it's 
gone... so, eh, don't do that.  ;-)

So yeah, it seems that calling destroy is a bad thing, because you get
all your widgets at the beginning.

another possible workaround, but not ideal is to define the dialog in a
separate glade file and in the button clicked handler create a new glade
object that is a dialog. this has lots of issues though, but could be
done. it would only be worth it if you had a really fancy complicated
dialog that is way to hard to create by hand, well that you don't want
to anyway. 


Indeed, I would rather create a highly complex dialog myself.

sorry, probably left you with more questions than you started, but
hopefully it helped a little. i guess if nothing else, hide is about the
best way to deal with the less than perfect situation.


No, I'm satisified. I'm still trying to figure out the best thing to do
in a lot of situations and this helps.

personally i would suggest using glade for prototyping apps, and then
reimplementing them the long way if you're going to be using them in any
kind of real environment. i think you need the control of the long way
if you're going to be trying to get all of the bugs and issues out of a
real app, but that's just me. 


Indeed. I'm just using it for a small for-myself application so I don't
see it as being a big deal, however, were I writing a large app I would
probably do as you say. Glade is great for figuring out how you want
things to look, and has made me far more productive at GTK programming.

-rm

Thanks for the response.

-- 
James Curbo <hannibal adtrw org>
http://www.raspberryheaven.net/~hannibal/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]