X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-window.c;h=f1c41bb793700b018b79386e7772519b39fc2578;hb=77d8e048e17095228d5eca1edb00405978c5c9bc;hp=250c119a20ded79f40f6bf6ec776e128f1ce4ab5;hpb=ffd817da58c15bc17cc1a5534b53f7ad6766c876;p=evince.git diff --git a/shell/ev-window.c b/shell/ev-window.c index 250c119a..f1c41bb7 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -34,10 +34,11 @@ #include "ev-sidebar-links.h" #include "ev-sidebar-thumbnails.h" #include "ev-view.h" -#include "ev-page-view.h" #include "ev-password.h" #include "ev-password-view.h" #include "ev-print-job.h" +#include "ev-document-thumbnails.h" +#include "ev-document-links.h" #include "ev-document-find.h" #include "ev-document-security.h" #include "eggfindbar.h" @@ -51,6 +52,7 @@ #include #include +#include #include #include @@ -131,7 +133,12 @@ static GtkTargetEntry ev_drop_types[] = { #define GCONF_CHROME_SIDEBAR "/apps/evince/show_sidebar" #define GCONF_CHROME_STATUSBAR "/apps/evince/show_statusbar" +#define GCONF_SIDEBAR_SIZE "/apps/evince/sidebar_size" +#define SIDEBAR_DEFAULT_SIZE 132 + static void ev_window_update_fullscreen_popup (EvWindow *window); +static void ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_sidebar, GParamSpec *pspec, + EvWindow *ev_window); static void ev_window_set_page_mode (EvWindow *window, EvWindowPageMode page_mode); static gboolean start_loading_document (EvWindow *ev_window, @@ -185,6 +192,7 @@ update_action_sensitivity (EvWindow *ev_window) set_action_sensitive (ev_window, "ViewNormalSize", document!=NULL); set_action_sensitive (ev_window, "ViewBestFit", document!=NULL); set_action_sensitive (ev_window, "ViewPageWidth", document!=NULL); + set_action_sensitive (ev_window, "ViewReload", document!=NULL); /* Go menu */ if (document) { @@ -224,6 +232,8 @@ update_action_sensitivity (EvWindow *ev_window) static void set_widget_visibility (GtkWidget *widget, gboolean visible) { + g_return_if_fail (GTK_IS_WIDGET (widget)); + if (visible) gtk_widget_show (widget); else @@ -442,7 +452,11 @@ update_window_title (EvDocument *document, GParamSpec *pspec, EvWindow *ev_windo } if (doc_title == NULL && ev_window->priv->uri) { - doc_title = g_path_get_basename (ev_window->priv->uri); + char *basename; + + basename = g_path_get_basename (ev_window->priv->uri); + doc_title = gnome_vfs_unescape_string_for_display (basename); + g_free (basename); } if (password_needed) { @@ -479,6 +493,27 @@ update_total_pages (EvWindow *ev_window) /* This function assumes that ev_window just had ev_window->document set. */ +static gboolean +document_supports_sidebar (EvDocument *document) +{ + return (EV_IS_DOCUMENT_THUMBNAILS (document) && EV_IS_DOCUMENT_LINKS (document)); +} + +static void +hide_sidebar_and_actions (EvWindow *ev_window) +{ + GtkAction *action; + /* Alsthough we update the hiddenness of the sidebar, we don't want to + * store the value */ + g_signal_handlers_disconnect_by_func (ev_window->priv->sidebar, + ev_window_sidebar_visibility_changed_cb, + ev_window); + gtk_widget_hide (ev_window->priv->sidebar); + action = gtk_action_group_get_action (ev_window->priv->action_group, "ViewSidebar"); + gtk_action_set_sensitive (action, FALSE); + +} + static void ev_window_setup_document (EvWindow *ev_window) { @@ -495,7 +530,10 @@ ev_window_setup_document (EvWindow *ev_window) ev_window_set_page_mode (ev_window, PAGE_MODE_SINGLE_PAGE); - ev_sidebar_set_document (sidebar, document); + if (document_supports_sidebar (document)) + ev_sidebar_set_document (sidebar, document); + else + hide_sidebar_and_actions (ev_window); ev_view_set_document (view, document); update_window_title (document, NULL, ev_window); @@ -554,9 +592,10 @@ ev_window_popup_password_dialog (EvWindow *ev_window) update_window_title (ev_window->priv->password_document, NULL, ev_window); if (ev_window->priv->password_dialog == NULL) { - gchar *file_name; + gchar *basename, *file_name; - file_name = g_path_get_basename (ev_window->priv->password_uri); + basename = g_path_get_basename (ev_window->priv->password_uri); + file_name = gnome_vfs_unescape_string_for_display (basename); ev_window->priv->password_dialog = ev_password_dialog_new (GTK_WIDGET (ev_window), file_name); g_object_add_weak_pointer (G_OBJECT (ev_window->priv->password_dialog), @@ -565,6 +604,7 @@ ev_window_popup_password_dialog (EvWindow *ev_window) "response", G_CALLBACK (password_dialog_response), ev_window); + g_free (basename); g_free (file_name); gtk_widget_show (ev_window->priv->password_dialog); } else { @@ -1062,6 +1102,20 @@ screen_size_changed_cb (GdkScreen *screen, ev_window_update_fullscreen_popup (window); } +static void +ev_window_sidebar_position_change_cb (GObject *object, GParamSpec *pspec, + EvWindow *ev_window) +{ + GConfClient *client; + int sidebar_size; + + sidebar_size = gtk_paned_get_position (GTK_PANED (object)); + + client = gconf_client_get_default (); + gconf_client_set_int (client, GCONF_SIDEBAR_SIZE, sidebar_size, NULL); + g_object_unref (client); +} + static void destroy_fullscreen_popup (EvWindow *window) { @@ -1440,6 +1494,23 @@ ev_window_cmd_go_last_page (GtkAction *action, EvWindow *ev_window) ev_view_set_page (EV_VIEW (ev_window->priv->view), G_MAXINT); } +static void +ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window) +{ + char *uri; + int page; + + g_return_if_fail (EV_IS_WINDOW (ev_window)); + + page = ev_document_get_page (ev_window->priv->document); + uri = g_strdup (ev_window->priv->uri); + + ev_window_open (ev_window, uri); + ev_window_open_page (ev_window, page); + + g_free (uri); +} + static void ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window) { @@ -1927,6 +1998,9 @@ static GtkActionEntry entries[] = { { "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", @@ -2132,6 +2206,9 @@ ev_window_init (EvWindow *ev_window) GtkAccelGroup *accel_group; GError *error = NULL; GtkWidget *sidebar_widget, *toolbar_dock; + GConfValue *value; + GConfClient *client; + int sidebar_size; ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window); @@ -2208,16 +2285,30 @@ ev_window_init (EvWindow *ev_window) /* Add the main area */ ev_window->priv->hpaned = gtk_hpaned_new (); + g_signal_connect (ev_window->priv->hpaned, + "notify::position", + G_CALLBACK (ev_window_sidebar_position_change_cb), + ev_window); + + sidebar_size = SIDEBAR_DEFAULT_SIZE; + client = gconf_client_get_default (); + value = gconf_client_get (client, GCONF_SIDEBAR_SIZE, NULL); + if (value != NULL) { + if (value->type == GCONF_VALUE_INT) { + sidebar_size = gconf_value_get_int (value); + } + gconf_value_free (value); + } + g_object_unref (client); + gtk_paned_set_position (GTK_PANED (ev_window->priv->hpaned), sidebar_size); gtk_box_pack_start (GTK_BOX (ev_window->priv->main_box), ev_window->priv->hpaned, - TRUE, TRUE, 0); + TRUE, TRUE, 0); + gtk_widget_show (ev_window->priv->hpaned); + ev_window->priv->sidebar = ev_sidebar_new (); - g_signal_connect (ev_window->priv->sidebar, - "notify::visible", - G_CALLBACK (ev_window_sidebar_visibility_changed_cb), - ev_window); gtk_paned_pack1 (GTK_PANED (ev_window->priv->hpaned), ev_window->priv->sidebar, FALSE, FALSE); - gtk_widget_show (ev_window->priv->hpaned); + gtk_widget_show (ev_window->priv->sidebar); /* Stub sidebar, for now */ sidebar_widget = ev_sidebar_links_new (); @@ -2292,6 +2383,12 @@ ev_window_init (EvWindow *ev_window) set_chrome_actions (ev_window); update_chrome_visibility (ev_window); + /* Connect sidebar signals */ + g_signal_connect (ev_window->priv->sidebar, + "notify::visible", + G_CALLBACK (ev_window_sidebar_visibility_changed_cb), + ev_window); + /* Connect to find bar signals */ g_signal_connect (ev_window->priv->find_bar, "previous", @@ -2335,6 +2432,6 @@ ev_window_init (EvWindow *ev_window) /* Set it to something random to force a change */ ev_window->priv->sizing_mode = EV_SIZING_FREE; - ev_window_set_sizing_mode (ev_window, EV_SIZING_BEST_FIT); + ev_window_set_sizing_mode (ev_window, EV_SIZING_FIT_WIDTH); update_action_sensitivity (ev_window); }