static gboolean _adg_motion_notify_event(GtkWidget *widget, GdkEventMotion *event) { gboolean translating, local_space, global_space; cairo_matrix_t map, inverted; translating = (event->state & GDK_BUTTON2_MASK) == GDK_BUTTON2_MASK; local_space = (event->state & ADG_GTK_MODIFIERS) == 0; global_space = (event->state & ADG_GTK_MODIFIERS) == GDK_SHIFT_MASK; if (translating && (local_space || global_space) && _adg_get_map(widget, local_space, &map, &inverted)) { AdgGtkAreaPrivate *data = adg_gtk_area_get_instance_private((AdgGtkArea *) widget); gdouble x = event->x - data->x_event; gdouble y = event->y - data->y_event; cairo_matrix_transform_distance(&inverted, &x, &y); cairo_matrix_translate(&map, x, y); data->x_event = event->x; data->y_event = event->y; _adg_set_map(widget, local_space, &map); gtk_widget_queue_draw(widget); /* Avoid to chain up the default handler: * this event has been grabbed by this function */ return TRUE; } if (_ADG_OLD_WIDGET_CLASS->motion_notify_event == NULL) return FALSE; return _ADG_OLD_WIDGET_CLASS->motion_notify_event(widget, event); }
static gboolean _adg_scroll_event(GtkWidget *widget, GdkEventScroll *event) { gboolean zoom_in, zoom_out, local_space, global_space; cairo_matrix_t map, inverted; AdgGtkAreaPrivate *data; double factor, x, y; zoom_in = event->direction == GDK_SCROLL_UP; zoom_out = event->direction == GDK_SCROLL_DOWN; local_space = (event->state & ADG_GTK_MODIFIERS) == 0; global_space = (event->state & ADG_GTK_MODIFIERS) == GDK_SHIFT_MASK; if ((zoom_in || zoom_out) && (local_space || global_space) && _adg_get_map(widget, local_space, &map, &inverted)) { data = ((AdgGtkArea *) widget)->data; factor = zoom_in ? data->factor : 1. / data->factor; x = event->x; y = event->y; cairo_matrix_transform_point(&inverted, &x, &y); cairo_matrix_scale(&map, factor, factor); cairo_matrix_translate(&map, x/factor - x, y/factor - y); _adg_set_map(widget, local_space, &map); gtk_widget_queue_draw(widget); /* Avoid to chain up the default handler: * this event has been grabbed by this function */ return TRUE; } if (_ADG_OLD_WIDGET_CLASS->scroll_event == NULL) return FALSE; return _ADG_OLD_WIDGET_CLASS->scroll_event(widget, event); }