talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 330d00d595a84f32c7461911221267e1346d2802
parent 5e68ea0d182dbbf8e27253dccef5a5d2c9e16b64
Author: Colin Leroy <colin@colino.net>
Date:   Fri, 21 Aug 2009 15:56:29 +0000

2009-08-21 [colin]	3.7.2cvs22

	* src/compose.c
	* src/prefs_common.c
	* src/prefs_common.h
	* src/prefs_compose_writing.c
	* src/common/utils.c
		Fix bug 1986, "New feature: warn user when inserting
		a large file in the message body". Patch by Didier
		Barvaux

Diffstat:
MChangeLog | 15+++++++++++++--
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Msrc/common/utils.c | 7+++++++
Msrc/compose.c | 57+++++++++++++++++++++++++++++++++++++++++++++++++++------
Msrc/prefs_common.c | 4++++
Msrc/prefs_common.h | 2++
Msrc/prefs_compose_writing.c | 53+++++++++++++++++++++++++++++++++++++++++++++++++++--
8 files changed, 130 insertions(+), 11 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,10 +1,21 @@ +2009-08-21 [colin] 3.7.2cvs22 + + * src/compose.c + * src/prefs_common.c + * src/prefs_common.h + * src/prefs_compose_writing.c + * src/common/utils.c + Fix bug 1986, "New feature: warn user when inserting + a large file in the message body". Patch by Didier + Barvaux + 2009-08-21 [colin] 3.7.2cvs21 * AUTHORS * src/gtk/authors.h * src/common/utils.c - Add Réf. : reply prefix (french Lotus Notes); patch - by Didier Barvaux + Fix bug 1984: Add Réf. : reply prefix (french + Lotus Notes); patch by Didier Barvaux 2009-08-21 [colin] 3.7.2cvs20 diff --git a/PATCHSETS b/PATCHSETS @@ -3846,3 +3846,4 @@ ( cvs diff -u -r 1.382.2.519 -r 1.382.2.520 src/compose.c; cvs diff -u -r 1.50.2.54 -r 1.50.2.55 src/compose.h; ) > 3.7.2cvs19.patchset ( cvs diff -u -r 1.65.2.68 -r 1.65.2.69 src/codeconv.c; cvs diff -u -r 1.15.2.22 -r 1.15.2.23 src/codeconv.h; ) > 3.7.2cvs20.patchset ( cvs diff -u -r 1.100.2.72 -r 1.100.2.73 AUTHORS; cvs diff -u -r 1.1.2.60 -r 1.1.2.61 src/gtk/authors.h; cvs diff -u -r 1.36.2.172 -r 1.36.2.173 src/common/utils.c; ) > 3.7.2cvs21.patchset +( cvs diff -u -r 1.382.2.520 -r 1.382.2.521 src/compose.c; cvs diff -u -r 1.204.2.191 -r 1.204.2.192 src/prefs_common.c; cvs diff -u -r 1.103.2.124 -r 1.103.2.125 src/prefs_common.h; cvs diff -u -r 1.1.2.26 -r 1.1.2.27 src/prefs_compose_writing.c; cvs diff -u -r 1.36.2.173 -r 1.36.2.174 src/common/utils.c; ) > 3.7.2cvs22.patchset diff --git a/configure.ac b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=7 MICRO_VERSION=2 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=21 +EXTRA_VERSION=22 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/src/common/utils.c b/src/common/utils.c @@ -346,6 +346,13 @@ gchar *itos(gint n) d = (d*100) >> divisor; \ } + +/*! + * \brief Convert a given size in bytes in a human-readable string + * + * \param size The size expressed in bytes to convert in string + * \return The string that respresents the size in an human-readable way + */ gchar *to_human_readable(goffset size) { static gchar str[14]; diff --git a/src/compose.c b/src/compose.c @@ -9379,15 +9379,60 @@ static void compose_insert_file_cb(GtkAction *action, gpointer data) gchar *file = (gchar *) tmp->data; gchar *filedup = g_strdup(file); gchar *shortfile = g_path_get_basename(filedup); + struct stat file_stat; + gboolean do_insert; ComposeInsertResult res; + int ret; + + do_insert = TRUE; + + /* get the size of the file we are about to insert */ + ret = g_stat(file, &file_stat); + if (ret != 0) { + alertpanel_error(_("Could not get size of file '%s'."), shortfile); + do_insert = FALSE; + } else if (prefs_common.warn_large_insert == TRUE) { + + /* ask user for confirmation if the file is large */ + if (prefs_common.warn_large_insert_size < 0 || + file_stat.st_size > (prefs_common.warn_large_insert_size * 1024)) { + AlertValue aval; + gchar *msg; + + msg = g_strdup_printf(_("You are about to insert a file of %s " + "in the message body. Are your sure to do that?"), + to_human_readable(file_stat.st_size)); + aval = alertpanel_full(_("Are you sure?"), msg, GTK_STOCK_CANCEL, + _("+_Insert"), NULL, TRUE, NULL, ALERT_QUESTION, G_ALERTDEFAULT); + g_free(msg); + + /* do we ask for confirmation next time? */ + if (aval & G_ALERTDISABLE) { + /* no confirmation next time, disable feature in preferences */ + aval &= ~G_ALERTDISABLE; + prefs_common.warn_large_insert = FALSE; + } - res = compose_insert_file(compose, file); - if (res == COMPOSE_INSERT_READ_ERROR) { - alertpanel_error(_("File '%s' could not be read."), shortfile); - } else if (res == COMPOSE_INSERT_INVALID_CHARACTER) { - alertpanel_error(_("File '%s' contained invalid characters\n" - "for the current encoding, insertion may be incorrect."), shortfile); + /* abort file insertion if user canceled action */ + if (aval != G_ALERTALTERNATE) { + do_insert = FALSE; + } + } } + + /* insert the file if the file is short or if the user confirmed that + he/she wants to insert the large file */ + if (do_insert) { + res = compose_insert_file(compose, file); + if (res == COMPOSE_INSERT_READ_ERROR) { + alertpanel_error(_("File '%s' could not be read."), shortfile); + } else if (res == COMPOSE_INSERT_INVALID_CHARACTER) { + alertpanel_error(_("File '%s' contained invalid characters\n" + "for the current encoding, insertion may be incorrect."), + shortfile); + } + } + g_free(shortfile); g_free(filedup); g_free(file); diff --git a/src/prefs_common.c b/src/prefs_common.c @@ -243,6 +243,10 @@ static PrefParam param[] = { P_BOOL, NULL, NULL, NULL}, {"autosave_length", "50", &prefs_common.autosave_length, P_INT, NULL, NULL, NULL}, + {"warn_large_insert", "TRUE", &prefs_common.warn_large_insert, + P_BOOL, NULL, NULL, NULL}, + {"warn_large_insert_size", "500", &prefs_common.warn_large_insert_size, + P_INT, NULL, NULL, NULL}, {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL, NULL, NULL, NULL}, diff --git a/src/prefs_common.h b/src/prefs_common.h @@ -150,6 +150,8 @@ struct _PrefsCommon gboolean show_ruler; gboolean autosave; gint autosave_length; + gboolean warn_large_insert; + gint warn_large_insert_size; gboolean compose_no_markup; ComposeDndInsertOrAttach compose_dnd_mode; gboolean compose_with_format; diff --git a/src/prefs_compose_writing.c b/src/prefs_compose_writing.c @@ -60,9 +60,10 @@ typedef struct _WritingPage GtkWidget *checkbtn_default_reply_list; GtkWidget *checkbtn_forward_as_attachment; GtkWidget *checkbtn_redirect_keep_from; - GtkWidget *hbox_autosave; GtkWidget *checkbtn_autosave; GtkWidget *spinbtn_autosave_length; + GtkWidget *checkbtn_warn_large_insert; + GtkWidget *spinbtn_warn_large_insert_size; GtkWidget *optmenu_dnd_insert_or_attach; } WritingPage; @@ -87,6 +88,12 @@ static void prefs_compose_writing_create_widget(PrefsPage *_page, GtkWindow *win GtkObject *spinbtn_undolevel_adj; GtkWidget *spinbtn_undolevel; + GtkWidget *hbox_warn_large_insert; + GtkWidget *checkbtn_warn_large_insert; + GtkObject *spinbtn_warn_large_insert_adj; + GtkWidget *spinbtn_warn_large_insert_size; + GtkWidget *label_warn_large_insert_size; + GtkWidget *checkbtn_reply_with_quote; GtkWidget *checkbtn_default_reply_list; @@ -124,11 +131,14 @@ static void prefs_compose_writing_create_widget(PrefsPage *_page, GtkWindow *win PACK_CHECK_BUTTON (hbox_autosel, checkbtn_reedit_account_autosel, _("when re-editing")); + /* Editing */ vbox2 = gtkut_get_options_frame(vbox1, &frame, _("Editing")); + /* Editing: automatically start the text editor */ PACK_CHECK_BUTTON (vbox2, checkbtn_autoextedit, _("Automatically launch the external editor")); + /* Editing: automatically save draft */ hbox_autosave = gtk_hbox_new (FALSE, 8); gtk_widget_show (hbox_autosave); gtk_box_pack_start (GTK_BOX (vbox2), hbox_autosave, FALSE, FALSE, 0); @@ -148,6 +158,7 @@ static void prefs_compose_writing_create_widget(PrefsPage *_page, GtkWindow *win gtk_widget_show (label_autosave_length); gtk_box_pack_start (GTK_BOX (hbox_autosave), label_autosave_length, FALSE, FALSE, 0); + /* Editing: undo level */ hbox_undolevel = gtk_hbox_new (FALSE, 8); gtk_widget_show (hbox_undolevel); gtk_box_pack_start (GTK_BOX (vbox2), hbox_undolevel, FALSE, FALSE, 0); @@ -163,7 +174,31 @@ static void prefs_compose_writing_create_widget(PrefsPage *_page, GtkWindow *win gtk_box_pack_start (GTK_BOX (hbox_undolevel), spinbtn_undolevel, FALSE, FALSE, 0); gtk_widget_set_size_request (spinbtn_undolevel, 64, -1); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_undolevel), TRUE); - + + /* Editing: warn when inserting large files in message body */ + hbox_warn_large_insert = gtk_hbox_new (FALSE, 8); + gtk_widget_show (hbox_warn_large_insert); + gtk_box_pack_start (GTK_BOX (vbox2), hbox_warn_large_insert, FALSE, FALSE, 0); + + PACK_CHECK_BUTTON (hbox_warn_large_insert, checkbtn_warn_large_insert, + _("Warn when inserting in message body a file larger than")); + + spinbtn_warn_large_insert_adj = gtk_adjustment_new (50, 0, 1000, 1, 10, 0); + spinbtn_warn_large_insert_size = gtk_spin_button_new + (GTK_ADJUSTMENT (spinbtn_warn_large_insert_adj), 1, 0); + gtk_widget_set_size_request (spinbtn_warn_large_insert_size, 64, -1); + gtk_widget_show (spinbtn_warn_large_insert_size); + gtk_box_pack_start (GTK_BOX (hbox_warn_large_insert), + spinbtn_warn_large_insert_size, FALSE, FALSE, 0); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_warn_large_insert_size), + TRUE); + + label_warn_large_insert_size = gtk_label_new(_("KB")); + gtk_widget_show (label_warn_large_insert_size); + gtk_box_pack_start (GTK_BOX (hbox_warn_large_insert), + label_warn_large_insert_size, FALSE, FALSE, 0); + + /* Replying */ vbox2 = gtkut_get_options_frame(vbox1, &frame, _("Replying")); PACK_CHECK_BUTTON (vbox2, checkbtn_reply_with_quote, @@ -205,6 +240,9 @@ static void prefs_compose_writing_create_widget(PrefsPage *_page, GtkWindow *win SET_TOGGLE_SENSITIVITY (checkbtn_autosave, spinbtn_autosave_length); SET_TOGGLE_SENSITIVITY (checkbtn_autosave, label_autosave_length); + SET_TOGGLE_SENSITIVITY (checkbtn_warn_large_insert, spinbtn_warn_large_insert_size); + SET_TOGGLE_SENSITIVITY (checkbtn_warn_large_insert, label_warn_large_insert_size); + prefs_writing->checkbtn_autoextedit = checkbtn_autoextedit; @@ -216,6 +254,9 @@ static void prefs_compose_writing_create_widget(PrefsPage *_page, GtkWindow *win prefs_writing->checkbtn_autosave = checkbtn_autosave; prefs_writing->spinbtn_autosave_length = spinbtn_autosave_length; + + prefs_writing->checkbtn_warn_large_insert = checkbtn_warn_large_insert; + prefs_writing->spinbtn_warn_large_insert_size = spinbtn_warn_large_insert_size; prefs_writing->checkbtn_forward_as_attachment = checkbtn_forward_as_attachment; @@ -238,6 +279,10 @@ static void prefs_compose_writing_create_widget(PrefsPage *_page, GtkWindow *win prefs_common.autosave_length); gtk_spin_button_set_value(GTK_SPIN_BUTTON(prefs_writing->spinbtn_undolevel), prefs_common.undolevels); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prefs_writing->checkbtn_warn_large_insert), + prefs_common.warn_large_insert); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(prefs_writing->spinbtn_warn_large_insert_size), + prefs_common.warn_large_insert_size); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prefs_writing->checkbtn_reply_account_autosel), prefs_common.reply_account_autosel); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prefs_writing->checkbtn_forward_account_autosel), @@ -270,6 +315,10 @@ static void prefs_compose_writing_save(PrefsPage *_page) gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(page->spinbtn_autosave_length)); prefs_common.undolevels = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(page->spinbtn_undolevel)); + prefs_common.warn_large_insert = + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_warn_large_insert)); + prefs_common.warn_large_insert_size = + gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(page->spinbtn_warn_large_insert_size)); prefs_common.reply_account_autosel = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_reply_account_autosel));