]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
[windows] Make evince relocatable on windows - GUI
[evince.git] / shell / ev-window.c
index ded233d856375bc2e94316863e5088643f44bd68..7984cabb1df5c9bc7508e7d16061155e377f07a1 100644 (file)
@@ -139,6 +139,10 @@ struct _EvWindowPrivate {
        GtkWidget *sidebar_attachments;
        GtkWidget *sidebar_layers;
 
+       /* Menubar accels */
+       guint           menubar_accel_keyval;
+       GdkModifierType menubar_accel_modifier;
+
        /* Progress Messages */
        guint progress_idle;
        GCancellable *progress_cancellable;
@@ -364,7 +368,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
                ok_to_copy = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_COPY);
        }
 
-       if (has_document && !EV_IS_FILE_EXPORTER(document))
+       if (has_document && !ev_print_operation_exists_for_document(document))
                ok_to_print = FALSE;
 
 #ifdef WITH_GCONF
@@ -542,7 +546,6 @@ update_chrome_visibility (EvWindow *window)
        set_widget_visibility (priv->sidebar, sidebar);
        
        ev_window_set_action_sensitive (window, "EditToolbar", toolbar);
-       gtk_widget_set_sensitive (priv->menubar, menubar);
 
        if (priv->fullscreen_toolbar != NULL) {
                set_widget_visibility (priv->fullscreen_toolbar, fullscreen_toolbar);
@@ -3006,6 +3009,12 @@ ev_window_print_range (EvWindow *ev_window,
                ev_window_load_print_settings_from_metadata (ev_window);
        }
 
+       if (!ev_window->priv->print_page_setup) {
+               ev_window->priv->print_page_setup = gtk_page_setup_copy (
+                       ev_application_get_page_setup (EV_APP));
+               ev_window_load_print_page_setup_from_metadata (ev_window);
+       }
+
        if (first_page != 1 || last_page != document_last_page) {
                GtkPageRange range;
 
@@ -3022,8 +3031,7 @@ ev_window_print_range (EvWindow *ev_window,
        ev_print_operation_set_job_name (op, gtk_window_get_title (GTK_WINDOW (ev_window)));
        ev_print_operation_set_current_page (op, current_page);
        ev_print_operation_set_print_settings (op, ev_window->priv->print_settings);
-       if (ev_window->priv->print_page_setup)
-               ev_print_operation_set_default_page_setup (op, ev_window->priv->print_page_setup);
+       ev_print_operation_set_default_page_setup (op, ev_window->priv->print_page_setup);
 
        ev_print_operation_run (op, GTK_WINDOW (ev_window));
 }
@@ -3611,6 +3619,35 @@ ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window)
        }
 }
 
+static void
+ev_window_setup_gtk_settings (EvWindow *window)
+{
+       GtkSettings *settings;
+       GdkScreen   *screen;
+       gchar       *menubar_accel_accel;
+
+       screen = gtk_window_get_screen (GTK_WINDOW (window));
+       settings = gtk_settings_get_for_screen (screen);
+
+       g_object_get (settings,
+                     "gtk-menu-bar-accel", &menubar_accel_accel,
+                     NULL);
+       if (menubar_accel_accel != NULL && menubar_accel_accel[0] != '\0') {
+               gtk_accelerator_parse (menubar_accel_accel,
+                                      &window->priv->menubar_accel_keyval,
+                                      &window->priv->menubar_accel_modifier);
+               if (window->priv->menubar_accel_keyval == 0) {
+                       g_warning ("Failed to parse menu bar accelerator '%s'\n",
+                                  menubar_accel_accel);
+               }
+       } else {
+               window->priv->menubar_accel_keyval = 0;
+               window->priv->menubar_accel_modifier = 0;
+       }
+
+       g_free (menubar_accel_accel);
+}
+
 static void
 ev_window_screen_changed (GtkWidget *widget,
                          GdkScreen *old_screen)
@@ -3623,6 +3660,7 @@ ev_window_screen_changed (GtkWidget *widget,
        if (screen == old_screen)
                return;
 
+       ev_window_setup_gtk_settings (window);
        ev_view_set_screen_dpi (EV_VIEW (priv->view),
                                get_screen_dpi (GTK_WINDOW (window)));
        
@@ -4785,22 +4823,56 @@ ev_window_dispose (GObject *object)
        G_OBJECT_CLASS (ev_window_parent_class)->dispose (object);
 }
 
+static void
+menubar_deactivate_cb (GtkWidget *menubar,
+                      EvWindow  *window)
+{
+       g_signal_handlers_disconnect_by_func (menubar,
+                                             G_CALLBACK (menubar_deactivate_cb),
+                                             window);
+
+       gtk_menu_shell_deselect (GTK_MENU_SHELL (menubar));
+
+       update_chrome_visibility (window);
+}
+
 static gboolean
 ev_window_key_press_event (GtkWidget   *widget,
                           GdkEventKey *event)
 {
-       EvWindow *ev_window = EV_WINDOW (widget);
-       gboolean  handled = FALSE;
+       EvWindow        *ev_window = EV_WINDOW (widget);
+       EvWindowPrivate *priv = ev_window->priv;
+       gboolean         handled = FALSE;
 
        /* Propagate the event to the view first
         * It's needed to be able to type in
         * annot popups windows
         */
-       if (ev_window->priv->view) {
-               g_object_ref (ev_window->priv->view);
-               if (GTK_WIDGET_IS_SENSITIVE (ev_window->priv->view))
-                       handled = gtk_widget_event (ev_window->priv->view, (GdkEvent*) event);
-               g_object_unref (ev_window->priv->view);
+       if (priv->view) {
+               g_object_ref (priv->view);
+               if (GTK_WIDGET_IS_SENSITIVE (priv->view))
+                       handled = gtk_widget_event (priv->view, (GdkEvent*) event);
+               g_object_unref (priv->view);
+       }
+
+       if (!handled && !ev_view_get_presentation (EV_VIEW (priv->view))) {
+               guint modifier = event->state & gtk_accelerator_get_default_mod_mask ();
+
+               if (priv->menubar_accel_keyval != 0 &&
+                   event->keyval == priv->menubar_accel_keyval &&
+                   modifier == priv->menubar_accel_modifier) {
+                       if (!GTK_WIDGET_VISIBLE (priv->menubar)) {
+                               g_signal_connect (priv->menubar, "deactivate",
+                                                 G_CALLBACK (menubar_deactivate_cb),
+                                                 ev_window);
+
+                               gtk_widget_show (priv->menubar);
+                               gtk_menu_shell_select_first (GTK_MENU_SHELL (priv->menubar),
+                                                            FALSE);
+
+                               handled = TRUE;
+                       }
+               }
        }
 
        if (!handled)
@@ -5811,6 +5883,7 @@ ev_window_init (EvWindow *ev_window)
        GError *error = NULL;
        GtkWidget *sidebar_widget;
        GObject *mpkeys;
+       gchar *ui_path;
 
        g_signal_connect (ev_window, "configure_event",
                          G_CALLBACK (window_configure_event_cb), NULL);
@@ -5865,12 +5938,15 @@ ev_window_init (EvWindow *ev_window)
        gtk_ui_manager_insert_action_group (ev_window->priv->ui_manager,
                                            action_group, 0);
 
-       if (!gtk_ui_manager_add_ui_from_file (ev_window->priv->ui_manager,
-                                             DATADIR"/evince-ui.xml",
-                                             &error)) {
+       ui_path = g_build_filename (ev_application_get_data_dir (EV_APP),
+                                   "evince-ui.xml", NULL);
+       if (!gtk_ui_manager_add_ui_from_file (
+               ev_window->priv->ui_manager, ui_path, &error))
+       {
                g_warning ("building menus failed: %s", error->message);
                g_error_free (error);
        }
+       g_free (ui_path);
        
        ev_window->priv->recent_manager = gtk_recent_manager_get_default ();
        ev_window->priv->recent_action_group = NULL;
@@ -6104,13 +6180,15 @@ ev_window_init (EvWindow *ev_window)
                                          G_CALLBACK (ev_window_media_player_key_pressed),
                                          ev_window);
        }
-       
+
        /* Give focus to the document view */
        gtk_widget_grab_focus (ev_window->priv->view);
 
        /* Set it user interface params */
        ev_window_setup_recent (ev_window);
 
+       ev_window_setup_gtk_settings (ev_window);
+
        setup_chrome_from_metadata (ev_window);
        set_chrome_actions (ev_window);
        update_chrome_visibility (ev_window);