diff options
Diffstat (limited to 'shell/ev-window.c')
-rw-r--r-- | shell/ev-window.c | 75 |
1 files changed, 52 insertions, 23 deletions
diff --git a/shell/ev-window.c b/shell/ev-window.c index f14bd31..51b8abd 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -263,6 +263,9 @@ static gboolean fullscreen_motion_notify_cb (GtkWidget *widget, static gboolean fullscreen_leave_notify_cb (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data); +static void view_handle_link_cb (EvView *view, + EvLink *link, + EvWindow *window); G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW) @@ -635,19 +638,20 @@ page_changed_cb (EvPageCache *page_cache, gint page, EvWindow *ev_window) { - gchar *label; - ev_window_update_actions (ev_window); - if (ev_window->priv->history) { - label = ev_page_cache_get_page_label (ev_window->priv->page_cache, page); - ev_history_add_page (ev_window->priv->history, page, label); - g_free (label); - } - if (!ev_window_is_empty (ev_window)) ev_metadata_manager_set_int (ev_window->priv->uri, "page", page); } +static void +history_changed_cb (EvPageCache *page_cache, + gint page, + EvWindow *ev_window) +{ + ev_history_add_page (ev_window->priv->history, page, + ev_page_cache_get_page_label (ev_window->priv->page_cache, page)); + return; +} static void update_document_mode (EvWindow *window, EvDocumentMode mode) @@ -903,6 +907,7 @@ ev_window_setup_document (EvWindow *ev_window) document = ev_window->priv->document; ev_window->priv->page_cache = ev_page_cache_get (ev_window->priv->document); g_signal_connect (ev_window->priv->page_cache, "page-changed", G_CALLBACK (page_changed_cb), ev_window); + g_signal_connect (ev_window->priv->page_cache, "history-changed", G_CALLBACK (history_changed_cb), ev_window); if (EV_IS_DOCUMENT_FIND (document)) { g_signal_connect_object (G_OBJECT (document), @@ -930,7 +935,6 @@ ev_window_setup_document (EvWindow *ev_window) ev_window->priv->history = ev_history_new (); action = gtk_action_group_get_action (ev_window->priv->action_group, NAVIGATION_ACTION); ev_navigation_action_set_history (EV_NAVIGATION_ACTION (action), ev_window->priv->history); - ev_navigation_action_set_window (EV_NAVIGATION_ACTION (action), ev_window); if (ev_window->priv->properties) { ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties), @@ -1099,8 +1103,15 @@ ev_window_load_job_cb (EvJobLoad *job, ev_window_setup_document (ev_window); - if (job->dest) - ev_window_goto_dest (ev_window, job->dest); + if (job->dest) { + EvLink *link; + EvLinkAction *link_action; + + link_action = ev_link_action_new_dest (g_object_ref (job->dest)); + link = ev_link_new (NULL, link_action); + ev_view_handle_link (EV_VIEW (ev_window->priv->view), link); + g_object_unref (link); + } switch (job->mode) { case EV_WINDOW_MODE_FULLSCREEN: @@ -1269,12 +1280,6 @@ ev_window_open_uri (EvWindow *ev_window, ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH); } -void -ev_window_goto_dest (EvWindow *ev_window, EvLinkDest *dest) -{ - ev_view_goto_dest (EV_VIEW (ev_window->priv->view), dest); -} - static void file_open_dialog_response_cb (GtkWidget *chooser, gint response_id, @@ -4024,6 +4029,12 @@ static const GtkActionEntry attachment_popup_entries [] = { }; static void +sidebar_links_link_activated_cb (EvSidebarLinks *sidebar_links, EvLink *link, EvWindow *window) +{ + ev_view_handle_link (EV_VIEW (window->priv->view), link); +} + +static void activate_link_cb (EvPageAction *page_action, EvLink *link, EvWindow *window) { ev_view_handle_link (EV_VIEW (window->priv->view), link); @@ -4031,6 +4042,18 @@ activate_link_cb (EvPageAction *page_action, EvLink *link, EvWindow *window) } static void +navigation_action_activate_link_cb (EvNavigationAction *action, EvLink *link, EvWindow *window) +{ + + g_signal_handlers_block_by_func + (window->priv->view, G_CALLBACK (view_handle_link_cb), window); + ev_view_handle_link (EV_VIEW (window->priv->view), link); + g_signal_handlers_unblock_by_func + (window->priv->view, G_CALLBACK (view_handle_link_cb), window); + gtk_widget_grab_focus (window->priv->view); +} + +static void register_custom_actions (EvWindow *window, GtkActionGroup *group) { GtkAction *action; @@ -4066,6 +4089,8 @@ register_custom_actions (EvWindow *window, GtkActionGroup *group) "stock_id", GTK_STOCK_GO_DOWN, "tooltip", _("Move across visited pages"), NULL); + g_signal_connect (action, "activate_link", + G_CALLBACK (navigation_action_activate_link_cb), window); gtk_action_group_add_action (group, action); g_object_unref (action); } @@ -4224,12 +4249,6 @@ window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer } static void -sidebar_links_link_activated_cb (EvSidebarLinks *sidebar_links, EvLink *link, EvWindow *window) -{ - ev_view_handle_link (EV_VIEW (window->priv->view), link); -} - -static void launch_action (EvWindow *window, EvLinkAction *action) { const char *filename = ev_link_action_get_filename (action); @@ -4319,6 +4338,12 @@ do_action_named (EvWindow *window, EvLinkAction *action) } static void +view_handle_link_cb (EvView *view, EvLink *link, EvWindow *window) +{ + ev_history_add_link (window->priv->history, link); +} + +static void view_external_link_cb (EvView *view, EvLinkAction *action, EvWindow *window) { switch (ev_link_action_get_action_type (action)) { @@ -4768,6 +4793,10 @@ ev_window_init (EvWindow *ev_window) g_signal_connect_object (ev_window->priv->view, "external-link", G_CALLBACK (view_external_link_cb), ev_window, 0); + g_signal_connect_object (ev_window->priv->view, "handle-link", + G_CALLBACK (view_handle_link_cb), + ev_window, 0); + g_signal_connect_object (ev_window->priv->view, "popup", G_CALLBACK (view_menu_popup_cb), |