X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=a487c88b7fd63d7bf8c03bc7022e88cd3a6329a5;hb=79a78d0249676255e902c9207a0eec4aba179de6;hp=c61515be7e381a0a592744786fbaa6978d7c1e43;hpb=4684716c489657edf098565eb54bdf86bad1b45c;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index c61515be..a487c88b 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -190,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) @@ -618,6 +618,10 @@ page_changed_cb (EvPageCache *page_cache, EvWindow *ev_window) { update_action_sensitivity (ev_window); + +#ifdef ENABLE_METADATA + ev_metadata_manager_set_int (ev_window->priv->uri, "page", page); +#endif } static void @@ -631,6 +635,22 @@ update_document_mode (EvWindow *window, EvDocumentMode mode) } } +#ifdef ENABLE_METADATA +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)); + } + +} +#endif + static void ev_window_setup_document (EvWindow *ev_window) { @@ -675,6 +695,10 @@ ev_window_setup_document (EvWindow *ev_window) ev_properties_dialog_set_document (EV_PROPERTIES_DIALOG (ev_window->priv->properties), ev_window->priv->document); } + +#ifdef ENABLE_METADATA + setup_document_from_metadata (ev_window); +#endif } static void @@ -913,18 +937,84 @@ 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; + } + } + + 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)); + } + } - ev_metadata_manager_get (uri, "window_width", &width); - ev_metadata_manager_get (uri, "window_height", &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)); + } - gtk_window_set_default_size (GTK_WINDOW (window), - g_value_get_int (&width), - g_value_get_int (&height)); + /* 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 @@ -938,7 +1028,7 @@ ev_window_open_uri (EvWindow *ev_window, const char *uri) ev_window->priv->uri = g_strdup (uri); #ifdef ENABLE_METADATA - ev_window_setup_from_metadata (ev_window); + setup_view_from_metadata (ev_window); #endif ev_window_clear_jobs (ev_window); @@ -1015,7 +1105,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); } @@ -1651,7 +1741,7 @@ ev_window_run_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), @@ -1666,6 +1756,10 @@ ev_window_run_fullscreen (EvWindow *window) ev_window_update_fullscreen_action (window); gtk_window_fullscreen (GTK_WINDOW (window)); ev_window_update_fullscreen_popup (window); + +#ifdef ENABLE_METADATA + ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", TRUE); +#endif } static void @@ -1692,6 +1786,10 @@ ev_window_stop_fullscreen (EvWindow *window) ev_window_update_fullscreen_action (window); gtk_window_unfullscreen (GTK_WINDOW (window)); update_chrome_visibility (window); + +#ifdef ENABLE_METADATA + ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE); +#endif } static void @@ -1736,6 +1834,10 @@ ev_window_run_presentation (EvWindow *window) gtk_window_fullscreen (GTK_WINDOW (window)); ev_window_update_presentation_action (window); update_chrome_visibility (window); + +#ifdef ENABLE_METADATA + ev_metadata_manager_set_boolean (window->priv->uri, "presentation", TRUE); +#endif } static void @@ -1751,6 +1853,10 @@ ev_window_stop_presentation (EvWindow *window) gtk_window_unfullscreen (GTK_WINDOW (window)); ev_window_update_presentation_action (window); update_chrome_visibility (window); + +#ifdef ENABLE_METADATA + ev_metadata_manager_set_boolean (window->priv->uri, "presentation", FALSE); +#endif } static void @@ -2093,6 +2199,23 @@ update_view_size (EvView *view, EvWindow *window) hsb_requisition.height + scrollbar_spacing); } +static void +save_sizing_mode (EvWindow *window) +{ +#ifdef ENABLE_METADATA + 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); + } +#endif +} + static void ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) @@ -2139,13 +2262,70 @@ 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); + +#ifdef ENABLE_METADATA + 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)); + } +#endif +} + +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); + +#ifdef ENABLE_METADATA + ev_metadata_manager_set_boolean (ev_window->priv->uri, "continuous", + ev_view_get_continuous (EV_VIEW (ev_window->priv->view))); +#endif +} + +static void +ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window) +{ + ev_window_update_dual_page_action (ev_window); + +#ifdef ENABLE_METADATA + ev_metadata_manager_set_boolean (ev_window->priv->uri, "dual-page", + ev_view_get_dual_page (EV_VIEW (ev_window->priv->view))); +#endif } static char * @@ -2501,7 +2681,6 @@ ev_window_dispose (GObject *object) priv->recent_view = NULL; } - if (priv->ui_manager) { g_object_unref (priv->ui_manager); priv->ui_manager = NULL; @@ -3008,19 +3187,41 @@ 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 (uri && !(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) { + gboolean maximized; - if (window->priv->uri == NULL) { - return FALSE; + maximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED; + ev_metadata_manager_set_boolean (uri, "window_maximized", maximized); } +#endif - 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) +{ +#ifdef ENABLE_METADATA + 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); + } #endif return FALSE; @@ -3039,6 +3240,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); @@ -3227,6 +3430,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), @@ -3305,5 +3516,3 @@ ev_window_new (void) return ev_window; } - -