1 static char *rcsid = "$Id: UiMisc.c,v 1.3 1992/03/26 18:13:50 kny Exp kny $";
3 #include "UiIncludes.h"
6 static void uitimeouthandler(XtPointer data, XtIntervalId * id);
7 static void uifdinputhandler(XtPointer data, int *fd, XtInputId * id);
8 static void uipopupcb(Widget wdg, char *address,
9 XmAnyCallbackStruct * calldata);
12 void (*uiHelpOnActionCB) (char *actionstring) =
14 void (*) (char *actionstring)) NULL;
16 static void (*uitimeoutcallback) (void *data);
17 static void (*uifdinputcallback) (void *data);
19 static XtInputId uiinputid;
20 static void (*uipopupcallback) (char *address, char *topaddress,
22 static char *uipopuptopaddress;
25 int UiAttachCallback(actionname, callback, parameter)
27 void (*callback) (char *address, HText_t * htext,
28 HTextObject_t * htextobject, void *parameter);
31 uiAction_t *tmpaction;
33 if (!(tmpaction = uiFindAction(actionname))) {
34 tmpaction = uiTopLevel.Actions;
38 (uiAction_t *) uiMalloc(sizeof(*tmpaction));
40 while (tmpaction->Next)
41 tmpaction = tmpaction->Next;
43 tmpaction->Next = (uiAction_t *) uiMalloc(sizeof(*tmpaction));
45 tmpaction->Name = strdup(actionname);
46 tmpaction->Next = (uiAction_t *) NULL;
48 tmpaction->Callback = callback;
49 tmpaction->Parameter = parameter;
55 int UiBindKey(keyname, modifier, callback, parameter)
58 void (*callback) (char *address, HText_t * htext,
59 HTextObject_t * htextobject, void *parameter);
64 if (!(tmpkey = uiFindKey(keyname, modifier))) {
65 tmpkey = uiTopLevel.Keys;
69 (uiKey_t *) uiMalloc(sizeof(*tmpkey));
72 tmpkey = tmpkey->Next;
74 tmpkey->Next = (uiKey_t *) uiMalloc(sizeof(*tmpkey));
76 tmpkey->Name = strdup(keyname);
77 tmpkey->Next = (uiKey_t *) NULL;
79 tmpkey->Modifier = modifier;
80 tmpkey->Callback = callback;
81 tmpkey->Parameter = parameter;
87 int UiBindVariable(varname, variable, type)
94 if (!(tmpvar = uiFindVariable(varname))) {
95 tmpvar = uiTopLevel.Variables;
98 uiTopLevel.Variables =
99 (uiVariable_t *) uiMalloc(sizeof(*tmpvar));
102 tmpvar = tmpvar->Next;
104 tmpvar->Next = (uiVariable_t *) uiMalloc(sizeof(*tmpvar));
106 tmpvar->Name = strdup(varname);
107 tmpvar->Next = (uiVariable_t *) NULL;
109 tmpvar->Value = variable;
110 tmpvar->VarType = type;
116 int UiUpdateVariable(varname)
119 uiVariable_t *tmpvar;
121 static char staticstr[100]; /* Is this overkill? */
124 if (tmpvar = uiFindVariable(varname)) {
125 switch (tmpvar->WdgType) {
127 switch (tmpvar->VarType) {
129 sprintf(staticstr, "%d", *(int *) tmpvar->Value);
132 sprintf(staticstr, "%d", *(int *) tmpvar->Value);
135 tmpstr = (char *) tmpvar->Value;
137 XmTextSetString(tmpvar->Wdg, tmpstr);
140 /* Not implemented yet */
143 /* Not implemented yet */
145 case uiWTcheckbutton:
146 XtVaSetValues(tmpvar->Wdg,
147 XmNset, (*(int *) tmpvar->Value != 0), NULL);
150 /* Not implemented yet */
159 void UiGetNextAction(helponactioncb)
160 void (*helponactioncb) (char *actionstring);
162 uiHelpOnActionCB = helponactioncb;
166 int UiAddTimeOut(timeout, callback, data)
168 void (*callback) (void *data);
171 uitimeoutcallback = callback;
173 return (int) XtAddTimeOut(timeout, uitimeouthandler, (caddr_t) data);
177 void UiDeleteTimeOut(timeoutid)
180 XtRemoveTimeOut((XtIntervalId) timeoutid);
184 int UiAddInputFD(fd, callback, data)
186 void (*callback) (void *data);
189 uifdinputcallback = callback;
191 return (int) XtAddInput(fd, XtInputReadMask | XtInputExceptMask,
192 uifdinputhandler, (caddr_t) data);
196 void UiDeleteInputFD(inputid)
199 XtRemoveInput((XtInputId) inputid);
203 void UiAddStringToCutBuffer(data)
206 static char *cutbuffer = (char *) NULL;
210 oldlen = cutbuffer ? strlen(cutbuffer) : 0;
212 cutbuffer = (char *) uiReAlloc((void *) cutbuffer,
213 oldlen + strlen(data) + 1);
214 strcpy(&cutbuffer[oldlen], data);
215 } else if (cutbuffer) {
216 XStoreBytes(XtDisplay(uiTopLevel.TopGfx.TopWdg), cutbuffer,
219 cutbuffer = (char *) NULL;
221 XStoreBytes(XtDisplay(uiTopLevel.TopGfx.TopWdg), "", 0);
225 void UiDisplayPopup(callback, topaddress, items, nitems)
226 void (*callback) (char *address, char *topaddress, char *parentaddress);
231 Widget topwdg = uiPageInfo.CurrentPage->Gfx.TopWdg;
234 Widget pmwdg, rcwdg, buttonwdg;
236 int root_x, root_y, win_x, win_y;
239 uipopupcallback = callback;
240 uipopuptopaddress = topaddress;
242 if (XQueryPointer(XtDisplay(topwdg), XtWindow(topwdg), &root, &child,
243 &root_x, &root_y, &win_x, &win_y, &mask)) {
244 args = uiVaSetArgs(&nargs,
247 XmNheight, 100, NULL);
248 pmwdg = XmCreateMenuShell(topwdg, "popupmenu", args, nargs);
250 args = uiVaSetArgs(&nargs,
251 XmNx, (Position) (root_x - 20),
252 XmNy, (Position) (root_y - 5),
255 XmNmarginHeight, 0, NULL);
256 rcwdg = XmCreateRowColumn(pmwdg, "rowcol", args, nargs);
258 args = uiVaSetArgs(&nargs,
259 XmNhighlightThickness, 0, NULL);
260 buttonwdg = XmCreatePushButtonGadget(rcwdg, items[nitems],
262 XtAddCallback(buttonwdg, XmNactivateCallback,
263 (XtCallbackProc) uipopupcb, (caddr_t) items[nitems]);
264 XtManageChild(buttonwdg);
267 XtManageChild(rcwdg);
268 XtRealizeWidget(pmwdg);
271 XGrabPointer(XtDisplay(pmwdg), XtWindow(pmwdg), TRUE, 0,
272 GrabModeAsync, GrabModeAsync, XtWindow(pmwdg),
273 uiArrowCursor, CurrentTime);
275 XFlush(XtDisplay(pmwdg));
281 uiFindAction(actionname)
284 uiAction_t *tmpaction = uiTopLevel.Actions;
287 if (!strcmp(actionname, tmpaction->Name))
290 tmpaction = tmpaction->Next;
293 return (uiAction_t *) NULL;
298 uiFindKey(keyname, modifier)
302 uiKey_t *tmpkey = uiTopLevel.Keys;
305 if (!strcmp(keyname, tmpkey->Name) && modifier == tmpkey->Modifier)
308 tmpkey = tmpkey->Next;
311 return (uiKey_t *) NULL;
316 uiFindVariable(varname)
319 uiVariable_t *tmpvar = uiTopLevel.Variables;
322 if (!strcmp(varname, tmpvar->Name))
325 tmpvar = tmpvar->Next;
328 return (uiVariable_t *) NULL;
332 int uiAddWidgetInfo(varname, wdg, wdgtype)
337 uiVariable_t *tmpvar;
339 if (tmpvar = uiFindVariable(varname)) {
341 tmpvar->WdgType = wdgtype;
349 void uiDialogActivateCB(wdg, actiondata, calldata)
351 uiActionData_t *actiondata;
352 XmAnyCallbackStruct *calldata;
354 uiAction_t *tmpaction;
356 actiondata->Page = uiPageInfo.CurrentPage;
357 uiPageInfo.Wdg = wdg;
358 uiPageInfo.CallData = (void *) calldata;
360 if (tmpaction = uiFindAction(actiondata->ActionName)) {
361 uiDefineCursor(uiBusyCursor);
362 if (uiHelpOnActionCB) {
363 (*uiHelpOnActionCB) (actiondata->ActionName);
364 uiHelpOnActionCB = (void (*) (char *actionstring)) NULL;
366 (*tmpaction->Callback) (actiondata->Page->Hierarchy->Address,
367 actiondata->Page->HText,
368 actiondata->Page->HTextObject,
369 tmpaction->Parameter);
375 void uiDialogVariableCB(wdg, varname, calldata)
378 XmAnyCallbackStruct *calldata;
380 uiVariable_t *tmpvar;
383 if (tmpvar = uiFindVariable((char *) varname)) {
384 switch (tmpvar->WdgType) {
386 tmpstr = XmTextGetString(tmpvar->Wdg);
387 switch (tmpvar->VarType) {
389 *(int *) tmpvar->Value = atoi(tmpstr);
392 *(double *) tmpvar->Value = atof(tmpstr);
395 strcpy((char *) tmpvar->Value, tmpstr);
400 /* Not implemented yet */
403 /* Not implemented yet */
405 case uiWTcheckbutton:
406 *(int *) tmpvar->Value = uiGetArg(tmpvar->Wdg, XmNset);
409 /* Not implemented yet */
416 void uiDefineCursor(cursor)
419 uiHierarchy_t *tmphierarchy = uiTopLevel.Hierarchies;
422 while (tmphierarchy) {
423 tmppage = tmphierarchy->Pages;
425 if (tmppage->Visible)
426 XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
427 XtWindow(tmppage->Gfx.TopWdg),
429 tmppage = tmppage->Next;
431 tmphierarchy = tmphierarchy->Next;
434 XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
435 XtWindow(uiTopLevel.TopGfx.TopWdg),
437 if (uiTopLevel.PageSettingsGfx.FormWdg)
438 XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
439 XtWindow(uiTopLevel.PageSettingsGfx.FormWdg),
441 if (uiTopLevel.SearchGfx.FormWdg)
442 XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
443 XtWindow(uiTopLevel.SearchGfx.FormWdg),
445 if (uiTopLevel.ListGfx.FormWdg)
446 XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
447 XtWindow(uiTopLevel.ListGfx.FormWdg),
452 void uiUndefineCursor()
454 uiHierarchy_t *tmphierarchy = uiTopLevel.Hierarchies;
457 while (tmphierarchy) {
458 tmppage = tmphierarchy->Pages;
460 if (tmppage->Visible)
461 XUndefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
462 XtWindow(tmppage->Gfx.TopWdg));
463 tmppage = tmppage->Next;
465 tmphierarchy = tmphierarchy->Next;
468 XUndefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
469 XtWindow(uiTopLevel.TopGfx.TopWdg));
470 if (uiTopLevel.PageSettingsGfx.FormWdg)
471 XUndefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
472 XtWindow(uiTopLevel.PageSettingsGfx.FormWdg));
473 if (uiTopLevel.SearchGfx.FormWdg)
474 XUndefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
475 XtWindow(uiTopLevel.SearchGfx.FormWdg));
476 if (uiTopLevel.ListGfx.FormWdg)
477 XUndefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
478 XtWindow(uiTopLevel.ListGfx.FormWdg));
483 uiVaSetArgs(int *nargs, ...)
491 va_start(pvar,nargs);
492 tmpstr = va_arg(pvar, String);
494 XtSetArg(args[(int) *nargs], tmpstr, va_arg(pvar, XtArgVal));
496 tmpstr = va_arg(pvar, String);
505 uiGetArg(wdg, resource)
511 XtSetArg(args[0], resource, (XtArgVal) 0);
512 XtGetValues(wdg, args, 1);
514 return args[0].value;
524 if (!(tmpptr = (void *) malloc(size))) {
525 uiDisplayFatal("No swap, buy a computer");
540 return uiMalloc(size);
541 else if (!(tmpptr = (void *) realloc((char *) ptr, size))) {
542 uiDisplayFatal("No swap, buy a computer");
557 void uiDisplayWarning(text)
560 (void) fprintf(stderr, "Ui-warning: %s\n", text);
564 void uiDisplayFatal(text)
567 (void) fprintf(stderr, "Ui-fatal: %s\n", text);
573 void uiWidgetPlacement(wdg, placement)
578 int root_x, root_y, win_x, win_y;
582 if (XQueryPointer(XtDisplay(wdg),
583 XtWindow(wdg), &root, &child,
584 &root_x, &root_y, &win_x, &win_y, &mask))
585 XtMoveWidget(wdg, root_x - 50, root_y - 50);
590 static void uitimeouthandler(data, id)
594 (*uitimeoutcallback) (data);
598 static void uifdinputhandler(data, fd, id)
605 (*uifdinputcallback) (data);
609 static void uipopupcb(wdg, address, calldata)
612 XmAnyCallbackStruct *calldata;
614 XtDestroyWidget(XtParent(XtParent(wdg)));
616 uipopupcallback(address, uipopuptopaddress, address);