]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Fix CID fonts with freetype 2.1.9
[evince.git] / shell / ev-view.c
index e76f5b81728af22109298bb499683c81d825e767..0a7622368601ff4442320a2e8de341e2856a7485 100644 (file)
@@ -77,6 +77,7 @@ struct _EvView {
 
        gboolean pressed_button;
        gboolean has_selection;
 
        gboolean pressed_button;
        gboolean has_selection;
+       GdkPoint selection_start;
        GdkRectangle selection;
        EvViewCursor cursor;
 
        GdkRectangle selection;
        EvViewCursor cursor;
 
@@ -223,6 +224,9 @@ ev_view_size_request (GtkWidget      *widget,
                        requisition->width = 10;
                        requisition->height = 10;
                }
                        requisition->width = 10;
                        requisition->height = 10;
                }
+
+               requisition->width += 2;
+               requisition->height += 2;
        }
   
 }
        }
   
 }
@@ -245,17 +249,6 @@ ev_view_size_allocate (GtkWidget      *widget,
        }
 }
 
        }
 }
 
-static void
-update_window_backgrounds (EvView *view)
-{
-       GtkWidget *widget = GTK_WIDGET (view);
-  
-       if (GTK_WIDGET_REALIZED (view)) {
-               gdk_window_set_background (view->bin_window,
-                                          &widget->style->base[GTK_WIDGET_STATE (widget)]);
-       }
-}
-
 static void
 ev_view_realize (GtkWidget *widget)
 {
 static void
 ev_view_realize (GtkWidget *widget)
 {
@@ -302,6 +295,9 @@ ev_view_realize (GtkWidget *widget)
        gdk_window_set_user_data (view->bin_window, widget);
        gdk_window_show (view->bin_window);
 
        gdk_window_set_user_data (view->bin_window, widget);
        gdk_window_show (view->bin_window);
 
+       widget->style = gtk_style_attach (widget->style, view->bin_window);
+       gdk_window_set_background (view->bin_window, &widget->style->mid[widget->state]);
+
        if (view->document) {
                ev_document_set_target (view->document, view->bin_window);
 
        if (view->document) {
                ev_document_set_target (view->document, view->bin_window);
 
@@ -312,8 +308,6 @@ ev_view_realize (GtkWidget *widget)
                 */
                gtk_widget_queue_resize (widget);
        }
                 */
                gtk_widget_queue_resize (widget);
        }
-
-       update_window_backgrounds (view);
 }
 
 static void
 }
 
 static void
@@ -331,20 +325,6 @@ ev_view_unrealize (GtkWidget *widget)
        GTK_WIDGET_CLASS (ev_view_parent_class)->unrealize (widget);
 }
 
        GTK_WIDGET_CLASS (ev_view_parent_class)->unrealize (widget);
 }
 
-static void
-ev_view_style_set (GtkWidget      *widget,
-                  GtkStyle       *previous_style)
-{
-       update_window_backgrounds (EV_VIEW (widget));
-}
-
-static void
-ev_view_state_changed (GtkWidget    *widget,
-                      GtkStateType  previous_state)
-{
-       update_window_backgrounds (EV_VIEW (widget));
-}
-
 static guint32
 ev_gdk_color_to_rgb (const GdkColor *color)
 {
 static guint32
 ev_gdk_color_to_rgb (const GdkColor *color)
 {
@@ -395,13 +375,29 @@ expose_bin_window (GtkWidget      *widget,
                   GdkEventExpose *event)
 {
        EvView *view = EV_VIEW (widget);
                   GdkEventExpose *event)
 {
        EvView *view = EV_VIEW (widget);
-        int i;
-       int current_page;
+        int i, current_page;
+       int x_offset, y_offset;
         const EvFindResult *results;
 
        if (view->document == NULL)
                return;
         const EvFindResult *results;
 
        if (view->document == NULL)
                return;
-       
+
+       x_offset = MAX (0, (widget->allocation.width -
+                           widget->requisition.width) / 2);
+       y_offset = MAX (0, (widget->allocation.height -
+                           widget->requisition.height) / 2);
+       gdk_draw_rectangle (view->bin_window,
+                            widget->style->black_gc,
+                            FALSE,
+                            x_offset,
+                           y_offset,
+                            widget->requisition.width - 1,
+                           widget->requisition.height - 1);
+
+       ev_document_set_page_offset (view->document,
+                                    x_offset + 1,
+                                    y_offset + 1);
+
        ev_document_render (view->document,
                            event->area.x, event->area.y,
                            event->area.width, event->area.height);
        ev_document_render (view->document,
                            event->area.x, event->area.y,
                            event->area.width, event->area.height);
@@ -418,9 +414,16 @@ expose_bin_window (GtkWidget      *widget,
                             results[i].highlight_area.width,
                             results[i].highlight_area.height);
 #endif
                             results[i].highlight_area.width,
                             results[i].highlight_area.height);
 #endif
-               if (results[i].page_num == current_page)
+               if (results[i].page_num == current_page) {
+                       GdkRectangle highlight_area_fixed;
+                       highlight_area_fixed.x = results[i].highlight_area.x + x_offset + 1;
+                       highlight_area_fixed.y = results[i].highlight_area.y + y_offset + 1;
+                       highlight_area_fixed.width = results[i].highlight_area.width;
+                       highlight_area_fixed.height = results[i].highlight_area.height;
+
                        draw_rubberband (widget, view->bin_window,
                        draw_rubberband (widget, view->bin_window,
-                                        &results[i].highlight_area);
+                                        &highlight_area_fixed);
+               }
                 ++i;
         }
 
                 ++i;
         }
 
@@ -534,10 +537,8 @@ ev_view_button_press_event (GtkWidget      *widget,
                                gtk_widget_queue_draw (widget);
                        }
 
                                gtk_widget_queue_draw (widget);
                        }
 
-                       view->selection.x = event->x;
-                       view->selection.y = event->y;
-                       view->selection.width = 0;
-                       view->selection.height = 0;
+                       view->selection_start.x = event->x;
+                       view->selection_start.y = event->y;
                        break;
        }
 
                        break;
        }
 
@@ -635,10 +636,10 @@ ev_view_motion_notify_event (GtkWidget      *widget,
 
        if (view->pressed_button > 0) {
                view->has_selection = TRUE;
 
        if (view->pressed_button > 0) {
                view->has_selection = TRUE;
-               view->selection.x = MIN (view->selection.x, event->x);
-               view->selection.y = MIN (view->selection.y, event->y);
-               view->selection.width = ABS (view->selection.x - event->x) + 1;
-               view->selection.height = ABS (view->selection.y - event->y) + 1;
+               view->selection.x = MIN (view->selection_start.x, event->x);
+               view->selection.y = MIN (view->selection_start.y, event->y);
+               view->selection.width = ABS (view->selection_start.x - event->x) + 1;
+               view->selection.height = ABS (view->selection_start.y - event->y) + 1;
        } else if (view->document) {
                EvLink *link;
 
        } else if (view->document) {
                EvLink *link;
 
@@ -850,8 +851,6 @@ ev_view_class_init (EvViewClass *class)
        widget_class->size_allocate = ev_view_size_allocate;
        widget_class->realize = ev_view_realize;
        widget_class->unrealize = ev_view_unrealize;
        widget_class->size_allocate = ev_view_size_allocate;
        widget_class->realize = ev_view_realize;
        widget_class->unrealize = ev_view_unrealize;
-       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;
        gtk_object_class->destroy = ev_view_destroy;
 
        class->set_scroll_adjustments = ev_view_set_scroll_adjustments;
@@ -914,16 +913,12 @@ ev_view_class_init (EvViewClass *class)
 static void
 ev_view_init (EvView *view)
 {
 static void
 ev_view_init (EvView *view)
 {
-       static const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
-
        GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS);
 
        view->scale = 1.0;
        view->pressed_button = -1;
        view->cursor = EV_VIEW_CURSOR_NORMAL;
        
        GTK_WIDGET_SET_FLAGS (view, GTK_CAN_FOCUS);
 
        view->scale = 1.0;
        view->pressed_button = -1;
        view->cursor = EV_VIEW_CURSOR_NORMAL;
        
-       gtk_widget_modify_bg (GTK_WIDGET (view), GTK_STATE_NORMAL, &white);
-
         view->find_results = g_array_new (FALSE,
                                           FALSE,
                                           sizeof (EvFindResult));
         view->find_results = g_array_new (FALSE,
                                           FALSE,
                                           sizeof (EvFindResult));
@@ -1113,6 +1108,10 @@ set_document_page (EvView *view, int page)
 {
        if (view->document) {
                int old_page = ev_document_get_page (view->document);
 {
        if (view->document) {
                int old_page = ev_document_get_page (view->document);
+               int old_width, old_height;
+
+               ev_document_get_page_size (view->document,
+                                          &old_width, &old_height);
 
                if (old_page != page) {
                        ev_view_set_cursor (view, EV_VIEW_CURSOR_WAIT);
 
                if (old_page != page) {
                        ev_view_set_cursor (view, EV_VIEW_CURSOR_WAIT);
@@ -1120,8 +1119,16 @@ set_document_page (EvView *view, int page)
                }
 
                if (old_page != ev_document_get_page (view->document)) {
                }
 
                if (old_page != ev_document_get_page (view->document)) {
+                       int width, height;
+                       
                        g_signal_emit (view, page_changed_signal, 0);
 
                        g_signal_emit (view, page_changed_signal, 0);
 
+                       view->has_selection = FALSE;
+                       ev_document_get_page_size (view->document,
+                                                  &width, &height);
+                       if (width != old_width || height != old_height)
+                               gtk_widget_queue_resize (GTK_WIDGET (view));
+
                        view->find_percent_complete = 0.0;
                        update_find_results (view);     
                }
                        view->find_percent_complete = 0.0;
                        update_find_results (view);     
                }