]> www.fi.muni.cz Git - evince.git/blobdiff - libview/ev-view.c
Add gail-util to cut-n-paste
[evince.git] / libview / ev-view.c
index b5c7e530e357304b0fcf3c53b8fefb6fd47afa7b..d1b6f33d0ae6ace40fb2d67bb72e8197b5955e7b 100644 (file)
@@ -99,10 +99,6 @@ static void       compute_border                             (EvView
 static void       get_page_y_offset                          (EvView             *view,
                                                              int                 page,
                                                              int                *y_offset);
-static gboolean   get_page_extents                           (EvView             *view,
-                                                             gint                page,
-                                                             GdkRectangle       *page_area,
-                                                             GtkBorder          *border);
 static void       view_rect_to_doc_rect                      (EvView             *view,
                                                              GdkRectangle       *view_rect,
                                                              GdkRectangle       *page_area,
@@ -177,11 +173,6 @@ static void       ev_view_remove_all                         (EvView
 static AtkObject *ev_view_get_accessible                     (GtkWidget *widget);
 
 /*** Drawing ***/
-static guint32    ev_gdk_color_to_rgb                        (const GdkColor     *color);
-static void       draw_rubberband                            (GtkWidget          *widget,
-                                                             GdkWindow          *window,
-                                                             const GdkRectangle *rect,
-                                                             guchar              alpha);
 static void       highlight_find_results                     (EvView             *view,
                                                              int                 page);
 static void       draw_one_page                              (EvView             *view,
@@ -535,7 +526,7 @@ ev_view_scroll_to_page_position (EvView *view, GtkOrientation orientation)
                GdkRectangle page_area;
                GtkBorder    border;
 
-               get_page_extents (view, view->current_page, &page_area, &border);
+               ev_view_get_page_extents (view, view->current_page, &page_area, &border);
                x = page_area.x;
                y = page_area.y;
        } else {
@@ -656,7 +647,7 @@ view_update_range_and_current_page (EvView *view)
 
                for (i = 0; i < ev_document_get_n_pages (view->document); i++) {
 
-                       get_page_extents (view, i, &page_area, &border);
+                       ev_view_get_page_extents (view, i, &page_area, &border);
 
                        if (gdk_rectangle_intersect (&current_area, &page_area, &unused)) {
                                area = unused.width * unused.height;
@@ -735,8 +726,6 @@ view_update_range_and_current_page (EvView *view)
        ev_pixbuf_cache_set_page_range (view->pixbuf_cache,
                                        view->start_page,
                                        view->end_page,
-                                       view->rotation,
-                                       view->scale,
                                        view->selection_info.selections);
 
        if (ev_pixbuf_cache_get_surface (view->pixbuf_cache, view->current_page))
@@ -833,7 +822,7 @@ compute_scroll_increment (EvView        *view,
                return gtk_adjustment_get_page_size (adjustment);
 
        gtk_widget_get_allocation (widget, &allocation);
-       get_page_extents (view, page, &page_area, &border);
+       ev_view_get_page_extents (view, page, &page_area, &border);
        rect.x = page_area.x + view->scroll_x;
        rect.y = view->scroll_y + (scroll == GTK_SCROLL_PAGE_BACKWARD ? 5 : allocation.height - 5);
        rect.width = page_area.width;
@@ -1105,11 +1094,11 @@ get_page_y_offset (EvView *view, int page, int *y_offset)
        return;
 }
 
-static gboolean
-get_page_extents (EvView       *view,
-                 gint          page,
-                 GdkRectangle *page_area,
-                 GtkBorder    *border)
+gboolean
+ev_view_get_page_extents (EvView       *view,
+                         gint          page,
+                         GdkRectangle *page_area,
+                         GtkBorder    *border)
 {
        GtkWidget *widget;
        int width, height;
@@ -1270,7 +1259,7 @@ doc_point_to_view_point (EvView       *view,
                g_assert_not_reached ();
        }
 
-       get_page_extents (view, page, &page_area, &border);
+       ev_view_get_page_extents (view, page, &page_area, &border);
 
        view_x = CLAMP (x * view->scale, 0, page_area.width);
        view_y = CLAMP (y * view->scale, 0, page_area.height);
@@ -1315,7 +1304,7 @@ doc_rect_to_view_rect (EvView       *view,
                g_assert_not_reached ();
        }
 
-       get_page_extents (view, page, &page_area, &border);
+       ev_view_get_page_extents (view, page, &page_area, &border);
 
        view_rect->x = x * view->scale + page_area.x;
        view_rect->y = y * view->scale + page_area.y;
@@ -1350,7 +1339,7 @@ find_page_at_location (EvView  *view,
                GdkRectangle page_area;
                GtkBorder border;
 
-               if (! get_page_extents (view, i, &page_area, &border))
+               if (! ev_view_get_page_extents (view, i, &page_area, &border))
                        continue;
 
                if ((x >= page_area.x + border.left) &&
@@ -2569,7 +2558,7 @@ annotation_window_moved (EvAnnotationWindow *window,
        view_rect.width = width;
        view_rect.height = height;
 
-       get_page_extents (view, child->page, &page_area, &border);
+       ev_view_get_page_extents (view, child->page, &page_area, &border);
        view_rect_to_doc_rect (view, &view_rect, &page_area, &doc_rect);
        child->orig_x = doc_rect.x1;
        child->orig_y = doc_rect.y1;
@@ -3137,7 +3126,7 @@ ev_view_expose_event (GtkWidget      *widget,
                GtkBorder border;
                gboolean page_ready = TRUE;
 
-               if (!get_page_extents (view, i, &page_area, &border))
+               if (!ev_view_get_page_extents (view, i, &page_area, &border))
                        continue;
 
                page_area.x -= view->scroll_x;
@@ -3478,7 +3467,7 @@ ev_view_drag_motion (GtkWidget      *widget,
        if (gtk_drag_get_source_widget (context) == widget)
                gdk_drag_status (context, 0, time);
        else
-               gdk_drag_status (context, context->suggested_action, time);
+               gdk_drag_status (context, gdk_drag_context_get_suggested_action (context), time);
        
        return TRUE;
 }
@@ -3928,50 +3917,37 @@ ev_view_style_set (GtkWidget *widget,
 
 /*** Drawing ***/
 
-static guint32
-ev_gdk_color_to_rgb (const GdkColor *color)
-{
-  guint32 result;
-  result = (0xff0000 | (color->red & 0xff00));
-  result <<= 8;
-  result |= ((color->green & 0xff00) | (color->blue >> 8));
-  return result;
-}
-
 static void
-draw_rubberband (GtkWidget *widget, GdkWindow *window,
-                const GdkRectangle *rect, guchar alpha)
+draw_rubberband (EvView             *view,
+                GdkWindow          *window,
+                const GdkRectangle *rect,
+                gdouble             alpha)
 {
-       GdkGC *gc;
-       GdkPixbuf *pixbuf;
        GtkStyle *style;
        GdkColor *fill_color_gdk;
-       guint fill_color;
+       gdouble   r, g, b;
+       cairo_t  *cr;
 
-       style = gtk_widget_get_style (widget);
+       style = gtk_widget_get_style (GTK_WIDGET (view));
        fill_color_gdk = gdk_color_copy (&style->base[GTK_STATE_SELECTED]);
-       fill_color = ev_gdk_color_to_rgb (fill_color_gdk) << 8 | alpha;
+       r = fill_color_gdk->red / 65535.;
+       g = fill_color_gdk->green / 65535.;
+       b = fill_color_gdk->blue / 65535.;
 
-       pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8,
-                                rect->width, rect->height);
-       gdk_pixbuf_fill (pixbuf, fill_color);
+       cr = gdk_cairo_create (window);
 
-       gdk_draw_pixbuf (window, NULL, pixbuf,
-                        0, 0,
-                        rect->x - EV_VIEW (widget)->scroll_x, rect->y - EV_VIEW (widget)->scroll_y,
-                        rect->width, rect->height,
-                        GDK_RGB_DITHER_NONE,
-                        0, 0);
+       cairo_set_source_rgba (cr, r, g, b, alpha);
+       cairo_rectangle (cr,
+                        rect->x - view->scroll_x,
+                        rect->y - view->scroll_y,
+                        rect->width, rect->height);
+       cairo_fill_preserve (cr);
 
-       g_object_unref (pixbuf);
+       cairo_set_line_width (cr, 0.5);
+       cairo_set_source_rgb (cr, r, g, b);
+       cairo_stroke (cr);
 
-       gc = gdk_gc_new (window);
-       gdk_gc_set_rgb_fg_color (gc, fill_color_gdk);
-       gdk_draw_rectangle (window, gc, FALSE,
-                           rect->x - EV_VIEW (widget)->scroll_x, rect->y - EV_VIEW (widget)->scroll_y,
-                           rect->width - 1,
-                           rect->height - 1);
-       g_object_unref (gc);
+       cairo_destroy (cr);
 
        gdk_color_free (fill_color_gdk);
 }
@@ -3990,18 +3966,17 @@ highlight_find_results (EvView *view, int page)
        for (i = 0; i < n_results; i++) {
                EvRectangle *rectangle;
                GdkRectangle view_rectangle;
-               guchar alpha;
+               gdouble      alpha;
 
                if (i == view->find_result && page == view->current_page) {
-                       alpha = 0x90;
+                       alpha = 0.6;
                } else {
-                       alpha = 0x20;
+                       alpha = 0.3;
                }
 
                rectangle = ev_view_find_get_result (view, page, i);
                doc_rect_to_view_rect (view, page, rectangle, &view_rectangle);
-               draw_rubberband (GTK_WIDGET (view), bin_window,
-                                &view_rectangle, alpha);
+               draw_rubberband (view, bin_window, &view_rectangle, alpha);
         }
 }
 
@@ -4573,7 +4548,7 @@ setup_caches (EvView *view)
        gboolean inverted_colors;
 
        view->height_to_page_cache = ev_view_get_height_to_page_cache (view);
-       view->pixbuf_cache = ev_pixbuf_cache_new (GTK_WIDGET (view), view->document);
+       view->pixbuf_cache = ev_pixbuf_cache_new (GTK_WIDGET (view), view->model, view->pixbuf_cache_size);
        view->page_cache = ev_page_cache_new (view->document);
        inverted_colors = ev_document_model_get_inverted_colors (view->model);
        ev_pixbuf_cache_set_inverted_colors (view->pixbuf_cache, inverted_colors);
@@ -4594,10 +4569,37 @@ clear_caches (EvView *view)
        }
 }
 
+/**
+ * ev_view_set_page_cache_size:
+ * @view:
+ * @cache_size:
+ *
+ * Sets the maximum size in bytes that will be used to cache
+ * rendered pages. Use 0 to disable caching rendered pages.
+ *
+ * Note that this limit doesn't affect the current visible page range,
+ * which will always be rendered. In order to limit the total memory used
+ * you have to use ev_document_model_set_max_scale() too.
+ *
+ */
+void
+ev_view_set_page_cache_size (EvView *view,
+                            gsize   cache_size)
+{
+       if (view->pixbuf_cache_size == cache_size)
+               return;
+
+       view->pixbuf_cache_size = cache_size;
+       if (view->pixbuf_cache)
+               ev_pixbuf_cache_set_max_size (view->pixbuf_cache, cache_size);
+}
+
 void
 ev_view_set_loading (EvView      *view,
                     gboolean      loading)
 {
+       if (view->loading && !loading)
+               hide_loading_window (view);
        view->loading = loading;
        gtk_widget_queue_draw (GTK_WIDGET (view));
 }
@@ -5299,7 +5301,7 @@ compute_new_selection_rect (EvView       *view,
                GdkRectangle page_area;
                GtkBorder border;
                
-               if (get_page_extents (view, i, &page_area, &border)) {
+               if (ev_view_get_page_extents (view, i, &page_area, &border)) {
                        GdkRectangle overlap;
 
                        if (gdk_rectangle_intersect (&page_area, &view_rect, &overlap)) {
@@ -5363,7 +5365,7 @@ compute_new_selection_text (EvView          *view,
                GdkRectangle page_area;
                GtkBorder border;
                
-               get_page_extents (view, i, &page_area, &border);
+               ev_view_get_page_extents (view, i, &page_area, &border);
                if (gdk_rectangle_point_in (&page_area, start) || 
                    gdk_rectangle_point_in (&page_area, stop)) {
                        if (first == n_pages)
@@ -5390,7 +5392,7 @@ compute_new_selection_text (EvView          *view,
                selection->rect.x2 = width;
                selection->rect.y2 = height;
 
-               get_page_extents (view, i, &page_area, &border);
+               ev_view_get_page_extents (view, i, &page_area, &border);
 
                if (gdk_rectangle_point_in (&page_area, start))
                        point = start;
@@ -5533,7 +5535,7 @@ merge_selection_region (EvView *view,
                         */
                        gdk_region_shrink (region, -5, -5);
 
-                       get_page_extents (view, cur_page, &page_area, &border);
+                       ev_view_get_page_extents (view, cur_page, &page_area, &border);
                        gdk_region_offset (region,
                                           page_area.x + border.left - view->scroll_x,
                                           page_area.y + border.top - view->scroll_y);