/*
 * xv_menu.c -
 *      Demonstrate the use of an XView menu in a canvas subwindow.
 *      Menu is brought up with right mouse button and the selected
 *      choice is displayed in the canvas.  Allows menu to be pinned.
 */
#include <xview/xview.h>
#include <xview/canvas.h>

Frame   frame;

main(argc, argv)
int     argc;
char    *argv[];
{
    Canvas      canvas;
    Menu        menu;
    void        my_notify_proc(), my_event_proc();
    extern void exit();

    xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);

    frame = (Frame)xv_create(NULL, FRAME,
                             FRAME_LABEL,    argv[0],
                             NULL);
    canvas = (Canvas)xv_create(frame, CANVAS,
                               XV_WIDTH,       300,
                               XV_HEIGHT,      200,
                               NULL);
    menu = (Menu)xv_create(NULL, MENU,
                           MENU_TITLE_ITEM,        "Junk",
                           MENU_STRINGS,           "Yes", "No", "Maybe", NULL,
                           MENU_NOTIFY_PROC,       my_notify_proc,
                           MENU_ITEM,
                           MENU_STRING,        "Save",
                           MENU_NOTIFY_PROC,   my_notify_proc,
                           MENU_PULLRIGHT,
                           xv_create(canvas, MENU,
                                     MENU_GEN_PIN_WINDOW,        frame, "Save",
                                     MENU_ITEM,
                                     MENU_STRING,            "Update Changes",
                                     MENU_NOTIFY_PROC,       my_notify_proc,
                                     NULL,
                                     NULL),
                           NULL,
                           MENU_ITEM,
                           MENU_STRING,        "Quit",
                           MENU_NOTIFY_PROC,   exit,
                           NULL,
                           NULL);

    xv_set(canvas_paint_window(canvas),
           WIN_CONSUME_EVENTS,     WIN_MOUSE_BUTTONS, NULL,
           WIN_EVENT_PROC,         my_event_proc,
           /* associate the menu to the canvas win for easy retrieval */
           WIN_CLIENT_DATA,        menu,
           NULL);

    window_fit(frame);
    window_main_loop(frame);
}

/*
 * my_notify_proc - Display menu selection in frame header.
 */
void
my_notify_proc(menu, menu_item)
Menu menu;
Menu_item menu_item;
{
    xv_set(frame,
           FRAME_LABEL,    xv_get(menu_item, MENU_STRING),
           NULL);
}

/*
 * Call menu_show() to display menu on right mouse button push.
 */
void
my_event_proc(window, event)
Xv_Window window;
Event *event;
{
    if(event_action(event) == ACTION_MENU && event_is_down(event))
    {
        Menu menu = (Menu)xv_get(window, WIN_CLIENT_DATA);
        menu_show(menu, window, event, NULL);
    }
}
