static void ev_view_realize (GtkWidget *widget);
static gboolean ev_view_scroll_event (GtkWidget *widget,
GdkEventScroll *event);
-static gboolean ev_view_expose_event (GtkWidget *widget,
- GdkEventExpose *event);
+static gboolean ev_view_draw (GtkWidget *widget,
+ cairo_t *cr);
static gboolean ev_view_popup_menu (GtkWidget *widget);
static gboolean ev_view_button_press_event (GtkWidget *widget,
GdkEventButton *event);
/*** Drawing ***/
static void highlight_find_results (EvView *view,
+ cairo_t *cr,
int page);
static void highlight_forward_search_results (EvView *view,
+ cairo_t *cr,
int page);
static void focus_annotation (EvView *view,
+ cairo_t *cr,
int page,
GdkRectangle *clip);
static void draw_one_page (EvView *view,
/*** GObject ***/
static void ev_view_finalize (GObject *object);
-static void ev_view_destroy (GtkObject *object);
+static void ev_view_dispose (GObject *object);
static void ev_view_class_init (EvViewClass *class);
static void ev_view_init (EvView *view);
}
static gboolean
-ev_view_expose_event (GtkWidget *widget,
- GdkEventExpose *event)
+ev_view_draw (GtkWidget *widget,
+ cairo_t *cr)
{
- EvView *view = EV_VIEW (widget);
- GdkWindow *bin_window;
- cairo_t *cr;
- gint i;
+ EvView *view = EV_VIEW (widget);
+ gint i;
+ GdkRectangle clip_rect;
if (view->loading) {
show_loading_window (view);
if (view->document == NULL)
return FALSE;
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
- cr = gdk_cairo_create (bin_window);
+ if (!gdk_cairo_get_clip_rectangle (cr, &clip_rect))
+ return FALSE;
for (i = view->start_page; i >= 0 && i <= view->end_page; i++) {
GdkRectangle page_area;
page_area.x -= view->scroll_x;
page_area.y -= view->scroll_y;
- draw_one_page (view, i, cr, &page_area, &border, &(event->area), &page_ready);
+ draw_one_page (view, i, cr, &page_area, &border, &clip_rect, &page_ready);
if (page_ready && view->find_pages && view->highlight_find_results)
- highlight_find_results (view, i);
+ highlight_find_results (view, cr, i);
if (page_ready && EV_IS_DOCUMENT_ANNOTATIONS (view->document))
show_annotation_windows (view, i);
if (page_ready && view->focus_annotation)
- focus_annotation (view, i, &event->area);
+ focus_annotation (view, cr, i, &clip_rect);
if (page_ready && view->synctex_result)
- highlight_forward_search_results (view, i);
+ highlight_forward_search_results (view, cr, i);
}
- cairo_destroy (cr);
-
- if (GTK_WIDGET_CLASS (ev_view_parent_class)->expose_event)
- (* GTK_WIDGET_CLASS (ev_view_parent_class)->expose_event) (widget, event);
+ if (GTK_WIDGET_CLASS (ev_view_parent_class)->draw)
+ GTK_WIDGET_CLASS (ev_view_parent_class)->draw (widget, cr);
return FALSE;
}
return FALSE;
}
- return gtk_bindings_activate_event (GTK_OBJECT (widget), event);
+ return gtk_bindings_activate_event (G_OBJECT (widget), event);
}
static gint
static void
draw_rubberband (EvView *view,
- GdkWindow *window,
+ cairo_t *cr,
const GdkRectangle *rect,
gdouble alpha)
{
GtkStyle *style;
- GdkColor *fill_color_gdk;
+ const GdkColor *fill_color_gdk;
gdouble r, g, b;
- cairo_t *cr;
style = gtk_widget_get_style (GTK_WIDGET (view));
- fill_color_gdk = gdk_color_copy (&style->base[GTK_STATE_SELECTED]);
+ fill_color_gdk = &style->base[GTK_STATE_SELECTED];
r = fill_color_gdk->red / 65535.;
g = fill_color_gdk->green / 65535.;
b = fill_color_gdk->blue / 65535.;
- cr = gdk_cairo_create (window);
+ cairo_save (cr);
cairo_set_source_rgba (cr, r, g, b, alpha);
cairo_rectangle (cr,
cairo_set_source_rgb (cr, r, g, b);
cairo_stroke (cr);
- cairo_destroy (cr);
-
- gdk_color_free (fill_color_gdk);
+ cairo_restore (cr);
}
static void
-highlight_find_results (EvView *view, int page)
+highlight_find_results (EvView *view,
+ cairo_t *cr,
+ int page)
{
gint i, n_results = 0;
- GdkWindow *bin_window;
-
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
-
n_results = ev_view_find_get_n_results (view, page);
for (i = 0; i < n_results; i++) {
rectangle = ev_view_find_get_result (view, page, i);
doc_rect_to_view_rect (view, page, rectangle, &view_rectangle);
- draw_rubberband (view, bin_window, &view_rectangle, alpha);
+ draw_rubberband (view, cr, &view_rectangle, alpha);
}
}
static void
-highlight_forward_search_results (EvView *view, int page)
+highlight_forward_search_results (EvView *view,
+ cairo_t *cr,
+ int page)
{
- GdkWindow *bin_window;
GdkRectangle rect;
- cairo_t *cr;
EvMapping *mapping = view->synctex_result;
if (GPOINTER_TO_INT (mapping->data) != page)
return;
- bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
doc_rect_to_view_rect (view, page, &mapping->area, &rect);
- cr = gdk_cairo_create (bin_window);
+ cairo_save (cr);
cairo_set_source_rgb (cr, 1., 0., 0.);
cairo_rectangle (cr,
rect.x - view->scroll_x,
rect.y - view->scroll_y,
rect.width, rect.height);
cairo_stroke (cr);
- cairo_destroy (cr);
+ cairo_restore (cr);
}
static void
focus_annotation (EvView *view,
+ cairo_t *cr,
gint page,
GdkRectangle *clip)
{
return;
doc_rect_to_view_rect (view, page, &mapping->area, &rect);
- gtk_paint_focus (gtk_widget_get_style (widget),
- gtk_layout_get_bin_window (GTK_LAYOUT (view)),
- gtk_widget_get_state (widget),
- NULL, widget, NULL,
- rect.x - view->scroll_x,
- rect.y - view->scroll_y,
- rect.width + 1, rect.height + 1);
+
+ gtk_paint_focus (gtk_widget_get_style (widget),
+ cr,
+ gtk_widget_get_state (widget),
+ widget, NULL,
+ rect.x - view->scroll_x,
+ rect.y - view->scroll_y,
+ rect.width + 1, rect.height + 1);
}
static void
}
static void
-ev_view_destroy (GtkObject *object)
+ev_view_dispose (GObject *object)
{
EvView *view = EV_VIEW (object);
ev_view_set_scroll_adjustments (GTK_LAYOUT (view), NULL, NULL);
- GTK_OBJECT_CLASS (ev_view_parent_class)->destroy (object);
+ G_OBJECT_CLASS (ev_view_parent_class)->dispose (object);
}
static AtkObject *
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);
GtkLayoutClass *layout_class = GTK_LAYOUT_CLASS (class);
GtkBindingSet *binding_set;
+ object_class->dispose = ev_view_dispose;
object_class->finalize = ev_view_finalize;
- widget_class->expose_event = ev_view_expose_event;
+ widget_class->draw = ev_view_draw;
widget_class->button_press_event = ev_view_button_press_event;
widget_class->motion_notify_event = ev_view_motion_notify_event;
widget_class->button_release_event = ev_view_button_release_event;
widget_class->popup_menu = ev_view_popup_menu;
widget_class->query_tooltip = ev_view_query_tooltip;
- gtk_object_class->destroy = ev_view_destroy;
-
layout_class->set_scroll_adjustments = ev_view_set_scroll_adjustments;
class->binding_activated = ev_view_scroll;
GdkWindow *bin_window;
bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view));
-#if GTK_CHECK_VERSION(2, 90, 5)
gdk_window_invalidate_region (bin_window, region, TRUE);
-#else
- {
- GdkRegion *gdk_region = gdk_region_new ();
- guint n_recs = cairo_region_num_rectangles (region);
- guint i;
-
- for (i = 0; i < n_recs; i++) {
- cairo_rectangle_int_t rect;
-
- cairo_region_get_rectangle (region, i, &rect);
- gdk_region_union_with_rect (gdk_region, (GdkRectangle *)&rect);
- }
- gdk_window_invalidate_region (bin_window, gdk_region, TRUE);
- gdk_region_destroy (gdk_region);
- }
-#endif
} else {
gtk_widget_queue_draw (GTK_WIDGET (view));
}
cairo_region_translate (region,
page_area.x + border.left - view->scroll_x,
page_area.y + border.top - view->scroll_y);
-#if GTK_CHECK_VERSION(2, 90, 5)
gdk_window_invalidate_region (bin_window, region, TRUE);
-#else
- {
- GdkRegion *gdk_region = gdk_region_new ();
- guint n_recs = cairo_region_num_rectangles (region);
- guint i;
-
- for (i = 0; i < n_recs; i++) {
- cairo_rectangle_int_t rect;
-
- cairo_region_get_rectangle (region, i, &rect);
- gdk_region_union_with_rect (gdk_region, (GdkRectangle *)&rect);
- }
- gdk_window_invalidate_region (bin_window, gdk_region, TRUE);
- gdk_region_destroy (gdk_region);
- }
-#endif
cairo_region_destroy (region);
}
}