397
385
ev_window_set_action_sensitive (ev_window, "FileOpenCopy", has_document);
398
386
ev_window_set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy);
399
ev_window_set_action_sensitive (ev_window, "FilePrintSetup", has_pages && ok_to_print);
387
ev_window_set_action_sensitive (ev_window, "FilePageSetup", has_pages && ok_to_print);
400
388
ev_window_set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print);
401
389
ev_window_set_action_sensitive (ev_window, "FileProperties", has_document && has_properties);
549
537
(priv->chrome & EV_CHROME_RAISE_TOOLBAR) != 0) && fullscreen;
550
538
findbar = (priv->chrome & EV_CHROME_FINDBAR) != 0;
551
539
sidebar = (priv->chrome & EV_CHROME_SIDEBAR) != 0 && !presentation;
552
preview_toolbar = (priv->chrome& EV_CHROME_PREVIEW_TOOLBAR);
554
541
set_widget_visibility (priv->menubar, menubar);
555
542
set_widget_visibility (priv->toolbar, toolbar);
556
543
set_widget_visibility (priv->find_bar, findbar);
557
544
set_widget_visibility (priv->sidebar, sidebar);
559
if (priv->preview_toolbar)
560
set_widget_visibility (priv->preview_toolbar, preview_toolbar);
562
546
ev_window_set_action_sensitive (window, "EditToolbar", toolbar);
563
547
gtk_widget_set_sensitive (priv->menubar, menubar);
1260
1247
ev_window->priv->dest = NULL;
1263
if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) {
1250
if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) {
1251
ev_window_warning_message (ev_window, "%s",
1252
_("The document contains no pages"));
1253
} else if (ev_page_cache_check_dimensions (ev_window->priv->page_cache)) {
1254
ev_window_warning_message (ev_window, "%s",
1255
_("The document contains only empty pages"));
1264
1257
ev_view_set_document (view, document);
1266
ev_window_warning_message (ev_window, "%s",
1267
_("The document contains no pages"));
1270
1260
if (ev_window->priv->setup_document_idle > 0)
1271
1261
g_source_remove (ev_window->priv->setup_document_idle);
1272
1263
ev_window->priv->setup_document_idle = g_idle_add ((GSourceFunc)ev_window_setup_document, ev_window);
1348
1329
file = g_file_new_for_uri (ev_window->priv->uri);
1349
tempdir = g_file_new_for_path (g_get_tmp_dir ());
1330
tempdir = g_file_new_for_path (ev_tmp_dir ());
1351
1332
if (g_file_has_prefix (file, tempdir)) {
1352
g_file_delete (file, NULL, NULL);
1333
GFileInfo *file_info;
1334
GError *error = NULL;
1336
file_info = g_file_query_info (file,
1337
G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK,
1338
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
1341
if (g_file_info_get_is_symlink (file_info))
1342
g_file_delete (file, NULL, NULL);
1343
g_object_unref (file_info);
1345
g_warning ("Error deleting temp symlink: %s\n", error->message);
1346
g_error_free (error);
1355
1350
g_object_unref (file);
1381
1376
ev_window_set_document (ev_window, document);
1383
1378
setup_document_from_metadata (ev_window);
1385
if (ev_window->priv->window_mode != EV_WINDOW_MODE_PREVIEW) {
1386
setup_view_from_metadata (ev_window);
1379
setup_view_from_metadata (ev_window);
1389
if (!ev_window->priv->unlink_temp_file) {
1390
ev_window_add_recent (ev_window, ev_window->priv->uri);
1381
ev_window_add_recent (ev_window, ev_window->priv->uri);
1393
1383
ev_window_title_set_type (ev_window->priv->title,
1394
1384
EV_WINDOW_TITLE_DOCUMENT);
1710
if (error->domain == G_IO_ERROR &&
1711
error->code == G_IO_ERROR_NOT_MOUNTED) {
1702
if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) {
1712
1703
GMountOperation *operation;
1714
operation = ev_mount_operation_new (GTK_WINDOW (ev_window));
1705
operation = gtk_mount_operation_new (GTK_WINDOW (ev_window));
1715
1706
g_file_mount_enclosing_volume (source,
1716
1707
G_MOUNT_MOUNT_NONE,
1717
1708
operation, NULL,
1718
1709
(GAsyncReadyCallback)mount_volume_ready_cb,
1720
1711
g_object_unref (operation);
1721
} else if (error->domain == G_IO_ERROR &&
1722
error->code == G_IO_ERROR_CANCELLED) {
1712
} else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
1723
1713
ev_window_clear_load_job (ev_window);
1724
1714
ev_window_clear_local_uri (ev_window);
1725
ev_window_clear_print_settings_file (ev_window);
1726
1715
g_free (ev_window->priv->uri);
1727
1716
ev_window->priv->uri = NULL;
1728
1717
g_object_unref (source);
1824
1811
ev_window_close_dialogs (ev_window);
1825
1812
ev_window_clear_load_job (ev_window);
1826
1813
ev_window_clear_local_uri (ev_window);
1827
ev_window_clear_print_settings_file (ev_window);
1828
1814
ev_view_set_loading (EV_VIEW (ev_window->priv->view), TRUE);
1830
ev_window->priv->unlink_temp_file = unlink_temp_file;
1831
1816
ev_window->priv->window_mode = mode;
1833
if (mode == EV_WINDOW_MODE_PREVIEW) {
1834
ev_window->priv->print_settings_file = print_settings ?
1835
g_strdup (print_settings) : NULL;
1838
1818
if (ev_window->priv->uri)
1839
1819
g_free (ev_window->priv->uri);
1840
1820
ev_window->priv->uri = g_strdup (uri);
2117
2097
if (tmp_filename)
2118
2098
g_free (tmp_filename);
2100
g_object_unref (tmp_file);
2101
g_clear_error (&link_error);
2120
2103
basename = g_strdup_printf ("%s-%d", name, i++);
2121
2104
tmp_filename = g_build_filename (ev_tmp_dir (),
2122
2105
basename, NULL);
2124
2107
g_free (basename);
2125
} while ((res = symlink (filename, tmp_filename)) != 0 && errno == EEXIST);
2108
tmp_file = g_file_new_for_path (tmp_filename);
2109
} while (!g_file_make_symbolic_link (tmp_file, filename, NULL, &link_error) &&
2110
g_error_matches (link_error, G_IO_ERROR, G_IO_ERROR_EXISTS));
2129
if (res != 0 && errno != EEXIST) {
2131
*error = g_error_new (G_FILE_ERROR,
2132
g_file_error_from_errno (errno),
2133
_("Couldn't create symlink “%s”: %s"),
2134
tmp_filename, strerror (errno));
2113
g_object_unref (tmp_file);
2116
g_propagate_prefixed_error (error,
2118
_("Couldn't create symlink “%s”: "),
2137
2120
g_free (tmp_filename);
2142
2125
return tmp_filename;
3602
ev_window_run_preview (EvWindow *window)
3606
if (!window->priv->preview_toolbar) {
3607
window->priv->preview_toolbar =
3608
gtk_ui_manager_get_widget (window->priv->ui_manager,
3611
gtk_box_pack_start (GTK_BOX (window->priv->main_box),
3612
window->priv->preview_toolbar,
3614
gtk_box_reorder_child (GTK_BOX (window->priv->main_box),
3615
window->priv->preview_toolbar, 1);
3618
ev_view_set_continuous (EV_VIEW (window->priv->view), FALSE);
3620
update_chrome_flag (window, EV_CHROME_TOOLBAR, FALSE);
3621
update_chrome_flag (window, EV_CHROME_MENUBAR, FALSE);
3622
update_chrome_flag (window, EV_CHROME_SIDEBAR, FALSE);
3624
update_chrome_flag (window, EV_CHROME_PREVIEW_TOOLBAR, TRUE);
3626
action = gtk_action_group_get_action (window->priv->action_group,
3628
gtk_action_set_visible (action, TRUE);
3630
update_chrome_visibility (window);
3634
3580
ev_window_screen_changed (GtkWidget *widget,
3635
3581
GdkScreen *old_screen)
3877
3822
g_error_free (error);
3880
#else /* !GTK_CHECK_VERSION (2, 14, 0) */
3882
ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
3884
GError *error = NULL;
3892
const char * const * langs = g_get_language_names ();
3894
for (i = 0; langs[i]; i++) {
3896
if (strchr (lang, '.')) {
3900
uri = g_build_filename(GNOMEDATADIR,
3901
"/gnome/help/" PACKAGE,
3906
if (g_file_test (uri, G_FILE_TEST_EXISTS)) {
3914
g_warning ("Cannot find help");
3918
command = g_strconcat ("gnome-help ghelp://", uri, NULL);
3921
screen = gtk_widget_get_screen (GTK_WIDGET (ev_window));
3922
gdk_spawn_command_line_on_screen (screen, command, &error);
3923
if (error != NULL) {
3924
g_warning ("%s", error->message);
3925
g_error_free (error);
3929
#endif /* GTK_CHECK_VERSION (2, 14, 0) */
3932
3827
ev_window_cmd_leave_fullscreen (GtkAction *action, EvWindow *window)
3940
3835
ev_window_run_presentation (window);
3944
ev_window_enumerate_printer_cb (GtkPrinter *printer,
3947
EvWindowPrivate *priv = window->priv;
3948
const gchar *printer_name;
3950
printer_name = gtk_print_settings_get_printer (priv->print_settings);
3952
&& strcmp (printer_name, gtk_printer_get_name (printer)) == 0) ||
3953
(!printer_name && gtk_printer_is_default (printer))) {
3955
g_object_unref (priv->printer);
3956
priv->printer = g_object_ref (printer);
3958
/* Now that we have the printer, we'll start the print */
3959
ev_window_do_preview_print (window);
3961
return TRUE; /* we're done */
3964
return FALSE; /* continue the enumeration */
3968
ev_window_preview_print_finished (GtkPrintJob *print_job,
3973
ev_window_error_message (window, error,
3974
"%s", _("Failed to print document"));
3977
g_object_unref (print_job);
3978
gtk_widget_destroy (GTK_WIDGET (window));
3982
ev_window_do_preview_print (EvWindow *window)
3984
EvWindowPrivate *priv = window->priv;
3987
GError *error = NULL;
3989
g_assert (priv->print_settings != NULL);
3990
g_assert (priv->printer != NULL);
3992
job = gtk_print_job_new (gtk_window_get_title (GTK_WINDOW (window)),
3994
priv->print_settings,
3995
priv->print_page_setup);
3997
g_object_unref (priv->print_settings);
3998
priv->print_settings = NULL;
3999
g_object_unref (priv->print_page_setup);
4000
priv->print_page_setup = NULL;
4001
g_object_unref (priv->printer);
4002
priv->printer = NULL;
4004
filename = g_filename_from_uri (priv->local_uri ?
4005
priv->local_uri : priv->uri,
4008
if (gtk_print_job_set_source_file (job, filename, &error)) {
4009
gtk_print_job_send (job,
4010
(GtkPrintJobCompleteFunc)ev_window_preview_print_finished,
4013
g_warning ("%s", error->message);
4014
g_error_free (error);
4019
gtk_widget_hide (GTK_WIDGET (window));
4023
ev_window_cmd_preview_print (GtkAction *action, EvWindow *window)
4025
EvWindowPrivate *priv = window->priv;
4026
GtkPrintSettings *print_settings;
4027
GtkPageSetup *page_setup;
4028
const gchar *print_settings_file = priv->print_settings_file;
4030
if (print_settings_file && g_file_test (print_settings_file, G_FILE_TEST_IS_REGULAR)) {
4032
GError *error = NULL;
4034
key_file = g_key_file_new ();
4035
g_key_file_load_from_file (key_file,
4036
print_settings_file,
4037
G_KEY_FILE_KEEP_COMMENTS |
4038
G_KEY_FILE_KEEP_TRANSLATIONS,
4042
gtk_print_settings_new_from_key_file (key_file,
4045
print_settings = print_settings ? print_settings : gtk_print_settings_new ();
4047
page_setup = gtk_page_setup_new_from_key_file (key_file,
4050
page_setup = page_setup ? page_setup : gtk_page_setup_new ();
4052
print_settings = gtk_print_settings_new ();
4053
page_setup = gtk_page_setup_new ();
4054
g_error_free (error);
4057
g_key_file_free (key_file);
4059
print_settings = gtk_print_settings_new ();
4060
page_setup = gtk_page_setup_new ();
4063
if (priv->print_settings)
4064
g_object_unref (priv->print_settings);
4065
priv->print_settings = print_settings;
4066
if (priv->print_page_setup)
4067
g_object_unref (priv->print_page_setup);
4068
priv->print_page_setup = page_setup;
4070
gtk_enumerate_printers ((GtkPrinterFunc) ev_window_enumerate_printer_cb,
4071
window, NULL, FALSE);
4075
3839
ev_window_cmd_escape (GtkAction *action, EvWindow *window)
4120
3884
enum_value->value_nick);
3888
ev_window_set_view_size (EvWindow *window)
3891
GtkRequisition vsb_requisition;
3892
GtkRequisition hsb_requisition;
3893
gint scrollbar_spacing;
3894
GtkWidget *scrolled_window = window->priv->scrolled_window;
3896
if (!window->priv->view)
3899
/* Calculate the width available for the content */
3900
width = scrolled_window->allocation.width;
3901
height = scrolled_window->allocation.height;
3903
if (gtk_scrolled_window_get_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window)) == GTK_SHADOW_IN) {
3904
width -= 2 * window->priv->view->style->xthickness;
3905
height -= 2 * window->priv->view->style->ythickness;
3908
gtk_widget_size_request (GTK_SCROLLED_WINDOW (scrolled_window)->vscrollbar,
3910
gtk_widget_size_request (GTK_SCROLLED_WINDOW (scrolled_window)->hscrollbar,
3912
gtk_widget_style_get (scrolled_window,
3913
"scrollbar_spacing",
3917
ev_view_set_zoom_for_size (EV_VIEW (window->priv->view),
3920
vsb_requisition.width + scrollbar_spacing,
3921
hsb_requisition.height + scrollbar_spacing);
4124
3925
ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
4125
3926
EvWindow *ev_window)
4127
GtkWidget *scrolled_window;
4128
3928
EvSizingMode sizing_mode;
4130
3930
g_object_get (ev_window->priv->view,
4131
3931
"sizing-mode", &sizing_mode,
4134
scrolled_window = ev_window->priv->scrolled_window;
4136
g_signal_handlers_disconnect_by_func (ev_window->priv->view, ev_view_update_view_size, scrolled_window);
4138
if (sizing_mode != EV_SIZING_FREE)
4139
ev_view_update_view_size (EV_VIEW (ev_window->priv->view),
4140
GTK_SCROLLED_WINDOW (scrolled_window));
4142
switch (sizing_mode) {
4143
case EV_SIZING_BEST_FIT:
4144
g_object_set (G_OBJECT (scrolled_window),
4145
"hscrollbar-policy", GTK_POLICY_NEVER,
4146
"vscrollbar-policy", GTK_POLICY_AUTOMATIC,
4148
g_signal_connect (ev_window->priv->view, "zoom_invalid",
4149
G_CALLBACK (ev_view_update_view_size),
4152
case EV_SIZING_FIT_WIDTH:
4153
g_object_set (G_OBJECT (scrolled_window),
4154
"hscrollbar-policy", GTK_POLICY_NEVER,
4155
"vscrollbar-policy", GTK_POLICY_AUTOMATIC,
4157
g_signal_connect (ev_window->priv->view, "zoom_invalid",
4158
G_CALLBACK (ev_view_update_view_size),
4161
case EV_SIZING_FREE:
4162
g_object_set (G_OBJECT (scrolled_window),
4163
"hscrollbar-policy", GTK_POLICY_AUTOMATIC,
4164
"vscrollbar-policy", GTK_POLICY_AUTOMATIC,
3934
g_object_set (ev_window->priv->scrolled_window,
3935
"hscrollbar-policy",
3936
sizing_mode == EV_SIZING_FREE ?
3937
GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER,
3938
"vscrollbar-policy", GTK_POLICY_AUTOMATIC,
4169
3941
update_sizing_buttons (ev_window);
4170
3942
save_sizing_mode (ev_window);
4981
4755
G_OBJECT_CLASS (ev_window_parent_class)->dispose (object);
4759
ev_window_key_press_event (GtkWidget *widget,
4762
EvWindow *ev_window = EV_WINDOW (widget);
4763
gboolean handled = FALSE;
4765
/* Propagate the event to the view first
4766
* It's needed to be able to type in
4767
* annot popups windows
4769
if (ev_window->priv->view) {
4770
g_object_ref (ev_window->priv->view);
4771
if (GTK_WIDGET_IS_SENSITIVE (ev_window->priv->view))
4772
handled = gtk_widget_event (ev_window->priv->view, (GdkEvent*) event);
4773
g_object_unref (ev_window->priv->view);
4777
handled = GTK_WIDGET_CLASS (ev_window_parent_class)->key_press_event (widget, event);
4985
4783
ev_window_class_init (EvWindowClass *ev_window_class)
5015
4814
{ "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy..."), "<control>S",
5016
4815
N_("Save a copy of the current document"),
5017
4816
G_CALLBACK (ev_window_cmd_save_as) },
5018
{ "FilePrintSetup", NULL, N_("Print Set_up..."), NULL,
4817
{ "FilePageSetup", GTK_STOCK_PAGE_SETUP, N_("Page Set_up..."), NULL,
5019
4818
N_("Setup the page settings for printing"),
5020
4819
G_CALLBACK (ev_window_cmd_file_print_setup) },
5021
4820
{ "FilePrint", GTK_STOCK_PRINT, N_("_Print..."), "<control>P",
5040
4839
G_CALLBACK (ev_window_cmd_edit_find_previous) },
5041
4840
{ "EditToolbar", NULL, N_("T_oolbar"), NULL, NULL,
5042
4841
G_CALLBACK (ev_window_cmd_edit_toolbar) },
5043
{ "EditRotateLeft", EV_STOCK_ROTATE_LEFT, N_("Rotate _Left"), "<alt>Left", NULL,
4842
{ "EditRotateLeft", EV_STOCK_ROTATE_LEFT, N_("Rotate _Left"), "<control>Left", NULL,
5044
4843
G_CALLBACK (ev_window_cmd_edit_rotate_left) },
5045
{ "EditRotateRight", EV_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), "<alt>Right", NULL,
4844
{ "EditRotateRight", EV_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), "<control>Right", NULL,
5046
4845
G_CALLBACK (ev_window_cmd_edit_rotate_right) },
5048
4847
/* View menu */
5087
4886
{ "StartPresentation", EV_STOCK_RUN_PRESENTATION, N_("Start Presentation"), NULL,
5088
4887
N_("Start a presentation"),
5089
4888
G_CALLBACK (ev_window_cmd_start_presentation) },
5090
{ "PreviewPrint", GTK_STOCK_PRINT, N_("Print"), NULL,
5091
N_("Print this document"),
5092
G_CALLBACK (ev_window_cmd_preview_print) },
5094
4890
/* Accellerators */
5095
4891
{ "Escape", NULL, "", "Escape", "",
5096
4892
G_CALLBACK (ev_window_cmd_escape) },
5097
4893
{ "Slash", GTK_STOCK_FIND, NULL, "slash", NULL,
5098
4894
G_CALLBACK (ev_window_cmd_edit_find) },
4895
{ "F3", NULL, "", "F3", NULL,
4896
G_CALLBACK (ev_window_cmd_edit_find_next) },
5099
4897
{ "PageDown", NULL, "", "Page_Down", NULL,
5100
4898
G_CALLBACK (ev_window_cmd_scroll_forward) },
5101
4899
{ "PageUp", NULL, "", "Page_Up", NULL,
5508
5304
const gchar *uri = ev_link_action_get_uri (action);
5509
5305
GError *error = NULL;
5511
#if GTK_CHECK_VERSION (2, 14, 0)
5512
GAppLaunchContext *context = NULL;
5307
GAppLaunchContext *context;
5515
#if GTK_CHECK_VERSION (2, 14, 0)
5516
5309
context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ());
5517
5310
gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context),
5518
5311
gtk_window_get_screen (GTK_WINDOW (window)));
5519
5312
gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context),
5520
5313
GDK_CURRENT_TIME);
5523
5315
if (!g_strstr_len (uri, strlen (uri), "://") &&
5524
5316
!g_str_has_prefix (uri, "mailto:")) {