better delete-window behavior

This commit is contained in:
David Rose 2007-02-14 13:23:01 +00:00
parent fee4f77b76
commit 6e3ffff977
5 changed files with 60 additions and 36 deletions

View File

@ -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);
}
}
}

View File

@ -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();
}

View File

@ -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;

View File

@ -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

View File

@ -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);