David Rose 19 лет назад
Родитель
Сommit
6e3ffff977

+ 21 - 7
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);
+    }
   }
 }
 

+ 5 - 3
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();
 }

+ 1 - 1
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;

+ 32 - 25
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

+ 1 - 0
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);