Do not create internal widgets until realized

master
Yevgen Muntyan 2007-07-04 21:17:17 -05:00
parent 47fe9f9e83
commit 880457cd90
1 changed files with 57 additions and 21 deletions

View File

@ -1457,6 +1457,7 @@ static void moo_font_button_set_property (GObject *object,
const GValue *value, const GValue *value,
GParamSpec *pspec); GParamSpec *pspec);
static void moo_font_button_realize (GtkWidget *widget);
static void moo_font_button_clicked (GtkButton *button); static void moo_font_button_clicked (GtkButton *button);
/* Dialog response functions */ /* Dialog response functions */
@ -1465,7 +1466,7 @@ static void dialog_cancel_clicked (MooFontButton *font_but
static void dialog_destroy (MooFontButton *font_button); static void dialog_destroy (MooFontButton *font_button);
/* Auxiliary functions */ /* Auxiliary functions */
static GtkWidget *moo_font_button_create_inside (MooFontButton *gfs); static void moo_font_button_update_inside (MooFontButton *gfs);
static void moo_font_button_label_use_font (MooFontButton *gfs); static void moo_font_button_label_use_font (MooFontButton *gfs);
static void moo_font_button_update_font_info (MooFontButton *gfs); static void moo_font_button_update_font_info (MooFontButton *gfs);
@ -1479,10 +1480,12 @@ static void
moo_font_button_class_init (MooFontButtonClass *klass) moo_font_button_class_init (MooFontButtonClass *klass)
{ {
GObjectClass *gobject_class; GObjectClass *gobject_class;
GtkWidgetClass *widget_class;
GtkButtonClass *button_class; GtkButtonClass *button_class;
gobject_class = (GObjectClass *) klass; gobject_class = (GObjectClass *) klass;
button_class = (GtkButtonClass *) klass; button_class = (GtkButtonClass *) klass;
widget_class = (GtkWidgetClass *) klass;
parent_class = g_type_class_peek_parent (klass); parent_class = g_type_class_peek_parent (klass);
@ -1490,6 +1493,8 @@ moo_font_button_class_init (MooFontButtonClass *klass)
gobject_class->set_property = moo_font_button_set_property; gobject_class->set_property = moo_font_button_set_property;
gobject_class->get_property = moo_font_button_get_property; gobject_class->get_property = moo_font_button_get_property;
widget_class->realize = moo_font_button_realize;
button_class->clicked = moo_font_button_clicked; button_class->clicked = moo_font_button_clicked;
klass->font_set = NULL; klass->font_set = NULL;
@ -1637,8 +1642,7 @@ moo_font_button_init (MooFontButton *font_button)
font_button->priv->monospace = FALSE; font_button->priv->monospace = FALSE;
font_button->priv->filter_visible = TRUE; font_button->priv->filter_visible = TRUE;
font_button->priv->inside = moo_font_button_create_inside (font_button); font_button->priv->inside = NULL;
gtk_container_add (GTK_CONTAINER (font_button), font_button->priv->inside);
moo_font_button_update_font_info (font_button); moo_font_button_update_font_info (font_button);
} }
@ -1742,6 +1746,20 @@ moo_font_button_get_property (GObject *object,
} }
} }
static void
moo_font_button_realize (GtkWidget *widget)
{
MooFontButton *font_button = MOO_FONT_BUTTON (widget);
GTK_WIDGET_CLASS (moo_font_button_parent_class)->realize (widget);
moo_font_button_update_inside (font_button);
if (font_button->priv->use_font)
moo_font_button_label_use_font (font_button);
else
gtk_widget_set_style (font_button->priv->font_label, NULL);
}
/** /**
* moo_font_button_new: * moo_font_button_new:
@ -1858,10 +1876,13 @@ moo_font_button_set_use_font (MooFontButton *font_button,
{ {
font_button->priv->use_font = use_font; font_button->priv->use_font = use_font;
if (use_font) if (font_button->priv->font_label)
moo_font_button_label_use_font (font_button); {
else if (use_font)
gtk_widget_set_style (font_button->priv->font_label, NULL); moo_font_button_label_use_font (font_button);
else
gtk_widget_set_style (font_button->priv->font_label, NULL);
}
g_object_notify (G_OBJECT (font_button), "use-font"); g_object_notify (G_OBJECT (font_button), "use-font");
} }
@ -1906,7 +1927,7 @@ moo_font_button_set_use_size (MooFontButton *font_button,
{ {
font_button->priv->use_size = use_size; font_button->priv->use_size = use_size;
if (font_button->priv->use_font) if (font_button->priv->use_font && font_button->priv->font_label)
moo_font_button_label_use_font (font_button); moo_font_button_label_use_font (font_button);
g_object_notify (G_OBJECT (font_button), "use-size"); g_object_notify (G_OBJECT (font_button), "use-size");
@ -1996,13 +2017,7 @@ moo_font_button_set_show_size (MooFontButton *font_button,
if (font_button->priv->show_size != show_size) if (font_button->priv->show_size != show_size)
{ {
font_button->priv->show_size = show_size; font_button->priv->show_size = show_size;
moo_font_button_update_inside (font_button);
gtk_container_remove (GTK_CONTAINER (font_button), font_button->priv->inside);
font_button->priv->inside = moo_font_button_create_inside (font_button);
gtk_container_add (GTK_CONTAINER (font_button), font_button->priv->inside);
moo_font_button_update_font_info (font_button);
g_object_notify (G_OBJECT (font_button), "show-size"); g_object_notify (G_OBJECT (font_button), "show-size");
} }
} }
@ -2025,11 +2040,7 @@ moo_font_button_set_monospace (MooFontButton *font_button,
{ {
font_button->priv->monospace = monospace != 0; font_button->priv->monospace = monospace != 0;
gtk_container_remove (GTK_CONTAINER (font_button), font_button->priv->inside); moo_font_button_update_inside (font_button);
font_button->priv->inside = moo_font_button_create_inside (font_button);
gtk_container_add (GTK_CONTAINER (font_button), font_button->priv->inside);
moo_font_button_update_font_info (font_button);
if (font_button->priv->font_dialog) if (font_button->priv->font_dialog)
moo_font_selection_set_monospace (MOO_FONT_SELECTION (MOO_FONT_SELECTION_DIALOG (font_button->priv->font_dialog)->fontsel), moo_font_selection_set_monospace (MOO_FONT_SELECTION (MOO_FONT_SELECTION_DIALOG (font_button->priv->font_dialog)->fontsel),
@ -2233,6 +2244,21 @@ moo_font_button_create_inside (MooFontButton *font_button)
return widget; return widget;
} }
static void
moo_font_button_update_inside (MooFontButton *font_button)
{
if (GTK_WIDGET_REALIZED (font_button))
{
if (font_button->priv->inside)
gtk_container_remove (GTK_CONTAINER (font_button), font_button->priv->inside);
font_button->priv->inside = moo_font_button_create_inside (font_button);
gtk_container_add (GTK_CONTAINER (font_button), font_button->priv->inside);
moo_font_button_update_font_info (font_button);
}
}
static void static void
moo_font_button_label_use_font (MooFontButton *font_button) moo_font_button_label_use_font (MooFontButton *font_button)
{ {
@ -2246,7 +2272,8 @@ moo_font_button_label_use_font (MooFontButton *font_button)
if (!font_button->priv->use_size) if (!font_button->priv->use_size)
pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE); pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE);
gtk_widget_modify_font (font_button->priv->font_label, desc); if (font_button->priv->font_label)
gtk_widget_modify_font (font_button->priv->font_label, desc);
pango_font_description_free (desc); pango_font_description_free (desc);
} }
@ -2259,6 +2286,15 @@ moo_font_button_update_font_info (MooFontButton *font_button)
gchar *style; gchar *style;
gchar *family_style; gchar *family_style;
if (!GTK_WIDGET_REALIZED (font_button))
return;
if (!font_button->priv->inside)
{
font_button->priv->inside = moo_font_button_create_inside (font_button);
gtk_container_add (GTK_CONTAINER (font_button), font_button->priv->inside);
}
desc = pango_font_description_from_string (font_button->priv->fontname); desc = pango_font_description_from_string (font_button->priv->fontname);
family = pango_font_description_get_family (desc); family = pango_font_description_get_family (desc);