X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libview%2Fev-view.c;h=75d6deb3b0821d12b6adf7ddd6284b8467b59cb2;hb=631d1064c0a754462cb5edd9d9d5f570fa47879b;hp=d5f2a71cc46849a4bf9c6660f7901d6bf8babb83;hpb=9d70081e79a63d1189d2497dbafaac3c48b1a581;p=evince.git diff --git a/libview/ev-view.c b/libview/ev-view.c index d5f2a71c..75d6deb3 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -32,6 +32,7 @@ #include "ev-document-forms.h" #include "ev-document-images.h" #include "ev-document-links.h" +#include "ev-document-layers.h" #include "ev-document-misc.h" #include "ev-pixbuf-cache.h" #include "ev-page-cache.h" @@ -55,6 +56,8 @@ enum { SIGNAL_POPUP_MENU, SIGNAL_SELECTION_CHANGED, SIGNAL_SYNC_SOURCE, + SIGNAL_ANNOT_ADDED, + SIGNAL_LAYERS_CHANGED, N_SIGNALS }; @@ -154,8 +157,15 @@ static void ev_view_size_allocate (GtkWidget static void ev_view_realize (GtkWidget *widget); static gboolean ev_view_scroll_event (GtkWidget *widget, GdkEventScroll *event); +#if GTK_CHECK_VERSION (2, 90, 8) +static gboolean ev_view_draw (GtkWidget *widget, + cairo_t *cr, + int draw_width, + int draw_height); +#else static gboolean ev_view_expose_event (GtkWidget *widget, GdkEventExpose *event); +#endif static gboolean ev_view_popup_menu (GtkWidget *widget); static gboolean ev_view_button_press_event (GtkWidget *widget, GdkEventButton *event); @@ -175,10 +185,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, @@ -788,7 +801,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, @@ -1737,6 +1750,38 @@ ev_view_handle_link (EvView *view, EvLink *link) ev_view_goto_dest (view, dest); } break; + case EV_LINK_ACTION_TYPE_LAYERS_STATE: { + GList *show, *hide, *toggle; + GList *l; + EvDocumentLayers *document_layers; + + document_layers = EV_DOCUMENT_LAYERS (view->document); + + show = ev_link_action_get_show_list (action); + for (l = show; l; l = g_list_next (l)) { + ev_document_layers_show_layer (document_layers, EV_LAYER (l->data)); + } + + hide = ev_link_action_get_hide_list (action); + for (l = hide; l; l = g_list_next (l)) { + ev_document_layers_hide_layer (document_layers, EV_LAYER (l->data)); + } + + toggle = ev_link_action_get_toggle_list (action); + for (l = toggle; l; l = g_list_next (l)) { + EvLayer *layer = EV_LAYER (l->data); + + if (ev_document_layers_layer_is_visible (document_layers, layer)) { + ev_document_layers_hide_layer (document_layers, layer); + } else { + ev_document_layers_show_layer (document_layers, layer); + } + } + + g_signal_emit (view, signals[SIGNAL_LAYERS_CHANGED], 0); + ev_view_reload_page (view, view->current_page, NULL); + } + break; case EV_LINK_ACTION_TYPE_GOTO_REMOTE: case EV_LINK_ACTION_TYPE_EXTERNAL_URI: case EV_LINK_ACTION_TYPE_LAUNCH: @@ -1832,6 +1877,12 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y) if (view->cursor == EV_VIEW_CURSOR_HIDDEN) return; + if (view->adding_annot) { + if (view->cursor != EV_VIEW_CURSOR_ADD) + ev_view_set_cursor (view, EV_VIEW_CURSOR_ADD); + return; + } + if (view->drag_info.in_drag) { if (view->cursor != EV_VIEW_CURSOR_DRAG) ev_view_set_cursor (view, EV_VIEW_CURSOR_DRAG); @@ -1866,7 +1917,8 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y) if (view->cursor == EV_VIEW_CURSOR_LINK || view->cursor == EV_VIEW_CURSOR_IBEAM || view->cursor == EV_VIEW_CURSOR_DRAG || - view->cursor == EV_VIEW_CURSOR_AUTOSCROLL) + view->cursor == EV_VIEW_CURSOR_AUTOSCROLL || + view->cursor == EV_VIEW_CURSOR_ADD) ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); } @@ -2494,7 +2546,7 @@ ev_view_find_window_child_for_annot (EvView *view, continue; wannot = ev_annotation_window_get_annotation (EV_ANNOTATION_WINDOW (child->window)); - if (wannot == annot || strcmp (wannot->name, annot->name) == 0) + if (ev_annotation_equal (wannot, annot)) return child; } @@ -2577,18 +2629,55 @@ annotation_window_moved (EvAnnotationWindow *window, } static void -ev_view_annotation_save (EvView *view, - EvAnnotation *annot) +ev_view_annotation_save_contents (EvView *view, + GParamSpec *pspec, + EvAnnotation *annot) { if (!view->document) return; - if (!annot->changed) - return; + ev_document_doc_mutex_lock (); + ev_document_annotations_save_annotation (EV_DOCUMENT_ANNOTATIONS (view->document), + annot, EV_ANNOTATIONS_SAVE_CONTENTS); + ev_document_doc_mutex_unlock (); +} - ev_document_annotations_annotation_set_contents (EV_DOCUMENT_ANNOTATIONS (view->document), - annot, annot->contents); - annot->changed = FALSE; +static GtkWidget * +ev_view_create_annotation_window (EvView *view, + EvAnnotation *annot, + GtkWindow *parent) +{ + GtkWidget *window; + EvRectangle doc_rect; + GdkRectangle view_rect; + guint page; + + window = ev_annotation_window_new (annot, parent); + g_signal_connect (window, "grab_focus", + G_CALLBACK (annotation_window_grab_focus), + view); + g_signal_connect (window, "closed", + G_CALLBACK (annotation_window_closed), + view); + g_signal_connect (window, "moved", + G_CALLBACK (annotation_window_moved), + view); + g_signal_connect_swapped (annot, "notify::contents", + G_CALLBACK (ev_view_annotation_save_contents), + view); + g_object_set_data (G_OBJECT (annot), "popup", window); + + page = ev_annotation_get_page_index (annot); + ev_annotation_window_get_rectangle (EV_ANNOTATION_WINDOW (window), &doc_rect); + doc_rect_to_view_rect (view, page, &doc_rect, &view_rect); + view_rect.x -= view->scroll_x; + view_rect.y -= view->scroll_y; + + ev_view_window_child_put (view, window, page, + view_rect.x, view_rect.y, + doc_rect.x1, doc_rect.y1); + + return window; } static void @@ -2607,8 +2696,6 @@ show_annotation_windows (EvView *view, EvAnnotation *annot; EvViewWindowChild *child; GtkWidget *window; - EvRectangle *doc_rect; - GdkRectangle view_rect; annot = ((EvMapping *)(l->data))->data; @@ -2632,30 +2719,7 @@ show_annotation_windows (EvView *view, g_object_set_data (G_OBJECT (annot), "popup", window); ev_view_window_child_move_with_parent (view, window); } else { - window = ev_annotation_window_new (annot, parent); - g_signal_connect (window, "grab_focus", - G_CALLBACK (annotation_window_grab_focus), - view); - g_signal_connect (window, "closed", - G_CALLBACK (annotation_window_closed), - view); - g_signal_connect (window, "moved", - G_CALLBACK (annotation_window_moved), - view); - g_object_set_data (G_OBJECT (annot), "popup", window); - - doc_rect = (EvRectangle *)ev_annotation_window_get_rectangle (EV_ANNOTATION_WINDOW (window)); - doc_rect_to_view_rect (view, page, doc_rect, &view_rect); - view_rect.x -= view->scroll_x; - view_rect.y -= view->scroll_y; - - ev_view_window_child_put (view, window, page, - view_rect.x, view_rect.y, - doc_rect->x1, doc_rect->y1); - - g_object_weak_ref (G_OBJECT (annot), - (GWeakNotify)ev_view_annotation_save, - view); + ev_view_create_annotation_window (view, annot, parent); } } } @@ -2707,6 +2771,23 @@ ev_view_get_annotation_at_location (EvView *view, return NULL; } +static void +ev_view_annotation_show_popup_window (EvView *view, + GtkWidget *window) +{ + EvViewWindowChild *child; + + if (!window) + return; + + child = ev_view_get_window_child (view, window); + if (!child->visible) { + child->visible = TRUE; + ev_view_window_child_move (view, child, child->x, child->y); + gtk_widget_show (window); + } +} + static void ev_view_handle_annotation (EvView *view, EvAnnotation *annot, @@ -2718,21 +2799,13 @@ ev_view_handle_annotation (EvView *view, GtkWidget *window; window = g_object_get_data (G_OBJECT (annot), "popup"); - if (window) { - EvViewWindowChild *child; - - child = ev_view_get_window_child (view, window); - if (!child->visible) { - child->visible = TRUE; - ev_view_window_child_move (view, child, child->x, child->y); - gtk_widget_show (window); - } - } + ev_view_annotation_show_popup_window (view, window); } if (EV_IS_ANNOTATION_ATTACHMENT (annot)) { - EvAttachment *attachment = EV_ANNOTATION_ATTACHMENT (annot)->attachment; + EvAttachment *attachment; + attachment = ev_annotation_attachment_get_attachment (EV_ANNOTATION_ATTACHMENT (annot)); if (attachment) { GError *error = NULL; @@ -2749,12 +2822,97 @@ ev_view_handle_annotation (EvView *view, } } +static void +ev_view_create_annotation (EvView *view, + EvAnnotationType annot_type, + gint x, + gint y) +{ + EvAnnotation *annot; + GdkPoint point; + GdkRectangle page_area; + GtkBorder border; + EvRectangle doc_rect, popup_rect; + EvPage *page; + GdkColor color = { 0, 65535, 65535, 0 }; + GdkRectangle view_rect; + cairo_region_t *region; + + point.x = x; + point.y = y; + ev_view_get_page_extents (view, view->current_page, &page_area, &border); + view_point_to_doc_point (view, &point, &page_area, + &doc_rect.x1, &doc_rect.y1); + doc_rect.x2 = doc_rect.x1 + 24; + doc_rect.y2 = doc_rect.y1 + 24; + + ev_document_doc_mutex_lock (); + page = ev_document_get_page (view->document, view->current_page); + switch (annot_type) { + case EV_ANNOTATION_TYPE_TEXT: + annot = ev_annotation_text_new (page); + break; + case EV_ANNOTATION_TYPE_ATTACHMENT: + /* TODO */ + g_object_unref (page); + ev_document_doc_mutex_unlock (); + return; + default: + g_assert_not_reached (); + } + g_object_unref (page); + + ev_annotation_set_color (annot, &color); + + if (EV_IS_ANNOTATION_MARKUP (annot)) { + popup_rect.x1 = doc_rect.x2; + popup_rect.x2 = popup_rect.x1 + 200; + popup_rect.y1 = doc_rect.y2; + popup_rect.y2 = popup_rect.y1 + 150; + g_object_set (annot, + "rectangle", &popup_rect, + "has_popup", TRUE, + "popup_is_open", FALSE, + "label", g_get_real_name (), + "opacity", 1.0, + NULL); + } + ev_document_annotations_add_annotation (EV_DOCUMENT_ANNOTATIONS (view->document), + annot, &doc_rect); + ev_document_doc_mutex_unlock (); + + /* If the page didn't have annots, mark the cache as dirty */ + if (!ev_page_cache_get_annot_mapping (view->page_cache, view->current_page)) + ev_page_cache_mark_dirty (view->page_cache, view->current_page); + + if (EV_IS_ANNOTATION_MARKUP (annot)) { + GtkWindow *parent; + GtkWidget *window; + + parent = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))); + window = ev_view_create_annotation_window (view, annot, parent); + + /* Show the annot window the first time */ + ev_view_annotation_show_popup_window (view, window); + } + + doc_rect_to_view_rect (view, view->current_page, &doc_rect, &view_rect); + view_rect.x -= view->scroll_x; + view_rect.y -= view->scroll_y; + region = cairo_region_create_rectangle (&view_rect); + ev_view_reload_page (view, view->current_page, region); + cairo_region_destroy (region); + + g_signal_emit (view, signals[SIGNAL_ANNOT_ADDED], 0, annot); +} + void ev_view_focus_annotation (EvView *view, EvMapping *annot_mapping) { GdkRectangle view_rect; EvAnnotation *annot; + guint page; if (!EV_IS_DOCUMENT_ANNOTATIONS (view->document)) return; @@ -2765,14 +2923,43 @@ ev_view_focus_annotation (EvView *view, view->focus_annotation = annot_mapping; annot = (EvAnnotation *)annot_mapping->data; - ev_document_model_set_page (view->model, annot->page->index); + page = ev_annotation_get_page_index (annot); + ev_document_model_set_page (view->model, page); - doc_rect_to_view_rect (view, annot->page->index, + doc_rect_to_view_rect (view, page, &annot_mapping->area, &view_rect); ensure_rectangle_is_visible (view, &view_rect); gtk_widget_queue_draw (GTK_WIDGET (view)); } +void +ev_view_begin_add_annotation (EvView *view, + EvAnnotationType annot_type) +{ + if (annot_type == EV_ANNOTATION_TYPE_UNKNOWN) + return; + + if (view->adding_annot) + return; + + view->adding_annot = TRUE; + view->adding_annot_type = annot_type; + ev_view_set_cursor (view, EV_VIEW_CURSOR_ADD); +} + +void +ev_view_cancel_add_annotation (EvView *view) +{ + gint x, y; + + if (!view->adding_annot) + return; + + view->adding_annot = FALSE; + gtk_widget_get_pointer (GTK_WIDGET (view), &x, &y); + ev_view_handle_cursor_over_xy (view, x, y); +} + static gboolean ev_view_synctex_backward_search (EvView *view, gdouble x, @@ -3040,7 +3227,7 @@ ev_view_size_allocate (GtkWidget *widget, child = (EvViewWindowChild *)l->data; - doc_rect = *ev_annotation_window_get_rectangle (EV_ANNOTATION_WINDOW (child->window)); + ev_annotation_window_get_rectangle (EV_ANNOTATION_WINDOW (child->window), &doc_rect); if (child->moved) { doc_rect.x1 = child->orig_x; doc_rect.y1 = child->orig_y; @@ -3163,14 +3350,28 @@ find_selection_for_page (EvView *view, return NULL; } +#if GTK_CHECK_VERSION (2, 90, 8) +static gboolean +ev_view_draw (GtkWidget *widget, + cairo_t *cr, + int draw_width G_GNUC_UNUSED, + int draw_height G_GNUC_UNUSED) +#else static gboolean ev_view_expose_event (GtkWidget *widget, GdkEventExpose *event) +#endif { EvView *view = EV_VIEW (widget); - GdkWindow *bin_window; - cairo_t *cr; gint i; +#if GTK_CHECK_VERSION (2, 90, 8) + cairo_rectangle_int_t clip_rect; + GdkRectangle *area = &clip_rect; +#else + GdkWindow *bin_window; + cairo_t *cr; + GdkRectangle *area = &event->area; +#endif if (view->loading) { show_loading_window (view); @@ -3182,8 +3383,13 @@ ev_view_expose_event (GtkWidget *widget, if (view->document == NULL) return FALSE; - bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view)); +#if GTK_CHECK_VERSION (2, 90, 8) + if (!gdk_cairo_get_clip_rectangle (cr, &clip_rect)) + return FALSE; +#else + bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view)); cr = gdk_cairo_create (bin_window); +#endif for (i = view->start_page; i >= 0 && i <= view->end_page; i++) { GdkRectangle page_area; @@ -3196,22 +3402,31 @@ 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, area, &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); +#if GTK_CHECK_VERSION (2, 90, 8) + focus_annotation (view, cr, i, &clip_rect); +#else + focus_annotation (view, cr, i, &event->area); +#endif if (page_ready && view->synctex_result) - highlight_forward_search_results (view, i); + highlight_forward_search_results (view, cr, i); } +#if GTK_CHECK_VERSION (2, 90, 8) + if (GTK_WIDGET_CLASS (ev_view_parent_class)->draw) + GTK_WIDGET_CLASS (ev_view_parent_class)->draw (widget, cr, draw_width, draw_height); +#else cairo_destroy (cr); if (GTK_WIDGET_CLASS (ev_view_parent_class)->expose_event) (* GTK_WIDGET_CLASS (ev_view_parent_class)->expose_event) (widget, event); +#endif return FALSE; } @@ -3311,14 +3526,18 @@ ev_view_query_tooltip (GtkWidget *widget, gchar *text; annot = ev_view_get_annotation_at_location (view, x, y); - if (annot && annot->contents) { - GdkRectangle annot_area; + if (annot) { + const gchar *contents; - get_annot_area (view, x, y, annot, &annot_area); - gtk_tooltip_set_text (tooltip, annot->contents); - gtk_tooltip_set_tip_area (tooltip, &annot_area); + if ((contents = ev_annotation_get_contents (annot))) { + GdkRectangle annot_area; - return TRUE; + get_annot_area (view, x, y, annot, &annot_area); + gtk_tooltip_set_text (tooltip, contents); + gtk_tooltip_set_tip_area (tooltip, &annot_area); + + return TRUE; + } } link = ev_view_get_link_at_location (view, x, y); @@ -3332,10 +3551,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 @@ -3386,13 +3608,15 @@ ev_view_button_press_event (GtkWidget *widget, window = EV_ANNOTATION_WINDOW (view->window_child_focus->window); annot = ev_annotation_window_get_annotation (window); ev_annotation_window_ungrab_focus (window); - ev_view_annotation_save (view, annot); view->window_child_focus = NULL; } view->pressed_button = event->button; view->selection_info.in_drag = FALSE; + if (view->adding_annot) + return FALSE; + if (view->scroll_info.autoscrolling) return TRUE; @@ -3847,7 +4071,12 @@ ev_view_button_release_event (GtkWidget *widget, view->pressed_button = -1; return TRUE; - } + } + + if (view->pressed_button == 1 && event->state & GDK_CONTROL_MASK) { + view->pressed_button = -1; + return TRUE; + } if (view->drag_info.in_drag) { view->drag_info.release_timeout_id = @@ -3861,6 +4090,19 @@ ev_view_button_release_event (GtkWidget *widget, view->drag_info.in_drag = FALSE; + if (view->adding_annot && view->pressed_button == 1) { + view->adding_annot = FALSE; + ev_view_handle_cursor_over_xy (view, event->x, event->y); + view->pressed_button = -1; + + ev_view_create_annotation (view, + view->adding_annot_type, + event->x + view->scroll_x, + event->y + view->scroll_y); + + return FALSE; + } + if (view->pressed_button == 2) { ev_view_handle_cursor_over_xy (view, event->x, event->y); } @@ -3999,22 +4241,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, @@ -4027,20 +4268,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++) { @@ -4056,36 +4293,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) { @@ -4094,10 +4331,19 @@ focus_annotation (EvView *view, EvMapping *mapping = view->focus_annotation; EvAnnotation *annot = (EvAnnotation *)mapping->data; - if (annot->page->index != page) + if (ev_annotation_get_page_index (annot) != page) return; doc_rect_to_view_rect (view, page, &mapping->area, &rect); +#if GTK_CHECK_VERSION (2, 90, 8) + 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); +#else gtk_paint_focus (gtk_widget_get_style (widget), gtk_layout_get_bin_window (GTK_LAYOUT (view)), gtk_widget_get_state (widget), @@ -4105,6 +4351,7 @@ focus_annotation (EvView *view, rect.x - view->scroll_x, rect.y - view->scroll_y, rect.width + 1, rect.height + 1); +#endif } static void @@ -4191,7 +4438,6 @@ draw_one_page (EvView *view, GdkRectangle *expose_area, gboolean *page_ready) { - GdkWindow *bin_window; GdkRectangle overlap; GdkRectangle real_page_area; gint current_page; @@ -4211,10 +4457,9 @@ draw_one_page (EvView *view, real_page_area.height -= (border->top + border->bottom); *page_ready = TRUE; - bin_window = gtk_layout_get_bin_window (GTK_LAYOUT (view)); current_page = ev_document_model_get_page (view->model); inverted_colors = ev_document_model_get_inverted_colors (view->model); - ev_document_misc_paint_one_page (bin_window, + ev_document_misc_paint_one_page (cr, GTK_WIDGET (view), page_area, border, page == current_page, @@ -4430,7 +4675,11 @@ ev_view_class_init (EvViewClass *class) object_class->finalize = ev_view_finalize; +#if GTK_CHECK_VERSION (2, 90, 8) + widget_class->draw = ev_view_draw; +#else widget_class->expose_event = ev_view_expose_event; +#endif 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; @@ -4505,24 +4754,40 @@ ev_view_class_init (EvViewClass *class) g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); + signals[SIGNAL_ANNOT_ADDED] = g_signal_new ("annot-added", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (EvViewClass, annot_added), + NULL, NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + EV_TYPE_ANNOTATION); + signals[SIGNAL_LAYERS_CHANGED] = g_signal_new ("layers-changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (EvViewClass, layers_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0, + G_TYPE_NONE); 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); } @@ -4585,7 +4850,24 @@ 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)); } @@ -5739,7 +6021,24 @@ 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); } }