-on_page_notify_visibility (GtkWidget *widget,
- GParamSpec *arg,
- gpointer data)
-{
- GtkAssistant *assistant = GTK_ASSISTANT (data);
-
- /* update buttons state, flow may have changed */
- if (gtk_widget_get_mapped (GTK_WIDGET (assistant)))
- set_assistant_buttons_state (assistant);
-}
-
-static void
-remove_page (GtkAssistant *assistant,
- GList *element)
-{
- GtkAssistantPrivate *priv = assistant->priv;
- GtkAssistantPage *page_info;
- GList *page_node;
-
- page_info = element->data;
-
- /* If this is the current page, we need to switch away. */
- if (page_info == priv->current_page)
- {
- if (!compute_next_step (assistant))
- {
- /* The best we can do at this point is probably to pick
- * the first visible page.
- */
- page_node = priv->pages;
-
- while (page_node &&
- !gtk_widget_get_visible (((GtkAssistantPage *) page_node->data)->page))
- page_node = page_node->next;
-
- if (page_node == element)
- page_node = page_node->next;
-
- if (page_node)
- priv->current_page = page_node->data;
- else
- priv->current_page = NULL;
- }
- }
-
- priv->pages = g_list_remove_link (priv->pages, element);
- priv->visited_pages = g_slist_remove_all (priv->visited_pages, page_info);
-
- g_signal_handlers_disconnect_by_func (page_info->page, on_page_notify_visibility, assistant);
- gtk_widget_unparent (page_info->page);
-
- if (page_info->header_image)
- g_object_unref (page_info->header_image);
-
- if (page_info->sidebar_image)
- g_object_unref (page_info->sidebar_image);
-
- gtk_widget_destroy (page_info->title);
- g_slice_free (GtkAssistantPage, page_info);
- g_list_free_1 (element);
-}
-
-static void
-gtk_assistant_destroy (GtkWidget *widget)
-{
- GtkAssistant *assistant = GTK_ASSISTANT (widget);
- GtkAssistantPrivate *priv = assistant->priv;
-
- if (priv->header_image)
- {
- gtk_widget_destroy (priv->header_image);
- priv->header_image = NULL;
- }
-
- if (priv->sidebar_image)
- {
- gtk_widget_destroy (priv->sidebar_image);
- priv->sidebar_image = NULL;
- }
-
- if (priv->action_area)
- {
- gtk_widget_destroy (priv->action_area);
- priv->action_area = NULL;
- }
-
- if (priv->size_group)
- {
- g_object_unref (priv->size_group);
- priv->size_group = NULL;
- }
-
- if (priv->forward_function)
- {
- if (priv->forward_function_data &&
- priv->forward_data_destroy)
- priv->forward_data_destroy (priv->forward_function_data);
-
- priv->forward_function = NULL;
- priv->forward_function_data = NULL;
- priv->forward_data_destroy = NULL;
- }
-
- if (priv->visited_pages)
- {
- g_slist_free (priv->visited_pages);
- priv->visited_pages = NULL;
- }
-
- /* We set current to NULL so that the remove code doesn't try
- * to do anything funny */
- priv->current_page = NULL;
-
- while (priv->pages)
- remove_page (assistant, priv->pages);
-
- GTK_WIDGET_CLASS (gtk_assistant_parent_class)->destroy (widget);
-}
-
-static GList*
-find_page (GtkAssistant *assistant,
- GtkWidget *page)
-{
- GtkAssistantPrivate *priv = assistant->priv;
- GList *child = priv->pages;
-
- while (child)
- {
- GtkAssistantPage *page_info = child->data;
- if (page_info->page == page)
- return child;
-
- child = child->next;
- }
-
- return NULL;
-}
-
-static void
-set_title_font (GtkWidget *assistant,
- GtkWidget *title_label)
-{
- PangoFontDescription *desc;
- GtkStyleContext *context;
- gint size;
-
- gtk_widget_override_font (title_label, NULL);
-
- desc = pango_font_description_new ();
- context = gtk_widget_get_style_context (title_label);
- size = pango_font_description_get_size (gtk_style_context_get_font (context, 0));
-
- pango_font_description_set_weight (desc, PANGO_WEIGHT_ULTRABOLD);
- pango_font_description_set_size (desc, size * PANGO_SCALE_XX_LARGE);
-
- gtk_widget_override_font (title_label, desc);
- pango_font_description_free (desc);
-}
-
-static void
-gtk_assistant_style_updated (GtkWidget *widget)
-{
- GtkAssistant *assistant = GTK_ASSISTANT (widget);
- GtkAssistantPrivate *priv = assistant->priv;
- GList *list;
-
- list = priv->pages;
-
- while (list)
- {
- GtkAssistantPage *page = list->data;
-
- set_title_font (widget, page->title);
- list = list->next;
- }
-}
-
-static void
-gtk_assistant_size_request (GtkWidget *widget,
- GtkRequisition *requisition)
-{
- GtkAssistant *assistant = GTK_ASSISTANT (widget);
- GtkAssistantPrivate *priv = assistant->priv;
- GtkRequisition child_requisition;
- gint header_padding, content_padding;
- gint width, height, header_width, header_height;
- guint border_width;
- GList *list;
-
- gtk_widget_style_get (widget,
- "header-padding", &header_padding,
- "content-padding", &content_padding,
- NULL);
- width = height = 0;
- header_width = header_height = 0;
- list = priv->pages;
-
- while (list)
- {
- GtkAssistantPage *page = list->data;
- gint w, h;
-
- gtk_widget_get_preferred_size (page->page,
- &child_requisition, NULL);
- width = MAX (width, child_requisition.width);
- height = MAX (height, child_requisition.height);
-
- gtk_widget_get_preferred_size (page->title,
- &child_requisition, NULL);
- w = child_requisition.width;
- h = child_requisition.height;
-
- if (page->header_image)
- {
- w += gdk_pixbuf_get_width (page->header_image) + HEADER_SPACING;
- h = MAX (h, gdk_pixbuf_get_height (page->header_image));
- }
-
- header_width = MAX (header_width, w);
- header_height = MAX (header_height, h);
-
- list = list->next;
- }
-
- gtk_widget_get_preferred_size (priv->sidebar_image,
- &child_requisition, NULL);
- width += child_requisition.width;
- height = MAX (height, child_requisition.height);
-
- gtk_widget_set_size_request (priv->header_image, header_width, header_height);
- gtk_widget_get_preferred_size (priv->header_image,
- &child_requisition, NULL);
- width = MAX (width, header_width) + 2 * header_padding;
- height += header_height + 2 * header_padding;
-
- gtk_widget_get_preferred_size (priv->action_area,
- &child_requisition, NULL);
- width = MAX (width, child_requisition.width);
- height += child_requisition.height + ACTION_AREA_SPACING;
-
- border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
- width += border_width * 2 + content_padding * 2;
- height += border_width * 2 + content_padding * 2;
-
- requisition->width = width;
- requisition->height = height;
-}
-
-static void
-gtk_assistant_get_preferred_width (GtkWidget *widget,
- gint *minimum,
- gint *natural)
-{
- GtkRequisition requisition;
-
- gtk_assistant_size_request (widget, &requisition);
-
- *minimum = *natural = requisition.width;
-}
-
-static void
-gtk_assistant_get_preferred_height (GtkWidget *widget,
- gint *minimum,
- gint *natural)
-{
- GtkRequisition requisition;
-
- gtk_assistant_size_request (widget, &requisition);
-
- *minimum = *natural = requisition.height;
-}
-
-static void
-gtk_assistant_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)