diff options
-rw-r--r-- | plugins/external-editor/ChangeLog | 22 | ||||
-rw-r--r-- | plugins/external-editor/Makefile.am | 24 | ||||
-rw-r--r-- | plugins/external-editor/apps-evolution-external-editor.schemas.in | 16 | ||||
-rw-r--r-- | plugins/external-editor/external-editor.c | 190 | ||||
-rw-r--r-- | plugins/external-editor/org-gnome-external-editor-errors.xml | 14 | ||||
-rw-r--r-- | plugins/external-editor/org-gnome-external-editor.error.xml | 4 | ||||
-rw-r--r-- | po/ChangeLog | 7 | ||||
-rw-r--r-- | po/POTFILES.in | 2 |
8 files changed, 224 insertions, 55 deletions
diff --git a/plugins/external-editor/ChangeLog b/plugins/external-editor/ChangeLog index 4f8996ea79..d49ecb97a4 100644 --- a/plugins/external-editor/ChangeLog +++ b/plugins/external-editor/ChangeLog @@ -1,3 +1,25 @@ +2008-04-17 Sankar P <psankar@novell.com> + + * Makefile.am: + Added new files deleted files not needed. + + * external-editor.c: (convert_to_camel_internet_address), + (ee_editor_command_changed), (e_plugin_lib_get_configure_widget), + (async_external_editor), (show_composer_dialog), + (org_gnome_external_editor): + Leak fixes, Temporary files, Bug fixes and so on. + + * org-gnome-external-editor-errors.xml: + Modified error file for staying aligned with other plugins + + * apps-evolution-external-editor.schemas.in: + Added new file for default schema + + * org-gnome-external-editor.error.xml: + Removed in favor of the other errors file. + + ** Fix for bug #517168 + 2008-02-18 Milan Crha <mcrha@redhat.com> ** Part of fix for bug #515744 diff --git a/plugins/external-editor/Makefile.am b/plugins/external-editor/Makefile.am index beec48dc29..0c7c22ab8b 100644 --- a/plugins/external-editor/Makefile.am +++ b/plugins/external-editor/Makefile.am @@ -13,7 +13,7 @@ INCLUDES = \ @EVO_PLUGIN_RULE@ -error_DATA = org-gnome-external-editor.error +error_DATA = org-gnome-external-editor-errors.xml errordir = $(privdatadir)/errors plugin_DATA = \ @@ -27,12 +27,28 @@ liborg_gnome_external_editor_la_SOURCES = \ liborg_gnome_external_editor_la_LDFLAGS = -module -avoid-version +schemadir = $(GCONF_SCHEMA_FILE_DIR) +schema_in_files = apps-evolution-external-editor.schemas.in +schema_DATA = $(schema_in_files:.schemas.in=.schemas) + +@INTLTOOL_SCHEMAS_RULE@ + +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 + EXTRA_DIST = \ org-gnome-external-editor.eplug.xml \ - org-gnome-external-editor.error.xml \ - org-gnome-external-editor.xml + org-gnome-external-editor-errors.xml \ + org-gnome-external-editor.xml \ + $(schema_in_files) BUILT_SOURCES = org-gnome-external-editor.eplug \ - org-gnome-external-editor.error + $(error_i18n) CLEANFILES = $(BUILT_SOURCES) + +DISTCLEANFILES = $(schema_DATA) diff --git a/plugins/external-editor/apps-evolution-external-editor.schemas.in b/plugins/external-editor/apps-evolution-external-editor.schemas.in new file mode 100644 index 0000000000..0f6d264b90 --- /dev/null +++ b/plugins/external-editor/apps-evolution-external-editor.schemas.in @@ -0,0 +1,16 @@ +<gconfschemafile> + <schemalist> + <schema> + <key>/schemas/apps/evolution/eplugin/external-editor/editor-command</key> + <applyto>/apps/evolution/eplugin/external-editor/editor-command</applyto> + <owner>evolution-mail</owner> + <type>string</type> + <default>gedit</default> + <locale name="C"> + <short>Default External Editor</short> + <long>The default command that must be used as the editor.</long> + </locale> + </schema> + </schemalist> +</gconfschemafile> + diff --git a/plugins/external-editor/external-editor.c b/plugins/external-editor/external-editor.c index b34cb0717d..aaa06d3c73 100644 --- a/plugins/external-editor/external-editor.c +++ b/plugins/external-editor/external-editor.c @@ -9,97 +9,138 @@ #include <mail/em-composer-utils.h> #include <mail/mail-config.h> #include <e-util/e-error.h> - #include <e-msg-composer.h> +#include <glib/gi18n-lib.h> +#include <glib-object.h> +#include <glib.h> +#include <glib/gstdio.h> + #include <sys/stat.h> #include <sys/wait.h> #include <stdlib.h> #include <string.h> -#define d(x) x +#include <gconf/gconf-client.h> -#define TEMPORARY_FILE "/tmp/evolution-composer" +#define d(x) + +#define EDITOR_GCONF_KEY "/apps/evolution/eplugin/external-editor/editor-command" void org_gnome_external_editor (EPlugin *ep, EMMenuTargetSelect *select); +void ee_editor_command_changed (GtkWidget *textbox); +GtkWidget * e_plugin_lib_get_configure_widget (EPlugin *epl); +void async_external_editor (GArray *array); +static gboolean show_composer_dialog (EMsgComposer *composer); /* Utility function to convert an email address to CamelInternetAddress. -May be this should belong to CamelInternetAddress file itself. */ - +May be this should belong to CamelInternetAddress.h file itself. */ static CamelInternetAddress * convert_to_camel_internet_address (char * emails) { CamelInternetAddress *cia = camel_internet_address_new(); gchar **address_tokens = NULL; int i; + d(printf ("\n\aconvert called with : [%s] \n\a", emails)); + + emails = g_strstrip (emails); + if (emails && strlen (emails) > 1) { address_tokens = g_strsplit (emails, ",", 0); if (address_tokens) { - for (i = 1; address_tokens[i]; ++i) { + for (i = 0; address_tokens[i]; ++i) { camel_internet_address_add (cia, " ", address_tokens [i]); d(printf ("\nAdding camel_internet_address[%s] \n", address_tokens [i])); } g_strfreev (address_tokens); + g_free (emails); return cia; } } camel_object_unref (cia); + g_free (emails); return NULL; } -void org_gnome_external_editor (EPlugin *ep, EMMenuTargetSelect *select) +void ee_editor_command_changed (GtkWidget *textbox) { - d(printf ("\n\nexternal_editor plugin is launched \n\n")); + const char *editor; + GConfClient *gconf; + + editor = gtk_entry_get_text (GTK_ENTRY(textbox)); + d(printf ("\n\aeditor is : [%s] \n\a", editor)); + + /* gconf access for every key-press. Sucky ? */ + gconf = gconf_client_get_default (); + gconf_client_set_string (gconf, EDITOR_GCONF_KEY, editor, NULL); + g_object_unref (gconf); +} - /* The template to be used in the external editor */ - char template[] = "###|||Insert , seperated TO addresses below this line. Do not delete this line. Optional field\n\n###||| Insert , seperated CC addresses below this line. Do not delete this line. Optional field\n\n###|||Insert , seperated BCC addresses below this line. Do not delete this line. Optional field\n\n###|||Insert SUBJECT below this line. Do not delete this line. Optional field\n\n###|||Insert BODY of mail below this line. Do not delete this line.\n\n"; +GtkWidget * +e_plugin_lib_get_configure_widget (EPlugin *epl) +{ + GtkWidget *vbox, *textbox, *label, *help; + GConfClient *gconf; + char *editor; + vbox = gtk_vbox_new (FALSE, 10); + textbox = gtk_entry_new (); + label = gtk_label_new (_("Command to be executed to launch the editor: ")); + help = gtk_label_new (_("For Emacs use \"xemacs\"\nFor VI use \"gvim\"")); + gconf = gconf_client_get_default (); - /* Push the template contents to the intermediate file */ - g_file_set_contents (TEMPORARY_FILE, template, strlen (template), NULL); + editor = gconf_client_get_string (gconf, EDITOR_GCONF_KEY, NULL); + if (editor) { + gtk_entry_set_text (GTK_ENTRY(textbox), editor); + g_free (editor); + } + g_object_unref (gconf); - char *editor; + gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), textbox, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), help, FALSE, FALSE, 0); - editor = (char *) g_getenv ("EDITOR"); - if (!editor) - editor = "gvim"; + g_signal_connect (textbox, "changed", G_CALLBACK(ee_editor_command_changed), textbox); + + gtk_widget_show_all (vbox); + return vbox; +} -#if 1 +void +async_external_editor (GArray *array) +{ + char *filename = NULL; + gchar *argv[5]; int status = 0; - gchar *argv[4]; - - argv[0] = editor; - /* README: The -- params should come via the "Configure" option */ - argv[1] = "--nofork"; + argv[0] = g_array_index (array, gpointer, 0); + argv[1] = g_array_index (array, gpointer, 1); + argv[2] = NULL; - argv[2] = TEMPORARY_FILE; - argv[3] = NULL; + filename = g_strdup (argv[1]); - /* FIXME: I guess NULL should do fine instead of /usr/bin */ - if (!g_spawn_sync ("/usr/bin", argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &status, NULL)) + if (!g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, &status, NULL)) { g_warning ("Unable to launch %s: ", argv[0]); + e_error_run (NULL, "org.gnome.evolution.plugins.external-editor:editor-not-launchable", NULL); + g_free (filename); return ; } - + if (WEXITSTATUS (status) != 0) { d(printf ("\n\nsome problem here with external editor\n\n")); return ; } else { - gchar *buf; CamelMimeMessage *message; EMsgComposer *composer; message = camel_mime_message_new (); - d(printf ("\n\nexternal editor works like a charm \n\n")); - - if (g_file_get_contents (TEMPORARY_FILE, &buf, NULL, NULL)) { + if (g_file_get_contents (filename, &buf, NULL, NULL)) { gchar **tokens; int i, j; @@ -114,42 +155,97 @@ void org_gnome_external_editor (EPlugin *ep, EMMenuTargetSelect *select) if (tokens[i][j] == '\n') tokens[i][j] = ' '; - g_strchug(tokens[i]); - d(printf ("\nstripped off token[%d] is : %s \n", i, tokens[i])); } - camel_mime_message_set_recipients (message, "To", convert_to_camel_internet_address(tokens[1])); - camel_mime_message_set_recipients (message, "Cc", convert_to_camel_internet_address(tokens[2])); - camel_mime_message_set_recipients (message, "Bcc", convert_to_camel_internet_address(tokens[3])); - + camel_mime_message_set_recipients (message, "To", convert_to_camel_internet_address(g_strchug(g_strdup(tokens[1])))); + camel_mime_message_set_recipients (message, "Cc", convert_to_camel_internet_address(g_strchug(g_strdup(tokens[2])))); + camel_mime_message_set_recipients (message, "Bcc", convert_to_camel_internet_address(g_strchug(g_strdup(tokens[3])))); camel_mime_message_set_subject (message, tokens[4]); - camel_mime_part_set_content ((CamelMimePart *)message, tokens [5], strlen (tokens [5]), "text/plain"); /* FIXME: We need to make mail-remote working properly. So that we neednot invoke composer widget at all. + May be we can do it now itself by invoking local CamelTransport. But all that is not needed for the first release. + + People might want to format mails using their editor (80 cols width etc.) + But might want to use evolution addressbook for auto-completion etc. + So starting the composer window anyway. */ composer = e_msg_composer_new_with_message (message); g_signal_connect (GTK_OBJECT (composer), "send", G_CALLBACK (em_utils_composer_send_cb), NULL); - g_signal_connect (GTK_OBJECT (composer), "save-draft", G_CALLBACK (em_utils_composer_save_draft_cb), NULL); - - gtk_widget_show (GTK_WIDGET (composer)); + + /* Composer cannot be shown in any random thread. Should happen in main thread */ + g_idle_add ((GSourceFunc) show_composer_dialog, composer); g_strfreev (tokens); + + /* We no longer need that temporary file */ + g_remove (filename); + g_free (filename); } } -#else - char *query; +} - query = g_strdup_printf ("%s /tmp/evolution-composer", editor); - system (query); - g_free (query); +static gboolean +show_composer_dialog (EMsgComposer *composer) +{ + gtk_widget_show (GTK_WIDGET(composer)); + return FALSE; +} -#endif +void org_gnome_external_editor (EPlugin *ep, EMMenuTargetSelect *select) +{ + d(printf ("\n\nexternal_editor plugin is launched \n\n")); + + /* The template to be used in the external editor */ + + /* README: I have not marked this for translation. + As I might change this string to make it more meaningful and friendlier based on feedback. */ + + char template[] = "###|||Insert , seperated TO addresses below this line. Do not edit or delete this line. Optional field\n\n###||| Insert , seperated CC addresses below this line. Do not edit or delete this line. Optional field\n\n###|||Insert , seperated BCC addresses below this line. Do not edit or delete this line. Optional field\n\n###|||Insert SUBJECT below this line. Do not edit or delete this line. Optional field\n\n###|||Insert BODY of mail below this line. Do not edit or delete this line.\n\n"; + + gint fd; + char *filename = NULL; + + fd = g_file_open_tmp (NULL, &filename, NULL); + if (fd > 0) { + close (fd); + /* Push the template contents to the intermediate file */ + g_file_set_contents (filename, template, strlen (template), NULL); + d(printf ("\n\aTemporary-file Name is : [%s] \n\a", filename)); + } else { + g_warning ("Temporary file fd is null"); + e_error_run (NULL, "org.gnome.evolution.plugins.external-editor:no-temp-file", NULL); + return ; + } + + char *editor = NULL; + GConfClient *gconf; + + gconf = gconf_client_get_default (); + editor = gconf_client_get_string (gconf, EDITOR_GCONF_KEY, NULL); + if (!editor) { + + if (! (editor = g_strdup(g_getenv ("EDITOR"))) ) + /* Make gedit the default external editor, + if the default schemas are not installed + and no $EDITOR is set. */ + editor = g_strdup("gedit"); + } + g_object_unref (gconf); + + GArray *array; + array = g_array_sized_new (TRUE, TRUE, sizeof (gpointer), 2 * sizeof(gpointer)); + array = g_array_append_val (array, editor); + array = g_array_append_val (array, filename); + + g_thread_create ( (GThreadFunc) async_external_editor, array, FALSE, NULL); + + return ; } diff --git a/plugins/external-editor/org-gnome-external-editor-errors.xml b/plugins/external-editor/org-gnome-external-editor-errors.xml new file mode 100644 index 0000000000..c6f0bebfa3 --- /dev/null +++ b/plugins/external-editor/org-gnome-external-editor-errors.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<error-list domain="org.gnome.evolution.plugins.external-editor"> + + <error id="editor-not-launchable" type="error"> + <_primary>Editor not launchable</_primary> + <_secondary>The external editor set in your plugin preferences cannot be launched. Try setting a different editor.</_secondary> + </error> + + <error id="no-temp-file" type="error"> + <_primary>Cannot create Temporary File</_primary> + <_secondary>Evolution is unable to create a temporary file to save your mail. Retry later.</_secondary> + </error> + +</error-list> diff --git a/plugins/external-editor/org-gnome-external-editor.error.xml b/plugins/external-editor/org-gnome-external-editor.error.xml deleted file mode 100644 index 05fbca60e9..0000000000 --- a/plugins/external-editor/org-gnome-external-editor.error.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<error-list domain="org.gnome.external-editor"> - -</error-list> diff --git a/po/ChangeLog b/po/ChangeLog index 47458818eb..4a5e192da0 100644 --- a/po/ChangeLog +++ b/po/ChangeLog @@ -1,3 +1,10 @@ +2008-04-17 Sankar P <psankar@novell.com> + + * POTFILES.in: + Updated file-list for external-editor plugin. + + ** See bug #517168 + 2008-04-16 Stanislav Brabec <sbrabec@hammer.suse.cz> * cs.po: Typo fix. diff --git a/po/POTFILES.in b/po/POTFILES.in index d72cfae6cb..7c0171f99f 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -317,7 +317,9 @@ plugins/exchange-operations/org-gnome-exchange-tasks-subscription.xml plugins/exchange-operations/org-gnome-folder-permissions.xml plugins/exchange-operations/org-gnome-folder-subscription.xml plugins/external-editor/org-gnome-external-editor.eplug.xml +plugins/external-editor/org-gnome-external-editor-errors.xml plugins/external-editor/org-gnome-external-editor.xml +plugins/external-editor/external-editor.c plugins/face/face.c plugins/face/org-gnome-face-ui.xml plugins/face/org-gnome-face.eplug.xml |