Ticket #10: epdfview-0.1.4-scrolling.patch

File epdfview-0.1.4-scrolling.patch, 4.1 kB (added by LoneFox, 3 years ago)

A patch that makes the keyboard scrolling work as expected by most users.

  • src/gtk/MainView.cxx

    diff -ur epdfview-0.1.4-orig/src/gtk/MainView.cxx epdfview-0.1.4/src/gtk/MainView.cxx
    old new  
    109109      N_("Go to the first page"),  
    110110      G_CALLBACK (main_window_go_to_first_page_cb) }, 
    111111 
    112     { "GoToNextPage", GTK_STOCK_GO_FORWARD, N_("_Next Page"), "Page_Down",  
     112    { "GoToNextPage", GTK_STOCK_GO_FORWARD, N_("_Next Page"), "<Shift>Page_Down",  
    113113      N_("Go to the next page"),  
    114114      G_CALLBACK (main_window_go_to_next_page_cb) }, 
    115115 
    116     { "GoToPreviousPage", GTK_STOCK_GO_BACK, N_("_Previous Page"), "Page_Up",  
     116    { "GoToPreviousPage", GTK_STOCK_GO_BACK, N_("_Previous Page"), "<Shift>Page_Up",  
    117117      N_("Go to the previous page"), 
    118118      G_CALLBACK (main_window_go_to_previous_page_cb) }, 
    119119 
  • src/gtk/PageView.cxx

    diff -ur epdfview-0.1.4-orig/src/gtk/PageView.cxx epdfview-0.1.4/src/gtk/PageView.cxx
    old new  
    1818#include <config.h> 
    1919#include <gettext.h> 
    2020#include <gtk/gtk.h> 
     21#include <gdk/gdkkeysyms.h> 
    2122#include <epdfview.h> 
    2223#include "PageView.h" 
    2324 
     
    3839static void page_view_resized_cb (GtkWidget *, GtkAllocation *, gpointer); 
    3940static gboolean page_view_scrolled_cb (GtkWidget *widget, GdkEventScroll *, 
    4041                                       gpointer); 
     42static gboolean page_view_keypress_cb (GtkWidget *widget, GdkEventKey *, 
     43                                       gpointer); 
    4144 
    4245 
    4346PageView::PageView (): 
     
    216219    // When scrolling. 
    217220    g_signal_connect (G_OBJECT (m_PageScroll), "scroll-event", 
    218221                      G_CALLBACK (page_view_scrolled_cb), pter); 
     222    g_signal_connect (G_OBJECT (m_PageScroll), "key-press-event", 
     223                      G_CALLBACK (page_view_keypress_cb), pter); 
    219224 
    220225    // And connect the motion, button press and release events. 
    221226    gtk_widget_add_events (m_EventBox, GDK_POINTER_MOTION_MASK | 
     
    408413    view->getPagePosition (event_x, event_y, &x, &y); 
    409414    view->getPresenter ()->mouseButtonPressed (event->button, x, y); 
    410415 
     416    gtk_widget_grab_focus(view->getTopWidget()); 
     417     
    411418    return TRUE; 
    412419} 
    413420 
     
    525532 
    526533    return FALSE; 
    527534} 
     535 
     536 
     537static gboolean 
     538page_view_keypress_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) 
     539{ 
     540    GtkScrollType direction; 
     541    gboolean horizontal = FALSE; 
     542    PagePter *pter = (PagePter *)data; 
     543     
     544    GtkAdjustment *adjustment =  
     545        gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (widget)); 
     546    gdouble position = gtk_adjustment_get_value (adjustment); 
     547     
     548    if(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) 
     549    { 
     550        return FALSE; 
     551    } 
     552     
     553    switch(event->keyval) 
     554    { 
     555        case GDK_Left: 
     556        case GDK_KP_Left: 
     557            direction = GTK_SCROLL_STEP_LEFT; 
     558            horizontal = TRUE; 
     559            break; 
     560        case GDK_Right: 
     561        case GDK_KP_Right: 
     562            horizontal = TRUE; 
     563            direction = GTK_SCROLL_STEP_RIGHT; 
     564            break; 
     565        case GDK_Up: 
     566        case GDK_KP_Up: 
     567            direction = GTK_SCROLL_STEP_UP; 
     568            break; 
     569        case GDK_Down: 
     570        case GDK_KP_Down: 
     571            direction = GTK_SCROLL_STEP_DOWN; 
     572            break; 
     573        case GDK_Page_Up: 
     574        case GDK_KP_Page_Up: 
     575            if(position == adjustment->lower) 
     576            { 
     577                pter->scrollToPreviousPage (); 
     578                return TRUE; 
     579            } 
     580            direction = GTK_SCROLL_START; 
     581            break; 
     582        case GDK_Page_Down: 
     583        case GDK_KP_Page_Down: 
     584            if(position == ( adjustment->upper - adjustment->page_size)) 
     585            { 
     586                pter->scrollToNextPage (); 
     587                return TRUE; 
     588            } 
     589            direction = GTK_SCROLL_END; 
     590            break; 
     591        default: 
     592            return FALSE; 
     593    } 
     594     
     595    g_signal_emit_by_name(G_OBJECT(widget), "scroll-child", direction, horizontal); 
     596    return TRUE; 
     597}