From 7a100b773324421ca0739084f2afd24cdde2693f Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sat, 15 Jun 2019 10:12:31 +0200 Subject: Hold shift for fine control --- src/nanolight.c | 37 ++++++++++++++++++++++++++++++------- src/nanolight.h | 1 + 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/nanolight.c b/src/nanolight.c index fe4d1a5..40c8bd1 100644 --- a/src/nanolight.c +++ b/src/nanolight.c @@ -395,37 +395,60 @@ static gboolean button_release_sig(GtkWidget *da, GdkEventButton *event, struct } +static double maybe_fine(struct fixture *fix, int n, double inc, int shift) +{ + if ( !(fix->cls->attrs[n].props & ATTR_16BIT) ) return inc; + if ( shift ) return inc; + return inc * 100.0; +} + + static gboolean motion_sig(GtkWidget *da, GdkEventMotion *event, struct nanolight *nl) { int i; + double x_inc, y_inc; + int shift; if ( !nl->dragging ) return FALSE; + x_inc = (event->x - nl->x_orig)/3; + y_inc = (nl->y_orig - event->y)/3; /* Mouse up means increase */ + + shift = event->state & GDK_SHIFT_MASK; + if ( shift != nl->fine ) { + nl->fine = shift; + set_start_attrs(nl, nl->sel_attr); + nl->x_orig = event->x; + nl->y_orig = event->y; + return FALSE; + } + if ( nl->sel_attr == ATT_TILT ) { - double pan_inc, tilt_inc; - pan_inc = 9*(event->x - nl->x_orig); - tilt_inc = 9*(event->y - nl->y_orig); for ( i=0; in_sel; i++ ) { int n; struct fixture *fix = &nl->fixtures[nl->selection[i]]; if ( find_attribute(fix, ATT_PAN, &n) ) { - signed int nv = fix->attr_vals_start[n] + pan_inc; + double inc = maybe_fine(fix, n, x_inc, + event->state & GDK_SHIFT_MASK); + signed int nv = fix->attr_vals_start[n] + inc; cap_value(fix, n, &nv); fix->attr_vals[n] = nv; } if ( find_attribute(fix, ATT_TILT, &n) ) { - signed int nv = fix->attr_vals_start[n] + tilt_inc; + double inc = maybe_fine(fix, n, y_inc, + event->state & GDK_SHIFT_MASK); + signed int nv = fix->attr_vals_start[n] + inc; cap_value(fix, n, &nv); fix->attr_vals[n] = nv; } } } else { - double inc; - inc = event->y - nl->y_orig; for ( i=0; in_sel; i++ ) { int n; struct fixture *fix = &nl->fixtures[nl->selection[i]]; if ( find_attribute(fix, nl->sel_attr, &n) ) { + double inc = maybe_fine(fix, n, y_inc, + event->state & GDK_SHIFT_MASK); signed int nv = fix->attr_vals_start[n] + inc; cap_value(fix, n, &nv); fix->attr_vals[n] = nv; diff --git a/src/nanolight.h b/src/nanolight.h index e5540f5..5947665 100644 --- a/src/nanolight.h +++ b/src/nanolight.h @@ -94,6 +94,7 @@ struct nanolight int n_sel; enum attr_class sel_attr; int dragging; + int fine; double x_orig; double y_orig; -- cgit v1.2.3