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

View File

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