/*
 * simple_font.c -- very simple program showing how to render text
 * using fonts loaded by XView.
 */
#include <ctype.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <xview/xview.h>
#include <xview/panel.h>
#include <xview/font.h>

Display *dpy;
GC      gc;
XFontStruct *font_info;

main(argc, argv)
int     argc;
char    *argv[];
{
    Frame       frame;
    Panel       panel;
    Canvas      canvas;
    XGCValues   gcvalues;
    Xv_Font     font;
    void        my_event_proc();
    extern void exit();

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

    frame = (Frame)xv_create(XV_NULL, FRAME,
                             FRAME_LABEL,            argv[0],
                             NULL);

    panel = (Panel)xv_create(frame, PANEL,
                             PANEL_LAYOUT,           PANEL_VERTICAL,
                             NULL);
    xv_create(panel, PANEL_BUTTON,
              PANEL_LABEL_STRING,     "Quit",
              PANEL_NOTIFY_PROC,      exit,
              NULL);
    window_fit(panel);

    canvas = (Canvas)xv_create(frame, CANVAS,
                               XV_WIDTH,               400,
                               XV_HEIGHT,              200,
                               CANVAS_X_PAINT_WINDOW,  TRUE,
                               NULL);
    xv_set(canvas_paint_window(canvas),
           WIN_EVENT_PROC,         my_event_proc,
           NULL);

    window_fit(frame);

    dpy = (Display *)xv_get(frame, XV_DISPLAY);
    font = (Xv_Font)xv_get(frame, XV_FONT);
    font_info = (XFontStruct *)xv_get(font, FONT_INFO);

    gcvalues.font = (Font)xv_get(font, XV_XID);
    gcvalues.foreground = BlackPixel(dpy, DefaultScreen(dpy));
    gcvalues.background = WhitePixel(dpy, DefaultScreen(dpy));
    gcvalues.graphics_exposures = False;
    gc = XCreateGC(dpy, RootWindow(dpy, DefaultScreen(dpy)),
                   GCForeground | GCBackground | GCFont | GCGraphicsExposures, &gcvalues);

    xv_main_loop(frame);
}

void
my_event_proc(win, event)
Xv_Window win;
Event *event;
{
    static int x = 10, y = 10;
    Window xwin = (Window)xv_get(win, XV_XID);
    char c;

    if(event_is_up(event))
        return;

    if(event_is_ascii(event))
    {
        c = (char)event_id(event);

        if(c == '\n' || c == '\r')
        {
            y += font_info->max_bounds.ascent +
                 font_info->max_bounds.descent;
            x = 10;
        }
        else if(c == 7 || c == 127)      /* backspace or delete */
        {
            if(x > 10)
                x -= XTextWidth(font_info, "m", 1);

            /* use XDrawImageString to overwrite previous text */
            XDrawImageString(dpy, xwin, gc, x, y, "  ", 2);
        }
        else
        {
            XDrawString(dpy, xwin, gc, x, y, &c, 1);
            x += XTextWidth(font_info, &c, 1);
        }
    }
    else if(event_action(event) == ACTION_SELECT)
    {
        x = event_x(event);
        y = event_y(event);
    }
}
