Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!mcsun!ukc!edcastle!aipna!eusip!rick From: rick@cstr.ed.ac.uk (Rick Innis) Newsgroups: comp.windows.x Subject: Use of accelerators (bug or misunderstanding?) Message-ID: Date: 29 Jun 90 17:41:34 GMT Sender: news@aipna.ed.ac.uk Distribution: comp Organization: CSTR, University of Edinburgh Lines: 155 SunOS 4.0.3, gcc 1.37.1, Sun4/330 and Sun3/80 I'm working on an application which uses accelerators to bind events in TextWidgets to actions in CommandWidgets. However, the accelerations aren't behaving the way I expect. The following program creates a Form with two textWidgets and two CommandWidgets. Given the acclerations I would *expect* that pressing the return key in 'text1' would call the callback for command1' and pressing the return key in 'text2' would call the callback for 'command2'. However, although the first expectation is fulfilled, pressing the return key in 'text2' calls the callback for 'command1'. Any and all thoughts appreciated. cut here---------------------------------------------------------------- /* Xtest.c : test program for accelerator behaviour */ #include #include #include #include #include void CreateWidgets(Widget w); void GetString1(Widget w, caddr_t client_data, caddr_t call_data); void GetString2(Widget w, caddr_t client_data, caddr_t call_data); void Open(Widget widget, XEvent *event, String *params, Cardinal *num_params); void main(argc, argv) int argc; char *argv[]; { Widget toplevel, panel; XtAppContext appCon; Arg formArgs[] = { { XtNheight, 200 }, { XtNwidth, 300 }, }; static XtActionsRec actiontable[] = { {"Open", (XtActionProc) Open}, {"Nothing", NULL} }; toplevel = XtAppInitialize(&appCon, "Text", NULL, NULL, &argc, argv, NULL, NULL, NULL); panel = XtCreateManagedWidget("Panel", formWidgetClass, toplevel, formArgs, XtNumber(formArgs)); XtAppAddActions(appCon, actiontable, XtNumber(actiontable)); CreateWidgets(panel); XtRealizeWidget(toplevel); XtAppMainLoop(appCon); } void CreateWidgets(Widget parent) { Widget form, text1, text2, command1, command2; XtCallbackRec commandCallback[] = { { NULL, NULL }, { NULL, NULL } }; String acceleratorTable = "#override\n\ CtrlJ: Open()\n\ CtrlM: Open()\n\ Linefeed: Open()\n\ Return: Open()\n"; XtAccelerators accelerators = XtParseAcceleratorTable(acceleratorTable); Arg commandArgs[] = { { XtNcallback, (XtArgVal) commandCallback }, { XtNfromHoriz, NULL }, { XtNfromVert, NULL }, { XtNaccelerators, (XtArgVal) accelerators }, }; Arg textArgs[] = { { XtNstring, NULL }, { XtNfromHoriz, NULL}, { XtNfromVert, NULL}, { XtNeditType, (XtArgVal) "edit" }, }; XtSetArg(textArgs[0], XtNstring, "string1"); text1 = XtCreateManagedWidget("tunefile", asciiTextWidgetClass, parent, textArgs, XtNumber(textArgs)); commandCallback[0].callback = GetString1; commandCallback[0].closure = (caddr_t) text1; XtSetArg(commandArgs[1], XtNfromHoriz, text1); XtSetArg(commandArgs[2], XtNfromVert, NULL); command1 = XtCreateManagedWidget("tune", commandWidgetClass, parent, commandArgs, XtNumber(commandArgs)); XtInstallAccelerators(text1, command1); XtSetArg(textArgs[0], XtNstring, "string2"); XtSetArg(textArgs[2], XtNfromVert, text1); text2 = XtCreateManagedWidget("indexfile", asciiTextWidgetClass, parent, textArgs, XtNumber(textArgs)); commandCallback[0].callback = GetString2; commandCallback[0].closure = (caddr_t) text2; XtSetArg(commandArgs[1], XtNfromHoriz, text2); XtSetArg(commandArgs[2], XtNfromVert, command1); command2 = XtCreateManagedWidget("index", commandWidgetClass, parent, commandArgs, XtNumber(commandArgs)); XtInstallAccelerators(text2, command2); } void Open(Widget widget, XEvent *event, String *params, Cardinal *num_params) { XtCallCallbacks((CommandWidget) widget, XtNcallback, NULL); } void GetString1(Widget w, caddr_t client_data, caddr_t call_data) { TextWidget text = (TextWidget) client_data; String string; Arg textArgs[] = { {XtNstring, (XtArgVal) &string}, }; XtGetValues(text, textArgs, XtNumber(textArgs)); if(string == NULL) { XtWarning("GetString1:Bad Result!"); return; } printf("GetString1: %s\n", string); } void GetString2(Widget w, caddr_t client_data, caddr_t call_data) { TextWidget text = (TextWidget) client_data; String string; Arg textArgs[] = { {XtNstring, (XtArgVal) &string}, }; XtGetValues(text, textArgs, XtNumber(textArgs)); if(string == NULL) { XtWarning("GetString2:Bad Result!"); return; } printf("GetString2: %s\n", string); }