static int pointer_event(glw_t *w, const glw_pointer_event_t *gpe) { glw_root_t *gr = w->glw_root; glw_slider_t *s = (glw_slider_t *)w; int hitpos = 0; float v0 = w->glw_class == &glw_slider_x ? gpe->x : -gpe->y; float v = 0; float knob_pos; float knob_size = (float)s->knob_size_px / s->slider_size_px; int how = PROP_SET_NORMAL; if(w->glw_class == &glw_slider_x) { knob_pos = -1 + 2.0 * (float)s->knob_pos_px / s->slider_size_px; } else { knob_pos = 1 - 2.0 * (float)s->knob_pos_px / s->slider_size_px; } if(v0 < knob_pos - knob_size) hitpos = -1; else if(v0 > knob_pos + knob_size) hitpos = 1; switch(gpe->type) { case GLW_POINTER_LEFT_PRESS: if(w->glw_flags2 & GLW2_ALWAYS_GRAB_KNOB) { v = GLW_RESCALE(v0 + s->grab_delta, -1.0 + knob_size, 1.0 - knob_size); gr->gr_pointer_grab = w; } else if(hitpos == 0) { s->grab_delta = knob_pos - v0; gr->gr_pointer_grab = w; v = s->value; } else { update_value_delta(s, hitpos * knob_size); return 0; } how = PROP_SET_TENTATIVE; break; case GLW_POINTER_FOCUS_MOTION: if(knob_size == 1.0) break; v = GLW_RESCALE(v0 + s->grab_delta, -1.0 + knob_size, 1.0 - knob_size); how = PROP_SET_TENTATIVE; break; case GLW_POINTER_LEFT_RELEASE: v = s->value; how = PROP_SET_COMMIT; break; default: return 0; } update_value(s, v, how); return 0; }
static int glw_slider_event_x(glw_t *w, event_t *e) { glw_slider_t *s = (glw_slider_t *)w; float d; if(event_is_action(e, ACTION_LEFT)) { d = -s->step_i; } else if(event_is_action(e, ACTION_RIGHT)) { d = s->step_i; } else { return 0; } update_value_delta(s, d); return 1; }
static int glw_slider_event_y(glw_t *w, event_t *e) { glw_slider_t *s = (glw_slider_t *)w; float d; if(event_is_action(e, ACTION_UP)) { d = -s->step; } else if(event_is_action(e, ACTION_DOWN)) { d = s->step; } else { return 0; } update_value_delta(s, d); return 1; }