From 85c366bda9f25b1249ba8333604eb3e757bc6edf Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Mon, 26 Sep 2005 10:28:48 +0000 Subject: Implement launch links. Delegate external link opening to the window. 2005-09-26 Marco Pesenti Gritti * backend/ev-link.c: (ev_link_type_get_type), (ev_link_get_filename), (ev_link_get_params), (ev_link_get_property), (ev_link_set_property), (ev_window_dispose), (ev_link_class_init), (ev_link_new_launch): * backend/ev-link.h: * pdf/ev-poppler.cc: * shell/ev-view.c: (ev_view_goto_link), (ev_view_class_init): * shell/ev-window.c: (launch_link), (view_external_link_cb), (ev_window_init): Implement launch links. Delegate external link opening to the window. --- (limited to 'shell') diff --git a/shell/ev-view.c b/shell/ev-view.c index c5cc503..15bd412 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -60,6 +60,7 @@ enum { enum { SIGNAL_BINDING_ACTIVATED, SIGNAL_ZOOM_INVALID, + SIGNAL_EXTERNAL_LINK, N_SIGNALS, }; @@ -188,6 +189,8 @@ struct _EvViewClass { GtkScrollType scroll, gboolean horizontal); void (*zoom_invalid) (EvView *view); + void (*external_link) (EvView *view, + EvLink *link); }; /*** Scrolling ***/ @@ -1234,7 +1237,6 @@ void ev_view_goto_link (EvView *view, EvLink *link) { EvLinkType type; - const char *uri; int page; type = ev_link_get_link_type (link); @@ -1262,8 +1264,8 @@ ev_view_goto_link (EvView *view, EvLink *link) goto_xyz_link (view, link); break; case EV_LINK_TYPE_EXTERNAL_URI: - uri = ev_link_get_uri (link); - gnome_vfs_url_show (uri); + case EV_LINK_TYPE_LAUNCH: + g_signal_emit (view, signals[SIGNAL_EXTERNAL_LINK], 0, link); break; } } @@ -2288,6 +2290,14 @@ ev_view_class_init (EvViewClass *class) NULL, NULL, ev_marshal_VOID__VOID, G_TYPE_NONE, 0, G_TYPE_NONE); + signals[SIGNAL_EXTERNAL_LINK] = g_signal_new ("external-link", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (EvViewClass, external_link), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + G_TYPE_OBJECT); g_object_class_install_property (object_class, PROP_STATUS, diff --git a/shell/ev-window.c b/shell/ev-window.c index 5abda4d..3ca912e 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -3229,6 +3229,58 @@ sidebar_links_link_activated_cb (EvSidebarLinks *sidebar_links, EvLink *link, Ev } static void +launch_link (EvWindow *window, EvLink *link) +{ + const char *filename = ev_link_get_filename (link); + char *uri = NULL; + + if (g_path_is_absolute (filename)) { + uri = g_strconcat ("file://", filename, NULL); + } else { + GnomeVFSURI *base_uri, *resolved_uri; + + base_uri = gnome_vfs_uri_new (window->priv->uri); + if (base_uri) { + resolved_uri = gnome_vfs_uri_resolve_relative (base_uri, filename); + if (resolved_uri) { + uri = gnome_vfs_uri_to_string (resolved_uri, GNOME_VFS_URI_HIDE_NONE); + } + gnome_vfs_uri_unref (resolved_uri); + } + gnome_vfs_uri_unref (base_uri); + } + + if (uri) { + gnome_vfs_url_show (uri); + } else { + gnome_vfs_url_show (filename); + } + + g_free (uri); + + /* According to the PDF spec filename can be an executable. I'm not sure + allowing to launch executables is a good idea though. -- marco */ +} + +static void +view_external_link_cb (EvView *view, EvLink *link, EvWindow *window) +{ + const char *uri; + + switch (ev_link_get_link_type (link)) { + case EV_LINK_TYPE_EXTERNAL_URI: + uri = ev_link_get_uri (link); + gnome_vfs_url_show (uri); + break; + case EV_LINK_TYPE_LAUNCH: + launch_link (window, link); + break; + default: + g_assert_not_reached (); + } +} + +static void ev_window_init (EvWindow *ev_window) { GtkActionGroup *action_group; @@ -3368,6 +3420,9 @@ ev_window_init (EvWindow *ev_window) g_signal_connect_object (ev_window->priv->view, "focus_out_event", G_CALLBACK (view_actions_focus_out_cb), ev_window, 0); + g_signal_connect_object (ev_window->priv->view, "external-link", + G_CALLBACK (view_external_link_cb), + ev_window, 0); gtk_widget_show (ev_window->priv->view); gtk_widget_show (ev_window->priv->password_view); -- cgit v0.9.1