X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkaboutdialog.c;h=f50fed0af12473491817512203f8b8d36d113402;hb=d0895d6c0feb6c6ca14bfc05910926051b2bf63b;hp=ae6c91865fcffd794f6ee18c407d43cfead6a69d;hpb=bf0d8402f5382fadd32a9748d00a4bcd715ea07a;p=~andy%2Fgtk diff --git a/gtk/gtkaboutdialog.c b/gtk/gtkaboutdialog.c index ae6c91865..f50fed0af 100644 --- a/gtk/gtkaboutdialog.c +++ b/gtk/gtkaboutdialog.c @@ -14,9 +14,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -37,7 +35,7 @@ #include "gtkbbox.h" #include "gtkdialog.h" #include "gtkgrid.h" -#include "gtkhbox.h" +#include "gtkbox.h" #include "gtkimage.h" #include "gtklabel.h" #include "gtklinkbutton.h" @@ -47,10 +45,9 @@ #include "gtkscrolledwindow.h" #include "gtkstock.h" #include "gtktextview.h" -#include "gtkvbox.h" #include "gtkiconfactory.h" #include "gtkshow.h" -#include "gtkmainprivate.h" +#include "gtkmain.h" #include "gtkmessagedialog.h" #include "gtktogglebutton.h" #include "gtktypebuiltins.h" @@ -92,6 +89,10 @@ * "title" _("About ExampleCode"), * NULL); * + * + * It is also possible to show a #GtkAboutDialog like any other #GtkDialog, + * e.g. using gtk_dialog_run(). In this case, you might need to know that + * the 'Close' button returns the #GTK_RESPONSE_CANCEL response id. */ static GdkColor default_link_color = { 0, 0, 0, 0xeeee }; @@ -100,7 +101,7 @@ static GdkColor default_visited_link_color = { 0, 0x5555, 0x1a1a, 0x8b8b }; /* Translators: this is the license preamble; the string at the end * contains the URL of the license. */ -static const gchar *gtk_license_preamble = N_("This program comes with ABSOLUTELY NO WARRANTY; for details, visit %s"); +static const gchar *gtk_license_preamble = N_("This program comes with ABSOLUTELY NO WARRANTY;\nfor details, visit %s"); /* URLs for each GtkLicense type; keep in the same order as the enumeration */ static const gchar *gtk_license_urls[] = { @@ -119,6 +120,12 @@ static const gchar *gtk_license_urls[] = { "http://opensource.org/licenses/artistic-license-2.0.php" }; +typedef struct +{ + gchar *heading; + gchar **people; +} CreditSection; + struct _GtkAboutDialogPrivate { gchar *name; @@ -134,6 +141,9 @@ struct _GtkAboutDialogPrivate gchar **documenters; gchar **artists; + + GSList *credit_sections; + gint credits_page; gint license_page; @@ -160,6 +170,8 @@ struct _GtkAboutDialogPrivate guint wrap_license : 1; }; + + #define GTK_ABOUT_DIALOG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ABOUT_DIALOG, GtkAboutDialogPrivate)) @@ -558,6 +570,7 @@ update_credits_button_visibility (GtkAboutDialog *about) show = (priv->authors != NULL || priv->documenters != NULL || priv->artists != NULL || + priv->credit_sections != NULL || (priv->translator_credits != NULL && strcmp (priv->translator_credits, "translator_credits") && strcmp (priv->translator_credits, "translator-credits"))); @@ -772,6 +785,15 @@ gtk_about_dialog_init (GtkAboutDialog *about) gtk_about_dialog_set_logo (about, NULL); } +static void +destroy_credit_section (gpointer data) +{ + CreditSection *cs = data; + g_free (cs->heading); + g_strfreev (cs->people); + g_slice_free (CreditSection, data); +} + static void gtk_about_dialog_finalize (GObject *object) { @@ -791,6 +813,8 @@ gtk_about_dialog_finalize (GObject *object) g_strfreev (priv->documenters); g_strfreev (priv->artists); + g_slist_free_full (priv->credit_sections, destroy_credit_section); + g_slist_foreach (priv->visited_links, (GFunc)g_free, NULL); g_slist_free (priv->visited_links); @@ -990,7 +1014,7 @@ update_website (GtkAboutDialog *about) else { markup = g_strdup_printf ("%s", - priv->website_url, _("Homepage")); + priv->website_url, _("Website")); } gtk_label_set_markup (GTK_LABEL (priv->website_label), markup); @@ -1939,7 +1963,7 @@ text_view_event_after (GtkWidget *text_view, button_event = (GdkEventButton *)event; - if (button_event->button != 1) + if (button_event->button != GDK_BUTTON_PRIMARY) return FALSE; buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); @@ -2071,11 +2095,9 @@ text_view_new (GtkAboutDialog *about, GdkColor color; GdkColor link_color; GdkColor visited_link_color; - gint size; - PangoFontDescription *font_desc; GtkAboutDialogPrivate *priv = about->priv; - GtkStyleContext *context; - GtkStateFlags state; + GtkTextIter start_iter, end_iter; + GtkTextTag *tag; gtk_widget_style_get (GTK_WIDGET (about), "link-color", &style_link_color, @@ -2104,14 +2126,11 @@ text_view_new (GtkAboutDialog *about, gtk_text_view_set_editable (text_view, FALSE); gtk_text_view_set_wrap_mode (text_view, wrap_mode); - context = gtk_widget_get_style_context (view); - state = gtk_widget_get_state_flags (view); - - size = pango_font_description_get_size (gtk_style_context_get_font (context, state)); - font_desc = pango_font_description_new (); - pango_font_description_set_size (font_desc, size * PANGO_SCALE_SMALL); - gtk_widget_modify_font (view, font_desc); - pango_font_description_free (font_desc); + gtk_text_buffer_get_start_iter (buffer, &start_iter); + gtk_text_buffer_get_start_iter (buffer, &end_iter); + tag = gtk_text_tag_new (NULL); + g_object_set (tag, "font-scale", PANGO_SCALE_SMALL, NULL); + gtk_text_buffer_apply_tag (buffer, tag, &start_iter, &end_iter); gtk_text_view_set_left_margin (text_view, 8); gtk_text_view_set_right_margin (text_view, 8); @@ -2240,7 +2259,8 @@ add_credits_section (GtkAboutDialog *about, label = gtk_label_new (markup); gtk_label_set_use_markup (GTK_LABEL (label), TRUE); g_free (markup); - gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); + gtk_widget_set_halign (label, GTK_ALIGN_END); + gtk_widget_set_valign (label, GTK_ALIGN_CENTER); gtk_grid_attach (grid, label, 0, *row, 1, 1); for (p = people; *p; p++) @@ -2329,12 +2349,15 @@ add_credits_section (GtkAboutDialog *about, label = gtk_label_new (str->str); gtk_label_set_use_markup (GTK_LABEL (label), TRUE); g_string_free (str, TRUE); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); + gtk_widget_set_halign (label, GTK_ALIGN_START); + gtk_widget_set_valign (label, GTK_ALIGN_CENTER); gtk_grid_attach (grid, label, 1, *row, 1, 1); (*row)++; } /* skip one at the end */ + label = gtk_label_new (""); + gtk_grid_attach (grid, label, 1, *row, 1, 1); (*row)++; } @@ -2352,7 +2375,7 @@ create_credits_page (GtkAboutDialog *about) priv->credits_page = gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), page_vbox, NULL); sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_NONE); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); @@ -2361,11 +2384,15 @@ create_credits_page (GtkAboutDialog *about) grid = gtk_grid_new (); gtk_container_set_border_width (GTK_CONTAINER (grid), 5); gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_VERTICAL); - gtk_grid_set_column_spacing (GTK_GRID (grid), 2); - gtk_grid_set_row_spacing (GTK_GRID (grid), 12); + gtk_grid_set_column_spacing (GTK_GRID (grid), 8); + gtk_grid_set_row_spacing (GTK_GRID (grid), 2); gtk_widget_set_halign (grid, GTK_ALIGN_CENTER); gtk_widget_set_valign (grid, GTK_ALIGN_START); - gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), grid); + gtk_container_add (GTK_CONTAINER (sw), grid); + gtk_style_context_add_class (gtk_widget_get_style_context (gtk_bin_get_child (GTK_BIN (sw))), + GTK_STYLE_CLASS_VIEW); + + row = 0; if (priv->authors != NULL) add_credits_section (about, GTK_GRID (grid), &row, _("Created by"), priv->authors); @@ -2388,6 +2415,16 @@ create_credits_page (GtkAboutDialog *about) if (priv->artists != NULL) add_credits_section (about, GTK_GRID (grid), &row, _("Artwork by"), priv->artists); + if (priv->credit_sections != NULL) + { + GSList *cs; + for (cs = priv->credit_sections; cs != NULL; cs = cs->next) + { + CreditSection *section = cs->data; + add_credits_section (about, GTK_GRID (grid), &row, section->heading, section->people); + } + } + gtk_widget_show_all (sw); } @@ -2417,7 +2454,6 @@ create_license_page (GtkAboutDialog *about) priv->license_page = gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), page_vbox, NULL); sw = gtk_scrolled_window_new (NULL, NULL); - gtk_container_set_border_width (GTK_CONTAINER (sw), 5); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); @@ -2478,7 +2514,7 @@ close_cb (GtkAboutDialog *about) * gtk_show_about_dialog: * @parent: (allow-none): transient parent, or %NULL for none * @first_property_name: the name of the first property - * @Varargs: value of first property, followed by more properties, %NULL-terminated + * @...: value of first property, followed by more properties, %NULL-terminated * * This is a convenience function for showing an application's about box. * The constructed dialog is associated with the parent window and @@ -2622,3 +2658,35 @@ gtk_about_dialog_get_license_type (GtkAboutDialog *about) return about->priv->license_type; } + +/** + * gtk_about_dialog_add_credit_section: + * @about: A #GtkAboutDialog + * @section_name: The name of the section + * @people: (array zero-terminated=1): The people who belong to that section + * + * Creates a new section in the Credits page. + * + * Since: 3.4 + */ +void +gtk_about_dialog_add_credit_section (GtkAboutDialog *about, + const gchar *section_name, + const gchar **people) +{ + GtkAboutDialogPrivate *priv; + CreditSection *new_entry; + + g_return_if_fail (GTK_IS_ABOUT_DIALOG (about)); + g_return_if_fail (section_name != NULL); + g_return_if_fail (people != NULL); + + priv = about->priv; + + new_entry = g_slice_new (CreditSection); + new_entry->heading = g_strdup ((gchar *)section_name); + new_entry->people = g_strdupv ((gchar **)people); + + priv->credit_sections = g_slist_append (priv->credit_sections, new_entry); + update_credits_button_visibility (about); +}