diff options
Diffstat (limited to 'src/eom-scroll-view.c')
-rw-r--r-- | src/eom-scroll-view.c | 223 |
1 files changed, 121 insertions, 102 deletions
diff --git a/src/eom-scroll-view.c b/src/eom-scroll-view.c index aa06906..ee57c77 100644 --- a/src/eom-scroll-view.c +++ b/src/eom-scroll-view.c @@ -19,10 +19,6 @@ #include <gdk/gdk.h> -/* Maximum size of delayed repaint rectangles */ -#define PAINT_RECT_WIDTH 128 -#define PAINT_RECT_HEIGHT 128 - /* Scroll step increment */ #define SCROLL_STEP_SIZE 32 @@ -32,10 +28,8 @@ #define CHECK_MEDIUM 8 #define CHECK_BLACK "#000000" -#define CHECK_DARK "#555555" #define CHECK_GRAY "#808080" #define CHECK_LIGHT "#cccccc" -#define CHECK_WHITE "#ffffff" /* Default increment for zooming. The current zoom factor is multiplied or * divided by this amount on every zooming step. For consistency, you should @@ -93,8 +87,8 @@ struct _EomScrollViewPrivate { /* actual image */ EomImage *image; - guint image_changed_id; - guint frame_changed_id; + gulong image_changed_id; + gulong frame_changed_id; GdkPixbuf *pixbuf; cairo_surface_t *surface; @@ -194,15 +188,20 @@ free_image_resources (EomScrollView *view) priv = view->priv; - if (priv->image_changed_id > 0) { - g_signal_handler_disconnect (G_OBJECT (priv->image), priv->image_changed_id); +#if GLIB_CHECK_VERSION(2,62,0) + g_clear_signal_handler (&priv->image_changed_id, priv->image); + g_clear_signal_handler (&priv->frame_changed_id, priv->image); +#else + if (priv->image_changed_id != 0) { + g_signal_handler_disconnect (priv->image, priv->image_changed_id); priv->image_changed_id = 0; } - if (priv->frame_changed_id > 0) { - g_signal_handler_disconnect (G_OBJECT (priv->image), priv->frame_changed_id); + if (priv->frame_changed_id != 0) { + g_signal_handler_disconnect (priv->image, priv->frame_changed_id); priv->frame_changed_id = 0; } +#endif if (priv->image != NULL) { eom_image_data_unref (priv->image); @@ -297,14 +296,14 @@ update_scrollbar_values (EomScrollView *view) priv = view->priv; - if (!gtk_widget_get_visible (GTK_WIDGET (priv->hbar)) - && !gtk_widget_get_visible (GTK_WIDGET (priv->vbar))) + if (!gtk_widget_get_visible (priv->hbar) + && !gtk_widget_get_visible (priv->vbar)) return; compute_scaled_size (view, priv->zoom, &scaled_width, &scaled_height); - gtk_widget_get_allocation (GTK_WIDGET (priv->display), &allocation); + gtk_widget_get_allocation (priv->display, &allocation); - if (gtk_widget_get_visible (GTK_WIDGET (priv->hbar))) { + if (gtk_widget_get_visible (priv->hbar)) { /* Set scroll increments */ page_size = MIN (scaled_width, allocation.width); @@ -329,7 +328,7 @@ update_scrollbar_values (EomScrollView *view) 0, 0, NULL, NULL, view); } - if (gtk_widget_get_visible (GTK_WIDGET (priv->vbar))) { + if (gtk_widget_get_visible (priv->vbar)) { page_size = MIN (scaled_height, allocation.height); page_increment = allocation.height / 2; step_increment = SCROLL_STEP_SIZE; @@ -447,10 +446,10 @@ check_scrollbar_visibility (EomScrollView *view, GtkAllocation *alloc) hbar_visible = TRUE; } - if (hbar_visible != gtk_widget_get_visible (GTK_WIDGET (priv->hbar))) + if (hbar_visible != gtk_widget_get_visible (priv->hbar)) g_object_set (G_OBJECT (priv->hbar), "visible", hbar_visible, NULL); - if (vbar_visible != gtk_widget_get_visible (GTK_WIDGET (priv->vbar))) + if (vbar_visible != gtk_widget_get_visible (priv->vbar)) g_object_set (G_OBJECT (priv->vbar), "visible", vbar_visible, NULL); } @@ -564,7 +563,6 @@ create_background_surface (EomScrollView *view) --------------------------------------*/ - /* Scrolls the view to the specified offsets. */ static void scroll_to (EomScrollView *view, int x, int y, gboolean change_adjustments) @@ -600,14 +598,14 @@ scroll_to (EomScrollView *view, int x, int y, gboolean change_adjustments) if (!gtk_widget_is_drawable (priv->display)) goto out; - gtk_widget_get_allocation (GTK_WIDGET (priv->display), &allocation); + gtk_widget_get_allocation (priv->display, &allocation); if (abs (xofs) >= allocation.width || abs (yofs) >= allocation.height) { - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); goto out; } - window = gtk_widget_get_window (GTK_WIDGET (priv->display)); + window = gtk_widget_get_window (priv->display); gdk_window_scroll (window, -xofs, -yofs); @@ -646,7 +644,6 @@ scroll_by (EomScrollView *view, int xofs, int yofs) scroll_to (view, priv->xofs + xofs, priv->yofs + yofs, TRUE); } - /* Callback used when an adjustment is changed */ static void adjustment_changed_cb (GtkAdjustment *adj, gpointer data) @@ -659,8 +656,9 @@ adjustment_changed_cb (GtkAdjustment *adj, gpointer data) scroll_to (view, gtk_adjustment_get_value (priv->hadj), gtk_adjustment_get_value (priv->vadj), FALSE); -} + gtk_widget_queue_resize (GTK_WIDGET (view)); +} /* Drags the image to the specified position */ static void @@ -732,7 +730,7 @@ set_zoom (EomScrollView *view, double zoom, priv->zoom_mode = ZOOM_MODE_FREE; - gtk_widget_get_allocation (GTK_WIDGET (priv->display), &allocation); + gtk_widget_get_allocation (priv->display, &allocation); /* compute new xofs/yofs values */ if (have_anchor) { @@ -764,9 +762,9 @@ set_zoom (EomScrollView *view, double zoom, update_scrollbar_values (view); /* repaint the whole image */ - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); - g_signal_emit (view, view_signals [SIGNAL_ZOOM_CHANGED], 0, priv->zoom); + g_signal_emit (view, view_signals[SIGNAL_ZOOM_CHANGED], 0, priv->zoom); } /* Zooms the image to fit the available allocation */ @@ -787,7 +785,7 @@ set_zoom_fit (EomScrollView *view) if (priv->pixbuf == NULL) return; - gtk_widget_get_allocation (GTK_WIDGET(priv->display), &allocation); + gtk_widget_get_allocation (priv->display, &allocation); new_zoom = zoom_fit_scale (allocation.width, allocation.height, gdk_pixbuf_get_width (priv->pixbuf) / priv->scale, @@ -803,7 +801,7 @@ set_zoom_fit (EomScrollView *view) priv->xofs = 0; priv->yofs = 0; - g_signal_emit (view, view_signals [SIGNAL_ZOOM_CHANGED], 0, priv->zoom); + g_signal_emit (view, view_signals[SIGNAL_ZOOM_CHANGED], 0, priv->zoom); } /*=================================== @@ -832,7 +830,7 @@ display_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer data) xofs = yofs = 0; zoom = 1.0; - gtk_widget_get_allocation (GTK_WIDGET (priv->display), &allocation); + gtk_widget_get_allocation (priv->display, &allocation); /* EomScrollView doesn't handle/have any Alt+Key combos */ if (event->state & GDK_MOD1_MASK) { @@ -927,7 +925,6 @@ display_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer data) return TRUE; } - /* Button press event handler for the image view */ static gboolean eom_scroll_view_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer data) @@ -939,7 +936,7 @@ eom_scroll_view_button_press_event (GtkWidget *widget, GdkEventButton *event, gp priv = view->priv; if (!gtk_widget_has_focus (priv->display)) - gtk_widget_grab_focus (GTK_WIDGET (priv->display)); + gtk_widget_grab_focus (priv->display); if (priv->dragging) return FALSE; @@ -1036,12 +1033,12 @@ eom_scroll_view_scroll_event (GtkWidget *widget, GdkEventScroll *event, gpointer case GDK_SCROLL_DOWN: zoom_factor = 1.0 / priv->zoom_multiplier; xofs = 0; - yofs = yofs; + /* yofs = yofs; */ break; case GDK_SCROLL_RIGHT: zoom_factor = priv->zoom_multiplier; - xofs = xofs; + /* xofs = xofs; */ yofs = 0; break; @@ -1087,7 +1084,7 @@ eom_scroll_view_motion_event (GtkWidget *widget, GdkEventMotion *event, gpointer return FALSE; if (event->is_hint) - gdk_window_get_device_position (gtk_widget_get_window (GTK_WIDGET (priv->display)), event->device, &x, &y, &mods); + gdk_window_get_device_position (gtk_widget_get_window (priv->display), event->device, &x, &y, &mods); else { x = event->x; y = event->y; @@ -1110,7 +1107,7 @@ display_map_event (GtkWidget *widget, GdkEvent *event, gpointer data) set_zoom_fit (view); check_scrollbar_visibility (view, NULL); - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); } static void @@ -1142,7 +1139,7 @@ display_size_change (GtkWidget *widget, GdkEventConfigure *event, gpointer data) set_zoom_fit (view); check_scrollbar_visibility (view, &alloc); - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); } else { int scaled_width, scaled_height; int x_offset = 0; @@ -1162,22 +1159,21 @@ display_size_change (GtkWidget *widget, GdkEventConfigure *event, gpointer data) update_scrollbar_values (view); } - static gboolean eom_scroll_view_focus_in_event (GtkWidget *widget, - GdkEventFocus *event, - gpointer data) + GdkEventFocus *event, + gpointer data) { - g_signal_stop_emission_by_name (G_OBJECT (widget), "focus_in_event"); + g_signal_stop_emission_by_name (widget, "focus_in_event"); return FALSE; } static gboolean eom_scroll_view_focus_out_event (GtkWidget *widget, - GdkEventFocus *event, - gpointer data) + GdkEventFocus *event, + gpointer data) { - g_signal_stop_emission_by_name (G_OBJECT (widget), "focus_out_event"); + g_signal_stop_emission_by_name (widget, "focus_out_event"); return FALSE; } @@ -1186,7 +1182,7 @@ static gboolean _hq_redraw_cb (gpointer user_data) EomScrollViewPrivate *priv = EOM_SCROLL_VIEW (user_data)->priv; priv->force_unfiltered = FALSE; - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); priv->hq_redraw_timeout_source = NULL; return G_SOURCE_REMOVE; @@ -1242,7 +1238,7 @@ display_draw (GtkWidget *widget, cairo_t *cr, gpointer data) compute_scaled_size (view, priv->zoom, &scaled_width, &scaled_height); - gtk_widget_get_allocation (GTK_WIDGET (priv->display), &allocation); + gtk_widget_get_allocation (priv->display, &allocation); /* Compute image offsets with respect to the window */ @@ -1303,7 +1299,8 @@ display_draw (GtkWidget *widget, cairo_t *cr, gpointer data) cairo_matrix_init_identity (&matrix); if (transform) { cairo_matrix_t affine; - double image_offset_x = 0., image_offset_y = 0.; + int image_offset_x = 0; + int image_offset_y = 0; eom_transform_get_affine (transform, &affine); cairo_matrix_multiply (&matrix, &affine, &matrix); @@ -1311,23 +1308,23 @@ display_draw (GtkWidget *widget, cairo_t *cr, gpointer data) switch (eom_transform_get_transform_type (transform)) { case EOM_TRANSFORM_ROT_90: case EOM_TRANSFORM_FLIP_HORIZONTAL: - image_offset_x = (double) gdk_pixbuf_get_width (priv->pixbuf); + image_offset_x = gdk_pixbuf_get_width (priv->pixbuf); break; case EOM_TRANSFORM_ROT_270: case EOM_TRANSFORM_FLIP_VERTICAL: - image_offset_y = (double) gdk_pixbuf_get_height (priv->pixbuf); + image_offset_y = gdk_pixbuf_get_height (priv->pixbuf); break; case EOM_TRANSFORM_ROT_180: case EOM_TRANSFORM_TRANSPOSE: case EOM_TRANSFORM_TRANSVERSE: - image_offset_x = (double) gdk_pixbuf_get_width (priv->pixbuf); - image_offset_y = (double) gdk_pixbuf_get_height (priv->pixbuf); + image_offset_x = gdk_pixbuf_get_width (priv->pixbuf); + image_offset_y = gdk_pixbuf_get_height (priv->pixbuf); break; case EOM_TRANSFORM_NONE: default: break; } - cairo_matrix_init_translate (&translate, image_offset_x, image_offset_y); + cairo_matrix_init_translate (&translate, (double) image_offset_x, (double) image_offset_y); cairo_matrix_multiply (&matrix, &matrix, &translate); } /* Zoom factor for SVGs is already scaled, so scale back to application pixels. */ @@ -1374,7 +1371,6 @@ display_draw (GtkWidget *widget, cairo_t *cr, gpointer data) return TRUE; } - /*================================== image loading callbacks @@ -1415,7 +1411,7 @@ image_changed_cb (EomImage *img, gpointer data) set_zoom_fit (EOM_SCROLL_VIEW (data)); check_scrollbar_visibility (EOM_SCROLL_VIEW (data), NULL); - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); } /*=================================== @@ -1449,7 +1445,7 @@ eom_scroll_view_set_zoom_upscale (EomScrollView *view, gboolean upscale) if (priv->zoom_mode == ZOOM_MODE_FIT) { set_zoom_fit (view); - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); } } } @@ -1468,7 +1464,7 @@ eom_scroll_view_set_antialiasing_in (EomScrollView *view, gboolean state) if (priv->interp_type_in != new_interp_type) { priv->interp_type_in = new_interp_type; - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); g_object_notify (G_OBJECT (view), "antialiasing-in"); } } @@ -1487,7 +1483,7 @@ eom_scroll_view_set_antialiasing_out (EomScrollView *view, gboolean state) if (priv->interp_type_out != new_interp_type) { priv->interp_type_out = new_interp_type; - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); g_object_notify (G_OBJECT (view), "antialiasing-out"); } @@ -1504,7 +1500,7 @@ _transp_background_changed (EomScrollView *view) /* Will be recreated if needed during redraw */ priv->background_surface = NULL; } - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); } } @@ -1631,7 +1627,7 @@ eom_scroll_view_zoom_fit (EomScrollView *view) set_zoom_fit (view); check_scrollbar_visibility (view, NULL); - gtk_widget_queue_draw (GTK_WIDGET (view->priv->display)); + gtk_widget_queue_draw (view->priv->display); } void @@ -1682,7 +1678,7 @@ display_next_frame_cb (EomImage *image, gint delay, gpointer data) priv = view->priv; update_pixbuf (view, eom_image_get_pixbuf (image)); - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); } void @@ -1711,16 +1707,18 @@ eom_scroll_view_set_image (EomScrollView *view, EomImage *image) update_pixbuf (view, eom_image_get_pixbuf (image)); set_zoom_fit (view); check_scrollbar_visibility (view, NULL); - gtk_widget_queue_draw (GTK_WIDGET (priv->display)); + gtk_widget_queue_draw (priv->display); } priv->image_changed_id = g_signal_connect (image, "changed", - (GCallback) image_changed_cb, view); + G_CALLBACK (image_changed_cb), + view); if (eom_image_is_animation (image) == TRUE ) { eom_image_start_animation (image); priv->frame_changed_id = g_signal_connect (image, "next-frame", - (GCallback) display_next_frame_cb, view); + G_CALLBACK (display_next_frame_cb), + view); } } @@ -1755,8 +1753,8 @@ eom_scroll_view_get_image (EomScrollView *view) gboolean eom_scroll_view_scrollbars_visible (EomScrollView *view) { - if (!gtk_widget_get_visible (GTK_WIDGET (view->priv->hbar)) && - !gtk_widget_get_visible (GTK_WIDGET (view->priv->vbar))) + if (!gtk_widget_get_visible (view->priv->hbar) && + !gtk_widget_get_visible (view->priv->vbar)) return FALSE; return TRUE; @@ -1831,22 +1829,22 @@ eom_scroll_view_init (EomScrollView *view) priv->hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0, 100, 0, 10, 10, 100)); g_signal_connect (priv->hadj, "value_changed", - G_CALLBACK (adjustment_changed_cb), - view); + G_CALLBACK (adjustment_changed_cb), + view); priv->hbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, priv->hadj); priv->vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0, 100, 0, 10, 10, 100)); g_signal_connect (priv->vadj, "value_changed", - G_CALLBACK (adjustment_changed_cb), - view); + G_CALLBACK (adjustment_changed_cb), + view); priv->vbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, priv->vadj); priv->display = g_object_new (GTK_TYPE_DRAWING_AREA, "can-focus", TRUE, NULL); - priv->scale = gtk_widget_get_scale_factor (GTK_WIDGET (priv->display)); + priv->scale = gtk_widget_get_scale_factor (priv->display); - gtk_widget_add_events (GTK_WIDGET (priv->display), + gtk_widget_add_events (priv->display, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -1854,37 +1852,59 @@ eom_scroll_view_init (EomScrollView *view) | GDK_POINTER_MOTION_HINT_MASK | GDK_SCROLL_MASK | GDK_KEY_PRESS_MASK); - g_signal_connect (G_OBJECT (priv->display), "configure_event", - G_CALLBACK (display_size_change), view); - g_signal_connect (G_OBJECT (priv->display), "draw", G_CALLBACK (display_draw), view); - g_signal_connect (G_OBJECT (priv->display), "map_event", - G_CALLBACK (display_map_event), view); - g_signal_connect (G_OBJECT (priv->display), "button_press_event", - G_CALLBACK (eom_scroll_view_button_press_event), - view); - g_signal_connect (G_OBJECT (priv->display), "motion_notify_event", - G_CALLBACK (eom_scroll_view_motion_event), view); - g_signal_connect (G_OBJECT (priv->display), "button_release_event", - G_CALLBACK (eom_scroll_view_button_release_event), - view); - g_signal_connect (G_OBJECT (priv->display), "scroll_event", - G_CALLBACK (eom_scroll_view_scroll_event), view); - g_signal_connect (G_OBJECT (priv->display), "focus_in_event", - G_CALLBACK (eom_scroll_view_focus_in_event), NULL); - g_signal_connect (G_OBJECT (priv->display), "focus_out_event", - G_CALLBACK (eom_scroll_view_focus_out_event), NULL); - - g_signal_connect (G_OBJECT (view), "key_press_event", - G_CALLBACK (display_key_press_event), view); + + g_signal_connect (priv->display, "configure_event", + G_CALLBACK (display_size_change), + view); + + g_signal_connect (priv->display, "draw", + G_CALLBACK (display_draw), + view); + + g_signal_connect (priv->display, "map_event", + G_CALLBACK (display_map_event), + view); + + g_signal_connect (priv->display, "button_press_event", + G_CALLBACK (eom_scroll_view_button_press_event), + view); + + g_signal_connect (priv->display, "motion_notify_event", + G_CALLBACK (eom_scroll_view_motion_event), + view); + + g_signal_connect (priv->display, "button_release_event", + G_CALLBACK (eom_scroll_view_button_release_event), + view); + + g_signal_connect (priv->display, "scroll_event", + G_CALLBACK (eom_scroll_view_scroll_event), + view); + + g_signal_connect (priv->display, "focus_in_event", + G_CALLBACK (eom_scroll_view_focus_in_event), + NULL); + + g_signal_connect (priv->display, "focus_out_event", + G_CALLBACK (eom_scroll_view_focus_out_event), + NULL); + + g_signal_connect (view, "key_press_event", + G_CALLBACK (display_key_press_event), + view); gtk_drag_source_set (priv->display, GDK_BUTTON1_MASK, target_table, G_N_ELEMENTS (target_table), GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK); - g_signal_connect (G_OBJECT (priv->display), "drag-data-get", - G_CALLBACK (view_on_drag_data_get_cb), view); - g_signal_connect (G_OBJECT (priv->display), "drag-begin", - G_CALLBACK (view_on_drag_begin_cb), view); + + g_signal_connect (priv->display, "drag-data-get", + G_CALLBACK (view_on_drag_data_get_cb), + view); + + g_signal_connect (priv->display, "drag-begin", + G_CALLBACK (view_on_drag_begin_cb), + view); gtk_grid_attach (GTK_GRID (view), priv->display, 0, 0, 1, 1); @@ -2055,7 +2075,6 @@ eom_scroll_view_set_property (GObject *object, guint property_id, } } - static void eom_scroll_view_class_init (EomScrollViewClass *klass) { @@ -2228,7 +2247,6 @@ eom_scroll_view_new (void) "column-homogeneous", FALSE, NULL); - return widget; } @@ -2263,8 +2281,9 @@ eom_scroll_view_set_popup (EomScrollView *view, GTK_WIDGET (view), NULL); - g_signal_connect (G_OBJECT (view), "button_press_event", - G_CALLBACK (view_on_button_press_event_cb), NULL); + g_signal_connect (view, "button_press_event", + G_CALLBACK (view_on_button_press_event_cb), + NULL); } static gboolean |