1 /*
2  *
3  * XASTIR, Amateur Station Tracking and Information Reporting
4  * Copyright (C) 1999,2000  Frank Giannandrea
5  * Copyright (C) 2000-2019 The Xastir Group
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20  *
21  * Look at the README for more information on the program.
22  */
23 
24 #ifdef HAVE_CONFIG_H
25   #include "config.h"
26 #endif  // HAVE_CONFIG_H
27 
28 #include "snprintf.h"
29 
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <unistd.h>
33 #include <sys/socket.h>
34 #include <netdb.h>
35 #include <netinet/in.h>
36 #include <arpa/inet.h>
37 
38 #ifdef  HAVE_LOCALE_H
39   #include <locale.h>
40 #endif  // HAVE_LOCALE_H
41 
42 #ifdef HAVE_MATH_H
43   #include <math.h>
44 #endif  // HAVE_MATH_H
45 
46 #include "xastir.h"
47 #include "wx.h"
48 #include "main.h"
49 #include "alert.h"
50 #include "lang.h"
51 
52 #include <Xm/XmAll.h>
53 #ifdef HAVE_XBAE_MATRIX_H
54   #include <Xbae/Matrix.h>
55 #endif  // HAVE_XBAE_MATRIX_H
56 #include <X11/cursorfont.h>
57 
58 // Must be last include file
59 #include "leak_detection.h"
60 
61 
62 extern XmFontList fontlist1;    // Menu/System fontlist
63 
64 /************ Weather Alerts ****************/
65 Widget wx_alert_shell = (Widget)NULL;
66 Widget wx_detailed_alert_shell = (Widget)NULL;
67 static Widget wx_alert_list;
68 
69 static xastir_mutex wx_alert_shell_lock;
70 static xastir_mutex wx_detailed_alert_shell_lock;
71 static xastir_mutex wx_station_dialog_lock;
72 
73 
74 
75 
76 
wx_gui_init(void)77 void wx_gui_init(void)
78 {
79   init_critical_section( &wx_alert_shell_lock );
80   init_critical_section( &wx_detailed_alert_shell_lock );
81   init_critical_section( &wx_station_dialog_lock );
82 }
83 
84 
85 
86 
87 
wx_detailed_alert_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))88 void wx_detailed_alert_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
89 {
90 
91   Widget shell = (Widget) clientData;
92   XtPopdown(shell);
93 
94   begin_critical_section(&wx_detailed_alert_shell_lock, "wx_gui.c:wx_detailed_alert_destroy_shell" );
95 
96   XtDestroyWidget(shell);
97   wx_detailed_alert_shell = (Widget)NULL;
98 
99   end_critical_section(&wx_detailed_alert_shell_lock, "wx_gui.c:wx_detailed_alert_destroy_shell" );
100 
101 }
102 
103 
104 
105 
106 
107 // This gets/displays the "finger" output from the WXSVR.  Called
108 // from both the Station Info "NWS" button and by double-clicking on
109 // the view weather alerts window.
110 //
wx_alert_finger_output(Widget UNUSED (widget),char * handle)111 void wx_alert_finger_output( Widget UNUSED(widget), char *handle)
112 {
113   static Widget pane, scrollwindow, my_form, mess, button_cancel,wx_detailed_alert_list;
114   Atom delw;
115   Arg al[50];             // Arg List
116   unsigned int ac = 0;    // Arg Count
117   char temp[1024];
118   XmString item;
119   FILE *fd;
120   int ret;
121   int server_fd;
122   struct sockaddr_in serv_addr;
123   struct hostent *serverhost;
124 
125 
126   if (debug_level & 1)
127   {
128     fprintf(stderr,"Handle: %s\n",handle);
129   }
130 
131   if(!wx_detailed_alert_shell)
132   {
133 
134     begin_critical_section(&wx_detailed_alert_shell_lock, "wx_gui.c:wx_alert_double_click_action" );
135 
136     wx_detailed_alert_shell = XtVaCreatePopupShell(langcode("WPUPWXA001"),
137                               xmDialogShellWidgetClass, appshell,
138                               XmNdeleteResponse, XmDESTROY,
139                               XmNdefaultPosition, FALSE,
140                               XmNminWidth, 600,
141                               XmNfontList, fontlist1,
142                               NULL);
143 
144     pane = XtVaCreateWidget("wx_alert_double_click_action pane",xmPanedWindowWidgetClass, wx_detailed_alert_shell,
145                             XmNbackground, colors[0xff],
146                             NULL);
147 
148     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
149                                            xmScrolledWindowWidgetClass,
150                                            pane,
151                                            XmNscrollingPolicy, XmAUTOMATIC,
152                                            NULL);
153 
154     my_form =  XtVaCreateWidget("wx_alert_double_click_action my_form",
155                                 xmFormWidgetClass,
156                                 scrollwindow,
157                                 XmNtraversalOn, TRUE,
158                                 XmNfractionBase, 5,
159                                 XmNbackground, colors[0xff],
160                                 XmNwidth, 600,
161                                 XmNautoUnmanage, FALSE,
162                                 XmNshadowThickness, 1,
163                                 NULL);
164 
165     mess = XtVaCreateManagedWidget(langcode("WPUPWXA002"), xmLabelWidgetClass, my_form,
166                                    XmNtraversalOn, FALSE,
167                                    XmNtopAttachment, XmATTACH_FORM,
168                                    XmNtopOffset, 5,
169                                    XmNbottomAttachment, XmATTACH_NONE,
170                                    XmNleftAttachment, XmATTACH_FORM,
171                                    XmNleftOffset, 5,
172                                    XmNrightAttachment, XmATTACH_FORM,
173                                    XmNrightOffset, 5,
174                                    XmNbackground, colors[0xff],
175                                    XmNfontList, fontlist1,
176                                    NULL);
177 
178 
179     /* set args for color */
180     ac=0;
181     XtSetArg(al[ac], XmNbackground, colors[0xff]);
182     ac++;
183     XtSetArg(al[ac], XmNvisibleItemCount, 13);
184     ac++;
185     XtSetArg(al[ac], XmNtraversalOn, TRUE);
186     ac++;
187     XtSetArg(al[ac], XmNshadowThickness, 3);
188     ac++;
189     XtSetArg(al[ac], XmNselectionPolicy, XmSINGLE_SELECT);
190     ac++;
191 
192     XtSetArg(al[ac], XmNvisualPolicy, XmCONSTANT);
193     ac++;
194     XtSetArg(al[ac], XmNscrollingPolicy,XmAUTOMATIC);
195     ac++;
196     XtSetArg(al[ac], XmNscrollBarPlacement, XmBOTTOM_RIGHT);
197     ac++;
198     XtSetArg(al[ac], XmNscrollBarDisplayPolicy,XmAS_NEEDED);
199     ac++;
200     XtSetArg(al[ac], XmNlistSizePolicy, XmCONSTANT);
201     ac++;
202 
203     XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET);
204     ac++;
205     XtSetArg(al[ac], XmNtopWidget, mess);
206     ac++;
207     XtSetArg(al[ac], XmNtopOffset, 5);
208     ac++;
209     XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM);
210     ac++;
211     XtSetArg(al[ac], XmNbottomOffset, 45);
212     ac++;
213     XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM);
214     ac++;
215     XtSetArg(al[ac], XmNrightOffset, 5);
216     ac++;
217     XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM);
218     ac++;
219     XtSetArg(al[ac], XmNleftOffset, 5);
220     ac++;
221     XtSetArg(al[ac], XmNfontList, fontlist1);
222     ac++;
223 
224     wx_detailed_alert_list = XmCreateScrolledList(my_form, "wx_alert_double_click_action wx_detailed_alert_list", al, ac);
225 
226     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00003"),xmPushButtonGadgetClass, my_form,
227                                             XmNtopAttachment, XmATTACH_NONE,
228                                             XmNbottomAttachment, XmATTACH_FORM,
229                                             XmNbottomOffset,10,
230                                             XmNleftAttachment, XmATTACH_POSITION,
231                                             XmNleftPosition, 2,
232                                             XmNrightAttachment, XmATTACH_POSITION,
233                                             XmNrightPosition, 3,
234                                             XmNbackground, colors[0xff],
235                                             XmNnavigationType, XmTAB_GROUP,
236                                             XmNfontList, fontlist1,
237                                             NULL);
238 
239     XtAddCallback(button_cancel, XmNactivateCallback, wx_detailed_alert_destroy_shell, wx_detailed_alert_shell);
240 
241     end_critical_section(&wx_detailed_alert_shell_lock, "wx_gui.c:wx_alert_double_click_action" );
242 
243     pos_dialog(wx_detailed_alert_shell);
244 
245     delw = XmInternAtom(XtDisplay(wx_detailed_alert_shell), "WM_DELETE_WINDOW", FALSE);
246     XmAddWMProtocolCallback(wx_detailed_alert_shell, delw, wx_detailed_alert_destroy_shell, (XtPointer)wx_detailed_alert_shell);
247 
248     XtManageChild(my_form);
249     XtManageChild(wx_detailed_alert_list);
250     XtVaSetValues(wx_detailed_alert_list, XmNbackground, colors[0x0f], NULL);
251     XtManageChild(pane);
252 
253     resize_dialog(my_form, wx_detailed_alert_shell);
254 
255     XtPopup(wx_detailed_alert_shell, XtGrabNone);
256 
257     // Move focus to the Cancel button.  This appears to highlight the
258     // button fine, but we're not able to hit the <Enter> key to
259     // have that default function happen.  Note:  We _can_ hit the
260     // <SPACE> key, and that activates the option.
261 //        XmUpdateDisplay(wx_detailed_alert_shell);
262     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
263   }
264   else
265   {
266     (void)XRaiseWindow(XtDisplay(wx_detailed_alert_shell), XtWindow(wx_detailed_alert_shell));
267   }
268 
269   // Erase the entire list before we start writing to it in
270   // case it was left up from a previous query.
271   XmListDeleteAllItems(wx_detailed_alert_list);
272 
273   // Perform a "finger" command, which is really just a telnet
274   // with a single line command sent to the remote host, then a
275   // bunch of text sent back.  We implement it here via our own
276   // TCP code, as it's really very simple.
277 
278   // Allocate a socket for our use
279   if ((server_fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
280   {
281 //        fprintf(stderr,"wx_alert_finger_output: can't get socket\n");
282     xastir_snprintf(temp,
283                     sizeof(temp),
284                     "wx_alert_finger_output: can't get socket");
285     item = XmStringGenerate(temp, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL);
286     XmListAddItemUnselected(wx_detailed_alert_list, item, 0);
287     XmStringFree(item);
288     return;
289   }
290 
291   memset(&serv_addr, 0, sizeof(serv_addr));
292 
293 
294   // Changing Finger host because WXSVR.net has been down for a
295   // month or more and Pete, AE5PL, has a replacement online that
296   // performs this function.
297   //serverhost = gethostbyname("wxsvr.net");
298   serverhost = gethostbyname("wx.aprs-is.net");
299 
300 
301   if (serverhost == (struct hostent *)0)
302   {
303 //        fprintf(stderr,"wx_alert_finger_output: gethostbyname failed\n");
304     xastir_snprintf(temp,
305                     sizeof(temp),
306                     "wx_alert_finger_output: gethostbyname failed");
307     item = XmStringGenerate(temp, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL);
308     XmListAddItemUnselected(wx_detailed_alert_list, item, 0);
309     XmStringFree(item);
310     (void)close(server_fd); // Close the socket
311     return;
312   }
313   memmove(&serv_addr.sin_addr,serverhost->h_addr, (size_t)serverhost->h_length);
314   serv_addr.sin_family = AF_INET;
315   serv_addr.sin_port = htons(79); // Finger protocol uses port 79
316 
317   if (connect(server_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != 0)
318   {
319 //        fprintf(stderr,"wx_alert_finger_output: connect to server failed\n");
320     xastir_snprintf(temp,
321                     sizeof(temp),
322                     "wx_alert_finger_output: connect to server failed");
323     item = XmStringGenerate(temp, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL);
324     XmListAddItemUnselected(wx_detailed_alert_list, item, 0);
325     XmStringFree(item);
326     (void)close(server_fd);    // Close the socket
327     return;
328   }
329 
330   // Create a file descriptor for the socket
331   fd = fdopen(dup(server_fd),"wb");
332   if (fd == NULL)
333   {
334 //        fprintf(stderr,"Couldn't create duplicate write socket\n");
335     xastir_snprintf(temp,
336                     sizeof(temp),
337                     "Couldn't create duplicate write socket");
338     item = XmStringGenerate(temp, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL);
339     XmListAddItemUnselected(wx_detailed_alert_list, item, 0);
340     XmStringFree(item);
341     (void)close(server_fd); // Close the socket
342     return;
343   }
344 
345   // Set up the text we're going to send to the remote finger
346   // server.
347   xastir_snprintf(temp,
348                   sizeof(temp),
349                   "%s\r\n",
350                   handle);
351 
352   // Send the request text out the socket
353   ret = fprintf(fd, "%s", temp);
354 
355   if (ret == 0 || ret == -1)
356   {
357 //        fprintf(stderr,"Couldn't send finger command to wxsvr\n");
358     xastir_snprintf(temp,
359                     sizeof(temp),
360                     "Couldn't send finger command to wxsvr");
361     item = XmStringGenerate(temp, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL);
362     XmListAddItemUnselected(wx_detailed_alert_list, item, 0);
363     XmStringFree(item);
364     (void)fclose(fd);
365     (void)close(server_fd); // Close the socket
366     return;
367   }
368 
369   // Close the duplicate port we used for writing
370   (void)fclose(fd);
371 
372 //
373 // Read back the results from the socket
374 //
375 
376   // Create a file descriptor for the socket
377   fd = fdopen(dup(server_fd),"rb");
378   if (fd == NULL)
379   {
380 //        fprintf(stderr,"Couldn't create duplicate read socket\n");
381     xastir_snprintf(temp,
382                     sizeof(temp),
383                     "Couldn't create duplicate read socket");
384     item = XmStringGenerate(temp, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL);
385     XmListAddItemUnselected(wx_detailed_alert_list, item, 0);
386     XmStringFree(item);
387     (void)close(server_fd); // Close the socket
388     return;
389   }
390 
391   // Process the data we received from the remote finger server
392   //
393   while (fgets (temp, sizeof (temp), fd))     // While we have data to process
394   {
395     char *ptr;
396 
397     // Remove any linefeeds or carriage returns from each
398     // string.
399     ptr = temp;
400     while ( (ptr = strpbrk(temp, "\n\r")) )
401     {
402       memmove(ptr, ptr+1, strlen(ptr)+1);
403     }
404 
405     if (debug_level & 1)
406     {
407       fprintf(stderr,"%s\n",temp);
408     }
409 
410     // Create an XmString for each line and add it to the
411     // end of the list.
412     item = XmStringGenerate(temp, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL);
413     XmListAddItemUnselected(wx_detailed_alert_list, item, 0);
414     XmStringFree(item);
415   }
416 
417   // All done!
418   fclose(fd);
419   (void)close(server_fd); // Close the socket
420 }
421 
422 
423 
424 
425 
wx_alert_double_click_action(Widget widget,XtPointer UNUSED (clientData),XtPointer callData)426 void wx_alert_double_click_action( Widget widget, XtPointer UNUSED(clientData), XtPointer callData)
427 {
428   char *choice;
429   XmListCallbackStruct *selection = callData;
430   char handle[14];
431   char *ptr;
432 
433 
434   XmStringGetLtoR(selection->item, XmFONTLIST_DEFAULT_TAG, &choice);
435   //fprintf(stderr,"Selected item %d (%s)\n", selection->item_position, choice);
436 
437   // Grab the first 13 characters.  Remove spaces.  This is our handle
438   // into the weather server for the full weather alert text.
439 
440   xastir_snprintf(handle,
441                   sizeof(handle),
442                   "%s",
443                   choice);
444 
445   XtFree(choice);    // Release as soon as we're done!
446 
447   handle[13] = '\0';  // Terminate the string
448   // Remove spaces
449   ptr = handle;
450   while ( (ptr = strpbrk(handle, " ")) )
451   {
452     memmove(ptr, ptr+1, strlen(ptr)+1);
453   }
454   handle[9] = '\0';   // Terminate after first 9 chars
455 
456   if (debug_level & 1)
457   {
458     fprintf(stderr,"Handle: %s\n",handle);
459   }
460 
461   wx_alert_finger_output( widget, handle);
462 }
463 
464 
465 
466 
467 
wx_alert_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))468 void wx_alert_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
469 {
470 
471   Widget shell = (Widget) clientData;
472   XtPopdown(shell);
473 
474   begin_critical_section(&wx_alert_shell_lock, "wx_gui.c:wx_alert_destroy_shell" );
475 
476   XtDestroyWidget(shell);
477   wx_alert_shell = (Widget)NULL;
478 
479   end_critical_section(&wx_alert_shell_lock, "wx_gui.c:wx_alert_destroy_shell" );
480 
481 }
482 
483 
alert_comp(const void * a,const void * b)484 static int alert_comp(const void *a, const void *b)
485 {
486   alert_entry *a_entry = *(alert_entry **)a;
487   alert_entry *b_entry = *(alert_entry **)b;
488   int a_active, b_active;
489 
490   if (a_entry->title[on_screen] && !b_entry->title[on_screen])
491   {
492     return (-1);
493   }
494 
495   if (!a_entry->title[0] && b_entry->title[0])
496   {
497     return (1);
498   }
499 
500   if (a_entry->flags[on_screen] == 'Y' && b_entry->flags[on_screen] != 'Y')
501   {
502     return (-1);
503   }
504 
505   if (a_entry->flags[on_screen] != 'Y' && b_entry->flags[on_screen] == 'Y')
506   {
507     return (1);
508   }
509 
510   if (a_entry->flags[on_screen] == '?' && b_entry->flags[on_screen] == 'N')
511   {
512     return (-1);
513   }
514 
515   if (a_entry->flags[on_screen] == 'N' && b_entry->flags[on_screen] == '?')
516   {
517     return (1);
518   }
519 
520   a_active = alert_active(a_entry, ALERT_ALL);
521   b_active = alert_active(b_entry, ALERT_ALL);
522   if (a_active && b_active)
523   {
524     if (a_active - b_active)
525     {
526       return (a_active - b_active);
527     }
528   }
529   else if (a_active)
530   {
531     return (-1);
532   }
533   else if (b_active)
534   {
535     return (1);
536   }
537 
538   return (strcmp(a_entry->title, b_entry->title));
539 }
540 
541 
wx_alert_update_list(void)542 void wx_alert_update_list(void)
543 {
544   int nn;         // index into alert table.  Starts at 0
545   int ii;         // index into dialog lines.  Starts at 1
546   int max_item_count; // max dialog lines
547   char temp[600];
548   XmString item;
549   static alert_entry **alert_list;
550   static int alert_list_limit;
551 
552   if (wx_alert_shell)
553   {
554     struct hashtable_itr *iterator;
555     alert_entry *alert;
556 
557     begin_critical_section(&wx_alert_shell_lock, "wx_gui.c:wx_alert_update_list" );
558 
559     // Get the previous alert count from the alert list window
560     XtVaGetValues(wx_alert_list, XmNitemCount, &max_item_count, NULL);
561 
562     if ((nn = alert_list_count()) > alert_list_limit)
563     {
564       alert_entry **tmp = realloc(alert_list, nn * sizeof(alert_entry *));
565       if (tmp)
566       {
567         alert_list = tmp;
568         alert_list_limit = nn;
569       }
570       else
571       {
572         fprintf(stderr, "wx_gui: Alert list allocation error\n");
573         exit(1);
574       }
575 
576     }
577     // Iterate through the alert hash.  Create a string for each
578     // non-expired/non-blank entry.
579     iterator = create_wx_alert_iterator();
580     for (nn = 0, alert = get_next_wx_alert(iterator); iterator != NULL && alert; alert = get_next_wx_alert(iterator))
581     {
582 
583       // Check whether alert record is empty/filled.  This
584       // code is from the earlier array implementation.  If
585       // we're expiring records from our hash properly we
586       // probably don't need this anymore.
587       //
588 //            if (alert->title[0] == '\0') {    // It's empty
589 //        fprintf(stderr, "wx_gui:alert->title NULL\n");
590 //                break;
591 //            }
592       alert_list[nn++] = alert;
593     }
594     qsort(alert_list, nn, sizeof(alert_entry *), alert_comp);
595     for (ii = 0; ii < nn;
596         )
597     {
598       alert = alert_list[ii];
599       // AFGNPW      NWS-WARN    Until: 191500z   AK_Z213   WIND               P7IAA
600       // TSATOR      NWS-ADVIS   Until: 190315z   OK_C127   TORNDO             H2VAA
601       //xastir_snprintf(temp, sizeof(temp), "%-9s   %-9s   Until: %-7s   %-7s   %-20s   %s",
602 
603       xastir_snprintf(temp,
604                       sizeof(temp),
605                       "%-9s %-5s %-9s %c%c @%c%c%c%cz ==> %c%c @%c%c%c%cz %c%c %-7s %s %s%s%s%s",
606                       alert->from,
607                       alert->seq,
608                       alert->to,
609                       alert->issue_date_time[0],
610                       alert->issue_date_time[1],
611                       alert->issue_date_time[2],
612                       alert->issue_date_time[3],
613                       alert->issue_date_time[4],
614                       alert->issue_date_time[5],
615                       alert->activity[0],
616                       alert->activity[1],
617                       alert->activity[2],
618                       alert->activity[3],
619                       alert->activity[4],
620                       alert->activity[5],
621                       alert->flags[on_screen],
622                       alert->flags[source],
623                       alert->title,
624                       alert->alert_tag,
625                       alert->desc0,
626                       alert->desc1,
627                       alert->desc2,
628                       alert->desc3);
629 
630       item = XmStringGenerate(temp, XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL);
631 
632       ii++;
633 
634       // It looks like if we are higher than 'max_item_count',
635       // it must be a new entry that we haven't written to the
636       // window yet.  Add it.
637       if (max_item_count < ii)
638       {
639         XmListAddItemUnselected(wx_alert_list, item, 0);
640       }
641       else
642       {
643         // Replace it in the window.  Note: This might re-order the list each time.
644         XmListReplaceItemsPos(wx_alert_list, &item, 1, ii);
645       }
646 
647       XmStringFree(item);
648 
649     }   // End of for loop
650 #ifndef USING_LIBGC
651 //fprintf(stderr,"free iterator 9\n");
652     if (iterator)
653     {
654       free(iterator);
655     }
656 #endif  // USING_LIBGC
657 
658     // If we have fewer alerts now, delete the extras from the window
659     if (ii < max_item_count)
660     {
661       XmListDeleteItemsPos(wx_alert_list, max_item_count - ii, ii+1);
662     }
663 
664     end_critical_section(&wx_alert_shell_lock, "wx_gui.c:wx_alert_update_list" );
665 
666   }
667 }
668 
669 
670 
671 
672 
Display_Wx_Alert(Widget UNUSED (wdgt),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))673 void Display_Wx_Alert( Widget UNUSED(wdgt), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
674 {
675   static Widget pane, scrollwindow, my_form, mess, button_cancel;
676   Atom delw;
677   Arg al[50];                    /* Arg List */
678   unsigned int ac = 0;           /* Arg Count */
679 
680   if(!wx_alert_shell)
681   {
682 
683     begin_critical_section(&wx_alert_shell_lock, "wx_gui.c:Display_Wx_Alert" );
684 
685     wx_alert_shell = XtVaCreatePopupShell(langcode("WPUPWXA001"),
686                                           xmDialogShellWidgetClass, appshell,
687                                           XmNdeleteResponse, XmDESTROY,
688                                           XmNdefaultPosition, FALSE,
689                                           XmNminWidth, 600,
690                                           XmNfontList, fontlist1,
691                                           NULL);
692 
693     pane = XtVaCreateWidget("Display_Wx_Alert pane",xmPanedWindowWidgetClass, wx_alert_shell,
694                             XmNbackground, colors[0xff],
695                             NULL);
696 
697     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
698                                            xmScrolledWindowWidgetClass,
699                                            pane,
700                                            XmNscrollingPolicy, XmAUTOMATIC,
701                                            NULL);
702 
703     my_form =  XtVaCreateWidget("Display_Wx_Alert my_form",
704                                 xmFormWidgetClass,
705                                 scrollwindow,
706                                 XmNtraversalOn, TRUE,
707                                 XmNfractionBase, 5,
708                                 XmNbackground, colors[0xff],
709                                 XmNwidth, 600,
710                                 XmNautoUnmanage, FALSE,
711                                 XmNshadowThickness, 1,
712                                 NULL);
713 
714     mess = XtVaCreateManagedWidget(langcode("WPUPWXA002"), xmLabelWidgetClass, my_form,
715                                    XmNtraversalOn, FALSE,
716                                    XmNtopAttachment, XmATTACH_FORM,
717                                    XmNtopOffset, 5,
718                                    XmNbottomAttachment, XmATTACH_NONE,
719                                    XmNleftAttachment, XmATTACH_FORM,
720                                    XmNleftOffset, 5,
721                                    XmNrightAttachment, XmATTACH_FORM,
722                                    XmNrightOffset, 5,
723                                    XmNbackground, colors[0xff],
724                                    XmNfontList, fontlist1,
725                                    NULL);
726 
727 
728     /* set args for color */
729     ac=0;
730     XtSetArg(al[ac], XmNbackground, colors[0xff]);
731     ac++;
732     XtSetArg(al[ac], XmNvisibleItemCount, 13);
733     ac++;
734     XtSetArg(al[ac], XmNtraversalOn, TRUE);
735     ac++;
736     XtSetArg(al[ac], XmNshadowThickness, 3);
737     ac++;
738 //        XtSetArg(al[ac], XmNselectionPolicy, XmMULTIPLE_SELECT); ac++;
739     XtSetArg(al[ac], XmNselectionPolicy, XmSINGLE_SELECT);
740     ac++;
741 
742     XtSetArg(al[ac], XmNvisualPolicy, XmCONSTANT);
743     ac++;
744     XtSetArg(al[ac], XmNscrollingPolicy,XmAUTOMATIC);
745     ac++;
746     XtSetArg(al[ac], XmNscrollBarPlacement, XmBOTTOM_RIGHT);
747     ac++;
748     XtSetArg(al[ac], XmNscrollBarDisplayPolicy,XmAS_NEEDED);
749     ac++;
750 //        XtSetArg(al[ac], XmNscrollBarDisplayPolicy, XmSTATIC); ac++;
751     XtSetArg(al[ac], XmNlistSizePolicy, XmCONSTANT);
752     ac++;
753 //        XtSetArg(al[ac], XmNlistSizePolicy, XmVARIABLE); ac++;
754 
755     XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET);
756     ac++;
757     XtSetArg(al[ac], XmNtopWidget, mess);
758     ac++;
759     XtSetArg(al[ac], XmNtopOffset, 5);
760     ac++;
761     XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM);
762     ac++;
763     XtSetArg(al[ac], XmNbottomOffset, 45);
764     ac++;
765     XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM);
766     ac++;
767     XtSetArg(al[ac], XmNrightOffset, 5);
768     ac++;
769     XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM);
770     ac++;
771     XtSetArg(al[ac], XmNleftOffset, 5);
772     ac++;
773     XtSetArg(al[ac], XmNfontList, fontlist1);
774     ac++;
775 
776     wx_alert_list = XmCreateScrolledList(my_form, "Display_Wx_Alert wx_alert_list", al, ac);
777 
778     end_critical_section(&wx_alert_shell_lock, "wx_gui.c:Display_Wx_Alert" );
779 
780     wx_alert_update_list();
781 
782     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00003"),xmPushButtonGadgetClass, my_form,
783                                             XmNtopAttachment, XmATTACH_NONE,
784 //                        XmNtopOffset, 265,
785                                             XmNbottomAttachment, XmATTACH_FORM,
786                                             XmNbottomOffset,10,
787                                             XmNleftAttachment, XmATTACH_POSITION,
788                                             XmNleftPosition, 2,
789                                             XmNrightAttachment, XmATTACH_POSITION,
790                                             XmNrightPosition, 3,
791                                             XmNbackground, colors[0xff],
792                                             XmNnavigationType, XmTAB_GROUP,
793                                             XmNfontList, fontlist1,
794                                             NULL);
795 
796     XtAddCallback(button_cancel, XmNactivateCallback, wx_alert_destroy_shell, wx_alert_shell);
797     XtAddCallback(wx_alert_list, XmNdefaultActionCallback, wx_alert_double_click_action, NULL);
798 
799     pos_dialog(wx_alert_shell);
800 
801     delw = XmInternAtom(XtDisplay(wx_alert_shell), "WM_DELETE_WINDOW", FALSE);
802     XmAddWMProtocolCallback(wx_alert_shell, delw, wx_alert_destroy_shell, (XtPointer)wx_alert_shell);
803 
804     XtManageChild(my_form);
805     XtManageChild(wx_alert_list);
806     XtVaSetValues(wx_alert_list, XmNbackground, colors[0x0f], NULL);
807     XtManageChild(pane);
808 
809     resize_dialog(my_form, wx_alert_shell);
810 
811     XtPopup(wx_alert_shell, XtGrabNone);
812 
813     // Move focus to the Cancel button.  This appears to highlight the
814     // button fine, but we're not able to hit the <Enter> key to
815     // have that default function happen.  Note:  We _can_ hit the
816     // <SPACE> key, and that activates the option.
817 //        XmUpdateDisplay(wx_alert_shell);
818     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
819   }
820   else
821   {
822     (void)XRaiseWindow(XtDisplay(wx_alert_shell), XtWindow(wx_alert_shell));
823   }
824 } /* Display_Wx_Alert */
825 
826 
827 
828 
829 
830 /////////////////////////////////////////////////////////////////////
831 /////////////////////////////////////////////////////////////////////
832 /////////////////////////////////////////////////////////////////////
833 
834 
835 
836 
837 
838 /**** WX Station *******/
839 Widget wx_station_dialog=(Widget)NULL;
840 Widget WX_type_data;
841 Widget WX_temp_data;
842 Widget WX_wind_cse_data;
843 Widget WX_wind_spd_data;
844 Widget WX_wind_gst_data;
845 Widget WX_rain_data;
846 Widget WX_to_rain_data;
847 Widget WX_rain_h_data;
848 Widget WX_rain_24_data;
849 Widget WX_humidity_data;
850 Widget WX_speed_label;
851 Widget WX_gust_label;
852 Widget WX_temp_label;
853 Widget WX_rain_label;
854 Widget WX_to_rain_label;
855 Widget WX_rain_h_label;
856 Widget WX_rain_24_label;
857 Widget WX_dew_point_data;
858 Widget WX_high_wind_data;
859 Widget WX_wind_chill_data;
860 Widget WX_heat_index_data;
861 Widget WX_baro_data;
862 Widget WX_baro_label;
863 Widget WX_three_hour_baro_data;
864 Widget WX_three_hour_baro_label;
865 Widget WX_hi_temp_data;
866 Widget WX_low_temp_data;
867 Widget WX_dew_point_label;
868 Widget WX_wind_chill_label;
869 Widget WX_heat_index_label;
870 Widget WX_hi_temp_label;
871 Widget WX_low_temp_label;
872 Widget WX_high_wind_label;
873 
874 
875 
876 
877 
WX_station_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))878 void WX_station_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
879 {
880 
881   Widget shell = (Widget) clientData;
882   XtPopdown(shell);
883 
884   begin_critical_section(&wx_station_dialog_lock, "wx_gui.c:WX_station_destroy_shell" );
885 
886   XtDestroyWidget(shell);
887   wx_station_dialog = (Widget)NULL;
888 
889   end_critical_section(&wx_station_dialog_lock, "wx_gui.c:WX_station_destroy_shell" );
890 
891 }
892 
893 
894 
895 
896 
WX_station_change_data(Widget widget,XtPointer clientData,XtPointer callData)897 void WX_station_change_data(Widget widget, XtPointer clientData, XtPointer callData)
898 {
899 
900   WX_station_destroy_shell(widget,clientData,callData);
901 }
902 
903 
904 
905 
906 
907 // This is the "Own Weather Station" Dialog
908 //
WX_station(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))909 void WX_station( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
910 {
911   static Widget  pane, scrollwindow, my_form, form1, button_close, frame,
912          WX_type, temp, wind_cse, wind_spd, wind_gst,
913          my_rain, to_rain, rain_h, my_rain_24, baro,
914          dew_point,
915          high_wind, wind_chill,
916          heat_index, three_hour_baro,
917          hi_temp;
918   Atom delw;
919 
920   if(!wx_station_dialog)
921   {
922 
923     begin_critical_section(&wx_station_dialog_lock, "wx_gui.c:WX_station" );
924 
925     wx_station_dialog = XtVaCreatePopupShell(langcode("WXPUPSI000"),
926                         xmDialogShellWidgetClass, appshell,
927                         XmNdeleteResponse, XmDESTROY,
928                         XmNdefaultPosition, FALSE,
929                         XmNfontList, fontlist1,
930                         NULL);
931 
932     pane = XtVaCreateWidget("WX_station pane",xmPanedWindowWidgetClass, wx_station_dialog,
933                             XmNbackground, colors[0xff],
934                             NULL);
935 
936     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
937                                            xmScrolledWindowWidgetClass,
938                                            pane,
939                                            XmNscrollingPolicy, XmAUTOMATIC,
940                                            NULL);
941 
942     my_form =  XtVaCreateWidget("WX_station my_form",
943                                 xmFormWidgetClass,
944                                 scrollwindow,
945                                 XmNfractionBase,7,
946                                 XmNbackground, colors[0xff],
947                                 XmNautoUnmanage, FALSE,
948                                 XmNshadowThickness, 1,
949                                 NULL);
950 
951     WX_type = XtVaCreateManagedWidget(langcode("WXPUPSI001"),xmLabelWidgetClass, my_form,
952                                       XmNtraversalOn, FALSE,
953                                       XmNtopAttachment, XmATTACH_FORM,
954                                       XmNtopOffset, 10,
955                                       XmNbottomAttachment, XmATTACH_NONE,
956                                       XmNleftAttachment, XmATTACH_FORM,
957                                       XmNleftOffset, 10,
958                                       XmNrightAttachment, XmATTACH_NONE,
959                                       XmNbackground, colors[0xff],
960                                       XmNfontList, fontlist1,
961                                       NULL);
962 
963 
964     WX_type_data = XtVaCreateManagedWidget("WX_station type data", xmTextFieldWidgetClass, my_form,
965                                            XmNtraversalOn, FALSE,
966                                            XmNeditable,   FALSE,
967                                            XmNcursorPositionVisible, FALSE,
968                                            XmNsensitive, STIPPLE,
969                                            XmNshadowThickness,    1,
970                                            XmNcolumns, 70,
971                                            XmNtopOffset, 6,
972                                            XmNbackground, colors[0x0f],
973                                            XmNleftAttachment,XmATTACH_WIDGET,
974                                            XmNleftWidget, WX_type,
975                                            XmNleftOffset, 5,
976                                            XmNtopAttachment,XmATTACH_FORM,
977                                            XmNbottomAttachment,XmATTACH_NONE,
978                                            XmNrightAttachment,XmATTACH_FORM,
979                                            XmNrightOffset, 30,
980                                            XmNfontList, fontlist1,
981                                            NULL);
982 
983     frame = XtVaCreateManagedWidget("WX_station frame", xmFrameWidgetClass, my_form,
984                                     XmNtopAttachment,XmATTACH_WIDGET,
985                                     XmNtopWidget, WX_type_data,
986                                     XmNtopOffset,10,
987                                     XmNbottomAttachment,XmATTACH_NONE,
988                                     XmNleftAttachment, XmATTACH_FORM,
989                                     XmNleftOffset, 10,
990                                     XmNrightAttachment,XmATTACH_FORM,
991                                     XmNrightOffset, 10,
992                                     XmNbackground, colors[0xff],
993                                     NULL);
994 
995     // sts
996     (void)XtVaCreateManagedWidget(langcode("WXPUPSI002"),xmLabelWidgetClass,frame,
997                                   XmNtraversalOn, FALSE,
998                                   XmNchildType, XmFRAME_TITLE_CHILD,
999                                   XmNbackground, colors[0xff],
1000                                   XmNfontList, fontlist1,
1001                                   NULL);
1002 
1003     form1 =  XtVaCreateWidget("WX_station form1",xmFormWidgetClass, frame,
1004                               XmNtraversalOn, FALSE,
1005                               XmNfractionBase, 7,
1006                               XmNbackground, colors[0xff],
1007                               XmNtopAttachment, XmATTACH_FORM,
1008                               XmNbottomAttachment, XmATTACH_FORM,
1009                               XmNleftAttachment, XmATTACH_FORM,
1010                               XmNrightAttachment, XmATTACH_FORM,
1011                               XmNfontList, fontlist1,
1012                               NULL);
1013 
1014 
1015     wind_cse = XtVaCreateManagedWidget(langcode("WXPUPSI003"),xmLabelWidgetClass, form1,
1016                                        XmNtopAttachment, XmATTACH_FORM,
1017                                        XmNtopOffset, 10,
1018                                        XmNbottomAttachment, XmATTACH_NONE,
1019                                        XmNleftAttachment, XmATTACH_FORM,
1020                                        XmNleftOffset, 5,
1021                                        XmNrightAttachment, XmATTACH_NONE,
1022                                        XmNbackground, colors[0xff],
1023                                        XmNfontList, fontlist1,
1024                                        NULL);
1025 
1026 
1027     WX_wind_cse_data = XtVaCreateManagedWidget("WX_station wc data", xmTextFieldWidgetClass, form1,
1028                        XmNeditable,   FALSE,
1029                        XmNcursorPositionVisible, FALSE,
1030                        XmNsensitive, TRUE,
1031                        XmNshadowThickness,    1,
1032                        XmNcolumns, 6,
1033                        XmNmaxLength, 3,
1034                        XmNtopOffset, 6,
1035                        XmNbackground, colors[0x0f],
1036                        XmNleftAttachment, XmATTACH_POSITION,
1037                        XmNleftPosition, 2,
1038                        XmNrightAttachment, XmATTACH_NONE,
1039                        XmNtopAttachment,XmATTACH_FORM,
1040                        XmNbottomAttachment,XmATTACH_NONE,
1041                        XmNfontList, fontlist1,
1042                        NULL);
1043 
1044     // wind_deg
1045     (void)XtVaCreateManagedWidget(langcode("UNIOP00024"),xmLabelWidgetClass, form1,
1046                                   XmNtopAttachment, XmATTACH_FORM,
1047                                   XmNtopOffset, 12,
1048                                   XmNbottomAttachment, XmATTACH_NONE,
1049                                   XmNleftAttachment, XmATTACH_WIDGET,
1050                                   XmNleftWidget, WX_wind_cse_data,
1051                                   XmNleftOffset, 5,
1052                                   XmNrightAttachment, XmATTACH_NONE,
1053                                   XmNbackground, colors[0xff],
1054                                   XmNfontList, fontlist1,
1055                                   NULL);
1056 
1057     wind_spd = XtVaCreateManagedWidget(langcode("WXPUPSI004"),xmLabelWidgetClass, form1,
1058                                        XmNtopAttachment, XmATTACH_WIDGET,
1059                                        XmNtopWidget, wind_cse,
1060                                        XmNtopOffset, 11,
1061                                        XmNbottomAttachment, XmATTACH_NONE,
1062                                        XmNleftAttachment, XmATTACH_FORM,
1063                                        XmNleftOffset, 5,
1064                                        XmNrightAttachment, XmATTACH_NONE,
1065                                        XmNbackground, colors[0xff],
1066                                        XmNfontList, fontlist1,
1067                                        NULL);
1068 
1069 
1070     WX_wind_spd_data = XtVaCreateManagedWidget("WX_station ws data", xmTextFieldWidgetClass, form1,
1071                        XmNeditable,   FALSE,
1072                        XmNcursorPositionVisible, FALSE,
1073                        XmNsensitive, TRUE,
1074                        XmNshadowThickness,    1,
1075                        XmNcolumns, 6,
1076                        XmNmaxLength, 3,
1077                        XmNtopOffset, 7,
1078                        XmNbackground, colors[0x0f],
1079                        XmNleftAttachment, XmATTACH_POSITION,
1080                        XmNleftPosition, 2,
1081                        XmNrightAttachment, XmATTACH_NONE,
1082                        XmNtopAttachment,XmATTACH_WIDGET,
1083                        XmNtopWidget, wind_cse,
1084                        XmNbottomAttachment,XmATTACH_NONE,
1085                        XmNfontList, fontlist1,
1086                        NULL);
1087 
1088     WX_speed_label= XtVaCreateManagedWidget("WX_station speed label",xmTextFieldWidgetClass, form1,
1089                                             XmNeditable,   FALSE,
1090                                             XmNcursorPositionVisible, FALSE,
1091                                             XmNsensitive, STIPPLE,
1092                                             XmNshadowThickness,      0,
1093                                             XmNcolumns,5,
1094                                             XmNtopAttachment, XmATTACH_WIDGET,
1095                                             XmNtopWidget, wind_cse,
1096                                             XmNtopOffset, 9,
1097                                             XmNbottomAttachment, XmATTACH_NONE,
1098                                             XmNleftAttachment, XmATTACH_WIDGET,
1099                                             XmNleftWidget, WX_wind_spd_data,
1100                                             XmNleftOffset, 0,
1101                                             XmNrightAttachment, XmATTACH_NONE,
1102                                             XmNbackground, colors[0xff],
1103                                             XmNfontList, fontlist1,
1104                                             NULL);
1105 
1106     wind_gst = XtVaCreateManagedWidget(langcode("WXPUPSI005"),xmLabelWidgetClass, form1,
1107                                        XmNtopAttachment, XmATTACH_WIDGET,
1108                                        XmNtopWidget, wind_spd,
1109                                        XmNtopOffset, 11,
1110                                        XmNbottomAttachment, XmATTACH_NONE,
1111                                        XmNleftAttachment, XmATTACH_FORM,
1112                                        XmNleftOffset, 5,
1113                                        XmNrightAttachment, XmATTACH_NONE,
1114                                        XmNbackground, colors[0xff],
1115                                        XmNfontList, fontlist1,
1116                                        NULL);
1117 
1118 
1119     WX_wind_gst_data = XtVaCreateManagedWidget("WX_station wg data", xmTextFieldWidgetClass, form1,
1120                        XmNeditable,   FALSE,
1121                        XmNcursorPositionVisible, FALSE,
1122                        XmNsensitive, TRUE,
1123                        XmNshadowThickness,    1,
1124                        XmNcolumns, 6,
1125                        XmNmaxLength, 3,
1126                        XmNtopOffset, 7,
1127                        XmNbackground, colors[0x0f],
1128                        XmNleftAttachment, XmATTACH_POSITION,
1129                        XmNleftPosition, 2,
1130                        XmNrightAttachment, XmATTACH_NONE,
1131                        XmNtopAttachment,XmATTACH_WIDGET,
1132                        XmNtopWidget, wind_spd,
1133                        XmNbottomAttachment,XmATTACH_NONE,
1134                        XmNfontList, fontlist1,
1135                        NULL);
1136 
1137     WX_gust_label= XtVaCreateManagedWidget("WX_station gust label",xmTextFieldWidgetClass, form1,
1138                                            XmNeditable,   FALSE,
1139                                            XmNcursorPositionVisible, FALSE,
1140                                            XmNsensitive, STIPPLE,
1141                                            XmNshadowThickness,      0,
1142                                            XmNcolumns,5,
1143                                            XmNtopAttachment, XmATTACH_WIDGET,
1144                                            XmNtopWidget, wind_spd,
1145                                            XmNtopOffset, 9,
1146                                            XmNbottomAttachment, XmATTACH_NONE,
1147                                            XmNleftAttachment, XmATTACH_WIDGET,
1148                                            XmNleftWidget, WX_wind_gst_data,
1149                                            XmNleftOffset, 0,
1150                                            XmNrightAttachment, XmATTACH_NONE,
1151                                            XmNbackground, colors[0xff],
1152                                            XmNfontList, fontlist1,
1153                                            NULL);
1154 
1155     temp = XtVaCreateManagedWidget(langcode("WXPUPSI006"),xmLabelWidgetClass, form1,
1156                                    XmNtopAttachment, XmATTACH_WIDGET,
1157                                    XmNtopWidget, wind_gst,
1158                                    XmNtopOffset, 11,
1159                                    XmNbottomAttachment, XmATTACH_NONE,
1160                                    XmNleftAttachment, XmATTACH_FORM,
1161                                    XmNleftOffset, 5,
1162                                    XmNrightAttachment, XmATTACH_NONE,
1163                                    XmNbackground, colors[0xff],
1164                                    XmNfontList, fontlist1,
1165                                    NULL);
1166 
1167 
1168     WX_temp_data = XtVaCreateManagedWidget("WX_station temp data", xmTextFieldWidgetClass, form1,
1169                                            XmNeditable,   FALSE,
1170                                            XmNcursorPositionVisible, FALSE,
1171                                            XmNsensitive, TRUE,
1172                                            XmNshadowThickness,    1,
1173                                            XmNcolumns, 6,
1174                                            XmNmaxLength, 8,
1175                                            XmNtopOffset, 7,
1176                                            XmNbackground, colors[0x0f],
1177                                            XmNleftAttachment, XmATTACH_POSITION,
1178                                            XmNleftPosition, 2,
1179                                            XmNrightAttachment, XmATTACH_NONE,
1180                                            XmNtopAttachment,XmATTACH_WIDGET,
1181                                            XmNtopWidget, wind_gst,
1182                                            XmNbottomAttachment,XmATTACH_NONE,
1183                                            XmNfontList, fontlist1,
1184                                            NULL);
1185 
1186     WX_temp_label= XtVaCreateManagedWidget("WX_station temp label",xmTextFieldWidgetClass, form1,
1187                                            XmNeditable,   FALSE,
1188                                            XmNcursorPositionVisible, FALSE,
1189                                            XmNsensitive, STIPPLE,
1190                                            XmNshadowThickness,      0,
1191                                            XmNcolumns,5,
1192                                            XmNtopAttachment, XmATTACH_WIDGET,
1193                                            XmNtopWidget, wind_gst,
1194                                            XmNtopOffset, 9,
1195                                            XmNbottomAttachment, XmATTACH_NONE,
1196                                            XmNleftAttachment, XmATTACH_WIDGET,
1197                                            XmNleftWidget, WX_temp_data,
1198                                            XmNleftOffset, 0,
1199                                            XmNrightAttachment, XmATTACH_NONE,
1200                                            XmNbackground, colors[0xff],
1201                                            XmNfontList, fontlist1,
1202                                            NULL);
1203 
1204     my_rain = XtVaCreateManagedWidget(langcode("WXPUPSI007"),xmLabelWidgetClass, form1,
1205                                       XmNtopAttachment, XmATTACH_WIDGET,
1206                                       XmNtopWidget, temp,
1207                                       XmNtopOffset, 11,
1208                                       XmNbottomAttachment, XmATTACH_NONE,
1209                                       XmNleftAttachment, XmATTACH_FORM,
1210                                       XmNleftOffset, 5,
1211                                       XmNrightAttachment, XmATTACH_NONE,
1212                                       XmNbackground, colors[0xff],
1213                                       XmNfontList, fontlist1,
1214                                       NULL);
1215 
1216 
1217     WX_rain_data = XtVaCreateManagedWidget("WX_station rain data", xmTextFieldWidgetClass, form1,
1218                                            XmNeditable,   FALSE,
1219                                            XmNcursorPositionVisible, FALSE,
1220                                            XmNsensitive, TRUE,
1221                                            XmNshadowThickness,    1,
1222                                            XmNcolumns, 6,
1223                                            XmNmaxLength, 10,
1224                                            XmNtopOffset, 7,
1225                                            XmNbackground, colors[0x0f],
1226                                            XmNleftAttachment, XmATTACH_POSITION,
1227                                            XmNleftPosition, 2,
1228                                            XmNrightAttachment, XmATTACH_NONE,
1229                                            XmNtopAttachment,XmATTACH_WIDGET,
1230                                            XmNtopWidget, temp,
1231                                            XmNbottomAttachment,XmATTACH_NONE,
1232                                            XmNfontList, fontlist1,
1233                                            NULL);
1234 
1235     WX_rain_label= XtVaCreateManagedWidget("WX_station rain label",xmTextFieldWidgetClass, form1,
1236                                            XmNeditable,   FALSE,
1237                                            XmNcursorPositionVisible, FALSE,
1238                                            XmNsensitive, STIPPLE,
1239                                            XmNshadowThickness,      0,
1240                                            XmNcolumns,5,
1241                                            XmNtopAttachment, XmATTACH_WIDGET,
1242                                            XmNtopWidget, temp,
1243                                            XmNtopOffset, 9,
1244                                            XmNbottomAttachment, XmATTACH_NONE,
1245                                            XmNleftAttachment, XmATTACH_WIDGET,
1246                                            XmNleftWidget, WX_rain_data,
1247                                            XmNleftOffset, 0,
1248                                            XmNrightAttachment, XmATTACH_NONE,
1249                                            XmNbackground, colors[0xff],
1250                                            XmNfontList, fontlist1,
1251                                            NULL);
1252 
1253     to_rain = XtVaCreateManagedWidget(langcode("WXPUPSI008"),xmLabelWidgetClass, form1,
1254                                       XmNtopAttachment, XmATTACH_WIDGET,
1255                                       XmNtopWidget, my_rain,
1256                                       XmNtopOffset, 11,
1257                                       XmNbottomAttachment, XmATTACH_NONE,
1258                                       XmNleftAttachment, XmATTACH_FORM,
1259                                       XmNleftOffset, 5,
1260                                       XmNrightAttachment, XmATTACH_NONE,
1261                                       XmNbackground, colors[0xff],
1262                                       XmNfontList, fontlist1,
1263                                       NULL);
1264 
1265 
1266     WX_to_rain_data = XtVaCreateManagedWidget("WX_station today rain data", xmTextFieldWidgetClass, form1,
1267                       XmNeditable,   FALSE,
1268                       XmNcursorPositionVisible, FALSE,
1269                       XmNsensitive, TRUE,
1270                       XmNshadowThickness,    1,
1271                       XmNcolumns, 6,
1272                       XmNmaxLength, 10,
1273                       XmNtopOffset, 7,
1274                       XmNbackground, colors[0x0f],
1275                       XmNleftAttachment, XmATTACH_POSITION,
1276                       XmNleftPosition, 2,
1277                       XmNrightAttachment, XmATTACH_NONE,
1278                       XmNtopAttachment,XmATTACH_WIDGET,
1279                       XmNtopWidget, my_rain,
1280                       XmNbottomAttachment,XmATTACH_NONE,
1281                       XmNfontList, fontlist1,
1282                       NULL);
1283 
1284 
1285     WX_to_rain_label= XtVaCreateManagedWidget("WX_station to label",xmTextFieldWidgetClass, form1,
1286                       XmNeditable,   FALSE,
1287                       XmNcursorPositionVisible, FALSE,
1288                       XmNsensitive, STIPPLE,
1289                       XmNshadowThickness,      0,
1290                       XmNcolumns,10,
1291                       XmNtopAttachment, XmATTACH_WIDGET,
1292                       XmNtopWidget, my_rain,
1293                       XmNtopOffset, 9,
1294                       XmNbottomAttachment, XmATTACH_NONE,
1295                       XmNleftAttachment, XmATTACH_WIDGET,
1296                       XmNleftWidget, WX_to_rain_data,
1297                       XmNleftOffset, 0,
1298                       XmNrightAttachment, XmATTACH_NONE,
1299                       XmNbackground, colors[0xff],
1300                       XmNfontList, fontlist1,
1301                       NULL);
1302 
1303     rain_h = XtVaCreateManagedWidget(langcode("WXPUPSI014"),xmLabelWidgetClass, form1,
1304                                      XmNtopAttachment, XmATTACH_WIDGET,
1305                                      XmNtopWidget, to_rain,
1306                                      XmNtopOffset, 11,
1307                                      XmNbottomAttachment, XmATTACH_NONE,
1308                                      XmNleftAttachment, XmATTACH_FORM,
1309                                      XmNleftOffset, 5,
1310                                      XmNrightAttachment, XmATTACH_NONE,
1311                                      XmNbackground, colors[0xff],
1312                                      XmNfontList, fontlist1,
1313                                      NULL);
1314 
1315 
1316     WX_rain_h_data = XtVaCreateManagedWidget("WX_station hour rain data", xmTextFieldWidgetClass, form1,
1317                      XmNeditable,   FALSE,
1318                      XmNcursorPositionVisible, FALSE,
1319                      XmNsensitive, TRUE,
1320                      XmNshadowThickness,    1,
1321                      XmNcolumns, 6,
1322                      XmNmaxLength, 10,
1323                      XmNtopOffset, 7,
1324                      XmNbackground, colors[0x0f],
1325                      XmNleftAttachment, XmATTACH_POSITION,
1326                      XmNleftPosition, 2,
1327                      XmNrightAttachment, XmATTACH_NONE,
1328                      XmNtopAttachment,XmATTACH_WIDGET,
1329                      XmNtopWidget, to_rain,
1330                      XmNbottomAttachment,XmATTACH_NONE,
1331                      XmNfontList, fontlist1,
1332                      NULL);
1333 
1334 
1335     WX_rain_h_label= XtVaCreateManagedWidget("WX_station hour label",xmTextFieldWidgetClass, form1,
1336                      XmNeditable,   FALSE,
1337                      XmNcursorPositionVisible, FALSE,
1338                      XmNsensitive, STIPPLE,
1339                      XmNshadowThickness,      0,
1340                      XmNcolumns,10,
1341                      XmNtopAttachment, XmATTACH_WIDGET,
1342                      XmNtopWidget, to_rain,
1343                      XmNtopOffset, 9,
1344                      XmNbottomAttachment, XmATTACH_NONE,
1345                      XmNleftAttachment, XmATTACH_WIDGET,
1346                      XmNleftWidget, WX_rain_h_data,
1347                      XmNleftOffset, 0,
1348                      XmNrightAttachment, XmATTACH_NONE,
1349                      XmNbackground, colors[0xff],
1350                      XmNfontList, fontlist1,
1351                      NULL);
1352 
1353     my_rain_24 = XtVaCreateManagedWidget(langcode("WXPUPSI015"),xmLabelWidgetClass, form1,
1354                                          XmNtopAttachment, XmATTACH_WIDGET,
1355                                          XmNtopWidget, rain_h,
1356                                          XmNtopOffset, 11,
1357                                          XmNbottomAttachment, XmATTACH_NONE,
1358                                          XmNleftAttachment, XmATTACH_FORM,
1359                                          XmNleftOffset, 5,
1360                                          XmNrightAttachment, XmATTACH_NONE,
1361                                          XmNbackground, colors[0xff],
1362                                          XmNfontList, fontlist1,
1363                                          NULL);
1364 
1365 
1366     WX_rain_24_data = XtVaCreateManagedWidget("WX_station 24h rain data", xmTextFieldWidgetClass, form1,
1367                       XmNeditable,   FALSE,
1368                       XmNcursorPositionVisible, FALSE,
1369                       XmNsensitive, TRUE,
1370                       XmNshadowThickness,    1,
1371                       XmNcolumns, 6,
1372                       XmNmaxLength, 10,
1373                       XmNtopOffset, 7,
1374                       XmNbackground, colors[0x0f],
1375                       XmNleftAttachment, XmATTACH_POSITION,
1376                       XmNleftPosition, 2,
1377                       XmNrightAttachment, XmATTACH_NONE,
1378                       XmNtopAttachment,XmATTACH_WIDGET,
1379                       XmNtopWidget, rain_h,
1380                       XmNbottomAttachment,XmATTACH_NONE,
1381                       XmNfontList, fontlist1,
1382                       NULL);
1383 
1384 
1385     WX_rain_24_label= XtVaCreateManagedWidget("WX_station 24h label",xmTextFieldWidgetClass, form1,
1386                       XmNeditable,   FALSE,
1387                       XmNcursorPositionVisible, FALSE,
1388                       XmNsensitive, STIPPLE,
1389                       XmNshadowThickness,      0,
1390                       XmNcolumns,10,
1391                       XmNtopAttachment, XmATTACH_WIDGET,
1392                       XmNtopWidget, rain_h,
1393                       XmNtopOffset, 9,
1394                       XmNbottomAttachment, XmATTACH_NONE,
1395                       XmNleftAttachment, XmATTACH_WIDGET,
1396                       XmNleftWidget, WX_rain_24_data,
1397                       XmNleftOffset, 0,
1398                       XmNrightAttachment, XmATTACH_NONE,
1399                       XmNbackground, colors[0xff],
1400                       XmNfontList, fontlist1,
1401                       NULL);
1402 
1403     // humidity
1404     (void)XtVaCreateManagedWidget(langcode("WXPUPSI010"),xmLabelWidgetClass, form1,
1405                                   XmNtopAttachment, XmATTACH_WIDGET,
1406                                   XmNtopWidget, my_rain_24,
1407                                   XmNtopOffset, 11,
1408                                   XmNbottomAttachment, XmATTACH_NONE,
1409                                   XmNleftAttachment, XmATTACH_FORM,
1410                                   XmNleftOffset, 5,
1411                                   XmNrightAttachment, XmATTACH_NONE,
1412                                   XmNbackground, colors[0xff],
1413                                   XmNfontList, fontlist1,
1414                                   NULL);
1415 
1416 
1417     WX_humidity_data = XtVaCreateManagedWidget("WX_station Humidity data", xmTextFieldWidgetClass, form1,
1418                        XmNeditable,   FALSE,
1419                        XmNcursorPositionVisible, FALSE,
1420                        XmNsensitive, TRUE,
1421                        XmNshadowThickness,    1,
1422                        XmNcolumns, 6,
1423                        XmNmaxLength, 8,
1424                        XmNtopOffset, 7,
1425                        XmNbackground, colors[0x0f],
1426                        XmNleftAttachment, XmATTACH_POSITION,
1427                        XmNleftPosition, 2,
1428                        XmNrightAttachment, XmATTACH_NONE,
1429                        XmNtopAttachment,XmATTACH_WIDGET,
1430                        XmNtopWidget, my_rain_24,
1431                        XmNbottomAttachment,XmATTACH_NONE,
1432                        XmNfontList, fontlist1,
1433                        NULL);
1434 
1435     // humidity_n
1436     (void)XtVaCreateManagedWidget(langcode("UNIOP00026"),xmLabelWidgetClass, form1,
1437                                   XmNtopAttachment, XmATTACH_WIDGET,
1438                                   XmNtopWidget, my_rain_24,
1439                                   XmNtopOffset, 12,
1440                                   XmNbottomAttachment, XmATTACH_NONE,
1441                                   XmNleftAttachment, XmATTACH_WIDGET,
1442                                   XmNleftWidget, WX_humidity_data,
1443                                   XmNleftOffset, 5,
1444                                   XmNrightAttachment, XmATTACH_NONE,
1445                                   XmNbackground, colors[0xff],
1446                                   XmNfontList, fontlist1,
1447                                   NULL);
1448 
1449 
1450     dew_point = XtVaCreateManagedWidget(langcode("WXPUPSI018"),xmLabelWidgetClass, form1,
1451                                         XmNtopAttachment, XmATTACH_FORM,
1452                                         XmNtopOffset, 12,
1453                                         XmNbottomAttachment, XmATTACH_NONE,
1454                                         XmNleftAttachment, XmATTACH_POSITION,
1455                                         XmNleftPosition, 4,
1456                                         XmNrightAttachment, XmATTACH_NONE,
1457                                         XmNbackground, colors[0xff],
1458                                         XmNfontList, fontlist1,
1459                                         NULL);
1460 
1461     WX_dew_point_data = XtVaCreateManagedWidget("WX_station dew point", xmTextFieldWidgetClass, form1,
1462                         XmNeditable,   FALSE,
1463                         XmNcursorPositionVisible, FALSE,
1464                         XmNsensitive, STIPPLE,
1465                         XmNshadowThickness,1,
1466                         XmNcolumns, 6,
1467                         XmNtopAttachment, XmATTACH_FORM,
1468                         XmNtopOffset, 8,
1469                         XmNbottomAttachment, XmATTACH_NONE,
1470                         XmNleftAttachment, XmATTACH_POSITION,
1471                         XmNleftPosition, 5,
1472                         XmNrightAttachment, XmATTACH_NONE,
1473                         XmNbackground, colors[0x0f],
1474                         XmNfontList, fontlist1,
1475                         NULL);
1476 
1477     WX_dew_point_label = XtVaCreateManagedWidget("WX_station dew label",xmTextFieldWidgetClass, form1,
1478                          XmNeditable,   FALSE,
1479                          XmNcursorPositionVisible, FALSE,
1480                          XmNsensitive, STIPPLE,
1481                          XmNshadowThickness,0,
1482                          XmNtopAttachment, XmATTACH_FORM,
1483                          XmNtopOffset, 10,
1484                          XmNbottomAttachment, XmATTACH_NONE,
1485                          XmNleftAttachment, XmATTACH_WIDGET,
1486                          XmNleftWidget, WX_dew_point_data,
1487                          XmNleftOffset, 5,
1488                          XmNrightAttachment, XmATTACH_NONE,
1489                          XmNbackground, colors[0xff],
1490                          XmNfontList, fontlist1,
1491                          NULL);
1492 
1493     high_wind = XtVaCreateManagedWidget(langcode("WXPUPSI019"),xmLabelWidgetClass, form1,
1494                                         XmNtopAttachment, XmATTACH_WIDGET,
1495                                         XmNtopWidget, dew_point,
1496                                         XmNtopOffset, 11,
1497                                         XmNbottomAttachment, XmATTACH_NONE,
1498                                         XmNleftAttachment, XmATTACH_POSITION,
1499                                         XmNleftPosition, 4,
1500                                         XmNrightAttachment, XmATTACH_NONE,
1501                                         XmNbackground, colors[0xff],
1502                                         XmNfontList, fontlist1,
1503                                         NULL);
1504 
1505     WX_high_wind_data = XtVaCreateManagedWidget("WX_station High Wind", xmTextFieldWidgetClass, form1,
1506                         XmNeditable,   FALSE,
1507                         XmNcursorPositionVisible, FALSE,
1508                         XmNcolumns, 6,
1509                         XmNsensitive, TRUE,
1510                         XmNshadowThickness,1,
1511                         XmNleftAttachment, XmATTACH_POSITION,
1512                         XmNleftPosition, 5,
1513                         XmNrightAttachment, XmATTACH_NONE,
1514                         XmNtopAttachment,XmATTACH_WIDGET,
1515                         XmNtopWidget, dew_point,
1516                         XmNtopOffset, 7,
1517                         XmNbottomAttachment,XmATTACH_NONE,
1518                         XmNbackground, colors[0x0f],
1519                         XmNfontList, fontlist1,
1520                         NULL);
1521 
1522     WX_high_wind_label = XtVaCreateManagedWidget("WX_station high wind label",xmTextFieldWidgetClass, form1,
1523                          XmNeditable,   FALSE,
1524                          XmNcursorPositionVisible, FALSE,
1525                          XmNsensitive, STIPPLE,
1526                          XmNshadowThickness,0,
1527                          XmNtopAttachment, XmATTACH_WIDGET,
1528                          XmNtopWidget,dew_point,
1529                          XmNtopOffset, 8,
1530                          XmNbottomAttachment, XmATTACH_NONE,
1531                          XmNleftAttachment, XmATTACH_WIDGET,
1532                          XmNleftWidget, WX_high_wind_data,
1533                          XmNleftOffset, 5,
1534                          XmNrightAttachment, XmATTACH_NONE,
1535                          XmNbackground, colors[0xff],
1536                          XmNfontList, fontlist1,
1537                          NULL);
1538 
1539     wind_chill = XtVaCreateManagedWidget(langcode("WXPUPSI020"),xmLabelWidgetClass, form1,
1540                                          XmNtopAttachment, XmATTACH_WIDGET,
1541                                          XmNtopWidget, high_wind,
1542                                          XmNtopOffset, 11,
1543                                          XmNbottomAttachment, XmATTACH_NONE,
1544                                          XmNleftAttachment, XmATTACH_POSITION,
1545                                          XmNleftPosition, 4,
1546                                          XmNrightAttachment, XmATTACH_NONE,
1547                                          XmNbackground, colors[0xff],
1548                                          XmNfontList, fontlist1,
1549                                          NULL);
1550 
1551     WX_wind_chill_data = XtVaCreateManagedWidget("WX_station Wind Chill", xmTextFieldWidgetClass, form1,
1552                          XmNeditable,   FALSE,
1553                          XmNcursorPositionVisible, FALSE,
1554                          XmNcolumns, 6,
1555                          XmNsensitive,TRUE,
1556                          XmNshadowThickness,1,
1557                          XmNleftAttachment, XmATTACH_POSITION,
1558                          XmNleftPosition, 5,
1559                          XmNrightAttachment, XmATTACH_NONE,
1560                          XmNtopAttachment,XmATTACH_WIDGET,
1561                          XmNtopWidget, high_wind,
1562                          XmNtopOffset, 7,
1563                          XmNbottomAttachment,XmATTACH_NONE,
1564                          XmNbackground, colors[0x0f],
1565                          XmNfontList, fontlist1,
1566                          NULL);
1567 
1568     WX_wind_chill_label = XtVaCreateManagedWidget("WX_station wind label",xmTextFieldWidgetClass, form1,
1569                           XmNeditable,   FALSE,
1570                           XmNcursorPositionVisible, FALSE,
1571                           XmNsensitive, STIPPLE,
1572                           XmNshadowThickness,0,
1573                           XmNtopAttachment, XmATTACH_WIDGET,
1574                           XmNtopWidget,high_wind,
1575                           XmNtopOffset, 8,
1576                           XmNbottomAttachment, XmATTACH_NONE,
1577                           XmNleftAttachment, XmATTACH_WIDGET,
1578                           XmNleftWidget, WX_wind_chill_data,
1579                           XmNleftOffset, 5,
1580                           XmNrightAttachment, XmATTACH_NONE,
1581                           XmNbackground, colors[0xff],
1582                           XmNfontList, fontlist1,
1583                           NULL);
1584 
1585     heat_index = XtVaCreateManagedWidget(langcode("WXPUPSI021"),xmLabelWidgetClass, form1,
1586                                          XmNtopAttachment, XmATTACH_WIDGET,
1587                                          XmNtopWidget, wind_chill,
1588                                          XmNtopOffset, 11,
1589                                          XmNbottomAttachment, XmATTACH_NONE,
1590                                          XmNleftAttachment, XmATTACH_POSITION,
1591                                          XmNleftPosition, 4,
1592                                          XmNrightAttachment, XmATTACH_NONE,
1593                                          XmNbackground, colors[0xff],
1594                                          XmNfontList, fontlist1,
1595                                          NULL);
1596 
1597     WX_heat_index_data = XtVaCreateManagedWidget("WX_station Heat Index", xmTextFieldWidgetClass, form1,
1598                          XmNeditable,   FALSE,
1599                          XmNcursorPositionVisible, FALSE,
1600                          XmNcolumns, 6,
1601                          XmNsensitive,TRUE,
1602                          XmNshadowThickness,1,
1603                          XmNleftAttachment, XmATTACH_POSITION,
1604                          XmNleftPosition, 5,
1605                          XmNrightAttachment, XmATTACH_NONE,
1606                          XmNtopAttachment,XmATTACH_WIDGET,
1607                          XmNtopWidget, wind_chill,
1608                          XmNtopOffset, 7,
1609                          XmNbottomAttachment,XmATTACH_NONE,
1610                          XmNbackground, colors[0x0f],
1611                          XmNfontList, fontlist1,
1612                          NULL);
1613 
1614     WX_heat_index_label = XtVaCreateManagedWidget("WX_station heat label",xmTextFieldWidgetClass, form1,
1615                           XmNeditable,   FALSE,
1616                           XmNcursorPositionVisible, FALSE,
1617                           XmNsensitive, STIPPLE,
1618                           XmNshadowThickness,0,
1619                           XmNtopAttachment, XmATTACH_WIDGET,
1620                           XmNtopWidget,wind_chill,
1621                           XmNtopOffset, 8,
1622                           XmNbottomAttachment, XmATTACH_NONE,
1623                           XmNleftAttachment, XmATTACH_WIDGET,
1624                           XmNleftWidget, WX_heat_index_data,
1625                           XmNleftOffset, 5,
1626                           XmNrightAttachment, XmATTACH_NONE,
1627                           XmNbackground, colors[0xff],
1628                           XmNfontList, fontlist1,
1629                           NULL);
1630 
1631     baro = XtVaCreateManagedWidget(langcode("WXPUPSI009"),xmLabelWidgetClass, form1,
1632                                    XmNtopAttachment, XmATTACH_WIDGET,
1633                                    XmNtopWidget, heat_index,
1634                                    XmNtopOffset, 11,
1635                                    XmNbottomAttachment, XmATTACH_NONE,
1636                                    XmNleftAttachment, XmATTACH_POSITION,
1637                                    XmNleftPosition, 4,
1638                                    XmNrightAttachment, XmATTACH_NONE,
1639                                    XmNbackground, colors[0xff],
1640                                    XmNfontList, fontlist1,
1641                                    NULL);
1642 
1643     WX_baro_data = XtVaCreateManagedWidget("WX_station Baro", xmTextFieldWidgetClass, form1,
1644                                            XmNeditable,   FALSE,
1645                                            XmNcursorPositionVisible, FALSE,
1646                                            XmNcolumns, 6,
1647                                            XmNsensitive,TRUE,
1648                                            XmNshadowThickness,1,
1649                                            XmNleftAttachment, XmATTACH_POSITION,
1650                                            XmNleftPosition, 5,
1651                                            XmNrightAttachment, XmATTACH_NONE,
1652                                            XmNtopAttachment,XmATTACH_WIDGET,
1653                                            XmNtopWidget, heat_index,
1654                                            XmNtopOffset, 7,
1655                                            XmNbottomAttachment,XmATTACH_NONE,
1656                                            XmNbackground, colors[0x0f],
1657                                            XmNfontList, fontlist1,
1658                                            NULL);
1659 
1660     WX_baro_label = XtVaCreateManagedWidget("WX_Station baro unit label",xmTextFieldWidgetClass, form1,
1661                                             XmNeditable,   FALSE,
1662                                             XmNcursorPositionVisible, FALSE,
1663                                             XmNsensitive, STIPPLE,
1664                                             XmNshadowThickness,0,
1665                                             XmNtopAttachment, XmATTACH_WIDGET,
1666                                             XmNtopWidget,heat_index,
1667                                             XmNtopOffset, 12,
1668                                             XmNbottomAttachment, XmATTACH_NONE,
1669                                             XmNleftAttachment, XmATTACH_WIDGET,
1670                                             XmNleftWidget, WX_baro_data,
1671                                             XmNleftOffset, 5,
1672                                             XmNrightAttachment, XmATTACH_NONE,
1673                                             XmNbackground, colors[0xff],
1674                                             XmNfontList, fontlist1,
1675                                             NULL);
1676 
1677 
1678     three_hour_baro = XtVaCreateManagedWidget(langcode("WXPUPSI022"),xmLabelWidgetClass, form1,
1679                       XmNtopAttachment, XmATTACH_WIDGET,
1680                       XmNtopWidget, baro,
1681                       XmNtopOffset, 11,
1682                       XmNbottomAttachment, XmATTACH_NONE,
1683                       XmNleftAttachment, XmATTACH_POSITION,
1684                       XmNleftPosition, 4,
1685                       XmNrightAttachment, XmATTACH_NONE,
1686                       XmNbackground, colors[0xff],
1687                       XmNfontList, fontlist1,
1688                       NULL);
1689 
1690     WX_three_hour_baro_data = XtVaCreateManagedWidget("WX_station 3-Hr Baro", xmTextFieldWidgetClass, form1,
1691                               XmNeditable,   FALSE,
1692                               XmNcursorPositionVisible, FALSE,
1693                               XmNcolumns, 6,
1694                               XmNsensitive,TRUE,
1695                               XmNshadowThickness,1,
1696                               XmNleftAttachment, XmATTACH_POSITION,
1697                               XmNleftPosition, 5,
1698                               XmNrightAttachment, XmATTACH_NONE,
1699                               XmNtopAttachment,XmATTACH_WIDGET,
1700                               XmNtopWidget, baro,
1701                               XmNtopOffset, 7,
1702                               XmNbottomAttachment,XmATTACH_NONE,
1703                               XmNbackground, colors[0x0f],
1704                               XmNfontList, fontlist1,
1705                               NULL);
1706 
1707     WX_three_hour_baro_label = XtVaCreateManagedWidget("WX_station 3hr baro unit label",xmTextFieldWidgetClass, form1,
1708                                XmNeditable,   FALSE,
1709                                XmNcursorPositionVisible, FALSE,
1710                                XmNsensitive, STIPPLE,
1711                                XmNshadowThickness,0,
1712                                XmNtopAttachment, XmATTACH_WIDGET,
1713                                XmNtopWidget,  baro,
1714                                XmNtopOffset, 12,
1715                                XmNbottomAttachment, XmATTACH_NONE,
1716                                XmNleftAttachment, XmATTACH_WIDGET,
1717                                XmNleftWidget, WX_three_hour_baro_data,
1718                                XmNleftOffset, 5,
1719                                XmNrightAttachment, XmATTACH_NONE,
1720                                XmNbackground, colors[0xff],
1721                                XmNfontList, fontlist1,
1722                                NULL);
1723 
1724     hi_temp = XtVaCreateManagedWidget(langcode("WXPUPSI023"),xmLabelWidgetClass, form1,
1725                                       XmNtopAttachment, XmATTACH_WIDGET,
1726                                       XmNtopWidget, three_hour_baro,
1727                                       XmNtopOffset, 11,
1728                                       XmNbottomAttachment, XmATTACH_NONE,
1729                                       XmNleftAttachment, XmATTACH_POSITION,
1730                                       XmNleftPosition, 4,
1731                                       XmNrightAttachment, XmATTACH_NONE,
1732                                       XmNbackground, colors[0xff],
1733                                       XmNfontList, fontlist1,
1734                                       NULL);
1735 
1736     WX_hi_temp_data = XtVaCreateManagedWidget("WX_station Today's High Temp", xmTextFieldWidgetClass, form1,
1737                       XmNeditable,   FALSE,
1738                       XmNcursorPositionVisible, FALSE,
1739                       XmNcolumns, 6,
1740                       XmNsensitive,TRUE,
1741                       XmNshadowThickness,1,
1742                       XmNleftAttachment, XmATTACH_POSITION,
1743                       XmNleftPosition, 5,
1744                       XmNrightAttachment, XmATTACH_NONE,
1745                       XmNtopAttachment,XmATTACH_WIDGET,
1746                       XmNtopWidget, three_hour_baro,
1747                       XmNtopOffset, 7,
1748                       XmNbottomAttachment,XmATTACH_NONE,
1749                       XmNbackground, colors[0x0f],
1750                       XmNfontList, fontlist1,
1751                       NULL);
1752 
1753     WX_hi_temp_label = XtVaCreateManagedWidget("WX_station high temp label",xmTextFieldWidgetClass, form1,
1754                        XmNeditable,   FALSE,
1755                        XmNcursorPositionVisible, FALSE,
1756                        XmNsensitive, STIPPLE,
1757                        XmNshadowThickness,0,
1758                        XmNtopAttachment, XmATTACH_WIDGET,
1759                        XmNtopWidget,  three_hour_baro,
1760                        XmNtopOffset, 8,
1761                        XmNbottomAttachment, XmATTACH_NONE,
1762                        XmNleftAttachment, XmATTACH_WIDGET,
1763                        XmNleftWidget, WX_hi_temp_data,
1764                        XmNleftOffset, 5,
1765                        XmNrightAttachment, XmATTACH_NONE,
1766                        XmNbackground, colors[0xff],
1767                        XmNfontList, fontlist1,
1768                        NULL);
1769 
1770     // low_temp
1771     (void)XtVaCreateManagedWidget(langcode("WXPUPSI024"),xmLabelWidgetClass, form1,
1772                                   XmNtopAttachment, XmATTACH_WIDGET,
1773                                   XmNtopWidget, hi_temp,
1774                                   XmNtopOffset, 11,
1775                                   XmNbottomAttachment, XmATTACH_NONE,
1776                                   XmNleftAttachment, XmATTACH_POSITION,
1777                                   XmNleftPosition, 4,
1778                                   XmNrightAttachment, XmATTACH_NONE,
1779                                   XmNbackground, colors[0xff],
1780                                   XmNfontList, fontlist1,
1781                                   NULL);
1782 
1783     WX_low_temp_data = XtVaCreateManagedWidget("WX_station Today's Low Temp", xmTextFieldWidgetClass, form1,
1784                        XmNeditable,   FALSE,
1785                        XmNcursorPositionVisible, FALSE,
1786                        XmNcolumns, 6,
1787                        XmNsensitive,TRUE,
1788                        XmNshadowThickness,1,
1789                        XmNleftAttachment, XmATTACH_POSITION,
1790                        XmNleftPosition, 5,
1791                        XmNrightAttachment, XmATTACH_NONE,
1792                        XmNtopAttachment,XmATTACH_WIDGET,
1793                        XmNtopWidget, hi_temp,
1794                        XmNtopOffset, 7,
1795                        XmNbottomAttachment,XmATTACH_NONE,
1796                        XmNbackground, colors[0x0f],
1797                        XmNfontList, fontlist1,
1798                        NULL);
1799 
1800     WX_low_temp_label = XtVaCreateManagedWidget("WX_station low temp label",xmTextFieldWidgetClass, form1,
1801                         XmNeditable,   FALSE,
1802                         XmNcursorPositionVisible, FALSE,
1803                         XmNsensitive, STIPPLE,
1804                         XmNshadowThickness,0,
1805                         XmNtopAttachment, XmATTACH_WIDGET,
1806                         XmNtopWidget,  hi_temp,
1807                         XmNtopOffset, 8,
1808                         XmNbottomAttachment, XmATTACH_NONE,
1809                         XmNleftAttachment, XmATTACH_WIDGET,
1810                         XmNleftWidget, WX_low_temp_data,
1811                         XmNleftOffset, 5,
1812                         XmNrightAttachment, XmATTACH_NONE,
1813                         XmNbackground, colors[0xff],
1814                         XmNfontList, fontlist1,
1815                         NULL);
1816 
1817 
1818     button_close = XtVaCreateManagedWidget(langcode("UNIOP00003"),xmPushButtonGadgetClass, my_form,
1819                                            XmNtraversalOn, TRUE,
1820                                            XmNtopAttachment, XmATTACH_WIDGET,
1821                                            XmNtopWidget, frame,
1822                                            XmNtopOffset, 10,
1823                                            XmNbottomAttachment, XmATTACH_FORM,
1824                                            XmNbottomOffset,10,
1825                                            XmNleftAttachment, XmATTACH_POSITION,
1826                                            XmNleftPosition, 3,
1827                                            XmNrightAttachment, XmATTACH_POSITION,
1828                                            XmNrightPosition, 4,
1829                                            XmNbackground, colors[0xff],
1830                                            XmNfontList, fontlist1,
1831                                            NULL);
1832 
1833     XtAddCallback(button_close, XmNactivateCallback, WX_station_destroy_shell, wx_station_dialog);
1834 
1835     pos_dialog(wx_station_dialog);
1836 
1837     delw = XmInternAtom(XtDisplay(wx_station_dialog),"WM_DELETE_WINDOW", FALSE);
1838     XmAddWMProtocolCallback(wx_station_dialog, delw, WX_station_destroy_shell, (XtPointer)wx_station_dialog);
1839 
1840     XtManageChild(my_form);
1841     XtManageChild(form1);
1842     XtManageChild(pane);
1843 
1844     resize_dialog(my_form, wx_station_dialog);
1845 
1846     end_critical_section(&wx_station_dialog_lock, "wx_gui.c:WX_station" );
1847 
1848     XtPopup(wx_station_dialog,XtGrabNone);
1849     fill_wx_data();
1850   }
1851   else
1852   {
1853     (void)XRaiseWindow(XtDisplay(wx_station_dialog), XtWindow(wx_station_dialog));
1854   }
1855 }
1856 
1857 
1858 
1859 
1860 
fill_wx_data(void)1861 void fill_wx_data(void)
1862 {
1863   DataRow *p_station;
1864   char temp[20];
1865   WeatherRow *weather;
1866 
1867   if (wx_station_dialog != NULL)
1868   {
1869 
1870     begin_critical_section(&wx_station_dialog_lock, "wx_gui.c:fill_wx_data" );
1871 
1872     if (search_station_name(&p_station,my_callsign,1))
1873     {
1874       if (get_weather_record(p_station))      // DK7IN: only add record if we found something...
1875       {
1876         weather = p_station->weather_data;
1877 
1878         if (strlen(wx_station_type) > 1)
1879         {
1880           XmTextFieldSetString(WX_type_data,wx_station_type);
1881         }
1882         else
1883         {
1884           XmTextFieldSetString(WX_type_data,"");
1885         }
1886         XtManageChild(WX_type_data);
1887 
1888         if (weather != 0)    // we have weather data
1889         {
1890           if (strlen(weather->wx_temp) > 0)
1891           {
1892             if (!english_units)
1893             {
1894               xastir_snprintf(temp,
1895                               sizeof(temp),
1896                               "%03d",
1897                               (int)(((atof(weather->wx_temp)-32)*5.0)/9.0));
1898 
1899               XmTextFieldSetString(WX_temp_data,temp);
1900             }
1901             else
1902             {
1903               XmTextFieldSetString(WX_temp_data,weather->wx_temp);
1904             }
1905           }
1906           else
1907           {
1908             XmTextFieldSetString(WX_temp_data,"");
1909           }
1910           XtManageChild(WX_temp_data);
1911 
1912           if (strlen(weather->wx_course) > 0)
1913           {
1914             XmTextFieldSetString(WX_wind_cse_data,weather->wx_course);
1915           }
1916           else
1917           {
1918             XmTextFieldSetString(WX_wind_cse_data,"");
1919           }
1920 
1921           XtManageChild(WX_wind_cse_data);
1922 
1923           if (strlen(weather->wx_speed) > 0)
1924           {
1925             if (!english_units)
1926             {
1927               xastir_snprintf(temp,
1928                               sizeof(temp),
1929                               "%03d",
1930                               (int)(atof(weather->wx_speed)*1.6094));
1931 
1932               XmTextFieldSetString(WX_wind_spd_data,temp);
1933             }
1934             else
1935             {
1936               XmTextFieldSetString(WX_wind_spd_data,weather->wx_speed);
1937             }
1938           }
1939           else
1940           {
1941             XmTextFieldSetString(WX_wind_spd_data,"");
1942           }
1943 
1944           XtManageChild(WX_wind_spd_data);
1945 
1946           if (strlen(weather->wx_gust) > 0)
1947           {
1948             if (!english_units)
1949             {
1950               xastir_snprintf(temp,
1951                               sizeof(temp),
1952                               "%03d",
1953                               (int)(atof(weather->wx_gust)*1.6094));
1954 
1955               XmTextFieldSetString(WX_wind_gst_data,temp);
1956             }
1957             else
1958             {
1959               XmTextFieldSetString(WX_wind_gst_data,weather->wx_gust);
1960             }
1961           }
1962           else
1963           {
1964             XmTextFieldSetString(WX_wind_gst_data,"");
1965           }
1966 
1967           XtManageChild(WX_wind_gst_data);
1968 
1969           if (strlen(weather->wx_rain_total) > 0)
1970           {
1971             if (!english_units)
1972               xastir_snprintf(temp,
1973                               sizeof(temp),
1974                               "%0.2f",
1975                               atof(weather->wx_rain_total)*.254);
1976             else
1977               xastir_snprintf(temp,
1978                               sizeof(temp),
1979                               "%0.2f",
1980                               atof(weather->wx_rain_total)/100.0);
1981 
1982             XmTextFieldSetString(WX_rain_data,temp);
1983           }
1984           else
1985           {
1986             XmTextFieldSetString(WX_rain_data,"");
1987           }
1988 
1989           XtManageChild(WX_rain_data);
1990 
1991           if (strlen(weather->wx_rain) > 0)
1992           {
1993             if (!english_units)
1994               xastir_snprintf(temp,
1995                               sizeof(temp),
1996                               "%0.2f",
1997                               atof(weather->wx_rain)*.254);
1998             else
1999               xastir_snprintf(temp,
2000                               sizeof(temp),
2001                               "%0.2f",
2002                               atof(weather->wx_rain)/100.0);
2003 
2004             XmTextFieldSetString(WX_rain_h_data,temp);
2005           }
2006           else
2007           {
2008             XmTextFieldSetString(WX_rain_h_data,"");
2009           }
2010 
2011           XtManageChild(WX_rain_h_data);
2012 
2013           if (strlen(weather->wx_prec_24) > 0)
2014           {
2015             if (!english_units)
2016               xastir_snprintf(temp,
2017                               sizeof(temp),
2018                               "%0.2f",
2019                               atof(weather->wx_prec_24)*.254);
2020             else
2021               xastir_snprintf(temp,
2022                               sizeof(temp),
2023                               "%0.2f",
2024                               atof(weather->wx_prec_24)/100.0);
2025 
2026             XmTextFieldSetString(WX_rain_24_data,temp);
2027           }
2028           else
2029           {
2030             XmTextFieldSetString(WX_rain_24_data,"");
2031           }
2032 
2033           XtManageChild(WX_rain_24_data);
2034 
2035           if (strlen(weather->wx_prec_00) > 0)
2036           {
2037             if (!english_units)
2038               xastir_snprintf(temp,
2039                               sizeof(temp),
2040                               "%0.2f",
2041                               atof(weather->wx_prec_00)*.254);
2042             else
2043               xastir_snprintf(temp,
2044                               sizeof(temp),
2045                               "%0.2f",
2046                               atof(weather->wx_prec_00)/100.0);
2047 
2048             XmTextFieldSetString(WX_to_rain_data,temp);
2049           }
2050           else
2051           {
2052             XmTextFieldSetString(WX_to_rain_data,"");
2053           }
2054 
2055           XtManageChild(WX_rain_data);
2056 
2057           if (strlen(weather->wx_hum) > 0)
2058           {
2059             XmTextFieldSetString(WX_humidity_data,weather->wx_hum);
2060           }
2061           else
2062           {
2063             XmTextFieldSetString(WX_humidity_data,"");
2064           }
2065 
2066           XtManageChild(WX_humidity_data);
2067 
2068           if (strlen(wx_dew_point) > 0)
2069           {
2070             if (!english_units)
2071             {
2072               xastir_snprintf(temp,
2073                               sizeof(temp),
2074                               "%03d",
2075                               (int)(((atof(wx_dew_point)-32)*5.0)/9.0));
2076               XmTextFieldSetString(WX_dew_point_data,temp);
2077             }
2078             else
2079             {
2080               XmTextFieldSetString(WX_dew_point_data,wx_dew_point);
2081             }
2082           }
2083           else
2084           {
2085             XmTextFieldSetString(WX_dew_point_data,"");
2086           }
2087 
2088           XtManageChild(WX_dew_point_data);
2089 
2090           if (strlen(wx_high_wind) > 0)
2091           {
2092             if (!english_units)
2093             {
2094               xastir_snprintf(temp,
2095                               sizeof(temp),
2096                               "%03d",
2097                               (int)(atof(wx_high_wind)*1.6094));
2098               XmTextFieldSetString(WX_high_wind_data,temp);
2099             }
2100             else
2101             {
2102               XmTextFieldSetString(WX_high_wind_data,wx_high_wind);
2103             }
2104           }
2105           else
2106           {
2107             XmTextFieldSetString(WX_high_wind_data,"");
2108           }
2109 
2110           XtManageChild(WX_high_wind_data);
2111 
2112           if (strlen(wx_wind_chill) > 0)
2113           {
2114             if (!english_units)
2115             {
2116               xastir_snprintf(temp,
2117                               sizeof(temp),
2118                               "%03d",
2119                               (int)(((atof(wx_wind_chill)-32)*5.0)/9.0));
2120               XmTextFieldSetString(WX_wind_chill_data,temp);
2121             }
2122             else
2123             {
2124               XmTextFieldSetString(WX_wind_chill_data,wx_wind_chill);
2125             }
2126           }
2127           else
2128           {
2129             XmTextFieldSetString(WX_wind_chill_data,"");
2130           }
2131 
2132           XtManageChild(WX_wind_chill_data);
2133 
2134           if (strlen(weather->wx_baro) > 0)
2135           {
2136             if (!english_units)
2137             {
2138               //xastir_snprintf(temp, sizeof(temp), "%0.0f",
2139               //        atof(wx_baro_inHg)*25.4); // inch Hg -> mm Hg
2140               //XmTextFieldSetString(WX_baro_data,temp);
2141               XmTextFieldSetString(WX_baro_data,weather->wx_baro); // hPa
2142             }
2143             else    // inches mercury
2144             {
2145               xastir_snprintf(temp,
2146                               sizeof(temp),
2147                               "%0.2f",
2148                               (atof(weather->wx_baro)*0.02953));
2149               XmTextFieldSetString(WX_baro_data,temp);
2150             }
2151           }
2152           else
2153           {
2154             XmTextFieldSetString(WX_baro_data,"");
2155           }
2156 
2157           XtManageChild(WX_baro_data);
2158 
2159           if (wx_three_hour_baro_on)
2160           {
2161             if (!english_units)    // hPa
2162             {
2163               //xastir_snprintf(temp, sizeof(temp), "%0.0f",
2164               //        atof(wx_three_hour_baro)*25.4); // inch Hg -> mm Hg
2165               XmTextFieldSetString(WX_three_hour_baro_data,wx_three_hour_baro);
2166             }
2167             else      // inches mercury
2168             {
2169               xastir_snprintf(temp,
2170                               sizeof(temp),
2171                               "%0.2f",
2172                               (atof(wx_three_hour_baro)*0.02953));
2173               XmTextFieldSetString(WX_three_hour_baro_data,temp);
2174             }
2175           }
2176           else
2177           {
2178             XmTextFieldSetString(WX_three_hour_baro_data,"");
2179           }
2180 
2181           XtManageChild(WX_three_hour_baro_data);
2182 
2183           if (wx_hi_temp_on)
2184           {
2185             if (!english_units)
2186             {
2187               xastir_snprintf(temp,
2188                               sizeof(temp),
2189                               "%03d",
2190                               (int)(((atof(wx_hi_temp)-32)*5.0)/9.0));
2191               XmTextFieldSetString(WX_hi_temp_data,temp);
2192             }
2193             else
2194             {
2195               XmTextFieldSetString(WX_hi_temp_data,wx_hi_temp);
2196             }
2197           }
2198           else
2199           {
2200             XmTextFieldSetString(WX_hi_temp_data,"");
2201           }
2202 
2203           XtManageChild(WX_hi_temp_data);
2204 
2205           if (wx_low_temp_on)
2206           {
2207             if (!english_units)
2208             {
2209               xastir_snprintf(temp,
2210                               sizeof(temp),
2211                               "%03d",
2212                               (int)(((atof(wx_low_temp)-32)*5.0)/9.0));
2213               XmTextFieldSetString(WX_low_temp_data,temp);
2214             }
2215             else
2216             {
2217               XmTextFieldSetString(WX_low_temp_data,wx_low_temp);
2218             }
2219           }
2220           else
2221           {
2222             XmTextFieldSetString(WX_low_temp_data,"");
2223           }
2224 
2225           XtManageChild(WX_low_temp_data);
2226 
2227           if (wx_heat_index_on)
2228           {
2229             if (!english_units)
2230             {
2231               xastir_snprintf(temp,
2232                               sizeof(temp),
2233                               "%03d",
2234                               (int)(((atof(wx_heat_index)-32)*5.0)/9.0));
2235               XmTextFieldSetString(WX_heat_index_data,temp);
2236             }
2237             else
2238             {
2239               XmTextFieldSetString(WX_heat_index_data,wx_heat_index);
2240             }
2241           }
2242           else
2243           {
2244             XmTextFieldSetString(WX_heat_index_data,"");
2245           }
2246 
2247           XtManageChild(WX_heat_index_data);
2248         }
2249       }
2250     }
2251 
2252     /* labels */
2253     if (!english_units)
2254     {
2255       XmTextFieldSetString(WX_speed_label,langcode("UNIOP00012"));
2256     }
2257     else
2258     {
2259       XmTextFieldSetString(WX_speed_label,langcode("UNIOP00013"));
2260     }
2261 
2262     XtManageChild(WX_speed_label);
2263 
2264     if (!english_units)
2265     {
2266       XmTextFieldSetString(WX_gust_label,langcode("UNIOP00012"));
2267     }
2268     else
2269     {
2270       XmTextFieldSetString(WX_gust_label,langcode("UNIOP00013"));
2271     }
2272 
2273     XtManageChild(WX_gust_label);
2274 
2275     if (!english_units)
2276     {
2277       XmTextFieldSetString(WX_temp_label,langcode("UNIOP00014"));
2278     }
2279     else
2280     {
2281       XmTextFieldSetString(WX_temp_label,langcode("UNIOP00015"));
2282     }
2283 
2284     XtManageChild(WX_temp_label);
2285 
2286     if (!english_units)
2287     {
2288       XmTextFieldSetString(WX_rain_label,langcode("UNIOP00016"));
2289     }
2290     else
2291     {
2292       XmTextFieldSetString(WX_rain_label,langcode("UNIOP00017"));
2293     }
2294 
2295     XtManageChild(WX_rain_label);
2296 
2297     if (!english_units)
2298     {
2299       XmTextFieldSetString(WX_to_rain_label,langcode("UNIOP00022"));
2300     }
2301     else
2302     {
2303       XmTextFieldSetString(WX_to_rain_label,langcode("UNIOP00023"));
2304     }
2305 
2306     XtManageChild(WX_to_rain_label);
2307 
2308     if (!english_units)
2309     {
2310       XmTextFieldSetString(WX_rain_h_label,langcode("UNIOP00020"));
2311     }
2312     else
2313     {
2314       XmTextFieldSetString(WX_rain_h_label,langcode("UNIOP00021"));
2315     }
2316 
2317     XtManageChild(WX_rain_h_label);
2318 
2319     if (!english_units)
2320     {
2321       XmTextFieldSetString(WX_rain_24_label,langcode("UNIOP00018"));
2322     }
2323     else
2324     {
2325       XmTextFieldSetString(WX_rain_24_label,langcode("UNIOP00019"));
2326     }
2327 
2328     XtManageChild(WX_rain_24_label);
2329 
2330     if (!english_units)
2331     {
2332       XmTextFieldSetString(WX_dew_point_label,langcode("UNIOP00014"));
2333     }
2334     else
2335     {
2336       XmTextFieldSetString(WX_dew_point_label,langcode("UNIOP00015"));
2337     }
2338 
2339     XtManageChild(WX_dew_point_label);
2340 
2341     if (!english_units)
2342     {
2343       XmTextFieldSetString(WX_wind_chill_label,langcode("UNIOP00014"));
2344     }
2345     else
2346     {
2347       XmTextFieldSetString(WX_wind_chill_label,langcode("UNIOP00015"));
2348     }
2349 
2350     XtManageChild(WX_wind_chill_label);
2351 
2352     if (!english_units)
2353     {
2354       XmTextFieldSetString(WX_heat_index_label,langcode("UNIOP00014"));
2355     }
2356     else
2357     {
2358       XmTextFieldSetString(WX_heat_index_label,langcode("UNIOP00015"));
2359     }
2360 
2361     XtManageChild(WX_heat_index_label);
2362 
2363     if (!english_units)
2364     {
2365       XmTextFieldSetString(WX_hi_temp_label,langcode("UNIOP00014"));
2366     }
2367     else
2368     {
2369       XmTextFieldSetString(WX_hi_temp_label,langcode("UNIOP00015"));
2370     }
2371 
2372     XtManageChild(WX_hi_temp_label);
2373 
2374     if (!english_units)
2375     {
2376       XmTextFieldSetString(WX_low_temp_label,langcode("UNIOP00014"));
2377     }
2378     else
2379     {
2380       XmTextFieldSetString(WX_low_temp_label,langcode("UNIOP00015"));
2381     }
2382 
2383     XtManageChild(WX_low_temp_label);
2384 
2385     if (!english_units)
2386     {
2387       XmTextFieldSetString(WX_high_wind_label,langcode("UNIOP00012"));
2388     }
2389     else
2390     {
2391       XmTextFieldSetString(WX_high_wind_label,langcode("UNIOP00013"));
2392     }
2393 
2394     XtManageChild(WX_high_wind_label);
2395 
2396     if (!english_units)
2397     {
2398       XmTextFieldSetString(WX_baro_label,langcode("UNIOP00025"));
2399     }
2400     else
2401     {
2402       XmTextFieldSetString(WX_baro_label,langcode("UNIOP00027"));
2403     }
2404 
2405     XtManageChild(WX_baro_label);
2406 
2407     if (!english_units)
2408     {
2409       XmTextFieldSetString(WX_three_hour_baro_label,langcode("UNIOP00025"));
2410     }
2411     else
2412     {
2413       XmTextFieldSetString(WX_three_hour_baro_label,langcode("UNIOP00027"));
2414     }
2415 
2416     XtManageChild(WX_three_hour_baro_label);
2417 
2418     end_critical_section(&wx_station_dialog_lock, "wx_gui.c:fill_wx_data" );
2419 
2420   }
2421 }
2422 
2423 
2424