commit 6f1b42f263b7acd091cfae63c46a15c26e82a721 from: Oliver Lowe date: Thu Jan 1 05:41:10 2026 UTC Use GtkBuilder to show an about dialog commit - a78d33409f8cb67b7ae8af4ab9f48e5a729a7ea6 commit + 6f1b42f263b7acd091cfae63c46a15c26e82a721 blob - /dev/null blob + d9ae7aef8ba18c4861064bad4d59a3b75523d3ae (mode 644) --- /dev/null +++ src/about.ui @@ -0,0 +1,21 @@ + + + + https://git.olowe.co/talons + Jonathan Boeing <jonathan@claws-mail.org> +Tristan Chabredier <wwp@claws-mail.org> +Thorsten Maerz <thorsten@claws-mail.org> +Paul Mangan <paul@claws-mail.org> +Ricardo Mones Lastra <ricardo@mones.org> +Salvatore De Paolis <iwkse@claws-mail.org> +Michael Rasmussen <mir@datanom.net> +Oliver Lowe <o@olowe.co> + + Jesper Schultz <jesper@schultz-net.dk> +Jakub 'jimmac' Steiner <jimmac@ximian.com> +Aleksandar Urošević <urke@users.sf.net> + + GTK_LICENSE_GPL_3_0 + A fork of claws-mail + + blob - 3457dc938b74465c949d8037adca44abcdfe0e77 (mode 644) blob + /dev/null --- src/gtk/about.c +++ /dev/null @@ -1,826 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2025 the Claws Mail team and Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "defs.h" - -#include -#include -#include -#include -#include - -#include "about.h" -#include "gtkutils.h" -#include "stock_pixmap.h" -#include "prefs_common.h" -#include "utils.h" -#include "version.h" -#include "authors.h" -#include "codeconv.h" -#include "menu.h" -#include "textview.h" -#include "main.h" -#include "file-utils.h" - -static GtkWidget *window; -static gchar* uri_hover = NULL; -static GtkTextIter uri_hover_start_iter; -static GtkTextIter uri_hover_end_iter; -static GdkCursor *hand_cursor = NULL; -static GdkCursor *text_cursor = NULL; - -static void about_create(void); -static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event); -static gboolean about_textview_uri_clicked(GtkTextTag *tag, GObject *obj, - GdkEvent *event, GtkTextIter *iter, - GtkWidget *textview); -static gboolean about_textview_motion_notify(GtkWidget *widget, - GdkEventMotion *event, - GtkWidget *textview); -static gboolean about_textview_leave_notify(GtkWidget *widget, - GdkEventCrossing *event, - GtkWidget *textview); -static void about_textview_uri_update(GtkWidget *textview, gint x, gint y); - -static GtkWidget *link_popupmenu; - - -void about_show(void) -{ - if (!window) - about_create(); - else { - gtk_window_present(GTK_WINDOW(window)); - } - -} - -#define ADD_TEXT(text) gtk_text_buffer_insert(buffer, &iter, text, -1) - -static GtkWidget *about_create_child_page_info(void) -{ - GtkWidget *scrolledwin; - GtkWidget *text; - GtkTextBuffer *buffer; - GtkTextIter iter; - GdkRGBA uri_color; - gchar buf[1024]; - GtkTextTag *tag; - - scrolledwin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_SHADOW_IN); - - text = gtk_text_view_new(); - gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD); - /* disable margins until GTK bug 793407 is fixed - gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 6); - gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 6); */ - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE); - gtk_container_add(GTK_CONTAINER(scrolledwin), text); - gtk_widget_add_events(text, GDK_LEAVE_NOTIFY_MASK); - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); - gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); - - /* textview link style (based upon main prefs) */ - uri_color = prefs_common.color[COL_URI]; - tag = gtk_text_buffer_create_tag(buffer, "link", - "foreground-rgba", &uri_color, - "wrap-mode", GTK_WRAP_NONE, - NULL); - gtk_text_buffer_create_tag(buffer, "link-hover", - "foreground-rgba", &uri_color, - "underline", PANGO_UNDERLINE_SINGLE, - NULL); - - ADD_TEXT(_("Claws Mail is a lightweight, fast and highly-configurable " - "email client.")); - ADD_TEXT("\n\n"); - ADD_TEXT(_("For further information visit the Claws Mail website:")); - ADD_TEXT("\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, HOMEPAGE_URI, -1, - "link", NULL); - ADD_TEXT("\n\n"); - ADD_TEXT(_("For support and discussion subscribe to the Claws Mail " - "users' mailing list:")); - ADD_TEXT("\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, USERS_ML_URI, -1, - "link", NULL); - ADD_TEXT("\n\n"); - ADD_TEXT(_("Claws Mail is free software released " - "under the GPL. If you wish to donate " - "to the Claws Mail project you can do " - "so at:")); - ADD_TEXT("\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, DONATE_URI, -1, - "link", NULL); - - gtk_text_buffer_create_tag(buffer, "indented-list-item", - "indent", 8, - NULL); - gtk_text_buffer_create_tag(buffer, "underlined-list-title", - "underline", PANGO_UNDERLINE_SINGLE, - NULL); - ADD_TEXT("\n\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, - (_("System Information\n")), -1, "underlined-list-title", NULL); - - g_snprintf(buf, sizeof(buf), - "GTK %d.%d.%d / GLib %d.%d.%d\nLocale: %s (charset: %s)\n", - gtk_major_version, gtk_minor_version, gtk_micro_version, - glib_major_version, glib_minor_version, glib_micro_version, - conv_get_current_locale(), conv_get_locale_charset_str()); - - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, buf, -1, - "indented-list-item", NULL); - ADD_TEXT("\n"); - - g_signal_connect(G_OBJECT(tag), "event", - G_CALLBACK(about_textview_uri_clicked), text); - g_signal_connect(G_OBJECT(text), "motion-notify-event", - G_CALLBACK(about_textview_motion_notify), text); - g_signal_connect(G_OBJECT(text), "leave-notify-event", - G_CALLBACK(about_textview_leave_notify), text); - - return scrolledwin; -} - -static GtkWidget *about_create_child_page_authors(void) -{ - GtkWidget *scrolledwin; - GtkWidget *text; - GtkTextBuffer *buffer; - GtkTextIter iter; - gint i; - - scrolledwin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_SHADOW_IN); - - text = gtk_text_view_new(); - gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD); - /* disable margins until GTK bug 793407 is fixed - gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 6); - gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 6); */ - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE); - gtk_container_add(GTK_CONTAINER(scrolledwin), text); - gtk_widget_add_events(text, GDK_LEAVE_NOTIFY_MASK); - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); - gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); - - /* init formatting tag: indentation for list items */ - gtk_text_buffer_create_tag(buffer, "indented-list-item", - "indent", 8, - NULL); - gtk_text_buffer_create_tag(buffer, "underlined-list-title", - "underline", PANGO_UNDERLINE_SINGLE, - NULL); - - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, - (_("The Claws Mail Team")), -1, "underlined-list-title", NULL); - gtk_text_buffer_insert(buffer, &iter, "\n", 1); - - for (i = 0; TEAM_LIST[i] != NULL; i++) { - if (g_utf8_validate(TEAM_LIST[i], -1, NULL)) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, TEAM_LIST[i], -1, - "indented-list-item", NULL); - else { - gchar *conv = conv_codeset_strdup(TEAM_LIST[i], CS_ISO_8859_1, CS_UTF_8); - if (conv) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, conv, -1, - "indented-list-item", NULL); - g_free(conv); - } - gtk_text_buffer_insert(buffer, &iter, "\n", 1); - } - - ADD_TEXT("\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, - (_("Previous team members")), -1, "underlined-list-title", NULL); - ADD_TEXT("\n"); - - for (i = 0; EX_TEAM_LIST[i] != NULL; i++) { - if (g_utf8_validate(EX_TEAM_LIST[i], -1, NULL)) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, EX_TEAM_LIST[i], -1, - "indented-list-item", NULL); - else { - gchar *conv = conv_codeset_strdup(EX_TEAM_LIST[i], CS_ISO_8859_1, CS_UTF_8); - if (conv) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, conv, -1, - "indented-list-item", NULL); - g_free(conv); - } - ADD_TEXT("\n"); - } - - ADD_TEXT("\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, - (_("The translation team")), -1, "underlined-list-title", NULL); - ADD_TEXT("\n"); - - for (i = 0; TRANS_TEAM_LIST[i] != NULL; i++) { - if (g_utf8_validate(TRANS_TEAM_LIST[i], -1, NULL)) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, TRANS_TEAM_LIST[i], -1, - "indented-list-item", NULL); - else { - gchar *conv = conv_codeset_strdup(TRANS_TEAM_LIST[i], CS_ISO_8859_1, CS_UTF_8); - if (conv) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, conv, -1, - "indented-list-item", NULL); - g_free(conv); - } - ADD_TEXT("\n"); - } - - ADD_TEXT("\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, - (_("Documentation team")), -1, "underlined-list-title", NULL); - ADD_TEXT("\n"); - - for (i = 0; DOC_TEAM_LIST[i] != NULL; i++) { - if (g_utf8_validate(DOC_TEAM_LIST[i], -1, NULL)) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, DOC_TEAM_LIST[i], -1, - "indented-list-item", NULL); - else { - gchar *conv = conv_codeset_strdup(DOC_TEAM_LIST[i], CS_ISO_8859_1, CS_UTF_8); - if (conv) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, conv, -1, - "indented-list-item", NULL); - g_free(conv); - } - ADD_TEXT("\n"); - } - - ADD_TEXT("\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, (_("Logo")), -1, - "underlined-list-title", NULL); - ADD_TEXT("\n"); - - for (i = 0; LOGO_LIST[i] != NULL; i++) { - if (g_utf8_validate(LOGO_LIST[i], -1, NULL)) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, LOGO_LIST[i], -1, - "indented-list-item", NULL); - else { - gchar *conv = conv_codeset_strdup(LOGO_LIST[i], CS_ISO_8859_1, CS_UTF_8); - if (conv) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, conv, -1, - "indented-list-item", NULL); - g_free(conv); - } - ADD_TEXT("\n"); - } - - ADD_TEXT("\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, (_("Icons")), -1, - "underlined-list-title", NULL); - ADD_TEXT("\n"); - - for (i = 0; ICONS_LIST[i] != NULL; i++) { - if (g_utf8_validate(ICONS_LIST[i], -1, NULL)) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, ICONS_LIST[i], -1, - "indented-list-item", NULL); - else { - gchar *conv = conv_codeset_strdup(ICONS_LIST[i], CS_ISO_8859_1, CS_UTF_8); - if (conv) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, conv, -1, - "indented-list-item", NULL); - g_free(conv); - } - ADD_TEXT("\n"); - } - - ADD_TEXT("\n"); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, (_("Contributors")), -1, - "underlined-list-title", NULL); - ADD_TEXT("\n"); - - for (i = 0; CONTRIBS_LIST[i] != NULL; i++) { - if (g_utf8_validate(CONTRIBS_LIST[i], -1, NULL)) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, CONTRIBS_LIST[i], -1, - "indented-list-item", NULL); - else { - gchar *conv = conv_codeset_strdup(CONTRIBS_LIST[i], CS_ISO_8859_1, CS_UTF_8); - if (conv) - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, conv, -1, - "indented-list-item", NULL); - g_free(conv); - } - ADD_TEXT("\n"); - } - - return scrolledwin; -} - -static GtkWidget *about_create_child_page_features(void) -{ - GtkWidget *scrolledwin; - GtkWidget *text; - GtkTextBuffer *buffer; - GtkTextIter iter; - GdkPixbuf *active_pixbuf; - GdkPixbuf *inactive_pixbuf; - - scrolledwin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_SHADOW_IN); - - text = gtk_text_view_new(); - gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD); - /* disable margins until GTK bug 793407 is fixed - gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 6); - gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 6); */ - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE); - gtk_container_add(GTK_CONTAINER(scrolledwin), text); - gtk_widget_add_events(text, GDK_LEAVE_NOTIFY_MASK); - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); - gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); - - ADD_TEXT(_("Compiled-in Features")); - ADD_TEXT("\n"); - - gtk_text_buffer_create_tag(buffer, "bold", "weight", PANGO_WEIGHT_BOLD, - NULL); - - stock_pixbuf_gdk(STOCK_PIXMAP_CHECKBOX_ON, &active_pixbuf); - stock_pixbuf_gdk(STOCK_PIXMAP_CHECKBOX_OFF, &inactive_pixbuf); - - gtk_text_buffer_insert_pixbuf(buffer, &iter, active_pixbuf); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, (" GnuTLS "), -1, - "bold", NULL); - gtk_text_buffer_insert(buffer, &iter, - (gchar *)C_("GnuTLS", "adds support for encrypted connections to servers\n"), -1); - - gtk_text_buffer_insert_pixbuf(buffer, &iter, active_pixbuf); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, (" iconv "), -1, - "bold", NULL); - gtk_text_buffer_insert(buffer, &iter, - (gchar *)C_("iconv", "allows converting to and from different character sets\n"), -1); - - gtk_text_buffer_insert_pixbuf(buffer, &iter, active_pixbuf); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, (" libetpan "), -1, - "bold", NULL); - gtk_text_buffer_insert(buffer, &iter, - (gchar *)C_("libetpan", "adds support for IMAP and NNTP servers\n"), -1); - -#if USE_OAUTH2 - gtk_text_buffer_insert_pixbuf(buffer, &iter, active_pixbuf); -#else - gtk_text_buffer_insert_pixbuf(buffer, &iter, inactive_pixbuf); -#endif - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, (" OAuth2 "), -1, - "bold", NULL); - gtk_text_buffer_insert(buffer, &iter, - (gchar *)C_("OAuth2", "adds support for OAuth2 authentication\n"), -1); - - return scrolledwin; -} - -static GtkWidget *about_create_child_page_license(void) -{ - GtkWidget *scrolledwin; - GtkWidget *text; - GtkTextBuffer *buffer; - GtkTextIter iter; - GdkRGBA uri_color; - GtkTextTag *tag; - - scrolledwin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_SHADOW_IN); - - text = gtk_text_view_new(); - gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD); - /* disable margins until GTK bug 793407 is fixed - gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 6); - gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 6); */ - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE); - gtk_container_add(GTK_CONTAINER(scrolledwin), text); - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); - gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); - - ADD_TEXT( - _("This program is free software; you can redistribute it and/or modify " - "it under the terms of the GNU General Public License as published by " - "the Free Software Foundation; either version 3, or (at your option) " - "any later version.")); - ADD_TEXT("\n\n"); - - ADD_TEXT( - _("This program is distributed in the hope that it will be useful, " - "but WITHOUT ANY WARRANTY; without even the implied warranty of " - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. " - "See the GNU General Public License for more details.")); - ADD_TEXT("\n\n"); - - /* textview link style (based upon main prefs) */ - uri_color = prefs_common.color[COL_URI]; - - tag = gtk_text_buffer_create_tag(buffer, "link", - "foreground-rgba", &uri_color, - NULL); - gtk_text_buffer_create_tag(buffer, "link-hover", - "foreground-rgba", &uri_color, - "underline", PANGO_UNDERLINE_SINGLE, - NULL); - - gtk_text_buffer_insert(buffer, &iter, g_strconcat( - _("You should have received a copy of the GNU General Public License " - "along with this program. If not, see "), "<", NULL), -1); - gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, - "http://www.gnu.org/licenses/", -1, - "link", NULL); - gtk_text_buffer_insert(buffer, &iter, ">. \n\n", -1); - - g_signal_connect(G_OBJECT(tag), "event", - G_CALLBACK(about_textview_uri_clicked), text); - g_signal_connect(G_OBJECT(text), "motion-notify-event", - G_CALLBACK(about_textview_motion_notify), text); - g_signal_connect(G_OBJECT(text), "leave-notify-event", - G_CALLBACK(about_textview_leave_notify), text); - - return scrolledwin; -} - -#undef ADD_TEXT - -static gboolean release_notes_available(void) -{ - gboolean ret = FALSE; - gchar *path = NULL; - - // path = g_strconcat(DOCDIR, G_DIR_SEPARATOR_S, RELEASE_NOTES_FILE, NULL); - path = "/dev/null"; - ret = (is_file_exist(path)); - g_free(path); - - return ret; -} - -static GtkWidget *about_create_child_page_release_notes(void) -{ - GtkWidget *scrolledwin; - GtkWidget *text; - GtkTextBuffer *buffer; - GtkTextIter iter; - gchar *path, buf[1024]; - FILE *fp; - - scrolledwin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_SHADOW_IN); - text = gtk_text_view_new(); - gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD); - /* disable margins until GTK bug 793407 is fixed - gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text), 6); - gtk_text_view_set_right_margin(GTK_TEXT_VIEW(text), 6); */ - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE); - gtk_container_add(GTK_CONTAINER(scrolledwin), text); - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); - gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); - - // path = g_strconcat(DOCDIR, G_DIR_SEPARATOR_S, RELEASE_NOTES_FILE, NULL); - path = "/dev/null"; - if ((fp = g_fopen(path, "rb")) == NULL) { - if (ENOENT != errno) FILE_OP_ERROR(path, "g_fopen"); - g_free(path); - return scrolledwin; - } - g_free(path); - - while (fgets(buf, sizeof(buf), fp) != NULL) { - const gchar *src_codeset = conv_get_locale_charset_str(); - const gchar *dest_codeset = CS_UTF_8; - gchar *tmp; - - tmp = conv_codeset_strdup(buf, src_codeset, dest_codeset); - if (!tmp) { - g_warning("failed to convert character set of action configuration"); - tmp = g_strdup(buf); - } - - gtk_text_buffer_insert(buffer, &iter, tmp, -1); - g_free(tmp); - } - fclose(fp); - - return scrolledwin; -} - -static void notebook_append_page(GtkWidget *notebook, GtkWidget *scrolledwin, const gchar *label_text) -{ - if (!scrolledwin) - return; - - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_widget_set_vexpand(scrolledwin, TRUE); - gtk_widget_set_hexpand(scrolledwin, TRUE); - - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), - scrolledwin, - gtk_label_new_with_mnemonic(label_text)); -} - -static void about_create(void) -{ - GtkWidget *grid1; - GtkWidget *grid2; - GtkWidget *image; - GtkWidget *label; - GtkWidget *button; - GtkWidget *notebook; - char *markup; - GtkWidget *confirm_area; - GtkWidget *close_button; - static GdkGeometry geometry; - gint row = 0; - - window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "about"); - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); - gtk_window_set_title(GTK_WINDOW(window), _("About Claws Mail")); - gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_container_set_border_width(GTK_CONTAINER(window), 8); - - g_signal_connect(G_OBJECT(window), "delete_event", - G_CALLBACK(gtk_widget_hide_on_delete), NULL); - g_signal_connect(G_OBJECT(window), "key_press_event", - G_CALLBACK(key_pressed), NULL); - - geometry.min_width = 450; - geometry.min_height = 500; - - gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry, - GDK_HINT_MIN_SIZE); - - gtk_widget_realize(window); - - grid1 = gtk_grid_new(); - gtk_widget_set_halign(grid1, GTK_ALIGN_FILL); - gtk_orientable_set_orientation(GTK_ORIENTABLE(grid1), - GTK_ORIENTATION_VERTICAL); - gtk_grid_set_row_spacing(GTK_GRID(grid1), 8); - gtk_grid_set_column_spacing(GTK_GRID(grid1), 8); - gtk_container_add(GTK_CONTAINER(window), grid1); - - image = priv_pixmap_widget(PRIV_PIXMAP_CLAWS_MAIL_LOGO); - gtk_widget_set_halign(image, GTK_ALIGN_CENTER); - gtk_widget_set_valign(image, GTK_ALIGN_CENTER); - gtk_grid_attach(GTK_GRID(grid1), image, 0, row, 1, 1); - - grid2 = gtk_grid_new(); - gtk_orientable_set_orientation(GTK_ORIENTABLE(grid2), - GTK_ORIENTATION_VERTICAL); - gtk_widget_set_halign(grid2, GTK_ALIGN_CENTER); - gtk_widget_set_valign(grid2, GTK_ALIGN_CENTER); - gtk_grid_set_row_spacing(GTK_GRID(grid2), 4); - - gtk_grid_attach(GTK_GRID(grid1), grid2, 1, row, 1, 1); - row++; - - label = gtk_label_new(""); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); - gtk_container_add(GTK_CONTAINER(grid2), label); - markup = g_markup_printf_escaped - ("Claws Mail\nversion %s", - VERSION); - gtk_label_set_markup(GTK_LABEL(label), markup); - g_free(markup); - - button = gtk_link_button_new(HOMEPAGE_URI); - gtk_container_add(GTK_CONTAINER(grid2), button); - label = gtk_label_new - (_("Copyright (C) 1999-2025\nThe Claws Mail Team\n" - "and Hiroyuki Yamamoto")); - gtk_label_set_selectable(GTK_LABEL(label), TRUE); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); - gtk_container_add(GTK_CONTAINER(grid2), label); - - notebook = gtk_notebook_new(); - gtk_widget_show(notebook); - - notebook_append_page(notebook, about_create_child_page_info(), _("_Info")); - notebook_append_page(notebook, about_create_child_page_authors(), _("_Authors")); - notebook_append_page(notebook, about_create_child_page_features(), _("_Features")); - notebook_append_page(notebook, about_create_child_page_license(), _("_License")); - - if (release_notes_available()) { - notebook_append_page(notebook, about_create_child_page_release_notes(), _("_Release Notes")); - } - - gtk_widget_set_hexpand(notebook, TRUE); - gtk_widget_set_vexpand(notebook, TRUE); - gtk_grid_attach(GTK_GRID(grid1), notebook, 0, row, 2, 1); - row++; - - gtkut_stock_button_set_create(&confirm_area, &close_button, "window-close", _("_Close"), - NULL, NULL, NULL, NULL, NULL, NULL); - gtk_grid_attach(GTK_GRID(grid1), confirm_area, 0, row, 2, 1); - row++; - - gtk_widget_grab_default(close_button); - gtk_widget_grab_focus(close_button); - g_signal_connect_closure - (G_OBJECT(close_button), "clicked", - g_cclosure_new_swap(G_CALLBACK(gtk_widget_hide_on_delete), - window, NULL), FALSE); - - gtk_widget_show_all(window); -} - -static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event) -{ - if (event && event->keyval == GDK_KEY_Escape) - gtk_widget_hide(window); - return FALSE; -} - -static gboolean about_textview_uri_clicked(GtkTextTag *tag, GObject *obj, - GdkEvent *event, GtkTextIter *iter, - GtkWidget *textview) -{ - GtkTextIter start_iter, end_iter; - GdkEventButton *bevent; - gchar *link = NULL; - - if (!event || !tag) { - return FALSE; - } - - if (event->type != GDK_BUTTON_PRESS && event->type != GDK_2BUTTON_PRESS - && event->type != GDK_BUTTON_RELEASE) { - return FALSE; - } - - /* get link text from tag */ - if (get_tag_range(iter, tag, &start_iter, - &end_iter) == FALSE) { - return FALSE; - } - link = gtk_text_iter_get_text(&start_iter, &end_iter); - if (link == NULL) { - return FALSE; - } - - bevent = (GdkEventButton *) event; - if (bevent->button == 1 && event->type == GDK_BUTTON_RELEASE) { - GtkTextBuffer *buffer; - - /* we shouldn't follow a link if the user has selected something */ - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); - gtk_text_buffer_get_selection_bounds(buffer, &start_iter, &end_iter); - if (gtk_text_iter_get_offset(&start_iter) != gtk_text_iter_get_offset(&end_iter)) { - return FALSE; - } - /* open link and do *not* return TRUE so that - further gtk processing of the signal is done */ - open_uri(link, prefs_common_get_uri_cmd()); - - } else { - if (bevent->button == 3 && event->type == GDK_BUTTON_PRESS) { - link_popupmenu = gtk_menu_item_get_submenu(GTK_MENU_ITEM( - gtk_ui_manager_get_widget(gtkut_ui_manager(), "/Menus/TextviewPopupLink"))); - - g_object_set_data( - G_OBJECT(link_popupmenu), - "raw_url", link); - gtk_menu_popup_at_pointer(GTK_MENU(link_popupmenu), NULL); - - return TRUE; - } - } - return FALSE; -} - -static gboolean about_textview_motion_notify(GtkWidget *widget, - GdkEventMotion *event, - GtkWidget *textview) -{ - about_textview_uri_update(textview, event->x, event->y); - return FALSE; -} - -static gboolean about_textview_leave_notify(GtkWidget *widget, - GdkEventCrossing *event, - GtkWidget *textview) -{ - about_textview_uri_update(textview, -1, -1); - - return FALSE; -} - -static void about_textview_uri_update(GtkWidget *textview, gint x, gint y) -{ - GtkTextBuffer *buffer; - GtkTextIter start_iter, end_iter; - gchar *uri = NULL; - gboolean same; - - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview)); - - if (x != -1 && y != -1) { - gint bx, by; - GtkTextIter iter; - GSList *tags; - GSList *cur; - - gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(textview), - GTK_TEXT_WINDOW_WIDGET, - x, y, &bx, &by); - gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(textview), - &iter, bx, by); - - tags = gtk_text_iter_get_tags(&iter); - for (cur = tags; cur != NULL; cur = cur->next) { - GtkTextTag *tag = cur->data; - char *name; - - g_object_get(G_OBJECT(tag), "name", &name, NULL); - if (strcmp(name, "link") == 0 - && get_tag_range(&iter, tag, &start_iter, &end_iter)) { - uri = gtk_text_iter_get_text(&start_iter, &end_iter); - } - g_free(name); - - if (uri) { - break; - } - } - g_slist_free(tags); - } - - /* compare previous hovered link and this one - (here links must be unique in text buffer otherwise ClickableText structures should be - used as in textview.c) */ - same = (uri != NULL && uri_hover != NULL - && strcmp((char*)uri, (char*)uri_hover) == 0); - - if (same == FALSE) { - GdkWindow *window; - - if (uri_hover) { - gtk_text_buffer_remove_tag_by_name(buffer, - "link-hover", - &uri_hover_start_iter, - &uri_hover_end_iter); - } - - uri_hover = uri; - if (uri) { - uri_hover_start_iter = start_iter; - uri_hover_end_iter = end_iter; - - gtk_text_buffer_apply_tag_by_name(buffer, - "link-hover", - &start_iter, - &end_iter); - } - - window = gtk_text_view_get_window(GTK_TEXT_VIEW(textview), - GTK_TEXT_WINDOW_TEXT); - if (!hand_cursor) - hand_cursor = gdk_cursor_new_for_display( - gdk_window_get_display(window), GDK_HAND2); - if (!text_cursor) - text_cursor = gdk_cursor_new_for_display( - gdk_window_get_display(window), GDK_XTERM); - gdk_window_set_cursor(window, uri ? hand_cursor : text_cursor); - } -} blob - 52ce9317967fc6c9bc893884ba6eeadfa2c5130b (mode 644) blob + /dev/null --- src/gtk/about.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2015 Hiroyuki Yamamoto and the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __ABOUT_H__ -#define __ABOUT_H__ - -void about_show(void); - -#endif /* __ABOUT_H__ */ blob - aedce72de5a8ca5a086529f3414d2b7b817a0cd7 (mode 644) blob + /dev/null --- src/gtk/authors.h +++ /dev/null @@ -1,356 +0,0 @@ -static char *TEAM_LIST[] = { -"Jonathan Boeing ", -"Tristan Chabredier ", -"Thorsten Maerz ", -"Paul Mangan ", -"Ricardo Mones Lastra ", -"Salvatore De Paolis ", -"Michael Rasmussen ", -NULL -}; - -static char *EX_TEAM_LIST[] = { -"Holger Berndt", -"Hoà Viêt Dinh", -"Keith Edmunds", -"Match Grun", -"Melvin Hadasht", -"Oliver Haertel", -"Christoph Hohmann", -"Alfons Hoogervorst", -"Andrej Kacian", -"Werner Koch", -"Darko Koruga", -"Charles Lehner", -"Colin Leroy-Mira", -"Paweł Pękala", -"Leandro A. F. Pereira", -"Luke Plant", -"Martin Schaaf", -"Carsten Schurig", -"Fabien Vantard", -"Sergey Vlasov", -"Hiroyuki Yamamoto", -NULL -}; - -static char *TRANS_TEAM_LIST[] = { -"[ca] David Medina ", -"[cs] David Vachulka ", -"[da] Erik P. Olsen ", -"[de] Simon Legner", -"[en_GB] Paul Mangan ", -"[es] Ricardo Mones Lastra ", -"[fi] Flammie Pirinen ", -"[fr] Tristan Chabredier ", -"[hu] Páder Rezső ", -"[id_ID] MSulchan Darmawan ", -"[it] Luigi Votta ", -"[ja] UTUMI Hirosi ", -"[nb] Petter Adsen ", -"[nl] Marcel Pol ", -"[pl] Łukasz Wojniłowicz ", -"[pt_BR] Frederico Goncalves Guimaraes ", -"[pt_PT] Hugo Carvalho ", -"[ro] Cristian Secară ", -"[ru] Mikhail Kurinnoi ", -"[sk] Slavko ", -"[sq] Besnik Bleta ", -"[sv] Andreas Rönnquist ", -"[tr] Numan Demirdöğen ", -"[zh_TW] Mark Chang ", -NULL -}; - -static char *DOC_TEAM_LIST[] = { -"[en] Tristan Chabredier ", -" Ricardo Mones Lastra ", -" Paul Mangan ", -"[de] Christoph Klassen ", -"[es] Ricardo Mones Lastra ", -"[fr] Tristan Chabredier ", -NULL -}; - -static char *LOGO_LIST[] = { -"Jesper Schultz ", -NULL -}; - -static char *ICONS_LIST[] = { -"Jakub 'jimmac' Steiner ", -"Aleksandar Urošević ", -NULL -}; - -static char *CONTRIBS_LIST[] = { -"Alte", -"Jeremy Andrews", -"Stephen Anthony", -"André Filipe de Assunção e Brito", -"Sergei Astanin", -"Ruslan N. Balkin", -"Andy Balaam", -"Henri Bauer", -"Didier Barvaux", -"Fabio Júnior Beneditto", -"M. Benkmann", -"Wilbert Berendsen", -"Sébastien Bigaret", -"Laurent Bigonville", -"Jean-Luc Biord", -"Blatinox", -"Hanno Böck", -"Pavlo Bohmat", -"Ralf Bormann", -"H. Merijn Brand", -"Eugene Brevdo", -"Olivier Brunel", -"Sean Buckheister", -"Anton Butanaev", -"Henrik Carlqvist", -"Luca Cavalli", -"Gianni Ceccarelli", -"David Chalmers", -"Wei-Lun Chao", -"Guillaume Chazarain", -"Tsu-Fan Cheng", -"Manrat Chobchuen", -"Rich Coe", -"Natanael Copa", -"Jonathan Corbet", -"Christian Cornelssen", -"Palmer Dabbelt", -"George Danchev", -"Robert David", -"Kevin Day", -"Matthieu Dazy", -"Ben Deering", -"Jean Delvare", -"Pierric Descamps", -"Orivej Desh", -"Rodrigo Dias Arruda Senra", -"Frank Dietrich", -"Tim Dijkstra", -"Nicolas Doualot", -"Felix Eckhofer", -"Charles A. Edwards", -"Stefaan Eeckels", -"Mikhail Efremov", -"Willem van Engen", -"Paul Evans", -"Leonid Evdokimov", -"Xavier FACQ", -"Tiago Faria", -"Alessandro Di Federico", -"Lars Persson Fink", -"David Fletcher", -"Bob Forsman", -"Matthias Förste", -"Ivan Francolin Martinez", -"Stoyan Genov", -"Stavros Giannouris", -"Thomas Gilgin", -"Marius Glauser", -"Michael Gmelin", -"Thierry Godefroy", -"Alex Gorbachenko", -"Michał Górny", -"Bodo Graumann", -"Yang Guilong", -"Ashish Gupta", -"Daniel Gustafson", -"Roland Haas", -"Oliver Haertel", -"Anders Hammar", -"Mitko Haralanov", -"Alexander Lyons Harkness", -"Hashimoto", -"Jacob Head", -"Federico Heinz", -"Geir Helland", -"Jorge Van Hemelryck", -"Olaf Hering", -"Christian Hesse", -"Higuchi", -"Hiramatu", -"HIROSHIMA", -"Marc Hoper", -"Michihide Hotta", -"Shawn Houston", -"Charles Huber", -"Michael Hughes", -"Richard Hughes", -"Arthur Huillet", -"Ben Hutchings", -"Chideok Hwang", -"John E.P. Hynes", -"Hironori IWANE", -"Motonobu Ichimura", -"Alexey Illarionov", -"Yoichi Imai", -"Mathias Intemann", -"Ishihara", -"Jens Jahnke", -"Daniel Jakots", -"Pascal Jermini", -"KAJIWARA", -"KUROSAWA", -"Nicolas Kaiser", -"Stanislav Karchebny", -"kazken3", -"WAKAI Kazunao", -"Fabian Keil", -"Jakub Kiciński", -"Martin Kluge", -"IWAMOTO Kouichi", -"Ivan Krylov", -"Mikhail Kurinnoi", -"Abhay S. Kushwaha", -"Joshua M. Kwan", -"Jean-Yves Lefort", -"Flavio Leitner", -"Jérôme Lelong", -"Eric Limpens", -"Thomas Link", -"Reed Loden", -"David Looney", -"Alessandro Maestri", -"Maki", -"Jindrich Makovicka", -"Igor Mammedov", -"Tim Mann", -"Darac Marjal", -"HIRAMATSU Masami", -"Yasuzaki Masayoshi", -"Jason McCarver", -"Yotam Medini", -"David Mehrmann", -"Christian Mertes", -"Bram Metsch", -"Hanno Meyer-Thurow", -"George Michaelson", -"Raphael Michel", -"Florian Mickler", -"Neill Miller", -"Suzuki Mio", -"Alex S Moore", -"Frank Mueller", -"NAKAGAWA", -"Yuuki NINOMIYA", -"Satoshi Nagayasu", -"Yukihiro Nakai", -"SungHyun Nam", -"OSHIRO Naoki", -"Andrew Nelson", -"Nishika", -"Nishimura", -"Nishiyama", -"Masaaki Noro", -"Gustavo Noronha Silva", -"Ales Nosek", -"Emilian Nowak", -"James Noyes", -"Nikolas Nyby", -"nycex", -"Jens Oberender", -"Ofer", -"Ohmasa", -"Miquel Oliete", -"Paul Ollis", -"Fredrik Olofssen", -"Orbea", -"Thomas Orgis", -"Reza Pakdel", -"Richard Palo", -"Alvar Penning", -"Damian Poddebniak", -"Marcel Pol", -"Martin Pool", -"MatN", -"Quar", -"Don Quijote", -"Steve Rader", -"Quentin Rameau", -"Steve Randall", -"Jens Rantil", -"Ravemax", -"Eric S. Raymond", -"Ivan Rayner", -"David Relson", -"Volker Ribbert", -"Chad Robinson", -"Paul Rolland", -"Andreas Rönnquist", -"Luca Rosellini", -"Guy Rouillier", -"Stephan Sachse", -"Sakamoto", -"Mohammed Sameer", -"Tobias Sandhaas", -"Peter Sarvas", -"Oliver Schneider", -"Torsten Schoenfeld", -"Simon 'corecode' Schubert", -"Kim Schulz", -"Markus Schwarzenberg", -"Michael Schwendt", -"Ralph Sennhauser", -"Setoh", -"Michael Shell", -"shigeri", -"Jesse Skinner", -"Ville Skyttä", -"Alex Smith", -"Dale P. Smith", -"Avinash Sonawane", -"Andrea Spadaccini", -"Manuel Stoeckl", -"Bogdan Sumanariu", -"TAKANO", -"TOGAWA", -"Tajiri", -"Takahashi", -"Sakaguchi Takayuki", -"Tanaka", -"Shimamoto \"Neko\" Tatsuya", -"Timo Teräs", -"Pascal Terjan", -"Thorsten Thielen", -"Edgar Toernig", -"Konstantin Tokarev", -"Masahiro Tomita", -"Tomita", -"Topia", -"Ramin Yaghoubzadeh Torky", -"Anders Troback", -"Tsutsui", -"Aleksandar Urošević", -"Petr Vanek", -"Jeroen Versteeg", -"Viatrix", -"Kevin Vigor", -"Michael Vilain", -"Johan Vromans", -"Botalov Vyacheslav", -"Radek Vybiral", -"Jonathan Ware", -"Watanabe", -"Rafal Weglarz", -"Florian Weimer", -"Martin Wicke", -"Jan Willamowius", -"Paul Wolneykien", -"Bob Woodside", -"YAMAGUCHI", -"T. Yamamoto", -"Yanase", -"Yasumatsu", -"Ralgh Young", -"YUP", -"Daniel Zaoui", -"Gál Zoltán", -"Marien Zwart", -"Martin Zwickel", -NULL -}; blob - 9a39b5760ead821db8d92708d1084b039366ee16 blob + f648114613c5b64dfeecabdb2836029d4e817f58 --- src/mainwindow.c +++ src/mainwindow.c @@ -60,7 +60,6 @@ #include "utils.h" #include "gtkutils.h" #include "codeconv.h" -#include "about.h" #include "manual.h" #include "version.h" #include "prefs_gtk.h" @@ -388,7 +387,13 @@ static void mainwindow_nothing_cb (GtkAction *actio static void about_cb(GtkAction *gaction, gpointer data) { - about_show(); + char path[PATH_MAX]; + strlcpy(path, getenv("HOME"), sizeof(path)); + strlcat(path, "/.local/share/talons/about.ui", sizeof(path)); + + GtkBuilder *builder = gtk_builder_new_from_file(path); + GtkWidget *about = GTK_WIDGET(gtk_builder_get_object(builder, "about")); + gtk_widget_show(about); } static void mw_inc_mail_cb (GtkAction *gaction, gpointer data)