X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=b18f98502f3940d472aba6a466ce04c523505b48;hb=59bc4c9a45ccb89fa44f5e6311e3668285a63d68;hp=63b1b9c1e618cfdbe08fb7f216d0e64e880d4c57;hpb=d0e4d9279d7aa4be1ddec50c2a87c63638632712;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 63b1b9c1..b18f9850 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -37,7 +37,8 @@ #include "ev-password.h" #include "ev-password-view.h" #include "ev-print-job.h" -#include "ev-properties.h" +#include "ev-properties-dialog.h" +#include "ev-ps-exporter.h" #include "ev-document-thumbnails.h" #include "ev-document-links.h" #include "ev-document-fonts.h" @@ -107,7 +108,7 @@ struct _EvWindowPrivate { GtkWidget *sidebar_thumbs; /* Dialogs */ - EvProperties *properties; + GtkWidget *properties; /* UI Builders */ GtkActionGroup *action_group; @@ -180,8 +181,8 @@ static void ev_window_zoom_changed_cb (EvView *view, EvWindow *ev_window); static void ev_window_add_recent (EvWindow *window, const char *filename); -static void ev_window_fullscreen (EvWindow *window); -static void ev_window_unfullscreen (EvWindow *window); +static void ev_window_run_fullscreen (EvWindow *window); +static void ev_window_stop_fullscreen (EvWindow *window); static void ev_window_cmd_view_fullscreen (GtkAction *action, EvWindow *window); static void ev_window_run_presentation (EvWindow *window); @@ -189,7 +190,7 @@ static void ev_window_stop_presentation (EvWindow *windo 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) @@ -237,6 +238,9 @@ update_action_sensitivity (EvWindow *ev_window) ok_to_copy = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_COPY); } + if (has_document && !EV_IS_PS_EXPORTER(document)) + ok_to_print = FALSE; + if (!info || info->fields_mask == 0) { has_properties = FALSE; } @@ -614,6 +618,8 @@ page_changed_cb (EvPageCache *page_cache, EvWindow *ev_window) { update_action_sensitivity (ev_window); + + ev_metadata_manager_set_int (ev_window->priv->uri, "page", page); } static void @@ -623,10 +629,24 @@ update_document_mode (EvWindow *window, EvDocumentMode mode) ev_window_run_presentation (window); } else if (mode == EV_DOCUMENT_MODE_FULL_SCREEN) { - ev_window_fullscreen (window); + ev_window_run_fullscreen (window); } } +static void +setup_document_from_metadata (EvWindow *window) +{ + char *uri = window->priv->uri; + GValue page = { 0, }; + + /* Page */ + if (ev_metadata_manager_get (uri, "page", &page)) { + ev_page_cache_set_current_page (window->priv->page_cache, + g_value_get_int (&page)); + } + +} + static void ev_window_setup_document (EvWindow *ev_window) { @@ -668,9 +688,11 @@ ev_window_setup_document (EvWindow *ev_window) update_document_mode (ev_window, info->mode); if (ev_window->priv->properties) { - ev_properties_set_document (ev_window->priv->properties, - ev_window->priv->document); + ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties), + ev_window->priv->document); } + + setup_document_from_metadata (ev_window); } static void @@ -907,22 +929,86 @@ ev_window_xfer_job_cb (EvJobXfer *job, } } -#ifdef ENABLE_METADATA static void -ev_window_setup_from_metadata (EvWindow *window) +setup_view_from_metadata (EvWindow *window) { + EvView *view = EV_VIEW (window->priv->view); char *uri = window->priv->uri; + GEnumValue *enum_value; GValue width = { 0, }; GValue height = { 0, }; + GValue maximized = { 0, }; + GValue x = { 0, }; + GValue y = { 0, }; + GValue sizing_mode = { 0, }; + GValue zoom = { 0, }; + GValue continuous = { 0, }; + GValue dual_page = { 0, }; + GValue presentation = { 0, }; + GValue fullscreen = { 0, }; + + /* Window size */ + if (!GTK_WIDGET_VISIBLE (window)) { + gboolean restore_size = TRUE; + + if (ev_metadata_manager_get (uri, "window_maximized", &maximized)) { + if (g_value_get_boolean (&maximized)) { + gtk_window_maximize (GTK_WINDOW (window)); + restore_size = FALSE; + } + } - ev_metadata_manager_get (uri, "window_width", &width); - ev_metadata_manager_get (uri, "window_height", &height); + if (restore_size && + ev_metadata_manager_get (uri, "window_x", &x) && + ev_metadata_manager_get (uri, "window_y", &y) && + ev_metadata_manager_get (uri, "window_width", &width) && + ev_metadata_manager_get (uri, "window_height", &height)) { + gtk_window_set_default_size (GTK_WINDOW (window), + g_value_get_int (&width), + g_value_get_int (&height)); + gtk_window_move (GTK_WINDOW (window), g_value_get_int (&x), + g_value_get_int (&y)); + } + } - gtk_window_set_default_size (GTK_WINDOW (window), - g_value_get_int (&width), - g_value_get_int (&height)); + /* Sizing mode */ + if (ev_metadata_manager_get (uri, "sizing_mode", &sizing_mode)) { + enum_value = g_enum_get_value_by_nick + (EV_SIZING_MODE_CLASS, g_value_get_string (&sizing_mode)); + g_value_unset (&sizing_mode); + ev_view_set_sizing_mode (view, enum_value->value); + } + + /* Zoom */ + if (ev_metadata_manager_get (uri, "zoom", &zoom) && + ev_view_get_sizing_mode (view) == EV_SIZING_FREE) { + ev_view_set_zoom (view, g_value_get_double (&zoom), FALSE); + } + + /* Continuous */ + if (ev_metadata_manager_get (uri, "continuous", &continuous)) { + ev_view_set_continuous (view, g_value_get_boolean (&continuous)); + } + + /* Dual page */ + if (ev_metadata_manager_get (uri, "dual-page", &dual_page)) { + ev_view_set_dual_page (view, g_value_get_boolean (&dual_page)); + } + + /* Presentation */ + if (ev_metadata_manager_get (uri, "presentation", &presentation)) { + if (g_value_get_boolean (&presentation)) { + ev_window_run_presentation (window); + } + } + + /* Fullscreen */ + if (ev_metadata_manager_get (uri, "fullscreen", &fullscreen)) { + if (g_value_get_boolean (&fullscreen)) { + ev_window_run_fullscreen (window); + } + } } -#endif void ev_window_open_uri (EvWindow *ev_window, const char *uri) @@ -933,9 +1019,7 @@ ev_window_open_uri (EvWindow *ev_window, const char *uri) g_free (ev_window->priv->uri); ev_window->priv->uri = g_strdup (uri); -#ifdef ENABLE_METADATA - ev_window_setup_from_metadata (ev_window); -#endif + setup_view_from_metadata (ev_window); ev_window_clear_jobs (ev_window); ev_window_clear_local_uri (ev_window); @@ -973,7 +1057,7 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window) folder); } - ev_document_types_add_filters (chooser); + ev_document_types_add_filters (chooser, NULL); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE); @@ -1011,7 +1095,7 @@ ev_window_cmd_recent_file_activate (GtkAction *action, uri = egg_recent_item_get_uri (item); - ev_application_open_uri (EV_APP, uri, NULL); + ev_application_open_uri (EV_APP, uri, NULL, NULL); g_free (uri); } @@ -1142,7 +1226,7 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) NULL); gtk_window_set_modal (GTK_WINDOW (fc), TRUE); - ev_document_types_add_filters_for_type (fc, G_TYPE_FROM_INSTANCE (ev_window->priv->document)); + ev_document_types_add_filters (fc, ev_window->priv->document); gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK); if (folder) { @@ -1319,14 +1403,16 @@ static void ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window) { if (ev_window->priv->properties == NULL) { - ev_window->priv->properties = ev_properties_new (); - ev_properties_set_document (ev_window->priv->properties, - ev_window->priv->document); + ev_window->priv->properties = ev_properties_dialog_new (); + ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties), + ev_window->priv->document); g_object_add_weak_pointer (G_OBJECT (ev_window->priv->properties), (gpointer *) &(ev_window->priv->properties)); + gtk_window_set_transient_for (GTK_WINDOW (ev_window->priv->properties), + GTK_WINDOW (ev_window)); } - ev_properties_show (ev_window->priv->properties, GTK_WIDGET (ev_window)); + gtk_widget_show (ev_window->priv->properties); } static void @@ -1634,7 +1720,7 @@ ev_window_update_fullscreen_action (EvWindow *window) } static void -ev_window_fullscreen (EvWindow *window) +ev_window_run_fullscreen (EvWindow *window) { ev_view_set_fullscreen (EV_VIEW (window->priv->view), TRUE); if (window->priv->fullscreen_popup == NULL) @@ -1645,7 +1731,7 @@ ev_window_fullscreen (EvWindow *window) g_object_set (G_OBJECT (window->priv->scrolled_window), "shadow-type", GTK_SHADOW_NONE, NULL); - + g_signal_connect (window->priv->view, "motion-notify-event", G_CALLBACK (fullscreen_motion_notify_cb), @@ -1660,13 +1746,18 @@ ev_window_fullscreen (EvWindow *window) ev_window_update_fullscreen_action (window); gtk_window_fullscreen (GTK_WINDOW (window)); ev_window_update_fullscreen_popup (window); + + ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", TRUE); } static void -ev_window_unfullscreen (EvWindow *window) +ev_window_stop_fullscreen (EvWindow *window) { EvView *view = EV_VIEW (window->priv->view); + if (!ev_view_get_fullscreen (EV_VIEW (view))) + return; + ev_view_set_fullscreen (view, FALSE); g_object_set (G_OBJECT (window->priv->scrolled_window), "shadow-type", GTK_SHADOW_IN, @@ -1683,6 +1774,8 @@ ev_window_unfullscreen (EvWindow *window) ev_window_update_fullscreen_action (window); gtk_window_unfullscreen (GTK_WINDOW (window)); update_chrome_visibility (window); + + ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE); } static void @@ -1695,9 +1788,9 @@ ev_window_cmd_view_fullscreen (GtkAction *action, EvWindow *window) fullscreen = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); if (fullscreen) { - ev_window_fullscreen (window); + ev_window_run_fullscreen (window); } else { - ev_window_unfullscreen (window); + ev_window_stop_fullscreen (window); } } @@ -1727,12 +1820,14 @@ ev_window_run_presentation (EvWindow *window) gtk_window_fullscreen (GTK_WINDOW (window)); ev_window_update_presentation_action (window); update_chrome_visibility (window); + + ev_metadata_manager_set_boolean (window->priv->uri, "presentation", TRUE); } static void ev_window_stop_presentation (EvWindow *window) { - if (! ev_view_get_presentation (EV_VIEW (window->priv->view))) + if (!ev_view_get_presentation (EV_VIEW (window->priv->view))) return; g_object_set (G_OBJECT (window->priv->scrolled_window), @@ -1742,6 +1837,8 @@ ev_window_stop_presentation (EvWindow *window) gtk_window_unfullscreen (GTK_WINDOW (window)); ev_window_update_presentation_action (window); update_chrome_visibility (window); + + ev_metadata_manager_set_boolean (window->priv->uri, "presentation", FALSE); } static void @@ -1750,6 +1847,7 @@ ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window) gboolean presentation; g_return_if_fail (EV_IS_WINDOW (window)); + ev_window_stop_fullscreen (window); presentation = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); if (presentation) { @@ -1873,13 +1971,15 @@ ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window) { GtkWidget *dialog; GtkWidget *editor; - g_return_if_fail (EV_IS_WINDOW (ev_window)); - dialog = gtk_dialog_new_with_buttons (_("Toolbar editor"), GTK_WINDOW (ev_window), + dialog = gtk_dialog_new_with_buttons (_("Toolbar editor"), + GTK_WINDOW (ev_window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, - GTK_RESPONSE_CANCEL, + GTK_RESPONSE_CLOSE, NULL); + gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)), 5); + gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 18); gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); gtk_window_set_default_size (GTK_WINDOW (dialog), 500, 400); @@ -1887,19 +1987,18 @@ ev_window_cmd_edit_toolbar (GtkAction *action, EvWindow *ev_window) ev_window->priv->toolbar_model); 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_toolbar_editor_load_actions (EGG_TOOLBAR_EDITOR (editor), - DATADIR"/evince-toolbar.xml"); + DATADIR "/evince-toolbar.xml"); egg_editable_toolbar_set_edit_mode (EGG_EDITABLE_TOOLBAR (ev_window->priv->toolbar), TRUE); - gtk_widget_show_all (dialog); - - g_signal_connect (G_OBJECT (dialog), "response", + g_signal_connect (dialog, "response", G_CALLBACK (ev_window_cmd_edit_toolbar_cb), ev_window); + gtk_widget_show_all (dialog); } static void @@ -2042,7 +2141,7 @@ ev_window_cmd_escape (GtkAction *action, EvWindow *window) NULL); if (fullscreen) - ev_window_unfullscreen (window); + ev_window_stop_fullscreen (window); if (presentation) ev_window_stop_presentation (window); @@ -2083,6 +2182,21 @@ update_view_size (EvView *view, EvWindow *window) hsb_requisition.height + scrollbar_spacing); } +static void +save_sizing_mode (EvWindow *window) +{ + EvSizingMode mode; + GEnumValue *enum_value; + + if (window->priv->uri) { + mode = ev_view_get_sizing_mode (EV_VIEW (window->priv->view)); + enum_value = g_enum_get_value (EV_SIZING_MODE_CLASS, mode); + + ev_metadata_manager_set_string (window->priv->uri, "sizing_mode", + enum_value->value_nick); + } +} + static void ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) @@ -2129,13 +2243,64 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, } update_sizing_buttons (ev_window); + save_sizing_mode (ev_window); } static void -ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, - EvWindow *ev_window) +ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) { update_action_sensitivity (ev_window); + + if (ev_view_get_sizing_mode (view) == EV_SIZING_FREE) { + ev_metadata_manager_set_double (ev_window->priv->uri, "zoom", + ev_view_get_zoom (view)); + } +} + +static void +ev_window_update_continuous_action (EvWindow *window) +{ + GtkAction *action; + + action = gtk_action_group_get_action (window->priv->action_group, "ViewContinuous"); + g_signal_handlers_block_by_func + (action, G_CALLBACK (ev_window_cmd_continuous), window); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + ev_view_get_continuous (EV_VIEW (window->priv->view))); + g_signal_handlers_unblock_by_func + (action, G_CALLBACK (ev_window_cmd_continuous), window); +} + +static void +ev_window_update_dual_page_action (EvWindow *window) +{ + GtkAction *action; + + action = gtk_action_group_get_action (window->priv->action_group, "ViewDual"); + g_signal_handlers_block_by_func + (action, G_CALLBACK (ev_window_cmd_dual), window); + gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), + ev_view_get_dual_page (EV_VIEW (window->priv->view))); + g_signal_handlers_unblock_by_func + (action, G_CALLBACK (ev_window_cmd_dual), window); +} + +static void +ev_window_continuous_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) +{ + ev_window_update_continuous_action (ev_window); + + ev_metadata_manager_set_boolean (ev_window->priv->uri, "continuous", + ev_view_get_continuous (EV_VIEW (ev_window->priv->view))); +} + +static void +ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) +{ + ev_window_update_dual_page_action (ev_window); + + ev_metadata_manager_set_boolean (ev_window->priv->uri, "dual-page", + ev_view_get_dual_page (EV_VIEW (ev_window->priv->view))); } static char * @@ -2491,7 +2656,6 @@ ev_window_dispose (GObject *object) priv->recent_view = NULL; } - if (priv->ui_manager) { g_object_unref (priv->ui_manager); priv->ui_manager = NULL; @@ -2998,22 +3162,40 @@ sidebar_page_main_widget_update_cb (GObject *ev_sidebar_page, } static gboolean -window_configure_event_cb (EvWindow *window, gpointer dummy) +window_state_event_cb (EvWindow *window, GdkEventWindowState *event, gpointer dummy) { -#ifdef ENABLE_METADATA - int width, height; + char *uri = window->priv->uri; - if (window->priv->uri == NULL) { - return FALSE; + if (uri && !(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) { + gboolean maximized; + + maximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED; + ev_metadata_manager_set_boolean (uri, "window_maximized", maximized); } - gtk_window_get_size (GTK_WINDOW (window), &width, &height); + return FALSE; +} - ev_metadata_manager_set_int (window->priv->uri, "window_width", width); - ev_metadata_manager_set_int (window->priv->uri, "window_height", height); +static gboolean +window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer dummy) +{ + char *uri = window->priv->uri; + GdkWindowState state; + int x, y, width, height; + + state = gdk_window_get_state (GTK_WIDGET (window)->window); + + if (uri && !(state & GDK_WINDOW_STATE_FULLSCREEN)) { + gtk_window_get_position (GTK_WINDOW (window), &x, &y); + gtk_window_get_size (GTK_WINDOW (window), &width, &height); + + ev_metadata_manager_set_int (uri, "window_x", x); + ev_metadata_manager_set_int (uri, "window_y", y); + ev_metadata_manager_set_int (uri, "window_width", width); + ev_metadata_manager_set_int (uri, "window_height", height); + } return FALSE; -#endif } static void @@ -3029,6 +3211,8 @@ ev_window_init (EvWindow *ev_window) g_signal_connect (ev_window, "configure_event", G_CALLBACK (window_configure_event_cb), NULL); + g_signal_connect (ev_window, "window_state_event", + G_CALLBACK (window_state_event_cb), NULL); ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window); @@ -3217,6 +3401,14 @@ ev_window_init (EvWindow *ev_window) "notify::zoom", G_CALLBACK (ev_window_zoom_changed_cb), ev_window); + g_signal_connect (ev_window->priv->view, + "notify::dual-page", + G_CALLBACK (ev_window_dual_mode_changed_cb), + ev_window); + g_signal_connect (ev_window->priv->view, + "notify::continuous", + G_CALLBACK (ev_window_continuous_changed_cb), + ev_window); ev_window->priv->statusbar = ev_statusbar_new (); gtk_box_pack_end (GTK_BOX (ev_window->priv->main_box), @@ -3295,5 +3487,3 @@ ev_window_new (void) return ev_window; } - -