static void theme_message_area_update (AppearanceData *data) { const MateThemeMetaInfo *theme; gboolean show_apply_background = FALSE; gboolean show_apply_font = FALSE; gboolean show_revert_font = FALSE; gboolean show_error; const gchar *message; gchar *font; GError *error = NULL; theme = theme_get_selected (GTK_ICON_VIEW (appearance_capplet_get_widget (data, "theme_list")), data); if (!theme) { if (data->theme_message_area != NULL) gtk_widget_hide (data->theme_message_area); return; } show_error = !mate_theme_meta_info_validate (theme, &error); if (!show_error) { if (theme->background_image != NULL) { gchar *background; background = mateconf_client_get_string (data->client, BACKGROUND_KEY, NULL); show_apply_background = (!background || strcmp (theme->background_image, background) != 0); g_free (background); } if (theme->application_font) { font = mateconf_client_get_string (data->client, APPLICATION_FONT_KEY, NULL); show_apply_font = (!font || strcmp (theme->application_font, font) != 0); g_free (font); } if (!show_apply_font && theme->documents_font) { font = mateconf_client_get_string (data->client, DOCUMENTS_FONT_KEY, NULL); show_apply_font = (!font || strcmp (theme->application_font, font) != 0); g_free (font); } if (!show_apply_font && theme->desktop_font) { font = mateconf_client_get_string (data->client, DESKTOP_FONT_KEY, NULL); show_apply_font = (!font || strcmp (theme->application_font, font) != 0); g_free (font); } if (!show_apply_font && theme->windowtitle_font) { font = mateconf_client_get_string (data->client, WINDOWTITLE_FONT_KEY, NULL); show_apply_font = (!font || strcmp (theme->application_font, font) != 0); g_free (font); } if (!show_apply_font && theme->monospace_font) { font = mateconf_client_get_string (data->client, MONOSPACE_FONT_KEY, NULL); show_apply_font = (!font || strcmp (theme->application_font, font) != 0); g_free (font); } show_revert_font = (data->revert_application_font != NULL || data->revert_documents_font != NULL || data->revert_desktop_font != NULL || data->revert_windowtitle_font != NULL || data->revert_monospace_font != NULL); } if (data->theme_message_area == NULL) { GtkWidget *hbox; GtkWidget *parent; GtkWidget *content; if (!show_apply_background && !show_revert_font && !show_apply_font && !show_error) return; data->theme_message_area = gtk_info_bar_new (); gtk_widget_set_no_show_all (data->theme_message_area, TRUE); g_signal_connect (data->theme_message_area, "response", (GCallback) theme_message_area_response_cb, data); data->apply_background_button = gtk_info_bar_add_button ( GTK_INFO_BAR (data->theme_message_area), _("Apply Background"), RESPONSE_APPLY_BG); data->apply_font_button = gtk_info_bar_add_button ( GTK_INFO_BAR (data->theme_message_area), _("Apply Font"), RESPONSE_APPLY_FONT); data->revert_font_button = gtk_info_bar_add_button ( GTK_INFO_BAR (data->theme_message_area), _("Revert Font"), RESPONSE_REVERT_FONT); data->install_button = gtk_info_bar_add_button ( GTK_INFO_BAR (data->theme_message_area), _("Install"), RESPONSE_INSTALL_ENGINE); data->theme_message_label = gtk_label_new (NULL); gtk_widget_show (data->theme_message_label); gtk_label_set_line_wrap (GTK_LABEL (data->theme_message_label), TRUE); gtk_misc_set_alignment (GTK_MISC (data->theme_message_label), 0.0, 0.5); hbox = gtk_hbox_new (FALSE, 9); gtk_widget_show (hbox); data->theme_info_icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); data->theme_error_icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment (GTK_MISC (data->theme_info_icon), 0.5, 0); gtk_misc_set_alignment (GTK_MISC (data->theme_error_icon), 0.5, 0); gtk_box_pack_start (GTK_BOX (hbox), data->theme_info_icon, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), data->theme_error_icon, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), data->theme_message_label, TRUE, TRUE, 0); content = gtk_info_bar_get_content_area (GTK_INFO_BAR (data->theme_message_area)); gtk_container_add (GTK_CONTAINER (content), hbox); parent = appearance_capplet_get_widget (data, "theme_list_vbox"); gtk_box_pack_start (GTK_BOX (parent), data->theme_message_area, FALSE, FALSE, 0); } if (show_error) message = error->message; else if (show_apply_background && show_apply_font && show_revert_font) message = _("The current theme suggests a background and a font. Also, the last applied font suggestion can be reverted."); else if (show_apply_background && show_revert_font) message = _("The current theme suggests a background. Also, the last applied font suggestion can be reverted."); else if (show_apply_background && show_apply_font) message = _("The current theme suggests a background and a font."); else if (show_apply_font && show_revert_font) message = _("The current theme suggests a font. Also, the last applied font suggestion can be reverted."); else if (show_apply_background) message = _("The current theme suggests a background."); else if (show_revert_font) message = _("The last applied font suggestion can be reverted."); else if (show_apply_font) message = _("The current theme suggests a font."); else message = NULL; if (show_apply_background) gtk_widget_show (data->apply_background_button); else gtk_widget_hide (data->apply_background_button); if (show_apply_font) gtk_widget_show (data->apply_font_button); else gtk_widget_hide (data->apply_font_button); if (show_revert_font) gtk_widget_show (data->revert_font_button); else gtk_widget_hide (data->revert_font_button); if (show_error && g_error_matches (error, MATE_THEME_ERROR, MATE_THEME_ERROR_GTK_ENGINE_NOT_AVAILABLE) && packagekit_available ()) gtk_widget_show (data->install_button); else gtk_widget_hide (data->install_button); if (show_error || show_apply_background || show_apply_font || show_revert_font) { gtk_widget_show (data->theme_message_area); gtk_widget_queue_draw (data->theme_message_area); if (show_error) { gtk_widget_show (data->theme_error_icon); gtk_widget_hide (data->theme_info_icon); } else { gtk_widget_show (data->theme_info_icon); gtk_widget_hide (data->theme_error_icon); } } else { gtk_widget_hide (data->theme_message_area); } gtk_label_set_text (GTK_LABEL (data->theme_message_label), message); g_clear_error (&error); }
static void update_message_area(AppearanceData* data) { GtkSettings* settings = gtk_settings_get_default(); gchar* theme = NULL; gchar* engine; g_object_get(settings, "gtk-theme-name", &theme, NULL); engine = gtk_theme_info_missing_engine(theme, TRUE); g_free(theme); if (data->style_message_area == NULL) { GtkWidget* hbox; GtkWidget* parent; GtkWidget* icon; GtkWidget* content; if (engine == NULL) { return; } data->style_message_area = gtk_info_bar_new (); g_signal_connect (data->style_message_area, "response", (GCallback) style_message_area_response_cb, data); data->style_install_button = gtk_info_bar_add_button(GTK_INFO_BAR (data->style_message_area), _("Install"), GTK_RESPONSE_APPLY); data->style_message_label = gtk_label_new (NULL); gtk_label_set_line_wrap (GTK_LABEL (data->style_message_label), TRUE); gtk_misc_set_alignment (GTK_MISC (data->style_message_label), 0.0, 0.5); hbox = gtk_hbox_new (FALSE, 9); icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment (GTK_MISC (icon), 0.5, 0); gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), data->style_message_label, TRUE, TRUE, 0); content = gtk_info_bar_get_content_area (GTK_INFO_BAR (data->style_message_area)); gtk_container_add (GTK_CONTAINER (content), hbox); gtk_widget_show_all (data->style_message_area); gtk_widget_set_no_show_all (data->style_message_area, TRUE); parent = appearance_capplet_get_widget (data, "gtk_themes_vbox"); gtk_box_pack_start (GTK_BOX (parent), data->style_message_area, FALSE, FALSE, 0); } #if !GTK_CHECK_VERSION (3, 0, 0) if (engine != NULL) { gchar* message = g_strdup_printf(_("This theme will not look as intended because the required GTK+ theme engine '%s' is not installed."), engine); gtk_label_set_text(GTK_LABEL(data->style_message_label), message); g_free(message); g_free(engine); if (packagekit_available()) { gtk_widget_show(data->style_install_button); } else { gtk_widget_hide(data->style_install_button); } gtk_widget_show(data->style_message_area); gtk_widget_queue_draw(data->style_message_area); } else { gtk_widget_hide(data->style_message_area); } #else gtk_widget_hide(data->style_message_area); #endif }