Example #1
0
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);
}
Example #2
0
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);
}