From 30a71c39f54f54bdeaec1653648ac900bdc0597c Mon Sep 17 00:00:00 2001 From: Paul Cornett Date: Sun, 18 Dec 2016 12:10:25 -0800 Subject: [PATCH] Reset static widget pointers when widgets are destroyed See #17751 --- src/gtk/private.cpp | 28 ++++++++++++++++------------ src/gtk/settings.cpp | 12 ++++++++++++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/gtk/private.cpp b/src/gtk/private.cpp index c8544c8ee1..1971c52b60 100644 --- a/src/gtk/private.cpp +++ b/src/gtk/private.cpp @@ -57,6 +57,7 @@ GtkWidget *GetButtonWidget() if ( !s_button ) { s_button = gtk_button_new(); + g_object_add_weak_pointer(G_OBJECT(s_button), (void**)&s_button); gtk_container_add(GetContainer(), s_button); gtk_widget_realize(s_button); } @@ -71,6 +72,7 @@ GtkWidget *GetNotebookWidget() if ( !s_notebook ) { s_notebook = gtk_notebook_new(); + g_object_add_weak_pointer(G_OBJECT(s_notebook), (void**)&s_notebook); gtk_container_add(GetContainer(), s_notebook); gtk_widget_realize(s_notebook); } @@ -85,6 +87,7 @@ GtkWidget *GetCheckButtonWidget() if ( !s_button ) { s_button = gtk_check_button_new(); + g_object_add_weak_pointer(G_OBJECT(s_button), (void**)&s_button); gtk_container_add(GetContainer(), s_button); gtk_widget_realize(s_button); } @@ -95,14 +98,12 @@ GtkWidget *GetCheckButtonWidget() GtkWidget * GetComboBoxWidget() { static GtkWidget *s_button = NULL; - static GtkWidget *s_window = NULL; if ( !s_button ) { - s_window = gtk_window_new( GTK_WINDOW_POPUP ); - gtk_widget_realize( s_window ); s_button = gtk_combo_box_new(); - gtk_container_add( GTK_CONTAINER(s_window), s_button ); + g_object_add_weak_pointer(G_OBJECT(s_button), (void**)&s_button); + gtk_container_add(GetContainer(), s_button); gtk_widget_realize( s_button ); } @@ -117,6 +118,7 @@ GtkWidget *GetEntryWidget() if ( !s_entry ) { s_entry = gtk_entry_new(); + g_object_add_weak_pointer(G_OBJECT(s_entry), (void**)&s_entry); gtk_container_add(GetContainer(), s_entry); gtk_widget_realize(s_entry); } @@ -145,6 +147,7 @@ static void CreateHeaderButtons() s_first_button = column->button; #endif wxASSERT(s_first_button); + g_object_add_weak_pointer(G_OBJECT(s_first_button), (void**)&s_first_button); column = gtk_tree_view_column_new(); gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column); @@ -153,6 +156,7 @@ static void CreateHeaderButtons() #else s_other_button = column->button; #endif + g_object_add_weak_pointer(G_OBJECT(s_other_button), (void**)&s_other_button); column = gtk_tree_view_column_new(); gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column); @@ -161,6 +165,7 @@ static void CreateHeaderButtons() #else s_last_button = column->button; #endif + g_object_add_weak_pointer(G_OBJECT(s_last_button), (void**)&s_last_button); } GtkWidget *GetHeaderButtonWidgetFirst() @@ -190,14 +195,12 @@ GtkWidget *GetHeaderButtonWidget() GtkWidget * GetRadioButtonWidget() { static GtkWidget *s_button = NULL; - static GtkWidget *s_window = NULL; if ( !s_button ) { - s_window = gtk_window_new( GTK_WINDOW_POPUP ); - gtk_widget_realize( s_window ); s_button = gtk_radio_button_new(NULL); - gtk_container_add( GTK_CONTAINER(s_window), s_button ); + g_object_add_weak_pointer(G_OBJECT(s_button), (void**)&s_button); + gtk_container_add(GetContainer(), s_button); gtk_widget_realize( s_button ); } @@ -220,6 +223,7 @@ GtkWidget* GetSplitterWidget(wxOrientation orient) else widget = gtk_vpaned_new(); #endif + g_object_add_weak_pointer(G_OBJECT(widget), (void**)&widgets[gtkOrient]); gtk_container_add(GetContainer(), widget); gtk_widget_realize(widget); } @@ -230,14 +234,12 @@ GtkWidget* GetSplitterWidget(wxOrientation orient) GtkWidget * GetTextEntryWidget() { static GtkWidget *s_button = NULL; - static GtkWidget *s_window = NULL; if ( !s_button ) { - s_window = gtk_window_new( GTK_WINDOW_POPUP ); - gtk_widget_realize( s_window ); s_button = gtk_entry_new(); - gtk_container_add( GTK_CONTAINER(s_window), s_button ); + g_object_add_weak_pointer(G_OBJECT(s_button), (void**)&s_button); + gtk_container_add(GetContainer(), s_button); gtk_widget_realize( s_button ); } @@ -251,6 +253,7 @@ GtkWidget *GetTreeWidget() if ( !s_tree ) { s_tree = gtk_tree_view_new(); + g_object_add_weak_pointer(G_OBJECT(s_tree), (void**)&s_tree); gtk_container_add(GetContainer(), s_tree); gtk_widget_realize(s_tree); } @@ -273,6 +276,7 @@ public: { GtkWidget* parent = gtk_widget_get_parent(gs_container); gtk_widget_destroy(parent); + gs_container = NULL; } } diff --git a/src/gtk/settings.cpp b/src/gtk/settings.cpp index 4a1140ad54..8a2f547b36 100644 --- a/src/gtk/settings.cpp +++ b/src/gtk/settings.cpp @@ -41,6 +41,7 @@ static GtkContainer* ContainerWidget() if (s_widget == NULL) { s_widget = GTK_CONTAINER(gtk_fixed_new()); + g_object_add_weak_pointer(G_OBJECT(s_widget), (void**)&s_widget); gs_tlw_parent = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_container_add(GTK_CONTAINER(gs_tlw_parent), GTK_WIDGET(s_widget)); } @@ -60,6 +61,7 @@ static GtkWidget* ButtonWidget() if (s_widget == NULL) { s_widget = gtk_button_new(); + g_object_add_weak_pointer(G_OBJECT(s_widget), (void**)&s_widget); gtk_container_add(ContainerWidget(), s_widget); gtk_widget_ensure_style(s_widget); g_signal_connect(s_widget, "style_set", G_CALLBACK(style_set), NULL); @@ -74,6 +76,7 @@ static GtkWidget* ListWidget() { s_widget = gtk_tree_view_new_with_model( GTK_TREE_MODEL(gtk_list_store_new(1, G_TYPE_INT))); + g_object_add_weak_pointer(G_OBJECT(s_widget), (void**)&s_widget); gtk_container_add(ContainerWidget(), s_widget); gtk_widget_ensure_style(s_widget); } @@ -86,6 +89,7 @@ static GtkWidget* TextCtrlWidget() if (s_widget == NULL) { s_widget = gtk_text_view_new(); + g_object_add_weak_pointer(G_OBJECT(s_widget), (void**)&s_widget); gtk_container_add(ContainerWidget(), s_widget); gtk_widget_ensure_style(s_widget); } @@ -98,6 +102,7 @@ static GtkWidget* MenuItemWidget() if (s_widget == NULL) { s_widget = gtk_menu_item_new(); + g_object_add_weak_pointer(G_OBJECT(s_widget), (void**)&s_widget); gtk_container_add(ContainerWidget(), s_widget); gtk_widget_ensure_style(s_widget); } @@ -110,6 +115,7 @@ static GtkWidget* MenuBarWidget() if (s_widget == NULL) { s_widget = gtk_menu_bar_new(); + g_object_add_weak_pointer(G_OBJECT(s_widget), (void**)&s_widget); gtk_container_add(ContainerWidget(), s_widget); gtk_widget_ensure_style(s_widget); } @@ -122,6 +128,9 @@ static GtkWidget* ToolTipWidget() if (s_widget == NULL) { s_widget = gtk_window_new(GTK_WINDOW_POPUP); + g_object_add_weak_pointer(G_OBJECT(s_widget), (void**)&s_widget); + g_signal_connect_swapped(ContainerWidget(), "destroy", + G_CALLBACK(gtk_widget_destroy), s_widget); const char* name = "gtk-tooltip"; if (gtk_check_version(2, 11, 0)) name = "gtk-tooltips"; @@ -1031,6 +1040,9 @@ void wxSystemSettingsModule::OnExit() (void*)notify_gtk_font_name, NULL); #else if (gs_tlw_parent) + { gtk_widget_destroy(gs_tlw_parent); + gs_tlw_parent = NULL; + } #endif }