]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Fix double free that cause crash.
[evince.git] / shell / ev-window.c
index 19b78f33f203de36e7b6dd5a412b31a7c481f989..692014444ecac920696c0fa1981d24ab1029cc80 100644 (file)
@@ -219,6 +219,8 @@ update_action_sensitivity (EvWindow *ev_window)
        gboolean ok_to_copy = TRUE;
        gboolean has_properties = TRUE;
        gboolean override_restrictions = FALSE;
        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);
        GConfClient *client;
 
        view = EV_VIEW (ev_window->priv->view);
@@ -263,6 +265,11 @@ update_action_sensitivity (EvWindow *ev_window)
        
        g_object_unref (client);
 
        
        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);
        /* 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);
 
         /* 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",
        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);
 
        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;
                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_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);
        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);
 
 
        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) {
        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);
 }
 
                                       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)
 {
 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_list_free (windows);
        G_OBJECT_CLASS (ev_window_parent_class)->finalize (object);
 }
 
        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, "<control>equal", NULL,
           G_CALLBACK (ev_window_cmd_view_zoom_in) },
           G_CALLBACK (ev_window_cmd_view_zoom_in) },
         { "CtrlEqual", GTK_STOCK_ZOOM_IN, NULL, "<control>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, "", "<control>l", NULL,
         { "Minus", GTK_STOCK_ZOOM_OUT, NULL, "minus", NULL,
           G_CALLBACK (ev_window_cmd_view_zoom_out) },
         { "FocusPageSelector", NULL, "", "<control>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) },
           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, "<control>KP_Add", NULL,
+          G_CALLBACK (ev_window_cmd_view_zoom_in) },
+        { "CtrlKpMinus", GTK_STOCK_ZOOM_OUT, NULL, "<control>KP_Subtract", NULL,
+          G_CALLBACK (ev_window_cmd_view_zoom_out) },
 };
 
 /* Toggle items */
 };
 
 /* 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, "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);
 }
 
        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)
 {
 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, "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);
 
        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);
                          "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),
 
        ev_window->priv->find_bar = egg_find_bar_new ();
        gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box),