X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=inline;f=shell%2Fev-window.c;h=528226b3ba1325903312e01846626f76d289c85f;hb=5f554d8e362a35e05840068e1b3ea935be5d3c47;hp=0c29e2a68b04f16feaca64fb78863440a2f7680a;hpb=70919434b478e8f1073eed56097d29b6f2dba314;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 0c29e2a6..528226b3 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -231,6 +231,8 @@ struct _EvWindowPrivate { #define EV_PRINT_SETTINGS_GROUP "Print Settings" #define EV_PAGE_SETUP_GROUP "Page Setup" +#define EV_TOOLBARS_FILENAME "evince-toolbar.xml" + #define MIN_SCALE 0.05409 #define MAX_SCALE 4.0 @@ -1706,19 +1708,30 @@ ev_window_load_file_remote (EvWindow *ev_window, GFile *target_file; if (!ev_window->priv->local_uri) { - gchar *tmp_name; - gchar *base_name; + char *base_name, *template; + GFile *tmp_file; + GError *err = NULL; /* We'd like to keep extension of source uri since - * it helps to resolve some mime types, say cbz */ - tmp_name = ev_tmp_filename (NULL); + * it helps to resolve some mime types, say cbz. + */ base_name = g_file_get_basename (source_file); - ev_window->priv->local_uri = g_strconcat ("file:", tmp_name, "-", - base_name, NULL); + template = g_build_filename ("document.XXXXXX-%s", base_name, NULL); + g_free (base_name); + + tmp_file = ev_mkstemp_file (template, &err); + if (tmp_file == NULL) { + ev_window_error_message (ev_window, err, + "%s", _("Failed to load remote file.")); + g_error_free (err); + return; + } + + ev_window->priv->local_uri = g_file_get_uri (tmp_file); + g_object_unref (tmp_file); + ev_job_load_set_uri (EV_JOB_LOAD (ev_window->priv->load_job), ev_window->priv->local_uri); - g_free (base_name); - g_free (tmp_name); } ev_window_reset_progress_cancellable (ev_window); @@ -2062,7 +2075,7 @@ file_open_dialog_response_cb (GtkWidget *chooser, ev_application_open_uri_list (EV_APP, uris, gtk_window_get_screen (GTK_WINDOW (ev_window)), - GDK_CURRENT_TIME); + gtk_get_current_event_time ()); g_slist_foreach (uris, (GFunc)g_free, NULL); g_slist_free (uris); @@ -2141,7 +2154,7 @@ ev_window_open_copy_at_dest (EvWindow *window, ev_window_open_document (new_window, window->priv->document, dest, 0, NULL); - gtk_widget_show (GTK_WIDGET (new_window)); + gtk_window_present (GTK_WINDOW (new_window)); } static void @@ -2164,7 +2177,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, GDK_CURRENT_TIME); + NULL, 0, NULL, gtk_get_current_event_time ()); } static void @@ -2174,7 +2187,7 @@ ev_window_open_recent_action_item_activated (EvOpenRecentAction *action, { ev_application_open_uri_at_dest (EV_APP, uri, gtk_window_get_screen (GTK_WINDOW (window)), - NULL, 0, NULL, GDK_CURRENT_TIME); + NULL, 0, NULL, gtk_get_current_event_time ()); } static void @@ -2604,24 +2617,25 @@ get_print_settings_file (void) { GKeyFile *print_settings_file; gchar *filename; + GError *error = NULL; print_settings_file = g_key_file_new (); - filename = g_build_filename (ev_application_get_dot_dir (EV_APP), - EV_PRINT_SETTINGS_FILE, NULL); - if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { - GError *error = NULL; - - g_key_file_load_from_file (print_settings_file, - filename, - G_KEY_FILE_KEEP_COMMENTS | - G_KEY_FILE_KEEP_TRANSLATIONS, - &error); - if (error) { + filename = g_build_filename (ev_application_get_dot_dir (EV_APP, FALSE), + EV_PRINT_SETTINGS_FILE, NULL); + if (!g_key_file_load_from_file (print_settings_file, + filename, + G_KEY_FILE_KEEP_COMMENTS | + G_KEY_FILE_KEEP_TRANSLATIONS, + &error)) { + + /* Don't warn if the file simply doesn't exist */ + if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) g_warning ("%s", error->message); - g_error_free (error); - } + + g_error_free (error); } + g_free (filename); return print_settings_file; @@ -2632,15 +2646,15 @@ save_print_setting_file (GKeyFile *key_file) { gchar *filename; gchar *data; - gssize data_length; + gsize data_length; GError *error = NULL; - filename = g_build_filename (ev_application_get_dot_dir (EV_APP), + filename = g_build_filename (ev_application_get_dot_dir (EV_APP, TRUE), EV_PRINT_SETTINGS_FILE, NULL); - data = g_key_file_to_data (key_file, (gsize *)&data_length, NULL); + data = g_key_file_to_data (key_file, &data_length, NULL); g_file_set_contents (filename, data, data_length, &error); if (error) { - g_warning ("%s", error->message); + g_warning ("Failed to save print settings: %s", error->message); g_error_free (error); } g_free (data); @@ -3778,42 +3792,54 @@ ev_window_cmd_edit_rotate_right (GtkAction *action, EvWindow *ev_window) } static void -ev_window_cmd_edit_toolbar_cb (GtkDialog *dialog, gint response, gpointer data) +ev_window_cmd_edit_toolbar_cb (GtkDialog *dialog, + gint response, + EvWindow *ev_window) { - EvWindow *ev_window = EV_WINDOW (data); - egg_editable_toolbar_set_edit_mode - (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), FALSE); - ev_application_save_toolbars_model (EV_APP); + EggEditableToolbar *toolbar; + gchar *toolbars_file; + + toolbar = EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar); + egg_editable_toolbar_set_edit_mode (toolbar, FALSE); + + toolbars_file = g_build_filename (ev_application_get_dot_dir (EV_APP, TRUE), + "evince_toolbar.xml", NULL); + egg_toolbars_model_save_toolbars (egg_editable_toolbar_get_model (toolbar), + toolbars_file, "1.0"); + g_free (toolbars_file); + gtk_widget_destroy (GTK_WIDGET (dialog)); } static void ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window) { - GtkWidget *dialog; - GtkWidget *editor; + GtkWidget *dialog; + GtkWidget *editor; + EggEditableToolbar *toolbar; dialog = gtk_dialog_new_with_buttons (_("Toolbar Editor"), - GTK_WINDOW (ev_window), - GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_WINDOW (ev_window), + GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, - GTK_RESPONSE_CLOSE, + GTK_RESPONSE_CLOSE, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE); gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)), 5); gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 2); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); gtk_window_set_default_size (GTK_WINDOW (dialog), 500, 400); - + + toolbar = EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar); editor = egg_toolbar_editor_new (ev_window->priv->ui_manager, - ev_application_get_toolbars_model (EV_APP)); + egg_editable_toolbar_get_model (toolbar)); + gtk_container_set_border_width (GTK_CONTAINER (editor), 5); gtk_box_set_spacing (GTK_BOX (EGG_TOOLBAR_EDITOR (editor)), 5); - + gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), editor); - egg_editable_toolbar_set_edit_mode - (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), TRUE); + egg_editable_toolbar_set_edit_mode (toolbar, TRUE); g_signal_connect (dialog, "response", G_CALLBACK (ev_window_cmd_edit_toolbar_cb), @@ -3920,7 +3946,7 @@ ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) gtk_show_uri (gtk_window_get_screen (GTK_WINDOW (ev_window)), "ghelp:evince", - GDK_CURRENT_TIME, + gtk_get_current_event_time (), &error); if (error) { ev_window_error_message (ev_window, error, @@ -4634,13 +4660,13 @@ ev_window_drag_data_received (GtkWidget *widget, static void ev_window_finalize (GObject *object) { + G_OBJECT_CLASS (ev_window_parent_class)->finalize (object); + if (ev_window_n_copies == 0) { ev_application_shutdown (EV_APP); } else { ev_window_n_copies--; } - - G_OBJECT_CLASS (ev_window_parent_class)->finalize (object); } static void @@ -5381,7 +5407,8 @@ launch_action (EvWindow *window, EvLinkAction *action) context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ()); gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context), gtk_window_get_screen (GTK_WINDOW (window))); - gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context), GDK_CURRENT_TIME); + gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context), + gtk_get_current_event_time ()); file_list.data = file; if (!g_app_info_launch (app_info, &file_list, context, &error)) { @@ -5393,6 +5420,7 @@ launch_action (EvWindow *window, EvLinkAction *action) g_object_unref (app_info); g_object_unref (file); + /* FIXMEchpe: unref launch context? */ /* According to the PDF spec filename can be an executable. I'm not sure allowing to launch executables is a good idea though. -- marco */ @@ -5410,7 +5438,7 @@ launch_external_uri (EvWindow *window, EvLinkAction *action) gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context), gtk_window_get_screen (GTK_WINDOW (window))); gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context), - GDK_CURRENT_TIME); + gtk_get_current_event_time ()); if (!g_strstr_len (uri, strlen (uri), "://") && !g_str_has_prefix (uri, "mailto:")) { @@ -5418,10 +5446,10 @@ launch_external_uri (EvWindow *window, EvLinkAction *action) /* Not a valid uri, assuming it's http */ http = g_strdup_printf ("http://%s", uri); - ret = g_app_info_launch_default_for_uri (http, NULL, &error); + ret = g_app_info_launch_default_for_uri (http, context, &error); g_free (http); } else { - ret = g_app_info_launch_default_for_uri (uri, NULL, &error); + ret = g_app_info_launch_default_for_uri (uri, context, &error); } if (ret == FALSE) { @@ -5429,6 +5457,8 @@ launch_external_uri (EvWindow *window, EvLinkAction *action) "%s", _("Unable to open external link")); g_error_free (error); } + + /* FIXMEchpe: unref launch context? */ } static void @@ -5448,7 +5478,7 @@ open_remote_link (EvWindow *window, EvLinkAction *action) ev_link_action_get_dest (action), 0, NULL, - GDK_CURRENT_TIME); + gtk_get_current_event_time ()); g_free (uri); } @@ -5615,7 +5645,9 @@ image_save_dialog_response_cb (GtkWidget *fc, if (is_native) { filename = g_file_get_path (target_file); } else { - filename = ev_tmp_filename ("saveimage"); + /* Create a temporary local file to save to */ + if (ev_mkstemp ("saveimage.XXXXXX", &filename, &error) == -1) + goto has_error; } ev_document_doc_mutex_lock (); @@ -5628,6 +5660,7 @@ image_save_dialog_response_cb (GtkWidget *fc, g_free (file_format); g_object_unref (pixbuf); + has_error: if (error) { ev_window_error_message (ev_window, error, "%s", _("The image could not be saved.")); @@ -5725,7 +5758,7 @@ ev_attachment_popup_cmd_open_attachment (GtkAction *action, EvWindow *window) attachment = (EvAttachment *) l->data; - ev_attachment_open (attachment, screen, GDK_CURRENT_TIME, &error); + ev_attachment_open (attachment, screen, gtk_get_current_event_time (), &error); if (error) { ev_window_error_message (window, error, @@ -5760,7 +5793,7 @@ attachment_save_dialog_response_cb (GtkWidget *fc, for (l = ev_window->priv->attach_list; l && l->data; l = g_list_next (l)) { EvAttachment *attachment; - GFile *save_to; + GFile *save_to = NULL; GError *error = NULL; attachment = (EvAttachment *) l->data; @@ -5768,15 +5801,17 @@ attachment_save_dialog_response_cb (GtkWidget *fc, if (is_native) { if (is_dir) { save_to = g_file_get_child (target_file, + /* FIXMEchpe: file name encoding! */ ev_attachment_get_name (attachment)); } else { save_to = g_object_ref (target_file); } } else { - save_to = ev_tmp_file_get ("saveattachment"); + save_to = ev_mkstemp_file ("saveattachment.XXXXXX", &error); } - ev_attachment_save (attachment, save_to, &error); + if (save_to) + ev_attachment_save (attachment, save_to, &error); if (error) { ev_window_error_message (ev_window, error, @@ -5882,6 +5917,52 @@ ev_window_media_player_key_pressed (EvWindow *window, } } +static EggToolbarsModel * +get_toolbars_model (void) +{ + EggToolbarsModel *toolbars_model; + gchar *toolbars_file; + gchar *toolbars_path; + gint i; + + toolbars_model = egg_toolbars_model_new (); + + toolbars_file = g_build_filename (ev_application_get_dot_dir (EV_APP, FALSE), + "evince_toolbar.xml", NULL); + toolbars_path = g_build_filename (ev_application_get_data_dir (EV_APP), + "evince-toolbar.xml", NULL); + egg_toolbars_model_load_names (toolbars_model, toolbars_path); + + if (!egg_toolbars_model_load_toolbars (toolbars_model, toolbars_file)) { + egg_toolbars_model_load_toolbars (toolbars_model, toolbars_path); + goto skip_conversion; + } + + /* Open item doesn't exist anymore, + * convert it to OpenRecent for compatibility + */ + for (i = 0; i < egg_toolbars_model_n_items (toolbars_model, 0); i++) { + const gchar *item; + + item = egg_toolbars_model_item_nth (toolbars_model, 0, i); + if (g_ascii_strcasecmp (item, "FileOpen") == 0) { + egg_toolbars_model_remove_item (toolbars_model, 0, i); + egg_toolbars_model_add_item (toolbars_model, 0, i, + "FileOpenRecent"); + egg_toolbars_model_save_toolbars (toolbars_model, toolbars_file, "1.0"); + break; + } + } + + skip_conversion: + g_free (toolbars_file); + g_free (toolbars_path); + + egg_toolbars_model_set_flags (toolbars_model, 0, EGG_TB_MODEL_NOT_REMOVABLE); + + return toolbars_model; +} + static void ev_window_init (EvWindow *ev_window) { @@ -5889,6 +5970,7 @@ ev_window_init (EvWindow *ev_window) GtkAccelGroup *accel_group; GError *error = NULL; GtkWidget *sidebar_widget; + EggToolbarsModel *toolbars_model; GObject *mpkeys; gchar *ui_path; gdouble dpi; @@ -5973,12 +6055,14 @@ ev_window_init (EvWindow *ev_window) ev_window->priv->menubar, FALSE, FALSE, 0); - 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), - NULL)); + toolbars_model = get_toolbars_model (); + ev_window->priv->toolbar = GTK_WIDGET + (g_object_new (EGG_TYPE_EDITABLE_TOOLBAR, + "ui-manager", ev_window->priv->ui_manager, + "popup-path", "/ToolbarPopup", + "model", toolbars_model, + NULL)); + g_object_unref (toolbars_model); egg_editable_toolbar_show (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), "DefaultToolBar");