[evolution] Bug 604346 - Ctrl+Enter sends mail without asking confirmation



commit 70f58975e34348e4b698bb80e0078f93858bbc48
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jun 3 10:44:19 2014 +0200

    Bug 604346 - Ctrl+Enter sends mail without asking confirmation

 composer/e-composer-actions.c                |   77 ++++++++++++++++++++++++++
 composer/mail-composer.error.xml             |    7 ++
 data/org.gnome.evolution.mail.gschema.xml.in |    5 ++
 mail/mail-config.ui                          |   16 +++++
 modules/mail/em-composer-prefs.c             |    6 ++
 5 files changed, 111 insertions(+), 0 deletions(-)
---
diff --git a/composer/e-composer-actions.c b/composer/e-composer-actions.c
index 82315c6..047bf73 100644
--- a/composer/e-composer-actions.c
+++ b/composer/e-composer-actions.c
@@ -22,9 +22,64 @@
 #include "e-composer-actions.h"
 #include "e-composer-private.h"
 
+#include <e-util/e-util.h>
+
 #include <errno.h>
 #include <fcntl.h>
 
+/* because 'composer' is compiled before 'mail' folder */
+static gboolean
+composer_copy_em_utils_prompt_user (GtkWindow *parent,
+                                   const gchar *promptkey,
+                                   const gchar *tag,
+                                   ...)
+{
+       GtkWidget *dialog;
+       GtkWidget *check = NULL;
+       GtkWidget *container;
+       va_list ap;
+       gint button;
+       GSettings *settings;
+       EAlert *alert = NULL;
+
+       settings = g_settings_new ("org.gnome.evolution.mail");
+
+       if (promptkey && !g_settings_get_boolean (settings, promptkey)) {
+               g_object_unref (settings);
+               return TRUE;
+       }
+
+       va_start (ap, tag);
+       alert = e_alert_new_valist (tag, ap);
+       va_end (ap);
+
+       dialog = e_alert_dialog_new (parent, alert);
+       g_object_unref (alert);
+
+       container = e_alert_dialog_get_content_area (E_ALERT_DIALOG (dialog));
+
+       if (promptkey) {
+               check = gtk_check_button_new_with_mnemonic (
+                       _("_Do not show this message again"));
+               gtk_box_pack_start (
+                       GTK_BOX (container), check, FALSE, FALSE, 0);
+               gtk_widget_show (check);
+       }
+
+       button = gtk_dialog_run (GTK_DIALOG (dialog));
+       if (promptkey)
+               g_settings_set_boolean (
+                       settings, promptkey,
+                       !gtk_toggle_button_get_active (
+                               GTK_TOGGLE_BUTTON (check)));
+
+       gtk_widget_destroy (dialog);
+
+       g_object_unref (settings);
+
+       return button == GTK_RESPONSE_YES;
+}
+
 static void
 action_attach_cb (GtkAction *action,
                   EMsgComposer *composer)
@@ -261,6 +316,23 @@ action_smime_sign_cb (GtkToggleAction *action,
        gtkhtml_editor_set_changed (editor, TRUE);
 }
 
+static gboolean
+composer_actions_accel_activate_cb (GtkAccelGroup *accel_group,
+                                   GObject *acceleratable,
+                                   guint keyval,
+                                   GdkModifierType modifier,
+                                   gpointer user_data)
+{
+       EMsgComposer *composer = user_data;
+
+       if (keyval == GDK_KEY_Return && (modifier & GDK_MODIFIER_MASK) == GDK_CONTROL_MASK &&
+           !composer_copy_em_utils_prompt_user (GTK_WINDOW (composer), "prompt-on-accel-send",
+               "mail-composer:prompt-accel-send", NULL)) {
+               return TRUE;
+       }
+       return FALSE;
+}
+
 static GtkActionEntry entries[] = {
 
        { "attach",
@@ -440,6 +512,7 @@ void
 e_composer_actions_init (EMsgComposer *composer)
 {
        GtkActionGroup *action_group;
+       GtkAccelGroup *accel_group;
        GtkUIManager *ui_manager;
        GtkhtmlEditor *editor;
        EWebViewGtkHTML *web_view;
@@ -520,4 +593,8 @@ e_composer_actions_init (EMsgComposer *composer)
 
        gtk_action_set_visible (ACTION (SMIME_ENCRYPT), visible);
        gtk_action_set_visible (ACTION (SMIME_SIGN), visible);
+
+       accel_group = gtk_ui_manager_get_accel_group (ui_manager);
+       g_signal_connect (accel_group, "accel-activate",
+               G_CALLBACK (composer_actions_accel_activate_cb), composer);
 }
diff --git a/composer/mail-composer.error.xml b/composer/mail-composer.error.xml
index 0dcd8d9..0fdf2cd 100644
--- a/composer/mail-composer.error.xml
+++ b/composer/mail-composer.error.xml
@@ -95,4 +95,11 @@
   <_secondary>The message will be saved to your local Outbox folder, because the destination service is 
currently unavailable. You can send the message by clicking the Send/Receive button in Evolution's 
toolbar.</_secondary>
  </error>
 
+ <error id="prompt-accel-send" type="question" default="GTK_RESPONSE_YES">
+  <_primary>Are you sure you want to send the message?</_primary>
+  <_secondary xml:space="preserve">A keyboard accelerator to send the message had been pressed. Either 
cancel message send, if it was done by an accident, or send the message.</_secondary>
+  <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/>
+  <button _label="_Send" response="GTK_RESPONSE_YES"/>
+ </error>
+
 </error-list>
diff --git a/data/org.gnome.evolution.mail.gschema.xml.in b/data/org.gnome.evolution.mail.gschema.xml.in
index e42de28..c1b2e25 100644
--- a/data/org.gnome.evolution.mail.gschema.xml.in
+++ b/data/org.gnome.evolution.mail.gschema.xml.in
@@ -361,6 +361,11 @@
       <default>'quoted'</default>
       <_summary>Default reply style</_summary>
     </key>
+    <key name="prompt-on-accel-send" type="b">
+      <default>true</default>
+      <_summary>Prompt on send when using key accelerator (Ctrl+Enter)</_summary>
+      <_description>Prompt the user when he or she tries to send a message with a key 
accelerator.</_description>
+    </key>
     <key name="prompt-on-empty-subject" type="b">
       <default>true</default>
       <_summary>Prompt on empty subject</_summary>
diff --git a/mail/mail-config.ui b/mail/mail-config.ui
index 4ba1964..ddc5b89 100644
--- a/mail/mail-config.ui
+++ b/mail/mail-config.ui
@@ -998,6 +998,22 @@
                     <property name="position">5</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkCheckButton" id="chkPromptAccelSend">
+                    <property name="label" translatable="yes" comments="This is in the context of: Ask for 
confirmation before...">Sending a message using _key accelerator (Ctrl+Enter)</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="xalign">0.5</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">6</property>
+                  </packing>
+                </child>
               </object>
             </child>
           </object>
diff --git a/modules/mail/em-composer-prefs.c b/modules/mail/em-composer-prefs.c
index 8ef21c4..d5ce340 100644
--- a/modules/mail/em-composer-prefs.c
+++ b/modules/mail/em-composer-prefs.c
@@ -1075,6 +1075,12 @@ em_composer_prefs_construct (EMComposerPrefs *prefs,
                widget, "active",
                G_SETTINGS_BIND_DEFAULT);
 
+       widget = e_builder_get_widget (prefs->builder, "chkPromptAccelSend");
+       g_settings_bind (
+               settings, "prompt-on-accel-send",
+               widget, "active",
+               G_SETTINGS_BIND_DEFAULT);
+
        widget = e_builder_get_widget (prefs->builder, "chkPromptEmptySubject");
        g_settings_bind (
                settings, "prompt-on-empty-subject",


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]