summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2019-06-15 10:12:31 +0200
committerThomas White <taw@physics.org>2019-06-15 10:12:31 +0200
commit7a100b773324421ca0739084f2afd24cdde2693f (patch)
tree5064ca3e6c94d96e00f5b68e93843bc7a2a35df1
parente8c301553ba5e105c386d1341162d979df036d43 (diff)
Hold shift for fine control
-rw-r--r--src/nanolight.c37
-rw-r--r--src/nanolight.h1
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; i<nl->n_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; i<nl->n_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;