X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-window.c;h=295af44e3d0d3cb8db0ad4b8ce6363488b9adc4f;hb=95a299b2e2d5e5fdd2386e7e6c909754a2e49792;hp=17baf74402de94012764ea89b02b86eb670e2480;hpb=5cc835ba642f057395b3b79d48495a3ab55de6db;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 17baf744..295af44e 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -219,6 +219,8 @@ update_action_sensitivity (EvWindow *ev_window) gboolean ok_to_copy = TRUE; gboolean has_properties = TRUE; gboolean override_restrictions = FALSE; + gboolean can_get_text = FALSE; + gboolean ok_to_copy_text = FALSE; GConfClient *client; view = EV_VIEW (ev_window->priv->view); @@ -263,6 +265,11 @@ update_action_sensitivity (EvWindow *ev_window) g_object_unref (client); + if (has_document && ev_document_can_get_text (document)) { + can_get_text = TRUE; + ok_to_copy_text = ev_view_get_has_selection (view); + } + /* File menu */ /* "FileOpen": always sensitive */ set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy); @@ -272,8 +279,8 @@ update_action_sensitivity (EvWindow *ev_window) /* Edit menu */ sensitive = has_pages && ev_document_can_get_text (document); - set_action_sensitive (ev_window, "EditCopy", sensitive && ok_to_copy); - set_action_sensitive (ev_window, "EditSelectAll", sensitive && ok_to_copy); + set_action_sensitive (ev_window, "EditCopy", sensitive && ok_to_copy_text); + set_action_sensitive (ev_window, "EditSelectAll", sensitive && can_get_text); set_action_sensitive (ev_window, "EditFind", has_pages && EV_IS_DOCUMENT_FIND (document)); set_action_sensitive (ev_window, "Slash", @@ -2345,15 +2352,6 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, G_CALLBACK (update_view_size), ev_window); break; - case EV_SIZING_FIT_HEIGHT: - g_object_set (G_OBJECT (scrolled_window), - "hscrollbar-policy", GTK_POLICY_AUTOMATIC, - "vscrollbar-policy", GTK_POLICY_NEVER, - NULL); - g_signal_connect (ev_window->priv->view, "zoom_invalid", - G_CALLBACK (update_view_size), - ev_window); - break; case EV_SIZING_FREE: g_object_set (G_OBJECT (scrolled_window), "hscrollbar-policy", GTK_POLICY_AUTOMATIC, @@ -2432,6 +2430,12 @@ ev_window_rotation_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *window rotation); } +static void +ev_window_has_selection_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *window) +{ + update_action_sensitivity (window); +} + static void ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) { @@ -3237,6 +3241,58 @@ sidebar_links_link_activated_cb (EvSidebarLinks *sidebar_links, EvLink *link, Ev ev_view_goto_link (EV_VIEW (window->priv->view), link); } +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) { @@ -3377,6 +3433,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); @@ -3413,6 +3472,10 @@ ev_window_init (EvWindow *ev_window) "notify::rotation", G_CALLBACK (ev_window_rotation_changed_cb), ev_window); + g_signal_connect (ev_window->priv->view, + "notify::has-selection", + G_CALLBACK (ev_window_has_selection_changed_cb), + ev_window); ev_window->priv->find_bar = egg_find_bar_new (); gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box),