X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=692014444ecac920696c0fa1981d24ab1029cc80;hb=83fb195a6bc9e15c5002d73291b9f3c42b6b150a;hp=19b78f33f203de36e7b6dd5a412b31a7c481f989;hpb=d8264ef4e6ab48b5d203093bb1c66ae2ae1ad9e0;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 19b78f33..69201444 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", @@ -311,7 +318,9 @@ update_action_sensitivity (EvWindow *ev_window) set_action_sensitive (ev_window, PAGE_SELECTOR_ACTION, has_pages); set_action_sensitive (ev_window, ZOOM_CONTROL_ACTION, has_pages); - if (has_pages && ev_view_get_sizing_mode (view) == EV_SIZING_FREE) { + if (has_pages && + ev_view_get_sizing_mode (view) != EV_SIZING_FIT_WIDTH && + ev_view_get_sizing_mode (view) != EV_SIZING_BEST_FIT) { GtkAction *action; float zoom; float real_zoom; @@ -689,7 +698,8 @@ ev_window_setup_document (EvWindow *ev_window) ev_view_set_document (view, document); } - ev_window_title_set_document (ev_window->priv->title, document, ev_window->priv->uri); + ev_window_title_set_document (ev_window->priv->title, document); + ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->uri); action = gtk_action_group_get_action (ev_window->priv->action_group, PAGE_SELECTOR_ACTION); ev_page_action_set_document (EV_PAGE_ACTION (action), document); update_action_sensitivity (ev_window); @@ -762,6 +772,7 @@ ev_window_popup_password_dialog (EvWindow *ev_window) gtk_widget_set_sensitive (ev_window->priv->password_view, FALSE); + ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->password_uri); ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_PASSWORD); if (ev_window->priv->password_dialog == NULL) { @@ -2419,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) { @@ -2699,7 +2716,6 @@ ev_window_finalize (GObject *object) g_list_free (windows); } - g_list_free (windows); G_OBJECT_CLASS (ev_window_parent_class)->finalize (object); } @@ -2907,6 +2923,8 @@ static const GtkActionEntry entries[] = { G_CALLBACK (ev_window_cmd_view_zoom_in) }, { "CtrlEqual", GTK_STOCK_ZOOM_IN, NULL, "equal", NULL, G_CALLBACK (ev_window_cmd_view_zoom_in) }, + { "Equal", GTK_STOCK_ZOOM_IN, NULL, "equal", NULL, + G_CALLBACK (ev_window_cmd_view_zoom_in) }, { "Minus", GTK_STOCK_ZOOM_OUT, NULL, "minus", NULL, G_CALLBACK (ev_window_cmd_view_zoom_out) }, { "FocusPageSelector", NULL, "", "l", NULL, @@ -2919,6 +2937,10 @@ static const GtkActionEntry entries[] = { G_CALLBACK (ev_window_cmd_view_zoom_in) }, { "KpMinus", GTK_STOCK_ZOOM_OUT, NULL, "KP_Subtract", NULL, G_CALLBACK (ev_window_cmd_view_zoom_out) }, + { "CtrlKpPlus", GTK_STOCK_ZOOM_IN, NULL, "KP_Add", NULL, + G_CALLBACK (ev_window_cmd_view_zoom_in) }, + { "CtrlKpMinus", GTK_STOCK_ZOOM_OUT, NULL, "KP_Subtract", NULL, + G_CALLBACK (ev_window_cmd_view_zoom_out) }, }; /* Toggle items */ @@ -3139,6 +3161,7 @@ ev_window_set_view_accels_sensitivity (EvWindow *window, gboolean sensitive) set_action_sensitive (window, "Minus", sensitive); set_action_sensitive (window, "KpPlus", sensitive); set_action_sensitive (window, "KpMinus", sensitive); + set_action_sensitive (window, "Equal", sensitive); } } @@ -3224,6 +3247,68 @@ 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 (filename && g_path_is_absolute (filename)) { + uri = gnome_vfs_get_uri_from_local_path (filename); + } else { + GnomeVFSURI *base_uri, *resolved_uri; + + base_uri = gnome_vfs_uri_new (window->priv->uri); + if (base_uri && filename) { + 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 +launch_external_uri (EvWindow *window, EvLink *link) +{ + const char *uri; + char *escaped; + + uri = ev_link_get_uri (link); + escaped = gnome_vfs_escape_host_and_path_string (uri); + + gnome_vfs_url_show (escaped); + g_free (escaped); +} + +static void +view_external_link_cb (EvView *view, EvLink *link, EvWindow *window) +{ + switch (ev_link_get_link_type (link)) { + case EV_LINK_TYPE_EXTERNAL_URI: + launch_external_uri (window, link); + break; + case EV_LINK_TYPE_LAUNCH: + launch_link (window, link); + break; + default: + g_assert_not_reached (); + } +} + static void ev_window_init (EvWindow *ev_window) { @@ -3364,6 +3449,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); @@ -3400,6 +3488,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),