Link with C++ linker
[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 librararies 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,NULL,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(_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(_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 void 
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
456 #ifdef USERHELP
457 malloc_check(1);
458 malloc_trace(0);
459 #endif
460
461     XtSetLanguageProc(NULL, NULL, NULL);
462     _DtEnvControl(DT_ENV_SET); 
463     
464
465     /* Initialize the toolkit and open the display */
466     style.shell = 
467         XtInitialize(argv[0], XMCLASS, option_list, 1, (int *)&argc, argv);
468
469 #ifdef __osf__
470     _XmColorObjCreate(style.shell, NULL, NULL);
471 #endif
472
473     /* Allow all WS manipulation functions except resize and maximize */
474     mwmFunc = MWM_FUNC_ALL ^ (MWM_FUNC_RESIZE | MWM_FUNC_MAXIMIZE); 
475
476     n = 0;
477     XtSetArg(args[n], XmNmwmFunctions, mwmFunc); n++;
478     XtSetArg(args[n], XmNuseAsyncGeometry, True); n++;
479     XtSetValues(style.shell, args, n);
480
481     /* initialize global style data */
482
483     style.display    = XtDisplay(style.shell);
484     style.screen     = DefaultScreenOfDisplay(style.display);
485     style.screenNum  = DefaultScreen(style.display);
486     style.colormap   = DefaultColormap(style.display, style.screenNum);
487     style.root       = DefaultRootWindow(style.display);
488     style.execName   = argv[0];
489     style.errDialog  = NULL;
490     style.tmpXmStr   = NULL;
491     style.home = (char *) XtMalloc(strlen((char *) getenv("HOME")) + 1);
492     strcpy(style.home, (char *) getenv("HOME"));
493     style.colorDialog = NULL;
494     style.backdropDialog = NULL;
495     style.fontDialog = NULL;
496     style.kbdDialog = NULL;
497     style.mouseDialog = NULL;
498     style.audioDialog = NULL;
499     style.screenDialog = NULL;
500     style.startupDialog = NULL;
501     style.dtwmDialog = NULL;
502     style.i18nDialog = NULL;
503     
504     if (progName = DtStrrchr(argv[0], '/')) progName++;
505     else progName = argv[0];
506
507     /* Get the lock established to ensure only one dtstyle process
508      * is running per screen .. first malloc enough space*/
509
510     if (_DtGetLock (style.display, STYLE_LOCK) == 0)
511     {
512         _DtSimpleError (progName, DtError, NULL, "%s",
513              ((char *)GETMESSAGE(2, 5, "Style Manager is already running, second attempt aborted.")));
514         exit(1);
515     }
516
517     InitDtstyleProtocol();
518     SetWindowProperties();
519
520     /* Register error handlers */
521     XSetErrorHandler(ErrorHandler);
522     XSetIOErrorHandler(IOErrorHandler);
523     XtAppSetErrorHandler(XtWidgetToApplicationContext(style.shell),
524                          ToolkitErrorHandler);
525     XtAddEventHandler(style.shell, StructureNotifyMask, 0,
526                          (XtEventHandler)MwmReparentNotify, NULL);
527
528     /* set up resolution dependent layout variables */
529     switch (_DtGetDisplayResolution(style.display, style.screenNum))
530     {
531         case LOW_RES_DISPLAY:
532             style.horizontalSpacing = 
533             style.verticalSpacing = 3;
534             break;
535             
536         case MED_RES_DISPLAY:
537             style.horizontalSpacing = 
538             style.verticalSpacing = 5;
539             break;
540             
541         case HIGH_RES_DISPLAY:
542             style.horizontalSpacing = 
543             style.verticalSpacing = 8;
544             break;
545     }
546     
547     GetApplicationResources();
548     
549     XmeGetIconControlInfo(style.screen, &useMaskRtn,
550                           &style.useMultiColorIcons, &useIconFileCacheRtn);
551     
552     
553     /* add the directory $HOME/.dt/backdrops */
554     
555     string = (char *)XtMalloc(strlen(style.home) + strlen("/.dt/backdrops:") + 1);
556     sprintf(string, "%s/.dt/backdrops:", style.home);
557
558     dirs = (char *)XtCalloc(1, strlen("/etc/dt/backdrops:/usr/dt/backdrops") + 
559                             (style.xrdb.backdropDir == NULL ? 2 :
560                             strlen(style.xrdb.backdropDir)) + 
561                             strlen(string) + 2);
562   
563
564     strcpy(dirs, string);
565     if (style.xrdb.backdropDir) 
566       {
567         strcat(dirs, style.xrdb.backdropDir);
568         strcat(dirs, ":"); 
569       }
570     strcat(dirs, "/etc/dt/backdrops:/usr/dt/backdrops");
571
572     _DtWsmSetBackdropSearchPath(style.screen, dirs, style.useMultiColorIcons);
573
574     if (string != NULL)
575       XtFree((char *)string);
576     
577     if (dirs != NULL)
578       XtFree((char *)dirs); 
579     
580     
581
582     style.count = 0;
583     /* if this is started from save session we need to set up the BMS
584        first, otherwise do it after making the window. (for user perception
585        for how long it takes for the dtstyle to come up) */
586     if(style.xrdb.session != NULL) {
587       DtInitialize (style.display, style.shell, progName, progName);
588       /*Restore a session or build and display the main Window.*/
589       if(!restoreSession(style.shell,style.xrdb.session))
590         init_mainWindow(style.shell);
591     }
592     else {
593       init_mainWindow(style.shell);
594       DtInitialize (style.display, style.shell, progName, progName);
595       InitializeAtoms();
596       CheckMonitor(style.shell);
597       GetDefaultPal(style.shell);
598     }
599     
600     signal(SIGINT,(void (*)())activateCB_exitBtn); 
601     signal(SIGTERM,(void (*)())activateCB_exitBtn); 
602
603     /* to avoid defunct screen saver processes */    
604     signal(SIGCHLD, (void (*)())WaitChildDeath);
605
606     /* backdrop dialog  needs to know when the workspace changes to recolor 
607        the bitmap displayed in the dialog */
608     ListenForWorkspaceChange();
609
610     /* if using COLOR builtin, style.workProcs is True */
611
612     if ((XmeUseColorObj() != FALSE) && style.workProcs)
613
614         XtAppAddWorkProc(XtWidgetToApplicationContext(style.shell), 
615                         NewCreateD, style.shell);
616
617     XtAppMainLoop(XtWidgetToApplicationContext(style.shell));
618
619 }
620
621 /************************************************************************
622  *
623  *  ErrorHandler
624  *
625  ************************************************************************/
626 static int
627 ErrorHandler(
628         Display *disp,
629         XErrorEvent *event )
630
631 {
632   #define _DTSTYLE_BUFSIZE 1024
633   char errmsg[_DTSTYLE_BUFSIZE];
634
635   _DtPrintDefaultErrorSafe(disp, event, errmsg, _DTSTYLE_BUFSIZE);
636   _DtSimpleError(progName, DtWarning, NULL, errmsg, NULL);
637
638    /* We do not want to exit here lets try to continue... */
639   return 1;
640 }
641
642
643 /************************************************************************
644  *
645  *  IOErrorHandler
646  *
647  ************************************************************************/
648 static int
649 IOErrorHandler (display)
650  Display *display;
651
652 {
653 #ifdef DEBUG
654     Warning ("X IO error occurred during generic operation");
655 #endif /* DEBUG */
656
657     exit (1);
658     return 1;
659
660
661
662
663 /************************************************************************
664  *
665  *  ToolkitErrorHandler
666  * 
667  *  All Xt memory allocation errors should fall through to this routine.
668  *  There is no need to check for Xtmalloc errors where they are used.
669  *
670  ************************************************************************/
671 static void
672 ToolkitErrorHandler(
673         char *message )
674
675 {
676     _DtSimpleError (progName, DtError, NULL, 
677         GETMESSAGE(2, 6, "An X Toolkit error occurred... Exiting.\n"));
678     exit (1);
679 }
680
681
682 static Boolean 
683 NewCreateD(
684         XtPointer shell )
685 {
686 #ifdef TIME
687     struct timeval first, second, lapsed;
688     struct timezone tzp;
689
690     gettimeofday(&first, &tzp);
691 #endif
692
693     /*  Create the Dialog Box Dialog */
694     CreateDialogBoxD((Widget)shell);
695
696 #ifdef TIME
697     gettimeofday(&second, &tzp);
698     if(first.tv_usec > second.tv_usec){
699        second.tv_usec += 1000000;
700        second.tv_sec--;
701     }
702     printf("CreateDialogBoxD elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
703 #endif
704
705     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddTo, shell);
706
707     return(True);
708 }
709
710 static Boolean 
711 NewAddTo(
712         XtPointer shell )
713 {
714 #ifdef TIME
715     struct timeval first, second, lapsed;
716     struct timezone tzp;
717
718     gettimeofday(&first, &tzp);
719 #endif
720
721     /*  Create the Dialog Box Dialog */
722     AddToDialogBox();
723
724 #ifdef TIME
725     gettimeofday(&second, &tzp);
726     if(first.tv_usec > second.tv_usec){
727        second.tv_usec += 1000000;
728        second.tv_sec--;
729     }
730     printf("AddToDialogBox elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
731 #endif
732
733     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewCreateTop1, shell);
734
735     return(True);
736 }
737
738 static Boolean 
739 NewCreateTop1(
740         XtPointer shell )
741 {
742 #ifdef TIME
743     struct timeval first, second, lapsed;
744     struct timezone tzp;
745
746     gettimeofday(&first, &tzp);
747 #endif
748
749     /* Create the top portion of the color dialog */
750     CreateTopColor1();
751
752 #ifdef TIME
753     gettimeofday(&second, &tzp);
754     if(first.tv_usec > second.tv_usec){
755        second.tv_usec += 1000000;
756        second.tv_sec--;
757     }
758     printf("CreateTopColor1 elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
759 #endif
760
761     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewCreateTop2, shell);
762     return(True);
763 }
764
765 static Boolean 
766 NewCreateTop2(
767         XtPointer shell )
768 {
769 #ifdef TIME
770     struct timeval first, second, lapsed;
771     struct timezone tzp;
772
773     gettimeofday(&first, &tzp);
774 #endif
775
776     /* Create the top portion of the color dialog */
777     CreateTopColor2();
778
779 #ifdef TIME
780     gettimeofday(&second, &tzp);
781     if(first.tv_usec > second.tv_usec){
782        second.tv_usec += 1000000;
783        second.tv_sec--;
784     }
785     printf("CreateTopColor2 elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
786 #endif
787
788     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddSysPath, shell);
789
790     return(True);
791 }
792
793 static Boolean 
794 NewAddSysPath(
795         XtPointer shell )
796 {
797 #ifdef TIME
798     struct timeval first, second, lapsed;
799     struct timezone tzp;
800
801     gettimeofday(&first, &tzp);
802 #endif
803
804     /* initialize the system directory */
805     AddSystemPath();
806
807 #ifdef TIME
808     gettimeofday(&second, &tzp);
809     if(first.tv_usec > second.tv_usec){
810        second.tv_usec += 1000000;
811        second.tv_sec--;
812     }
813     printf("AddSystemPath elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
814 #endif
815
816     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddDirectories, shell);
817
818     return(True);
819 }
820
821 static Boolean 
822 NewAddDirectories(
823         XtPointer shell )
824 {
825 #ifdef TIME
826     struct timeval first, second, lapsed;
827     struct timezone tzp;
828
829     gettimeofday(&first, &tzp);
830 #endif
831
832     /* initialize the directorys list in the resource */
833     if(style.xrdb.paletteDir != NULL)
834       AddDirectories(style.xrdb.paletteDir);
835     else
836       style.count++;
837
838 #ifdef TIME
839     gettimeofday(&second, &tzp);
840     if(first.tv_usec > second.tv_usec){
841        second.tv_usec += 1000000;
842        second.tv_sec--;
843     }
844     printf("AddDirectories elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
845 #endif
846
847     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddHomePath, shell);
848
849     return(True);
850 }
851
852 static Boolean 
853 NewAddHomePath(
854         XtPointer shell )
855 {
856 #ifdef TIME
857     struct timeval first, second, lapsed;
858     struct timezone tzp;
859
860     gettimeofday(&first, &tzp);
861 #endif
862
863     /* initialize the home directory */
864     AddHomePath();
865
866 #ifdef TIME
867     gettimeofday(&second, &tzp);
868     if(first.tv_usec > second.tv_usec){
869        second.tv_usec += 1000000;
870        second.tv_sec--;
871     }
872     printf("AddHomePath elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
873 #endif
874
875     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewReadPal, shell);
876
877     return(True);
878 }
879
880 static Boolean 
881 NewReadPal(
882         XtPointer shell )
883 {
884 #ifdef TIME
885     struct timeval first, second, lapsed;
886     struct timezone tzp;
887
888     gettimeofday(&first, &tzp);
889 #endif
890
891     /* Read in the palettes one at a time */
892     if (ReadPaletteLoop(True)) {
893
894 #ifdef TIME
895        gettimeofday(&second, &tzp);
896        if(first.tv_usec > second.tv_usec){
897           second.tv_usec += 1000000;
898           second.tv_sec--;
899        }
900        printf("ReadPaletteLoop DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
901 #endif
902
903     /* Stop work procs if no palettes found - fatal color error.
904      * When the color button is pressed, the regular processing
905      * will pick up on NumOfPalettes == 0 and post an error
906      * dialog */
907      
908        if (NumOfPalettes == 0)
909             return(True);
910        loadDatabase();
911        XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewInitPal, shell);
912        return(True);
913     }
914
915 #ifdef TIME
916     gettimeofday(&second, &tzp);
917     if(first.tv_usec > second.tv_usec){
918        second.tv_usec += 1000000;
919        second.tv_sec--;
920     }
921     printf("ReadPaletteLoop NOT DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
922 #endif
923       
924     return(False);
925
926 }
927
928 static Boolean 
929 NewInitPal(
930         XtPointer shell )
931 {
932 #ifdef TIME
933     struct timeval first, second, lapsed;
934     struct timezone tzp;
935
936     gettimeofday(&first, &tzp);
937 #endif
938
939     /* initialize the palette list */
940     if(InitializePaletteList((Widget)shell, paletteList, True)) {
941
942 #ifdef TIME
943        gettimeofday(&second, &tzp);
944        if(first.tv_usec > second.tv_usec){
945           second.tv_usec += 1000000;
946           second.tv_sec--;
947        }
948        printf("InitializePaletteList DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
949 #endif
950
951        XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAllocColor, shell);
952        return(True);
953      }
954
955 #ifdef TIME
956     gettimeofday(&second, &tzp);
957     if(first.tv_usec > second.tv_usec){
958        second.tv_usec += 1000000;
959        second.tv_sec--;
960     }
961     printf("InitializePaletteList NOT DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
962 #endif
963
964     return(False);
965 }
966
967 static Boolean 
968 NewAllocColor(
969         XtPointer shell )
970 {
971 #ifdef TIME
972     struct timeval first, second, lapsed;
973     struct timezone tzp;
974
975     gettimeofday(&first, &tzp);
976 #endif
977
978     /* initialize pixels to the right color */
979     AllocatePaletteCells((Widget)shell);
980
981 #ifdef TIME
982     gettimeofday(&second, &tzp);
983     if(first.tv_usec > second.tv_usec){
984        second.tv_usec += 1000000;
985        second.tv_sec--;
986     }
987     printf("AllocatePaletteCells elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
988 #endif
989
990     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewBottomColor, shell);
991
992     return(True);
993 }
994
995 static Boolean 
996 NewBottomColor(
997         XtPointer shell )
998 {
999 #ifdef TIME
1000     struct timeval first, second, lapsed;
1001     struct timezone tzp;
1002
1003     gettimeofday(&first, &tzp);
1004 #endif
1005
1006     /* Create the bottom portion of the color dialog */
1007     CreateBottomColor();
1008
1009 #ifdef TIME
1010     gettimeofday(&second, &tzp);
1011     if(first.tv_usec > second.tv_usec){
1012        second.tv_usec += 1000000;
1013        second.tv_sec--;
1014     }
1015     printf("CreateBottomColor elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
1016 #endif
1017
1018     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewCreateButtons, shell);
1019
1020     return(True);
1021 }
1022
1023 static Boolean 
1024 NewCreateButtons(
1025         XtPointer shell )
1026 {
1027 #ifdef TIME
1028     struct timeval first, second, lapsed;
1029     struct timezone tzp;
1030
1031     gettimeofday(&first, &tzp);
1032 #endif
1033
1034     /* initialize pixels to the right color */
1035     CreatePaletteButtons(style.buttonsForm);
1036
1037 #ifdef TIME
1038     gettimeofday(&second, &tzp);
1039     if(first.tv_usec > second.tv_usec){
1040        second.tv_usec += 1000000;
1041        second.tv_sec--;
1042     }
1043     printf("CreatePaletteButtons elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
1044 #endif
1045
1046     return(True);
1047 }
1048
1049 /*************************************<->*************************************
1050  *
1051  *  WaitChildDeath()
1052  *
1053  *
1054  *  Description:
1055  *  -----------
1056  *  When a SIGCHLD signal comes in, wait for all child processes to die.
1057  *
1058  *
1059  *  Inputs:
1060  *  ------
1061  * 
1062  *  Outputs:
1063  *  -------
1064  *
1065  *
1066  *  Comments:
1067  *  --------
1068  * 
1069  *************************************<->***********************************/
1070 void
1071 WaitChildDeath( void )
1072 {
1073   int   stat_loc;
1074   pid_t pid;
1075   
1076   pid = wait(&stat_loc);
1077   signal(SIGCHLD,(void (*)())WaitChildDeath);
1078
1079 }