Re: [gtk-list] gtk-- delete/destroy confusion



Felix Morley Finch <felix@crowfix.com> writes:
> I set myself a project of using gtk-- to learn C++ and it's going
> pretty well, all things considered (I've done some Java prorgamming,
> and debugged some C++ programs, so it's not quite all that adventurous
>:-) I've got some problems left in my test program.
> 
> I have some classes derived from Gtk_Window which use malloc and new
> in the constructors, and maintain linked lists.  I need my own
> destructor to maintain these items.
> 
> 1.  Should the destroy function explicitly invoke delete on itself?
>     It doesn't seem to be called naturally by the destroy function.

If you allocate something, you're responsible to delete its resources too.
Thus, if you allocate something using new-operator, you need to use delete
to free it. 

> 2.  Should destroy call delete, or the other way round?

There's 2 rules here:
1) the object which allocated an object should free it too.
   (if you allocated something in main() with new, you should delete
   it after Gtk_Main::run() returns)
2) never do delete this; :) (from any C++ textbook).

Thus always a parent widget will allocate/delete the widget. If you want
objects own callback to destroy the object, make an Gtk_Main::idle_add() at
the callback and make that delete the object. This way can be sure the
object will not be referenced after it has been deleted.

> 3.  I translated this program from a C/gtk+ version, and can't find an
>     equivalent to the EventBox's "button_press_event".

all *_event signals are defined in Gtk_Widget. In widget.gen_h file
there's an entry:
  SIGNAL_SPEC(gint button_press_event(GdkEventButton*));
 
and thus you get a signal button_press_event and virtual function
button_press_event_impl in every widget, including eventbox.

> 4.  I tried to follow the example programs use of the delete_event,
>     but I get these error messages:
> 
> /usr/local/include/gtk--sigslot.h: In method `int Slot1<int,cds_editRow,_GdkEventAny *>::call(struct _GdkEventAny *)':
> /usr/local/include/gtk--sigslot.h:110: warning: control reaches end of non-void function `Slot1<int,cds_editRow,_GdkEventAny *>::call(_GdkEventAny *)'
> /usr/local/include/gtk--sigslot.h: In function `static int Slot1<int,cds_editRow,_GdkEventAny *>::callback(struct _GtkWidget *, struct _GdkEventAny *, class Slot1<int,cds_editRow,_GdkEventAny *> *)':
> /usr/local/include/gtk--sigslot.h:110: warning: control reaches end of non-void function `Slot1<int,cds_editRow,_GdkEventAny *>::callback(_GtkWidget *, _GdkEventAny *, Slot1<int,cds_editRow,_GdkEventAny *> *)'

This is because you need to use some configuration information which is not
available... You can find the necessary configuration from config.h file
in the gtk-- source. That file is generated by configure, so if you use
automake/autoconf, better take the rules from gtk--'s Makefile.am to
detect the configuration needed.
(yes, I should fix this one and make proper automake .m4 rules for it)

Best way to handle this is to put -D options to compiler commandline about
these flags needed, if you're not using autoconf/automake in your application.

I hope this helps..

-- 
-- Tero Pulkkinen -- terop@modeemi.cs.tut.fi --



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