dtcm: Coverity 88353
[oweals/cde.git] / cde / programs / dtstyle / Main.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these libraries and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /*****************************************************************************
24  **
25  **   File:        Main.c
26  **
27  **   Project:     DT 3.0
28  **
29  **   Description: main Dtstyle program
30  **
31  **
32  ****************************************************************************
33  ************************************<+>*************************************/
34 /*$TOG: Main.c /main/16 1998/07/30 12:32:34 mgreess $*/
35 /* 
36  * (c) Copyright 1997, The Open Group 
37  */
38 /*
39  * (c) Copyright 1996 Digital Equipment Corporation.
40  * (c) Copyright 1990, 1993, 1996 Hewlett-Packard Company.
41  * (c) Copyright 1996 International Business Machines Corp.
42  * (c) Copyright 1996 Sun Microsystems, Inc.
43  * (c) Copyright 1996 Novell, Inc. 
44  * (c) Copyright 1996 FUJITSU LIMITED.
45  * (c) Copyright 1996 Hitachi.
46  */
47
48 /*+++++++++++++++++++++++++++++++++++++++*/
49 /* include files                         */
50 /*+++++++++++++++++++++++++++++++++++++++*/
51
52 #include "signal.h"
53 #ifdef TIME
54 # include <time.h>
55 #endif
56 #ifndef NO_MESSAGE_CATALOG
57 # include <nl_types.h>
58 # define TRUE 1
59 # define FALSE 0
60 #endif
61 #include <locale.h>
62
63 /* #include <sys/dir.h> */
64 #include <X11/Xlib.h>
65 #include <Xm/MwmUtil.h>
66
67 #include <Xm/Xm.h>
68 #include <Xm/XmP.h>
69 #include <Xm/MessageB.h>
70
71 #include <Dt/GetDispRes.h>
72 #include <Dt/EnvControlP.h>
73 #include <Dt/Message.h>
74 #include <Dt/SessionM.h>
75 #include <Dt/UserMsg.h>
76 #include <Dt/Wsm.h>
77 #include <Dt/DtNlUtils.h>
78 #include <Dt/DtosP.h>
79
80 #include "MainWin.h"
81 #include "ColorMain.h"
82 #include "ColorFile.h"
83 #include "Resource.h"
84 #include "Protocol.h"
85
86 /*+++++++++++++++++++++++++++++++++++++++*/
87 /* include extern functions              */
88 /*+++++++++++++++++++++++++++++++++++++++*/
89 #include "Main.h"
90
91 /*+++++++++++++++++++++++++++++++++++++++*/
92 /* Local #defines                        */
93 /*+++++++++++++++++++++++++++++++++++++++*/
94 #define STYLE_LOCK "STYLE_LOCK"
95 #define SYS_FILE_SEARCH_PATH "DTPMSYSFILESEARCHPATH"
96 #define MAX_STR_LEN 128
97
98 /*+++++++++++++++++++++++++++++++++++++++*/
99 /* Internal Functions                    */
100 /*+++++++++++++++++++++++++++++++++++++++*/
101
102
103 static int ErrorHandler(
104                         Display *disp,
105                         XErrorEvent *event ) ;
106 static int IOErrorHandler(
107                         Display *disp ) ;
108
109 static void ToolkitErrorHandler(
110                         char *message) ;
111 static void errParentMap( 
112                         Widget w,
113                         XtPointer client_data,
114                         XEvent *event) ;
115 static void UnmanageCB( 
116                         Widget w,
117                         XtPointer client_data,
118                         XtPointer call_data) ;
119 static void DestroyCB( 
120                         Widget w,
121                         XtPointer client_data,
122                         XtPointer call_data) ;
123 static Boolean NewCreateD( XtPointer shell) ;
124 static Boolean NewAddTo( XtPointer shell) ;
125 static Boolean NewCreateTop1( XtPointer shell) ;
126 static Boolean NewCreateTop2( XtPointer shell) ;
127 static Boolean NewAddSysPath( XtPointer shell) ;
128 static Boolean NewAddDirectories( XtPointer shell) ;
129 static Boolean NewAddHomePath( XtPointer shell) ;
130 static Boolean NewReadPal( XtPointer shell) ;
131 static Boolean NewInitPal( XtPointer shell) ;
132 static Boolean NewAllocColor( XtPointer shell) ;
133 static Boolean NewBottomColor( XtPointer shell) ;
134 static Boolean NewCreateButtons( XtPointer shell) ;
135
136 extern void WaitChildDeath(void);
137
138 /*++++++++++++++++++++++++++++++++++++++*/
139 /* Internal Variables                   */
140 /*++++++++++++++++++++++++++++++++++++++*/
141 static XrmOptionDescRec option_list[] =
142 {
143    {  "-session",  "session",    XrmoptionSepArg,  NULL  },
144 };
145
146 /*++++++++++++++++++++++++++++++++++++++*/
147 /* Global Variables                     */
148 /*++++++++++++++++++++++++++++++++++++++*/
149 Style style;
150 char  *progName;
151
152 /*+++++++++++++++++++++++++++++++++++++++++++*/
153 /*Misc functions all the dialogs use         */
154 /*+++++++++++++++++++++++++++++++++++++++++++*/
155
156 /*+++++++++++++++++++++++++++++++++++++++++++*/
157 /* raise a dialog window above peer dialogs  */
158 /* Needs the SHELL of the dialog, not the    */
159 /* dialog box.                               */
160 /*+++++++++++++++++++++++++++++++++++++++++++*/
161 void 
162 raiseWindow(
163         Window dialogWin )
164 {
165   static int changeMask = CWStackMode;
166   static XWindowChanges windowChanges = {0,0,0,0,0,0,Above};
167
168     XReconfigureWMWindow(style.display, dialogWin,
169       style.screenNum, changeMask, &windowChanges);
170 }
171
172
173 /************************************************************************
174  * CenterMsgCB 
175  *    - to be used with message dialogs (assumptions are being made that 
176  *      parent is dialog shell, and child is bb, due to Xm hacks for them)
177  *      (eg. it sets bb x,y to 0,0 and parents x,y to x,y set for bb)
178  *    - parent for positioning only (may not be real parent)
179  *    - use client_data for parent... if NULL, use style.errParent if ok,
180  *    - or main style.shell (makes this routine more generally usefull)
181  *
182  ************************************************************************/
183 void 
184 CenterMsgCB(
185         Widget w,
186         XtPointer client_data,
187         XtPointer call_data )
188 {
189     int n;
190     Position newX, newY;
191     Arg args[4];
192     Widget   shell;
193
194     /* figure out what to use as "visual" parent */
195     shell = (Widget)client_data;
196     if (shell == NULL)
197     {
198         if (!style.errParent || !XtParent(style.errParent) || 
199             !XtIsManaged(style.errParent))
200             shell = style.shell;
201         else
202             shell = XtParent(style.errParent);
203     }
204     else
205         shell = XtParent(shell);
206
207     /* calculate new x,y to be centered in visualParent */
208     newX = XtX(shell) + XtWidth(shell)/2 - XtWidth(w)/2;
209     newY = XtY(shell) + XtHeight(shell)/2 - XtHeight(w)/2;
210
211     if (newX < 0) newX = 0;
212     if (newY < 0) newY = 0;
213
214     n = 0;
215     XtSetArg(args[n], XmNx, newX); n++;
216     XtSetArg(args[n], XmNy, newY); n++;
217     XtSetValues(w, args, n);
218 }
219
220
221 /*************************************************************/
222 /* ErrDialog                                                 */
223 /* Put up an error dialog and block until the user clicks OK */
224 /* by default, there is no cancel or help button, but the    */
225 /* dialog is created with autoUnmanage false, and ok/cancel  */
226 /* callbacks to do the unmanage, so that a help button can   */
227 /* be used                                                   */
228 /*************************************************************/
229 void 
230 ErrDialog(
231         char *errString,
232         Widget visualParent )
233 {
234     int           n;
235     Arg           args[10];
236     XmString      ok;
237
238     /* create the compound string */
239     style.tmpXmStr = CMPSTR(errString);
240
241     style.errParent = visualParent;
242
243     if (style.errDialog == NULL)     /* create it */
244     {
245         ok = XmStringCreateLocalized((String) _DtOkString);
246
247         n = 0;
248         XtSetArg(args[n], XmNokLabelString, ok); n++;
249         XtSetArg(args[n], XmNmessageString, style.tmpXmStr);                n++;
250         XtSetArg(args[n], XmNmwmFunctions, DIALOG_MWM_FUNC);                n++;
251         XtSetArg (args[n], XmNautoUnmanage, False);                         n++;
252         XtSetArg (args[n], XmNdefaultPosition, False);                      n++;
253         style.errDialog = XmCreateErrorDialog(style.shell,"ErrorNotice",args,n);
254
255         XtAddCallback (style.errDialog, XmNokCallback, UnmanageCB, NULL);
256         XtAddCallback (style.errDialog, XmNcancelCallback, UnmanageCB, NULL);
257         XtAddCallback (style.errDialog, XmNmapCallback, CenterMsgCB, NULL);
258         XtUnmanageChild ( XmMessageBoxGetChild (style.errDialog,
259                                                 XmDIALOG_CANCEL_BUTTON));
260         XtUnmanageChild ( XmMessageBoxGetChild (style.errDialog,
261                                                 XmDIALOG_HELP_BUTTON));
262
263         /* set the dialog shell parent title */
264         n=0;
265         XtSetArg (args[n], XmNmwmInputMode,
266                         MWM_INPUT_PRIMARY_APPLICATION_MODAL); n++;
267         XtSetArg (args[n], XmNuseAsyncGeometry, True); n++;
268         XtSetArg (args[n], XmNtitle, ((char *)GETMESSAGE(2, 3, "Error")));   n++;
269         XtSetValues (XtParent(style.errDialog), args, n);
270     }
271     else                 /* change the string */
272     {
273         n = 0;
274         XtSetArg(args[n], XmNmessageString, style.tmpXmStr); n++;
275         XtSetValues (style.errDialog, args, n);
276     }
277
278     /* free the compound string */
279     XmStringFree (style.tmpXmStr);
280
281     if (XtIsManaged(style.errParent) || XtParent(style.errParent) == NULL)
282     {
283         XtManageChild(style.errDialog);
284         /* ring the bell (PM behavior) */
285         XBell(style.display, 0);
286     }
287     else
288     {
289         XtAddEventHandler(XtParent(style.errParent), StructureNotifyMask, 0,
290                           (XtEventHandler)errParentMap, NULL);
291     }
292
293 }
294
295
296
297 static void 
298 errParentMap(
299         Widget w,
300         XtPointer client_data,
301         XEvent *event )
302 {
303     if (event->type == MapNotify)
304     {
305         XtManageChild(style.errDialog);
306         /* ring the bell (PM behavior) */
307         XBell(style.display, 0);
308         XtRemoveEventHandler(XtParent(style.errParent), StructureNotifyMask,
309                              0, (XtEventHandler)errParentMap, NULL);
310     }
311 }
312
313 /*********************************************************/
314 /* InfoDialog                                            */
315 /* Put up a modeless info dialog.                        */
316 /* There is no cancel or help button.                    */
317 /* Dialog is created with autoUnmanage true.             */
318 /* An ok callback is added which will destroy the dialog */
319 /* and optionally unmap the parent.                      */
320 /*********************************************************/
321 void
322 InfoDialog(
323         char *infoString,
324         Widget parent,
325         Boolean unmapParent )
326 {
327     int             n;
328     Arg             args[10];
329     static XmString ok = NULL;
330     Widget          w;
331
332     /* create the compound string */
333     style.tmpXmStr = CMPSTR(infoString);
334
335     if (ok == NULL)
336         ok = CMPSTR((String) _DtOkString);
337
338     /* create it */
339     n = 0;
340     XtSetArg(args[n], XmNokLabelString, ok);                            n++;
341     XtSetArg(args[n], XmNmessageString, style.tmpXmStr);                n++;
342     XtSetArg(args[n], XmNdialogStyle, XmDIALOG_MODELESS);               n++;
343     XtSetArg(args[n], XmNmwmFunctions, DIALOG_MWM_FUNC);                n++;
344     w = XmCreateInformationDialog(parent, "Notice", args, n);
345
346     if (unmapParent)
347         XtAddCallback (w, XmNokCallback, DestroyCB, parent);
348     else
349         XtAddCallback (w, XmNokCallback, DestroyCB, NULL);
350     XtUnmanageChild ( XmMessageBoxGetChild(w, XmDIALOG_CANCEL_BUTTON) );
351     XtUnmanageChild ( XmMessageBoxGetChild(w, XmDIALOG_HELP_BUTTON) );
352
353     /* set the dialog shell parent title */
354     n=0;
355     XtSetArg (args[n], XmNuseAsyncGeometry, True); n++;
356     XtSetArg (args[n], XmNtitle, ((char *)GETMESSAGE(2, 2, "Notice")));   n++;
357     XtSetValues (XtParent(w), args, n);
358
359     /* free the compound string */
360     XmStringFree (style.tmpXmStr);
361
362     /* manage the info dialog */
363     XtManageChild(w);
364
365 }
366
367
368 /*++++++++++++++++++++++++++++++++++++++*/
369 /* UnmanageCB                           */
370 /*++++++++++++++++++++++++++++++++++++++*/
371 static void 
372 UnmanageCB(
373         Widget w,
374         XtPointer client_data,
375         XtPointer call_data )
376 {
377   XtUnmanageChild(w);
378 }
379
380
381 /*++++++++++++++++++++++++++++++++++++++*/
382 /* DestroyCB                            */
383 /*++++++++++++++++++++++++++++++++++++++*/
384 static void 
385 DestroyCB(
386         Widget w,
387         XtPointer client_data,
388         XtPointer call_data )
389 {
390   XtDestroyWidget(XtParent(w));
391   if (client_data != NULL)
392       XtUnmanageChild((Widget)client_data); 
393 }
394
395
396 /**********************************************************/
397 /* putDialog                                              */
398 /* move a dialog up so it isn't covering the main window  */
399 /* Or down if there is no room up.                        */
400 /* note: "parent" needs to have valid x,y information...  */
401 /*       ex: a child of dialog shell doesn't, its parent  */
402 /*       does, so the parent shell would be passed in     */
403 /**********************************************************/
404 void 
405 putDialog(
406         Widget parent,
407         Widget dialog )
408 {
409   int n;
410   Position newX, newY, pY, pX;
411   Dimension pHeight, myHeight, pWidth, myWidth;
412   Arg args[4];
413
414     pX = XtX(parent);
415     pY = XtY(parent);
416     pHeight = XtHeight(parent);
417     pWidth = XtWidth(parent);
418     myHeight = XtHeight(dialog);
419     myWidth = XtWidth(dialog);
420
421     if ((newY = pY - myHeight +5) < 0) 
422         newY = pY + pHeight;
423     newX = pX + pWidth/2 - myWidth/2;
424
425     n = 0;
426     XtSetArg(args[n], XmNx, newX); n++;
427     XtSetArg(args[n], XmNy, newY); n++;
428     XtSetValues(dialog,args,n);
429
430 #ifdef PutDDEBUG
431   printf("newX, newY, pY, pX;\n");
432   printf("%d    %d    %d  %d\n",newX, newY, pY, pX);
433   printf("pHeight, myHeight, pWidth, myWidth;\n");
434   printf("%d       %d        %d      %d\n", pHeight, myHeight, pWidth, myWidth);
435 #endif
436 }
437
438
439 /*++++++++++++++++++++++++++++++++++++++*/
440 /* main                                 */
441 /*++++++++++++++++++++++++++++++++++++++*/
442 int 
443 main(
444         int argc,
445         char **argv )
446 {
447     int             n;
448     Arg             args[MAX_ARGS];
449     XEvent          event;
450     XPropertyEvent *pEvent=(XPropertyEvent *)&event;
451     long            mwmFunc;
452     Boolean         useMaskRtn, useIconFileCacheRtn;    
453     char           *dirs = NULL;
454     char           *string;
455         Visual         *visual;
456
457 #ifdef USERHELP
458 malloc_check(1);
459 malloc_trace(0);
460 #endif
461
462     XtSetLanguageProc(NULL, NULL, NULL);
463     _DtEnvControl(DT_ENV_SET); 
464     
465
466     /* Initialize the toolkit and open the display */
467     style.shell = 
468         XtInitialize(argv[0], XMCLASS, option_list, 1, (int *)&argc, argv);
469
470     /* Allow all WS manipulation functions except resize and maximize */
471     mwmFunc = MWM_FUNC_ALL ^ (MWM_FUNC_RESIZE | MWM_FUNC_MAXIMIZE); 
472
473     n = 0;
474     XtSetArg(args[n], XmNmwmFunctions, mwmFunc); n++;
475     XtSetArg(args[n], XmNuseAsyncGeometry, True); n++;
476     XtSetValues(style.shell, args, n);
477
478     /* initialize global style data */
479
480     style.display    = XtDisplay(style.shell);
481     style.screen     = DefaultScreenOfDisplay(style.display);
482     style.screenNum  = DefaultScreen(style.display);
483     style.colormap   = DefaultColormap(style.display, style.screenNum);
484     style.root       = DefaultRootWindow(style.display);
485     style.execName   = argv[0];
486     style.errDialog  = NULL;
487     style.tmpXmStr   = NULL;
488     style.home = (char *) XtMalloc(strlen((char *) getenv("HOME")) + 1);
489     strcpy(style.home, (char *) getenv("HOME"));
490     style.colorDialog = NULL;
491     style.backdropDialog = NULL;
492     style.fontDialog = NULL;
493     style.kbdDialog = NULL;
494     style.mouseDialog = NULL;
495     style.audioDialog = NULL;
496     style.screenDialog = NULL;
497     style.startupDialog = NULL;
498     style.dtwmDialog = NULL;
499     style.i18nDialog = NULL;
500         visual = XDefaultVisual(style.display,style.screenNum);
501         style.visualClass = visual->class;
502     
503     if (progName = DtStrrchr(argv[0], '/')) progName++;
504     else progName = argv[0];
505
506     /* Get the lock established to ensure only one dtstyle process
507      * is running per screen .. first malloc enough space*/
508
509     if (_DtGetLock (style.display, STYLE_LOCK) == 0)
510     {
511         _DtSimpleError (progName, DtError, NULL, "%s",
512              ((char *)GETMESSAGE(2, 5, "Style Manager is already running, second attempt aborted.")));
513         exit(1);
514     }
515
516     InitDtstyleProtocol();
517     SetWindowProperties();
518
519     /* Register error handlers */
520     XSetErrorHandler(ErrorHandler);
521     XSetIOErrorHandler(IOErrorHandler);
522     XtAppSetErrorHandler(XtWidgetToApplicationContext(style.shell),
523                          ToolkitErrorHandler);
524     XtAddEventHandler(style.shell, StructureNotifyMask, 0,
525                          (XtEventHandler)MwmReparentNotify, NULL);
526
527     /* set up resolution dependent layout variables */
528     switch (_DtGetDisplayResolution(style.display, style.screenNum))
529     {
530         case LOW_RES_DISPLAY:
531             style.horizontalSpacing = 
532             style.verticalSpacing = 3;
533             break;
534             
535         case MED_RES_DISPLAY:
536             style.horizontalSpacing = 
537             style.verticalSpacing = 5;
538             break;
539             
540         case HIGH_RES_DISPLAY:
541             style.horizontalSpacing = 
542             style.verticalSpacing = 8;
543             break;
544     }
545     
546     GetApplicationResources();
547     
548     XmeGetIconControlInfo(style.screen, &useMaskRtn,
549                           &style.useMultiColorIcons, &useIconFileCacheRtn);
550     
551     
552     /* add the directory $HOME/.dt/backdrops */
553     
554     string = (char *)XtMalloc(strlen(style.home) + strlen("/.dt/backdrops:") + 1);
555     sprintf(string, "%s/.dt/backdrops:", style.home);
556
557     dirs = (char *)XtCalloc(1, strlen("/etc/dt/backdrops:/usr/dt/backdrops") + 
558                             (style.xrdb.backdropDir == NULL ? 2 :
559                             strlen(style.xrdb.backdropDir)) + 
560                             strlen(string) + 2);
561   
562
563     strcpy(dirs, string);
564     if (style.xrdb.backdropDir) 
565       {
566         strcat(dirs, style.xrdb.backdropDir);
567         strcat(dirs, ":"); 
568       }
569     strcat(dirs, "/etc/dt/backdrops:/usr/dt/backdrops");
570
571     _DtWsmSetBackdropSearchPath(style.screen, dirs, style.useMultiColorIcons);
572
573     XtFree((char *)string);
574     
575     XtFree((char *)dirs);
576     
577     
578
579     style.count = 0;
580     /* if this is started from save session we need to set up the BMS
581        first, otherwise do it after making the window. (for user perception
582        for how long it takes for the dtstyle to come up) */
583     if(style.xrdb.session != NULL) {
584       DtInitialize (style.display, style.shell, progName, progName);
585       /*Restore a session or build and display the main Window.*/
586       if(!restoreSession(style.shell,style.xrdb.session))
587         init_mainWindow(style.shell);
588     }
589     else {
590       init_mainWindow(style.shell);
591       DtInitialize (style.display, style.shell, progName, progName);
592       InitializeAtoms();
593       CheckMonitor(style.shell);
594       GetDefaultPal(style.shell);
595     }
596     
597     signal(SIGINT,(void (*)())activateCB_exitBtn); 
598     signal(SIGTERM,(void (*)())activateCB_exitBtn); 
599
600     /* to avoid defunct screen saver processes */    
601     signal(SIGCHLD, (void (*)())WaitChildDeath);
602
603     /* backdrop dialog  needs to know when the workspace changes to recolor 
604        the bitmap displayed in the dialog */
605     ListenForWorkspaceChange();
606
607     /* if using COLOR builtin, style.workProcs is True */
608
609     if ((XmeUseColorObj() != FALSE) && style.workProcs)
610
611         XtAppAddWorkProc(XtWidgetToApplicationContext(style.shell), 
612                         NewCreateD, style.shell);
613
614     XtAppMainLoop(XtWidgetToApplicationContext(style.shell));
615
616     return 0;
617 }
618
619 /************************************************************************
620  *
621  *  ErrorHandler
622  *
623  ************************************************************************/
624 static int
625 ErrorHandler(
626         Display *disp,
627         XErrorEvent *event )
628
629 {
630   #define _DTSTYLE_BUFSIZE 1024
631   char errmsg[_DTSTYLE_BUFSIZE];
632
633   _DtPrintDefaultErrorSafe(disp, event, errmsg, _DTSTYLE_BUFSIZE);
634   _DtSimpleError(progName, DtWarning, NULL, errmsg, NULL);
635
636    /* We do not want to exit here lets try to continue... */
637   return 1;
638 }
639
640
641 /************************************************************************
642  *
643  *  IOErrorHandler
644  *
645  ************************************************************************/
646 static int
647 IOErrorHandler (Display *display)
648 {
649 #ifdef DEBUG
650     Warning ("X IO error occurred during generic operation");
651 #endif /* DEBUG */
652
653     exit (1);
654     return 1;
655
656
657
658
659 /************************************************************************
660  *
661  *  ToolkitErrorHandler
662  * 
663  *  All Xt memory allocation errors should fall through to this routine.
664  *  There is no need to check for Xtmalloc errors where they are used.
665  *
666  ************************************************************************/
667 static void
668 ToolkitErrorHandler(
669         char *message )
670
671 {
672     _DtSimpleError (progName, DtError, NULL, 
673         GETMESSAGE(2, 6, "An X Toolkit error occurred... Exiting.\n"));
674     exit (1);
675 }
676
677
678 static Boolean 
679 NewCreateD(
680         XtPointer shell )
681 {
682 #ifdef TIME
683     struct timeval first, second, lapsed;
684     struct timezone tzp;
685
686     gettimeofday(&first, &tzp);
687 #endif
688
689     /*  Create the Dialog Box Dialog */
690     CreateDialogBoxD((Widget)shell);
691
692 #ifdef TIME
693     gettimeofday(&second, &tzp);
694     if(first.tv_usec > second.tv_usec){
695        second.tv_usec += 1000000;
696        second.tv_sec--;
697     }
698     printf("CreateDialogBoxD elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
699 #endif
700
701     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddTo, shell);
702
703     return(True);
704 }
705
706 static Boolean 
707 NewAddTo(
708         XtPointer shell )
709 {
710 #ifdef TIME
711     struct timeval first, second, lapsed;
712     struct timezone tzp;
713
714     gettimeofday(&first, &tzp);
715 #endif
716
717     /*  Create the Dialog Box Dialog */
718     AddToDialogBox();
719
720 #ifdef TIME
721     gettimeofday(&second, &tzp);
722     if(first.tv_usec > second.tv_usec){
723        second.tv_usec += 1000000;
724        second.tv_sec--;
725     }
726     printf("AddToDialogBox elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
727 #endif
728
729     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewCreateTop1, shell);
730
731     return(True);
732 }
733
734 static Boolean 
735 NewCreateTop1(
736         XtPointer shell )
737 {
738 #ifdef TIME
739     struct timeval first, second, lapsed;
740     struct timezone tzp;
741
742     gettimeofday(&first, &tzp);
743 #endif
744
745     /* Create the top portion of the color dialog */
746     CreateTopColor1();
747
748 #ifdef TIME
749     gettimeofday(&second, &tzp);
750     if(first.tv_usec > second.tv_usec){
751        second.tv_usec += 1000000;
752        second.tv_sec--;
753     }
754     printf("CreateTopColor1 elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
755 #endif
756
757     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewCreateTop2, shell);
758     return(True);
759 }
760
761 static Boolean 
762 NewCreateTop2(
763         XtPointer shell )
764 {
765 #ifdef TIME
766     struct timeval first, second, lapsed;
767     struct timezone tzp;
768
769     gettimeofday(&first, &tzp);
770 #endif
771
772     /* Create the top portion of the color dialog */
773     CreateTopColor2();
774
775 #ifdef TIME
776     gettimeofday(&second, &tzp);
777     if(first.tv_usec > second.tv_usec){
778        second.tv_usec += 1000000;
779        second.tv_sec--;
780     }
781     printf("CreateTopColor2 elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
782 #endif
783
784     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddSysPath, shell);
785
786     return(True);
787 }
788
789 static Boolean 
790 NewAddSysPath(
791         XtPointer shell )
792 {
793 #ifdef TIME
794     struct timeval first, second, lapsed;
795     struct timezone tzp;
796
797     gettimeofday(&first, &tzp);
798 #endif
799
800     /* initialize the system directory */
801     AddSystemPath();
802
803 #ifdef TIME
804     gettimeofday(&second, &tzp);
805     if(first.tv_usec > second.tv_usec){
806        second.tv_usec += 1000000;
807        second.tv_sec--;
808     }
809     printf("AddSystemPath elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
810 #endif
811
812     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddDirectories, shell);
813
814     return(True);
815 }
816
817 static Boolean 
818 NewAddDirectories(
819         XtPointer shell )
820 {
821 #ifdef TIME
822     struct timeval first, second, lapsed;
823     struct timezone tzp;
824
825     gettimeofday(&first, &tzp);
826 #endif
827
828     /* initialize the directorys list in the resource */
829     if(style.xrdb.paletteDir != NULL)
830       AddDirectories(style.xrdb.paletteDir);
831     else
832       style.count++;
833
834 #ifdef TIME
835     gettimeofday(&second, &tzp);
836     if(first.tv_usec > second.tv_usec){
837        second.tv_usec += 1000000;
838        second.tv_sec--;
839     }
840     printf("AddDirectories elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
841 #endif
842
843     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddHomePath, shell);
844
845     return(True);
846 }
847
848 static Boolean 
849 NewAddHomePath(
850         XtPointer shell )
851 {
852 #ifdef TIME
853     struct timeval first, second, lapsed;
854     struct timezone tzp;
855
856     gettimeofday(&first, &tzp);
857 #endif
858
859     /* initialize the home directory */
860     AddHomePath();
861
862 #ifdef TIME
863     gettimeofday(&second, &tzp);
864     if(first.tv_usec > second.tv_usec){
865        second.tv_usec += 1000000;
866        second.tv_sec--;
867     }
868     printf("AddHomePath elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
869 #endif
870
871     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewReadPal, shell);
872
873     return(True);
874 }
875
876 static Boolean 
877 NewReadPal(
878         XtPointer shell )
879 {
880 #ifdef TIME
881     struct timeval first, second, lapsed;
882     struct timezone tzp;
883
884     gettimeofday(&first, &tzp);
885 #endif
886
887     /* Read in the palettes one at a time */
888     if (ReadPaletteLoop(True)) {
889
890 #ifdef TIME
891        gettimeofday(&second, &tzp);
892        if(first.tv_usec > second.tv_usec){
893           second.tv_usec += 1000000;
894           second.tv_sec--;
895        }
896        printf("ReadPaletteLoop DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
897 #endif
898
899     /* Stop work procs if no palettes found - fatal color error.
900      * When the color button is pressed, the regular processing
901      * will pick up on NumOfPalettes == 0 and post an error
902      * dialog */
903      
904        if (NumOfPalettes == 0)
905             return(True);
906        loadDatabase();
907        XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewInitPal, shell);
908        return(True);
909     }
910
911 #ifdef TIME
912     gettimeofday(&second, &tzp);
913     if(first.tv_usec > second.tv_usec){
914        second.tv_usec += 1000000;
915        second.tv_sec--;
916     }
917     printf("ReadPaletteLoop NOT DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
918 #endif
919       
920     return(False);
921
922 }
923
924 static Boolean 
925 NewInitPal(
926         XtPointer shell )
927 {
928 #ifdef TIME
929     struct timeval first, second, lapsed;
930     struct timezone tzp;
931
932     gettimeofday(&first, &tzp);
933 #endif
934
935     /* initialize the palette list */
936     if(InitializePaletteList((Widget)shell, paletteList, True)) {
937
938 #ifdef TIME
939        gettimeofday(&second, &tzp);
940        if(first.tv_usec > second.tv_usec){
941           second.tv_usec += 1000000;
942           second.tv_sec--;
943        }
944        printf("InitializePaletteList DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
945 #endif
946
947        XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAllocColor, shell);
948        return(True);
949      }
950
951 #ifdef TIME
952     gettimeofday(&second, &tzp);
953     if(first.tv_usec > second.tv_usec){
954        second.tv_usec += 1000000;
955        second.tv_sec--;
956     }
957     printf("InitializePaletteList NOT DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
958 #endif
959
960     return(False);
961 }
962
963 static Boolean 
964 NewAllocColor(
965         XtPointer shell )
966 {
967 #ifdef TIME
968     struct timeval first, second, lapsed;
969     struct timezone tzp;
970
971     gettimeofday(&first, &tzp);
972 #endif
973
974     /* initialize pixels to the right color */
975     AllocatePaletteCells((Widget)shell);
976
977 #ifdef TIME
978     gettimeofday(&second, &tzp);
979     if(first.tv_usec > second.tv_usec){
980        second.tv_usec += 1000000;
981        second.tv_sec--;
982     }
983     printf("AllocatePaletteCells elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
984 #endif
985
986     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewBottomColor, shell);
987
988     return(True);
989 }
990
991 static Boolean 
992 NewBottomColor(
993         XtPointer shell )
994 {
995 #ifdef TIME
996     struct timeval first, second, lapsed;
997     struct timezone tzp;
998
999     gettimeofday(&first, &tzp);
1000 #endif
1001
1002     /* Create the bottom portion of the color dialog */
1003     CreateBottomColor();
1004
1005 #ifdef TIME
1006     gettimeofday(&second, &tzp);
1007     if(first.tv_usec > second.tv_usec){
1008        second.tv_usec += 1000000;
1009        second.tv_sec--;
1010     }
1011     printf("CreateBottomColor elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
1012 #endif
1013
1014     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewCreateButtons, shell);
1015
1016     return(True);
1017 }
1018
1019 static Boolean 
1020 NewCreateButtons(
1021         XtPointer shell )
1022 {
1023 #ifdef TIME
1024     struct timeval first, second, lapsed;
1025     struct timezone tzp;
1026
1027     gettimeofday(&first, &tzp);
1028 #endif
1029
1030     /* initialize pixels to the right color */
1031     CreatePaletteButtons(style.buttonsForm);
1032
1033 #ifdef TIME
1034     gettimeofday(&second, &tzp);
1035     if(first.tv_usec > second.tv_usec){
1036        second.tv_usec += 1000000;
1037        second.tv_sec--;
1038     }
1039     printf("CreatePaletteButtons elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
1040 #endif
1041
1042     return(True);
1043 }
1044
1045 /*************************************<->*************************************
1046  *
1047  *  WaitChildDeath()
1048  *
1049  *
1050  *  Description:
1051  *  -----------
1052  *  When a SIGCHLD signal comes in, wait for all child processes to die.
1053  *
1054  *
1055  *  Inputs:
1056  *  ------
1057  * 
1058  *  Outputs:
1059  *  -------
1060  *
1061  *
1062  *  Comments:
1063  *  --------
1064  * 
1065  *************************************<->***********************************/
1066 void
1067 WaitChildDeath( void )
1068 {
1069   int   stat_loc;
1070   pid_t pid;
1071   
1072   pid = wait(&stat_loc);
1073   signal(SIGCHLD,(void (*)())WaitChildDeath);
1074
1075 }