]> www.fi.muni.cz Git - evince.git/blobdiff - previewer/ev-previewer-window.c
[l10n]Fixes on Catalan translation
[evince.git] / previewer / ev-previewer-window.c
index fd2fe37162a246112b87c6cc3bbafed08cf99bb8..734941edc99679924d40fd0b3202a2402f80e762 100644 (file)
@@ -15,7 +15,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #include <config.h>
@@ -36,6 +36,7 @@ struct _EvPreviewerWindow {
        EvDocument       *document;
 
        GtkActionGroup   *action_group;
+       GtkActionGroup   *accels_group;
        GtkUIManager     *ui_manager;
 
        GtkWidget        *swindow;
@@ -95,6 +96,13 @@ ev_previewer_window_error_dialog_run (EvPreviewerWindow *window,
 }
 #endif
 
+static void
+ev_previewer_window_close (GtkAction         *action,
+                          EvPreviewerWindow *window)
+{
+       gtk_widget_destroy (GTK_WIDGET (window));
+}
+
 static void
 ev_previewer_window_previous_page (GtkAction         *action,
                                   EvPreviewerWindow *window)
@@ -152,6 +160,31 @@ ev_previewer_window_action_page_activated (GtkAction         *action,
        gtk_widget_grab_focus (GTK_WIDGET (window->view));
 }
 
+static void
+ev_previewer_window_focus_page_selector (GtkAction         *action,
+                                        EvPreviewerWindow *window)
+{
+       GtkAction *page_action;
+
+       page_action = gtk_action_group_get_action (window->action_group,
+                                                  "PageSelector");
+       ev_page_action_grab_focus (EV_PAGE_ACTION (page_action));
+}
+
+static void
+ev_previewer_window_scroll_forward (GtkAction         *action,
+                                   EvPreviewerWindow *window)
+{
+       ev_view_scroll (window->view, GTK_SCROLL_PAGE_FORWARD, FALSE);
+}
+
+static void
+ev_previewer_window_scroll_backward (GtkAction         *action,
+                                    EvPreviewerWindow *window)
+{
+       ev_view_scroll (window->view, GTK_SCROLL_PAGE_BACKWARD, FALSE);
+}
+
 #if GTKUNIXPRINT_ENABLED
 static void
 ev_previewer_window_print_finished (GtkPrintJob       *print_job,
@@ -245,6 +278,9 @@ ev_previewer_window_print (GtkAction         *action,
 #endif
 
 static const GtkActionEntry action_entries[] = {
+       { "FileCloseWindow", GTK_STOCK_CLOSE, NULL, "<control>W",
+         NULL,
+         G_CALLBACK (ev_previewer_window_close) },
        { "GoPreviousPage", GTK_STOCK_GO_UP, N_("_Previous Page"), "<control>Page_Up",
           N_("Go to the previous page"),
           G_CALLBACK (ev_previewer_window_previous_page) },
@@ -264,6 +300,44 @@ static const GtkActionEntry action_entries[] = {
 #endif
 };
 
+static const GtkActionEntry accel_entries[] = {
+       { "Space", NULL, "", "space", NULL,
+         G_CALLBACK (ev_previewer_window_scroll_forward) },
+       { "ShiftSpace", NULL, "", "<shift>space", NULL,
+         G_CALLBACK (ev_previewer_window_scroll_backward) },
+       { "BackSpace", NULL, "", "BackSpace", NULL,
+         G_CALLBACK (ev_previewer_window_scroll_backward) },
+       { "ShiftBackSpace", NULL, "", "<shift>BackSpace", NULL,
+         G_CALLBACK (ev_previewer_window_scroll_forward) },
+       { "Return", NULL, "", "Return", NULL,
+         G_CALLBACK (ev_previewer_window_scroll_forward) },
+       { "ShiftReturn", NULL, "", "<shift>Return", NULL,
+         G_CALLBACK (ev_previewer_window_scroll_backward) },
+       { "p", GTK_STOCK_GO_UP, "", "p", NULL,
+         G_CALLBACK (ev_previewer_window_previous_page) },
+       { "n", GTK_STOCK_GO_DOWN, "", "n", NULL,
+         G_CALLBACK (ev_previewer_window_next_page) },
+       { "Plus", GTK_STOCK_ZOOM_IN, NULL, "plus", NULL,
+         G_CALLBACK (ev_previewer_window_zoom_in) },
+       { "CtrlEqual", GTK_STOCK_ZOOM_IN, NULL, "<control>equal", NULL,
+         G_CALLBACK (ev_previewer_window_zoom_in) },
+       { "Equal", GTK_STOCK_ZOOM_IN, NULL, "equal", NULL,
+         G_CALLBACK (ev_previewer_window_zoom_in) },
+       { "Minus", GTK_STOCK_ZOOM_OUT, NULL, "minus", NULL,
+         G_CALLBACK (ev_previewer_window_zoom_out) },
+       { "KpPlus", GTK_STOCK_ZOOM_IN, NULL, "KP_Add", NULL,
+         G_CALLBACK (ev_previewer_window_zoom_in) },
+       { "KpMinus", GTK_STOCK_ZOOM_OUT, NULL, "KP_Subtract", NULL,
+         G_CALLBACK (ev_previewer_window_zoom_out) },
+       { "CtrlKpPlus", GTK_STOCK_ZOOM_IN, NULL, "<control>KP_Add", NULL,
+         G_CALLBACK (ev_previewer_window_zoom_in) },
+       { "CtrlKpMinus", GTK_STOCK_ZOOM_OUT, NULL, "<control>KP_Subtract", NULL,
+         G_CALLBACK (ev_previewer_window_zoom_out) },
+       { "FocusPageSelector", NULL, "", "<control>l", NULL,
+         G_CALLBACK (ev_previewer_window_focus_page_selector) }
+
+};
+
 static const GtkToggleActionEntry toggle_action_entries[] = {
        { "ViewBestFit", EV_STOCK_ZOOM_PAGE, N_("_Best Fit"), NULL,
          N_("Make the current document fill the window"),
@@ -273,6 +347,17 @@ static const GtkToggleActionEntry toggle_action_entries[] = {
          G_CALLBACK (ev_previewer_window_zoom_page_width) }
 };
 
+static gboolean
+view_focus_changed (GtkWidget         *widget,
+                   GdkEventFocus     *event,
+                   EvPreviewerWindow *window)
+{
+       if (window->accels_group)
+               gtk_action_group_set_sensitive (window->accels_group, event->in);
+
+       return FALSE;
+}
+
 static void
 view_sizing_mode_changed (EvDocumentModel   *model,
                          GParamSpec        *pspec,
@@ -316,6 +401,19 @@ ev_previewer_window_set_document (EvPreviewerWindow *window,
                          window);
        ev_view_set_loading (window->view, FALSE);
        gtk_action_group_set_sensitive (window->action_group, TRUE);
+       gtk_action_group_set_sensitive (window->accels_group, TRUE);
+}
+
+static void
+ev_previewer_window_connect_action_accelerators (EvPreviewerWindow *window)
+{
+       GList *actions;
+
+       gtk_ui_manager_ensure_update (window->ui_manager);
+
+       actions = gtk_action_group_list_actions (window->action_group);
+       g_list_foreach (actions, (GFunc)gtk_action_connect_accelerator, NULL);
+       g_list_free (actions);
 }
 
 static void
@@ -338,6 +436,11 @@ ev_previewer_window_dispose (GObject *object)
                window->action_group = NULL;
        }
 
+       if (window->accels_group) {
+               g_object_unref (window->accels_group);
+               window->accels_group = NULL;
+       }
+
        if (window->ui_manager) {
                g_object_unref (window->ui_manager);
                window->ui_manager = NULL;
@@ -384,7 +487,7 @@ data_dir (void)
        datadir = g_build_filename (dir, "share", "evince", NULL);
        g_free (dir);
 #else
-       datadir = g_strdup (DATADIR);
+       datadir = g_strdup (EVINCEDATADIR);
 #endif
 
        return datadir;
@@ -464,9 +567,17 @@ ev_previewer_window_constructor (GType                  type,
        gtk_action_group_add_action (window->action_group, action);
        g_object_unref (action);
 
+       window->accels_group = gtk_action_group_new ("PreviewerAccelerators");
+       gtk_action_group_add_actions (window->accels_group, accel_entries,
+                                     G_N_ELEMENTS (accel_entries),
+                                     window);
+       gtk_action_group_set_sensitive (window->accels_group, FALSE);
+
        window->ui_manager = gtk_ui_manager_new ();
        gtk_ui_manager_insert_action_group (window->ui_manager,
                                            window->action_group, 0);
+       gtk_ui_manager_insert_action_group (window->ui_manager,
+                                           window->accels_group, 1);
        gtk_window_add_accel_group (GTK_WINDOW (window),
                                    gtk_ui_manager_get_accel_group (window->ui_manager));
        datadir = data_dir ();
@@ -478,6 +589,11 @@ ev_previewer_window_constructor (GType                  type,
        g_free (ui_path);
        g_free (datadir);
 
+       /* GTKUIManager connects actions accels only for menu items,
+        * but not for tool items. See bug #612972.
+        */
+       ev_previewer_window_connect_action_accelerators (window);
+
        view_sizing_mode_changed (window->model, NULL, window);
 
        vbox = gtk_vbox_new (FALSE, 0);
@@ -492,6 +608,12 @@ ev_previewer_window_constructor (GType                  type,
                                        GTK_POLICY_AUTOMATIC);
 
        window->view = EV_VIEW (ev_view_new ());
+       g_signal_connect_object (window->view, "focus_in_event",
+                                G_CALLBACK (view_focus_changed),
+                                window, 0);
+       g_signal_connect_object (window->view, "focus_out_event",
+                                G_CALLBACK (view_focus_changed),
+                                window, 0);
        ev_view_set_model (window->view, window->model);
        ev_document_model_set_continuous (window->model, FALSE);
        ev_view_set_loading (window->view, TRUE);