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