X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=4c312ea408167c11e843cdd344c717c2e1cf37e0;hb=e71d27db284ccf431167816167bf72f1e23c334d;hp=dd05d662d2b88ab2f871f6d8cd9c48594e8f028f;hpb=c2f1fb8f6d068c53e73e5bcdb7583569dd6c638a;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index dd05d662..4c312ea4 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -49,7 +49,7 @@ #include "ev-document-images.h" #include "ev-document-security.h" #include "ev-document-factory.h" -#include "ev-job-queue.h" +#include "ev-job-scheduler.h" #include "ev-jobs.h" #include "ev-sidebar-page.h" #include "eggfindbar.h" @@ -67,6 +67,10 @@ #include "ev-image.h" #include "ev-message-area.h" #include "ev-mount-operation.h" +#include "ev-file-monitor.h" +#ifdef ENABLE_DBUS +#include "ev-media-player-keys.h" +#endif /* ENABLE_DBUS */ #include @@ -159,6 +163,7 @@ struct _EvWindowPrivate { EvLinkDest *dest; gboolean unlink_temp_file; gboolean in_reload; + EvFileMonitor *monitor; EvDocument *document; EvHistory *history; @@ -167,6 +172,7 @@ struct _EvWindowPrivate { EvWindowTitle *title; EvJob *load_job; + EvJob *reload_job; EvJob *thumbnail_job; EvJob *save_job; EvJob *print_job; @@ -215,13 +221,16 @@ static void ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_si EvWindow *ev_window); static void ev_window_set_page_mode (EvWindow *window, EvWindowPageMode page_mode); -static void ev_window_load_job_cb (EvJobLoad *job, +static void ev_window_load_job_cb (EvJob *job, gpointer data); +static void ev_window_reload_document (EvWindow *window); +static void ev_window_reload_job_cb (EvJob *job, + EvWindow *window); static void ev_window_set_icon_from_thumbnail (EvJobThumbnail *job, EvWindow *ev_window); -static void ev_window_print_job_cb (EvJobPrint *job, +static void ev_window_print_job_cb (EvJob *job, EvWindow *window); -static void ev_window_save_job_cb (EvJobSave *save, +static void ev_window_save_job_cb (EvJob *save, EvWindow *window); static void ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, @@ -625,9 +634,9 @@ ev_window_set_message_area (EvWindow *window, } static void -ev_window_error_message_response_cb (EvMessageArea *area, - gint response_id, - EvWindow *window) +ev_window_message_area_response_cb (EvMessageArea *area, + gint response_id, + EvWindow *window) { ev_window_set_message_area (window, NULL); } @@ -648,7 +657,28 @@ ev_window_error_message (GtkWindow *window, const gchar *msg, GError *error) if (error) ev_message_area_set_secondary_text (EV_MESSAGE_AREA (area), error->message); g_signal_connect (area, "response", - G_CALLBACK (ev_window_error_message_response_cb), + G_CALLBACK (ev_window_message_area_response_cb), + window); + gtk_widget_show (area); + ev_window_set_message_area (EV_WINDOW (window), area); +} + +static void +ev_window_warning_message (GtkWindow *window, const gchar *msg) +{ + GtkWidget *area; + + if (EV_WINDOW (window)->priv->message_area) + return; + + area = ev_message_area_new (GTK_MESSAGE_WARNING, + msg, + GTK_STOCK_CLOSE, + GTK_RESPONSE_CANCEL, + NULL); + + g_signal_connect (area, "response", + G_CALLBACK (ev_window_message_area_response_cb), window); gtk_widget_show (area); ev_window_set_message_area (EV_WINDOW (window), area); @@ -1050,8 +1080,9 @@ static void ev_window_clear_thumbnail_job (EvWindow *ev_window) { if (ev_window->priv->thumbnail_job != NULL) { - ev_job_queue_remove_job (ev_window->priv->thumbnail_job); - + if (!ev_job_is_finished (ev_window->priv->thumbnail_job)) + ev_job_cancel (ev_window->priv->thumbnail_job); + g_signal_handlers_disconnect_by_func (ev_window->priv->thumbnail_job, ev_window_set_icon_from_thumbnail, ev_window); @@ -1079,7 +1110,8 @@ ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation) gdouble scale; EvDocument *document = ev_window->priv->document; - if (!EV_IS_DOCUMENT_THUMBNAILS (document)) { + if (!EV_IS_DOCUMENT_THUMBNAILS (document) || + ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) { return; } @@ -1094,7 +1126,7 @@ ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation) g_signal_connect (ev_window->priv->thumbnail_job, "finished", G_CALLBACK (ev_window_set_icon_from_thumbnail), ev_window); - ev_job_queue_add_job (EV_JOB (ev_window->priv->thumbnail_job), EV_JOB_PRIORITY_LOW); + ev_job_scheduler_push_job (ev_window->priv->thumbnail_job, EV_JOB_PRIORITY_NONE); } static gboolean @@ -1164,11 +1196,21 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document) if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) { ev_view_set_document (view, document); + } else { + ev_window_warning_message (GTK_WINDOW (ev_window), + _("The document contains no pages")); } g_idle_add ((GSourceFunc)ev_window_setup_document, ev_window); } +static void +ev_window_document_changed (EvWindow *ev_window, + gpointer user_data) +{ + ev_window_reload_document (ev_window); +} + static void password_dialog_response (GtkWidget *password_dialog, gint response_id, @@ -1190,7 +1232,7 @@ password_dialog_response (GtkWidget *password_dialog, ev_password_dialog_save_password (EV_PASSWORD_DIALOG (password_dialog)); ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_DOCUMENT); - ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH); + ev_job_scheduler_push_job (ev_window->priv->load_job, EV_JOB_PRIORITY_NONE); gtk_widget_destroy (password_dialog); @@ -1236,9 +1278,8 @@ static void ev_window_clear_load_job (EvWindow *ev_window) { if (ev_window->priv->load_job != NULL) { - - if (!ev_window->priv->load_job->finished) - ev_job_queue_remove_job (ev_window->priv->load_job); + if (!ev_job_is_finished (ev_window->priv->load_job)) + ev_job_cancel (ev_window->priv->load_job); g_signal_handlers_disconnect_by_func (ev_window->priv->load_job, ev_window_load_job_cb, ev_window); g_object_unref (ev_window->priv->load_job); @@ -1246,6 +1287,19 @@ ev_window_clear_load_job (EvWindow *ev_window) } } +static void +ev_window_clear_reload_job (EvWindow *ev_window) +{ + if (ev_window->priv->reload_job != NULL) { + if (!ev_job_is_finished (ev_window->priv->reload_job)) + ev_job_cancel (ev_window->priv->reload_job); + + g_signal_handlers_disconnect_by_func (ev_window->priv->reload_job, ev_window_reload_job_cb, ev_window); + g_object_unref (ev_window->priv->reload_job); + ev_window->priv->reload_job = NULL; + } +} + static void ev_window_clear_local_uri (EvWindow *ev_window) { @@ -1294,21 +1348,22 @@ ev_window_clear_temp_file (EvWindow *ev_window) * function should _not_ necessarily expect those to exist after being * called. */ static void -ev_window_load_job_cb (EvJobLoad *job, +ev_window_load_job_cb (EvJob *job, gpointer data) { EvWindow *ev_window = EV_WINDOW (data); EvDocument *document = EV_JOB (job)->document; + EvJobLoad *job_load = EV_JOB_LOAD (job); + + g_assert (job_load->uri); - g_assert (job->uri); - ev_view_set_loading (EV_VIEW (ev_window->priv->view), FALSE); /* Success! */ - if (job->error == NULL) { + if (!ev_job_is_failed (job)) { ev_window_set_document (ev_window, document); - if (job->mode != EV_WINDOW_MODE_PREVIEW) { + if (job_load->mode != EV_WINDOW_MODE_PREVIEW) { setup_view_from_metadata (ev_window); } @@ -1316,17 +1371,17 @@ ev_window_load_job_cb (EvJobLoad *job, ev_window_add_recent (ev_window, ev_window->priv->uri); } - if (job->dest) { + if (job_load->dest) { EvLink *link; EvLinkAction *link_action; - link_action = ev_link_action_new_dest (g_object_ref (job->dest)); + link_action = ev_link_action_new_dest (g_object_ref (job_load->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) { + switch (job_load->mode) { case EV_WINDOW_MODE_FULLSCREEN: ev_window_run_fullscreen (ev_window); break; @@ -1349,14 +1404,19 @@ ev_window_load_job_cb (EvJobLoad *job, find_bar_search_changed_cb (EGG_FIND_BAR (ev_window->priv->find_bar), NULL, ev_window); } - } else if (job->search_string && EV_IS_DOCUMENT_FIND (document)) { + } else if (job_load->search_string && EV_IS_DOCUMENT_FIND (document)) { ev_window_cmd_edit_find (NULL, ev_window); egg_find_bar_set_search_string (EGG_FIND_BAR (ev_window->priv->find_bar), - job->search_string); + job_load->search_string); } + /* Create a monitor for the document */ + ev_window->priv->monitor = ev_file_monitor_new (job_load->uri); + g_signal_connect_swapped (G_OBJECT (ev_window->priv->monitor), "changed", + G_CALLBACK (ev_window_document_changed), + ev_window); + ev_window_clear_load_job (ev_window); - ev_window->priv->in_reload = FALSE; return; } @@ -1367,7 +1427,7 @@ ev_window_load_job_cb (EvJobLoad *job, setup_view_from_metadata (ev_window); - file = g_file_new_for_uri (job->uri); + file = g_file_new_for_uri (job_load->uri); base_name = g_file_get_basename (file); ev_password_view_set_file_name (EV_PASSWORD_VIEW (ev_window->priv->password_view), base_name); @@ -1381,10 +1441,32 @@ ev_window_load_job_cb (EvJobLoad *job, _("Unable to open document"), job->error); ev_window_clear_load_job (ev_window); - ev_window->priv->in_reload = FALSE; } +} - return; +static void +ev_window_reload_job_cb (EvJob *job, + EvWindow *ev_window) +{ + GtkWidget *widget; + + if (ev_job_is_failed (job)) { + ev_window_clear_reload_job (ev_window); + ev_window->priv->in_reload = FALSE; + return; + } + + ev_window_set_document (ev_window, job->document); + + /* Restart the search after reloading */ + widget = gtk_window_get_focus (GTK_WINDOW (ev_window)); + if (widget && gtk_widget_get_ancestor (widget, EGG_TYPE_FIND_BAR)) { + find_bar_search_changed_cb (EGG_FIND_BAR (ev_window->priv->find_bar), + NULL, ev_window); + } + + ev_window_clear_reload_job (ev_window); + ev_window->priv->in_reload = FALSE; } /** @@ -1466,7 +1548,7 @@ window_open_file_copy_ready_cb (GFile *source, g_file_copy_finish (source, async_result, &error); if (!error) { - ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH); + ev_job_scheduler_push_job (ev_window->priv->load_job, EV_JOB_PRIORITY_NONE); g_object_unref (source); return; @@ -1533,9 +1615,17 @@ ev_window_open_uri (EvWindow *ev_window, { GFile *source_file; + ev_window->priv->in_reload = FALSE; + if (ev_window->priv->uri && g_ascii_strcasecmp (ev_window->priv->uri, uri) == 0) { - ev_window->priv->in_reload = TRUE; + ev_window_reload_document (ev_window); + return; + } + + if (ev_window->priv->monitor) { + g_object_unref (ev_window->priv->monitor); + ev_window->priv->monitor = NULL; } ev_window_close_dialogs (ev_window); @@ -1568,10 +1658,26 @@ ev_window_open_uri (EvWindow *ev_window, ev_window_load_file_remote (ev_window, source_file); } else { g_object_unref (source_file); - ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH); + ev_job_scheduler_push_job (ev_window->priv->load_job, EV_JOB_PRIORITY_NONE); } } +static void +ev_window_reload_document (EvWindow *ev_window) +{ + const gchar *uri; + + ev_window_clear_reload_job (ev_window); + ev_window->priv->in_reload = TRUE; + + uri = ev_window->priv->local_uri ? ev_window->priv->local_uri : ev_window->priv->uri; + ev_window->priv->reload_job = ev_job_load_new (uri, NULL, 0, NULL); + g_signal_connect (ev_window->priv->reload_job, "finished", + G_CALLBACK (ev_window_reload_job_cb), + ev_window); + ev_job_scheduler_push_job (ev_window->priv->reload_job, EV_JOB_PRIORITY_NONE); +} + static void file_open_dialog_response_cb (GtkWidget *chooser, gint response_id, @@ -1941,7 +2047,7 @@ window_save_file_copy_ready_cb (GFile *src, _("The file could not be saved as “%s”."), name); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - error->message); + "%s", error->message); g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); @@ -1970,8 +2076,8 @@ static void ev_window_clear_save_job (EvWindow *ev_window) { if (ev_window->priv->save_job != NULL) { - if (!ev_window->priv->save_job->finished) - ev_job_queue_remove_job (ev_window->priv->save_job); + if (!ev_job_is_finished (ev_window->priv->save_job)) + ev_job_cancel (ev_window->priv->save_job); g_signal_handlers_disconnect_by_func (ev_window->priv->save_job, ev_window_save_job_cb, @@ -1982,13 +2088,14 @@ ev_window_clear_save_job (EvWindow *ev_window) } static void -ev_window_save_job_cb (EvJobSave *job, +ev_window_save_job_cb (EvJob *job, EvWindow *window) { - if (job->error) { + if (ev_job_is_failed (job)) { gchar *msg; - msg = g_strdup_printf (_("The file could not be saved as “%s”."), job->uri); + msg = g_strdup_printf (_("The file could not be saved as “%s”."), + EV_JOB_SAVE (job)->uri); ev_window_error_message (GTK_WINDOW (window), msg, job->error); g_free (msg); } @@ -2017,10 +2124,9 @@ file_save_dialog_response_cb (GtkWidget *fc, G_CALLBACK (ev_window_save_job_cb), ev_window); /* The priority doesn't matter for this job */ - ev_job_queue_add_job (ev_window->priv->save_job, EV_JOB_PRIORITY_LOW); + ev_job_scheduler_push_job (ev_window->priv->save_job, EV_JOB_PRIORITY_NONE); g_free (uri); - gtk_widget_destroy (fc); } @@ -2090,8 +2196,8 @@ static void ev_window_clear_print_job (EvWindow *window) { if (window->priv->print_job) { - if (!window->priv->print_job->finished) - ev_job_queue_remove_job (window->priv->print_job); + if (!ev_job_is_finished (window->priv->print_job)) + ev_job_cancel (window->priv->print_job); g_signal_handlers_disconnect_by_func (window->priv->print_job, ev_window_print_job_cb, @@ -2156,7 +2262,7 @@ ev_window_print_finished (GtkPrintJob *print_job, GTK_BUTTONS_OK, _("Failed to print document")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - error->message); + "%s", error->message); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); @@ -2228,7 +2334,7 @@ ev_window_print_send (EvWindow *window, GtkPrintJob *job; GError *error = NULL; - job = gtk_print_job_new ("evince-print", + job = gtk_print_job_new (gtk_window_get_title (GTK_WINDOW (window)), window->priv->printer, settings, window->priv->print_page_setup); @@ -2243,7 +2349,7 @@ ev_window_print_send (EvWindow *window, window, NULL); } else { ev_window_clear_print_job (window); - g_warning (error->message); + g_warning ("%s", error->message); g_error_free (error); } } @@ -2252,18 +2358,18 @@ ev_window_print_send (EvWindow *window, } static void -ev_window_print_job_cb (EvJobPrint *job, - EvWindow *window) +ev_window_print_job_cb (EvJob *job, + EvWindow *window) { - if (job->error) { - g_warning (job->error->message); + if (ev_job_is_failed (job)) { + g_warning ("%s", job->error->message); ev_window_clear_print_job (window); return; } - g_assert (job->temp_file != NULL); + g_assert (EV_JOB_PRINT (job)->temp_file != NULL); - ev_window_print_send (window, job->temp_file); + ev_window_print_send (window, EV_JOB_PRINT (job)->temp_file); } static gboolean @@ -2397,7 +2503,7 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog, G_CALLBACK (ev_window_print_job_cb), window); /* The priority doesn't matter for this job */ - ev_job_queue_add_job (window->priv->print_job, EV_JOB_PRIORITY_LOW); + ev_job_scheduler_push_job (window->priv->print_job, EV_JOB_PRIORITY_NONE); gtk_widget_destroy (GTK_WIDGET (dialog)); window->priv->print_dialog = NULL; @@ -3021,6 +3127,35 @@ ev_window_screen_changed (GtkWidget *widget, } } +static gboolean +ev_window_state_event (GtkWidget *widget, + GdkEventWindowState *event) +{ + EvWindow *window = EV_WINDOW (widget); + EvView *view = EV_VIEW (window->priv->view); + + if (GTK_WIDGET_CLASS (ev_window_parent_class)->window_state_event) { + GTK_WIDGET_CLASS (ev_window_parent_class)->window_state_event (widget, event); + } + + if ((event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) == 0) + return FALSE; + + if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) { + if (ev_view_get_fullscreen (view) || ev_view_get_presentation (view)) + return FALSE; + + ev_window_run_fullscreen (window); + } else { + if (ev_view_get_fullscreen (view)) + ev_window_stop_fullscreen (window, FALSE); + else if (ev_view_get_presentation (view)) + ev_window_stop_presentation (window, FALSE); + } + + return FALSE; +} + static void ev_window_set_page_mode (EvWindow *window, EvWindowPageMode page_mode) @@ -3137,6 +3272,12 @@ ev_window_cmd_go_previous_page (GtkAction *action, EvWindow *ev_window) ev_view_previous_page (EV_VIEW (ev_window->priv->view)); } +void +ev_window_go_previous_page (EvWindow *ev_window) +{ + ev_window_cmd_go_previous_page (NULL, ev_window); +} + static void ev_window_cmd_go_next_page (GtkAction *action, EvWindow *ev_window) { @@ -3145,6 +3286,12 @@ ev_window_cmd_go_next_page (GtkAction *action, EvWindow *ev_window) ev_view_next_page (EV_VIEW (ev_window->priv->view)); } +void +ev_window_go_next_page (EvWindow *ev_window) +{ + ev_window_cmd_go_next_page (NULL, ev_window); +} + static void ev_window_cmd_go_first_page (GtkAction *action, EvWindow *ev_window) { @@ -3153,6 +3300,12 @@ ev_window_cmd_go_first_page (GtkAction *action, EvWindow *ev_window) ev_page_cache_set_current_page (ev_window->priv->page_cache, 0); } +void +ev_window_go_first_page (EvWindow *ev_window) +{ + ev_window_cmd_go_first_page (NULL, ev_window); +} + static void ev_window_cmd_go_last_page (GtkAction *action, EvWindow *ev_window) { @@ -3164,6 +3317,12 @@ ev_window_cmd_go_last_page (GtkAction *action, EvWindow *ev_window) ev_page_cache_set_current_page (ev_window->priv->page_cache, n_pages - 1); } +void +ev_window_go_last_page (EvWindow *ev_window) +{ + ev_window_cmd_go_last_page (NULL, ev_window); +} + static void ev_window_cmd_go_forward (GtkAction *action, EvWindow *ev_window) { @@ -3194,11 +3353,7 @@ ev_window_cmd_go_backward (GtkAction *action, EvWindow *ev_window) static void ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) { - gchar *uri; - - uri = g_strdup (ev_window->priv->uri); - ev_window_open_uri (ev_window, uri, NULL, 0, NULL, FALSE, NULL); - g_free (uri); + ev_window_reload_document (ev_window); } static void @@ -3250,7 +3405,7 @@ ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) screen = gtk_widget_get_screen (GTK_WIDGET (ev_window)); gdk_spawn_command_line_on_screen (screen, command, &error); if (error != NULL) { - g_warning (error->message); + g_warning ("%s", error->message); g_error_free (error); } g_free (command); @@ -3268,6 +3423,12 @@ ev_window_cmd_start_presentation (GtkAction *action, EvWindow *window) ev_window_run_presentation (window); } +void +ev_window_start_presentation (EvWindow *ev_window) +{ + ev_window_run_presentation (ev_window); +} + static gboolean ev_window_enumerate_printer_cb (GtkPrinter *printer, EvWindow *window) @@ -3306,7 +3467,7 @@ ev_window_preview_print_finished (GtkPrintJob *print_job, GTK_BUTTONS_OK, _("Failed to print document")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), - error->message); + "%s", error->message); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); @@ -3330,7 +3491,7 @@ ev_window_do_preview_print (EvWindow *window) page_setup = gtk_page_setup_new (); - job = gtk_print_job_new ("evince-print", + job = gtk_print_job_new (gtk_window_get_title (GTK_WINDOW (window)), priv->printer, priv->print_settings, page_setup); @@ -3350,7 +3511,7 @@ ev_window_do_preview_print (EvWindow *window) (GtkPrintJobCompleteFunc)ev_window_preview_print_finished, window, NULL); } else { - g_warning (error->message); + g_warning ("%s", error->message); g_error_free (error); } @@ -3375,7 +3536,7 @@ ev_window_cmd_preview_print (GtkAction *action, EvWindow *window) &error); if (error) { - g_warning (error->message); + g_warning ("%s", error->message); g_error_free (error); print_settings = NULL; } @@ -3951,11 +4112,13 @@ find_bar_visibility_changed_cb (EggFindBar *find_bar, if (ev_window->priv->document && EV_IS_DOCUMENT_FIND (ev_window->priv->document)) { - ev_view_set_highlight_search (EV_VIEW(ev_window->priv->view), visible); - ev_view_search_changed (EV_VIEW(ev_window->priv->view)); + ev_view_set_highlight_search (EV_VIEW (ev_window->priv->view), visible); + ev_view_search_changed (EV_VIEW (ev_window->priv->view)); ev_window_update_actions (ev_window); - if (!visible) + if (visible) + find_bar_search_changed_cb (find_bar, NULL, ev_window); + else egg_find_bar_set_status_text (EGG_FIND_BAR (ev_window->priv->find_bar), NULL); } } @@ -4011,7 +4174,21 @@ ev_window_dispose (GObject *object) { EvWindow *window = EV_WINDOW (object); EvWindowPrivate *priv = window->priv; +#ifdef ENABLE_DBUS + GObject *keys; + + keys = ev_application_get_media_keys (EV_APP); + if (keys) { + ev_media_player_keys_focused (EV_MEDIA_PLAYER_KEYS (keys), NULL); + g_object_unref (keys); + } +#endif /* ENABLE_DBUS */ + if (priv->monitor) { + g_object_unref (priv->monitor); + priv->monitor = NULL; + } + if (priv->title) { ev_window_title_free (priv->title); priv->title = NULL; @@ -4075,6 +4252,10 @@ ev_window_dispose (GObject *object) ev_window_clear_load_job (window); } + if (priv->reload_job) { + ev_window_clear_reload_job (window); + } + if (priv->save_job) { ev_window_clear_save_job (window); } @@ -4177,6 +4358,7 @@ ev_window_class_init (EvWindowClass *ev_window_class) g_object_class->finalize = ev_window_finalize; widget_class->screen_changed = ev_window_screen_changed; + widget_class->window_state_event = ev_window_state_event; g_type_class_add_private (g_object_class, sizeof (EvWindowPrivate)); } @@ -4193,7 +4375,7 @@ 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_("Op_en a Copy"), NULL, + { "FileOpenCopy", NULL, N_("Op_en a Copy"), "N", 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", @@ -4224,9 +4406,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", EV_STOCK_ROTATE_LEFT, N_("Rotate _Left"), NULL, NULL, + { "EditRotateLeft", EV_STOCK_ROTATE_LEFT, N_("Rotate _Left"), "Left", NULL, G_CALLBACK (ev_window_cmd_edit_rotate_left) }, - { "EditRotateRight", EV_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), NULL, NULL, + { "EditRotateRight", EV_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), "Right", NULL, G_CALLBACK (ev_window_cmd_edit_rotate_right) }, /* View menu */ @@ -4525,6 +4707,16 @@ sidebar_widget_model_set (EvSidebarLinks *ev_sidebar_links, static gboolean view_actions_focus_in_cb (GtkWidget *widget, GdkEventFocus *event, EvWindow *window) { +#ifdef ENABLE_DBUS + GObject *keys; + + keys = ev_application_get_media_keys (EV_APP); + if (keys) { + ev_media_player_keys_focused (EV_MEDIA_PLAYER_KEYS (keys), window); + g_object_unref (keys); + } +#endif /* ENABLE_DBUS */ + update_chrome_flag (window, EV_CHROME_RAISE_TOOLBAR, FALSE); ev_window_set_action_sensitive (window, "ViewToolbar", TRUE);