[comp.sources.x] v05i040: XView example programs, Part02/06

argv@sun.com (Dan Heller) (12/08/89)

Submitted-by: Dan Heller <argv@sun.com>
Posting-number: Volume 5, Issue 40
Archive-name: xview.demos/part02



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix@uunet.uu.net if you want that tool.
# If this archive is complete, you will see the following message at the end:
#		"End of archive 2 (of 6)."
# Contents:  xview.demos/canvas/canvas_input.c
#   xview.demos/canvas/scroll_view.c xview.demos/canvas/split_views.c
#   xview.demos/color/x_draw.c xview.demos/menus/menu_dir2.c
#   xview.demos/menus/pin_menu.c xview.demos/seln_svc/long_seln.c
#   xview.demos/seln_svc/seln.c
# Wrapped by argv@island on Thu Dec  7 23:18:16 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'xview.demos/canvas/canvas_input.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xview.demos/canvas/canvas_input.c'\"
else
echo shar: Extracting \"'xview.demos/canvas/canvas_input.c'\" \(7680 characters\)
sed "s/^X//" >'xview.demos/canvas/canvas_input.c' <<'END_OF_FILE'
X/*
X * canvas_input.c --
X * Display a canvas whose views may be split repeatedly.  The event
X * handler is installed for each view, so events are displayed in
X * each paint window.
X */
X#include <xview/xview.h>
X#include <xview/canvas.h>
X#include <xview/scrollbar.h>
X#include <xview/xv_xrect.h>
X
XCanvas  canvas;
XFrame   frame;
Xchar    msg[128];
Xvoid    init_split(), my_event_proc(), my_repaint_proc();
X
Xmain(argc,argv)
Xint     argc;
Xchar    *argv[];
X{
X    /*
X     * Initialize, create base frame (with footers) and create canvas.
X     */
X    xv_init(XV_INIT_ARGS, argc, argv, NULL);
X    frame = (Frame)xv_create(NULL,FRAME,
X        FRAME_LABEL,            "Split View Windows.",
X        FRAME_SHOW_FOOTER,      TRUE,
X        NULL);
X    canvas = (Canvas)xv_create(frame,CANVAS,
X        CANVAS_X_PAINT_WINDOW,  TRUE,
X        OPENWIN_SPLIT,
X            OPENWIN_SPLIT_INIT_PROC,    init_split,
X            NULL,
X        CANVAS_REPAINT_PROC,    my_repaint_proc,
X        NULL);
X
X    (void) xv_create(canvas, SCROLLBAR,
X        SCROLLBAR_SPLITTABLE,   TRUE,
X        SCROLLBAR_DIRECTION,    SCROLLBAR_VERTICAL,
X        NULL);
X    (void) xv_create(canvas, SCROLLBAR,
X        SCROLLBAR_SPLITTABLE,   TRUE,
X        SCROLLBAR_DIRECTION,    SCROLLBAR_HORIZONTAL,
X        NULL);
X
X    /*
X     *  Set input mask
X     */
X    xv_set(canvas_paint_window(canvas),
X        WIN_CONSUME_EVENTS,
X            WIN_NO_EVENTS, WIN_ASCII_EVENTS, KBD_USE, KBD_DONE,
X            LOC_DRAG, LOC_WINENTER, LOC_WINEXIT, WIN_MOUSE_BUTTONS,
X            NULL,
X        WIN_EVENT_PROC, my_event_proc,
X        NULL);
X
X    xv_main_loop(frame);
X}
X
X/*
X * when a viewport is split, this routine is called.
X */
Xvoid
Xinit_split(splitview, newview, pos)
XXv_Window splitview, newview;
Xint pos;
X{
X    Xv_Window   view;
X    int         i = 0;
X
X    /*
X     * Determine view # from the new view and set its scrollbar to 0,0
X     */
X    OPENWIN_EACH_VIEW(canvas, view)
X        if (view == splitview) {
X            /* identify the view # of the view the user just split. */
X            sprintf(msg, "Split view #%d", i+1);
X            xv_set(frame, FRAME_LEFT_FOOTER, msg, NULL);
X        } else if (view == newview) {
X            xv_set(xv_get(canvas, OPENWIN_VERTICAL_SCROLLBAR, view),
X                SCROLLBAR_VIEW_START, 0,
X                NULL);
X            xv_set(xv_get(canvas, OPENWIN_HORIZONTAL_SCROLLBAR, view),
X                SCROLLBAR_VIEW_START, 0,
X                NULL);
X        }
X        i++;
X    OPENWIN_END_EACH
X    sprintf(msg, "Total views: %d", i);
X    xv_set(frame, FRAME_RIGHT_FOOTER, msg, NULL);
X}
X
X/*
X * Called when an event is received in an arbitrary paint window.
X */
Xvoid
Xmy_event_proc(window, event, arg)
XXv_Window       window;
XEvent           *event;
XNotify_arg      arg;
X{
X    register char *p = msg;
X
X    *p = 0;
X
X    /* test to see if a function key has been hit */
X    if (event_is_key_left(event))
X        sprintf(p, "(L%d) ", event_id(event) - KEY_LEFTFIRST + 1);
X    else if (event_is_key_top(event))
X        sprintf(p, "(T%d) ", event_id(event) - KEY_TOPFIRST + 1);
X    else if (event_is_key_right(event))
X        sprintf(p, "(R%d) ", event_id(event) - KEY_RIGHTFIRST + 1);
X    else if (event_id(event) == KEY_BOTTOMLEFT)
X        strcpy(p, "bottom left ");
X    else if (event_id(event) == KEY_BOTTOMRIGHT)
X        strcpy(p, "bottom right ");
X    p += strlen(p);
X
X
X    if (event_is_ascii(event)) {
X        /*
X         * note that shift modifier is reflected in the event code by
X         * virtue of the char printed is upper/lower case.
X         */
X        sprintf(p, "Keyboard: key '%c' (%d) %s at %d,%d",
X            event_action(event), event_action(event),
X            event_is_down(event)? "pressed" : "released",
X            event_x(event), event_y(event));
X    } else switch (event_action(event)) {
X        case ACTION_CLOSE :
X            xv_set(frame, FRAME_CLOSED, TRUE, NULL);
X            break;
X        case ACTION_OPEN :
X            strcpy(p, "frame opened up");
X            break;
X        case ACTION_HELP :
X            strcpy(p, "Help (action ignored)");
X            break;
X        case ACTION_SELECT :
X            sprintf(p, "Button: Select (Left) %s at %d,%d",
X                event_is_down(event)? "pressed" : "released",
X                event_x(event), event_y(event));
X            break;
X        case ACTION_ADJUST :
X            sprintf(p, "Button: Adjust (Middle) %s at %d,%d",
X                event_is_down(event)? "pressed" : "released",
X                event_x(event), event_y(event));
X            break;
X        case ACTION_MENU :
X            sprintf(p, "Button: Menu (Right) %s at %d,%d",
X                event_is_down(event)? "pressed" : "released",
X                event_x(event), event_y(event));
X            break;
X        case SHIFT_RIGHT :
X            sprintf(p, "Keyboard: right shift %s",
X                event_is_down(event)? "pressed" : "released");
X            break;
X        case SHIFT_LEFT :
X            sprintf(p, "Keyboard: left shift %s",
X                event_is_down(event)? "pressed" : "released");
X            break;
X        case SHIFT_LEFTCTRL : case SHIFT_RIGHTCTRL :
X            sprintf(p, "Keyboard: control key %s",
X                event_is_down(event)? "pressed" : "released");
X            break;
X        case SHIFT_META :
X            sprintf(p, "Keyboard: meta key %s",
X                event_is_down(event)? "pressed" : "released");
X            break;
X        case SHIFT_ALT :
X            sprintf(p, "Keyboard: alt key %s",
X                event_is_down(event)? "pressed" : "released");
X            break;
X        case KBD_USE:
X            sprintf(p, "Keyboard: got keyboard focus");
X            break;
X        case KBD_DONE:
X            sprintf(p, "Keyboard: lost keyboard focus");
X            break;
X        case LOC_MOVE:
X            sprintf(p, "Pointer: moved to %d,%d",
X                    event_x(event),event_y(event));
X            break;
X        case LOC_DRAG:
X            sprintf(p, "Pointer: dragged to %d,%d",
X                    event_x(event), event_y(event));
X            break;
X        case LOC_WINENTER:
X            win_set_kbd_focus(window, xv_get(window, XV_XID));
X            sprintf(p, "Pointer: entered window at %d,%d",
X                    event_x(event), event_y(event));
X            break;
X        case LOC_WINEXIT:
X            sprintf(p, "Pointer: exited window at %d,%d",
X                    event_x(event), event_y(event));
X            break;
X        case WIN_RESIZE :
X        case WIN_REPAINT :
X            return;
X        default : ;
X            /* There are too many ACTION events to trap -- ignore the
X             * ones we're not interested in.
X             */
X    }
X
X    my_repaint_proc(canvas, window,
X        xv_get(canvas, XV_DISPLAY), xv_get(window, XV_XID), NULL);
X}
X
X/*
X * my_repaint_proc()
X *      Called to repaint the canvas in response to damage events
X *      and the initial painting of the canvas window.
X *      Displays the keyboard, pointer and button message strings
X *      after erasing the previous messages.
X */
Xvoid
Xmy_repaint_proc(canvas, pw, dpy, xwin, xrects)
XCanvas          canvas;
XXv_Window       pw;
XDisplay         *dpy;
XWindow          xwin;
XXv_xrectlist    *xrects;
X{
X    char        win_num[16];
X    Xv_Window   w;
X    int         i = 0;
X    GC          gc = DefaultGC(dpy, DefaultScreen(dpy));
X
X    /*
X     * Determine which paint window we're writing in.
X     */
X    CANVAS_EACH_PAINT_WINDOW(canvas, w)
X        if (w == pw)
X            break;
X        i++;
X    CANVAS_END_EACH
X    sprintf(win_num, "(Window #%d) ", i+1);
X
X    XClearWindow(dpy, xwin);
X    XDrawString(dpy, xwin, gc, 25, 25, win_num, strlen(win_num));
X    XDrawString(dpy, xwin, gc, 25, 45, msg, strlen(msg));
X}
END_OF_FILE
if test 7680 -ne `wc -c <'xview.demos/canvas/canvas_input.c'`; then
    echo shar: \"'xview.demos/canvas/canvas_input.c'\" unpacked with wrong size!
fi
# end of 'xview.demos/canvas/canvas_input.c'
fi
if test -f 'xview.demos/canvas/scroll_view.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xview.demos/canvas/scroll_view.c'\"
else
echo shar: Extracting \"'xview.demos/canvas/scroll_view.c'\" \(6567 characters\)
sed "s/^X//" >'xview.demos/canvas/scroll_view.c' <<'END_OF_FILE'
X/*
X * scroll_view.c
X * Dan Heller <argv@sun.com> 1989
X *
X * Display a canvas in a frame.  The canvas displays a window that has
X * lines drawn from the opposite corners and draws a black box in the
X * top left corner.  This canvas may be split in many ways (vertically
X * and/or horizontally), but the repaint routine makes sure that each
X * paint window displays the same thing.
X
X * This program also demonstrates how to handle splitting views
X * programmatically.  Using the left mouse button splits a view
X * horizontally at the Y location of the mouse.  Using the middle
X * mouse button splits the view vertically at the X location of
X * the mouse.
X */
X#include <stdio.h>
X#include <X11/X.h>
X#include <X11/Xlib.h>   /* Using Xlib graphicsas well */
X#include <xview/xview.h>
X#include <xview/canvas.h>
X#include <xview/scrollbar.h>
X#include <xview/rectlist.h>
X
XCanvas  canvas;
Xvoid    events(), repaint_proc(), init_split(), join_split();
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X    Frame       frame;
X    Xv_Window   view;
X    Rect        *rect;
X
X    xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);
X
X    /*
X     * Create a frame that's 300 wide by 150 high -- give it a titlebar
X     */
X    frame = (Frame)xv_create(XV_NULL, FRAME,
X        XV_WIDTH,               300,
X        XV_HEIGHT,              150,
X        FRAME_LABEL,            argv[0],
X        NULL);
X
X    /*
X     * Create a canvas that's 500 by 500.  This canvas should not adjust
X     * its size if resized.  Install the repaint callback: repaint_proc()
X     */
X    canvas = (Canvas)xv_create(frame, CANVAS,
X        CANVAS_WIDTH,           500,
X        CANVAS_HEIGHT,          500,
X        CANVAS_AUTO_SHRINK,     FALSE,
X        CANVAS_AUTO_EXPAND,     FALSE,
X        CANVAS_REPAINT_PROC,    repaint_proc,
X        NULL);
X
X    /* Install the callback for events on the first (and only, so far)
X     * paint window.  We'll use the default events provided by the canvas.
X     */
X    xv_set(canvas_paint_window(canvas),
X        WIN_EVENT_PROC,         events,
X        WIN_CONSUME_EVENTS,     ACTION_SELECT, ACTION_ADJUST, NULL,
X        NULL);
X
X    /*
X     * There's only one viewport since multi-views cannot be created
X     * when creating a canvas.  Install "init" and "destroy" callbacks
X     * in the canvas object.  See the corresponding routines for specifics.
X     */
X    xv_set(canvas,
X        OPENWIN_SPLIT,
X            OPENWIN_SPLIT_INIT_PROC,    init_split,
X            OPENWIN_SPLIT_DESTROY_PROC, join_split,
X            NULL,
X        NULL);
X
X    /*
X     * Attach scrollbars to the canvas.
X     */
X    xv_create(canvas, SCROLLBAR,
X        SCROLLBAR_SPLITTABLE,   TRUE,
X        SCROLLBAR_DIRECTION,    SCROLLBAR_VERTICAL,
X        NULL);
X    xv_create(canvas, SCROLLBAR,
X        SCROLLBAR_SPLITTABLE,   TRUE,
X        SCROLLBAR_DIRECTION,    SCROLLBAR_HORIZONTAL,
X        NULL);
X
X    xv_main_loop(frame);
X    exit(0);
X}
X
X/*
X * The repaint procedure is called whenever repainting is needed in a
X * paint window.  If the canvas has been split into several views and
X * repainting is necessary, then this repaint procedure is called for
X * each paint window in the canvas.
X */
Xvoid
Xrepaint_proc(canvas, paint_window, repaint_area)
XCanvas          canvas;
XXv_Window       paint_window;
XRectlist        repaint_area;
X{
X    Display     *dpy;
X    Window      win;
X    Xv_Window   pw;
X    Rect        *rect;
X
X    /* Get the size of the entire paint window */
X    rect = (Rect *)xv_get(paint_window, XV_RECT);
X
X    /* Use Xview graphics to draw lines from opposite corners. */
X    xv_vector(paint_window, 0, 0, rect->r_width, rect->r_height, PIX_SET, 1);
X    xv_vector(paint_window, rect->r_width, 0, 0, rect->r_height, PIX_SET, 1);
X
X    /* Use Xlib calls to draw a black square in the top corner of the pw */
X    dpy = (Display *)XV_DISPLAY_FROM_WINDOW(paint_window);
X    win = (Window)xv_get(paint_window, XV_XID);
X    XFillRectangle(dpy, win, DefaultGC(dpy, DefaultScreen(dpy)), 10,10, 50,50);
X}
X
X/*
X * This routine is installed as the callback for events for the paint
X * window.  If more paint windows are created as a result of a view
X * split, then this routine must be reinstalled in a new view.
X */
Xvoid
Xevents(pw, event)
XXv_Window pw;
XEvent *event;
X{
X    int code = event_action(event);
X    Xv_Window view;
X    int i = (int)xv_get(canvas, OPENWIN_NVIEWS);
X
X    /* Not interested in button up events */
X    if (win_inputnegevent(event))
X        return;
X
X    /* Determine which paint window this event happened in. */
X    while (pw != xv_get(canvas, CANVAS_NTH_PAINT_WINDOW, --i) && i > 0)
X        ;
X    /* The paint window number is "i" -- get the "i"th view window */
X    view = xv_get(canvas, OPENWIN_NTH_VIEW, i);
X
X    /* determine which event was passed and deal with it. */
X    switch (code) {
X        case ACTION_SELECT : case ACTION_ADJUST :
X            /*
X             * split the view at the appropriate position -- this call
X             * will generate a call to init_split below since a new view
X             * will have been created.
X             */
X            printf("split at %d,%d\n", event_x(event), event_y(event));
X            xv_set(canvas,
X                OPENWIN_SPLIT, /* takes a null-terminated attr-value list */
X                    OPENWIN_SPLIT_VIEW,         view,
X                    OPENWIN_SPLIT_DIRECTION,    code == ACTION_ADJUST?
X                                                    OPENWIN_SPLIT_VERTICAL :
X                                                    OPENWIN_SPLIT_HORIZONTAL,
X                    OPENWIN_SPLIT_POSITION,     code == ACTION_ADJUST?
X                                                    event_x(event) :
X                                                    event_y(event),
X                    NULL,
X                NULL);
X            break;
X        default:
X            return;
X    }
X    /* indicate which paint window and view window ID's */
X    printf("win %x, view: %x\n", pw, view);
X}
X
X/*
X * notify this routine whenever two views are joined.
X */
Xvoid
Xjoin_split(view)
XXv_Window view;
X{
X    puts("joined view");
X}
X
X/*
X * Notify this routine whenever a view is split.  The new view is
X * created and its position is indicated.  This is the first time
X * the new view can be accessed by the program.  Immediately install
X * the callback for events for the new paint window.
X */
Xvoid
Xinit_split(oldview, newview, pos)
XXv_Window oldview, newview;
Xint pos;
X{
X    xv_set(xv_get(newview, CANVAS_VIEW_PAINT_WINDOW),
X        WIN_EVENT_PROC,         events,
X        WIN_CONSUME_EVENT,      ACTION_SELECT, ACTION_ADJUST, NULL,
X        NULL);
X}
END_OF_FILE
if test 6567 -ne `wc -c <'xview.demos/canvas/scroll_view.c'`; then
    echo shar: \"'xview.demos/canvas/scroll_view.c'\" unpacked with wrong size!
fi
# end of 'xview.demos/canvas/scroll_view.c'
fi
if test -f 'xview.demos/canvas/split_views.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xview.demos/canvas/split_views.c'\"
else
echo shar: Extracting \"'xview.demos/canvas/split_views.c'\" \(7095 characters\)
sed "s/^X//" >'xview.demos/canvas/split_views.c' <<'END_OF_FILE'
X/*
X * split_views.c -- run this program and then split the views using the
X * scrollbars.  The new view should be scrolled to 0, 0 (click on the
X * left and top elevator anchors to reset both scrollbars on the new view).
X */
X#include <stdio.h>
X#include <xview/xview.h>
X#include <xview/canvas.h>
X#include <xview/scrollbar.h>
X
XCanvas	canvas;
XFrame	frame;
Xchar	msg[128];
Xvoid	init_split(), my_event_proc(), my_repaint_proc();
X
Xmain(argc,argv)
Xint	argc;
Xchar	*argv[];
X{
X    /*
X     * Initialize, create base frame (with footers) and * create canvas.
X     */
X    xv_init(XV_INIT_ARGS, argc,argv, 0);
X    frame = xv_create(NULL,FRAME,
X	FRAME_LABEL,		"Try Splitting views.",
X	FRAME_SHOW_FOOTER,	TRUE,
X	NULL);
X    canvas = xv_create(frame,CANVAS,
X	OPENWIN_SPLIT,
X	    OPENWIN_SPLIT_INIT_PROC,	init_split,
X	    NULL,
X	CANVAS_REPAINT_PROC,	my_repaint_proc,
X	NULL);
X
X    xv_create(canvas, SCROLLBAR,
X	SCROLLBAR_SPLITTABLE,	TRUE,
X	SCROLLBAR_DIRECTION,	SCROLLBAR_VERTICAL,
X	NULL);
X    xv_create(canvas, SCROLLBAR,
X	SCROLLBAR_SPLITTABLE,	TRUE,
X	SCROLLBAR_DIRECTION,	SCROLLBAR_HORIZONTAL,
X	NULL);
X
X    /*
X     *	Set input mask
X     */
X    xv_set(canvas_paint_window(canvas),
X	    WIN_CONSUME_EVENTS,
X		WIN_NO_EVENTS, WIN_ASCII_EVENTS, KBD_USE, KBD_DONE,
X		LOC_DRAG, LOC_WINENTER, LOC_WINEXIT, WIN_MOUSE_BUTTONS,
X		NULL,
X	    WIN_EVENT_PROC,	my_event_proc,
X	    NULL);
X
X    xv_main_loop(frame);
X    return 0;
X}
X
X/*
X * when a viewport is split, this routine is called.
X */
Xvoid
Xinit_split(splitview, newview, pos)
XXv_Window splitview, newview;
Xint pos;
X{
X    Xv_Window	view, win;
X    int		i = 0;
X
X    /*
X     * Determine which view # is the new view and which is the original view
X     */
X    OPENWIN_EACH_VIEW(canvas, view)
X	if (view == splitview) {
X	    /* identify the view # of the view the user just split. */
X	    sprintf(msg, "Split view #%d", i+1);
X	    xv_set(frame, FRAME_LEFT_FOOTER, msg, NULL);
X	} else if (view == newview) {
X	    /*
X	     * install the same event handling mask and event callback
X	     * for the newview's paint window.
X	     */
X	    xv_set(win = xv_get(canvas, CANVAS_NTH_PAINT_WINDOW, i),
X		WIN_CONSUME_EVENTS,
X		    WIN_NO_EVENTS, WIN_ASCII_EVENTS, KBD_USE, KBD_DONE,
X		    LOC_DRAG, LOC_WINENTER, LOC_WINEXIT, WIN_MOUSE_BUTTONS,
X		    NULL,
X		WIN_EVENT_PROC,	my_event_proc,
X		NULL);
X	}
X	i++;
X    OPENWIN_END_EACH
X    printf("win = %x, CANVAS_VIEW_PAINT_WINDOW = %x\n",
X	win, xv_get(newview, CANVAS_VIEW_PAINT_WINDOW));
X    sprintf(msg, "Total views: %d", i);
X    xv_set(frame, FRAME_RIGHT_FOOTER, msg, NULL);
X}
X
X/*
X * Called when an event is received in an arbitrary paint window.
X */
Xvoid
Xmy_event_proc(window, event, arg)
XXv_Window	window;
XEvent		*event;
XNotify_arg	arg;
X{
X    register char *p = msg;
X
X    *p = 0;
X
X    /* test to see if a function key has been hit */
X    if (event_is_key_left(event))
X	sprintf(p, "(L%d) ", event_id(event) - KEY_LEFTFIRST + 1);
X    else if (event_is_key_top(event))
X	sprintf(p, "(T%d) ", event_id(event) - KEY_TOPFIRST + 1);
X    else if (event_is_key_right(event))
X	sprintf(p, "(R%d) ", event_id(event) - KEY_RIGHTFIRST + 1);
X    else if (event_id(event) == KEY_BOTTOMLEFT)
X	strcpy(p, "bottom left ");
X    else if (event_id(event) == KEY_BOTTOMRIGHT)
X	strcpy(p, "bottom left ");
X    p += strlen(p);
X
X    /* Test to see if event is a special "mnemonic" action */
X    if (event_action(event) != event_id(event)) {
X	switch (event_action(event)) {
X	    case ACTION_CLOSE :
X		strcpy(p, "close (action ignored)");
X		break;
X	    case ACTION_OPEN :
X		strcpy(p, "open (action ignored)");
X		break;
X	    case ACTION_HELP :
X		strcpy(p, "Help (action ignored)");
X		break;
X	    case ACTION_SELECT : /* the action */
X	    case MS_LEFT :	 /* the actual (literal) event */
X		sprintf(p, "Button: Select (Left) %s at %d,%d",
X		    event_is_down(event)? "pressed" : "released",
X		    event_x(event), event_y(event));
X		break;
X	    case ACTION_ADJUST :
X	    case MS_MIDDLE :
X		sprintf(p, "Button: Adjust (Middle) %s at %d,%d",
X		    event_is_down(event)? "pressed" : "released",
X		    event_x(event), event_y(event));
X		break;
X	    case ACTION_MENU :
X	    case MS_RIGHT :
X		sprintf(p, "Button: Menu (Right) %s at %d,%d",
X		    event_is_down(event)? "pressed" : "released",
X		    event_x(event), event_y(event));
X		break;
X	    default : ;
X		/* There are too many ACTION events to trap -- ignore the
X		 * ones we're not interested in.
X		 */
X	}
X    } else if (event_is_ascii(event))
X	/*
X	 * note that shift modifier is reflected in the event code by
X	 * virtue of the char printed is upper/lower case.
X	 */
X	sprintf(p, "Keyboard: key '%c' (%d) %s at %d,%d",
X	    event_action(event), event_action(event),
X	    event_is_down(event)? "pressed" : "released",
X	    event_x(event), event_y(event));
X    else switch (event_id(event)) {
X	case SHIFT_RIGHT :
X		sprintf(p, "Keyboard: right shift %s",
X		    event_is_down(event)? "pressed" : "released");
X		break;
X	case SHIFT_LEFT :
X		sprintf(p, "Keyboard: left shift %s",
X		    event_is_down(event)? "pressed" : "released");
X		break;
X	case SHIFT_LEFTCTRL : case SHIFT_RIGHTCTRL :
X		sprintf(p, "Keyboard: control key %s",
X		    event_is_down(event)? "pressed" : "released");
X		break;
X	case SHIFT_META :
X		sprintf(p, "Keyboard: meta key %s",
X		    event_is_down(event)? "pressed" : "released");
X		break;
X	case SHIFT_ALT :
X		sprintf(p, "Keyboard: alt key %s",
X		    event_is_down(event)? "pressed" : "released");
X		break;
X	case KBD_USE:
X		sprintf(p, "Keyboard: got keyboard focus");
X		break;
X	case KBD_DONE:
X		sprintf(p, "Keyboard: lost keyboard focus");
X		break;
X	case LOC_MOVE:
X		sprintf(p, "Pointer: moved to %d,%d",
X			event_x(event),event_y(event));
X		break;
X	case LOC_DRAG:
X		sprintf(p, "Pointer: dragged to %d,%d",
X			event_x(event), event_y(event));
X		break;
X	case LOC_WINENTER:
X		win_set_kbd_focus(window, xv_get(window, XV_XID));
X		sprintf(p, "Pointer: entered window at %d,%d",
X			event_x(event), event_y(event));
X		break;
X	case LOC_WINEXIT:
X		sprintf(p, "Pointer: exited window at %d,%d",
X			event_x(event), event_y(event));
X		break;
X	case WIN_RESIZE :
X		strcpy(msg, "resize");
X		break;
X	case WIN_REPAINT :
X		strcpy(msg, "repaint");
X		break;
X	default:
X		if (msg[0])
X		    printf("unknown event: %d\n", event_id(event));
X    }
X    my_repaint_proc(canvas, window, NULL);
X}
X
X/*
X * my_repaint_proc()
X *	Called to repaint the canvas in response to damage events
X *	and the initial painting of the canvas window.
X *	Displays the keyboard, pointer and button message strings
X *	after erasing the previous messages.
X */
Xvoid
Xmy_repaint_proc(canvas, pw, repaint_area)
XCanvas		canvas;
XXv_Window	pw;
XRectlist	*repaint_area;
X{
X    static char buf[] =
X	"                                                                    ";
X    char	win_num[16];
X    Xv_Window	w;
X    int		i = 0;
X
X    /*
X     * Determine which # paint window we're writing in.
X     */
X    CANVAS_EACH_PAINT_WINDOW(canvas, w)
X	if (w == pw)
X	    break;
X	i++;
X    CANVAS_END_EACH
X    sprintf(win_num, "(Window #%d) ", i+1);
X    xv_text(pw, 25, 25, PIX_SRC, NULL, win_num);
X
X    xv_text(pw, 25, 45, PIX_SRC, NULL, buf);
X    xv_text(pw, 25, 45, PIX_SRC, NULL, msg);
X}
END_OF_FILE
if test 7095 -ne `wc -c <'xview.demos/canvas/split_views.c'`; then
    echo shar: \"'xview.demos/canvas/split_views.c'\" unpacked with wrong size!
fi
# end of 'xview.demos/canvas/split_views.c'
fi
if test -f 'xview.demos/color/x_draw.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xview.demos/color/x_draw.c'\"
else
echo shar: Extracting \"'xview.demos/color/x_draw.c'\" \(5651 characters\)
sed "s/^X//" >'xview.demos/color/x_draw.c' <<'END_OF_FILE'
X/*
X * x_draw.c --
X *      Demonstrates the use of Xlib drawing functions inside an
X *      XView canvas.  Color is also used, but not required.
X */
X#include <xview/xview.h>
X#include <xview/canvas.h>
X#include <xview/cms.h>
X#include <xview/xv_xrect.h>
X
X/* indices into color table renders specified colors. */
X#define WHITE   0
X#define RED     1
X#define GREEN   2
X#define BLUE    3
X#define ORANGE  4
X#define AQUA    5
X#define PINK    6
X#define BLACK   7
X
XGC gc;   /* GC used for Xlib drawing */
Xunsigned long *colors; /* the color table */
X
X/*
X * initialize cms data to support colors specified above.  Assign
X * data to new cms -- use either static or dynamic cms depending
X * on -dynamic command line switch.
X */
Xmain(argc, argv)
Xint     argc;
Xchar    *argv[];
X{
X    unsigned char red[8], green[8], blue[8];
X    static char stipple_bits[] = {0xAA, 0xAA, 0x55, 0x55};
X    Frame       frame;
X    Canvas      canvas;
X    XFontStruct *font;
X    Display     *display;
X    XGCValues   gc_val;
X    XID         xid;
X    void        canvas_repaint();
X    Xv_cmsdata  cms_data;
X    int         use_dynamic = FALSE;
X
X    /* Create windows */
X    xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);
X    if (*++argv && !strcmp(*argv, "-dynamic"))
X        use_dynamic = TRUE;
X
X    frame = xv_create(NULL,FRAME,
X        FRAME_LABEL,    "xv_canvas_x_draw",
X        XV_WIDTH,       400,
X        XV_HEIGHT,      300,
X        NULL);
X
X    /* initialize RGB values for specified colors */
X    red[WHITE] = 255;   green[WHITE] = 255;   blue[WHITE] = 255;
X    red[RED] = 255;     green[RED] = 0;       blue[RED] = 0;
X    red[GREEN] = 0;     green[GREEN] = 255;   blue[GREEN] = 0;
X    red[BLUE] = 0;      green[BLUE] = 0;      blue[BLUE] = 255;
X    red[ORANGE] = 250;  green[ORANGE] = 130;  blue[ORANGE] = 80;
X    red[AQUA] = 30;     green[AQUA] = 230;    blue[AQUA] = 250;
X    red[PINK] = 230;    green[PINK] = 30;     blue[PINK] = 250;
X
X    cms_data.type = use_dynamic? XV_DYNAMIC_CMS : XV_STATIC_CMS;
X    cms_data.size = 8;
X    cms_data.rgb_count = 8;
X    cms_data.index = 0;
X    cms_data.red = red;
X    cms_data.green = green;
X    cms_data.blue = blue;
X
X    canvas = xv_create(frame, CANVAS,
X        CANVAS_REPAINT_PROC,    canvas_repaint,
X        CANVAS_X_PAINT_WINDOW,  TRUE,
X        WIN_DYNAMIC_VISUAL,     use_dynamic,
X        WIN_CMS_NAME,           "palette",
X        WIN_CMS_DATA,           &cms_data,
X        NULL);
X
X    /* Get display and xid */
X    display = (Display *)xv_get(frame, XV_DISPLAY);
X    xid = (XID)xv_get(canvas_paint_window(canvas), XV_XID);
X
X    if (!(font = XLoadQueryFont(display, "fixed"))) {
X        puts("cannot load fixed font");
X        exit(1);
X    }
X
X    /* Create and initialize GC */
X    gc_val.font = font->fid;
X    gc_val.stipple =
X	XCreateBitmapFromData(display, xid, stipple_bits, 16, 2);
X    gc = XCreateGC(display, xid, GCFont | GCStipple, &gc_val);
X
X    /* get the colormap from the canvas now that
X     * the cms has been installed
X     */
X    colors = (unsigned long *)xv_get(canvas, WIN_X_COLOR_INDICES);
X
X    /* Start event loop */
X    xv_main_loop(frame);
X}
X
X/*
X * Draws onto the canvas using Xlib drawing functions.
X */
Xvoid
Xcanvas_repaint(canvas, pw, display, xid, xrects)
XCanvas          canvas;
XXv_Window       pw;
XDisplay         *display;
XWindow          xid;
XXv_xrectlist    *xrects;
X{
X    static XPoint box[] = {
X        {0,0}, {100,100}, {0,-100}, {-100,100}, {0,-100}
X    };
X    static XPoint points[] = {
X        {0,0}, /* this point to be overwritten below */
X        {25,0}, {25,0}, {25,0}, {25,0}, {-100,25},
X        {25,0}, {25,0}, {25,0}, {25,0}, {-100,25},
X        {25,0}, {25,0}, {25,0}, {25,0}, {-100,25},
X        {25,0}, {25,0}, {25,0}, {25,0}, {-100,25},
X        {25,0}, {25,0}, {25,0}, {25,0}, {-100,25},
X    };
X
X    XSetForeground(display, gc, colors[RED]);
X    XDrawString(display, xid, gc, 30, 20, "XFillRectangle", 14);
X    XFillRectangle(display, xid, gc, 25, 25, 100, 100);
X    XSetFunction(display, gc, GXinvert);
X    XFillRectangle(display, xid, gc, 50, 50, 50, 50);
X    XSetFunction(display, gc, GXcopy);
X
X    XSetForeground(display, gc, colors[BLACK]);
X    XDrawString(display, xid, gc, 155, 20, "XFillRect - stipple", 19);
X    XSetFillStyle(display, gc, FillStippled);
X    XFillRectangle(display, xid, gc, 150, 25, 100, 100);
X    XSetFillStyle(display, gc, FillSolid);
X
X    XSetForeground(display, gc, colors[BLUE]);
X    XDrawString(display, xid, gc, 280, 20, "XDrawPoints", 11);
X    points[0].x = 275; points[0].y = 25;
X    XDrawPoints(display, xid, gc, points,
X        sizeof(points)/sizeof(XPoint), CoordModePrevious);
X
X    XSetForeground(display, gc, colors[ORANGE]);
X    XDrawString(display, xid, gc, 30, 145, "XDrawLine - solid", 17);
X    XDrawLine(display, xid, gc, 25, 150, 125, 250);
X    XDrawLine(display, xid, gc, 25, 250, 125, 150);
X
X    XSetForeground(display, gc, colors[AQUA]);
X    XDrawString(display, xid, gc, 155, 145, "XDrawLine - dashed", 18);
X    XSetLineAttributes(display, gc, 5,
X        LineDoubleDash, CapButt, JoinMiter);
X    XDrawLine(display, xid, gc, 150, 150, 250, 250);
X    XDrawLine(display, xid, gc, 150, 250, 250, 150);
X    XSetLineAttributes(display, gc, 0, LineSolid, CapButt, JoinMiter);
X
X    XSetForeground(display, gc, colors[PINK]);
X    XDrawString(display, xid, gc, 280, 145, "XDrawLines", 10);
X    box[0].x = 275; box[0].y = 150;
X    XDrawLines(display, xid, gc, box, 5, CoordModePrevious);
X
X    XSetForeground(display, gc, colors[GREEN]);
X    XDrawRectangle(display, xid, gc,
X        5, 5, xv_get(pw, XV_WIDTH)-10, xv_get(pw, XV_HEIGHT)-10);
X    XDrawRectangle(display, xid, gc,
X        7, 7, xv_get(pw, XV_WIDTH)-14, xv_get(pw, XV_HEIGHT)-14);
X}
END_OF_FILE
if test 5651 -ne `wc -c <'xview.demos/color/x_draw.c'`; then
    echo shar: \"'xview.demos/color/x_draw.c'\" unpacked with wrong size!
fi
# end of 'xview.demos/color/x_draw.c'
fi
if test -f 'xview.demos/menus/menu_dir2.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xview.demos/menus/menu_dir2.c'\"
else
echo shar: Extracting \"'xview.demos/menus/menu_dir2.c'\" \(6585 characters\)
sed "s/^X//" >'xview.demos/menus/menu_dir2.c' <<'END_OF_FILE'
X/*
X * menu_dir2.c -
X * Demonstrate the use of an XView menu in a canvas subwindow.
X * A menu is brought up with the MENU mouse button and displays
X * menu choices representing the files in the directory.  If a
X * directory entry is found, a new pullright item is created with
X * that subdir as the pullright menu's contents.  This implementation
X * creates directories on an as-needed basis.  Thus, we provide a
X * MENU_GEN_PULLRIGHT procedure.
X *
X * argv[1] indicates which directory to start from.
X */
X#include <xview/xview.h>
X#include <xview/canvas.h>
X#include <sys/stat.h>
X#include <sys/dir.h>
X#include <X11/Xos.h>
X#ifndef MAXPATHLEN
X#include <sys/param.h>
X#endif /* MAXPATHLEN */
X
XFrame   frame;
X
Xmain(argc,argv)
Xint     argc;
Xchar    *argv[];
X{
X    Canvas      canvas;
X    extern void exit();
X    void        my_event_proc();
X    Menu        menu;
X    Menu_item   mi, add_path_to_menu();
X
X    xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);
X
X    frame = (Frame)xv_create(NULL, FRAME,
X        FRAME_LABEL,            argv[1]? argv[1] : "cwd",
X        FRAME_SHOW_FOOTER,      TRUE,
X        NULL);
X    canvas = (Canvas)xv_create(frame, CANVAS,
X        FRAME_LABEL,    argv[0],
X        XV_WIDTH,       400,
X        XV_HEIGHT,      100,
X        NULL);
X
X    mi = add_path_to_menu(argc > 1? argv[1] : ".");
X    menu = (Menu)xv_get(mi, MENU_PULLRIGHT);
X    /* We no longer need the item since we have the menu from it */
X    xv_destroy(mi);
X
X    /* associate the menu to the canvas win for easy etreival */
X    xv_set(canvas_paint_window(canvas),
X        WIN_CONSUME_EVENTS,     WIN_MOUSE_BUTTONS, NULL,
X        WIN_EVENT_PROC,         my_event_proc,
X        WIN_CLIENT_DATA,        menu,
X        NULL);
X
X    window_fit(frame);
X    window_main_loop(frame);
X}
X
X/*
X * my_action_proc - display the selected item in the frame footer.
X */
Xvoid
Xmy_action_proc(menu, menu_item)
XMenu    menu;
XMenu_item       menu_item;
X{
X    xv_set(frame,
X        FRAME_LEFT_FOOTER,      xv_get(menu_item, MENU_STRING),
X        NULL);
X}
X
X/*
X * Call menu_show() to display menu on right mouse button push.
X */
Xvoid
Xmy_event_proc(canvas, event)
XCanvas  canvas;
XEvent *event;
X{
X    if ((event_id(event) == MS_RIGHT) && event_is_down(event)) {
X        Menu menu = (Menu)xv_get(canvas, WIN_CLIENT_DATA);
X        menu_show(menu, canvas, event, NULL);
X    }
X}
X
X/*
X * return an allocated char * that points to the last item in a path.
X */
Xchar *
Xgetfilename(path)
Xchar *path;
X{
X    char *p;
X
X    if (p = rindex(path, '/'))
X        p++;
X    else
X        p = path;
X    return strcpy(malloc(strlen(p)+1), p);
X}
X
XMenu
Xgen_pullright(mi, op)
XMenu_item mi;
XMenu_generate op;
X{
X    Menu menu;
X    Menu_item new, old = mi;
X    char buf[MAXPATHLEN];
X
X    if (op == MENU_DISPLAY) {
X        menu = (Menu)xv_get(mi, MENU_PARENT);
X        sprintf(buf, "%s/%s",
X            xv_get(menu, MENU_CLIENT_DATA), xv_get(mi, MENU_STRING));
X        new = add_path_to_menu(buf);
X        /* if item has a pullright menu, free it (its data first) */
X        if (menu = (Menu)xv_get(mi, MENU_PULLRIGHT)) {
X            free(xv_get(menu, MENU_CLIENT_DATA));
X            xv_destroy(menu);
X        }
X        if (new) {
X            menu = (Menu)xv_get(new, MENU_PULLRIGHT);
X            xv_destroy(new);
X            return menu;
X        }
X    }
X    if (!(menu = (Menu)xv_get(mi, MENU_PULLRIGHT)))
X            menu = (Menu)xv_create(NULL, MENU,
X                MENU_STRINGS, "Couldn't build a menu.", NULL,
X                NULL);
X    return menu;
X}
X
X/*
X * The path passed in is scanned via readdir().  For each file in the
X * path, a menu item is created and inserted into a new menu.  That
X * new menu is made the PULLRIGHT_MENU of a newly created panel item
X * for the path item originally passed it.  Since this routine is
X * recursive, a new menu is created for each subdirectory under the
X * original path.
X */
XMenu_item
Xadd_path_to_menu(path)
Xchar *path;
X{
X    DIR                 *dirp;
X    struct direct       *dp;
X    struct stat         s_buf;
X    Menu_item           mi;
X    Menu                next_menu;
X    char                buf[MAXPATHLEN];
X    static int          recursion;
X
X    /* don't add a folder to the list if user can't read it */
X    if (stat(path, &s_buf) == -1 || !(s_buf.st_mode & S_IREAD))
X        return NULL;
X    if (s_buf.st_mode & S_IFDIR) {
X        int cnt = 0;
X        if (!(dirp = opendir(path)))
X            /* don't bother adding to list if we can't scan it */
X            return NULL;
X        if (recursion)
X            return (Menu_item)-1;
X        recursion++;
X        next_menu = (Menu)xv_create(XV_NULL, MENU, NULL);
X        while (dp = readdir(dirp))
X            if (strcmp(dp->d_name, ".") && strcmp(dp->d_name, "..")) {
X                (void) sprintf(buf, "%s/%s", path, dp->d_name);
X                mi = add_path_to_menu(buf);
X                if (!mi || mi == (Menu_item)-1) {
X                    int do_gen_pullright = (mi == (Menu_item)-1);
X                    /* unreadable file or dir - deactivate item */
X                    mi = (Menu_item)xv_create(XV_NULL, MENUITEM,
X                        MENU_STRING,  getfilename(dp->d_name),
X                        MENU_RELEASE,
X                        MENU_RELEASE_IMAGE,
X                        NULL);
X                    if (do_gen_pullright)
X                        xv_set(mi,
X                            MENU_GEN_PULLRIGHT, gen_pullright,
X                            NULL);
X                    else
X                        xv_set(mi, MENU_INACTIVE, TRUE, NULL);
X                }
X                xv_set(next_menu, MENU_APPEND_ITEM, mi, NULL);
X                cnt++;
X            }
X        closedir(dirp);
X        mi = (Menu_item)xv_create(XV_NULL, MENUITEM,
X            MENU_STRING,        getfilename(path),
X            MENU_RELEASE,
X            MENU_RELEASE_IMAGE,
X            MENU_NOTIFY_PROC,   my_action_proc,
X            NULL);
X        if (!cnt) {
X            xv_destroy(next_menu);
X            /* An empty or unsearchable directory - deactivate item */
X            xv_set(mi, MENU_INACTIVE, TRUE, NULL);
X        } else {
X            xv_set(next_menu,
X                MENU_TITLE_ITEM, strcpy(malloc(strlen(path)+1), path),
X                MENU_CLIENT_DATA, strcpy(malloc(strlen(path)+1), path),
X                NULL);
X            xv_set(mi, MENU_PULLRIGHT, next_menu, NULL);
X        }
X        recursion--;
X        return mi;
X    }
X    return (Menu_item)xv_create(NULL, MENUITEM,
X        MENU_STRING,            getfilename(path),
X        MENU_RELEASE,
X        MENU_RELEASE_IMAGE,
X        MENU_NOTIFY_PROC,       my_action_proc,
X        NULL);
X}
END_OF_FILE
if test 6585 -ne `wc -c <'xview.demos/menus/menu_dir2.c'`; then
    echo shar: \"'xview.demos/menus/menu_dir2.c'\" unpacked with wrong size!
fi
# end of 'xview.demos/menus/menu_dir2.c'
fi
if test -f 'xview.demos/menus/pin_menu.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xview.demos/menus/pin_menu.c'\"
else
echo shar: Extracting \"'xview.demos/menus/pin_menu.c'\" \(4815 characters\)
sed "s/^X//" >'xview.demos/menus/pin_menu.c' <<'END_OF_FILE'
X/*
X * pin_menu.c -
X *	Demonstrate how to generate your own pinup menu.
X *	Use of MENU_GEN_PIN_WINDOW is for static menus only.
X *	This demo uses menus whose items may change, so we
X *	need to reflect those changes in our own command frame.
X */
X#include <xview/xview.h>
X#include <xview/canvas.h>
X#include <xview/panel.h>
X
XFrame	frame;
X
X/*
X * main -
X *	Create a frame, canvas and menu.
X *	A canvas receives input in its canvas_paint_window().
X *	Specify creation of an Open Look Menu and transformation of
X *	the menu to a pinned command window.
X *	Each menu item specifies an action proc to be called when the
X *	item is chosen, regardless of whether or not menu is pinned.
X */
Xmain(argc,argv)
Xint	argc;
Xchar	*argv[];
X{
X    Canvas	canvas;
X    Menu	menu;
X    void	my_notify_proc(), my_event_proc(), menu_done();
X    extern void	exit();
X
X    xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);
X
X    frame = (Frame)xv_create(NULL, FRAME,
X	FRAME_LABEL,	argv[0],
X	NULL);
X    canvas = (Canvas)xv_create(frame, CANVAS,
X	XV_WIDTH,	300,
X	XV_HEIGHT,	200,
X	NULL);
X    menu = (Menu)xv_create(NULL, MENU,
X	MENU_GEN_PIN_WINDOW,	frame, "Junk",
X	MENU_DONE_PROC,		menu_done,
X	/*
X	MENU_STRINGS,		"Yes", "No", "Maybe", NULL,
X	MENU_NOTIFY_PROC,	my_notify_proc,
X	*/
X	MENU_ITEM, MENU_STRING,	"No", MENU_NOTIFY_PROC, my_notify_proc, NULL,
X	MENU_ITEM, MENU_STRING,	"Yes", MENU_NOTIFY_PROC, my_notify_proc, NULL,
X	MENU_ITEM, MENU_STRING,	"Maybe", MENU_NOTIFY_PROC, my_notify_proc, NULL,
X	MENU_ITEM,
X	    MENU_STRING,	"Save",
X	    MENU_NOTIFY_PROC,	my_notify_proc,
X	    MENU_PULLRIGHT,
X		xv_create(canvas, MENU,
X		    MENU_ITEM,
X			MENU_STRING,		"Update Changes",
X			MENU_NOTIFY_PROC,	my_notify_proc,
X			NULL,
X		    NULL),
X	    NULL,
X	MENU_ITEM,
X	    MENU_STRING,	"Quit",
X	    MENU_NOTIFY_PROC,	exit,
X	    NULL,
X	NULL);
X
X    xv_set(canvas_paint_window(canvas),
X	WIN_CONSUME_EVENTS,	WIN_MOUSE_BUTTONS, NULL,
X	WIN_EVENT_PROC,		my_event_proc,
X	/* associate the menu to the canvas win so we can retreive it easily */
X	WIN_CLIENT_DATA,	menu,
X	NULL);
X
X    window_fit(frame);
X    window_main_loop(frame);
X}
X
X/*
X * menu_done - menu has been popped-down.  Make sure the command frame panel
X * matches the menu.
X */
Xvoid
Xmenu_done(menu, result)
XMenu menu;
XXv_opaque result;
X{
X    int default_item, i;
X    Frame pin_frame;
X    Panel panel;
X    Panel_item pi;
X
X    printf("result = %x\n", result);
X    if (!(pin_frame = (Frame)xv_get(menu, MENU_PIN_WINDOW))) {
X	puts("menu has no pin frame");
X	return;
X    }
X    panel = (Panel)xv_get(pin_frame, FRAME_CMD_PANEL);
X    /* get the ordinal number of the default menu item */
X    default_item = (int)xv_get(menu, MENU_DEFAULT);
X
X    /* search for the <default>-th item in the panel and... */
X    pi = (Panel_item)xv_get(panel, PANEL_FIRST_ITEM);
X    for (i = 1 /*menu items offset at 1*/; i < default_item && pi; i++)
X	pi = (Panel_item)xv_get(pi, PANEL_NEXT_ITEM);
X
X    /* set that paenl item to be the default item */
X    xv_set(panel, PANEL_DEFAULT_ITEM, pi, NULL);
X}
X
X/*
X * my_notify_proc - Display menu selection in frame header.
X */
Xvoid
Xmy_notify_proc(menu, menu_item)
XMenu menu;
XMenu_item menu_item;
X{
X    xv_set(frame,
X	FRAME_LABEL,	xv_get(menu_item, MENU_STRING),
X	NULL);
X}
X
X/*
X * my_event_proc - Call menu_show() to display menu on right mouse button push.
X */
Xvoid
Xmy_event_proc(window, event)
XXv_Window window;
XEvent *event;
X{
X    if (event_action(event) == ACTION_MENU && event_is_down(event)) {
X	Menu menu = (Menu)xv_get(window, WIN_CLIENT_DATA);
X	if (!xv_get(menu, MENU_PIN_WINDOW))
X	    create_pin_win(menu);
X	menu_show(menu, window, event, NULL);
X    }
X}
X
X#define MENU_KEY	100
X#define MENU_ITEM_KEY	101
X#define ACTION_KEY	102
X
Xcreate_pin_win(menu)
XMenu menu;
X{
X    int i;
X    void pin_btn_notify();
X    Frame cmd_frame = (Frame)xv_create(frame, FRAME_CMD, XV_SHOW, FALSE, NULL);
X    Panel panel = (Panel)xv_get(cmd_frame, FRAME_CMD_PANEL);
X    Menu_item mi;
X
X    printf("frame = %x, panel = %x\n", cmd_frame, panel);
X    for (i = (int)xv_get(menu, MENU_NITEMS); i > 0; i--) {
X	mi = (Menu_item)xv_get(menu, MENU_NTH_ITEM, i);
X	printf("adding panel item: %s\n", xv_get(mi, MENU_STRING));
X	xv_create(panel, PANEL_BUTTON,
X	    /* PANEL_MENU_ITEM,		TRUE, */
X	    PANEL_LABEL_STRING,		xv_get(mi, MENU_STRING),
X	    PANEL_NOTIFY_PROC,		pin_btn_notify,
X	    XV_KEY_DATA, MENU_KEY,	menu,
X	    XV_KEY_DATA, MENU_ITEM_KEY,	mi,
X	    XV_KEY_DATA, ACTION_KEY,	xv_get(mi, MENU_NOTIFY_PROC),
X	    NULL);
X    }
X    window_fit(panel);
X    window_fit(cmd_frame);
X    xv_set(menu, MENU_PIN_WINDOW, cmd_frame, NULL);
X}
X
Xvoid
Xpin_btn_notify(item, event)
XPanel_item item;
XEvent *event;
X{
X    Menu	menu = (Menu)xv_get(item, XV_KEY_DATA, MENU_KEY);
X    Menu_item	mi = (Menu)xv_get(item, XV_KEY_DATA, MENU_ITEM_KEY);
X    void	(*action)() = (void (*)())xv_get(item, XV_KEY_DATA, ACTION_KEY);
X
X    (*action)(menu, mi);
X}
END_OF_FILE
if test 4815 -ne `wc -c <'xview.demos/menus/pin_menu.c'`; then
    echo shar: \"'xview.demos/menus/pin_menu.c'\" unpacked with wrong size!
fi
# end of 'xview.demos/menus/pin_menu.c'
fi
if test -f 'xview.demos/seln_svc/long_seln.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xview.demos/seln_svc/long_seln.c'\"
else
echo shar: Extracting \"'xview.demos/seln_svc/long_seln.c'\" \(5727 characters\)
sed "s/^X//" >'xview.demos/seln_svc/long_seln.c' <<'END_OF_FILE'
X/*
X * long_seln.c shows how to get an arbitrarily large selection by
X * providing a reading procedure to selection_query().  The panel
X * items allow the user to choose between 3 selection ranks.
X */
X#include <xview/xview.h>
X#include <xview/textsw.h>
X#include <xview/panel.h>
X#include <xview/seln.h>
X
Xextern char *malloc();
X
XSeln_rank seln_type = SELN_PRIMARY;
X
X#define FIRST_BUFFER            0
X#define NOT_FIRST_BUFFER        !FIRST_BUFFER
X
Xchar *seln_bufs[3];     /* contents of each of the three selections */
X
XSeln_result read_proc(); /* supplied to selection_query() as reader */
X
XTextsw          textsw;  /* select from this textsw */
XXv_Server       server;
Xchar *get_selection();
X
Xvoid
Xchange_selection(item, value)
XPanel_item item;
Xint value;
X{
X    if (value == 0)
X        seln_type = SELN_PRIMARY;
X    else if (value == 1)
X        seln_type = SELN_SECONDARY;
X    else
X        seln_type = SELN_SHELF;
X}
X
Xmain(argc, argv)
Xchar *argv[];
X{
X    Frame       frame;
X    Panel       panel;
X    void        print_seln(), exit();
X
X    xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);
X    frame = (Frame) xv_create(NULL, FRAME,
X        FRAME_LABEL, argv[0],
X        NULL);
X
X    panel = (Panel)xv_create(frame, PANEL,
X        WIN_WIDTH,              WIN_EXTEND_TO_EDGE,
X        NULL);
X
X    (void) xv_create(panel, PANEL_BUTTON,
X        PANEL_LABEL_STRING,     "Quit",
X        PANEL_NOTIFY_PROC,      exit,
X        NULL);
X    (void) xv_create(panel, PANEL_BUTTON,
X        PANEL_LABEL_STRING,     "Get Selection",
X        PANEL_NOTIFY_PROC,      print_seln,
X        NULL);
X    (void) xv_create(panel, PANEL_CHOICE,
X        PANEL_LABEL_STRING,     "Selection Type",
X        PANEL_CHOICE_STRINGS,   "Primary", "Secondary", "Shelf", NULL,
X        PANEL_NOTIFY_PROC,      change_selection,
X        NULL);
X    window_fit(panel);
X
X    textsw = (Textsw)xv_create(frame, TEXTSW,
X        WIN_X,                  0,
X        WIN_BELOW,              panel,
X        WIN_ROWS,               10,
X        WIN_COLUMNS,            80,
X        TEXTSW_FILE_CONTENTS,   "/etc/termcap",
X        NULL);
X    window_fit(frame);
X    server = (Xv_Server)xv_get(xv_get(frame, XV_SCREEN), SCREEN_SERVER);
X    xv_main_loop(frame);
X}
X
Xvoid
Xprint_seln()
X{
X    char *text = get_selection();
X
X    if (text)
X        printf("---seln---\n%.*s [...]\n---end seln---\n", 20, text);
X}
X
X/*
X * return the text selected in the current selection rank.  Use
X * selection_query() to guarantee that the entire selection is
X * retrieved.  selection_query() calls our installed routine,
X * read_proc() (see below).
X */
Xchar *
Xget_selection()
X{
X    Seln_holder   holder;
X    Seln_result   result;
X    Seln_request  *response;
X    char          context = FIRST_BUFFER;
X
X    holder = selection_inquire(server, seln_type);
X    printf("selection type = %s\n",
X        seln_type == SELN_PRIMARY? "primary" :
X        seln_type == SELN_SECONDARY? "secondary" : "shelf");
X
X    /* result is based on the return value of read_proc() */
X    result = selection_query(server, &holder, read_proc, &context,
X        SELN_REQ_BYTESIZE,              NULL,
X        SELN_REQ_CONTENTS_ASCII,        NULL,
X        NULL);
X    if (result == SELN_FAILED) {
X        puts("couldn't get selection");
X        return NULL;
X    }
X
X    return seln_bufs[seln_type];
X}
X
X/*
X * Called by selection_query for every buffer of information received.
X * Short messages (under about 2000 bytes) will fit into one buffer.
X * For larger messages, read_proc is called for each buffer in the
X * selection.  The context pointer passed to selection_query is
X * modified by read_proc so that we know if this is the first buffer
X * or not.
X */
XSeln_result
Xread_proc(response)
XSeln_request *response;
X{
X    char *reply;  /* pointer to the data in the response received */
X    long seln_len; /* total number of bytes in the selection */
X    static long seln_have_bytes;
X        /* number of bytes of the selection
X         * which have been read; cumulative over all calls for
X         * the same selection (it is reset when the first
X         * response of a selection is read)
X         */
X
X    printf("read_proc status: %s (%d)\n",
X        response->status == SELN_FAILED? "failed" :
X        response->status == SELN_SUCCESS? "succeeded" :
X        response->status == SELN_CONTINUED? "continued" : "???",
X        response->status);
X    if (*response->requester.context == FIRST_BUFFER) {
X        reply = response->data;
X
X        /* read in the length of the selection -- first attribute.
X         * advance "reply" passed attribute to point to actual data.
X         */
X        reply += sizeof(SELN_REQ_BYTESIZE);
X        /* set seln_len to actual data now. (bytes selected) */
X        seln_len = *(int *)reply;
X        printf("selection size is %ld bytes\n", seln_len);
X        /* advance "reply" to next attribute in list */
X        reply += sizeof(long);
X
X        /* create a buffer large enough to store entire selection */
X        if (seln_bufs[seln_type] != NULL)
X            free(seln_bufs[seln_type]);
X        if (!(seln_bufs[seln_type] = malloc(seln_len + 1))) {
X            puts("out of memory");
X            return(SELN_FAILED);
X        }
X        seln_have_bytes = 0;
X
X        /* move "reply" passed attribute so it points to contents */
X        reply += sizeof(SELN_REQ_CONTENTS_ASCII);
X        *response->requester.context = NOT_FIRST_BUFFER;
X    } else {
X        /* this is not the first buffer, so the contents of the
X	 * response is just more of the selection
X         */
X        reply = response->data;
X    }
X
X    /* copy data from received to the seln buffer allocated above */
X    (void) strcpy(&seln_bufs[seln_type][seln_have_bytes], reply);
X    seln_have_bytes += strlen(reply);
X
X    return SELN_SUCCESS;
X}
END_OF_FILE
if test 5727 -ne `wc -c <'xview.demos/seln_svc/long_seln.c'`; then
    echo shar: \"'xview.demos/seln_svc/long_seln.c'\" unpacked with wrong size!
fi
# end of 'xview.demos/seln_svc/long_seln.c'
fi
if test -f 'xview.demos/seln_svc/seln.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xview.demos/seln_svc/seln.c'\"
else
echo shar: Extracting \"'xview.demos/seln_svc/seln.c'\" \(5659 characters\)
sed "s/^X//" >'xview.demos/seln_svc/seln.c' <<'END_OF_FILE'
X/*
X * seln.c -- print the primary selection from the server.  If the
X * selection is in a text subwindow, then print information about
X * the line number(s) the selection spans and the indexes of the
X * bytes within the textsw's text stream.  This simple program
X * may not be sufficient for general usage -- see comments in
X * get_selection() comments below.
X */
X#include <stdio.h>
X#include <xview/xview.h>
X#include <xview/textsw.h>
X#include <xview/panel.h>
X#include <xview/server.h>
X#include <xview/seln.h>
X
XXv_Server       server;
XTextsw          textsw;
X
Xchar *get_selection();
X
Xmain(argc, argv)
Xchar *argv[];
X{
X    Frame       frame;
X    Panel       panel;
X    void        print_seln(), exit();
X
X    xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);
X
X    frame = (Frame) xv_create(NULL, FRAME,
X        FRAME_LABEL,            argv[0],
X        NULL);
X    panel = (Panel) xv_create(frame, PANEL,
X        WIN_WIDTH,              WIN_EXTEND_TO_EDGE,
X        NULL);
X    (void) xv_create(panel, PANEL_BUTTON,
X        PANEL_LABEL_STRING,     "Quit",
X        PANEL_NOTIFY_PROC,      exit,
X        NULL);
X    (void) xv_create(panel, PANEL_BUTTON,
X        PANEL_LABEL_STRING,     "Get Selection",
X        PANEL_NOTIFY_PROC,      print_seln,
X        NULL);
X    window_fit(panel);
X
X    textsw = (Textsw)xv_create(frame, TEXTSW,
X        WIN_X,                  0,
X        WIN_BELOW,              panel,
X        WIN_ROWS,               10,
X        WIN_COLUMNS,            80,
X        TEXTSW_FILE_CONTENTS,   "/etc/passwd",
X        NULL);
X    window_fit(frame);
X
X    server = (Xv_Server)xv_get(xv_get(frame, XV_SCREEN), SCREEN_SERVER);
X
X    xv_main_loop(frame);
X}
X
Xvoid
Xprint_seln()
X{
X    char *text = get_selection();
X
X    if (text)
X        printf("---selection---\n%s\n---end seln---\n", text);
X}
X
X/*
X * Get the selection using selection_ask().  Note that if the
X * selection is bigger than about 2K, the whole selection will
X * not be gotten with one call, thus this method of getting the
X * selection may not be sufficient.
X */
Xchar *
Xget_selection()
X{
X    long                sel_lin_num, lines_selected;
X    Textsw_index        first, last;
X    Seln_holder         holder;
X    Seln_result         result;
X    int                 len;
X    Seln_request       *request;
X    static char         selection_buf[BUFSIZ];
X    register char      *ptr;
X
X    /* get the holder of the primary selection */
X    holder = selection_inquire(server, SELN_PRIMARY);
X
X    /* If the selection occurs in the text subwindow, print lots
X     * of info about the selection.
X     */
X    if (seln_holder_same_client(&holder, textsw)) {
X        /* ask for information from the selection service */
X        request = selection_ask(server, &holder,
X            /* get the index of the first and last chars in seln */
X            SELN_REQ_FIRST,             NULL,
X            SELN_REQ_LAST,              NULL,
X            /* get the actual selection bytes */
X            SELN_REQ_CONTENTS_ASCII,    NULL,
X            /* fool the textsw to think entire lines are selected */
X            SELN_REQ_FAKE_LEVEL,        SELN_LEVEL_LINE,
X            /* line numbers of beginning and ending of the seln */
X            SELN_REQ_FIRST_UNIT,        NULL,
X            SELN_REQ_LAST_UNIT,         NULL,
X            NULL);
X        /* set the ptr to beginning of data -- SELN_REQ_FIRST */
X        ptr = request->data;
X        /* "first" is data succeeding SELN_REQ_FIRST -- skip attr */
X        first = *(Textsw_index *)(ptr += sizeof(SELN_REQ_FIRST));
X        ptr += sizeof(Textsw_index); /* skip over value of "first" */
X        /* "last" is data succeeding SELN_REQ_LAST -- skip attr */
X        last  = *(Textsw_index *)(ptr += sizeof(SELN_REQ_LAST));
X        ptr += sizeof(Textsw_index); /* skip over value of "last" */
X
X        /* advance pointer past SELN_REQ_CONTENTS_ASCII */
X        ptr += sizeof(SELN_REQ_CONTENTS_ASCII);
X        len = strlen(ptr); /* length of string in request */
X        (void) strcpy(selection_buf, ptr);
X        /*
X         * advance pointer past length of string.  If the string
X         * length isn't aligned to a 4-byte boundary, add the
X         * difference in bytes -- then advance pointer passed "value".
X         */
X        if (len % 4)
X            len = len + (4 - (len % 4));
X        ptr += len + sizeof(Seln_attribute); /* skip over "value" */
X
X        /* advance past SELN_REQ_FAKE_LEVEL, SELN_LEVEL_LINE */
X        ptr += sizeof(SELN_REQ_FAKE_LEVEL) + sizeof(SELN_LEVEL_LINE);
X
X        sel_lin_num = *(long *)(ptr += sizeof(SELN_REQ_FIRST_UNIT));
X        ptr += sizeof(long);
X        lines_selected = *(long *)(ptr += sizeof(SELN_REQ_LAST_UNIT));
X        ptr += sizeof(long);
X
X        /* hack to workaround bug with SELN_REQ_LAST_UNIT always
X         * returning -1.  We have to count the line numbers ourselves.
X         */
X        if (lines_selected < 0) {
X            register char *p;
X            lines_selected++;
X            for (p = selection_buf; *p; p++)
X                if (*p == '\n')
X                    lines_selected++;
X        }
X        printf("index in textsw: %d-%d, line number(s) = %d-%d\n",
X            first+1, last+1, sel_lin_num+1,
X            sel_lin_num+lines_selected+1);
X    } else {
X        /* the selection is not in the text subwindow */
X        request = selection_ask(server, &holder,
X            SELN_REQ_CONTENTS_ASCII, NULL,
X            NULL);
X        if (request->status != SELN_SUCCESS) {
X            printf("selection_ask() returns %d\n", request->status);
X            return "";
X        }
X        (void) strcpy(selection_buf,
X            request->data + sizeof(SELN_REQ_CONTENTS_ASCII));
X    }
X    return selection_buf;
X}
END_OF_FILE
if test 5659 -ne `wc -c <'xview.demos/seln_svc/seln.c'`; then
    echo shar: \"'xview.demos/seln_svc/seln.c'\" unpacked with wrong size!
fi
# end of 'xview.demos/seln_svc/seln.c'
fi
echo shar: End of archive 2 \(of 6\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 6 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0