earlybrowserreborn - Blame information for rev 2

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