diff options
author | Dan Winship <danw@src.gnome.org> | 2001-07-10 00:37:04 +0800 |
---|---|---|
committer | Dan Winship <danw@src.gnome.org> | 2001-07-10 00:37:04 +0800 |
commit | a9c8e8d5946c6c39c4d07b96ed04a414e67bd9cb (patch) | |
tree | 534a4d807849cde75857ba095446b695a7a61fbb /mail/mail-display.c | |
parent | 08879c382da0f592c9521ade17ccb2f0f8d9597d (diff) | |
download | gsoc2013-evolution-a9c8e8d5946c6c39c4d07b96ed04a414e67bd9cb.tar.gz gsoc2013-evolution-a9c8e8d5946c6c39c4d07b96ed04a414e67bd9cb.tar.zst gsoc2013-evolution-a9c8e8d5946c6c39c4d07b96ed04a414e67bd9cb.zip |
Use gnome_vfs_mime_get_short_list_applications rather than
* 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.
svn path=/trunk/; revision=10916
Diffstat (limited to 'mail/mail-display.c')
-rw-r--r-- | mail/mail-display.c | 99 |
1 files changed, 65 insertions, 34 deletions
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"); |