Zoom with the scroll wheel
This commit is contained in:
parent
f24885db54
commit
cc29f80bb2
|
@ -77,11 +77,43 @@ fastiv_view_get_preferred_width(GtkWidget *widget,
|
||||||
*natural = get_display_width(self);
|
*natural = get_display_width(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
fastiv_view_realize(GtkWidget *widget)
|
||||||
|
{
|
||||||
|
GtkAllocation allocation;
|
||||||
|
gtk_widget_get_allocation(widget, &allocation);
|
||||||
|
|
||||||
|
GdkWindowAttr attributes = {
|
||||||
|
.window_type = GDK_WINDOW_CHILD,
|
||||||
|
.x = allocation.x,
|
||||||
|
.y = allocation.y,
|
||||||
|
.width = allocation.width,
|
||||||
|
.height = allocation.height,
|
||||||
|
|
||||||
|
// Input-only would presumably also work (as in GtkPathBar, e.g.),
|
||||||
|
// but it merely seems to involve more work.
|
||||||
|
.wclass = GDK_INPUT_OUTPUT,
|
||||||
|
|
||||||
|
// Assuming here that we can't ask for a higher-precision Visual
|
||||||
|
// than what we get automatically.
|
||||||
|
.visual = gtk_widget_get_visual(widget),
|
||||||
|
.event_mask = gtk_widget_get_events(widget) | GDK_SCROLL_MASK,
|
||||||
|
};
|
||||||
|
|
||||||
|
// We need this window to receive input events at all.
|
||||||
|
GdkWindow *window = gdk_window_new(gtk_widget_get_parent_window(widget),
|
||||||
|
&attributes, GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
|
||||||
|
gtk_widget_register_window(widget, window);
|
||||||
|
gtk_widget_set_window(widget, window);
|
||||||
|
gtk_widget_set_realized(widget, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
fastiv_view_draw(GtkWidget *widget, cairo_t *cr)
|
fastiv_view_draw(GtkWidget *widget, cairo_t *cr)
|
||||||
{
|
{
|
||||||
FastivView *self = FASTIV_VIEW(widget);
|
FastivView *self = FASTIV_VIEW(widget);
|
||||||
if (!self->surface)
|
if (!self->surface
|
||||||
|
|| !gtk_cairo_should_draw_window(cr, gtk_widget_get_window(widget)))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
// TODO(p): Make this adjustable later.
|
// TODO(p): Make this adjustable later.
|
||||||
|
@ -109,6 +141,27 @@ fastiv_view_draw(GtkWidget *widget, cairo_t *cr)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
fastiv_view_scroll_event(GtkWidget *widget, GdkEventScroll *event)
|
||||||
|
{
|
||||||
|
FastivView *self = FASTIV_VIEW(widget);
|
||||||
|
if (!self->surface)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
switch (event->direction) {
|
||||||
|
case GDK_SCROLL_UP:
|
||||||
|
self->scale *= 1.4;
|
||||||
|
gtk_widget_queue_resize(widget);
|
||||||
|
return TRUE;
|
||||||
|
case GDK_SCROLL_DOWN:
|
||||||
|
self->scale /= 1.4;
|
||||||
|
gtk_widget_queue_resize(widget);
|
||||||
|
return TRUE;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fastiv_view_class_init(FastivViewClass *klass)
|
fastiv_view_class_init(FastivViewClass *klass)
|
||||||
{
|
{
|
||||||
|
@ -118,15 +171,18 @@ fastiv_view_class_init(FastivViewClass *klass)
|
||||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
|
||||||
widget_class->get_preferred_height = fastiv_view_get_preferred_height;
|
widget_class->get_preferred_height = fastiv_view_get_preferred_height;
|
||||||
widget_class->get_preferred_width = fastiv_view_get_preferred_width;
|
widget_class->get_preferred_width = fastiv_view_get_preferred_width;
|
||||||
|
widget_class->realize = fastiv_view_realize;
|
||||||
widget_class->draw = fastiv_view_draw;
|
widget_class->draw = fastiv_view_draw;
|
||||||
|
widget_class->scroll_event = fastiv_view_scroll_event;
|
||||||
|
|
||||||
|
// TODO(p): Later override "screen_changed", recreate Pango layouts there,
|
||||||
|
// if we get to have any, or otherwise reflect DPI changes.
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
fastiv_view_init(FastivView *self)
|
fastiv_view_init(FastivView *self)
|
||||||
{
|
{
|
||||||
self->scale = 1.0;
|
self->scale = 1.0;
|
||||||
|
|
||||||
gtk_widget_set_has_window(GTK_WIDGET(self), FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Picture loading ---------------------------------------------------------
|
// --- Picture loading ---------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue