X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=previewer%2Fev-previewer-window.c;h=734941edc99679924d40fd0b3202a2402f80e762;hb=d0c512255fc2823acd049b97565bffbbb7e0b393;hp=08eb89566677c9558e29024b108554cfa5e0b5cc;hpb=34148304a0237fd9fd7c4ea05ca2e053d9ddd3ff;p=evince.git diff --git a/previewer/ev-previewer-window.c b/previewer/ev-previewer-window.c index 08eb8956..734941ed 100644 --- a/previewer/ev-previewer-window.c +++ b/previewer/ev-previewer-window.c @@ -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 @@ -36,6 +36,7 @@ struct _EvPreviewerWindow { EvDocument *document; GtkActionGroup *action_group; + GtkActionGroup *accels_group; GtkUIManager *ui_manager; GtkWidget *swindow; @@ -67,17 +68,12 @@ enum { G_DEFINE_TYPE (EvPreviewerWindow, ev_previewer_window, GTK_TYPE_WINDOW) static gdouble -get_screen_dpi (GtkWindow *window) +get_screen_dpi (EvPreviewerWindow *window) { GdkScreen *screen; - gdouble xdpi, ydpi; - screen = gtk_window_get_screen (window); - - xdpi = 25.4 * gdk_screen_get_width (screen) / gdk_screen_get_width_mm (screen); - ydpi = 25.4 * gdk_screen_get_height (screen) / gdk_screen_get_height_mm (screen); - - return (xdpi + ydpi) / 2.0; + screen = gtk_window_get_screen (GTK_WINDOW (window)); + return ev_document_misc_get_screen_dpi (screen); } #if GTKUNIXPRINT_ENABLED @@ -100,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) @@ -157,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, @@ -250,6 +278,9 @@ ev_previewer_window_print (GtkAction *action, #endif static const GtkActionEntry action_entries[] = { + { "FileCloseWindow", GTK_STOCK_CLOSE, NULL, "W", + NULL, + G_CALLBACK (ev_previewer_window_close) }, { "GoPreviousPage", GTK_STOCK_GO_UP, N_("_Previous Page"), "Page_Up", N_("Go to the previous page"), G_CALLBACK (ev_previewer_window_previous_page) }, @@ -269,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, "", "space", NULL, + G_CALLBACK (ev_previewer_window_scroll_backward) }, + { "BackSpace", NULL, "", "BackSpace", NULL, + G_CALLBACK (ev_previewer_window_scroll_backward) }, + { "ShiftBackSpace", NULL, "", "BackSpace", NULL, + G_CALLBACK (ev_previewer_window_scroll_forward) }, + { "Return", NULL, "", "Return", NULL, + G_CALLBACK (ev_previewer_window_scroll_forward) }, + { "ShiftReturn", NULL, "", "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, "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, "KP_Add", NULL, + G_CALLBACK (ev_previewer_window_zoom_in) }, + { "CtrlKpMinus", GTK_STOCK_ZOOM_OUT, NULL, "KP_Subtract", NULL, + G_CALLBACK (ev_previewer_window_zoom_out) }, + { "FocusPageSelector", NULL, "", "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"), @@ -278,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, @@ -321,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 @@ -343,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; @@ -389,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; @@ -432,14 +530,12 @@ ev_previewer_window_constructor (GType type, gchar *datadir, *ui_path; gdouble dpi; - g_print ("DBG: constructor\n"); - object = G_OBJECT_CLASS (ev_previewer_window_parent_class)->constructor (type, n_construct_properties, construct_params); window = EV_PREVIEWER_WINDOW (object); - dpi = get_screen_dpi (GTK_WINDOW (window)); + dpi = get_screen_dpi (window); ev_document_model_set_min_scale (window->model, MIN_SCALE * dpi / 72.0); ev_document_model_set_max_scale (window->model, MAX_SCALE * dpi / 72.0); ev_document_model_set_sizing_mode (window->model, EV_SIZING_FIT_WIDTH); @@ -471,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 (); @@ -485,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); @@ -499,8 +608,14 @@ 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_view_set_continuous (window->view, FALSE); + ev_document_model_set_continuous (window->model, FALSE); ev_view_set_loading (window->view, TRUE); gtk_container_add (GTK_CONTAINER (window->swindow), GTK_WIDGET (window->view));