First attempt at debianization
[erwise] / Ui / UiMisc.c
1 static char *rcsid = "$Id: UiMisc.c,v 1.3 1992/03/26 18:13:50 kny Exp kny $";
2
3 #include "UiIncludes.h"
4
5
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);
10
11
12 void (*uiHelpOnActionCB) (char *actionstring) =
13  (
14       void (*) (char *actionstring)) NULL;
15
16 static void (*uitimeoutcallback) (void *data);
17 static void (*uifdinputcallback) (void *data);
18
19 static XtInputId uiinputid;
20 static void (*uipopupcallback) (char *address, char *topaddress,
21                                  char *parentaddress);
22 static char *uipopuptopaddress;
23
24
25 int UiAttachCallback(actionname, callback, parameter)
26 char *actionname;
27 void (*callback) (char *address, HText_t * htext,
28                    HTextObject_t * htextobject, void *parameter);
29 void *parameter;
30 {
31     uiAction_t *tmpaction;
32
33     if (!(tmpaction = uiFindAction(actionname))) {
34         tmpaction = uiTopLevel.Actions;
35         if (!tmpaction)
36             tmpaction =
37                 uiTopLevel.Actions =
38                 (uiAction_t *) uiMalloc(sizeof(*tmpaction));
39         else {
40             while (tmpaction->Next)
41                 tmpaction = tmpaction->Next;
42             tmpaction =
43                 tmpaction->Next = (uiAction_t *) uiMalloc(sizeof(*tmpaction));
44         }
45         tmpaction->Name = strdup(actionname);
46         tmpaction->Next = (uiAction_t *) NULL;
47     }
48     tmpaction->Callback = callback;
49     tmpaction->Parameter = parameter;
50
51     return UI_OK;
52 }
53
54
55 int UiBindKey(keyname, modifier, callback, parameter)
56 char *keyname;
57 int modifier;
58 void (*callback) (char *address, HText_t * htext,
59                    HTextObject_t * htextobject, void *parameter);
60 void *parameter;
61 {
62     uiKey_t *tmpkey;
63
64     if (!(tmpkey = uiFindKey(keyname, modifier))) {
65         tmpkey = uiTopLevel.Keys;
66         if (!tmpkey)
67             tmpkey =
68                 uiTopLevel.Keys =
69                 (uiKey_t *) uiMalloc(sizeof(*tmpkey));
70         else {
71             while (tmpkey->Next)
72                 tmpkey = tmpkey->Next;
73             tmpkey =
74                 tmpkey->Next = (uiKey_t *) uiMalloc(sizeof(*tmpkey));
75         }
76         tmpkey->Name = strdup(keyname);
77         tmpkey->Next = (uiKey_t *) NULL;
78     }
79     tmpkey->Modifier = modifier;
80     tmpkey->Callback = callback;
81     tmpkey->Parameter = parameter;
82
83     return UI_OK;
84 }
85
86
87 int UiBindVariable(varname, variable, type)
88 char *varname;
89 void *variable;
90 uiVarType_t type;
91 {
92     uiVariable_t *tmpvar;
93
94     if (!(tmpvar = uiFindVariable(varname))) {
95         tmpvar = uiTopLevel.Variables;
96         if (!tmpvar)
97             tmpvar =
98                 uiTopLevel.Variables =
99                 (uiVariable_t *) uiMalloc(sizeof(*tmpvar));
100         else {
101             while (tmpvar->Next)
102                 tmpvar = tmpvar->Next;
103             tmpvar =
104                 tmpvar->Next = (uiVariable_t *) uiMalloc(sizeof(*tmpvar));
105         }
106         tmpvar->Name = strdup(varname);
107         tmpvar->Next = (uiVariable_t *) NULL;
108     }
109     tmpvar->Value = variable;
110     tmpvar->VarType = type;
111
112     return UI_OK;
113 }
114
115
116 int UiUpdateVariable(varname)
117 char *varname;
118 {
119     uiVariable_t *tmpvar;
120     char *tmpstr;
121     static char staticstr[100]; /* Is this overkill? */
122
123     tmpstr = staticstr;
124     if (tmpvar = uiFindVariable(varname)) {
125         switch (tmpvar->WdgType) {
126         case uiWTtext:
127             switch (tmpvar->VarType) {
128             case uiVTint:
129                 sprintf(staticstr, "%d", *(int *) tmpvar->Value);
130                 break;
131             case uiVTdouble:
132                 sprintf(staticstr, "%d", *(int *) tmpvar->Value);
133                 break;
134             case uiVTstring:
135                 tmpstr = (char *) tmpvar->Value;
136             }
137             XmTextSetString(tmpvar->Wdg, tmpstr);
138             break;
139         case uiWToptionmenu:
140             /* Not implemented yet */
141             break;
142         case uiWTradiobox:
143             /* Not implemented yet */
144             break;
145         case uiWTcheckbutton:
146             XtVaSetValues(tmpvar->Wdg,
147                           XmNset, (*(int *) tmpvar->Value != 0), NULL);
148             break;
149         case uiWTscale:
150             /* Not implemented yet */
151             break;
152         }
153         return UI_OK;
154     }
155     return UI_NOTFOUND;
156 }
157
158
159 void UiGetNextAction(helponactioncb)
160 void (*helponactioncb) (char *actionstring);
161 {
162     uiHelpOnActionCB = helponactioncb;
163 }
164
165
166 int UiAddTimeOut(timeout, callback, data)
167 int timeout;
168 void (*callback) (void *data);
169 void *data;
170 {
171     uitimeoutcallback = callback;
172
173     return (int) XtAddTimeOut(timeout, uitimeouthandler, (caddr_t) data);
174 }
175
176
177 void UiDeleteTimeOut(timeoutid)
178 int timeoutid;
179 {
180     XtRemoveTimeOut((XtIntervalId) timeoutid);
181 }
182
183
184 int UiAddInputFD(fd, callback, data)
185 int fd;
186 void (*callback) (void *data);
187 void *data;
188 {
189     uifdinputcallback = callback;
190
191     return (int) XtAddInput(fd, XtInputReadMask | XtInputExceptMask,
192                             uifdinputhandler, (caddr_t) data);
193 }
194
195
196 void UiDeleteInputFD(inputid)
197 int inputid;
198 {
199     XtRemoveInput((XtInputId) inputid);
200 }
201
202
203 void UiAddStringToCutBuffer(data)
204 char *data;
205 {
206     static char *cutbuffer = (char *) NULL;
207     int oldlen;
208
209     if (data) {
210         oldlen = cutbuffer ? strlen(cutbuffer) : 0;
211
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,
217                     strlen(cutbuffer));
218         uiFree(cutbuffer);
219         cutbuffer = (char *) NULL;
220     } else
221         XStoreBytes(XtDisplay(uiTopLevel.TopGfx.TopWdg), "", 0);
222 }
223
224
225 void UiDisplayPopup(callback, topaddress, items, nitems)
226 void (*callback) (char *address, char *topaddress, char *parentaddress);
227 char *topaddress;
228 char **items;
229 int nitems;
230 {
231     Widget topwdg = uiPageInfo.CurrentPage->Gfx.TopWdg;
232     ArgList args;
233     Cardinal nargs;
234     Widget pmwdg, rcwdg, buttonwdg;
235     Window root, child;
236     int root_x, root_y, win_x, win_y;
237     unsigned int mask;
238
239     uipopupcallback = callback;
240     uipopuptopaddress = topaddress;
241
242     if (XQueryPointer(XtDisplay(topwdg), XtWindow(topwdg), &root, &child,
243                       &root_x, &root_y, &win_x, &win_y, &mask)) {
244         args = uiVaSetArgs(&nargs,
245                            XmNborderWidth, 0,
246                            XmNwidth, 100,
247                            XmNheight, 100, NULL);
248         pmwdg = XmCreateMenuShell(topwdg, "popupmenu", args, nargs);
249
250         args = uiVaSetArgs(&nargs,
251                            XmNx, (Position) (root_x - 20),
252                            XmNy, (Position) (root_y - 5),
253                            XmNspacing, 0,
254                            XmNmarginWidth, 0,
255                            XmNmarginHeight, 0, NULL);
256         rcwdg = XmCreateRowColumn(pmwdg, "rowcol", args, nargs);
257         while (nitems--) {
258             args = uiVaSetArgs(&nargs,
259                                XmNhighlightThickness, 0, NULL);
260             buttonwdg = XmCreatePushButtonGadget(rcwdg, items[nitems],
261                                                  args, nargs);
262             XtAddCallback(buttonwdg, XmNactivateCallback,
263                     (XtCallbackProc) uipopupcb, (caddr_t) items[nitems]);
264             XtManageChild(buttonwdg);
265         }
266
267         XtManageChild(rcwdg);
268         XtRealizeWidget(pmwdg);
269         XtMapWidget(pmwdg);
270
271         XGrabPointer(XtDisplay(pmwdg), XtWindow(pmwdg), TRUE, 0,
272                      GrabModeAsync, GrabModeAsync, XtWindow(pmwdg),
273                      uiArrowCursor, CurrentTime);
274
275         XFlush(XtDisplay(pmwdg));
276     }
277 }
278
279
280 uiAction_t *
281  uiFindAction(actionname)
282 char *actionname;
283 {
284     uiAction_t *tmpaction = uiTopLevel.Actions;
285
286     while (tmpaction) {
287         if (!strcmp(actionname, tmpaction->Name))
288             return tmpaction;
289
290         tmpaction = tmpaction->Next;
291     }
292
293     return (uiAction_t *) NULL;
294 }
295
296
297 uiKey_t *
298  uiFindKey(keyname, modifier)
299 char *keyname;
300 int modifier;
301 {
302     uiKey_t *tmpkey = uiTopLevel.Keys;
303
304     while (tmpkey) {
305         if (!strcmp(keyname, tmpkey->Name) && modifier == tmpkey->Modifier)
306             return tmpkey;
307
308         tmpkey = tmpkey->Next;
309     }
310
311     return (uiKey_t *) NULL;
312 }
313
314
315 uiVariable_t *
316  uiFindVariable(varname)
317 char *varname;
318 {
319     uiVariable_t *tmpvar = uiTopLevel.Variables;
320
321     while (tmpvar) {
322         if (!strcmp(varname, tmpvar->Name))
323             return tmpvar;
324
325         tmpvar = tmpvar->Next;
326     }
327
328     return (uiVariable_t *) NULL;
329 }
330
331
332 int uiAddWidgetInfo(varname, wdg, wdgtype)
333 char *varname;
334 Widget wdg;
335 uiWdgType_t wdgtype;
336 {
337     uiVariable_t *tmpvar;
338
339     if (tmpvar = uiFindVariable(varname)) {
340         tmpvar->Wdg = wdg;
341         tmpvar->WdgType = wdgtype;
342
343         return UI_OK;
344     }
345     return UI_NOTFOUND;
346 }
347
348
349 void uiDialogActivateCB(wdg, actiondata, calldata)
350 Widget wdg;
351 uiActionData_t *actiondata;
352 XmAnyCallbackStruct *calldata;
353 {
354     uiAction_t *tmpaction;
355
356     actiondata->Page = uiPageInfo.CurrentPage;
357     uiPageInfo.Wdg = wdg;
358     uiPageInfo.CallData = (void *) calldata;
359
360     if (tmpaction = uiFindAction(actiondata->ActionName)) {
361         uiDefineCursor(uiBusyCursor);
362         if (uiHelpOnActionCB) {
363             (*uiHelpOnActionCB) (actiondata->ActionName);
364             uiHelpOnActionCB = (void (*) (char *actionstring)) NULL;
365         } else
366             (*tmpaction->Callback) (actiondata->Page->Hierarchy->Address,
367                                     actiondata->Page->HText,
368                                     actiondata->Page->HTextObject,
369                                     tmpaction->Parameter);
370         uiUndefineCursor();
371     }
372 }
373
374
375 void uiDialogVariableCB(wdg, varname, calldata)
376 Widget wdg;
377 caddr_t varname;
378 XmAnyCallbackStruct *calldata;
379 {
380     uiVariable_t *tmpvar;
381     char *tmpstr;
382
383     if (tmpvar = uiFindVariable((char *) varname)) {
384         switch (tmpvar->WdgType) {
385         case uiWTtext:
386             tmpstr = XmTextGetString(tmpvar->Wdg);
387             switch (tmpvar->VarType) {
388             case uiVTint:
389                 *(int *) tmpvar->Value = atoi(tmpstr);
390                 break;
391             case uiVTdouble:
392                 *(double *) tmpvar->Value = atof(tmpstr);
393                 break;
394             case uiVTstring:
395                 strcpy((char *) tmpvar->Value, tmpstr);
396             }
397             XtFree(tmpstr);
398             break;
399         case uiWToptionmenu:
400             /* Not implemented yet */
401             break;
402         case uiWTradiobox:
403             /* Not implemented yet */
404             break;
405         case uiWTcheckbutton:
406             *(int *) tmpvar->Value = uiGetArg(tmpvar->Wdg, XmNset);
407             break;
408         case uiWTscale:
409             /* Not implemented yet */
410             break;
411         }
412     }
413 }
414
415
416 void uiDefineCursor(cursor)
417 Cursor cursor;
418 {
419     uiHierarchy_t *tmphierarchy = uiTopLevel.Hierarchies;
420     uiPage_t *tmppage;
421
422     while (tmphierarchy) {
423         tmppage = tmphierarchy->Pages;
424         while (tmppage) {
425             if (tmppage->Visible)
426                 XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
427                               XtWindow(tmppage->Gfx.TopWdg),
428                               cursor);
429             tmppage = tmppage->Next;
430         }
431         tmphierarchy = tmphierarchy->Next;
432     }
433
434     XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
435                   XtWindow(uiTopLevel.TopGfx.TopWdg),
436                   cursor);
437     if (uiTopLevel.PageSettingsGfx.FormWdg)
438         XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
439                       XtWindow(uiTopLevel.PageSettingsGfx.FormWdg),
440                       cursor);
441     if (uiTopLevel.SearchGfx.FormWdg)
442         XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
443                       XtWindow(uiTopLevel.SearchGfx.FormWdg),
444                       cursor);
445     if (uiTopLevel.ListGfx.FormWdg)
446         XDefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
447                       XtWindow(uiTopLevel.ListGfx.FormWdg),
448                       cursor);
449 }
450
451
452 void uiUndefineCursor()
453 {
454     uiHierarchy_t *tmphierarchy = uiTopLevel.Hierarchies;
455     uiPage_t *tmppage;
456
457     while (tmphierarchy) {
458         tmppage = tmphierarchy->Pages;
459         while (tmppage) {
460             if (tmppage->Visible)
461                 XUndefineCursor(XtDisplay(uiTopLevel.TopGfx.TopWdg),
462                                 XtWindow(tmppage->Gfx.TopWdg));
463             tmppage = tmppage->Next;
464         }
465         tmphierarchy = tmphierarchy->Next;
466     }
467
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));
479 }
480
481
482 ArgList
483 uiVaSetArgs(int *nargs, ...)
484 {
485     static Arg args[50];
486     String tmpstr;
487     va_list pvar;
488
489     *nargs = 0;
490
491     va_start(pvar,nargs);
492     tmpstr = va_arg(pvar, String);
493     while (tmpstr) {
494         XtSetArg(args[(int) *nargs], tmpstr, va_arg(pvar, XtArgVal));
495         *nargs += 1;
496         tmpstr = va_arg(pvar, String);
497     }
498     va_end(pvar);
499
500     return args;
501 }
502
503
504 XtArgVal
505 uiGetArg(wdg, resource)
506 Widget wdg;
507 String resource;
508 {
509     Arg args[1];
510
511     XtSetArg(args[0], resource, (XtArgVal) 0);
512 /*    XtGetValues(wdg, args, 1); Toni */
513
514     return args[0].value;
515 }
516
517
518 void *
519  uiMalloc(size)
520 int size;
521 {
522     void *tmpptr;
523
524     if (!(tmpptr = (void *) malloc(size))) {
525         uiDisplayFatal("No swap, buy a computer");
526         exit(1);
527     }                           /* Not reached */
528     return tmpptr;
529 }
530
531
532 void *
533  uiReAlloc(ptr, size)
534 void *ptr;
535 int size;
536 {
537     void *tmpptr;
538
539     if (!ptr)
540         return uiMalloc(size);
541     else if (!(tmpptr = (void *) realloc((char *) ptr, size))) {
542         uiDisplayFatal("No swap, buy a computer");
543         exit(1);
544     }                           /* Not reached */
545     return tmpptr;
546 }
547
548
549 void uiFree(ptr)
550 void *ptr;
551 {
552     if (ptr)
553         free(ptr);
554 }
555
556
557 void uiDisplayWarning(text)
558 char *text;
559 {
560     (void) fprintf(stderr, "Ui-warning: %s\n", text);
561 }
562
563
564 void uiDisplayFatal(text)
565 char *text;
566 {
567     (void) fprintf(stderr, "Ui-fatal: %s\n", text);
568
569     abort();
570 }
571
572
573 void uiWidgetPlacement(wdg, placement)
574 Widget wdg;
575 int placement;
576 {
577     Window root, child;
578     int root_x, root_y, win_x, win_y;
579     unsigned int mask;
580
581     if (placement) {
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);
586     }
587 }
588
589
590 static void uitimeouthandler(data, id)
591 XtPointer data;
592 XtIntervalId *id;
593 {
594     (*uitimeoutcallback) (data);
595 }
596
597
598 static void uifdinputhandler(data, fd, id)
599 XtPointer data;
600 int *fd;
601 XtInputId *id;
602 {
603     uiinputid = *id;
604
605     (*uifdinputcallback) (data);
606 }
607
608
609 static void uipopupcb(wdg, address, calldata)
610 Widget wdg;
611 char *address;
612 XmAnyCallbackStruct *calldata;
613 {
614     XtDestroyWidget(XtParent(XtParent(wdg)));
615
616     uipopupcallback(address, uipopuptopaddress, address);
617 }