X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libview%2Fev-view.c;h=24710f94a0d03a9de0b963fcd329e8ae6a7021c4;hb=f77e6cf4fd7fef49ac91d8c62b6a9a993529adb8;hp=471c66ca81aeb7c178e286020469dec8b9292896;hpb=584f014b63c56fe3770cba9682fc21c31e09a2e9;p=evince.git diff --git a/libview/ev-view.c b/libview/ev-view.c index 471c66ca..24710f94 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" @@ -56,6 +57,7 @@ enum { SIGNAL_SELECTION_CHANGED, SIGNAL_SYNC_SOURCE, SIGNAL_ANNOT_ADDED, + SIGNAL_LAYERS_CHANGED, N_SIGNALS }; @@ -1738,6 +1740,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: @@ -3479,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 @@ -3996,7 +4033,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 = @@ -4353,7 +4395,6 @@ draw_one_page (EvView *view, GdkRectangle *expose_area, gboolean *page_ready) { - GdkWindow *bin_window; GdkRectangle overlap; GdkRectangle real_page_area; gint current_page; @@ -4373,7 +4414,6 @@ 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 (cr, @@ -4675,6 +4715,14 @@ ev_view_class_init (EvViewClass *class) 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); @@ -4755,7 +4803,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)); } @@ -5909,7 +5974,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); } }