#include <WINGs/WINGsP.h>



typedef struct W_GeometryView {
    W_Class widgetClass;
    WMView *view;

    WMColor *color;
    WMColor *bgColor;

    WMFont *font;

    WMSize textSize;

    union {
        struct {
            int x, y;
        } pos;
        struct {
            unsigned width, height;
        } size;
    } data;

    unsigned showPosition:1;
} WGeometryView;



static void handleEvents(XEvent *event, void *clientData);
static void paint(WGeometryView *gview);


WGeometryView*
WCreateGeometryView(WMScreen *scr)
{
    WGeometryView *gview;
    char buffer[64];
    static W_Class widgetClass = 0;

    if (!widgetClass) {
        widgetClass = W_RegisterUserWidget();
    }

    gview = malloc(sizeof(WGeometryView));
    if (!gview) {
        return NULL;
    }
    memset(gview, 0, sizeof(WGeometryView));

    gview->widgetClass = widgetClass;

    gview->view = W_CreateTopView(scr);
    if (!gview->view) {
        wfree(gview);

        return NULL;
    }
    gview->view->self = gview;

    gview->font = WMSystemFontOfSize(scr, 12);
    if (!gview->font) {
        W_DestroyView(gview->view);
        wfree(gview);

        return NULL;
    }

    gview->bgColor = WMCreateRGBColor(scr, 0x3333, 0x6666, 0x9999, True);
    gview->color = WMWhiteColor(scr);

    WMCreateEventHandler(gview->view, ExposureMask, handleEvents, gview);

    snprintf(buffer, sizeof(buffer), "%+05i,  %+05i", 0, 0);

    gview->textSize.width = WMWidthOfString(gview->font, buffer,
                                            strlen(buffer));
    gview->textSize.height = WMFontHeight(gview->font);

    WMSetWidgetBackgroundColor(gview, gview->bgColor);

    W_ResizeView(gview->view, gview->textSize.width+8,
                 gview->textSize.height+6);

    return gview;
}


void
WSetGeometryViewShownPosition(WGeometryView *gview, int x, int y)
{
    gview->showPosition = 1;
    gview->data.pos.x = x;
    gview->data.pos.y = y;

    paint(gview);
}


void
WSetGeometryViewShownSize(WGeometryView *gview,
                          unsigned width, unsigned height)
{
    gview->showPosition = 0;
    gview->data.size.width = width;
    gview->data.size.height = height;

    paint(gview);
}



static void
paint(WGeometryView *gview)
{
    char buffer[64];

    if (gview->showPosition) {
        snprintf(buffer, sizeof(buffer), "%+5i , %+5i    ",
                 gview->data.pos.x, gview->data.pos.y);
    } else {
        snprintf(buffer, sizeof(buffer), "%+5i x %+5i    ",
                 gview->data.size.width, gview->data.size.height);
    }

    WMDrawImageString(W_VIEW_SCREEN(gview->view),
                      W_VIEW_DRAWABLE(gview->view),
                      gview->color, gview->bgColor, gview->font,
                      (W_VIEW_WIDTH(gview->view)-gview->textSize.width)/2,
                      (W_VIEW_HEIGHT(gview->view)-gview->textSize.height)/2,
                      buffer, strlen(buffer));

    W_DrawRelief(W_VIEW_SCREEN(gview->view), W_VIEW_DRAWABLE(gview->view),
                 0, 0, W_VIEW_WIDTH(gview->view), W_VIEW_HEIGHT(gview->view),
                 WRSimple);
}



static void
handleEvents(XEvent *event, void *clientData)
{
    WGeometryView *gview = (WGeometryView*)clientData;

    switch (event->type) {
    case Expose:
        paint(gview);
        break;

    }
}



syntax highlighted by Code2HTML, v. 0.9.1