aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mail/ChangeLog14
-rw-r--r--mail/mail-display.c99
-rw-r--r--mail/mail-format.c6
-rw-r--r--mail/mail.h2
4 files changed, 83 insertions, 38 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog
index e42406d883..a361c91365 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,17 @@
+2001-07-09 Dan Winship <danw@ximian.com>
+
+ * mail-format.c (mail_lookup_handler): Use
+ gnome_vfs_mime_get_short_list_applications rather than
+ gnome_vfs_mime_get_default_application.
+
+ * mail-display.c (pixmap_press): Construct the EPopupMenu array on
+ the fly, based on the number of applications available to open the
+ MIME type.
+ (launch_cb): Figure out which menu item was clicked, and invoke
+ the appropriate application. Ugh, messy, because of the EPopupMenu
+ interface. Probably should get rewritten some day. Also, make this
+ handle apps with expects_uris set too.
+
2001-07-09 Peter Williams <peterw@ximian.com>
* mail-config.c (mail_config_write): Change html_signature stuff over
diff --git a/mail/mail-display.c b/mail/mail-display.c
index 780ba43034..ec7e393415 100644
--- a/mail/mail-display.c
+++ b/mail/mail-display.c
@@ -243,16 +243,25 @@ static void
launch_cb (GtkWidget *widget, gpointer user_data)
{
CamelMimePart *part = gtk_object_get_data (user_data, "CamelMimePart");
+ MailMimeHandler *handler;
+ GList *apps, *children, *c;
GnomeVFSMimeApplication *app;
- CamelContentType *content_type;
- char *mime_type, *tmpl, *tmpdir, *filename, *argv[2];
+ char *tmpl, *tmpdir, *filename, *url, *argv[2];
+
+ handler = mail_lookup_handler (gtk_object_get_data (user_data, "mime_type"));
+ g_return_if_fail (handler != NULL && handler->applications != NULL);
- content_type = camel_mime_part_get_content_type (part);
- mime_type = header_content_type_simple (content_type);
- app = gnome_vfs_mime_get_default_application (mime_type);
- g_free (mime_type);
+ /* Yum. Too bad EPopupMenu doesn't allow per-item closures. */
+ children = gtk_container_children (GTK_CONTAINER (widget->parent));
+ g_return_if_fail (children != NULL && children->next != NULL && children->next->next != NULL);
- g_return_if_fail (app != NULL);
+ for (c = children->next->next, apps = handler->applications; c && apps; c = c->next, apps = apps->next) {
+ if (c->data == widget)
+ break;
+ }
+ g_list_free (children);
+ g_return_if_fail (c != NULL && apps != NULL);
+ app = apps->data;
tmpl = g_strdup ("/tmp/evolution.XXXXXX");
#ifdef HAVE_MKDTEMP
@@ -282,6 +291,12 @@ launch_cb (GtkWidget *widget, gpointer user_data)
return;
}
+ if (app->expects_uris == GNOME_VFS_MIME_APPLICATION_ARGUMENT_TYPE_URIS) {
+ url = g_strdup_printf ("file:%s", filename);
+ g_free (filename);
+ filename = url;
+ }
+
argv[0] = app->command;
argv[1] = filename;
@@ -326,18 +341,16 @@ button_press (GtkWidget *widget, CamelMimePart *part)
static gboolean
pixmap_press (GtkWidget *widget, GdkEventButton *event, EScrollFrame *user_data)
{
- EPopupMenu menu[] = {
- { N_("Save to Disk..."), NULL,
- GTK_SIGNAL_FUNC (save_cb), NULL, 0 },
- { N_("Open in %s..."), NULL,
- GTK_SIGNAL_FUNC (launch_cb), NULL, 1 },
- { N_("View Inline"), NULL,
- GTK_SIGNAL_FUNC (inline_cb), NULL, 2 },
- { NULL, NULL, NULL, 0 }
- };
+ EPopupMenu *menu;
+ EPopupMenu save_item = { N_("Save to Disk..."), NULL,
+ GTK_SIGNAL_FUNC (save_cb), NULL, 0 };
+ EPopupMenu view_item = { N_("View Inline"), NULL,
+ GTK_SIGNAL_FUNC (inline_cb), NULL, 2 };
+ EPopupMenu open_item = { N_("Open in %s..."), NULL,
+ GTK_SIGNAL_FUNC (launch_cb), NULL, 1 };
CamelMimePart *part;
MailMimeHandler *handler;
- int mask = 0;
+ int mask = 0, i, nitems;
#ifdef USE_OLD_DISPLAY_STYLE
if (event->button != 3) {
@@ -357,20 +370,18 @@ pixmap_press (GtkWidget *widget, GdkEventButton *event, EScrollFrame *user_data)
handler = mail_lookup_handler (gtk_object_get_data (GTK_OBJECT (widget),
"mime_type"));
+ if (handler && handler->applications)
+ nitems = g_list_length (handler->applications) + 2;
+ else
+ nitems = 3;
+ menu = g_new0 (EPopupMenu, nitems + 1);
+
/* Save item */
+ memcpy (&menu[0], &save_item, sizeof (menu[0]));
menu[0].name = _(menu[0].name);
- /* External view item */
- if (handler && handler->application) {
- menu[1].name = g_strdup_printf (_(menu[1].name),
- handler->application->name);
- } else {
- menu[1].name = g_strdup_printf (_(menu[1].name),
- _("External Viewer"));
- mask |= 1;
- }
-
/* Inline view item */
+ memcpy (&menu[1], &view_item, sizeof (menu[1]));
if (handler && handler->builtin) {
if (!mail_part_is_inline (part)) {
if (handler->component) {
@@ -388,20 +399,41 @@ pixmap_press (GtkWidget *widget, GdkEventButton *event, EScrollFrame *user_data)
name = prop->v._u.value_string;
else
name = "bonobo";
- menu[2].name = g_strdup_printf (
+ menu[1].name = g_strdup_printf (
_("View Inline (via %s)"), name);
} else
- menu[2].name = g_strdup (_(menu[2].name));
+ menu[1].name = g_strdup (_(menu[1].name));
} else
- menu[2].name = g_strdup (_("Hide"));
+ menu[1].name = g_strdup (_("Hide"));
} else {
- menu[2].name = g_strdup (_(menu[2].name));
+ menu[1].name = g_strdup (_(menu[1].name));
mask |= 2;
}
+ /* External views */
+ if (handler && handler->applications) {
+ GnomeVFSMimeApplication *app;
+ GList *apps;
+ int i;
+
+ apps = handler->applications;
+ for (i = 2; i < nitems; i++, apps = apps->next) {
+ app = apps->data;
+ memcpy (&menu[i], &open_item, sizeof (menu[i]));
+ menu[i].name = g_strdup_printf (_(menu[i].name), app->name);
+ }
+ } else {
+ memcpy (&menu[2], &open_item, sizeof (menu[2]));
+ menu[2].name = g_strdup_printf (_(menu[2].name),
+ _("External Viewer"));
+ mask |= 1;
+ }
+
e_popup_menu_run (menu, (GdkEvent *)event, mask, 0, widget);
- g_free (menu[1].name);
- g_free (menu[2].name);
+
+ for (i = 1; i < nitems; i++)
+ g_free (menu[i].name);
+ g_free (menu);
return TRUE;
}
@@ -674,7 +706,6 @@ static void *
save_url (MailDisplay *md, const char *url)
{
GHashTable *urls;
- GByteArray *ba;
CamelMimePart *part;
urls = g_datalist_get_data (md->data, "part_urls");
diff --git a/mail/mail-format.c b/mail/mail-format.c
index 517d0b7595..e9291e7bf5 100644
--- a/mail/mail-format.c
+++ b/mail/mail-format.c
@@ -395,8 +395,8 @@ mail_lookup_handler (const char *mime_type)
* register it.
*/
handler = g_new0 (MailMimeHandler, 1);
- handler->application =
- gnome_vfs_mime_get_default_application (mime_type);
+ handler->applications =
+ gnome_vfs_mime_get_short_list_applications (mime_type);
handler->builtin =
g_hash_table_lookup (mime_function_table, mime_type);
@@ -439,7 +439,7 @@ mail_lookup_handler (const char *mime_type)
}
/* If we at least got an application, use that. */
- if (handler->application) {
+ if (handler->applications) {
handler->generic = TRUE;
goto reg;
}
diff --git a/mail/mail.h b/mail/mail.h
index 18108c7293..f9bcdc7d79 100644
--- a/mail/mail.h
+++ b/mail/mail.h
@@ -48,7 +48,7 @@ typedef gboolean (*MailMimeHandlerFn) (CamelMimePart *part,
typedef struct {
gboolean generic;
OAF_ServerInfo *component;
- GnomeVFSMimeApplication *application;
+ GList *applications;
MailMimeHandlerFn builtin;
} MailMimeHandler;
MailMimeHandler *mail_lookup_handler (const char *mime_type);