Path: utzoo!utgpu!news-server.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!snorkelwacker!bloom-beacon!RAND.ORG!salzman%gaucho From: salzman%gaucho@RAND.ORG (Isaac) Newsgroups: comp.windows.x Subject: Re: Need help with XView scrollbars Message-ID: <9008090722.AA02805@gaucho.rand.org> Date: 9 Aug 90 07:22:34 GMT References: <8936@uhccux.uhcc.Hawaii.Edu> Sender: daemon@athena.mit.edu (Mr Background) Organization: The Internet Lines: 119 >bu.edu!rpi!zaphod.mps.ohio-state.edu!samsung!munnari.oz.au!uhccux!hale.ifa.haw >aii.edu@eddie.mit.edu (Tony Denault) writes: > >I need help with dealing with scrollbars in XView.... >What I need to know is: >How can I be notified when the user interacts with the scrollbar? >I need to read it's new postion. Update my internal variable and >call my canvas redraw procedure. I don't want XView to scroll my >canvas display. XView 2.0 (in the OpenWindows 2.0 distribution) includes a good example of how to get a handle on the scrollbar events of a canvas (it's also in the updated version of the O'Reilly XView Programming Manual). since it's such a small file, i'll include it below. i've written a canvas based text list package where i take complete control of the scrollbar. it can get tricky at times, and there are some undocumented side effects. for instance, funny things can happen if you make the SCROLLBAR_OBJECT_LENGTH smaller than SCROLLBAR_VIEW_LENGTH (like setting the SCROLLBAR_VIEW_START to something other than what you think it should be, and not calling your notify_interpose_event_func to let you know).... if you (or anyone else) are interested, i'll be glad to mail you a copy of my canvas text list package. if nothing else it serves as an example of how to deal with controlling the scrollbar (and how to write a canvas based package in general).... -- * Isaac J. Salzman ---- * The RAND Corporation - Information Sciences Dept. /o o/ / * 1700 Main St., PO Box 2138, Santa Monica, CA 90406-2138 | v | | * AT&T : +1 213-393-0411 x6421 or x7923 (ISL lab) _| |_/ * Internet : salzman@rand.org / | | * UUCP : !uunet!rand.org!salzman | | | ---------------------------------------------------------------------------- [$OPENWINHOME/share/src/sun/xview/examples/scrollbar/scrollto.c] /* scroll_to.c -- demonstrate how to monitor the scrolling * requests invoked by the user. Requests can be monitored, * ignored or changed programmatically. This program creates * a canvas window by default or a textsw with the -textsw * command line option. Both contain a scrollbar. */ #include #include #include #include #include main(argc, argv) int argc; char *argv[]; { Frame frame; Textsw textsw; Canvas canvas; Scrollbar sbar; Notify_value monitor_scroll(); (void) xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL); frame = xv_create(NULL, FRAME, NULL); if (argc > 1 && !strcmp(argv[1], "-textsw")) { textsw = xv_create(frame, TEXTSW, TEXTSW_FILE_CONTENTS, "/etc/termcap", NULL); sbar = xv_get(textsw, TEXTSW_SCROLLBAR); } else { canvas = xv_create(frame, CANVAS, CANVAS_WIDTH, 1000, CANVAS_HEIGHT, 1000, CANVAS_AUTO_SHRINK, FALSE, CANVAS_AUTO_EXPAND, FALSE, NULL); sbar = xv_create(canvas, SCROLLBAR, SCROLLBAR_DIRECTION, SCROLLBAR_VERTICAL, SCROLLBAR_PIXELS_PER_UNIT, 10, NULL); } notify_interpose_event_func(xv_get(sbar, SCROLLBAR_NOTIFY_CLIENT), monitor_scroll, NOTIFY_SAFE); xv_main_loop(frame); } /* * To change the behavior of the scrolling of the canvas, do not pass * on the event via notify_next_event_func() when the event type is * SCROLLBAR_REQUEST. */ Notify_value monitor_scroll(client, event, sbar, type) Notify_client client; Event *event; Scrollbar sbar; Notify_event_type type; { int view_start, last_view_start, pixels_per, is_neg = 0, total; if (event_id(event) == SCROLLBAR_REQUEST) { view_start = (int)xv_get(sbar, SCROLLBAR_VIEW_START); last_view_start = (int)xv_get(sbar, SCROLLBAR_LAST_VIEW_START); pixels_per = (int)xv_get(sbar, SCROLLBAR_PIXELS_PER_UNIT); if ((total = view_start - last_view_start) < 0) total = -total, is_neg = 1; printf("scrolled from %d to %d: %d pixels (%d units) %s\n", last_view_start, view_start, pixels_per * total, total, is_neg? "up" : "down"); } return notify_next_event_func(client, event, sbar, type); }