Fixes for OpenBSD
[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     if (string != NULL)
574       XtFree((char *)string);
575     
576     if (dirs != NULL)
577       XtFree((char *)dirs); 
578     
579     
580
581     style.count = 0;
582     /* if this is started from save session we need to set up the BMS
583        first, otherwise do it after making the window. (for user perception
584        for how long it takes for the dtstyle to come up) */
585     if(style.xrdb.session != NULL) {
586       DtInitialize (style.display, style.shell, progName, progName);
587       /*Restore a session or build and display the main Window.*/
588       if(!restoreSession(style.shell,style.xrdb.session))
589         init_mainWindow(style.shell);
590     }
591     else {
592       init_mainWindow(style.shell);
593       DtInitialize (style.display, style.shell, progName, progName);
594       InitializeAtoms();
595       CheckMonitor(style.shell);
596       GetDefaultPal(style.shell);
597     }
598     
599     signal(SIGINT,(void (*)())activateCB_exitBtn); 
600     signal(SIGTERM,(void (*)())activateCB_exitBtn); 
601
602     /* to avoid defunct screen saver processes */    
603     signal(SIGCHLD, (void (*)())WaitChildDeath);
604
605     /* backdrop dialog  needs to know when the workspace changes to recolor 
606        the bitmap displayed in the dialog */
607     ListenForWorkspaceChange();
608
609     /* if using COLOR builtin, style.workProcs is True */
610
611     if ((XmeUseColorObj() != FALSE) && style.workProcs)
612
613         XtAppAddWorkProc(XtWidgetToApplicationContext(style.shell), 
614                         NewCreateD, style.shell);
615
616     XtAppMainLoop(XtWidgetToApplicationContext(style.shell));
617
618     return 0;
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 }