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=c80314090e12bf6cbe33eefbb1fb604e983757c2;hb=1dd619d11cc65d17b3fd08b650668fb3f85e35e9;hp=af4e530ffa87081f3be8b99272d6c6db0bb6a3d3;hpb=93d08f703def1edf4786c479ac882c399ae29885;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index af4e530f..c8031409 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -80,6 +80,7 @@ #include +#include #include #include #include @@ -100,6 +101,7 @@ typedef enum { EV_CHROME_RAISE_TOOLBAR = 1 << 3, EV_CHROME_FULLSCREEN_TOOLBAR = 1 << 4, EV_CHROME_SIDEBAR = 1 << 5, + EV_CHROME_PREVIEW_TOOLBAR = 1 << 6, EV_CHROME_NORMAL = EV_CHROME_MENUBAR | EV_CHROME_TOOLBAR | EV_CHROME_SIDEBAR } EvChrome; @@ -120,6 +122,7 @@ struct _EvWindowPrivate { GtkWidget *sidebar_thumbs; GtkWidget *sidebar_links; GtkWidget *sidebar_attachments; + GtkWidget *preview_toolbar; /* Dialogs */ GtkWidget *properties; @@ -156,6 +159,7 @@ struct _EvWindowPrivate { char *uri; char *local_uri; EvLinkDest *dest; + gboolean unlink_temp_file; EvDocument *document; @@ -234,6 +238,8 @@ static void ev_window_cmd_view_presentation (GtkAction *actio static void ev_window_run_preview (EvWindow *window); static void ev_view_popup_cmd_open_link (GtkAction *action, EvWindow *window); +static void ev_view_popup_cmd_open_link_new_window (GtkAction *action, + EvWindow *window); static void ev_view_popup_cmd_copy_link_address (GtkAction *action, EvWindow *window); static void ev_attachment_popup_cmd_open_attachment (GtkAction *action, @@ -330,6 +336,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window) /* File menu */ + ev_window_set_action_sensitive (ev_window, "FileOpenCopy", has_document); ev_window_set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy); #ifdef WITH_GTK_PRINT @@ -462,6 +469,7 @@ update_chrome_visibility (EvWindow *window) EvWindowPrivate *priv = window->priv; gboolean menubar, toolbar, findbar, fullscreen_toolbar, sidebar; gboolean fullscreen_mode, presentation, fullscreen; + gboolean preview_toolbar; presentation = ev_view_get_presentation (EV_VIEW (priv->view)); fullscreen = ev_view_get_fullscreen (EV_VIEW (priv->view)); @@ -474,11 +482,13 @@ update_chrome_visibility (EvWindow *window) (priv->chrome & EV_CHROME_RAISE_TOOLBAR) != 0) && fullscreen; findbar = (priv->chrome & EV_CHROME_FINDBAR) != 0; sidebar = (priv->chrome & EV_CHROME_SIDEBAR) != 0 && !fullscreen_mode; + preview_toolbar = (priv->chrome& EV_CHROME_PREVIEW_TOOLBAR); set_widget_visibility (priv->menubar, menubar); set_widget_visibility (priv->toolbar_dock, toolbar); set_widget_visibility (priv->find_bar, findbar); set_widget_visibility (priv->sidebar, sidebar); + set_widget_visibility (priv->preview_toolbar, preview_toolbar); ev_window_set_action_sensitive (window, "EditToolbar", toolbar); gtk_widget_set_sensitive (priv->menubar, menubar); @@ -971,7 +981,7 @@ ev_window_clear_local_uri (EvWindow *ev_window) if (ev_window->priv->local_uri) { filename = g_filename_from_uri (ev_window->priv->local_uri, NULL, NULL); if (filename != NULL) { - unlink (filename); + g_unlink (filename); g_free (filename); } g_free (ev_window->priv->local_uri); @@ -979,6 +989,36 @@ ev_window_clear_local_uri (EvWindow *ev_window) } } +static void +ev_window_clear_temp_file (EvWindow *ev_window) +{ + GnomeVFSURI *uri; + gchar *filename; + gchar *dir; + + if (!ev_window->priv->uri) + return; + + uri = gnome_vfs_uri_new (ev_window->priv->uri); + if (!gnome_vfs_uri_is_local (uri)) { + gnome_vfs_uri_unref (uri); + return; + } + gnome_vfs_uri_unref (uri); + + filename = g_filename_from_uri (ev_window->priv->uri, NULL, NULL); + if (!filename) + return; + + dir = g_path_get_dirname (filename); + if (g_ascii_strcasecmp (dir, g_get_tmp_dir ()) == 0) { + g_unlink (filename); + } + + g_free (dir); + g_free (filename); +} + /* This callback will executed when load job will be finished. * * Since the flow of the error dialog is very confusing, we assume that both @@ -1014,9 +1054,12 @@ ev_window_xfer_job_cb (EvJobXfer *job, g_object_unref (ev_window->priv->document); ev_window->priv->document = g_object_ref (document); - setup_view_from_metadata (ev_window); + if (!ev_window->priv->unlink_temp_file) { + setup_view_from_metadata (ev_window); + ev_window_add_recent (ev_window, ev_window->priv->uri); + } + ev_window_setup_document (ev_window); - ev_window_add_recent (ev_window, ev_window->priv->uri); if (job->dest) ev_window_goto_dest (ev_window, job->dest); @@ -1100,13 +1143,16 @@ void ev_window_open_uri (EvWindow *ev_window, const char *uri, EvLinkDest *dest, - EvWindowRunMode mode) + EvWindowRunMode mode, + gboolean unlink_temp_file) { ev_window_close_dialogs (ev_window); ev_window_clear_xfer_job (ev_window); ev_window_clear_local_uri (ev_window); ev_view_set_loading (EV_VIEW (ev_window->priv->view), TRUE); + ev_window->priv->unlink_temp_file = unlink_temp_file; + ev_window->priv->xfer_job = ev_job_xfer_new (uri, dest, mode); g_signal_connect (ev_window->priv->xfer_job, "finished", @@ -1175,6 +1221,88 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window) gtk_widget_show (chooser); } +static gchar * +ev_window_get_copy_tmp_name (const gchar *filename) +{ + gchar *tmp_filename = NULL; + gchar *name; + guint i = 0; + + name = g_path_get_basename (filename); + + do { + gchar *basename; + + basename = g_strdup_printf ("%s-%d", name, i); + tmp_filename = g_build_filename (g_get_tmp_dir (), + basename, NULL); + g_free (basename); + } while (g_file_test (tmp_filename, G_FILE_TEST_EXISTS)); + + g_free (name); + + return tmp_filename; +} + +static void +ev_window_cmd_file_open_copy_at_dest (EvWindow *window, EvLinkDest *dest) +{ + gchar *symlink_uri; + gchar *old_filename; + gchar *new_filename; + + old_filename = g_filename_from_uri (window->priv->uri, NULL, NULL); + new_filename = ev_window_get_copy_tmp_name (old_filename); + + if (symlink (old_filename, new_filename) != 0) { + gchar *msg; + GError *error; + + msg = g_strdup_printf (_("Cannot open a copy.")); + error = g_error_new (G_FILE_ERROR, + g_file_error_from_errno (errno), + _("Couldn't create symlink “%s”: %s"), + new_filename, strerror (errno)); + ev_window_error_dialog (GTK_WINDOW (window), msg, error); + g_free (msg); + g_error_free (error); + + g_free (old_filename); + g_free (new_filename); + + return; + } + + g_free (old_filename); + + symlink_uri = g_filename_to_uri (new_filename, NULL, NULL); + g_free (new_filename); + + ev_application_open_uri_at_dest (EV_APP, + symlink_uri, + gtk_window_get_screen (GTK_WINDOW (window)), + dest, + 0, + TRUE, + GDK_CURRENT_TIME); + g_free (symlink_uri); +} + +static void +ev_window_cmd_file_open_copy (GtkAction *action, EvWindow *window) +{ + EvPageCache *page_cache; + EvLinkDest *dest; + gint current_page; + + page_cache = ev_page_cache_get (window->priv->document); + current_page = ev_page_cache_get_current_page (page_cache); + + dest = ev_link_dest_new_page (current_page); + ev_window_cmd_file_open_copy_at_dest (window, dest); + g_object_unref (dest); +} + #ifdef HAVE_GTK_RECENT static void ev_window_cmd_recent_file_activate (GtkAction *action, @@ -1190,7 +1318,7 @@ ev_window_cmd_recent_file_activate (GtkAction *action, ev_application_open_uri_at_dest (EV_APP, uri, gtk_window_get_screen (GTK_WINDOW (window)), - NULL, 0, + NULL, 0, FALSE, GDK_CURRENT_TIME); } #else @@ -2219,7 +2347,7 @@ ev_window_create_fullscreen_popup (EvWindow *window) GdkScreen *screen; window->priv->fullscreen_toolbar = egg_editable_toolbar_new_with_model - (window->priv->ui_manager, ev_application_get_toolbars_model (EV_APP), NULL); + (window->priv->ui_manager, ev_application_get_toolbars_model (EV_APP, FALSE), NULL); popup = gtk_window_new (GTK_WINDOW_POPUP); hbox = gtk_hbox_new (FALSE, 0); @@ -2426,29 +2554,14 @@ ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window) static void ev_window_run_preview (EvWindow *window) { - EggToolbarsModel *model; - EggTbModelFlags flags; - - model = egg_toolbars_model_new (); - - egg_toolbars_model_load_toolbars (model, - DATADIR"/evince-toolbar.xml"); - - flags = egg_toolbars_model_get_flags (model, 1); - egg_toolbars_model_set_flags (model, 1, flags &= ~(EGG_TB_MODEL_HIDDEN)); - - egg_editable_toolbar_set_model (EGG_EDITABLE_TOOLBAR (window->priv->toolbar), - model); - - egg_editable_toolbar_hide (EGG_EDITABLE_TOOLBAR (window->priv->toolbar), - "DefaultToolBar"); - egg_editable_toolbar_show (EGG_EDITABLE_TOOLBAR (window->priv->toolbar), - "PreviewToolBar"); - ev_view_set_continuous (EV_VIEW (window->priv->view), FALSE); + update_chrome_flag (window, EV_CHROME_TOOLBAR, FALSE); update_chrome_flag (window, EV_CHROME_MENUBAR, FALSE); update_chrome_flag (window, EV_CHROME_SIDEBAR, FALSE); + + update_chrome_flag (window, EV_CHROME_PREVIEW_TOOLBAR, TRUE); + update_chrome_visibility (window); } @@ -2596,7 +2709,7 @@ ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window) gtk_window_set_default_size (GTK_WINDOW (dialog), 500, 400); editor = egg_toolbar_editor_new (ev_window->priv->ui_manager, - ev_application_get_toolbars_model (EV_APP)); + ev_application_get_toolbars_model (EV_APP, FALSE)); gtk_container_set_border_width (GTK_CONTAINER (editor), 5); gtk_box_set_spacing (GTK_BOX (EGG_TOOLBAR_EDITOR (editor)), 5); @@ -2700,7 +2813,7 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) uri = g_strdup (ev_window->priv->uri); - ev_window_open_uri (ev_window, uri, NULL, 0); + ev_window_open_uri (ev_window, uri, NULL, 0, FALSE); g_free (uri); } @@ -3081,11 +3194,13 @@ ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_sidebar, GtkAction *action; action = gtk_action_group_get_action (ev_window->priv->action_group, "ViewSidebar"); - gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), - GTK_WIDGET_VISIBLE (ev_sidebar)); if (!ev_view_get_presentation (view) && !ev_view_get_fullscreen (view)) { + + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + GTK_WIDGET_VISIBLE (ev_sidebar)); + ev_metadata_manager_set_boolean (ev_window->priv->uri, "sidebar_visibility", GTK_WIDGET_VISIBLE (ev_sidebar)); } @@ -3147,6 +3262,10 @@ view_menu_popup_cb (EvView *view, "GoLink"); gtk_action_set_visible (action, show_internal); + action = gtk_action_group_get_action (ev_window->priv->view_popup_action_group, + "OpenLinkNewWindow"); + gtk_action_set_visible (action, show_internal); + gtk_menu_popup (GTK_MENU (popup), NULL, NULL, NULL, NULL, 3, gtk_get_current_event_time ()); @@ -3429,6 +3548,8 @@ ev_window_dispose (GObject *object) } if (priv->uri) { + if (priv->unlink_temp_file) + ev_window_clear_temp_file (window); g_free (priv->uri); priv->uri = NULL; } @@ -3475,6 +3596,9 @@ static const GtkActionEntry entries[] = { { "FileOpen", GTK_STOCK_OPEN, N_("_Open..."), "O", N_("Open an existing document"), G_CALLBACK (ev_window_cmd_file_open) }, + { "FileOpenCopy", NULL, N_("Open a _Copy"), NULL, + N_("Open a copy of the current document in a new window"), + G_CALLBACK (ev_window_cmd_file_open_copy) }, { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy..."), "S", N_("Save a copy of the current document"), G_CALLBACK (ev_window_cmd_save_as) }, @@ -3503,9 +3627,9 @@ static const GtkActionEntry entries[] = { G_CALLBACK (ev_window_cmd_edit_find_previous) }, { "EditToolbar", NULL, N_("T_oolbar"), NULL, NULL, G_CALLBACK (ev_window_cmd_edit_toolbar) }, - { "EditRotateLeft", NULL, N_("Rotate _Left"), NULL, NULL, + { "EditRotateLeft", "object-rotate-left", N_("Rotate _Left"), NULL, NULL, G_CALLBACK (ev_window_cmd_edit_rotate_left) }, - { "EditRotateRight", NULL, N_("Rotate _Right"), NULL, NULL, + { "EditRotateRight", "object-rotate-right", N_("Rotate _Right"), NULL, NULL, G_CALLBACK (ev_window_cmd_edit_rotate_right) }, /* View menu */ @@ -3626,6 +3750,8 @@ static const GtkActionEntry view_popup_entries [] = { NULL, G_CALLBACK (ev_view_popup_cmd_open_link) }, { "GoLink", GTK_STOCK_GO_FORWARD, N_("_Go To"), NULL, NULL, G_CALLBACK (ev_view_popup_cmd_open_link) }, + { "OpenLinkNewWindow", NULL, N_("Open in New _Window"), NULL, + NULL, G_CALLBACK (ev_view_popup_cmd_open_link_new_window) }, { "CopyLinkAddress", NULL, N_("_Copy Link Address"), NULL, NULL, G_CALLBACK (ev_view_popup_cmd_copy_link_address) }, @@ -3937,6 +4063,7 @@ open_remote_link (EvWindow *window, EvLinkAction *action) gtk_window_get_screen (GTK_WINDOW (window)), ev_link_action_get_dest (action), 0, + FALSE, GDK_CURRENT_TIME); g_free (uri); @@ -3996,6 +4123,23 @@ ev_view_popup_cmd_open_link (GtkAction *action, EvWindow *window) ev_view_handle_link (EV_VIEW (window->priv->view), window->priv->link); } +static void +ev_view_popup_cmd_open_link_new_window (GtkAction *action, EvWindow *window) +{ + EvLinkAction *ev_action = NULL; + EvLinkDest *dest; + + ev_action = ev_link_get_action (window->priv->link); + if (!ev_action) + return; + + dest = ev_link_action_get_dest (ev_action); + if (!dest) + return; + + ev_window_cmd_file_open_copy_at_dest (window, dest); +} + static void ev_view_popup_cmd_copy_link_address (GtkAction *action, EvWindow *window) { @@ -4222,14 +4366,25 @@ ev_window_init (EvWindow *ev_window) FALSE, FALSE, 0); gtk_widget_show (toolbar_dock); - ev_window->priv->toolbar = egg_editable_toolbar_new_with_model - (ev_window->priv->ui_manager, ev_application_get_toolbars_model (EV_APP), NULL); + ev_window->priv->toolbar = GTK_WIDGET + (g_object_new (EGG_TYPE_EDITABLE_TOOLBAR, + "ui-manager", ev_window->priv->ui_manager, + "popup-path", "/ToolbarPopup", + "model", ev_application_get_toolbars_model (EV_APP, FALSE), + NULL)); + egg_editable_toolbar_show (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), "DefaultToolBar"); gtk_box_pack_start (GTK_BOX (toolbar_dock), ev_window->priv->toolbar, TRUE, TRUE, 0); gtk_widget_show (ev_window->priv->toolbar); + /* Preview toolbar */ + ev_window->priv->preview_toolbar = egg_editable_toolbar_new_with_model + (ev_window->priv->ui_manager, ev_application_get_toolbars_model (EV_APP, TRUE), NULL); + gtk_box_pack_start (GTK_BOX (ev_window->priv->main_box), ev_window->priv->preview_toolbar, + FALSE, FALSE, 0); + /* Add the main area */ ev_window->priv->hpaned = gtk_hpaned_new (); g_signal_connect (ev_window->priv->hpaned,