/* Written by Dan Heller and Paula Ferguson. * Copyright 1994, O'Reilly & Associates, Inc. * Permission to use, copy, and modify this program without * restriction is hereby granted, as long as this copyright * notice appears in each copy of the program source code. * This program is freely distributable without licensing fees and * is provided without guarantee or warrantee expressed or implied. * This program is -not- in the public domain. */ /* traverse.c -- demonstrate how keyboard traversal can be * manipulated among primitive widgets. Create a tic-tac-toe * board of PushButtons. As each item is selected, mark it * with an X (unless the Shift key is down) and change the * PushButton's XmNtraversalOn to False so user can't traverse * to it anymore. */ #include <Xm/PushBG.h> #include <Xm/Form.h> main(argc, argv) int argc; char *argv[]; { XtAppContext app; Widget toplevel, parent, w; int x, y; extern void pushed(); /* callback for the PushButton */ XtSetLanguageProc (NULL, NULL, NULL); toplevel = XtVaAppInitialize (&app, "Demos", NULL, 0, &argc, argv, NULL, NULL); parent = XtVaCreateManagedWidget ("form", xmFormWidgetClass, toplevel, XmNfractionBase, 3, NULL); /* create nine pushbutton widgets in tic-tac-toe format */ for (x = 0; x < 3; x++) for (y = 0; y < 3; y++) { w = XtVaCreateManagedWidget (" ", xmPushButtonGadgetClass, parent, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, y, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, x, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, x+1, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, y+1, NULL); XtAddCallback (w, XmNactivateCallback, pushed, NULL); } XtRealizeWidget (toplevel); XtAppMainLoop (app); } void pushed(w, client_data, call_data) Widget w; XtPointer client_data; XtPointer call_data; { char buf[2]; XmString str; int letter; XmPushButtonCallbackStruct *cbs = (XmPushButtonCallbackStruct *) call_data; XtVaGetValues (w, XmNuserData, &letter, NULL); if (letter) { XBell (XtDisplayOfObject (w), 50); return; } /* Shift key gets an O. (xbutton and xkey happen to be similar) */ if (cbs->event->xbutton.state & ShiftMask) letter = buf[0] = '0'; else letter = buf[0] = 'X'; buf[1] = 0; str = XmStringCreateLocalized (buf); XtVaSetValues (w, XmNlabelString, str, XmNuserData, letter, XmNshadowThickness, 0, XmNtraversalOn, False, NULL); XmStringFree (str); }