Reset static widget pointers when widgets are destroyed

See #17751
This commit is contained in:
Paul Cornett
2016-12-18 12:10:25 -08:00
parent e0bcae1257
commit 30a71c39f5
2 changed files with 28 additions and 12 deletions

View File

@@ -57,6 +57,7 @@ GtkWidget *GetButtonWidget()
if ( !s_button ) if ( !s_button )
{ {
s_button = gtk_button_new(); s_button = gtk_button_new();
g_object_add_weak_pointer(G_OBJECT(s_button), (void**)&s_button);
gtk_container_add(GetContainer(), s_button); gtk_container_add(GetContainer(), s_button);
gtk_widget_realize(s_button); gtk_widget_realize(s_button);
} }
@@ -71,6 +72,7 @@ GtkWidget *GetNotebookWidget()
if ( !s_notebook ) if ( !s_notebook )
{ {
s_notebook = gtk_notebook_new(); s_notebook = gtk_notebook_new();
g_object_add_weak_pointer(G_OBJECT(s_notebook), (void**)&s_notebook);
gtk_container_add(GetContainer(), s_notebook); gtk_container_add(GetContainer(), s_notebook);
gtk_widget_realize(s_notebook); gtk_widget_realize(s_notebook);
} }
@@ -85,6 +87,7 @@ GtkWidget *GetCheckButtonWidget()
if ( !s_button ) if ( !s_button )
{ {
s_button = gtk_check_button_new(); 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_container_add(GetContainer(), s_button);
gtk_widget_realize(s_button); gtk_widget_realize(s_button);
} }
@@ -95,14 +98,12 @@ GtkWidget *GetCheckButtonWidget()
GtkWidget * GetComboBoxWidget() GtkWidget * GetComboBoxWidget()
{ {
static GtkWidget *s_button = NULL; static GtkWidget *s_button = NULL;
static GtkWidget *s_window = NULL;
if ( !s_button ) if ( !s_button )
{ {
s_window = gtk_window_new( GTK_WINDOW_POPUP );
gtk_widget_realize( s_window );
s_button = gtk_combo_box_new(); 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 ); gtk_widget_realize( s_button );
} }
@@ -117,6 +118,7 @@ GtkWidget *GetEntryWidget()
if ( !s_entry ) if ( !s_entry )
{ {
s_entry = gtk_entry_new(); s_entry = gtk_entry_new();
g_object_add_weak_pointer(G_OBJECT(s_entry), (void**)&s_entry);
gtk_container_add(GetContainer(), s_entry); gtk_container_add(GetContainer(), s_entry);
gtk_widget_realize(s_entry); gtk_widget_realize(s_entry);
} }
@@ -145,6 +147,7 @@ static void CreateHeaderButtons()
s_first_button = column->button; s_first_button = column->button;
#endif #endif
wxASSERT(s_first_button); wxASSERT(s_first_button);
g_object_add_weak_pointer(G_OBJECT(s_first_button), (void**)&s_first_button);
column = gtk_tree_view_column_new(); column = gtk_tree_view_column_new();
gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column); gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
@@ -153,6 +156,7 @@ static void CreateHeaderButtons()
#else #else
s_other_button = column->button; s_other_button = column->button;
#endif #endif
g_object_add_weak_pointer(G_OBJECT(s_other_button), (void**)&s_other_button);
column = gtk_tree_view_column_new(); column = gtk_tree_view_column_new();
gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column); gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
@@ -161,6 +165,7 @@ static void CreateHeaderButtons()
#else #else
s_last_button = column->button; s_last_button = column->button;
#endif #endif
g_object_add_weak_pointer(G_OBJECT(s_last_button), (void**)&s_last_button);
} }
GtkWidget *GetHeaderButtonWidgetFirst() GtkWidget *GetHeaderButtonWidgetFirst()
@@ -190,14 +195,12 @@ GtkWidget *GetHeaderButtonWidget()
GtkWidget * GetRadioButtonWidget() GtkWidget * GetRadioButtonWidget()
{ {
static GtkWidget *s_button = NULL; static GtkWidget *s_button = NULL;
static GtkWidget *s_window = NULL;
if ( !s_button ) if ( !s_button )
{ {
s_window = gtk_window_new( GTK_WINDOW_POPUP );
gtk_widget_realize( s_window );
s_button = gtk_radio_button_new(NULL); 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 ); gtk_widget_realize( s_button );
} }
@@ -220,6 +223,7 @@ GtkWidget* GetSplitterWidget(wxOrientation orient)
else else
widget = gtk_vpaned_new(); widget = gtk_vpaned_new();
#endif #endif
g_object_add_weak_pointer(G_OBJECT(widget), (void**)&widgets[gtkOrient]);
gtk_container_add(GetContainer(), widget); gtk_container_add(GetContainer(), widget);
gtk_widget_realize(widget); gtk_widget_realize(widget);
} }
@@ -230,14 +234,12 @@ GtkWidget* GetSplitterWidget(wxOrientation orient)
GtkWidget * GetTextEntryWidget() GtkWidget * GetTextEntryWidget()
{ {
static GtkWidget *s_button = NULL; static GtkWidget *s_button = NULL;
static GtkWidget *s_window = NULL;
if ( !s_button ) if ( !s_button )
{ {
s_window = gtk_window_new( GTK_WINDOW_POPUP );
gtk_widget_realize( s_window );
s_button = gtk_entry_new(); 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 ); gtk_widget_realize( s_button );
} }
@@ -251,6 +253,7 @@ GtkWidget *GetTreeWidget()
if ( !s_tree ) if ( !s_tree )
{ {
s_tree = gtk_tree_view_new(); 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_container_add(GetContainer(), s_tree);
gtk_widget_realize(s_tree); gtk_widget_realize(s_tree);
} }
@@ -273,6 +276,7 @@ public:
{ {
GtkWidget* parent = gtk_widget_get_parent(gs_container); GtkWidget* parent = gtk_widget_get_parent(gs_container);
gtk_widget_destroy(parent); gtk_widget_destroy(parent);
gs_container = NULL;
} }
} }

View File

@@ -41,6 +41,7 @@ static GtkContainer* ContainerWidget()
if (s_widget == NULL) if (s_widget == NULL)
{ {
s_widget = GTK_CONTAINER(gtk_fixed_new()); 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); gs_tlw_parent = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_add(GTK_CONTAINER(gs_tlw_parent), GTK_WIDGET(s_widget)); gtk_container_add(GTK_CONTAINER(gs_tlw_parent), GTK_WIDGET(s_widget));
} }
@@ -60,6 +61,7 @@ static GtkWidget* ButtonWidget()
if (s_widget == NULL) if (s_widget == NULL)
{ {
s_widget = gtk_button_new(); s_widget = gtk_button_new();
g_object_add_weak_pointer(G_OBJECT(s_widget), (void**)&s_widget);
gtk_container_add(ContainerWidget(), s_widget); gtk_container_add(ContainerWidget(), s_widget);
gtk_widget_ensure_style(s_widget); gtk_widget_ensure_style(s_widget);
g_signal_connect(s_widget, "style_set", G_CALLBACK(style_set), NULL); 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( s_widget = gtk_tree_view_new_with_model(
GTK_TREE_MODEL(gtk_list_store_new(1, G_TYPE_INT))); 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_container_add(ContainerWidget(), s_widget);
gtk_widget_ensure_style(s_widget); gtk_widget_ensure_style(s_widget);
} }
@@ -86,6 +89,7 @@ static GtkWidget* TextCtrlWidget()
if (s_widget == NULL) if (s_widget == NULL)
{ {
s_widget = gtk_text_view_new(); 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_container_add(ContainerWidget(), s_widget);
gtk_widget_ensure_style(s_widget); gtk_widget_ensure_style(s_widget);
} }
@@ -98,6 +102,7 @@ static GtkWidget* MenuItemWidget()
if (s_widget == NULL) if (s_widget == NULL)
{ {
s_widget = gtk_menu_item_new(); 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_container_add(ContainerWidget(), s_widget);
gtk_widget_ensure_style(s_widget); gtk_widget_ensure_style(s_widget);
} }
@@ -110,6 +115,7 @@ static GtkWidget* MenuBarWidget()
if (s_widget == NULL) if (s_widget == NULL)
{ {
s_widget = gtk_menu_bar_new(); 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_container_add(ContainerWidget(), s_widget);
gtk_widget_ensure_style(s_widget); gtk_widget_ensure_style(s_widget);
} }
@@ -122,6 +128,9 @@ static GtkWidget* ToolTipWidget()
if (s_widget == NULL) if (s_widget == NULL)
{ {
s_widget = gtk_window_new(GTK_WINDOW_POPUP); 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"; const char* name = "gtk-tooltip";
if (gtk_check_version(2, 11, 0)) if (gtk_check_version(2, 11, 0))
name = "gtk-tooltips"; name = "gtk-tooltips";
@@ -1031,6 +1040,9 @@ void wxSystemSettingsModule::OnExit()
(void*)notify_gtk_font_name, NULL); (void*)notify_gtk_font_name, NULL);
#else #else
if (gs_tlw_parent) if (gs_tlw_parent)
{
gtk_widget_destroy(gs_tlw_parent); gtk_widget_destroy(gs_tlw_parent);
gs_tlw_parent = NULL;
}
#endif #endif
} }