]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Queue a resize when zoom changes
[evince.git] / shell / ev-view.c
index 07fdecd86c5a243b158b48ee8555956d4cfbba95..d8b499b860d1b683efc0677c24ce58e3d18b67ef 100644 (file)
@@ -20,6 +20,8 @@
 
 #include <gtk/gtkalignment.h>
 #include <glib/gi18n.h>
 
 #include <gtk/gtkalignment.h>
 #include <glib/gi18n.h>
+#include <gtk/gtkbindings.h>
+#include <gdk/gdkkeysyms.h>
 
 #include "ev-marshal.h"
 #include "ev-view.h"
 
 #include "ev-marshal.h"
 #include "ev-view.h"
@@ -56,6 +58,9 @@ struct _EvViewClass {
        void    (*set_scroll_adjustments) (EvView         *view,
                                           GtkAdjustment  *hadjustment,
                                           GtkAdjustment  *vadjustment);
        void    (*set_scroll_adjustments) (EvView         *view,
                                           GtkAdjustment  *hadjustment,
                                           GtkAdjustment  *vadjustment);
+       void    (*scroll_view)            (EvView         *view,
+                                          GtkScrollType   scroll,
+                                          gboolean        horizontal);
        
        /* Should this be notify::page? */
        void    (*page_changed)           (EvView         *view);
        
        /* Should this be notify::page? */
        void    (*page_changed)           (EvView         *view);
@@ -240,7 +245,10 @@ ev_view_realize (GtkWidget *widget)
        attributes.y = 0;
        attributes.width = MAX (widget->allocation.width, widget->requisition.width);
        attributes.height = MAX (widget->allocation.height, widget->requisition.height);
        attributes.y = 0;
        attributes.width = MAX (widget->allocation.width, widget->requisition.width);
        attributes.height = MAX (widget->allocation.height, widget->requisition.height);
-       attributes.event_mask = GDK_EXPOSURE_MASK;
+       attributes.event_mask = GDK_EXPOSURE_MASK |
+                               GDK_BUTTON_PRESS_MASK |
+                               GDK_SCROLL_MASK |
+                               GDK_KEY_PRESS_MASK;
   
        view->bin_window = gdk_window_new (widget->window,
                                           &attributes,
   
        view->bin_window = gdk_window_new (widget->window,
                                           &attributes,
@@ -351,9 +359,13 @@ static gboolean
 ev_view_button_press_event (GtkWidget      *widget,
                            GdkEventButton *event)
 {
 ev_view_button_press_event (GtkWidget      *widget,
                            GdkEventButton *event)
 {
-       /* EvView *view = EV_VIEW (widget); */
+       if (event->type == GDK_BUTTON_PRESS) {
+               if (!GTK_WIDGET_HAS_FOCUS (widget)) {
+                       gtk_widget_grab_focus (widget);
+               }
+       }
 
 
-       return FALSE;
+       return TRUE;
 }
 
 static gboolean
 }
 
 static gboolean
@@ -423,12 +435,70 @@ ev_view_set_scroll_adjustments (EvView *view,
        view_update_adjustments (view);
 }
 
        view_update_adjustments (view);
 }
 
+static void
+add_scroll_binding (GtkBindingSet  *binding_set,
+                   guint           keyval,
+                   GtkScrollType   scroll,
+                   gboolean        horizontal)
+{
+  guint keypad_keyval = keyval - GDK_Left + GDK_KP_Left;
+  
+  gtk_binding_entry_add_signal (binding_set, keyval, 0,
+                                "scroll_view", 2,
+                                GTK_TYPE_SCROLL_TYPE, scroll,
+                               G_TYPE_BOOLEAN, horizontal);
+  gtk_binding_entry_add_signal (binding_set, keypad_keyval, 0,
+                                "scroll_view", 2,
+                                GTK_TYPE_SCROLL_TYPE, scroll,
+                               G_TYPE_BOOLEAN, horizontal);
+}
+
+static void
+ev_view_scroll_view (EvView *view,
+                    GtkScrollType scroll,
+                    gboolean horizontal)
+{
+       if (scroll == GTK_SCROLL_PAGE_BACKWARD) {
+               ev_view_set_page (view, ev_view_get_page (view) - 1);
+       } else if (scroll == GTK_SCROLL_PAGE_FORWARD) {
+               ev_view_set_page (view, ev_view_get_page (view) + 1);
+       } else {
+               GtkAdjustment *adjustment;
+               double value;
+
+               if (horizontal) {
+                       adjustment = view->hadjustment; 
+               } else {
+                       adjustment = view->vadjustment;
+               }
+
+               value = adjustment->value;
+
+               switch (scroll) {
+                       case GTK_SCROLL_STEP_BACKWARD:  
+                               value -= adjustment->step_increment; 
+                               break;
+                       case GTK_SCROLL_STEP_FORWARD:
+                               value += adjustment->step_increment; 
+                               break;
+                       default:
+                               break;
+               }
+
+               value = CLAMP (value, adjustment->lower,
+                              adjustment->upper - adjustment->page_size);
+
+               gtk_adjustment_set_value (adjustment, value);
+       }
+}
+
 static void
 ev_view_class_init (EvViewClass *class)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (class);
        GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (class);
        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
 static void
 ev_view_class_init (EvViewClass *class)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (class);
        GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (class);
        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+       GtkBindingSet *binding_set;
 
        object_class->finalize = ev_view_finalize;
 
 
        object_class->finalize = ev_view_finalize;
 
@@ -443,8 +513,9 @@ ev_view_class_init (EvViewClass *class)
        widget_class->style_set = ev_view_style_set;
        widget_class->state_changed = ev_view_state_changed;
        gtk_object_class->destroy = ev_view_destroy;
        widget_class->style_set = ev_view_style_set;
        widget_class->state_changed = ev_view_state_changed;
        gtk_object_class->destroy = ev_view_destroy;
-  
+
        class->set_scroll_adjustments = ev_view_set_scroll_adjustments;
        class->set_scroll_adjustments = ev_view_set_scroll_adjustments;
+       class->scroll_view = ev_view_scroll_view;
 
        widget_class->set_scroll_adjustments_signal =  g_signal_new ("set-scroll-adjustments",
                                                                     G_OBJECT_CLASS_TYPE (object_class),
 
        widget_class->set_scroll_adjustments_signal =  g_signal_new ("set-scroll-adjustments",
                                                                     G_OBJECT_CLASS_TYPE (object_class),
@@ -470,6 +541,26 @@ ev_view_class_init (EvViewClass *class)
                      NULL, NULL,
                      ev_marshal_VOID__NONE,
                      G_TYPE_NONE, 0);
                      NULL, NULL,
                      ev_marshal_VOID__NONE,
                      G_TYPE_NONE, 0);
+
+       g_signal_new ("scroll_view",
+                     G_TYPE_FROM_CLASS (object_class),
+                     G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                     G_STRUCT_OFFSET (EvViewClass, scroll_view),
+                     NULL, NULL,
+                     ev_marshal_VOID__ENUM_BOOLEAN,
+                     G_TYPE_NONE, 2,
+                     GTK_TYPE_SCROLL_TYPE,
+                     G_TYPE_BOOLEAN);
+
+       binding_set = gtk_binding_set_by_class (class);
+
+       add_scroll_binding (binding_set, GDK_Left,  GTK_SCROLL_STEP_BACKWARD, TRUE);
+       add_scroll_binding (binding_set, GDK_Right, GTK_SCROLL_STEP_FORWARD,  TRUE);
+       add_scroll_binding (binding_set, GDK_Up,    GTK_SCROLL_STEP_BACKWARD, FALSE);
+       add_scroll_binding (binding_set, GDK_Down,  GTK_SCROLL_STEP_FORWARD,  FALSE);
+
+       add_scroll_binding (binding_set, GDK_Page_Up,   GTK_SCROLL_PAGE_BACKWARD, FALSE);
+       add_scroll_binding (binding_set, GDK_Page_Down, GTK_SCROLL_PAGE_FORWARD,  FALSE);
 }
 
 static void
 }
 
 static void
@@ -477,6 +568,8 @@ ev_view_init (EvView *view)
 {
        static const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
 
 {
        static const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
 
+       GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS);
+
        view->scale = 1.0;
        
        gtk_widget_modify_bg (GTK_WIDGET (view), GTK_STATE_NORMAL, &white);
        view->scale = 1.0;
        
        gtk_widget_modify_bg (GTK_WIDGET (view), GTK_STATE_NORMAL, &white);
@@ -596,6 +689,13 @@ ev_view_new (void)
        return g_object_new (EV_TYPE_VIEW, NULL);
 }
 
        return g_object_new (EV_TYPE_VIEW, NULL);
 }
 
+static void
+document_changed_callback (EvDocument *document,
+                          EvView     *view)
+{
+       gtk_widget_queue_draw (GTK_WIDGET (view));
+}
+
 void
 ev_view_set_document (EvView     *view,
                      EvDocument *document)
 void
 ev_view_set_document (EvView     *view,
                      EvDocument *document)
@@ -624,6 +724,10 @@ ev_view_set_document (EvView     *view,
                                           "found",
                                           G_CALLBACK (found_results_callback),
                                           view);
                                           "found",
                                           G_CALLBACK (found_results_callback),
                                           view);
+                       g_signal_connect (view->document,
+                                         "changed",
+                                         G_CALLBACK (document_changed_callback),
+                                         view);
                 }
 
                if (GTK_WIDGET_REALIZED (view))
                 }
 
                if (GTK_WIDGET_REALIZED (view))
@@ -648,9 +752,7 @@ ev_view_set_page (EvView *view,
                        g_signal_emit (view, page_changed_signal, 0);
 
                        view->find_percent_complete = 0.0;
                        g_signal_emit (view, page_changed_signal, 0);
 
                        view->find_percent_complete = 0.0;
-                       update_find_results (view);
-                       
-                       gtk_widget_queue_draw (GTK_WIDGET (view));
+                       update_find_results (view);     
                }
        }
 }
                }
        }
 }
@@ -686,7 +788,7 @@ ev_view_zoom (EvView   *view,
 
        ev_document_set_scale (view->document, view->scale);
 
 
        ev_document_set_scale (view->document, view->scale);
 
-       gtk_widget_queue_draw (GTK_WIDGET (view));
+       gtk_widget_queue_resize (GTK_WIDGET (view));
 }
 
 void
 }
 
 void