diff --git a/pandatool/src/gtk-stats/gtkStatsGraph.cxx b/pandatool/src/gtk-stats/gtkStatsGraph.cxx index c9e9f50ba1..8fb64a4ce8 100755 --- a/pandatool/src/gtk-stats/gtkStatsGraph.cxx +++ b/pandatool/src/gtk-stats/gtkStatsGraph.cxx @@ -63,8 +63,11 @@ GtkStatsGraph(GtkStatsMonitor *monitor) : _window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_transient_for(GTK_WINDOW(_window), GTK_WINDOW(parent_window)); - gtk_window_set_destroy_with_parent(GTK_WINDOW(_window), TRUE); + // These calls were intended to kind of emulate the Windows MDI + // behavior, but it's just weird. + // gtk_window_set_transient_for(GTK_WINDOW(_window), GTK_WINDOW(parent_window)); + // gtk_window_set_destroy_with_parent(GTK_WINDOW(_window), TRUE); + gtk_widget_add_events(_window, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK); @@ -142,7 +145,13 @@ GtkStatsGraph:: g_object_unref(gc); } - gtk_widget_destroy(_window); + _label_stack.clear_labels(); + + if (_window != (GtkWidget *)NULL) { + GtkWidget *window = _window; + _window = NULL; + gtk_widget_destroy(window); + } } //////////////////////////////////////////////////////////////////// @@ -248,10 +257,15 @@ clicked_label(int collector_index) { //////////////////////////////////////////////////////////////////// void GtkStatsGraph:: close() { - GtkStatsMonitor *monitor = _monitor; - _monitor = (GtkStatsMonitor *)NULL; - if (monitor != (GtkStatsMonitor *)NULL) { - monitor->remove_graph(this); + _label_stack.clear_labels(false); + if (_window != (GtkWidget *)NULL) { + _window = NULL; + + GtkStatsMonitor *monitor = _monitor; + _monitor = (GtkStatsMonitor *)NULL; + if (monitor != (GtkStatsMonitor *)NULL) { + monitor->remove_graph(this); + } } } diff --git a/pandatool/src/gtk-stats/gtkStatsLabelStack.cxx b/pandatool/src/gtk-stats/gtkStatsLabelStack.cxx index b6c9dbc017..33c1b607aa 100755 --- a/pandatool/src/gtk-stats/gtkStatsLabelStack.cxx +++ b/pandatool/src/gtk-stats/gtkStatsLabelStack.cxx @@ -100,12 +100,14 @@ get_label_collector_index(int label_index) const { // Description: Removes the set of labels and starts a new set. //////////////////////////////////////////////////////////////////// void GtkStatsLabelStack:: -clear_labels() { +clear_labels(bool delete_widgets) { Labels::iterator li; for (li = _labels.begin(); li != _labels.end(); ++li) { GtkStatsLabel *label = (*li); - gtk_container_remove(GTK_CONTAINER(_widget), label->get_widget()); - delete (*li); + if (delete_widgets) { + gtk_container_remove(GTK_CONTAINER(_widget), label->get_widget()); + } + delete label; } _labels.clear(); } diff --git a/pandatool/src/gtk-stats/gtkStatsLabelStack.h b/pandatool/src/gtk-stats/gtkStatsLabelStack.h index e6a8ecb77d..aef5841926 100755 --- a/pandatool/src/gtk-stats/gtkStatsLabelStack.h +++ b/pandatool/src/gtk-stats/gtkStatsLabelStack.h @@ -44,7 +44,7 @@ public: int get_label_height(int label_index) const; int get_label_collector_index(int label_index) const; - void clear_labels(); + void clear_labels(bool delete_widgets = true); int add_label(GtkStatsMonitor *monitor, GtkStatsGraph *graph, int thread_index, int collector_index, bool use_fullname); int get_num_labels() const; diff --git a/pandatool/src/gtk-stats/gtkStatsMonitor.cxx b/pandatool/src/gtk-stats/gtkStatsMonitor.cxx index cb753ddacd..ee00829db9 100644 --- a/pandatool/src/gtk-stats/gtkStatsMonitor.cxx +++ b/pandatool/src/gtk-stats/gtkStatsMonitor.cxx @@ -69,27 +69,7 @@ GtkStatsMonitor(GtkStatsServer *server) : PStatMonitor(server) { //////////////////////////////////////////////////////////////////// GtkStatsMonitor:: ~GtkStatsMonitor() { - Graphs::iterator gi; - for (gi = _graphs.begin(); gi != _graphs.end(); ++gi) { - delete (*gi); - } - _graphs.clear(); - - ChartMenus::iterator mi; - for (mi = _chart_menus.begin(); mi != _chart_menus.end(); ++mi) { - delete (*mi); - } - _chart_menus.clear(); - - if (_window != NULL) { - gtk_widget_destroy(_window); - _window = NULL; - } - -#ifdef DEVELOP_GTKSTATS - // For GtkStats developers, exit when the first monitor closes. - gtk_main_quit(); -#endif + shutdown(); } //////////////////////////////////////////////////////////////////// @@ -247,10 +227,7 @@ void GtkStatsMonitor:: lost_connection() { nout << "Lost connection to " << get_client_hostname() << "\n"; - if (_window != NULL) { - gtk_widget_destroy(_window); - _window = NULL; - } + shutdown(); } //////////////////////////////////////////////////////////////////// @@ -505,6 +482,36 @@ create_window() { set_pause(false); } +//////////////////////////////////////////////////////////////////// +// Function: GtkStatsMonitor::shutdown +// Access: Private +// Description: Closes all the graphs associated with this monitor. +//////////////////////////////////////////////////////////////////// +void GtkStatsMonitor:: +shutdown() { + Graphs::iterator gi; + for (gi = _graphs.begin(); gi != _graphs.end(); ++gi) { + delete (*gi); + } + _graphs.clear(); + + ChartMenus::iterator mi; + for (mi = _chart_menus.begin(); mi != _chart_menus.end(); ++mi) { + delete (*mi); + } + _chart_menus.clear(); + + if (_window != NULL) { + gtk_widget_destroy(_window); + _window = NULL; + } + +#ifdef DEVELOP_GTKSTATS + // For GtkStats developers, exit when the first monitor closes. + gtk_main_quit(); +#endif +} + //////////////////////////////////////////////////////////////////// // Function: GtkStatsMonitor::window_delete_event // Access: Private, Static diff --git a/pandatool/src/gtk-stats/gtkStatsMonitor.h b/pandatool/src/gtk-stats/gtkStatsMonitor.h index fcbbd01277..5721eb88ce 100644 --- a/pandatool/src/gtk-stats/gtkStatsMonitor.h +++ b/pandatool/src/gtk-stats/gtkStatsMonitor.h @@ -84,6 +84,7 @@ private: void remove_graph(GtkStatsGraph *graph); void create_window(); + void shutdown(); static gboolean window_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data); static void window_destroy(GtkWidget *widget, gpointer data);