aboutsummaryrefslogtreecommitdiffstats
path: root/modules/mailto-handler
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@redhat.com>2010-05-13 21:17:25 +0800
committerMatthew Barnes <mbarnes@redhat.com>2010-05-13 21:21:21 +0800
commit0b60ec7c89f99eaf4ac8c655ed953d705cf034c3 (patch)
treecc4f3690a5a392e83be82f392a4420456d9204df /modules/mailto-handler
parent801c425ada572a88375a44e91745799d65539495 (diff)
downloadgsoc2013-evolution-0b60ec7c89f99eaf4ac8c655ed953d705cf034c3.tar.gz
gsoc2013-evolution-0b60ec7c89f99eaf4ac8c655ed953d705cf034c3.tar.zst
gsoc2013-evolution-0b60ec7c89f99eaf4ac8c655ed953d705cf034c3.zip
Convert "default-mailer" plugin to an extension.
Diffstat (limited to 'modules/mailto-handler')
-rw-r--r--modules/mailto-handler/Makefile.am54
-rw-r--r--modules/mailto-handler/apps-evolution-mail-prompts-checkdefault.schemas.in16
-rw-r--r--modules/mailto-handler/evolution-mailto-handler.c274
3 files changed, 344 insertions, 0 deletions
diff --git a/modules/mailto-handler/Makefile.am b/modules/mailto-handler/Makefile.am
new file mode 100644
index 0000000000..8e61f34693
--- /dev/null
+++ b/modules/mailto-handler/Makefile.am
@@ -0,0 +1,54 @@
+module_LTLIBRARIES = libevolution-module-mailto-handler.la
+
+libevolution_module_mailto_handler_la_CPPFLAGS = \
+ $(AM_CPPFLAGS) \
+ -I$(top_srcdir) \
+ -DG_LOG_DOMAIN=\"evolution-mailto-handler\" \
+ $(GNOME_PLATFORM_CFLAGS)
+
+libevolution_module_mailto_handler_la_SOURCES = \
+ evolution-mailto-handler.c
+
+libevolution_module_mailto_handler_la_LIBADD = \
+ $(top_builddir)/e-util/libeutil.la \
+ $(top_builddir)/shell/libeshell.la \
+ $(GNOME_PLATFORM_LIBS)
+
+libevolution_module_mailto_handler_la_LDFLAGS = \
+ -module -avoid-version $(NO_UNDEFINED)
+
+schemadir = $(GCONF_SCHEMA_FILE_DIR)
+schema_in_files = apps-evolution-mail-prompts-checkdefault.schemas.in
+schema_DATA = $(schema_in_files:.schemas.in=.schemas)
+
+@INTLTOOL_SCHEMAS_RULE@
+
+if GCONF_SCHEMAS_INSTALL
+
+if OS_WIN32
+install-data-local:
+ if test -z "$(DESTDIR)" ; then \
+ for p in $(schema_DATA) ; do \
+ (echo set GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE); \
+ echo $(GCONFTOOL) --makefile-install-rule $$p) >_temp.bat; \
+ cmd /c _temp.bat; \
+ rm _temp.bat; \
+ done \
+ fi
+else
+install-data-local:
+ if test -z "$(DESTDIR)" ; then \
+ for p in $(schema_DATA) ; do \
+ GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \
+ $(GCONFTOOL) --makefile-install-rule $$p; \
+ done \
+ fi
+endif
+
+endif
+
+EXTRA_DIST = $(schema_in_files)
+
+DISTCLEANFILES = $(schema_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/modules/mailto-handler/apps-evolution-mail-prompts-checkdefault.schemas.in b/modules/mailto-handler/apps-evolution-mail-prompts-checkdefault.schemas.in
new file mode 100644
index 0000000000..cdcaf7892a
--- /dev/null
+++ b/modules/mailto-handler/apps-evolution-mail-prompts-checkdefault.schemas.in
@@ -0,0 +1,16 @@
+<gconfschemafile>
+ <schemalist>
+ <schema>
+ <key>/schemas/apps/evolution/mail/prompts/checkdefault</key>
+ <applyto>/apps/evolution/mail/prompts/checkdefault</applyto>
+ <owner>evolution-mail</owner>
+ <type>bool</type>
+ <default>true</default>
+ <locale name="C">
+ <short>Check whether Evolution is the default mailer</short>
+ <long>Every time Evolution starts, check whether or not it is the default mailer.</long>
+ </locale>
+ </schema>
+ </schemalist>
+</gconfschemafile>
+
diff --git a/modules/mailto-handler/evolution-mailto-handler.c b/modules/mailto-handler/evolution-mailto-handler.c
new file mode 100644
index 0000000000..076f2e0686
--- /dev/null
+++ b/modules/mailto-handler/evolution-mailto-handler.c
@@ -0,0 +1,274 @@
+/*
+ * evolution-mailto-handler.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#include <config.h>
+#include <glib/gi18n-lib.h>
+
+#include <shell/e-shell.h>
+#include <e-util/e-binding.h>
+#include <e-util/e-extension.h>
+
+/* Standard GObject macros */
+#define E_TYPE_MAILTO_HANDLER \
+ (e_mailto_handler_get_type ())
+#define E_MAILTO_HANDLER(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), E_TYPE_MAILTO_HANDLER, EMailtoHandler))
+
+#define MAILTO_COMMAND \
+ "evolution --component=mail %s"
+
+typedef struct _EMailtoHandler EMailtoHandler;
+typedef struct _EMailtoHandlerClass EMailtoHandlerClass;
+
+struct _EMailtoHandler {
+ EExtension parent;
+};
+
+struct _EMailtoHandlerClass {
+ EExtensionClass parent_class;
+};
+
+/* Module Entry Points */
+void e_module_load (GTypeModule *type_module);
+void e_module_unload (GTypeModule *type_module);
+
+/* Forward Declarations */
+GType e_mailto_handler_get_type (void);
+
+G_DEFINE_DYNAMIC_TYPE (EMailtoHandler, e_mailto_handler, E_TYPE_EXTENSION)
+
+static EShell *
+mailto_handler_get_shell (EMailtoHandler *extension)
+{
+ EExtensible *extensible;
+
+ extensible = e_extension_get_extensible (E_EXTENSION (extension));
+
+ return E_SHELL (extensible);
+}
+
+static gboolean
+mailto_handler_is_evolution (const gchar *mailto_command)
+{
+ gint argc;
+ gchar **argv;
+ gchar *basename;
+ gboolean is_evolution;
+
+ if (mailto_command == NULL)
+ return FALSE;
+
+ /* Tokenize the mailto command. */
+ if (!g_shell_parse_argv (mailto_command, &argc, &argv, NULL))
+ return FALSE;
+
+ g_return_val_if_fail (argc > 0, FALSE);
+
+ /* Check the basename of the first token. */
+ basename = g_path_get_basename (argv[0]);
+ is_evolution = g_str_has_prefix (basename, "evolution");
+ g_free (basename);
+
+ g_strfreev (argv);
+
+ return is_evolution;
+}
+
+static gboolean
+mailto_handler_prompt (EMailtoHandler *extension)
+{
+ EShell *shell;
+ EShellSettings *shell_settings;
+ GtkWidget *container;
+ GtkWidget *dialog;
+ GtkWidget *widget;
+ const gchar *text;
+ gchar *markup;
+ gint response;
+
+ shell = mailto_handler_get_shell (extension);
+ shell_settings = e_shell_get_shell_settings (shell);
+
+ dialog = gtk_dialog_new_with_buttons (
+ "", NULL, 0,
+ GTK_STOCK_NO, GTK_RESPONSE_NO,
+ GTK_STOCK_YES, GTK_RESPONSE_YES,
+ NULL);
+
+ gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+
+ container = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+
+ widget = gtk_hbox_new (FALSE, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (widget), 5);
+ gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0);
+ gtk_widget_show (widget);
+
+ container = widget;
+
+ widget = gtk_image_new_from_stock (
+ GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
+ gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+ gtk_widget_show (widget);
+
+ widget = gtk_vbox_new (FALSE, 12);
+ gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0);
+ gtk_widget_show (widget);
+
+ container = widget;
+
+ text = _("Do you want to make Evolution your default email client?");
+ markup = g_markup_printf_escaped ("<b>%s</b>", text);
+ widget = gtk_label_new (NULL);
+ gtk_label_set_markup (GTK_LABEL (widget), markup);
+ gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+ gtk_widget_show (widget);
+ g_free (markup);
+
+ text = _("_Do not show this message again");
+ widget = gtk_check_button_new_with_mnemonic (text);
+ gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 12);
+ gtk_widget_show (widget);
+
+ e_mutual_binding_new_with_negation (
+ shell_settings, "mailto-handler-check",
+ widget, "active");
+
+ /* Direct input focus away from the checkbox. */
+ widget = gtk_dialog_get_widget_for_response (
+ GTK_DIALOG (dialog), GTK_RESPONSE_YES);
+ gtk_widget_grab_focus (widget);
+
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+ gtk_widget_destroy (dialog);
+
+ return (response == GTK_RESPONSE_YES);
+}
+
+static void
+mailto_handler_check (EMailtoHandler *extension)
+{
+ EShell *shell;
+ EShellSettings *shell_settings;
+ gboolean check_mailto_handler = TRUE;
+ gchar *mailto_command = NULL;
+
+ shell = mailto_handler_get_shell (extension);
+ shell_settings = e_shell_get_shell_settings (shell);
+
+ g_object_get (
+ shell_settings,
+ "mailto-handler-command", &mailto_command,
+ "mailto-handler-check", &check_mailto_handler,
+ NULL);
+
+ /* Should we check the "mailto" URI handler? */
+ if (!check_mailto_handler)
+ goto exit;
+
+ /* Is Evolution already handling "mailto" URIs? */
+ if (mailto_handler_is_evolution (mailto_command))
+ goto exit;
+
+ /* Does the user want Evolution to handle them? */
+ if (!mailto_handler_prompt (extension))
+ goto exit;
+
+ /* Configure Evolution to be the "mailto" URI handler. */
+
+ g_object_set (
+ shell_settings,
+ "mailto-handler-command", MAILTO_COMMAND,
+ "mailto-handler-enabled", TRUE,
+ "mailto-handler-needs-terminal", FALSE,
+ NULL);
+
+exit:
+ g_free (mailto_command);
+}
+
+static void
+mailto_handler_constructed (GObject *object)
+{
+ EShell *shell;
+ EShellSettings *shell_settings;
+ EMailtoHandler *extension;
+
+ extension = E_MAILTO_HANDLER (object);
+
+ shell = mailto_handler_get_shell (extension);
+ shell_settings = e_shell_get_shell_settings (shell);
+
+ e_shell_settings_install_property_for_key (
+ "mailto-handler-check",
+ "/apps/evolution/mail/prompts/checkdefault");
+
+ e_shell_settings_install_property_for_key (
+ "mailto-handler-command",
+ "/desktop/gnome/url-handlers/mailto/command");
+
+ e_shell_settings_install_property_for_key (
+ "mailto-handler-enabled",
+ "/desktop/gnome/url-handlers/mailto/enabled");
+
+ e_shell_settings_install_property_for_key (
+ "mailto-handler-needs-terminal",
+ "/desktop/gnome/url-handlers/mailto/needs_terminal");
+
+ g_signal_connect_swapped (
+ shell, "event::ready-to-start",
+ G_CALLBACK (mailto_handler_check), extension);
+}
+
+static void
+e_mailto_handler_class_init (EMailtoHandlerClass *class)
+{
+ GObjectClass *object_class;
+ EExtensionClass *extension_class;
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->constructed = mailto_handler_constructed;
+
+ extension_class = E_EXTENSION_CLASS (class);
+ extension_class->extensible_type = E_TYPE_SHELL;
+}
+
+static void
+e_mailto_handler_class_finalize (EMailtoHandlerClass *class)
+{
+}
+
+static void
+e_mailto_handler_init (EMailtoHandler *extension)
+{
+}
+
+G_MODULE_EXPORT void
+e_module_load (GTypeModule *type_module)
+{
+ e_mailto_handler_register_type (type_module);
+}
+
+G_MODULE_EXPORT void
+e_module_unload (GTypeModule *type_module)
+{
+}