X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=libview%2Fev-view.c;h=892b5017816cfe2dc9aa771701f6e234b6d31ed9;hb=9438a47436e305489a45c8d90de6447abacfdfaf;hp=ba733540aef1f231c7ca4e1e66e64cdd9061c66b;hpb=7e3392ba15113588d1f141a624df852007e75774;p=evince.git diff --git a/libview/ev-view.c b/libview/ev-view.c index ba733540..892b5017 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -157,8 +157,8 @@ static void ev_view_size_allocate (GtkWidget 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); @@ -178,10 +178,13 @@ static AtkObject *ev_view_get_accessible (GtkWidget *widget) /*** 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, @@ -213,7 +216,7 @@ static void on_adjustment_value_changed (GtkAdjustment /*** 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); @@ -791,7 +794,7 @@ add_scroll_binding_keypad (GtkBindingSet *binding_set, GtkScrollType scroll, gboolean horizontal) { - guint keypad_keyval = keyval - GDK_Left + GDK_KP_Left; + guint keypad_keyval = keyval - GDK_KEY_Left + GDK_KEY_KP_Left; gtk_binding_entry_add_signal (binding_set, keyval, modifiers, "binding_activated", 2, @@ -3341,13 +3344,12 @@ find_selection_for_page (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); @@ -3359,8 +3361,8 @@ ev_view_expose_event (GtkWidget *widget, 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; @@ -3373,22 +3375,20 @@ ev_view_expose_event (GtkWidget *widget, 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; } @@ -3513,10 +3513,13 @@ ev_view_query_tooltip (GtkWidget *widget, get_link_area (view, x, y, link, &link_area); gtk_tooltip_set_text (tooltip, text); gtk_tooltip_set_tip_area (tooltip, &link_area); + g_free (text); + + return TRUE; } g_free (text); - return TRUE; + return FALSE; } static void @@ -4140,7 +4143,7 @@ ev_view_key_press_event (GtkWidget *widget, return FALSE; } - return gtk_bindings_activate_event (GTK_OBJECT (widget), event); + return gtk_bindings_activate_event (G_OBJECT (widget), event); } static gint @@ -4200,22 +4203,21 @@ ev_view_style_set (GtkWidget *widget, 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, @@ -4228,20 +4230,16 @@ draw_rubberband (EvView *view, 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++) { @@ -4257,36 +4255,36 @@ highlight_find_results (EvView *view, int page) 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) { @@ -4299,13 +4297,14 @@ focus_annotation (EvView *view, 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 @@ -4524,7 +4523,7 @@ ev_view_finalize (GObject *object) } static void -ev_view_destroy (GtkObject *object) +ev_view_dispose (GObject *object) { EvView *view = EV_VIEW (object); @@ -4582,7 +4581,7 @@ ev_view_destroy (GtkObject *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 * @@ -4622,14 +4621,14 @@ 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); 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; @@ -4649,8 +4648,6 @@ ev_view_class_init (EvViewClass *class) 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; @@ -4723,21 +4720,21 @@ ev_view_class_init (EvViewClass *class) binding_set = gtk_binding_set_by_class (class); - add_scroll_binding_keypad (binding_set, GDK_Left, 0, GTK_SCROLL_STEP_BACKWARD, TRUE); - add_scroll_binding_keypad (binding_set, GDK_Right, 0, GTK_SCROLL_STEP_FORWARD, TRUE); - add_scroll_binding_keypad (binding_set, GDK_Left, GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, TRUE); - add_scroll_binding_keypad (binding_set, GDK_Right, GDK_MOD1_MASK, GTK_SCROLL_STEP_UP, TRUE); - add_scroll_binding_keypad (binding_set, GDK_Up, 0, GTK_SCROLL_STEP_BACKWARD, FALSE); - add_scroll_binding_keypad (binding_set, GDK_Down, 0, GTK_SCROLL_STEP_FORWARD, FALSE); - add_scroll_binding_keypad (binding_set, GDK_Up, GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, FALSE); - add_scroll_binding_keypad (binding_set, GDK_Down, GDK_MOD1_MASK, GTK_SCROLL_STEP_UP, FALSE); - gtk_binding_entry_add_signal (binding_set, GDK_H, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE, + add_scroll_binding_keypad (binding_set, GDK_KEY_Left, 0, GTK_SCROLL_STEP_BACKWARD, TRUE); + add_scroll_binding_keypad (binding_set, GDK_KEY_Right, 0, GTK_SCROLL_STEP_FORWARD, TRUE); + add_scroll_binding_keypad (binding_set, GDK_KEY_Left, GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, TRUE); + add_scroll_binding_keypad (binding_set, GDK_KEY_Right, GDK_MOD1_MASK, GTK_SCROLL_STEP_UP, TRUE); + add_scroll_binding_keypad (binding_set, GDK_KEY_Up, 0, GTK_SCROLL_STEP_BACKWARD, FALSE); + add_scroll_binding_keypad (binding_set, GDK_KEY_Down, 0, GTK_SCROLL_STEP_FORWARD, FALSE); + add_scroll_binding_keypad (binding_set, GDK_KEY_Up, GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, FALSE); + add_scroll_binding_keypad (binding_set, GDK_KEY_Down, GDK_MOD1_MASK, GTK_SCROLL_STEP_UP, FALSE); + gtk_binding_entry_add_signal (binding_set, GDK_KEY_H, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD, G_TYPE_BOOLEAN, TRUE); - gtk_binding_entry_add_signal (binding_set, GDK_J, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE, + gtk_binding_entry_add_signal (binding_set, GDK_KEY_J, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD, G_TYPE_BOOLEAN, FALSE); - gtk_binding_entry_add_signal (binding_set, GDK_K, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE, + gtk_binding_entry_add_signal (binding_set, GDK_KEY_K, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_BACKWARD, G_TYPE_BOOLEAN, FALSE); - gtk_binding_entry_add_signal (binding_set, GDK_L, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE, + gtk_binding_entry_add_signal (binding_set, GDK_KEY_L, 0, "binding_activated", 2, GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_FORWARD, G_TYPE_BOOLEAN, TRUE); } @@ -4800,24 +4797,7 @@ job_finished_cb (EvPixbufCache *pixbuf_cache, 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)); } @@ -5971,24 +5951,7 @@ merge_selection_region (EvView *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); } }