#include <stdio.h>
#include <X11/Intrinsic.h>
#include <Xm/Xm.h>
#include <Xm/PushB.h>
#include <Xm/RowColumn.h>
#include <Xm/Protocols.h>

static void
count_click(Widget widget, XtPointer client_data, XtPointer call_data)
{
    unsigned int *count = (unsigned int *)client_data;
    char text[64];
    XmString label;

    (void)call_data;
    ++*count;
    snprintf(text, sizeof text, "Clicks: %u", *count);
    label = XmStringCreateLocalized(text);
    XtVaSetValues(widget, XmNlabelString, label, NULL);
    XmStringFree(label);
}

static void
quit(Widget widget, XtPointer client_data, XtPointer call_data)
{
    (void)client_data;
    (void)call_data;
    XtAppSetExitFlag(XtWidgetToApplicationContext(widget));
}

int
main(int argc, char **argv)
{
    XtAppContext app;
    Widget shell, row, count_button, quit_button;
    Display *display;
    Atom wm_delete;
    XmString label;
    unsigned int count = 0;
    String fallback[] = {
        "*title: Hello Motif",
        "*row.marginWidth: 12",
        "*row.marginHeight: 12",
        "*row.spacing: 8",
        NULL
    };

    XtSetLanguageProc(NULL, NULL, NULL);
    shell = XtVaAppInitialize(&app, "HelloMotif", NULL, 0,
                              &argc, argv, fallback, NULL);
    row = XtVaCreateManagedWidget("row", xmRowColumnWidgetClass,
                                  shell, NULL);

    label = XmStringCreateLocalized("Clicks: 0");
    count_button = XtVaCreateManagedWidget(
        "count", xmPushButtonWidgetClass, row,
        XmNlabelString, label, NULL);
    XmStringFree(label);
    XtAddCallback(count_button, XmNactivateCallback, count_click, &count);

    label = XmStringCreateLocalized("Quit");
    quit_button = XtVaCreateManagedWidget(
        "quit", xmPushButtonWidgetClass, row,
        XmNlabelString, label, NULL);
    XmStringFree(label);
    XtAddCallback(quit_button, XmNactivateCallback, quit, NULL);

    display = XtDisplay(shell);
    wm_delete = XInternAtom(display, "WM_DELETE_WINDOW", False);
    XtVaSetValues(shell, XmNdeleteResponse, XmDO_NOTHING, NULL);
    XmAddWMProtocolCallback(shell, wm_delete, quit, NULL);

    XtRealizeWidget(shell);
    XtAppMainLoop(app);
    XtDestroyWidget(shell);
    XtCloseDisplay(display);
    XtDestroyApplicationContext(app);
    return 0;
}
