X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=2404001ef4862262c01bbb05543b5798619943ee;hb=dbe438c1e95c6d2901c282a0c0e204c94114fb75;hp=c3543af019ba703f8e687e417cd444ff46ad606d;hpb=18be5e6b25095ca2e901d050becd83141face316;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index c3543af0..2404001e 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -37,8 +37,10 @@ #include "ev-password.h" #include "ev-password-view.h" #include "ev-print-job.h" +#include "ev-properties.h" #include "ev-document-thumbnails.h" #include "ev-document-links.h" +#include "ev-document-fonts.h" #include "ev-document-types.h" #include "ev-document-find.h" #include "ev-document-security.h" @@ -158,6 +160,9 @@ static gboolean start_loading_document (EvWindow *ev_wi static void ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window); +static void ev_window_zoom_changed_cb (EvView *view, + GParamSpec *pspec, + EvWindow *ev_window); static void ev_window_add_recent (EvWindow *window, const char *filename); static void ev_window_fullscreen (EvWindow *window); @@ -168,7 +173,8 @@ static void ev_window_run_presentation (EvWindow *windo static void ev_window_stop_presentation (EvWindow *window); static void ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window); - +static void show_fullscreen_popup (EvWindow *window); + G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW) @@ -187,12 +193,17 @@ update_action_sensitivity (EvWindow *ev_window) { EvView *view; EvDocument *document; + const EvDocumentInfo *info = NULL; EvWindowPageMode page_mode; gboolean sensitive, has_pages = FALSE, has_document; int n_pages = 0, page = -1; + gboolean ok_to_print = TRUE; + gboolean ok_to_copy = TRUE; view = EV_VIEW (ev_window->priv->view); document = ev_window->priv->document; + if (document) + info = ev_page_cache_get_info (ev_window->priv->page_cache); page_mode = ev_window->priv->page_mode; has_document = document != NULL; if (has_document && ev_window->priv->page_cache) { @@ -201,17 +212,22 @@ update_action_sensitivity (EvWindow *ev_window) has_pages = has_document && n_pages > 0; } + if (info && info->fields_mask & EV_DOCUMENT_INFO_PERMISSIONS) { + ok_to_print = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_PRINT); + ok_to_copy = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_COPY); + } + /* File menu */ /* "FileOpen": always sensitive */ - set_action_sensitive (ev_window, "FileSaveAs", has_document); - set_action_sensitive (ev_window, "FilePrint", has_pages); + set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy); + set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print); + set_action_sensitive (ev_window, "FileProperties", has_document); /* "FileCloseWindow": always sensitive */ /* Edit menu */ - sensitive = has_pages && ev_document_can_get_text (document); - set_action_sensitive (ev_window, "EditCopy", sensitive); - set_action_sensitive (ev_window, "EditSelectAll", sensitive); + set_action_sensitive (ev_window, "EditCopy", sensitive && ok_to_copy); + set_action_sensitive (ev_window, "EditSelectAll", sensitive && ok_to_copy); set_action_sensitive (ev_window, "EditFind", has_pages && EV_IS_DOCUMENT_FIND (document)); set_action_sensitive (ev_window, "Slash", @@ -226,7 +242,6 @@ update_action_sensitivity (EvWindow *ev_window) has_pages && ev_view_can_zoom_in (view)); set_action_sensitive (ev_window, "ViewZoomOut", has_pages && ev_view_can_zoom_out (view)); - set_action_sensitive (ev_window, "ViewNormalSize", has_pages); set_action_sensitive (ev_window, "ViewBestFit", has_pages); set_action_sensitive (ev_window, "ViewPageWidth", has_pages); set_action_sensitive (ev_window, "ViewReload", has_pages); @@ -303,7 +318,10 @@ update_chrome_visibility (EvWindow *window) set_widget_visibility (priv->fullscreen_toolbar, fullscreen_toolbar); if (priv->fullscreen_popup != NULL) { - set_widget_visibility (priv->fullscreen_popup, fullscreen); + if (fullscreen) + show_fullscreen_popup (window); + else + set_widget_visibility (priv->fullscreen_popup, FALSE); } } @@ -459,11 +477,12 @@ update_sizing_buttons (EvWindow *window) } void -ev_window_open_page (EvWindow *ev_window, int page) +ev_window_open_page_label (EvWindow *ev_window, + const char *label) { if (ev_window->priv->page_cache) { - page = CLAMP (page, 0, ev_page_cache_get_n_pages (ev_window->priv->page_cache)); - ev_page_cache_set_current_page (ev_window->priv->page_cache, page); + ev_page_cache_set_page_label (ev_window->priv->page_cache, + label); } } @@ -578,7 +597,7 @@ update_document_mode (EvWindow *window, EvDocumentMode mode) static void ev_window_setup_document (EvWindow *ev_window) { - EvDocumentInfo *info; + const EvDocumentInfo *info; EvDocument *document; EvView *view = EV_VIEW (ev_window->priv->view); EvSidebar *sidebar = EV_SIDEBAR (ev_window->priv->sidebar); @@ -612,9 +631,8 @@ ev_window_setup_document (EvWindow *ev_window) ev_page_action_set_document (EV_PAGE_ACTION (action), document); update_action_sensitivity (ev_window); - info = ev_document_get_info (document); + info = ev_page_cache_get_info (ev_window->priv->page_cache); update_document_mode (ev_window, info->mode); - ev_document_info_free (info); } static void @@ -1168,6 +1186,27 @@ ev_window_cmd_file_print (GtkAction *action, EvWindow *ev_window) ev_window_print (ev_window); } +static void +ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window) +{ + EvDocument *document = ev_window->priv->document; + EvDocumentInfo *info; + GtkDialog *dialog; + GtkTreeModel *fonts; + + if (EV_IS_DOCUMENT_FONTS (document)) { + fonts = ev_document_fonts_get_fonts_model (EV_DOCUMENT_FONTS (document)); + } else { + fonts = NULL; + } + + info = ev_document_get_info (document); + dialog = ev_properties_new (info, fonts); + gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); + ev_document_info_free (info); +} + static void ev_window_cmd_file_close_window (GtkAction *action, EvWindow *ev_window) { @@ -1362,6 +1401,18 @@ fullscreen_clear_timeout (EvWindow *window) ev_view_show_cursor (EV_VIEW (window->priv->view)); } + +static void +show_fullscreen_popup (EvWindow *window) +{ + if (!GTK_WIDGET_VISIBLE (window->priv->fullscreen_popup)) { + g_object_set (window->priv->fullscreen_popup, "visible", TRUE, NULL); + ev_view_show_cursor (EV_VIEW (window->priv->view)); + } + + fullscreen_set_timeout (window); +} + static gboolean fullscreen_motion_notify_cb (GtkWidget *widget, GdkEventMotion *event, @@ -1369,12 +1420,7 @@ fullscreen_motion_notify_cb (GtkWidget *widget, { EvWindow *window = EV_WINDOW (user_data); - if (!GTK_WIDGET_VISIBLE (window->priv->fullscreen_popup)) { - g_object_set (window->priv->fullscreen_popup, "visible", TRUE, NULL); - ev_view_show_cursor (EV_VIEW (window->priv->view)); - } - - fullscreen_set_timeout (window); + show_fullscreen_popup (window); return FALSE; } @@ -1619,7 +1665,7 @@ ev_window_focus_in_event (GtkWidget *widget, GdkEventFocus *event) NULL); if (fullscreen) - gtk_widget_show (priv->fullscreen_popup); + show_fullscreen_popup (window); return GTK_WIDGET_CLASS (ev_window_parent_class)->focus_in_event (widget, event); } @@ -1726,7 +1772,6 @@ ev_window_cmd_view_zoom_in (GtkAction *action, EvWindow *ev_window) ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FREE); ev_view_zoom_in (EV_VIEW (ev_window->priv->view)); - update_action_sensitivity (ev_window); } static void @@ -1736,16 +1781,6 @@ ev_window_cmd_view_zoom_out (GtkAction *action, EvWindow *ev_window) ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FREE); ev_view_zoom_out (EV_VIEW (ev_window->priv->view)); - update_action_sensitivity (ev_window); -} - -static void -ev_window_cmd_view_normal_size (GtkAction *action, EvWindow *ev_window) -{ - g_return_if_fail (EV_IS_WINDOW (ev_window)); - - ev_view_zoom_normal (EV_VIEW (ev_window->priv->view)); - update_action_sensitivity (ev_window); } static void @@ -1795,7 +1830,11 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) uri = g_strdup (ev_window->priv->uri); ev_window_open (ev_window, uri); - ev_window_open_page (ev_window, page); + + /* In case the number of pages in the document has changed. */ + page = CLAMP (page, 0, ev_page_cache_get_n_pages (ev_window->priv->page_cache)); + + ev_page_cache_set_current_page (ev_window->priv->page_cache, page); g_free (uri); } @@ -1849,7 +1888,7 @@ ev_window_cmd_escape (GtkAction *action, EvWindow *window) } static void -update_view_size (EvWindow *window) +update_view_size (EvView *view, EvWindow *window) { int width, height; GtkRequisition vsb_requisition; @@ -1880,14 +1919,6 @@ update_view_size (EvWindow *window) hsb_requisition.height + scrollbar_spacing); } -static void -size_allocate_cb (GtkWidget *scrolled_window, - GtkAllocation *allocation, - EvWindow *window) -{ - update_view_size (window); -} - static void ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) @@ -1901,10 +1932,10 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, scrolled_window = ev_window->priv->scrolled_window; - g_signal_handlers_disconnect_by_func (scrolled_window, size_allocate_cb, ev_window); + g_signal_handlers_disconnect_by_func (ev_window->priv->view, update_view_size, ev_window); if (sizing_mode != EV_SIZING_FREE) - update_view_size (ev_window); + update_view_size (NULL, ev_window); switch (sizing_mode) { case EV_SIZING_BEST_FIT: @@ -1912,8 +1943,8 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, "hscrollbar-policy", GTK_POLICY_NEVER, "vscrollbar-policy", GTK_POLICY_AUTOMATIC, NULL); - g_signal_connect (scrolled_window, "size-allocate", - G_CALLBACK (size_allocate_cb), + g_signal_connect (ev_window->priv->view, "zoom_invalid", + G_CALLBACK (update_view_size), ev_window); break; case EV_SIZING_FIT_WIDTH: @@ -1921,8 +1952,8 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, "hscrollbar-policy", GTK_POLICY_NEVER, "vscrollbar-policy", GTK_POLICY_AUTOMATIC, NULL); - g_signal_connect (scrolled_window, "size-allocate", - G_CALLBACK (size_allocate_cb), + g_signal_connect (ev_window->priv->view, "zoom_invalid", + G_CALLBACK (update_view_size), ev_window); break; case EV_SIZING_FREE: @@ -1936,6 +1967,13 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, update_sizing_buttons (ev_window); } +static void +ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, + EvWindow *ev_window) +{ + update_action_sensitivity (ev_window); +} + static char * build_comments_string (void) { @@ -2246,7 +2284,6 @@ zoom_control_changed_cb (EphyZoomAction *action, } ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), mode); - update_action_sensitivity (ev_window); } static void @@ -2310,6 +2347,10 @@ ev_window_dispose (GObject *object) priv->find_bar = NULL; } + if (window->priv->fullscreen_timeout_source) { + g_source_destroy (window->priv->fullscreen_timeout_source); + window->priv->fullscreen_timeout_source = NULL; + } destroy_fullscreen_popup (window); G_OBJECT_CLASS (ev_window_parent_class)->dispose (object); @@ -2348,6 +2389,9 @@ static const GtkActionEntry entries[] = { { "FilePrint", GTK_STOCK_PRINT, N_("Print..."), "P", N_("Print this document"), G_CALLBACK (ev_window_cmd_file_print) }, + { "FileProperties", GTK_STOCK_PROPERTIES, N_("Properties"), "Return", + N_("View the properties of this document"), + G_CALLBACK (ev_window_cmd_file_properties) }, { "FileCloseWindow", GTK_STOCK_CLOSE, NULL, "W", N_("Close this window"), G_CALLBACK (ev_window_cmd_file_close_window) }, @@ -2376,18 +2420,15 @@ static const GtkActionEntry entries[] = { { "ViewZoomOut", GTK_STOCK_ZOOM_OUT, NULL, "minus", N_("Shrink the document"), G_CALLBACK (ev_window_cmd_view_zoom_out) }, - { "ViewNormalSize", GTK_STOCK_ZOOM_100, NULL, "0", - N_("Reset the zoom level to the default value"), - G_CALLBACK (ev_window_cmd_view_normal_size) }, { "ViewReload", GTK_STOCK_REFRESH, N_("_Reload"), "R", N_("Reload the document"), G_CALLBACK (ev_window_cmd_view_reload) }, /* Go menu */ - { "GoPreviousPage", GTK_STOCK_GO_BACK, N_("_Previous Page"), "Page_Up", + { "GoPreviousPage", GTK_STOCK_GO_BACK, N_("_Previous Page"), "Page_Up", N_("Go to the previous page"), G_CALLBACK (ev_window_cmd_go_previous_page) }, - { "GoNextPage", GTK_STOCK_GO_FORWARD, N_("_Next Page"), "Page_Down", + { "GoNextPage", GTK_STOCK_GO_FORWARD, N_("_Next Page"), "Page_Down", N_("Go to the next page"), G_CALLBACK (ev_window_cmd_go_next_page) }, { "GoFirstPage", GTK_STOCK_GOTO_FIRST, N_("_First Page"), "Home", @@ -2417,6 +2458,12 @@ static const GtkActionEntry entries[] = { { "Slash", GTK_STOCK_FIND, NULL, "slash", N_("Find a word or phrase in the document"), G_CALLBACK (ev_window_cmd_edit_find) }, + { "PageDown", NULL, "", "Page_Down", + N_("Scroll one page forward"), + G_CALLBACK (ev_window_cmd_scroll_forward) }, + { "PageUp", NULL, "", "Page_Up", + N_("Scroll one page backward"), + G_CALLBACK (ev_window_cmd_scroll_backward) }, { "Space", NULL, "", "space", N_("Scroll one page forward"), G_CALLBACK (ev_window_cmd_scroll_forward) }, @@ -2429,6 +2476,12 @@ static const GtkActionEntry entries[] = { { "ShiftBackSpace", NULL, "", "BackSpace", N_("Scroll one page forward"), G_CALLBACK (ev_window_cmd_scroll_forward) }, + { "Plus", GTK_STOCK_ZOOM_IN, NULL, "plus", + N_("Enlarge the document"), + G_CALLBACK (ev_window_cmd_view_zoom_in) }, + { "Minus", GTK_STOCK_ZOOM_OUT, NULL, "minus", + N_("Shrink the document"), + G_CALLBACK (ev_window_cmd_view_zoom_out) }, { "FocusPageSelector", NULL, "", "l", N_("Focus the page selector"), G_CALLBACK (ev_window_cmd_focus_page_selector) } @@ -2664,10 +2717,15 @@ static void set_view_actions_sensitivity (EvWindow *window, gboolean sensitive) { if (window->priv->action_group) { + set_action_sensitive (window, "PageDown", sensitive); + set_action_sensitive (window, "PageUp", sensitive); set_action_sensitive (window, "Space", sensitive); set_action_sensitive (window, "ShiftSpace", sensitive); set_action_sensitive (window, "BackSpace", sensitive); set_action_sensitive (window, "ShiftBackSpace", sensitive); + set_action_sensitive (window, "Slash", sensitive); + set_action_sensitive (window, "Plus", sensitive); + set_action_sensitive (window, "Minus", sensitive); } } @@ -2743,7 +2801,7 @@ ev_window_init (EvWindow *ev_window) if (!gtk_ui_manager_add_ui_from_file (ev_window->priv->ui_manager, DATADIR"/evince-ui.xml", &error)) { - g_message ("building menus failed: %s", error->message); + g_warning ("building menus failed: %s", error->message); g_error_free (error); } @@ -2880,6 +2938,10 @@ ev_window_init (EvWindow *ev_window) "notify::sizing-mode", G_CALLBACK (ev_window_sizing_mode_changed_cb), ev_window); + g_signal_connect (ev_window->priv->view, + "notify::zoom", + G_CALLBACK (ev_window_zoom_changed_cb), + ev_window); ev_window->priv->statusbar = gtk_statusbar_new (); gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box), @@ -2932,8 +2994,8 @@ ev_window_init (EvWindow *ev_window) G_CALLBACK (find_bar_search_changed_cb), ev_window); - /* Give focus to the scrolled window */ - gtk_widget_grab_focus (ev_window->priv->scrolled_window); + /* Give focus to the document view */ + gtk_widget_grab_focus (ev_window->priv->view); /* Drag and Drop */ gtk_drag_dest_unset (GTK_WIDGET (ev_window));