dthelp: Change to ANSI function definitions
[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 *display)
650 {
651 #ifdef DEBUG
652     Warning ("X IO error occurred during generic operation");
653 #endif /* DEBUG */
654
655     exit (1);
656     return 1;
657
658
659
660
661 /************************************************************************
662  *
663  *  ToolkitErrorHandler
664  * 
665  *  All Xt memory allocation errors should fall through to this routine.
666  *  There is no need to check for Xtmalloc errors where they are used.
667  *
668  ************************************************************************/
669 static void
670 ToolkitErrorHandler(
671         char *message )
672
673 {
674     _DtSimpleError (progName, DtError, NULL, 
675         GETMESSAGE(2, 6, "An X Toolkit error occurred... Exiting.\n"));
676     exit (1);
677 }
678
679
680 static Boolean 
681 NewCreateD(
682         XtPointer shell )
683 {
684 #ifdef TIME
685     struct timeval first, second, lapsed;
686     struct timezone tzp;
687
688     gettimeofday(&first, &tzp);
689 #endif
690
691     /*  Create the Dialog Box Dialog */
692     CreateDialogBoxD((Widget)shell);
693
694 #ifdef TIME
695     gettimeofday(&second, &tzp);
696     if(first.tv_usec > second.tv_usec){
697        second.tv_usec += 1000000;
698        second.tv_sec--;
699     }
700     printf("CreateDialogBoxD elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
701 #endif
702
703     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddTo, shell);
704
705     return(True);
706 }
707
708 static Boolean 
709 NewAddTo(
710         XtPointer shell )
711 {
712 #ifdef TIME
713     struct timeval first, second, lapsed;
714     struct timezone tzp;
715
716     gettimeofday(&first, &tzp);
717 #endif
718
719     /*  Create the Dialog Box Dialog */
720     AddToDialogBox();
721
722 #ifdef TIME
723     gettimeofday(&second, &tzp);
724     if(first.tv_usec > second.tv_usec){
725        second.tv_usec += 1000000;
726        second.tv_sec--;
727     }
728     printf("AddToDialogBox elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
729 #endif
730
731     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewCreateTop1, shell);
732
733     return(True);
734 }
735
736 static Boolean 
737 NewCreateTop1(
738         XtPointer shell )
739 {
740 #ifdef TIME
741     struct timeval first, second, lapsed;
742     struct timezone tzp;
743
744     gettimeofday(&first, &tzp);
745 #endif
746
747     /* Create the top portion of the color dialog */
748     CreateTopColor1();
749
750 #ifdef TIME
751     gettimeofday(&second, &tzp);
752     if(first.tv_usec > second.tv_usec){
753        second.tv_usec += 1000000;
754        second.tv_sec--;
755     }
756     printf("CreateTopColor1 elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
757 #endif
758
759     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewCreateTop2, shell);
760     return(True);
761 }
762
763 static Boolean 
764 NewCreateTop2(
765         XtPointer shell )
766 {
767 #ifdef TIME
768     struct timeval first, second, lapsed;
769     struct timezone tzp;
770
771     gettimeofday(&first, &tzp);
772 #endif
773
774     /* Create the top portion of the color dialog */
775     CreateTopColor2();
776
777 #ifdef TIME
778     gettimeofday(&second, &tzp);
779     if(first.tv_usec > second.tv_usec){
780        second.tv_usec += 1000000;
781        second.tv_sec--;
782     }
783     printf("CreateTopColor2 elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
784 #endif
785
786     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddSysPath, shell);
787
788     return(True);
789 }
790
791 static Boolean 
792 NewAddSysPath(
793         XtPointer shell )
794 {
795 #ifdef TIME
796     struct timeval first, second, lapsed;
797     struct timezone tzp;
798
799     gettimeofday(&first, &tzp);
800 #endif
801
802     /* initialize the system directory */
803     AddSystemPath();
804
805 #ifdef TIME
806     gettimeofday(&second, &tzp);
807     if(first.tv_usec > second.tv_usec){
808        second.tv_usec += 1000000;
809        second.tv_sec--;
810     }
811     printf("AddSystemPath elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
812 #endif
813
814     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddDirectories, shell);
815
816     return(True);
817 }
818
819 static Boolean 
820 NewAddDirectories(
821         XtPointer shell )
822 {
823 #ifdef TIME
824     struct timeval first, second, lapsed;
825     struct timezone tzp;
826
827     gettimeofday(&first, &tzp);
828 #endif
829
830     /* initialize the directorys list in the resource */
831     if(style.xrdb.paletteDir != NULL)
832       AddDirectories(style.xrdb.paletteDir);
833     else
834       style.count++;
835
836 #ifdef TIME
837     gettimeofday(&second, &tzp);
838     if(first.tv_usec > second.tv_usec){
839        second.tv_usec += 1000000;
840        second.tv_sec--;
841     }
842     printf("AddDirectories elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
843 #endif
844
845     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAddHomePath, shell);
846
847     return(True);
848 }
849
850 static Boolean 
851 NewAddHomePath(
852         XtPointer shell )
853 {
854 #ifdef TIME
855     struct timeval first, second, lapsed;
856     struct timezone tzp;
857
858     gettimeofday(&first, &tzp);
859 #endif
860
861     /* initialize the home directory */
862     AddHomePath();
863
864 #ifdef TIME
865     gettimeofday(&second, &tzp);
866     if(first.tv_usec > second.tv_usec){
867        second.tv_usec += 1000000;
868        second.tv_sec--;
869     }
870     printf("AddHomePath elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
871 #endif
872
873     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewReadPal, shell);
874
875     return(True);
876 }
877
878 static Boolean 
879 NewReadPal(
880         XtPointer shell )
881 {
882 #ifdef TIME
883     struct timeval first, second, lapsed;
884     struct timezone tzp;
885
886     gettimeofday(&first, &tzp);
887 #endif
888
889     /* Read in the palettes one at a time */
890     if (ReadPaletteLoop(True)) {
891
892 #ifdef TIME
893        gettimeofday(&second, &tzp);
894        if(first.tv_usec > second.tv_usec){
895           second.tv_usec += 1000000;
896           second.tv_sec--;
897        }
898        printf("ReadPaletteLoop DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
899 #endif
900
901     /* Stop work procs if no palettes found - fatal color error.
902      * When the color button is pressed, the regular processing
903      * will pick up on NumOfPalettes == 0 and post an error
904      * dialog */
905      
906        if (NumOfPalettes == 0)
907             return(True);
908        loadDatabase();
909        XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewInitPal, shell);
910        return(True);
911     }
912
913 #ifdef TIME
914     gettimeofday(&second, &tzp);
915     if(first.tv_usec > second.tv_usec){
916        second.tv_usec += 1000000;
917        second.tv_sec--;
918     }
919     printf("ReadPaletteLoop NOT DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
920 #endif
921       
922     return(False);
923
924 }
925
926 static Boolean 
927 NewInitPal(
928         XtPointer shell )
929 {
930 #ifdef TIME
931     struct timeval first, second, lapsed;
932     struct timezone tzp;
933
934     gettimeofday(&first, &tzp);
935 #endif
936
937     /* initialize the palette list */
938     if(InitializePaletteList((Widget)shell, paletteList, True)) {
939
940 #ifdef TIME
941        gettimeofday(&second, &tzp);
942        if(first.tv_usec > second.tv_usec){
943           second.tv_usec += 1000000;
944           second.tv_sec--;
945        }
946        printf("InitializePaletteList DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
947 #endif
948
949        XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewAllocColor, shell);
950        return(True);
951      }
952
953 #ifdef TIME
954     gettimeofday(&second, &tzp);
955     if(first.tv_usec > second.tv_usec){
956        second.tv_usec += 1000000;
957        second.tv_sec--;
958     }
959     printf("InitializePaletteList NOT DONE elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
960 #endif
961
962     return(False);
963 }
964
965 static Boolean 
966 NewAllocColor(
967         XtPointer shell )
968 {
969 #ifdef TIME
970     struct timeval first, second, lapsed;
971     struct timezone tzp;
972
973     gettimeofday(&first, &tzp);
974 #endif
975
976     /* initialize pixels to the right color */
977     AllocatePaletteCells((Widget)shell);
978
979 #ifdef TIME
980     gettimeofday(&second, &tzp);
981     if(first.tv_usec > second.tv_usec){
982        second.tv_usec += 1000000;
983        second.tv_sec--;
984     }
985     printf("AllocatePaletteCells elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
986 #endif
987
988     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewBottomColor, shell);
989
990     return(True);
991 }
992
993 static Boolean 
994 NewBottomColor(
995         XtPointer shell )
996 {
997 #ifdef TIME
998     struct timeval first, second, lapsed;
999     struct timezone tzp;
1000
1001     gettimeofday(&first, &tzp);
1002 #endif
1003
1004     /* Create the bottom portion of the color dialog */
1005     CreateBottomColor();
1006
1007 #ifdef TIME
1008     gettimeofday(&second, &tzp);
1009     if(first.tv_usec > second.tv_usec){
1010        second.tv_usec += 1000000;
1011        second.tv_sec--;
1012     }
1013     printf("CreateBottomColor elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
1014 #endif
1015
1016     XtAppAddWorkProc(XtWidgetToApplicationContext((Widget) shell), NewCreateButtons, shell);
1017
1018     return(True);
1019 }
1020
1021 static Boolean 
1022 NewCreateButtons(
1023         XtPointer shell )
1024 {
1025 #ifdef TIME
1026     struct timeval first, second, lapsed;
1027     struct timezone tzp;
1028
1029     gettimeofday(&first, &tzp);
1030 #endif
1031
1032     /* initialize pixels to the right color */
1033     CreatePaletteButtons(style.buttonsForm);
1034
1035 #ifdef TIME
1036     gettimeofday(&second, &tzp);
1037     if(first.tv_usec > second.tv_usec){
1038        second.tv_usec += 1000000;
1039        second.tv_sec--;
1040     }
1041     printf("CreatePaletteButtons elapsed time is %ld seconds, %ld microseconds\n", second.tv_sec - first.tv_sec, second.tv_usec - first.tv_usec);
1042 #endif
1043
1044     return(True);
1045 }
1046
1047 /*************************************<->*************************************
1048  *
1049  *  WaitChildDeath()
1050  *
1051  *
1052  *  Description:
1053  *  -----------
1054  *  When a SIGCHLD signal comes in, wait for all child processes to die.
1055  *
1056  *
1057  *  Inputs:
1058  *  ------
1059  * 
1060  *  Outputs:
1061  *  -------
1062  *
1063  *
1064  *  Comments:
1065  *  --------
1066  * 
1067  *************************************<->***********************************/
1068 void
1069 WaitChildDeath( void )
1070 {
1071   int   stat_loc;
1072   pid_t pid;
1073   
1074   pid = wait(&stat_loc);
1075   signal(SIGCHLD,(void (*)())WaitChildDeath);
1076
1077 }