better delete-window behavior
This commit is contained in:
parent
fee4f77b76
commit
6e3ffff977
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue