summaryrefslogtreecommitdiff
path: root/src/eom-scroll-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eom-scroll-view.c')
-rw-r--r--src/eom-scroll-view.c223
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