blanchar@prlhp1.prl.philips.co.uk (blanchar) (03/23/91)
I've been writing code for a scrolling canvas to display a sound waveform. I'm handling the scrolling myself so that I don't have to create a canvas that is millions of pixels long-which is procbably impossible anyway. Symptom: You grab the elevator and move it somewhere. This bit works fine, the correct parameters get passed to the scrolling func. But if you then do a page forward or backward the elevator shoots to the end. Cause: I think the bug occurs in the function scrollbar_offset_to_client_units. This is called from scrollbar_default_compute_scroll_proc. The bit of code from XView is shown below. /*******/ case SCROLLBAR_PAGE_FORWARD: case SCROLLBAR_PAGE_BACKWARD: if (sb->page_length != SCROLLBAR_DEFAULT_LENGTH && sb->page_length != 0) { normalized_offset = (offset / (sb->pixels_per_unit * sb->page_length)) * sb->page_length; /* should always divide equally -- won't when last page */ /* isn't a full page -- in this case jump to the end */ if ((normalized_offset * sb->pixels_per_unit) != offset) { normalized_offset = Max_offset(sb); } } else { normalized_offset = offset / sb->pixels_per_unit; } break; /******/ For example say: SCROLLBAR_PIXELS_PER_UNIT=10 SCROLLBAR_PAGE_LENGTH=100 the user picks up the elevator and moves it so that SCROLLBAR_VIEW_START=125, then there's a page forward so SCROLLBAR_VIEW_START=225,in client unit(=2250 absolutely). Now look at what normalised_offset is normalized_offset = (offset / (sb->pixels_per_unit * sb->page_length)) * sb->page_length; normalised_offset=(2250/(10*100))*100=200; and the check if ((normalized_offset * sb->pixels_per_unit) != offset) { if(200*10!=2250) normalized_offset = Max_offset(sb); Obviously it jumps to the end! Cure: Write your own scrollbar_default_compute_scroll_proc. Has anyone else spotted this behaviour? Now for a classic bit of manual speak.... In the XView prog. man. page 161 it says... "Message items, like buttons, are selectable and can have notify procedures." Two lines later it says.... "Since message items cannot be selected....." Which is correct? I suspect the first. Anyone know for sure? TTFN Simon Blanchard