From 0b60ec7c89f99eaf4ac8c655ed953d705cf034c3 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 13 May 2010 09:17:25 -0400 Subject: Convert "default-mailer" plugin to an extension. --- modules/Makefile.am | 1 + modules/mailto-handler/Makefile.am | 54 ++++ ...-evolution-mail-prompts-checkdefault.schemas.in | 16 ++ modules/mailto-handler/evolution-mailto-handler.c | 274 +++++++++++++++++++++ 4 files changed, 345 insertions(+) create mode 100644 modules/mailto-handler/Makefile.am create mode 100644 modules/mailto-handler/apps-evolution-mail-prompts-checkdefault.schemas.in create mode 100644 modules/mailto-handler/evolution-mailto-handler.c (limited to 'modules') diff --git a/modules/Makefile.am b/modules/Makefile.am index 718cba2fa4..3920b51189 100644 --- a/modules/Makefile.am +++ b/modules/Makefile.am @@ -22,6 +22,7 @@ SUBDIRS = \ addressbook \ calendar \ mail \ + mailto-handler \ plugin-lib \ $(MONO_DIR) \ $(PYTHON_DIR) \ 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 @@ + + + + /schemas/apps/evolution/mail/prompts/checkdefault + /apps/evolution/mail/prompts/checkdefault + evolution-mail + bool + true + + Check whether Evolution is the default mailer + Every time Evolution starts, check whether or not it is the default mailer. + + + + + 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 + * + */ + +#include +#include + +#include +#include +#include + +/* 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 ("%s", 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) +{ +} -- cgit v1.2.3