#include #include #include #include #include #include #include #include #include #include #include #include #include /* Global variables */ enum { AUTO, MANUAL } mode = AUTO; enum { TALK, NTALK , YTALK} talkprg = TALK; char *repr[3]={"talk", "ntalk", "ytalk"}; Widget label, userText, aboutDialog; static Pixmap mark; /* Function prototypes */ void makeBoard (Widget board); void ansYesCallback (Widget w, XtPointer clientData, XtPointer callData); void mycallback1 (Widget w, XtPointer clientData, XtPointer callData); void mycallback2 (Widget w, XtPointer clientData, XtPointer callData); void mycallback3 (Widget w, XtPointer clientData, XtPointer callData); void ansNoCallback (Widget w, XtPointer clientData, XtPointer callData); void aboutCallback (Widget w, XtPointer clientData, XtPointer callData); void aboutOkCallback (Widget w, XtPointer clientData, XtPointer callData); void respondCallback (Widget w, XtPointer clientData, XtPointer callData); void talkCallback (Widget w, XtPointer clientData, XtPointer callData); void usrCallback (Widget w, XtPointer clientData, XEvent* event) ; XmString makeMessage (char * s [], int n); Widget makeAboutDialog (Widget parent); Widget makeEntryField (char * title, Widget parent); Widget makeRadio2 (char * name, Widget parent, int isSet, XtCallbackProc callProc, XtPointer callData); Widget makeRadio (char * name, Widget parent, int isSet, XtCallbackProc callProc, XtPointer callData); Widget makeButton (char * name, Widget parent, int isQuit, XtCallbackProc callProc, XtPointer callData); /* Main program */ void main (int argc, char * argv[]) { Widget toplevel; /* Initialize the X server */ toplevel = XtInitialize(argv[0], "xphone", NULL, 0, &argc, argv); /* Create and realize the main window */ makeBoard(toplevel); XtRealizeWidget(toplevel); /* Enter the event loop */ XtMainLoop(); } /* Create the whole GUI */ void makeBoard (Widget parent) { Widget board, top, bottom, options2,options, commands; Arg wargs [2]; int a; /* Create the board containing all elements */ XtSetArg(wargs[0], XmNorientation, XmVERTICAL); board = XtCreateManagedWidget("Board", xmRowColumnWidgetClass, parent, wargs, 1); top = XtCreateManagedWidget("Main Window", xmRowColumnWidgetClass, board, NULL, 0); XtSetArg(wargs[0], XmNentryClass, xmToggleButtonWidgetClass); XtSetArg(wargs[1], XmNorientation, XmHORIZONTAL); options = XmCreateRadioBox(top, "Options", wargs, 2); XtSetArg(wargs[0], XmNentryClass, xmToggleButtonWidgetClass); XtSetArg(wargs[1], XmNorientation, XmHORIZONTAL); options2 = XmCreateRadioBox(top, "Options2", wargs, 2); XtManageChild(options); XtManageChild(options2); makeRadio("Auto", options, mode == AUTO, ansYesCallback, NULL ); makeRadio("Manual", options, mode == MANUAL, ansNoCallback, NULL); makeRadio2("talk", options2, mode == TALK, mycallback1, NULL ); makeRadio2("ntalk", options2, mode == NTALK, mycallback2, NULL ); makeRadio2("ytalk", options2, mode == YTALK, mycallback3, NULL); userText = makeEntryField("User Text", top); XtAddEventHandler( userText, EnterWindowMask, FALSE, usrCallback, NULL); XtSetArg(wargs[0], XmNentryBorder, 1); bottom = XtCreateManagedWidget("Standard window", xmRowColumnWidgetClass, board, wargs, 1); label = XtCreateManagedWidget(" XWindows demo ", xmLabelWidgetClass,bottom, NULL, 0); /* Commands */ XtSetArg(wargs[0], XmNorientation, XmHORIZONTAL); commands = XtCreateManagedWidget("Commands", xmRowColumnWidgetClass, bottom, wargs, 1); makeButton("About", commands, FALSE, aboutCallback, NULL); makeButton("Respond", commands, FALSE, respondCallback, NULL); makeButton("Talk", commands, FALSE, talkCallback, NULL); makeButton("Quit", commands, TRUE, NULL, NULL); /* Create the "About" dialog box */ aboutDialog = makeAboutDialog(board); } /* Callbacks for the radio buttons */ void ansYesCallback (Widget w, XtPointer clientData, XtPointer callData) { Arg wargs[1]; XmString msg; char* ans; ans = "Auto Mode Selected."; msg = XmStringCreate(ans, XmSTRING_DEFAULT_CHARSET); XtSetArg(wargs[0], XmNlabelString, msg); XtSetValues(label,wargs, 1); } void mycallback1 (Widget w, XtPointer clientData, XtPointer callData) { talkprg=0; } void mycallback2 (Widget w, XtPointer clientData, XtPointer callData) { talkprg=1; } void mycallback3 (Widget w, XtPointer clientData, XtPointer callData) { talkprg=2; } void ansNoCallback (Widget w, XtPointer clientData, XtPointer callData) { Arg wargs[1]; XmString msg; char* ans; ans = "Manual mode Selected ."; msg = XmStringCreate(ans, XmSTRING_DEFAULT_CHARSET); XtSetArg(wargs[0], XmNlabelString, msg); XtSetValues(label,wargs, 1); } /* The EventHandler for the userText */ void usrCallback (Widget w, XtPointer clientData, XEvent* event) { Arg wargs[1]; XmString msg; char * usrTxt = XmTextGetString(userText); msg = XmStringCreate(usrTxt, XmSTRING_DEFAULT_CHARSET); XtSetArg(wargs[0], XmNlabelString, msg); XtSetValues(label,wargs, 1); free(usrTxt); } /* Create an "About" dialog box */ Widget makeAboutDialog (Widget parent) { static char * msg [] = { "XPhone Program,", "Developed by " "Spiros Ioannou, Vassilis Papadimos. 1995 " }; Widget dialog; XmString message; Arg wargs [2]; /* Convert the message into an XmString */ message = makeMessage(msg, 4); /* Create the message dialog box */ XtSetArg(wargs[0], XmNautoUnmanage, FALSE); XtSetArg(wargs[1], XmNmessageString, message); dialog = XmCreateMessageDialog(parent, "About", wargs, 2); /* Get rid of its standard "Cancel" and "Help" button */ XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON)); XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON)); /* Add a callback for closing it */ XtAddCallback(dialog, XmNokCallback, aboutOkCallback, NULL); return dialog; } /* Convert an array of strings into an XmString */ XmString makeMessage (char * s [], int n) { XmString result; int i; if (n <= 0) return XmStringCreate("", XmSTRING_DEFAULT_CHARSET); result = XmStringCreate(s[0], XmSTRING_DEFAULT_CHARSET); for (i = 1 ; i < n ; i++) { result = XmStringConcat(result, XmStringSeparatorCreate()); result = XmStringConcat(result, XmStringCreate(s[i], XmSTRING_DEFAULT_CHARSET)); } return result; } /* Callbacks for the "About" dialog box */ void respondCallback (Widget w, XtPointer clientData, XtPointer callData) { /* Code to answer the talk request ... */ } void talkCallback (Widget w, XtPointer clientData, XtPointer callData) { /* Code to make the talk request ... */ char boo[100]; char * usrTxt = XmTextGetString(userText); sprintf(boo,"xterm -e %s %s",repr[talkprg], usrTxt); printf("%s\n",boo); system(boo); } /* ABOUT BOX */ void aboutCallback (Widget w, XtPointer clientData, XtPointer callData) { XtManageChild(aboutDialog); /* Show the dialog box */ } void aboutOkCallback (Widget w, XtPointer clientData, XtPointer callData) { XtUnmanageChild(aboutDialog); /* Hide the dialog box */ } /* Create an entry field with a label */ /* Not Used*/ Widget makeEntryField (char * title, Widget parent) { Widget lbl, field; XmString message; Arg wargs [1]; /* Create the label */ message = XmStringCreate(title, XmSTRING_DEFAULT_CHARSET); XtSetArg(wargs[0], XmNlabelString, message); lbl = XtCreateManagedWidget("Label", xmLabelWidgetClass, parent, wargs, 1); /* Create the text field */ field = XtCreateManagedWidget("Field", xmTextWidgetClass, parent, NULL, 0); return field; } /* Create a radio button */ Widget makeRadio (char * name, Widget parent, int isSet, XtCallbackProc callProc, XtPointer callData) { Widget radio; Arg wargs [1]; /* Create the radio button */ XtSetArg(wargs[0], XmNset, isSet); radio = XtCreateManagedWidget(name, xmToggleButtonWidgetClass, parent, wargs, 1); /* Set its callback function */ XtAddCallback(radio, XmNvalueChangedCallback, callProc, callData); return radio; } Widget makeRadio2 (char * name, Widget parent, int isSet, XtCallbackProc callProc, XtPointer callData) { Widget radio; Arg wargs [1]; /* Create the radio button */ XtSetArg(wargs[0], XmNset, isSet); radio = XtCreateManagedWidget(name, xmToggleButtonWidgetClass, parent, wargs, 1); /* Set its callback function */ XtAddCallback(radio, XmNvalueChangedCallback, callProc, callData); return radio; } /* QuitButton handling */ int quitFlag = FALSE; void quitArmCallback (Widget w, XtPointer clientData, XtPointer callData) { quitFlag = FALSE; } void quitActivateCallback (Widget w, XtPointer clientData, XtPointer callData) { quitFlag = TRUE; } void quitDisarmCallback (Widget w, XtPointer clientData, XtPointer callData) { if (quitFlag) { /*XtCloseDisplay(XtDisplay(w));*/ exit(0); } } /* Create a push-button */ Widget makeButton (char * name, Widget parent, int isQuit, XtCallbackProc callProc, XtPointer callData) { Widget button; /* Create a push button */ button = XtCreateManagedWidget(name, xmPushButtonWidgetClass, parent, NULL, 0); /* Set its callback functions (trick if it's a "Quit" button) */ if (isQuit) { XtAddCallback(button, XmNarmCallback, quitArmCallback, NULL); XtAddCallback(button, XmNdisarmCallback, quitDisarmCallback, NULL); XtAddCallback(button, XmNactivateCallback, quitActivateCallback, NULL); } else XtAddCallback(button, XmNactivateCallback, callProc, callData); return button; }