earlybrowserreborn - Blame information for rev 1

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"
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(nargs, va_alist)
484 int *nargs;
485 va_dcl
486 {
487     static Arg args[50];
488     String tmpstr;
489     va_list pvar;
490  
491     *nargs = 0;
492  
493     va_start(pvar);
494     tmpstr = va_arg(pvar, String);
495     while (tmpstr) {
496         XtSetArg(args[(int) *nargs], tmpstr, va_arg(pvar, XtArgVal));
497         *nargs += 1;
498         tmpstr = va_arg(pvar, String);
499     }
500     va_end(pvar);
501  
502     return args;
503 }
504  
505  
506 XtArgVal
507 uiGetArg(wdg, resource)
508 Widget wdg;
509 String resource;
510 {
511     Arg args[1];
512  
513     XtSetArg(args[0], resource, (XtArgVal) 0);
514     XtGetValues(wdg, args, 1);
515  
516     return args[0].value;
517 }
518  
519  
520 void *
521  uiMalloc(size)
522 int size;
523 {
524     void *tmpptr;
525  
526     if (!(tmpptr = (void *) malloc(size))) {
527         uiDisplayFatal("No swap, buy a computer");
528         exit(1);
529     }                           /* Not reached */
530     return tmpptr;
531 }
532  
533  
534 void *
535  uiReAlloc(ptr, size)
536 void *ptr;
537 int size;
538 {
539     void *tmpptr;
540  
541     if (!ptr)
542         return uiMalloc(size);
543     else if (!(tmpptr = (void *) realloc((char *) ptr, size))) {
544         uiDisplayFatal("No swap, buy a computer");
545         exit(1);
546     }                           /* Not reached */
547     return tmpptr;
548 }
549  
550  
551 void uiFree(ptr)
552 void *ptr;
553 {
554     if (ptr)
555         free(ptr);
556 }
557  
558  
559 void uiDisplayWarning(text)
560 char *text;
561 {
562     (void) fprintf(stderr, "Ui-warning: %s\n", text);
563 }
564  
565  
566 void uiDisplayFatal(text)
567 char *text;
568 {
569     (void) fprintf(stderr, "Ui-fatal: %s\n", text);
570  
571     abort();
572 }
573  
574  
575 void uiWidgetPlacement(wdg, placement)
576 Widget wdg;
577 int placement;
578 {
579     Window root, child;
580     int root_x, root_y, win_x, win_y;
581     unsigned int mask;
582  
583     if (placement) {
584         if (XQueryPointer(XtDisplay(wdg),
585                           XtWindow(wdg), &root, &child,
586                           &root_x, &root_y, &win_x, &win_y, &mask))
587             XtMoveWidget(wdg, root_x - 50, root_y - 50);
588     }
589 }
590  
591  
592 static void uitimeouthandler(data, id)
593 XtPointer data;
594 XtIntervalId *id;
595 {
596     (*uitimeoutcallback) (data);
597 }
598  
599  
600 static void uifdinputhandler(data, fd, id)
601 XtPointer data;
602 int *fd;
603 XtInputId *id;
604 {
605     uiinputid = *id;
606  
607     (*uifdinputcallback) (data);
608 }
609  
610  
611 static void uipopupcb(wdg, address, calldata)
612 Widget wdg;
613 char *address;
614 XmAnyCallbackStruct *calldata;
615 {
616     XtDestroyWidget(XtParent(XtParent(wdg)));
617  
618     uipopupcallback(address, uipopuptopaddress, address);
619 }