static void scroll_v_action( GtkWidget *w, gpointer data) { FlowWidgetGtk *floww = (FlowWidgetGtk *)data; if ( floww->scroll_v_ignore) { floww->scroll_v_ignore = 0; return; } FlowCtx *ctx = (FlowCtx *) floww->flow_ctx; gdouble value; value = gtk_range_get_value( GTK_RANGE(floww->scroll_v)); if ( value == 0 && fabs( floww->scroll_v_value) > 2) { // Probably a resize that seems to set value to zero, set old value ctx->change_scrollbar(); return; } floww->scroll_v_value = value; flow_scroll_vertical( ctx, int(value), 0); }
static void scroll_v_action( Widget w, XtPointer client_data, XtPointer call_data) { XmScrollBarCallbackStruct *cbs = (XmScrollBarCallbackStruct *) call_data; FlowCtx *ctx = (FlowCtx *) ((FlowWidget) client_data)->flow.flow_ctx; Arg arg[20]; int i; int maximum, slider, value, bottom; // Calculate if position is bottom i = 0; XtSetArg( arg[i], XmNmaximum, &maximum);i++; XtSetArg( arg[i], XmNsliderSize, &slider);i++; XtSetArg( arg[i], XmNvalue, &value);i++; XtGetValues( w, arg, i); if ( slider + value == maximum) bottom = 1; else bottom = 0; switch( cbs->reason) { case XmCR_DRAG: case XmCR_VALUE_CHANGED: case XmCR_INCREMENT: case XmCR_DECREMENT: case XmCR_PAGE_INCREMENT: case XmCR_PAGE_DECREMENT: case XmCR_TO_TOP: case XmCR_TO_BOTTOM: flow_scroll_vertical( ctx, cbs->value, bottom); break; } }