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 
25 
26 // This is for debug.  If defined to 1, Xastir will display
27 // coordinates in the Xastir coordinate system inside the text2
28 // widget.
29 //
30 static int DISPLAY_XASTIR_COORDINATES = 0;
31 
32 
33 
34 #ifdef HAVE_CONFIG_H
35   #include "config.h"
36 #endif  // HAVE_CONFIG_H
37 
38 #include "snprintf.h"
39 
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <assert.h>
43 #include <ctype.h>
44 #include <math.h>
45 #include <sys/stat.h>
46 #include <sys/file.h>
47 #include <unistd.h>
48 #include <dirent.h>
49 #include <signal.h>
50 #include <termios.h>
51 #include <pwd.h>
52 #include <locale.h>
53 
54 // Needed for Solaris
55 #ifdef HAVE_STRINGS_H
56   #include <strings.h>
57 #endif  // HAVE_STRINGS_H
58 
59 #include <sys/wait.h>
60 #include <errno.h>
61 
62 #if TIME_WITH_SYS_TIME
63   #include <sys/time.h>
64   #include <time.h>
65 #else   // TIME_WITH_SYS_TIME
66   #if HAVE_SYS_TIME_H
67     #include <sys/time.h>
68   #else  // HAVE_SYS_TIME_H
69     #include <time.h>
70   #endif // HAVE_SYS_TIME_H
71 #endif  // TIME_WITH_SYS_TIME
72 
73 // TVR -- stupid, stupid ImageMagick
74 char *xastir_package=PACKAGE;
75 char *xastir_version=VERSION;
76 #undef PACKAGE
77 #undef VERSION
78 
79 #ifdef HAVE_MAGICK
80   #include <sys/types.h>
81   #undef RETSIGTYPE
82   /* JMT - stupid ImageMagick */
83   #define XASTIR_PACKAGE_BUGREPORT PACKAGE_BUGREPORT
84   #undef PACKAGE_BUGREPORT
85   #define XASTIR_PACKAGE_NAME PACKAGE_NAME
86   #undef PACKAGE_NAME
87   #define XASTIR_PACKAGE_STRING PACKAGE_STRING
88   #undef PACKAGE_STRING
89   #define XASTIR_PACKAGE_TARNAME PACKAGE_TARNAME
90   #undef PACKAGE_TARNAME
91   #define XASTIR_PACKAGE_VERSION PACKAGE_VERSION
92   #undef PACKAGE_VERSION
93   #ifdef HAVE_MAGICK
94     #ifdef HAVE_MAGICKCORE_MAGICKCORE_H
95       #include <MagickCore/MagickCore.h>
96     #else
97       #ifdef HAVE_MAGICK_API_H
98         #include <magick/api.h>
99       #endif // HAVE_MAGICK_API_H
100     #endif //HAVE_MAGICKCORE_MAGICKCORE_H
101   #endif //HAVE_MAGICK
102   #undef PACKAGE_BUGREPORT
103   #define PACKAGE_BUGREPORT XASTIR_PACKAGE_BUGREPORT
104   #undef XASTIR_PACKAGE_BUGREPORT
105   #undef PACKAGE_NAME
106   #define PACKAGE_NAME XASTIR_PACKAGE_NAME
107   #undef XASTIR_PACKAGE_NAME
108   #undef PACKAGE_STRING
109   #define PACKAGE_STRING XASTIR_PACKAGE_STRING
110   #undef XASTIR_PACKAGE_STRING
111   #undef PACKAGE_TARNAME
112   #define PACKAGE_TARNAME XASTIR_PACKAGE_TARNAME
113   #undef XASTIR_PACKAGE_TARNAME
114   #undef PACKAGE_VERSION
115   #define PACKAGE_VERSION XASTIR_PACKAGE_VERSION
116   #undef XASTIR_PACKAGE_VERSION
117 #endif // HAVE_MAGICK
118 
119 //#ifdef HAVE_NETAX25_AXLIB_H
120 //#include <netax25/axlib.h>
121 //#endif    // HAVE_NETAX25_AXLIB_H
122 
123 #ifdef HAVE_LIBCURL
124   #include <curl/curl.h>
125 #endif
126 
127 #include "xastir.h"
128 #include "draw_symbols.h"
129 #include "main.h"
130 #include "xa_config.h"
131 #include "maps.h"
132 #include "alert.h"
133 #include "interface.h"
134 #include "wx.h"
135 #include "popup.h"
136 #include "track_gui.h"
137 #include "list_gui.h"
138 #include "util.h"
139 #include "color.h"
140 #include "gps.h"
141 #include "bulletin_gui.h"
142 #include "rotated.h"
143 #include "datum.h"
144 #include "igate.h"
145 #include "objects.h"
146 #include "db_gis.h"
147 
148 #include "map_OSM.h"
149 
150 #ifdef HAVE_LIBSHP
151   #include "shp_hash.h"
152 #endif  // HAVE_LIBSHP
153 
154 #include "x_spider.h"
155 #include "map_cache.h"
156 
157 #include <Xm/XmAll.h>
158 #include <X11/cursorfont.h>
159 #include <Xm/ComboBox.h>
160 
161 // Must be last include file
162 #include "leak_detection.h"
163 
164 
165 
166 // Copyright 2016.
167 // Added the above "Copyright" just so that grep would find these
168 // lines and we could update the years in the Help->About message
169 // each time.  Otherwise it often gets missed when we're updating
170 // the years.
171 #define ABOUT_MSG "X Amateur Station Tracking and Information Reporting\n\n        http://www.xastir.org\n\nCopyright (C) 2000-2019 The Xastir Group\nSee the \"LICENSE\" file for other applicable copyrights"
172 
173 // OpenStreetMap attribution
174 #define ABOUT_OSM "Maps, tiles, and data from the OpenStreetMap project are\nCopyright OpenStreetMap and contributors, CC-BY-SA.\nMaps and tiles from CloudMade are Copyright CloudMade, CC-BY-SA.\n  http://www.openstreetmap.org/\n  http://creativecommons.org/licenses/by-sa/2.0/\n  http://www.cloudmade.com/\n"
175 
176 
177 // Define this if you want an xastir.pid file created in the
178 // ~/.xastir directory and want to check that there's not another
179 // copy of Xastir running before a new one starts up.  You can also
180 // use this to send SIGHUP or SIGUSR1 signals to a running Xastir
181 // from scripts.
182 #define USE_PID_FILE_CHECK 1
183 
184 
185 #define DOS_HDR_LINES 8
186 
187 #define STATUSLINE_ACTIVE 10    /* status line is cleared after 10 seconds */
188 #define REPLAY_DELAY       0    /* delay between replayed packets in sec, 0 is ok */
189 //#define REDRAW_WAIT        3    /* delay between consecutive redraws in seconds (file load) */
190 #define REDRAW_WAIT        0    /* delay between consecutive redraws in seconds (file load) */
191 
192 
193 
194 // FONTS FONTS FONTS FONTS FONTS
195 //
196 // NOTE:  See the main() function at the bottom of this module for
197 // the default font definition.  xa_config.c is where fonts get
198 // saved/restored for user-defined fonts.
199 // This one is not used anymore:
200 //#define XmFONTLIST_DEFAULT_MY "-misc-fixed-*-r-*-*-10-*-*-*-*-*-*-*"
201 
202 
203 // This one goes right along with smaller system fonts on fixed-size
204 // LCD screens.  Fix new dialogs to the upper left of the main
205 // window, don't have them cycle through multiple possible positions
206 // as each new dialog is drawn.
207 //
208 //#define FIXED_DIALOG_STARTUP
209 
210 // Yet another useful item:  Puts the mouse menu on button 1 instead
211 // of button3.  Useful for one-button devices like touchscreens.
212 //
213 //#define SWAP_MOUSE_BUTTONS
214 
215 // If next line uncommented, Xastir will display the status line
216 // in 2 rows instead of the normal single row.  Formatted especially
217 // for 640 pixel wide screens.  It also gives a little extra room for
218 // the number of stations and the Zoom factor.
219 // #define USE_TWO_STATUS_LINES
220 
221 // Enable this next line to set all flags properly for a 640x480
222 // touch-screen:  Makes the main window smaller due to the reduced
223 // font sizes, makes all dialogs come up at the upper-left of the
224 // main Xastir screen, reverses buttons 1 and 3 so that the more
225 // important mouse menus are accessible via the touch-screen, and
226 // sets it for 2 status lines.  Make sure to change the system font
227 // size smaller than the default.
228 //
229 //#define LCD640x480TOUCH
230 //
231 #ifdef LCD640x480TOUCH
232   #define FIXED_DIALOG_STARTUP
233   #define SWAP_MOUSE_BUTTONS
234   #define USE_TWO_STATUS_LINES
235 #endif
236 
237 
238 #define LINE_WIDTH 1
239 
240 #define ARROWS     1            // Arrow buttons on menubar
241 
242 // TVR 26 July 2005
243 // Moved this magic number to a #define --- there were numerous places
244 // where this constant was hard coded, making it difficult to change the
245 // map properties line format without breaking something.  Now it can live
246 // in one place that needs to be updated when the properties line is changed.
247 // At the time of writing, the properties line had the followign format:
248 // min max lyr fil drg amap name
249 // %5d %5d %5d %5c %5c %5c  %s
250 // placing the name at offset 37
251 #define MPD_FILENAME_OFFSET 37
252 
253 
254 // Define the ICON, created with the "bitmap" editor:
255 #include "icon.xbm"
256 
257 // lesstif (at least as of version 0.94 in 2008), doesn't
258 // have full implementation of combo boxes.
259 #ifndef USE_COMBO_BOX
260   #if (XmVERSION >= 2 && !defined(LESSTIF_VERSION))
261     #define USE_COMBO_BOX 1
262   #endif
263 #endif  // USE_COMBO_BOX
264 
265 int geometry_x, geometry_y;
266 unsigned int geometry_width, geometry_height;
267 int geometry_flags;
268 
269 static int initial_load = 1;
270 int first_time_run = 0;
271 
272 /* JMT - works under FreeBSD */
273 uid_t euid;
274 gid_t egid;
275 
276 
277 int   my_argc;
278 char **my_argv;
279 char **my_envp;
280 int  restart_xastir_now = 0;
281 
282 
283 // A count of the stations currently on the screen.  Counted by
284 // db.c:display_file() routine.
285 int currently_selected_stations      = 0;
286 int currently_selected_stations_save = 0;
287 
288 // If my_trail_diff_color is 0, all my calls (SSIDs) will use MY_TRAIL_COLOR.
289 // If my_trail_diff_color = 1 then each different ssid for my callsign will use a different color.
290 int my_trail_diff_color = 0;
291 
292 
293 // Used in segfault handler
294 char dangerous_operation[200];
295 
296 FILE *file_wx_test;
297 
298 int tcp_server_pid = 0;
299 int udp_server_pid = 0;
300 
301 int serial_char_pacing;  // Inter-char delay in ms for serial ports.
302 int dtr_on = 1;
303 time_t sec_last_dtr = (time_t)0;
304 
305 time_t last_updatetime = (time_t)0;
306 int time_went_backwards = 0;
307 
308 /* language in use */
309 char lang_to_use[30];
310 
311 /* version info in main.h */
312 int  altnet;
313 char altnet_call[MAX_CALLSIGN+1];
314 
315 static void Window_Quit(Widget w, XtPointer client, XtPointer call);
316 static void save_state(Widget w, XtPointer client, XtPointer call);
317 
318 void da_input(Widget w, XtPointer client_data, XtPointer call_data);
319 void da_resize(Widget w, XtPointer client_data, XtPointer call_data);
320 void da_expose(Widget w, XtPointer client_data, XtPointer call_data);
321 
322 void BuildPredefinedSARMenu_UI(Widget *parent_menu);
323 Widget *predefined_object_menu_parent;
324 Widget sar_object_sub;
325 Widget predefined_object_menu_items[MAX_NUMBER_OF_PREDEFINED_OBJECTS];
326 
327 int debug_level;
328 
329 //Widget hidden_shell;
330 Widget appshell;
331 Widget form;
332 Widget da;
333 Widget text;
334 Widget text2;
335 Widget text3;
336 Widget text4;
337 Widget log_indicator;
338 Widget iface_da;
339 Widget menubar;
340 Widget toolbar;
341 
342 Widget configure_station_dialog     = (Widget)NULL;
343 Widget right_menu_popup              = (Widget)NULL;    // Button one or left mouse button
344 //Widget middle_menu_popup=(Widget)NULL;  // Button two or middle mouse button
345 //Widget right_menu_popup=(Widget)NULL;   // Button three or right mouse button
346 Widget trackme_button;
347 Widget measure_button;
348 Widget move_button;
349 Widget cad_draw_button;
350 
351 Widget CAD_close_polygon_menu_item;
352 
353 int Station_transmit_type;
354 int Igate_type;
355 
356 Widget Display_data_dialog  = (Widget)NULL;
357 Widget Display_data_text;
358 int Display_packet_data_type;
359 int show_only_station_capabilities = 0;
360 int Display_packet_data_mine_only = 0;
361 
362 Widget configure_defaults_dialog = (Widget)NULL;
363 Widget configure_timing_dialog = (Widget)NULL;
364 Widget configure_coordinates_dialog = (Widget)NULL;
365 Widget coordinate_calc_button_ok = (Widget)NULL;
366 Widget change_debug_level_dialog = (Widget)NULL;
367 
368 
369 Widget coordinate_calc_dialog = (Widget)NULL;
370 Widget coordinate_calc_zone = (Widget)NULL;
371 Widget coordinate_calc_latitude_easting = (Widget)NULL;
372 Widget coordinate_calc_longitude_northing = (Widget)NULL;
373 Widget coordinate_calc_result_text = (Widget)NULL;
374 static char coordinate_calc_lat_deg[5];
375 static char coordinate_calc_lat_min[15];
376 static char coordinate_calc_lat_dir[5];
377 static char coordinate_calc_lon_deg[5];
378 static char coordinate_calc_lon_min[15];
379 static char coordinate_calc_lon_dir[5];
380 coordinate_calc_array_type coordinate_calc_array;
381 
382 
383 
384 // --------------------------- help menu -----------------------------
385 Widget help_list;
386 Widget help_index_dialog = (Widget)NULL;
387 Widget help_view_dialog  = (Widget)NULL;
388 Widget emergency_beacon_toggle;
389 int emergency_beacon = 0;
390 static void Help_About(Widget w, XtPointer clientData, XtPointer callData);
391 static void Help_Index(Widget w, XtPointer clientData, XtPointer callData);
392 void  Emergency_beacon_toggle( Widget widget, XtPointer clientData, XtPointer callData);
393 
394 // ----------------------------- map ---------------------------------
395 Widget map_list;
396 Widget map_properties_list;
397 void map_index_update_temp_select(char *filename, map_index_record **current);
398 void map_index_temp_select_clear(void);
399 
400 void map_chooser_fill_in (void);
401 int map_chooser_expand_dirs = 0;
402 
403 void map_chooser_init (void);
404 
405 Widget map_chooser_dialog = (Widget)NULL;
406 Widget map_chooser_button_ok = (Widget)NULL;
407 Widget map_chooser_button_cancel = (Widget)NULL;
408 
409 Widget map_properties_dialog = (Widget)NULL;
410 static void Map_chooser(Widget w, XtPointer clientData, XtPointer callData);
411 Widget map_chooser_maps_selected_data = (Widget)NULL;
412 int re_sort_maps = 1;
413 
414 #ifdef HAVE_LIBGEOTIFF
415   static void Config_DRG(Widget w, XtPointer clientData, XtPointer callData);
416 #endif  // HAVE_LIBGEOTIFF
417 
418 Widget grid_on, grid_off;
419 static void Grid_toggle( Widget w, XtPointer clientData, XtPointer calldata);
420 int long_lat_grid;              // Switch for Map Lat and Long grid display
421 
422 void Map_border_toggle( Widget w, XtPointer clientData, XtPointer callData);
423 int draw_labeled_grid_border = FALSE;   // Toggle labeled border around map.
424 
425 
426 static void CAD_draw_toggle( Widget w, XtPointer clientData, XtPointer calldata);
427 
428 int map_lock_pan_zoom = 0;
429 static void Map_lock_pan_zoom_toggle( Widget w, XtPointer clientData, XtPointer calldata);
430 
431 int disable_all_maps = 0;
432 static void Map_disable_toggle( Widget w, XtPointer clientData, XtPointer calldata);
433 
434 static void Map_auto_toggle( Widget w, XtPointer clientData, XtPointer calldata);
435 int map_auto_maps;              /* toggle use of auto_maps */
436 static void Map_auto_skip_raster_toggle( Widget w, XtPointer clientData, XtPointer calldata);
437 int auto_maps_skip_raster;
438 Widget map_auto_skip_raster_button;
439 Widget map_border_button;
440 
441 Widget map_levels_on, map_levels_off;
442 static void Map_levels_toggle( Widget w, XtPointer clientData, XtPointer calldata);
443 int map_color_levels;           /* toggle use of map_color_levels */
444 
445 Widget map_labels_on, map_labels_off;
446 static void Map_labels_toggle( Widget w, XtPointer clientData, XtPointer calldata);
447 int map_labels;                 // toggle use of map_labels */
448 
449 Widget map_fill_on, map_fill_off;
450 static void Map_fill_toggle( Widget w, XtPointer clientData, XtPointer calldata);
451 int map_color_fill;             /* Whether or not to fill in map polygons with solid color */
452 
453 int index_maps_on_startup;      // Index maps on startup
454 static void Index_maps_on_startup_toggle(Widget w, XtPointer clientData, XtPointer calldata);
455 
456 Widget map_bgcolor[12];
457 static void Map_background(Widget w, XtPointer clientData, XtPointer calldata);
458 int map_background_color;       /* Background color for maps */
459 
460 #if !defined(NO_GRAPHICS)
461   Widget raster_intensity[11];
462   static void Raster_intensity(Widget w, XtPointer clientData, XtPointer calldata);
463   #if defined(HAVE_MAGICK)
464     Widget gamma_adjust_dialog = (Widget)NULL;
465     Widget gamma_adjust_text;
466   #endif  // HAVE_MAGICK
467 #endif  // NO_GRAPHICS
468 
469 Widget map_font_dialog = (Widget)NULL;
470 Widget map_font_text[FONT_MAX];
471 
472 
473 Widget map_station_label0,map_station_label1,map_station_label2,map_station_label3;
474 static void Map_station_label(Widget w, XtPointer clientData, XtPointer calldata);
475 int letter_style;               /* Station Letter style */
476 
477 Widget map_icon_outline0,map_icon_outline1,map_icon_outline2,map_icon_outline3;
478 static void Map_icon_outline(Widget w, XtPointer clientData, XtPointer calldata);
479 int icon_outline_style;         /* Icon Outline style */
480 
481 Widget map_wx_alerts_0,map_wx_alerts_1;
482 static void Map_wx_alerts_toggle(Widget w, XtPointer clientData, XtPointer calldata);
483 int wx_alert_style;             /* WX alert map style */
484 time_t map_refresh_interval = 0; /* how often to refresh maps, seconds */
485 time_t map_refresh_time = 0;     /* when to refresh maps next, seconds */
486 
487 // ------------------------ Filter and Display menus -----------------------------
488 Selections Select_ = { 0, // none
489                        1, // mine
490                        1, // tnc
491                        1, // direct
492                        1, // via_digi
493                        1, // net
494                        0, // tactical
495                        1, // old_data
496 
497                        1, // stations
498                        1, // fixed_stations
499                        1, // moving_stations
500                        1, // weather_stations
501                        1, // CWOP_wx_stations
502                        1, // objects
503                        1, // weather_objects
504                        1, // gauge_objects
505                        1, // other_objects
506                        1, // aircraft_objects
507                        1, // vessel_objects
508                      };
509 
510 What_to_display Display_ = { 1, // callsign
511                              1, // label_all_trackpoints
512                              1, // symbol
513                              1, // symbol_rotate
514                              1, // trail
515 
516                              1, // course
517                              1, // speed
518                              1, // speed_short
519                              1, // altitude
520 
521                              1, // weather
522                              1, // weather_text
523                              1, // temperature_only
524                              1, // wind_barb
525 
526                              1, // aloha_circle
527                              1, // ambiguity
528                              1, // phg
529                              1, // default_phg
530                              1, // phg_of_moving
531 
532                              1, // df_data
533                              1, // df_beamwidth_data
534                              1, // df_bearing_data
535                              1, // dr_data
536                              1, // dr_arc
537                              1, // dr_course
538                              1, // dr_symbol
539 
540                              1, // dist_bearing
541                              1, // last_heard
542                            };
543 
544 Widget select_none_button;
545 Widget select_mine_button;
546 Widget select_tnc_button;
547 Widget select_direct_button;
548 Widget select_via_digi_button;
549 Widget select_net_button;
550 Widget select_tactical_button;
551 Widget select_old_data_button;
552 
553 Widget select_stations_button;
554 Widget select_fixed_stations_button;
555 Widget select_moving_stations_button;
556 Widget select_weather_stations_button;
557 Widget select_CWOP_wx_stations_button;
558 Widget select_objects_button;
559 Widget select_weather_objects_button;
560 Widget select_gauge_objects_button;
561 Widget select_other_objects_button;
562 Widget select_aircraft_objects_button;
563 Widget select_vessel_objects_button;
564 
565 
566 
567 Widget display_callsign_button;
568 Widget display_label_all_trackpoints_button;
569 Widget display_symbol_button;
570 Widget display_symbol_rotate_button;
571 Widget display_trail_button;
572 
573 Widget display_course_button;
574 Widget display_speed_button;
575 Widget display_speed_short_button;
576 Widget display_altitude_button;
577 
578 Widget display_weather_button;
579 Widget display_weather_text_button;
580 Widget display_temperature_only_button;
581 Widget display_wind_barb_button;
582 
583 Widget display_aloha_circle_button;
584 Widget display_ambiguity_button;
585 Widget display_phg_button;
586 Widget display_default_phg_button;
587 Widget display_phg_of_moving_button;
588 
589 Widget display_df_data_button;
590 Widget display_df_beamwidth_data_button;
591 Widget display_df_bearing_data_button;
592 Widget display_dr_data_button;
593 Widget display_dr_arc_button;
594 Widget display_dr_course_button;
595 Widget display_dr_symbol_button;
596 
597 Widget display_dist_bearing_button;
598 Widget display_last_heard_button;
599 
600 
601 static void Select_none_toggle(Widget w, XtPointer clientData, XtPointer calldata);
602 static void Select_mine_toggle(Widget w, XtPointer clientData, XtPointer calldata);
603 static void Select_tnc_toggle(Widget w, XtPointer clientData, XtPointer calldata);
604 static void Select_direct_toggle(Widget w, XtPointer clientData, XtPointer calldata);
605 static void Select_via_digi_toggle(Widget w, XtPointer clientData, XtPointer calldata);
606 static void Select_net_toggle(Widget w, XtPointer clientData, XtPointer calldata);
607 static void Select_tactical_toggle(Widget w, XtPointer clientData, XtPointer calldata);
608 static void Select_old_data_toggle(Widget w, XtPointer clientData, XtPointer calldata);
609 
610 static void Select_stations_toggle(Widget w, XtPointer clientData, XtPointer calldata);
611 static void Select_fixed_stations_toggle(Widget w, XtPointer clientData, XtPointer calldata);
612 static void Select_moving_stations_toggle(Widget w, XtPointer clientData, XtPointer calldata);
613 static void Select_weather_stations_toggle(Widget w, XtPointer clientData, XtPointer calldata);
614 static void Select_CWOP_wx_stations_toggle(Widget w, XtPointer clientData, XtPointer calldata);
615 static void Select_objects_toggle(Widget w, XtPointer clientData, XtPointer calldata);
616 static void Select_weather_objects_toggle(Widget w, XtPointer clientData, XtPointer calldata);
617 static void Select_other_objects_toggle(Widget w, XtPointer clientData, XtPointer calldata);
618 static void Select_gauge_objects_toggle(Widget w, XtPointer clientData, XtPointer calldata);
619 static void Select_aircraft_objects_toggle(Widget w, XtPointer clientData, XtPointer calldata);
620 static void Select_vessel_objects_toggle(Widget w, XtPointer clientData, XtPointer calldata);
621 
622 static void Display_callsign_toggle(Widget w, XtPointer clientData, XtPointer calldata);
623 static void Display_label_all_trackpoints_toggle(Widget w, XtPointer clientData, XtPointer calldata);
624 static void Display_symbol_toggle(Widget w, XtPointer clientData, XtPointer calldata);
625 static void Display_symbol_rotate_toggle(Widget w, XtPointer clientData, XtPointer calldata);
626 static void Display_trail_toggle(Widget w, XtPointer clientData, XtPointer calldata);
627 
628 static void Display_course_toggle(Widget w, XtPointer clientData, XtPointer calldata);
629 static void Display_speed_toggle(Widget w, XtPointer clientData, XtPointer calldata);
630 static void Display_speed_short_toggle(Widget w, XtPointer clientData, XtPointer calldata);
631 static void Display_altitude_toggle(Widget w, XtPointer clientData, XtPointer calldata);
632 
633 static void Display_weather_toggle(Widget w, XtPointer clientData, XtPointer calldata);
634 static void Display_weather_text_toggle(Widget w, XtPointer clientData, XtPointer calldata);
635 static void Display_temperature_only_toggle(Widget w, XtPointer clientData, XtPointer calldata);
636 static void Display_wind_barb_toggle(Widget w, XtPointer clientData, XtPointer calldata);
637 
638 static void Display_aloha_circle_toggle(Widget w, XtPointer clientData, XtPointer calldata);
639 static void Display_ambiguity_toggle(Widget w, XtPointer clientData, XtPointer calldata);
640 static void Display_phg_toggle(Widget w, XtPointer clientData, XtPointer calldata);
641 static void Display_default_phg_toggle(Widget w, XtPointer clientData, XtPointer calldata);
642 static void Display_phg_of_moving_toggle(Widget w, XtPointer clientData, XtPointer calldata);
643 
644 static void Display_df_data_toggle(Widget w, XtPointer clientData, XtPointer calldata);
645 static void Display_df_beamwidth_data_toggle(Widget w, XtPointer clientData, XtPointer calldata);
646 static void Display_df_bearing_data_toggle(Widget w, XtPointer clientData, XtPointer calldata);
647 static void Display_dr_data_toggle(Widget w, XtPointer clientData, XtPointer calldata);
648 static void Display_dr_arc_toggle(Widget w, XtPointer clientData, XtPointer calldata);
649 static void Display_dr_course_toggle(Widget w, XtPointer clientData, XtPointer calldata);
650 static void Display_dr_symbol_toggle(Widget w, XtPointer clientData, XtPointer calldata);
651 
652 static void Display_dist_bearing_toggle(Widget w, XtPointer clientData, XtPointer calldata);
653 static void Display_last_heard_toggle(Widget w, XtPointer clientData, XtPointer calldata);
654 
655 
656 // ------------------------ Interfaces --------------------------
657 static void  Transmit_disable_toggle( Widget widget, XtPointer clientData, XtPointer callData);
658 static void  Posit_tx_disable_toggle( Widget widget, XtPointer clientData, XtPointer callData);
659 static void  Object_tx_disable_toggle( Widget widget, XtPointer clientData, XtPointer callData);
660 static void  Server_port_toggle( Widget widget, XtPointer clientData, XtPointer callData);
661 int transmit_disable;
662 int posit_tx_disable;
663 int object_tx_disable;
664 int enable_server_port = 0;
665 Widget iface_transmit_now, posit_tx_disable_toggle, object_tx_disable_toggle;
666 Widget server_port_toggle;
667 
668 #ifdef HAVE_GPSMAN
669   Widget Fetch_gps_track, Fetch_gps_route, Fetch_gps_waypoints;
670   Widget Fetch_RINO_waypoints;
671   Widget Send_gps_track, Send_gps_route, Send_gps_waypoints;
672   int gps_got_data_from = 0;          // We got data from a GPS
673   int gps_operation_pending = 0;      // A GPS transfer is happening
674   int gps_details_selected = 0;       // Whether name/color have been selected yet
675   Widget gpsfilename_text;            // Short name of gps map (no color/type)
676   char gps_map_filename[MAX_FILENAME];// Chosen name of gps map (including color)
677   char gps_map_filename_base[MAX_FILENAME];   // Same minus ".shp"
678   char gps_map_filename_base2[MAX_FILENAME];   // Same minus ".shp" and color
679   char gps_temp_map_filename[MAX_FILENAME];
680   char gps_temp_map_filename_base[MAX_FILENAME];  // Same minus ".shp"
681   char gps_dbfawk_format[]="BEGIN_RECORD {key=\"\"; lanes=3; color=%d; name=\"%s\"; filled=0; pattern=1; display_level=65536; label_level=128; label_color=8; symbol=\"\"}\n";
682   int gps_map_color = 0;              // Chosen color of gps map
683   int gps_map_color_offset;           // offset into colors array of that color.
684   char gps_map_type[30];              // Type of GPS download
685   void check_for_new_gps_map(int curr_sec);
686   Widget GPS_operations_dialog = (Widget)NULL;
687 #endif  // HAVE_GPSMAN
688 
689 // ------------------------ unit conversion --------------------------
690 static void Units_choice_toggle(Widget w, XtPointer clientData, XtPointer calldata);
691 
692 // 0: metric, 1: english, (2: nautical, not fully implemented)
693 int english_units;
694 
695 char un_alt[2+1];   // m / ft
696 char un_dst[2+1];   // mi / km      (..nm)
697 char un_spd[4+1];   // mph / km/h   (..kn)
698 double cvt_m2len;   // from meter
699 double cvt_kn2len;  // from knots
700 double cvt_mi2len;  // from miles
701 double cvt_dm2len;  // from decimeter
702 double cvt_hm2len;  // from hectometer
703 
704 void update_units(void);
705 
706 // dist/bearing on status line
707 static void Dbstatus_choice_toggle(Widget w, XtPointer clientData, XtPointer calldata);
708 
709 int do_dbstatus;
710 
711 
712 // Coordinate System
713 int coordinate_system = USE_DDMMMM; // Default, used for most APRS systems
714 
715 
716 // ------------------------- audio alarms ----------------------------
717 Widget configure_audio_alarm_dialog = (Widget)NULL;
718 Widget audio_alarm_config_play_data,
719        audio_alarm_config_play_on_new_station, audio_alarm_config_play_ons_data,
720        audio_alarm_config_play_on_new_message, audio_alarm_config_play_onm_data,
721        audio_alarm_config_play_on_prox, audio_alarm_config_play_onpx_data,
722        audio_alarm_config_play_on_bando, audio_alarm_config_play_onbo_data,
723        prox_min_data, prox_max_data, bando_min_data, bando_max_data,
724        audio_alarm_config_play_on_wx_alert, audio_alarm_config_wx_alert_data;
725 static void Configure_audio_alarms(Widget w, XtPointer clientData, XtPointer callData);
726 
727 // ---------------------------- speech -------------------------------
728 Widget configure_speech_dialog      = (Widget)NULL;
729 Widget speech_config_play_on_new_station,
730        speech_config_play_on_new_message_alert,
731        speech_config_play_on_new_message_body,
732        speech_config_play_on_prox,
733        speech_config_play_on_trak,
734        speech_config_play_on_bando,
735        speech_config_play_on_new_wx_alert;
736 
737 static void Configure_speech(Widget w, XtPointer clientData, XtPointer callData);
738 
739 //#ifdef HAVE_FESTIVAL
740 /* WARNING - new station is initialized to FALSE for a reason            */
741 /* If you're tempted to make it something that can be saved and restored */
742 /* beware, Speech cannot keep up with the initial flow of data from an   */
743 /* Internet connection that has buffered data. An unbuffered connection  */
744 /* yes, but not a buffered one.  Ken,  N7IPB                             */
745 int festival_speak_new_station = FALSE;
746 int festival_speak_proximity_alert;
747 int festival_speak_tracked_proximity_alert;
748 int festival_speak_band_opening;
749 int festival_speak_new_message_alert;
750 int festival_speak_new_message_body;
751 int festival_speak_new_weather_alert;
752 int festival_speak_ID;
753 //#endif    // HAVE_FESTIVAL
754 int ATV_screen_ID;
755 
756 #ifdef HAVE_LIBGEOTIFF
757   Widget configure_DRG_dialog = (Widget) NULL;
758   Widget DRG_XOR,
759   DRG_color0,
760   DRG_color1,
761   DRG_color2,
762   DRG_color3,
763   DRG_color4,
764   DRG_color5,
765   DRG_color6,
766   DRG_color7,
767   DRG_color8,
768   DRG_color9,
769   DRG_color10,
770   DRG_color11,
771   DRG_color12;
772 
773   int DRG_XOR_colors = 0;
774   int DRG_show_colors[13];
775 #endif  // HAVE_LIBGEOTIFF
776 
777 
778 // -------------------------------------------------------------------
779 
780 
781 Widget read_selection_dialog = (Widget)NULL;
782 
783 // config station values
784 Widget station_config_call_data, station_config_slat_data_deg, station_config_slat_data_min,
785        station_config_slat_data_ns, station_config_slong_data_deg, station_config_slong_data_min,
786        station_config_slong_data_ew, station_config_group_data, station_config_symbol_data,
787        station_config_icon, station_config_comment_data;
788 Pixmap CS_icon0, CS_icon;
789 
790 /* defaults*/
791 #ifdef TRANSMIT_RAW_WX
792   Widget raw_wx_tx;
793 #endif  // TRANSMIT_RAW_WX
794 Widget compressed_posit_tx;
795 Widget compressed_objects_items_tx;
796 Widget new_bulletin_popup_enable;
797 Widget zero_bulletin_popup_enable;
798 Widget warn_about_mouse_modifiers_enable;
799 Widget my_trail_diff_color_enable;
800 Widget load_predefined_objects_menu_from_file_enable;
801 #ifdef USE_COMBO_BOX
802   Widget load_predefined_objects_menu_from_file; // combo box widget
803 #else
804   int lpomff_value;  // replacement value for predefined menu file combo box
805 #endif // USE_COMBO_BOX
806 int pop_up_new_bulletins = 0;
807 int view_zero_distance_bulletins = 0;
808 int warn_about_mouse_modifiers = 1;
809 Widget altnet_active;
810 Widget altnet_text;
811 Widget disable_dupe_check;
812 Widget new_map_layer_text = (Widget)NULL;
813 Widget new_max_zoom_text = (Widget)NULL;
814 Widget new_min_zoom_text = (Widget)NULL;
815 Widget debug_level_text;
816 static int sec_last_dr_update = 0;
817 
818 
819 FILE *f_xfontsel_pipe[FONT_MAX];
820 int xfontsel_query = 0;
821 
822 
823 // -------------------------------------------------------------------
824 static void UpdateTime( XtPointer clientData, XtIntervalId id );
825 void pos_dialog(Widget w);
826 
827 static void Zoom_in(Widget w, XtPointer clientData, XtPointer calldata);
828 static void Zoom_in_no_pan(Widget w, XtPointer clientData, XtPointer calldata);
829 static void Zoom_out(Widget w, XtPointer clientData, XtPointer calldata);
830 static void Zoom_out_no_pan(Widget w, XtPointer clientData, XtPointer calldata);
831 static void Zoom_level(Widget w, XtPointer clientData, XtPointer calldata);
832 static void display_zoom_image(int recenter);
833 static void Track_Me( Widget w, XtPointer clientData, XtPointer calldata);
834 static void Measure_Distance( Widget w, XtPointer clientData, XtPointer calldata);
835 
836 static void SetMyPosition( Widget w, XtPointer clientData, XtPointer calldata);
837 
838 static void Pan_ctr(Widget w, XtPointer clientData, XtPointer calldata);
839 static void Pan_up(Widget w, XtPointer clientData, XtPointer calldata);
840 static void Pan_up_less(Widget w, XtPointer clientData, XtPointer calldata);
841 static void Pan_down(Widget w, XtPointer clientData, XtPointer calldata);
842 static void Pan_down_less(Widget w, XtPointer clientData, XtPointer calldata);
843 static void Pan_left(Widget w, XtPointer clientData, XtPointer calldata);
844 static void Pan_left_less(Widget w, XtPointer clientData, XtPointer calldata);
845 static void Pan_right(Widget w, XtPointer clientData, XtPointer calldata);
846 static void Pan_right_less(Widget w, XtPointer clientData, XtPointer calldata);
847 void Center_Zoom(Widget w, XtPointer clientData, XtPointer calldata);
848 void Go_Home(Widget w, XtPointer clientData, XtPointer calldata);
849 int center_zoom_override = 0;
850 Widget center_zoom_dialog = (Widget)NULL;
851 Widget custom_zoom_dialog = (Widget)NULL;
852 
853 static void Menu_Quit(Widget w, XtPointer clientData, XtPointer calldata);
854 
855 static void TNC_Logging_toggle(Widget w, XtPointer clientData, XtPointer calldata);
856 static void TNC_Transmit_now(Widget w, XtPointer clientData, XtPointer calldata);
857 
858 #ifdef HAVE_GPSMAN
859   static void GPS_operations(Widget w, XtPointer clientData, XtPointer calldata);
860 #endif  // HAVE_GPSMAN
861 
862 static void Net_Logging_toggle(Widget w, XtPointer clientData, XtPointer calldata);
863 
864 static void IGate_Logging_toggle(Widget w, XtPointer clientData, XtPointer calldata);
865 
866 static void Message_Logging_toggle(Widget w, XtPointer clientData, XtPointer calldata);
867 
868 static void WX_Logging_toggle(Widget w, XtPointer clientData, XtPointer calldata);
869 
870 static void WX_Alert_Logging_toggle(Widget w, XtPointer clientData, XtPointer calldata);
871 
872 void on_off_switch(int switchpos, Widget first, Widget second);
873 void sel3_switch(int switchpos, Widget first, Widget second, Widget third);
874 void sel4_switch(int switchpos, Widget first, Widget second, Widget third, Widget fourth);
875 
876 static void Configure_station(Widget w, XtPointer clientData, XtPointer callData);
877 
878 static void Configure_defaults(Widget w, XtPointer clientData, XtPointer callData);
879 
880 static void Configure_timing(Widget w, XtPointer clientData, XtPointer callData);
881 
882 static void Configure_coordinates(Widget w, XtPointer clientData, XtPointer callData);
883 
884 static void Stations_Clear(Widget w, XtPointer clientData, XtPointer callData);
885 
886 static void Test(Widget w, XtPointer clientData, XtPointer callData);
887 
888 static void Save_Config(Widget w, XtPointer clientData, XtPointer callData);
889 
890 static void Read_File_Selection(Widget w, XtPointer clientData, XtPointer callData);
891 
892 static void Display_data(Widget w, XtPointer clientData, XtPointer callData);
893 
894 static void Auto_msg_toggle( Widget widget, XtPointer clientData, XtPointer callData);
895 static void  Satellite_msg_ack_toggle( Widget widget, XtPointer clientData, XtPointer callData);
896 
897 Widget auto_msg_toggle;
898 Widget satellite_msg_ack_toggle;
899 Widget posamb0,posamb1,posamb2,posamb3,posamb4;
900 
901 
902 ////////////////////////////////////////////////////////////////////////////////////////////////////
903 
904 /* GLOBAL DEFINES */
905 GC gc=0;                // Used for drawing maps
906 GC gc2=0;               // Used for drawing symbols
907 GC gc_tint=0;           // Used for tinting maps & symbols
908 GC gc_stipple=0;        // Used for drawing symbols
909 GC gc_bigfont=0;
910 Pixmap  pixmap;
911 Pixmap  pixmap_alerts;
912 Pixmap  pixmap_final;
913 
914 // Global variable, so we can set it up once check it from then on,
915 // preventing memory leaks from repeatedly setting up the same
916 // XFontStruct.
917 XFontStruct *station_font = NULL;   // Station font
918 XFontStruct *font1;                 // Menu/System font
919 XmFontList fontlist1;               // Menu/System fontlist
920 
921 Pixmap  pixmap_50pct_stipple; // 50% pixels used for position ambiguity, DF circle, etc.
922 Pixmap  pixmap_25pct_stipple; // 25% pixels used for large position ambiguity
923 Pixmap  pixmap_13pct_stipple; // 12.5% pixels used for larger position ambiguity
924 Pixmap  pixmap_wx_stipple;  // Used for weather alerts
925 
926 int interrupt_drawing_now = 0;  // Flag used to interrupt map drawing
927 int request_resize = 0;         // Flag used to request a resize operation
928 int request_new_image = 0;      // Flag used to request a create_image operation
929 //time_t last_input_event = (time_t)0;  // Time of last mouse/keyboard event
930 void new_image(Widget da);
931 
932 
933 typedef struct XastirGlobal
934 {
935   Widget  top;    // top level shell
936 } XastirGlobal;
937 XastirGlobal Global;
938 
939 
940 char *database_ptr;             /* database pointers */
941 
942 
943 //---------------------------------------------------------------------------------------------
944 //
945 // These describe the current map window.  They must be kept
946 // up-to-date when we zoom/pan/resize the window.
947 //
948 float f_center_longitude;    // Floating point map center longitude, updated by new_image()
949 float f_center_latitude;     // Floating point map center latitude , updated by new_image()
950 float f_NW_corner_longitude; // longitude of NW corner, updated by create_image(), refresh_image()
951 float f_NW_corner_latitude;  // latitude  of NW corner, updated by create_image(), refresh_image()
952 float f_SE_corner_longitude; // longitude of SE corner, updated by create_image(), refresh_image()
953 float f_SE_corner_latitude;  // latitude  of SE corner, updated by create_image(), refresh_image()
954 
955 long center_longitude;       // Longitude at center of map, updated by display_zoom_image()
956 long center_latitude;        // Latitude  at center of map, updated by display_zoom_image()
957 long NW_corner_longitude;    // Longitude at NW corner, updated by create_image(), refresh_image()
958 long NW_corner_latitude;     // Latitude  at NW corner, updated by create_image(), refresh_image()
959 long SE_corner_longitude;    // Longitude at SE corner, updated by create_image(), refresh_image()
960 long SE_corner_latitude;     // Latitude  at SE corner, updated by create_image(), refresh_image()
961 
962 long scale_x;                // x scaling in 1/100 sec per pixel, calculated from scale_y
963 long scale_y;                // y scaling in 1/100 sec per pixel
964 
965 long new_mid_x, new_mid_y;   // Check values used before applying real change
966 long new_scale_x;
967 long new_scale_y;
968 long screen_width;           // Screen width,  map area without border (in pixels)
969 long screen_height;          // Screen height, map area without border (in pixels)
970 Position screen_x_offset;
971 Position screen_y_offset;
972 float d_screen_distance;     // Diag screen distance
973 float x_screen_distance;     // x screen distance
974 //---------------------------------------------------------------------------------------------
975 
976 char user_dir[1000];            /* user directory file */
977 int delay_time;                 /* used to delay display data */
978 time_t last_weather_cycle;      // Time of last call to cycle_weather()
979 Pixel colors[256];              /* screen colors */
980 Pixel trail_colors[MAX_TRAIL_COLORS]; /* station trail colors, duh */
981 int current_trail_color;        /* what color to draw station trails with */
982 Pixel_Format visual_type = NOT_TRUE_NOR_DIRECT;
983 int install_colormap;           /* if visual_type == NOT_TRUE..., should we install priv cmap */
984 Colormap cmap;                  /* current colormap */
985 
986 int redo_list;                  // Station List update request
987 int redraw_on_new_data;         // Station redraw request
988 int wait_to_redraw;             /* wait to redraw until system is up */
989 int display_up = 0;             /* display up? */
990 int display_up_first = 0;       /* display up first */
991 
992 time_t max_transmit_time;       /* max time between transmits */
993 time_t last_alert_redraw;       /* last time alert caused a redraw */
994 time_t sec_next_gps;            /* next gps check */
995 time_t gps_time;                /* gps delay time */
996 char gprmc_save_string[MAX_LINE_SIZE+1];
997 char gpgga_save_string[MAX_LINE_SIZE+1];
998 int gps_port_save;
999 time_t POSIT_rate;              // Posit TX rate timer
1000 time_t OBJECT_rate;             // Object/Item TX rate timer
1001 time_t update_DR_rate;          // How often to call draw_symbols if DR enabled
1002 time_t remove_ID_message_time;  // Time to get rid of large msg on screen.
1003 int pending_ID_message = 0;     // Variable turning on/off this function
1004 
1005 
1006 // SmartBeaconing(tm) stuff.  If enabled, POSIT_rate won't be used
1007 // for timing posits. sb_POSIT_rate computed via SmartBeaconing(tm)
1008 // will be used instead.
1009 int smart_beaconing;            // Master enable/disable for SmartBeaconing(tm) mode
1010 int sb_POSIT_rate = 30 * 60;    // Computed SmartBeaconing(tm) posit rate (secs)
1011 int sb_last_heading = -1;       // Heading at time of last posit
1012 int sb_current_heading = -1;    // Most recent heading parsed from GPS sentence
1013 int sb_turn_min = 20;           // Min threshold for corner pegging (degrees)
1014 int sb_turn_slope = 25;         // Threshold slope for corner pegging (degrees/mph)
1015 int sb_turn_time = 5;           // Time between other beacon & turn beacon (secs)
1016 int sb_posit_fast = 90;         // Fast beacon rate (secs)
1017 int sb_posit_slow = 30;         // Slow beacon rate (mins)
1018 int sb_low_speed_limit = 2;     // Speed below which SmartBeaconing(tm) is disabled &
1019 // we'll beacon at the POSIT_slow rate (mph)
1020 int sb_high_speed_limit = 60;   // Speed above which we'll beacon at the
1021 // POSIT_fast rate (mph)
1022 Widget smart_beacon_dialog = (Widget)NULL;
1023 Widget smart_beacon_enable = (Widget)NULL;
1024 Widget sb_hi_rate_data = (Widget)NULL;
1025 Widget sb_hi_mph_data = (Widget)NULL;
1026 Widget sb_lo_rate_data = (Widget)NULL;
1027 Widget sb_lo_mph_data = (Widget)NULL;
1028 Widget sb_min_turn_data = (Widget)NULL;
1029 Widget sb_turn_slope_data = (Widget)NULL;
1030 Widget sb_wait_time_data = (Widget)NULL;
1031 
1032 
1033 Widget ghosting_time = (Widget)NULL;
1034 Widget clearing_time = (Widget)NULL;
1035 Widget aircraft_clearing_time = (Widget)NULL;
1036 Widget removal_time = (Widget)NULL;
1037 Widget posit_interval = (Widget)NULL;
1038 Widget gps_interval = (Widget)NULL;
1039 Widget dead_reckoning_time = (Widget)NULL;
1040 Widget object_item_interval = (Widget)NULL;
1041 Widget serial_pacing_time = (Widget)NULL;
1042 Widget trail_segment_timeout = (Widget)NULL;
1043 Widget trail_segment_distance_max = (Widget)NULL;
1044 Widget RINO_download_timeout = (Widget)NULL;
1045 Widget net_map_slider = (Widget)NULL;
1046 Widget snapshot_interval_slider = (Widget)NULL;
1047 int net_map_timeout = 120;
1048 
1049 
1050 
1051 time_t GPS_time;                /* gps time out */
1052 time_t last_statusline;         // last update of statusline or 0 if inactive
1053 time_t last_id_time;            // Time of last ID message to statusline
1054 time_t sec_old;                 /* station old after */
1055 time_t sec_clear;               /* station cleared after */
1056 time_t aircraft_sec_clear;      /* aircraft cleared after */
1057 time_t sec_remove;              /* Station removed after */
1058 int trail_segment_time;         // Segment missing if above this time (mins)
1059 int trail_segment_distance;     // Segment missing if greater distance
1060 int RINO_download_interval;     // Interval at which to download RINO waypoints,
1061 // creating APRS Objects from them.
1062 time_t last_RINO_download = (time_t)0;
1063 time_t sec_next_raw_wx;         /* raw wx transmit data */
1064 int dead_reckoning_timeout = 60 * 10;   // 10 minutes;
1065 
1066 #ifdef TRANSMIT_RAW_WX
1067   int transmit_raw_wx;            /* transmit raw wx data? */
1068 #endif  // TRANSMIT_RAW_WX
1069 
1070 int transmit_compressed_posit;  // transmit location in compressed format?
1071 int transmit_compressed_objects_items;  // Same for objects & items
1072 
1073 int output_station_type;        /* Broadcast station type */
1074 
1075 int Configure_station_pos_amb;  /* Broadcast station position ambiguity */
1076 
1077 long max_vectors_allowed;       /* max map vectors allowed */
1078 long max_text_labels_allowed;   /* max map text labels allowed */
1079 long max_symbol_labels_allowed; /* max map symbol labels allowed */
1080 
1081 time_t net_last_time;           /* reconnect last time in seconds */
1082 time_t net_next_time;           /* reconnect Next update delay time */
1083 
1084 #ifdef USING_LIBGC
1085   time_t gc_next_time = 0L;       // Garbage collection next time
1086 #endif  // USING_LIBGC
1087 
1088 time_t posit_last_time;
1089 time_t posit_next_time;         /* time at which next posit TX will occur */
1090 
1091 time_t last_time;               /* last time in seconds */
1092 time_t next_time;               /* Next update delay time */
1093 
1094 time_t next_redraw;             /* Next update time */
1095 time_t last_redraw;             /* Time of last redraw */
1096 
1097 char aprs_station_message_type = '='; // station message-capable or not
1098 
1099 int transmit_now;               /* set to transmit now (push on moment) */
1100 int my_position_valid = 1;      /* Don't send posits if this is zero */
1101 int using_gps_position = 0;     /* Set to one if a GPS port is active */
1102 int operate_as_an_igate;        /* toggle igate operations for net connections */
1103 unsigned igate_msgs_tx;         /* current total of igate messages transmitted */
1104 
1105 int log_tnc_data;               /* log data */
1106 int log_net_data;               /* log data */
1107 int log_igate;                  /* toggle to allow igate logging */
1108 int log_wx;                     /* toggle to allow wx logging */
1109 int log_message_data;           /* toggle to allow message logging */
1110 int log_wx_alert_data;          /* toggle to allow wx alert logging */
1111 
1112 
1113 int snapshots_enabled = 0;      // toggle to allow creating .png snapshots on a regular basis
1114 int kmlsnapshots_enabled = 0;   // toggle to allow creating .kml snapshots on a regular basis
1115 
1116 time_t WX_ALERTS_REFRESH_TIME;  /* Minimum WX alert map refresh time in seconds */
1117 
1118 /* button zoom */
1119 int menu_x;
1120 int menu_y;
1121 int possible_zoom_function = 0;
1122 int zoom_box_x1 = -1;           // Stores one corner of zoom box
1123 int zoom_box_y1 = -1;
1124 int zoom_box_x2 = -1;           // Stores one corner of zoom box
1125 int zoom_box_y2 = -1;
1126 int mouse_zoom = 0;
1127 
1128 // log file replay
1129 int read_file;
1130 FILE *read_file_ptr;
1131 time_t next_file_read;
1132 
1133 // Data for own station
1134 char my_callsign[MAX_CALLSIGN+1];
1135 char my_lat[MAX_LAT];
1136 char my_long[MAX_LONG];
1137 char my_group;
1138 char my_symbol;
1139 char my_phg[MAX_PHG+1];
1140 char my_comment[MAX_COMMENT+1];
1141 int  my_last_course;
1142 int  my_last_speed;
1143 long my_last_altitude;
1144 time_t my_last_altitude_time;
1145 
1146 /* Symbols */
1147 SymbolData symbol_data[MAX_SYMBOLS];
1148 
1149 /* sound run */
1150 pid_t last_sound_pid;
1151 
1152 /* Default directories */
1153 
1154 char AUTO_MAP_DIR[400];
1155 char ALERT_MAP_DIR[400];
1156 char SELECTED_MAP_DIR[400];
1157 char SELECTED_MAP_DATA[400];
1158 char MAP_INDEX_DATA[400];
1159 char SYMBOLS_DIR[400];
1160 char HELP_FILE[400];
1161 char SOUND_DIR[400];
1162 
1163 char LOGFILE_TNC[400];
1164 char LOGFILE_NET[400];
1165 char LOGFILE_IGATE[400];
1166 char LOGFILE_MESSAGE[400];
1167 char LOGFILE_WX[400];
1168 char LOGFILE_WX_ALERT[400];
1169 
1170 /* sound data */
1171 char sound_command[90];
1172 int  sound_play_new_station;
1173 char sound_new_station[90];
1174 int  sound_play_new_message;
1175 char sound_new_message[90];
1176 
1177 int  sound_play_prox_message;
1178 char sound_prox_message[90];
1179 char prox_min[30];
1180 char prox_max[30];
1181 int  sound_play_band_open_message;
1182 char sound_band_open_message[90];
1183 char bando_min[30];
1184 char bando_max[30];
1185 int  sound_play_wx_alert_message;
1186 char sound_wx_alert_message[90];
1187 
1188 
1189 int input_x = 0;
1190 int input_y = 0;
1191 
1192 XtAppContext app_context;
1193 Display *display;       /*  Display             */
1194 
1195 /* dialog popup last */
1196 int last_popup_x;
1197 int last_popup_y;
1198 
1199 int disable_all_popups = 0;
1200 char temp_tracking_station_call[30] = "";
1201 
1202 time_t program_start_time;
1203 int measuring_distance = 0;
1204 int moving_object = 0;
1205 
1206 
1207 
1208 
1209 /////////////////////////////////////////////////////////////////////////
1210 
1211 
1212 
1213 
1214 
Smart_Beacon_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))1215 void Smart_Beacon_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
1216 {
1217   Widget shell = (Widget) clientData;
1218   XtPopdown(shell);
1219   XtDestroyWidget(shell);
1220   smart_beacon_dialog = (Widget)NULL;
1221 }
1222 
1223 
1224 
1225 
1226 
1227 // Still need to do some bounds checking on the values here.
1228 //
1229 // If the user enters 0's or non-numeric data, this function sets the
1230 // values to reasonable defaults.
1231 //
1232 // Another thing that'd be good to do is to recalculate the next
1233 // beacon time if one of the posit rates is shortened.  Otherwise we
1234 // might be waiting a while to get into the "right rhythm".
1235 //
Smart_Beacon_change_data(Widget widget,XtPointer clientData,XtPointer callData)1236 void Smart_Beacon_change_data(Widget widget, XtPointer clientData, XtPointer callData)
1237 {
1238 
1239   // Snag the XmTextString data and write it into the variables
1240   if (smart_beacon_dialog != NULL)
1241   {
1242     char *str_ptr1;
1243     int i;
1244 
1245     smart_beaconing = (int)XmToggleButtonGetState(smart_beacon_enable);
1246 
1247     str_ptr1 = XmTextGetString(sb_hi_rate_data);
1248     i = atoi(str_ptr1);
1249     if (i == 0)
1250     {
1251       i = 90;
1252     }
1253     sb_posit_fast = i;
1254     // Free the space.
1255     XtFree(str_ptr1);
1256 
1257     str_ptr1 = XmTextGetString(sb_hi_mph_data);
1258     i = atoi(str_ptr1);
1259     switch (english_units)
1260     {
1261       case 0: // Metric:  Convert from KPH to MPH for storage
1262         i = (int)((i * 0.62137) + 0.5);
1263         break;
1264       case 1: // English
1265       case 2: // Nautical
1266       default:    // No conversion necessary
1267         break;
1268     }
1269     if (i == 0)
1270     {
1271       i = 60;
1272     }
1273     sb_high_speed_limit = i;
1274     // Free the space.
1275     XtFree(str_ptr1);
1276 
1277     str_ptr1 = XmTextGetString(sb_lo_rate_data);
1278     i = atoi(str_ptr1);
1279     if (i == 0)
1280     {
1281       i = 30;
1282     }
1283     sb_posit_slow = i;
1284     // Free the space.
1285     XtFree(str_ptr1);
1286 
1287     str_ptr1 = XmTextGetString(sb_lo_mph_data);
1288     i = atoi(str_ptr1);
1289     switch (english_units)
1290     {
1291       case 0: // Metric:  Convert from KPH to MPH for storage
1292         i = (int)((i * 0.62137) + 0.5);
1293         break;
1294       case 1: // English
1295       case 2: // Nautical
1296       default:    // No conversion necessary
1297         break;
1298     }
1299     if (i == 0)
1300     {
1301       i = 2;
1302     }
1303     sb_low_speed_limit = i;
1304     // Free the space.
1305     XtFree(str_ptr1);
1306 
1307     str_ptr1 = XmTextGetString(sb_min_turn_data);
1308     i = atoi(str_ptr1);
1309     if (i == 0)
1310     {
1311       i = 20;
1312     }
1313     sb_turn_min = i;
1314     // Free the space.
1315     XtFree(str_ptr1);
1316 
1317     str_ptr1 = XmTextGetString(sb_turn_slope_data);
1318     i = atoi(str_ptr1);
1319     if (i == 0)
1320     {
1321       i = 25;
1322     }
1323     sb_turn_slope = i;
1324     // Free the space.
1325     XtFree(str_ptr1);
1326 
1327     str_ptr1 = XmTextGetString(sb_wait_time_data);
1328     i = atoi(str_ptr1);
1329     if (i == 0)
1330     {
1331       i = 5;
1332     }
1333     sb_turn_time = i;
1334     // Free the space.
1335     XtFree(str_ptr1);
1336 
1337     Smart_Beacon_destroy_shell(widget,clientData,callData);
1338   }
1339 }
1340 
1341 
1342 
1343 
1344 
Smart_Beacon(Widget w,XtPointer UNUSED (clientData),XtPointer callData)1345 void Smart_Beacon(Widget w, XtPointer UNUSED(clientData), XtPointer callData)
1346 {
1347   static Widget  pane, scrollwindow, form, label1, label2, label3,
1348          label4, label5, label6,
1349          button_ok, button_cancel;
1350 //  static Widget label7;
1351   Atom delw;
1352   char temp_string[10];
1353   char temp_label_string[100];
1354 
1355 
1356   // Destroy the dialog if it exists.  This is to make sure the
1357   // title is correct based on the last dialog that called us.
1358   if (smart_beacon_dialog)
1359   {
1360     Smart_Beacon_destroy_shell( w, smart_beacon_dialog, callData);
1361   }
1362 
1363   if (!smart_beacon_dialog)
1364   {
1365 
1366     smart_beacon_dialog = XtVaCreatePopupShell(langcode("SMARTB001"),
1367                           xmDialogShellWidgetClass, appshell,
1368                           XmNdeleteResponse, XmDESTROY,
1369                           XmNdefaultPosition, FALSE,
1370                           XmNfontList, fontlist1,
1371                           NULL);
1372 
1373     pane = XtVaCreateWidget("Smart_Beacon pane",
1374                             xmPanedWindowWidgetClass,
1375                             smart_beacon_dialog,
1376                             MY_FOREGROUND_COLOR,
1377                             MY_BACKGROUND_COLOR,
1378                             NULL);
1379 
1380     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
1381                                            xmScrolledWindowWidgetClass,
1382                                            pane,
1383                                            XmNscrollingPolicy, XmAUTOMATIC,
1384                                            NULL);
1385 
1386     form =  XtVaCreateWidget("Smart_Beacon form",
1387                              xmFormWidgetClass,
1388                              scrollwindow,
1389                              XmNfractionBase, 2,
1390                              XmNautoUnmanage, FALSE,
1391                              XmNshadowThickness, 1,
1392                              MY_FOREGROUND_COLOR,
1393                              MY_BACKGROUND_COLOR,
1394                              NULL);
1395 
1396     smart_beacon_enable = XtVaCreateManagedWidget(langcode("SMARTB011"),
1397                           xmToggleButtonWidgetClass,form,
1398                           XmNtopAttachment, XmATTACH_FORM,
1399                           XmNtopOffset, 10,
1400                           XmNbottomAttachment, XmATTACH_NONE,
1401                           XmNleftAttachment, XmATTACH_FORM,
1402                           XmNleftOffset,5,
1403                           XmNrightAttachment, XmATTACH_NONE,
1404                           XmNnavigationType, XmTAB_GROUP,
1405                           MY_FOREGROUND_COLOR,
1406                           MY_BACKGROUND_COLOR,
1407                           XmNfontList, fontlist1,
1408                           NULL);
1409 
1410     label1 = XtVaCreateManagedWidget(langcode("SMARTB002"),
1411                                      xmLabelWidgetClass,
1412                                      form,
1413                                      XmNtopAttachment, XmATTACH_WIDGET,
1414                                      XmNtopWidget, smart_beacon_enable,
1415                                      XmNtopOffset, 10,
1416                                      XmNbottomAttachment, XmATTACH_NONE,
1417                                      XmNleftAttachment, XmATTACH_FORM,
1418                                      XmNleftOffset, 10,
1419                                      XmNrightAttachment, XmATTACH_POSITION,
1420                                      XmNrightPosition, 1,
1421                                      MY_FOREGROUND_COLOR,
1422                                      MY_BACKGROUND_COLOR,
1423                                      XmNfontList, fontlist1,
1424                                      NULL);
1425 
1426     sb_hi_rate_data = XtVaCreateManagedWidget("Smart_Beacon hi_rate_data",
1427                       xmTextWidgetClass,
1428                       form,
1429                       XmNeditable,   TRUE,
1430                       XmNcursorPositionVisible, TRUE,
1431                       XmNsensitive, TRUE,
1432                       XmNshadowThickness,    1,
1433                       XmNcolumns, 6,
1434                       XmNwidth, ((6*7)+2),
1435                       XmNmaxLength, 5,
1436                       XmNbackground, colors[0x0f],
1437                       XmNtopAttachment,XmATTACH_WIDGET,
1438                       XmNtopWidget, smart_beacon_enable,
1439                       XmNtopOffset, 5,
1440                       XmNbottomAttachment,XmATTACH_NONE,
1441                       XmNleftAttachment, XmATTACH_POSITION,
1442                       XmNleftPosition, 1,
1443                       XmNrightAttachment,XmATTACH_FORM,
1444                       XmNrightOffset, 10,
1445                       XmNnavigationType, XmTAB_GROUP,
1446                       XmNfontList, fontlist1,
1447                       NULL);
1448 
1449     switch (english_units)
1450     {
1451       case 0: // Metric
1452         xastir_snprintf(temp_label_string,
1453                         sizeof(temp_label_string),
1454                         "%s",
1455                         langcode("SMARTB004") );
1456         break;
1457       case 1: // English
1458       case 2: // Nautical
1459       default:
1460         xastir_snprintf(temp_label_string,
1461                         sizeof(temp_label_string),
1462                         "%s",
1463                         langcode("SMARTB003") );
1464         break;
1465     }
1466 
1467     // High Speed (mph) / (kph)
1468     label2 = XtVaCreateManagedWidget(temp_label_string,
1469                                      xmLabelWidgetClass,
1470                                      form,
1471                                      XmNtopAttachment, XmATTACH_WIDGET,
1472                                      XmNtopWidget, label1,
1473                                      XmNtopOffset, 10,
1474                                      XmNbottomAttachment, XmATTACH_NONE,
1475                                      XmNleftAttachment, XmATTACH_FORM,
1476                                      XmNleftOffset, 10,
1477                                      XmNrightAttachment, XmATTACH_POSITION,
1478                                      XmNrightPosition, 1,
1479                                      MY_FOREGROUND_COLOR,
1480                                      MY_BACKGROUND_COLOR,
1481                                      XmNfontList, fontlist1,
1482                                      NULL);
1483 
1484     sb_hi_mph_data = XtVaCreateManagedWidget("Smart_Beacon hi_mph_data",
1485                      xmTextWidgetClass,
1486                      form,
1487                      XmNeditable,   TRUE,
1488                      XmNcursorPositionVisible, TRUE,
1489                      XmNsensitive, TRUE,
1490                      XmNshadowThickness,    1,
1491                      XmNcolumns, 6,
1492                      XmNwidth, ((6*7)+2),
1493                      XmNmaxLength, 3,
1494                      XmNbackground, colors[0x0f],
1495                      XmNtopOffset, 5,
1496                      XmNtopAttachment,XmATTACH_WIDGET,
1497                      XmNtopWidget, label1,
1498                      XmNbottomAttachment,XmATTACH_NONE,
1499                      XmNleftAttachment, XmATTACH_POSITION,
1500                      XmNleftPosition, 1,
1501                      XmNrightAttachment,XmATTACH_FORM,
1502                      XmNrightOffset, 10,
1503                      XmNnavigationType, XmTAB_GROUP,
1504                      XmNfontList, fontlist1,
1505                      NULL);
1506 
1507     label3 = XtVaCreateManagedWidget(langcode("SMARTB005"),
1508                                      xmLabelWidgetClass,
1509                                      form,
1510                                      XmNtopAttachment, XmATTACH_WIDGET,
1511                                      XmNtopWidget, label2,
1512                                      XmNtopOffset, 10,
1513                                      XmNbottomAttachment, XmATTACH_NONE,
1514                                      XmNleftAttachment, XmATTACH_FORM,
1515                                      XmNleftOffset, 10,
1516                                      XmNrightAttachment, XmATTACH_POSITION,
1517                                      XmNrightPosition, 1,
1518                                      MY_FOREGROUND_COLOR,
1519                                      MY_BACKGROUND_COLOR,
1520                                      XmNfontList, fontlist1,
1521                                      NULL);
1522 
1523     sb_lo_rate_data = XtVaCreateManagedWidget("Smart_Beacon lo_rate_data",
1524                       xmTextWidgetClass,
1525                       form,
1526                       XmNeditable,   TRUE,
1527                       XmNcursorPositionVisible, TRUE,
1528                       XmNsensitive, TRUE,
1529                       XmNshadowThickness,    1,
1530                       XmNcolumns, 6,
1531                       XmNwidth, ((6*7)+2),
1532                       XmNmaxLength, 3,
1533                       XmNbackground, colors[0x0f],
1534                       XmNtopOffset, 5,
1535                       XmNtopAttachment,XmATTACH_WIDGET,
1536                       XmNtopWidget, label2,
1537                       XmNbottomAttachment,XmATTACH_NONE,
1538                       XmNleftAttachment, XmATTACH_POSITION,
1539                       XmNleftPosition, 1,
1540                       XmNrightAttachment,XmATTACH_FORM,
1541                       XmNrightOffset, 10,
1542                       XmNnavigationType, XmTAB_GROUP,
1543                       XmNfontList, fontlist1,
1544                       NULL);
1545 
1546     switch (english_units)
1547     {
1548       case 0: // Metric
1549         xastir_snprintf(temp_label_string,
1550                         sizeof(temp_label_string),
1551                         "%s",
1552                         langcode("SMARTB007") );
1553         break;
1554       case 1: // English
1555       case 2: // Nautical
1556       default:
1557         xastir_snprintf(temp_label_string,
1558                         sizeof(temp_label_string),
1559                         "%s",
1560                         langcode("SMARTB006") );
1561         break;
1562     }
1563 
1564     // Low Speed (mph) / (kph)
1565     label4 = XtVaCreateManagedWidget(temp_label_string,
1566                                      xmLabelWidgetClass,
1567                                      form,
1568                                      XmNtopAttachment, XmATTACH_WIDGET,
1569                                      XmNtopWidget, label3,
1570                                      XmNtopOffset, 10,
1571                                      XmNbottomAttachment, XmATTACH_NONE,
1572                                      XmNleftAttachment, XmATTACH_FORM,
1573                                      XmNleftOffset, 10,
1574                                      XmNrightAttachment, XmATTACH_POSITION,
1575                                      XmNrightPosition, 1,
1576                                      MY_FOREGROUND_COLOR,
1577                                      MY_BACKGROUND_COLOR,
1578                                      XmNfontList, fontlist1,
1579                                      NULL);
1580 
1581     sb_lo_mph_data = XtVaCreateManagedWidget("Smart_Beacon lo_mph_data",
1582                      xmTextWidgetClass,
1583                      form,
1584                      XmNeditable,   TRUE,
1585                      XmNcursorPositionVisible, TRUE,
1586                      XmNsensitive, TRUE,
1587                      XmNshadowThickness,    1,
1588                      XmNcolumns, 6,
1589                      XmNwidth, ((6*7)+2),
1590                      XmNmaxLength, 3,
1591                      XmNbackground, colors[0x0f],
1592                      XmNtopOffset, 5,
1593                      XmNtopAttachment,XmATTACH_WIDGET,
1594                      XmNtopWidget, label3,
1595                      XmNbottomAttachment,XmATTACH_NONE,
1596                      XmNleftAttachment, XmATTACH_POSITION,
1597                      XmNleftPosition, 1,
1598                      XmNrightAttachment,XmATTACH_FORM,
1599                      XmNrightOffset, 10,
1600                      XmNnavigationType, XmTAB_GROUP,
1601                      XmNfontList, fontlist1,
1602                      NULL);
1603 
1604     label5 = XtVaCreateManagedWidget(langcode("SMARTB008"),
1605                                      xmLabelWidgetClass,
1606                                      form,
1607                                      XmNtopAttachment, XmATTACH_WIDGET,
1608                                      XmNtopWidget, label4,
1609                                      XmNtopOffset, 10,
1610                                      XmNbottomAttachment, XmATTACH_NONE,
1611                                      XmNleftAttachment, XmATTACH_FORM,
1612                                      XmNleftOffset, 10,
1613                                      XmNrightAttachment, XmATTACH_POSITION,
1614                                      XmNrightPosition, 1,
1615                                      MY_FOREGROUND_COLOR,
1616                                      MY_BACKGROUND_COLOR,
1617                                      XmNfontList, fontlist1,
1618                                      NULL);
1619 
1620     sb_min_turn_data = XtVaCreateManagedWidget("Smart_Beacon min_turn_data",
1621                        xmTextWidgetClass,
1622                        form,
1623                        XmNeditable,   TRUE,
1624                        XmNcursorPositionVisible, TRUE,
1625                        XmNsensitive, TRUE,
1626                        XmNshadowThickness,    1,
1627                        XmNcolumns, 6,
1628                        XmNwidth, ((6*7)+2),
1629                        XmNmaxLength, 3,
1630                        XmNbackground, colors[0x0f],
1631                        XmNtopOffset, 5,
1632                        XmNtopAttachment,XmATTACH_WIDGET,
1633                        XmNtopWidget, label4,
1634                        XmNbottomAttachment,XmATTACH_NONE,
1635                        XmNleftAttachment, XmATTACH_POSITION,
1636                        XmNleftPosition, 1,
1637                        XmNrightAttachment,XmATTACH_FORM,
1638                        XmNrightOffset, 10,
1639                        XmNnavigationType, XmTAB_GROUP,
1640                        XmNfontList, fontlist1,
1641                        NULL);
1642 
1643     label6 = XtVaCreateManagedWidget(langcode("SMARTB009"),
1644                                      xmLabelWidgetClass,
1645                                      form,
1646                                      XmNtopAttachment, XmATTACH_WIDGET,
1647                                      XmNtopWidget, label5,
1648                                      XmNtopOffset, 10,
1649                                      XmNbottomAttachment, XmATTACH_NONE,
1650                                      XmNleftAttachment, XmATTACH_FORM,
1651                                      XmNleftOffset, 10,
1652                                      XmNrightAttachment, XmATTACH_POSITION,
1653                                      XmNrightPosition, 1,
1654                                      MY_FOREGROUND_COLOR,
1655                                      MY_BACKGROUND_COLOR,
1656                                      XmNfontList, fontlist1,
1657                                      NULL);
1658 
1659     sb_turn_slope_data = XtVaCreateManagedWidget("Smart_Beacon turn_slope_data",
1660                          xmTextWidgetClass,
1661                          form,
1662                          XmNeditable,   TRUE,
1663                          XmNcursorPositionVisible, TRUE,
1664                          XmNsensitive, TRUE,
1665                          XmNshadowThickness,    1,
1666                          XmNcolumns, 6,
1667                          XmNwidth, ((6*7)+2),
1668                          XmNmaxLength, 5,
1669                          XmNbackground, colors[0x0f],
1670                          XmNtopOffset, 5,
1671                          XmNtopAttachment,XmATTACH_WIDGET,
1672                          XmNtopWidget, label5,
1673                          XmNbottomAttachment,XmATTACH_NONE,
1674                          XmNleftAttachment, XmATTACH_POSITION,
1675                          XmNleftPosition, 1,
1676                          XmNrightAttachment,XmATTACH_FORM,
1677                          XmNrightOffset, 10,
1678                          XmNnavigationType, XmTAB_GROUP,
1679                          XmNfontList, fontlist1,
1680                          NULL);
1681 
1682     //label7
1683     XtVaCreateManagedWidget(langcode("SMARTB010"),
1684                             xmLabelWidgetClass,
1685                             form,
1686                             XmNtopAttachment, XmATTACH_WIDGET,
1687                             XmNtopWidget, label6,
1688                             XmNtopOffset, 10,
1689                             XmNbottomAttachment, XmATTACH_NONE,
1690                             XmNleftAttachment, XmATTACH_FORM,
1691                             XmNleftOffset, 10,
1692                             XmNrightAttachment, XmATTACH_POSITION,
1693                             XmNrightPosition, 1,
1694                             MY_FOREGROUND_COLOR,
1695                             MY_BACKGROUND_COLOR,
1696                             XmNfontList, fontlist1,
1697                             NULL);
1698 
1699     sb_wait_time_data = XtVaCreateManagedWidget("Smart_Beacon wait_time_data",
1700                         xmTextWidgetClass,
1701                         form,
1702                         XmNeditable,   TRUE,
1703                         XmNcursorPositionVisible, TRUE,
1704                         XmNsensitive, TRUE,
1705                         XmNshadowThickness,    1,
1706                         XmNcolumns, 6,
1707                         XmNwidth, ((6*7)+2),
1708                         XmNmaxLength, 3,
1709                         XmNbackground, colors[0x0f],
1710                         XmNtopOffset, 5,
1711                         XmNtopAttachment,XmATTACH_WIDGET,
1712                         XmNtopWidget, label6,
1713                         XmNbottomAttachment,XmATTACH_NONE,
1714                         XmNleftAttachment, XmATTACH_POSITION,
1715                         XmNleftPosition, 1,
1716                         XmNrightAttachment,XmATTACH_FORM,
1717                         XmNrightOffset, 10,
1718                         XmNnavigationType, XmTAB_GROUP,
1719                         XmNfontList, fontlist1,
1720                         NULL);
1721 
1722     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
1723                                         xmPushButtonGadgetClass,
1724                                         form,
1725                                         XmNtopAttachment, XmATTACH_WIDGET,
1726                                         XmNtopWidget, sb_wait_time_data,
1727                                         XmNtopOffset, 5,
1728                                         XmNbottomAttachment, XmATTACH_FORM,
1729                                         XmNbottomOffset, 5,
1730                                         XmNleftAttachment, XmATTACH_POSITION,
1731                                         XmNleftPosition, 0,
1732                                         XmNrightAttachment, XmATTACH_POSITION,
1733                                         XmNrightPosition, 1,
1734                                         XmNnavigationType, XmTAB_GROUP,
1735                                         MY_FOREGROUND_COLOR,
1736                                         MY_BACKGROUND_COLOR,
1737                                         XmNfontList, fontlist1,
1738                                         NULL);
1739     XtAddCallback(button_ok, XmNactivateCallback, Smart_Beacon_change_data, smart_beacon_dialog);
1740 
1741     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00003"),
1742                                             xmPushButtonGadgetClass,
1743                                             form,
1744                                             XmNtopAttachment, XmATTACH_WIDGET,
1745                                             XmNtopWidget, sb_wait_time_data,
1746                                             XmNtopOffset, 5,
1747                                             XmNbottomAttachment, XmATTACH_FORM,
1748                                             XmNbottomOffset, 5,
1749                                             XmNleftAttachment, XmATTACH_POSITION,
1750                                             XmNleftPosition, 1,
1751                                             XmNrightAttachment, XmATTACH_POSITION,
1752                                             XmNrightPosition, 2,
1753                                             XmNnavigationType, XmTAB_GROUP,
1754                                             MY_FOREGROUND_COLOR,
1755                                             MY_BACKGROUND_COLOR,
1756                                             XmNfontList, fontlist1,
1757                                             NULL);
1758     XtAddCallback(button_cancel, XmNactivateCallback, Smart_Beacon_destroy_shell, smart_beacon_dialog);
1759 
1760     pos_dialog(smart_beacon_dialog);
1761 
1762     delw = XmInternAtom(XtDisplay(smart_beacon_dialog),"WM_DELETE_WINDOW", FALSE);
1763     XmAddWMProtocolCallback(smart_beacon_dialog, delw, Smart_Beacon_destroy_shell, (XtPointer)smart_beacon_dialog);
1764 
1765     XtManageChild(form);
1766     XtManageChild(pane);
1767 
1768     resize_dialog(form, smart_beacon_dialog);
1769 
1770     XtPopup(smart_beacon_dialog,XtGrabNone);
1771 
1772     // Move focus to the Close button.  This appears to highlight the
1773     // button fine, but we're not able to hit the <Enter> key to
1774     // have that default function happen.  Note:  We _can_ hit the
1775     // <SPACE> key, and that activates the option.
1776 //        XmUpdateDisplay(smart_beacon_dialog);
1777     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
1778 
1779   }
1780   else
1781   {
1782     (void)XRaiseWindow(XtDisplay(smart_beacon_dialog), XtWindow(smart_beacon_dialog));
1783   }
1784 
1785   // Fill in the current values
1786   if (smart_beacon_dialog != NULL)
1787   {
1788 
1789     if(smart_beaconing)
1790     {
1791       XmToggleButtonSetState(smart_beacon_enable,TRUE,FALSE);
1792     }
1793     else
1794     {
1795       XmToggleButtonSetState(smart_beacon_enable,FALSE,FALSE);
1796     }
1797 
1798     xastir_snprintf(temp_string, sizeof(temp_string), "%d", sb_posit_fast);
1799     XmTextSetString(sb_hi_rate_data, temp_string);
1800 
1801     switch (english_units)
1802     {
1803       case 0: // Metric:  Convert from MPH to KPH for display
1804         xastir_snprintf(temp_string,
1805                         sizeof(temp_string),
1806                         "%d",
1807                         (int)((sb_high_speed_limit * 1.6094) + 0.5) );
1808         break;
1809       case 1: // English
1810       case 2: // Nautical
1811       default:    // No conversion necessary
1812         xastir_snprintf(temp_string,
1813                         sizeof(temp_string),
1814                         "%d",
1815                         sb_high_speed_limit);
1816         break;
1817     }
1818     XmTextSetString(sb_hi_mph_data, temp_string);
1819 
1820     xastir_snprintf(temp_string, sizeof(temp_string), "%d", sb_posit_slow);
1821     XmTextSetString(sb_lo_rate_data, temp_string);
1822 
1823     switch (english_units)
1824     {
1825       case 0: // Metric:  Convert from MPH to KPH for display
1826         xastir_snprintf(temp_string,
1827                         sizeof(temp_string),
1828                         "%d",
1829                         (int)((sb_low_speed_limit * 1.6094) + 0.5) );
1830         break;
1831       case 1: // English
1832       case 2: // Nautical
1833       default:    // No conversion necessary
1834         xastir_snprintf(temp_string,
1835                         sizeof(temp_string),
1836                         "%d",
1837                         sb_low_speed_limit);
1838         break;
1839     }
1840     XmTextSetString(sb_lo_mph_data, temp_string);
1841 
1842     xastir_snprintf(temp_string, sizeof(temp_string), "%d", sb_turn_min);
1843     XmTextSetString(sb_min_turn_data, temp_string);
1844 
1845     xastir_snprintf(temp_string, sizeof(temp_string), "%d", sb_turn_slope);
1846     XmTextSetString(sb_turn_slope_data, temp_string);
1847 
1848     xastir_snprintf(temp_string, sizeof(temp_string), "%d", sb_turn_time);
1849     XmTextSetString(sb_wait_time_data, temp_string);
1850   }
1851 }
1852 
1853 
1854 
1855 
1856 
1857 /////////////////////////////////////////////////////////////////////////
1858 
1859 
1860 
1861 
1862 
1863 // Causes the current set of internet-based maps to be snagged from
1864 // the 'net instead of from cache.  Once downloaded they get written
1865 // to the cache, overwriting possibly corrupted maps already in the
1866 // cache (why else would you invoke this function?).  This is a
1867 // method of getting rid of corrupted maps without having to wipe
1868 // out the entire cache.
1869 //
Re_Download_Maps_Now(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))1870 void Re_Download_Maps_Now(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
1871 {
1872 
1873 #ifdef USE_MAP_CACHE
1874   // Disable reads from the map cache
1875   map_cache_fetch_disable = 1;
1876 #endif
1877 
1878   // Show a busy cursor while the map is being downloaded
1879   busy_cursor(appshell);
1880 
1881   // Cause maps to be refreshed
1882   new_image(da);
1883 
1884 #ifdef USE_MAP_CACHE
1885   //Enable reads from the map cache
1886   map_cache_fetch_disable = 0;
1887 #endif
1888 }
1889 
1890 
1891 
1892 
1893 
1894 // Removes all files in the ~/.xastir/map_cache directory.  Does not
1895 // recurse down into subdirectories, but it shouldn't have to.
1896 //
Flush_Entire_Map_Queue(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))1897 void Flush_Entire_Map_Queue(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
1898 {
1899   struct dirent *dl = NULL;
1900   DIR *dm;
1901   char fullpath[MAX_FILENAME];
1902   char dir[MAX_FILENAME];
1903   struct stat nfile;
1904 
1905 
1906   get_user_base_dir("map_cache", dir, sizeof(dir));
1907 
1908   dm = opendir(dir);
1909   if (!dm)    // Couldn't open directory
1910   {
1911     fprintf(stderr,"Flush_Entire_Map_Queue: Couldn't open directory\n");
1912     return;
1913   }
1914 
1915   // Read the directory contents, delete each file found, skip
1916   // directories.
1917   //
1918   while ((dl = readdir(dm)))
1919   {
1920 
1921     //Construct the entire path/filename
1922     strcpy(fullpath, dir);
1923     fullpath[sizeof(fullpath)-1] = '\0';  // Terminate string
1924     strcat(fullpath, "/");
1925     fullpath[sizeof(fullpath)-1] = '\0';  // Terminate string
1926     strcat(fullpath, dl->d_name);
1927     fullpath[sizeof(fullpath)-1] = '\0';  // Terminate string
1928 
1929     if (stat(fullpath, &nfile) == 0)
1930     {
1931       if ((nfile.st_mode & S_IFMT) == S_IFREG)
1932       {
1933         // It's a regular file
1934 
1935         // Remove the file
1936         if (debug_level & 512)
1937         {
1938           fprintf(stderr,"Deleting file:  %s\n", fullpath);
1939         }
1940 
1941         unlink(fullpath);
1942       }
1943     }
1944   }
1945   (void)closedir(dm);
1946 }
1947 
1948 
1949 
1950 
1951 
1952 // Find the extents of every map we have.  This is the callback for
1953 // the "Re-Index Maps" button.
1954 //
1955 // If passed a NULL in the callback, we do a smart reindexing:  Only
1956 // reindex the files that are new or have changed.
1957 // If passed a "1" in the callback, we do a full reindexing:  Delete
1958 // the in-memory index and start indexing from scratch.
1959 //
Index_Maps_Now(Widget UNUSED (w),XtPointer clientData,XtPointer UNUSED (callData))1960 void Index_Maps_Now(Widget UNUSED(w), XtPointer clientData, XtPointer UNUSED(callData) )
1961 {
1962   int parameter = 0;  // Default:  Smart timestamp-checking indexing
1963 
1964 
1965   if (clientData != NULL)
1966   {
1967 
1968     parameter = atoi((char *)clientData);
1969 
1970     if (parameter != 1)     // Our only option
1971     {
1972       parameter = 0;
1973     }
1974   }
1975 
1976   // Update the list and write it to file.
1977   map_indexer(parameter);
1978 }
1979 
1980 
1981 
1982 
1983 
check_weather_symbol(void)1984 void check_weather_symbol(void)
1985 {
1986   // Check for weather station, if so, make sure symbol is proper type
1987   if ( (output_station_type == 4) || (output_station_type == 5) )
1988   {
1989     // Need one of these symbols if a weather station: /_   \_   /W   \W
1990     if ( ( (my_symbol != '_') && (my_symbol != 'W') )
1991          || ( (my_group != '\\') && (my_group != '/') ) )
1992     {
1993 
1994       // Force it to '/_'
1995       my_group = '/';
1996       my_symbol = '_';
1997 
1998       // Update my station data with the new symbol
1999       my_station_add(my_callsign,my_group,my_symbol,my_long,my_lat,my_phg,my_comment,(char)position_amb_chars);
2000       redraw_on_new_data=2;
2001 
2002       // Notify the operator that the symbol has been changed
2003       // "Weather Station", "Changed to WX symbol '/_', other option is '\\_'"
2004       popup_message_always( langcode("POPEM00030"), langcode("POPEM00031") );
2005     }
2006   }
2007 }
2008 
2009 
2010 
2011 
2012 
check_nws_weather_symbol(void)2013 void check_nws_weather_symbol(void)
2014 {
2015   if ( (my_symbol == 'W')
2016        && ( (my_group == '\\') || (my_group == '/') ) )
2017   {
2018 
2019     // Notify the operator that they're trying to be an NWS
2020     // weather station.
2021     popup_message_always( langcode("POPEM00030"), langcode("POPEM00032") );
2022   }
2023 }
2024 
2025 
2026 
2027 
2028 
Coordinate_calc_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))2029 void Coordinate_calc_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
2030 {
2031   Widget shell = (Widget) clientData;
2032   XtPopdown(shell);
2033   XtDestroyWidget(shell);
2034   coordinate_calc_dialog = (Widget)NULL;
2035 }
2036 
2037 
2038 
2039 
2040 
2041 // Clears out the dialog's input textFields
Coordinate_calc_clear_data(Widget UNUSED (widget),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))2042 void Coordinate_calc_clear_data(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
2043 {
2044   XmTextSetString(coordinate_calc_zone, "");
2045   XmTextSetString(coordinate_calc_latitude_easting, "");
2046   XmTextSetString(coordinate_calc_longitude_northing, "");
2047   XmTextSetString(coordinate_calc_result_text, "");
2048   XtSetSensitive(coordinate_calc_button_ok,FALSE);
2049 }
2050 
2051 
2052 
2053 
2054 
2055 // Computes all five coordinate representations for displaying in
2056 // the "result" textField.  Also fills in the global variables for
2057 // possible later use when passing results back to the calling
2058 // dialog.  We can't use the util.c:*_l2s routines for the
2059 // conversions here because the util.c routines use Xastir
2060 // coordinate system as inputs instead of normal lat/lon.  Had to
2061 // home-grow our solution here.
2062 //
2063 // Inputs:  full_zone, northing, easting, latitude, longitude.  UTM
2064 // inputs are output directly.  Latitude/longitude are converted to
2065 // the various different lat/lon representations.
2066 //
2067 // Outputs: global variables and "result" textField, full_zone.
2068 // full_zone should be a string of at least size 4.
2069 //
Coordinate_calc_output(char * full_zone,long northing,long easting,double latitude,double longitude)2070 void Coordinate_calc_output(char *full_zone, long northing,
2071                             long easting, double latitude, double longitude)
2072 {
2073   char temp_string[1024];
2074   int south = 0;
2075   int west = 0;
2076   double lat_min,lon_min,lat_sec,lon_sec;
2077   int lat_deg_int,lat_min_int;
2078   int lon_deg_int,lon_min_int;
2079   char maidenhead_grid[50];
2080   long temp;
2081   long xastir_lat;
2082   long xastir_lon;
2083   char MGRS_str[50];
2084   double double_easting, double_northing;
2085 
2086 
2087   // Latitude:  Switch to integer arithmetic to avoid
2088   // floating-point rounding errors.
2089   // We _do_ need to round it first though so that we don't lose
2090   // accuracy.
2091   xastir_snprintf(temp_string,sizeof(temp_string),"%8.0f",latitude * 100000.0);
2092   temp = atol(temp_string);
2093   if (temp < 0)
2094   {
2095     south++;
2096     temp = labs(temp);
2097   }
2098   lat_deg_int = (int)temp / 100000;
2099   lat_min = (temp % 100000) * 60.0 / 100000.0;
2100 
2101   // Again switch to integer arithmetic to avoid floating-point
2102   // rounding errors.
2103   temp = (long)(lat_min * 1000);
2104   lat_min_int = (int)(temp / 1000);
2105   lat_sec = (temp % 1000) * 60.0 / 1000.0;
2106 
2107 
2108   // Longitude:  Switch to integer arithmetic to avoid
2109   // floating-point rounding errors.
2110   // We _do_ need to round it first though so that we don't lose
2111   // accuracy.
2112   xastir_snprintf(temp_string,sizeof(temp_string),"%9.0f",longitude * 100000.0);
2113   temp = atol(temp_string);
2114   if (temp < 0)
2115   {
2116     west++;
2117     temp = labs(temp);
2118   }
2119   lon_deg_int = (int)temp / 100000;
2120   lon_min = (temp % 100000) * 60.0 / 100000.0;
2121 
2122   // Again switch to integer arithmetic to avoid floating-point
2123   // rounding errors.
2124   temp = (long)(lon_min * 1000);
2125   lon_min_int = (int)(temp / 1000);
2126   lon_sec = (temp % 1000) * 60.0 / 1000.0;
2127 
2128 
2129   double_easting = (double)easting;
2130   double_northing = (double)northing;
2131   convert_UTM_to_xastir(double_easting,
2132                         double_northing,
2133                         full_zone,
2134                         &xastir_lon,
2135                         &xastir_lat);
2136 
2137 //fprintf(stderr,"%s  %f  %f\t\t%lu %lu\n",
2138 //full_zone,
2139 //double_easting,
2140 //double_northing,
2141 //xastir_lat,
2142 //xastir_lon);
2143 
2144 
2145   // Compute MGRS coordinates.
2146   convert_xastir_to_MGRS_str(MGRS_str,
2147                              sizeof(MGRS_str),
2148                              xastir_lon,
2149                              xastir_lat,
2150                              1); // Format with leading spaces plus spaces between
2151   // easting and northing, so that it lines up with UTM
2152   // strings.
2153 
2154 
2155   // Compute Maidenhead Grid Locator.  Note that the sec_to_loc()
2156   // function expects lat/lon in Xastir coordinate system.
2157   xastir_snprintf(maidenhead_grid,
2158                   sizeof(maidenhead_grid),
2159                   "%s",
2160                   sec_to_loc( xastir_lon, xastir_lat ) );
2161 
2162 
2163   if (strlen(full_zone) == 1)
2164   {
2165     xastir_snprintf(temp_string,
2166                     sizeof(temp_string),
2167                     "  %s",
2168                     full_zone);
2169     memcpy(full_zone, temp_string, sizeof(&full_zone));
2170     full_zone[sizeof(full_zone)-1] = '\0';  // Terminate string
2171   }
2172   else if (strlen(full_zone) == 2)
2173   {
2174     xastir_snprintf(temp_string,
2175                     sizeof(temp_string),
2176                     " %s",
2177                     full_zone);
2178     memcpy(full_zone, temp_string, sizeof(&full_zone));
2179     full_zone[sizeof(full_zone)-1] = '\0';  // Terminate string
2180   }
2181 
2182 
2183   // Put the four different representations of the coordinate into
2184   // the "result" textField.
2185   xastir_snprintf(temp_string,
2186                   sizeof(temp_string),
2187                   "%s%8.5f%c   %9.5f%c\n%s%02d %06.3f%c  %03d %06.3f%c\n%s%02d %02d %04.1f%c %03d %02d %04.1f%c\n%s%3s  %07lu  %07lu\n%s%s\n%s%s",
2188                   langcode("COORD011"), // "Decimal Degrees:",
2189                   lat_deg_int+lat_min/60.0, (south) ? 'S':'N',
2190                   lon_deg_int+lon_min/60.0, (west) ?  'W':'E',
2191                   langcode("COORD012"), // "Degrees/Decimal Minutes:",
2192                   lat_deg_int, lat_min, (south) ? 'S':'N',
2193                   lon_deg_int, lon_min, (west) ?  'W':'E',
2194                   langcode("COORD013"), // "Degrees/Minutes/Dec. Seconds:",
2195                   lat_deg_int, lat_min_int, lat_sec, (south) ? 'S':'N',
2196                   lon_deg_int, lon_min_int, lon_sec, (west) ?  'W':'E',
2197                   langcode("COORD014"), // "Universal Transverse Mercator:",
2198                   full_zone, easting, northing,
2199                   langcode("COORD015"), // "Military Grid Reference System:",
2200                   MGRS_str,
2201                   langcode("COORD016"), // "Maidenhead Grid Locator:",
2202                   maidenhead_grid);
2203   XmTextSetString(coordinate_calc_result_text, temp_string);
2204 
2205   // Fill in the global dd mm.mmm values in case we wish to write
2206   // the result back to the calling dialog.
2207 
2208   // Changing to double to make "%02.0f" formatting work / get rid of compiler warning
2209   xastir_snprintf(coordinate_calc_lat_deg, sizeof(coordinate_calc_lat_deg),
2210                   "%02.0f", (double)lat_deg_int);
2211   xastir_snprintf(coordinate_calc_lat_min, sizeof(coordinate_calc_lat_min),
2212                   "%06.3f", lat_min);
2213   xastir_snprintf(coordinate_calc_lat_dir, sizeof(coordinate_calc_lat_dir),
2214                   "%c", (south) ? 'S':'N');
2215 
2216   // Changing to double to make "%03.0f" formatting work / get rid of compiler warning
2217   xastir_snprintf(coordinate_calc_lon_deg, sizeof(coordinate_calc_lon_deg),
2218                   "%03.0f", (double)lon_deg_int);
2219   xastir_snprintf(coordinate_calc_lon_min, sizeof(coordinate_calc_lon_min),
2220                   "%06.3f", lon_min);
2221   xastir_snprintf(coordinate_calc_lon_dir, sizeof(coordinate_calc_lon_dir),
2222                   "%c", (west) ? 'W':'E');
2223 }
2224 
2225 
2226 
2227 
2228 
2229 // Coordinate_calc_compute
2230 //
2231 // Inputs:  coordinate_calc_zone textField
2232 //          coordinate_calc_latitude_easting textField
2233 //          coordinate_calc_longitude_northing textField
2234 //
2235 // Output:  coordinate_calc_result_text only if the inputs are not
2236 // recognized, then it outputs help text to the textField.  If
2237 // inputs are good it calls Coordinate_calc_output() to format and
2238 // save/output the results.
2239 //
Coordinate_calc_compute(Widget UNUSED (widget),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))2240 void Coordinate_calc_compute(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
2241 {
2242   char *str_ptr;
2243   char zone_letter;
2244   int zone_number = 0;
2245   char full_zone[5];
2246   int i;
2247   int have_utm;
2248   int have_lat_lon;
2249   long easting = 0;
2250   long northing = 0;
2251   double double_easting;
2252   double double_northing;
2253   double latitude;
2254   double longitude;
2255   char temp_string[1024];
2256 
2257 
2258   // Goal is to suck in the format provided, figure out what
2259   // format it is, then convert to the four major formats we
2260   // support and put all four into the output window, each on a
2261   // different line.
2262 
2263   // These are the formats that I'd like to be able to
2264   // auto-recognize and support:
2265 
2266   // ddN          dddW            IMPLEMENTED
2267   // dd N         ddd W           IMPLEMENTED
2268   // -dd          -ddd            IMPLEMENTED
2269 
2270   // dd.ddddN     ddd.ddddW       IMPLEMENTED
2271   // dd.dddd N    ddd.dddd W      IMPLEMENTED
2272   // -dd.dddd     -ddd.dddd       IMPLEMENTED
2273 
2274   // dd mmN       ddd mmW         IMPLEMENTED
2275   // dd mm N      ddd mm W        IMPLEMENTED
2276   // -dd mm       -ddd mm         IMPLEMENTED
2277 
2278   // dd mm.mmmN   ddd mm.mmmW     IMPLEMENTED
2279   // dd mm.mmm N  ddd mm.mmm W    IMPLEMENTED
2280   // -dd mm.mmm   -ddd mm.mmm     IMPLEMENTED
2281 
2282   // dd mm ssN    ddd mm ssW      IMPLEMENTED
2283   // dd mm ss N   ddd mm ss W     IMPLEMENTED
2284   // -dd mm ss    -ddd mm ss      IMPLEMENTED
2285 
2286   // dd mm ss.sN  ddd mm ss.sW    IMPLEMENTED
2287   // dd mm ss.s N ddd mm ss.s W   IMPLEMENTED
2288   // -dd mm ss.s  -ddd mm ss.s    IMPLEMENTED
2289 
2290   // 10T  0123456     1234567     IMPLEMENTED
2291   // 10T   123456     1234567     IMPLEMENTED
2292   // 10T  012 3456    123 4567
2293   // 10T   12 3456    123 4567
2294 
2295   // Once the four major formats are created and written to the
2296   // output test widget, the dd mm.mmmN/ddd mm.mmmW formatted
2297   // output should also be saved for later pasting into the
2298   // calling dialog's input fields.  DONE!
2299   //
2300   // Must also make sure that the calling dialog is still up and
2301   // active before we try to write to it's widgets.  DONE!
2302 
2303 
2304   // Check for something in the zone field that looks like a valid
2305   // UTM zone.
2306   str_ptr = XmTextGetString(coordinate_calc_zone);
2307   i = strlen(str_ptr);
2308   have_utm = 1;   // Wishful thinking.  We'll zero it later if not.
2309   if ( (i >= 1) && (i <= 3) )
2310   {
2311     // String is the correct length.  Can have just A/B/Y/Z, or
2312     // else one or two digits plus one letter.
2313     int j;
2314 
2315     for (j = 0; j < (i-1); j++)
2316     {
2317       if ( (str_ptr[j] < '0') && (str_ptr[j] > '9') )
2318       {
2319         // Not UTM, need either one or two digits first if
2320         // we have 2 or 3 chars.
2321         have_utm = 0;
2322       }
2323     }
2324     if ( ( (str_ptr[i-1] < 'A') || (str_ptr[i-1] > 'Z') )
2325          && ( (str_ptr[i-1] < 'a') || (str_ptr[i-1] > 'z') ) )
2326     {
2327       // Not UTM, zone character isn't correct
2328       have_utm = 0;
2329     }
2330   }
2331   else    // Not a valid UTM zone, wrong length.
2332   {
2333     have_utm = 0;
2334   }
2335 
2336   // If we've made it to this point and have_utm == 1, then zone looks
2337   // like a UTM zone.
2338   if (have_utm)
2339   {
2340     zone_letter = toupper(str_ptr[i-1]);
2341     zone_number = atoi(str_ptr);
2342     //fprintf(stderr,"Zone Number: %d,  Zone Letter: %c\n", zone_number, zone_letter);
2343     // Save it away for later use
2344     if (zone_number == 0)   // We're in a UPS area
2345     {
2346       xastir_snprintf(full_zone,
2347                       sizeof(full_zone),
2348                       "  %c",
2349                       zone_letter);
2350     }
2351     else    // UTM area
2352     {
2353       xastir_snprintf(full_zone,
2354                       sizeof(full_zone),
2355                       "%02d%c",
2356                       zone_number,
2357                       zone_letter);
2358     }
2359     have_lat_lon = 0;
2360   }
2361   else
2362   {
2363     //fprintf(stderr,"Bad zone, not a UTM coordinate\n");
2364     // Skip zone widget for lat/lon, it's not used.
2365     have_lat_lon = 1;   // Wishful thinking.  We'll zero it later if not.
2366   }
2367   // We're done with that variable.  Free the space.
2368   XtFree(str_ptr);
2369 
2370 
2371   str_ptr = XmTextGetString(coordinate_calc_latitude_easting);
2372   i = strlen(str_ptr);
2373   // Check for exactly six or seven chars.  If seven, first one must
2374   // be a zero (Not true!  UPS coordinates have digits there!).
2375   if ( have_utm && (i != 6) && (i != 7) )
2376   {
2377     have_utm = 0;
2378     //fprintf(stderr,"Bad Easting value: Not 6 or 7 chars\n");
2379   }
2380 //    if ( have_utm && (i == 7) && (str_ptr[0] != '0') ) {
2381 //        have_utm = 0;
2382 //        //fprintf(stderr,"Bad Easting value: 7 chars but first one not 0\n");
2383 //    }
2384   if (have_utm)
2385   {
2386     int j;
2387 
2388     // Might be good to get rid of spaces at this point as we think
2389     // it's a UTM number.  Might have to put it in our own string
2390     // first though to do that.
2391 
2392     for (j = 0; j < i; j++)
2393     {
2394       if ( (str_ptr[j] < '0') || (str_ptr[j] > '9') )
2395       {
2396         // Not UTM, found a non-number
2397         have_utm = 0;
2398       }
2399     }
2400 
2401     if (have_utm)   // If we still think it's a valid UTM number
2402     {
2403       easting = atol(str_ptr);
2404       //fprintf(stderr,"Easting: %lu\n",easting);
2405     }
2406     else
2407     {
2408       //fprintf(stderr,"Bad Easting value\n");
2409     }
2410   }
2411   else if (have_lat_lon)
2412   {
2413     // Process the string to see if it's a valid latitude value.
2414     // Convert it into a double if so and store it in
2415     // "latitude".
2416     int j, substring;
2417     int south = 0;
2418     int temp[10];  // indexes to substrings
2419     char *ptr;
2420     char temp_string[30];
2421     int piece;
2422 
2423     // Copy the string so we can change it.
2424     xastir_snprintf(temp_string,sizeof(temp_string),"%s",str_ptr);
2425 
2426     for (j = 0; j < i; j++)
2427     {
2428       temp_string[j] = toupper(temp_string[j]);
2429     }
2430 
2431     // Search for 'N' or 'S'.
2432     ptr = rindex(temp_string, 'N');
2433     if (ptr != NULL)    // Found an 'N'
2434     {
2435       *ptr = ' ';     // Convert it to a space
2436       //fprintf(stderr,"Found an 'N', converted to %s\n", temp_string);
2437     }
2438     ptr = rindex(temp_string, 'S');
2439     if (ptr != NULL)    // Found an 'S'
2440     {
2441       *ptr = ' ';     // Convert it to a space
2442       south++;
2443       //fprintf(stderr,"Found an 'S', converted to %s\n", temp_string);
2444     }
2445     ptr = rindex(temp_string, '-');
2446     if (ptr != NULL)    // Found an '-'
2447     {
2448       *ptr = ' ';     // Convert it to a space
2449       south++;
2450       //fprintf(stderr,"Found an '-', converted to %s\n", temp_string);
2451     }
2452 
2453     // Tokenize the string
2454 
2455     // Find the space characters
2456     temp[0] = 0;        // First index is to start of entire string
2457     substring = 1;
2458     for (j = 1; j < i; j++)
2459     {
2460       if (temp_string[j] == ' ')          // Found a space
2461       {
2462         temp_string[j] = '\0';          // Terminate the substring
2463         if ( (j + 1) < i)               // If not at the end
2464         {
2465           temp[substring++] = j + 1;  // Save an index to the new substring
2466           //fprintf(stderr,"%s",&temp_string[j+1]);
2467         }
2468       }
2469     }
2470 
2471     // temp[] array now contains indexes into all of the
2472     // substrings.  Some may contain empty strings.
2473 
2474     //fprintf(stderr,"Substrings: %d\n", substring);
2475     //fprintf(stderr,"temp_string: %s\n",temp_string);
2476 
2477 
2478     //for (j = 0; j < substring; j++) {
2479     //    if (strlen(&temp_string[temp[j]]) > 0) {
2480     //        fprintf(stderr,"%s\n", &temp_string[temp[j]]);
2481     //    }
2482     //}
2483 
2484     piece = 0;
2485     have_lat_lon = 0;
2486 
2487     for (j = 0; j < substring; j++)
2488     {
2489       if (strlen(&temp_string[temp[j]]) > 0)
2490       {
2491         double kk;
2492 
2493         piece++;    // Found the next piece
2494         kk = atof(&temp_string[temp[j]]);
2495 
2496         switch (piece)
2497         {
2498           case (1) :  // Degrees
2499             latitude = kk;
2500             have_lat_lon = 1;
2501             break;
2502           case (2) :  // Minutes
2503             if ( (kk < 0.0) || (kk >= 60.0) )
2504             {
2505               fprintf(stderr,"Warning:  Bad latitude minutes value\n");
2506               // Set variables so that we'll get error output.
2507               have_lat_lon = 0;
2508               have_utm = 0;
2509             }
2510             else
2511             {
2512               latitude = latitude + ( kk / 60.0 );
2513             }
2514             break;
2515           case (3) :  // Seconds
2516             if ( (kk < 0.0) || (kk >= 60.0))
2517             {
2518               fprintf(stderr,"Warning:  Bad latitude seconds value\n");
2519               // Set variables so that we'll get error output.
2520               have_lat_lon = 0;
2521               have_utm = 0;
2522             }
2523             else
2524             {
2525               latitude = latitude + ( kk / 3600.0 );
2526             }
2527             break;
2528           default :
2529             break;
2530         }
2531       }
2532     }
2533 
2534     if (south)
2535     {
2536       latitude = -latitude;
2537     }
2538     //fprintf(stderr,"%f\n", latitude);
2539 
2540     // Test for valid values of latitude
2541     if ( have_lat_lon && ((latitude < -90.0) || (latitude > 90.0)) )
2542     {
2543       have_lat_lon = 0;
2544     }
2545     if (strlen(str_ptr) == 0)
2546     {
2547       have_lat_lon = 0;
2548     }
2549   }
2550   // We're done with that variable.  Free the space.
2551   XtFree(str_ptr);
2552 
2553 
2554   str_ptr = XmTextGetString(coordinate_calc_longitude_northing);
2555   i = strlen(str_ptr);
2556   // Check for exactly seven chars.
2557   if (have_utm && (i != 7) )
2558   {
2559     have_utm = 0;
2560     //fprintf(stderr,"Bad Northing value: Not 7 chars\n");
2561   }
2562   if (have_utm)
2563   {
2564     int j;
2565 
2566     // Might be good to get rid of spaces at this point as we think
2567     // it's a UTM number.  Might have to put it in our own string
2568     // first though to do that.
2569 
2570     for (j = 0; j< i; j++)
2571     {
2572       if ( (str_ptr[j] < '0') || (str_ptr[j] > '9') )
2573       {
2574         // Not UTM, found a non-number
2575         have_utm = 0;
2576       }
2577     }
2578     if (have_utm)   // If we still think it's a valid UTM number
2579     {
2580       northing = atol(str_ptr);
2581       //fprintf(stderr,"Northing: %lu\n",northing);
2582     }
2583     else
2584     {
2585       //fprintf(stderr,"Bad Northing value\n");
2586     }
2587   }
2588   else if (have_lat_lon)
2589   {
2590     // Process the string to see if it's a valid longitude
2591     // value.  Convert it into a double if so and store it in
2592     // "longitude".
2593     int j, substring;
2594     int west = 0;
2595     int temp[10];  // indexes to substrings
2596     char *ptr;
2597     char temp_string[30];
2598     int piece;
2599 
2600     // Copy the string so we can change it.
2601     xastir_snprintf(temp_string,sizeof(temp_string),"%s",str_ptr);
2602 
2603     for (j = 0; j < i; j++)
2604     {
2605       temp_string[j] = toupper(temp_string[j]);
2606     }
2607 
2608     // Search for 'W' or 'E'.
2609     ptr = rindex(temp_string, 'W');
2610     if (ptr != NULL)    // Found an 'W'
2611     {
2612       *ptr = ' ';     // Convert it to a space
2613       west++;
2614       //fprintf(stderr,"Found an 'W', converted to %s\n", temp_string);
2615     }
2616     ptr = rindex(temp_string, 'E');
2617     if (ptr != NULL)    // Found an 'E'
2618     {
2619       *ptr = ' ';     // Convert it to a space
2620       //fprintf(stderr,"Found an 'E', converted to %s\n", temp_string);
2621     }
2622     ptr = index(temp_string, '-');
2623     if (ptr != NULL)    // Found an '-'
2624     {
2625       *ptr = ' ';     // Convert it to a space
2626       west++;
2627       //fprintf(stderr,"Found an '-', converted to %s\n", temp_string);
2628     }
2629 
2630     // Tokenize the string
2631 
2632     // Find the space characters
2633     temp[0] = 0;        // First index is to start of entire string
2634     substring = 1;
2635     for (j = 1; j < i; j++)
2636     {
2637       if (temp_string[j] == ' ')          // Found a space
2638       {
2639         temp_string[j] = '\0';          // Terminate the substring
2640         if ( (j + 1) < i)               // If not at the end
2641         {
2642           temp[substring++] = j + 1;  // Save an index to the new substring
2643           //fprintf(stderr,"%s",&temp_string[j+1]);
2644         }
2645       }
2646     }
2647 
2648     // temp[] array now contains indexes into all of the
2649     // substrings.  Some may contain empty strings.
2650 
2651     //fprintf(stderr,"Substrings: %d\n", substring);
2652     //fprintf(stderr,"temp_string: %s\n",temp_string);
2653 
2654 
2655     //for (j = 0; j < substring; j++) {
2656     //    if (strlen(&temp_string[temp[j]]) > 0) {
2657     //        fprintf(stderr,"%s\n", &temp_string[temp[j]]);
2658     //    }
2659     //}
2660     piece = 0;
2661     have_lat_lon = 0;
2662 
2663     for (j = 0; j < substring; j++)
2664     {
2665       if (strlen(&temp_string[temp[j]]) > 0)
2666       {
2667         double kk;
2668 
2669         piece++;    // Found the next piece
2670         kk = atof(&temp_string[temp[j]]);
2671 
2672         switch (piece)
2673         {
2674           case (1) :  // Degrees
2675             longitude = kk;
2676             have_lat_lon = 1;
2677             break;
2678           case (2) :  // Minutes
2679             if ( (kk < 0.0) || (kk >= 60.0) )
2680             {
2681               fprintf(stderr,"Warning:  Bad longitude minutes value\n");
2682               // Set variables so that we'll get error output.
2683               have_lat_lon = 0;
2684               have_utm = 0;
2685             }
2686             else
2687             {
2688               longitude = longitude + ( kk / 60.0 );
2689             }
2690             break;
2691           case (3) :  // Seconds
2692             if ( (kk < 0.0) || (kk >= 60.0) )
2693             {
2694               fprintf(stderr,"Warning:  Bad longitude seconds value\n");
2695               // Set variables so that we'll get error output.
2696               have_lat_lon = 0;
2697               have_utm = 0;
2698             }
2699             else
2700             {
2701               longitude = longitude + ( kk / 3600.0 );
2702             }
2703             break;
2704           default :
2705             break;
2706         }
2707       }
2708     }
2709 
2710     if (west)
2711     {
2712       longitude = -longitude;
2713     }
2714     //fprintf(stderr,"%f\n", longitude);
2715 
2716 
2717     // Test for valid values of longitude
2718     if (have_lat_lon && ((longitude < -180.0) || (longitude > 180.0)) )
2719     {
2720       have_lat_lon = 0;
2721     }
2722     if (strlen(str_ptr) == 0)
2723     {
2724       have_lat_lon = 0;
2725     }
2726   }
2727   // We're done with that variable.  Free the space.
2728   XtFree(str_ptr);
2729 
2730   // If we get to this point and have_utm == 1, then we're fairly sure
2731   // we have a good value and can convert it to the other formats for
2732   // display.
2733   if (have_utm)
2734   {
2735 //fprintf(stderr,"Processing 'good' UTM values\n");
2736     // Process UTM values
2737     utm_ups_to_ll(E_WGS_84,
2738                   (double)northing,
2739                   (double)easting,
2740                   full_zone,
2741                   &latitude,
2742                   &longitude);
2743     if (debug_level & 1)
2744     {
2745       fprintf(stderr,"Latitude: %f, Longitude: %f\n",latitude,longitude);
2746     }
2747     Coordinate_calc_output(full_zone,
2748                            northing,
2749                            easting,
2750                            latitude,
2751                            longitude);
2752     XtSetSensitive(coordinate_calc_button_ok,TRUE);
2753   }
2754   else if (have_lat_lon)
2755   {
2756     // Process lat/lon values
2757     double_northing = (double)northing;
2758     double_easting = (double)easting;
2759     ll_to_utm_ups(E_WGS_84,
2760                   (double)latitude,
2761                   (double)longitude,
2762                   &double_northing,
2763                   &double_easting,
2764                   full_zone,
2765                   sizeof(full_zone));
2766     if (debug_level & 1)
2767     {
2768       fprintf(stderr,"Zone: %s, Easting: %f, Northing: %f\n", full_zone, double_easting, double_northing);
2769     }
2770     // Round the UTM values as we convert them to longs
2771     xastir_snprintf(temp_string,sizeof(temp_string),"%7.0f",double_northing);
2772     northing = atof(temp_string);
2773     xastir_snprintf(temp_string,sizeof(temp_string),"%7.0f",double_easting);
2774     easting  = atof(temp_string);
2775     Coordinate_calc_output(full_zone,
2776                            (long)northing,
2777                            (long)easting,
2778                            latitude,
2779                            longitude);
2780     XtSetSensitive(coordinate_calc_button_ok,TRUE);
2781   }
2782   else    // Dump out some helpful text
2783   {
2784     xastir_snprintf(temp_string,
2785                     sizeof(temp_string),
2786                     "%s\n%s\n%s\n%s",
2787 //            " **       Sorry, your input was not recognized!        **",
2788                     langcode("COORD017"),
2789 //            " **   Please use one of the following input formats:   **",
2790                     langcode("COORD018"),
2791                     " ** 47.99999N  121.99999W,   47 59.999N   121 59.999W  **",
2792                     " ** 10T  0574599  5316887,   47 59 59.9N  121 59 59.9W **");
2793     XmTextSetString(coordinate_calc_result_text, temp_string);
2794     XtSetSensitive(coordinate_calc_button_ok,FALSE);
2795   }
2796 }
2797 
2798 
2799 
2800 
2801 
2802 // Input:  Values from the coordinate_calc_array struct.
2803 //
2804 // Output:  Writes data back to the calling dialog's input fields if
2805 // the calling dialog still exists at this point.
2806 //
2807 // Make sure that if an error occurs during computation we don't
2808 // write a bad value back to the calling widget.  DONE.
2809 //
Coordinate_calc_change_data(Widget widget,XtPointer clientData,XtPointer callData)2810 void Coordinate_calc_change_data(Widget widget, XtPointer clientData, XtPointer callData)
2811 {
2812 
2813   // Write output directly to the XmTextStrings pointed to by our array
2814   if ( (coordinate_calc_array.calling_dialog != NULL)
2815        && (coordinate_calc_array.input_lat_deg != NULL) )
2816   {
2817     XmTextSetString(coordinate_calc_array.input_lat_deg, coordinate_calc_lat_deg);
2818   }
2819   //fprintf(stderr,"%s\n",coordinate_calc_lat_deg);
2820 
2821   if ( (coordinate_calc_array.calling_dialog != NULL)
2822        && (coordinate_calc_array.input_lat_min != NULL) )
2823   {
2824     XmTextSetString(coordinate_calc_array.input_lat_min, coordinate_calc_lat_min);
2825   }
2826   //fprintf(stderr,"%s\n",coordinate_calc_lat_min);
2827 
2828   if ( (coordinate_calc_array.calling_dialog != NULL)
2829        && (coordinate_calc_array.input_lat_dir != NULL) )
2830   {
2831     XmTextSetString(coordinate_calc_array.input_lat_dir, coordinate_calc_lat_dir);
2832   }
2833   //fprintf(stderr,"%s\n",coordinate_calc_lat_dir);
2834 
2835   if ( (coordinate_calc_array.calling_dialog != NULL)
2836        && (coordinate_calc_array.input_lon_deg != NULL) )
2837   {
2838     XmTextSetString(coordinate_calc_array.input_lon_deg, coordinate_calc_lon_deg);
2839   }
2840   //fprintf(stderr,"%s\n",coordinate_calc_lon_deg);
2841 
2842   if ( (coordinate_calc_array.calling_dialog != NULL)
2843        && (coordinate_calc_array.input_lon_min != NULL) )
2844   {
2845     XmTextSetString(coordinate_calc_array.input_lon_min, coordinate_calc_lon_min);
2846   }
2847   //fprintf(stderr,"%s\n",coordinate_calc_lon_min);
2848 
2849   if ( (coordinate_calc_array.calling_dialog != NULL)
2850        && (coordinate_calc_array.input_lon_dir != NULL) )
2851   {
2852     XmTextSetString(coordinate_calc_array.input_lon_dir, coordinate_calc_lon_dir);
2853   }
2854   //fprintf(stderr,"%s\n",coordinate_calc_lon_dir);
2855 
2856   Coordinate_calc_destroy_shell(widget,clientData,callData);
2857 }
2858 
2859 
2860 
2861 
2862 
2863 // Coordinate Calculator
2864 //
2865 // Change the title based on what dialog is calling us?
2866 //
2867 // We want all four possible coordinate formats displayed
2868 // simultaneously.  DONE.
2869 //
2870 // Hitting enter or "Calculate" will cause all of the fields to be
2871 // updated.  DONE (for Calculate button).
2872 //
2873 // The fields should be filled in when this is first called.
2874 // When done, this routine will pass back values via a static array
2875 // of Widget pointers to the calling dialog's fields.  DONE.
2876 //
2877 // We could grey-out the OK button until we have a successful
2878 // calculation, and when the "Clear" button is pressed.  This
2879 // would make sure that an invalid location doesn't
2880 // get written to the calling dialog.  Would have to have a
2881 // successful conversion before we could write the value back.
2882 //
Coordinate_calc(Widget w,XtPointer clientData,XtPointer callData)2883 void Coordinate_calc(Widget w, XtPointer clientData, XtPointer callData)
2884 {
2885   static Widget  pane, scrollwindow, form, label1, label4,
2886          button_clear, button_calculate, button_cancel;
2887 //  static Widget label2, label3, label5, label6;
2888   Atom delw;
2889   Arg args[50];                    // Arg List
2890   register unsigned int n = 0;    // Arg Count
2891   char temp_string[50];
2892 
2893   // Destroy the dialog if it exists.  This is to make sure the
2894   // title is correct based on the last dialog that called us.
2895   if (coordinate_calc_dialog)
2896   {
2897     Coordinate_calc_destroy_shell( w, coordinate_calc_dialog, callData);
2898   }
2899 
2900   if (!coordinate_calc_dialog)
2901   {
2902 
2903     // We change the title based on who's calling us.
2904     // clientData supplies the string we use for the label, and
2905     // is sent to us by the calling dialog.
2906     xastir_snprintf( temp_string, sizeof(temp_string), "%s %s", (char *)clientData, langcode("COORD001") );
2907 
2908     coordinate_calc_dialog = XtVaCreatePopupShell(temp_string,
2909                              xmDialogShellWidgetClass, appshell,
2910                              XmNdeleteResponse,XmDESTROY,
2911                              XmNdefaultPosition, FALSE,
2912                              NULL);
2913 
2914     pane = XtVaCreateWidget("Coordinate_calc pane",
2915                             xmPanedWindowWidgetClass,
2916                             coordinate_calc_dialog,
2917                             MY_FOREGROUND_COLOR,
2918                             MY_BACKGROUND_COLOR,
2919                             NULL);
2920 
2921     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
2922                                            xmScrolledWindowWidgetClass,
2923                                            pane,
2924                                            XmNscrollingPolicy, XmAUTOMATIC,
2925                                            NULL);
2926 
2927     form =  XtVaCreateWidget("Coordinate_calc form",
2928                              xmFormWidgetClass,
2929                              scrollwindow,
2930                              XmNfractionBase, 4,
2931                              XmNautoUnmanage, FALSE,
2932                              XmNshadowThickness, 1,
2933                              MY_FOREGROUND_COLOR,
2934                              MY_BACKGROUND_COLOR,
2935                              NULL);
2936 
2937     label1 = XtVaCreateManagedWidget(langcode("COORD005"),
2938                                      xmLabelWidgetClass,
2939                                      form,
2940                                      XmNtopAttachment, XmATTACH_FORM,
2941                                      XmNtopOffset, 5,
2942                                      XmNbottomAttachment, XmATTACH_NONE,
2943                                      XmNleftAttachment, XmATTACH_FORM,
2944                                      XmNleftOffset, 10,
2945                                      XmNrightAttachment, XmATTACH_NONE,
2946                                      MY_FOREGROUND_COLOR,
2947                                      MY_BACKGROUND_COLOR,
2948                                      XmNfontList, fontlist1,
2949                                      NULL);
2950 
2951     //label2
2952     XtVaCreateManagedWidget(langcode("COORD006"),
2953                             xmLabelWidgetClass,
2954                             form,
2955                             XmNtopAttachment, XmATTACH_FORM,
2956                             XmNtopOffset, 5,
2957                             XmNbottomAttachment, XmATTACH_NONE,
2958                             XmNleftAttachment, XmATTACH_FORM,
2959                             XmNleftOffset, 70,
2960                             XmNrightAttachment, XmATTACH_NONE,
2961                             MY_FOREGROUND_COLOR,
2962                             MY_BACKGROUND_COLOR,
2963                             XmNfontList, fontlist1,
2964                             NULL);
2965 
2966     //label3
2967     XtVaCreateManagedWidget(langcode("COORD007"),
2968                             xmLabelWidgetClass,
2969                             form,
2970                             XmNtopAttachment, XmATTACH_FORM,
2971                             XmNtopOffset, 5,
2972                             XmNbottomAttachment, XmATTACH_NONE,
2973                             XmNleftAttachment, XmATTACH_FORM,
2974                             XmNleftOffset, 200,
2975                             XmNrightAttachment, XmATTACH_NONE,
2976                             MY_FOREGROUND_COLOR,
2977                             MY_BACKGROUND_COLOR,
2978                             XmNfontList, fontlist1,
2979                             NULL);
2980 
2981     label4 = XtVaCreateManagedWidget(langcode("COORD008"),
2982                                      xmLabelWidgetClass,
2983                                      form,
2984                                      XmNtopAttachment, XmATTACH_WIDGET,
2985                                      XmNtopWidget, label1,
2986                                      XmNtopOffset, 2,
2987                                      XmNbottomAttachment, XmATTACH_NONE,
2988                                      XmNleftAttachment, XmATTACH_FORM,
2989                                      XmNleftOffset, 10,
2990                                      XmNrightAttachment, XmATTACH_NONE,
2991                                      MY_FOREGROUND_COLOR,
2992                                      MY_BACKGROUND_COLOR,
2993                                      XmNfontList, fontlist1,
2994                                      NULL);
2995 
2996     //label5
2997     XtVaCreateManagedWidget(langcode("COORD009"),
2998                             xmLabelWidgetClass,
2999                             form,
3000                             XmNtopAttachment, XmATTACH_WIDGET,
3001                             XmNtopWidget, label1,
3002                             XmNtopOffset, 2,
3003                             XmNbottomAttachment, XmATTACH_NONE,
3004                             XmNleftAttachment, XmATTACH_FORM,
3005                             XmNleftOffset, 70,
3006                             XmNrightAttachment, XmATTACH_NONE,
3007                             MY_FOREGROUND_COLOR,
3008                             MY_BACKGROUND_COLOR,
3009                             XmNfontList, fontlist1,
3010                             NULL);
3011 
3012     //label6
3013     XtVaCreateManagedWidget(langcode("COORD010"),
3014                             xmLabelWidgetClass,
3015                             form,
3016                             XmNtopAttachment, XmATTACH_WIDGET,
3017                             XmNtopWidget, label1,
3018                             XmNtopOffset, 2,
3019                             XmNbottomAttachment, XmATTACH_NONE,
3020                             XmNleftAttachment, XmATTACH_FORM,
3021                             XmNleftOffset, 200,
3022                             XmNrightAttachment, XmATTACH_NONE,
3023                             MY_FOREGROUND_COLOR,
3024                             MY_BACKGROUND_COLOR,
3025                             XmNfontList, fontlist1,
3026                             NULL);
3027 
3028 
3029     /*set args for color */
3030     n=0;
3031     XtSetArg(args[n], XmNforeground, MY_FG_COLOR);
3032     n++;
3033     XtSetArg(args[n], XmNbackground, MY_BG_COLOR);
3034     n++;
3035 
3036 
3037     coordinate_calc_zone = XtVaCreateManagedWidget("Coordinate_calc zone",
3038                            xmTextWidgetClass,
3039                            form,
3040                            XmNeditable,   TRUE,
3041                            XmNcursorPositionVisible, TRUE,
3042                            XmNsensitive, TRUE,
3043                            XmNshadowThickness,    1,
3044                            XmNcolumns, 4,
3045                            XmNwidth, ((5*7)+2),
3046                            XmNmaxLength, 3,
3047                            XmNbackground, colors[0x0f],
3048                            XmNtopOffset, 5,
3049                            XmNtopAttachment,XmATTACH_WIDGET,
3050                            XmNtopWidget, label4,
3051                            XmNbottomAttachment,XmATTACH_NONE,
3052                            XmNleftAttachment, XmATTACH_FORM,
3053                            XmNleftOffset, 5,
3054                            XmNrightAttachment,XmATTACH_NONE,
3055                            XmNnavigationType, XmTAB_GROUP,
3056                            XmNfontList, fontlist1,
3057                            NULL);
3058 
3059     coordinate_calc_latitude_easting = XtVaCreateManagedWidget("Coordinate_calc lat",
3060                                        xmTextWidgetClass,
3061                                        form,
3062                                        XmNeditable,   TRUE,
3063                                        XmNcursorPositionVisible, TRUE,
3064                                        XmNsensitive, TRUE,
3065                                        XmNshadowThickness,    1,
3066                                        XmNcolumns, 13,
3067                                        XmNwidth, ((13*7)+2),
3068                                        XmNmaxLength, 12,
3069                                        XmNbackground, colors[0x0f],
3070                                        XmNtopOffset, 5,
3071                                        XmNtopAttachment,XmATTACH_WIDGET,
3072                                        XmNtopWidget, label4,
3073                                        XmNbottomAttachment,XmATTACH_NONE,
3074                                        XmNleftAttachment, XmATTACH_FORM,
3075                                        XmNleftOffset, 65,
3076                                        XmNrightAttachment,XmATTACH_NONE,
3077                                        XmNnavigationType, XmTAB_GROUP,
3078                                        XmNfontList, fontlist1,
3079                                        NULL);
3080 
3081     coordinate_calc_longitude_northing = XtVaCreateManagedWidget("Coordinate_calc lon",
3082                                          xmTextWidgetClass,
3083                                          form,
3084                                          XmNeditable,   TRUE,
3085                                          XmNcursorPositionVisible, TRUE,
3086                                          XmNsensitive, TRUE,
3087                                          XmNshadowThickness,    1,
3088                                          XmNcolumns, 13,
3089                                          XmNwidth, ((14*7)+2),
3090                                          XmNmaxLength, 13,
3091                                          XmNbackground, colors[0x0f],
3092                                          XmNtopOffset, 5,
3093                                          XmNtopAttachment,XmATTACH_WIDGET,
3094                                          XmNtopWidget, label4,
3095                                          XmNbottomAttachment,XmATTACH_NONE,
3096                                          XmNleftAttachment, XmATTACH_FORM,
3097                                          XmNleftOffset, 195,
3098                                          XmNrightAttachment,XmATTACH_NONE,
3099                                          XmNnavigationType, XmTAB_GROUP,
3100                                          XmNfontList, fontlist1,
3101                                          NULL);
3102 
3103 //        xastir_snprintf(temp_string, sizeof(temp_string), "%d", temp);
3104 //        XmTextSetString(coordinate_calc_text, temp_string);
3105 
3106     coordinate_calc_result_text = NULL;
3107     coordinate_calc_result_text = XtVaCreateManagedWidget("Coordinate_calc results",
3108                                   xmTextWidgetClass,
3109                                   form,
3110                                   XmNrows, 6,
3111                                   XmNcolumns, 58,
3112                                   XmNeditable, FALSE,
3113                                   XmNtraversalOn, FALSE,
3114                                   XmNeditMode, XmMULTI_LINE_EDIT,
3115                                   XmNwordWrap, TRUE,
3116 //                XmNscrollHorizontal, FALSE,
3117                                   XmNcursorPositionVisible, FALSE,
3118                                   XmNautoShowCursorPosition, True,
3119                                   XmNtopAttachment, XmATTACH_WIDGET,
3120                                   XmNtopWidget, coordinate_calc_zone,
3121                                   XmNtopOffset, 5,
3122                                   XmNbottomAttachment, XmATTACH_NONE,
3123                                   XmNleftAttachment, XmATTACH_FORM,
3124                                   XmNleftOffset, 5,
3125                                   XmNrightAttachment, XmATTACH_FORM,
3126                                   XmNrightOffset, 5,
3127                                   MY_FOREGROUND_COLOR,
3128                                   MY_BACKGROUND_COLOR,
3129                                   XmNfontList, fontlist1,
3130                                   NULL);
3131 
3132     button_clear = XtVaCreateManagedWidget(langcode("COORD004"),
3133                                            xmPushButtonGadgetClass,
3134                                            form,
3135                                            XmNtopAttachment, XmATTACH_WIDGET,
3136                                            XmNtopWidget, coordinate_calc_result_text,
3137                                            XmNtopOffset, 5,
3138                                            XmNbottomAttachment, XmATTACH_FORM,
3139                                            XmNbottomOffset, 5,
3140                                            XmNleftAttachment, XmATTACH_POSITION,
3141                                            XmNleftPosition, 0,
3142                                            XmNrightAttachment, XmATTACH_POSITION,
3143                                            XmNrightPosition, 1,
3144                                            XmNnavigationType, XmTAB_GROUP,
3145                                            MY_FOREGROUND_COLOR,
3146                                            MY_BACKGROUND_COLOR,
3147                                            XmNfontList, fontlist1,
3148                                            NULL);
3149     XtAddCallback(button_clear, XmNactivateCallback, Coordinate_calc_clear_data, coordinate_calc_dialog);
3150 
3151     button_calculate = XtVaCreateManagedWidget(langcode("COORD003"),
3152                        xmPushButtonGadgetClass,
3153                        form,
3154                        XmNtopAttachment, XmATTACH_WIDGET,
3155                        XmNtopWidget, coordinate_calc_result_text,
3156                        XmNtopOffset, 5,
3157                        XmNbottomAttachment, XmATTACH_FORM,
3158                        XmNbottomOffset, 5,
3159                        XmNleftAttachment, XmATTACH_POSITION,
3160                        XmNleftPosition, 1,
3161                        XmNrightAttachment, XmATTACH_POSITION,
3162                        XmNrightPosition, 2,
3163                        XmNnavigationType, XmTAB_GROUP,
3164                        MY_FOREGROUND_COLOR,
3165                        MY_BACKGROUND_COLOR,
3166                        XmNfontList, fontlist1,
3167                        NULL);
3168     XtAddCallback(button_calculate, XmNactivateCallback, Coordinate_calc_compute, coordinate_calc_dialog);
3169 
3170     coordinate_calc_button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
3171                                 xmPushButtonGadgetClass,
3172                                 form,
3173                                 XmNtopAttachment, XmATTACH_WIDGET,
3174                                 XmNtopWidget, coordinate_calc_result_text,
3175                                 XmNtopOffset, 5,
3176                                 XmNbottomAttachment, XmATTACH_FORM,
3177                                 XmNbottomOffset, 5,
3178                                 XmNleftAttachment, XmATTACH_POSITION,
3179                                 XmNleftPosition, 2,
3180                                 XmNrightAttachment, XmATTACH_POSITION,
3181                                 XmNrightPosition, 3,
3182                                 XmNnavigationType, XmTAB_GROUP,
3183                                 MY_FOREGROUND_COLOR,
3184                                 MY_BACKGROUND_COLOR,
3185                                 XmNfontList, fontlist1,
3186                                 NULL);
3187     XtAddCallback(coordinate_calc_button_ok, XmNactivateCallback, Coordinate_calc_change_data, coordinate_calc_dialog);
3188     XtSetSensitive(coordinate_calc_button_ok,FALSE);
3189 
3190     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00003"),
3191                                             xmPushButtonGadgetClass,
3192                                             form,
3193                                             XmNtopAttachment, XmATTACH_WIDGET,
3194                                             XmNtopWidget, coordinate_calc_result_text,
3195                                             XmNtopOffset, 5,
3196                                             XmNbottomAttachment, XmATTACH_FORM,
3197                                             XmNbottomOffset, 5,
3198                                             XmNleftAttachment, XmATTACH_POSITION,
3199                                             XmNleftPosition, 3,
3200                                             XmNrightAttachment, XmATTACH_POSITION,
3201                                             XmNrightPosition, 4,
3202                                             XmNnavigationType, XmTAB_GROUP,
3203                                             MY_FOREGROUND_COLOR,
3204                                             MY_BACKGROUND_COLOR,
3205                                             XmNfontList, fontlist1,
3206                                             NULL);
3207     XtAddCallback(button_cancel, XmNactivateCallback, Coordinate_calc_destroy_shell, coordinate_calc_dialog);
3208 
3209     pos_dialog(coordinate_calc_dialog);
3210 
3211     delw = XmInternAtom(XtDisplay(coordinate_calc_dialog),"WM_DELETE_WINDOW", FALSE);
3212     XmAddWMProtocolCallback(coordinate_calc_dialog, delw, Coordinate_calc_destroy_shell, (XtPointer)coordinate_calc_dialog);
3213 
3214     XtManageChild(form);
3215     XtManageChild(pane);
3216 
3217     resize_dialog(form, coordinate_calc_dialog);
3218 
3219     XtPopup(coordinate_calc_dialog,XtGrabNone);
3220 
3221     // Move focus to the Close button.  This appears to highlight the
3222     // button fine, but we're not able to hit the <Enter> key to
3223     // have that default function happen.  Note:  We _can_ hit the
3224     // <SPACE> key, and that activates the option.
3225 //        XmUpdateDisplay(coordinate_calc_dialog);
3226     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
3227 
3228   }
3229   else
3230   {
3231     (void)XRaiseWindow(XtDisplay(coordinate_calc_dialog), XtWindow(coordinate_calc_dialog));
3232   }
3233 
3234   // Fill in the latitude values if they're available
3235   if ( (coordinate_calc_array.calling_dialog != NULL)
3236        && (coordinate_calc_array.input_lat_deg != NULL)
3237        && (coordinate_calc_array.input_lat_min != NULL)
3238        && (coordinate_calc_array.input_lat_dir != NULL) )
3239   {
3240     char *str_ptr1;
3241     char *str_ptr2;
3242     char *str_ptr3;
3243 
3244     str_ptr1 = XmTextGetString(coordinate_calc_array.input_lat_deg);
3245     str_ptr2 = XmTextGetString(coordinate_calc_array.input_lat_min);
3246     str_ptr3 = XmTextGetString(coordinate_calc_array.input_lat_dir);
3247 
3248     xastir_snprintf(temp_string, sizeof(temp_string), "%s %s%s",
3249                     str_ptr1, str_ptr2, str_ptr3);
3250     XmTextSetString(coordinate_calc_latitude_easting, temp_string);
3251     //fprintf(stderr,"String: %s\n", temp_string);
3252     // We're done with these variables.  Free the space.
3253     XtFree(str_ptr1);
3254     XtFree(str_ptr2);
3255     XtFree(str_ptr3);
3256   }
3257 
3258   // Fill in the longitude values if they're available
3259   if ( (coordinate_calc_array.calling_dialog != NULL)
3260        && (coordinate_calc_array.input_lon_deg != NULL)
3261        && (coordinate_calc_array.input_lon_min != NULL)
3262        && (coordinate_calc_array.input_lon_dir != NULL) )
3263   {
3264     char *str_ptr1;
3265     char *str_ptr2;
3266     char *str_ptr3;
3267 
3268     str_ptr1 = XmTextGetString(coordinate_calc_array.input_lon_deg);
3269     str_ptr2 = XmTextGetString(coordinate_calc_array.input_lon_min);
3270     str_ptr3 = XmTextGetString(coordinate_calc_array.input_lon_dir);
3271 
3272     xastir_snprintf(temp_string, sizeof(temp_string), "%s %s%s",
3273                     str_ptr1, str_ptr2, str_ptr3);
3274     XmTextSetString(coordinate_calc_longitude_northing, temp_string);
3275     //fprintf(stderr,"String: %s\n", temp_string);
3276     // We're done with these variables.  Free the space.
3277     XtFree(str_ptr1);
3278     XtFree(str_ptr2);
3279     XtFree(str_ptr3);
3280   }
3281 }
3282 
3283 
3284 
3285 
3286 
3287 ////////////////////////////////////////////////////////////////////////////////////////////////////
3288 
3289 
3290 
3291 
3292 
HandlePendingEvents(XtAppContext app)3293 void HandlePendingEvents( XtAppContext app)
3294 {
3295   XEvent event;
3296 
3297   while(XtAppPending(app))
3298   {
3299     XtAppNextEvent(app,&event);
3300     (void)XtDispatchEvent(&event);
3301   }
3302 }
3303 
3304 
3305 
3306 
3307 
unbusy_cursor(XtPointer clientdata)3308 Boolean unbusy_cursor(XtPointer clientdata)
3309 {
3310   Widget w = (Widget)clientdata;
3311 
3312   (void)XUndefineCursor(XtDisplay(w),XtWindow(w));
3313   return((Boolean)TRUE);
3314 }
3315 
3316 
3317 
3318 
3319 static Cursor cs = (Cursor)NULL;
3320 
busy_cursor(Widget w)3321 void busy_cursor(Widget w)
3322 {
3323 
3324   if(!cs)
3325   {
3326     cs=XCreateFontCursor(XtDisplay(w),XC_watch);
3327   }
3328 
3329   (void)XDefineCursor(XtDisplay(w),XtWindow(w),cs);
3330   (void)XFlush(XtDisplay(w));
3331 
3332   // This X11 function gets invoked when X11 decides that it has
3333   // some free time.  We use that to advantage in making the busy
3334   // cursor go away "magically" when we're not so busy.
3335   //
3336   (void)XtAppAddWorkProc(XtWidgetToApplicationContext(w),unbusy_cursor,(XtPointer)w);
3337 }
3338 
3339 
3340 
3341 
3342 
3343 // This function:
3344 // Draws the map data into "pixmap", copies "pixmap" to
3345 // "pixmap_alerts", draws alerts into "pixmap_alerts", copies
3346 // "pixmap_alerts" to "pixmap_final", draws symbols/tracks into
3347 // "pixmap_final" via a call to display_file().
3348 //
3349 // Other functions which call this function are responsible for
3350 // copying the image from pixmap_final() to the screen's drawing
3351 // area.
3352 //
3353 // We check for interrupt_drawing_now flag being set, and exit
3354 // nicely if so.  That flag means that some other drawing operation
3355 // needs to happen.
3356 //
3357 // Returns 0 if it gets interrupted, 1 if it completes.
3358 //
create_image(Widget w)3359 int create_image(Widget w)
3360 {
3361   Dimension width, height, margin_width, margin_height;
3362   long lat_offset_temp;
3363   long long_offset_temp;
3364   char temp_course[20];
3365   unsigned char   unit_type;
3366   char medium_dashed[2] = {(char)5,(char)5};
3367   long pos1_lat, pos1_lon, pos2_lat, pos2_lon;
3368 
3369 
3370   //busy_cursor(w);
3371   busy_cursor(appshell);
3372 
3373   if (debug_level & 4)
3374   {
3375     fprintf(stderr,"Create image start\n");
3376   }
3377 
3378   HandlePendingEvents(app_context);
3379   if (interrupt_drawing_now)
3380   {
3381     return(0);
3382   }
3383 
3384   // If we're in the middle of ID'ing, wait a bit.
3385   if (ATV_screen_ID && pending_ID_message)
3386   {
3387     usleep(2000000);  // 2 seconds
3388   }
3389 
3390   HandlePendingEvents(app_context);
3391   if (interrupt_drawing_now)
3392   {
3393     return(0);
3394   }
3395 
3396   /* First get the various dimensions */
3397   XtVaGetValues(w,
3398                 XmNwidth,         &width,
3399                 XmNheight,        &height,
3400                 XmNmarginWidth,   &margin_width,
3401                 XmNmarginHeight,  &margin_height,
3402                 XmNunitType,      &unit_type,
3403                 NULL);
3404 
3405   (void)XSetDashes(XtDisplay(w), gc, 0, medium_dashed, 2);
3406 
3407   screen_width  = (long)width;
3408   screen_height = (long)height;
3409   long_offset_temp = NW_corner_longitude = center_longitude - (screen_width  * scale_x / 2);  // NW corner
3410   lat_offset_temp  = NW_corner_latitude  = center_latitude  - (screen_height * scale_y / 2);
3411 
3412   SE_corner_longitude = center_longitude + (screen_width * scale_x / 2);
3413   SE_corner_latitude = center_latitude + (screen_height * scale_y / 2);
3414 
3415   // Set up floating point lat/long values to match Xastir
3416   // coordinates.
3417   convert_from_xastir_coordinates(&f_NW_corner_longitude,
3418                                   &f_NW_corner_latitude,
3419                                   NW_corner_longitude,
3420                                   NW_corner_latitude);
3421   convert_from_xastir_coordinates(&f_SE_corner_longitude,
3422                                   &f_SE_corner_latitude,
3423                                   SE_corner_longitude,
3424                                   SE_corner_latitude);
3425 
3426   /* map default background color */
3427   switch (map_background_color)
3428   {
3429     case 0 :
3430       colors[0xfd] = GetPixelByName(appshell,"gray73");
3431       break;
3432 
3433     case 1 :
3434       colors[0xfd] = GetPixelByName(w,"MistyRose");
3435       break;
3436 
3437     case 2 :
3438       colors[0xfd] = GetPixelByName(w,"NavyBlue");
3439       break;
3440 
3441     case 3 :
3442       colors[0xfd] = GetPixelByName(w,"SteelBlue");
3443       break;
3444 
3445     case 4 :
3446       colors[0xfd] = GetPixelByName(w,"MediumSeaGreen");
3447       break;
3448 
3449     case 5 :
3450       colors[0xfd] = GetPixelByName(w,"PaleGreen");
3451       break;
3452 
3453     case 6 :
3454       colors[0xfd] = GetPixelByName(w,"PaleGoldenrod");
3455       break;
3456 
3457     case 7 :
3458       colors[0xfd] = GetPixelByName(w,"LightGoldenrodYellow");
3459       break;
3460 
3461     case 8 :
3462       colors[0xfd] = GetPixelByName(w,"RosyBrown");
3463       break;
3464 
3465     case 9 :
3466       colors[0xfd] = GetPixelByName(w,"firebrick");
3467       break;
3468 
3469     case 10 :
3470       colors[0xfd] = GetPixelByName(w,"white");
3471       break;
3472 
3473     case 11 :
3474       colors[0xfd] = GetPixelByName(w, "black");
3475       break;
3476 
3477     default:
3478       colors[0xfd] = GetPixelByName(appshell,"gray73");
3479       map_background_color=0;
3480       break;
3481   }
3482 
3483   HandlePendingEvents(app_context);
3484   if (interrupt_drawing_now)
3485   {
3486     return(0);
3487   }
3488 
3489   (void)XSetForeground(XtDisplay(w),gc,colors[0xfd]);
3490   (void)XSetBackground(XtDisplay(w),gc,colors[0xfd]);
3491 
3492   (void)XFillRectangle(XtDisplay(w),
3493                        pixmap,
3494                        gc,
3495                        0,
3496                        0,
3497                        (unsigned int)screen_width,
3498                        (unsigned int)screen_height);
3499 
3500   HandlePendingEvents(app_context);
3501   if (interrupt_drawing_now)
3502   {
3503     return(0);
3504   }
3505 
3506   statusline(langcode("BBARSTA003"),1);       // Loading Maps
3507 
3508   HandlePendingEvents(app_context);
3509   if (interrupt_drawing_now)
3510   {
3511     return(0);
3512   }
3513 
3514   if (display_up_first != 0)
3515   {
3516     // clear the OSM function keys. If an OSM
3517     // map is selected they will get re-initialized when
3518     // the map is loaded.
3519     init_OSM_values();
3520     if (map_auto_maps && !disable_all_maps)
3521     {
3522       load_auto_maps(w,AUTO_MAP_DIR);
3523     }
3524     else if (!disable_all_maps)
3525     {
3526       load_maps(w);
3527     }
3528   }
3529 
3530   if (!wx_alert_style)
3531   {
3532     statusline(langcode("BBARSTA034"),1);
3533   }
3534 
3535   // Update to screen
3536 //    (void)XCopyArea(XtDisplay(da),pixmap,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
3537 
3538   HandlePendingEvents(app_context);
3539   if (interrupt_drawing_now)
3540   {
3541     return(0);
3542   }
3543 
3544   /* copy map data to alert pixmap */
3545   (void)XCopyArea(XtDisplay(w),pixmap,pixmap_alerts,gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
3546 
3547   HandlePendingEvents(app_context);
3548   if (interrupt_drawing_now)
3549   {
3550     return(0);
3551   }
3552 
3553   if (!wx_alert_style && !disable_all_maps)
3554   {
3555     load_alert_maps(w, ALERT_MAP_DIR);  // These write onto pixmap_alerts
3556   }
3557 
3558   // Update to screen
3559 //    (void)XCopyArea(XtDisplay(da),pixmap_alerts,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
3560 
3561   HandlePendingEvents(app_context);
3562   if (interrupt_drawing_now)
3563   {
3564     return(0);
3565   }
3566 
3567   /* copy map and alert data to final pixmap */
3568   (void)XCopyArea(XtDisplay(w),pixmap_alerts,pixmap_final,gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
3569 
3570   HandlePendingEvents(app_context);
3571   if (interrupt_drawing_now)
3572   {
3573     return(0);
3574   }
3575 
3576   wx_alert_update_list();
3577 
3578   /* Compute distance */
3579   if (lat_offset_temp<0l)
3580   {
3581     lat_offset_temp=0l;  // max 90°N
3582   }
3583   else if (lat_offset_temp>64800000l)
3584   {
3585     lat_offset_temp=64800000l;  // max 90°S
3586   }
3587 
3588   if(long_offset_temp<0l)
3589   {
3590     long_offset_temp=0l;  // max 180°W
3591   }
3592   else if (long_offset_temp>129600000l)
3593   {
3594     long_offset_temp=129600000l;  // max 180°E
3595   }
3596 
3597   pos1_lat = lat_offset_temp;
3598   pos1_lon = long_offset_temp;
3599   pos2_lat = lat_offset_temp;      // ??
3600   pos2_lon = long_offset_temp+(50.0*scale_x);
3601 
3602 //    long_offset_temp = long_offset_temp+(50*scale_x);  // ??
3603 
3604   if(pos2_lat < 0l)     // ??
3605   {
3606     pos2_lat = 0l;
3607   }
3608   else if (pos2_lat > 64799999l)
3609   {
3610     pos2_lat = 64799999l;
3611   }
3612 
3613   if (pos2_lon < 0l)
3614   {
3615     pos2_lon = 0l;
3616   }
3617   else if (pos2_lon > 129599999l)
3618   {
3619     pos2_lon = 129599999l;
3620   }
3621 
3622   // Get distance in nautical miles
3623   x_screen_distance = (float)calc_distance_course(pos1_lat,
3624                       pos1_lon,
3625                       pos2_lat,
3626                       pos2_lon,
3627                       temp_course,
3628                       sizeof(temp_course) );
3629 
3630   HandlePendingEvents(app_context);
3631   if (interrupt_drawing_now)
3632   {
3633     return(0);
3634   }
3635 
3636   draw_grid(w);                       // Draw grid if enabled
3637 
3638   HandlePendingEvents(app_context);
3639   if (interrupt_drawing_now)
3640   {
3641     return(0);
3642   }
3643 
3644   display_file(w);                    // display stations (symbols, info, trails)
3645 
3646   last_alert_redraw=sec_now();        // set last time of screen redraw
3647 
3648   if (debug_level & 4)
3649   {
3650     fprintf(stderr,"Create image stop\n");
3651   }
3652 
3653   return(1);
3654 }
3655 
3656 
3657 
3658 
3659 
3660 // Routine used to refresh image WITHOUT reading regular map files
3661 // from disk.  It starts with the map data already in "pixmap",
3662 // copies "pixmap" to "pixmap_alerts", draws alerts into
3663 // "pixmap_alerts", copies "pixmap_alerts" to "pixmap_final", draws
3664 // symbols/tracks into "pixmap_final" via a call to display_file().
3665 //
3666 // Other functions which call this function are responsible for
3667 // copying the image from pixmap_final() to the screen's drawing
3668 // area.
3669 //
refresh_image(Widget w)3670 void refresh_image(Widget w)
3671 {
3672   Dimension width, height, margin_width, margin_height;
3673   long lat_offset_temp;
3674   long long_offset_temp;
3675   char temp_course[20];
3676   unsigned char   unit_type;
3677   char medium_dashed[2] = {(char)5,(char)5};
3678   long pos1_lat, pos1_lon, pos2_lat, pos2_lon;
3679 
3680 
3681   //busy_cursor(w);
3682   busy_cursor(appshell);
3683 
3684   if (debug_level & 4)
3685   {
3686     fprintf(stderr,"Refresh image start\n");
3687   }
3688 
3689   // If we're in the middle of ID'ing, wait a bit.
3690   if (ATV_screen_ID && pending_ID_message)
3691   {
3692     usleep(2000000);  // 2 seconds
3693   }
3694 
3695   /* First get the various dimensions */
3696   XtVaGetValues(w,
3697                 XmNwidth,         &width,
3698                 XmNheight,        &height,
3699                 XmNmarginWidth,   &margin_width,
3700                 XmNmarginHeight,  &margin_height,
3701                 XmNunitType,      &unit_type,
3702                 NULL);
3703 
3704   (void)XSetDashes(XtDisplay(w), gc, 0, medium_dashed, 2);
3705 
3706   screen_width  = (long)width;
3707   screen_height = (long)height;
3708 
3709   long_offset_temp = NW_corner_longitude = center_longitude - (screen_width * scale_x / 2);
3710   NW_corner_latitude     = center_latitude - (screen_height * scale_y / 2);
3711   lat_offset_temp  = center_latitude;
3712 
3713   SE_corner_longitude = center_longitude + (screen_width * scale_x / 2);
3714   SE_corner_latitude = center_latitude + (screen_height * scale_y / 2);
3715 
3716   // Set up floating point lat/long values to match Xastir
3717   // coordinates.
3718   convert_from_xastir_coordinates(&f_NW_corner_longitude,
3719                                   &f_NW_corner_latitude,
3720                                   NW_corner_longitude,
3721                                   NW_corner_latitude);
3722   convert_from_xastir_coordinates(&f_SE_corner_longitude,
3723                                   &f_SE_corner_latitude,
3724                                   SE_corner_longitude,
3725                                   SE_corner_latitude);
3726 
3727   (void)XSetForeground(XtDisplay(w),gc,colors[0xfd]);
3728   (void)XSetBackground(XtDisplay(w),gc,colors[0xfd]);
3729 
3730   /* copy over map data to alert pixmap */
3731   (void)XCopyArea(XtDisplay(w),pixmap,pixmap_alerts,gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
3732 
3733   if (!wx_alert_style && !disable_all_maps)
3734   {
3735     statusline(langcode("BBARSTA034"),1);
3736     load_alert_maps(w, ALERT_MAP_DIR);  // These write onto pixmap_alerts
3737   }
3738 
3739   /* copy over map and alert data to final pixmap */
3740   (void)XCopyArea(XtDisplay(w),pixmap_alerts,pixmap_final,gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
3741 
3742 //    statusline("Weather Alert Maps Loaded",1);
3743 
3744   wx_alert_update_list();
3745 
3746   /* Compute distance */
3747   if (lat_offset_temp<0l)
3748   {
3749     lat_offset_temp=0l;  // max 90°N
3750   }
3751   else if (lat_offset_temp>64800000l)
3752   {
3753     lat_offset_temp=64800000l;  // max 90°S
3754   }
3755 
3756   if(long_offset_temp<0l)
3757   {
3758     long_offset_temp=0l;  // max 180°W
3759   }
3760   else if (long_offset_temp>129600000l)
3761   {
3762     long_offset_temp=129600000l;  // max 180°E
3763   }
3764 
3765   pos1_lat = lat_offset_temp;
3766   pos1_lon = long_offset_temp;
3767   pos2_lat = lat_offset_temp;      // ??
3768   pos2_lon = long_offset_temp+(50.0*scale_x);
3769 
3770 //    long_offset_temp = long_offset_temp+(50*scale_x);  // ??
3771 
3772   if(pos2_lat < 0l)     // ??
3773   {
3774     pos2_lat = 0l;
3775   }
3776   else if (pos2_lat > 64799999l)
3777   {
3778     pos2_lat = 64799999l;
3779   }
3780 
3781   if (pos2_lon < 0l)
3782   {
3783     pos2_lon = 0l;
3784   }
3785   else if (pos2_lon > 129599999l)
3786   {
3787     pos2_lon = 129599999l;
3788   }
3789 
3790   // Get distance in nautical miles
3791   x_screen_distance = (float)calc_distance_course(pos1_lat,
3792                       pos1_lon,
3793                       pos2_lat,
3794                       pos2_lon,
3795                       temp_course,
3796                       sizeof(temp_course) );
3797 
3798   // Draw grid if enabled
3799   draw_grid(w);
3800 
3801   HandlePendingEvents(app_context);
3802   if (interrupt_drawing_now)
3803   {
3804     return;
3805   }
3806 
3807   /* display icons */
3808   display_file(w);
3809 
3810   /* set last time of screen redraw*/
3811   last_alert_redraw=sec_now();
3812 
3813   // We just refreshed the screen, so don't try to erase any
3814   // zoom-in boxes via XOR.
3815   zoom_box_x1 = -1;
3816 
3817   if (debug_level & 4)
3818   {
3819     fprintf(stderr,"Refresh image stop\n");
3820   }
3821 }
3822 
3823 
3824 
3825 
3826 
3827 // And this function is even faster yet.  It snags "pixmap_alerts",
3828 // which already has map and alert data drawn into it, copies it to
3829 // pixmap_final, then draws symbols and tracks on top of it.  When
3830 // done it copies the image to the drawing area, making it visible.
redraw_symbols(Widget w)3831 void redraw_symbols(Widget w)
3832 {
3833 
3834 
3835   HandlePendingEvents(app_context);
3836   if (interrupt_drawing_now)
3837   {
3838     return;
3839   }
3840 
3841   // If we're in the middle of ID'ing, wait a bit.
3842   if (ATV_screen_ID && pending_ID_message)
3843   {
3844     usleep(2000000);  // 2 seconds
3845   }
3846 
3847   /* copy over map and alert data to final pixmap */
3848   if(!wait_to_redraw)
3849   {
3850 
3851     (void)XCopyArea(XtDisplay(w),pixmap_alerts,pixmap_final,gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
3852 
3853     draw_grid(w);           // draw grid if enabled
3854 
3855     HandlePendingEvents(app_context);
3856     if (interrupt_drawing_now)
3857     {
3858       return;
3859     }
3860 
3861     display_file(w);        // display stations (symbols, info, trails)
3862 
3863     (void)XCopyArea(XtDisplay(w),pixmap_final,XtWindow(w),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
3864   }
3865   else
3866   {
3867     fprintf(stderr,"wait_to_redraw\n");
3868   }
3869 
3870   // We just refreshed the screen, so don't try to erase any
3871   // zoom-in boxes via XOR.
3872   zoom_box_x1 = -1;
3873 }
3874 
3875 
3876 
3877 
3878 
TrackMouse(Widget UNUSED (w),XtPointer clientData,XEvent * event,Boolean * UNUSED (flag))3879 static void TrackMouse( Widget UNUSED(w), XtPointer clientData, XEvent *event, Boolean * UNUSED(flag) )
3880 {
3881   char my_text[70];
3882   char str_lat[20];
3883   char str_long[20];
3884   long x, y;
3885   //beg
3886   char temp_my_distance[20];
3887   char temp_my_course[20];
3888   char temp1_my_course[20];
3889   long ml_lat, ml_lon;
3890   float value;
3891   //end
3892 
3893 
3894   Widget textarea = (Widget) clientData;
3895 
3896   x = (center_longitude - ((screen_width  * scale_x)/2) + (event->xmotion.x * scale_x));
3897   y = (center_latitude  - ((screen_height * scale_y)/2) + (event->xmotion.y * scale_y));
3898 
3899   if (x < 0)
3900 //        x = 0l;                 // 180°W
3901   {
3902     return;
3903   }
3904 
3905   if (x > 129600000l)
3906 //        x = 129600000l;         // 180°E
3907   {
3908     return;
3909   }
3910 
3911   if (y < 0)
3912 //        y = 0l;                 //  90°N
3913   {
3914     return;
3915   }
3916 
3917   if (y > 64800000l)
3918 //        y = 64800000l;          //  90°S
3919   {
3920     return;
3921   }
3922 
3923   if (DISPLAY_XASTIR_COORDINATES)
3924   {
3925     xastir_snprintf(my_text, sizeof(my_text), "%ld  %ld", y, x);
3926   }
3927   else if (coordinate_system == USE_UTM
3928            || coordinate_system == USE_UTM_SPECIAL)
3929   {
3930     // Create a UTM string from coordinate in Xastir coordinate
3931     // system.
3932     convert_xastir_to_UTM_str(my_text, sizeof(my_text), x, y);
3933   }
3934   else if (coordinate_system == USE_MGRS)
3935   {
3936     // Create an MGRS string from coordinate in Xastir
3937     // coordinate system.
3938     convert_xastir_to_MGRS_str(my_text, sizeof(my_text), x, y, 0);
3939   }
3940   else
3941   {
3942     // Create a lat/lon string from coordinate in Xastir
3943     // coordinate system.
3944     if (coordinate_system == USE_DDDDDD)
3945     {
3946       convert_lat_l2s(y, str_lat, sizeof(str_lat), CONVERT_DEC_DEG);
3947       convert_lon_l2s(x, str_long, sizeof(str_long), CONVERT_DEC_DEG);
3948     }
3949     else if (coordinate_system == USE_DDMMSS)
3950     {
3951       convert_lat_l2s(y, str_lat, sizeof(str_lat), CONVERT_DMS_NORMAL_FORMATED);
3952       convert_lon_l2s(x, str_long, sizeof(str_long), CONVERT_DMS_NORMAL_FORMATED);
3953       //str_lat[2]='\xB0'; str_long[3]='\xB0';
3954       //str_lat[5]='\''; str_long[6]='\'';
3955     }
3956     else        // Assume coordinate_system == USE_DDMMMM
3957     {
3958       convert_lat_l2s(y, str_lat, sizeof(str_lat), CONVERT_HP_NORMAL_FORMATED);
3959       convert_lon_l2s(x, str_long, sizeof(str_long), CONVERT_HP_NORMAL_FORMATED);
3960       //str_lat[2]='\xB0'; str_long[3]='\xB0';
3961     }
3962     xastir_snprintf(my_text, sizeof(my_text), "%s  %s", str_lat, str_long);
3963   }
3964 
3965   strncat(my_text,
3966           "  ",
3967           sizeof(my_text) - 1 - strlen(my_text));
3968 
3969   strncat(my_text,
3970           sec_to_loc(x,y),
3971           sizeof(my_text) - 1 - strlen(my_text));
3972 
3973   // begin dist/bearing
3974   if ( do_dbstatus )
3975   {
3976     ml_lat = convert_lat_s2l(my_lat);
3977     ml_lon = convert_lon_s2l(my_long);
3978 
3979     // Get distance in nautical miles.
3980     value = (float)calc_distance_course(ml_lat,ml_lon,y,x,
3981                                         temp1_my_course,sizeof(temp1_my_course));
3982 
3983     // n7tap: This is a quick hack to get some more useful values for
3984     //        distance to near ojects.
3985     // (copied from db.c:station_data_fill_in)
3986     if (english_units)
3987     {
3988       if (value*1.15078 < 0.99)
3989       {
3990         xastir_snprintf(temp_my_distance,
3991                         sizeof(temp_my_distance),
3992                         "%d %s",
3993                         (int)(value*1.15078*1760),
3994                         langcode("SPCHSTR004"));    // yards
3995       }
3996       else
3997       {
3998         xastir_snprintf(temp_my_distance,
3999                         sizeof(temp_my_distance),
4000                         langcode("WPUPSTI020"),     // miles
4001                         value*1.15078);
4002       }
4003     }
4004     else
4005     {
4006       if (value*1.852 < 0.99)
4007       {
4008         xastir_snprintf(temp_my_distance,
4009                         sizeof(temp_my_distance),
4010                         "%d %s",
4011                         (int)(value*1.852*1000),
4012                         langcode("UNIOP00031"));    // 'm' as in meters
4013       }
4014       else
4015       {
4016         xastir_snprintf(temp_my_distance,
4017                         sizeof(temp_my_distance),
4018                         langcode("WPUPSTI021"),     // km
4019                         value*1.852);
4020       }
4021     }
4022     strcpy(temp_my_course, temp1_my_course);
4023     temp_my_course[sizeof(temp_my_course)-1] = '\0';  // Terminate string
4024     strcat(temp_my_course, "\xB0");
4025     temp_my_course[sizeof(temp_my_course)-1] = '\0';  // Terminate string
4026 
4027     strncat(my_text,
4028             " ",
4029             sizeof(my_text) - 1 - strlen(my_text));
4030 
4031     strncat(my_text,
4032             temp_my_distance,
4033             sizeof(my_text) - 1 - strlen(my_text));
4034 
4035     strncat(my_text,
4036             " ",
4037             sizeof(my_text) - 1 - strlen(my_text));
4038 
4039     strncat(my_text,
4040             temp_my_course,
4041             sizeof(my_text) - 1 - strlen(my_text));
4042   }
4043 
4044   XmTextFieldSetString(textarea, my_text);
4045   XtManageChild(textarea);
4046 }
4047 
4048 
4049 
4050 
4051 
ClearTrackMouse(Widget UNUSED (w),XtPointer UNUSED (clientData),XEvent * UNUSED (event),Boolean * UNUSED (flag))4052 static void ClearTrackMouse( Widget UNUSED(w), XtPointer UNUSED(clientData), XEvent * UNUSED(event), Boolean * UNUSED(flag) )
4053 {
4054 // N7TAP: In my opinion, it is handy to have the cursor position still displayed
4055 //        in the xastir window when I switch to another (like to write it down...)
4056 //    Widget textarea = (Widget) clientData;
4057 //    XmTextFieldSetString(textarea," ");
4058 //    XtManageChild(textarea);
4059 }
4060 
4061 
4062 
4063 
4064 
4065 /*
4066  *  Delete tracks of all stations
4067  */
Tracks_All_Clear(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))4068 void Tracks_All_Clear( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
4069 {
4070   DataRow *p_station;
4071 
4072   p_station = n_first;
4073   while (p_station != 0)
4074   {
4075     if (delete_trail(p_station))
4076     {
4077       redraw_on_new_data=2;
4078     }
4079     p_station = p_station->n_next;
4080   }
4081 }
4082 
4083 
4084 
4085 
4086 
4087 // Get a pointer to the first station record.  Loop through all
4088 // station records and clear out the tactical_call_sign fields in
4089 // each.
4090 //
clear_all_tactical(void)4091 void clear_all_tactical(void)
4092 {
4093   DataRow *p_station = n_first;
4094 
4095   // Run through the name-ordered list of records
4096   while (p_station != 0)
4097   {
4098     if (p_station->tactical_call_sign)
4099     {
4100       // One found.  Free it.
4101       free(p_station->tactical_call_sign);
4102       p_station->tactical_call_sign = NULL;
4103     }
4104     p_station = p_station->n_next;
4105   }
4106   fprintf(stderr,"Cleared all tactical calls\n");
4107 }
4108 
4109 
4110 
4111 
4112 
4113 /*
4114  *  Clear all tactical callsigns from the station records.  Comment
4115  *  out the active records in the log file.
4116  */
Tactical_Callsign_Clear(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))4117 void Tactical_Callsign_Clear( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
4118 {
4119   char file[200];
4120   char file_temp[200];
4121   FILE *f;
4122   FILE *f_temp;
4123   char line[300];
4124   int ret;
4125 
4126 
4127   // Loop through all station records and clear out the
4128   // tactical_call_sign fields in each.
4129   clear_all_tactical();
4130 
4131   // Get rid of the tactical callsign hash here
4132   destroy_tactical_hash();
4133 
4134   get_user_base_dir("config/tactical_calls.log", file, sizeof(file));
4135 
4136   get_user_base_dir("config/tactical_calls-temp.log", file_temp,
4137                     sizeof(file_temp));
4138 
4139   // Our own internal function from util.c
4140   ret = copy_file(file, file_temp);
4141   if (ret)
4142   {
4143     fprintf(stderr,"\n\nCouldn't create temp file %s!\n\n\n",
4144             file_temp);
4145     return;
4146   }
4147 
4148   // Comment out all active lines in the log file via a '#' mark.
4149   // Read one line at a time from the temp file.  Add a '#'
4150   // mark to the line if it doesn't already have it, then write
4151   // that line to the original file.
4152   f_temp=fopen(file_temp,"r");
4153   f=fopen(file,"w");
4154 
4155   if (f == NULL)
4156   {
4157     fprintf(stderr,"Couldn't open %s\n",file);
4158     return;
4159   }
4160   if (f_temp == NULL)
4161   {
4162     fprintf(stderr,"Couldn't open %s\n",file_temp);
4163     return;
4164   }
4165 
4166   // Read lines from the temp file and write them to the standard
4167   // file, modifying them as necessary.
4168   while (fgets(line, 300, f_temp) != NULL)
4169   {
4170 
4171     if (line[0] != '#')
4172     {
4173       fprintf(f,"#%s",line);
4174     }
4175     else
4176     {
4177       fprintf(f,"%s",line);
4178     }
4179   }
4180   fclose(f);
4181   fclose(f_temp);
4182 }
4183 
4184 
4185 
4186 
4187 
4188 /*
4189  *  Clear out tactical callsign log file
4190  */
Tactical_Callsign_History_Clear(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))4191 void Tactical_Callsign_History_Clear( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
4192 {
4193   char file[MAX_VALUE];
4194   FILE *f;
4195 
4196   // Loop through all station records and clear out the
4197   // tactical_call_sign fields in each.
4198   clear_all_tactical();
4199 
4200   // Get rid of the tactical callsign hash here
4201   destroy_tactical_hash();
4202 
4203   // Wipe out the log file.
4204   get_user_base_dir("config/tactical_calls.log", file, sizeof(file));
4205 
4206   f=fopen(file,"w");
4207   if (f!=NULL)
4208   {
4209     (void)fclose(f);
4210 
4211     if (debug_level & 1)
4212     {
4213       fprintf(stderr,"Clearing tactical callsign file...\n");
4214     }
4215   }
4216   else
4217   {
4218     fprintf(stderr,"Couldn't open file for writing: %s\n", file);
4219   }
4220 
4221   fprintf(stderr,"Cleared tactical call history file\n");
4222 }
4223 
4224 
4225 
4226 
4227 
4228 /*
4229  *  Display text in the status line, text is removed after timeout
4230  */
statusline(char * status_text,int UNUSED (update))4231 void statusline(char *status_text,int UNUSED(update) )
4232 {
4233 
4234   XmTextFieldSetString (text, status_text);
4235   last_statusline = sec_now();    // Used for auto-ID timeout
4236 //    if (update != 0)
4237 //        XmUpdateDisplay(text);      // do an immediate update
4238 }
4239 
4240 
4241 
4242 
4243 
4244 /*  print a message on standard error and display the same message
4245  *   on the status line of the user interface.
4246 */
stderr_and_statusline(char * message)4247 void stderr_and_statusline(char *message)
4248 {
4249   fprintf(stderr,"%s",message);
4250   if (message[strlen(message)-1]=='\n')
4251   {
4252     // if there is a terminal new line character remove it.
4253     message[strlen(message)-1]='\0';
4254   }
4255   statusline(message,1);
4256   XmUpdateDisplay(text);      // force an immediate update
4257 }
4258 
4259 
4260 
4261 
4262 
4263 //
4264 // Check for statusline timeout and replace statusline text with a
4265 // station identification message.
4266 //
4267 // ID was requested so that Xastir could be used for a live fast-scan
4268 // TV display over amateur radio without having to identify the
4269 // station in some other manner.  As long as we guarantee that we'll
4270 // see this line for a few seconds each 10 minutes (30 minutes for
4271 // Canada), we should be within the ID rules.
4272 //
check_statusline_timeout(int curr_sec)4273 void check_statusline_timeout(int curr_sec)
4274 {
4275   char status_text[100];
4276   int id_interval = (int)(9.5 * 60);
4277 //    int id_interval = (int)(1 * 5);  // Debug
4278 
4279 
4280   if ( (last_statusline != 0
4281         && (last_statusline < curr_sec - STATUSLINE_ACTIVE))
4282        || (last_id_time < curr_sec - id_interval) )
4283   {
4284 
4285 
4286     // We save last_id_time and identify for a few seconds if
4287     // we haven't identified for the last nine minutes or so.
4288 
4289     xastir_snprintf(status_text,
4290                     sizeof(status_text),
4291                     langcode ("BBARSTA040"),
4292                     my_callsign);
4293 
4294     XmTextFieldSetString(text, status_text);
4295 
4296     if (last_id_time < curr_sec - id_interval)
4297     {
4298       popup_ID_message(langcode("BBARSTA040"),status_text);
4299 #ifdef HAVE_FESTIVAL
4300       if (festival_speak_ID)
4301       {
4302         char my_speech_callsign[100];
4303 
4304         xastir_snprintf(my_speech_callsign,
4305                         sizeof(my_speech_callsign),
4306                         "%s",
4307                         my_callsign);
4308         spell_it_out(my_speech_callsign, 100);
4309         xastir_snprintf(status_text,
4310                         sizeof(status_text),
4311                         langcode ("BBARSTA040"),
4312                         my_speech_callsign);
4313         SayText(status_text);
4314       }
4315 #endif  // HAVE_FESTIVAL
4316     }
4317 
4318     last_statusline = 0;    // now inactive
4319 
4320     // Guarantee that the ID text will be viewable for a few
4321     // seconds if we haven't identified recently.  Note that the
4322     // sleep statement puts the entire main thread to sleep for
4323     // that amount of time.  The application will be unresponsive
4324     // during that time.
4325 
4326     if (last_id_time < (curr_sec - (9 * 60)))
4327     {
4328       //fprintf(stderr,"Identifying at nine minutes\n");
4329       //sleep(1);
4330     }
4331 
4332     last_id_time = curr_sec;
4333   }
4334 }
4335 
4336 
4337 
4338 
4339 
4340 /*
4341  *  Display current zoom factor
4342  *
4343  *  DK7IN: we should find a new measure, we now have different x/y scaling!
4344  *         I now only use the y value
4345  */
display_zoom_status(void)4346 void display_zoom_status(void)
4347 {
4348   char zoom[30];
4349   char siz_str[6];
4350 
4351   if (scale_y < 9000)
4352   {
4353     xastir_snprintf(siz_str, sizeof(siz_str), "%5.0f", (float)scale_y);
4354   }
4355   else
4356   {
4357     char temp_scale[20];
4358     xastir_snprintf(temp_scale, sizeof(temp_scale), "%ldk", scale_y/1024);
4359     memcpy(siz_str, temp_scale, sizeof(siz_str));
4360     siz_str[sizeof(siz_str)-1] = '\0';  // Terminate string
4361   }
4362 
4363   if (track_station_on == 1)
4364   {
4365     xastir_snprintf(zoom, sizeof(zoom), langcode("BBARZM0002"), siz_str);
4366   }
4367   else
4368   {
4369     xastir_snprintf(zoom, sizeof(zoom), langcode("BBARZM0001"), siz_str);
4370     \
4371   }
4372 
4373   XmTextFieldSetString(text4,zoom);
4374 }
4375 
4376 
4377 
4378 
4379 
Change_debug_level_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))4380 void Change_debug_level_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
4381 {
4382   Widget shell = (Widget) clientData;
4383   XtPopdown(shell);
4384   XtDestroyWidget(shell);
4385   change_debug_level_dialog = (Widget)NULL;
4386 }
4387 
4388 
4389 
4390 
4391 
Change_debug_level_reset(Widget UNUSED (widget),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))4392 void Change_debug_level_reset(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
4393 {
4394   debug_level = 0;
4395   XmTextSetString(debug_level_text, "0");
4396 //    Change_debug_level_destroy_shell(widget,clientData,callData);
4397 }
4398 
4399 
4400 
4401 
4402 
Change_debug_level_change_data(Widget UNUSED (widget),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))4403 void Change_debug_level_change_data(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
4404 {
4405   char *temp;
4406   char temp_string[10];
4407 
4408   temp = XmTextGetString(debug_level_text);
4409 
4410   debug_level = atoi(temp);
4411   if ( (debug_level < 0) || (debug_level > 32767) )
4412   {
4413     debug_level = 0;
4414   }
4415 
4416   XtFree(temp);
4417 
4418   // Fill in the current value of debug_level
4419   xastir_snprintf(temp_string, sizeof(temp_string), "%d", debug_level);
4420   XmTextSetString(debug_level_text, temp_string);
4421 
4422 //    Change_debug_level_destroy_shell(widget,clientData,callData);
4423 }
4424 
4425 
4426 
4427 
4428 
Change_Debug_Level(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))4429 void Change_Debug_Level(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
4430 {
4431   static Widget  pane, my_form, button_ok, button_close,
4432          button_reset;
4433   Atom delw;
4434   Arg al[50];                    /* Arg List */
4435   register unsigned int ac = 0;           /* Arg Count */
4436   char temp_string[10];
4437 
4438   if (!change_debug_level_dialog)
4439   {
4440     change_debug_level_dialog = XtVaCreatePopupShell(langcode("PULDNFI007"),
4441                                 xmDialogShellWidgetClass, appshell,
4442                                 XmNdeleteResponse,XmDESTROY,
4443                                 XmNdefaultPosition, FALSE,
4444                                 NULL);
4445 
4446     pane = XtVaCreateWidget("Change Debug Level pane",
4447                             xmPanedWindowWidgetClass,
4448                             change_debug_level_dialog,
4449                             MY_FOREGROUND_COLOR,
4450                             MY_BACKGROUND_COLOR,
4451                             NULL);
4452 
4453     my_form =  XtVaCreateWidget("Change Debug Level my_form",
4454                                 xmFormWidgetClass,
4455                                 pane,
4456                                 XmNfractionBase, 3,
4457                                 XmNautoUnmanage, FALSE,
4458                                 XmNshadowThickness, 1,
4459                                 MY_FOREGROUND_COLOR,
4460                                 MY_BACKGROUND_COLOR,
4461                                 NULL);
4462 
4463 
4464     /*set args for color */
4465     ac=0;
4466     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
4467     ac++;
4468     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
4469     ac++;
4470 
4471 
4472     debug_level_text = XtVaCreateManagedWidget("Change_Debug_Level debug text",
4473                        xmTextWidgetClass,
4474                        my_form,
4475                        XmNeditable,   TRUE,
4476                        XmNcursorPositionVisible, TRUE,
4477                        XmNsensitive, TRUE,
4478                        XmNshadowThickness,    1,
4479                        XmNcolumns, 4,
4480                        XmNwidth, ((5*7)+2),
4481                        XmNmaxLength, 4,
4482                        XmNbackground, colors[0x0f],
4483                        XmNtopOffset, 5,
4484                        XmNtopAttachment,XmATTACH_FORM,
4485                        XmNbottomAttachment,XmATTACH_NONE,
4486                        XmNleftAttachment, XmATTACH_POSITION,
4487                        XmNleftPosition, 1,
4488                        XmNrightAttachment,XmATTACH_POSITION,
4489                        XmNrightPosition, 2,
4490                        XmNnavigationType, XmTAB_GROUP,
4491                        XmNfontList, fontlist1,
4492                        NULL);
4493 
4494     // Fill in the current value of debug_level
4495     xastir_snprintf(temp_string, sizeof(temp_string), "%d", debug_level);
4496     XmTextSetString(debug_level_text, temp_string);
4497 
4498     button_reset = XtVaCreateManagedWidget(langcode("UNIOP00033"),
4499                                            xmPushButtonGadgetClass,
4500                                            my_form,
4501                                            XmNtopAttachment, XmATTACH_WIDGET,
4502                                            XmNtopWidget, debug_level_text,
4503                                            XmNtopOffset, 5,
4504                                            XmNbottomAttachment, XmATTACH_FORM,
4505                                            XmNbottomOffset, 5,
4506                                            XmNleftAttachment, XmATTACH_POSITION,
4507                                            XmNleftPosition, 0,
4508                                            XmNrightAttachment, XmATTACH_POSITION,
4509                                            XmNrightPosition, 1,
4510                                            XmNnavigationType, XmTAB_GROUP,
4511                                            MY_FOREGROUND_COLOR,
4512                                            MY_BACKGROUND_COLOR,
4513                                            XmNfontList, fontlist1,
4514                                            NULL);
4515 
4516     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
4517                                         xmPushButtonGadgetClass,
4518                                         my_form,
4519                                         XmNtopAttachment, XmATTACH_WIDGET,
4520                                         XmNtopWidget, debug_level_text,
4521                                         XmNtopOffset, 5,
4522                                         XmNbottomAttachment, XmATTACH_FORM,
4523                                         XmNbottomOffset, 5,
4524                                         XmNleftAttachment, XmATTACH_POSITION,
4525                                         XmNleftPosition, 1,
4526                                         XmNrightAttachment, XmATTACH_POSITION,
4527                                         XmNrightPosition, 2,
4528                                         XmNnavigationType, XmTAB_GROUP,
4529                                         MY_FOREGROUND_COLOR,
4530                                         MY_BACKGROUND_COLOR,
4531                                         XmNfontList, fontlist1,
4532                                         NULL);
4533 
4534 
4535     button_close = XtVaCreateManagedWidget(langcode("UNIOP00003"),
4536                                            xmPushButtonGadgetClass,
4537                                            my_form,
4538                                            XmNtopAttachment, XmATTACH_WIDGET,
4539                                            XmNtopWidget, debug_level_text,
4540                                            XmNtopOffset, 5,
4541                                            XmNbottomAttachment, XmATTACH_FORM,
4542                                            XmNbottomOffset, 5,
4543                                            XmNleftAttachment, XmATTACH_POSITION,
4544                                            XmNleftPosition, 2,
4545                                            XmNrightAttachment, XmATTACH_POSITION,
4546                                            XmNrightPosition, 3,
4547                                            XmNnavigationType, XmTAB_GROUP,
4548                                            MY_FOREGROUND_COLOR,
4549                                            MY_BACKGROUND_COLOR,
4550                                            XmNfontList, fontlist1,
4551                                            NULL);
4552 
4553     XtAddCallback(button_reset, XmNactivateCallback, Change_debug_level_reset, change_debug_level_dialog);
4554     XtAddCallback(button_ok, XmNactivateCallback, Change_debug_level_change_data, change_debug_level_dialog);
4555     XtAddCallback(button_close, XmNactivateCallback, Change_debug_level_destroy_shell, change_debug_level_dialog);
4556 
4557     pos_dialog(change_debug_level_dialog);
4558 
4559     delw = XmInternAtom(XtDisplay(change_debug_level_dialog),"WM_DELETE_WINDOW", FALSE);
4560     XmAddWMProtocolCallback(change_debug_level_dialog, delw, Change_debug_level_destroy_shell, (XtPointer)change_debug_level_dialog);
4561 
4562     XtManageChild(my_form);
4563     XtManageChild(pane);
4564 
4565     XtPopup(change_debug_level_dialog,XtGrabNone);
4566     fix_dialog_size(change_debug_level_dialog);
4567 
4568     // Move focus to the Close button.  This appears to highlight the
4569     // button fine, but we're not able to hit the <Enter> key to
4570     // have that default function happen.  Note:  We _can_ hit the
4571     // <SPACE> key, and that activates the option.
4572 //        XmUpdateDisplay(change_debug_level_dialog);
4573     XmProcessTraversal(button_close, XmTRAVERSE_CURRENT);
4574 
4575   }
4576   else
4577   {
4578     (void)XRaiseWindow(XtDisplay(change_debug_level_dialog), XtWindow(change_debug_level_dialog));
4579   }
4580 }
4581 
4582 
4583 
4584 
4585 
4586 #if !defined(NO_GRAPHICS) && defined(HAVE_MAGICK)
Gamma_adjust_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))4587 void Gamma_adjust_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
4588 {
4589   Widget shell = (Widget) clientData;
4590   XtPopdown(shell);
4591   XtDestroyWidget(shell);
4592   gamma_adjust_dialog = (Widget)NULL;
4593 }
4594 
4595 
4596 
4597 
4598 
Gamma_adjust_change_data(Widget UNUSED (widget),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))4599 void Gamma_adjust_change_data(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
4600 {
4601   char *temp;
4602   char temp_string[10];
4603 
4604   temp = XmTextGetString(gamma_adjust_text);
4605 
4606   imagemagick_gamma_adjust = atof(temp);
4607   if (imagemagick_gamma_adjust < -9.9)
4608   {
4609     imagemagick_gamma_adjust = -9.9;
4610   }
4611   else if (imagemagick_gamma_adjust > 9.9)
4612   {
4613     imagemagick_gamma_adjust = 9.9;
4614   }
4615 
4616   XtFree(temp);
4617 
4618   xastir_snprintf(temp_string, sizeof(temp_string), "%+.1f", imagemagick_gamma_adjust);
4619   XmTextSetString(gamma_adjust_text, temp_string);
4620 
4621   // Set interrupt_drawing_now because conditions have changed
4622   // (new map center).
4623   interrupt_drawing_now++;
4624 
4625   // Request that a new image be created.  Calls create_image,
4626   // XCopyArea, and display_zoom_status.
4627   request_new_image++;
4628 
4629 //    if (create_image(da)) {
4630 //        XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
4631 //    }
4632 }
4633 
4634 
4635 
4636 
4637 
Gamma_adjust(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))4638 void Gamma_adjust(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
4639 {
4640   static Widget  pane, my_form, button_ok, button_close;
4641   Atom delw;
4642   char temp_string[10];
4643 
4644   if (!gamma_adjust_dialog)
4645   {
4646     // Gamma Correction
4647     gamma_adjust_dialog = XtVaCreatePopupShell(langcode("GAMMA002"),
4648                           xmDialogShellWidgetClass, appshell,
4649                           XmNdeleteResponse,        XmDESTROY,
4650                           XmNdefaultPosition,       FALSE,
4651                           NULL);
4652 
4653     pane = XtVaCreateWidget("Adjust Gamma pane",
4654                             xmPanedWindowWidgetClass, gamma_adjust_dialog,
4655                             MY_FOREGROUND_COLOR,
4656                             MY_BACKGROUND_COLOR,
4657                             NULL);
4658 
4659     my_form =  XtVaCreateWidget("Adjust Gamma my_form",
4660                                 xmFormWidgetClass,  pane,
4661                                 XmNfractionBase,    5,
4662                                 XmNautoUnmanage,    FALSE,
4663                                 XmNshadowThickness, 1,
4664                                 MY_FOREGROUND_COLOR,
4665                                 MY_BACKGROUND_COLOR,
4666                                 NULL);
4667 
4668     gamma_adjust_text = XtVaCreateManagedWidget("Adjust Gamma text",
4669                         xmTextWidgetClass,        my_form,
4670                         XmNeditable,              TRUE,
4671                         XmNcursorPositionVisible, TRUE,
4672                         XmNsensitive,             TRUE,
4673                         XmNshadowThickness,       1,
4674                         XmNcolumns,               4,
4675                         XmNwidth,                 4*10,
4676                         XmNmaxLength,             4,
4677                         XmNbackground,            colors[0x0f],
4678                         XmNtopOffset,             5,
4679                         XmNtopAttachment,         XmATTACH_FORM,
4680                         XmNbottomAttachment,      XmATTACH_NONE,
4681                         XmNleftAttachment,        XmATTACH_POSITION,
4682                         XmNleftPosition,          2,
4683                         XmNrightAttachment,       XmATTACH_POSITION,
4684                         XmNrightPosition,         3,
4685                         XmNnavigationType,        XmTAB_GROUP,
4686                         XmNfontList, fontlist1,
4687                         NULL);
4688 
4689     xastir_snprintf(temp_string, sizeof(temp_string), "%+.1f", imagemagick_gamma_adjust);
4690     XmTextSetString(gamma_adjust_text, temp_string);
4691 
4692     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
4693                                         xmPushButtonGadgetClass, my_form,
4694                                         XmNtopAttachment,        XmATTACH_WIDGET,
4695                                         XmNtopWidget,            gamma_adjust_text,
4696                                         XmNtopOffset,            5,
4697                                         XmNbottomAttachment,     XmATTACH_FORM,
4698                                         XmNbottomOffset,         5,
4699                                         XmNleftAttachment,       XmATTACH_POSITION,
4700                                         XmNleftPosition,         1,
4701                                         XmNrightAttachment,      XmATTACH_POSITION,
4702                                         XmNrightPosition,        2,
4703                                         XmNnavigationType,       XmTAB_GROUP,
4704                                         MY_FOREGROUND_COLOR,
4705                                         MY_BACKGROUND_COLOR,
4706                                         XmNfontList, fontlist1,
4707                                         NULL);
4708 
4709     button_close = XtVaCreateManagedWidget(langcode("UNIOP00003"),
4710                                            xmPushButtonGadgetClass, my_form,
4711                                            XmNtopAttachment,        XmATTACH_WIDGET,
4712                                            XmNtopWidget,            gamma_adjust_text,
4713                                            XmNtopOffset,            5,
4714                                            XmNbottomAttachment,     XmATTACH_FORM,
4715                                            XmNbottomOffset,         5,
4716                                            XmNleftAttachment,       XmATTACH_POSITION,
4717                                            XmNleftPosition,         3,
4718                                            XmNrightAttachment,      XmATTACH_POSITION,
4719                                            XmNrightPosition,        4,
4720                                            XmNnavigationType,       XmTAB_GROUP,
4721                                            MY_FOREGROUND_COLOR,
4722                                            MY_BACKGROUND_COLOR,
4723                                            XmNfontList, fontlist1,
4724                                            NULL);
4725 
4726     XtAddCallback(button_ok,
4727                   XmNactivateCallback, Gamma_adjust_change_data,   gamma_adjust_dialog);
4728     XtAddCallback(button_close,
4729                   XmNactivateCallback, Gamma_adjust_destroy_shell, gamma_adjust_dialog);
4730 
4731     pos_dialog(gamma_adjust_dialog);
4732 
4733     delw = XmInternAtom(XtDisplay(gamma_adjust_dialog), "WM_DELETE_WINDOW", FALSE);
4734     XmAddWMProtocolCallback(gamma_adjust_dialog,
4735                             delw, Gamma_adjust_destroy_shell, (XtPointer)gamma_adjust_dialog);
4736 
4737     XtManageChild(my_form);
4738     XtManageChild(pane);
4739 
4740     XtPopup(gamma_adjust_dialog, XtGrabNone);
4741     fix_dialog_size(gamma_adjust_dialog);
4742 
4743     // Move focus to the Close button.  This appears to highlight the
4744     // button fine, but we're not able to hit the <Enter> key to
4745     // have that default function happen.  Note:  We _can_ hit the
4746     // <SPACE> key, and that activates the option.
4747 //        XmUpdateDisplay(gamma_adjust_dialog);
4748     XmProcessTraversal(button_close, XmTRAVERSE_CURRENT);
4749 
4750   }
4751   else
4752   {
4753     (void)XRaiseWindow(XtDisplay(gamma_adjust_dialog), XtWindow(gamma_adjust_dialog));
4754   }
4755 }
4756 #endif  // NO_GRAPHICS && HAVE_MAGICK
4757 
4758 
4759 
4760 
4761 
Load_station_font(void)4762 void Load_station_font(void)
4763 {
4764   // Assign a font (or a different font) to the GC
4765 
4766   // Free any old font first.  If we fail to assign a new font in
4767   // the code here, can we get in a sitation where we are trying
4768   // to draw without a font?
4769   if (station_font != NULL)
4770   {
4771     XFreeFont(XtDisplay(da), station_font);
4772   }
4773 
4774   // Load the new font from the FONT_STATION string
4775   station_font = (XFontStruct *)XLoadQueryFont(XtDisplay(da), rotated_label_fontname[FONT_STATION]);
4776 
4777   if (station_font == NULL)      // Couldn't get the font!!!
4778   {
4779     char tempy[100];
4780 
4781     fprintf(stderr,"Map_font_change_data: Couldn't load station font %s.  ",
4782             rotated_label_fontname[FONT_STATION]);
4783     fprintf(stderr,"Loading default station font instead.\n");
4784 
4785     strcpy(tempy, "Couldn't get font ");
4786     tempy[sizeof(tempy)-1] = '\0';  // Terminate string
4787     strcat(tempy, rotated_label_fontname[FONT_STATION]);
4788     tempy[sizeof(tempy)-1] = '\0';  // Terminate string
4789     strcat(tempy, ".  Loading default font instead.");
4790     tempy[sizeof(tempy)-1] = '\0';  // Terminate string
4791 
4792     popup_message_always(langcode("POPEM00035"), tempy);
4793 
4794     station_font = (XFontStruct *)XLoadQueryFont(XtDisplay(da), "fixed");
4795     if (station_font == NULL)      // Couldn't get the font!!!
4796     {
4797       fprintf(stderr,"Map_font_change_data: Couldn't load default station font.\n");
4798 
4799       popup_message_always(langcode("POPEM00035"),
4800                            "Couldn't load default station font.");
4801     }
4802   }
4803 
4804   // Assign the font to the GC.
4805   if (station_font != NULL)
4806   {
4807     XSetFont(XtDisplay(da), gc, station_font->fid);
4808   }
4809 }
4810 
4811 
4812 
4813 
4814 
4815 // chose map label font
Map_font_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))4816 void Map_font_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
4817 {
4818   Widget shell = (Widget) clientData;
4819 
4820   xfontsel_query = 0;
4821   XtPopdown(shell);
4822   XtDestroyWidget(shell);
4823   map_font_dialog = (Widget)NULL;
4824 }
4825 
4826 
4827 
4828 
4829 
4830 // Function called by UpdateTime when xfontsel_query is non-zero.
4831 // Checks the pipe to see if xfontsel has sent anything to us yet.
4832 // If we get anything from the read, we should wait a small amount
4833 // of time and try another read, to make sure we don't get a partial
4834 // read the first time and quit.
4835 //
Query_xfontsel_pipe(void)4836 void Query_xfontsel_pipe (void)
4837 {
4838   char xfontsel_font[FONT_MAX][sizeof(rotated_label_fontname[0])];
4839   struct timeval tmv;
4840   fd_set rd;
4841   int retval;
4842   int fd;
4843   int i;
4844 
4845   for (i = 0; i < FONT_MAX; i++)
4846   {
4847 
4848     //    if (fgets(xfontsel_font,sizeof(xfontsel_font),f_xfontsel_pipe)) {
4849 
4850     // Find out the file descriptor associated with our pipe.
4851     if (!f_xfontsel_pipe[i])
4852     {
4853       continue;
4854     }
4855     fd = fileno(f_xfontsel_pipe[i]);
4856 
4857     FD_ZERO(&rd);
4858     FD_SET(fd, &rd);
4859     tmv.tv_sec = 0;
4860     tmv.tv_usec = 1;    // 1 usec
4861 
4862     // Do a non-blocking check of the read end of the pipe.
4863     retval = select(fd+1,&rd,NULL,NULL,&tmv);
4864 
4865     //fprintf(stderr,"1\n");
4866 
4867     if (retval)
4868     {
4869       int l = strlen(xfontsel_font[i]);
4870 
4871       // We have something to process.  Wait a bit, then snag the
4872       // data.
4873       usleep(250000); // 250ms
4874 
4875       if (fgets(xfontsel_font[i],sizeof(xfontsel_font[0]),f_xfontsel_pipe[i]) == NULL)
4876       {
4877         // We hit end-of-file or there's an error reading
4878         // Do nothing here, which was the standard operation
4879         // prior to adding the check for the return value.
4880       }
4881 
4882       if (xfontsel_font[i][l-1] == '\n')
4883       {
4884         xfontsel_font[i][l-1] = '\0';
4885       }
4886       if (map_font_text[i] != NULL)
4887       {
4888         XmTextSetString(map_font_text[i], xfontsel_font[i]);
4889       }
4890       pclose(f_xfontsel_pipe[i]);
4891       f_xfontsel_pipe[i] = 0;
4892       //fprintf(stderr,"Resetting xfontset_query\n");
4893       xfontsel_query = 0;
4894     }
4895     else
4896     {
4897       // Read nothing.  Let UpdateTime run this function again
4898       // shortly.
4899     }
4900   }
4901 }
4902 
4903 
4904 
4905 
4906 
Map_font_xfontsel(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))4907 void Map_font_xfontsel(Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
4908 {
4909 
4910 #if defined(HAVE_XFONTSEL)
4911 
4912   int fontsize = XTPOINTER_TO_INT(clientData);
4913   char xfontsel[70];
4914 
4915   /* invoke xfontsel -print and stick into map_font_text */
4916   sprintf(xfontsel,
4917           "%s -print -title \"xfontsel %d\"",
4918           XFONTSEL_PATH,
4919           fontsize);
4920   if ((f_xfontsel_pipe[fontsize] = popen(xfontsel,"r")))
4921   {
4922 
4923     // Request UpdateTime to keep checking the pipe periodically
4924     // using non-blocking reads.
4925 //fprintf(stderr,"Setting xfontsel_query\n");
4926     xfontsel_query++;
4927 
4928   }
4929   else
4930   {
4931     perror("xfontsel");
4932   }
4933 #endif  // HAVE_XFONTSEL
4934 }
4935 
4936 
4937 
4938 
4939 
Map_font_change_data(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))4940 void Map_font_change_data(Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
4941 {
4942   char *temp;
4943   Widget shell = (Widget) clientData;
4944   int i;
4945 
4946 
4947   xfontsel_query = 0;
4948 
4949   for (i = 0; i < FONT_MAX; i++)
4950   {
4951     temp = XmTextGetString(map_font_text[i]);
4952 
4953     xastir_snprintf(rotated_label_fontname[i],
4954                     sizeof(rotated_label_fontname[i]),
4955                     "%s",
4956                     temp);
4957 
4958     XtFree(temp);
4959     XmTextSetString(map_font_text[i], rotated_label_fontname[i]);
4960   }
4961 
4962   // Load a new font into the GC for the station font
4963   Load_station_font();
4964 
4965   // Set interrupt_drawing_now because conditions have changed
4966   // (new map center).
4967   interrupt_drawing_now++;
4968 
4969   // Request that a new image be created.  Calls create_image,
4970   // XCopyArea, and display_zoom_status.
4971   request_new_image++;
4972 
4973   XtPopdown(shell);
4974   XtDestroyWidget(shell);
4975   map_font_dialog = (Widget)NULL;
4976 }
4977 
4978 
4979 
4980 
4981 
Map_font(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))4982 void Map_font(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
4983 {
4984   static Widget  pane, scrollwindow, my_form, fontname[FONT_MAX], button_ok,
4985          button_cancel,button_xfontsel[FONT_MAX];
4986   Atom delw;
4987   int i;
4988   Arg al[50];                 /* Arg List */
4989   register unsigned int ac = 0; /* Arg Count */
4990 
4991 
4992   if (!map_font_dialog)
4993   {
4994     map_font_dialog = XtVaCreatePopupShell(langcode("MAPFONT002"),
4995                                            xmDialogShellWidgetClass, appshell,
4996                                            XmNdeleteResponse,        XmDESTROY,
4997                                            XmNdefaultPosition,       FALSE,
4998                                            XmNfontList, fontlist1,
4999                                            NULL);
5000 
5001     pane = XtVaCreateWidget("Choose map labels font",
5002                             xmPanedWindowWidgetClass, map_font_dialog,
5003                             MY_FOREGROUND_COLOR,
5004                             MY_BACKGROUND_COLOR,
5005                             NULL);
5006 
5007     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
5008                                            xmScrolledWindowWidgetClass,
5009                                            pane,
5010                                            XmNscrollingPolicy, XmAUTOMATIC,
5011                                            NULL);
5012 
5013     my_form =  XtVaCreateWidget("Map font my_form",
5014                                 xmFormWidgetClass,
5015                                 scrollwindow,
5016                                 XmNfractionBase,    3,
5017                                 XmNautoUnmanage,    FALSE,
5018                                 XmNshadowThickness, 1,
5019                                 MY_FOREGROUND_COLOR,
5020                                 MY_BACKGROUND_COLOR,
5021                                 NULL);
5022 
5023     //        ac=0;
5024     //        XtSetArg(al[ac], XmNforeground, MY_FG_COLOR); ac++;
5025     //        XtSetArg(al[ac], XmNbackground, MY_BG_COLOR); ac++;
5026 
5027 
5028     for (i = 0; i < FONT_MAX; i++)
5029     {
5030       char *fonttitle[FONT_MAX] = {"MAPFONT009","MAPFONT010","MAPFONT003",
5031                                    "MAPFONT004","MAPFONT005","MAPFONT006",
5032                                    "MAPFONT007","MAPFONT008","MAPFONT011"
5033                                   };
5034       ac = 0;
5035       if (i == 0)
5036       {
5037         XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM);
5038         ac++;
5039         XtSetArg(al[ac], XmNtopOffset, 10);
5040         ac++;
5041       }
5042       else
5043       {
5044         XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET);
5045         ac++;
5046         XtSetArg(al[ac], XmNtopWidget, fontname[i-1]);
5047         ac++;
5048       }
5049       XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE);
5050       ac++;
5051       XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM);
5052       ac++;
5053       XtSetArg(al[ac], XmNleftOffset, 5);
5054       ac++;
5055       XtSetArg(al[ac], XmNwidth, 150);
5056       ac++;
5057       XtSetArg(al[ac], XmNheight, 40);
5058       ac++;
5059       XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE);
5060       ac++;
5061       XtSetArg(al[ac], XmNforeground,colors[0x08]);
5062       ac++;
5063       XtSetArg(al[ac], XmNbackground,colors[0xff]);
5064       ac++;
5065       XtSetArg(al[ac], XmNfontList, fontlist1);
5066       ac++;
5067       fontname[i] = XtCreateManagedWidget(langcode(fonttitle[i]),
5068                                           xmLabelWidgetClass,
5069                                           my_form,
5070                                           al, ac);
5071       ac = 0;
5072       if (i == 0)
5073       {
5074         XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM);
5075         ac++;
5076         XtSetArg(al[ac], XmNtopOffset, 10);
5077         ac++;
5078       }
5079       else
5080       {
5081         XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET);
5082         ac++;
5083         XtSetArg(al[ac], XmNtopWidget, map_font_text[i-1]);
5084         ac++;
5085       }
5086       XtSetArg(al[ac], XmNeditable,              TRUE);
5087       ac++;
5088       XtSetArg(al[ac], XmNcursorPositionVisible, TRUE);
5089       ac++;
5090       XtSetArg(al[ac], XmNsensitive,             TRUE);
5091       ac++;
5092       XtSetArg(al[ac], XmNshadowThickness,       1);
5093       ac++;
5094       XtSetArg(al[ac], XmNcolumns,               60);
5095       ac++;
5096       XtSetArg(al[ac], XmNwidth,                 (60*7)+2);
5097       ac++;
5098       XtSetArg(al[ac], XmNmaxLength,             128);
5099       ac++;
5100       XtSetArg(al[ac], XmNbackground,            colors[0x0f]);
5101       ac++;
5102       XtSetArg(al[ac], XmNbottomAttachment,XmATTACH_NONE);
5103       ac++;
5104       XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET);
5105       ac++;
5106       XtSetArg(al[ac], XmNleftWidget, fontname[i]);
5107       ac++;
5108       XtSetArg(al[ac], XmNleftOffset, 10);
5109       ac++;
5110       XtSetArg(al[ac], XmNheight, 40);
5111       ac++;
5112       XtSetArg(al[ac], XmNrightAttachment,XmATTACH_NONE);
5113       ac++;
5114       XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
5115       ac++;
5116       XtSetArg(al[ac], XmNtraversalOn, TRUE);
5117       ac++;
5118       XtSetArg(al[ac], XmNfontList, fontlist1);
5119       ac++;
5120       map_font_text[i] = XtCreateManagedWidget("Map font text",
5121                          xmTextFieldWidgetClass, my_form,
5122                          al, ac);
5123 
5124       XmTextSetString(map_font_text[i], rotated_label_fontname[i]);
5125 
5126       // Xfontsel
5127       ac = 0;
5128       if (i == 0)
5129       {
5130         XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM);
5131         ac++;
5132         XtSetArg(al[ac], XmNtopOffset, 10);
5133         ac++;
5134       }
5135       else
5136       {
5137         XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET);
5138         ac++;
5139         XtSetArg(al[ac], XmNtopWidget, button_xfontsel[i-1]);
5140         ac++;
5141       }
5142       XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE);
5143       ac++;
5144       XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET);
5145       ac++;
5146       XtSetArg(al[ac], XmNleftWidget, map_font_text[i]);
5147       ac++;
5148       XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM);
5149       ac++;
5150       XtSetArg(al[ac], XmNrightOffset, 10);
5151       ac++;
5152       XtSetArg(al[ac], XmNheight, 40);
5153       ac++;
5154       XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
5155       ac++;
5156       XtSetArg(al[ac], XmNforeground,colors[0x08]);
5157       ac++;
5158       XtSetArg(al[ac], XmNbackground,colors[0xff]);
5159       ac++;
5160       XtSetArg(al[ac], XmNfontList, fontlist1);
5161       ac++;
5162       button_xfontsel[i] = XtCreateManagedWidget(langcode("PULDNMP015"),
5163                            xmPushButtonGadgetClass, my_form,
5164                            al,ac);
5165 
5166 #if defined(HAVE_XFONTSEL)
5167       XtSetSensitive(button_xfontsel[i],TRUE);
5168 #else   // HAVE_FONTSEL
5169       XtSetSensitive(button_xfontsel[i],FALSE);
5170 #endif  // HAVE_FONTSEL
5171 
5172       XtAddCallback(button_xfontsel[i],
5173                     XmNactivateCallback,
5174                     Map_font_xfontsel,
5175                     INT_TO_XTPOINTER(i) );
5176 
5177     }
5178     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
5179                                         xmPushButtonGadgetClass, my_form,
5180                                         XmNtopAttachment,        XmATTACH_WIDGET,
5181                                         XmNtopWidget,            map_font_text[FONT_MAX-1],
5182                                         XmNtopOffset,            10,
5183                                         XmNbottomAttachment,     XmATTACH_FORM,
5184                                         XmNbottomOffset,         5,
5185                                         XmNleftAttachment,       XmATTACH_POSITION,
5186                                         XmNleftPosition,         1,
5187                                         XmNrightAttachment,      XmATTACH_POSITION,
5188                                         XmNrightPosition,        2,
5189                                         XmNnavigationType,       XmTAB_GROUP,
5190                                         MY_FOREGROUND_COLOR,
5191                                         MY_BACKGROUND_COLOR,
5192                                         XmNfontList, fontlist1,
5193                                         NULL);
5194 
5195     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
5196                                             xmPushButtonGadgetClass, my_form,
5197                                             XmNtopAttachment,        XmATTACH_WIDGET,
5198                                             XmNtopWidget,            map_font_text[FONT_MAX-1],
5199                                             XmNtopOffset,            10,
5200                                             XmNbottomAttachment,     XmATTACH_FORM,
5201                                             XmNbottomOffset,         5,
5202                                             XmNleftAttachment,       XmATTACH_POSITION,
5203                                             XmNleftPosition,         2,
5204                                             XmNrightAttachment,      XmATTACH_POSITION,
5205                                             XmNrightPosition,        3,
5206                                             XmNnavigationType,       XmTAB_GROUP,
5207                                             XmNtraversalOn, TRUE,
5208                                             MY_FOREGROUND_COLOR,
5209                                             MY_BACKGROUND_COLOR,
5210                                             XmNfontList, fontlist1,
5211                                             NULL);
5212 
5213     XtAddCallback(button_ok,
5214                   XmNactivateCallback, Map_font_change_data,   map_font_dialog);
5215     XtAddCallback(button_cancel,
5216                   XmNactivateCallback, Map_font_destroy_shell, map_font_dialog);
5217 
5218     pos_dialog(map_font_dialog);
5219 
5220     delw = XmInternAtom(XtDisplay(map_font_dialog), "WM_DELETE_WINDOW", FALSE);
5221     XmAddWMProtocolCallback(map_font_dialog,
5222                             delw, Map_font_destroy_shell, (XtPointer)map_font_dialog);
5223 
5224     XtManageChild(my_form);
5225     XtManageChild(pane);
5226 
5227     resize_dialog(my_form, map_font_dialog);
5228 
5229     XtPopup(map_font_dialog, XtGrabNone);
5230 
5231     // Move focus to the Close button.  This appears to highlight the
5232     // button fine, but we're not able to hit the <Enter> key to
5233     // have that default function happen.  Note:  We _can_ hit the
5234     // <SPACE> key, and that activates the option.
5235 //        XmUpdateDisplay(map_font_dialog);
5236     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
5237 
5238   }
5239   else
5240   {
5241     (void)XRaiseWindow(XtDisplay(map_font_dialog), XtWindow(map_font_dialog));
5242   }
5243 }
5244 
5245 
5246 
5247 
5248 
5249 // Used by view_gps_status() function below.  We must either expire
5250 // this data or associate a time with it on the display.
5251 char gps_status_save[100];
5252 time_t gps_status_save_time = 0;
5253 
5254 
5255 
5256 
5257 
report_gps_status(void)5258 char *report_gps_status(void)
5259 {
5260   static char gps_temp[100];
5261   char temp2[20];
5262 
5263   switch (gps_valid)
5264   {
5265 
5266     case 8: // Simulation Mode
5267       xastir_snprintf(temp2,
5268                       sizeof(temp2),
5269                       "%s",
5270                       langcode("GPSS008") );  // "Simulation"
5271       break;
5272 
5273     case 7: // Manual Input Mode
5274       xastir_snprintf(temp2,
5275                       sizeof(temp2),
5276                       "%s",
5277                       langcode("GPSS009") );  // "Manual"
5278       break;
5279 
5280     case 6: // Estimated Fix (dead reckoning)
5281       xastir_snprintf(temp2,
5282                       sizeof(temp2),
5283                       "%s",
5284                       langcode("GPSS010") );  // "Estimated"
5285       break;
5286 
5287     case 5: // Float RTK
5288       xastir_snprintf(temp2,
5289                       sizeof(temp2),
5290                       "%s",
5291                       langcode("GPSS011") );  // "Float RTK"
5292       break;
5293 
5294     case 4: // RTK
5295       xastir_snprintf(temp2,
5296                       sizeof(temp2),
5297                       "%s",
5298                       langcode("GPSS012") );  // "RTK"
5299       break;
5300 
5301     case 3: // WAAS or PPS Fix
5302       xastir_snprintf(temp2,
5303                       sizeof(temp2),
5304                       "%s",
5305                       langcode("GPSS001") );  // "WAAS or PPS"
5306       break;
5307 
5308     case 2: // DGPS Fix
5309       xastir_snprintf(temp2,
5310                       sizeof(temp2),
5311                       "%s",
5312                       langcode("GPSS002") );  // "DGPS"
5313       break;
5314 
5315     case 1: // Valid SPS Fix
5316       xastir_snprintf(temp2,
5317                       sizeof(temp2),
5318                       "%s",
5319                       langcode("GPSS003") );  // "Valid SPS"
5320       break;
5321 
5322     case 0: // Invalid
5323     default:
5324       xastir_snprintf(temp2,
5325                       sizeof(temp2),
5326                       "%s",
5327                       langcode("GPSS004") );  // "Invalid"
5328       break;
5329   }
5330 
5331   xastir_snprintf(gps_temp,
5332                   sizeof(gps_temp),
5333                   "%s:%s %s:%s",
5334                   langcode("GPSS005"),    // "Sats/View"
5335                   gps_sats,
5336                   langcode("GPSS006"),    // "Fix"
5337                   temp2);
5338 
5339   // Save it in global variable in case we request status via the
5340   // menus.
5341   xastir_snprintf(gps_status_save,
5342                   sizeof(gps_status_save),
5343                   "%s",
5344                   gps_temp);
5345 
5346   gps_status_save_time = sec_now();
5347 
5348   // Reset the variables.
5349   xastir_snprintf(gps_sats, sizeof(gps_sats), "00");
5350   gps_valid = 0;
5351 
5352   return(gps_temp);
5353 }
5354 
5355 
5356 
5357 
5358 
view_gps_status(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))5359 void view_gps_status(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
5360 {
5361 
5362   // GPS status data too old?
5363   if ((gps_status_save_time + 30) >= sec_now())
5364   {
5365     // Nope, within 30 seconds
5366     popup_message_always(langcode("PULDNVI015"),
5367                          gps_status_save);
5368   }
5369   else
5370   {
5371     // Yes, GPS status data is old
5372     popup_message_always(langcode("PULDNVI015"),
5373                          langcode("GPSS007") );
5374     // "!GPS data is older than 30 seconds!"
5375   }
5376 }
5377 
5378 
5379 
5380 
5381 
Compute_Uptime(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))5382 void Compute_Uptime(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
5383 {
5384   char temp[200];
5385   unsigned long runtime;
5386   int days, hours, minutes, seconds;
5387   char Days[6];
5388   char Hours[7];
5389   char Minutes[9];
5390   char Seconds[9];
5391 
5392   runtime = sec_now() - program_start_time;
5393   days = runtime / 86400;
5394   runtime = runtime - (days * 86400);
5395   hours = runtime / 3600;
5396   runtime = runtime - (hours * 3600);
5397   minutes = runtime / 60;
5398   seconds = runtime - (minutes * 60);
5399 
5400   if (days == 1)
5401   {
5402     xastir_snprintf(Days,sizeof(Days),"%s",langcode("TIME001"));  // Day
5403   }
5404   else
5405   {
5406     xastir_snprintf(Days,sizeof(Days),"%s",langcode("TIME002"));  // Days
5407   }
5408 
5409 
5410   if (hours == 1)
5411   {
5412     xastir_snprintf(Hours,sizeof(Hours),"%s",langcode("TIME003"));  // Hour
5413   }
5414   else
5415   {
5416     xastir_snprintf(Hours,sizeof(Hours),"%s",langcode("TIME004"));  // Hours
5417   }
5418 
5419 
5420   if (minutes == 1)
5421   {
5422     xastir_snprintf(Minutes,sizeof(Minutes),"%s",langcode("TIME005"));  // Minute
5423   }
5424   else
5425   {
5426     xastir_snprintf(Minutes,sizeof(Minutes),"%s",langcode("TIME006"));  // Minutes
5427   }
5428 
5429 
5430   if (seconds == 1)
5431   {
5432     xastir_snprintf(Seconds,sizeof(Seconds),"%s",langcode("TIME007"));  // Second
5433   }
5434   else
5435   {
5436     xastir_snprintf(Seconds,sizeof(Seconds),"%s",langcode("TIME008"));  // Seconds
5437   }
5438 
5439 
5440   if (days != 0)
5441   {
5442     xastir_snprintf(temp, sizeof(temp), "%d %s, %d %s, %d %s, %d %s",
5443                     days, Days, hours, Hours, minutes, Minutes, seconds, Seconds);
5444   }
5445   else if (hours != 0)
5446   {
5447     xastir_snprintf(temp, sizeof(temp), "%d %s, %d %s, %d %s",
5448                     hours, Hours, minutes, Minutes, seconds, Seconds);
5449   }
5450   else if (minutes != 0)
5451   {
5452     xastir_snprintf(temp, sizeof(temp), "%d %s, %d %s", minutes, Minutes, seconds, Seconds);
5453   }
5454   else
5455   {
5456     xastir_snprintf(temp, sizeof(temp), "%d %s", seconds, Seconds);
5457   }
5458   popup_message_always(langcode("PULDNVI014"),temp);
5459 }
5460 
5461 
5462 
5463 
5464 
Mouse_button_handler(Widget UNUSED (w),Widget UNUSED (popup),XButtonEvent * event,Boolean * UNUSED (dispatch))5465 void Mouse_button_handler (Widget UNUSED(w), Widget UNUSED(popup), XButtonEvent *event, Boolean * UNUSED(dispatch) )
5466 {
5467 
5468   // Snag the current pointer position
5469   input_x = event->x;
5470   input_y = event->y;
5471 
5472   if (event->type == ButtonPress)
5473   {
5474     //fprintf(stderr,"Mouse_button_handler, button pressed %d\n", event->button);
5475   }
5476 
5477   if (event->type == ButtonRelease)
5478   {
5479     //fprintf(stderr,"Mouse_button_handler, button released %d\n", event->button);
5480     return;
5481   }
5482 
5483 #ifdef SWAP_MOUSE_BUTTONS
5484   if (event->button != Button1)
5485   {
5486     //fprintf(stderr,"Pressed a mouse button, but not Button1: %x\n",event->button);
5487 #else   // SWAP_MOUSE_BUTTONS
5488   if (event->button != Button3)
5489   {
5490     //fprintf(stderr,"Pressed a mouse button, but not Button3: %x\n",event->button);
5491 #endif  // SWAP_MOUSE_BUTTONS
5492     return;
5493   }
5494 
5495   // Right mouse button press
5496   menu_x=input_x;
5497   menu_y=input_y;
5498   if (right_menu_popup != NULL)   // If popup menu defined
5499   {
5500 
5501 #ifdef SWAP_MOUSE_BUTTONS
5502     // This gets the menus out of the way that are on pointer
5503     // button1 if SWAP_MOUSE_BUTTONS is enabled.  If it's not
5504     // enabled, they don't interfere with each other anyway.
5505     if (!measuring_distance && !moving_object)
5506     {
5507 #else   // SWAP_MOUSE_BUTTONS
5508     if (1)      // Always bring up the menu if SWAP is disabled
5509     {
5510 #endif  // SWAP_MOUSE_BUTTONS
5511 
5512       // Bring up the popup menu
5513       XmMenuPosition(right_menu_popup,(XButtonPressedEvent *)event);
5514       XtManageChild(right_menu_popup);
5515 
5516       // Check whether any modifiers are pressed.
5517       // If so, pop up a warning message.
5518       if ( (event->state != 0) && warn_about_mouse_modifiers)
5519       {
5520         popup_message_always(langcode("POPUPMA023"),langcode("POPUPMA024"));
5521       }
5522     }
5523   }
5524 }
5525 
5526 
5527 
5528 
5529 
5530 void menu_link_for_mouse_menu(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
5531 {
5532   if (right_menu_popup!=NULL)
5533   {
5534     //XmMenuPosition(right_menu_popup,(XButtonPressedEvent *)event);
5535     XtManageChild(right_menu_popup);
5536   }
5537 }
5538 
5539 
5540 
5541 
5542 
5543 void store_all_kml_callback(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
5544 {
5545   export_trail_as_kml(NULL);
5546   last_kmlsnapshot = sec_now();
5547 }
5548 
5549 
5550 
5551 
5552 void KML_Snapshots_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
5553 {
5554   char *which = (char *)clientData;
5555   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
5556 
5557   // Whether we're setting or unsetting it, set the timer such
5558   // that a snapshot will occur immediately once the button is set
5559   // again.
5560   last_kmlsnapshot = 0;
5561 
5562   if(state->set)
5563   {
5564     kmlsnapshots_enabled = atoi(which);
5565   }
5566   else
5567   {
5568     kmlsnapshots_enabled = 0;
5569   }
5570 }
5571 
5572 
5573 
5574 
5575 
5576 void Snapshots_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
5577 {
5578   char *which = (char *)clientData;
5579   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
5580 
5581   // Whether we're setting or unsetting it, set the timer such
5582   // that a snapshot will occur immediately once the button is set
5583   // again.
5584   last_snapshot = 0;
5585 
5586   if(state->set)
5587   {
5588     snapshots_enabled = atoi(which);
5589   }
5590   else
5591   {
5592     snapshots_enabled = 0;
5593   }
5594 }
5595 
5596 
5597 
5598 
5599 
5600 static inline int no_data_selected(void)
5601 {
5602   return (
5603            Select_.none || (
5604              !Select_.mine &&
5605              !Select_.net  && (
5606                !Select_.tnc || (
5607                  !Select_.direct && !Select_.via_digi
5608                )
5609              )
5610            )
5611          );
5612 }
5613 
5614 
5615 
5616 
5617 
5618 #ifdef ARROWS
5619   Widget pan_up_menu, pan_down_menu,
5620   pan_left_menu, pan_right_menu,
5621   zoom_in_menu, zoom_out_menu;
5622 #endif // ARROWS
5623 
5624 
5625 
5626 
5627 
5628 void create_appshell( Display *display, char * UNUSED(app_name), int UNUSED(app_argc), char ** UNUSED(app_argv) )
5629 {
5630   Pixmap icon_pixmap;
5631   Atom WM_DELETE_WINDOW;
5632   Widget children[9];         /* Children to manage */
5633   Arg al[100];                 /* Arg List */
5634   register unsigned int ac;   /* Arg Count */
5635   /*popup menu widgets */
5636   Widget zoom_in, zoom_out, zoom_sub, zl1, zl2, zl3,
5637          zl4, zl5, zl6, zl7, zl8, zl9, zlC;
5638 //  Widget zoom_level;
5639 //  Widget sar_object_menu;
5640   Widget CAD_sub, CAD1, CAD3, CAD4;
5641   Widget pan_sub;
5642 //  Widget pan_menu;
5643   Widget move_my_sub;
5644 //  Widget move_my_menu;
5645   Widget pan_ctr, last_loc, station_info, send_message_to;
5646   Widget set_object, modify_object;
5647   Widget setmyposition, pan_up, pan_down, pan_left, pan_right;
5648   /*menu widgets */
5649   Widget sep;
5650   Widget filepane, configpane, mappane, viewpane,
5651          stationspane, messagepane, ifacepane, helppane,
5652          filter_data_pane, filter_display_pane, map_config_pane,
5653          station_config_pane,
5654          help_emergency_pane;
5655 //  Widget exitpane,
5656 //      help_emergency_button,
5657 //      display_button,
5658 //      file_button,
5659 //      view_button,
5660 //      config_button,
5661 //      map_button,
5662 //      map_background_button,
5663 //      map_config_button,
5664 //      station_config_button,
5665 //      raster_intensity_button,
5666 //      map_station_label_button,
5667 //      map_icon_outline_button,
5668 //      iface_button,
5669 //      message_button,
5670 //      filter_data_button,
5671 //      filter_display_button,
5672 //      draw_CAD_objects_menu,
5673 //      store_data_button;
5674 
5675   Widget track_button, download_trail_button, station_clear_button,
5676          tracks_clear_button, object_history_refresh_button,
5677          object_history_clear_button, tactical_clear_button,
5678          tactical_history_clear_button, uptime_button, aloha_button,
5679          save_button,
5680          open_file_button, exit_button,
5681          view_messages_button, gps_status_button,
5682          bullet_button, packet_data_button, mobile_button,
5683          stations_button, localstations_button, laststations_button,
5684          objectstations_button, objectmystations_button,
5685          weather_button, wx_station_button, locate_button, geocode_place_button,
5686          locate_place_button, jump_button, jump_button2, alert_button,
5687          defaults_button, timing_button,
5688          coordinates_button, station_button, map_lock_pan_zoom_button, map_disable_button,
5689          map_auto_button, map_chooser_button,
5690          map_grid_button, map_levels_button, map_labels_button,
5691          map_fill_button, coordinate_calculator_button,
5692          center_zoom_button,
5693          Map_background_color_Pane,
5694          map_pointer_menu_button,
5695          cad_draw_button, cad_show_label_button,
5696          cad_show_probability_button, cad_show_area_button,
5697          cad_show_comment_button,
5698 #if !defined(NO_GRAPHICS)
5699          Raster_intensity_Pane,
5700 #if defined(HAVE_MAGICK)
5701          gamma_adjust_button,
5702 #endif  // HAVE_MAGICK
5703 #ifdef HAVE_LIBGEOTIFF
5704          drg_config_button,
5705 #endif  // HAVE_LIBGEOTIFF
5706 #endif  // NO_GRAPHICS
5707          font_button,
5708          Map_station_label_Pane,
5709          Map_icon_outline_Pane,
5710          map_wx_alerts_button, index_maps_on_startup_button,
5711          redownload_maps_button, flush_map_cache_button,
5712          units_choice_button, dbstatus_choice_button,
5713          iface_connect_button,
5714          tnc_logging, transmit_disable_toggle, net_logging,
5715          igate_logging, wx_logging, message_logging,
5716          wx_alert_logging, enable_snapshots, print_button,
5717          test_button, debug_level_button, aa_button, speech_button,
5718          smart_beacon_button, map_indexer_button,
5719          map_all_indexer_button, auto_msg_set_button,
5720          send_message_to_button,
5721          show_pending_messages_button, enable_kmlsnapshots,
5722          open_messages_group_button, clear_messages_button,
5723          General_q_button, IGate_q_button, WX_q_button,
5724          store_data_pane, store_all_kml_button,
5725 #ifdef HAVE_DB
5726          store_all_db_button,
5727 #endif  // HAVE_DB
5728          help_button, help_about, help_help;
5729 
5730   char *title, *t;
5731   int t_size;
5732 //    XWMHints *wm_hints; // Used for window manager hints
5733   Dimension my_appshell_width, my_appshell_height;
5734   Dimension da_width, da_height;
5735   static XmFontListEntry font_entry;
5736 
5737 
5738   if(debug_level & 8)
5739   {
5740     fprintf(stderr,"Create appshell start\n");
5741   }
5742 
5743   /*
5744       wm_hints = XAllocWMHints();
5745       if (!wm_hints) {
5746           fprintf(stderr,"Failure allocating memory: wm_hints\n");
5747           exit(0);
5748       }
5749 
5750       // Set up the wm_hints struct
5751       wm_hints->initial_state = NormalState;
5752       wm_hints->input = True;
5753       wm_hints->flags = StateHint | InputHint;
5754   */
5755 
5756 
5757   t = "X Amateur Station Tracking and Information Reporting";
5758   title = (char *)malloc(t_size = (strlen(t) + 42 + strlen(xastir_package)));
5759   if (!title)
5760   {
5761     fprintf(stderr,"Couldn't allocate memory for title\n");
5762   }
5763   else
5764   {
5765     xastir_snprintf(title, t_size, "XASTIR");
5766     strncat(title, " - ", t_size - 1 - strlen(title));
5767     strncat(title, t, t_size - 1 - strlen(title));
5768     strncat(title, " @ ", t_size - 1 - strlen(title));
5769     (void)gethostname(&title[strlen(title)], 28);
5770   }
5771 
5772   // Allocate a couple of colors that we'll need before we get
5773   // around to calling create_gc(), which creates the rest.
5774   //
5775   colors[0x08] = GetPixelByName(appshell,"black");
5776   colors[0x0c] = GetPixelByName(appshell,"red");
5777   colors[0xff] = GetPixelByName(appshell,"gray73");
5778 
5779 
5780   ac = 0;
5781 
5782 
5783 
5784 // Snag border widths so that we can use them in the calculations
5785 // below.  If we fail to do this the size and offsets will be off by
5786 // the width of the borders added by the window manager.
5787 //
5788 // if (XGetGeometry(XtDisplay(da),
5789 //     XtWindow(appshell),
5790 //     &root_return,
5791 //     &x_return,
5792 //     &y_return,
5793 //     &width_return,
5794 //     &height_return,
5795 //     &border_width_return,
5796 //     &depth_return) ) == False) {
5797 //     fprintf(stderr,"Couldn't get window attributes\n");
5798 // }
5799 //
5800 // Another method:
5801 //
5802 // XWindowAttributes windowattr; // Defined in Xlib.h
5803 // Struct has x/y/width/height/border_width/depth fields.
5804 // if (XGetWindowAttributes(display,XtWindow(appshell),&windowattr) == 0) {
5805 //     fprintf(stderr,"Couldn't get window attributes\n")
5806 // }
5807 
5808 
5809 
5810   // Set up the main window X/Y sizes and the minimum sizes
5811   // allowable.
5812   //
5813   if ( (WidthValue|HeightValue) & geometry_flags )
5814   {
5815     //
5816     // Size of Xastir was specified with a -geometry setting.
5817     // Set up the window size.
5818     //
5819 
5820     my_appshell_width = (Dimension)geometry_width; // Used in offset equations below
5821     my_appshell_height = (Dimension)geometry_height; // Used in offset equations below
5822 //fprintf(stderr,"gW:%d  gH:%d\n", geometry_width, geometry_height);
5823 //fprintf(stderr,"tW:%d  tH:%d\n", (int)my_appshell_width, (int)my_appshell_height);
5824     if (my_appshell_width < 61)
5825     {
5826       my_appshell_width = 61;
5827     }
5828     if (my_appshell_height < 61)
5829     {
5830       my_appshell_height = 61;
5831     }
5832 //fprintf(stderr,"tW:%d  tH:%d\n", (int)my_appshell_width, (int)my_appshell_height);
5833     XtSetArg(al[ac], XmNwidth,  my_appshell_width);
5834     ac++;
5835     XtSetArg(al[ac], XmNheight, my_appshell_height);
5836     ac++;
5837 //        XtSetArg(al[ac], XmNminWidth,         61);             ac++;
5838 //        XtSetArg(al[ac], XmNminHeight,        61);             ac++;
5839 // Lock the min size to the specified initial size for now, release
5840 // later after creating initial window.  Snagged this idea from the
5841 // Lincity project where they do similar things in "lcx11.c"
5842 //        XtSetArg(al[ac], XmNminWidth,  my_appshell_width);  ac++;
5843 //        XtSetArg(al[ac], XmNminHeight, my_appshell_height); ac++;
5844   }
5845   else
5846   {
5847     // Size was NOT specified in a -geometry string.  Set to the
5848     // size specified in the config file instead.
5849     //
5850     my_appshell_width = (Dimension)screen_width;
5851     my_appshell_height = (Dimension)(screen_height + 60);
5852     XtSetArg(al[ac], XmNwidth,  my_appshell_width);
5853     ac++;
5854     XtSetArg(al[ac], XmNheight, my_appshell_height);
5855     ac++;
5856 //        XtSetArg(al[ac], XmNminWidth,         61);             ac++;
5857 //        XtSetArg(al[ac], XmNminHeight,        61);             ac++;
5858 // Lock the min size to the specified initial size for now, release
5859 // later after creating initial window.  Got this idea from the
5860 // Lincity project where they do the similar things in "lcx11.c"
5861 //        XtSetArg(al[ac], XmNminWidth,  my_appshell_width);  ac++;
5862 //        XtSetArg(al[ac], XmNminHeight, my_appshell_height); ac++;
5863   }
5864 
5865 
5866 // Set up default font
5867   font1 = XLoadQueryFont(display, rotated_label_fontname[FONT_SYSTEM]);
5868 
5869   if (font1 == NULL)      // Couldn't get the font!!!
5870   {
5871     fprintf(stderr,"create_appshell: Couldn't load system font %s.  ",
5872             rotated_label_fontname[FONT_SYSTEM]);
5873     fprintf(stderr,"Loading default system font instead.\n");
5874     font1 = XLoadQueryFont(display, "fixed");
5875     if (font1 == NULL)      // Couldn't get the font!!!
5876     {
5877       fprintf(stderr,"create_appshell: Couldn't load default system font, exiting.\n");
5878       exit(1);
5879     }
5880     else
5881     {
5882       // _Now_ we can do a popup message about the first error
5883       // as we have a font to work with!
5884       char tempy[100];
5885 
5886       strcpy(tempy, "Couldn't get font ");
5887       tempy[sizeof(tempy)-1] = '\0';  // Terminate string
5888       strcat(tempy, rotated_label_fontname[FONT_SYSTEM]);
5889       tempy[sizeof(tempy)-1] = '\0';  // Terminate string
5890       strcat(tempy, ".  Loading default font instead.");
5891       tempy[sizeof(tempy)-1] = '\0';  // Terminate string
5892 
5893       popup_message_always(langcode("POPEM00035"), tempy);
5894     }
5895   }
5896 
5897   font_entry = XmFontListEntryCreate(XmFONTLIST_DEFAULT_TAG, XmFONT_IS_FONT, font1);
5898   fontlist1 = XmFontListAppendEntry(NULL, font_entry);
5899   XmFontListEntryFree(&font_entry);
5900   XtSetArg(al[ac], XmNfontList, fontlist1);
5901   ac++;
5902 
5903 
5904   // Set up the X/Y offsets for the main window
5905   //
5906   if ( (XValue|YValue) & geometry_flags )
5907   {
5908     Position my_x, my_y;
5909 
5910     //
5911     // Position of Xastir was specified with a -geometry setting.
5912     //
5913     if (XNegative & geometry_flags)
5914     {
5915       geometry_x = DisplayWidth(display, DefaultScreen(display) )
5916                    + geometry_x - (int)my_appshell_width;
5917     }
5918     if (YNegative & geometry_flags)
5919     {
5920       geometry_y = DisplayHeight(display, DefaultScreen(display) )
5921                    + geometry_y - (int)my_appshell_height;
5922     }
5923     my_x = (Position)geometry_x;
5924     my_y = (Position)geometry_y;
5925     XtSetArg(al[ac], XmNx, my_x);
5926     ac++;
5927     XtSetArg(al[ac], XmNy, my_y);
5928     ac++;
5929   }
5930   else
5931   {
5932     //
5933     // Position of Xastir was not specified.  Use the values
5934     // from the config file
5935     //
5936     /*
5937     // This doesn't position the widget in fvwm2.  Would hate to go back
5938     // to XSizeHints in order to make this work.
5939     fprintf(stderr,"Setting up widget's X/Y position at X:%d  Y:%d\n",
5940         (int)screen_x_offset,
5941         (int)screen_y_offset);
5942 
5943             XtSetArg(al[ac], XmNx, screen_x_offset); ac++;  // Doesn't work here
5944             XtSetArg(al[ac], XmNy, screen_y_offset); ac++;  // Doesn't work here
5945     */
5946   }
5947 
5948 
5949   XtSetArg(al[ac], XmNallowShellResize, TRUE);
5950   ac++;
5951 
5952   if (title)
5953   {
5954     XtSetArg(al[ac], XmNtitle,        title);
5955   }
5956   ac++;
5957 
5958   XtSetArg(al[ac], XmNdefaultPosition,  FALSE);
5959   ac++;
5960   XtSetArg(al[ac], XmNfontList,         fontlist1);
5961   ac++;
5962   XtSetArg(al[ac], XmNforeground,       MY_FG_COLOR);
5963   ac++;
5964   XtSetArg(al[ac], XmNbackground,       MY_BG_COLOR);
5965   ac++;
5966   //
5967   // Set the above values into the appshell widget
5968   //
5969   XtSetValues(appshell, al, ac);
5970 
5971 
5972   // Make at least one Motif call so that the next function won't
5973   // result in this problem:  'Error: atttempt to add non-widget
5974   // child "DropSiteManager" to parent "xastir"'.
5975   //
5976   (void) XmIsMotifWMRunning(appshell);
5977 
5978 
5979   form = XtVaCreateWidget("create_appshell form",
5980                           xmFormWidgetClass,
5981                           appshell,
5982                           MY_FOREGROUND_COLOR,
5983                           MY_BACKGROUND_COLOR,
5984                           NULL);
5985 
5986 
5987   /* Menu Bar */
5988   ac = 0;
5989   XtSetArg(al[ac], XmNshadowThickness, 1);
5990   ac++;
5991   XtSetArg(al[ac], XmNalignment,       XmALIGNMENT_BEGINNING);
5992   ac++;
5993   XtSetArg(al[ac], XmNleftAttachment,  XmATTACH_FORM);
5994   ac++;
5995   XtSetArg(al[ac], XmNtopAttachment,   XmATTACH_FORM);
5996   ac++;
5997   XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE);
5998   ac++;
5999   XtSetArg(al[ac], XmNbottomAttachment,XmATTACH_NONE);
6000   ac++;
6001   XtSetArg(al[ac], XmNforeground,      MY_FG_COLOR);
6002   ac++;
6003   XtSetArg(al[ac], XmNbackground,      MY_BG_COLOR);
6004   ac++;
6005   XtSetArg(al[ac], XmNfontList,        fontlist1);
6006   ac++;
6007 
6008 
6009   menubar = XmCreateMenuBar(form,
6010                             "create_appshell menubar",
6011                             al,
6012                             ac);
6013 
6014   /*set args for color */
6015   ac = 0;
6016   XtSetArg(al[ac], XmNforeground,   MY_FG_COLOR);
6017   ac++;
6018   XtSetArg(al[ac], XmNbackground,   MY_BG_COLOR);
6019   ac++;
6020   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
6021   ac++;
6022   XtSetArg(al[ac], XmNfontList,     fontlist1);
6023   ac++;
6024 
6025 
6026   /* menu bar */
6027   filepane    = XmCreatePulldownMenu(menubar,"filepane",    al, ac);
6028   viewpane    = XmCreatePulldownMenu(menubar,"viewpane",    al, ac);
6029   mappane     = XmCreatePulldownMenu(menubar,"mappane",     al, ac);
6030   stationspane= XmCreatePulldownMenu(menubar,"stationspane",al, ac);
6031   messagepane = XmCreatePulldownMenu(menubar,"messagepane", al, ac);
6032   ifacepane   = XmCreatePulldownMenu(menubar,"ifacepane",   al, ac);
6033   helppane    = XmCreatePulldownMenu(menubar,"helppane",    al, ac);
6034 
6035   //file_button
6036   XtVaCreateManagedWidget(langcode("MENUTB0001"),
6037                           xmCascadeButtonGadgetClass,
6038                           menubar,
6039                           XmNsubMenuId, filepane,
6040                           XmNmnemonic,langcode_hotkey("MENUTB0001"),
6041                           XmNfontList, fontlist1,
6042                           MY_FOREGROUND_COLOR,
6043                           MY_BACKGROUND_COLOR,
6044                           NULL);
6045   //view_button
6046   XtVaCreateManagedWidget(langcode("MENUTB0002"),
6047                           xmCascadeButtonGadgetClass,
6048                           menubar,
6049                           XmNsubMenuId,viewpane,
6050                           XmNmnemonic,langcode_hotkey("MENUTB0002"),
6051                           XmNfontList, fontlist1,
6052                           MY_FOREGROUND_COLOR,
6053                           MY_BACKGROUND_COLOR,
6054                           NULL);
6055   //map_button
6056   XtVaCreateManagedWidget(langcode("MENUTB0004"),
6057                           xmCascadeButtonGadgetClass,
6058                           menubar,
6059                           XmNsubMenuId,mappane,
6060                           XmNmnemonic,langcode_hotkey("MENUTB0004"),
6061                           XmNfontList, fontlist1,
6062                           MY_FOREGROUND_COLOR,
6063                           MY_BACKGROUND_COLOR,
6064                           NULL);
6065   //display_button
6066   XtVaCreateManagedWidget(langcode("MENUTB0005"),
6067                           xmCascadeButtonGadgetClass,
6068                           menubar,
6069                           XmNsubMenuId,stationspane,
6070                           XmNmnemonic,langcode_hotkey("MENUTB0005"),
6071                           XmNfontList, fontlist1,
6072                           MY_FOREGROUND_COLOR,
6073                           MY_BACKGROUND_COLOR,
6074                           NULL);
6075   //message_button
6076   XtVaCreateManagedWidget(langcode("MENUTB0006"),
6077                           xmCascadeButtonGadgetClass,
6078                           menubar,
6079                           XmNsubMenuId,messagepane,
6080                           XmNmnemonic,langcode_hotkey("MENUTB0006"),
6081                           XmNfontList, fontlist1,
6082                           MY_FOREGROUND_COLOR,
6083                           MY_BACKGROUND_COLOR,
6084                           NULL);
6085   //iface_button
6086   XtVaCreateManagedWidget(langcode("MENUTB0010"),
6087                           xmCascadeButtonGadgetClass,
6088                           menubar,
6089                           XmNsubMenuId,ifacepane,
6090                           XmNmnemonic,langcode_hotkey("MENUTB0010"),
6091                           XmNfontList, fontlist1,
6092                           MY_FOREGROUND_COLOR,
6093                           MY_BACKGROUND_COLOR,
6094                           NULL);
6095 
6096   help_button = XtVaCreateManagedWidget(langcode("MENUTB0009"),
6097                                         xmCascadeButtonGadgetClass,
6098                                         menubar,
6099                                         XmNsubMenuId,helppane,
6100                                         XmNmnemonic,langcode_hotkey("MENUTB0009"),
6101                                         XmNfontList, fontlist1,
6102                                         MY_FOREGROUND_COLOR,
6103                                         MY_BACKGROUND_COLOR,
6104                                         NULL);
6105   XtVaSetValues (menubar,XmNmenuHelpWidget,help_button,NULL);
6106   /* end bar */
6107 
6108   /* File */
6109   ac = 0;
6110   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
6111   ac++;
6112   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
6113   ac++;
6114   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
6115   ac++;
6116   XtSetArg(al[ac], XmNfontList,     fontlist1);
6117   ac++;
6118 
6119 
6120   configpane  = XmCreatePulldownMenu(filepane,
6121                                      "configpane",
6122                                      al,
6123                                      ac);
6124 
6125   // Print button
6126   print_button = XtVaCreateManagedWidget(langcode("PULDNFI015"),
6127                                          xmPushButtonWidgetClass,
6128                                          filepane,
6129                                          XmNmnemonic, langcode_hotkey("PULDNFI015"),
6130                                          XmNfontList, fontlist1,
6131                                          MY_FOREGROUND_COLOR,
6132                                          MY_BACKGROUND_COLOR,
6133                                          NULL);
6134   XtAddCallback( print_button, XmNactivateCallback, Print_Postscript, NULL );
6135 
6136   //config_button
6137   XtVaCreateManagedWidget(langcode("PULDNFI001"),
6138                           xmCascadeButtonGadgetClass,
6139                           filepane,
6140                           XmNsubMenuId,configpane,
6141                           XmNmnemonic,langcode_hotkey("PULDNFI001"),
6142                           XmNfontList, fontlist1,
6143                           MY_FOREGROUND_COLOR,
6144                           MY_BACKGROUND_COLOR,
6145                           NULL);
6146 
6147   (void)XtVaCreateManagedWidget("create_appshell sep1",
6148                                 xmSeparatorGadgetClass,
6149                                 filepane,
6150                                 XmNfontList, fontlist1,
6151                                 MY_FOREGROUND_COLOR,
6152                                 MY_BACKGROUND_COLOR,
6153                                 NULL);
6154 
6155   open_file_button = XtVaCreateManagedWidget(langcode("PULDNFI002"),
6156                      xmPushButtonGadgetClass,
6157                      filepane,
6158                      XmNmnemonic,langcode_hotkey("PULDNFI002"),
6159                      XmNfontList, fontlist1,
6160                      MY_FOREGROUND_COLOR,
6161                      MY_BACKGROUND_COLOR,
6162                      NULL);
6163 
6164 
6165   tnc_logging = XtVaCreateManagedWidget(langcode("PULDNFI010"),
6166                                         xmToggleButtonGadgetClass,
6167                                         filepane,
6168                                         XmNvisibleWhenOff, TRUE,
6169                                         XmNindicatorSize, 12,
6170                                         XmNfontList, fontlist1,
6171                                         MY_FOREGROUND_COLOR,
6172                                         MY_BACKGROUND_COLOR,
6173                                         NULL);
6174   XtAddCallback(tnc_logging,XmNvalueChangedCallback,TNC_Logging_toggle,"1");
6175   if (log_tnc_data)
6176   {
6177     XmToggleButtonSetState(tnc_logging,TRUE,FALSE);
6178   }
6179 
6180 
6181 
6182   net_logging = XtVaCreateManagedWidget(langcode("PULDNFI011"),
6183                                         xmToggleButtonGadgetClass,
6184                                         filepane,
6185                                         XmNvisibleWhenOff, TRUE,
6186                                         XmNindicatorSize, 12,
6187                                         XmNfontList, fontlist1,
6188                                         MY_FOREGROUND_COLOR,
6189                                         MY_BACKGROUND_COLOR,
6190                                         NULL);
6191   XtAddCallback(net_logging,XmNvalueChangedCallback,Net_Logging_toggle,"1");
6192   if (log_net_data)
6193   {
6194     XmToggleButtonSetState(net_logging,TRUE,FALSE);
6195   }
6196 
6197 
6198   igate_logging = XtVaCreateManagedWidget(langcode("PULDNFI012"),
6199                                           xmToggleButtonGadgetClass,
6200                                           filepane,
6201                                           XmNvisibleWhenOff, TRUE,
6202                                           XmNindicatorSize, 12,
6203                                           XmNfontList, fontlist1,
6204                                           MY_FOREGROUND_COLOR,
6205                                           MY_BACKGROUND_COLOR,
6206                                           NULL);
6207   XtAddCallback(igate_logging,XmNvalueChangedCallback,IGate_Logging_toggle,"1");
6208   if (log_igate)
6209   {
6210     XmToggleButtonSetState(igate_logging,TRUE,FALSE);
6211   }
6212 
6213 //    message_logging = XtVaCreateManagedWidget(langcode("PULDNFI012"),
6214   message_logging = XtVaCreateManagedWidget("Message Logging",
6215                     xmToggleButtonGadgetClass,
6216                     filepane,
6217                     XmNvisibleWhenOff, TRUE,
6218                     XmNindicatorSize, 12,
6219                     XmNfontList, fontlist1,
6220                     MY_FOREGROUND_COLOR,
6221                     MY_BACKGROUND_COLOR,
6222                     NULL);
6223   XtAddCallback(message_logging,XmNvalueChangedCallback,Message_Logging_toggle,"1");
6224   if (log_message_data)
6225   {
6226     XmToggleButtonSetState(message_logging,TRUE,FALSE);
6227   }
6228 
6229   wx_logging = XtVaCreateManagedWidget(langcode("PULDNFI013"),
6230                                        xmToggleButtonGadgetClass,
6231                                        filepane,
6232                                        XmNvisibleWhenOff, TRUE,
6233                                        XmNindicatorSize, 12,
6234                                        XmNfontList, fontlist1,
6235                                        MY_FOREGROUND_COLOR,
6236                                        MY_BACKGROUND_COLOR,
6237                                        NULL);
6238   XtAddCallback(wx_logging,XmNvalueChangedCallback,WX_Logging_toggle,"1");
6239   if (log_wx)
6240   {
6241     XmToggleButtonSetState(wx_logging,TRUE,FALSE);
6242   }
6243 
6244 //    wx_alert_logging = XtVaCreateManagedWidget(langcode("PULDNFI013"),
6245   wx_alert_logging = XtVaCreateManagedWidget("WX Alert Logging",
6246                      xmToggleButtonGadgetClass,
6247                      filepane,
6248                      XmNvisibleWhenOff, TRUE,
6249                      XmNindicatorSize, 12,
6250                      XmNfontList, fontlist1,
6251                      MY_FOREGROUND_COLOR,
6252                      MY_BACKGROUND_COLOR,
6253                      NULL);
6254   XtAddCallback(wx_alert_logging,XmNvalueChangedCallback,WX_Alert_Logging_toggle,"1");
6255   if (log_wx_alert_data)
6256   {
6257     XmToggleButtonSetState(wx_alert_logging,TRUE,FALSE);
6258   }
6259 
6260   enable_snapshots = XtVaCreateManagedWidget(langcode("PULDNFI014"),
6261                      xmToggleButtonGadgetClass,
6262                      filepane,
6263                      XmNvisibleWhenOff, TRUE,
6264                      XmNindicatorSize, 12,
6265                      XmNfontList, fontlist1,
6266                      MY_FOREGROUND_COLOR,
6267                      MY_BACKGROUND_COLOR,
6268                      NULL);
6269   XtAddCallback(enable_snapshots,XmNvalueChangedCallback,Snapshots_toggle,"1");
6270   if (snapshots_enabled)
6271   {
6272     XmToggleButtonSetState(enable_snapshots,TRUE,FALSE);
6273   }
6274 
6275   // enable kml snapshots
6276   enable_kmlsnapshots = XtVaCreateManagedWidget(langcode("PULDNFI016"),
6277                         xmToggleButtonGadgetClass,
6278                         filepane,
6279                         XmNvisibleWhenOff, TRUE,
6280                         XmNindicatorSize, 12,
6281                         XmNfontList, fontlist1,
6282                         MY_FOREGROUND_COLOR,
6283                         MY_BACKGROUND_COLOR,
6284                         NULL);
6285   XtAddCallback(enable_kmlsnapshots,XmNvalueChangedCallback,KML_Snapshots_toggle,"1");
6286   if (kmlsnapshots_enabled)
6287   {
6288     XmToggleButtonSetState(enable_kmlsnapshots,TRUE,FALSE);
6289   }
6290 
6291 
6292   (void)XtVaCreateManagedWidget("create_appshell sep1a",
6293                                 xmSeparatorGadgetClass,
6294                                 filepane,
6295                                 XmNfontList, fontlist1,
6296                                 MY_FOREGROUND_COLOR,
6297                                 MY_BACKGROUND_COLOR,
6298                                 NULL);
6299 
6300 
6301   (void)XtVaCreateManagedWidget("create_appshell sep1b",
6302                                 xmSeparatorGadgetClass,
6303                                 filepane,
6304                                 XmNfontList, fontlist1,
6305                                 MY_FOREGROUND_COLOR,
6306                                 MY_BACKGROUND_COLOR,
6307                                 NULL);
6308 
6309 
6310   //exitpane
6311   XmCreatePulldownMenu(filepane,
6312                        "exitpane",
6313                        al,
6314                        ac);
6315 
6316   exit_button = XtVaCreateManagedWidget(langcode("PULDNFI004"),
6317                                         xmPushButtonWidgetClass,
6318                                         filepane,
6319                                         XmNmnemonic,langcode_hotkey("PULDNFI004"),
6320                                         XmNfontList, fontlist1,
6321                                         MY_FOREGROUND_COLOR,
6322                                         MY_BACKGROUND_COLOR,
6323                                         NULL);
6324 
6325   /* View */
6326   packet_data_button = XtVaCreateManagedWidget(langcode("PULDNVI002"),
6327                        xmPushButtonGadgetClass,
6328                        viewpane,
6329                        XmNmnemonic,langcode_hotkey("PULDNVI002"),
6330                        XmNfontList, fontlist1,
6331                        MY_FOREGROUND_COLOR,
6332                        MY_BACKGROUND_COLOR,
6333                        NULL);
6334   view_messages_button = XtVaCreateManagedWidget(langcode("PULDNVI011"),
6335                          xmPushButtonGadgetClass,
6336                          viewpane,
6337                          XmNmnemonic,langcode_hotkey("PULDNVI011"),
6338                          XmNfontList, fontlist1,
6339                          MY_FOREGROUND_COLOR,
6340                          MY_BACKGROUND_COLOR,
6341                          NULL);
6342   bullet_button = XtVaCreateManagedWidget(langcode("PULDNVI001"),
6343                                           xmPushButtonGadgetClass,
6344                                           viewpane,
6345                                           XmNmnemonic,langcode_hotkey("PULDNVI001"),
6346                                           XmNfontList, fontlist1,
6347                                           MY_FOREGROUND_COLOR,
6348                                           MY_BACKGROUND_COLOR,
6349                                           NULL);
6350 
6351   (void)XtVaCreateManagedWidget("create_appshell sep?",
6352                                 xmSeparatorGadgetClass,
6353                                 viewpane,
6354                                 XmNfontList, fontlist1,
6355                                 MY_FOREGROUND_COLOR,
6356                                 MY_BACKGROUND_COLOR,
6357                                 NULL);
6358 
6359   mobile_button = XtVaCreateManagedWidget(langcode("PULDNVI003"),
6360                                           xmPushButtonGadgetClass,
6361                                           viewpane,
6362                                           XmNmnemonic,langcode_hotkey("PULDNVI003"),
6363                                           XmNfontList, fontlist1,
6364                                           MY_FOREGROUND_COLOR,
6365                                           MY_BACKGROUND_COLOR,
6366                                           NULL);
6367   stations_button = XtVaCreateManagedWidget(langcode("PULDNVI004"),
6368                     xmPushButtonGadgetClass,
6369                     viewpane,
6370                     XmNmnemonic,langcode_hotkey("PULDNVI004"),
6371                     XmNfontList, fontlist1,
6372                     MY_FOREGROUND_COLOR,
6373                     MY_BACKGROUND_COLOR,
6374                     NULL);
6375   localstations_button = XtVaCreateManagedWidget(langcode("PULDNVI009"),
6376                          xmPushButtonGadgetClass,
6377                          viewpane,
6378                          XmNmnemonic,langcode_hotkey("PULDNVI009"),
6379                          XmNfontList, fontlist1,
6380                          MY_FOREGROUND_COLOR,
6381                          MY_BACKGROUND_COLOR,
6382                          NULL);
6383   laststations_button = XtVaCreateManagedWidget(langcode("PULDNVI012"),
6384                         xmPushButtonGadgetClass,
6385                         viewpane,
6386                         XmNmnemonic,langcode_hotkey("PULDNVI012"),
6387                         XmNfontList, fontlist1,
6388                         MY_FOREGROUND_COLOR,
6389                         MY_BACKGROUND_COLOR,
6390                         NULL);
6391 
6392   (void)XtVaCreateManagedWidget("create_appshell sep1?",
6393                                 xmSeparatorGadgetClass,
6394                                 viewpane,
6395                                 XmNfontList, fontlist1,
6396                                 MY_FOREGROUND_COLOR,
6397                                 MY_BACKGROUND_COLOR,
6398                                 NULL);
6399 
6400   objectstations_button = XtVaCreateManagedWidget(langcode("LHPUPNI005"),
6401                           xmPushButtonGadgetClass,
6402                           viewpane,
6403                           XmNmnemonic,langcode_hotkey("LHPUPNI005"),
6404                           XmNfontList, fontlist1,
6405                           MY_FOREGROUND_COLOR,
6406                           MY_BACKGROUND_COLOR,
6407                           NULL);
6408   objectmystations_button = XtVaCreateManagedWidget(langcode("LHPUPNI006"),
6409                             xmPushButtonGadgetClass,
6410                             viewpane,
6411                             XmNmnemonic,langcode_hotkey("LHPUPNI006"),
6412                             XmNfontList, fontlist1,
6413                             MY_FOREGROUND_COLOR,
6414                             MY_BACKGROUND_COLOR,
6415                             NULL);
6416 
6417   // "List All CAD Polygons"
6418   CAD1 = XtVaCreateManagedWidget(langcode("POPUPMA046"),
6419                                  xmPushButtonGadgetClass,
6420                                  viewpane,
6421                                  XmNmnemonic,langcode_hotkey("POPUPMA046"),
6422                                  XmNfontList, fontlist1,
6423                                  MY_FOREGROUND_COLOR,
6424                                  MY_BACKGROUND_COLOR,
6425                                  NULL);
6426 
6427   (void)XtVaCreateManagedWidget("create_appshell sep2?",
6428                                 xmSeparatorGadgetClass,
6429                                 viewpane,
6430                                 XmNfontList, fontlist1,
6431                                 MY_FOREGROUND_COLOR,
6432                                 MY_BACKGROUND_COLOR,
6433                                 NULL);
6434 
6435   weather_button = XtVaCreateManagedWidget(langcode("PULDNVI005"),
6436                    xmPushButtonGadgetClass,
6437                    viewpane,
6438                    XmNmnemonic,langcode_hotkey("PULDNVI005"),
6439                    XmNfontList, fontlist1,
6440                    MY_FOREGROUND_COLOR,
6441                    MY_BACKGROUND_COLOR,
6442                    NULL);
6443   wx_station_button = XtVaCreateManagedWidget(langcode("PULDNVI008"),
6444                       xmPushButtonGadgetClass,
6445                       viewpane,
6446                       XmNmnemonic,langcode_hotkey("PULDNVI008"),
6447                       XmNfontList, fontlist1,
6448                       MY_FOREGROUND_COLOR,
6449                       MY_BACKGROUND_COLOR,
6450                       NULL);
6451   alert_button = XtVaCreateManagedWidget(langcode("PULDNVI007"),
6452                                          xmPushButtonGadgetClass,
6453                                          viewpane,
6454                                          XmNmnemonic,langcode_hotkey("PULDNVI007"),
6455                                          XmNfontList, fontlist1,
6456                                          MY_FOREGROUND_COLOR,
6457                                          MY_BACKGROUND_COLOR,
6458                                          NULL);
6459 
6460   (void)XtVaCreateManagedWidget("create_appshell sep3?",
6461                                 xmSeparatorGadgetClass,
6462                                 viewpane,
6463                                 XmNfontList, fontlist1,
6464                                 MY_FOREGROUND_COLOR,
6465                                 MY_BACKGROUND_COLOR,
6466                                 NULL);
6467 
6468   gps_status_button = XtVaCreateManagedWidget(langcode("PULDNVI015"),
6469                       xmPushButtonGadgetClass,
6470                       viewpane,
6471                       XmNmnemonic,langcode_hotkey("PULDNVI015"),
6472                       XmNfontList, fontlist1,
6473                       MY_FOREGROUND_COLOR,
6474                       MY_BACKGROUND_COLOR,
6475                       NULL);
6476   uptime_button = XtVaCreateManagedWidget(langcode("PULDNVI013"),
6477                                           xmPushButtonWidgetClass,
6478                                           viewpane,
6479                                           XmNmnemonic, langcode_hotkey("PULDNVI013"),
6480                                           XmNfontList, fontlist1,
6481                                           MY_FOREGROUND_COLOR,
6482                                           MY_BACKGROUND_COLOR,
6483                                           NULL);
6484   aloha_button = XtVaCreateManagedWidget(langcode("PULDNVI016"),
6485                                          xmPushButtonWidgetClass,
6486                                          viewpane,
6487                                          XmNmnemonic, langcode_hotkey("PULDNVI016"),
6488                                          XmNfontList, fontlist1,
6489                                          MY_FOREGROUND_COLOR,
6490                                          MY_BACKGROUND_COLOR,
6491                                          NULL);
6492 
6493   /* Configure */
6494   station_button = XtVaCreateManagedWidget(langcode("PULDNCF004"),
6495                    xmPushButtonGadgetClass,
6496                    configpane,
6497                    XmNmnemonic,langcode_hotkey("PULDNCF004"),
6498                    XmNfontList, fontlist1,
6499                    MY_FOREGROUND_COLOR,
6500                    MY_BACKGROUND_COLOR,
6501                    NULL);
6502 
6503   defaults_button = XtVaCreateManagedWidget(langcode("PULDNCF001"),
6504                     xmPushButtonGadgetClass,
6505                     configpane,
6506                     XmNmnemonic,langcode_hotkey("PULDNCF001"),
6507                     XmNfontList, fontlist1,
6508                     MY_FOREGROUND_COLOR,
6509                     MY_BACKGROUND_COLOR,
6510                     NULL);
6511 
6512   timing_button = XtVaCreateManagedWidget(langcode("PULDNCF003"),
6513                                           xmPushButtonGadgetClass,
6514                                           configpane,
6515                                           XmNmnemonic,langcode_hotkey("PULDNCF003"),
6516                                           XmNfontList, fontlist1,
6517                                           MY_FOREGROUND_COLOR,
6518                                           MY_BACKGROUND_COLOR,
6519                                           NULL);
6520 
6521   coordinates_button = XtVaCreateManagedWidget(langcode("PULDNCF002"),
6522                        xmPushButtonGadgetClass,
6523                        configpane,
6524                        XmNmnemonic,langcode_hotkey("PULDNCF002"),
6525                        XmNfontList, fontlist1,
6526                        MY_FOREGROUND_COLOR,
6527                        MY_BACKGROUND_COLOR,
6528                        NULL);
6529 
6530   aa_button = XtVaCreateManagedWidget(langcode("PULDNCF006"),
6531                                       xmPushButtonGadgetClass,
6532                                       configpane,
6533                                       XmNmnemonic,langcode_hotkey("PULDNCF006"),
6534                                       XmNfontList, fontlist1,
6535                                       MY_FOREGROUND_COLOR,
6536                                       MY_BACKGROUND_COLOR,
6537                                       NULL);
6538 
6539   speech_button = XtVaCreateManagedWidget(langcode("PULDNCF007"),
6540                                           xmPushButtonGadgetClass,
6541                                           configpane,
6542                                           XmNmnemonic,langcode_hotkey("PULDNCF007"),
6543                                           XmNfontList, fontlist1,
6544                                           MY_FOREGROUND_COLOR,
6545                                           MY_BACKGROUND_COLOR,
6546                                           NULL);
6547 
6548   smart_beacon_button = XtVaCreateManagedWidget(langcode("SMARTB001"),
6549                         xmPushButtonGadgetClass,
6550                         configpane,
6551                         XmNmnemonic,langcode_hotkey("SMARTB001"),
6552                         XmNfontList, fontlist1,
6553                         MY_FOREGROUND_COLOR,
6554                         MY_BACKGROUND_COLOR,
6555                         NULL);
6556 
6557   // map label font select
6558   font_button = XtVaCreateManagedWidget(langcode("PULDNMP025"),
6559                                         xmPushButtonWidgetClass, configpane,
6560                                         XmNmnemonic,langcode_hotkey("PULDNMP025"),
6561                                         XmNfontList, fontlist1,
6562                                         MY_FOREGROUND_COLOR,
6563                                         MY_BACKGROUND_COLOR,
6564                                         NULL);
6565   XtAddCallback(font_button, XmNactivateCallback, Map_font, NULL);
6566 
6567   test_button = XtVaCreateManagedWidget(langcode("PULDNFI003"),
6568                                         xmPushButtonWidgetClass,
6569                                         configpane,
6570                                         XmNmnemonic, langcode_hotkey("PULDNFI003"),
6571                                         XmNfontList, fontlist1,
6572                                         MY_FOREGROUND_COLOR,
6573                                         MY_BACKGROUND_COLOR,
6574                                         NULL);
6575 
6576   debug_level_button = XtVaCreateManagedWidget(langcode("PULDNFI007"),
6577                        xmPushButtonWidgetClass,
6578                        configpane,
6579                        XmNmnemonic, langcode_hotkey("PULDNFI007"),
6580                        XmNfontList, fontlist1,
6581                        MY_FOREGROUND_COLOR,
6582                        MY_BACKGROUND_COLOR,
6583                        NULL);
6584 
6585   units_choice_button = XtVaCreateManagedWidget(langcode("PULDNUT001"),
6586                         xmToggleButtonGadgetClass,
6587                         configpane,
6588                         XmNvisibleWhenOff, TRUE,
6589                         XmNindicatorSize, 12,
6590                         XmNfontList, fontlist1,
6591                         MY_FOREGROUND_COLOR,
6592                         MY_BACKGROUND_COLOR,
6593                         NULL);
6594   XtAddCallback(units_choice_button,XmNvalueChangedCallback,Units_choice_toggle,"1");
6595   if (english_units)
6596   {
6597     XmToggleButtonSetState(units_choice_button,TRUE,FALSE);
6598   }
6599 
6600   dbstatus_choice_button = XtVaCreateManagedWidget(langcode("PULDNDB001"),
6601                            xmToggleButtonGadgetClass,
6602                            configpane,
6603                            XmNvisibleWhenOff, TRUE,
6604                            XmNindicatorSize, 12,
6605                            XmNfontList, fontlist1,
6606                            MY_FOREGROUND_COLOR,
6607                            MY_BACKGROUND_COLOR,
6608                            NULL);
6609   XtAddCallback(dbstatus_choice_button,XmNvalueChangedCallback,Dbstatus_choice_toggle,"1");
6610   if (do_dbstatus)
6611   {
6612     XmToggleButtonSetState(dbstatus_choice_button,TRUE,FALSE);
6613   }
6614 
6615 
6616 
6617   (void)XtVaCreateManagedWidget("create_appshell sep1d",
6618                                 xmSeparatorGadgetClass,
6619                                 configpane,
6620                                 XmNfontList, fontlist1,
6621                                 MY_FOREGROUND_COLOR,
6622                                 MY_BACKGROUND_COLOR,
6623                                 NULL);
6624 
6625   save_button = XtVaCreateManagedWidget(langcode("PULDNCF008"),
6626                                         xmPushButtonGadgetClass,
6627                                         configpane,
6628                                         XmNmnemonic, langcode_hotkey("PULDNCF008"),
6629                                         XmNfontList, fontlist1,
6630                                         MY_FOREGROUND_COLOR,
6631                                         MY_BACKGROUND_COLOR,
6632                                         NULL);
6633 
6634 
6635 
6636 //- Maps -------------------------------------------------------------
6637 
6638   map_chooser_button = XtVaCreateManagedWidget(langcode("PULDNMP001"),
6639                        xmPushButtonGadgetClass,
6640                        mappane,
6641                        XmNmnemonic,langcode_hotkey("PULDNMP001"),
6642                        XmNfontList, fontlist1,
6643                        MY_FOREGROUND_COLOR,
6644                        MY_BACKGROUND_COLOR,
6645                        NULL);
6646   XtAddCallback(map_chooser_button,   XmNactivateCallback,Map_chooser,NULL);
6647 
6648   // Map Display Bookmarks
6649   jump_button = XtVaCreateManagedWidget(langcode("PULDNMP012"),
6650                                         xmPushButtonGadgetClass,
6651                                         mappane,
6652                                         XmNmnemonic,langcode_hotkey("PULDNMP012"),
6653                                         XmNfontList, fontlist1,
6654                                         MY_FOREGROUND_COLOR,
6655                                         MY_BACKGROUND_COLOR,
6656                                         NULL);
6657 
6658   locate_place_button = XtVaCreateManagedWidget(langcode("PULDNMP014"),
6659                         xmPushButtonGadgetClass,
6660                         mappane,
6661                         XmNmnemonic,langcode_hotkey("PULDNMP014"),
6662                         XmNfontList, fontlist1,
6663                         MY_FOREGROUND_COLOR,
6664                         MY_BACKGROUND_COLOR,
6665                         NULL);
6666 
6667   geocode_place_button = XtVaCreateManagedWidget(langcode("PULDNMP029"),
6668                          xmPushButtonGadgetClass,
6669                          mappane,
6670                          XmNmnemonic,langcode_hotkey("PULDNMP029"),
6671                          XmNfontList, fontlist1,
6672                          MY_FOREGROUND_COLOR,
6673                          MY_BACKGROUND_COLOR,
6674                          NULL);
6675 
6676   coordinate_calculator_button = XtVaCreateManagedWidget(langcode("COORD001"),
6677                                  xmPushButtonGadgetClass,mappane,
6678                                  XmNmnemonic, langcode_hotkey("COORD001"),
6679                                  XmNfontList, fontlist1,
6680                                  MY_FOREGROUND_COLOR,
6681                                  MY_BACKGROUND_COLOR,
6682                                  NULL);
6683 
6684   center_zoom_button=XtVaCreateManagedWidget(langcode("POPUPMA026"),
6685                      xmPushButtonGadgetClass, mappane,
6686                      XmNmnemonic, langcode_hotkey("POPUPMA026"),
6687                      XmNfontList, fontlist1,
6688                      MY_FOREGROUND_COLOR,
6689                      MY_BACKGROUND_COLOR,
6690                      NULL);
6691   XtAddCallback(center_zoom_button,XmNactivateCallback,Center_Zoom,NULL);
6692 
6693   ac = 0;
6694   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
6695   ac++;
6696   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
6697   ac++;
6698   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
6699   ac++;
6700   XtSetArg(al[ac], XmNtraversalOn, TRUE);
6701   ac++;
6702   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
6703   ac++;
6704   XtSetArg(al[ac], XmNfontList,        fontlist1);
6705   ac++;
6706 
6707 
6708   CAD_sub=XmCreatePulldownMenu(mappane,
6709                                "create_appshell CAD sub",
6710                                al,
6711                                ac);
6712 
6713   // "Draw CAD Objects"
6714   //draw_CAD_objects_menu
6715   XtVaCreateManagedWidget(langcode("POPUPMA029"),
6716                           xmCascadeButtonGadgetClass,
6717                           mappane,
6718                           XmNsubMenuId,CAD_sub,
6719 //            XmNmnemonic,langcode_hotkey("POPUPMA029"),
6720                           XmNfontList, fontlist1,
6721                           MY_FOREGROUND_COLOR,
6722                           MY_BACKGROUND_COLOR,
6723                           NULL);
6724 
6725   // "Draw Mode"
6726   ac = 0;
6727   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
6728   ac++;
6729   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
6730   ac++;
6731   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
6732   ac++;
6733   XtSetArg(al[ac], XmNtraversalOn, TRUE);
6734   ac++;
6735   XtSetArg(al[ac], XmNfontList,        fontlist1);
6736   ac++;
6737 
6738 
6739 //    XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA031")); ac++;
6740 
6741   // "Close Polygon"
6742   CAD_close_polygon_menu_item=XtCreateManagedWidget(langcode("POPUPMA031"),
6743                               xmPushButtonGadgetClass,
6744                               CAD_sub,
6745                               al,
6746                               ac);
6747   XtAddCallback(CAD_close_polygon_menu_item,XmNactivateCallback,Draw_CAD_Objects_close_polygon,NULL);
6748   // disable the close polygon menu item if not in draw mode
6749   if (draw_CAD_objects_flag==1)
6750   {
6751     XtSetSensitive(CAD_close_polygon_menu_item,TRUE);
6752   }
6753   if (draw_CAD_objects_flag==0)
6754   {
6755     XtSetSensitive(CAD_close_polygon_menu_item,FALSE);
6756   }
6757 
6758   ac = 0;
6759   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
6760   ac++;
6761   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
6762   ac++;
6763   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
6764   ac++;
6765   XtSetArg(al[ac], XmNtraversalOn, TRUE);
6766   ac++;
6767 //    XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA032")); ac++;
6768   XtSetArg(al[ac], XmNfontList,        fontlist1);
6769   ac++;
6770 
6771 
6772   // "Erase CAD Polygons"
6773   CAD3=XtCreateManagedWidget(langcode("POPUPMA032"),
6774                              xmPushButtonGadgetClass,
6775                              CAD_sub,
6776                              al,
6777                              ac);
6778   XtAddCallback(CAD3,XmNactivateCallback,Draw_CAD_Objects_erase_dialog,NULL);
6779 
6780   // "List All CAD Polygons"
6781   CAD4 = XtVaCreateManagedWidget(langcode("POPUPMA046"),
6782                                  xmPushButtonGadgetClass,
6783                                  CAD_sub,
6784                                  XmNmnemonic,langcode_hotkey("POPUPMA046"),
6785                                  XmNfontList, fontlist1,
6786                                  MY_FOREGROUND_COLOR,
6787                                  MY_BACKGROUND_COLOR,
6788                                  NULL);
6789   XtAddCallback(CAD4,XmNactivateCallback,Draw_CAD_Objects_list_dialog,NULL);
6790 
6791   // Toggles for CAD object information display on map
6792   // Draw CAD Objects
6793   cad_draw_button = XtVaCreateManagedWidget(langcode("POPUPMA047"),
6794                     xmToggleButtonGadgetClass,
6795                     CAD_sub,
6796                     XmNvisibleWhenOff, TRUE,
6797                     XmNindicatorSize, 12,
6798                     XmNfontList, fontlist1,
6799                     MY_FOREGROUND_COLOR,
6800                     MY_BACKGROUND_COLOR,
6801                     NULL);
6802   XtAddCallback(cad_draw_button,XmNvalueChangedCallback,CAD_draw_toggle,"CAD_draw_objects");
6803   if (CAD_draw_objects==TRUE)
6804   {
6805     XmToggleButtonSetState(cad_draw_button,TRUE,FALSE);
6806   }
6807 
6808   // Draw CAD Labels
6809   cad_show_label_button = XtVaCreateManagedWidget(langcode("POPUPMA048"),
6810                           xmToggleButtonGadgetClass,
6811                           CAD_sub,
6812                           XmNvisibleWhenOff, TRUE,
6813                           XmNindicatorSize, 12,
6814                           XmNfontList, fontlist1,
6815                           MY_FOREGROUND_COLOR,
6816                           MY_BACKGROUND_COLOR,
6817                           NULL);
6818   XtAddCallback(cad_show_label_button,XmNvalueChangedCallback,CAD_draw_toggle,"CAD_show_label");
6819   if (CAD_show_label==TRUE)
6820   {
6821     XmToggleButtonSetState(cad_show_label_button,TRUE,FALSE);
6822   }
6823 
6824   // Draw CAD Probability
6825   cad_show_probability_button = XtVaCreateManagedWidget(langcode("POPUPMA050"),
6826                                 xmToggleButtonGadgetClass,
6827                                 CAD_sub,
6828                                 XmNvisibleWhenOff, TRUE,
6829                                 XmNindicatorSize, 12,
6830                                 XmNfontList, fontlist1,
6831                                 MY_FOREGROUND_COLOR,
6832                                 MY_BACKGROUND_COLOR,
6833                                 NULL);
6834   XtAddCallback(cad_show_probability_button,XmNvalueChangedCallback,CAD_draw_toggle,"CAD_show_raw_probability");
6835   if (CAD_show_raw_probability==TRUE)
6836   {
6837     XmToggleButtonSetState(cad_show_probability_button,TRUE,FALSE);
6838   }
6839 
6840   // Draw CAD Comments
6841   cad_show_comment_button = XtVaCreateManagedWidget(langcode("POPUPMA049"),
6842                             xmToggleButtonGadgetClass,
6843                             CAD_sub,
6844                             XmNvisibleWhenOff, TRUE,
6845                             XmNindicatorSize, 12,
6846                             XmNfontList, fontlist1,
6847                             MY_FOREGROUND_COLOR,
6848                             MY_BACKGROUND_COLOR,
6849                             NULL);
6850   XtAddCallback(cad_show_comment_button,XmNvalueChangedCallback,CAD_draw_toggle,"CAD_show_comment");
6851   if (CAD_show_comment==TRUE)
6852   {
6853     XmToggleButtonSetState(cad_show_comment_button,TRUE,FALSE);
6854   }
6855 
6856   // Draw CAD Size of Area
6857   cad_show_area_button = XtVaCreateManagedWidget(langcode("POPUPMA051"),
6858                          xmToggleButtonGadgetClass,
6859                          CAD_sub,
6860                          XmNvisibleWhenOff, TRUE,
6861                          XmNindicatorSize, 12,
6862                          XmNfontList, fontlist1,
6863                          MY_FOREGROUND_COLOR,
6864                          MY_BACKGROUND_COLOR,
6865                          NULL);
6866   XtAddCallback(cad_show_area_button,XmNvalueChangedCallback,CAD_draw_toggle,"CAD_show_area");
6867   if (CAD_show_area==TRUE)
6868   {
6869     XmToggleButtonSetState(cad_show_area_button,TRUE,FALSE);
6870   }
6871 
6872   (void)XtVaCreateManagedWidget("create_appshell sep2",
6873                                 xmSeparatorGadgetClass,
6874                                 mappane,
6875                                 XmNfontList, fontlist1,
6876                                 MY_FOREGROUND_COLOR,
6877                                 MY_BACKGROUND_COLOR,
6878                                 NULL);
6879 
6880 
6881   map_lock_pan_zoom_button = XtVaCreateManagedWidget(langcode("PULDNMP016"),
6882                              xmToggleButtonGadgetClass,
6883                              mappane,
6884                              XmNvisibleWhenOff, TRUE,
6885                              XmNindicatorSize, 12,
6886                              XmNfontList, fontlist1,
6887                              MY_FOREGROUND_COLOR,
6888                              MY_BACKGROUND_COLOR,
6889                              NULL);
6890   XtAddCallback(map_lock_pan_zoom_button, XmNvalueChangedCallback, Map_lock_pan_zoom_toggle, "1");
6891   if (map_lock_pan_zoom)
6892   {
6893     XmToggleButtonSetState(map_lock_pan_zoom_button, TRUE, FALSE);
6894   }
6895 
6896 
6897   map_disable_button = XtVaCreateManagedWidget(langcode("PULDNMP013"),
6898                        xmToggleButtonGadgetClass,
6899                        mappane,
6900                        XmNvisibleWhenOff, TRUE,
6901                        XmNindicatorSize, 12,
6902                        XmNfontList, fontlist1,
6903                        MY_FOREGROUND_COLOR,
6904                        MY_BACKGROUND_COLOR,
6905                        NULL);
6906   XtAddCallback(map_disable_button, XmNvalueChangedCallback, Map_disable_toggle, "1");
6907   if (disable_all_maps)
6908   {
6909     XmToggleButtonSetState(map_disable_button, TRUE, FALSE);
6910   }
6911 
6912 
6913   map_auto_button = XtVaCreateManagedWidget(langcode("PULDNMP002"),
6914                     xmToggleButtonGadgetClass,
6915                     mappane,
6916                     XmNvisibleWhenOff, TRUE,
6917                     XmNindicatorSize, 12,
6918                     XmNfontList, fontlist1,
6919                     MY_FOREGROUND_COLOR,
6920                     MY_BACKGROUND_COLOR,
6921                     NULL);
6922   XtAddCallback(map_auto_button,XmNvalueChangedCallback,Map_auto_toggle,"1");
6923   if (map_auto_maps)
6924   {
6925     XmToggleButtonSetState(map_auto_button,TRUE,FALSE);
6926   }
6927 
6928 
6929   map_auto_skip_raster_button = XtVaCreateManagedWidget(langcode("PULDNMP021"),
6930                                 xmToggleButtonGadgetClass,
6931                                 mappane,
6932                                 XmNvisibleWhenOff, TRUE,
6933                                 XmNindicatorSize, 12,
6934                                 XmNfontList, fontlist1,
6935                                 MY_FOREGROUND_COLOR,
6936                                 MY_BACKGROUND_COLOR,
6937                                 NULL);
6938   XtAddCallback(map_auto_skip_raster_button,XmNvalueChangedCallback,Map_auto_skip_raster_toggle,"1");
6939   if (auto_maps_skip_raster)
6940   {
6941     XmToggleButtonSetState(map_auto_skip_raster_button,TRUE,FALSE);
6942   }
6943   if (!map_auto_maps)
6944   {
6945     XtSetSensitive(map_auto_skip_raster_button,FALSE);
6946   }
6947 
6948 
6949   map_grid_button = XtVaCreateManagedWidget(langcode("PULDNMP003"),
6950                     xmToggleButtonGadgetClass,
6951                     mappane,
6952                     XmNvisibleWhenOff, TRUE,
6953                     XmNindicatorSize, 12,
6954                     XmNfontList, fontlist1,
6955                     MY_FOREGROUND_COLOR,
6956                     MY_BACKGROUND_COLOR,
6957                     NULL);
6958   XtAddCallback(map_grid_button,XmNvalueChangedCallback,Grid_toggle,"1");
6959   if (long_lat_grid)
6960   {
6961     XmToggleButtonSetState(map_grid_button,TRUE,FALSE);
6962   }
6963 
6964   // Enable Map Border
6965   map_border_button = XtVaCreateManagedWidget(langcode("PULDNMP031"),
6966                       xmToggleButtonGadgetClass,
6967                       mappane,
6968                       XmNvisibleWhenOff, TRUE,
6969                       XmNindicatorSize, 12,
6970                       XmNfontList, fontlist1,
6971                       MY_FOREGROUND_COLOR,
6972                       MY_BACKGROUND_COLOR,
6973                       NULL);
6974   XtAddCallback(map_border_button,XmNvalueChangedCallback,Map_border_toggle,"1");
6975   if (draw_labeled_grid_border)
6976   {
6977     XmToggleButtonSetState(map_border_button,TRUE,FALSE);
6978   }
6979   if (!long_lat_grid)
6980   {
6981     XtSetSensitive(map_border_button,FALSE);
6982   }
6983   else
6984   {
6985     XtSetSensitive(map_border_button,TRUE);
6986   }
6987 
6988 
6989   map_levels_button = XtVaCreateManagedWidget(langcode("PULDNMP004"),
6990                       xmToggleButtonGadgetClass,
6991                       mappane,
6992                       XmNvisibleWhenOff, TRUE,
6993                       XmNindicatorSize, 12,
6994                       XmNfontList, fontlist1,
6995                       MY_FOREGROUND_COLOR,
6996                       MY_BACKGROUND_COLOR,
6997                       NULL);
6998   XtAddCallback(map_levels_button,XmNvalueChangedCallback,Map_levels_toggle,"1");
6999   if (map_color_levels)
7000   {
7001     XmToggleButtonSetState(map_levels_button,TRUE,FALSE);
7002   }
7003 
7004 
7005   map_labels_button = XtVaCreateManagedWidget(langcode("PULDNMP010"),
7006                       xmToggleButtonGadgetClass,
7007                       mappane,
7008                       XmNvisibleWhenOff, TRUE,
7009                       XmNindicatorSize, 12,
7010                       XmNfontList, fontlist1,
7011                       MY_FOREGROUND_COLOR,
7012                       MY_BACKGROUND_COLOR,
7013                       NULL);
7014   XtAddCallback(map_labels_button,XmNvalueChangedCallback,Map_labels_toggle,"1");
7015   if (map_labels)
7016   {
7017     XmToggleButtonSetState(map_labels_button,TRUE,FALSE);
7018   }
7019 
7020 
7021   map_fill_button = XtVaCreateManagedWidget(langcode("PULDNMP009"),
7022                     xmToggleButtonGadgetClass,
7023                     mappane,
7024                     XmNvisibleWhenOff, TRUE,
7025                     XmNindicatorSize, 12,
7026                     XmNfontList, fontlist1,
7027                     MY_FOREGROUND_COLOR,
7028                     MY_BACKGROUND_COLOR,
7029                     NULL);
7030   XtAddCallback(map_fill_button,XmNvalueChangedCallback,Map_fill_toggle,"1");
7031   if (map_color_fill)
7032   {
7033     XmToggleButtonSetState(map_fill_button,TRUE,FALSE);
7034   }
7035 
7036 
7037   map_wx_alerts_button = XtVaCreateManagedWidget(langcode("PULDNMP007"),
7038                          xmToggleButtonGadgetClass,
7039                          mappane,
7040                          XmNvisibleWhenOff, TRUE,
7041                          XmNindicatorSize, 12,
7042                          XmNfontList, fontlist1,
7043                          MY_FOREGROUND_COLOR,
7044                          MY_BACKGROUND_COLOR,
7045                          NULL);
7046   XtAddCallback(map_wx_alerts_button,XmNvalueChangedCallback,Map_wx_alerts_toggle,"1");
7047   if (!wx_alert_style)
7048   {
7049     XmToggleButtonSetState(map_wx_alerts_button,TRUE,FALSE);
7050   }
7051 #ifndef HAVE_LIBSHP
7052   // If we don't have Shapelib compiled in, grey-out the weather
7053   // alerts button.
7054   XtSetSensitive(map_wx_alerts_button, FALSE);
7055 #endif  // HAVE_LIBSHP
7056 
7057 
7058   (void)XtVaCreateManagedWidget("create_appshell sep2b",
7059                                 xmSeparatorGadgetClass,
7060                                 mappane,
7061                                 XmNfontList, fontlist1,
7062                                 MY_FOREGROUND_COLOR,
7063                                 MY_BACKGROUND_COLOR,
7064                                 NULL);
7065 
7066   (void)XtVaCreateManagedWidget("create_appshell sep2c",
7067                                 xmSeparatorGadgetClass,
7068                                 mappane,
7069                                 XmNfontList, fontlist1,
7070                                 MY_FOREGROUND_COLOR,
7071                                 MY_BACKGROUND_COLOR,
7072                                 NULL);
7073 
7074   ac = 0;
7075   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
7076   ac++;
7077   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
7078   ac++;
7079   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
7080   ac++;
7081   XtSetArg(al[ac], XmNtraversalOn, TRUE);
7082   ac++;
7083   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
7084   ac++;
7085   XtSetArg(al[ac], XmNfontList,        fontlist1);
7086   ac++;
7087 
7088 
7089   map_config_pane  = XmCreatePulldownMenu(mappane,
7090                                           "map_config_pane",
7091                                           al,
7092                                           ac);
7093 
7094   //map_config_button
7095   XtVaCreateManagedWidget(langcode("PULDNFI001"),
7096                           xmCascadeButtonGadgetClass,
7097                           mappane,
7098                           XmNsubMenuId,map_config_pane,
7099                           XmNmnemonic,langcode_hotkey("PULDNFI001"),
7100                           XmNfontList, fontlist1,
7101                           MY_FOREGROUND_COLOR,
7102                           MY_BACKGROUND_COLOR,
7103                           NULL);
7104 
7105   ac = 0;
7106   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
7107   ac++;
7108   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
7109   ac++;
7110   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
7111   ac++;
7112   XtSetArg(al[ac], XmNtraversalOn, TRUE);
7113   ac++;
7114   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
7115   ac++;
7116   XtSetArg(al[ac], XmNfontList,        fontlist1);
7117   ac++;
7118 
7119 
7120   // These go into the map config submenu
7121   Map_background_color_Pane = XmCreatePulldownMenu(map_config_pane,
7122                               "create_appshell map_background_color",
7123                               al,
7124                               ac);
7125 
7126   //map_background_button
7127   XtVaCreateManagedWidget(langcode("PULDNMP005"),
7128                           xmCascadeButtonWidgetClass,
7129                           map_config_pane,
7130                           XmNsubMenuId, Map_background_color_Pane,
7131                           XmNmnemonic, langcode_hotkey("PULDNMP005"),
7132                           XmNfontList, fontlist1,
7133                           MY_FOREGROUND_COLOR,
7134                           MY_BACKGROUND_COLOR,
7135                           NULL);
7136   map_bgcolor[10] = XtVaCreateManagedWidget(langcode("PULDNMBC11"),
7137                     xmPushButtonGadgetClass,
7138                     Map_background_color_Pane,
7139                     XmNmnemonic,langcode_hotkey("PULDNMBC11"),
7140                     XmNfontList, fontlist1,
7141                     MY_FOREGROUND_COLOR,
7142                     MY_BACKGROUND_COLOR,
7143                     NULL);
7144   map_bgcolor[11] = XtVaCreateManagedWidget(langcode("PULDNMBC12"),
7145                     xmPushButtonGadgetClass,
7146                     Map_background_color_Pane,
7147                     XmNmnemonic,langcode_hotkey("PULDNMBC12"),
7148                     XmNfontList, fontlist1,
7149                     MY_FOREGROUND_COLOR,
7150                     MY_BACKGROUND_COLOR,
7151                     NULL);
7152   map_bgcolor[0] = XtVaCreateManagedWidget(langcode("PULDNMBC01"),
7153                    xmPushButtonGadgetClass,
7154                    Map_background_color_Pane,
7155                    XmNmnemonic,langcode_hotkey("PULDNMBC01"),
7156                    XmNfontList, fontlist1,
7157                    MY_FOREGROUND_COLOR,
7158                    MY_BACKGROUND_COLOR,
7159                    NULL);
7160   map_bgcolor[1] = XtVaCreateManagedWidget(langcode("PULDNMBC02"),
7161                    xmPushButtonGadgetClass,
7162                    Map_background_color_Pane,
7163                    XmNmnemonic,langcode_hotkey("PULDNMBC02"),
7164                    XmNfontList, fontlist1,
7165                    MY_FOREGROUND_COLOR,
7166                    MY_BACKGROUND_COLOR,
7167                    NULL);
7168   map_bgcolor[2] = XtVaCreateManagedWidget(langcode("PULDNMBC03"),
7169                    xmPushButtonGadgetClass,
7170                    Map_background_color_Pane,
7171                    XmNmnemonic,langcode_hotkey("PULDNMBC03"),
7172                    XmNfontList, fontlist1,
7173                    MY_FOREGROUND_COLOR,
7174                    MY_BACKGROUND_COLOR,
7175                    NULL);
7176   map_bgcolor[3] = XtVaCreateManagedWidget(langcode("PULDNMBC04"),
7177                    xmPushButtonGadgetClass,
7178                    Map_background_color_Pane,
7179                    XmNmnemonic,langcode_hotkey("PULDNMBC04"),
7180                    XmNfontList, fontlist1,
7181                    MY_FOREGROUND_COLOR,
7182                    MY_BACKGROUND_COLOR,
7183                    NULL);
7184   map_bgcolor[4] = XtVaCreateManagedWidget(langcode("PULDNMBC05"),
7185                    xmPushButtonGadgetClass,
7186                    Map_background_color_Pane,
7187                    XmNmnemonic,langcode_hotkey("PULDNMBC05"),
7188                    XmNfontList, fontlist1,
7189                    MY_FOREGROUND_COLOR,
7190                    MY_BACKGROUND_COLOR,
7191                    NULL);
7192   map_bgcolor[5] = XtVaCreateManagedWidget(langcode("PULDNMBC06"),
7193                    xmPushButtonGadgetClass,
7194                    Map_background_color_Pane,
7195                    XmNmnemonic,langcode_hotkey("PULDNMBC06"),
7196                    XmNfontList, fontlist1,
7197                    MY_FOREGROUND_COLOR,
7198                    MY_BACKGROUND_COLOR,
7199                    NULL);
7200   map_bgcolor[6] = XtVaCreateManagedWidget(langcode("PULDNMBC07"),
7201                    xmPushButtonGadgetClass,
7202                    Map_background_color_Pane,
7203                    XmNmnemonic,langcode_hotkey("PULDNMBC07"),
7204                    XmNfontList, fontlist1,
7205                    MY_FOREGROUND_COLOR,
7206                    MY_BACKGROUND_COLOR,
7207                    NULL);
7208   map_bgcolor[7] = XtVaCreateManagedWidget(langcode("PULDNMBC08"),
7209                    xmPushButtonGadgetClass,
7210                    Map_background_color_Pane,
7211                    XmNmnemonic,langcode_hotkey("PULDNMBC08"),
7212                    XmNfontList, fontlist1,
7213                    MY_FOREGROUND_COLOR,
7214                    MY_BACKGROUND_COLOR,
7215                    NULL);
7216   map_bgcolor[8] = XtVaCreateManagedWidget(langcode("PULDNMBC09"),
7217                    xmPushButtonGadgetClass,
7218                    Map_background_color_Pane,
7219                    XmNmnemonic,langcode_hotkey("PULDNMBC09"),
7220                    XmNfontList, fontlist1,
7221                    MY_FOREGROUND_COLOR,
7222                    MY_BACKGROUND_COLOR,
7223                    NULL);
7224   map_bgcolor[9] = XtVaCreateManagedWidget(langcode("PULDNMBC10"),
7225                    xmPushButtonGadgetClass,
7226                    Map_background_color_Pane,
7227                    XmNmnemonic,langcode_hotkey("PULDNMBC10"),
7228                    XmNfontList, fontlist1,
7229                    MY_FOREGROUND_COLOR,
7230                    MY_BACKGROUND_COLOR,
7231                    NULL);
7232   XtSetSensitive(map_bgcolor[map_background_color],FALSE);
7233   XtAddCallback(map_bgcolor[10], XmNactivateCallback,Map_background,"10");
7234   XtAddCallback(map_bgcolor[11], XmNactivateCallback,Map_background,"11");
7235   XtAddCallback(map_bgcolor[0],  XmNactivateCallback,Map_background,"0");
7236   XtAddCallback(map_bgcolor[1],  XmNactivateCallback,Map_background,"1");
7237   XtAddCallback(map_bgcolor[2],  XmNactivateCallback,Map_background,"2");
7238   XtAddCallback(map_bgcolor[3],  XmNactivateCallback,Map_background,"3");
7239   XtAddCallback(map_bgcolor[4],  XmNactivateCallback,Map_background,"4");
7240   XtAddCallback(map_bgcolor[5],  XmNactivateCallback,Map_background,"5");
7241   XtAddCallback(map_bgcolor[6],  XmNactivateCallback,Map_background,"6");
7242   XtAddCallback(map_bgcolor[7],  XmNactivateCallback,Map_background,"7");
7243   XtAddCallback(map_bgcolor[8],  XmNactivateCallback,Map_background,"8");
7244   XtAddCallback(map_bgcolor[9],  XmNactivateCallback,Map_background,"9");
7245 
7246 #if !defined(NO_GRAPHICS)
7247 
7248   ac = 0;
7249   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
7250   ac++;
7251   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
7252   ac++;
7253   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
7254   ac++;
7255   XtSetArg(al[ac], XmNtraversalOn, TRUE);
7256   ac++;
7257   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
7258   ac++;
7259   XtSetArg(al[ac], XmNfontList,        fontlist1);
7260   ac++;
7261 
7262 
7263   Raster_intensity_Pane = XmCreatePulldownMenu(map_config_pane,
7264                           "create_appshell raster_intensity",
7265                           al,
7266                           ac);
7267 
7268   //raster_intensity_button
7269   XtVaCreateManagedWidget(langcode("PULDNMP008"),
7270                           xmCascadeButtonWidgetClass,
7271                           map_config_pane,
7272                           XmNsubMenuId,
7273                           Raster_intensity_Pane,
7274                           XmNmnemonic, langcode_hotkey("PULDNMP008"),
7275                           XmNfontList, fontlist1,
7276                           MY_FOREGROUND_COLOR,
7277                           MY_BACKGROUND_COLOR,
7278                           NULL);
7279   raster_intensity[0] = XtVaCreateManagedWidget("0%",
7280                         xmPushButtonGadgetClass,
7281                         Raster_intensity_Pane,
7282                         XmNmnemonic,"0%",
7283                         XmNfontList, fontlist1,
7284                         MY_FOREGROUND_COLOR,
7285                         MY_BACKGROUND_COLOR,
7286                         NULL);
7287   raster_intensity[1] = XtVaCreateManagedWidget("10%",
7288                         xmPushButtonGadgetClass,
7289                         Raster_intensity_Pane,
7290                         XmNmnemonic,"10%",
7291                         XmNfontList, fontlist1,
7292                         MY_FOREGROUND_COLOR,
7293                         MY_BACKGROUND_COLOR,
7294                         NULL);
7295   raster_intensity[2] = XtVaCreateManagedWidget("20%",
7296                         xmPushButtonGadgetClass,
7297                         Raster_intensity_Pane,
7298                         XmNmnemonic,"20%",
7299                         XmNfontList, fontlist1,
7300                         MY_FOREGROUND_COLOR,
7301                         MY_BACKGROUND_COLOR,
7302                         NULL);
7303   raster_intensity[3] = XtVaCreateManagedWidget("30%",
7304                         xmPushButtonGadgetClass,
7305                         Raster_intensity_Pane,
7306                         XmNmnemonic,"30%",
7307                         XmNfontList, fontlist1,
7308                         MY_FOREGROUND_COLOR,
7309                         MY_BACKGROUND_COLOR,
7310                         NULL);
7311   raster_intensity[4] = XtVaCreateManagedWidget("40%",
7312                         xmPushButtonGadgetClass,
7313                         Raster_intensity_Pane,
7314                         XmNmnemonic,"40%",
7315                         XmNfontList, fontlist1,
7316                         MY_FOREGROUND_COLOR,
7317                         MY_BACKGROUND_COLOR,
7318                         NULL);
7319   raster_intensity[5] = XtVaCreateManagedWidget("50%",
7320                         xmPushButtonGadgetClass,
7321                         Raster_intensity_Pane,
7322                         XmNmnemonic,"50%",
7323                         XmNfontList, fontlist1,
7324                         MY_FOREGROUND_COLOR,
7325                         MY_BACKGROUND_COLOR,
7326                         NULL);
7327   raster_intensity[6] = XtVaCreateManagedWidget("60%",
7328                         xmPushButtonGadgetClass,
7329                         Raster_intensity_Pane,
7330                         XmNmnemonic,"60%",
7331                         XmNfontList, fontlist1,
7332                         MY_FOREGROUND_COLOR,
7333                         MY_BACKGROUND_COLOR,
7334                         NULL);
7335   raster_intensity[7] = XtVaCreateManagedWidget("70%",
7336                         xmPushButtonGadgetClass,
7337                         Raster_intensity_Pane,
7338                         XmNmnemonic,"70%",
7339                         XmNfontList, fontlist1,
7340                         MY_FOREGROUND_COLOR,
7341                         MY_BACKGROUND_COLOR,
7342                         NULL);
7343   raster_intensity[8] = XtVaCreateManagedWidget("80%",
7344                         xmPushButtonGadgetClass,
7345                         Raster_intensity_Pane,
7346                         XmNmnemonic,"80%",
7347                         XmNfontList, fontlist1,
7348                         MY_FOREGROUND_COLOR,
7349                         MY_BACKGROUND_COLOR,
7350                         NULL);
7351   raster_intensity[9] = XtVaCreateManagedWidget("90%",
7352                         xmPushButtonGadgetClass,
7353                         Raster_intensity_Pane,
7354                         XmNmnemonic,"90%",
7355                         XmNfontList, fontlist1,
7356                         MY_FOREGROUND_COLOR,
7357                         MY_BACKGROUND_COLOR,
7358                         NULL);
7359   raster_intensity[10] = XtVaCreateManagedWidget("100%",
7360                          xmPushButtonGadgetClass,
7361                          Raster_intensity_Pane,
7362                          XmNmnemonic,"100%",
7363                          XmNfontList, fontlist1,
7364                          MY_FOREGROUND_COLOR,
7365                          MY_BACKGROUND_COLOR,
7366                          NULL);
7367   XtSetSensitive(raster_intensity[(int)(raster_map_intensity * 10.0)],FALSE);
7368 
7369   //fprintf(stderr,"raster index = %d\n",
7370   //    (int)(raster_map_intensity * 10.01) );
7371 
7372   XtAddCallback(raster_intensity[0],  XmNactivateCallback,Raster_intensity,"0.0");
7373   XtAddCallback(raster_intensity[1],  XmNactivateCallback,Raster_intensity,"0.1");
7374   XtAddCallback(raster_intensity[2],  XmNactivateCallback,Raster_intensity,"0.2");
7375   XtAddCallback(raster_intensity[3],  XmNactivateCallback,Raster_intensity,"0.3");
7376   XtAddCallback(raster_intensity[4],  XmNactivateCallback,Raster_intensity,"0.4");
7377   XtAddCallback(raster_intensity[5],  XmNactivateCallback,Raster_intensity,"0.5");
7378   XtAddCallback(raster_intensity[6],  XmNactivateCallback,Raster_intensity,"0.6");
7379   XtAddCallback(raster_intensity[7],  XmNactivateCallback,Raster_intensity,"0.7");
7380   XtAddCallback(raster_intensity[8],  XmNactivateCallback,Raster_intensity,"0.8");
7381   XtAddCallback(raster_intensity[9],  XmNactivateCallback,Raster_intensity,"0.9");
7382   XtAddCallback(raster_intensity[10], XmNactivateCallback,Raster_intensity,"1.0");
7383 #if defined(HAVE_MAGICK)
7384   // Adjust Gamma Correction
7385   gamma_adjust_button = XtVaCreateManagedWidget(langcode("GAMMA001"),
7386                         xmPushButtonWidgetClass, map_config_pane,
7387                         XmNmnemonic,langcode_hotkey("GAMMA001"),
7388                         XmNfontList, fontlist1,
7389                         MY_FOREGROUND_COLOR,
7390                         MY_BACKGROUND_COLOR,
7391                         NULL);
7392   XtAddCallback(gamma_adjust_button, XmNactivateCallback, Gamma_adjust, NULL);
7393 #endif  // HAVE_MAGICK
7394 #endif  // NO_GRAPHICS
7395 
7396   ac = 0;
7397   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
7398   ac++;
7399   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
7400   ac++;
7401   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
7402   ac++;
7403   XtSetArg(al[ac], XmNtraversalOn, TRUE);
7404   ac++;
7405   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
7406   ac++;
7407   XtSetArg(al[ac], XmNfontList,        fontlist1);
7408   ac++;
7409 
7410 
7411   Map_station_label_Pane = XmCreatePulldownMenu(map_config_pane,
7412                            "create_appshell map_station_label",
7413                            al,
7414                            ac);
7415   //map_station_label_button
7416   XtVaCreateManagedWidget(langcode("PULDNMP006"),
7417                           xmCascadeButtonWidgetClass,
7418                           map_config_pane,
7419                           XmNsubMenuId, Map_station_label_Pane,
7420                           XmNmnemonic,langcode_hotkey("PULDNMP006"),
7421                           XmNfontList, fontlist1,
7422                           MY_FOREGROUND_COLOR,
7423                           MY_BACKGROUND_COLOR,
7424                           NULL);
7425   map_station_label0 = XtVaCreateManagedWidget(langcode("PULDNMSL01"),
7426                        xmPushButtonGadgetClass,
7427                        Map_station_label_Pane,
7428                        XmNmnemonic,langcode_hotkey("PULDNMSL01"),
7429                        XmNfontList, fontlist1,
7430                        MY_FOREGROUND_COLOR,
7431                        MY_BACKGROUND_COLOR,
7432                        NULL);
7433   map_station_label1 = XtVaCreateManagedWidget(langcode("PULDNMSL02"),
7434                        xmPushButtonGadgetClass,
7435                        Map_station_label_Pane,
7436                        XmNmnemonic,langcode_hotkey("PULDNMSL02"),
7437                        XmNfontList, fontlist1,
7438                        MY_FOREGROUND_COLOR,
7439                        MY_BACKGROUND_COLOR,
7440                        NULL);
7441   map_station_label2 = XtVaCreateManagedWidget(langcode("PULDNMSL03"),
7442                        xmPushButtonGadgetClass,
7443                        Map_station_label_Pane,
7444                        XmNmnemonic,langcode_hotkey("PULDNMSL03"),
7445                        XmNfontList, fontlist1,
7446                        MY_FOREGROUND_COLOR,
7447                        MY_BACKGROUND_COLOR,
7448                        NULL);
7449   map_station_label3 = XtVaCreateManagedWidget(langcode("PULDNMSL04"),
7450                        xmPushButtonGadgetClass,
7451                        Map_station_label_Pane,
7452                        XmNmnemonic,langcode_hotkey("PULDNMSL04"),
7453                        XmNfontList, fontlist1,
7454                        MY_FOREGROUND_COLOR,
7455                        MY_BACKGROUND_COLOR,
7456                        NULL);
7457 
7458   sel4_switch(letter_style,map_station_label3,map_station_label2,map_station_label1,map_station_label0);
7459   XtAddCallback(map_station_label0,   XmNactivateCallback,Map_station_label,"0");
7460   XtAddCallback(map_station_label1,   XmNactivateCallback,Map_station_label,"1");
7461   XtAddCallback(map_station_label2,   XmNactivateCallback,Map_station_label,"2");
7462   XtAddCallback(map_station_label3,   XmNactivateCallback,Map_station_label,"3");
7463 
7464 
7465   ac = 0;
7466   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
7467   ac++;
7468   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
7469   ac++;
7470   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
7471   ac++;
7472   XtSetArg(al[ac], XmNtraversalOn, TRUE);
7473   ac++;
7474   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
7475   ac++;
7476   XtSetArg(al[ac], XmNfontList,        fontlist1);
7477   ac++;
7478 
7479 
7480   Map_icon_outline_Pane = XmCreatePulldownMenu(map_config_pane,
7481                           "create_appshell map_icon_outline",
7482                           al,
7483                           ac);
7484   //map_icon_outline_button
7485   XtVaCreateManagedWidget(langcode("PULDNMP026"),
7486                           xmCascadeButtonWidgetClass,
7487                           map_config_pane,
7488                           XmNsubMenuId, Map_icon_outline_Pane,
7489                           XmNmnemonic,langcode_hotkey("PULDNMP026"),
7490                           XmNfontList, fontlist1,
7491                           MY_FOREGROUND_COLOR,
7492                           MY_BACKGROUND_COLOR,
7493                           NULL);
7494   map_icon_outline0 = XtVaCreateManagedWidget(langcode("PULDNMIO01"),
7495                       xmPushButtonGadgetClass,
7496                       Map_icon_outline_Pane,
7497                       XmNmnemonic,langcode_hotkey("PULDNMIO01"),
7498                       XmNfontList, fontlist1,
7499                       MY_FOREGROUND_COLOR,
7500                       MY_BACKGROUND_COLOR,
7501                       NULL);
7502   map_icon_outline1 = XtVaCreateManagedWidget(langcode("PULDNMIO02"),
7503                       xmPushButtonGadgetClass,
7504                       Map_icon_outline_Pane,
7505                       XmNmnemonic,langcode_hotkey("PULDNMIO02"),
7506                       XmNfontList, fontlist1,
7507                       MY_FOREGROUND_COLOR,
7508                       MY_BACKGROUND_COLOR,
7509                       NULL);
7510   map_icon_outline2 = XtVaCreateManagedWidget(langcode("PULDNMIO03"),
7511                       xmPushButtonGadgetClass,
7512                       Map_icon_outline_Pane,
7513                       XmNmnemonic,langcode_hotkey("PULDNMIO03"),
7514                       XmNfontList, fontlist1,
7515                       MY_FOREGROUND_COLOR,
7516                       MY_BACKGROUND_COLOR,
7517                       NULL);
7518   map_icon_outline3 = XtVaCreateManagedWidget(langcode("PULDNMIO04"),
7519                       xmPushButtonGadgetClass,
7520                       Map_icon_outline_Pane,
7521                       XmNmnemonic,langcode_hotkey("PULDNMIO04"),
7522                       XmNfontList, fontlist1,
7523                       MY_FOREGROUND_COLOR,
7524                       MY_BACKGROUND_COLOR,
7525                       NULL);
7526   sel4_switch(icon_outline_style,map_icon_outline3,map_icon_outline2,map_icon_outline1,map_icon_outline0);
7527   XtAddCallback(map_icon_outline0,   XmNactivateCallback,Map_icon_outline,"0");
7528   XtAddCallback(map_icon_outline1,   XmNactivateCallback,Map_icon_outline,"1");
7529   XtAddCallback(map_icon_outline2,   XmNactivateCallback,Map_icon_outline,"2");
7530   XtAddCallback(map_icon_outline3,   XmNactivateCallback,Map_icon_outline,"3");
7531 
7532 
7533 #ifdef HAVE_LIBGEOTIFF
7534   drg_config_button= XtVaCreateManagedWidget(langcode("PULDNMP030"),
7535                      xmPushButtonGadgetClass,
7536                      map_config_pane,
7537                      XmNmnemonic,langcode_hotkey("PULDNMP030"),
7538                      XmNfontList, fontlist1,
7539                      MY_FOREGROUND_COLOR,
7540                      MY_BACKGROUND_COLOR,
7541                      NULL);
7542   XtAddCallback(drg_config_button, XmNactivateCallback,Config_DRG,NULL);
7543 #endif  // HAVE_LIBGEOTIFF
7544 
7545 
7546   (void)XtVaCreateManagedWidget("create_appshell sep2d",
7547                                 xmSeparatorGadgetClass,
7548                                 map_config_pane,
7549                                 XmNfontList, fontlist1,
7550                                 MY_FOREGROUND_COLOR,
7551                                 MY_BACKGROUND_COLOR,
7552                                 NULL);
7553 
7554 
7555 // Re-download Maps (Not from cache)
7556   redownload_maps_button = XtVaCreateManagedWidget(langcode("PULDNMP027"),
7557                            xmPushButtonGadgetClass,
7558                            map_config_pane,
7559                            XmNmnemonic,langcode_hotkey("PULDNMP027"),
7560                            XmNfontList, fontlist1,
7561                            MY_FOREGROUND_COLOR,
7562                            MY_BACKGROUND_COLOR,
7563                            NULL);
7564   XtAddCallback(redownload_maps_button, XmNactivateCallback,Re_Download_Maps_Now,NULL);
7565 
7566 
7567 // Flush Entire Map Cache!
7568   flush_map_cache_button = XtVaCreateManagedWidget(langcode("PULDNMP028"),
7569                            xmPushButtonGadgetClass,
7570                            map_config_pane,
7571                            XmNmnemonic,langcode_hotkey("PULDNMP028"),
7572                            XmNfontList, fontlist1,
7573                            MY_FOREGROUND_COLOR,
7574                            MY_BACKGROUND_COLOR,
7575                            NULL);
7576   XtAddCallback(flush_map_cache_button, XmNactivateCallback,Flush_Entire_Map_Queue,NULL);
7577 
7578 
7579   //Index Maps on startup
7580   index_maps_on_startup_button = XtVaCreateManagedWidget(langcode("PULDNMP022"),
7581                                  xmToggleButtonGadgetClass,
7582                                  map_config_pane,
7583                                  XmNvisibleWhenOff, TRUE,
7584                                  XmNindicatorSize, 12,
7585                                  XmNfontList, fontlist1,
7586                                  MY_FOREGROUND_COLOR,
7587                                  MY_BACKGROUND_COLOR,
7588                                  NULL);
7589   XtAddCallback(index_maps_on_startup_button,XmNvalueChangedCallback,Index_maps_on_startup_toggle,"1");
7590   if (index_maps_on_startup)
7591   {
7592     XmToggleButtonSetState(index_maps_on_startup_button,TRUE,FALSE);
7593   }
7594 
7595 
7596   map_indexer_button = XtVaCreateManagedWidget(langcode("PULDNMP023"),
7597                        xmPushButtonGadgetClass,
7598                        map_config_pane,
7599                        XmNmnemonic,langcode_hotkey("PULDNMP023"),
7600                        XmNfontList, fontlist1,
7601                        MY_FOREGROUND_COLOR,
7602                        MY_BACKGROUND_COLOR,
7603                        NULL);
7604 
7605   map_all_indexer_button = XtVaCreateManagedWidget(langcode("PULDNMP024"),
7606                            xmPushButtonGadgetClass,
7607                            map_config_pane,
7608                            XmNmnemonic,langcode_hotkey("PULDNMP024"),
7609                            XmNfontList, fontlist1,
7610                            MY_FOREGROUND_COLOR,
7611                            MY_BACKGROUND_COLOR,
7612                            NULL);
7613 
7614 
7615   (void)XtVaCreateManagedWidget("create_appshell sep2e",
7616                                 xmSeparatorGadgetClass,
7617                                 mappane,
7618                                 XmNfontList, fontlist1,
7619                                 MY_FOREGROUND_COLOR,
7620                                 MY_BACKGROUND_COLOR,
7621                                 NULL);
7622 
7623 
7624   map_pointer_menu_button = XtVaCreateManagedWidget(langcode("PULDNMP011"),
7625                             xmPushButtonGadgetClass,
7626                             mappane,
7627                             XmNmnemonic,langcode_hotkey("PULDNMP011"),
7628                             XmNfontList, fontlist1,
7629                             MY_FOREGROUND_COLOR,
7630                             MY_BACKGROUND_COLOR,
7631                             NULL);
7632 
7633 
7634 //- Stations Menu -----------------------------------------------------
7635   locate_button = XtVaCreateManagedWidget(langcode("PULDNDP014"),
7636                                           xmPushButtonGadgetClass,
7637                                           stationspane,
7638                                           XmNmnemonic,langcode_hotkey("PULDNDP014"),
7639                                           XmNfontList, fontlist1,
7640                                           MY_FOREGROUND_COLOR,
7641                                           MY_BACKGROUND_COLOR,
7642                                           NULL);
7643 
7644   track_button = XtVaCreateManagedWidget(langcode("PULDNDP001"),
7645                                          xmPushButtonGadgetClass,
7646                                          stationspane,
7647                                          XmNmnemonic,langcode_hotkey("PULDNDP001"),
7648                                          XmNfontList, fontlist1,
7649                                          MY_FOREGROUND_COLOR,
7650                                          MY_BACKGROUND_COLOR,
7651                                          NULL);
7652   XtAddCallback(track_button, XmNactivateCallback,Track_station,NULL);
7653 
7654   download_trail_button = XtVaCreateManagedWidget(langcode("PULDNDP022"),
7655                           xmPushButtonGadgetClass,
7656                           stationspane,
7657                           XmNmnemonic,langcode_hotkey("PULDNDP022"),
7658                           XmNfontList, fontlist1,
7659                           MY_FOREGROUND_COLOR,
7660                           MY_BACKGROUND_COLOR,
7661                           NULL);
7662   XtAddCallback(download_trail_button, XmNactivateCallback,Download_findu_trail,NULL);
7663 
7664 
7665   ac = 0;
7666   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
7667   ac++;
7668   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
7669   ac++;
7670   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
7671   ac++;
7672   XtSetArg(al[ac], XmNtraversalOn, TRUE);
7673   ac++;
7674   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
7675   ac++;
7676   XtSetArg(al[ac], XmNfontList,        fontlist1);
7677   ac++;
7678 
7679 
7680 
7681   // Store Data pulldown/tearoff
7682   store_data_pane = XmCreatePulldownMenu(stationspane,
7683                                          "store_data_pane",
7684                                          al,
7685                                          ac);
7686 
7687   // Export all >
7688   //store_data_button
7689   XtVaCreateManagedWidget(langcode("PULDNDP055"),
7690                           xmCascadeButtonGadgetClass,
7691                           stationspane,
7692                           XmNsubMenuId, store_data_pane,
7693                           XmNmnemonic, langcode_hotkey("PULDNDP055"),
7694                           XmNfontList, fontlist1,
7695                           MY_FOREGROUND_COLOR,
7696                           MY_BACKGROUND_COLOR,
7697                           NULL);
7698 
7699   // Export to KML file
7700   store_all_kml_button = XtVaCreateManagedWidget(langcode("PULDNDP056"),
7701                          xmPushButtonGadgetClass,
7702                          store_data_pane,
7703                          XmNvisibleWhenOff, TRUE,
7704                          XmNindicatorSize, 12,
7705                          XmNfontList, fontlist1,
7706                          MY_FOREGROUND_COLOR,
7707                          MY_BACKGROUND_COLOR,
7708                          NULL);
7709   XtAddCallback(store_all_kml_button, XmNactivateCallback, store_all_kml_callback, NULL);
7710 
7711 #ifdef HAVE_DB
7712   // store to  open databases
7713   store_all_db_button = XtVaCreateManagedWidget("Store to open databases",
7714                         xmPushButtonGadgetClass,
7715                         store_data_pane,
7716                         XmNvisibleWhenOff, TRUE,
7717                         XmNindicatorSize, 12,
7718                         XmNfontList, fontlist1,
7719                         MY_FOREGROUND_COLOR,
7720                         MY_BACKGROUND_COLOR,
7721                         NULL);
7722   //XtAddCallback(store_all_db_button, XmNvalueChangedCallback, store_all_db_button_callback, "1");
7723   XtSetSensitive(store_all_db_button,FALSE);
7724 #endif // HAVE_DB
7725 
7726 
7727   (void)XtVaCreateManagedWidget("create_appshell sep3",
7728                                 xmSeparatorGadgetClass,
7729                                 stationspane,
7730                                 XmNfontList, fontlist1,
7731                                 MY_FOREGROUND_COLOR,
7732                                 MY_BACKGROUND_COLOR,
7733                                 NULL);
7734 
7735   ac = 0;
7736   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
7737   ac++;
7738   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
7739   ac++;
7740   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
7741   ac++;
7742   XtSetArg(al[ac], XmNtraversalOn, TRUE);
7743   ac++;
7744   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
7745   ac++;
7746   XtSetArg(al[ac], XmNfontList,        fontlist1);
7747   ac++;
7748 
7749 
7750   // Filter Data pulldown/tearoff
7751   filter_data_pane = XmCreatePulldownMenu(stationspane,
7752                                           "filter_data_pane",
7753                                           al,
7754                                           ac);
7755 
7756   //filter_data_button
7757   XtVaCreateManagedWidget(langcode("PULDNDP032"),
7758                           xmCascadeButtonGadgetClass,
7759                           stationspane,
7760                           XmNsubMenuId, filter_data_pane,
7761                           XmNmnemonic, langcode_hotkey("PULDNDP032"),
7762                           XmNfontList, fontlist1,
7763                           MY_FOREGROUND_COLOR,
7764                           MY_BACKGROUND_COLOR,
7765                           NULL);
7766 
7767   select_none_button = XtVaCreateManagedWidget(langcode("PULDNDP040"),
7768                        xmToggleButtonGadgetClass,
7769                        filter_data_pane,
7770                        XmNvisibleWhenOff, TRUE,
7771                        XmNindicatorSize, 12,
7772                        XmNfontList, fontlist1,
7773                        MY_FOREGROUND_COLOR,
7774                        MY_BACKGROUND_COLOR,
7775                        NULL);
7776   XtAddCallback(select_none_button, XmNvalueChangedCallback, Select_none_toggle, "1");
7777   if (Select_.none)
7778   {
7779     XmToggleButtonSetState(select_none_button, TRUE, FALSE);
7780   }
7781 
7782 
7783   select_mine_button = XtVaCreateManagedWidget(langcode("PULDNDP041"),
7784                        xmToggleButtonGadgetClass,
7785                        filter_data_pane,
7786                        XmNvisibleWhenOff, TRUE,
7787                        XmNindicatorSize, 12,
7788                        XmNfontList, fontlist1,
7789                        MY_FOREGROUND_COLOR,
7790                        MY_BACKGROUND_COLOR,
7791                        NULL);
7792   XtAddCallback(select_mine_button, XmNvalueChangedCallback, Select_mine_toggle, "1");
7793   if (Select_.mine)
7794   {
7795     XmToggleButtonSetState(select_mine_button, TRUE, FALSE);
7796   }
7797   if (Select_.none)
7798   {
7799     XtSetSensitive(select_mine_button, FALSE);
7800   }
7801 
7802 
7803   select_tnc_button = XtVaCreateManagedWidget(langcode("PULDNDP042"),
7804                       xmToggleButtonGadgetClass,
7805                       filter_data_pane,
7806                       XmNvisibleWhenOff, TRUE,
7807                       XmNindicatorSize, 12,
7808                       XmNfontList, fontlist1,
7809                       MY_FOREGROUND_COLOR,
7810                       MY_BACKGROUND_COLOR,
7811                       NULL);
7812   XtAddCallback(select_tnc_button, XmNvalueChangedCallback, Select_tnc_toggle, "1");
7813   if (Select_.tnc)
7814   {
7815     XmToggleButtonSetState(select_tnc_button, TRUE, FALSE);
7816   }
7817   if (Select_.none)
7818   {
7819     XtSetSensitive(select_tnc_button, FALSE);
7820   }
7821 
7822 
7823   select_direct_button = XtVaCreateManagedWidget(langcode("PULDNDP027"),
7824                          xmToggleButtonGadgetClass,
7825                          filter_data_pane,
7826                          XmNvisibleWhenOff, TRUE,
7827                          XmNindicatorSize, 12,
7828                          XmNfontList, fontlist1,
7829                          MY_FOREGROUND_COLOR,
7830                          MY_BACKGROUND_COLOR,
7831                          NULL);
7832   XtAddCallback(select_direct_button, XmNvalueChangedCallback, Select_direct_toggle, "1");
7833   if (Select_.direct)
7834   {
7835     XmToggleButtonSetState(select_direct_button, TRUE, FALSE);
7836   }
7837   if (!Select_.tnc || Select_.none)
7838   {
7839     XtSetSensitive(select_direct_button, FALSE);
7840   }
7841 
7842 
7843   select_via_digi_button = XtVaCreateManagedWidget(langcode("PULDNDP043"),
7844                            xmToggleButtonGadgetClass,
7845                            filter_data_pane,
7846                            XmNvisibleWhenOff, TRUE,
7847                            XmNindicatorSize, 12,
7848                            XmNfontList, fontlist1,
7849                            MY_FOREGROUND_COLOR,
7850                            MY_BACKGROUND_COLOR,
7851                            NULL);
7852   XtAddCallback(select_via_digi_button, XmNvalueChangedCallback, Select_via_digi_toggle, "1");
7853   if (Select_.via_digi)
7854   {
7855     XmToggleButtonSetState(select_via_digi_button, TRUE, FALSE);
7856   }
7857   if (!Select_.tnc || Select_.none)
7858   {
7859     XtSetSensitive(select_via_digi_button, FALSE);
7860   }
7861 
7862 
7863   select_net_button = XtVaCreateManagedWidget(langcode("PULDNDP034"),
7864                       xmToggleButtonGadgetClass,
7865                       filter_data_pane,
7866                       XmNvisibleWhenOff, TRUE,
7867                       XmNindicatorSize, 12,
7868                       XmNfontList, fontlist1,
7869                       MY_FOREGROUND_COLOR,
7870                       MY_BACKGROUND_COLOR,
7871                       NULL);
7872   XtAddCallback(select_net_button, XmNvalueChangedCallback, Select_net_toggle, "1");
7873   if (Select_.net)
7874   {
7875     XmToggleButtonSetState(select_net_button, TRUE, FALSE);
7876   }
7877   if (Select_.none)
7878   {
7879     XtSetSensitive(select_net_button, FALSE);
7880   }
7881 
7882 
7883   // "Select Tactical Calls Only"
7884   select_tactical_button = XtVaCreateManagedWidget(langcode("PULDNDP051"),
7885                            xmToggleButtonGadgetClass,
7886                            filter_data_pane,
7887                            XmNvisibleWhenOff, TRUE,
7888                            XmNindicatorSize, 12,
7889                            XmNfontList, fontlist1,
7890                            MY_FOREGROUND_COLOR,
7891                            MY_BACKGROUND_COLOR,
7892                            NULL);
7893   XtAddCallback(select_tactical_button, XmNvalueChangedCallback, Select_tactical_toggle, "1");
7894   if (Select_.tactical)
7895   {
7896     XmToggleButtonSetState(select_tactical_button, TRUE, FALSE);
7897   }
7898   if (Select_.none)
7899   {
7900     XtSetSensitive(select_tactical_button, FALSE);
7901   }
7902 
7903 
7904   select_old_data_button = XtVaCreateManagedWidget(langcode("PULDNDP019"),
7905                            xmToggleButtonGadgetClass,
7906                            filter_data_pane,
7907                            XmNvisibleWhenOff, TRUE,
7908                            XmNindicatorSize, 12,
7909                            XmNfontList, fontlist1,
7910                            MY_FOREGROUND_COLOR,
7911                            MY_BACKGROUND_COLOR,
7912                            NULL);
7913   XtAddCallback(select_old_data_button, XmNvalueChangedCallback, Select_old_data_toggle, "1");
7914   if (Select_.old_data)
7915   {
7916     XmToggleButtonSetState(select_old_data_button, TRUE, FALSE);
7917   }
7918   if (no_data_selected())
7919   {
7920     XtSetSensitive(select_old_data_button, FALSE);
7921   }
7922 
7923 
7924   (void)XtVaCreateManagedWidget("create_appshell sep3a",
7925                                 xmSeparatorGadgetClass,
7926                                 filter_data_pane,
7927                                 XmNfontList, fontlist1,
7928                                 MY_FOREGROUND_COLOR,
7929                                 MY_BACKGROUND_COLOR,
7930                                 NULL);
7931 
7932 
7933   select_stations_button = XtVaCreateManagedWidget(langcode("PULDNDP044"),
7934                            xmToggleButtonGadgetClass,
7935                            filter_data_pane,
7936                            XmNvisibleWhenOff, TRUE,
7937                            XmNindicatorSize, 12,
7938                            XmNfontList, fontlist1,
7939                            MY_FOREGROUND_COLOR,
7940                            MY_BACKGROUND_COLOR,
7941                            NULL);
7942   XtAddCallback(select_stations_button, XmNvalueChangedCallback,
7943                 Select_stations_toggle, "1");
7944   if (Select_.stations)
7945   {
7946     XmToggleButtonSetState(select_stations_button, TRUE, FALSE);
7947   }
7948   if (no_data_selected())
7949   {
7950     XtSetSensitive(select_stations_button, FALSE);
7951   }
7952 
7953 
7954   select_fixed_stations_button = XtVaCreateManagedWidget(langcode("PULDNDP028"),
7955                                  xmToggleButtonGadgetClass,
7956                                  filter_data_pane,
7957                                  XmNvisibleWhenOff, TRUE,
7958                                  XmNindicatorSize, 12,
7959                                  XmNfontList, fontlist1,
7960                                  MY_FOREGROUND_COLOR,
7961                                  MY_BACKGROUND_COLOR,
7962                                  NULL);
7963   XtAddCallback(select_fixed_stations_button, XmNvalueChangedCallback,
7964                 Select_fixed_stations_toggle, "1");
7965   if (Select_.fixed_stations)
7966   {
7967     XmToggleButtonSetState(select_fixed_stations_button, TRUE, FALSE);
7968   }
7969   if (!Select_.stations || no_data_selected())
7970   {
7971     XtSetSensitive(select_fixed_stations_button, FALSE);
7972   }
7973 
7974 
7975   select_moving_stations_button = XtVaCreateManagedWidget(langcode("PULDNDP029"),
7976                                   xmToggleButtonGadgetClass,
7977                                   filter_data_pane,
7978                                   XmNvisibleWhenOff, TRUE,
7979                                   XmNindicatorSize, 12,
7980                                   XmNfontList, fontlist1,
7981                                   MY_FOREGROUND_COLOR,
7982                                   MY_BACKGROUND_COLOR,
7983                                   NULL);
7984   XtAddCallback(select_moving_stations_button, XmNvalueChangedCallback,
7985                 Select_moving_stations_toggle, "1");
7986   if (Select_.moving_stations)
7987   {
7988     XmToggleButtonSetState(select_moving_stations_button, TRUE, FALSE);
7989   }
7990   if (!Select_.stations || no_data_selected())
7991   {
7992     XtSetSensitive(select_moving_stations_button, FALSE);
7993   }
7994 
7995 
7996   select_weather_stations_button = XtVaCreateManagedWidget(langcode("PULDNDP030"),
7997                                    xmToggleButtonGadgetClass,
7998                                    filter_data_pane,
7999                                    XmNvisibleWhenOff, TRUE,
8000                                    XmNindicatorSize, 12,
8001                                    XmNfontList, fontlist1,
8002                                    MY_FOREGROUND_COLOR,
8003                                    MY_BACKGROUND_COLOR,
8004                                    NULL);
8005   XtAddCallback(select_weather_stations_button, XmNvalueChangedCallback,
8006                 Select_weather_stations_toggle, "1");
8007   if (Select_.weather_stations)
8008   {
8009     XmToggleButtonSetState(select_weather_stations_button, TRUE, FALSE);
8010   }
8011   if (!Select_.stations || no_data_selected())
8012   {
8013     XtSetSensitive(select_weather_stations_button, FALSE);
8014   }
8015 
8016 
8017   select_CWOP_wx_stations_button = XtVaCreateManagedWidget(langcode("PULDNDP053"),
8018                                    xmToggleButtonGadgetClass,
8019                                    filter_data_pane,
8020                                    XmNvisibleWhenOff, TRUE,
8021                                    XmNindicatorSize, 12,
8022                                    XmNfontList, fontlist1,
8023                                    MY_FOREGROUND_COLOR,
8024                                    MY_BACKGROUND_COLOR,
8025                                    NULL);
8026   XtAddCallback(select_CWOP_wx_stations_button, XmNvalueChangedCallback,
8027                 Select_CWOP_wx_stations_toggle, "1");
8028   if (Select_.CWOP_wx_stations)
8029   {
8030     XmToggleButtonSetState(select_CWOP_wx_stations_button, TRUE, FALSE);
8031   }
8032   if (!Select_.stations || no_data_selected() || !Select_.weather_stations)
8033   {
8034     XtSetSensitive(select_CWOP_wx_stations_button, FALSE);
8035   }
8036   else
8037   {
8038     XtSetSensitive(select_CWOP_wx_stations_button, TRUE);
8039   }
8040 
8041 
8042   select_objects_button = XtVaCreateManagedWidget(langcode("PULDNDP045"),
8043                           xmToggleButtonGadgetClass,
8044                           filter_data_pane,
8045                           XmNvisibleWhenOff, TRUE,
8046                           XmNindicatorSize, 12,
8047                           XmNfontList, fontlist1,
8048                           MY_FOREGROUND_COLOR,
8049                           MY_BACKGROUND_COLOR,
8050                           NULL);
8051   XtAddCallback(select_objects_button, XmNvalueChangedCallback,
8052                 Select_objects_toggle, "1");
8053   if (Select_.objects)
8054   {
8055     XmToggleButtonSetState(select_objects_button, TRUE, FALSE);
8056   }
8057   if (no_data_selected())
8058   {
8059     XtSetSensitive(select_objects_button, FALSE);
8060   }
8061 
8062 
8063   select_weather_objects_button = XtVaCreateManagedWidget(langcode("PULDNDP026"),
8064                                   xmToggleButtonGadgetClass,
8065                                   filter_data_pane,
8066                                   XmNvisibleWhenOff, TRUE,
8067                                   XmNindicatorSize, 12,
8068                                   XmNfontList, fontlist1,
8069                                   MY_FOREGROUND_COLOR,
8070                                   MY_BACKGROUND_COLOR,
8071                                   NULL);
8072   XtAddCallback(select_weather_objects_button, XmNvalueChangedCallback,
8073                 Select_weather_objects_toggle, "1");
8074   if (Select_.weather_objects)
8075   {
8076     XmToggleButtonSetState(select_weather_objects_button, TRUE, FALSE);
8077   }
8078   if (!Select_.objects || no_data_selected())
8079   {
8080     XtSetSensitive(select_weather_objects_button, FALSE);
8081   }
8082 
8083 
8084   select_gauge_objects_button = XtVaCreateManagedWidget(langcode("PULDNDP039"),
8085                                 xmToggleButtonGadgetClass,
8086                                 filter_data_pane,
8087                                 XmNvisibleWhenOff, TRUE,
8088                                 XmNindicatorSize, 12,
8089                                 XmNfontList, fontlist1,
8090                                 MY_FOREGROUND_COLOR,
8091                                 MY_BACKGROUND_COLOR,
8092                                 NULL);
8093   XtAddCallback(select_gauge_objects_button, XmNvalueChangedCallback,
8094                 Select_gauge_objects_toggle, "1");
8095   if (Select_.gauge_objects)
8096   {
8097     XmToggleButtonSetState(select_gauge_objects_button, TRUE, FALSE);
8098   }
8099   if (!Select_.objects || no_data_selected())
8100   {
8101     XtSetSensitive(select_gauge_objects_button, FALSE);
8102   }
8103 
8104 
8105   select_aircraft_objects_button = XtVaCreateManagedWidget(langcode("PULDNDP057"),
8106                                    xmToggleButtonGadgetClass,
8107                                    filter_data_pane,
8108                                    XmNvisibleWhenOff, TRUE,
8109                                    XmNindicatorSize, 12,
8110                                    XmNfontList, fontlist1,
8111                                    MY_FOREGROUND_COLOR,
8112                                    MY_BACKGROUND_COLOR,
8113                                    NULL);
8114   XtAddCallback(select_aircraft_objects_button, XmNvalueChangedCallback,
8115                 Select_aircraft_objects_toggle, "1");
8116   if (Select_.aircraft_objects)
8117   {
8118     XmToggleButtonSetState(select_aircraft_objects_button, TRUE, FALSE);
8119   }
8120   if (!Select_.objects || no_data_selected())
8121   {
8122     XtSetSensitive(select_aircraft_objects_button, FALSE);
8123   }
8124 
8125   select_vessel_objects_button = XtVaCreateManagedWidget(langcode("PULDNDP058"),
8126                                  xmToggleButtonGadgetClass,
8127                                  filter_data_pane,
8128                                  XmNvisibleWhenOff, TRUE,
8129                                  XmNindicatorSize, 12,
8130                                  XmNfontList, fontlist1,
8131                                  MY_FOREGROUND_COLOR,
8132                                  MY_BACKGROUND_COLOR,
8133                                  NULL);
8134   XtAddCallback(select_vessel_objects_button, XmNvalueChangedCallback,
8135                 Select_vessel_objects_toggle, "1");
8136   if (Select_.vessel_objects)
8137   {
8138     XmToggleButtonSetState(select_vessel_objects_button, TRUE, FALSE);
8139   }
8140   if (!Select_.objects || no_data_selected())
8141   {
8142     XtSetSensitive(select_vessel_objects_button, FALSE);
8143   }
8144 
8145 
8146   select_other_objects_button = XtVaCreateManagedWidget(langcode("PULDNDP031"),
8147                                 xmToggleButtonGadgetClass,
8148                                 filter_data_pane,
8149                                 XmNvisibleWhenOff, TRUE,
8150                                 XmNindicatorSize, 12,
8151                                 XmNfontList, fontlist1,
8152                                 MY_FOREGROUND_COLOR,
8153                                 MY_BACKGROUND_COLOR,
8154                                 NULL);
8155   XtAddCallback(select_other_objects_button, XmNvalueChangedCallback,
8156                 Select_other_objects_toggle, "1");
8157   if (Select_.other_objects)
8158   {
8159     XmToggleButtonSetState(select_other_objects_button, TRUE, FALSE);
8160   }
8161   if (!Select_.objects || no_data_selected())
8162   {
8163     XtSetSensitive(select_other_objects_button, FALSE);
8164   }
8165 
8166 
8167   // End of Data Filtering
8168 
8169   ac = 0;
8170   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
8171   ac++;
8172   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
8173   ac++;
8174   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
8175   ac++;
8176   XtSetArg(al[ac], XmNtraversalOn, TRUE);
8177   ac++;
8178   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
8179   ac++;
8180   XtSetArg(al[ac], XmNfontList,        fontlist1);
8181   ac++;
8182 
8183 
8184   // Displayed Info Filtering
8185   filter_display_pane = XmCreatePulldownMenu(stationspane,
8186                         "filter_display_pane",
8187                         al,
8188                         ac);
8189 
8190   //filter_display_button
8191   XtVaCreateManagedWidget(langcode("PULDNDP033"),
8192                           xmCascadeButtonGadgetClass,
8193                           stationspane,
8194                           XmNsubMenuId, filter_display_pane,
8195                           XmNmnemonic, langcode_hotkey("PULDNDP033"),
8196                           XmNfontList, fontlist1,
8197                           MY_FOREGROUND_COLOR,
8198                           MY_BACKGROUND_COLOR,
8199                           NULL);
8200 
8201 
8202   display_callsign_button = XtVaCreateManagedWidget(langcode("PULDNDP010"),
8203                             xmToggleButtonGadgetClass,
8204                             filter_display_pane,
8205                             XmNvisibleWhenOff, TRUE,
8206                             XmNindicatorSize, 12,
8207                             XmNfontList, fontlist1,
8208                             MY_FOREGROUND_COLOR,
8209                             MY_BACKGROUND_COLOR,
8210                             NULL);
8211   XtAddCallback(display_callsign_button, XmNvalueChangedCallback, Display_callsign_toggle, "1");
8212   if (Display_.callsign)
8213   {
8214     XmToggleButtonSetState(display_callsign_button, TRUE, FALSE);
8215   }
8216   if (no_data_selected())
8217   {
8218     XtSetSensitive(display_callsign_button, FALSE);
8219   }
8220 
8221   display_label_all_trackpoints_button = XtVaCreateManagedWidget(langcode("PULDNDP052"),
8222                                          xmToggleButtonGadgetClass,
8223                                          filter_display_pane,
8224                                          XmNvisibleWhenOff, TRUE,
8225                                          XmNindicatorSize, 12,
8226                                          XmNfontList, fontlist1,
8227                                          MY_FOREGROUND_COLOR,
8228                                          MY_BACKGROUND_COLOR,
8229                                          NULL);
8230   XtAddCallback(display_label_all_trackpoints_button, XmNvalueChangedCallback, Display_label_all_trackpoints_toggle, "1");
8231   if (Display_.label_all_trackpoints)
8232   {
8233     XmToggleButtonSetState(display_label_all_trackpoints_button, TRUE, FALSE);
8234   }
8235   if (!Display_.callsign || no_data_selected())
8236   {
8237     XtSetSensitive(display_label_all_trackpoints_button, FALSE);
8238   }
8239 
8240   display_symbol_button = XtVaCreateManagedWidget(langcode("PULDNDP012"),
8241                           xmToggleButtonGadgetClass,
8242                           filter_display_pane,
8243                           XmNvisibleWhenOff, TRUE,
8244                           XmNindicatorSize, 12,
8245                           XmNfontList, fontlist1,
8246                           MY_FOREGROUND_COLOR,
8247                           MY_BACKGROUND_COLOR,
8248                           NULL);
8249   XtAddCallback(display_symbol_button, XmNvalueChangedCallback, Display_symbol_toggle, "1");
8250   if (Display_.symbol)
8251   {
8252     XmToggleButtonSetState(display_symbol_button, TRUE, FALSE);
8253   }
8254   if (no_data_selected())
8255   {
8256     XtSetSensitive(display_symbol_button, FALSE);
8257   }
8258 
8259 
8260   display_symbol_rotate_button = XtVaCreateManagedWidget(langcode("PULDNDP011"),
8261                                  xmToggleButtonGadgetClass,
8262                                  filter_display_pane,
8263                                  XmNvisibleWhenOff, TRUE,
8264                                  XmNindicatorSize, 12,
8265                                  XmNfontList, fontlist1,
8266                                  MY_FOREGROUND_COLOR,
8267                                  MY_BACKGROUND_COLOR,
8268                                  NULL);
8269   XtAddCallback(display_symbol_rotate_button, XmNvalueChangedCallback, Display_symbol_rotate_toggle, "1");
8270   if (Display_.symbol_rotate)
8271   {
8272     XmToggleButtonSetState(display_symbol_rotate_button, TRUE, FALSE);
8273   }
8274   if (!Display_.symbol || no_data_selected())
8275   {
8276     XtSetSensitive(display_symbol_rotate_button, FALSE);
8277   }
8278 
8279 
8280   display_trail_button = XtVaCreateManagedWidget(langcode("PULDNDP007"),
8281                          xmToggleButtonGadgetClass,
8282                          filter_display_pane,
8283                          XmNvisibleWhenOff, TRUE,
8284                          XmNindicatorSize, 12,
8285                          XmNfontList, fontlist1,
8286                          MY_FOREGROUND_COLOR,
8287                          MY_BACKGROUND_COLOR,
8288                          NULL);
8289   XtAddCallback(display_trail_button, XmNvalueChangedCallback, Display_trail_toggle, "1");
8290   if (Display_.trail)
8291   {
8292     XmToggleButtonSetState(display_trail_button, TRUE, FALSE);
8293   }
8294   if (no_data_selected())
8295   {
8296     XtSetSensitive(display_trail_button, FALSE);
8297   }
8298 
8299 
8300   (void)XtVaCreateManagedWidget("create_appshell sep3b",
8301                                 xmSeparatorGadgetClass,
8302                                 filter_display_pane,
8303                                 XmNfontList, fontlist1,
8304                                 MY_FOREGROUND_COLOR,
8305                                 MY_BACKGROUND_COLOR,
8306                                 NULL);
8307 
8308 
8309   display_course_button = XtVaCreateManagedWidget(langcode("PULDNDP003"),
8310                           xmToggleButtonGadgetClass,
8311                           filter_display_pane,
8312                           XmNvisibleWhenOff, TRUE,
8313                           XmNindicatorSize, 12,
8314                           XmNfontList, fontlist1,
8315                           MY_FOREGROUND_COLOR,
8316                           MY_BACKGROUND_COLOR,
8317                           NULL);
8318   XtAddCallback(display_course_button, XmNvalueChangedCallback, Display_course_toggle, "1");
8319   if (Display_.course)
8320   {
8321     XmToggleButtonSetState(display_course_button, TRUE, FALSE);
8322   }
8323   if (no_data_selected())
8324   {
8325     XtSetSensitive(display_course_button, FALSE);
8326   }
8327 
8328 
8329   display_speed_button = XtVaCreateManagedWidget(langcode("PULDNDP004"),
8330                          xmToggleButtonGadgetClass,
8331                          filter_display_pane,
8332                          XmNvisibleWhenOff, TRUE,
8333                          XmNindicatorSize, 12,
8334                          XmNfontList, fontlist1,
8335                          MY_FOREGROUND_COLOR,
8336                          MY_BACKGROUND_COLOR,
8337                          NULL);
8338   XtAddCallback(display_speed_button, XmNvalueChangedCallback, Display_speed_toggle, "1");
8339   if (Display_.speed)
8340   {
8341     XmToggleButtonSetState(display_speed_button, TRUE, FALSE);
8342   }
8343   if (no_data_selected())
8344   {
8345     XtSetSensitive(display_speed_button, FALSE);
8346   }
8347 
8348 
8349   display_speed_short_button = XtVaCreateManagedWidget(langcode("PULDNDP017"),
8350                                xmToggleButtonGadgetClass,
8351                                filter_display_pane,
8352                                XmNvisibleWhenOff, TRUE,
8353                                XmNindicatorSize, 12,
8354                                XmNfontList, fontlist1,
8355                                MY_FOREGROUND_COLOR,
8356                                MY_BACKGROUND_COLOR,
8357                                NULL);
8358   XtAddCallback(display_speed_short_button, XmNvalueChangedCallback, Display_speed_short_toggle, "1");
8359   if (Display_.speed_short)
8360   {
8361     XmToggleButtonSetState(display_speed_short_button, TRUE, FALSE);
8362   }
8363   if (!Display_.speed || no_data_selected())
8364   {
8365     XtSetSensitive(display_speed_short_button, FALSE);
8366   }
8367 
8368 
8369   display_altitude_button = XtVaCreateManagedWidget(langcode("PULDNDP002"),
8370                             xmToggleButtonGadgetClass,
8371                             filter_display_pane,
8372                             XmNvisibleWhenOff, TRUE,
8373                             XmNindicatorSize, 12,
8374                             XmNfontList, fontlist1,
8375                             MY_FOREGROUND_COLOR,
8376                             MY_BACKGROUND_COLOR,
8377                             NULL);
8378   XtAddCallback(display_altitude_button, XmNvalueChangedCallback, Display_altitude_toggle, "1");
8379   if (Display_.altitude)
8380   {
8381     XmToggleButtonSetState(display_altitude_button, TRUE, FALSE);
8382   }
8383   if (no_data_selected())
8384   {
8385     XtSetSensitive(display_altitude_button, FALSE);
8386   }
8387 
8388 
8389   (void)XtVaCreateManagedWidget("create_appshell sep3c",
8390                                 xmSeparatorGadgetClass,
8391                                 filter_display_pane,
8392                                 XmNfontList, fontlist1,
8393                                 MY_FOREGROUND_COLOR,
8394                                 MY_BACKGROUND_COLOR,
8395                                 NULL);
8396 
8397 
8398   display_weather_button = XtVaCreateManagedWidget(langcode("PULDNDP009"),
8399                            xmToggleButtonGadgetClass,
8400                            filter_display_pane,
8401                            XmNvisibleWhenOff, TRUE,
8402                            XmNindicatorSize, 12,
8403                            XmNfontList, fontlist1,
8404                            MY_FOREGROUND_COLOR,
8405                            MY_BACKGROUND_COLOR,
8406                            NULL);
8407   XtAddCallback(display_weather_button, XmNvalueChangedCallback, Display_weather_toggle, "1");
8408   if (Display_.weather)
8409   {
8410     XmToggleButtonSetState(display_weather_button, TRUE, FALSE);
8411   }
8412   if (no_data_selected())
8413   {
8414     XtSetSensitive(display_weather_button, FALSE);
8415   }
8416 
8417 
8418   display_weather_text_button = XtVaCreateManagedWidget(langcode("PULDNDP046"),
8419                                 xmToggleButtonGadgetClass,
8420                                 filter_display_pane,
8421                                 XmNvisibleWhenOff, TRUE,
8422                                 XmNindicatorSize, 12,
8423                                 XmNfontList, fontlist1,
8424                                 MY_FOREGROUND_COLOR,
8425                                 MY_BACKGROUND_COLOR,
8426                                 NULL);
8427   XtAddCallback(display_weather_text_button, XmNvalueChangedCallback, Display_weather_text_toggle, "1");
8428   if (Display_.weather_text)
8429   {
8430     XmToggleButtonSetState(display_weather_text_button, TRUE, FALSE);
8431   }
8432   if (!Display_.weather || no_data_selected())
8433   {
8434     XtSetSensitive(display_weather_text_button, FALSE);
8435   }
8436 
8437 
8438   display_temperature_only_button = XtVaCreateManagedWidget(langcode("PULDNDP018"),
8439                                     xmToggleButtonGadgetClass,
8440                                     filter_display_pane,
8441                                     XmNvisibleWhenOff, TRUE,
8442                                     XmNindicatorSize, 12,
8443                                     XmNfontList, fontlist1,
8444                                     MY_FOREGROUND_COLOR,
8445                                     MY_BACKGROUND_COLOR,
8446                                     NULL);
8447   XtAddCallback(display_temperature_only_button, XmNvalueChangedCallback, Display_temperature_only_toggle, "1");
8448   if (Display_.temperature_only)
8449   {
8450     XmToggleButtonSetState(display_temperature_only_button, TRUE, FALSE);
8451   }
8452   if (!Display_.weather || !Display_.weather_text || no_data_selected())
8453   {
8454     XtSetSensitive(display_temperature_only_button, FALSE);
8455   }
8456 
8457 
8458   display_wind_barb_button = XtVaCreateManagedWidget(langcode("PULDNDP047"),
8459                              xmToggleButtonGadgetClass,
8460                              filter_display_pane,
8461                              XmNvisibleWhenOff, TRUE,
8462                              XmNindicatorSize, 12,
8463                              XmNfontList, fontlist1,
8464                              MY_FOREGROUND_COLOR,
8465                              MY_BACKGROUND_COLOR,
8466                              NULL);
8467   XtAddCallback(display_wind_barb_button, XmNvalueChangedCallback, Display_wind_barb_toggle, "1");
8468   if (Display_.wind_barb)
8469   {
8470     XmToggleButtonSetState(display_wind_barb_button, TRUE, FALSE);
8471   }
8472   if (!Display_.weather || no_data_selected())
8473   {
8474     XtSetSensitive(display_wind_barb_button, FALSE);
8475   }
8476 
8477 
8478   (void)XtVaCreateManagedWidget("create_appshell sep3d",
8479                                 xmSeparatorGadgetClass,
8480                                 filter_display_pane,
8481                                 XmNfontList, fontlist1,
8482                                 MY_FOREGROUND_COLOR,
8483                                 MY_BACKGROUND_COLOR,
8484                                 NULL);
8485 
8486 
8487   display_aloha_circle_button = XtVaCreateManagedWidget(langcode("PULDNDP054"),
8488                                 xmToggleButtonGadgetClass,
8489                                 filter_display_pane,
8490                                 XmNvisibleWhenOff, TRUE,
8491                                 XmNindicatorSize, 12,
8492                                 XmNfontList, fontlist1,
8493                                 MY_FOREGROUND_COLOR,
8494                                 MY_BACKGROUND_COLOR,
8495                                 NULL);
8496   XtAddCallback(display_aloha_circle_button, XmNvalueChangedCallback, Display_aloha_circle_toggle, "1");
8497   if (Display_.aloha_circle)
8498   {
8499     XmToggleButtonSetState(display_aloha_circle_button, TRUE, FALSE);
8500   }
8501 
8502 
8503   display_ambiguity_button = XtVaCreateManagedWidget(langcode("PULDNDP013"),
8504                              xmToggleButtonGadgetClass,
8505                              filter_display_pane,
8506                              XmNvisibleWhenOff, TRUE,
8507                              XmNindicatorSize, 12,
8508                              XmNfontList, fontlist1,
8509                              MY_FOREGROUND_COLOR,
8510                              MY_BACKGROUND_COLOR,
8511                              NULL);
8512   XtAddCallback(display_ambiguity_button, XmNvalueChangedCallback, Display_ambiguity_toggle, "1");
8513   if (Display_.ambiguity)
8514   {
8515     XmToggleButtonSetState(display_ambiguity_button, TRUE, FALSE);
8516   }
8517   if (no_data_selected())
8518   {
8519     XtSetSensitive(display_ambiguity_button, FALSE);
8520   }
8521 
8522 
8523   display_phg_button = XtVaCreateManagedWidget(langcode("PULDNDP008"),
8524                        xmToggleButtonGadgetClass,
8525                        filter_display_pane,
8526                        XmNvisibleWhenOff, TRUE,
8527                        XmNindicatorSize, 12,
8528                        XmNfontList, fontlist1,
8529                        MY_FOREGROUND_COLOR,
8530                        MY_BACKGROUND_COLOR,
8531                        NULL);
8532   XtAddCallback(display_phg_button, XmNvalueChangedCallback, Display_phg_toggle, "1");
8533   if (Display_.phg)
8534   {
8535     XmToggleButtonSetState(display_phg_button, TRUE, FALSE);
8536   }
8537   if (no_data_selected())
8538   {
8539     XtSetSensitive(display_phg_button, FALSE);
8540   }
8541 
8542 
8543   display_default_phg_button = XtVaCreateManagedWidget(langcode("PULDNDP021"),
8544                                xmToggleButtonGadgetClass,
8545                                filter_display_pane,
8546                                XmNvisibleWhenOff, TRUE,
8547                                XmNindicatorSize, 12,
8548                                XmNfontList, fontlist1,
8549                                MY_FOREGROUND_COLOR,
8550                                MY_BACKGROUND_COLOR,
8551                                NULL);
8552   XtAddCallback(display_default_phg_button, XmNvalueChangedCallback, Display_default_phg_toggle, "1");
8553   if (Display_.default_phg)
8554   {
8555     XmToggleButtonSetState(display_default_phg_button, TRUE, FALSE);
8556   }
8557   if (!Display_.phg || no_data_selected())
8558   {
8559     XtSetSensitive(display_default_phg_button, FALSE);
8560   }
8561 
8562 
8563   display_phg_of_moving_button = XtVaCreateManagedWidget(langcode("PULDNDP020"),
8564                                  xmToggleButtonGadgetClass,
8565                                  filter_display_pane,
8566                                  XmNvisibleWhenOff, TRUE,
8567                                  XmNindicatorSize, 12,
8568                                  XmNfontList, fontlist1,
8569                                  MY_FOREGROUND_COLOR,
8570                                  MY_BACKGROUND_COLOR,
8571                                  NULL);
8572   XtAddCallback(display_phg_of_moving_button, XmNvalueChangedCallback, Display_phg_of_moving_toggle, "1");
8573   if (Display_.phg_of_moving)
8574   {
8575     XmToggleButtonSetState(display_phg_of_moving_button, TRUE, FALSE);
8576   }
8577   if (!Display_.phg || no_data_selected())
8578   {
8579     XtSetSensitive(display_phg_of_moving_button, FALSE);
8580   }
8581 
8582 
8583   (void)XtVaCreateManagedWidget("create_appshell sep3e",
8584                                 xmSeparatorGadgetClass,
8585                                 filter_display_pane,
8586                                 XmNfontList, fontlist1,
8587                                 MY_FOREGROUND_COLOR,
8588                                 MY_BACKGROUND_COLOR,
8589                                 NULL);
8590 
8591 
8592   display_df_data_button = XtVaCreateManagedWidget(langcode("PULDNDP023"),
8593                            xmToggleButtonGadgetClass,
8594                            filter_display_pane,
8595                            XmNvisibleWhenOff, TRUE,
8596                            XmNindicatorSize, 12,
8597                            XmNfontList, fontlist1,
8598                            MY_FOREGROUND_COLOR,
8599                            MY_BACKGROUND_COLOR,
8600                            NULL);
8601   XtAddCallback(display_df_data_button, XmNvalueChangedCallback, Display_df_data_toggle, "1");
8602   if (Display_.df_data)
8603   {
8604     XmToggleButtonSetState(display_df_data_button, TRUE, FALSE);
8605   }
8606   if (no_data_selected())
8607   {
8608     XtSetSensitive(display_df_data_button, FALSE);
8609   }
8610 
8611   display_df_beamwidth_data_button = XtVaCreateManagedWidget(langcode("PULDNDP123"),
8612                                      xmToggleButtonGadgetClass,
8613                                      filter_display_pane,
8614                                      XmNvisibleWhenOff, TRUE,
8615                                      XmNindicatorSize, 12,
8616                                      XmNfontList, fontlist1,
8617                                      MY_FOREGROUND_COLOR,
8618                                      MY_BACKGROUND_COLOR,
8619                                      NULL);
8620   XtAddCallback(display_df_beamwidth_data_button, XmNvalueChangedCallback, Display_df_beamwidth_data_toggle, "1");
8621   if (Display_.df_beamwidth_data)
8622   {
8623     XmToggleButtonSetState(display_df_beamwidth_data_button, TRUE, FALSE);
8624   }
8625   if (!Display_.df_data || no_data_selected())
8626   {
8627     XtSetSensitive(display_df_beamwidth_data_button, FALSE);
8628   }
8629 
8630   display_df_bearing_data_button = XtVaCreateManagedWidget(langcode("PULDNDP223"),
8631                                    xmToggleButtonGadgetClass,
8632                                    filter_display_pane,
8633                                    XmNvisibleWhenOff, TRUE,
8634                                    XmNindicatorSize, 12,
8635                                    XmNfontList, fontlist1,
8636                                    MY_FOREGROUND_COLOR,
8637                                    MY_BACKGROUND_COLOR,
8638                                    NULL);
8639   XtAddCallback(display_df_bearing_data_button, XmNvalueChangedCallback, Display_df_bearing_data_toggle, "1");
8640   if (Display_.df_bearing_data)
8641   {
8642     XmToggleButtonSetState(display_df_bearing_data_button, TRUE, FALSE);
8643   }
8644   if (!Display_.df_data || no_data_selected())
8645   {
8646     XtSetSensitive(display_df_bearing_data_button, FALSE);
8647   }
8648 
8649   (void)XtVaCreateManagedWidget("create_appshell sep3e",
8650                                 xmSeparatorGadgetClass,
8651                                 filter_display_pane,
8652                                 XmNfontList, fontlist1,
8653                                 MY_FOREGROUND_COLOR,
8654                                 MY_BACKGROUND_COLOR,
8655                                 NULL);
8656 
8657   display_dr_data_button = XtVaCreateManagedWidget(langcode("PULDNDP035"),
8658                            xmToggleButtonGadgetClass,
8659                            filter_display_pane,
8660                            XmNvisibleWhenOff, TRUE,
8661                            XmNindicatorSize, 12,
8662                            XmNfontList, fontlist1,
8663                            MY_FOREGROUND_COLOR,
8664                            MY_BACKGROUND_COLOR,
8665                            NULL);
8666   XtAddCallback(display_dr_data_button, XmNvalueChangedCallback, Display_dr_data_toggle, "1");
8667   if (Display_.dr_data)
8668   {
8669     XmToggleButtonSetState(display_dr_data_button, TRUE, FALSE);
8670   }
8671   if (no_data_selected())
8672   {
8673     XtSetSensitive(display_dr_data_button, FALSE);
8674   }
8675 
8676 
8677   display_dr_arc_button = XtVaCreateManagedWidget(langcode("PULDNDP036"),
8678                           xmToggleButtonGadgetClass,
8679                           filter_display_pane,
8680                           XmNvisibleWhenOff, TRUE,
8681                           XmNindicatorSize, 12,
8682                           XmNfontList, fontlist1,
8683                           MY_FOREGROUND_COLOR,
8684                           MY_BACKGROUND_COLOR,
8685                           NULL);
8686   XtAddCallback(display_dr_arc_button, XmNvalueChangedCallback, Display_dr_arc_toggle, "1");
8687   if (Display_.dr_arc)
8688   {
8689     XmToggleButtonSetState(display_dr_arc_button, TRUE, FALSE);
8690   }
8691   if (!Display_.dr_data || no_data_selected())
8692   {
8693     XtSetSensitive(display_dr_arc_button, FALSE);
8694   }
8695 
8696 
8697   display_dr_course_button = XtVaCreateManagedWidget(langcode("PULDNDP037"),
8698                              xmToggleButtonGadgetClass,
8699                              filter_display_pane,
8700                              XmNvisibleWhenOff, TRUE,
8701                              XmNindicatorSize, 12,
8702                              XmNfontList, fontlist1,
8703                              MY_FOREGROUND_COLOR,
8704                              MY_BACKGROUND_COLOR,
8705                              NULL);
8706   XtAddCallback(display_dr_course_button, XmNvalueChangedCallback, Display_dr_course_toggle, "1");
8707   if (Display_.dr_course)
8708   {
8709     XmToggleButtonSetState(display_dr_course_button, TRUE, FALSE);
8710   }
8711   if (!Display_.dr_data || no_data_selected())
8712   {
8713     XtSetSensitive(display_dr_course_button, FALSE);
8714   }
8715 
8716 
8717   display_dr_symbol_button = XtVaCreateManagedWidget(langcode("PULDNDP038"),
8718                              xmToggleButtonGadgetClass,
8719                              filter_display_pane,
8720                              XmNvisibleWhenOff, TRUE,
8721                              XmNindicatorSize, 12,
8722                              XmNfontList, fontlist1,
8723                              MY_FOREGROUND_COLOR,
8724                              MY_BACKGROUND_COLOR,
8725                              NULL);
8726   XtAddCallback(display_dr_symbol_button, XmNvalueChangedCallback, Display_dr_symbol_toggle, "1");
8727   if (Display_.dr_symbol)
8728   {
8729     XmToggleButtonSetState(display_dr_symbol_button, TRUE, FALSE);
8730   }
8731   if (!Display_.dr_data || no_data_selected())
8732   {
8733     XtSetSensitive(display_dr_symbol_button, FALSE);
8734   }
8735 
8736 
8737   (void)XtVaCreateManagedWidget("create_appshell sep3f",
8738                                 xmSeparatorGadgetClass,
8739                                 filter_display_pane,
8740                                 XmNfontList, fontlist1,
8741                                 MY_FOREGROUND_COLOR,
8742                                 MY_BACKGROUND_COLOR,
8743                                 NULL);
8744 
8745 
8746   display_dist_bearing_button = XtVaCreateManagedWidget(langcode("PULDNDP005"),
8747                                 xmToggleButtonGadgetClass,
8748                                 filter_display_pane,
8749                                 XmNvisibleWhenOff, TRUE,
8750                                 XmNindicatorSize, 12,
8751                                 XmNfontList, fontlist1,
8752                                 MY_FOREGROUND_COLOR,
8753                                 MY_BACKGROUND_COLOR,
8754                                 NULL);
8755   XtAddCallback(display_dist_bearing_button, XmNvalueChangedCallback, Display_dist_bearing_toggle, "1");
8756   if (Display_.dist_bearing)
8757   {
8758     XmToggleButtonSetState(display_dist_bearing_button, TRUE, FALSE);
8759   }
8760   if (no_data_selected())
8761   {
8762     XtSetSensitive(display_dist_bearing_button, FALSE);
8763   }
8764 
8765 
8766   display_last_heard_button = XtVaCreateManagedWidget(langcode("PULDNDP024"),
8767                               xmToggleButtonGadgetClass,
8768                               filter_display_pane,
8769                               XmNvisibleWhenOff, TRUE,
8770                               XmNindicatorSize, 12,
8771                               XmNfontList, fontlist1,
8772                               MY_FOREGROUND_COLOR,
8773                               MY_BACKGROUND_COLOR,
8774                               NULL);
8775   XtAddCallback(display_last_heard_button, XmNvalueChangedCallback, Display_last_heard_toggle, "1");
8776   if (Display_.last_heard)
8777   {
8778     XmToggleButtonSetState(display_last_heard_button, TRUE, FALSE);
8779   }
8780   if (no_data_selected())
8781   {
8782     XtSetSensitive(display_last_heard_button, FALSE);
8783   }
8784 
8785 
8786   // End of Displayed Info Filtering
8787 
8788 
8789 
8790   (void)XtVaCreateManagedWidget("create_appshell sep3g",
8791                                 xmSeparatorGadgetClass,
8792                                 stationspane,
8793                                 XmNfontList, fontlist1,
8794                                 MY_FOREGROUND_COLOR,
8795                                 MY_BACKGROUND_COLOR,
8796                                 NULL);
8797 
8798   (void)XtVaCreateManagedWidget("create_appshell sep3h",
8799                                 xmSeparatorGadgetClass,
8800                                 stationspane,
8801                                 XmNfontList, fontlist1,
8802                                 MY_FOREGROUND_COLOR,
8803                                 MY_BACKGROUND_COLOR,
8804                                 NULL);
8805 
8806   ac = 0;
8807   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
8808   ac++;
8809   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
8810   ac++;
8811   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
8812   ac++;
8813   XtSetArg(al[ac], XmNtraversalOn, TRUE);
8814   ac++;
8815   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
8816   ac++;
8817   XtSetArg(al[ac], XmNfontList,        fontlist1);
8818   ac++;
8819 
8820 
8821   station_config_pane  = XmCreatePulldownMenu(stationspane,
8822                          "stations_config_pane",
8823                          al,
8824                          ac);
8825 
8826   //station_config_button
8827   XtVaCreateManagedWidget(langcode("PULDNFI001"),
8828                           xmCascadeButtonGadgetClass,
8829                           stationspane,
8830                           XmNsubMenuId,station_config_pane,
8831                           XmNmnemonic,langcode_hotkey("PULDNFI001"),
8832                           XmNfontList, fontlist1,
8833                           MY_FOREGROUND_COLOR,
8834                           MY_BACKGROUND_COLOR,
8835                           NULL);
8836 
8837 
8838   object_history_refresh_button = XtVaCreateManagedWidget(langcode("PULDNDP048"),
8839                                   xmPushButtonGadgetClass,
8840                                   station_config_pane,
8841                                   XmNmnemonic,langcode_hotkey("PULDNDP048"),
8842                                   XmNfontList, fontlist1,
8843                                   MY_FOREGROUND_COLOR,
8844                                   MY_BACKGROUND_COLOR,
8845                                   NULL);
8846 
8847   object_history_clear_button = XtVaCreateManagedWidget(langcode("PULDNDP025"),
8848                                 xmPushButtonGadgetClass,
8849                                 station_config_pane,
8850                                 XmNmnemonic,langcode_hotkey("PULDNDP025"),
8851                                 XmNfontList, fontlist1,
8852                                 MY_FOREGROUND_COLOR,
8853                                 MY_BACKGROUND_COLOR,
8854                                 NULL);
8855 
8856   // "Clear All Tactical Calls"
8857   tactical_clear_button = XtVaCreateManagedWidget(langcode("PULDNDP049"),
8858                           xmPushButtonGadgetClass,
8859                           station_config_pane,
8860 //            XmNmnemonic,langcode_hotkey("PULDNDP049"),
8861                           XmNfontList, fontlist1,
8862                           MY_FOREGROUND_COLOR,
8863                           MY_BACKGROUND_COLOR,
8864                           NULL);
8865 
8866 
8867   // "Clear Tactical Call History"
8868   tactical_history_clear_button = XtVaCreateManagedWidget(langcode("PULDNDP050"),
8869                                   xmPushButtonGadgetClass,
8870                                   station_config_pane,
8871 //            XmNmnemonic,langcode_hotkey("PULDNDP050"),
8872                                   XmNfontList, fontlist1,
8873                                   MY_FOREGROUND_COLOR,
8874                                   MY_BACKGROUND_COLOR,
8875                                   NULL);
8876 
8877   tracks_clear_button = XtVaCreateManagedWidget(langcode("PULDNDP016"),
8878                         xmPushButtonGadgetClass,
8879                         station_config_pane,
8880                         XmNmnemonic,langcode_hotkey("PULDNDP016"),
8881                         XmNfontList, fontlist1,
8882                         MY_FOREGROUND_COLOR,
8883                         MY_BACKGROUND_COLOR,
8884                         NULL);
8885 
8886   station_clear_button = XtVaCreateManagedWidget(langcode("PULDNDP015"),
8887                          xmPushButtonGadgetClass,
8888                          station_config_pane,
8889                          XmNmnemonic,langcode_hotkey("PULDNDP015"),
8890                          XmNfontList, fontlist1,
8891                          MY_FOREGROUND_COLOR,
8892                          MY_BACKGROUND_COLOR,
8893                          NULL);
8894 
8895 //--------------------------------------------------------------------
8896 
8897   /* Messages */
8898   send_message_to_button = XtVaCreateManagedWidget(langcode("PULDNMG001"),
8899                            xmPushButtonGadgetClass,
8900                            messagepane,
8901                            XmNmnemonic,langcode_hotkey("PULDNMG001"),
8902                            XmNfontList, fontlist1,
8903                            MY_FOREGROUND_COLOR,
8904                            MY_BACKGROUND_COLOR,
8905                            NULL);
8906   show_pending_messages_button = XtVaCreateManagedWidget(langcode("PULDNMG007"),
8907                                  xmPushButtonGadgetClass,
8908                                  messagepane,
8909                                  XmNmnemonic,langcode_hotkey("PULDNMG007"),
8910                                  XmNfontList, fontlist1,
8911                                  MY_FOREGROUND_COLOR,
8912                                  MY_BACKGROUND_COLOR,
8913                                  NULL);
8914   open_messages_group_button = XtVaCreateManagedWidget(langcode("PULDNMG002"),
8915                                xmPushButtonGadgetClass,
8916                                messagepane,
8917                                XmNmnemonic,langcode_hotkey("PULDNMG002"),
8918                                XmNfontList, fontlist1,
8919                                MY_FOREGROUND_COLOR,
8920                                MY_BACKGROUND_COLOR,
8921                                NULL);
8922   clear_messages_button= XtVaCreateManagedWidget(langcode("PULDNMG003"),
8923                          xmPushButtonGadgetClass,
8924                          messagepane,
8925                          XmNmnemonic,langcode_hotkey("PULDNMG003"),
8926                          XmNfontList, fontlist1,
8927                          MY_FOREGROUND_COLOR,
8928                          MY_BACKGROUND_COLOR,
8929                          NULL);
8930 
8931   (void)XtVaCreateManagedWidget("create_appshell sep4",
8932                                 xmSeparatorGadgetClass,
8933                                 messagepane,
8934                                 XmNfontList, fontlist1,
8935                                 MY_FOREGROUND_COLOR,
8936                                 MY_BACKGROUND_COLOR,
8937                                 NULL);
8938 
8939   General_q_button = XtVaCreateManagedWidget(langcode("PULDQUS001"),
8940                      xmPushButtonGadgetClass,
8941                      messagepane,
8942                      XmNmnemonic,langcode_hotkey("PULDQUS001"),
8943                      XmNfontList, fontlist1,
8944                      MY_FOREGROUND_COLOR,
8945                      MY_BACKGROUND_COLOR,
8946                      NULL);
8947   IGate_q_button = XtVaCreateManagedWidget(langcode("PULDQUS002"),
8948                    xmPushButtonGadgetClass,
8949                    messagepane,
8950                    XmNmnemonic,langcode_hotkey("PULDQUS002"),
8951                    XmNfontList, fontlist1,
8952                    MY_FOREGROUND_COLOR,
8953                    MY_BACKGROUND_COLOR,
8954                    NULL);
8955   WX_q_button = XtVaCreateManagedWidget(langcode("PULDQUS003"),
8956                                         xmPushButtonGadgetClass,
8957                                         messagepane,
8958                                         XmNmnemonic,langcode_hotkey("PULDQUS003"),
8959                                         XmNfontList, fontlist1,
8960                                         MY_FOREGROUND_COLOR,
8961                                         MY_BACKGROUND_COLOR,
8962                                         NULL);
8963 
8964   (void)XtVaCreateManagedWidget("create_appshell sep4a",
8965                                 xmSeparatorGadgetClass,
8966                                 messagepane,
8967                                 XmNfontList, fontlist1,
8968                                 MY_FOREGROUND_COLOR,
8969                                 MY_BACKGROUND_COLOR,
8970                                 NULL);
8971 
8972   auto_msg_set_button = XtVaCreateManagedWidget(langcode("PULDNMG004"),
8973                         xmPushButtonGadgetClass,
8974                         messagepane,
8975                         XmNmnemonic,langcode_hotkey("PULDNMG004"),
8976                         XmNfontList, fontlist1,
8977                         MY_FOREGROUND_COLOR,
8978                         MY_BACKGROUND_COLOR,
8979                         NULL);
8980 
8981 
8982   auto_msg_toggle = XtVaCreateManagedWidget(langcode("PULDNMG005"),
8983                     xmToggleButtonGadgetClass,
8984                     messagepane,
8985                     XmNvisibleWhenOff, TRUE,
8986                     XmNindicatorSize, 12,
8987                     XmNfontList, fontlist1,
8988                     MY_FOREGROUND_COLOR,
8989                     MY_BACKGROUND_COLOR,
8990                     NULL);
8991   XtAddCallback(auto_msg_toggle,XmNvalueChangedCallback,Auto_msg_toggle,"1");
8992 
8993   (void)XtVaCreateManagedWidget("create_appshell sep5",
8994                                 xmSeparatorGadgetClass,
8995                                 messagepane,
8996                                 XmNfontList, fontlist1,
8997                                 MY_FOREGROUND_COLOR,
8998                                 MY_BACKGROUND_COLOR,
8999                                 NULL);
9000 
9001   satellite_msg_ack_toggle = XtVaCreateManagedWidget(langcode("PULDNMG006"),
9002                              xmToggleButtonGadgetClass,
9003                              messagepane,
9004                              XmNvisibleWhenOff, TRUE,
9005                              XmNindicatorSize, 12,
9006                              XmNfontList, fontlist1,
9007                              MY_FOREGROUND_COLOR,
9008                              MY_BACKGROUND_COLOR,
9009                              NULL);
9010   XtAddCallback(satellite_msg_ack_toggle,XmNvalueChangedCallback,Satellite_msg_ack_toggle,"1");
9011 
9012 
9013 
9014   /* Interface */
9015   iface_connect_button = XtVaCreateManagedWidget(langcode("PULDNTNT04"),
9016                          xmPushButtonGadgetClass,
9017                          ifacepane,
9018                          XmNmnemonic,langcode_hotkey("PULDNTNT04"),
9019                          XmNfontList, fontlist1,
9020                          MY_FOREGROUND_COLOR,
9021                          MY_BACKGROUND_COLOR,
9022                          NULL);
9023 
9024   (void)XtVaCreateManagedWidget("create_appshell sep5a",
9025                                 xmSeparatorGadgetClass,
9026                                 ifacepane,
9027                                 XmNfontList, fontlist1,
9028                                 MY_FOREGROUND_COLOR,
9029                                 MY_BACKGROUND_COLOR,
9030                                 NULL);
9031 
9032 
9033   transmit_disable_toggle =  XtVaCreateManagedWidget(langcode("PULDNTNT03"),
9034                              xmToggleButtonGadgetClass,
9035                              ifacepane,
9036                              XmNvisibleWhenOff, TRUE,
9037                              XmNindicatorSize, 12,
9038                              XmNfontList, fontlist1,
9039                              MY_FOREGROUND_COLOR,
9040                              MY_BACKGROUND_COLOR,
9041                              NULL);
9042   XtAddCallback(transmit_disable_toggle,XmNvalueChangedCallback,Transmit_disable_toggle,"1");
9043   if (transmit_disable)
9044   {
9045     XmToggleButtonSetState(transmit_disable_toggle,TRUE,FALSE);
9046   }
9047 
9048 
9049   posit_tx_disable_toggle = XtVaCreateManagedWidget(langcode("PULDNTNT05"),
9050                             xmToggleButtonGadgetClass,
9051                             ifacepane,
9052                             XmNvisibleWhenOff, TRUE,
9053                             XmNindicatorSize, 12,
9054                             XmNfontList, fontlist1,
9055                             MY_FOREGROUND_COLOR,
9056                             MY_BACKGROUND_COLOR,
9057                             NULL);
9058   XtAddCallback(posit_tx_disable_toggle,XmNvalueChangedCallback,Posit_tx_disable_toggle,"1");
9059   if (posit_tx_disable)
9060   {
9061     XmToggleButtonSetState(posit_tx_disable_toggle,TRUE,FALSE);
9062   }
9063   if (transmit_disable)
9064   {
9065     XtSetSensitive(posit_tx_disable_toggle,FALSE);
9066   }
9067 
9068 
9069   object_tx_disable_toggle = XtVaCreateManagedWidget(langcode("PULDNTNT06"),
9070                              xmToggleButtonGadgetClass,
9071                              ifacepane,
9072                              XmNvisibleWhenOff, TRUE,
9073                              XmNindicatorSize, 12,
9074                              XmNfontList, fontlist1,
9075                              MY_FOREGROUND_COLOR,
9076                              MY_BACKGROUND_COLOR,
9077                              NULL);
9078   XtAddCallback(object_tx_disable_toggle,XmNvalueChangedCallback,Object_tx_disable_toggle,"1");
9079   if (object_tx_disable)
9080   {
9081     XmToggleButtonSetState(object_tx_disable_toggle,TRUE,FALSE);
9082   }
9083   if (transmit_disable)
9084   {
9085     XtSetSensitive(object_tx_disable_toggle,FALSE);
9086   }
9087 
9088 
9089   server_port_toggle = XtVaCreateManagedWidget(langcode("PULDNTNT11"),
9090                        xmToggleButtonGadgetClass,
9091                        ifacepane,
9092                        XmNvisibleWhenOff, TRUE,
9093                        XmNindicatorSize, 12,
9094                        XmNfontList, fontlist1,
9095                        MY_FOREGROUND_COLOR,
9096                        MY_BACKGROUND_COLOR,
9097                        NULL);
9098   XtAddCallback(server_port_toggle,XmNvalueChangedCallback,Server_port_toggle,"1");
9099   if (enable_server_port)
9100   {
9101     XmToggleButtonSetState(server_port_toggle,TRUE,FALSE);
9102   }
9103 
9104 
9105   (void)XtVaCreateManagedWidget("create_appshell sep5b",
9106                                 xmSeparatorGadgetClass,
9107                                 ifacepane,
9108                                 XmNfontList, fontlist1,
9109                                 MY_FOREGROUND_COLOR,
9110                                 MY_BACKGROUND_COLOR,
9111                                 NULL);
9112 
9113 
9114   iface_transmit_now = XtVaCreateManagedWidget(langcode("PULDNTNT01"),
9115                        xmPushButtonGadgetClass,
9116                        ifacepane,
9117                        XmNmnemonic,langcode_hotkey("PULDNTNT01"),
9118                        XmNfontList, fontlist1,
9119                        MY_FOREGROUND_COLOR,
9120                        MY_BACKGROUND_COLOR,
9121                        NULL);
9122   if (transmit_disable)
9123   {
9124     XtSetSensitive(iface_transmit_now,FALSE);
9125   }
9126 
9127 #ifdef HAVE_GPSMAN
9128   Fetch_gps_track = XtVaCreateManagedWidget(langcode("PULDNTNT07"),
9129                     xmPushButtonGadgetClass,
9130                     ifacepane,
9131                     XmNmnemonic,langcode_hotkey("PULDNTNT07"),
9132                     XmNfontList, fontlist1,
9133                     MY_FOREGROUND_COLOR,
9134                     MY_BACKGROUND_COLOR,
9135                     NULL);
9136 
9137   Fetch_gps_route = XtVaCreateManagedWidget(langcode("PULDNTNT08"),
9138                     xmPushButtonGadgetClass,
9139                     ifacepane,
9140                     XmNmnemonic,langcode_hotkey("PULDNTNT08"),
9141                     XmNfontList, fontlist1,
9142                     MY_FOREGROUND_COLOR,
9143                     MY_BACKGROUND_COLOR,
9144                     NULL);
9145 
9146   Fetch_gps_waypoints = XtVaCreateManagedWidget(langcode("PULDNTNT09"),
9147                         xmPushButtonGadgetClass,
9148                         ifacepane,
9149                         XmNmnemonic,langcode_hotkey("PULDNTNT09"),
9150                         XmNfontList, fontlist1,
9151                         MY_FOREGROUND_COLOR,
9152                         MY_BACKGROUND_COLOR,
9153                         NULL);
9154 
9155   /*
9156       Send_gps_track = XtVaCreateManagedWidget(langcode("Send_Tr"),
9157               xmPushButtonGadgetClass,
9158               ifacepane,
9159               XmNmnemonic,langcode_hotkey("Send_Tr"),
9160               XmNfontList, fontlist1,
9161               MY_FOREGROUND_COLOR,
9162               MY_BACKGROUND_COLOR,
9163               NULL);
9164 
9165       Send_gps_route = XtVaCreateManagedWidget(langcode("Send_Rt"),
9166               xmPushButtonGadgetClass,
9167               ifacepane,
9168               XmNmnemonic,langcode_hotkey("Send_Rt"),
9169               XmNfontList, fontlist1,
9170               MY_FOREGROUND_COLOR,
9171               MY_BACKGROUND_COLOR,
9172               NULL);
9173 
9174       Send_gps_waypoints = XtVaCreateManagedWidget(langcode("Send_Wp"),
9175               xmPushButtonGadgetClass,
9176               ifacepane,
9177               XmNmnemonic,langcode_hotkey("Send_Wp"),
9178               XmNfontList, fontlist1,
9179               MY_FOREGROUND_COLOR,
9180               MY_BACKGROUND_COLOR,
9181               NULL);
9182   */
9183 
9184   Fetch_RINO_waypoints = XtVaCreateManagedWidget(langcode("PULDNTNT10"),
9185                          xmPushButtonGadgetClass,
9186                          ifacepane,
9187                          XmNmnemonic,langcode_hotkey("PULDNTNT10"),
9188                          XmNfontList, fontlist1,
9189                          MY_FOREGROUND_COLOR,
9190                          MY_BACKGROUND_COLOR,
9191                          NULL);
9192 
9193 #endif  // HAVE_GPSMAN
9194 
9195   /* Help*/
9196   help_about = XtVaCreateManagedWidget(langcode("PULDNHEL01"),
9197                                        xmPushButtonGadgetClass,
9198                                        helppane,
9199                                        XmNmnemonic,langcode_hotkey("PULDNHEL01"),
9200                                        XmNfontList, fontlist1,
9201                                        MY_FOREGROUND_COLOR,
9202                                        MY_BACKGROUND_COLOR,
9203                                        NULL);
9204   help_help = XtVaCreateManagedWidget(langcode("PULDNHEL02"),
9205                                       xmPushButtonGadgetClass,
9206                                       helppane,
9207                                       XmNmnemonic,langcode_hotkey("PULDNHEL02"),
9208                                       XmNfontList, fontlist1,
9209                                       MY_FOREGROUND_COLOR,
9210                                       MY_BACKGROUND_COLOR,
9211                                       NULL);
9212 
9213   (void)XtVaCreateManagedWidget("create_appshell sephelp",
9214                                 xmSeparatorGadgetClass,
9215                                 helppane,
9216                                 XmNfontList, fontlist1,
9217                                 MY_FOREGROUND_COLOR,
9218                                 MY_BACKGROUND_COLOR,
9219                                 NULL);
9220 
9221   ac = 0;
9222   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
9223   ac++;
9224   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
9225   ac++;
9226   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
9227   ac++;
9228   XtSetArg(al[ac], XmNtraversalOn, TRUE);
9229   ac++;
9230   XtSetArg(al[ac], XmNfontList,        fontlist1);
9231   ac++;
9232 
9233 
9234   help_emergency_pane = XmCreatePulldownMenu(helppane,
9235                         "help_emergency_pane",
9236                         al,
9237                         ac);
9238 
9239   //help_emergency_button
9240   XtVaCreateManagedWidget(langcode("PULDNHEL03"),
9241                           xmCascadeButtonGadgetClass,
9242                           helppane,
9243                           XmNsubMenuId,help_emergency_pane,
9244                           XmNmnemonic,langcode_hotkey("PULDNHEL03"),
9245                           XmNfontList, fontlist1,
9246                           MY_FOREGROUND_COLOR,
9247                           MY_BACKGROUND_COLOR,
9248                           NULL);
9249 
9250   emergency_beacon_toggle =  XtVaCreateManagedWidget(langcode("PULDNHEL04"),
9251                              xmToggleButtonGadgetClass,
9252                              help_emergency_pane,
9253                              XmNvisibleWhenOff, TRUE,
9254                              XmNindicatorSize, 12,
9255                              XmNfontList, fontlist1,
9256                              MY_FOREGROUND_COLOR,
9257                              MY_BACKGROUND_COLOR,
9258                              NULL);
9259   XtAddCallback(emergency_beacon_toggle,XmNvalueChangedCallback,Emergency_beacon_toggle,"1");
9260   if (emergency_beacon)
9261   {
9262     XmToggleButtonSetState(emergency_beacon_toggle,TRUE,FALSE);
9263   }
9264 
9265 
9266   /* view */
9267   XtAddCallback(stations_button,      XmNactivateCallback,Station_List,"0");
9268   XtAddCallback(mobile_button,        XmNactivateCallback,Station_List,"1");
9269   XtAddCallback(weather_button,       XmNactivateCallback,Station_List,"2");
9270   XtAddCallback(localstations_button, XmNactivateCallback,Station_List,"3");
9271   XtAddCallback(laststations_button,  XmNactivateCallback,Station_List,"4");
9272   XtAddCallback(objectstations_button,XmNactivateCallback,Station_List,"5");
9273   XtAddCallback(objectmystations_button,XmNactivateCallback,Station_List,"6");
9274   XtAddCallback(CAD1,XmNactivateCallback,Draw_CAD_Objects_list_dialog,NULL);
9275 
9276   /* button callbacks */
9277   XtAddCallback(General_q_button,     XmNactivateCallback,General_query,"");
9278   XtAddCallback(IGate_q_button,       XmNactivateCallback,IGate_query,NULL);
9279   XtAddCallback(WX_q_button,          XmNactivateCallback,WX_query,NULL);
9280   XtAddCallback(station_clear_button, XmNactivateCallback,Stations_Clear,NULL);
9281   XtAddCallback(tracks_clear_button,  XmNactivateCallback,Tracks_All_Clear,NULL);
9282   XtAddCallback(object_history_refresh_button, XmNactivateCallback,Object_History_Refresh,NULL);
9283   XtAddCallback(object_history_clear_button, XmNactivateCallback,Object_History_Clear,NULL);
9284   XtAddCallback(tactical_clear_button, XmNactivateCallback,Tactical_Callsign_Clear,NULL);
9285   XtAddCallback(tactical_history_clear_button, XmNactivateCallback,Tactical_Callsign_History_Clear,NULL);
9286   XtAddCallback(exit_button,   XmNactivateCallback,Menu_Quit,NULL);
9287 
9288   XtAddCallback(defaults_button,      XmNactivateCallback,Configure_defaults,NULL);
9289   XtAddCallback(timing_button,        XmNactivateCallback,Configure_timing,NULL);
9290   XtAddCallback(coordinates_button,   XmNactivateCallback,Configure_coordinates,NULL);
9291   XtAddCallback(aa_button,            XmNactivateCallback,Configure_audio_alarms,NULL);
9292   XtAddCallback(speech_button,        XmNactivateCallback,Configure_speech,NULL);
9293   XtAddCallback(smart_beacon_button,  XmNactivateCallback,Smart_Beacon,NULL);
9294   XtAddCallback(map_indexer_button,   XmNactivateCallback,Index_Maps_Now,NULL);
9295   XtAddCallback(map_all_indexer_button,XmNactivateCallback,Index_Maps_Now,"1");
9296   XtAddCallback(station_button,       XmNactivateCallback,Configure_station,NULL);
9297 
9298   XtAddCallback(help_about,           XmNactivateCallback,Help_About,NULL);
9299   XtAddCallback(help_help,            XmNactivateCallback,Help_Index,NULL);
9300 
9301   /* TNC */
9302   XtAddCallback(iface_transmit_now,   XmNactivateCallback,TNC_Transmit_now,NULL);
9303 
9304 #ifdef HAVE_GPSMAN
9305   XtAddCallback(Fetch_gps_track,      XmNactivateCallback,GPS_operations,"1");
9306   XtAddCallback(Fetch_gps_route,      XmNactivateCallback,GPS_operations,"2");
9307   XtAddCallback(Fetch_gps_waypoints,  XmNactivateCallback,GPS_operations,"3");
9308 //    XtAddCallback(Send_gps_track,       XmNactivateCallback,GPS_operations,"4");
9309 //    XtAddCallback(Send_gps_route,       XmNactivateCallback,GPS_operations,"5");
9310 //    XtAddCallback(Send_gps_waypoints,   XmNactivateCallback,GPS_operations,"6");
9311   XtAddCallback(Fetch_RINO_waypoints, XmNactivateCallback,GPS_operations,"7");
9312 #endif  // HAVE_GPSMAN
9313 
9314   XtAddCallback(auto_msg_set_button,XmNactivateCallback,Auto_msg_set,NULL);
9315 
9316   XtAddCallback(iface_connect_button, XmNactivateCallback,control_interface,NULL);
9317 
9318   XtAddCallback(open_file_button,     XmNactivateCallback,Read_File_Selection,NULL);
9319 
9320   XtAddCallback(bullet_button,        XmNactivateCallback,Bulletins,NULL);
9321   XtAddCallback(packet_data_button,   XmNactivateCallback,Display_data,NULL);
9322   XtAddCallback(locate_button,        XmNactivateCallback,Locate_station,NULL);
9323   XtAddCallback(alert_button,         XmNactivateCallback,Display_Wx_Alert,NULL);
9324   XtAddCallback(view_messages_button, XmNactivateCallback,view_all_messages,NULL);
9325   XtAddCallback(gps_status_button,XmNactivateCallback,view_gps_status,NULL);
9326 
9327   XtAddCallback(map_pointer_menu_button, XmNactivateCallback,menu_link_for_mouse_menu,NULL);
9328 
9329   XtAddCallback(wx_station_button,    XmNactivateCallback,WX_station,NULL);
9330   XtAddCallback(jump_button,          XmNactivateCallback, Jump_location, NULL);
9331   XtAddCallback(locate_place_button,  XmNactivateCallback,Locate_place,NULL);
9332   XtAddCallback(geocode_place_button,  XmNactivateCallback,Geocoder_place,NULL);
9333   XtAddCallback(coordinate_calculator_button, XmNactivateCallback,Coordinate_calc,"");
9334 
9335   XtAddCallback(send_message_to_button,       XmNactivateCallback,Send_message,NULL);
9336   XtAddCallback(show_pending_messages_button, XmNactivateCallback,Show_pending_messages,NULL);
9337   XtAddCallback(open_messages_group_button,   XmNactivateCallback,Send_message,"*");
9338   XtAddCallback(clear_messages_button,XmNactivateCallback,Clear_messages,NULL);
9339   XtAddCallback(save_button,          XmNactivateCallback,Save_Config,NULL);
9340   XtAddCallback(test_button,          XmNactivateCallback,Test,NULL);
9341   if (!debug_level)
9342   {
9343     XtSetSensitive(test_button, False);
9344   }
9345 
9346   XtAddCallback(debug_level_button,   XmNactivateCallback, Change_Debug_Level,NULL);
9347 //    XtSetSensitive(debug_level_button, False);
9348 
9349   XtAddCallback(uptime_button,   XmNactivateCallback, Compute_Uptime,NULL);
9350   XtAddCallback(aloha_button,   XmNactivateCallback, Show_Aloha_Stats,NULL);
9351   //XtSetSensitive(uptime_button, False);
9352 
9353 
9354 
9355   // Toolbar
9356   toolbar = XtVaCreateWidget("Toolbar form",
9357                              xmFormWidgetClass,
9358                              form,
9359                              XmNtopAttachment, XmATTACH_FORM,
9360                              XmNtopOffset, 0,
9361                              XmNbottomAttachment, XmATTACH_NONE,
9362                              XmNleftAttachment, XmATTACH_WIDGET,
9363                              XmNleftWidget, menubar,
9364                              XmNleftOffset, 0,
9365                              XmNrightAttachment, XmATTACH_NONE,
9366                              XmNautoUnmanage, FALSE,
9367                              XmNshadowThickness, 1,
9368                              XmNnavigationType, XmTAB_GROUP,
9369                              XmNtraversalOn, FALSE,
9370                              XmNfontList, fontlist1,
9371                              MY_FOREGROUND_COLOR,
9372                              MY_BACKGROUND_COLOR,
9373                              NULL);
9374 
9375   trackme_button=XtVaCreateManagedWidget(langcode("POPUPMA022"),
9376                                          xmToggleButtonGadgetClass,
9377                                          toolbar,
9378                                          XmNtopAttachment, XmATTACH_FORM,
9379                                          XmNtopOffset, -5,
9380                                          XmNbottomAttachment, XmATTACH_NONE,
9381                                          XmNbottomOffset, 0,
9382                                          XmNleftAttachment, XmATTACH_FORM,
9383                                          XmNleftOffset, 0,
9384                                          XmNrightAttachment, XmATTACH_NONE,
9385                                          XmNrightOffset, 0,
9386                                          XmNvisibleWhenOff, TRUE,
9387                                          XmNindicatorSize, 12,
9388                                          XmNnavigationType, XmTAB_GROUP,
9389                                          XmNtraversalOn, FALSE,
9390                                          XmNfontList, fontlist1,
9391                                          MY_FOREGROUND_COLOR,
9392                                          MY_BACKGROUND_COLOR,
9393                                          NULL);
9394   XtAddCallback(trackme_button,XmNvalueChangedCallback,Track_Me,"1");
9395 
9396   measure_button=XtVaCreateManagedWidget(langcode("POPUPMA020"),
9397                                          xmToggleButtonGadgetClass,
9398                                          toolbar,
9399                                          XmNtopAttachment, XmATTACH_WIDGET,
9400                                          XmNtopWidget, trackme_button,
9401                                          XmNtopOffset, -7,
9402                                          XmNbottomAttachment, XmATTACH_FORM,
9403                                          XmNbottomOffset, -5,
9404                                          XmNleftAttachment, XmATTACH_FORM,
9405                                          XmNleftOffset, 0,
9406                                          XmNrightAttachment, XmATTACH_NONE,
9407                                          XmNrightOffset, 0,
9408                                          XmNvisibleWhenOff, TRUE,
9409                                          XmNindicatorSize, 12,
9410                                          XmNnavigationType, XmTAB_GROUP,
9411                                          XmNtraversalOn, FALSE,
9412                                          XmNfontList, fontlist1,
9413                                          MY_FOREGROUND_COLOR,
9414                                          MY_BACKGROUND_COLOR,
9415                                          NULL);
9416   XtAddCallback(measure_button,XmNvalueChangedCallback,Measure_Distance,"1");
9417 
9418   cad_draw_button=XtVaCreateManagedWidget(langcode("POPUPMA030"),
9419                                           xmToggleButtonGadgetClass,
9420                                           toolbar,
9421                                           XmNtopAttachment, XmATTACH_FORM,
9422                                           XmNtopOffset, -5,
9423                                           XmNbottomAttachment, XmATTACH_NONE,
9424                                           XmNbottomOffset, 0,
9425                                           XmNleftAttachment, XmATTACH_WIDGET,
9426                                           XmNleftWidget, trackme_button,
9427                                           XmNleftOffset, 0,
9428                                           XmNrightAttachment, XmATTACH_NONE,
9429                                           XmNrightOffset, 0,
9430                                           XmNvisibleWhenOff, TRUE,
9431                                           XmNindicatorSize, 12,
9432                                           XmNnavigationType, XmTAB_GROUP,
9433                                           XmNtraversalOn, FALSE,
9434                                           XmNfontList, fontlist1,
9435                                           MY_FOREGROUND_COLOR,
9436                                           MY_BACKGROUND_COLOR,
9437                                           NULL);
9438   XtAddCallback(cad_draw_button,XmNvalueChangedCallback,Draw_CAD_Objects_mode,NULL);
9439 
9440   move_button=XtVaCreateManagedWidget(langcode("POPUPMA021"),
9441                                       xmToggleButtonGadgetClass,
9442                                       toolbar,
9443                                       XmNtopAttachment, XmATTACH_WIDGET,
9444                                       XmNtopWidget, cad_draw_button,
9445                                       XmNtopOffset, -7,
9446                                       XmNbottomAttachment, XmATTACH_FORM,
9447                                       XmNbottomOffset, -5,
9448                                       XmNleftAttachment, XmATTACH_WIDGET,
9449                                       XmNleftWidget, trackme_button,
9450                                       XmNleftOffset, 0,
9451                                       XmNrightAttachment, XmATTACH_NONE,
9452                                       XmNrightOffset, 0,
9453                                       XmNvisibleWhenOff, TRUE,
9454                                       XmNindicatorSize, 12,
9455                                       XmNnavigationType, XmTAB_GROUP,
9456                                       XmNtraversalOn, FALSE,
9457                                       XmNfontList, fontlist1,
9458                                       MY_FOREGROUND_COLOR,
9459                                       MY_BACKGROUND_COLOR,
9460                                       NULL);
9461   XtAddCallback(move_button,XmNvalueChangedCallback,Move_Object,"1");
9462 
9463 
9464 
9465 #ifdef ARROWS
9466   zoom_in_menu=XtVaCreateManagedWidget(langcode("POPUPMA002"),
9467                                        xmPushButtonWidgetClass,
9468                                        toolbar,
9469                                        XmNtopAttachment, XmATTACH_FORM,
9470                                        XmNbottomAttachment, XmATTACH_FORM,
9471                                        XmNleftAttachment, XmATTACH_WIDGET,
9472                                        XmNleftWidget, cad_draw_button,
9473                                        XmNleftOffset, 0,
9474                                        XmNrightAttachment, XmATTACH_NONE,
9475                                        XmNnavigationType, XmTAB_GROUP,
9476                                        XmNtraversalOn, FALSE,
9477                                        XmNfontList, fontlist1,
9478                                        MY_FOREGROUND_COLOR,
9479                                        MY_BACKGROUND_COLOR,
9480                                        NULL);
9481   XtAddCallback(zoom_in_menu,XmNactivateCallback,Zoom_in_no_pan,NULL);
9482   if (map_lock_pan_zoom)
9483   {
9484     XtSetSensitive(zoom_in_menu, FALSE);
9485   }
9486 
9487   zoom_out_menu=XtVaCreateManagedWidget(langcode("POPUPMA003"),
9488                                         xmPushButtonWidgetClass,
9489                                         toolbar,
9490                                         XmNtopAttachment, XmATTACH_FORM,
9491                                         XmNbottomAttachment, XmATTACH_FORM,
9492                                         XmNleftAttachment, XmATTACH_WIDGET,
9493                                         XmNleftWidget, zoom_in_menu,
9494                                         XmNleftOffset, 0,
9495                                         XmNrightAttachment, XmATTACH_NONE,
9496                                         XmNnavigationType, XmTAB_GROUP,
9497                                         XmNtraversalOn, FALSE,
9498                                         XmNfontList, fontlist1,
9499                                         MY_FOREGROUND_COLOR,
9500                                         MY_BACKGROUND_COLOR,
9501                                         NULL);
9502   XtAddCallback(zoom_out_menu,XmNactivateCallback,Zoom_out_no_pan,NULL);
9503   if (map_lock_pan_zoom)
9504   {
9505     XtSetSensitive(zoom_out_menu, FALSE);
9506   }
9507 
9508   pan_left_menu=XtVaCreateManagedWidget("create_appshell arrow1_menu",
9509                                         xmArrowButtonGadgetClass,
9510                                         toolbar,
9511                                         XmNtopAttachment, XmATTACH_FORM,
9512                                         XmNbottomAttachment, XmATTACH_FORM,
9513                                         XmNleftAttachment, XmATTACH_WIDGET,
9514                                         XmNleftWidget, zoom_out_menu,
9515                                         XmNleftOffset, 0,
9516                                         XmNrightAttachment, XmATTACH_NONE,
9517                                         XmNarrowDirection,  XmARROW_LEFT,
9518                                         XmNnavigationType, XmTAB_GROUP,
9519                                         XmNtraversalOn, FALSE,
9520                                         NULL);
9521   XtAddCallback(pan_left_menu,XmNactivateCallback,Pan_left,NULL);
9522   if (map_lock_pan_zoom)
9523   {
9524     XtSetSensitive(pan_left_menu, FALSE);
9525   }
9526 
9527   pan_up_menu=XtVaCreateManagedWidget("create_appshell arrow2_menu",
9528                                       xmArrowButtonGadgetClass,
9529                                       toolbar,
9530                                       XmNtopAttachment, XmATTACH_FORM,
9531                                       XmNbottomAttachment, XmATTACH_FORM,
9532                                       XmNleftAttachment, XmATTACH_WIDGET,
9533                                       XmNleftWidget, pan_left_menu,
9534                                       XmNleftOffset, 0,
9535                                       XmNrightAttachment, XmATTACH_NONE,
9536                                       XmNarrowDirection,  XmARROW_UP,
9537                                       XmNnavigationType, XmTAB_GROUP,
9538                                       XmNtraversalOn, FALSE,
9539                                       NULL);
9540   XtAddCallback(pan_up_menu,XmNactivateCallback,Pan_up,NULL);
9541   if (map_lock_pan_zoom)
9542   {
9543     XtSetSensitive(pan_up_menu, FALSE);
9544   }
9545 
9546   pan_down_menu=XtVaCreateManagedWidget("create_appshell arrow3_menu",
9547                                         xmArrowButtonGadgetClass,
9548                                         toolbar,
9549                                         XmNtopAttachment, XmATTACH_FORM,
9550                                         XmNbottomAttachment, XmATTACH_FORM,
9551                                         XmNleftAttachment, XmATTACH_WIDGET,
9552                                         XmNleftWidget, pan_up_menu,
9553                                         XmNleftOffset, 0,
9554                                         XmNrightAttachment, XmATTACH_NONE,
9555                                         XmNarrowDirection,  XmARROW_DOWN,
9556                                         XmNnavigationType, XmTAB_GROUP,
9557                                         XmNtraversalOn, FALSE,
9558                                         NULL);
9559   XtAddCallback(pan_down_menu,XmNactivateCallback,Pan_down,NULL);
9560   if (map_lock_pan_zoom)
9561   {
9562     XtSetSensitive(pan_down_menu, FALSE);
9563   }
9564 
9565   pan_right_menu=XtVaCreateManagedWidget("create_appshell arrow4_menu",
9566                                          xmArrowButtonGadgetClass,
9567                                          toolbar,
9568                                          XmNtopAttachment, XmATTACH_FORM,
9569                                          XmNbottomAttachment, XmATTACH_FORM,
9570                                          XmNleftAttachment, XmATTACH_WIDGET,
9571                                          XmNleftWidget, pan_down_menu,
9572                                          XmNleftOffset, 0,
9573                                          XmNrightAttachment, XmATTACH_NONE,
9574                                          XmNarrowDirection,  XmARROW_RIGHT,
9575                                          XmNnavigationType, XmTAB_GROUP,
9576                                          XmNtraversalOn, FALSE,
9577                                          NULL);
9578   XtAddCallback(pan_right_menu,XmNactivateCallback,Pan_right,NULL);
9579   if (map_lock_pan_zoom)
9580   {
9581     XtSetSensitive(pan_right_menu, FALSE);
9582   }
9583 #endif // ARROWS
9584 
9585 
9586 
9587 #define FONT_WIDTH 9
9588 
9589   // Create bottom text area
9590   //
9591 #ifdef USE_TWO_STATUS_LINES
9592 
9593   // Quantity of stations box, Bottom left corner
9594   text3 = XtVaCreateWidget("create_appshell text_output3",
9595                            xmTextFieldWidgetClass,
9596                            form,
9597                            XmNeditable,            FALSE,
9598                            XmNcursorPositionVisible, FALSE,
9599                            XmNsensitive,           STIPPLE,
9600                            XmNshadowThickness,     1,
9601                            XmNcolumns,             14,
9602                            XmNwidth,               ((22*FONT_WIDTH)+2),
9603                            XmNtopAttachment,       XmATTACH_NONE,
9604                            XmNbottomAttachment,    XmATTACH_FORM,
9605                            XmNleftAttachment,      XmATTACH_FORM,
9606                            XmNrightAttachment,     XmATTACH_NONE,
9607                            XmNnavigationType,      XmTAB_GROUP,
9608                            XmNtraversalOn,         FALSE,
9609                            XmNfontList, fontlist1,
9610                            MY_FOREGROUND_COLOR,
9611                            MY_BACKGROUND_COLOR,
9612                            NULL);
9613 
9614   // Zoom level box, Bottom second from left
9615   text4 = XtVaCreateWidget("create_appshell text_output4",
9616                            xmTextFieldWidgetClass,
9617                            form,
9618                            XmNeditable,            FALSE,
9619                            XmNcursorPositionVisible, FALSE,
9620                            XmNsensitive,           STIPPLE,
9621                            XmNshadowThickness,     1,
9622                            XmNcolumns,             10,
9623                            XmNwidth,               ((15*FONT_WIDTH)+2),
9624                            XmNtopAttachment,       XmATTACH_NONE,
9625                            XmNbottomAttachment,    XmATTACH_FORM,
9626                            XmNleftAttachment,      XmATTACH_WIDGET,
9627                            XmNleftWidget,          text3,
9628                            XmNrightAttachment,     XmATTACH_NONE,
9629                            XmNnavigationType,      XmTAB_GROUP,
9630                            XmNtraversalOn,         FALSE,
9631                            XmNfontList, fontlist1,
9632                            MY_FOREGROUND_COLOR,
9633                            MY_BACKGROUND_COLOR,
9634                            NULL);
9635 
9636   // Log indicator box, Bottom second from right
9637   log_indicator = XtVaCreateWidget(langcode("BBARSTA043"),
9638                                    xmTextFieldWidgetClass,
9639                                    form,
9640                                    XmNeditable,            FALSE,
9641                                    XmNcursorPositionVisible, FALSE,
9642                                    XmNsensitive,           STIPPLE,
9643                                    XmNshadowThickness,     1,
9644                                    XmNcolumns,             8,
9645                                    XmNwidth,               ((8*FONT_WIDTH)),
9646                                    XmNtopAttachment,       XmATTACH_NONE,
9647                                    XmNbottomAttachment,    XmATTACH_FORM,
9648                                    XmNleftAttachment,      XmATTACH_WIDGET,
9649                                    XmNleftWidget,          text4,
9650                                    XmNrightAttachment,     XmATTACH_NONE,
9651                                    XmNnavigationType,      XmTAB_GROUP,
9652                                    XmNtraversalOn,         FALSE,
9653                                    XmNfontList, fontlist1,
9654                                    MY_FOREGROUND_COLOR,
9655                                    MY_BACKGROUND_COLOR,
9656                                    NULL);
9657 
9658   // Interface status indicators, Bottom right corner
9659   iface_da = XtVaCreateWidget("create_appshell iface",
9660                               xmDrawingAreaWidgetClass,
9661                               form,
9662                               XmNwidth,               22*(MAX_IFACE_DEVICES/2),
9663                               XmNheight,              20,
9664                               XmNunitType,            XmPIXELS,
9665                               XmNtopAttachment,       XmATTACH_NONE,
9666                               XmNbottomAttachment,    XmATTACH_FORM,
9667                               XmNbottomOffset,        5,
9668                               XmNleftAttachment,      XmATTACH_WIDGET,
9669                               XmNleftWidget,          log_indicator,
9670                               XmNrightAttachment,     XmATTACH_NONE,
9671                               XmNnavigationType,      XmTAB_GROUP,
9672                               XmNtraversalOn,         FALSE,
9673                               XmNfontList, fontlist1,
9674                               MY_FOREGROUND_COLOR,
9675                               MY_BACKGROUND_COLOR,
9676                               NULL);
9677 
9678   // Message box, on Top left
9679   text = XtVaCreateWidget("create_appshell text_output",
9680                           xmTextFieldWidgetClass,
9681                           form,
9682                           XmNeditable,            FALSE,
9683                           XmNcursorPositionVisible, FALSE,
9684                           XmNsensitive,           STIPPLE,
9685                           XmNshadowThickness,     1,
9686                           XmNcolumns,             30,
9687                           XmNwidth,               ((29*FONT_WIDTH)+2),
9688                           XmNtopOffset,           4,
9689                           XmNtopAttachment,       XmATTACH_NONE,
9690                           XmNbottomAttachment,    XmATTACH_WIDGET,
9691                           XmNbottomWidget,        text3,
9692                           XmNleftAttachment,      XmATTACH_FORM,
9693                           XmNrightAttachment,     XmATTACH_NONE,
9694                           XmNnavigationType,      XmTAB_GROUP,
9695                           XmNtraversalOn,         FALSE,
9696                           XmNfontList, fontlist1,
9697                           MY_FOREGROUND_COLOR,
9698                           MY_BACKGROUND_COLOR,
9699                           NULL);
9700 
9701   // Coordinate display box, Top right
9702   text2 = XtVaCreateWidget("create_appshell text_output2",
9703                            xmTextFieldWidgetClass,
9704                            form,
9705                            XmNeditable,            FALSE,
9706                            XmNcursorPositionVisible, FALSE,
9707                            XmNsensitive,           STIPPLE,
9708                            XmNshadowThickness,     1,
9709                            XmNcolumns,             35,
9710                            XmNwidth,   do_dbstatus?((37*FONT_WIDTH)+2):((24*FONT_WIDTH)+2),
9711                            XmNtopAttachment,       XmATTACH_NONE,
9712                            XmNbottomAttachment,    XmATTACH_WIDGET,
9713                            XmNbottomWidget,        text3,
9714                            XmNleftAttachment,      XmATTACH_WIDGET,
9715                            XmNleftWidget,          text,
9716                            XmNrightAttachment,     XmATTACH_NONE,
9717                            XmNnavigationType,      XmTAB_GROUP,
9718                            XmNtraversalOn,         FALSE,
9719                            XmNfontList, fontlist1,
9720                            MY_FOREGROUND_COLOR,
9721                            MY_BACKGROUND_COLOR,
9722                            NULL);
9723 
9724 #else
9725 
9726   // Message box, on left
9727   text = XtVaCreateWidget("create_appshell text_output",
9728                           xmTextFieldWidgetClass,
9729                           form,
9730                           XmNeditable,            FALSE,
9731                           XmNcursorPositionVisible, FALSE,
9732                           XmNsensitive,           STIPPLE,
9733                           XmNshadowThickness,     1,
9734                           XmNcolumns,             30,
9735                           XmNwidth,               ((29*FONT_WIDTH)+2),
9736                           XmNtopOffset,           4,
9737                           XmNtopAttachment,       XmATTACH_NONE,
9738                           XmNbottomAttachment,    XmATTACH_FORM,
9739                           XmNleftAttachment,      XmATTACH_FORM,
9740                           XmNrightAttachment,     XmATTACH_NONE,
9741                           XmNnavigationType,      XmTAB_GROUP,
9742                           XmNtraversalOn,         FALSE,
9743                           XmNfontList, fontlist1,
9744                           MY_FOREGROUND_COLOR,
9745                           MY_BACKGROUND_COLOR,
9746                           NULL);
9747 
9748   // Coordinate display box, 2nd from left
9749   text2 = XtVaCreateWidget("create_appshell text_output2",
9750                            xmTextFieldWidgetClass,
9751                            form,
9752                            XmNeditable,            FALSE,
9753                            XmNcursorPositionVisible, FALSE,
9754                            XmNsensitive,           STIPPLE,
9755                            XmNshadowThickness,     1,
9756                            XmNcolumns,             35,
9757                            XmNwidth,   do_dbstatus?((37*FONT_WIDTH)+2):((24*FONT_WIDTH)+2),
9758                            XmNtopAttachment,       XmATTACH_NONE,
9759                            XmNbottomAttachment,    XmATTACH_FORM,
9760                            XmNleftAttachment,      XmATTACH_WIDGET,
9761                            XmNleftWidget,          text,
9762                            XmNrightAttachment,     XmATTACH_NONE,
9763                            XmNnavigationType,      XmTAB_GROUP,
9764                            XmNtraversalOn,         FALSE,
9765                            XmNfontList, fontlist1,
9766                            MY_FOREGROUND_COLOR,
9767                            MY_BACKGROUND_COLOR,
9768                            NULL);
9769 
9770   // Quantity of stations box, 3rd from left
9771   text3 = XtVaCreateWidget("create_appshell text_output3",
9772                            xmTextFieldWidgetClass,
9773                            form,
9774                            XmNeditable,            FALSE,
9775                            XmNcursorPositionVisible, FALSE,
9776                            XmNsensitive,           STIPPLE,
9777                            XmNshadowThickness,     1,
9778                            XmNcolumns,             14,
9779                            XmNwidth,               ((10*FONT_WIDTH)+2),
9780                            XmNtopAttachment,       XmATTACH_NONE,
9781                            XmNbottomAttachment,    XmATTACH_FORM,
9782                            XmNleftAttachment,      XmATTACH_WIDGET,
9783                            XmNleftWidget,          text2,
9784                            XmNrightAttachment,     XmATTACH_NONE,
9785                            XmNnavigationType,      XmTAB_GROUP,
9786                            XmNtraversalOn,         FALSE,
9787                            XmNfontList, fontlist1,
9788                            MY_FOREGROUND_COLOR,
9789                            MY_BACKGROUND_COLOR,
9790                            NULL);
9791 
9792   // Zoom level box, 3rd from right
9793   text4 = XtVaCreateWidget("create_appshell text_output4",
9794                            xmTextFieldWidgetClass,
9795                            form,
9796                            XmNeditable,            FALSE,
9797                            XmNcursorPositionVisible, FALSE,
9798                            XmNsensitive,           STIPPLE,
9799                            XmNshadowThickness,     1,
9800                            XmNcolumns,             10,
9801                            XmNwidth,               ((8*FONT_WIDTH)+2),
9802                            XmNtopAttachment,       XmATTACH_NONE,
9803                            XmNbottomAttachment,    XmATTACH_FORM,
9804                            XmNleftAttachment,      XmATTACH_WIDGET,
9805                            XmNleftWidget,          text3,
9806                            XmNrightAttachment,     XmATTACH_NONE,
9807                            XmNnavigationType,      XmTAB_GROUP,
9808                            XmNtraversalOn,         FALSE,
9809                            XmNfontList, fontlist1,
9810                            MY_FOREGROUND_COLOR,
9811                            MY_BACKGROUND_COLOR,
9812                            NULL);
9813 
9814   // Log indicator box, 2nd from right
9815   log_indicator = XtVaCreateWidget(langcode("BBARSTA043"),
9816                                    xmTextFieldWidgetClass,
9817                                    form,
9818                                    XmNeditable,            FALSE,
9819                                    XmNcursorPositionVisible, FALSE,
9820                                    XmNsensitive,           STIPPLE,
9821                                    XmNshadowThickness,     1,
9822                                    XmNcolumns,             8,
9823                                    XmNwidth,               ((8*FONT_WIDTH)),
9824                                    XmNtopAttachment,       XmATTACH_NONE,
9825                                    XmNbottomAttachment,    XmATTACH_FORM,
9826                                    XmNleftAttachment,      XmATTACH_WIDGET,
9827                                    XmNleftWidget,          text4,
9828                                    XmNrightAttachment,     XmATTACH_NONE,
9829                                    XmNnavigationType,      XmTAB_GROUP,
9830                                    XmNtraversalOn,         FALSE,
9831                                    XmNfontList, fontlist1,
9832                                    MY_FOREGROUND_COLOR,
9833                                    MY_BACKGROUND_COLOR,
9834                                    NULL);
9835 
9836   // Interface status indicators, on right
9837   iface_da = XtVaCreateWidget("create_appshell iface",
9838                               xmDrawingAreaWidgetClass,
9839                               form,
9840                               XmNwidth,               22*(MAX_IFACE_DEVICES/2),
9841                               XmNheight,              20,
9842                               XmNunitType,            XmPIXELS,
9843                               XmNtopAttachment,       XmATTACH_NONE,
9844                               XmNbottomAttachment,    XmATTACH_FORM,
9845                               XmNbottomOffset,        5,
9846                               XmNleftAttachment,      XmATTACH_WIDGET,
9847                               XmNleftWidget,          log_indicator,
9848                               XmNrightAttachment,     XmATTACH_NONE,
9849                               XmNnavigationType,      XmTAB_GROUP,
9850                               XmNtraversalOn,         FALSE,
9851                               XmNfontList, fontlist1,
9852                               MY_FOREGROUND_COLOR,
9853                               MY_BACKGROUND_COLOR,
9854                               NULL);
9855 
9856 #endif // USE_TWO_STATUS_LINES
9857 
9858   // The separator goes on top of the text box no matter how
9859   // many lines the status bar is, so I'm putting if after the
9860   // endif statement  - DCR
9861   sep = XtVaCreateManagedWidget("create_appshell sep6",
9862                                 xmSeparatorGadgetClass,
9863                                 form,
9864                                 XmNorientation,         XmHORIZONTAL,
9865                                 XmNtopAttachment,       XmATTACH_NONE,
9866                                 XmNbottomAttachment,    XmATTACH_WIDGET,
9867                                 XmNbottomWidget,        text,
9868                                 XmNleftAttachment,      XmATTACH_FORM,
9869                                 XmNrightAttachment,     XmATTACH_FORM,
9870                                 XmNfontList, fontlist1,
9871                                 MY_FOREGROUND_COLOR,
9872                                 MY_BACKGROUND_COLOR,
9873                                 NULL);
9874 
9875   // Map drawing area
9876   da_width = (Dimension)screen_width;
9877   da_height = (Dimension)screen_height;
9878   da = XtVaCreateWidget("create_appshell da",
9879                         xmDrawingAreaWidgetClass,
9880                         form,
9881                         XmNwidth,               da_width,
9882                         XmNheight,              da_height,
9883                         XmNunitType,            XmPIXELS,
9884                         XmNtopAttachment,       XmATTACH_WIDGET,
9885                         XmNtopWidget,           menubar,
9886                         XmNbottomAttachment,    XmATTACH_WIDGET,
9887                         XmNbottomWidget,        sep,
9888                         XmNleftAttachment,      XmATTACH_FORM,
9889                         XmNrightAttachment,     XmATTACH_FORM,
9890                         MY_FOREGROUND_COLOR,
9891                         MY_BACKGROUND_COLOR,
9892                         NULL);
9893 
9894 
9895 //-------------------------------------------------------------------------
9896 
9897 
9898   // Create the mouse menus here
9899   ac = 0;
9900   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
9901   ac++;
9902   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
9903   ac++;
9904   XtSetArg(al[ac], XmNfontList,        fontlist1);
9905   ac++;
9906 
9907 
9908 
9909 #ifdef SWAP_MOUSE_BUTTONS
9910   //
9911   // Motif 2.2.2 (and perhaps earlier, back to version 2.0) has a
9912   // problem where the XmNmenuPost doesn't work properly for
9913   // modifiers (CapsLock/ScrollLock/NumLock/etc).  We're reverting
9914   // back to the Motif 1.x method of doing things.  It works!
9915   //
9916   //XtSetArg(al[ac], XmNmenuPost, "<Btn1Down>"); ac++;  // Set for popup menu on button 1
9917   XtSetArg(al[ac], XmNwhichButton, 1);
9918   ac++;  // Enable popup menu on button 1
9919 
9920 #else   // SWAP_MOUSE_BUTTONS
9921   //
9922   // Motif 2.2.2 (and perhaps earlier, back to version 2.0) has a
9923   // problem where the XmNmenuPost doesn't work properly for
9924   // modifiers (CapsLock/ScrollLock/NumLock/etc).  We're reverting
9925   // back to the Motif 1.x method of doing things.  It works!
9926   //
9927   //XtSetArg(al[ac], XmNmenuPost, "<Btn3Down>"); ac++;  // Set for popup menu on button 3
9928   XtSetArg(al[ac], XmNwhichButton, 3);
9929   ac++;  // Enable popup menu on button 3
9930 #endif  // SWAP_MOUSE_BUTTONS
9931 
9932 
9933   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
9934   ac++;
9935   XtSetArg(al[ac], XmNtraversalOn, TRUE);
9936   ac++;
9937   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
9938   ac++;
9939 
9940   // Right menu popup (right mouse button or button 3)
9941   right_menu_popup = XmCreatePopupMenu(da,
9942                                        "create_appshell Menu Popup",
9943                                        al,
9944                                        ac);
9945   ac = 0;
9946   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
9947   ac++;
9948   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
9949   ac++;
9950   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
9951   ac++;
9952   XtSetArg(al[ac], XmNtraversalOn, TRUE);
9953   ac++;
9954   XtSetArg(al[ac], XmNfontList,        fontlist1);
9955   ac++;
9956 
9957 
9958   // "Options"
9959   (void)XtCreateManagedWidget(langcode("POPUPMA001"),
9960                               xmLabelWidgetClass,
9961                               right_menu_popup,
9962                               al,
9963                               ac);
9964   (void)XtCreateManagedWidget("create_appshell sep7",
9965                               xmSeparatorWidgetClass,
9966                               right_menu_popup,
9967                               al,
9968                               ac);
9969 
9970   // "Center"
9971   ac = 0;
9972   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
9973   ac++;
9974   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
9975   ac++;
9976   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
9977   ac++;
9978   XtSetArg(al[ac], XmNtraversalOn, TRUE);
9979   ac++;
9980   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA00c"));
9981   ac++;
9982   XtSetArg(al[ac], XmNfontList,        fontlist1);
9983   ac++;
9984   pan_ctr=XtCreateManagedWidget(langcode("POPUPMA00c"),
9985                                 xmPushButtonGadgetClass,
9986                                 right_menu_popup,
9987                                 al,
9988                                 ac);
9989   XtAddCallback(pan_ctr,XmNactivateCallback,Pan_ctr,NULL);
9990 
9991   // "Station info"
9992   ac = 0;
9993   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
9994   ac++;
9995   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
9996   ac++;
9997   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
9998   ac++;
9999   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10000   ac++;
10001   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA015"));
10002   ac++;
10003   XtSetArg(al[ac], XmNfontList,        fontlist1);
10004   ac++;
10005   station_info=XtCreateManagedWidget(langcode("POPUPMA015"),
10006                                      xmPushButtonGadgetClass,
10007                                      right_menu_popup,
10008                                      al,
10009                                      ac);
10010   XtAddCallback(station_info,XmNactivateCallback,Station_info,NULL);
10011 
10012   // Send Message To
10013   ac = 0;
10014   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10015   ac++;
10016   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10017   ac++;
10018   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10019   ac++;
10020   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10021   ac++;
10022   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("PULDNMG001"));
10023   ac++;
10024   XtSetArg(al[ac], XmNfontList,        fontlist1);
10025   ac++;
10026   send_message_to=XtCreateManagedWidget(langcode("PULDNMG001"),
10027                                         xmPushButtonGadgetClass,
10028                                         right_menu_popup,
10029                                         al,
10030                                         ac);
10031   XtAddCallback(send_message_to,XmNactivateCallback,Station_info,"4");
10032 
10033   // Map Bookmarks
10034   ac = 0;
10035   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10036   ac++;
10037   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10038   ac++;
10039   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10040   ac++;
10041   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10042   ac++;
10043   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("PULDNMP012"));
10044   ac++;
10045   XtSetArg(al[ac], XmNfontList,        fontlist1);
10046   ac++;
10047   jump_button2=XtCreateManagedWidget(langcode("PULDNMP012"),
10048                                      xmPushButtonGadgetClass,
10049                                      right_menu_popup,
10050                                      al,
10051                                      ac);
10052   XtAddCallback(jump_button2,XmNactivateCallback,Jump_location, NULL);
10053 
10054 
10055   ac = 0;
10056   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10057   ac++;
10058   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10059   ac++;
10060   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10061   ac++;
10062   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10063   ac++;
10064   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
10065   ac++;
10066   XtSetArg(al[ac], XmNfontList,        fontlist1);
10067   ac++;
10068 
10069   zoom_sub=XmCreatePulldownMenu(right_menu_popup,
10070                                 "create_appshell zoom sub",
10071                                 al,
10072                                 ac);
10073 
10074   // "Zoom level"
10075   //zoom_level
10076   XtVaCreateManagedWidget(langcode("POPUPMA004"),
10077                           xmCascadeButtonGadgetClass,
10078                           right_menu_popup,
10079                           XmNsubMenuId,zoom_sub,
10080                           XmNmnemonic,langcode_hotkey("POPUPMA004"),
10081                           XmNfontList, fontlist1,
10082                           MY_FOREGROUND_COLOR,
10083                           MY_BACKGROUND_COLOR,
10084                           NULL);
10085 
10086   // Zoom in"
10087   ac = 0;
10088   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10089   ac++;
10090   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10091   ac++;
10092   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10093   ac++;
10094   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10095   ac++;
10096   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA002"));
10097   ac++;
10098   XtSetArg(al[ac], XmNfontList,        fontlist1);
10099   ac++;
10100 
10101   zoom_in=XtCreateManagedWidget(langcode("POPUPMA002"),
10102                                 xmPushButtonGadgetClass,
10103                                 zoom_sub,
10104                                 al,
10105                                 ac);
10106   XtAddCallback(zoom_in,XmNactivateCallback,Zoom_in,NULL);
10107 
10108   // Zoom out"
10109   ac = 0;
10110   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10111   ac++;
10112   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10113   ac++;
10114   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10115   ac++;
10116   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10117   ac++;
10118   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA003"));
10119   ac++;
10120   XtSetArg(al[ac], XmNfontList,        fontlist1);
10121   ac++;
10122 
10123   zoom_out=XtCreateManagedWidget(langcode("POPUPMA003"),
10124                                  xmPushButtonGadgetClass,
10125                                  zoom_sub,
10126                                  al,
10127                                  ac);
10128   XtAddCallback(zoom_out,XmNactivateCallback,Zoom_out,NULL);
10129 
10130   // "1"
10131   ac = 0;
10132   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10133   ac++;
10134   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10135   ac++;
10136   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10137   ac++;
10138   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10139   ac++;
10140   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA005"));
10141   ac++;
10142   XtSetArg(al[ac], XmNfontList,        fontlist1);
10143   ac++;
10144 
10145   zl1=XtCreateManagedWidget(langcode("POPUPMA005"),
10146                             xmPushButtonGadgetClass,
10147                             zoom_sub,
10148                             al,
10149                             ac);
10150   XtAddCallback(zl1,XmNactivateCallback,Zoom_level,"1");
10151 
10152   // "16"
10153   ac = 0;
10154   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10155   ac++;
10156   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10157   ac++;
10158   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10159   ac++;
10160   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10161   ac++;
10162   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA006"));
10163   ac++;
10164   XtSetArg(al[ac], XmNfontList,        fontlist1);
10165   ac++;
10166 
10167   zl2=XtCreateManagedWidget(langcode("POPUPMA006"),
10168                             xmPushButtonGadgetClass,
10169                             zoom_sub,
10170                             al,
10171                             ac);
10172   XtAddCallback(zl2,XmNactivateCallback,Zoom_level,"2");
10173 
10174   // "64"
10175   ac = 0;
10176   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10177   ac++;
10178   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10179   ac++;
10180   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10181   ac++;
10182   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10183   ac++;
10184   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA007"));
10185   ac++;
10186   XtSetArg(al[ac], XmNfontList,        fontlist1);
10187   ac++;
10188 
10189   zl3=XtCreateManagedWidget(langcode("POPUPMA007"),
10190                             xmPushButtonGadgetClass,
10191                             zoom_sub,
10192                             al,
10193                             ac);
10194   XtAddCallback(zl3,XmNactivateCallback,Zoom_level,"3");
10195 
10196   // "256"
10197   ac = 0;
10198   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10199   ac++;
10200   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10201   ac++;
10202   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10203   ac++;
10204   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10205   ac++;
10206   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA008"));
10207   ac++;
10208   XtSetArg(al[ac], XmNfontList,        fontlist1);
10209   ac++;
10210 
10211   zl4=XtCreateManagedWidget(langcode("POPUPMA008"),
10212                             xmPushButtonGadgetClass,
10213                             zoom_sub,
10214                             al,
10215                             ac);
10216   XtAddCallback(zl4,XmNactivateCallback,Zoom_level,"4");
10217 
10218   // "1024"
10219   ac = 0;
10220   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10221   ac++;
10222   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10223   ac++;
10224   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10225   ac++;
10226   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10227   ac++;
10228   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA009"));
10229   ac++;
10230   XtSetArg(al[ac], XmNfontList,        fontlist1);
10231   ac++;
10232 
10233   zl5=XtCreateManagedWidget(langcode("POPUPMA009"),
10234                             xmPushButtonGadgetClass,
10235                             zoom_sub,
10236                             al,
10237                             ac);
10238   XtAddCallback(zl5,XmNactivateCallback,Zoom_level,"5");
10239 
10240   // "8192"
10241   ac = 0;
10242   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10243   ac++;
10244   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10245   ac++;
10246   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10247   ac++;
10248   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10249   ac++;
10250   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA010"));
10251   ac++;
10252   XtSetArg(al[ac], XmNfontList,        fontlist1);
10253   ac++;
10254 
10255   zl6=XtCreateManagedWidget(langcode("POPUPMA010"),
10256                             xmPushButtonGadgetClass,
10257                             zoom_sub,
10258                             al,
10259                             ac);
10260   XtAddCallback(zl6,XmNactivateCallback,Zoom_level,"6");
10261 
10262   // "Entire World"
10263   ac = 0;
10264   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10265   ac++;
10266   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10267   ac++;
10268   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10269   ac++;
10270   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10271   ac++;
10272   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA017"));
10273   ac++;
10274   XtSetArg(al[ac], XmNfontList,        fontlist1);
10275   ac++;
10276 
10277   zl7=XtCreateManagedWidget(langcode("POPUPMA017"),
10278                             xmPushButtonGadgetClass,
10279                             zoom_sub,
10280                             al,
10281                             ac);
10282   XtAddCallback(zl7,XmNactivateCallback,Zoom_level,"7");
10283 
10284   // "10% out"
10285   ac = 0;
10286   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10287   ac++;
10288   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10289   ac++;
10290   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10291   ac++;
10292   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10293   ac++;
10294   XtSetArg(al[ac], XmNmnemonic, 'o');
10295   ac++;
10296   XtSetArg(al[ac], XmNfontList,        fontlist1);
10297   ac++;
10298 
10299   zl8=XtCreateManagedWidget(langcode("POPUPMA035"),   // 10% out
10300                             xmPushButtonGadgetClass,
10301                             zoom_sub,
10302                             al,
10303                             ac);
10304   XtAddCallback(zl8,XmNactivateCallback,Zoom_level,"8");
10305 
10306   // "10% in"
10307   ac = 0;
10308   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10309   ac++;
10310   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10311   ac++;
10312   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10313   ac++;
10314   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10315   ac++;
10316   XtSetArg(al[ac], XmNmnemonic, 'i');
10317   ac++;
10318   XtSetArg(al[ac], XmNfontList,        fontlist1);
10319   ac++;
10320 
10321   zl9=XtCreateManagedWidget(langcode("POPUPMA036"),   // 10% in
10322                             xmPushButtonGadgetClass,
10323                             zoom_sub,
10324                             al,
10325                             ac);
10326   XtAddCallback(zl9,XmNactivateCallback,Zoom_level,"9");
10327 
10328   // "Custom Zoom Level"
10329   ac = 0;
10330   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10331   ac++;
10332   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10333   ac++;
10334   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10335   ac++;
10336   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10337   ac++;
10338   XtSetArg(al[ac], XmNmnemonic, 'i');
10339   ac++;
10340   XtSetArg(al[ac], XmNfontList,        fontlist1);
10341   ac++;
10342 
10343   zlC=XtCreateManagedWidget(langcode("POPUPMA034"),
10344                             xmPushButtonGadgetClass,
10345                             zoom_sub,
10346                             al,
10347                             ac);
10348   XtAddCallback(zlC,XmNactivateCallback,Zoom_level,"10");
10349 
10350   // "Last map pos/zoom"
10351   ac = 0;
10352   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10353   ac++;
10354   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10355   ac++;
10356   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10357   ac++;
10358   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10359   ac++;
10360   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA016"));
10361   ac++;
10362   XtSetArg(al[ac], XmNfontList,        fontlist1);
10363   ac++;
10364 
10365   last_loc=XtCreateManagedWidget(langcode("POPUPMA016"),
10366                                  xmPushButtonGadgetClass,
10367                                  right_menu_popup,
10368                                  al,
10369                                  ac);
10370   XtAddCallback(last_loc,XmNactivateCallback,Last_location,NULL);
10371 
10372   (void)XtCreateManagedWidget("create_appshell sep7a",
10373                               xmSeparatorWidgetClass,
10374                               right_menu_popup,
10375                               al,
10376                               ac);
10377 
10378   // "Object -> Create"
10379   ac = 0;
10380   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10381   ac++;
10382   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10383   ac++;
10384   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10385   ac++;
10386   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10387   ac++;
10388   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA018"));
10389   ac++;
10390   XtSetArg(al[ac], XmNfontList,        fontlist1);
10391   ac++;
10392   set_object=XtCreateManagedWidget(langcode("POPUPMA018"),
10393                                    xmPushButtonGadgetClass,
10394                                    right_menu_popup,
10395                                    al,
10396                                    ac);
10397   XtAddCallback(set_object,XmNactivateCallback,Set_Del_Object,NULL);
10398 
10399   // "Object -> Modify"
10400   ac = 0;
10401   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10402   ac++;
10403   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10404   ac++;
10405   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10406   ac++;
10407   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10408   ac++;
10409   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA019"));
10410   ac++;
10411   XtSetArg(al[ac], XmNfontList,        fontlist1);
10412   ac++;
10413   modify_object=XtCreateManagedWidget(langcode("POPUPMA019"),
10414                                       xmPushButtonGadgetClass,
10415                                       right_menu_popup,
10416                                       al,
10417                                       ac);
10418   XtAddCallback(modify_object,XmNactivateCallback,Station_info,"1");
10419 
10420   ac = 0;
10421   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10422   ac++;
10423   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10424   ac++;
10425   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10426   ac++;
10427   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10428   ac++;
10429   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
10430   ac++;
10431   XtSetArg(al[ac], XmNfontList,        fontlist1);
10432   ac++;
10433 
10434   // Display a list of predefined SAR or Public service event objects.
10435   sar_object_sub=XmCreatePulldownMenu(right_menu_popup,
10436                                       "create_appshell sar_object_sub",
10437                                       al,
10438                                       ac);
10439 
10440   // "Predefined Objects"
10441   //sar_object_menu
10442   XtVaCreateManagedWidget(langcode("POPUPMA045"),
10443                           xmCascadeButtonGadgetClass,
10444                           right_menu_popup,
10445                           XmNsubMenuId,sar_object_sub,
10446 //            XmNmnemonic,langcode_hotkey("POPUPMA045"),
10447                           XmNfontList, fontlist1,
10448                           MY_FOREGROUND_COLOR,
10449                           MY_BACKGROUND_COLOR,
10450                           NULL);
10451 
10452   BuildPredefinedSARMenu_UI(&sar_object_sub);
10453 
10454   ac = 0;
10455   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10456   ac++;
10457   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10458   ac++;
10459   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10460   ac++;
10461   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10462   ac++;
10463   XtSetArg(al[ac], XmNfontList,        fontlist1);
10464   ac++;
10465 
10466   XtCreateManagedWidget("create_appshell sep7b",
10467                         xmSeparatorWidgetClass,
10468                         right_menu_popup,
10469                         al,
10470                         ac);
10471 
10472   XtCreateManagedWidget("create_appshell sep7c",
10473                         xmSeparatorWidgetClass,
10474                         right_menu_popup,
10475                         al,
10476                         ac);
10477 
10478   ac = 0;
10479   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10480   ac++;
10481   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10482   ac++;
10483   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10484   ac++;
10485   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10486   ac++;
10487   XtSetArg(al[ac], XmNtearOffModel, XmTEAR_OFF_ENABLED);
10488   ac++;
10489   XtSetArg(al[ac], XmNfontList,        fontlist1);
10490   ac++;
10491 
10492   pan_sub=XmCreatePulldownMenu(right_menu_popup,
10493                                "create_appshell pan sub",
10494                                al,
10495                                ac);
10496 
10497   // "Pan"
10498 //    pan_menu=XtVaCreateManagedWidget(langcode(""),
10499   //pan_menu
10500   XtVaCreateManagedWidget("Pan",
10501                           xmCascadeButtonGadgetClass,
10502                           right_menu_popup,
10503                           XmNsubMenuId,pan_sub,
10504 //            XmNmnemonic,langcode_hotkey("POPUPMA004"),
10505                           XmNfontList, fontlist1,
10506                           MY_FOREGROUND_COLOR,
10507                           MY_BACKGROUND_COLOR,
10508                           NULL);
10509 
10510   // "Pan Up"
10511   ac = 0;
10512   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10513   ac++;
10514   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10515   ac++;
10516   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10517   ac++;
10518   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10519   ac++;
10520   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA011"));
10521   ac++;
10522   XtSetArg(al[ac], XmNfontList,        fontlist1);
10523   ac++;
10524   pan_up=XtCreateManagedWidget(langcode("POPUPMA011"),
10525                                xmPushButtonGadgetClass,
10526                                pan_sub,
10527                                al,
10528                                ac);
10529   //pan_up=XtVaCreateManagedWidget("create_appshell arrow1",
10530   //    xmArrowButtonGadgetClass,
10531   //    right_menu_popup,
10532   //    XmNarrowDirection,  XmARROW_UP,
10533   //    NULL);
10534   XtAddCallback(pan_up,XmNactivateCallback,Pan_up,NULL);
10535 
10536   // "Pan Left"
10537   ac = 0;
10538   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10539   ac++;
10540   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10541   ac++;
10542   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10543   ac++;
10544   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10545   ac++;
10546   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA013"));
10547   ac++;
10548   XtSetArg(al[ac], XmNfontList,        fontlist1);
10549   ac++;
10550   pan_left=XtCreateManagedWidget(langcode("POPUPMA013"),
10551                                  xmPushButtonGadgetClass,
10552                                  pan_sub,
10553                                  al,
10554                                  ac);
10555   //pan_left=XtVaCreateManagedWidget("create_appshell arrow3",
10556   //    xmArrowButtonGadgetClass,
10557   //    right_menu_popup,
10558   //    XmNarrowDirection,  XmARROW_LEFT,
10559   //    NULL);
10560   XtAddCallback(pan_left,XmNactivateCallback,Pan_left,NULL);
10561 
10562   // "Pan Right"
10563   ac = 0;
10564   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10565   ac++;
10566   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10567   ac++;
10568   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10569   ac++;
10570   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10571   ac++;
10572   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA014"));
10573   ac++;
10574   XtSetArg(al[ac], XmNfontList,        fontlist1);
10575   ac++;
10576   pan_right=XtCreateManagedWidget(langcode("POPUPMA014"),
10577                                   xmPushButtonGadgetClass,
10578                                   pan_sub,
10579                                   al,
10580                                   ac);
10581   //pan_right=XtVaCreateManagedWidget("create_appshell arrow4",
10582   //    xmArrowButtonGadgetClass,
10583   //    right_menu_popup,
10584   //    XmNarrowDirection,  XmARROW_RIGHT,
10585   //    NULL);
10586   XtAddCallback(pan_right,XmNactivateCallback,Pan_right,NULL);
10587 
10588   // "Pan Down"
10589   ac = 0;
10590   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10591   ac++;
10592   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10593   ac++;
10594   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10595   ac++;
10596   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10597   ac++;
10598   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA012"));
10599   ac++;
10600   XtSetArg(al[ac], XmNfontList,        fontlist1);
10601   ac++;
10602   pan_down=XtCreateManagedWidget(langcode("POPUPMA012"),
10603                                  xmPushButtonGadgetClass,
10604                                  pan_sub,
10605                                  al,
10606                                  ac);
10607   //pan_down=XtVaCreateManagedWidget("create_appshell arrow2",
10608   //    xmArrowButtonGadgetClass,
10609   //    right_menu_popup,
10610   //    XmNarrowDirection,  XmARROW_DOWN,
10611   //    NULL);
10612   XtAddCallback(pan_down,XmNactivateCallback,Pan_down,NULL);
10613 
10614   XtCreateManagedWidget("create_appshell sep7d",
10615                         xmSeparatorWidgetClass,
10616                         right_menu_popup,
10617                         al,
10618                         ac);
10619 
10620   move_my_sub=XmCreatePulldownMenu(right_menu_popup,
10621                                    "create_appshell move_my sub",
10622                                    al,
10623                                    ac);
10624 
10625   //move_my_menu
10626   XtVaCreateManagedWidget(langcode("POPUPMA025"),
10627                           xmCascadeButtonGadgetClass,
10628                           right_menu_popup,
10629                           XmNsubMenuId,move_my_sub,
10630                           XmNmnemonic,langcode_hotkey("POPUPMA025"),
10631                           XmNfontList, fontlist1,
10632                           MY_FOREGROUND_COLOR,
10633                           MY_BACKGROUND_COLOR,
10634                           NULL);
10635 
10636   // "Move my station here"
10637   ac = 0;
10638   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10639   ac++;
10640   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10641   ac++;
10642   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10643   ac++;
10644   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10645   ac++;
10646   XtSetArg(al[ac], XmNmnemonic, langcode_hotkey("POPUPMA025"));
10647   ac++;
10648   XtSetArg(al[ac], XmNfontList,        fontlist1);
10649   ac++;
10650   setmyposition=XtCreateManagedWidget(langcode("POPUPMA025"),
10651                                       xmPushButtonGadgetClass,
10652                                       move_my_sub,
10653                                       al,
10654                                       ac);
10655   XtAddCallback(setmyposition,XmNactivateCallback,SetMyPosition,"1");
10656 
10657 
10658 //-------------------------------------------------------------------------
10659 
10660 
10661   /* mouse tracking */
10662   XtAddEventHandler(da,LeaveWindowMask,FALSE,ClearTrackMouse,(XtPointer)text2);
10663   XtAddEventHandler(da,PointerMotionMask,FALSE,TrackMouse,(XtPointer)text2);
10664 
10665   // Popup menus
10666   XtAddEventHandler(da, ButtonPressMask, FALSE, (XtEventHandler)Mouse_button_handler, NULL);
10667   //XtAddEventHandler(da,ButtonReleaseMask,FALSE,(XtEventHandler)Mouse_button_handler,NULL);
10668 
10669 
10670   // If adding any more widgets here, increase the size of the
10671   // children[] array above.
10672   ac = 0;
10673   children[ac++] = text;
10674   children[ac++] = text2;
10675   children[ac++] = text3;
10676   children[ac++] = text4;
10677   children[ac++] = log_indicator;
10678   children[ac++] = iface_da;
10679   children[ac++] = menubar;
10680   children[ac++] = toolbar;
10681   children[ac++] = da;
10682 
10683   XtManageChildren(children, ac);
10684   ac = 0;
10685 
10686   // This one needs to be done after all of
10687   // the above 'cuz it contains all of them.
10688   XtManageChild(form);
10689 
10690   WM_DELETE_WINDOW = XmInternAtom(XtDisplay(appshell),"WM_DELETE_WINDOW", FALSE);
10691   XmAddWMProtocolCallback(appshell, WM_DELETE_WINDOW, Window_Quit, (XtPointer) NULL);
10692   XtAddCallback(appshell,XtNsaveCallback, save_state, (XtPointer) NULL);
10693   XtAddCallback(appshell,XtNdieCallback, Window_Quit, (XtPointer) NULL);
10694 
10695   XmTextFieldSetString(text,"");
10696   XtManageChild(text);
10697 
10698   display_zoom_status();
10699 
10700   XtManageChild(text);
10701 
10702 // We get this error on some systems if XtRealizeWidget() is called
10703 // without setting width/height values first:
10704 // "Error: Shell widget xastir has zero width and/or height"
10705 
10706   XtRealizeWidget (appshell);
10707 
10708 
10709   // Flush all pending requests to the X server.
10710   XFlush(display);
10711 
10712 
10713   create_gc(da);
10714 
10715   // Fill the drawing area with the background color.
10716   (void)XSetForeground(XtDisplay(da),gc,MY_BG_COLOR); // Not a mistake!
10717   (void)XSetBackground(XtDisplay(da),gc,MY_BG_COLOR);
10718   (void)XFillRectangle(XtDisplay(appshell),
10719                        XtWindow(da),
10720                        gc,
10721                        0,
10722                        0,
10723                        (unsigned int)screen_width,
10724                        (unsigned int)screen_height);
10725 
10726 
10727   XtAddCallback (da, XmNinputCallback,  da_input,NULL);
10728   XtAddCallback (da, XmNresizeCallback, da_resize,NULL);
10729   XtAddCallback (da, XmNexposeCallback, da_expose,(XtPointer)text);
10730 
10731 
10732   // Don't discard events in X11 queue, but wait for the X11
10733   // server to catch up.
10734   (void)XSync(XtDisplay(appshell), False);
10735 
10736 
10737   // Send the window manager hints
10738 //    XSetWMHints(display, XtWindow(appshell), wm_hints);
10739 
10740 
10741   // Set up the icon
10742   icon_pixmap = XCreateBitmapFromData(display,
10743                                       XtWindow(appshell),
10744                                       (char *)icon_bits,
10745                                       icon_width,     // icon_bitmap_width,
10746                                       icon_height);   // icon_bitmap_height
10747 
10748   XSetStandardProperties(display,
10749                          XtWindow(appshell),
10750                          title ? title: "Xastir", // window name
10751                          "Xastir",       // icon name
10752                          icon_pixmap,    // pixmap for icon
10753                          0, 0,           // argv and argc for restarting
10754                          NULL);          // size hints
10755 
10756   if (title)
10757   {
10758     free(title);
10759     title = NULL;
10760   }
10761 
10762   if (track_me)
10763   {
10764     XmToggleButtonSetState(trackme_button,TRUE,TRUE);
10765   }
10766   else
10767   {
10768     XmToggleButtonSetState(trackme_button,FALSE,TRUE);
10769   }
10770 
10771 
10772 
10773   // Flush all pending requests to the X server.
10774   XFlush(display);
10775 
10776   // Don't discard events in X11 queue, but wait for the X11
10777   // server to catch up.
10778   (void)XSync(XtDisplay(appshell), False);
10779 
10780 
10781 
10782   // Reset the minimum window size so that we can adjust the
10783   // window downwards again, but only down to size 61.  If we go
10784   // any smaller height-wise then we end up getting segfaults,
10785   // probably because we're trying to update some widgets that
10786   // aren't visible at that point.
10787   //
10788   XtVaSetValues(appshell,
10789                 XmNminWidth,  61,
10790                 XmNminHeight, 61,
10791                 XmNwidth,     my_appshell_width,
10792                 XmNheight,    my_appshell_height,
10793 //        XmNx,         screen_x_offset,    // Doesn't work here
10794 //        XmNy,         screen_y_offset,    // Doesn't work here
10795                 NULL);
10796 // Lincity method of locking down the min_width/height when
10797 // instantiating the window, then releasing it later:
10798 // http://pingus.seul.org/~grumbel/tmp/lincity-source/lcx11_8c-source.html
10799 
10800 
10801 
10802   // Actually show the draw and show the window on the display
10803   XMapRaised(XtDisplay(appshell), XtWindow(appshell));
10804 
10805 
10806   // Free the allocated struct.  We won't need it again.
10807 //    XFree(wm_hints);    // We're not currently using this struct
10808 
10809   if(debug_level & 8)
10810   {
10811     fprintf(stderr,"Create appshell stop\n");
10812   }
10813 }   // end of create_appshell()
10814 
10815 
10816 
10817 
10818 
10819 void BuildPredefinedSARMenu_UI(Widget *parent_menu)
10820 {
10821   int i;   // number of items in menu
10822   int ac;  // number of arguments
10823   Arg al[100];  // arguments
10824 
10825 
10826   // Set standard menu item arguments to use with each widget.
10827   ac = 0;
10828   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
10829   ac++;
10830   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
10831   ac++;
10832   XtSetArg(al[ac], XmNnavigationType, XmTAB_GROUP);
10833   ac++;
10834   XtSetArg(al[ac], XmNtraversalOn, TRUE);
10835   ac++;
10836   XtSetArg(al[ac], XmNfontList, fontlist1);
10837   ac++;
10838 
10839   // Before building menu, make sure that any existing menu items are removed
10840   // this allows the menu to be changed on the fly while the program is running.
10841   //
10842   for (i = 0; i < MAX_NUMBER_OF_PREDEFINED_OBJECTS; i++)
10843   {
10844     if (predefined_object_menu_items[i] != NULL)
10845     {
10846       XtDestroyWidget(predefined_object_menu_items[i]);
10847       predefined_object_menu_items[i] = NULL;
10848     }
10849   }
10850   // Now build a menu item for each entry in the predefinedObjects array.
10851   for (i = 0; i < number_of_predefined_objects; i++)
10852   {
10853 
10854     // Walk through array of predefined objects and
10855     // build a menu item for each predefined object.
10856     //
10857     if (predefinedObjects[i].show_on_menu == 1)
10858     {
10859 
10860       // Some predefined objects are hidden to allow construction
10861       // of two predefined objects in the same place at the same
10862       // time with one menu item.
10863 
10864       if(debug_level & 1)
10865         fprintf(stderr,
10866                 "Menu item with name: %s and index_of_child=%d\n",
10867                 predefinedObjects[i].menu_call, predefinedObjects[i].index_of_child);
10868 
10869       predefined_object_menu_items[i]=XtCreateManagedWidget(predefinedObjects[i].menu_call,
10870                                       xmPushButtonGadgetClass,
10871                                       *parent_menu,
10872                                       al,
10873                                       ac);
10874 
10875       XtAddCallback(predefined_object_menu_items[i],
10876                     XmNactivateCallback,
10877                     Create_SAR_Object,
10878                     (intptr_t *)predefinedObjects[i].index);
10879 
10880       if (predefinedObjects[i].index_of_child > -1)
10881       {
10882 
10883         // This second callback allows stacking of two
10884         // objects such as a PLS with 0.25 and 0.5 and a
10885         // PLS_ with 0.75 and 1.0 mile probability circles.
10886         //
10887         if (predefinedObjects[i].index_of_child < number_of_predefined_objects)
10888         {
10889           XtAddCallback(predefined_object_menu_items[i],
10890                         XmNactivateCallback,
10891                         Create_SAR_Object,
10892                         (intptr_t *)predefinedObjects[predefinedObjects[i].index_of_child].index);
10893         }
10894       }
10895     }
10896   }
10897 }
10898 
10899 
10900 
10901 
10902 
10903 void create_gc(Widget w)
10904 {
10905   XGCValues values;
10906   Display *my_display = XtDisplay(w);
10907   int mask = 0;
10908   Pixmap pix;
10909   unsigned int _w, _h;
10910   int _xh, _yh;
10911   char xbm_path[500];
10912   int ret_val;
10913 
10914 
10915   if (debug_level & 8)
10916   {
10917     fprintf(stderr,"Create gc start\n");
10918   }
10919 
10920   if (gc != 0)
10921   {
10922     return;
10923   }
10924 
10925   memset(&values, 0, sizeof(values));
10926 
10927   // Allocate colors
10928   // Note that the names here are the ones given in xastir.rgb
10929   colors[0x00] = GetPixelByName(w,"DarkGreen");  // was darkgreen (same)
10930   colors[0x01] = GetPixelByName(w,"purple");
10931   colors[0x02] = GetPixelByName(w,"DarkGreen");  // was darkgreen (same)
10932   colors[0x03] = GetPixelByName(w,"cyan");
10933   colors[0x04] = GetPixelByName(w,"brown");
10934   colors[0x05] = GetPixelByName(w,"plum");       // light magenta
10935   colors[0x06] = GetPixelByName(w,"orange");
10936   colors[0x07] = GetPixelByName(w,"darkgray");
10937   colors[0x08] = GetPixelByName(w,"black");      // Foreground font color
10938   colors[0x09] = GetPixelByName(w,"blue");
10939   colors[0x0a] = GetPixelByName(w,"green");              // PHG (old)
10940   colors[0x0b] = GetPixelByName(w,"mediumorchid"); // light purple
10941   colors[0x0c] = GetPixelByName(w,"red");
10942   colors[0x0d] = GetPixelByName(w,"magenta");
10943   colors[0x0e] = GetPixelByName(w,"yellow");
10944   colors[0x0f] = GetPixelByName(w,"white");              //
10945   colors[0x10] = GetPixelByName(w,"black");
10946   colors[0x11] = GetPixelByName(w,"black");
10947   colors[0x12] = GetPixelByName(w,"black");
10948   colors[0x13] = GetPixelByName(w,"black");
10949   colors[0x14] = GetPixelByName(w,"lightgray");
10950   colors[0x15] = GetPixelByName(w,"magenta");
10951   colors[0x16] = GetPixelByName(w,"mediumorchid"); // light purple
10952   colors[0x17] = GetPixelByName(w,"lightblue");
10953   colors[0x18] = GetPixelByName(w,"purple");
10954   colors[0x19] = GetPixelByName(w,"orange2");    // light orange
10955   colors[0x1a] = GetPixelByName(w,"SteelBlue");
10956   colors[0x20] = GetPixelByName(w,"white");
10957 
10958   // Area object colors.  Order must not be changed. If beginning moves,
10959   // update draw_area and draw_map.
10960   // High
10961   colors[0x21] = GetPixelByName(w,"black");   // AREA_BLACK_HI
10962   colors[0x22] = GetPixelByName(w,"blue");    // AREA_BLUE_HI
10963   colors[0x23] = GetPixelByName(w,"green");   // AREA_GREEN_HI
10964   colors[0x24] = GetPixelByName(w,"cyan3");    // AREA_CYAN_HI
10965   colors[0x25] = GetPixelByName(w,"red");     // AREA_RED_HI
10966   colors[0x26] = GetPixelByName(w,"magenta"); // AREA_VIOLET_HI
10967   colors[0x27] = GetPixelByName(w,"yellow");  // AREA_YELLOW_HI
10968   colors[0x28] = GetPixelByName(w,"gray35");  // AREA_GRAY_HI
10969   // Low
10970   colors[0x29] = GetPixelByName(w,"gray27");   // AREA_BLACK_LO
10971   colors[0x2a] = GetPixelByName(w,"blue4");    // AREA_BLUE_LO
10972   colors[0x2b] = GetPixelByName(w,"green4");   // AREA_GREEN_LO
10973   colors[0x2c] = GetPixelByName(w,"cyan4");    // AREA_CYAN_LO
10974   colors[0x2d] = GetPixelByName(w,"red4");     // AREA_RED_LO
10975   colors[0x2e] = GetPixelByName(w,"magenta4"); // AREA_VIOLET_LO
10976   colors[0x2f] = GetPixelByName(w,"yellow4");  // AREA_YELLOW_LO
10977   colors[0x30] = GetPixelByName(w,"gray53"); // AREA_GRAY_LO
10978 
10979   colors[0x40] = GetPixelByName(w,"yellow");     // symbols ...
10980   colors[0x41] = GetPixelByName(w,"DarkOrange3");
10981   colors[0x42] = GetPixelByName(w,"purple");
10982   colors[0x43] = GetPixelByName(w,"gray80");
10983   colors[0x44] = GetPixelByName(w,"red3");
10984   colors[0x45] = GetPixelByName(w,"brown1");
10985   colors[0x46] = GetPixelByName(w,"brown3");
10986   colors[0x47] = GetPixelByName(w,"blue4");
10987   colors[0x48] = GetPixelByName(w,"DeepSkyBlue");
10988   colors[0x49] = GetPixelByName(w,"DarkGreen");
10989   colors[0x4a] = GetPixelByName(w,"red2");
10990   colors[0x4b] = GetPixelByName(w,"green3");
10991   colors[0x4c] = GetPixelByName(w,"MediumBlue");
10992   colors[0x4d] = GetPixelByName(w,"white");
10993   colors[0x4e] = GetPixelByName(w,"gray53");
10994   colors[0x4f] = GetPixelByName(w,"gray35");
10995   colors[0x50] = GetPixelByName(w,"gray27");
10996   colors[0x51] = GetPixelByName(w,"black");      // ... symbols
10997 
10998   colors[0x52] = GetPixelByName(w,"LimeGreen");  // PHG, symbols
10999 
11000   colors[0xfe] = GetPixelByName(w,"pink");
11001 
11002   // map solid colors
11003   colors[0x60] = GetPixelByName(w,"HotPink");
11004   colors[0x61] = GetPixelByName(w,"RoyalBlue");
11005   colors[0x62] = GetPixelByName(w,"orange3");
11006   colors[0x63] = GetPixelByName(w,"yellow3");
11007   colors[0x64] = GetPixelByName(w,"ForestGreen");
11008   colors[0x65] = GetPixelByName(w,"DodgerBlue");
11009   colors[0x66] = GetPixelByName(w,"cyan2");
11010   colors[0x67] = GetPixelByName(w,"plum2");
11011   colors[0x68] = GetPixelByName(w,"MediumBlue"); // was blue3 (the same!)
11012   colors[0x69] = GetPixelByName(w,"gray86");
11013 
11014   // These colors added to make it possible to color local shapefile tiger
11015   //  maps similar to on-line ones.
11016   colors[0x70] = GetPixelByName(w,"RosyBrown2");
11017   colors[0x71] = GetPixelByName(w,"gray81");
11018   colors[0x72] = GetPixelByName(w,"tgr_park_1");
11019   colors[0x73] = GetPixelByName(w,"tgr_city_1");
11020   colors[0x74] = GetPixelByName(w,"tgr_forest_1");
11021   colors[0x75] = GetPixelByName(w,"tgr_water_1");
11022 
11023   // tracking trail colors
11024   // set color for your own station with  #define MY_TRAIL_COLOR  in db.c
11025   trail_colors[0x00] = GetPixelByName(w,"yellow");
11026   trail_colors[0x01] = GetPixelByName(w,"blue");
11027   trail_colors[0x02] = GetPixelByName(w,"green");
11028   trail_colors[0x03] = GetPixelByName(w,"red");
11029   trail_colors[0x04] = GetPixelByName(w,"magenta");
11030   trail_colors[0x05] = GetPixelByName(w,"black");
11031   trail_colors[0x06] = GetPixelByName(w,"white");
11032   trail_colors[0x07] = GetPixelByName(w,"DarkOrchid");
11033   trail_colors[0x08] = GetPixelByName(w,"purple");      // very similar to DarkOrchid...
11034   trail_colors[0x09] = GetPixelByName(w,"OrangeRed");
11035   trail_colors[0x0a] = GetPixelByName(w,"brown");
11036   trail_colors[0x0b] = GetPixelByName(w,"DarkGreen");    // was darkgreen (same)
11037   trail_colors[0x0c] = GetPixelByName(w,"MediumBlue");
11038   trail_colors[0x0d] = GetPixelByName(w,"ForestGreen");
11039   trail_colors[0x0e] = GetPixelByName(w,"chartreuse");
11040   trail_colors[0x0f] = GetPixelByName(w,"cornsilk");
11041   trail_colors[0x10] = GetPixelByName(w,"LightCyan");
11042   trail_colors[0x11] = GetPixelByName(w,"cyan");
11043   trail_colors[0x12] = GetPixelByName(w,"DarkSlateGray");
11044   trail_colors[0x13] = GetPixelByName(w,"NavyBlue");
11045   trail_colors[0x14] = GetPixelByName(w,"DarkOrange3");
11046   trail_colors[0x15] = GetPixelByName(w,"gray27");
11047   trail_colors[0x16] = GetPixelByName(w,"RoyalBlue");
11048   trail_colors[0x17] = GetPixelByName(w,"yellow2");
11049   trail_colors[0x18] = GetPixelByName(w,"DodgerBlue");
11050   trail_colors[0x19] = GetPixelByName(w,"cyan2");
11051   trail_colors[0x1a] = GetPixelByName(w,"MediumBlue"); // was blue3 (the same!)
11052   trail_colors[0x1b] = GetPixelByName(w,"gray86");
11053   trail_colors[0x1c] = GetPixelByName(w,"SteelBlue");
11054   trail_colors[0x1d] = GetPixelByName(w,"PaleGreen");
11055   trail_colors[0x1e] = GetPixelByName(w,"RosyBrown");
11056   trail_colors[0x1f] = GetPixelByName(w,"DeepSkyBlue");
11057 
11058   values.background=GetPixelByName(w,"darkgray");
11059 
11060   gc = XCreateGC(my_display, XtWindow(w), mask, &values);
11061 
11062   // Load a new font into the GC for the station font
11063   Load_station_font();
11064 
11065   gc_tint = XCreateGC(my_display, XtWindow(w), mask, &values);
11066 
11067   gc_stipple = XCreateGC(my_display, XtWindow(w), mask, &values);
11068 
11069   gc_bigfont = XCreateGC(my_display, XtWindow(w), mask, &values);
11070 
11071   pix =  XCreatePixmap(XtDisplay(w), RootWindowOfScreen(XtScreen(w)), 20, 20, 1);
11072   values.function = GXcopy;
11073   gc2 = XCreateGC(XtDisplay(w), pix,GCForeground|GCBackground|GCFunction, &values);
11074 
11075   pixmap=XCreatePixmap(XtDisplay(w),
11076                        DefaultRootWindow(XtDisplay(w)),
11077                        (unsigned int)screen_width,(unsigned int)screen_height,
11078                        DefaultDepthOfScreen(XtScreen(w)));
11079 
11080   pixmap_final=XCreatePixmap(XtDisplay(w),
11081                              DefaultRootWindow(XtDisplay(w)),
11082                              (unsigned int)screen_width,(unsigned int)screen_height,
11083                              DefaultDepthOfScreen(XtScreen(w)));
11084 
11085   pixmap_alerts=XCreatePixmap(XtDisplay(w),
11086                               DefaultRootWindow(XtDisplay(w)),
11087                               (unsigned int)screen_width,(unsigned int)screen_height,
11088                               DefaultDepthOfScreen(XtScreen(w)));
11089 
11090   xastir_snprintf(xbm_path, sizeof(xbm_path), "%s/%s", SYMBOLS_DIR, "2x2.xbm");
11091   ret_val = XReadBitmapFile(XtDisplay(w), DefaultRootWindow(XtDisplay(w)),
11092                             xbm_path, &_w, &_h, &pixmap_50pct_stipple, &_xh, &_yh);
11093 
11094   if (ret_val != 0)
11095   {
11096     fprintf(stderr,"XReadBitmapFile() failed: Bitmap not found? %s\n",xbm_path);
11097     exit(1);    // 2x2.xbm couldn't be loaded
11098   }
11099 
11100   xastir_snprintf(xbm_path, sizeof(xbm_path), "%s/%s", SYMBOLS_DIR, "25pct.xbm");
11101   ret_val = XReadBitmapFile(XtDisplay(w), DefaultRootWindow(XtDisplay(w)),
11102                             xbm_path, &_w, &_h, &pixmap_25pct_stipple, &_xh, &_yh);
11103 
11104   if (ret_val != 0)
11105   {
11106     fprintf(stderr,"XReadBitmapFile() failed: Bitmap not found? %s\n",xbm_path);
11107     exit(1);    // 25pct.xbm couldn't be loaded
11108   }
11109 
11110   xastir_snprintf(xbm_path, sizeof(xbm_path), "%s/%s", SYMBOLS_DIR, "13pct.xbm");
11111   ret_val = XReadBitmapFile(XtDisplay(w), DefaultRootWindow(XtDisplay(w)),
11112                             xbm_path, &_w, &_h, &pixmap_13pct_stipple, &_xh, &_yh);
11113 
11114   if (ret_val != 0)
11115   {
11116     fprintf(stderr,"XReadBitmapFile() failed: Bitmap not found? %s\n",xbm_path);
11117     exit(1);    // 13pct.xbm couldn't be loaded
11118   }
11119 
11120   xastir_snprintf(xbm_path, sizeof(xbm_path), "%s/%s", SYMBOLS_DIR, "alert.xbm");
11121   ret_val = XReadBitmapFile(XtDisplay(w), DefaultRootWindow(XtDisplay(w)),
11122                             xbm_path, &_w, &_h, &pixmap_wx_stipple, &_xh, &_yh);
11123 
11124   if (ret_val != 0)
11125   {
11126     fprintf(stderr,"XReadBitmapFile() failed: Bitmap not found? %s\n",xbm_path);
11127     exit(1);    // alert.xbm couldn't be loaded
11128   }
11129 
11130   display_up=1;
11131 
11132   wait_to_redraw=0;
11133 
11134   if (debug_level & 8)
11135   {
11136     fprintf(stderr,"Create gc stop\n");
11137   }
11138 }   // create_gc()
11139 
11140 
11141 
11142 
11143 
11144 // This routine just copies an area from pixmap_final to the
11145 // display, so we won't go through all the trouble of making this
11146 // interruptable.  Just get on with it, perform the operation, and
11147 // return to X.  If it did any map drawing, we'd make it
11148 // interruptable.
11149 //
11150 void da_expose(Widget w, XtPointer UNUSED(client_data), XtPointer call_data)
11151 {
11152   Dimension width, height, margin_width, margin_height;
11153   XmDrawingAreaCallbackStruct *db = (XmDrawingAreaCallbackStruct *)call_data;
11154   XExposeEvent *event = (XExposeEvent *) db->event;
11155   unsigned char   unit_type;
11156 
11157   //fprintf(stderr,"Expose event\n");*/
11158 
11159   /* Call a routine to create a Graphics Context */
11160   create_gc(w);
11161 
11162   /* First get the various dimensions */
11163   XtVaGetValues(w,
11164                 XmNwidth, &width,
11165                 XmNheight, &height,
11166                 XmNmarginWidth, &margin_width,
11167                 XmNmarginHeight, &margin_height,
11168                 XmNunitType, &unit_type,
11169                 NULL);
11170 
11171   (void)XCopyArea(XtDisplay(w),
11172                   pixmap_final,
11173                   XtWindow(w),
11174                   gc,
11175                   event->x,
11176                   event->y,
11177                   event->width,
11178                   event->height,
11179                   event->x,
11180                   event->y);
11181 
11182   // We just refreshed the screen, so don't try to erase any
11183   // zoom-in boxes via XOR.
11184   zoom_box_x1 = -1;
11185 }
11186 
11187 
11188 
11189 
11190 
11191 // The work function for resizing.  This one will be called by
11192 // UpdateTime if certain flags have been set my da_resize.  This
11193 // function and the functions it calls that are CPU intensive should
11194 // be made interruptable:  They should check interrupt_drawing_now
11195 // flag periodically and exit nicely if it is set.
11196 //
11197 void da_resize_execute(Widget w)
11198 {
11199   Dimension width, height;
11200 
11201 
11202   busy_cursor(appshell);
11203 
11204   // Reset the flags that may have brought us here.
11205   interrupt_drawing_now = 0;
11206   request_resize = 0;
11207 
11208   if (XtIsRealized(w))
11209   {
11210     /* First get the various dimensions */
11211     XtVaGetValues(w,
11212                   XmNwidth,   &width,
11213                   XmNheight,  &height,
11214                   NULL);
11215 
11216     screen_width  = (long)width;
11217     screen_height = (long)height;
11218     XtVaSetValues(w,
11219                   XmNwidth,  width,
11220                   XmNheight, height,
11221                   NULL);
11222 
11223     /*  fprintf(stderr,"Size x:%ld, y:%ld\n",screen_width,screen_height);*/
11224     if (pixmap)
11225     {
11226       (void)XFreePixmap(XtDisplay(w),pixmap);
11227     }
11228 
11229     if(pixmap_final)
11230     {
11231       (void)XFreePixmap(XtDisplay(w),pixmap_final);
11232     }
11233 
11234     if(pixmap_alerts)
11235     {
11236       (void)XFreePixmap(XtDisplay(w),pixmap_alerts);
11237     }
11238 
11239     pixmap=XCreatePixmap(XtDisplay(w),
11240                          DefaultRootWindow(XtDisplay(w)),
11241                          (unsigned int)width,(unsigned int)height,
11242                          DefaultDepthOfScreen(XtScreen(w)));
11243 
11244     pixmap_final=XCreatePixmap(XtDisplay(w),
11245                                DefaultRootWindow(XtDisplay(w)),
11246                                (unsigned int)width,(unsigned int)height,
11247                                DefaultDepthOfScreen(XtScreen(w)));
11248 
11249     pixmap_alerts=XCreatePixmap(XtDisplay(w),
11250                                 DefaultRootWindow(XtDisplay(w)),
11251                                 (unsigned int)width,(unsigned int)height,
11252                                 DefaultDepthOfScreen(XtScreen(w)));
11253 
11254     HandlePendingEvents(app_context);
11255     if (interrupt_drawing_now)
11256     {
11257       return;
11258     }
11259 
11260     setup_in_view();    // flag stations that are in screen view
11261 
11262     HandlePendingEvents(app_context);
11263     if (interrupt_drawing_now)
11264     {
11265       return;
11266     }
11267 
11268     // Reload maps
11269     // Set interrupt_drawing_now because conditions have
11270     // changed.
11271     interrupt_drawing_now++;
11272 
11273     // Request that a new image be created.  Calls create_image,
11274     // XCopyArea, and display_zoom_status.
11275     request_new_image++;
11276 
11277 //        if (create_image(w)) {
11278 //            (void)XCopyArea(XtDisplay(w),pixmap_final,XtWindow(w),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
11279 //        }
11280   }
11281 }
11282 
11283 
11284 
11285 
11286 
11287 // We got a resize callback.  Set flags.  UpdateTime will come
11288 // along in a bit and perform the resize.  With this method, the
11289 // resize can be made interruptable.  We merely need to check for
11290 // the interrupt_drawing_now flag periodically while doing the
11291 // resize drawing.
11292 //
11293 void da_resize(Widget UNUSED(w), XtPointer UNUSED(client_data), XtPointer UNUSED(call_data) )
11294 {
11295 
11296   // Set the interrupt_drawing_now flag
11297   interrupt_drawing_now++;
11298 
11299   // Set the request_resize flag
11300   request_resize++;
11301 //    last_input_event = sec_now() + 2;
11302 }
11303 
11304 
11305 
11306 
11307 
11308 // We got a mouse or keyboard callback.  Set flags.  UpdateTime
11309 // will come along in a bit and perform the screen redraw.  With
11310 // this method, the redraw can be made interruptable.  We merely
11311 // need to check for the interrupt_drawing_now flag periodically
11312 // while doing the redraw.
11313 //
11314 void da_input(Widget w, XtPointer client_data, XtPointer call_data)
11315 {
11316   XEvent *event = ((XmDrawingAreaCallbackStruct *) call_data)->event;
11317   Dimension width, height;
11318   int redraw;
11319   char buffer[20];
11320   int bufsize = 20;
11321   char temp[200];
11322   char temp_course[20];
11323   KeySym key;
11324   XComposeStatus compose;
11325   int x_center;
11326   int y_center;
11327 //  int x_distance;
11328 //  int y_distance;
11329   float x_distance_real;
11330   float y_distance_real;
11331   float full_distance;
11332   double area;
11333   float area_acres; // area in acres
11334   long a_x, a_y, b_x, b_y;
11335   char str_lat[20];
11336   char str_long[20];
11337   long x,y;
11338   int done = 0;
11339   long lat, lon;
11340 
11341 
11342   XtVaGetValues(w,
11343                 XmNwidth, &width,
11344                 XmNheight, &height,
11345                 NULL);
11346 
11347   /*fprintf(stderr,"input event %d %d\n",event->type,ButtonPress);*/
11348   redraw=0;
11349 
11350   // Snag the current pointer position
11351   input_x = event->xbutton.x;
11352   input_y = event->xbutton.y;
11353 
11354 
11355 /////////////////
11356 // CAD OBJECTS //
11357 /////////////////
11358 
11359   // Start of CAD Objects code.  We have both ButtonPress and
11360   // ButtonRelease code handlers here, for this mode only.
11361   // Check whether we're in CAD Object draw mode first
11362   if (draw_CAD_objects_flag && event->xbutton.button == Button2)
11363   {
11364 
11365     if (event->type == ButtonRelease)
11366     {
11367       // We don't want to do anything for ButtonRelease.  Most
11368       // of all, we don't want another point drawn for both
11369       // press and release, and we don't want other GUI
11370       // actions performed on release when in CAD Draw mode.
11371       done++;
11372     }
11373     else    // ButtonPress for Button2
11374     {
11375 
11376       // We need to check to see whether we're dragging the
11377       // pointer, and then need to save the points away (in
11378       // Xastir lat/long format), drawing lines between the
11379       // points whenever we do a pixmap_final refresh to the
11380       // screen.
11381 
11382       // Check whether we just did the first mouse button down
11383       // while in CAD draw mode.  If so, save away the mouse
11384       // pointer and get out.  We'll use that mouse pointer
11385       // the next time a mouse button gets pressed in order to
11386       // draw a line.
11387 
11388       // We're going to use gc_tint with an XOR bitblit here
11389       // to make sure that any lines we draw will be easily
11390       // seen, no matter what colors we're drawing on top of.
11391       //
11392 
11393       // If we have a valid saved position already from our
11394       // first click, then we must be on the 2nd or later
11395       // click.  Draw a line.
11396       if (polygon_last_x != -1 && polygon_last_y != -1)
11397       {
11398 
11399         // Convert from screen coordinates to Xastir
11400         // coordinate system and save in the object->vertice
11401         // list.
11402         convert_screen_to_xastir_coordinates(input_x,
11403                                              input_y,
11404                                              &lat,
11405                                              &lon);
11406         CAD_vertice_allocate(lat, lon);
11407         // Reload symbols/tracks/CAD objects
11408         redraw_symbols(da);
11409       }
11410       else    // First point of a polygon.  Save it.
11411       {
11412 
11413         // Figure out the real lat/long from the screen
11414         // coordinates.  Create a new object to hold the
11415         // point.
11416         convert_screen_to_xastir_coordinates(input_x,
11417                                              input_y,
11418                                              &lat,
11419                                              &lon);
11420         CAD_object_allocate(lat, lon);
11421       }
11422 
11423       // Save current point away for the next draw.
11424       polygon_last_x = input_x;
11425       polygon_last_y = input_y;
11426 
11427       done++;
11428     }
11429   }
11430 // End of CAD Objects code.
11431 
11432 
11433 /////////////////////////////////
11434 // Start of ButtonRelease code //
11435 /////////////////////////////////
11436 
11437   if (!done && event->type == ButtonRelease)
11438   {
11439     //fprintf(stderr,"ButtonRelease %d %d\n",event->xbutton.button,Button3);
11440 
11441 #ifdef SWAP_MOUSE_BUTTONS
11442     if (event->xbutton.button == Button3)
11443     {
11444       // Right mouse button release
11445 #else   // SWAP_MOUSE_BUTTONS
11446     if (event->xbutton.button == Button1)
11447     {
11448       // Left mouse button release
11449 #endif  // SWAP_MOUSE_BUTTONS
11450 
11451       // If no drag, Center the map on the mouse pointer
11452       // If drag, compute new zoom factor/center and redraw
11453       // -OR- measure distances.
11454 
11455 
11456 /////////////////////////
11457 // CENTER MAP FUNCTION //
11458 /////////////////////////
11459 
11460       // Check for "Center Map" function.  Must be within 15
11461       // pixels of where the button press occurred to qualify.
11462       if ( mouse_zoom && !measuring_distance && !moving_object
11463            && (abs(menu_x - input_x) < 15)
11464            && (abs(menu_y - input_y) < 15) )
11465       {
11466         /*     if(display_up) {
11467                  XtVaGetValues(da,XmNwidth, &width,XmNheight, &height,NULL);
11468                  new_mid_x = center_longitude - ((width *scale_x)/2) + (menu_x*scale_x);
11469                  new_mid_y = center_latitude  - ((height*scale_y)/2) + (menu_y*scale_y);
11470                  new_scale_y = scale_y;          // keep size
11471                  display_zoom_image(1);          // check range and do display, recenter
11472              }
11473          */
11474         // Reset the zoom-box variables
11475         possible_zoom_function = 0;
11476         zoom_box_x1 = -1;
11477       }
11478       // It's not the center function because the mouse moved more than 15 pixels.
11479       // It must be either the "Compute new zoom/center" -OR- the "Measure distance"
11480       // -OR- "Move distance" functions..  The "measuring_distance" or "moving_object"
11481       // variables will tell us.
11482 
11483       else
11484       {
11485         // At this stage we have menu_x/menu_y where the button press occurred,
11486         // and input_x/input_y where the button release occurred.
11487 
11488 
11489 //////////////////////
11490 // MEASURE DISTANCE //
11491 //////////////////////
11492 
11493         if (measuring_distance)     // Measure distance function
11494         {
11495           double R = EARTH_RADIUS_METERS;
11496 
11497 
11498           // Check whether we already have a box on screen
11499           // that we need to erase.
11500           if (zoom_box_x1 != -1)
11501           {
11502 //fprintf(stderr,"erasing\n");
11503             // Remove the last box drawn via the XOR
11504             // function.
11505             XDrawLine(XtDisplay(da),
11506                       XtWindow(da),
11507                       gc_tint,
11508                       l16(zoom_box_x1),    // Keep x constant
11509                       l16(zoom_box_y1),
11510                       l16(zoom_box_x1),
11511                       l16(zoom_box_y2));
11512             XDrawLine(XtDisplay(da),
11513                       XtWindow(da),
11514                       gc_tint,
11515                       l16(zoom_box_x1),
11516                       l16(zoom_box_y1),    // Keep y constant
11517                       l16(zoom_box_x2),
11518                       l16(zoom_box_y1));
11519             XDrawLine(XtDisplay(da),
11520                       XtWindow(da),
11521                       gc_tint,
11522                       l16(zoom_box_x2),    // Keep x constant
11523                       l16(zoom_box_y1),
11524                       l16(zoom_box_x2),
11525                       l16(zoom_box_y2));
11526             XDrawLine(XtDisplay(da),
11527                       XtWindow(da),
11528                       gc_tint,
11529                       l16(zoom_box_x1),
11530                       l16(zoom_box_y2),    // Keep y constant
11531                       l16(zoom_box_x2),
11532                       l16(zoom_box_y2));
11533           }
11534 
11535           // Reset the zoom-box variables
11536           possible_zoom_function = 0;
11537           zoom_box_x1 = -1;
11538 
11539 //                  x_distance = abs(menu_x - input_x);
11540 //                  y_distance = abs(menu_y - input_y);
11541 
11542           // Here we need to convert to either English or Metric units of distance.
11543 
11544           //(temp,"Distance x:%d pixels,  y:%d pixels\n",x_distance,y_distance);
11545           //popup_message_always(langcode("POPUPMA020"),temp);
11546 
11547           XtVaGetValues(da,XmNwidth, &width,XmNheight, &height,NULL);
11548           a_x = center_longitude  - ((width *scale_x)/2) + (menu_x*scale_x);
11549           a_y = center_latitude   - ((height*scale_y)/2) + (menu_y*scale_y);
11550 
11551           b_x = center_longitude  - ((width *scale_x)/2) + (input_x*scale_x);
11552           b_y = center_latitude   - ((height*scale_y)/2) + (input_y*scale_y);
11553 
11554           // Keep y constant to get x distance.  Convert
11555           // to the current measurement units for display.
11556           x_distance_real = cvt_kn2len * calc_distance_course(a_y,a_x,a_y,b_x,temp_course,sizeof(temp_course));
11557           // Keep x constant to get y distance.  Convert
11558           // to the current measurement units for display.
11559           y_distance_real = cvt_kn2len * calc_distance_course(a_y,a_x,b_y,a_x,temp_course,sizeof(temp_course));
11560           // Compute the total distance and course.
11561           // Convert to the current measurement units for
11562           // display.
11563           full_distance = cvt_kn2len * calc_distance_course(a_y,a_x,b_y,b_x,temp_course,sizeof(temp_course));
11564 
11565           if (full_distance < 1.0)
11566           {
11567             switch (english_units)
11568             {
11569               case 1:     // English
11570                 full_distance   = full_distance   * 5280;   // convert from miles to feet
11571                 x_distance_real = x_distance_real * 5280;   // convert from miles to feet
11572                 y_distance_real = y_distance_real * 5280;   // convert from miles to feet
11573                 break;
11574               case 2:     // Nautical miles and knots
11575                 full_distance   = full_distance   * 6076;   // convert from miles to feet
11576                 x_distance_real = x_distance_real * 6076;   // convert from miles to feet
11577                 y_distance_real = y_distance_real * 6076;   // convert from miles to feet
11578                 break;
11579               default:    // Metric
11580                 full_distance   = full_distance   * 1000;   // convert from kilometers to meters
11581                 x_distance_real = x_distance_real * 1000;   // convert from kilometers to meters
11582                 y_distance_real = y_distance_real * 1000;   // convert from kilometers to meters
11583                 break;
11584             }
11585 
11586 // See this URL for a method of calculating the area of a lat/long
11587 // rectangle on a sphere:
11588 // http://mathforum.org/library/drmath/view/63767.html
11589 // area = (pi/180)*R^2 * abs(sin(lat1)-sin(lat2)) * abs(lon1-lon2)
11590 //
11591 // Their formula is incorrect due to the mistake of mixing radians
11592 // and degrees.  The correct formula is (WE7U):
11593 // area = R^2 * abs(sin(lat1)-sin(lat2)) * abs(lon1-lon2)
11594 
11595             // Compute correct units
11596             switch (english_units)
11597             {
11598               case 1:     // English
11599                 R = EARTH_RADIUS_MILES * 5280.0;    // feet
11600                 break;
11601               case 2:     // Nautical miles and knots
11602                 R = EARTH_RADIUS_MILES * 5280.0;    // feet
11603                 break;
11604               default:    // Metric
11605                 R = EARTH_RADIUS_METERS; // Meters
11606                 break;
11607             }
11608 
11609             // Compute the total area in feet or meters
11610 
11611             // New method using area on a sphere:
11612             area = R*R
11613                    * fabs( sin(convert_lat_l2r(a_y)) - sin(convert_lat_l2r(b_y)) )
11614                    * fabs( convert_lon_l2r(a_x) - convert_lon_l2r(b_x) );
11615 
11616             // Old method using planar geometry:
11617             //area = x_distance_real * y_distance_real;
11618 
11619             // calculate area in acres
11620             switch (english_units)
11621             {
11622               case 1:
11623               case 2:
11624                 area_acres = area * 2.2956749e-05;
11625                 break;
11626               default:  // Metric
11627                 area_acres = area * 2.4710439e-04;
11628                 break;
11629             }
11630             //if (area_acres<0.1)
11631             //     area_acres = 0;
11632 
11633 //fprintf(stderr,"Old method: %f\nNew method: %f\n\n",
11634 //    x_distance_real * y_distance_real,
11635 //    area);
11636 
11637 
11638 
11639 // NOTE:  Angles currently change at zoom==1, so we purposely don't
11640 // give an angle in that measurement instance below.
11641 //
11642             xastir_snprintf(temp,
11643                             sizeof(temp),
11644                             "%0.2f %s, x=%0.2f %s, y=%0.2f %s, %0.2f %s %s (%0.2f %s), %s: %s %s",
11645                             full_distance, un_alt,      // feet/meters
11646                             x_distance_real, un_alt,    // feet/meters
11647                             y_distance_real, un_alt,    // feet/meters
11648                             area,
11649                             langcode("POPUPMA038"), // square
11650                             un_alt,
11651                             area_acres,
11652                             "acres",
11653                             langcode("POPUPMA041"), // Bearing
11654                             (scale_y == 1) ? "??" : temp_course, // Fix for zoom==1
11655                             langcode("POPUPMA042") );   // degrees
11656           }
11657           else
11658           {
11659             // Compute the total area in miles or
11660             // kilometers
11661 
11662             // Compute correct units
11663             switch (english_units)
11664             {
11665               case 1:     // English
11666                 R = EARTH_RADIUS_MILES; // Statute miles
11667                 break;
11668               case 2:     // Nautical miles and knots
11669                 R = EARTH_RADIUS_KILOMETERS/1.852; // Nautical miles
11670                 break;
11671               default:    // Metric
11672                 R = EARTH_RADIUS_KILOMETERS; // kilometers
11673                 break;
11674             }
11675 
11676             // New method, area on a sphere:
11677             area = R*R
11678                    * fabs(sin(convert_lat_l2r(a_y))-sin(convert_lat_l2r(b_y)))
11679                    * fabs(convert_lon_l2r(a_x)-convert_lon_l2r(b_x));
11680 
11681             // Old method using planar geometry:
11682             //area = x_distance_real * y_distance_real;
11683 
11684 //fprintf(stderr,"Old method: %f\nNew method: %f\n\n",
11685 //    x_distance_real * y_distance_real,
11686 //    area);
11687 
11688             xastir_snprintf(temp,
11689                             sizeof(temp),
11690                             "%0.2f %s, x=%0.2f %s, y=%0.2f %s, %0.2f %s %s, %s: %s %s",
11691                             full_distance, un_dst,      // miles/kilometers
11692                             x_distance_real, un_dst,    // miles/kilometers
11693                             y_distance_real, un_dst,    // miles/kilometers
11694                             area,
11695                             langcode("POPUPMA038"), // square
11696                             un_dst,
11697                             langcode("POPUPMA041"), // Bearing
11698                             temp_course,
11699                             langcode("POPUPMA042") ); // degrees
11700           }
11701           popup_message_always(langcode("POPUPMA020"),temp);
11702         }
11703 
11704 
11705 ///////////////////
11706 // MOVING OBJECT //
11707 ///////////////////
11708 
11709         else if (moving_object)     // Move function
11710         {
11711           // For this function we need to:
11712           //   Determine which icon is closest to the mouse pointer press position.
11713           //     We'll use Station_info to select the icon for us.
11714           //   Determine whether it is our object.  If not, force
11715           //     the user to "adopt" the object before moving it.
11716           //   Compute the lat/lon of the mouse pointer release position.
11717           //   Put the new value of lat/lon into the object data.
11718           //   Cause symbols to get redrawn.
11719 
11720           // Reset the zoom-box variables
11721           possible_zoom_function = 0;
11722           zoom_box_x1 = -1;
11723 
11724           x = (center_longitude - ((screen_width  * scale_x)/2) + (event->xmotion.x * scale_x));
11725           y = (center_latitude  - ((screen_height * scale_y)/2) + (event->xmotion.y * scale_y));
11726 
11727           if (x < 0)
11728           {
11729             x = 0l;  // 180°W
11730           }
11731 
11732           if (x > 129600000l)
11733           {
11734             x = 129600000l;  // 180°E
11735           }
11736 
11737           if (y < 0)
11738           {
11739             y = 0l;  //  90°N
11740           }
11741 
11742           if (y > 64800000l)
11743           {
11744             y = 64800000l;  //  90°S
11745           }
11746 
11747           if (debug_level & 1)
11748           {
11749             // This math is only used for the debug mode printf below.
11750             if (coordinate_system == USE_DDDDDD)
11751             {
11752               convert_lat_l2s(y, str_lat, sizeof(str_lat), CONVERT_DEC_DEG);
11753               convert_lon_l2s(x, str_long, sizeof(str_long), CONVERT_DEC_DEG);
11754             }
11755             else if (coordinate_system == USE_DDMMSS)
11756             {
11757               convert_lat_l2s(y, str_lat, sizeof(str_lat), CONVERT_DMS_NORMAL);
11758               convert_lon_l2s(x, str_long, sizeof(str_long), CONVERT_DMS_NORMAL);
11759             }
11760             else        // Assume coordinate_system == USE_DDMMMM
11761             {
11762               convert_lat_l2s(y, str_lat, sizeof(str_lat), CONVERT_HP_NORMAL);
11763               convert_lon_l2s(x, str_long, sizeof(str_long), CONVERT_HP_NORMAL);
11764             }
11765             //fprintf(stderr,"%s  %s\n", str_lat, str_long);
11766           }
11767 
11768           // Effect the change in the object/item's
11769           // position.
11770           //
11771           doing_move_operation++;
11772           Station_info(w, "2", NULL);
11773           doing_move_operation = 0;
11774         }
11775 
11776 
11777 /////////////////////////////
11778 // COMPUTE NEW CENTER/ZOOM //
11779 /////////////////////////////
11780 
11781         else    // Must be "Compute new center/zoom" function
11782         {
11783           float ratio;
11784 
11785           if (!map_lock_pan_zoom)
11786           {
11787 
11788             // We need to compute a new center and a new scale, then
11789             // cause the new image to be created.
11790             // Compute new center.  It'll be the average of the two points
11791             x_center = (menu_x + input_x) /2;
11792             y_center = (menu_y + input_y) /2;
11793 
11794             XtVaGetValues(da,XmNwidth, &width,XmNheight, &height,NULL);
11795             new_mid_x = center_longitude - ((width *scale_x)/2) + (x_center*scale_x);
11796             new_mid_y = center_latitude  - ((height*scale_y)/2) + (y_center*scale_y);
11797 
11798             //
11799             // What Rolf had to say:
11800             //
11801             // Calculate center of mouse-marked area and get the scaling relation
11802             // between x and y for that position. This position will be the new
11803             // center, so that lattitude-dependent relation does not change with
11804             // a zoom-in. For both x and y calculate a new zoom factor necessary
11805             // to fit that screen direction. Select the one that allows both x
11806             // and y part to fall into the screen area. Draw the new screen with
11807             // new center and new zoom factor.
11808             //
11809 
11810             // Compute the new scale, or as close to it as we can get
11811             //new_scale_y = scale_y / 2;    // Zoom in by a factor of 2
11812             new_scale_y = (long)( (((1.0 * abs(menu_y - input_y)) / (float)height ) * (float)scale_y ) + 0.5);
11813             new_scale_x = (long)( (((1.0 * abs(menu_x - input_x)) / (float)width  ) * (float)scale_x ) + 0.5);
11814 
11815             if (new_scale_y < 1)
11816             {
11817               new_scale_y = 1;  // Don't go further in than zoom 1
11818             }
11819 
11820             if (new_scale_x < 1)
11821             {
11822               new_scale_x = 1;  // Don't go further in than zoom 1
11823             }
11824 
11825             // We now know approximately the scales we need
11826             // in order to view all of the pixels just
11827             // selected in the drag operation.  Now set
11828             // new_scale_y to the highest number of the two,
11829             // which will make sure the entire drag
11830             // selection will be seen at the new zoom level.
11831             // Use the new ratio between scales to compute
11832             // this, computed from the new midpoint.
11833             //
11834             //fprintf(stderr,"scale_x:%ld\tscale_y:%ld\n", get_x_scale(new_mid_x, new_mid_y, scale_y), scale_y );
11835             ratio = ( (1.0 * get_x_scale(new_mid_x,new_mid_y,scale_y)) / (float)scale_y);
11836 
11837             //fprintf(stderr,"Ratio: %f\n", ratio);
11838             //fprintf(stderr,"x:%ld\ty:%ld\n", new_scale_x, new_scale_y);
11839             if ( new_scale_y < (long)((new_scale_x / ratio) + 0.5) )
11840             {
11841               new_scale_y =  (long)((new_scale_x / ratio) + 0.5);
11842               //fprintf(stderr,"Changed y\n");
11843             }
11844             //fprintf(stderr,"x:%ld\ty:%ld\n", new_scale_x, new_scale_y);
11845 
11846             display_zoom_image(1);          // Check range and do display, recenter
11847 
11848             menu_x = input_x;
11849             menu_y = input_y;
11850             //fprintf(stderr,"Drag/zoom/center happened\n");
11851 
11852             // Reset the zoom-box variables
11853             possible_zoom_function = 0;
11854             zoom_box_x1 = -1;
11855           }
11856         }
11857       }
11858       mouse_zoom = 0;
11859     }   // End of Button1 release code
11860 
11861 
11862 //////////////
11863 // ZOOM OUT //
11864 //////////////
11865 
11866     else if (event->xbutton.button == Button2 && !map_lock_pan_zoom)
11867     {
11868       // Middle mouse button release
11869 
11870       // Zoom out 2x with panning
11871       menu_x=input_x;
11872       menu_y=input_y;
11873       Zoom_out( w, client_data, call_data );
11874 
11875       // Simple zoom out, keeping map center at current position
11876       //Zoom_out_no_pan( w, client_data, call_data );
11877       mouse_zoom = 0;
11878     }   // End of Button2 release code
11879 
11880 
11881 ////////////////////////////////
11882 // THIRD MOUSE BUTTON RELEASE //
11883 ////////////////////////////////
11884 
11885 #ifdef SWAP_MOUSE_BUTTONS
11886     else if (event->xbutton.button == Button1)
11887     {
11888       // Left mouse button release
11889 #else   // SWAP_MOUSE_BUTTONS
11890     else if (event->xbutton.button == Button3)
11891     {
11892       // Right mouse button release
11893 #endif  // SWAP_MOUSE_BUTTONS
11894 
11895       // Do nothing.  We have a popup tied into the button press anyway.
11896       // (Mouse_button_handler & right_menu_popup).
11897       // Leave the button release alone in this case.
11898       mouse_zoom = 0;
11899     }   // End of Button3 release code
11900 
11901 
11902 ///////////////
11903 // SCROLL UP //
11904 ///////////////
11905 
11906     else if (event->xbutton.button == Button4 && !map_lock_pan_zoom)
11907     {
11908 // Scroll up
11909       menu_x=input_x;
11910       menu_y=input_y;
11911       Pan_up(w, client_data, call_data);
11912     }   // End of Button4 release code
11913 
11914 
11915 /////////////////
11916 // SCROLL DOWN //
11917 /////////////////
11918 
11919     else if (event->xbutton.button == Button5 && !map_lock_pan_zoom)
11920     {
11921 // Scroll down
11922       menu_x=input_x;
11923       menu_y=input_y;
11924       Pan_down(w, client_data, call_data);
11925     }   // End of Button5 release code
11926 
11927 
11928 ////////////////////////////////////
11929 // YET MORE MOUSE BUTTON RELEASES //
11930 ////////////////////////////////////
11931 
11932     else if (event->xbutton.button == 6 && !map_lock_pan_zoom)
11933     {
11934 // Mouse button 6 release
11935       menu_x=input_x;
11936       menu_y=input_y;
11937       Zoom_out_no_pan(w, client_data, call_data);
11938       mouse_zoom = 0;
11939     }   // End of Button6 code
11940 
11941     else if (event->xbutton.button == 7 && !map_lock_pan_zoom)
11942     {
11943 // Mouse button 7 release
11944       menu_x=input_x;
11945       menu_y=input_y;
11946       Zoom_in_no_pan(w, client_data, call_data);
11947       mouse_zoom = 0;
11948     }   // End of Button7 release code
11949   }
11950 // End of ButtonRelease code
11951 
11952 
11953 
11954 ///////////////////////////////
11955 // Start of ButtonPress code //
11956 ///////////////////////////////
11957 
11958   else if (!done && event->type == ButtonPress)
11959   {
11960     //fprintf(stderr,"ButtonPress %d %d\n",event->xbutton.button,Button3);
11961 
11962 #ifdef SWAP_MOUSE_BUTTONS
11963     if (event->xbutton.button == Button3)
11964     {
11965 // Right mouse button press
11966 #else   // SWAP_MOUSE_BUTTONS
11967     if (event->xbutton.button == Button1)
11968     {
11969 // Left mouse button press
11970 #endif  // SWAP_MOUSE_BUTTONS
11971 
11972       // Mark the position for possible drag function
11973       menu_x=input_x;
11974       menu_y=input_y;
11975       mouse_zoom = 1;
11976 
11977       if (!moving_object)    // Can be "Measure" or "Zoom-in"
11978       {
11979         if  (!map_lock_pan_zoom || (map_lock_pan_zoom && measuring_distance))
11980         {
11981           // Not moving an object/item, so allow the
11982           // zoom-in box to display.
11983           possible_zoom_function++;
11984         }
11985       }
11986     }   // End of Button1 Press code
11987 
11988     else if (event->xbutton.button == Button2)
11989     {
11990 // Middle mouse button or both right/left mouse buttons press
11991 
11992       // Nothing attached here.
11993       mouse_zoom = 0;
11994     }   // End of Button2 Press code
11995 
11996 #ifdef SWAP_MOUSE_BUTTONS
11997     else if (event->xbutton.button == Button1)
11998     {
11999 // Left mouse button press
12000 #else   // SWAP_MOUSE_BUTTONS
12001     else if (event->xbutton.button == Button3)
12002     {
12003 // Right mouse button press
12004 #endif  // SWAP_MOUSE_BUTTONS
12005 
12006       // Nothing attached here.
12007       mouse_zoom = 0;
12008     }   // End of Button3 Press code
12009   }
12010 // End of ButtonPress code
12011 
12012 
12013 ////////////////////////////
12014 // Start of KeyPress code //
12015 ////////////////////////////
12016 
12017   else if (!done && event->type == KeyPress)
12018   {
12019 
12020     // We want to branch from the keysym instead of the keycode
12021     (void)XLookupString( (XKeyEvent *)event, buffer, bufsize, &key, &compose );
12022     //fprintf(stderr,"main.c:da_input():keycode %d\tkeysym %ld\t%s\n", event->xkey.keycode, key, buffer);
12023 
12024     // keycode ??, keysym 65360 is Home (0x???? on sun kbd)
12025 //        if ((key == 65360) || (key == 0x????)) {
12026     if (key == 65360)
12027     {
12028       if (!map_lock_pan_zoom)
12029       {
12030         Go_Home(w, NULL, NULL);
12031       }
12032     }
12033 
12034     // keycode 99, keysym 65365 is PageUp (0xffda on sun kbd)
12035     if ((key == 65365) || (key == 0xffda))
12036     {
12037       menu_x=input_x;
12038       menu_y=input_y;
12039       Zoom_out_no_pan( w, client_data, call_data );
12040       TrackMouse(w, (XtPointer)text2, event, NULL);
12041     }
12042 
12043     // keycode 105, keysym 65366 is PageDown (0xffe0 on sun kbd)
12044     if ((key == 65366) || (key == 0xffe0))
12045     {
12046       menu_x=input_x;
12047       menu_y=input_y;
12048       Zoom_in_no_pan( w, client_data, call_data );
12049       TrackMouse(w, (XtPointer)text2, event, NULL);
12050     }
12051 
12052     // keycode 100, keysym 65361 is left-arrow
12053     if ( (key == 65361)
12054          || ( (key == 65361) && (event->xkey.state & ShiftMask) ) )      // Doesn't work yet.
12055     {
12056       if (!map_lock_pan_zoom)
12057       {
12058         menu_x=input_x;
12059         menu_y=input_y;
12060         if (event->xbutton.state & ShiftMask)   // This doesn't work yet
12061         {
12062           Pan_left_less( w, client_data, call_data);
12063         }
12064         else
12065         {
12066           Pan_left( w, client_data, call_data );
12067         }
12068         TrackMouse(w, (XtPointer)text2, event, NULL);
12069       }
12070     }
12071 
12072     // keycode 102, keysym 65363 is right-arrow
12073     if ( (key == 65363)
12074          || ( (key == 65363) && (event->xkey.state & ShiftMask) ) )      // Doesn't work yet.
12075     {
12076       if (!map_lock_pan_zoom)
12077       {
12078         menu_x=input_x;
12079         menu_y=input_y;
12080         if (event->xbutton.state & ShiftMask)   // This doesn't work yet
12081         {
12082           Pan_right_less( w, client_data, call_data);
12083         }
12084         else
12085         {
12086           Pan_right( w, client_data, call_data );
12087         }
12088         TrackMouse(w, (XtPointer)text2, event, NULL);
12089       }
12090     }
12091 
12092     // keycode 98, keysym 65362 is up-arrow
12093     if ( (key == 65362)
12094          || ( (key == 65362) && (event->xkey.state & ShiftMask) ) )      // Doesn't work yet.
12095     {
12096       if (!map_lock_pan_zoom)
12097       {
12098         menu_x=input_x;
12099         menu_y=input_y;
12100         if (event->xbutton.state & ShiftMask)   // This doesn't work yet
12101         {
12102           Pan_up_less( w, client_data, call_data);
12103         }
12104         else
12105         {
12106           Pan_up( w, client_data, call_data );
12107         }
12108         TrackMouse(w, (XtPointer)text2, event, NULL);
12109       }
12110     }
12111 
12112     // keycode 105, keysym 65364 is down-arrow
12113     if ( (key == 65364)
12114          || ( (key == 65364) && (event->xkey.state & ShiftMask) ) )      // Doesn't work yet.
12115     {
12116       if (!map_lock_pan_zoom)
12117       {
12118         menu_x=input_x;
12119         menu_y=input_y;
12120         if (event->xbutton.state & ShiftMask)   // This doesn't work yet
12121         {
12122           Pan_down_less( w, client_data, call_data);
12123         }
12124         else
12125         {
12126           Pan_down( w, client_data, call_data );
12127         }
12128         TrackMouse(w, (XtPointer)text2, event, NULL);
12129       }
12130     }
12131 
12132     // keycode 35, keysym 61 is Equals
12133     // keycode 35, keysim 43 is Plus
12134     // keycode 86, keysim 65451 is KP_Add
12135     if (key == 61 || key == 43 || key == 65451)
12136     {
12137       grid_size++;
12138       redraw = 1;
12139     }
12140 
12141     // keycode 48, keysym 45 is Minus
12142     // keycode 82, keysym 65453 is KP_Subtract
12143     if (key == 45 || key == 65453)
12144     {
12145       grid_size--;
12146       redraw = 1;
12147     }
12148 
12149     // Adjust map scale, execpt when pan/zoom locked
12150     if (!map_lock_pan_zoom && OSM_optimize_key(key))
12151     {
12152       if (debug_level & 512)
12153       {
12154         fprintf(stderr, "Initial scale, before adjustment sx/sy = %li/%li\n", scale_x, scale_y);
12155       }
12156 
12157       adj_to_OSM_level(&scale_x, &scale_y);
12158 
12159       if (debug_level & 512)
12160       {
12161         fprintf(stderr, "Scale adjusted for OSM, sx/sy = %li/%li\n", scale_x, scale_y);
12162       }
12163       redraw = 1;
12164     }
12165 
12166     if ((debug_level & 512) && OSM_report_scale_key(key))
12167     {
12168       fprintf(stderr, "scale_x = %li, scale_y = %li, OSM zoom = %i\n",
12169               scale_x, scale_y, osm_zoom_level(scale_x));
12170     }
12171   }
12172 // End of KeyPress code
12173 
12174 
12175 //////////////////////////////////
12176 // START OF SOMETHING ELSE CODE //
12177 //////////////////////////////////
12178   else if (!done)    // Something else
12179   {
12180     if (event->type == MotionNotify)
12181     {
12182       input_x = event->xmotion.x;
12183       input_y = event->xmotion.y;
12184 //fprintf(stderr,"da_input2 x %d y %d\n",input_x,input_y);
12185     }
12186   }   // End of SomethingElse code
12187 
12188 
12189 
12190   if (redraw)
12191   {
12192     /*fprintf(stderr,"Current x %ld y * %ld\n",center_longitude,center_latitude);*/
12193 
12194     // Set the interrupt_drawing_now flag
12195     interrupt_drawing_now++;
12196 
12197     // Request that a new image be created.  Calls create_image,
12198     // XCopyArea, and display_zoom_status.
12199     request_new_image++;
12200 //        last_input_event = sec_now() + 2;
12201   }
12202 }
12203 
12204 
12205 
12206 
12207 
12208 
12209 
12210 // DK7IN: this function is unused...
12211 //void wait_sec(int dt) {
12212 //    time_t ct;
12213 //
12214 //    ct = sec_now() + dt;
12215 //    while (ct < sec_now()) {
12216 //    }
12217 //}
12218 
12219 
12220 
12221 
12222 
12223 // This function snags the current pointer information and tries to
12224 // determine whether we're doing some sort of draw or zoom function.
12225 // If so, draws the appropriate temporary squares or lines that the
12226 // operator expects.
12227 //
12228 void check_pointer_position(void)
12229 {
12230   Window  root_return, child_return;
12231   int rootx_return, rooty_return;
12232   int win_x_return, win_y_return;
12233   unsigned int mask_return;
12234   Bool ret;
12235   int x_return;
12236   int y_return;
12237   unsigned int width_return;
12238   unsigned int height_return;
12239   unsigned int border_width_return;
12240   unsigned int depth_return;
12241 
12242 
12243   // If this variable has not been set, we should not display the
12244   // box.
12245   if (!possible_zoom_function)
12246   {
12247     return;
12248   }
12249 
12250   // Snag the current pointer info
12251   ret = XQueryPointer(XtDisplay(da),
12252                       XtWindow(da),  // Window we are interested in
12253                       &root_return,  // Root window that pointer is in
12254                       &child_return, // Child windows that pointer is in, if any
12255                       &rootx_return, // Pointer coord. relative to root window
12256                       &rooty_return, // Pointer coord. relative to root window
12257                       &win_x_return, // Pointer coord. relative to specified window
12258                       &win_y_return, // Pointer coord. relative to specified window
12259                       &mask_return); // State of modifier keys and pointer buttons
12260 
12261   switch (ret)
12262   {
12263 
12264     case True:
12265       // If we made it here, we're on the same screen as the
12266       // specified window.  It's a good start anyway.
12267 //fprintf(stderr, "x:%d  y:%d  ", win_x_return, win_y_return);
12268 //fprintf(stderr, "root:%lx  child:%lx  ", root_return, child_return);
12269 //fprintf(stderr, "mask:%03x  ret:%02x\n", mask_return, ret);
12270 
12271       // Check mask_return to see if button one is being
12272       // pressed down (a drag operation).  If so, we're doing
12273       // a zoom-in operation and need to draw a box.  0x100
12274 
12275       // Check if button two (middle button) is being pressed
12276       // down (a drag operation).  If so, we're doing a CAD
12277       // Object draw and need to draw a line.  0x200
12278 
12279       // Figure out how to erase previous lines/boxes so that
12280       // only the current object is shown.  We might need to
12281       // keep track of earlier vectors and then redraw them
12282       // with an XOR function to erase.
12283 
12284       // Get the dimensions for the drawing area
12285       // XGetGeometry(Display *display,
12286       //     Drawable d,
12287       //     Window *root_return,
12288       //     int *x_return,
12289       //     int *y_return,
12290       //     unsigned int *width_return,
12291       //     unsigned int *height_return,
12292       //     unsigned int *border_width_return,
12293       //     unsigned int *depth_return);
12294       XGetGeometry(XtDisplay(da),
12295                    XtWindow(da),
12296                    &root_return,
12297                    &x_return,
12298                    &y_return,
12299                    &width_return,
12300                    &height_return,
12301                    &border_width_return,
12302                    &depth_return);
12303 
12304       // Check that X/Y are positive and below the max size of
12305       // the child window.
12306       if ( win_x_return >= (int)width_return
12307            || win_y_return >= (int)height_return)
12308       {
12309 
12310         /*
12311         fprintf(stderr, "Out of bounds: %d:%d  %d:%d\n",
12312             win_x_return,
12313             width_return,
12314             win_y_return,
12315             height_return);
12316         */
12317         return;
12318       }
12319       else
12320       {
12321         // Draw what we need to.
12322         // For CAD objects, polygon_last_x and
12323         // polygon_last_y contain the last position.
12324         // For the zoom-in function, menu_x and menu_y
12325         // contain the last position.
12326 
12327         if (draw_CAD_objects_flag)
12328         {
12329           // Check if button two (middle button) is being
12330           // pressed down (a drag operation).  If so,
12331           // we're doing a CAD Object draw and need to
12332           // draw a line.  0x200
12333           if ( (mask_return & 0x200) == 0)
12334           {
12335             return;
12336           }
12337 
12338           // Remove the last line drawn (if any).  Draw a
12339           // line from polygon_last_x and polygon_last_y
12340           // to the current pointer position.
12341           /*
12342                               (void)XSetLineAttributes(XtDisplay(da), gc_tint, 0, LineSolid, CapButt,JoinMiter);
12343                               (void)XSetForeground(XtDisplay(da), gc_tint, colors[(int)0x0e]); // yellow
12344                               XDrawLine(XtDisplay(da),
12345                                   XtWindow(da),
12346                                   gc_tint,
12347                                   l16(polygon_last_x),
12348                                   l16(polygon_last_y),
12349                                   l16(win_x_return),
12350                                   l16(win_y_return));
12351           */
12352           return;
12353         }
12354         else    // Zoom-in function?
12355         {
12356           // Check mask_return to see if button one is
12357           // being pressed down (a drag operation).  If
12358           // so, we're doing a zoom-in operation and need
12359           // to draw a box.  0x100
12360 #ifdef SWAP_MOUSE_BUTTONS
12361           if ( (mask_return & 0x400) == 0)    // Button3
12362           {
12363 #else   // SWAP_MOUSE_BUTTONS
12364           if ( (mask_return & 0x100) == 0)    // Button1
12365           {
12366 #endif  // SWAP_MOUSE_BUTTONS
12367             return;
12368           }
12369 
12370           (void)XSetLineAttributes(XtDisplay(da), gc_tint, 1, LineSolid, CapButt,JoinMiter);
12371           (void)XSetForeground(XtDisplay(da), gc_tint, colors[(int)0x0e]); // yellow
12372           (void)XSetFunction(XtDisplay(da), gc_tint, GXxor);
12373 
12374           // Check whether we already have a box on screen
12375           // that we need to erase.
12376           if (zoom_box_x1 != -1)
12377           {
12378 //fprintf(stderr,"erasing\n");
12379             // Remove the last box drawn via the XOR
12380             // function.
12381             XDrawLine(XtDisplay(da),
12382                       XtWindow(da),
12383                       gc_tint,
12384                       l16(zoom_box_x1),    // Keep x constant
12385                       l16(zoom_box_y1),
12386                       l16(zoom_box_x1),
12387                       l16(zoom_box_y2));
12388             XDrawLine(XtDisplay(da),
12389                       XtWindow(da),
12390                       gc_tint,
12391                       l16(zoom_box_x1),
12392                       l16(zoom_box_y1),    // Keep y constant
12393                       l16(zoom_box_x2),
12394                       l16(zoom_box_y1));
12395             XDrawLine(XtDisplay(da),
12396                       XtWindow(da),
12397                       gc_tint,
12398                       l16(zoom_box_x2),    // Keep x constant
12399                       l16(zoom_box_y1),
12400                       l16(zoom_box_x2),
12401                       l16(zoom_box_y2));
12402             XDrawLine(XtDisplay(da),
12403                       XtWindow(da),
12404                       gc_tint,
12405                       l16(zoom_box_x1),
12406                       l16(zoom_box_y2),    // Keep y constant
12407                       l16(zoom_box_x2),
12408                       l16(zoom_box_y2));
12409           }
12410 
12411           // Draw a box around the current zoom area.
12412           XDrawLine(XtDisplay(da),
12413                     XtWindow(da),
12414                     gc_tint,
12415                     l16(menu_x),         // Keep x constant
12416                     l16(menu_y),
12417                     l16(menu_x),
12418                     l16(win_y_return));
12419           XDrawLine(XtDisplay(da),
12420                     XtWindow(da),
12421                     gc_tint,
12422                     l16(menu_x),
12423                     l16(menu_y),         // Keep y constant
12424                     l16(win_x_return),
12425                     l16(menu_y));
12426           XDrawLine(XtDisplay(da),
12427                     XtWindow(da),
12428                     gc_tint,
12429                     l16(win_x_return),   // Keep x constant
12430                     l16(menu_y),
12431                     l16(win_x_return),
12432                     l16(win_y_return));
12433           XDrawLine(XtDisplay(da),
12434                     XtWindow(da),
12435                     gc_tint,
12436                     l16(menu_x),
12437                     l16(win_y_return),   // Keep y constant
12438                     l16(win_x_return),
12439                     l16(win_y_return));
12440 
12441           // Save the values away so that we can erase the
12442           // box later.
12443           zoom_box_x1 = menu_x;
12444           zoom_box_y1 = menu_y;
12445           zoom_box_x2 = win_x_return;
12446           zoom_box_y2 = win_y_return;
12447 
12448           return;
12449         }
12450 
12451       }
12452 
12453       break;
12454 
12455     case BadWindow: // A window passed to the function was no
12456       // good.
12457       fprintf(stderr, "check_pointer_position: BadWindow\n");
12458       return;
12459       break;
12460 
12461     case False: // Pointer is not on the same screen as the
12462     // specified window.
12463     default:
12464       return;
12465       break;
12466 
12467   }
12468 }   // End of check_pointer_position()
12469 
12470 
12471 
12472 
12473 
12474 // Release ApplicationContext when we are asked to leave
12475 //
12476 void clear_application_context(void)
12477 {
12478   if (app_context)
12479   {
12480     XtDestroyApplicationContext(app_context);
12481   }
12482   app_context = NULL;
12483 }
12484 
12485 
12486 
12487 time_t stations_status_time = 0;
12488 static int last_alert_on_screen = -1;
12489 
12490 
12491 // This is the periodic process that updates the maps/symbols/tracks.
12492 // At the end of the function it schedules itself to be run again.
12493 void UpdateTime( XtPointer clientData, XtIntervalId UNUSED(id) )
12494 {
12495   Widget w = (Widget) clientData;
12496   time_t nexttime;
12497 //  int do_time;
12498   int max;
12499   int i;
12500   char station_num[30];
12501   char line[MAX_LINE_SIZE+1];
12502   int line_offset = 0;
12503   int n;
12504   time_t current_time;
12505   int data_length;
12506   int data_port;
12507   unsigned char data_string[MAX_LINE_SIZE];
12508 #ifdef HAVE_DB
12509   int got_conn;   // holds result from openConnection()
12510 #endif // HAVE_DB
12511 
12512   char temp_file_name[MAX_VALUE];
12513 
12514 //  do_time = 0;
12515 
12516   // Start UpdateTime again 10 milliseconds after we've completed.
12517   // Note:  Setting this too low can cause // some systems
12518   // (RedHat/FreeBSD) to spin their wheels a lot, using up great
12519   // amounts of CPU time.  This is heavily dependent on the true
12520   // value of the "HZ" value, which is reported as "100" on some
12521   // systems even if the kernel is using another value.
12522 #ifdef __CYGWIN__
12523   // Cygwin performance is abysmal if nexttime is lower than 50, almost
12524   // acceptable at 200.
12525   nexttime = 200;
12526 #else
12527   // Changed from 2 to 10 to fix high CPU usage problems on
12528   // FreeBSD.
12529   nexttime = 10;
12530 #endif // __CYGWIN__
12531 
12532 
12533 
12534   if (restart_xastir_now)
12535   {
12536     char bin_path[250];
12537 
12538     clear_application_context();
12539     // Restart Xastir in this process space.  This is triggered
12540     // by receiving a SIGHUP signal to the main process, which
12541     // causes the signal handler restart() to run.  restart()
12542     // shuts down most things nicely and then sets the
12543     // restart_xastir_now  global variable.
12544     //
12545     // We need to snag the path to the executable from somewhere
12546     // so that we can start up again on a variety of systems.
12547     // Trying to get it from argv[0] doesn't work as that ends
12548     // up as "xastir" with no path.  We therefore get it from
12549     // XASTIR_BIN_PATH which we define in configure.ac
12550     //
12551 //        execve("/usr/local/bin/xastir", my_argv, my_envp);
12552     xastir_snprintf(bin_path,
12553                     sizeof(bin_path),
12554                     "%s/bin/xastir",
12555                     XASTIR_BIN_PATH);
12556 
12557     // Restart this Xastir instance
12558     execve(bin_path, my_argv, my_envp);
12559   }
12560 
12561 
12562 
12563   current_time = sec_now();
12564 
12565   if (last_updatetime > current_time)
12566   {
12567     // Time just went in the wrong direction.  Sleep for a bit
12568     // so that we don't use massive CPU until the time catches
12569     // up again.
12570     //
12571     if (time_went_backwards == 0)
12572     {
12573       char temp[110];
12574 
12575       // This is our first time through UpdateTime() since the
12576       // time went in the wrong direction.  Dump out a
12577       // message to the user.
12578       time_went_backwards++;
12579       get_timestamp(temp);
12580 
12581       fprintf(stderr,"\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
12582       fprintf(stderr,    "!!  System time jumped backwards %d seconds!\n",
12583               (int)(last_updatetime - current_time) );
12584       fprintf(stderr,    "!! Xastir sleeping, else will use excessive CPU\n");
12585       fprintf(stderr,    "!! %s\n",
12586               temp);
12587       fprintf(stderr,    "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
12588       time_went_backwards++;
12589     }
12590     usleep(1);   // Sleep for 1uS.
12591   }
12592   else
12593   {
12594     // Time is behaving normally.
12595     last_updatetime = current_time;
12596     if (time_went_backwards)
12597     {
12598       fprintf(stderr,
12599               "Xastir is done sleeping due to time reversal.\n\n");
12600     }
12601     time_went_backwards = 0;
12602   }
12603 
12604 
12605   (void)sound_done();
12606 
12607   if(display_up)
12608   {
12609 
12610     if(display_up_first == 0)               // very first call, do initialization
12611     {
12612 
12613       display_up_first = 1;
12614       statusline(langcode("BBARSTA045"), 1); // Loading symbols...
12615       load_pixmap_symbol_file("symbols.dat", 0);
12616       statusline(langcode("BBARSTA047"), 1); // Initialize my station...
12617       my_station_add(my_callsign,my_group,my_symbol,my_long,my_lat,my_phg,my_comment,(char)position_amb_chars);
12618       da_resize(w, NULL,NULL);            // make sure the size is right after startup & create image
12619       set_last_position();                // init last map position
12620 
12621 #ifdef HAVE_DB
12622 //uncomment to enable hardcoded test of writing station to db
12623 //simpleDbTest();
12624 #endif /* HAVE_DB */
12625       // Restore weather alerts so that we have a clear
12626       // picture of the current state.  Do this before we
12627       // start the interfaces.
12628       load_wx_alerts_from_log();
12629 
12630       statusline(langcode("BBARSTA048"), 1); // Start interfaces...
12631       startup_all_or_defined_port(-1);    // start interfaces
12632     }
12633 
12634     else    // Not the first time UpdateTime was called.
12635     {
12636       // Perform the regular updates.
12637 
12638       if (first_time_run)
12639       {
12640         first_time_run = 0;
12641         Configure_station(NULL, NULL, NULL);
12642       }
12643 
12644       popup_time_out_check(current_time);         // clear popup windows after timeout
12645       check_statusline_timeout(current_time);     // clear statusline after timeout
12646       check_station_remove(current_time);         // remove old stations
12647       check_message_remove(current_time);         // remove old messages
12648 
12649 #ifdef HAVE_LIBSHP
12650       purge_shp_hash(current_time);               // purge stale rtrees
12651 #endif // HAVE_LIBSHP
12652 
12653 
12654       // We need to always calculate the Aloha circle so that
12655       // if it is turned on by the user it will be accurate.
12656       calc_aloha(current_time);
12657 
12658 
12659       //if ( (new_message_data > 0) && ( (delay_time % 2) == 0) )
12660       //update_messages(0);                 // Check Messages, no forced update
12661 
12662 
12663       // Check whether it's time to expire some weather
12664       // alerts.  This function will set redraw_on_new_data
12665       // and alert_redraw_on_update if any alerts are expired
12666       // from the list.
12667       (void)alert_expire(current_time);
12668 
12669 
12670 #ifdef HAVE_GPSMAN
12671       // Check whether we've just completed a GPS transfer and
12672       // have new maps to draw because of it.  This function
12673       // can cause a complete redraw of the maps.
12674       check_for_new_gps_map(current_time);
12675 
12676 
12677       // Check whether it is time to snag RINO waypoints
12678       // again, creating APRS Objects out of them.  "0" for
12679       // the download interval disables this function.
12680       if (RINO_download_interval > 0)
12681       {
12682         int rino_time = RINO_download_interval * 60;
12683 
12684         if (last_RINO_download + rino_time < current_time)
12685         {
12686           last_RINO_download = current_time;
12687           GPS_operations(NULL, "7", NULL);
12688         }
12689       }
12690 #endif  // HAVE_GPSMAN
12691 
12692 
12693       if (xfontsel_query)
12694       {
12695         Query_xfontsel_pipe();
12696       }
12697 
12698 
12699       // Check on resize requests
12700       if (request_resize)
12701       {
12702 //                if (last_input_event < current_time) {
12703         da_resize_execute(w);
12704 //                }
12705       }
12706 
12707 
12708       if (request_new_image)
12709       {
12710 //                if (last_input_event < current_time) {
12711         new_image(w);
12712 //                }
12713       }
12714 
12715 
12716       // check on Redraw requests
12717       if (         ( (redraw_on_new_data > 1)
12718                      || (redraw_on_new_data && (current_time > last_redraw + REDRAW_WAIT))
12719                      || (current_time > next_redraw)
12720                      || (pending_ID_message && (current_time > remove_ID_message_time)) )
12721                    && !wait_to_redraw)
12722       {
12723 
12724         int temp_alert_count;
12725 
12726 
12727         //fprintf(stderr,"Redraw on new data\n");
12728 
12729         // Cause refresh_image() to happen if no other
12730         // triggers occurred, but enough time has passed.
12731         if (current_time > next_redraw)
12732         {
12733           alert_redraw_on_update++;
12734         }
12735 
12736         // check if alert_redraw_on_update is set and it has been at least xx seconds since
12737         // last weather alert redraw.
12738         if ( (alert_redraw_on_update
12739               && !pending_ID_message
12740               && ( current_time > ( last_alert_redraw + WX_ALERTS_REFRESH_TIME ) ))
12741              || (pending_ID_message && (current_time > remove_ID_message_time)) )
12742         {
12743 
12744 
12745           // If we got here because of the ID_message
12746           // stuff, clear the variable.
12747           if (pending_ID_message && (current_time > remove_ID_message_time))
12748           {
12749             pending_ID_message = 0;
12750           }
12751 
12752           //if (alert_redraw_on_update) {
12753           //fprintf(stderr,"Alert redraw on update: %ld\t%ld\t%ld\n",
12754           //          current_time, last_alert_redraw, WX_ALERTS_REFRESH_TIME);
12755 
12756           if (!pending_ID_message)
12757           {
12758             refresh_image(da);  // Much faster than create_image.
12759             (void)XCopyArea(XtDisplay(da),
12760                             pixmap_final,
12761                             XtWindow(da),
12762                             gc,
12763                             0,
12764                             0,
12765                             (unsigned int)screen_width,
12766                             (unsigned int)screen_height,
12767                             0,
12768                             0);
12769 
12770             // We just refreshed the screen, so don't
12771             // try to erase any zoom-in boxes via XOR.
12772             zoom_box_x1 = -1;
12773           }
12774 
12775           // Here we use temp_alert_count as a temp holding place for the
12776           // count of active alerts. Sound alarm if new alerts are displayed.
12777           if ((temp_alert_count = alert_on_screen()) > last_alert_on_screen)
12778           {
12779             if (sound_play_wx_alert_message)
12780             {
12781               play_sound(sound_command, sound_wx_alert_message);
12782             }
12783 #ifdef HAVE_FESTIVAL
12784             if (festival_speak_new_weather_alert)
12785             {
12786               char station_id[50];
12787               xastir_snprintf(station_id,
12788                               sizeof(station_id), "%s, %d",
12789                               langcode("SPCHSTR009"),
12790                               temp_alert_count);
12791               SayText(station_id);
12792             }
12793 #endif // HAVE_FESTIVAL
12794           }
12795           last_alert_on_screen = temp_alert_count;
12796           alert_redraw_on_update = 0;
12797         }
12798         else
12799         {
12800           if (!pending_ID_message)
12801           {
12802             redraw_symbols(w);
12803           }
12804         }
12805 
12806         redraw_on_new_data = 0;
12807         //next_redraw = current_time+60; // redraw every minute
12808         next_redraw = current_time+1; // redraw every 1 second
12809         last_redraw = current_time;
12810 
12811         // This assures that we periodically check for expired alerts
12812         // and schedule a screen update if we find any.
12813         if (alert_display_request())                            // should nor be placed in redraw loop !!???
12814         {
12815           alert_redraw_on_update = redraw_on_new_data = 1;  // ????
12816         }
12817 
12818       }
12819 
12820 
12821       if (initial_load)
12822       {
12823 
12824         // Reload saved objects and items from previous runs.
12825         // This implements persistent objects.
12826         reload_object_item();
12827 
12828 #ifdef HAVE_DB
12829         // load data from SQL database connections
12830         // step through interface list
12831         for (i = 0; i < MAX_IFACE_DEVICES; i++)
12832         {
12833           // if interface is a database and is set to load on start then load
12834           if (connections_initialized==0)
12835           {
12836             fprintf(stderr,"main, initializing connections");
12837             connections_initialized = initConnections();
12838           }
12839           if (devices[i].device_type == DEVICE_SQL_DATABASE && devices[i].query_on_startup && port_data[i].status==DEVICE_UP)
12840           {
12841             // load data
12842             if (devices[i].connect_on_startup == 1)
12843             {
12844               // there should be an open connection already
12845               if (debug_level & 4096)
12846               {
12847                 fprintf(stderr,"Opening (in main) connection [%d] with existing connection [%p]",i,&connections[i]);
12848               }
12849               if (pingConnection(&connections[i])==True)
12850               {
12851                 got_conn = 1;
12852               }
12853               else
12854               {
12855                 // if (debug_level & 4096)
12856                 fprintf(stderr,"Ping failed opening new connection [%p]",&connections[i]);
12857                 got_conn = openConnection(&devices[i],&connections[i]);
12858               }
12859             }
12860             else
12861             {
12862               if (debug_level & 4096)
12863               {
12864                 fprintf(stderr,"Opening (in main) connection [%d] with new connection [%p]",i,&connections[i]);
12865               }
12866               got_conn = openConnection(&devices[i],&connections[i]);
12867             }
12868             if ((got_conn == 1) && (!(connections[i].type==0)))
12869             {
12870               getAllSimplePositions(&connections[i]);
12871               // if connection worked, it is a oneshot upload of data, so we don't
12872               // need to set port_data[].active and .status values here.
12873             }
12874             else
12875             {
12876               // report error on this port
12877               port_data[i].active = DEVICE_IN_USE;
12878               port_data[i].status = DEVICE_ERROR;
12879               update_interface_list();
12880             }
12881           }
12882         }
12883 #endif /* HAVE_DB */
12884 
12885         // Reload any CAD objects from file.  This implements
12886         // persistent objects.
12887         Restore_CAD_Objects_from_file();
12888 
12889         initial_load = 0;   // All done!
12890       }
12891 
12892 
12893       if (Display_.dr_data
12894           && ((current_time - sec_last_dr_update) > update_DR_rate) )
12895       {
12896 
12897 //WE7U:  Possible slow-down here w.r.t. dead-reckoning?  If
12898 //update_DR_rate is too quick, we end up looking through all of the
12899 //stations in station list much too often and using a lot of CPU.
12900 
12901         redraw_on_new_data = 1;
12902         sec_last_dr_update = current_time;
12903       }
12904 
12905 
12906       // Look for packet data and check port status
12907       display_packet_data();
12908       if (delay_time > 15)
12909       {
12910         interface_status(w);
12911         delay_time = 0;
12912         // check station lists
12913         update_station_scroll_list();   // maybe update lists
12914       }
12915       delay_time++;
12916 
12917 
12918       // If active HSP ports, check whether we've been sitting
12919       // for longer than XX seconds waiting for GPS data.  If
12920       // so, the GPS is powered-down, lost lock, or become
12921       // disconnected.  Go back to listening on the TNC port.
12922       //
12923       if (current_time > (sec_last_dtr + 2))     // 2-3 secs
12924       {
12925 
12926         if (!gps_stop_now)      // No GPS strings parsed
12927         {
12928 
12929           // GPS listen timeout!  Pop us out of GPS listen
12930           // mode on all HSP ports.  Listen to the TNC for
12931           // a while.
12932 //fprintf(stderr,"1:calling dtr_all_set(0)\n");
12933           dtr_all_set(0);
12934           sec_last_dtr = current_time;
12935         }
12936       }
12937 
12938 
12939       // If we parsed valid GPS data, bring all DTR lines back
12940       // to normal for all HSP interfaces (set to receive from
12941       // TNC now).
12942       if (gps_stop_now)
12943       {
12944 //fprintf(stderr,"2:calling dtr_all_set(0)\n");
12945         dtr_all_set(0); // Go back to TNC listen mode
12946         sec_last_dtr = current_time;
12947       }
12948 
12949 
12950       // Start the GPS listening process again
12951 
12952       // check gps start up, GPS on GPSPORT
12953       if(current_time > sec_next_gps)
12954       {
12955 
12956         // Reset the gps good-data flag
12957         if (gps_stop_now)
12958         {
12959           gps_stop_now = 0;
12960         }
12961 
12962         //fprintf(stderr,"Check GPS\n");
12963 
12964         // Set dtr lines down
12965         // works for SERIAL_GPS and SERIAL_TNC_HSP_GPS?
12966 
12967         // HSP interfaces:  Set DTR line for all.  DTR will
12968         // get reset for each line as valid GPS data gets
12969         // parsed on that interface.
12970 //fprintf(stderr,"3:calling dtr_all_set(1)\n");
12971         dtr_all_set(1);
12972         sec_last_dtr = current_time;   // GPS listen timeout
12973 
12974         for(i=0; i<MAX_IFACE_DEVICES; i++)
12975         {
12976           if (port_data[i].status)
12977           {
12978             char tmp[3];
12979             int ret1 = 0;
12980             int ret2 = 0;
12981 
12982             switch (port_data[i].device_type)
12983             {
12984               case DEVICE_SERIAL_TNC_AUX_GPS:
12985                 if (devices[i].gps_retrieve != 0)
12986                 {
12987                   // Tell TNC to send GPS data
12988 
12989                   // Device is correct type and is UP
12990                   // (or ERROR).  Send character to
12991                   // device (prefixed with CTRL-C so
12992                   // that we exit CONV if necessary).
12993                   //
12994                   if (debug_level & 128)
12995                   {
12996                     fprintf(stderr,"Retrieving GPS AUX port %d\n", i);
12997                   }
12998                   sprintf(tmp, "%c%c",
12999                           '\3',
13000                           devices[i].gps_retrieve);
13001 
13002                   if (debug_level & 1)
13003                   {
13004                     fprintf(stderr,"Using 0x%02x 0x%02x to retrieve GPS\n",
13005                             '\3',
13006                             devices[i].gps_retrieve);
13007                   }
13008                   port_write_string(i, tmp);
13009                 }
13010 
13011                 // GPS strings are processed in
13012                 // UpdateTime function via
13013                 // gps_data_find(), if the incoming
13014                 // data is GPS data instead of TNC
13015                 // data.  We need to do nothing
13016                 // further here.
13017 
13018                 break;
13019 
13020               case DEVICE_SERIAL_TNC_HSP_GPS:
13021                 // Check for GPS timing being too
13022                 // short for HSP interfaces.  If to
13023                 // short, we'll never receive any
13024                 // TNC data, just GPS data.
13025                 if (gps_time < 3)
13026                 {
13027                   gps_time = 3;
13028                   popup_message_always(langcode("POPEM00036"),
13029                                        langcode("POPEM00037"));
13030                 }
13031 
13032                 // GPS strings are processed in
13033                 // UpdateTime function via
13034                 // gps_data_find(), if the incoming
13035                 // data is GPS data instead of TNC
13036                 // data.  We need to do nothing
13037                 // further here.
13038 
13039                 break;
13040 
13041               case DEVICE_SERIAL_GPS:
13042               case DEVICE_NET_GPSD:
13043 
13044 // For each of these we wish to dump their queue to be processed at
13045 // the gps_time interval.  At other times they should be overwriting
13046 // old data with new and not processing the strings.
13047 
13048                 // Process the GPS strings saved by
13049                 // the channel_data() function.
13050                 if (gprmc_save_string[0] != '\0')
13051                   ret1 = gps_data_find(gprmc_save_string,
13052                                        gps_port_save);
13053                 if (gpgga_save_string[0] != '\0')
13054                   ret2 = gps_data_find(gpgga_save_string,
13055                                        gps_port_save);
13056 
13057                 // Blank out the global variables
13058                 // (we just processed them).
13059                 gprmc_save_string[0] = '\0';
13060                 gpgga_save_string[0] = '\0';
13061 
13062                 if (ret1 && ret2)
13063                 {
13064                   char temp[200];
13065 
13066                   xastir_snprintf(temp,
13067                                   sizeof(temp),
13068                                   "GPS:RMC,GGA ");
13069                   strncat(temp,
13070                           report_gps_status(),
13071                           sizeof(temp) - 1 - strlen(temp));
13072                   statusline(temp, 0);
13073                 }
13074                 else if (ret1)
13075                 {
13076                   char temp[200];
13077 
13078                   xastir_snprintf(temp,
13079                                   sizeof(temp),
13080                                   "GPS:RMC ");
13081                   strncat(temp,
13082                           report_gps_status(),
13083                           sizeof(temp) - 1 - strlen(temp));
13084                   statusline(temp, 0);
13085                 }
13086                 else if (ret2)
13087                 {
13088                   char temp[200];
13089 
13090                   xastir_snprintf(temp,
13091                                   sizeof(temp),
13092                                   "GPS:GGA ");
13093                   strncat(temp,
13094                           report_gps_status(),
13095                           sizeof(temp) - 1 - strlen(temp));
13096                   statusline(temp, 0);
13097                 }
13098                 else
13099                 {
13100                   char temp[200];
13101 
13102                   xastir_snprintf(temp,
13103                                   sizeof(temp),
13104                                   "GPS: ");
13105                   strncat(temp,
13106                           report_gps_status(),
13107                           sizeof(temp) - 1 - strlen(temp));
13108                   statusline(temp, 0);
13109                 }
13110 
13111                 break;
13112               default:
13113                 break;
13114             }
13115           }
13116         }
13117         sec_next_gps = current_time+gps_time;
13118       }
13119 
13120       // Check to reestablish a connection
13121       if(current_time > net_next_time)
13122       {
13123         net_last_time = current_time;
13124         net_next_time = net_last_time + 300;    // Check every five minutes
13125         //net_next_time = net_last_time + 30;   // This statement is for debug
13126 
13127         //fprintf(stderr,"Checking for reconnects\n");
13128         check_ports();
13129       }
13130 
13131 #ifdef USING_LIBGC
13132       // Check for leaks?
13133       if(current_time > gc_next_time)
13134       {
13135         gc_next_time = current_time + 60;  // Check every minute
13136 //fprintf(stderr,"Checking for leaks\n");
13137         CHECK_LEAKS();
13138       }
13139 #endif  // USING_LIBGC
13140 
13141       // Check to see if it is time to spit out data
13142       if(!wait_to_redraw)
13143       {
13144         if (last_time == 0)
13145         {
13146           // first update
13147           next_time = 120;
13148           last_time = current_time;
13149 //                  do_time = 1;
13150         }
13151         else
13152         {
13153           // check for update
13154           //fprintf(stderr,"Checking --- time %ld time to update %ld\n",current_time,last_time+next_time);
13155           if(current_time >= (last_time + next_time))
13156           {
13157             next_time += next_time;
13158             if (next_time > max_transmit_time)
13159             {
13160               next_time = max_transmit_time;
13161             }
13162 
13163             last_time = current_time;
13164 //                      do_time = 1;
13165           }
13166         }
13167       }
13168 
13169       // Time to spit out a posit?   If emergency_beacon is enabled
13170       // change to a relatively fast fixed beacon rate.  Should be
13171       // more than a 30-second interval though to avoid digipeater
13172       // dupe intervals of 30 seconds.
13173       //
13174       if ( my_position_valid
13175            && (   transmit_now
13176                   || (emergency_beacon && (current_time > (posit_last_time + 60) ) )
13177                   || (current_time > posit_next_time && POSIT_rate) ) )
13178       {
13179 
13180         //fprintf(stderr,"Transmitting posit\n");
13181 
13182         // Check for proper symbol in case we're a weather station
13183         (void)check_weather_symbol();
13184 
13185         posit_last_time = current_time;
13186 
13187         if (smart_beaconing)
13188         {
13189           // Schedule next computed posit time based on
13190           // speed/turns, etc.
13191           posit_next_time = posit_last_time + sb_POSIT_rate;
13192           sb_last_heading = sb_current_heading;
13193           //fprintf(stderr,"Sending Posit\n");
13194         }
13195         else
13196         {
13197           // Schedule next fixed posit time, set in
13198           // Configure->Defaults dialog
13199           posit_next_time = posit_last_time + POSIT_rate;
13200         }
13201 
13202         transmit_now = 0;
13203         // Output to ALL net/tnc ports that are enabled & have tx enabled
13204 //fprintf(stderr,"Sending posit\n");
13205         output_my_aprs_data();
13206 
13207         // Decrement the my_position_valid variable if we're
13208         // using GPS.  This will make sure that positions
13209         // are valid, as we'll only get four positions out
13210         // maximum per valid GPS position.  If the GPS
13211         // position goes stale, we'll stop sending posits.
13212         // We initialize it to one if we turn on a GPS
13213         // interface, so we'll get at the very most one
13214         // posit sent out with a stale position, each time
13215         // we open a GPS interface.
13216         if (using_gps_position && my_position_valid)
13217         {
13218           my_position_valid--;
13219 //fprintf(stderr,"my_position_valid:%d\n",my_position_valid);
13220 
13221           if (!my_position_valid)     // We just went to zero!
13222           {
13223             // Waiting for GPS data..
13224             statusline(langcode("BBARSTA041"),1);
13225 
13226             // If the user intends to send posits, GPS
13227             // interface is enabled, and we're not
13228             // getting GPS data, warn the user that
13229             // posits are disabled.
13230             if (!transmit_disable && !posit_tx_disable)
13231             {
13232               popup_message_always(langcode("POPEM00033"),
13233                                    langcode("POPEM00034"));
13234             }
13235 //fprintf(stderr,"my_position_valid just went to zero!\n");
13236           }
13237         }
13238       }
13239 //          if (do_time || transmit_now) {
13240 //              transmit_now = 0;
13241 //              // output to ALL net/tnc ports
13242 //              //fprintf(stderr,"Output data\n");
13243 //              output_my_aprs_data();
13244 //          }
13245 
13246       // Must compute rain on a periodic basis, as some
13247       // weather daemons don't put out data often enough
13248       // to rotate through our queues.
13249       // We also refresh the Station_info dialog here if
13250       // it is currently drawn.
13251       if (current_time >= (last_weather_cycle + 30))      // Every 30 seconds
13252       {
13253         // Note that we also write timestamps out to all of the log files
13254         // from this routine.  It works out well with the 30 second update
13255         // rate of cycle_weather().
13256         (void)cycle_weather();
13257         last_weather_cycle = current_time;
13258 
13259         if (station_data_auto_update)
13260         {
13261           update_station_info(w);  // Go refresh the Station Info display
13262         }
13263 
13264         // Time to put out raw WX data ?
13265         if (current_time > sec_next_raw_wx)
13266         {
13267           sec_next_raw_wx = current_time+600;
13268 
13269 #ifdef TRANSMIT_RAW_WX
13270           if (transmit_raw_wx)
13271           {
13272             tx_raw_wx_data();
13273           }
13274 #endif  // TRANSMIT_RAW_WX
13275 
13276           // check wx data last received
13277           wx_last_data_check();
13278         }
13279       }
13280 
13281       // is it time to spit out messages?
13282       check_and_transmit_messages(current_time);
13283 
13284       // Is it time to spit out any delayed ack's?
13285       check_delayed_transmit_queue(current_time);
13286 
13287       // Is it time to spit out objects/items?
13288       check_and_transmit_objects_items(current_time);
13289 
13290       // Do we have any new bulletins to display?
13291       check_for_new_bulletins(current_time);
13292 
13293       // Is it time to create a JPG snapshot?
13294       if (snapshots_enabled)
13295       {
13296         (void)Snapshot();
13297       }
13298 
13299       // Is it time to create a kml dump of all current stations
13300       if (kmlsnapshots_enabled)
13301       {
13302         if (sec_now() > (last_kmlsnapshot + (snapshot_interval * 60)) )
13303         {
13304           last_kmlsnapshot = sec_now(); // Set up timer for next time
13305           export_trail_as_kml(NULL);
13306         }
13307       }
13308 
13309       // Is it time to refresh maps?
13310       if ( map_refresh_interval && (current_time > map_refresh_time) )
13311       {
13312 
13313         // Reload maps
13314         // Set interrupt_drawing_now because conditions have
13315         // changed.
13316         interrupt_drawing_now++;
13317 
13318         // Request that a new image be created.  Calls
13319         // create_image, XCopyArea, and display_zoom_status.
13320         request_new_image++;
13321 
13322 //                if (create_image(da)) {
13323 //                    (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
13324 //                }
13325 
13326         map_refresh_time = current_time + map_refresh_interval;
13327       }
13328 
13329       // get data from interfaces
13330       max=0;
13331       // Allow multiple packets to be processed inside this
13332       // loop.  Well, it was a nice idea anyway.  See the
13333       // below note.
13334 
13335 // CAREFUL HERE:  If we try to send to the Spider pipes faster than
13336 // it's reading from the pipes we corrupt the data out our server
13337 // ports.  Having too high of a number here or putting too small of
13338 // a delay down lower causes our server port to server up junk!
13339 
13340       while (max < 1 && !XtAppPending(app_context))
13341       {
13342         struct timeval tmv;
13343 
13344 
13345 // Check the x_spider server for incoming data
13346         if (enable_server_port)
13347         {
13348           // Check whether the x_spider server pipes have
13349           // any data for us.  Process if found.
13350 
13351 
13352 // Check the TCP pipe
13353           line[0] = '\0'; // Start with line empty
13354           n = readline(pipe_tcp_server_to_xastir, line, MAX_LINE_SIZE);
13355           if (n == 0)
13356           {
13357             // Do nothing, empty packet
13358           }
13359           else if (n < 0)
13360           {
13361             //fprintf(stderr,"UpdateTime: Readline error: %d\n",errno);
13362             if (errno == EAGAIN || errno == EWOULDBLOCK)
13363             {
13364               // This is normal if we have no data to read
13365               //fprintf(stderr,"EAGAIN or EWOULDBLOCK\n");
13366             }
13367             else    // Non-normal error.  Report it.
13368             {
13369               fprintf(stderr,"UpdateTime: Readline error: %d\n",errno);
13370             }
13371           }
13372           else    // We have a good packet
13373           {
13374             // Knock off the linefeed at the end
13375             line[n-1] = '\0';
13376 
13377             if (log_net_data)
13378               log_data( get_user_base_dir(LOGFILE_NET,
13379                                           temp_file_name,
13380                                           sizeof(temp_file_name)),
13381                         (char *)line);
13382 
13383 //fprintf(stderr,"TCP server data:%d: %s\n", n, line);
13384 
13385             packet_data_add(langcode("WPUPDPD006"),
13386                             (char *)line,
13387                             -1);    // data_port -1 signifies x_spider
13388 
13389             // Set port to -2 here to designate that it
13390             // came from x_spider.  -1 = from a log
13391             // file, 0 - 14 = from normal interfaces.
13392             decode_ax25_line((char *)line,
13393                              'I',
13394                              -2, // Port -2 signifies x_spider data
13395                              1);
13396 
13397             max++;  // Count the number of packets processed
13398           }
13399 
13400 
13401 // Check the UDP pipe
13402           line[0] = '\0'; // Start with line empty
13403           n = readline(pipe_udp_server_to_xastir, line, MAX_LINE_SIZE);
13404           if (n == 0)
13405           {
13406             // Do nothing, empty packet
13407           }
13408           else if (n < 0)
13409           {
13410             //fprintf(stderr,"UpdateTime: Readline error: %d\n",errno);
13411             if (errno == EAGAIN || errno == EWOULDBLOCK)
13412             {
13413               // This is normal if we have no data to read
13414               //fprintf(stderr,"EAGAIN or EWOULDBLOCK\n");
13415             }
13416             else    // Non-normal error.  Report it.
13417             {
13418               fprintf(stderr,"UpdateTime: Readline error: %d\n",errno);
13419             }
13420           }
13421           else    // We have a good packet
13422           {
13423             char temp_call[10];
13424             int skip_decode = 0;
13425 
13426 
13427             // Knock off the linefeed at the end
13428             line[n-1] = '\0';
13429 
13430             // Check for "TO_INET," prefix, then check
13431             // for "TO_RF," prefix. Set appropriate
13432             // flags and remove the prefixes if found.
13433             // x_spider.c will always put them in that
13434             // order if both flags are present, so we
13435             // don't need to check for the reverse
13436             // order.
13437             // Note that this is NOT the "-to_inet" that xastir_udp_client
13438             // uses!!! See xspider.c for how that gets parsed/changed.
13439             // Set appropriate flags and remove the prefixes if found.
13440             if (strncmp(line, "TO_INET,", 8) == 0)
13441             {
13442               line_offset += 8;
13443 //
13444 // "TO_INET," found.
13445 // This packet should be gated to the internet if and only if
13446 // igating is enabled.  This may happen automatically as-is, due to
13447 // the decode_ax25_line() call below.  Check whether that's true.
13448 //
13449 // We can always add "NOGATE" or "RFONLY" to the path before we dump
13450 // it to decode_ax25_line() in order to stop this igating...
13451 //
13452             }
13453             else
13454             {
13455               // The packet did NOT have "TO_INET," in the string.
13456               // Change the packet to add "NOGATE", to the path to
13457               // assure it doesn't get igated.
13458               // Find the first ':' in the string. Copy the
13459               // first part of the string to a new string, add ",NOGATE"
13460               // to the path, copy the 2nd part of the string after it.
13461               char path[100+1];
13462               char info[100+1];
13463               char *path0 = NULL;
13464               char *info0 = NULL;
13465 
13466 
13467               path0 = strtok(line,":");   // Pointer to start of path
13468               info0 = strtok(NULL,"");    // Pointer to information field
13469 
13470               xastir_snprintf(path, sizeof(path), "%s", path0);
13471               xastir_snprintf(info, sizeof(info), "%s", info0);
13472               //fprintf(stderr, "path: %s\n", path);
13473               //fprintf(stderr, "info: %s\n", info);
13474               //fprintf(stderr, "line: %s\n", line);
13475               xastir_snprintf(line, sizeof(line), "%s%s%s", path, ",NOGATE:", info);
13476               //fprintf(stderr, "line: %s\n", line);
13477             }
13478 
13479             // Check for "TO_RF," string
13480             // Note that this is NOT the "-to_rf" that xastir_udp_client
13481             // uses!!! See xspider.c for how that gets parsed/changed.
13482 
13483             if (strncmp((char *)(line+line_offset), "TO_RF,", 6) == 0)
13484             {
13485               fprintf(stderr,"Xastir received UDP packet with \"TO_RF,\" prefix\n");
13486               line_offset += 6;
13487 //
13488 // "TO_RF," found.
13489 // This packet should be sent out the local RF ports.  If the
13490 // callsign matches Xastir's (without the SSID), then send it out
13491 // first-person format.  If it doesn't, send it out third-party
13492 // format?
13493 //
13494               // Snag FROM callsign and do a non-exact
13495               // match on it against "my_callsign"
13496               xastir_snprintf(temp_call,
13497                               sizeof(temp_call),
13498                               "%s",
13499                               (char *)(line+line_offset));
13500               if (strchr(temp_call,'>'))
13501               {
13502                 *strchr(temp_call,'>') = '\0';
13503               }
13504 
13505 //                            if (is_my_call(temp_call, 0)) { // Match ignoring SSID
13506 //                            exact match
13507               // Send to RF as direct packet
13508 //fprintf(stderr,"\tBase callsigns Match!  Send to RF as direct packet\n");
13509 //fprintf(stderr,"\t%s\n", line);
13510 
13511 // Change this to go out only RF interfaces so we don't double-up on
13512 // the INET interfaces?  This would require looping on the
13513 // interfaces and checking type and transmit_enable for each, as is
13514 // done in output_igate_rf().  If we change to that method,
13515 // re-enable the decode_ax25_line() call below.
13516 //
13517 
13518 // Change to a third-party packet.  In this case we know we have a
13519 // line_offset, so backing up one to insert a char is ok.
13520               *(line + line_offset - 1) = '}';
13521 
13522               output_my_data(
13523                 (char *)(line + line_offset - 1),  // Raw data line
13524                 -1,    // ports, -1=send out all interfaces
13525                 0,     // type: 0=cooked, 1=raw
13526                 0,     // loopback_only
13527                 0,     // use_igate_path
13528                 NULL); // path
13529 
13530 //skip_decode++;
13531 
13532               igate_msgs_tx++;
13533 //                            }
13534 //                            else {  // Send to RF as 3rd party packet
13535 //fprintf(stderr,
13536 //    "\tBase callsigns don't match. Could send to RF as 3rd party packet, but dropping packet for now...\n");
13537 //fprintf(stderr,"\t%s\n", line);
13538 
13539 // Drop the packet for now, until we get more code added to turn it
13540 // into a 3rd party packet
13541 
13542               /*
13543                                               output_igate_rf(temp_call,
13544                                                   addr,
13545                                                   path,
13546                                                   (char *)(line + line_offset),
13547                                                   port,
13548                                                   1,
13549                                                   NULL);
13550 
13551                                           igate_msgs_tx++;
13552               */
13553 //continue;
13554 //                            }
13555             }
13556 
13557             if (log_net_data)
13558               log_data( get_user_base_dir(LOGFILE_NET,
13559                                           temp_file_name,
13560                                           sizeof(temp_file_name)),
13561                         (char *)(line + line_offset));
13562 
13563 //fprintf(stderr,"UDP server data:  %s\n", line);
13564 //fprintf(stderr,"\tUDP server data2: %s\n\n", (char *)(line + line_offset));
13565 
13566             packet_data_add(langcode("WPUPDPD006"),
13567                             (char *)(line + line_offset),
13568                             -1);    // data_port -1 signifies x_spider
13569 
13570 // We don't need the below if we call output_my_data with -1 for the
13571 // port, as in that case it calls decode_ax25_line directly.
13572 
13573             if (!skip_decode)
13574             {
13575 
13576               // Set port to -2 here to designate that it
13577               // came from x_spider.  -1 = from a log
13578               // file, 0 - 14 = from normal interfaces.
13579               decode_ax25_line((char *)(line + line_offset),
13580                                'I',
13581                                -2, // Port -2 signifies x_spider data
13582                                1);
13583 
13584               max++;  // Count the number of packets processed
13585             }
13586 
13587           }
13588 
13589 
13590         }
13591 // End of x_spider server check code
13592 
13593 
13594 //if (begin_critical_section(&data_lock, "main.c:UpdateTime(1)" ) > 0)
13595 //    fprintf(stderr,"data_lock\n");
13596 
13597 
13598 // Check the rest of the ports for incoming data.  Process up to
13599 // 1000 packets here in a loop.
13600 
13601         data_length = pop_incoming_data(data_string, &data_port);
13602 
13603         if (data_length != 0)
13604         {
13605           int data_type;              // 0=AX25, 1=GPS
13606 
13607           // Terminate the string
13608           data_string[data_length] = '\0';
13609 
13610           //fprintf(stderr,"device_type: %d\n",port_data[data_port].device_type);
13611 
13612           switch (port_data[data_port].device_type)
13613           {
13614             // NET Data stream
13615             case DEVICE_NET_STREAM:
13616 
13617               if (log_net_data)
13618                 log_data(get_user_base_dir(LOGFILE_NET,
13619                                            temp_file_name,
13620                                            sizeof(temp_file_name)),
13621                          (char *)data_string);
13622 
13623               packet_data_add(langcode("WPUPDPD006"),
13624                               (char *)data_string,
13625                               data_port);
13626 
13627 //fprintf(stderr,"\n-1 %s", data_string);
13628 
13629               if (enable_server_port)
13630               {
13631                 char new_string[MAX_LINE_SIZE+1];
13632 
13633                 // Terminate it with a linefeed
13634                 xastir_snprintf(new_string,
13635                                 data_length+1,
13636                                 "%s\n",
13637                                 data_string);
13638 
13639 //fprintf(stderr,"\n-2 %s", new_string);
13640 
13641                 // Send data to the x_spider server
13642                 if (writen(pipe_xastir_to_tcp_server,
13643                            new_string,
13644                            data_length+1) != data_length+1)
13645                 {
13646                   if (errno != EPIPE)
13647                   {
13648                     fprintf(stderr,
13649                             "UpdateTime: Writen error (Net send x_spider): %d\n",
13650                             errno);
13651                   }
13652                 }
13653 //fprintf(stderr,"\n-3 %s", new_string);
13654 
13655               }
13656               // End of x_spider server send code
13657 
13658               decode_ax25_line((char *)data_string,
13659                                'I',
13660                                data_port,
13661                                1);
13662               break;
13663 
13664             // TNC Devices
13665             case DEVICE_SERIAL_KISS_TNC:
13666             case DEVICE_SERIAL_MKISS_TNC:
13667 
13668               // Try to decode header and checksum.  If
13669               // bad, break, else continue through to
13670               // ASCII logging & decode routines.
13671               // Note that the length of data_string
13672               // can increase within decode_ax25_header().
13673               if ( !decode_ax25_header( (unsigned char *)data_string,
13674                                         &data_length ) )
13675               {
13676                 // Had a problem decoding it.  Drop
13677                 // it on the floor.
13678                 break;
13679               }
13680               else
13681               {
13682                 // Good decode.  Drop through to the
13683                 // next block to log and decode the
13684                 // packet.
13685               }
13686             /* Falls through. */
13687 
13688             case DEVICE_SERIAL_TNC:
13689               tnc_data_clean((char *)data_string);
13690             /* Falls through. */
13691 
13692             case DEVICE_AX25_TNC:
13693             case DEVICE_NET_AGWPE:
13694               if (log_tnc_data)
13695                 log_data( get_user_base_dir(LOGFILE_TNC,
13696                                             temp_file_name,
13697                                             sizeof(temp_file_name)),
13698                           (char *)data_string);
13699 
13700               packet_data_add(langcode("WPUPDPD005"),
13701                               (char *)data_string,
13702                               data_port);
13703 
13704               if (enable_server_port)
13705               {
13706                 char new_string[MAX_LINE_SIZE+1];
13707 
13708                 // Terminate it with a linefeed
13709                 xastir_snprintf(new_string,
13710                                 MAX_LINE_SIZE+1,
13711                                 "%s\n",
13712                                 data_string);
13713 
13714                 // Send data to the x_spider server
13715                 if (writen(pipe_xastir_to_tcp_server,
13716                            new_string,
13717                            data_length+1) != data_length+1)
13718                 {
13719                   fprintf(stderr,
13720                           "UpdateTime: Writen error (TNC Send x_spider): %d\n",
13721                           errno);
13722                 }
13723               }
13724               // End of x_spider server send code
13725 
13726               decode_ax25_line((char *)data_string,
13727                                'T',
13728                                data_port,
13729                                1);
13730               break;
13731 
13732             case DEVICE_SERIAL_TNC_HSP_GPS:
13733               if (port_data[data_port].dtr==1)   // get GPS data
13734               {
13735                 char temp[200];
13736 
13737                 (void)gps_data_find((char *)data_string,
13738                                     data_port);
13739 
13740                 xastir_snprintf(temp,
13741                                 sizeof(temp),
13742                                 "GPS: ");
13743                 strncat(temp,
13744                         report_gps_status(),
13745                         sizeof(temp) - 1 - strlen(temp));
13746                 statusline(temp, 0);
13747               }
13748               else
13749               {
13750                 // get TNC data
13751                 if (log_tnc_data)
13752                   log_data( get_user_base_dir(LOGFILE_TNC,
13753                                               temp_file_name,
13754                                               sizeof(temp_file_name)),
13755                             (char *)data_string);
13756 
13757                 packet_data_add(langcode("WPUPDPD005"),
13758                                 (char *)data_string,
13759                                 data_port);
13760 
13761                 if (enable_server_port)
13762                 {
13763                   char new_string[MAX_LINE_SIZE+1];
13764 
13765                   // Terminate it with a linefeed
13766                   xastir_snprintf(new_string,
13767                                   MAX_LINE_SIZE+1,
13768                                   "%s\n",
13769                                   data_string);
13770 
13771                   // Send data to the x_spider server
13772                   if (writen(pipe_xastir_to_tcp_server,
13773                              new_string,
13774                              data_length+1) != data_length+1)
13775                   {
13776                     fprintf(stderr,
13777                             "UpdateTime: Writen error(HSP data): %d\n",
13778                             errno);
13779                   }
13780                 }
13781                 // End of x_spider server send code
13782 
13783                 decode_ax25_line((char *)data_string,
13784                                  'T',
13785                                  data_port,
13786                                  1);
13787               }
13788               break;
13789 
13790             case DEVICE_SERIAL_TNC_AUX_GPS:
13791               tnc_data_clean((char *)data_string);
13792               data_type=tnc_get_data_type((char *)data_string,
13793                                           data_port);
13794               if (data_type)    // GPS Data
13795               {
13796                 char temp[200];
13797 
13798                 (void)gps_data_find((char *)data_string,
13799                                     data_port);
13800 
13801                 xastir_snprintf(temp,
13802                                 sizeof(temp),
13803                                 "GPS: ");
13804                 strncat(temp,
13805                         report_gps_status(),
13806                         sizeof(temp) - 1 - strlen(temp));
13807                 statusline(temp, 0);
13808               }
13809               else            // APRS Data
13810               {
13811                 if (log_tnc_data)
13812                   log_data( get_user_base_dir(LOGFILE_TNC,
13813                                               temp_file_name,
13814                                               sizeof(temp_file_name)),
13815                             (char *)data_string);
13816 
13817                 packet_data_add(langcode("WPUPDPD005"),
13818                                 (char *)data_string,
13819                                 data_port);
13820 
13821                 if (enable_server_port)
13822                 {
13823                   char new_string[MAX_LINE_SIZE+1];
13824 
13825                   // Terminate it with a linefeed
13826                   xastir_snprintf(new_string,
13827                                   MAX_LINE_SIZE+1,
13828                                   "%s\n",
13829                                   data_string);
13830 
13831                   // Send data to the x_spider server
13832                   if (writen(pipe_xastir_to_tcp_server,
13833                              new_string,
13834                              data_length+1) != data_length+1)
13835                   {
13836                     fprintf(stderr,
13837                             "UpdateTime: Writen error(TNC/GPS data): %d\n",
13838                             errno);
13839                   }
13840                 }
13841                 // End of x_spider server send code
13842 
13843                 decode_ax25_line((char *)data_string,
13844                                  'T',
13845                                  data_port,
13846                                  1);
13847               }
13848               break;
13849 
13850             // GPS Devices
13851             case DEVICE_SERIAL_GPS:
13852 
13853             case DEVICE_NET_GPSD:
13854               //fprintf(stderr,"GPS Data <%s>\n",data_string);
13855               (void)gps_data_find((char *)data_string,
13856                                   data_port);
13857               {
13858                 char temp[200];
13859 
13860                 xastir_snprintf(temp,
13861                                 sizeof(temp),
13862                                 "GPS: ");
13863                 strncat(temp,
13864                         report_gps_status(),
13865                         sizeof(temp) - 1 - strlen(temp));
13866                 statusline(temp, 0);
13867               }
13868               break;
13869 
13870             // WX Devices
13871             case DEVICE_SERIAL_WX:
13872 
13873             case DEVICE_NET_WX:
13874               if (log_wx)
13875 // TODO:  Probably only logs to the first 0x00 byte...  Need another
13876 // logging function that accepts a size, perhaps converting it to
13877 // 0x00 or similar as it writes to file.
13878                 log_data( get_user_base_dir(LOGFILE_WX,
13879                                             temp_file_name,
13880                                             sizeof(temp_file_name)),
13881                           (char *)data_string);
13882 
13883               wx_decode(data_string, data_length, data_port);
13884               break;
13885 
13886             default:
13887               fprintf(stderr,"Data from unknown source\n");
13888               break;
13889           }
13890           max++;  // Count the number of packets processed
13891         }
13892         else
13893         {
13894           max=1000;   // Go straight to "max": Exit loop
13895         }
13896 
13897 //if (end_critical_section(&data_lock, "main.c:UpdateTime(2)" ) > 0)
13898 //    fprintf(stderr,"data_lock\n");
13899 
13900         // Do a usleep() here to give the interface threads
13901         // time to put something in the queue if they still
13902         // have data to process.  We also need a delay here
13903         // to allow the x_spider code to process packets
13904         // we've sent to it.
13905 
13906 // NOTE:  There's a very delicate balance here between x_spider
13907 // server, sched_yield(), the delay below, and nexttime.  If we feed
13908 // packets to the x_spider server faster than it gets to process
13909 // them, we end up with blank lines and corrupted lines going to the
13910 // connected clients.
13911 
13912         sched_yield();  // Yield to the other threads
13913 
13914         if (enable_server_port)
13915         {
13916           tmv.tv_sec = 0;
13917           tmv.tv_usec = 2000; // Delay 2ms
13918           (void)select(0,NULL,NULL,NULL,&tmv);
13919         }
13920 
13921       }   // End of packet processing loop
13922 
13923       // END- get data from interface
13924       // READ FILE IF OPENED
13925       if (read_file)
13926       {
13927         if (current_time >= next_file_read)
13928         {
13929           read_file_line(read_file_ptr);
13930           next_file_read = current_time + REPLAY_DELAY;
13931         }
13932       }
13933       // END- READ FILE IF OPENED
13934     }
13935 
13936     // If number of stations has changed, update the status
13937     // line, but only once per second max.
13938     if (station_count != station_count_save
13939         && stations_status_time != current_time)
13940     {
13941       // show number of stations in status line
13942       xastir_snprintf(station_num,
13943                       sizeof(station_num),
13944                       langcode("BBARSTH001"),
13945                       currently_selected_stations,
13946                       station_count);
13947       XmTextFieldSetString(text3, station_num);
13948 
13949       // Set up for next time
13950       station_count_save = station_count;
13951       stations_status_time = current_time;
13952     }
13953 
13954     check_pointer_position();
13955   }
13956 
13957   sched_yield();  // Yield the processor to another thread
13958 
13959   (void)XtAppAddTimeOut(XtWidgetToApplicationContext(w),
13960                         nexttime,
13961                         (XtPointer)UpdateTime,
13962                         (XtPointer)w);
13963 }
13964 
13965 
13966 
13967 
13968 
13969 void shut_down_server(void)
13970 {
13971 
13972   // Shut down the server if it was enabled
13973   if (tcp_server_pid || udp_server_pid)
13974   {
13975 
13976     // Send a kill to the main server process
13977     if (tcp_server_pid)
13978     {
13979       kill(tcp_server_pid, SIGHUP);
13980     }
13981 
13982     if (udp_server_pid)
13983     {
13984       kill(udp_server_pid, SIGHUP);
13985     }
13986 
13987     wait(NULL); // Reap the status of the process
13988 
13989     // Send to all processes in our process group.  This will
13990     // cause the server and all of its children to die.  Also
13991     // causes Xastir to die!  Don't do it!
13992     //kill(0, 1);
13993 
13994     sleep(1);
13995 
13996     // Send a more forceful kill signal in case the "nice" kill
13997     // signal didn't work.
13998     if (tcp_server_pid)
13999     {
14000       kill(tcp_server_pid, SIGKILL);
14001     }
14002 
14003     if (udp_server_pid)
14004     {
14005       kill(udp_server_pid, SIGKILL);
14006     }
14007   }
14008 }
14009 
14010 
14011 
14012 
14013 
14014 // This is the SIGHUP handler.  We restart Xastir if we receive a
14015 // SIGHUP, hopefully with the same environment that the original
14016 // Xastir had.  We set a global variable, then UpdateTime() is the
14017 // process that actually calls execve() in order to replace our
14018 // current process with the new one.  This assures that the signal
14019 // handler gets reset.  We can't call execve() from inside the
14020 // signal handler and have the restart work more than once.
14021 //
14022 // This function should be nearly identical to the quit() function
14023 // below.
14024 //
14025 // One strangeness is that this routine gets called when any of the
14026 // spawned processes get a SIGHUP also, which means when we shut
14027 // down the TCP/UDP servers or similar.  For some reason it still
14028 // appears to work, even though restart() gets called multiple
14029 // times when we shut down Xastir or the servers.  We probably need
14030 // to call signal() from outside any signal handlers to tell it to
14031 // ignore further SIGHUP's.
14032 //
14033 static void restart(int UNUSED(sig) )
14034 {
14035 
14036   char temp_file_name[MAX_VALUE];
14037 
14038 //    if (debug_level & 1)
14039   fprintf(stderr,"Shutting down Xastir...\n");
14040 
14041   save_data();
14042 
14043   // shutdown all interfaces
14044   shutdown_all_active_or_defined_port(-1);
14045 
14046   shut_down_server();
14047 
14048 #ifdef USE_PID_FILE_CHECK
14049   // remove the PID file
14050   unlink(get_user_base_dir("xastir.pid", temp_file_name,
14051                            sizeof(temp_file_name)));
14052 #endif
14053 
14054 #ifdef HAVE_LIBCURL
14055   curl_global_cleanup();
14056 #endif
14057 
14058 #ifdef USING_LIBGC
14059   CHECK_LEAKS();
14060 #endif  // USING LIBGC
14061 
14062 //    if (debug_level & 1)
14063   fprintf(stderr,"Attempting to restart Xastir...\n");
14064 
14065   // Set the global variable which tells UpdateTime() to do a
14066   // restart.
14067   //
14068   restart_xastir_now++;
14069 }
14070 
14071 
14072 
14073 
14074 
14075 static void quit(int sig)
14076 {
14077 
14078   char temp_file_name[MAX_VALUE];
14079 
14080   if(debug_level & 15)
14081   {
14082     fprintf(stderr,"Caught %d\n",sig);
14083   }
14084 
14085   save_data();
14086 
14087   // shutdown all interfaces
14088   shutdown_all_active_or_defined_port(-1);
14089 
14090   shut_down_server();
14091 
14092 
14093 #ifdef USE_PID_FILE_CHECK
14094   // remove the PID file
14095   unlink(get_user_base_dir("xastir.pid",temp_file_name,
14096                            sizeof(temp_file_name)));
14097 #endif
14098 
14099   if (debug_level & 1)
14100   {
14101     fprintf(stderr,"Exiting Xastir...\n");
14102   }
14103 
14104 #ifdef HAVE_LIBCURL
14105   curl_global_cleanup();
14106 #endif
14107 
14108   clear_application_context();
14109 #ifdef USING_LIBGC
14110   CHECK_LEAKS();
14111 #endif  // USING LIBGC
14112 
14113   exit(sig);  // Main exit from the program
14114 }
14115 
14116 
14117 
14118 
14119 
14120 #ifdef USE_PID_FILE_CHECK
14121 
14122 static int pid_file_check(int hold)
14123 {
14124 
14125   int killret=0;
14126   int other_pid=0;
14127   char temp[32] ;
14128   FILE * PIDFILE ;
14129   char temp_file_name[MAX_VALUE];
14130 
14131   /* Save our PID */
14132 
14133   char pidfile_name[MAX_FILENAME];
14134 
14135   xastir_snprintf(pidfile_name, sizeof(pidfile_name),
14136                   "%s",
14137                   get_user_base_dir("xastir.pid", temp_file_name,
14138                                     sizeof(temp_file_name)));
14139 
14140   if (filethere(pidfile_name))
14141   {
14142     fprintf(stderr,"Found pid file: %s\n",pidfile_name);
14143     PIDFILE=fopen(pidfile_name,"r");
14144     if (PIDFILE!=NULL)
14145     {
14146       if(!feof(PIDFILE))
14147       {
14148         (void)get_line(PIDFILE,temp,32);
14149       }
14150       (void)fclose(PIDFILE);
14151       other_pid=atoi(temp);
14152     }
14153     else
14154     {
14155       fprintf(stderr,"Couldn't open file: %s\n", pidfile_name);
14156     }
14157 
14158     // send a ping
14159     killret = kill(other_pid,0);
14160 
14161 #ifdef N8YSZ
14162     fprintf(stderr, "other_pid = <%d> killret == <%d> errno == <%d>\n",
14163             other_pid,killret,errno);
14164 #endif
14165     if ((killret == -1) && (errno == ESRCH ) && !hold)
14166     {
14167       fprintf(stderr,
14168               "Other Xastir process, pid: %d does not appear be running. \n",
14169               other_pid);
14170       // nuke from orbit
14171       if (unlink(pidfile_name))
14172       {
14173         fprintf(stderr,"Error unlinking pid file: %s, %d\n",
14174                 pidfile_name,errno);
14175       }
14176     }
14177     else
14178     {
14179       fprintf(stderr,
14180               "Other Xastir process, pid: %d may be running. Exiting..\n",
14181               other_pid);
14182 
14183 #ifdef USING_LIBGC
14184       CHECK_LEAKS();
14185 #endif  // USING LIBGC
14186       exit(-1);  // Quick exit from the program
14187     }
14188 
14189   }
14190   else
14191   {
14192 
14193     // if we're here - ok to truncate & open pidfile.
14194 
14195 #ifdef N8YSZ
14196     fprintf(stderr, "other_pid = <%d> killret == <%d> errno == <%d>\n",
14197             other_pid,killret,errno);
14198 #endif
14199 
14200     PIDFILE = fopen(pidfile_name,"w");
14201     if(PIDFILE != NULL)
14202     {
14203       fprintf(PIDFILE, "%d",getpid());
14204       (void) fclose (PIDFILE);
14205       return(0);
14206     }
14207     else
14208     {
14209       fprintf(stderr, "Error opening pidfile: %s\n", strerror(errno) );
14210       return(errno);
14211     }
14212     return(0);
14213   }
14214   return(0);
14215 } // end pid_file_check
14216 
14217 #endif
14218 
14219 
14220 /* handle segfault signal */
14221 void segfault(int UNUSED(sig) )
14222 {
14223   fprintf(stderr, "Caught Segfault! Xastir will terminate\n");
14224   fprintf(stderr, "Previous incoming line was: %s\n", incoming_data_copy_previous);
14225   fprintf(stderr, "    Last incoming line was: %s\n", incoming_data_copy);
14226   if (dangerous_operation[0] != '\0')
14227   {
14228     fprintf(stderr, "Possibly died at: %s\n", dangerous_operation);
14229   }
14230   fprintf(stderr, "%02d:%02d:%02d\n", get_hours(), get_minutes(), get_seconds() );
14231 
14232   shut_down_server();
14233 
14234   quit(-1);
14235 }
14236 
14237 
14238 
14239 
14240 
14241 /*
14242    Added by KB4AMA
14243    Handle USR1 signal.  This will cause
14244    a snapshot to be generated.
14245 */
14246 #ifndef OLD_PTHREADS
14247 void usr1sig(int sig)
14248 {
14249   if (debug_level & 512)
14250   {
14251     fprintf(stderr, "Caught Signal USR1, Doing a snapshot! Signal No %d\n", sig);
14252   }
14253 
14254   last_snapshot = 0;
14255   (void)Snapshot();
14256 }
14257 void usr2sig(int sig)
14258 {
14259   if (debug_level & 512)
14260   {
14261     fprintf(stderr, "Caught Signal USR2, Transmitting now! Signal No %d\n", sig);
14262   }
14263 
14264   transmit_now = 1;
14265 }
14266 #endif  // OLD_PTHREADS
14267 
14268 
14269 
14270 
14271 
14272 /*********************  dialog position *************************/
14273 
14274 void pos_dialog(Widget w)
14275 {
14276   static Position x,y;
14277   Dimension wd, ht;
14278   int max_x, max_y;
14279 
14280   XtVaGetValues(appshell, XmNx, &x, XmNy, &y, NULL);
14281   XtVaGetValues(appshell, XmNwidth, &wd, XmNheight, &ht, NULL);
14282 
14283   if (x > 1280)   // We sometimes get strange values for X/Y
14284   {
14285     x = 300;
14286   }
14287 
14288   if (y > 1024)   // We sometimes get strange values for X/Y
14289   {
14290     y = 200;
14291   }
14292 
14293   if (wd > 1280)  // And for width and height
14294   {
14295     wd = 640;
14296   }
14297 
14298   if (ht > 1024)  // And for width and height
14299   {
14300     ht = 480;
14301   }
14302 
14303   max_x = x + wd - (wd / 5);
14304 //    max_y = y + ht - (ht / 5);
14305   max_y = y + ht/3;
14306 
14307   // Check for proper values for last stored position
14308   if (   (last_popup_x < x)
14309          || (last_popup_y < y)
14310          || (last_popup_x > max_x)
14311          || (last_popup_y > max_y) )
14312   {
14313     last_popup_x = x + 20;  // Go to initial position again
14314     last_popup_y = y + 30;  // Go to initial position again
14315   }
14316   else
14317   {
14318     last_popup_x += 10;     // Increment slightly for next dialog
14319     last_popup_y += 20;     // Increment slightly for next dialog
14320   }
14321 
14322   if ((last_popup_y+50) > max_y)
14323   {
14324     last_popup_x = x + 20;  // Go to initial position again
14325     last_popup_y = y + 30;  // Go to initial position again
14326   }
14327 
14328   if ((last_popup_x+50) > max_x)
14329   {
14330     last_popup_x = x + 20;  // Go to initial position again
14331     last_popup_y = y + 30;  // Go to initial position again
14332   }
14333 
14334 #ifdef FIXED_DIALOG_STARTUP
14335   XtVaSetValues(w,XmNx,x,XmNy,y,NULL);
14336 #else
14337   XtVaSetValues(w,XmNx,last_popup_x,XmNy,last_popup_y,NULL);
14338 #endif // FIXED_DIALOG_STARTUP
14339 
14340   //fprintf(stderr,"max_x:%d max_y:%d x:%d y:%d wd:%d ht:%d last_x:%d last_y:%d\n",
14341   //max_x,max_y,x,y,wd,ht,last_popup_x,last_popup_y);
14342 }
14343 
14344 
14345 
14346 
14347 
14348 /*********************  resize_dialog *************************/
14349 //
14350 // Resize dialog to fit screen size or form, whichever is smaller.
14351 // If screen size is smaller, also position dialog at 0,0.
14352 //
14353 // Don't forget window decorations! Setting a dialog to 320x240 ends
14354 // up with a total dialog of 326x267 on one Linux w/xfwm4 window
14355 // manager and certain selected fonts. This is 6 more in the X and 27
14356 // more in the Y direction. We need to either add in the size of the
14357 // window decorations or activate the full-screen button on the
14358 // dialog.
14359 //
14360 // Found this which talks about getting sizes from parent and
14361 // grandparent of window to compute decoration sizes:
14362 //   https://ubuntuforums.org/showthread.php?t=2048596
14363 // Tried the above, plus several other methods: Couldn't come up with
14364 // a general method for calculating the size of the title bar portion
14365 // of the decorations. In particular the parent numbers return full
14366 // screen size and can't get the grandparent window.
14367 //
14368 // NOTE: 6, 27, and 10 numbers below were determined experimentally
14369 // on one system. Your mileage may vary based on window manager and
14370 // fonts selected.
14371 //
14372 void resize_dialog( Widget form, Widget dialog)
14373 {
14374   Dimension form_width, form_height;
14375   Dimension final_width, final_height;
14376   Dimension screen_width, screen_height;
14377   int set_to_origin = 0;
14378 
14379   // Fetch form size. Note that this will NOT include
14380   // the sizes of window decorations and title bar.
14381   XtVaGetValues(form,
14382                 XmNwidth, &form_width,
14383                 XmNheight, &form_height,
14384                 NULL);
14385 
14386   // Fetch screen size
14387   screen_height = DisplayHeight(XtDisplay(appshell), DefaultScreen(display));
14388   screen_width = DisplayWidth(XtDisplay(appshell), DefaultScreen(display));
14389 
14390   // Simulate a small screen for testing:
14391   //screen_width  = 320;
14392   //screen_height = 240;
14393 
14394   // NOTE: 27 and 6 numbers below were discovered by capturing a
14395   // known window size with XV, then examining the image with (any
14396   // of) "xv" / "gimp" / "identify" to determine final size with
14397   // decorations. On one system it was 3 pixels each side plus 21
14398   // more for the titlebar, adding up to +6 left/right and +27
14399   // top/bottom. This will vary per window manager, WM settings,
14400   // and fonts selected.
14401 
14402   // Find smaller of the two heights:
14403   // If dialog height is larger than screen, make smaller which
14404   // also activates the scrollbars.
14405   if ( (form_height+27) > screen_height) {
14406     // Set form height to screen height minus decorations and move
14407     // to origin
14408     final_height = screen_height-27;
14409     set_to_origin++;
14410   }
14411   else {  // Dialog fits within the screen.
14412     final_height = form_height+10;
14413   }
14414 
14415   // Find smaller of the two widths:
14416   // If dialog width is larger than screen, make smaller which
14417   // also activates the scrollbars.
14418   if ( (form_width+6) > screen_width) {
14419     // Set form width to screen width minus decorations
14420     // and move to origin
14421     final_width = screen_width-6;
14422     set_to_origin++;
14423   }
14424   else {  // Dialog fits within the screen.
14425     final_width = form_width+10;
14426   }
14427 
14428   if (set_to_origin) {
14429     // Set dialog's origin to 0,0.
14430     // Set width/height to the smaller of the two sizes.
14431     // Set max width/height to size of original form.
14432     // 10 was determined experimentally.
14433     XtVaSetValues(dialog,
14434                   XmNx, 0,
14435                   XmNy, 0,
14436                   XmNwidth, final_width,
14437                   XmNheight, final_height,
14438                   XmNmaxWidth,form_width+10,
14439                   XmNmaxHeight,form_height+10,
14440                   NULL);
14441   }
14442   else {
14443     // Set width/height to the smaller of the two sizes.
14444     // Set max width/height to size of original form.
14445     // 10 was determined experimentally.
14446     XtVaSetValues(dialog,
14447                   XmNwidth, final_width,
14448                   XmNheight, final_height,
14449                   XmNmaxWidth,form_width+10,
14450                   XmNmaxHeight,form_height+10,
14451                   NULL);
14452   }
14453 
14454   if (debug_level & 1)
14455   {
14456     fprintf(stderr,"Form size: X:%d\tY:%d\n", form_width, form_height);
14457     fprintf(stderr,"Screen size: X:%i, Y:%i\n", screen_width, screen_height);
14458     fprintf(stderr,"Setting dialog to width:%i, height:%i\n", final_width, final_height);
14459 
14460     if (set_to_origin) {
14461       fprintf(stderr,"Setting dialog to position 0,0\n");
14462     }
14463   }
14464 }
14465 
14466 
14467 
14468 
14469 
14470 /*********************  fix dialog size *************************/
14471 
14472 void fix_dialog_size(Widget w)
14473 {
14474   Dimension wd, ht;
14475 
14476   if (XtIsRealized(w))
14477   {
14478     XtVaGetValues(w,
14479                   XmNwidth, &wd,
14480                   XmNheight, &ht,
14481                   NULL);
14482 
14483     XtVaSetValues(w,
14484                   XmNminWidth,wd,
14485                   XmNminHeight,ht,
14486                   XmNmaxWidth,wd,
14487                   XmNmaxHeight,ht,
14488                   NULL);
14489   }
14490 }
14491 
14492 
14493 
14494 /**************************************** Button CallBacks *************************************/
14495 /***********************************************************************************************/
14496 
14497 
14498 /*
14499  *  Button callback for 1 out of 2 selection
14500  */
14501 void on_off_switch(int switchpos, Widget first, Widget second)
14502 {
14503   if(switchpos)
14504   {
14505     XtSetSensitive(first, FALSE);
14506     XtSetSensitive(second,TRUE);
14507   }
14508   else
14509   {
14510     XtSetSensitive(first, TRUE);
14511     XtSetSensitive(second,FALSE);
14512   }
14513 }
14514 
14515 
14516 
14517 
14518 
14519 /*
14520  *  Button callback for 1 out of 3 selection
14521  */
14522 void sel3_switch(int switchpos, Widget first, Widget second, Widget third)
14523 {
14524   if(switchpos == 2)
14525   {
14526     XtSetSensitive(first, FALSE);
14527     XtSetSensitive(second,TRUE);
14528     XtSetSensitive(third, TRUE);
14529   }
14530   else if(switchpos == 1)
14531   {
14532     XtSetSensitive(first, TRUE);
14533     XtSetSensitive(second,FALSE);
14534     XtSetSensitive(third, TRUE);
14535   }
14536   else
14537   {
14538     XtSetSensitive(first, TRUE);
14539     XtSetSensitive(second,TRUE);
14540     XtSetSensitive(third, FALSE);
14541   }
14542 }
14543 
14544 
14545 /*
14546  *  Button callback for 1 out of 4 selection
14547  */
14548 void sel4_switch(int switchpos, Widget first, Widget second, Widget third, Widget fourth)
14549 {
14550   if(switchpos == 3)
14551   {
14552     XtSetSensitive(first, FALSE);
14553     XtSetSensitive(second,TRUE);
14554     XtSetSensitive(third, TRUE);
14555     XtSetSensitive(fourth, TRUE);
14556   }
14557   else if(switchpos == 2)
14558   {
14559     XtSetSensitive(first, TRUE);
14560     XtSetSensitive(second,FALSE);
14561     XtSetSensitive(third, TRUE);
14562     XtSetSensitive(fourth, TRUE);
14563   }
14564   else if(switchpos == 1)
14565   {
14566     XtSetSensitive(first, TRUE);
14567     XtSetSensitive(second,TRUE);
14568     XtSetSensitive(third, FALSE);
14569     XtSetSensitive(fourth, TRUE);
14570   }
14571   else
14572   {
14573     XtSetSensitive(first, TRUE);
14574     XtSetSensitive(second,TRUE);
14575     XtSetSensitive(third, TRUE);
14576     XtSetSensitive(fourth, FALSE);
14577   }
14578 }
14579 
14580 
14581 
14582 
14583 
14584 // Called by UpdateTime when request_new_image flag is set.
14585 void new_image(Widget da)
14586 {
14587 
14588 
14589   busy_cursor(appshell);
14590 
14591   // Reset flags
14592   interrupt_drawing_now = 0;
14593   request_new_image = 0;
14594 
14595 
14596   // Set up floating point lat/long values to match Xastir
14597   // coordinates (speeds things up when dealing with lat/long
14598   // values later).
14599   convert_from_xastir_coordinates(&f_center_longitude,
14600                                   &f_center_latitude,
14601                                   center_longitude,
14602                                   center_latitude);
14603 
14604   if (create_image(da))
14605   {
14606     HandlePendingEvents(app_context);
14607     if (interrupt_drawing_now)
14608     {
14609       return;
14610     }
14611 
14612     (void)XCopyArea(XtDisplay(da),
14613                     pixmap_final,
14614                     XtWindow(da),
14615                     gc,
14616                     0,
14617                     0,
14618                     (unsigned int)screen_width,
14619                     (unsigned int)screen_height,
14620                     0,
14621                     0);
14622 
14623     // We just refreshed the screen, so don't try to erase any
14624     // zoom-in boxes via XOR.
14625     zoom_box_x1 = -1;
14626 
14627     HandlePendingEvents(app_context);
14628     if (interrupt_drawing_now)
14629     {
14630       return;
14631     }
14632 
14633     display_zoom_status();
14634   }
14635 }
14636 
14637 
14638 
14639 
14640 
14641 /*
14642  *  Keep map in real world space, readjust center and scaling if neccessary
14643  */
14644 void check_range(void)
14645 {
14646   Dimension width, height;
14647 
14648 
14649   XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
14650 
14651   // Check the window itself to see if our new y-scale fits it
14652   //
14653   if ((height*new_scale_y) > 64800000l)
14654   {
14655 
14656     // Center between 90°N and 90°S
14657     new_mid_y  =  64800000l/2;
14658 
14659     // Adjust y-scaling so that we fit perfectly in the window
14660     new_scale_y = 64800000l / height;
14661   }
14662 
14663   if ((new_mid_y < (height*new_scale_y)/2))
14664   {
14665     new_mid_y  = (height*new_scale_y)/2;  // upper border max 90°N
14666   }
14667 
14668   if ((new_mid_y + (height*new_scale_y)/2) > 64800000l)
14669   {
14670     new_mid_y = 64800000l-((height*new_scale_y)/2);  // lower border max 90°S
14671   }
14672 
14673   // Adjust scaling based on latitude of new center
14674   new_scale_x = get_x_scale(new_mid_x,new_mid_y,new_scale_y);  // recalc x scaling depending on position
14675 
14676   if (debug_level & 512)
14677   {
14678     fprintf(stderr,"checkrange- x:%ld\ty:%ld\n\n",new_scale_x,new_scale_y);
14679   }
14680 
14681 //    // scale_x will always be bigger than scale_y, so no problem here...
14682 //    if ((width*new_scale_x) > 129600000l) {
14683 //        // Center between 180°W and 180°E
14684 //        new_mid_x = 129600000l/2;
14685 //    }
14686 
14687 
14688 // The below code causes the map image to snap to the left or right
14689 // of the display.  I'd rather see the scale factor changed so that
14690 // the map fits perfectly left/right in the display, so that we
14691 // cannot go past the edges of the earth.  Change the code to work
14692 // this way later.  We'll have to compute new_y_scale from the
14693 // new_x_scale once we scale X appropriately, then will probably
14694 // have to test the y scaling again?
14695 
14696 
14697   /*
14698       // Check against left border
14699       if ((new_mid_x < (width*new_scale_x)/2)) {
14700           // This will cause the map image to snap to the left of the
14701           // display.
14702           new_mid_x = (width*new_scale_x)/2;  // left border max 180°W
14703       }
14704       else {
14705           // Check against right border
14706           if ((new_mid_x + (width*new_scale_x)/2) > 129600000l)
14707               // This will cause the map image to snap to the right of
14708               // the display.
14709               new_mid_x = 129600000l-((width*new_scale_x)/2); // right border max 180°E
14710       }
14711   */
14712 
14713 
14714 // long NW_corner_longitude;             // Longitude at top NW corner of map screen
14715 // long NW_corner_latitude;              // Latitude  at top NW corner of map screen
14716 
14717   /*
14718   if (NW_corner_longitude < 0l) {
14719   //    fprintf(stderr,"left\n");
14720       NW_corner_longitude = 0l;         // New left viewpoint edge
14721       new_mid_x = 0l + ((width*new_scale_x) / 2); // New midpoint
14722   }
14723   if ( (NW_corner_longitude + (width*new_scale_x) ) > 129600000l) {
14724   //    fprintf(stderr,"right\n");
14725       NW_corner_longitude = 129600000l - (width*new_scale_x);   // New left viewpoint edge
14726       new_mid_x = 129600000l - ((width*new_scale_x) / 2); // New midpoint
14727   }
14728   */
14729 
14730 // Find the four corners of the map in the new scale system.  Make
14731 // sure they are on the display, but not well inside the borders of
14732 // the display.
14733 
14734 // We keep getting center_longitude out of range when zooming out
14735 // and having the edge of the world map to the right of the middle
14736 // of the window.  This shows up in new_image() above during the
14737 // convert_from_xastir_coordinates() call.  new_mid_x is the data of
14738 // interest in this routine.
14739 
14740 }
14741 
14742 
14743 
14744 
14745 
14746 /*
14747  *  Display a new map view after checking the view and scaling
14748  */
14749 void display_zoom_image(int recenter)
14750 {
14751   Dimension width, height;
14752 
14753   XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
14754 //fprintf(stderr,"Before,  x: %lu,  y: %lu\n",new_scale_x,new_scale_y);
14755   check_range();              // keep map inside world and calc x scaling
14756 //fprintf(stderr,"After,   x: %lu,  y: %lu\n\n",new_scale_x,new_scale_y);
14757   if (new_mid_x != center_longitude
14758       || new_mid_y != center_latitude
14759       || new_scale_x != scale_x
14760       || new_scale_y != scale_y)      // If there's been a change in zoom or center
14761   {
14762 
14763     set_last_position();
14764 
14765     if (recenter)
14766     {
14767       center_longitude = new_mid_x;      // new map center
14768       center_latitude  = new_mid_y;
14769     }
14770     scale_x = new_scale_x;
14771     scale_y = new_scale_y;
14772 
14773     setup_in_view();    // update "in view" flag for all stations
14774 
14775     // Set the interrupt_drawing_now flag
14776     interrupt_drawing_now++;
14777 
14778     // Request that a new image be created.  Calls create_image,
14779     // XCopyArea, and display_zoom_status.
14780     request_new_image++;
14781 //        last_input_event = sec_now() + 2;
14782 
14783   }
14784   else        // No change in zoom or center.  Don't update ANYTHING.
14785   {
14786   }
14787 }
14788 
14789 
14790 
14791 
14792 
14793 void Zoom_in( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
14794 {
14795   Dimension width, height;
14796 
14797   if(display_up)
14798   {
14799     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
14800     new_mid_x = center_longitude - ((width *scale_x)/2) + (menu_x*scale_x);
14801     new_mid_y = center_latitude  - ((height*scale_y)/2) + (menu_y*scale_y);
14802     new_scale_y = scale_y / 2;
14803     if (new_scale_y < 1)
14804     {
14805       new_scale_y = 1;  // don't go further in
14806     }
14807     display_zoom_image(1);          // check range and do display, recenter
14808   }
14809 }
14810 
14811 
14812 
14813 
14814 
14815 void Zoom_in_no_pan( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
14816 {
14817   Dimension width, height;
14818 
14819   if(display_up && !map_lock_pan_zoom)
14820   {
14821     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
14822     new_mid_x = center_longitude;
14823     new_mid_y = center_latitude;
14824     new_scale_y = scale_y / 2;
14825     if (new_scale_y < 1)
14826     {
14827       new_scale_y = 1;  // don't go further in, scale_x always bigger than scale_y
14828     }
14829     display_zoom_image(0);          // check range and do display, keep center
14830   }
14831 }
14832 
14833 
14834 
14835 
14836 
14837 void Zoom_out(  Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
14838 {
14839   Dimension width, height;
14840 
14841   if(display_up)
14842   {
14843     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
14844     new_mid_x = center_longitude - ((width *scale_x)/2) + (menu_x*scale_x);
14845     new_mid_y = center_latitude  - ((height*scale_y)/2) + (menu_y*scale_y);
14846     if (width*scale_x < 129600000l || height*scale_y < 64800000l)
14847     {
14848       new_scale_y = scale_y * 2;
14849     }
14850     else
14851     {
14852       new_scale_y = scale_y;  // don't zoom out if whole world could be shown
14853     }
14854     display_zoom_image(1);          // check range and do display, recenter
14855   }
14856 }
14857 
14858 
14859 
14860 
14861 
14862 void Zoom_out_no_pan( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
14863 {
14864   Dimension width, height;
14865 
14866   if(display_up && !map_lock_pan_zoom)
14867   {
14868     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
14869     new_mid_x = center_longitude;
14870     new_mid_y = center_latitude;
14871     if (width*scale_x < 129600000l || height*scale_y < 64800000l)
14872     {
14873       new_scale_y = scale_y * 2;
14874     }
14875     else
14876     {
14877       new_scale_y = scale_y;  // don't zoom out if whole world could be shown
14878     }
14879     display_zoom_image(0);          // check range and do display, keep center
14880   }
14881 }
14882 
14883 
14884 
14885 
14886 
14887 void Custom_Zoom_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
14888 {
14889   Widget shell = (Widget) clientData;
14890   XtPopdown(shell);
14891   XtDestroyWidget(shell);
14892   custom_zoom_dialog = (Widget)NULL;
14893 }
14894 
14895 
14896 
14897 
14898 
14899 static Widget custom_zoom_zoom_level;
14900 
14901 
14902 
14903 
14904 
14905 void Custom_Zoom_do_it( Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
14906 {
14907   char *temp_ptr;
14908 
14909   temp_ptr = XmTextFieldGetString(custom_zoom_zoom_level);
14910   scale_y = atoi(temp_ptr);
14911   XtFree(temp_ptr);
14912 
14913   new_scale_y = scale_y;
14914   display_zoom_image(1);
14915 }
14916 
14917 
14918 
14919 
14920 
14921 // Function to bring up a dialog.  User can then select zoom for the
14922 // display directly.
14923 //
14924 void Custom_Zoom( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
14925 {
14926   static Widget  pane, form, button_ok, button_cancel, zoom_label;
14927 //    Arg al[50];           /* Arg List */
14928 //    unsigned int ac = 0;           /* Arg Count */
14929   Atom delw;
14930   char temp[50];
14931 
14932   if(!custom_zoom_dialog)
14933   {
14934 
14935     // "Custom Zoom"
14936     custom_zoom_dialog = XtVaCreatePopupShell(langcode("POPUPMA034"),
14937                          xmDialogShellWidgetClass,
14938                          appshell,
14939                          XmNdeleteResponse,XmDESTROY,
14940                          XmNdefaultPosition, FALSE,
14941                          XmNresize, FALSE,
14942                          XmNfontList, fontlist1,
14943                          NULL);
14944 
14945     pane = XtVaCreateWidget("Jump_location pane",
14946                             xmPanedWindowWidgetClass,
14947                             custom_zoom_dialog,
14948                             MY_FOREGROUND_COLOR,
14949                             MY_BACKGROUND_COLOR,
14950                             NULL);
14951 
14952     form =  XtVaCreateWidget("Jump_location form",
14953                              xmFormWidgetClass,
14954                              pane,
14955                              XmNfractionBase, 2,
14956                              XmNautoUnmanage, FALSE,
14957                              XmNshadowThickness, 1,
14958                              MY_FOREGROUND_COLOR,
14959                              MY_BACKGROUND_COLOR,
14960                              NULL);
14961 
14962     // "Zoom Level"
14963     zoom_label = XtVaCreateManagedWidget(langcode("POPUPMA004"),
14964                                          xmLabelWidgetClass,
14965                                          form,
14966                                          XmNtopAttachment, XmATTACH_FORM,
14967                                          XmNtopOffset, 10,
14968                                          XmNbottomAttachment, XmATTACH_NONE,
14969                                          XmNleftAttachment, XmATTACH_FORM,
14970                                          XmNleftOffset, 5,
14971                                          XmNrightAttachment, XmATTACH_NONE,
14972                                          MY_FOREGROUND_COLOR,
14973                                          MY_BACKGROUND_COLOR,
14974                                          XmNfontList, fontlist1,
14975                                          NULL);
14976 
14977     custom_zoom_zoom_level = XtVaCreateManagedWidget("Custom_Zoom zoom_level",
14978                              xmTextFieldWidgetClass,
14979                              form,
14980                              XmNeditable,   TRUE,
14981                              XmNcursorPositionVisible, TRUE,
14982                              XmNsensitive, TRUE,
14983                              XmNshadowThickness,      1,
14984                              XmNcolumns,6,
14985                              XmNwidth,((6*7)+2),
14986                              XmNbackground, colors[0x0f],
14987                              XmNtopAttachment,XmATTACH_FORM,
14988                              XmNtopOffset, 5,
14989                              XmNbottomAttachment,XmATTACH_NONE,
14990                              XmNleftAttachment, XmATTACH_WIDGET,
14991                              XmNleftWidget, zoom_label,
14992                              XmNleftOffset, 10,
14993                              XmNrightAttachment,XmATTACH_FORM,
14994                              XmNrightOffset, 5,
14995                              XmNfontList, fontlist1,
14996                              NULL);
14997 
14998     button_ok = XtVaCreateManagedWidget(langcode("JMLPO00002"),
14999                                         xmPushButtonGadgetClass,
15000                                         form,
15001                                         XmNtopAttachment, XmATTACH_WIDGET,
15002                                         XmNtopWidget, zoom_label,
15003                                         XmNtopOffset,15,
15004                                         XmNbottomAttachment, XmATTACH_FORM,
15005                                         XmNbottomOffset,5,
15006                                         XmNleftAttachment, XmATTACH_POSITION,
15007                                         XmNleftPosition, 0,
15008                                         XmNleftOffset, 3,
15009                                         XmNrightAttachment, XmATTACH_POSITION,
15010                                         XmNrightPosition, 1,
15011                                         XmNnavigationType, XmTAB_GROUP,
15012                                         XmNfontList, fontlist1,
15013                                         NULL);
15014 
15015     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00003"),
15016                                             xmPushButtonGadgetClass,
15017                                             form,
15018                                             XmNtopAttachment, XmATTACH_WIDGET,
15019                                             XmNtopWidget, zoom_label,
15020                                             XmNtopOffset,15,
15021                                             XmNbottomAttachment, XmATTACH_FORM,
15022                                             XmNbottomOffset,5,
15023                                             XmNleftAttachment, XmATTACH_POSITION,
15024                                             XmNleftPosition, 1,
15025                                             XmNrightAttachment, XmATTACH_POSITION,
15026                                             XmNrightPosition, 2,
15027                                             XmNrightOffset, 3,
15028                                             XmNnavigationType, XmTAB_GROUP,
15029                                             XmNfontList, fontlist1,
15030                                             NULL);
15031 
15032     XtAddCallback(button_cancel, XmNactivateCallback, Custom_Zoom_destroy_shell, custom_zoom_dialog);
15033     XtAddCallback(button_ok, XmNactivateCallback, Custom_Zoom_do_it, NULL);
15034 
15035     pos_dialog(custom_zoom_dialog);
15036 
15037     delw = XmInternAtom(XtDisplay(custom_zoom_dialog),"WM_DELETE_WINDOW", FALSE);
15038     XmAddWMProtocolCallback(custom_zoom_dialog, delw, Custom_Zoom_destroy_shell, (XtPointer)custom_zoom_dialog);
15039 
15040 
15041     // Snag the current zoom value, convert them to
15042     // displayable values, and fill in the fields.
15043     xastir_snprintf(temp,
15044                     sizeof(temp),
15045                     "%ld",
15046                     scale_y);
15047     XmTextFieldSetString(custom_zoom_zoom_level, temp);
15048 
15049 
15050     XtManageChild(form);
15051     XtManageChild(pane);
15052 
15053     XtPopup(custom_zoom_dialog,XtGrabNone);
15054     fix_dialog_size(custom_zoom_dialog);
15055 
15056     // Move focus to the Close button.  This appears to
15057     // highlight the
15058     // button fine, but we're not able to hit the <Enter> key to
15059     // have that default function happen.  Note:  We _can_ hit
15060     // the
15061     // <SPACE> key, and that activates the option.
15062 //        XmUpdateDisplay(custom_zoom_dialog);
15063     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
15064 
15065   }
15066   else
15067   {
15068     XtPopup(custom_zoom_dialog,XtGrabNone);
15069     (void)XRaiseWindow(XtDisplay(custom_zoom_dialog), XtWindow(custom_zoom_dialog));
15070   }
15071 }
15072 
15073 
15074 
15075 
15076 
15077 void Zoom_level( Widget w, XtPointer clientData, XtPointer calldata)
15078 {
15079   Dimension width, height;
15080   int level;
15081 
15082   level=atoi((char *)clientData);
15083   if(display_up)
15084   {
15085     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15086     new_mid_x = center_longitude - ((width *scale_x)/2) + (menu_x*scale_x);
15087     new_mid_y = center_latitude  - ((height*scale_y)/2) + (menu_y*scale_y);
15088     switch(level)
15089     {
15090       case(1):
15091         new_scale_y = 1;
15092         break;
15093 
15094       case(2):
15095         new_scale_y = 16;
15096         break;
15097 
15098       case(3):
15099         new_scale_y = 64;
15100         break;
15101 
15102       case(4):
15103         new_scale_y = 256;
15104         break;
15105 
15106       case(5):
15107         new_scale_y = 1024;
15108         break;
15109 
15110       case(6):
15111         new_scale_y = 8192;
15112         break;
15113 
15114       case(7):
15115 
15116 //WE7U
15117 // Here it'd be good to calculate what zoom level the entire world
15118 // would best fit in, instead of fixing the scale to a particular
15119 // amount.  Figure out which zoom level would fit in the X and the Y
15120 // direction, and then pick the higher zoom level of the two (to
15121 // make sure the world fits in both).  We should probably center at
15122 // 0.0N/0.0W as well.
15123 
15124         new_scale_y = 500000;
15125 
15126         // Center on Earth (0/0)
15127 //                new_mid_x = 12900000l / 2;
15128 //                new_mid_y = 6480000l  / 2;
15129         break;
15130 
15131       case(8):    // 10% out
15132         new_scale_y = (int)(scale_y * 1.1);
15133         if (new_scale_y == scale_y)
15134         {
15135           new_scale_y++;
15136         }
15137         break;
15138 
15139       case(9):    // 10% in
15140         new_scale_y = (int)(scale_y * 0.9);
15141         // Don't allow the user to go in further than zoom 1
15142         if (new_scale_y < 1)
15143         {
15144           new_scale_y = 1;
15145         }
15146         break;
15147 
15148       // Pop up a new dialog that allows the user to select
15149       // the zoom level, then causes that zoom level and the
15150       // right-click mouse location to take effect on the map
15151       // window.  Similar to the Center_Zoom function but with
15152       // the mouse coordinates instead of the center of the
15153       // screen.
15154       case(10):   // Custom Zoom Level
15155 
15156         // Pop up a new dialog that allows the user to
15157         // select the zoom level, then causes that zoom
15158         // level and the right-click mouse location to take
15159         // effect on the map window.  Similar to the
15160         // Center_Zoom function but with the mouse
15161         // coordinates instead of the center of the screen.
15162 
15163         // Set up new_scale_y for whatever custom zoom level
15164         // the user has chosen, then call
15165         // display_zoom_image() from the callback there.
15166         //
15167         Custom_Zoom( w, clientData, calldata);
15168         return;
15169         break;
15170 
15171       default:
15172         break;
15173     }
15174     display_zoom_image(1);          // check range and do display, recenter
15175   }
15176 }
15177 
15178 
15179 
15180 
15181 
15182 void Pan_ctr( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15183 {
15184   Dimension width, height;
15185 
15186   if(display_up)
15187   {
15188     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15189     new_mid_x = center_longitude - ((width *scale_x)/2) + (menu_x*scale_x);
15190     new_mid_y = center_latitude  - ((height*scale_y)/2) + (menu_y*scale_y);
15191     new_scale_y = scale_y;          // keep size
15192     display_zoom_image(1);          // check range and do display, recenter
15193   }
15194 }
15195 
15196 
15197 
15198 
15199 
15200 void Pan_up( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15201 {
15202   Dimension width, height;
15203 
15204   if(display_up)
15205   {
15206     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15207     new_mid_x = center_longitude;
15208     new_mid_y = center_latitude  - (height*scale_y/4);
15209     new_scale_y = scale_y;          // keep size
15210     display_zoom_image(1);          // check range and do display, recenter
15211   }
15212 }
15213 
15214 
15215 
15216 
15217 
15218 void Pan_up_less( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15219 {
15220   Dimension width, height;
15221 
15222   if(display_up && !map_lock_pan_zoom)
15223   {
15224     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15225     new_mid_x = center_longitude;
15226     new_mid_y = center_latitude  - (height*scale_y/10);
15227     new_scale_y = scale_y;          // keep size
15228     display_zoom_image(1);          // check range and do display, recenter
15229   }
15230 }
15231 
15232 
15233 
15234 
15235 
15236 void Pan_down( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15237 {
15238   Dimension width, height;
15239 
15240   if(display_up)
15241   {
15242     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15243     new_mid_x = center_longitude;
15244     new_mid_y = center_latitude  + (height*scale_y/4);
15245     new_scale_y = scale_y;          // keep size
15246     display_zoom_image(1);          // check range and do display, recenter
15247   }
15248 }
15249 
15250 
15251 
15252 
15253 
15254 void Pan_down_less( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15255 {
15256   Dimension width, height;
15257 
15258   if(display_up && !map_lock_pan_zoom)
15259   {
15260     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15261     new_mid_x = center_longitude;
15262     new_mid_y = center_latitude  + (height*scale_y/10);
15263     new_scale_y = scale_y;          // keep size
15264     display_zoom_image(1);          // check range and do display, recenter
15265   }
15266 }
15267 
15268 
15269 
15270 
15271 
15272 void Pan_left( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15273 {
15274   Dimension width, height;
15275 
15276   if(display_up)
15277   {
15278     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15279     new_mid_x = center_longitude - (width*scale_x/4);
15280     new_mid_y = center_latitude;
15281     new_scale_y = scale_y;          // keep size
15282     display_zoom_image(1);          // check range and do display, recenter
15283   }
15284 }
15285 
15286 
15287 
15288 
15289 
15290 void Pan_left_less( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15291 {
15292   Dimension width, height;
15293 
15294   if(display_up && !map_lock_pan_zoom)
15295   {
15296     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15297     new_mid_x = center_longitude - (width*scale_x/10);
15298     new_mid_y = center_latitude;
15299     new_scale_y = scale_y;          // keep size
15300     display_zoom_image(1);          // check range and do display, recenter
15301   }
15302 }
15303 
15304 
15305 
15306 
15307 
15308 void Pan_right( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15309 {
15310   Dimension width, height;
15311 
15312   if(display_up)
15313   {
15314     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15315     new_mid_x = center_longitude + (width*scale_x/4);
15316     new_mid_y = center_latitude;
15317     new_scale_y = scale_y;          // keep size
15318     display_zoom_image(1);          // check range and do display, recenter
15319   }
15320 }
15321 
15322 
15323 
15324 
15325 
15326 void Pan_right_less( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15327 {
15328   Dimension width, height;
15329 
15330   if(display_up && !map_lock_pan_zoom)
15331   {
15332     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15333     new_mid_x = center_longitude + (width*scale_x/10);
15334     new_mid_y = center_latitude;
15335     new_scale_y = scale_y;          // keep size
15336     display_zoom_image(1);          // check range and do display, recenter
15337   }
15338 }
15339 
15340 
15341 
15342 
15343 
15344 void Center_Zoom_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData))
15345 {
15346   Widget shell = (Widget) clientData;
15347   XtPopdown(shell);
15348   XtDestroyWidget(shell);
15349   center_zoom_dialog = (Widget)NULL;
15350 }
15351 
15352 
15353 
15354 
15355 
15356 static Widget center_zoom_latitude,
15357        center_zoom_longitude,
15358        center_zoom_zoom_level;
15359 
15360 
15361 
15362 
15363 
15364 void Center_Zoom_do_it( Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
15365 {
15366   unsigned long x, y;
15367   char *temp_ptr;
15368 
15369 
15370   temp_ptr = XmTextFieldGetString(center_zoom_latitude);
15371   f_center_latitude  = atof(temp_ptr);
15372   XtFree(temp_ptr);
15373 
15374   temp_ptr = XmTextFieldGetString(center_zoom_longitude);
15375   f_center_longitude = atof(temp_ptr);
15376   XtFree(temp_ptr);
15377 
15378   //Convert to Xastir coordinate system for lat/long
15379   convert_to_xastir_coordinates(&x,
15380                                 &y,
15381                                 f_center_longitude,
15382                                 f_center_latitude);
15383 
15384   temp_ptr = XmTextFieldGetString(center_zoom_zoom_level);
15385   scale_y = atoi(temp_ptr);
15386   XtFree(temp_ptr);
15387 
15388   new_mid_x = x;
15389   new_mid_y = y;
15390   new_scale_y = scale_y;
15391   display_zoom_image(1);
15392 }
15393 
15394 
15395 
15396 
15397 
15398 void Go_Home( Widget w, XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
15399 {
15400   DataRow *p_station;
15401 
15402   if (!map_lock_pan_zoom)
15403   {
15404     if (search_station_name(&p_station,my_callsign,1))
15405     {
15406       set_map_position(w, p_station->coord_lat, p_station->coord_lon);
15407     }
15408   }
15409 }
15410 
15411 
15412 
15413 
15414 
15415 // Function to bring up a dialog.  User can then select the center
15416 // and zoom for the display directly.
15417 //
15418 // Later it would be nice to have a "Calc" button so that the user
15419 // could input lat/long in any of the supported formats.  Right now
15420 // it is DD.DDDD format only.
15421 //
15422 void Center_Zoom( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer calldata)
15423 {
15424   static Widget  pane,form, button_ok, button_cancel,
15425          lat_label, lon_label, zoom_label;
15426 //    Arg al[50];           /* Arg List */
15427 //    unsigned int ac = 0;           /* Arg Count */
15428   Atom delw;
15429   char temp[50];
15430 
15431   if(!center_zoom_dialog)
15432   {
15433 
15434     // "Center & Zoom"
15435     center_zoom_dialog = XtVaCreatePopupShell(langcode("POPUPMA026"),
15436                          xmDialogShellWidgetClass,
15437                          appshell,
15438                          XmNdeleteResponse,XmDESTROY,
15439                          XmNdefaultPosition, FALSE,
15440                          XmNresize, FALSE,
15441                          XmNfontList, fontlist1,
15442                          NULL);
15443 
15444     pane = XtVaCreateWidget("Jump_location pane",
15445                             xmPanedWindowWidgetClass,
15446                             center_zoom_dialog,
15447                             MY_FOREGROUND_COLOR,
15448                             MY_BACKGROUND_COLOR,
15449                             NULL);
15450 
15451     form =  XtVaCreateWidget("Jump_location form",
15452                              xmFormWidgetClass,
15453                              pane,
15454                              XmNfractionBase, 2,
15455                              XmNautoUnmanage, FALSE,
15456                              XmNshadowThickness, 1,
15457                              MY_FOREGROUND_COLOR,
15458                              MY_BACKGROUND_COLOR,
15459                              NULL);
15460 
15461     // "Latitude"
15462     lat_label = XtVaCreateManagedWidget(langcode("POPUPMA027"),
15463                                         xmLabelWidgetClass,
15464                                         form,
15465                                         XmNtopAttachment, XmATTACH_FORM,
15466                                         XmNtopOffset, 10,
15467                                         XmNbottomAttachment, XmATTACH_NONE,
15468                                         XmNleftAttachment, XmATTACH_FORM,
15469                                         XmNleftOffset, 5,
15470                                         XmNrightAttachment, XmATTACH_NONE,
15471                                         MY_FOREGROUND_COLOR,
15472                                         MY_BACKGROUND_COLOR,
15473                                         XmNfontList, fontlist1,
15474                                         NULL);
15475 
15476     center_zoom_latitude = XtVaCreateManagedWidget("Center_Zoom latitude",
15477                            xmTextFieldWidgetClass,
15478                            form,
15479                            XmNeditable,   TRUE,
15480                            XmNcursorPositionVisible, TRUE,
15481                            XmNsensitive, TRUE,
15482                            XmNshadowThickness,      1,
15483                            XmNcolumns,21,
15484                            XmNwidth,((21*7)+2),
15485                            XmNbackground, colors[0x0f],
15486                            XmNtopAttachment,XmATTACH_FORM,
15487                            XmNtopOffset, 5,
15488                            XmNbottomAttachment,XmATTACH_NONE,
15489                            XmNleftAttachment, XmATTACH_WIDGET,
15490                            XmNleftWidget, lat_label,
15491                            XmNleftOffset, 10,
15492                            XmNrightAttachment,XmATTACH_FORM,
15493                            XmNrightOffset, 5,
15494                            XmNfontList, fontlist1,
15495                            NULL);
15496 
15497     // "Longitude"
15498     lon_label = XtVaCreateManagedWidget(langcode("POPUPMA028"),
15499                                         xmLabelWidgetClass,
15500                                         form,
15501                                         XmNtopAttachment, XmATTACH_WIDGET,
15502                                         XmNtopWidget, lat_label,
15503                                         XmNtopOffset, 10,
15504                                         XmNbottomAttachment, XmATTACH_NONE,
15505                                         XmNleftAttachment, XmATTACH_FORM,
15506                                         XmNleftOffset, 5,
15507                                         XmNrightAttachment, XmATTACH_NONE,
15508                                         MY_FOREGROUND_COLOR,
15509                                         MY_BACKGROUND_COLOR,
15510                                         XmNfontList, fontlist1,
15511                                         NULL);
15512 
15513     center_zoom_longitude = XtVaCreateManagedWidget("Center_Zoom longitude",
15514                             xmTextFieldWidgetClass,
15515                             form,
15516                             XmNeditable,   TRUE,
15517                             XmNcursorPositionVisible, TRUE,
15518                             XmNsensitive, TRUE,
15519                             XmNshadowThickness,      1,
15520                             XmNcolumns,21,
15521                             XmNwidth,((21*7)+2),
15522                             XmNbackground, colors[0x0f],
15523                             XmNtopAttachment,XmATTACH_WIDGET,
15524                             XmNtopWidget, lat_label,
15525                             XmNtopOffset, 5,
15526                             XmNbottomAttachment,XmATTACH_NONE,
15527                             XmNleftAttachment, XmATTACH_WIDGET,
15528                             XmNleftWidget, lon_label,
15529                             XmNleftOffset, 10,
15530                             XmNrightAttachment,XmATTACH_FORM,
15531                             XmNrightOffset, 5,
15532                             XmNfontList, fontlist1,
15533                             NULL);
15534 
15535     // "Zoom Level"
15536     zoom_label = XtVaCreateManagedWidget(langcode("POPUPMA004"),
15537                                          xmLabelWidgetClass,
15538                                          form,
15539                                          XmNtopAttachment, XmATTACH_WIDGET,
15540                                          XmNtopWidget, lon_label,
15541                                          XmNtopOffset, 10,
15542                                          XmNbottomAttachment, XmATTACH_NONE,
15543                                          XmNleftAttachment, XmATTACH_FORM,
15544                                          XmNleftOffset, 5,
15545                                          XmNrightAttachment, XmATTACH_NONE,
15546                                          MY_FOREGROUND_COLOR,
15547                                          MY_BACKGROUND_COLOR,
15548                                          XmNfontList, fontlist1,
15549                                          NULL);
15550 
15551     center_zoom_zoom_level = XtVaCreateManagedWidget("Center_Zoom zoom_level",
15552                              xmTextFieldWidgetClass,
15553                              form,
15554                              XmNeditable,   TRUE,
15555                              XmNcursorPositionVisible, TRUE,
15556                              XmNsensitive, TRUE,
15557                              XmNshadowThickness,      1,
15558                              XmNcolumns,21,
15559                              XmNwidth,((21*7)+2),
15560                              XmNbackground, colors[0x0f],
15561                              XmNtopAttachment,XmATTACH_WIDGET,
15562                              XmNtopWidget, lon_label,
15563                              XmNtopOffset, 5,
15564                              XmNbottomAttachment,XmATTACH_NONE,
15565                              XmNleftAttachment, XmATTACH_WIDGET,
15566                              XmNleftWidget, zoom_label,
15567                              XmNleftOffset, 10,
15568                              XmNrightAttachment,XmATTACH_FORM,
15569                              XmNrightOffset, 5,
15570                              XmNfontList, fontlist1,
15571                              NULL);
15572 
15573     button_ok = XtVaCreateManagedWidget(langcode("JMLPO00002"),
15574                                         xmPushButtonGadgetClass,
15575                                         form,
15576                                         XmNtopAttachment, XmATTACH_WIDGET,
15577                                         XmNtopWidget, zoom_label,
15578                                         XmNtopOffset,15,
15579                                         XmNbottomAttachment, XmATTACH_FORM,
15580                                         XmNbottomOffset,5,
15581                                         XmNleftAttachment, XmATTACH_POSITION,
15582                                         XmNleftPosition, 0,
15583                                         XmNleftOffset, 3,
15584                                         XmNrightAttachment, XmATTACH_POSITION,
15585                                         XmNrightPosition, 1,
15586                                         XmNnavigationType, XmTAB_GROUP,
15587                                         XmNfontList, fontlist1,
15588                                         NULL);
15589 
15590     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00003"),
15591                                             xmPushButtonGadgetClass,
15592                                             form,
15593                                             XmNtopAttachment, XmATTACH_WIDGET,
15594                                             XmNtopWidget, zoom_label,
15595                                             XmNtopOffset,15,
15596                                             XmNbottomAttachment, XmATTACH_FORM,
15597                                             XmNbottomOffset,5,
15598                                             XmNleftAttachment, XmATTACH_POSITION,
15599                                             XmNleftPosition, 1,
15600                                             XmNrightAttachment, XmATTACH_POSITION,
15601                                             XmNrightPosition, 2,
15602                                             XmNrightOffset, 3,
15603                                             XmNnavigationType, XmTAB_GROUP,
15604                                             XmNfontList, fontlist1,
15605                                             NULL);
15606 
15607     XtAddCallback(button_cancel, XmNactivateCallback, Center_Zoom_destroy_shell, center_zoom_dialog);
15608     XtAddCallback(button_ok, XmNactivateCallback, Center_Zoom_do_it, NULL);
15609 
15610     pos_dialog(center_zoom_dialog);
15611 
15612     delw = XmInternAtom(XtDisplay(center_zoom_dialog),"WM_DELETE_WINDOW", FALSE);
15613     XmAddWMProtocolCallback(center_zoom_dialog, delw, Center_Zoom_destroy_shell, (XtPointer)center_zoom_dialog);
15614 
15615 
15616     if (center_zoom_override)   // We've found a Map View
15617     {
15618       // "eyeball" object and are
15619       // doing a center/zoom based on
15620       // that object's info.  Grab the
15621       // pointer to the object which
15622       // is in calldata.
15623       DataRow *p_station = (DataRow *)calldata;
15624       float f_latitude, f_longitude;
15625       int range;
15626       Dimension width, height;
15627       long x, x0, y, y0;
15628       double x_miles, y_miles, distance;
15629       char temp_course[10];
15630       double scale_factor;
15631       long my_scale_y;
15632       int fell_off = 0;
15633 
15634 
15635 //fprintf(stderr,"Map View Object: %s\n",p_station->call_sign);
15636 
15637       center_zoom_override = 0;
15638 
15639 
15640       // Snag the objects values, convert them to displayable
15641       // values, and fill in the fields.
15642       convert_from_xastir_coordinates(&f_longitude,
15643                                       &f_latitude,
15644                                       p_station->coord_lon,
15645                                       p_station->coord_lat);
15646 
15647       xastir_snprintf(temp,
15648                       sizeof(temp),
15649                       "%f",
15650                       f_latitude);
15651       XmTextFieldSetString(center_zoom_latitude, temp);
15652 
15653       xastir_snprintf(temp,
15654                       sizeof(temp),
15655                       "%f",
15656                       f_longitude);
15657       XmTextFieldSetString(center_zoom_longitude, temp);
15658 
15659       // Compute the approximate zoom level we need from the
15660       // range value in the object.  Range is in miles.
15661       range = atoi(&p_station->power_gain[3]);
15662 
15663       // We should be able to compute the distance across the
15664       // screen that we currently have, then compute an
15665       // accurate zoom level that will give us the range we
15666       // want.
15667 
15668       // Find out the screen values
15669       XtVaGetValues(da,XmNwidth, &width, XmNheight, &height, NULL);
15670 
15671       // Convert points to Xastir coordinate system
15672 
15673       // X
15674       x = center_longitude  - ((width *scale_x)/2);
15675 
15676       // Check for the edge of the earth
15677       if (x < 0)
15678       {
15679         x = 0;
15680         fell_off++; // Fell off the edge of the earth
15681       }
15682 
15683       x0 = center_longitude; // Center of screen
15684 
15685       // Y
15686       y = center_latitude   - ((height*scale_y)/2);
15687 
15688       // Check for the edge of the earth
15689       if (y < 0)
15690       {
15691         y = 0;
15692         fell_off++; // Fell off the edge of the earth
15693       }
15694 
15695       y0 = center_latitude;  // Center of screen
15696 
15697       // Compute distance from center to each edge
15698 
15699       // X distance.  Keep Y constant.
15700       x_miles = cvt_kn2len
15701                 * calc_distance_course(y0,
15702                                        x0,
15703                                        y0,
15704                                        x,
15705                                        temp_course,
15706                                        sizeof(temp_course));
15707 
15708       // Y distance.  Keep X constant.
15709       y_miles = cvt_kn2len
15710                 * calc_distance_course(y0,
15711                                        x0,
15712                                        y,
15713                                        x0,
15714                                        temp_course,
15715                                        sizeof(temp_course));
15716 
15717       // Choose the smaller distance
15718       if (x_miles < y_miles)
15719       {
15720         distance = x_miles;
15721       }
15722       else
15723       {
15724         distance = y_miles;
15725       }
15726 //fprintf(stderr,"Current screen range: %f\n", distance);
15727 //fprintf(stderr,"Desired screen range: %d\n", range);
15728 
15729 // Note that these numbers will be off if we're zoomed out way too
15730 // far (edges of the earth are inside the screen view).
15731 
15732       // Now we know the range of the current screen
15733       // (distance) in miles.  Compute what we need from
15734       // "distance" (screen) and "range" (object) in order to
15735       // get a scale factor we can apply to our zoom numbers.
15736       if (distance < range)
15737       {
15738 //fprintf(stderr,"Zooming out\n");
15739         scale_factor = (range * 1.0)/distance;
15740 //                fprintf(stderr,"Scale Factor: %f\n", scale_factor);
15741         my_scale_y = (long)(scale_y * scale_factor);
15742       }
15743       else    // distance > range
15744       {
15745 //fprintf(stderr,"Zooming in\n");
15746         scale_factor = distance/(range * 1.0);
15747 //fprintf(stderr,"Scale Factor: %f\n", scale_factor);
15748         my_scale_y = (long)(scale_y / scale_factor);
15749       }
15750 
15751       if (my_scale_y < 1)
15752       {
15753         my_scale_y = 1;
15754       }
15755 
15756 //fprintf(stderr,"my_scale_y: %ld\n", my_scale_y);
15757 
15758       xastir_snprintf(temp,
15759                       sizeof(temp),
15760                       "%ld",
15761                       my_scale_y);
15762       XmTextFieldSetString(center_zoom_zoom_level, temp);
15763     }
15764     else
15765     {
15766       // Normal user-initiated center/zoom function
15767 
15768       // Snag the current lat/long/center values, convert them to
15769       // displayable values, and fill in the fields.
15770       xastir_snprintf(temp,
15771                       sizeof(temp),
15772                       "%f",
15773                       f_center_latitude);
15774       XmTextFieldSetString(center_zoom_latitude, temp);
15775 
15776       xastir_snprintf(temp,
15777                       sizeof(temp),
15778                       "%f",
15779                       f_center_longitude);
15780       XmTextFieldSetString(center_zoom_longitude, temp);
15781 
15782       xastir_snprintf(temp,
15783                       sizeof(temp),
15784                       "%ld",
15785                       scale_y);
15786       XmTextFieldSetString(center_zoom_zoom_level, temp);
15787     }
15788 
15789 
15790     XtManageChild(form);
15791     XtManageChild(pane);
15792 
15793     XtPopup(center_zoom_dialog,XtGrabNone);
15794     fix_dialog_size(center_zoom_dialog);
15795 
15796     // Move focus to the Close button.  This appears to
15797     // highlight the
15798     // button fine, but we're not able to hit the <Enter> key to
15799     // have that default function happen.  Note:  We _can_ hit
15800     // the
15801     // <SPACE> key, and that activates the option.
15802 //        XmUpdateDisplay(center_zoom_dialog);
15803     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
15804 
15805   }
15806   else
15807   {
15808     XtPopup(center_zoom_dialog,XtGrabNone);
15809     (void)XRaiseWindow(XtDisplay(center_zoom_dialog), XtWindow(center_zoom_dialog));
15810   }
15811 }
15812 
15813 
15814 
15815 
15816 
15817 void SetMyPosition( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15818 {
15819 
15820   Dimension width, height;
15821   long my_new_latl, my_new_lonl;
15822 
15823   // check for fixed station
15824   //if ( (output_station_type == 0) || (output_station_type > 3)) {
15825   //  popup_message( "Modify fixed position", "Are you sure you want to modify your position?");
15826   //}
15827   // check for position abiguity
15828   if ( position_amb_chars > 0 )   // popup warning that ambiguity is on
15829   {
15830     popup_message_always(langcode("POPUPMA043"), // "Modify ambiguous position"
15831                          langcode("POPUPMA044") );   // "Position abiguity is on, your new position may appear to jump."
15832   }
15833 
15834   if(display_up)
15835   {
15836     XtVaGetValues(da,XmNwidth, &width,XmNheight, &height, NULL);
15837     my_new_lonl = (center_longitude - ((width *scale_x)/2) + (menu_x*scale_x));
15838     my_new_latl = (center_latitude  - ((height*scale_y)/2) + (menu_y*scale_y));
15839     // Check if we are still on the planet...
15840     if ( my_new_latl > 64800000l  )
15841     {
15842       my_new_latl = 64800000l;
15843     }
15844     if ( my_new_latl < 0 )
15845     {
15846       my_new_latl = 0;
15847     }
15848     if ( my_new_lonl > 129600000l )
15849     {
15850       my_new_lonl = 129600000l;
15851     }
15852     if ( my_new_lonl < 0 )
15853     {
15854       my_new_lonl = 0;
15855     }
15856 
15857     convert_lon_l2s( my_new_lonl, my_long, sizeof(my_long), CONVERT_HP_NOSP);
15858     convert_lat_l2s( my_new_latl,  my_lat,  sizeof(my_lat),  CONVERT_HP_NOSP);
15859 
15860     // Update my station data with the new lat/lon
15861     my_station_add(my_callsign,my_group,my_symbol,my_long,my_lat,my_phg,my_comment,(char)position_amb_chars);
15862     redraw_on_new_data=2;
15863   }
15864 }
15865 
15866 
15867 
15868 
15869 
15870 void Window_Quit( Widget UNUSED(w), XtPointer UNUSED(client), XtPointer UNUSED(calldata) )
15871 {
15872   quit(0);
15873 }
15874 
15875 
15876 
15877 
15878 
15879 void Menu_Quit( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
15880 {
15881   quit(0);
15882 }
15883 
15884 
15885 
15886 
15887 
15888 void save_state( Widget UNUSED(w), XtPointer UNUSED(client), XtPointer calldata)
15889 {
15890   if (((XtCheckpointToken)calldata)->shutdown)
15891   {
15892     save_data();
15893 
15894     // shutdown all interfaces
15895     shutdown_all_active_or_defined_port(-1);
15896 
15897     shut_down_server();
15898   }
15899 
15900 }
15901 
15902 
15903 
15904 
15905 
15906 // Turn on or off map border, callback from map_border_button.
15907 void Map_border_toggle( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer callData)
15908 {
15909   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
15910 
15911   if(state->set)
15912   {
15913     draw_labeled_grid_border = TRUE;
15914   }
15915   else
15916   {
15917     draw_labeled_grid_border = FALSE;
15918   }
15919 
15920   redraw_symbols(da);
15921 }
15922 
15923 
15924 
15925 void Grid_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
15926 {
15927   char *which = (char *)clientData;
15928   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
15929 
15930   if(state->set)
15931   {
15932     long_lat_grid = atoi(which);
15933   }
15934   else
15935   {
15936     long_lat_grid = 0;
15937   }
15938 
15939   if (long_lat_grid)
15940   {
15941     statusline(langcode("BBARSTA005"),1);   // Map Lat/Long Grid On
15942     XtSetSensitive(map_border_button,TRUE);
15943   }
15944   else
15945   {
15946     statusline(langcode("BBARSTA006"),2);   // Map Lat/Long Grid Off
15947     XtSetSensitive(map_border_button,FALSE);
15948   }
15949 
15950   redraw_symbols(da);
15951   (void)XCopyArea(XtDisplay(da),
15952                   pixmap_final,
15953                   XtWindow(da),
15954                   gc,
15955                   0,
15956                   0,
15957                   (unsigned int)screen_width,
15958                   (unsigned int)screen_height,
15959                   0,
15960                   0);
15961 }
15962 
15963 
15964 
15965 
15966 // Callback from menu buttons that allow user to turn on or off the
15967 // global display of CAD objects and their metadata on the map.
15968 void  CAD_draw_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
15969 {
15970   char *which = (char *)clientData;
15971   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
15972 
15973   // turn on or off display of cad objects
15974   if (strcmp(which,"CAD_draw_objects")==0)
15975   {
15976     CAD_draw_objects = state->set;
15977   }
15978 
15979   // turn on or off display of standard metadata
15980   if (strcmp(which,"CAD_show_label")==0)
15981   {
15982     CAD_show_label = state->set;
15983   }
15984   if (strcmp(which,"CAD_show_raw_probability")==0)
15985   {
15986     CAD_show_raw_probability = state->set;
15987   }
15988   if (strcmp(which,"CAD_show_comment")==0)
15989   {
15990     CAD_show_comment = state->set;
15991   }
15992   if (strcmp(which,"CAD_show_area")==0)
15993   {
15994     CAD_show_area = state->set;
15995   }
15996 
15997   // redraw objects on the current base maps
15998   redraw_symbols(da);
15999 }
16000 
16001 
16002 
16003 
16004 
16005 void  Map_lock_pan_zoom_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
16006 {
16007   char *which = (char *)clientData;
16008   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
16009 
16010   if(state->set)
16011   {
16012     map_lock_pan_zoom = atoi(which);
16013     XtSetSensitive(zoom_in_menu, FALSE);
16014     XtSetSensitive(zoom_out_menu, FALSE);
16015     XtSetSensitive(pan_left_menu, FALSE);
16016     XtSetSensitive(pan_up_menu, FALSE);
16017     XtSetSensitive(pan_down_menu, FALSE);
16018     XtSetSensitive(pan_right_menu, FALSE);
16019   }
16020   else
16021   {
16022     map_lock_pan_zoom = 0;
16023     XtSetSensitive(zoom_in_menu, TRUE);
16024     XtSetSensitive(zoom_out_menu, TRUE);
16025     XtSetSensitive(pan_left_menu, TRUE);
16026     XtSetSensitive(pan_up_menu, TRUE);
16027     XtSetSensitive(pan_down_menu, TRUE);
16028     XtSetSensitive(pan_right_menu, TRUE);
16029   }
16030 }
16031 
16032 
16033 
16034 
16035 
16036 void  Map_disable_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
16037 {
16038   char *which = (char *)clientData;
16039   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
16040 
16041   if(state->set)
16042   {
16043     disable_all_maps = atoi(which);
16044   }
16045   else
16046   {
16047     disable_all_maps = 0;
16048   }
16049 
16050   request_new_image++;
16051 
16052 //    if (create_image(da)) {
16053 //        (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
16054 //    }
16055 }
16056 
16057 
16058 
16059 
16060 
16061 void  Map_auto_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
16062 {
16063   char *which = (char *)clientData;
16064   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
16065 
16066   if(state->set)
16067   {
16068     map_auto_maps = atoi(which);
16069     XtSetSensitive(map_auto_skip_raster_button,TRUE);
16070   }
16071   else
16072   {
16073     map_auto_maps = 0;
16074     XtSetSensitive(map_auto_skip_raster_button,FALSE);
16075   }
16076 
16077   re_sort_maps = 1;
16078 
16079   // Set interrupt_drawing_now because conditions have changed.
16080   interrupt_drawing_now++;
16081 
16082   // Request that a new image be created.  Calls create_image,
16083   // XCopyArea, and display_zoom_status.
16084   request_new_image++;
16085 
16086 //    if (create_image(da)) {
16087 //        (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
16088 //    }
16089 
16090   if (map_auto_maps)
16091   {
16092     statusline(langcode("BBARSTA007"),1);  // The use of Auto Maps is now on
16093   }
16094   else
16095   {
16096     statusline(langcode("BBARSTA008"),2);  // The use of Auto Maps is now off
16097   }
16098 }
16099 
16100 
16101 
16102 
16103 
16104 void  Map_auto_skip_raster_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
16105 {
16106   char *which = (char *)clientData;
16107   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
16108 
16109   if(state->set)
16110   {
16111     auto_maps_skip_raster = atoi(which);
16112   }
16113   else
16114   {
16115     auto_maps_skip_raster = 0;
16116   }
16117 
16118   re_sort_maps = 1;
16119 
16120   // Set interrupt_drawing_now because conditions have changed.
16121   interrupt_drawing_now++;
16122 
16123   // Request that a new image be created.  Calls create_image,
16124   // XCopyArea, and display_zoom_status.
16125   request_new_image++;
16126 
16127 //    if (create_image(da)) {
16128 //        (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
16129 //    }
16130 }
16131 
16132 
16133 
16134 
16135 
16136 void  Map_levels_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
16137 {
16138   char *which = (char *)clientData;
16139   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
16140 
16141   if(state->set)
16142   {
16143     map_color_levels = atoi(which);
16144   }
16145   else
16146   {
16147     map_color_levels = 0;
16148   }
16149 
16150   if (map_color_levels)
16151   {
16152     statusline(langcode("BBARSTA009"),1);  // The use of Auto Maps is now on
16153   }
16154   else
16155   {
16156     statusline(langcode("BBARSTA010"),2);  // The use of Auto Maps is now off
16157   }
16158 
16159   // Set interrupt_drawing_now because conditions have changed.
16160   interrupt_drawing_now++;
16161 
16162   // Request that a new image be created.  Calls create_image,
16163   // XCopyArea, and display_zoom_status.
16164   request_new_image++;
16165 
16166 //    if (create_image(da)) {
16167 //        (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
16168 //    }
16169 }
16170 
16171 
16172 
16173 
16174 
16175 void  Map_labels_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
16176 {
16177   char *which = (char *)clientData;
16178   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
16179 
16180   if(state->set)
16181   {
16182     map_labels = atoi(which);
16183   }
16184   else
16185   {
16186     map_labels = 0;
16187   }
16188 
16189   // Set interrupt_drawing_now because conditions have changed.
16190   interrupt_drawing_now++;
16191 
16192   // Request that a new image be created.  Calls create_image,
16193   // XCopyArea, and display_zoom_status.
16194   request_new_image++;
16195 
16196 //    if (create_image(da)) {
16197 //        (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
16198 //    }
16199 }
16200 
16201 
16202 
16203 
16204 
16205 void  Map_fill_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
16206 {
16207   char *which = (char *)clientData;
16208   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
16209 
16210   if(state->set)
16211   {
16212     map_color_fill = atoi(which);
16213   }
16214   else
16215   {
16216     map_color_fill = 0;
16217   }
16218 
16219   if (map_color_fill)
16220   {
16221     statusline(langcode("BBARSTA009"),1);  // The use of Map Color Fill is now On
16222   }
16223   else
16224   {
16225     statusline(langcode("BBARSTA010"),1);  // The use of Map Color Fill is now Off
16226   }
16227 
16228   // Set interrupt_drawing_now because conditions have changed.
16229   interrupt_drawing_now++;
16230 
16231   // Request that a new image be created.  Calls create_image,
16232   // XCopyArea, and display_zoom_status.
16233   request_new_image++;
16234 
16235 //    if (create_image(da)) {
16236 //        (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
16237 //    }
16238 }
16239 
16240 
16241 
16242 
16243 
16244 void Map_background( Widget UNUSED(w), XtPointer clientData, XtPointer UNUSED(calldata) )
16245 {
16246   int bgcolor;
16247   int i;
16248 
16249   bgcolor=atoi((char *)clientData);
16250 
16251   if(display_up)
16252   {
16253     for (i=0; i<12; i++)
16254     {
16255       if (i == bgcolor)
16256       {
16257         XtSetSensitive(map_bgcolor[i],FALSE);
16258       }
16259       else
16260       {
16261         XtSetSensitive(map_bgcolor[i],TRUE);
16262       }
16263     }
16264     map_background_color=bgcolor;
16265 
16266     // Set interrupt_drawing_now because conditions have changed.
16267     interrupt_drawing_now++;
16268 
16269     // Request that a new image be created.  Calls create_image,
16270     // XCopyArea, and display_zoom_status.
16271     request_new_image++;
16272 
16273 //        if (create_image(da)) {
16274 //            (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
16275 //        }
16276   }
16277 }
16278 
16279 
16280 
16281 
16282 
16283 #if !defined(NO_GRAPHICS)
16284 void Raster_intensity(Widget UNUSED(w), XtPointer clientData, XtPointer UNUSED(calldata) )
16285 {
16286   float my_intensity;
16287   int i;
16288 
16289   my_intensity=atof((char *)clientData);
16290 
16291   if(display_up)
16292   {
16293     for (i=0; i<11; i++)
16294     {
16295       if (i == (int)((float)(my_intensity * 10.01)) )
16296       {
16297         XtSetSensitive(raster_intensity[i],FALSE);
16298       }
16299       else
16300       {
16301         XtSetSensitive(raster_intensity[i],TRUE);
16302       }
16303 
16304       //fprintf(stderr,"Change to index: %d\n", (int)((float)(my_intensity * 10.01)));
16305     }
16306 
16307     raster_map_intensity=my_intensity;
16308     //fprintf(stderr,"raster_map_intensity = %f\n", raster_map_intensity);
16309 
16310     // Set interrupt_drawing_now because conditions have changed.
16311     interrupt_drawing_now++;
16312 
16313     // Request that a new image be created.  Calls create_image,
16314     // XCopyArea, and display_zoom_status.
16315     request_new_image++;
16316 
16317 //        if (create_image(da)) {
16318 //            XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
16319 //        }
16320   }
16321 }
16322 #endif  // NO_GRAPHICS
16323 
16324 
16325 
16326 
16327 
16328 void Map_station_label( Widget UNUSED(w), XtPointer clientData, XtPointer UNUSED(calldata) )
16329 {
16330   int style;
16331 
16332   style=atoi((char *)clientData);
16333 
16334   if(display_up)
16335   {
16336     letter_style = style;
16337     sel4_switch(letter_style,map_station_label3,map_station_label2,map_station_label1,map_station_label0);
16338     redraw_symbols(da);
16339     (void)XCopyArea(XtDisplay(da),
16340                     pixmap_final,
16341                     XtWindow(da),
16342                     gc,
16343                     0,
16344                     0,
16345                     (unsigned int)screen_width,
16346                     (unsigned int)screen_height,
16347                     0,
16348                     0);
16349   }
16350 }
16351 
16352 
16353 
16354 
16355 
16356 void Map_icon_outline( Widget UNUSED(w), XtPointer clientData, XtPointer UNUSED(calldata) )
16357 {
16358   int style;
16359 
16360   style=atoi((char *)clientData);
16361 
16362   if(display_up)
16363   {
16364     icon_outline_style = style;
16365     sel4_switch(icon_outline_style,map_icon_outline3,map_icon_outline2,map_icon_outline1,map_icon_outline0);
16366     redraw_symbols(da);
16367     (void)XCopyArea(XtDisplay(da),
16368                     pixmap_final,
16369                     XtWindow(da),
16370                     gc,
16371                     0,
16372                     0,
16373                     (unsigned int)screen_width,
16374                     (unsigned int)screen_height,
16375                     0,
16376                     0);
16377   }
16378   statusline( langcode("BBARSTA046"), 1);   // Reloading symbols...
16379   load_pixmap_symbol_file("symbols.dat", 1);
16380   redraw_symbols(da);
16381   (void)XCopyArea(XtDisplay(da),
16382                   pixmap_final,
16383                   XtWindow(da),
16384                   gc,
16385                   0,
16386                   0,
16387                   (unsigned int)screen_width,
16388                   (unsigned int)screen_height,
16389                   0,
16390                   0);
16391 }
16392 
16393 
16394 
16395 
16396 
16397 void  Map_wx_alerts_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
16398 {
16399   char *which = (char *)clientData;
16400   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
16401 
16402   if(state->set)
16403   {
16404     wx_alert_style = !(atoi(which));
16405   }
16406   else
16407   {
16408     wx_alert_style = 1;
16409   }
16410 
16411   if (display_up)
16412   {
16413     refresh_image(da);
16414     (void)XCopyArea(XtDisplay(da),
16415                     pixmap_final,
16416                     XtWindow(da),
16417                     gc,
16418                     0,
16419                     0,
16420                     (unsigned int)screen_width,
16421                     (unsigned int)screen_height,
16422                     0,
16423                     0);
16424   }
16425 }
16426 
16427 
16428 
16429 
16430 
16431 void  Index_maps_on_startup_toggle( Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer callData)
16432 {
16433   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
16434 
16435   if(state->set)
16436   {
16437     index_maps_on_startup = 1;
16438   }
16439   else
16440   {
16441     index_maps_on_startup = 0;
16442   }
16443 }
16444 
16445 
16446 
16447 
16448 
16449 void TNC_Transmit_now( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(calldata) )
16450 {
16451   transmit_now = 1;              /* toggle transmission of station now*/
16452 }
16453 
16454 
16455 
16456 
16457 
16458 /////////////////////////////////////////////////////////////////////
16459 // GPS operations
16460 /////////////////////////////////////////////////////////////////////
16461 
16462 
16463 
16464 
16465 
16466 #ifdef HAVE_GPSMAN
16467 
16468 // Function to process the RINO.gpstrans file.  We'll create APRS
16469 // objects out of them as if our own callsign created them.  Lines
16470 // in the file look like this (spaces removed):
16471 //
16472 // W  N3EG3  20-JUN-02 17:55  07/08/2004 13:03:29  46.1141682  -122.9384817
16473 // W  N3JGI  20-JUN-02 18:29  07/08/2004 13:03:29  48.0021644  -116.0118324
16474 //
16475 // Fields are:
16476 // W  name   Comment          Date/Time            Latitude    Longitude
16477 //
16478 void process_RINO_waypoints(void)
16479 {
16480   FILE *f;
16481   char temp[MAX_FILENAME * 2];
16482   char line[301];
16483 //  float UTC_Offset;
16484   char temp_file_name[MAX_VALUE];
16485 
16486 //    char datum[50];
16487 
16488 
16489   // Just to be safe
16490   line[300] = '\0';
16491 
16492   // Create the full path/filename
16493   xastir_snprintf(temp,
16494                   sizeof(temp),
16495                   "%s/RINO.gpstrans",
16496                   get_user_base_dir("gps", temp_file_name, sizeof(temp_file_name)));
16497 
16498   f=fopen(temp,"r"); // Open for reading
16499 
16500   if (f == NULL)
16501   {
16502     fprintf(stderr,
16503             "Couldn't open %s file for reading\n",
16504             temp);
16505     return;
16506   }
16507 
16508   // Process the file line-by-line here.  The format for gpstrans
16509   // files as written by GPSMan appears to be:
16510   //
16511   //   "W"
16512   //   Waypoint name
16513   //   Comment field (Date/Time is default on Garmins)
16514   //   Date/Time
16515   //   Decimal latitude
16516   //   Decimal longitude
16517   //
16518   while (fgets(line, 300, f) != NULL)
16519   {
16520 
16521     // Snag the "Format:" line at the top of the file:
16522     // Format: DDD  UTC Offset:  -8.00 hrs  Datum[100]: WGS 84
16523     //
16524     if (strncmp(line,"Format:",7) == 0)
16525     {
16526       int i = 7;
16527       char temp2[50];
16528 
16529 
16530       // Find the ':' after "UTC Offset"
16531       while (line[i] != ':'
16532              && line[i] != '\0'
16533              && line[i] != '\n'
16534              && line[i] != '\r')
16535       {
16536         i++;
16537       }
16538       i++;
16539 
16540       // Skip white space
16541       while (line[i] == ' '
16542              && line[i] != '\0'
16543              && line[i] != '\n'
16544              && line[i] != '\r')
16545       {
16546         i++;
16547       }
16548 
16549       // Copy UTC offset chars into temp2
16550       temp2[0] = '\0';
16551       while (line[i] != '\t'
16552              && line[i] != ' '
16553              && line[i] != '\0'
16554              && line[i] != '\n'
16555              && line[i] != '\r')
16556       {
16557         strncat(temp2,&line[i],1);
16558         i++;
16559       }
16560 
16561 //            UTC_Offset = atof(temp2);
16562 //fprintf(stderr,"UTC Offset: %f\n", UTC_Offset);
16563 
16564 // NOTE:  This would be the place to snag the datum as well.
16565 
16566     }
16567 
16568     // Check for a waypoint entry
16569     else if (line[0] == 'W')
16570     {
16571       char name[50];
16572       char datetime[50];
16573       char lat_c[20];
16574       char lon_c[20];
16575       int i = 1;
16576 
16577 
16578 // NOTE:  We should check for the end of the string, skipping this
16579 // iteration of the loop if we haven't parsed enough fields.
16580 
16581       // Find non-white-space character
16582       while ((line[i] == '\t' || line[i] == ' ')
16583              && line[i] != '\0'
16584              && line[i] != '\n'
16585              && line[i] != '\r')
16586       {
16587         i++;
16588       }
16589 
16590       // Copy into name until tab or whitespace char.  We're
16591       // assuming that a waypoint name can't have spaces in
16592       // it.
16593       name[0] = '\0';
16594       while (line[i] != '\t'
16595              && line[i] != ' '
16596              && line[i] != '\0'
16597              && line[i] != '\n'
16598              && line[i] != '\r')
16599       {
16600         strncat(name,&line[i],1);
16601         i++;
16602       }
16603 
16604       // Find tab character at end of name field
16605       while (line[i] != '\t'
16606              && line[i] != '\0'
16607              && line[i] != '\n'
16608              && line[i] != '\r')
16609       {
16610         i++;
16611       }
16612       i++;
16613 
16614       // We skip the comment field, doing nothing with the
16615       // data.
16616       //
16617       // Find tab character at end of comment field
16618       while (line[i] != '\t'
16619              && line[i] != '\0'
16620              && line[i] != '\n'
16621              && line[i] != '\r')
16622       {
16623         i++;
16624       }
16625       i++;
16626 
16627       // Find non-white-space character
16628       while ((line[i] == '\t' || line[i] == ' ')
16629              && line[i] != '\0'
16630              && line[i] != '\n'
16631              && line[i] != '\r')
16632       {
16633         i++;
16634       }
16635 
16636 // Snag date/time.  Use it in the object date/time field.
16637       // Copy into datetime until tab char.  Include the space
16638       // between the time and date portions.
16639       datetime[0] = '\0';
16640       while (line[i] != '\t'
16641              && line[i] != '\0'
16642              && line[i] != '\n'
16643              && line[i] != '\r')
16644       {
16645         strncat(datetime,&line[i],1);
16646         i++;
16647       }
16648 
16649       // Find tab character at end of date/time field
16650       while (line[i] != '\t'
16651              && line[i] != '\0'
16652              && line[i] != '\n'
16653              && line[i] != '\r')
16654       {
16655         i++;
16656       }
16657       i++;
16658 
16659       // Find non-white-space character
16660       while ((line[i] == '\t' || line[i] == ' ')
16661              && line[i] != '\0'
16662              && line[i] != '\n'
16663              && line[i] != '\r')
16664       {
16665         i++;
16666       }
16667 
16668       // Copy into lat_c until white space char
16669       lat_c[0] = '\0';
16670       while (line[i] != '\t'
16671              && line[i] != ' '
16672              && line[i] != '\0'
16673              && line[i] != '\n'
16674              && line[i] != '\r')
16675       {
16676         strncat(lat_c,&line[i],1);
16677         i++;
16678       }
16679 
16680       // Find non-white-space character
16681       while ((line[i] == '\t' || line[i] == ' ')
16682              && line[i] != '\0'
16683              && line[i] != '\n'
16684              && line[i] != '\r')
16685       {
16686         i++;
16687       }
16688 
16689       // Copy into lon_c until tab character
16690       lon_c[0] = '\0';
16691       while (line[i] != '\t'
16692              && line[i] != ' '
16693              && line[i] != '\0'
16694              && line[i] != '\n'
16695              && line[i] != '\r')
16696       {
16697         strncat(lon_c,&line[i],1);
16698         i++;
16699       }
16700       i++;
16701 
16702       /*
16703                   fprintf(stderr,
16704                       "%s\t%f\t%f\n",
16705                       name,
16706                       atof(lat_c),
16707                       atof(lon_c));
16708       */
16709 
16710 
16711 // For now we're hard-coding the RINO group to "APRS".  Any RINO
16712 // waypoints that begin with these four characters will have those
16713 // four characters chopped and will be turned into our own APRS
16714 // object, which we will then attempt to transmit.
16715 
16716       if (strncmp(name,"APRS",4) == 0)
16717       {
16718         // We have a match.  Turn this into an APRS Object
16719         char line2[100];
16720         int lat_deg, lon_deg;
16721         float lat_min, lon_min;
16722         char lat_dir, lon_dir;
16723         char temp2[50];
16724         int date;
16725         int hour;
16726         int minute;
16727 // Three variables used for Base-91 compressed strings.  We have a
16728 // bug in this code at the moment so the Base-91 compressed code in
16729 // this routine is commented out.
16730 //                char *compressed_string;
16731 //                char lat_s[50];
16732 //                char lon_s[50];
16733 
16734 
16735         // Strip off the "APRS" at the beginning of the
16736         // name.  Add spaces to flush out the length of an
16737         // APRS object name.
16738         strcpy(temp2, &name[4]);
16739         temp2[sizeof(temp2)-1] = '\0';  // Terminate string
16740         strcat(temp2, "         ");
16741         temp2[sizeof(temp2)-1] = '\0';  // Terminate string
16742 
16743         // Copy it back to the "name" variable.
16744         xastir_snprintf(name,
16745                         sizeof(name),
16746                         "%s",
16747                         temp2);
16748 
16749         // Truncate the name at nine characters.
16750         name[9] = '\0';
16751 
16752         // We can either snag the UTC Offset from the top of
16753         // the file, or we can put the date/time format into
16754         // local time.  The spec suggests using zulu time
16755         // for all future implementations, so we snagged the
16756         // UTC Offset earlier in this routine.
16757 
16758         // 07/09/2004 09:22:28
16759 //fprintf(stderr,"%s %s", name, datetime);
16760 
16761         xastir_snprintf(temp2,
16762                         sizeof(temp2),
16763                         "%s",
16764                         &datetime[3]);
16765         temp2[2] = '\0';
16766         date = atoi(temp2);
16767 //fprintf(stderr, "%02d\n", date);
16768 
16769         xastir_snprintf(temp2,
16770                         sizeof(temp2),
16771                         "%s",
16772                         &datetime[11]);
16773         temp2[2] = '\0';
16774         hour = atoi(temp2);
16775 
16776         xastir_snprintf(temp2,
16777                         sizeof(temp2),
16778                         "%s",
16779                         &datetime[14]);
16780         temp2[2] = '\0';
16781         minute = atoi(temp2);
16782 //fprintf(stderr,"\t\t%02d%02d%02d/\n", date, hour, minute);
16783 
16784         // We need to remember to bump the date up if we go
16785         // past midnight adding the UTC offset.  In that
16786         // case we may need to bump the day as well if we're
16787         // near the end of the month.  Use the Unix time
16788         // facilities for this?
16789 
16790         // Here we're assuming that the UTC offset is
16791         // divisible by one hour.  Always correct?
16792 
16793 //                hour = (int)(hour - UTC_Offset);
16794 
16795 
16796         lat_deg = atoi(lat_c);
16797         if (lat_deg < 0)
16798         {
16799           lat_deg = -lat_deg;
16800         }
16801 
16802         lon_deg = atoi(lon_c);
16803         if (lon_deg < 0)
16804         {
16805           lon_deg = -lon_deg;
16806         }
16807 
16808         lat_min = atof(lat_c);
16809         if (lat_min < 0.0)
16810         {
16811           lat_min = -lat_min;
16812         }
16813         lat_min = (lat_min - lat_deg) * 60.0;
16814 
16815         lon_min = atof(lon_c);
16816         if (lon_min < 0.0)
16817         {
16818           lon_min = -lon_min;
16819         }
16820         lon_min = (lon_min - lon_deg) * 60.0;
16821 
16822         if (lat_c[0] == '-')
16823         {
16824           lat_dir = 'S';
16825         }
16826         else
16827         {
16828           lat_dir = 'N';
16829         }
16830 
16831         if (lon_c[0] == '-')
16832         {
16833           lon_dir = 'W';
16834         }
16835         else
16836         {
16837           lon_dir = 'E';
16838         }
16839 
16840         // Non-Compressed version
16841         xastir_snprintf(line2,
16842                         sizeof(line2),
16843                         ";%-9s*%02d%02d%02d/%02d%05.2f%c%c%03d%05.2f%c%c",
16844                         name,
16845                         date,
16846                         hour,
16847                         minute,
16848                         lat_deg,    // Degrees
16849                         lat_min,    // Minutes
16850                         lat_dir,    // N/S
16851                         '/',        // Primary symbol table
16852                         lon_deg,    // Degrees
16853                         lon_min,    // Minutes
16854                         lon_dir,    // E/W
16855                         '[');       // Hiker symbol
16856 
16857         /*
16858                         // Compressed version.  Gives us more of the
16859                         // resolution inherent in the RINO waypoints.
16860                         // Doesn't have an affect on whether we transmit
16861                         // compressed objects from Xastir over RF.  That is
16862                         // selected from the File->Configure->Defaults
16863                         // dialog.
16864                         //
16865                         // compress_posit expects its lat/long in //
16866                         // APRS-like format:
16867                         // "%2d%lf%c", &deg, &minutes, &ext
16868 
16869                         xastir_snprintf(lat_s,
16870                             sizeof(lat_s),
16871                             "%02d%8.5f%c",
16872                             lat_deg,
16873                             lat_min,
16874                             lat_dir);
16875 
16876                         xastir_snprintf(lon_s,
16877                             sizeof(lon_s),
16878                             "%02d%8.5f%c",
16879                             lon_deg,
16880                             lon_min,
16881                             lon_dir);
16882 
16883                         compressed_string = compress_posit(lat_s,
16884                             '/',    // group character
16885                             lon_s,
16886                             '[',    // symbol,
16887                             0,      // course,
16888                             0,      // speed,
16889                             "");    // phg
16890 
16891         //fprintf(stderr, "compressed: %s\n", compressed_string);
16892 
16893                         xastir_snprintf(line2,
16894                             sizeof(line2),
16895                             ";%-9s*%02d%02d%02d/%s",
16896                             name,
16897                             date,
16898                             hour,
16899                             minute,
16900                             compressed_string);
16901         */
16902 
16903         /*
16904                         fprintf(stderr,
16905                             "%-9s\t%f\t%f\t\t\t\t\t\t",
16906                             name,
16907                             atof(lat_c),
16908                             atof(lon_c));
16909                         fprintf(stderr,"%s\n",line2);
16910         */
16911 
16912         // Update this object in our save file
16913         log_object_item(line2,0,name);
16914 
16915         if (object_tx_disable)
16916         {
16917           output_my_data(line2,-1,0,1,0,NULL);  // Local loopback only, not igating
16918         }
16919         else
16920         {
16921           output_my_data(line2,-1,0,0,0,NULL);  // Transmit/loopback object data, not igating
16922         }
16923       }
16924     }
16925   }
16926 
16927 //fprintf(stderr,"\n");
16928 
16929   (void)fclose(f);
16930 }
16931 
16932 
16933 
16934 
16935 
16936 void GPS_operations_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
16937 {
16938   Widget shell = (Widget) clientData;
16939   XtPopdown(shell);
16940   XtDestroyWidget(shell);
16941   GPS_operations_dialog = (Widget)NULL;
16942 }
16943 
16944 
16945 
16946 
16947 
16948 // Set up gps_map_filename based on user preferences for filename
16949 // and map color.
16950 void GPS_operations_change_data(Widget widget, XtPointer clientData, XtPointer callData)
16951 {
16952   char *temp;
16953   char short_filename[MAX_FILENAME];
16954   char color_text[50];
16955 
16956 
16957   temp = XmTextGetString(gpsfilename_text);
16958   xastir_snprintf(short_filename,
16959                   sizeof(short_filename),
16960                   "%s",
16961                   temp);
16962   XtFree(temp);
16963 
16964   // Add date/time to filename if no filename is given
16965   if (strlen(short_filename) == 0)
16966   {
16967     int ii;
16968 
16969     // Compute the date/time and put in string
16970     get_timestamp(short_filename);
16971 
16972     // Change spaces to underlines
16973     // Wed Mar  5 15:24:48 PST 2003
16974     for (ii = 0; ii < (int)strlen(short_filename); ii++)
16975     {
16976       if (short_filename[ii] == ' ')
16977       {
16978         short_filename[ii] = '_';
16979       }
16980     }
16981   }
16982 
16983   (void)remove_trailing_spaces(short_filename);
16984 
16985   switch (gps_map_color)
16986   {
16987     case 0:
16988     {
16989       xastir_snprintf(color_text,sizeof(color_text),"Red");
16990       gps_map_color_offset=0x0c;
16991       break;
16992     }
16993     case 1:
16994     {
16995       xastir_snprintf(color_text,sizeof(color_text),"Green");
16996       gps_map_color_offset=0x23;
16997       break;
16998     }
16999     case 2:
17000     {
17001       xastir_snprintf(color_text,sizeof(color_text),"Black");
17002       gps_map_color_offset=0x08;
17003       break;
17004     }
17005     case 3:
17006     {
17007       xastir_snprintf(color_text,sizeof(color_text),"White");
17008       gps_map_color_offset=0x0f;
17009       break;
17010     }
17011     case 4:
17012     {
17013       xastir_snprintf(color_text,sizeof(color_text),"Orange");
17014       gps_map_color_offset=0x62;
17015       break;
17016     }
17017     case 5:
17018     {
17019       xastir_snprintf(color_text,sizeof(color_text),"Blue");
17020       gps_map_color_offset=0x03;
17021       break;
17022     }
17023     case 6:
17024     {
17025       xastir_snprintf(color_text,sizeof(color_text),"Yellow");
17026       gps_map_color_offset=0x0e;
17027       break;
17028     }
17029     case 7:
17030     {
17031       xastir_snprintf(color_text,sizeof(color_text),"Purple");
17032       gps_map_color_offset=0x0b;
17033       break;
17034     }
17035     default:
17036     {
17037       xastir_snprintf(color_text,sizeof(color_text),"Red");
17038       gps_map_color_offset=0x0c;
17039       break;
17040     }
17041   }
17042 
17043   // If doing waypoints, don't add the color onto the end
17044   if (strcmp("Waypoints",gps_map_type) == 0)
17045   {
17046     strcpy(gps_map_filename, short_filename);
17047     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17048     strcat(gps_map_filename, "_");
17049     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17050     strcat(gps_map_filename, gps_map_type);
17051     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17052     strcat(gps_map_filename, ".shp");
17053     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17054 
17055     // Same without ".shp"
17056     strcpy(gps_map_filename_base, short_filename);
17057     gps_map_filename_base[sizeof(gps_map_filename_base)-1] = '\0';  // Terminate string
17058     strcat(gps_map_filename_base, "_");
17059     gps_map_filename_base[sizeof(gps_map_filename_base)-1] = '\0';  // Terminate string
17060     strcat(gps_map_filename_base, gps_map_type);
17061     gps_map_filename_base[sizeof(gps_map_filename_base)-1] = '\0';  // Terminate string
17062   }
17063   else    // Doing Tracks/Routes
17064   {
17065     strcpy(gps_map_filename, short_filename);
17066     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17067     strcat(gps_map_filename, "_");
17068     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17069     strcat(gps_map_filename, gps_map_type);
17070     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17071     strcat(gps_map_filename, "_");
17072     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17073     strcat(gps_map_filename, color_text);
17074     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17075     strcat(gps_map_filename, ".shp");
17076     gps_map_filename[sizeof(gps_map_filename)-1] = '\0';  // Terminate string
17077 
17078     // Same without ".shp"
17079     strcpy(gps_map_filename_base, short_filename);
17080     gps_map_filename_base[sizeof(gps_map_filename_base)-1] = '\0';  // Terminate string
17081     strcat(gps_map_filename_base, "_");
17082     gps_map_filename_base[sizeof(gps_map_filename_base)-1] = '\0';  // Terminate string
17083     strcat(gps_map_filename_base, gps_map_type);
17084     gps_map_filename_base[sizeof(gps_map_filename_base)-1] = '\0';  // Terminate string
17085     strcat(gps_map_filename_base, "_");
17086     gps_map_filename_base[sizeof(gps_map_filename_base)-1] = '\0';  // Terminate string
17087     strcat(gps_map_filename_base, color_text);
17088     gps_map_filename_base[sizeof(gps_map_filename_base)-1] = '\0';  // Terminate string
17089 
17090     // Same without ".shp" *or* color
17091     strcpy(gps_map_filename_base2, short_filename);
17092     gps_map_filename_base2[sizeof(gps_map_filename_base2)-1] = '\0';  // Terminate string
17093     strcat(gps_map_filename_base2, "_");
17094     gps_map_filename_base2[sizeof(gps_map_filename_base2)-1] = '\0';  // Terminate string
17095     strcat(gps_map_filename_base2, gps_map_type);
17096     gps_map_filename_base2[sizeof(gps_map_filename_base2)-1] = '\0';  // Terminate string
17097   }
17098 
17099 //fprintf(stderr,"%s\t%s\n",gps_map_filename,gps_map_filename_base);
17100 
17101   // Signify that the user has selected the filename and color for
17102   // the downloaded file.
17103   gps_details_selected++;
17104 
17105   GPS_operations_destroy_shell(widget,clientData,callData);
17106 }
17107 
17108 
17109 
17110 
17111 
17112 void GPS_operations_cancel(Widget widget, XtPointer clientData, XtPointer callData)
17113 {
17114 
17115   // Destroy the GPS selection dialog
17116   GPS_operations_destroy_shell(widget,clientData,callData);
17117 
17118   // Wait for the GPS operation to be finished, then clear out all
17119   // of the variables.
17120   while (!gps_got_data_from && gps_operation_pending)
17121   {
17122     usleep(1000000);    // 1 second
17123   }
17124 
17125   gps_details_selected = 0;
17126   gps_got_data_from = 0;
17127   gps_operation_pending = 0;
17128 }
17129 
17130 
17131 
17132 
17133 
17134 void  GPS_operations_color_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
17135 {
17136   char *which = (char *)clientData;
17137   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
17138 
17139   if(state->set)
17140   {
17141     gps_map_color = atoi(which);
17142   }
17143   else
17144   {
17145     gps_map_color = 0;
17146   }
17147 }
17148 
17149 
17150 
17151 
17152 
17153 // This routine should be called while the transfer is progressing,
17154 // or perhaps just after it ends.  If we can do it while the
17155 // transfer is ocurring we can save time overall.  Here we'll select
17156 // the color and name for the resulting file, then cause it to be
17157 // selected and displayed on the map screen.
17158 //
17159 void GPS_transfer_select( void )
17160 {
17161   static Widget pane, scrollwindow, my_form, button_select, button_cancel,
17162          frame,  type_box, ctyp0, ctyp1,
17163          ctyp2, ctyp3, ctyp4, ctyp5, ctyp6, ctyp7,
17164          gpsfilename_label;
17165 //  static Widget color_type;
17166   Atom delw;
17167   Arg al[50];                      // Arg List
17168   register unsigned int ac = 0;   // Arg Count
17169 
17170 
17171   if (!GPS_operations_dialog)
17172   {
17173 
17174     // Set args for color
17175     ac = 0;
17176     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
17177     ac++;
17178     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
17179     ac++;
17180     XtSetArg(al[ac], XmNfontList, fontlist1);
17181     ac++;
17182 
17183     GPS_operations_dialog = XtVaCreatePopupShell(
17184                               langcode("GPS001"),
17185                               xmDialogShellWidgetClass, appshell,
17186                               XmNdeleteResponse, XmDESTROY,
17187                               XmNdefaultPosition, FALSE,
17188                               XmNfontList, fontlist1,
17189                               NULL);
17190 
17191     pane = XtVaCreateWidget(
17192              "GPS_transfer_select pane",
17193              xmPanedWindowWidgetClass,
17194              GPS_operations_dialog,
17195              MY_FOREGROUND_COLOR,
17196              MY_BACKGROUND_COLOR,
17197              NULL);
17198 
17199     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
17200                                            xmScrolledWindowWidgetClass,
17201                                            pane,
17202                                            XmNscrollingPolicy, XmAUTOMATIC,
17203                                            NULL);
17204 
17205     my_form =  XtVaCreateWidget(
17206                  "GPS_transfer_select my_form",
17207                  xmFormWidgetClass,
17208                  scrollwindow,
17209                  XmNfractionBase, 5,
17210                  XmNautoUnmanage, FALSE,
17211                  XmNshadowThickness, 1,
17212                  MY_FOREGROUND_COLOR,
17213                  MY_BACKGROUND_COLOR,
17214                  NULL);
17215 
17216 
17217     gpsfilename_label = XtVaCreateManagedWidget(    // Filename
17218                           langcode("GPS002"),
17219                           xmLabelWidgetClass,
17220                           my_form,
17221                           XmNchildType, XmFRAME_TITLE_CHILD,
17222                           MY_FOREGROUND_COLOR,
17223                           MY_BACKGROUND_COLOR,
17224                           XmNfontList, fontlist1,
17225                           NULL);
17226 
17227     gpsfilename_text = XtVaCreateManagedWidget(
17228                          "GPS_transfer_select gpsfilename_text",
17229                          xmTextWidgetClass,
17230                          my_form,
17231                          XmNeditable,   TRUE,
17232                          XmNcursorPositionVisible, TRUE,
17233                          XmNsensitive, TRUE,
17234                          XmNshadowThickness,    1,
17235                          XmNcolumns, 20,
17236                          XmNwidth, ((20*7)+2),
17237                          XmNmaxLength, 200,
17238                          XmNbackground, colors[0x0f],
17239                          XmNtopAttachment,XmATTACH_FORM,
17240                          XmNbottomAttachment,XmATTACH_NONE,
17241                          XmNleftAttachment, XmATTACH_WIDGET,
17242                          XmNleftWidget, gpsfilename_label,
17243                          XmNleftOffset, 10,
17244                          XmNrightAttachment,XmATTACH_NONE,
17245                          XmNrightOffset, 10,
17246                          XmNnavigationType, XmTAB_GROUP,
17247                          XmNfontList, fontlist1,
17248                          NULL);
17249 
17250     frame = XtVaCreateManagedWidget(
17251               "GPS_transfer_select frame",
17252               xmFrameWidgetClass,
17253               my_form,
17254               XmNtopAttachment,XmATTACH_WIDGET,
17255               XmNtopWidget, gpsfilename_label,
17256               XmNtopOffset,15,
17257               XmNbottomAttachment,XmATTACH_NONE,
17258               XmNleftAttachment, XmATTACH_FORM,
17259               XmNleftOffset, 10,
17260               XmNrightAttachment,XmATTACH_FORM,
17261               XmNrightOffset, 10,
17262               MY_FOREGROUND_COLOR,
17263               MY_BACKGROUND_COLOR,
17264               XmNfontList, fontlist1,
17265               NULL);
17266 
17267     //color_type
17268     XtVaCreateManagedWidget(  // Select Color
17269       langcode("GPS003"),
17270       xmLabelWidgetClass,
17271       frame,
17272       XmNchildType, XmFRAME_TITLE_CHILD,
17273       MY_FOREGROUND_COLOR,
17274       MY_BACKGROUND_COLOR,
17275       XmNfontList, fontlist1,
17276       NULL);
17277 
17278     type_box = XmCreateRadioBox(
17279                  frame,
17280                  "GPS_transfer_select Transmit Options box",
17281                  al,
17282                  ac);
17283 
17284     XtVaSetValues(type_box,
17285                   XmNnumColumns,2,
17286                   NULL);
17287 
17288     ctyp0 = XtVaCreateManagedWidget(    // Red
17289               langcode("GPS004"),
17290               xmToggleButtonGadgetClass,
17291               type_box,
17292               MY_FOREGROUND_COLOR,
17293               MY_BACKGROUND_COLOR,
17294               XmNfontList, fontlist1,
17295               NULL);
17296     XtAddCallback(ctyp0,XmNvalueChangedCallback,GPS_operations_color_toggle,"0");
17297 
17298     ctyp1 = XtVaCreateManagedWidget(    // Green
17299               langcode("GPS005"),
17300               xmToggleButtonGadgetClass,
17301               type_box,
17302               MY_FOREGROUND_COLOR,
17303               MY_BACKGROUND_COLOR,
17304               XmNfontList, fontlist1,
17305               NULL);
17306     XtAddCallback(ctyp1,XmNvalueChangedCallback,GPS_operations_color_toggle,"1");
17307 
17308     ctyp2 = XtVaCreateManagedWidget(    // Black
17309               langcode("GPS006"),
17310               xmToggleButtonGadgetClass,
17311               type_box,
17312               MY_FOREGROUND_COLOR,
17313               MY_BACKGROUND_COLOR,
17314               XmNfontList, fontlist1,
17315               NULL);
17316     XtAddCallback(ctyp2,XmNvalueChangedCallback,GPS_operations_color_toggle,"2");
17317 
17318     ctyp3 = XtVaCreateManagedWidget(    // White
17319               langcode("GPS007"),
17320               xmToggleButtonGadgetClass,
17321               type_box,
17322               MY_FOREGROUND_COLOR,
17323               MY_BACKGROUND_COLOR,
17324               XmNfontList, fontlist1,
17325               NULL);
17326     XtAddCallback(ctyp3,XmNvalueChangedCallback,GPS_operations_color_toggle,"3");
17327 
17328     ctyp4 = XtVaCreateManagedWidget(    // Orange
17329               langcode("GPS008"),
17330               xmToggleButtonGadgetClass,
17331               type_box,
17332               MY_FOREGROUND_COLOR,
17333               MY_BACKGROUND_COLOR,
17334               XmNfontList, fontlist1,
17335               NULL);
17336     XtAddCallback(ctyp4,XmNvalueChangedCallback,GPS_operations_color_toggle,"4");
17337 
17338     ctyp5 = XtVaCreateManagedWidget(    // Blue
17339               langcode("GPS009"),
17340               xmToggleButtonGadgetClass,
17341               type_box,
17342               MY_FOREGROUND_COLOR,
17343               MY_BACKGROUND_COLOR,
17344               XmNfontList, fontlist1,
17345               NULL);
17346     XtAddCallback(ctyp5,XmNvalueChangedCallback,GPS_operations_color_toggle,"5");
17347 
17348     ctyp6 = XtVaCreateManagedWidget(    // Yellow
17349               langcode("GPS010"),
17350               xmToggleButtonGadgetClass,
17351               type_box,
17352               MY_FOREGROUND_COLOR,
17353               MY_BACKGROUND_COLOR,
17354               XmNfontList, fontlist1,
17355               NULL);
17356     XtAddCallback(ctyp6,XmNvalueChangedCallback,GPS_operations_color_toggle,"6");
17357 
17358     ctyp7 = XtVaCreateManagedWidget(    // Violet
17359               langcode("GPS011"),
17360               xmToggleButtonGadgetClass,
17361               type_box,
17362               MY_FOREGROUND_COLOR,
17363               MY_BACKGROUND_COLOR,
17364               XmNfontList, fontlist1,
17365               NULL);
17366     XtAddCallback(ctyp7,XmNvalueChangedCallback,GPS_operations_color_toggle,"7");
17367 
17368 
17369     button_select = XtVaCreateManagedWidget(
17370                       langcode("WPUPCFS028"),
17371                       xmPushButtonGadgetClass,
17372                       my_form,
17373                       XmNtopAttachment, XmATTACH_WIDGET,
17374                       XmNtopWidget, frame,
17375                       XmNtopOffset, 10,
17376                       XmNbottomAttachment, XmATTACH_FORM,
17377                       XmNbottomOffset, 5,
17378                       XmNleftAttachment, XmATTACH_POSITION,
17379                       XmNleftPosition, 1,
17380                       XmNrightAttachment, XmATTACH_POSITION,
17381                       XmNrightPosition, 2,
17382                       XmNnavigationType, XmTAB_GROUP,
17383                       MY_FOREGROUND_COLOR,
17384                       MY_BACKGROUND_COLOR,
17385                       XmNfontList, fontlist1,
17386                       NULL);
17387 
17388 
17389     button_cancel = XtVaCreateManagedWidget(
17390                       langcode("UNIOP00002"),
17391                       xmPushButtonGadgetClass,
17392                       my_form,
17393                       XmNtopAttachment, XmATTACH_WIDGET,
17394                       XmNtopWidget, frame,
17395                       XmNtopOffset, 10,
17396                       XmNbottomAttachment, XmATTACH_FORM,
17397                       XmNbottomOffset, 5,
17398                       XmNleftAttachment, XmATTACH_POSITION,
17399                       XmNleftPosition, 3,
17400                       XmNrightAttachment, XmATTACH_POSITION,
17401                       XmNrightPosition, 4,
17402                       XmNnavigationType, XmTAB_GROUP,
17403                       MY_FOREGROUND_COLOR,
17404                       MY_BACKGROUND_COLOR,
17405                       XmNfontList, fontlist1,
17406                       NULL);
17407 
17408     XtAddCallback(button_select,
17409                   XmNactivateCallback,
17410                   GPS_operations_change_data,
17411                   GPS_operations_dialog);
17412 
17413     XtAddCallback(button_cancel,
17414                   XmNactivateCallback,
17415                   GPS_operations_cancel,
17416                   GPS_operations_dialog);
17417 
17418     // Set default color to first selection
17419     XmToggleButtonSetState(ctyp0,TRUE,FALSE);
17420     gps_map_color = 0;
17421 
17422     // De-sensitize the color selections if we're doing
17423     // waypoints.
17424     if (strcmp("Waypoints",gps_map_type) == 0)
17425     {
17426       XtSetSensitive(frame, FALSE);
17427     }
17428 
17429     pos_dialog(GPS_operations_dialog);
17430 
17431     delw = XmInternAtom(
17432              XtDisplay(GPS_operations_dialog),
17433              "WM_DELETE_WINDOW",
17434              FALSE);
17435 
17436     XmAddWMProtocolCallback(
17437       GPS_operations_dialog,
17438       delw,
17439       GPS_operations_destroy_shell,
17440       (XtPointer)GPS_operations_dialog);
17441 
17442     XtManageChild(my_form);
17443     XtManageChild(type_box);
17444     XtManageChild(pane);
17445 
17446     resize_dialog(my_form, GPS_operations_dialog);
17447 
17448     XtPopup(GPS_operations_dialog,XtGrabNone);
17449 
17450     // Move focus to the Select button.  This appears to highlight the
17451     // button fine, but we're not able to hit the <Enter> key to
17452     // have that default function happen.  Note:  We _can_ hit the
17453     // <SPACE> key, and that activates the option.
17454 //        XmUpdateDisplay(GPS_operations_dialog);
17455     XmProcessTraversal(button_select, XmTRAVERSE_CURRENT);
17456 
17457   }
17458   else
17459   {
17460     (void)XRaiseWindow(
17461       XtDisplay(GPS_operations_dialog),
17462       XtWindow(GPS_operations_dialog));
17463   }
17464 }
17465 
17466 
17467 
17468 
17469 time_t check_gps_map_time = (time_t)0;
17470 
17471 
17472 // Function called by UpdateTime periodically.  Checks whether
17473 // we've just completed a GPS transfer and need to redraw maps as a
17474 // result.
17475 //
17476 void check_for_new_gps_map(int curr_sec)
17477 {
17478 
17479   // Only check once per second
17480   if (check_gps_map_time == curr_sec)
17481   {
17482     return; // Skip it, we already checked once this second.
17483   }
17484   check_gps_map_time = curr_sec;
17485 
17486 
17487   if ( (gps_operation_pending || gps_got_data_from)
17488        && !gps_details_selected)
17489   {
17490 
17491     // A transfer is underway or has just completed.  The user
17492     // hasn't selected the filename/color yet.  Bring up the
17493     // selection dialog so that the user can do so.
17494     GPS_transfer_select();
17495   }
17496   else if (gps_details_selected
17497            && gps_got_data_from
17498            && !gps_operation_pending)
17499   {
17500     FILE *f;
17501     char temp[MAX_FILENAME * 2];
17502     char gps_base_dir[MAX_VALUE];
17503     char temp_file_name[MAX_VALUE];
17504 
17505     get_user_base_dir("gps",gps_base_dir, sizeof(gps_base_dir));
17506 //fprintf(stderr,"check_for_new_gps_map()\n");
17507 
17508 
17509     // We have new data from a GPS!  Add the file to the
17510     // selected maps file, cause a reload of the maps to occur,
17511     // and then re-index maps (so that map may be deselected by
17512     // the user).
17513 
17514 //
17515 // It would be good to verify that we're not duplicating entries.
17516 // Add code here to read through the file first looking for a
17517 // match before attempting to append any new lines.
17518 //
17519 
17520     // We don't rename if Garmin RINO waypoint file
17521     if (strcmp(gps_map_type,"RINO") != 0)
17522     {
17523       // Rename the temporary file to the new filename.  We must
17524       // do this three times, once for each piece of the Shapefile
17525       // map.
17526 #if defined(HAVE_MV)
17527       strcpy(temp, MV_PATH);
17528       temp[sizeof(temp)-1] = '\0';  // Terminate string
17529       strcat(temp, " ");
17530       temp[sizeof(temp)-1] = '\0';  // Terminate string
17531       strcat(temp, gps_base_dir);
17532       temp[sizeof(temp)-1] = '\0';  // Terminate string
17533       strcat(temp, "/");
17534       temp[sizeof(temp)-1] = '\0';  // Terminate string
17535       strcat(temp, gps_temp_map_filename);
17536       temp[sizeof(temp)-1] = '\0';  // Terminate string
17537       strcat(temp, " ");
17538       temp[sizeof(temp)-1] = '\0';  // Terminate string
17539       strcat(temp, gps_base_dir);
17540       temp[sizeof(temp)-1] = '\0';  // Terminate string
17541       strcat(temp, "/");
17542       temp[sizeof(temp)-1] = '\0';  // Terminate string
17543       strcat(temp, gps_map_filename);
17544       temp[sizeof(temp)-1] = '\0';  // Terminate string
17545 
17546       if ( system(temp) )
17547       {
17548         fprintf(stderr,"Couldn't rename the downloaded GPS map file\n");
17549         fprintf(stderr,"%s\n",temp);
17550         gps_got_data_from = 0;
17551         gps_details_selected = 0;
17552         return;
17553       }
17554       // Done for the ".shp" file.  Now repeat for the ".shx" and
17555       // ".dbf" files.
17556 
17557       strcpy(temp, MV_PATH);
17558       temp[sizeof(temp)-1] = '\0';  // Terminate string
17559       strcat(temp, " ");
17560       temp[sizeof(temp)-1] = '\0';  // Terminate string
17561       strcat(temp, gps_base_dir);
17562       temp[sizeof(temp)-1] = '\0';  // Terminate string
17563       strcat(temp, "/");
17564       temp[sizeof(temp)-1] = '\0';  // Terminate string
17565       strcat(temp, gps_temp_map_filename_base);
17566       temp[sizeof(temp)-1] = '\0';  // Terminate string
17567       strcat(temp, ".shx ");
17568       temp[sizeof(temp)-1] = '\0';  // Terminate string
17569       strcat(temp, gps_base_dir);
17570       temp[sizeof(temp)-1] = '\0';  // Terminate string
17571       strcat(temp, "/");
17572       temp[sizeof(temp)-1] = '\0';  // Terminate string
17573       strcat(temp, gps_map_filename_base);
17574       temp[sizeof(temp)-1] = '\0';  // Terminate string
17575       strcat(temp, ".shx");
17576       temp[sizeof(temp)-1] = '\0';  // Terminate string
17577 
17578       if ( system(temp) )
17579       {
17580         fprintf(stderr,"Couldn't rename the downloaded GPS map file\n");
17581         fprintf(stderr,"%s\n",temp);
17582         gps_got_data_from = 0;
17583         gps_details_selected = 0;
17584         return;
17585       }
17586 
17587       strcpy(temp, MV_PATH);
17588       temp[sizeof(temp)-1] = '\0';  // Terminate string
17589       strcat(temp, " ");
17590       temp[sizeof(temp)-1] = '\0';  // Terminate string
17591       strcat(temp, gps_base_dir);
17592       temp[sizeof(temp)-1] = '\0';  // Terminate string
17593       strcat(temp, "/");
17594       temp[sizeof(temp)-1] = '\0';  // Terminate string
17595       strcat(temp, gps_temp_map_filename_base);
17596       temp[sizeof(temp)-1] = '\0';  // Terminate string
17597       strcat(temp, ".dbf ");
17598       temp[sizeof(temp)-1] = '\0';  // Terminate string
17599       strcat(temp, gps_base_dir);
17600       temp[sizeof(temp)-1] = '\0';  // Terminate string
17601       strcat(temp, "/");
17602       temp[sizeof(temp)-1] = '\0';  // Terminate string
17603       strcat(temp, gps_map_filename_base);
17604       temp[sizeof(temp)-1] = '\0';  // Terminate string
17605       strcat(temp, ".dbf");
17606       temp[sizeof(temp)-1] = '\0';  // Terminate string
17607 
17608       if ( system(temp) )
17609       {
17610         fprintf(stderr,"Couldn't rename the downloaded GPS map file\n");
17611         fprintf(stderr,"%s\n",temp);
17612         gps_got_data_from = 0;
17613         gps_details_selected = 0;
17614         return;
17615       }
17616 #endif  // HAVE_MV
17617 
17618 
17619       // Write out a WKT in a .prj file to go with this shapefile.
17620       xastir_snprintf(temp,
17621                       sizeof(temp),
17622                       "%s/%s.prj",
17623                       gps_base_dir,
17624                       gps_map_filename_base);
17625       xastirWriteWKT(temp);
17626 
17627       if (strcmp(gps_map_type,"Waypoints") != 0)
17628       {
17629         // KM5VY: Create a really, really simple dbfawk file to
17630         // go with the shapefile.  This is a dbfawk file of the
17631         // "per file" type, with the color hardcoded into it.
17632         // This will enable downloaded gps shapefiles to have
17633         // the right color even when they're not placed in the
17634         // GPS directory.
17635         // We don't do this for waypoint files, because all we need to
17636         // do for those is associate the name with the waypoint, and
17637         // that can be done by a generic signature-based file.
17638         xastir_snprintf(temp,
17639                         sizeof(temp),
17640                         "%s/%s.dbfawk",
17641                         gps_base_dir,
17642                         gps_map_filename_base);
17643         f=fopen(temp,"w"); // open for write
17644         if (f != NULL)
17645         {
17646           fprintf(f,gps_dbfawk_format,gps_map_color_offset,
17647                   gps_map_filename_base2);
17648           fclose(f);
17649         }
17650       }
17651       // Add the new gps map to the list of selected maps
17652       f=fopen( get_user_base_dir(SELECTED_MAP_DATA, temp_file_name,
17653                                  sizeof(temp_file_name)), "a" ); // Open for appending
17654       if (f!=NULL)
17655       {
17656 
17657 //WE7U:  Change this:
17658         fprintf(f,"GPS/%s\n",gps_map_filename);
17659 
17660         (void)fclose(f);
17661 
17662         // Reindex maps.  Use the smart timestamp-checking indexing.
17663         map_indexer(0);     // Have to have the new map in the index first before we can select it
17664         map_chooser_init(); // Re-read the selected_maps.sys file
17665         re_sort_maps = 1;   // Creates a new sorted list from the selected maps
17666 
17667 //
17668 // We should set some flags here instead of doing the map redraw
17669 // ourselves, so that multiple map reloads don't occur sometimes in
17670 // UpdateTime.
17671 //
17672 
17673         // Reload maps
17674         // Set interrupt_drawing_now because conditions have changed.
17675         interrupt_drawing_now++;
17676 
17677         // Request that a new image be created.  Calls create_image,
17678         // XCopyArea, and display_zoom_status.
17679         request_new_image++;
17680 
17681 //                if (create_image(da)) {
17682 //                    (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
17683 //                }
17684       }
17685       else
17686       {
17687         fprintf(stderr,"Couldn't open file: %s\n", get_user_base_dir(SELECTED_MAP_DATA, temp_file_name, sizeof(temp_file_name)) );
17688       }
17689     }
17690     else
17691     {
17692       // We're dealing with Garmin RINO waypoints.  Go process
17693       // the RINO.gpstrans file, creating objects out of them.
17694       process_RINO_waypoints();
17695     }
17696 
17697     // Set up for the next GPS run
17698     gps_got_data_from = 0;
17699     gps_details_selected = 0;
17700   }
17701 }
17702 
17703 
17704 
17705 
17706 
17707 // This is the separate execution thread that transfers the data
17708 // to/from the GPS.  The thread is started up by the
17709 // GPS_operations() function below.
17710 //
17711 static void* gps_transfer_thread(void *arg)
17712 {
17713   int input_param;
17714   char temp[500];
17715   char prefix[100];
17716   char postfix[100];
17717   char gps_base_dir[MAX_VALUE];
17718 
17719   get_user_base_dir("gps", gps_base_dir, sizeof(gps_base_dir));
17720 
17721   // Set up the prefix string.  Note that we depend on the correct
17722   // setup of serial ports and such in GPSMan's configs.
17723   xastir_snprintf(prefix, sizeof(prefix),
17724                   "%s",
17725                   GPSMAN_PATH);
17726 
17727   // Set up the postfix string.  The files will be created in the
17728   // "~/.xastir/gps/" directory.
17729   strcpy(postfix, "Shapefile dim=2 ");
17730   postfix[sizeof(postfix)-1] = '\0';  // Terminate string
17731   strcat(postfix, gps_base_dir);
17732   postfix[sizeof(postfix)-1] = '\0';  // Terminate string
17733   strcat(postfix, "/");
17734   postfix[sizeof(postfix)-1] = '\0';  // Terminate string
17735 
17736   input_param = atoi((char *)arg);
17737 
17738   // The pthread_detach() call means we don't care about the
17739   // return code and won't use pthread_join() later.  Makes
17740   // threading more efficient.
17741   (void)pthread_detach(pthread_self());
17742 
17743   switch (input_param)
17744   {
17745 
17746     case 1: // Fetch track from GPS
17747       // gpsman.tcl -dev /dev/ttyS0 getwrite TR Shapefile dim=2 track.date
17748 
17749 //            fprintf(stderr,"Fetch track from GPS\n");
17750 
17751       xastir_snprintf(gps_temp_map_filename,
17752                       sizeof(gps_temp_map_filename),
17753                       "Unnamed_Track_Red.shp");
17754       xastir_snprintf(gps_temp_map_filename_base,
17755                       sizeof(gps_temp_map_filename_base),
17756                       "Unnamed_Track_Red");
17757 
17758 
17759       xastir_snprintf(gps_map_type,
17760                       sizeof(gps_map_type),
17761                       "Track");
17762 
17763       strcpy(temp, prefix);
17764       temp[sizeof(temp)-1] = '\0';  // Terminate string
17765       strcat(temp, " getwrite TR ");
17766       temp[sizeof(temp)-1] = '\0';  // Terminate string
17767       strcat(temp, postfix);
17768       temp[sizeof(temp)-1] = '\0';  // Terminate string
17769       strcat(temp, gps_temp_map_filename);
17770       temp[sizeof(temp)-1] = '\0';  // Terminate string
17771 
17772       if ( system(temp) )
17773       {
17774         fprintf(stderr,"Couldn't download the gps track\n");
17775         gps_operation_pending = 0;  // We're done
17776         return(NULL);
17777       }
17778       // Set the got_data flag
17779       gps_got_data_from++;
17780       break;
17781 
17782     case 2: // Fetch route from GPS
17783       // gpsman.tcl -dev /dev/ttyS0 getwrite RT Shapefile dim=2 routes.date
17784 
17785 //            fprintf(stderr,"Fetch routes from GPS\n");
17786 
17787       xastir_snprintf(gps_temp_map_filename,
17788                       sizeof(gps_temp_map_filename),
17789                       "Unnamed_Routes_Red.shp");
17790       xastir_snprintf(gps_temp_map_filename_base,
17791                       sizeof(gps_temp_map_filename_base),
17792                       "Unnamed_Routes_Red");
17793 
17794       xastir_snprintf(gps_map_type,
17795                       sizeof(gps_map_type),
17796                       "Routes");
17797 
17798       strcpy(temp, prefix);
17799       temp[sizeof(temp)-1] = '\0';  // Terminate string
17800       strcat(temp, " getwrite RT ");
17801       temp[sizeof(temp)-1] = '\0';  // Terminate string
17802       strcat(temp, postfix);
17803       temp[sizeof(temp)-1] = '\0';  // Terminate string
17804       strcat(temp, gps_temp_map_filename);
17805       temp[sizeof(temp)-1] = '\0';  // Terminate string
17806 
17807       if ( system(temp) )
17808       {
17809         fprintf(stderr,"Couldn't download the gps routes\n");
17810         gps_operation_pending = 0;  // We're done
17811         return(NULL);
17812       }
17813       // Set the got_data flag
17814       gps_got_data_from++;
17815       break;
17816 
17817     case 3: // Fetch waypoints from GPS
17818       // gpsman.tcl -dev /dev/ttyS0 getwrite WP Shapefile dim=2 waypoints.date
17819 
17820 //            fprintf(stderr,"Fetch waypoints from GPS\n");
17821 
17822       xastir_snprintf(gps_temp_map_filename,
17823                       sizeof(gps_temp_map_filename),
17824                       "Unnamed_Waypoints.shp");
17825       xastir_snprintf(gps_temp_map_filename_base,
17826                       sizeof(gps_temp_map_filename_base),
17827                       "Unnamed_Waypoints");
17828 
17829       xastir_snprintf(gps_map_type,
17830                       sizeof(gps_map_type),
17831                       "Waypoints");
17832 
17833       strcpy(temp, prefix);
17834       temp[sizeof(temp)-1] = '\0';  // Terminate string
17835       strcat(temp, " getwrite WP ");
17836       temp[sizeof(temp)-1] = '\0';  // Terminate string
17837       strcat(temp, postfix);
17838       temp[sizeof(temp)-1] = '\0';  // Terminate string
17839       strcat(temp, gps_temp_map_filename);
17840       temp[sizeof(temp)-1] = '\0';  // Terminate string
17841 
17842       if ( system(temp) )
17843       {
17844         fprintf(stderr,"Couldn't download the gps waypoints\n");
17845         gps_operation_pending = 0;  // We're done
17846         return(NULL);
17847       }
17848       // Set the got_data flag
17849       gps_got_data_from++;
17850       break;
17851 
17852     case 4: // Send track to GPS
17853       // gpsman.tcl -dev /dev/ttyS0 readput Shapefile dim=2 track.date TR
17854 
17855       fprintf(stderr,"Send track to GPS\n");
17856       fprintf(stderr,"Not implemented yet\n");
17857       gps_operation_pending = 0;  // We're done
17858       return(NULL);
17859       break;
17860 
17861     case 5: // Send route to GPS
17862       // gpsman.tcl -dev /dev/ttyS0 readput Shapefile dim=2 routes.date RT
17863 
17864       fprintf(stderr,"Send route to GPS\n");
17865       fprintf(stderr,"Not implemented yet\n");
17866       gps_operation_pending = 0;  // We're done
17867       return(NULL);
17868       break;
17869 
17870     case 6: // Send waypoints to GPS
17871       // gpsman.tcl -dev /dev/ttyS0 readput Shapefile dim=2 waypoints.date WP
17872 
17873       fprintf(stderr,"Send waypoints to GPS\n");
17874       fprintf(stderr,"Not implemented yet\n");
17875       gps_operation_pending = 0;  // We're done
17876       return(NULL);
17877       break;
17878 
17879     case 7: // Fetch waypoints from GPS in GPSTrans format
17880       // gpsman.tcl -dev /dev/ttyS0 getwrite WP GPStrans waypoints.date
17881 
17882 //            fprintf(stderr,"Fetch Garmin RINO waypoints\n");
17883 
17884       // The files will be created in the "~/.xastir/gps/"
17885       // directory.
17886 
17887       xastir_snprintf(gps_temp_map_filename,
17888                       sizeof(gps_temp_map_filename),
17889                       "RINO.gpstrans");
17890 
17891       xastir_snprintf(gps_temp_map_filename_base,
17892                       sizeof(gps_temp_map_filename_base),
17893                       "RINO");
17894 
17895       xastir_snprintf(gps_map_type,
17896                       sizeof(gps_map_type),
17897                       "RINO");
17898 
17899       strcpy(temp, "(");
17900       temp[sizeof(temp)-1] = '\0';  // Terminate string
17901       strcat(temp, prefix);
17902       temp[sizeof(temp)-1] = '\0';  // Terminate string
17903       strcat(temp, " getwrite WP GPStrans ");
17904       temp[sizeof(temp)-1] = '\0';  // Terminate string
17905       strcat(temp, gps_base_dir);
17906       temp[sizeof(temp)-1] = '\0';  // Terminate string
17907       strcat(temp, "/");
17908       temp[sizeof(temp)-1] = '\0';  // Terminate string
17909       strcat(temp, gps_temp_map_filename);
17910       temp[sizeof(temp)-1] = '\0';  // Terminate string
17911       strcat(temp, " 2>&1) >/dev/null");
17912       temp[sizeof(temp)-1] = '\0';  // Terminate string
17913 
17914       // Execute the command
17915       if (system(temp) != 0)
17916       {
17917         // Ignore the return value as we've always done prior,
17918         // in other words: No change to the operation.
17919       }
17920 
17921 //            if ( system(temp) ) {
17922 //                fprintf(stderr,"Couldn't download the gps waypoints\n");
17923 //                gps_operation_pending = 0;  // We're done
17924 //                return(NULL);
17925 //            }
17926 
17927       // Set the got_data flag
17928       gps_got_data_from++;
17929       break;
17930 
17931     default:
17932       fprintf(stderr,"Illegal parameter %d passed to gps_transfer_thread!\n",
17933               input_param);
17934       gps_operation_pending = 0;  // We're done
17935       break;
17936   }   // End of switch
17937 
17938 
17939   // Signal to the main thread that we're all done with the
17940   // GPS operation.
17941   gps_operation_pending = 0;  // We're done
17942 
17943   // End the thread
17944   return(NULL);
17945 }
17946 
17947 
17948 
17949 
17950 
17951 // GPSMan can't handle multiple '.'s in the filename.  It chops at
17952 // the first one.
17953 //
17954 // Note that the permissions on the "~/.xastir/gps/" directory have to be
17955 // set so that this user (or the root user?) can create files in
17956 // that directory.  The permissions on the resulting files may need
17957 // to be tweaked.
17958 //
17959 // When creating files, we should warn the user of a conflict if the
17960 // filename already exists, then if the user wishes to overwrite it,
17961 // delete the old set of files before downloading the new ones.  We
17962 // should also make sure we're not adding the filename to the
17963 // selected_maps.sys more than once.
17964 //
17965 // Set up default filenames for each, with an autoincrementing
17966 // number at the end?  That'd be one way of getting a maps
17967 // downloaded in a hurry.  Could also ask for a filename after the
17968 // download is complete instead of at the start of the download.  In
17969 // that case, download to a temporary filename and then rename it
17970 // later and reload maps.
17971 //
17972 // Dialog should ask the user to put the unit into Garmin-Garmin
17973 // mode before proceeding.
17974 //
17975 // We could de-sensitize the GPS transfer menu items during a
17976 // transfer operation, to make sure we're not called again until the
17977 // first operation is over.
17978 //
17979 void GPS_operations( Widget UNUSED(w), XtPointer clientData, XtPointer UNUSED(callData) )
17980 {
17981   pthread_t gps_operations_thread;
17982   int parameter;
17983 
17984 
17985   if (clientData != NULL)
17986   {
17987 
17988     // Check whether we're already doing a GPS operation.
17989     // Return if so.
17990     if (gps_operation_pending)
17991     {
17992       fprintf(stderr,"GPS Operation is already pending, can't start another one!\n");
17993       return;
17994     }
17995 
17996     parameter = atoi((char *)clientData);
17997 
17998     if ( ((parameter < 1) || (parameter > 3)) && parameter != 7)
17999     {
18000       fprintf(stderr,"GPS_operations: Parameter out-of-range: %d",parameter);
18001       return;
18002     }
18003 
18004 
18005     gps_operation_pending++;
18006     gps_got_data_from = 0;
18007 
18008     // We don't need to select filename/color if option 7
18009     if (parameter == 7)
18010     {
18011       gps_details_selected++;
18012     }
18013 
18014 
18015 //----- Start New Thread -----
18016 
18017     // Here we start a new thread.  We'll communicate with the
18018     // main thread via global variables.  Use mutex locks if
18019     // there might be a conflict as to when/how we're updating
18020     // those variables.
18021     //
18022     if (pthread_create(&gps_operations_thread, NULL, gps_transfer_thread, clientData))
18023     {
18024       fprintf(stderr,"Error creating gps transfer thread\n");
18025       gps_got_data_from = 0;      // No data to present
18026       gps_operation_pending = 0;  // We're done
18027     }
18028     else
18029     {
18030       // We're off and running with the new thread!
18031     }
18032   }
18033 }
18034 #endif  // HAVE_GPSMAN
18035 
18036 
18037 
18038 
18039 
18040 /////////////////////////////////////////////////////////////////////
18041 // End of GPS operations
18042 /////////////////////////////////////////////////////////////////////
18043 
18044 
18045 
18046 
18047 
18048 void Set_Log_Indicator(void)
18049 {
18050   if (       (1==log_tnc_data)
18051              || (1==log_net_data)
18052              || (1==log_wx)
18053              || (1==log_igate)
18054              || (1==log_wx_alert_data)
18055              || (1==log_message_data) )
18056   {
18057     XmTextFieldSetString(log_indicator, langcode("BBARSTA043")); // Logging
18058     XtVaSetValues(log_indicator,
18059                   XmNbackground, GetPixelByName(appshell,"RosyBrown"),
18060                   NULL);
18061   }
18062   else
18063   {
18064     XmTextFieldSetString(log_indicator, NULL);
18065     XtVaSetValues(log_indicator, MY_BACKGROUND_COLOR, NULL);
18066   }
18067 }
18068 
18069 
18070 
18071 
18072 
18073 void  TNC_Logging_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
18074 {
18075   char *which = (char *)clientData;
18076   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18077 
18078   if(state->set)
18079   {
18080     log_tnc_data = atoi(which);
18081   }
18082   else
18083   {
18084     log_tnc_data = 0;
18085   }
18086   Set_Log_Indicator();
18087 }
18088 
18089 
18090 
18091 
18092 
18093 void Net_Logging_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18094 {
18095   char *which = (char *)clientData;
18096   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18097 
18098   if(state->set)
18099   {
18100     log_net_data = atoi(which);
18101   }
18102   else
18103   {
18104     log_net_data = 0;
18105   }
18106   Set_Log_Indicator();
18107 }
18108 
18109 
18110 
18111 
18112 
18113 void IGate_Logging_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18114 {
18115   char *which = (char *)clientData;
18116   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18117 
18118   if(state->set)
18119   {
18120     log_igate = atoi(which);
18121   }
18122   else
18123   {
18124     log_igate = 0;
18125   }
18126   Set_Log_Indicator();
18127 }
18128 
18129 
18130 
18131 
18132 
18133 void Message_Logging_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18134 {
18135   char *which = (char *)clientData;
18136   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18137 
18138   if(state->set)
18139   {
18140     log_message_data = atoi(which);
18141   }
18142   else
18143   {
18144     log_message_data = 0;
18145   }
18146   Set_Log_Indicator();
18147 }
18148 
18149 
18150 
18151 
18152 
18153 void WX_Logging_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18154 {
18155   char *which = (char *)clientData;
18156   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18157 
18158   if(state->set)
18159   {
18160     log_wx = atoi(which);
18161   }
18162   else
18163   {
18164     log_wx = 0;
18165   }
18166   Set_Log_Indicator();
18167 }
18168 
18169 
18170 
18171 
18172 
18173 void WX_Alert_Logging_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18174 {
18175   char *which = (char *)clientData;
18176   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18177 
18178   if(state->set)
18179   {
18180     log_wx_alert_data = atoi(which);
18181   }
18182   else
18183   {
18184     log_wx_alert_data = 0;
18185   }
18186   Set_Log_Indicator();
18187 }
18188 
18189 
18190 
18191 
18192 
18193 // Filter Data Menu button callbacks
18194 
18195 // support functions
18196 void set_sensitive_select_sources(int sensitive)
18197 {
18198   XtSetSensitive(select_mine_button,     sensitive);
18199   XtSetSensitive(select_tnc_button,      sensitive);
18200   if (!Select_.tnc)
18201   {
18202     XtSetSensitive(select_direct_button,   FALSE);
18203     XtSetSensitive(select_via_digi_button, FALSE);
18204   }
18205   else
18206   {
18207     XtSetSensitive(select_direct_button,   sensitive);
18208     XtSetSensitive(select_via_digi_button, sensitive);
18209   }
18210   XtSetSensitive(select_net_button,      sensitive);
18211   if (no_data_selected())
18212   {
18213     XtSetSensitive(select_old_data_button, FALSE);
18214   }
18215   else
18216   {
18217     XtSetSensitive(select_old_data_button, sensitive);
18218   }
18219 }
18220 
18221 void set_sensitive_select_types(int sensitive)
18222 {
18223   XtSetSensitive(select_stations_button, sensitive);
18224   if (!Select_.stations)
18225   {
18226     XtSetSensitive(select_fixed_stations_button, FALSE);
18227     XtSetSensitive(select_moving_stations_button,     FALSE);
18228     XtSetSensitive(select_weather_stations_button,    FALSE);
18229     XtSetSensitive(select_CWOP_wx_stations_button,       FALSE);
18230   }
18231   else
18232   {
18233     XtSetSensitive(select_fixed_stations_button, sensitive);
18234     XtSetSensitive(select_moving_stations_button,     sensitive);
18235     XtSetSensitive(select_weather_stations_button,    sensitive);
18236     if (Select_.weather_stations)
18237     {
18238       XtSetSensitive(select_CWOP_wx_stations_button, sensitive);
18239     }
18240   }
18241 
18242   XtSetSensitive(select_objects_button, sensitive);
18243 
18244   if (!Select_.objects)
18245   {
18246     XtSetSensitive(select_weather_objects_button, FALSE);
18247     XtSetSensitive(select_gauge_objects_button,   FALSE);
18248     XtSetSensitive(select_aircraft_objects_button,   FALSE);
18249     XtSetSensitive(select_vessel_objects_button,   FALSE);
18250     XtSetSensitive(select_other_objects_button,   FALSE);
18251   }
18252   else
18253   {
18254     XtSetSensitive(select_weather_objects_button, sensitive);
18255     XtSetSensitive(select_gauge_objects_button,   sensitive);
18256     XtSetSensitive(select_aircraft_objects_button,   sensitive);
18257     XtSetSensitive(select_vessel_objects_button,   sensitive);
18258     XtSetSensitive(select_other_objects_button,   sensitive);
18259   }
18260 }
18261 
18262 
18263 
18264 
18265 
18266 void set_sensitive_display(int sensitive)
18267 {
18268   XtSetSensitive(display_callsign_button,      sensitive);
18269 
18270   if (!Display_.callsign)
18271   {
18272     XtSetSensitive(display_label_all_trackpoints_button, FALSE);
18273   }
18274   else
18275   {
18276     XtSetSensitive(display_label_all_trackpoints_button, sensitive);
18277   }
18278 
18279   XtSetSensitive(display_symbol_button,        sensitive);
18280 
18281   if (!Display_.symbol)
18282   {
18283     XtSetSensitive(display_symbol_rotate_button, FALSE);
18284   }
18285   else
18286   {
18287     XtSetSensitive(display_symbol_rotate_button, sensitive);
18288   }
18289 
18290   XtSetSensitive(display_phg_button,           sensitive);
18291 
18292   if (!Display_.phg)
18293   {
18294     XtSetSensitive(display_default_phg_button,   FALSE);
18295     XtSetSensitive(display_phg_of_moving_button, FALSE);
18296   }
18297   else
18298   {
18299     XtSetSensitive(display_default_phg_button,   sensitive);
18300     XtSetSensitive(display_phg_of_moving_button, sensitive);
18301   }
18302   XtSetSensitive(display_altitude_button, sensitive);
18303   XtSetSensitive(display_course_button,   sensitive);
18304   XtSetSensitive(display_speed_button,    sensitive);
18305   if (!Display_.speed)
18306   {
18307     XtSetSensitive(display_speed_short_button, FALSE);
18308   }
18309   else
18310   {
18311     XtSetSensitive(display_speed_short_button, sensitive);
18312   }
18313   XtSetSensitive(display_dist_bearing_button, sensitive);
18314   XtSetSensitive(display_weather_button,      sensitive);
18315   if (!Display_.weather)
18316   {
18317     XtSetSensitive(display_weather_text_button,     FALSE);
18318     XtSetSensitive(display_temperature_only_button, FALSE);
18319     XtSetSensitive(display_wind_barb_button,        FALSE);
18320   }
18321   else
18322   {
18323     XtSetSensitive(display_weather_text_button, sensitive);
18324     if (!Display_.weather_text)
18325     {
18326       XtSetSensitive(display_temperature_only_button, FALSE);
18327     }
18328     else
18329     {
18330       XtSetSensitive(display_temperature_only_button, sensitive);
18331     }
18332     XtSetSensitive(display_wind_barb_button, sensitive);
18333   }
18334   XtSetSensitive(display_trail_button,      sensitive);
18335   XtSetSensitive(display_last_heard_button, sensitive);
18336   XtSetSensitive(display_ambiguity_button,  sensitive);
18337   XtSetSensitive(display_df_data_button,    sensitive);
18338   if (!Display_.df_data)
18339   {
18340     XtSetSensitive(display_df_beamwidth_data_button,    FALSE);
18341     XtSetSensitive(display_df_bearing_data_button,      FALSE);
18342   }
18343   else
18344   {
18345     XtSetSensitive(display_df_beamwidth_data_button,    sensitive);
18346     XtSetSensitive(display_df_bearing_data_button,      sensitive);
18347   }
18348 
18349   XtSetSensitive(display_dr_data_button,    sensitive);
18350   if (!Display_.dr_data)
18351   {
18352     XtSetSensitive(display_dr_arc_button,    FALSE);
18353     XtSetSensitive(display_dr_course_button, FALSE);
18354     XtSetSensitive(display_dr_symbol_button, FALSE);
18355   }
18356   else
18357   {
18358     XtSetSensitive(display_dr_arc_button,    sensitive);
18359     XtSetSensitive(display_dr_course_button, sensitive);
18360     XtSetSensitive(display_dr_symbol_button, sensitive);
18361   }
18362 }
18363 
18364 
18365 
18366 
18367 
18368 void Select_none_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18369 {
18370   char *which = (char *)clientData;
18371   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18372 
18373   if (state->set)
18374   {
18375     Select_.none = atoi(which);
18376     set_sensitive_select_sources(FALSE);
18377     set_sensitive_select_types(FALSE);
18378     set_sensitive_display(FALSE);
18379   }
18380   else
18381   {
18382     Select_.none = 0;
18383     set_sensitive_select_sources(TRUE);
18384     if (no_data_selected())
18385     {
18386       set_sensitive_select_types(FALSE);
18387       set_sensitive_display(FALSE);
18388     }
18389     else
18390     {
18391       set_sensitive_select_types(TRUE);
18392       set_sensitive_display(TRUE);
18393     }
18394   }
18395 
18396   redraw_on_new_data = 2;     // Immediate screen update
18397 }
18398 
18399 
18400 
18401 
18402 
18403 
18404 void Select_mine_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18405 {
18406   char *which = (char *)clientData;
18407   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18408 
18409   if (state->set)
18410   {
18411     Select_.mine = atoi(which);
18412     XtSetSensitive(select_old_data_button, TRUE);
18413     set_sensitive_select_types(TRUE);
18414     set_sensitive_display(TRUE);
18415   }
18416   else
18417   {
18418     Select_.mine = 0;
18419     if (no_data_selected())
18420     {
18421       XtSetSensitive(select_old_data_button, FALSE);
18422       set_sensitive_select_types(FALSE);
18423       set_sensitive_display(FALSE);
18424     }
18425   }
18426 
18427   redraw_on_new_data = 2;     // Immediate screen update
18428 }
18429 
18430 
18431 
18432 
18433 
18434 void Select_tnc_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18435 {
18436   char *which = (char *)clientData;
18437   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18438 
18439   if (state->set)
18440   {
18441     Select_.tnc = atoi(which);
18442     XtSetSensitive(select_direct_button,   TRUE);
18443     XtSetSensitive(select_via_digi_button, TRUE);
18444 
18445     if (!no_data_selected())
18446     {
18447       XtSetSensitive(select_old_data_button, TRUE);
18448       set_sensitive_select_types(TRUE);
18449       set_sensitive_display(TRUE);
18450     }
18451   }
18452   else
18453   {
18454     Select_.tnc = 0;
18455     XtSetSensitive(select_direct_button,   FALSE);
18456     XtSetSensitive(select_via_digi_button, FALSE);
18457     if (no_data_selected())
18458     {
18459       XtSetSensitive(select_old_data_button, FALSE);
18460       set_sensitive_select_types(FALSE);
18461       set_sensitive_display(FALSE);
18462     }
18463   }
18464 
18465   redraw_on_new_data = 2;     // Immediate screen update
18466 }
18467 
18468 
18469 
18470 
18471 
18472 void Select_direct_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18473 {
18474   char *which = (char *)clientData;
18475   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18476 
18477   if (state->set)
18478   {
18479     Select_.direct = atoi(which);
18480     XtSetSensitive(select_old_data_button, TRUE);
18481     set_sensitive_select_types(TRUE);
18482     set_sensitive_display(TRUE);
18483   }
18484   else
18485   {
18486     Select_.direct = 0;
18487     if (no_data_selected())
18488     {
18489       XtSetSensitive(select_old_data_button, FALSE);
18490       set_sensitive_select_types(FALSE);
18491       set_sensitive_display(FALSE);
18492     }
18493   }
18494 
18495   redraw_on_new_data = 2;     // Immediate screen update
18496 }
18497 
18498 
18499 
18500 
18501 
18502 void Select_via_digi_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18503 {
18504   char *which = (char *)clientData;
18505   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18506 
18507   if (state->set)
18508   {
18509     Select_.via_digi = atoi(which);
18510     XtSetSensitive(select_old_data_button, TRUE);
18511     set_sensitive_select_types(TRUE);
18512     set_sensitive_display(TRUE);
18513   }
18514   else
18515   {
18516     Select_.via_digi = 0;
18517     if (no_data_selected())
18518     {
18519       XtSetSensitive(select_old_data_button, FALSE);
18520       set_sensitive_select_types(FALSE);
18521       set_sensitive_display(FALSE);
18522     }
18523   }
18524 
18525   redraw_on_new_data = 2;     // Immediate screen update
18526 }
18527 
18528 
18529 
18530 
18531 
18532 void Select_net_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18533 {
18534   char *which = (char *)clientData;
18535   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18536 
18537   if (state->set)
18538   {
18539     Select_.net = atoi(which);
18540     XtSetSensitive(select_old_data_button, TRUE);
18541     set_sensitive_select_types(TRUE);
18542     set_sensitive_display(TRUE);
18543   }
18544   else
18545   {
18546     Select_.net = 0;
18547     if (no_data_selected())
18548     {
18549       XtSetSensitive(select_old_data_button, FALSE);
18550       set_sensitive_select_types(FALSE);
18551       set_sensitive_display(FALSE);
18552     }
18553   }
18554   redraw_on_new_data = 2;     // Immediate screen update
18555 }
18556 
18557 
18558 
18559 
18560 
18561 void Select_tactical_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18562 {
18563   char *which = (char *)clientData;
18564   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18565 
18566   if (state->set)
18567   {
18568     Select_.tactical = atoi(which);
18569     XtSetSensitive(select_old_data_button, TRUE);
18570     set_sensitive_select_types(TRUE);
18571     set_sensitive_display(TRUE);
18572   }
18573   else
18574   {
18575     Select_.tactical = 0;
18576     if (no_data_selected())
18577     {
18578       XtSetSensitive(select_old_data_button, FALSE);
18579       set_sensitive_select_types(FALSE);
18580       set_sensitive_display(FALSE);
18581     }
18582   }
18583   redraw_on_new_data = 2;     // Immediate screen update
18584 }
18585 
18586 
18587 
18588 
18589 
18590 void Select_old_data_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18591 {
18592   char *which = (char *)clientData;
18593   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18594 
18595   if (state->set)
18596   {
18597     Select_.old_data = atoi(which);
18598   }
18599   else
18600   {
18601     Select_.old_data = 0;
18602   }
18603 
18604   redraw_on_new_data = 2;     // Immediate screen update
18605 }
18606 
18607 
18608 
18609 
18610 
18611 void Select_stations_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18612 {
18613   char *which = (char *)clientData;
18614   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18615 
18616   if (state->set)
18617   {
18618     Select_.stations = atoi(which);
18619     XtSetSensitive(select_fixed_stations_button,   TRUE);
18620     XtSetSensitive(select_moving_stations_button,  TRUE);
18621     XtSetSensitive(select_weather_stations_button, TRUE);
18622     if (Select_.weather_stations)
18623     {
18624       XtSetSensitive(select_CWOP_wx_stations_button, TRUE);
18625     }
18626   }
18627   else
18628   {
18629     Select_.stations = 0;
18630     XtSetSensitive(select_fixed_stations_button,   FALSE);
18631     XtSetSensitive(select_moving_stations_button,  FALSE);
18632     XtSetSensitive(select_weather_stations_button, FALSE);
18633     XtSetSensitive(select_CWOP_wx_stations_button, FALSE);
18634   }
18635 
18636   redraw_on_new_data = 2;     // Immediate screen update
18637 }
18638 
18639 
18640 
18641 
18642 
18643 void Select_fixed_stations_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18644 {
18645   char *which = (char *)clientData;
18646   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18647 
18648   if (state->set)
18649   {
18650     Select_.fixed_stations = atoi(which);
18651   }
18652   else
18653   {
18654     Select_.fixed_stations = 0;
18655   }
18656 
18657   redraw_on_new_data = 2;     // Immediate screen update
18658 }
18659 
18660 
18661 
18662 
18663 
18664 void Select_moving_stations_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18665 {
18666   char *which = (char *)clientData;
18667   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18668 
18669   if (state->set)
18670   {
18671     Select_.moving_stations = atoi(which);
18672   }
18673   else
18674   {
18675     Select_.moving_stations = 0;
18676   }
18677 
18678   redraw_on_new_data = 2;     // Immediate screen update
18679 }
18680 
18681 
18682 
18683 
18684 
18685 void Select_weather_stations_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18686 {
18687   char *which = (char *)clientData;
18688   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18689 
18690   if (state->set)
18691   {
18692     Select_.weather_stations = atoi(which);
18693     XtSetSensitive(select_CWOP_wx_stations_button, atoi(which));
18694   }
18695   else
18696   {
18697     Select_.weather_stations = 0;
18698     XtSetSensitive(select_CWOP_wx_stations_button, FALSE);
18699   }
18700 
18701   redraw_on_new_data = 2;     // Immediate screen update
18702 }
18703 
18704 
18705 
18706 
18707 
18708 void Select_CWOP_wx_stations_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18709 {
18710   char *which = (char *)clientData;
18711   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18712 
18713   if (state->set)
18714   {
18715     Select_.CWOP_wx_stations = atoi(which);
18716   }
18717   else
18718   {
18719     Select_.CWOP_wx_stations = 0;
18720   }
18721 
18722   redraw_on_new_data = 2;     // Immediate screen update
18723 }
18724 
18725 
18726 
18727 
18728 
18729 void Select_objects_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18730 {
18731   char *which = (char *)clientData;
18732   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18733 
18734   if (state->set)
18735   {
18736     Select_.objects = atoi(which);
18737     XtSetSensitive(select_weather_objects_button, TRUE);
18738     XtSetSensitive(select_gauge_objects_button,   TRUE);
18739     XtSetSensitive(select_aircraft_objects_button,   TRUE);
18740     XtSetSensitive(select_vessel_objects_button,   TRUE);
18741     XtSetSensitive(select_other_objects_button,   TRUE);
18742   }
18743   else
18744   {
18745     Select_.objects = 0;
18746     XtSetSensitive(select_weather_objects_button, FALSE);
18747     XtSetSensitive(select_gauge_objects_button,   FALSE);
18748     XtSetSensitive(select_aircraft_objects_button,   FALSE);
18749     XtSetSensitive(select_vessel_objects_button,   FALSE);
18750     XtSetSensitive(select_other_objects_button,   FALSE);
18751   }
18752 
18753   redraw_on_new_data = 2;     // Immediate screen update
18754 }
18755 
18756 
18757 
18758 
18759 
18760 void Select_weather_objects_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18761 {
18762   char *which = (char *)clientData;
18763   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18764 
18765   if (state->set)
18766   {
18767     Select_.weather_objects = atoi(which);
18768   }
18769   else
18770   {
18771     Select_.weather_objects = 0;
18772   }
18773 
18774   redraw_on_new_data = 2;     // Immediate screen update
18775 }
18776 
18777 
18778 
18779 
18780 
18781 void Select_gauge_objects_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18782 {
18783   char *which = (char *)clientData;
18784   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18785 
18786   if (state->set)
18787   {
18788     Select_.gauge_objects = atoi(which);
18789   }
18790   else
18791   {
18792     Select_.gauge_objects = 0;
18793   }
18794 
18795   redraw_on_new_data = 2;     // Immediate screen update
18796 }
18797 
18798 
18799 void Select_aircraft_objects_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18800 {
18801   char *which = (char *)clientData;
18802   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18803 
18804   if (state->set)
18805   {
18806     Select_.aircraft_objects = atoi(which);
18807   }
18808   else
18809   {
18810     Select_.aircraft_objects = 0;
18811   }
18812 
18813   redraw_on_new_data = 2;     // Immediate screen update
18814 }
18815 
18816 void Select_vessel_objects_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18817 {
18818   char *which = (char *)clientData;
18819   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18820 
18821   if (state->set)
18822   {
18823     Select_.vessel_objects = atoi(which);
18824   }
18825   else
18826   {
18827     Select_.vessel_objects = 0;
18828   }
18829 
18830   redraw_on_new_data = 2;     // Immediate screen update
18831 }
18832 
18833 void Select_other_objects_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18834 {
18835   char *which = (char *)clientData;
18836   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18837 
18838   if (state->set)
18839   {
18840     Select_.other_objects = atoi(which);
18841   }
18842   else
18843   {
18844     Select_.other_objects = 0;
18845   }
18846 
18847   redraw_on_new_data = 2;     // Immediate screen update
18848 }
18849 
18850 
18851 
18852 
18853 
18854 // Display Menu button callbacks
18855 
18856 void Display_callsign_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18857 {
18858   char *which = (char *)clientData;
18859   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18860 
18861   if (state->set)
18862   {
18863     Display_.callsign = atoi(which);
18864     XtSetSensitive(display_label_all_trackpoints_button, TRUE);
18865   }
18866   else
18867   {
18868     Display_.callsign = 0;
18869     XtSetSensitive(display_label_all_trackpoints_button, FALSE);
18870   }
18871 
18872   redraw_on_new_data = 2;     // Immediate screen update
18873 }
18874 
18875 
18876 
18877 
18878 
18879 void Display_label_all_trackpoints_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18880 {
18881   char *which = (char *)clientData;
18882   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18883 
18884   if (state->set)
18885   {
18886     Display_.label_all_trackpoints = atoi(which);
18887   }
18888   else
18889   {
18890     Display_.label_all_trackpoints = 0;
18891   }
18892 
18893   redraw_on_new_data = 2;     // Immediate screen update
18894 }
18895 
18896 
18897 
18898 
18899 
18900 void Display_symbol_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18901 {
18902   char *which = (char *)clientData;
18903   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18904 
18905   if (state->set)
18906   {
18907     Display_.symbol = atoi(which);
18908     XtSetSensitive(display_symbol_rotate_button, TRUE);
18909   }
18910   else
18911   {
18912     Display_.symbol = 0;
18913     XtSetSensitive(display_symbol_rotate_button, FALSE);
18914   }
18915 
18916   redraw_on_new_data = 2;     // Immediate screen update
18917 }
18918 
18919 
18920 
18921 
18922 
18923 void Display_symbol_rotate_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18924 {
18925   char *which = (char *)clientData;
18926   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18927 
18928   if (state->set)
18929   {
18930     Display_.symbol_rotate = atoi(which);
18931   }
18932   else
18933   {
18934     Display_.symbol_rotate = 0;
18935   }
18936 
18937   redraw_on_new_data = 2;     // Immediate screen update
18938 }
18939 
18940 
18941 
18942 
18943 
18944 void Display_trail_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18945 {
18946   char *which = (char *)clientData;
18947   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18948 
18949   if (state->set)
18950   {
18951     Display_.trail = atoi(which);
18952   }
18953   else
18954   {
18955     Display_.trail = 0;
18956   }
18957 
18958   redraw_on_new_data = 2;     // Immediate screen update
18959 }
18960 
18961 
18962 
18963 
18964 
18965 void Display_course_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18966 {
18967   char *which = (char *)clientData;
18968   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18969 
18970   if (state->set)
18971   {
18972     Display_.course = atoi(which);
18973   }
18974   else
18975   {
18976     Display_.course = 0;
18977   }
18978 
18979   redraw_on_new_data = 2;     // Immediate screen update
18980 }
18981 
18982 
18983 
18984 
18985 
18986 void Display_speed_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
18987 {
18988   char *which = (char *)clientData;
18989   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
18990 
18991   if (state->set)
18992   {
18993     Display_.speed = atoi(which);
18994     XtSetSensitive(display_speed_short_button, TRUE);
18995   }
18996   else
18997   {
18998     Display_.speed = 0;
18999     XtSetSensitive(display_speed_short_button, FALSE);
19000   }
19001 
19002   redraw_on_new_data = 2;     // Immediate screen update
19003 }
19004 
19005 
19006 
19007 
19008 
19009 void Display_speed_short_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19010 {
19011   char *which = (char *)clientData;
19012   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19013 
19014   if (state->set)
19015   {
19016     Display_.speed_short = atoi(which);
19017   }
19018   else
19019   {
19020     Display_.speed_short = 0;
19021   }
19022 
19023   redraw_on_new_data = 2;     // Immediate screen update
19024 }
19025 
19026 
19027 
19028 
19029 
19030 void Display_altitude_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19031 {
19032   char *which = (char *)clientData;
19033   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19034 
19035   if (state->set)
19036   {
19037     Display_.altitude = atoi(which);
19038   }
19039   else
19040   {
19041     Display_.altitude = 0;
19042   }
19043 
19044   redraw_on_new_data = 2;     // Immediate screen update
19045 }
19046 
19047 
19048 
19049 
19050 
19051 void Display_weather_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19052 {
19053   char *which = (char *)clientData;
19054   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19055 
19056   if (state->set)
19057   {
19058     Display_.weather = atoi(which);
19059     XtSetSensitive(display_weather_text_button,     TRUE);
19060     XtSetSensitive(display_temperature_only_button, TRUE);
19061     XtSetSensitive(display_wind_barb_button,        TRUE);
19062   }
19063   else
19064   {
19065     Display_.weather = 0;
19066     XtSetSensitive(display_weather_text_button,     FALSE);
19067     XtSetSensitive(display_temperature_only_button, FALSE);
19068     XtSetSensitive(display_wind_barb_button,        FALSE);
19069   }
19070 
19071   redraw_on_new_data = 2;     // Immediate screen update
19072 }
19073 
19074 
19075 
19076 
19077 
19078 void Display_weather_text_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19079 {
19080   char *which = (char *)clientData;
19081   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19082 
19083   if (state->set)
19084   {
19085     Display_.weather_text = atoi(which);
19086     XtSetSensitive(display_temperature_only_button, TRUE);
19087   }
19088   else
19089   {
19090     Display_.weather_text = 0;
19091     XtSetSensitive(display_temperature_only_button, FALSE);
19092   }
19093 
19094   redraw_on_new_data = 2;     // Immediate screen update
19095 }
19096 
19097 
19098 
19099 
19100 
19101 void Display_temperature_only_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19102 {
19103   char *which = (char *)clientData;
19104   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19105 
19106   if (state->set)
19107   {
19108     Display_.temperature_only = atoi(which);
19109   }
19110   else
19111   {
19112     Display_.temperature_only = 0;
19113   }
19114 
19115   redraw_on_new_data = 2;     // Immediate screen update
19116 }
19117 
19118 
19119 
19120 
19121 
19122 void Display_wind_barb_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19123 {
19124   char *which = (char *)clientData;
19125   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19126 
19127   if (state->set)
19128   {
19129     Display_.wind_barb = atoi(which);
19130   }
19131   else
19132   {
19133     Display_.wind_barb = 0;
19134   }
19135 
19136   redraw_on_new_data = 2;     // Immediate screen update
19137 }
19138 
19139 
19140 
19141 
19142 
19143 void Display_aloha_circle_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19144 {
19145   char *which = (char *)clientData;
19146   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19147 
19148   if (state->set)
19149   {
19150     Display_.aloha_circle = atoi(which);
19151   }
19152   else
19153   {
19154     Display_.aloha_circle = 0;
19155   }
19156 
19157   redraw_on_new_data = 2;     // Immediate screen update
19158 }
19159 
19160 
19161 
19162 
19163 
19164 void Display_ambiguity_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19165 {
19166   char *which = (char *)clientData;
19167   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19168 
19169   if (state->set)
19170   {
19171     Display_.ambiguity = atoi(which);
19172   }
19173   else
19174   {
19175     Display_.ambiguity = 0;
19176   }
19177 
19178   redraw_on_new_data = 2;     // Immediate screen update
19179 }
19180 
19181 
19182 
19183 
19184 
19185 void Display_phg_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19186 {
19187   char *which = (char *)clientData;
19188   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19189 
19190   if (state->set)
19191   {
19192     Display_.phg = atoi(which);
19193     XtSetSensitive(display_default_phg_button,   TRUE);
19194     XtSetSensitive(display_phg_of_moving_button, TRUE);
19195   }
19196   else
19197   {
19198     Display_.phg = 0;
19199     XtSetSensitive(display_default_phg_button,   FALSE);
19200     XtSetSensitive(display_phg_of_moving_button, FALSE);
19201   }
19202 
19203   redraw_on_new_data = 2;     // Immediate screen update
19204 }
19205 
19206 
19207 
19208 
19209 
19210 void Display_default_phg_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19211 {
19212   char *which = (char *)clientData;
19213   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19214 
19215   if (state->set)
19216   {
19217     Display_.default_phg = atoi(which);
19218   }
19219   else
19220   {
19221     Display_.default_phg = 0;
19222   }
19223 
19224   redraw_on_new_data = 2;     // Immediate screen update
19225 }
19226 
19227 
19228 
19229 
19230 
19231 void Display_phg_of_moving_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19232 {
19233   char *which = (char *)clientData;
19234   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19235 
19236   if (state->set)
19237   {
19238     Display_.phg_of_moving = atoi(which);
19239   }
19240   else
19241   {
19242     Display_.phg_of_moving = 0;
19243   }
19244 
19245   redraw_on_new_data = 2;     // Immediate screen update
19246 }
19247 
19248 
19249 
19250 
19251 
19252 void Display_df_data_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19253 {
19254   char *which = (char *)clientData;
19255   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19256 
19257   if (state->set)
19258   {
19259     Display_.df_data = atoi(which);
19260     XtSetSensitive(display_df_beamwidth_data_button,  TRUE);
19261     XtSetSensitive(display_df_bearing_data_button,    TRUE);
19262   }
19263   else
19264   {
19265     Display_.df_data = 0;
19266     XtSetSensitive(display_df_beamwidth_data_button,  FALSE);
19267     XtSetSensitive(display_df_bearing_data_button,    FALSE);
19268   }
19269   redraw_on_new_data = 2;     // Immediate screen update
19270 }
19271 
19272 void Display_df_beamwidth_data_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19273 {
19274   char *which = (char *)clientData;
19275   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19276 
19277   if (state->set)
19278   {
19279     Display_.df_beamwidth_data = atoi(which);
19280   }
19281   else
19282   {
19283     Display_.df_beamwidth_data = 0;
19284   }
19285 
19286   redraw_on_new_data = 2;     // Immediate screen update
19287 }
19288 
19289 void Display_df_bearing_data_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19290 {
19291   char *which = (char *)clientData;
19292   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19293 
19294   if (state->set)
19295   {
19296     Display_.df_bearing_data = atoi(which);
19297   }
19298   else
19299   {
19300     Display_.df_bearing_data = 0;
19301   }
19302 
19303   redraw_on_new_data = 2;     // Immediate screen update
19304 }
19305 
19306 
19307 
19308 
19309 
19310 void Display_dr_data_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19311 {
19312   char *which = (char *)clientData;
19313   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19314 
19315   if (state->set)
19316   {
19317     Display_.dr_data = atoi(which);
19318     XtSetSensitive(display_dr_arc_button,    TRUE);
19319     XtSetSensitive(display_dr_course_button, TRUE);
19320     XtSetSensitive(display_dr_symbol_button, TRUE);
19321   }
19322   else
19323   {
19324     Display_.dr_data = 0;
19325     XtSetSensitive(display_dr_arc_button,    FALSE);
19326     XtSetSensitive(display_dr_course_button, FALSE);
19327     XtSetSensitive(display_dr_symbol_button, FALSE);
19328   }
19329 
19330   redraw_on_new_data = 2;     // Immediate screen update
19331 }
19332 
19333 
19334 
19335 
19336 
19337 void Display_dr_arc_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19338 {
19339   char *which = (char *)clientData;
19340   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19341 
19342   if (state->set)
19343   {
19344     Display_.dr_arc = atoi(which);
19345   }
19346   else
19347   {
19348     Display_.dr_arc = 0;
19349   }
19350 
19351   redraw_on_new_data = 2;     // Immediate screen update
19352 }
19353 
19354 
19355 
19356 
19357 
19358 void Display_dr_course_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19359 {
19360   char *which = (char *)clientData;
19361   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19362 
19363   if (state->set)
19364   {
19365     Display_.dr_course = atoi(which);
19366   }
19367   else
19368   {
19369     Display_.dr_course = 0;
19370   }
19371 
19372   redraw_on_new_data = 2;     // Immediate screen update
19373 }
19374 
19375 
19376 
19377 
19378 
19379 void Display_dr_symbol_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19380 {
19381   char *which = (char *)clientData;
19382   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19383 
19384   if (state->set)
19385   {
19386     Display_.dr_symbol = atoi(which);
19387   }
19388   else
19389   {
19390     Display_.dr_symbol = 0;
19391   }
19392 
19393   redraw_on_new_data = 2;     // Immediate screen update
19394 }
19395 
19396 
19397 
19398 
19399 
19400 void Display_dist_bearing_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19401 {
19402   char *which = (char *)clientData;
19403   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19404 
19405   if (state->set)
19406   {
19407     Display_.dist_bearing = atoi(which);
19408   }
19409   else
19410   {
19411     Display_.dist_bearing = 0;
19412   }
19413 
19414   redraw_on_new_data = 2;     // Immediate screen update
19415 }
19416 
19417 
19418 
19419 
19420 
19421 void Display_last_heard_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
19422 {
19423   char *which = (char *)clientData;
19424   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19425 
19426   if (state->set)
19427   {
19428     Display_.last_heard = atoi(which);
19429   }
19430   else
19431   {
19432     Display_.last_heard = 0;
19433   }
19434 
19435   redraw_on_new_data = 2;     // Immediate screen update
19436 }
19437 
19438 
19439 
19440 
19441 
19442 /*
19443  *  Toggle unit system (button callbacks)
19444  */
19445 void  Units_choice_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19446 {
19447   char *which = (char *)clientData;
19448   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19449 
19450   if(state->set)
19451   {
19452     english_units = atoi(which);
19453   }
19454   else
19455   {
19456     english_units = 0;
19457   }
19458 
19459   redraw_on_new_data=2;
19460   update_units();                     // setup conversion
19461   fill_wx_data();
19462 }
19463 
19464 
19465 
19466 
19467 
19468 /*
19469  *  Toggle dist/bearing status (button callbacks)
19470  */
19471 void  Dbstatus_choice_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19472 {
19473   char *which = (char *)clientData;
19474   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19475 
19476   if(state->set)
19477   {
19478     do_dbstatus = atoi(which);
19479   }
19480   else
19481   {
19482     do_dbstatus = 0;
19483   }
19484   // we need to rebuild main window now???
19485   XtVaSetValues(text2, XmNwidth, do_dbstatus?((37*FONT_WIDTH)+2):((24*FONT_WIDTH)+2), NULL);
19486 
19487   redraw_on_new_data=2;
19488 }
19489 
19490 
19491 
19492 
19493 
19494 
19495 /*
19496  *  Update global variables for unit conversion
19497  *
19498  * Be careful using these, as they change based on the value of
19499  * english_units!  These variable should only be used when
19500  * DISPLAYING data, not when converting numbers for use in internal
19501  * storage or equations.
19502  *
19503  */
19504 void update_units(void)
19505 {
19506 
19507   switch (english_units)
19508   {
19509     case 1:     // English
19510       xastir_snprintf(un_alt,sizeof(un_alt),"ft");
19511       xastir_snprintf(un_dst,sizeof(un_dst),"mi");
19512       xastir_snprintf(un_spd,sizeof(un_spd),"mph");
19513       cvt_m2len  = 3.28084;   // m to ft
19514       cvt_dm2len = 0.328084;  // dm to ft
19515       cvt_hm2len = 0.0621504; // hm to mi
19516       cvt_kn2len = 1.1508;    // knots to mph
19517       cvt_mi2len = 1.0;       // mph to mph
19518       break;
19519     case 2:     // Nautical
19520       // add nautical miles and knots for future use
19521       xastir_snprintf(un_alt,sizeof(un_alt),"ft");
19522       xastir_snprintf(un_dst,sizeof(un_dst),"nm");
19523       xastir_snprintf(un_spd,sizeof(un_spd),"kn");
19524       cvt_m2len  = 3.28084;   // m to ft
19525       cvt_dm2len = 0.328084;  // dm to ft
19526       cvt_hm2len = 0.0539957; // hm to nm
19527       cvt_kn2len = 1.0;       // knots to knots
19528       cvt_mi2len = 0.8689607; // mph to knots / mi to nm
19529       break;
19530     default:    // Metric
19531       xastir_snprintf(un_alt,sizeof(un_alt),"m");
19532       xastir_snprintf(un_dst,sizeof(un_dst),"km");
19533       xastir_snprintf(un_spd,sizeof(un_spd),"km/h");
19534       cvt_m2len  = 1.0;       // m to m
19535       cvt_dm2len = 0.1;       // dm to m
19536       cvt_hm2len = 0.1;       // hm to km
19537       cvt_kn2len = 1.852;     // knots to km/h
19538       cvt_mi2len = 1.609;     // mph to km/h
19539       break;
19540   }
19541 }
19542 
19543 
19544 
19545 
19546 
19547 void  Auto_msg_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19548 {
19549   char *which = (char *)clientData;
19550   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19551 
19552   if(state->set)
19553   {
19554     auto_reply = atoi(which);
19555   }
19556   else
19557   {
19558     auto_reply = 0;
19559   }
19560 }
19561 
19562 
19563 
19564 
19565 
19566 void  Satellite_msg_ack_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19567 {
19568   char *which = (char *)clientData;
19569   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19570 
19571   if(state->set)
19572   {
19573     satellite_ack_mode = atoi(which);
19574   }
19575   else
19576   {
19577     satellite_ack_mode = 0;
19578   }
19579 }
19580 
19581 
19582 
19583 
19584 
19585 void  Transmit_disable_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19586 {
19587   char *which = (char *)clientData;
19588   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19589 
19590   if(state->set)
19591   {
19592     transmit_disable = atoi(which);
19593     XtSetSensitive(iface_transmit_now,FALSE);
19594     XtSetSensitive(object_tx_disable_toggle,FALSE);
19595     XtSetSensitive(posit_tx_disable_toggle,FALSE);
19596   }
19597   else
19598   {
19599     transmit_disable = 0;
19600     XtSetSensitive(iface_transmit_now,TRUE);
19601     XtSetSensitive(object_tx_disable_toggle,TRUE);
19602     XtSetSensitive(posit_tx_disable_toggle,TRUE);
19603   }
19604 }
19605 
19606 
19607 
19608 
19609 
19610 void  Posit_tx_disable_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19611 {
19612   char *which = (char *)clientData;
19613   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19614 
19615   if(state->set)
19616   {
19617     posit_tx_disable = atoi(which);
19618   }
19619   else
19620   {
19621     posit_tx_disable = 0;
19622   }
19623 }
19624 
19625 
19626 
19627 
19628 
19629 void  Object_tx_disable_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19630 {
19631   char *which = (char *)clientData;
19632   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19633 
19634   if(state->set)
19635   {
19636     object_tx_disable = atoi(which);
19637   }
19638   else
19639   {
19640     object_tx_disable = 0;
19641   }
19642 }
19643 
19644 
19645 
19646 
19647 
19648 void  Emergency_beacon_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19649 {
19650   char *which = (char *)clientData;
19651   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19652 
19653   if(state->set)
19654   {
19655     emergency_beacon = atoi(which);
19656 
19657 //WE7U
19658 // We need to send a posit or two immediately, shorten the interval
19659 // between posits, and add the string "EMERGENCY" to the posit
19660 // before anything else in the comment field.
19661 
19662     transmit_now = 1;
19663 
19664   }
19665   else
19666   {
19667     emergency_beacon = 0;
19668   }
19669 }
19670 
19671 
19672 
19673 
19674 
19675 void  Server_port_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19676 {
19677   char *which = (char *)clientData;
19678   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19679 
19680   if(state->set)
19681   {
19682     // Start the listening socket.  If we fork it early we end
19683     // up with much smaller process memory allocated for it and
19684     // all its children.  The server will authenticate each
19685     // client that connects.  We'll share all of our data with
19686     // the server, which will send it to all
19687     // connected/authenticated clients.  Anything transmitted by
19688     // the clients will come back to us and standard igating
19689     // rules should apply from there.
19690     //
19691     enable_server_port = atoi(which);
19692     tcp_server_pid = Fork_TCP_server(my_argc, my_argv, my_envp);
19693     udp_server_pid = Fork_UDP_server(my_argc, my_argv, my_envp);
19694   }
19695   else
19696   {
19697     enable_server_port = 0;
19698     shut_down_server();
19699   }
19700 }
19701 
19702 
19703 
19704 
19705 void Help_About( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
19706 {
19707   Widget about_dialog;
19708   Widget child;
19709   XmString xms, xa, xb;
19710   Arg al[400];
19711   unsigned int ac;
19712   float version;
19713   char string1[200];
19714   char string2[200];
19715   extern char gitstring[];
19716   char version_str[50];
19717 
19718   xastir_snprintf(string2, sizeof(string2),"\nXastir V%s %s\n",xastir_version,gitstring);
19719   xms = XmStringCreateLocalized(string2);
19720 
19721   xa = XmStringCreateLocalized("\n\n" ABOUT_MSG "\n\nLibraries used: " XASTIR_INSTALLED_LIBS "\n\n" ABOUT_OSM);  // Add some newlines
19722   xb = XmStringConcat(xms, xa);
19723   XmStringFree(xa);
19724   XmStringFree(xms);
19725   //xb is still defined
19726 
19727   xa = XmStringCreateLocalized("\n" XmVERSION_STRING);  // Add the Motif version string
19728   xms = XmStringConcat(xb, xa);
19729   XmStringFree(xa);
19730   XmStringFree(xb);
19731   //xms is still defined
19732 
19733   xa = XmStringCreateLocalized("\n");  // Add a newline
19734   xb = XmStringConcat(xms, xa);
19735   XmStringFree(xa);
19736   XmStringFree(xms);
19737   //xb is still defined
19738 
19739   xms = XmStringCopy(xb);
19740   XmStringFree(xb);
19741   //xms is still defined
19742 
19743 #ifdef HAVE_NETAX25_AXLIB_H
19744   //if (libax25_version != NULL) {
19745   xb = XmStringCreateLocalized("\n");
19746   xa = XmStringConcat(xb, xms);
19747   XmStringFree(xb);
19748   XmStringFree(xms);
19749   xb = XmStringCreateLocalized("@(#)LibAX25 (ax25lib_version is broken. Complain to the authors.)\n");
19750   xms = XmStringConcat(xa, xb);
19751   XmStringFree(xa);
19752   XmStringFree(xb);
19753   //}
19754 #endif  // AVE_NETAX25_AXLIB_H
19755 
19756 #ifdef HAVE_MAGICK
19757   xb = XmStringCreateLocalized("\n");  // Add a newline
19758   xa = XmStringConcat(xb, xms);
19759   XmStringFree(xb);
19760   XmStringFree(xms);
19761   //xa is still defined
19762 
19763   xb = XmStringCreateLocalized( MagickVersion);    // Add ImageMagick version string
19764   xms = XmStringConcat(xa, xb);
19765   XmStringFree(xa);
19766   XmStringFree(xb);
19767   //xms is still defined
19768 #endif  // HAVE_MAGICK
19769   xb = XmStringCreateLocalized("\n");  // Add a newline
19770   xa = XmStringConcat(xb, xms);
19771   XmStringFree(xb);
19772   XmStringFree(xms);
19773   //xa is still defined
19774 
19775   version = XRotVersion( string1, 99 );
19776 
19777   xastir_snprintf(version_str, sizeof(version_str), "%0.2f", version);
19778   strcpy(string2, "\n");
19779   string2[sizeof(string2)-1] = '\0';  // Terminate string
19780   strcat(string2, string1);
19781   string2[sizeof(string2)-1] = '\0';  // Terminate string
19782   strcat(string2, ", Version ");
19783   string2[sizeof(string2)-1] = '\0';  // Terminate string
19784   strcat(string2, version_str);
19785   string2[sizeof(string2)-1] = '\0';  // Terminate string
19786 
19787 
19788   xb = XmStringCreateLocalized( string2);    // Add Xvertext version string
19789   xms = XmStringConcat(xa, xb);
19790   XmStringFree(xa);
19791   XmStringFree(xb);
19792   //xms is still defined
19793 
19794   ac = 0;
19795   XtSetArg(al[ac], XmNmessageString, xms);
19796   ac++;
19797   // "About Xastir"
19798   XtSetArg(al[ac], XmNtitle, langcode("PULDNHEL05") );
19799   ac++;
19800   XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
19801   ac++;
19802   XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
19803   ac++;
19804   XtSetArg(al[ac], XmNfontList, fontlist1);
19805   ac++;
19806 
19807   // "About Xastir"
19808   about_dialog = XmCreateInformationDialog(appshell, langcode("PULDNHEL05"), al, ac);
19809   XmStringFree(xms);
19810   XtDestroyWidget(XmMessageBoxGetChild(about_dialog, (unsigned char)XmDIALOG_CANCEL_BUTTON));
19811   XtDestroyWidget(XmMessageBoxGetChild(about_dialog, (unsigned char)XmDIALOG_HELP_BUTTON));
19812 
19813   child = XmMessageBoxGetChild(about_dialog, XmDIALOG_MESSAGE_LABEL);
19814   XtVaSetValues(child, XmNfontList, fontlist1, NULL);
19815 
19816   XtManageChild(about_dialog);
19817   pos_dialog(about_dialog);
19818 }
19819 
19820 
19821 
19822 
19823 
19824 Widget GetTopShell(Widget w)
19825 {
19826   while(w && !XtIsWMShell(w))
19827   {
19828     w = XtParent(w);
19829   }
19830 
19831   return(w);
19832 }
19833 
19834 
19835 
19836 
19837 
19838 /*********************** Display incoming data*******************************/
19839 /****************************************************************************/
19840 
19841 void Display_data_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
19842 {
19843   Widget shell = (Widget) clientData;
19844   XtPopdown(shell);
19845   XtDestroyWidget(shell);
19846   Display_data_dialog = (Widget)NULL;
19847 }
19848 
19849 
19850 
19851 
19852 
19853 void  Display_packet_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
19854 {
19855   char *which = (char *)clientData;
19856   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19857 
19858   if(state->set)
19859   {
19860     Display_packet_data_type = atoi(which);
19861   }
19862   else
19863   {
19864     Display_packet_data_type = 0;
19865   }
19866 
19867   redraw_on_new_packet_data=1;
19868 }
19869 
19870 
19871 
19872 
19873 
19874 // Turn on or off "Station Capabilities", callback for capabilities
19875 // button.
19876 //
19877 void Capabilities_toggle( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer callData)
19878 {
19879   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19880 
19881   if(state->set)
19882   {
19883     show_only_station_capabilities = TRUE;
19884   }
19885   else
19886   {
19887     show_only_station_capabilities = FALSE;
19888   }
19889 }
19890 
19891 
19892 
19893 
19894 
19895 // Turn on or off "Mine Only"
19896 //
19897 void Display_packet_mine_only_toggle( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer callData)
19898 {
19899   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
19900 
19901   if(state->set)
19902   {
19903     Display_packet_data_mine_only = TRUE;
19904   }
19905   else
19906   {
19907     Display_packet_data_mine_only = FALSE;
19908   }
19909 }
19910 
19911 
19912 
19913 
19914 
19915 void Display_data( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
19916 {
19917   Widget pane, scrollwindow, my_form, button_close, option_box, tnc_data,
19918          net_data, tnc_net_data, capabilities_button,
19919          mine_only_button;
19920   unsigned int n;
19921   Arg args[50];
19922   Atom delw;
19923 
19924   if (!Display_data_dialog)
19925   {
19926     Display_data_dialog = XtVaCreatePopupShell(langcode("WPUPDPD001"),
19927                           xmDialogShellWidgetClass, appshell,
19928                           XmNdeleteResponse, XmDESTROY,
19929                           XmNdefaultPosition, FALSE,
19930                           XmNfontList, fontlist1,
19931                           NULL);
19932 
19933     pane = XtVaCreateWidget("Display_data pane",
19934                             xmPanedWindowWidgetClass,
19935                             Display_data_dialog,
19936                             MY_FOREGROUND_COLOR,
19937                             MY_BACKGROUND_COLOR,
19938                             NULL);
19939 
19940     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
19941                                            xmScrolledWindowWidgetClass,
19942                                            pane,
19943                                            XmNscrollingPolicy, XmAUTOMATIC,
19944                                            NULL);
19945 
19946     my_form =  XtVaCreateWidget("Display_data my_form",
19947                                 xmFormWidgetClass,
19948                                 scrollwindow,
19949                                 XmNfractionBase, 5,
19950                                 XmNautoUnmanage, FALSE,
19951                                 XmNshadowThickness, 1,
19952                                 MY_FOREGROUND_COLOR,
19953                                 MY_BACKGROUND_COLOR,
19954                                 NULL);
19955 
19956 
19957     /* set colors */
19958     n=0;
19959     XtSetArg(args[n],XmNforeground, MY_FG_COLOR);
19960     n++;
19961     XtSetArg(args[n],XmNbackground, MY_BG_COLOR);
19962     n++;
19963     XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);
19964     n++;
19965     XtSetArg(args[n], XmNtopOffset, 5);
19966     n++;
19967     XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE);
19968     n++;
19969     XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);
19970     n++;
19971     XtSetArg(args[n], XmNleftOffset, 5);
19972     n++;
19973     XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE);
19974     n++;
19975     XtSetArg(args[n], XmNfontList, fontlist1);
19976     n++;
19977 
19978     option_box = XmCreateRadioBox(my_form,
19979                                   "Display_data option box",
19980                                   args,
19981                                   n);
19982 
19983     XtVaSetValues(option_box,
19984                   XmNpacking, XmPACK_TIGHT,
19985                   XmNorientation, XmHORIZONTAL,
19986                   NULL);
19987 
19988     tnc_data = XtVaCreateManagedWidget(langcode("WPUPDPD002"),
19989                                        xmToggleButtonGadgetClass,
19990                                        option_box,
19991                                        MY_FOREGROUND_COLOR,
19992                                        MY_BACKGROUND_COLOR,
19993                                        XmNfontList, fontlist1,
19994                                        NULL);
19995 
19996     XtAddCallback(tnc_data,XmNvalueChangedCallback,Display_packet_toggle,"1");
19997 
19998     net_data = XtVaCreateManagedWidget(langcode("WPUPDPD003"),
19999                                        xmToggleButtonGadgetClass,
20000                                        option_box,
20001                                        MY_FOREGROUND_COLOR,
20002                                        MY_BACKGROUND_COLOR,
20003                                        XmNfontList, fontlist1,
20004                                        NULL);
20005 
20006     XtAddCallback(net_data,XmNvalueChangedCallback,Display_packet_toggle,"2");
20007 
20008     tnc_net_data = XtVaCreateManagedWidget(langcode("WPUPDPD004"),
20009                                            xmToggleButtonGadgetClass,
20010                                            option_box,
20011                                            MY_FOREGROUND_COLOR,
20012                                            MY_BACKGROUND_COLOR,
20013                                            XmNfontList, fontlist1,
20014                                            NULL);
20015 
20016     XtAddCallback(tnc_net_data,XmNvalueChangedCallback,Display_packet_toggle,"0");
20017 
20018     capabilities_button = XtVaCreateManagedWidget(langcode("WPUPDPD007"),
20019                           xmToggleButtonGadgetClass,
20020                           my_form,
20021                           XmNvisibleWhenOff, TRUE,
20022                           XmNindicatorSize, 12,
20023                           XmNtopAttachment, XmATTACH_FORM,
20024                           XmNtopOffset, 10,
20025                           XmNbottomAttachment, XmATTACH_NONE,
20026                           XmNleftAttachment, XmATTACH_WIDGET,
20027                           XmNleftWidget, option_box,
20028                           XmNleftOffset, 20,
20029                           XmNrightAttachment, XmATTACH_NONE,
20030                           MY_FOREGROUND_COLOR,
20031                           MY_BACKGROUND_COLOR,
20032                           XmNfontList, fontlist1,
20033                           NULL);
20034 
20035     XtAddCallback(capabilities_button, XmNvalueChangedCallback,Capabilities_toggle,"1");
20036 
20037     mine_only_button = XtVaCreateManagedWidget(langcode("WPUPDPD008"),
20038                        xmToggleButtonGadgetClass,
20039                        my_form,
20040                        XmNvisibleWhenOff, TRUE,
20041                        XmNindicatorSize, 12,
20042                        XmNtopAttachment, XmATTACH_FORM,
20043                        XmNtopOffset, 10,
20044                        XmNbottomAttachment, XmATTACH_NONE,
20045                        XmNleftAttachment, XmATTACH_WIDGET,
20046                        XmNleftWidget, capabilities_button,
20047                        XmNleftOffset, 20,
20048                        XmNrightAttachment, XmATTACH_NONE,
20049                        MY_FOREGROUND_COLOR,
20050                        MY_BACKGROUND_COLOR,
20051                        XmNfontList, fontlist1,
20052                        NULL);
20053 
20054     XtAddCallback(mine_only_button, XmNvalueChangedCallback,Display_packet_mine_only_toggle,"1");
20055 
20056     n=0;
20057     XtSetArg(args[n], XmNrows, 15);
20058     n++;
20059     XtSetArg(args[n], XmNcolumns, 100);
20060     n++;
20061     XtSetArg(args[n], XmNeditable, FALSE);
20062     n++;
20063     XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT);
20064     n++;
20065     XtSetArg(args[n], XmNwordWrap, TRUE);
20066     n++;
20067     XtSetArg(args[n], XmNforeground, MY_FG_COLOR);
20068     n++;
20069     XtSetArg(args[n], XmNbackground, MY_BG_COLOR);
20070     n++;
20071     XtSetArg(args[n], XmNscrollHorizontal, TRUE);
20072     n++;
20073     XtSetArg(args[n], XmNscrollVertical, TRUE);
20074     n++;
20075     XtSetArg(args[n], XmNcursorPositionVisible, FALSE);
20076     n++;
20077     XtSetArg(args[n], XmNtraversalOn, FALSE);
20078     n++;
20079     XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);
20080     n++;
20081     XtSetArg(args[n], XmNtopWidget, option_box);
20082     n++;
20083     XtSetArg(args[n], XmNtopOffset, 5);
20084     n++;
20085     XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);
20086     n++;
20087     XtSetArg(args[n], XmNbottomOffset, 30);
20088     n++;
20089     XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);
20090     n++;
20091     XtSetArg(args[n], XmNleftOffset, 5);
20092     n++;
20093     XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);
20094     n++;
20095     XtSetArg(args[n], XmNrightOffset, 5);
20096     n++;
20097     XtSetArg(args[n], XmNfontList, fontlist1);
20098     n++;
20099 
20100 
20101 //        XtSetArg(args[n], XmNnavigationType, XmTAB_GROUP); n++;
20102     Display_data_text=NULL;
20103     Display_data_text = XmCreateScrolledText(my_form,
20104                         "Display_data text",
20105                         args,
20106                         n);
20107 
20108 
20109     button_close = XtVaCreateManagedWidget(langcode("UNIOP00003"),
20110                                            xmPushButtonGadgetClass,
20111                                            my_form,
20112                                            XmNtopAttachment, XmATTACH_NONE,
20113                                            XmNbottomAttachment, XmATTACH_FORM,
20114                                            XmNleftAttachment, XmATTACH_POSITION,
20115                                            XmNleftPosition, 2,
20116                                            XmNrightAttachment, XmATTACH_POSITION,
20117                                            XmNrightPosition, 3,
20118                                            XmNnavigationType, XmTAB_GROUP,
20119                                            MY_FOREGROUND_COLOR,
20120                                            MY_BACKGROUND_COLOR,
20121                                            XmNfontList, fontlist1,
20122                                            NULL);
20123 
20124     XtAddCallback(button_close, XmNactivateCallback, Display_data_destroy_shell, Display_data_dialog);
20125 
20126 
20127 // I haven't figured out how to get the scrollbars to allow keyboard traversal.
20128 // When the ScrolledText widget is in the tab group, once you get there you can't
20129 // get out and it beeps at you when you try.  Frustrating.   For this dialog it's
20130 // probably not important enough to worry about.
20131 // I now have it set to allow TAB'ing into the ScrolledText widget, but to get
20132 // out you must do a <Shift><TAB>.  This sucks.  Even if you enable the
20133 // ScrolledText widget in the tab group, the scrollbars don't work with the
20134 // arrow keys.
20135 // ScrolledList works.  I need to convert to ScrolledList if
20136 // possible for output-only windows.
20137 
20138 
20139     pos_dialog(Display_data_dialog);
20140 
20141     delw = XmInternAtom(XtDisplay(Display_data_dialog),"WM_DELETE_WINDOW", FALSE);
20142     XmAddWMProtocolCallback(Display_data_dialog,
20143                             delw,
20144                             Display_data_destroy_shell,
20145                             (XtPointer)Display_data_dialog);
20146 
20147     switch (Display_packet_data_type)
20148     {
20149       case(0):
20150         XmToggleButtonSetState(tnc_net_data,TRUE,FALSE);
20151         break;
20152 
20153       case(1):
20154         XmToggleButtonSetState(tnc_data,TRUE,FALSE);
20155         break;
20156 
20157       case(2):
20158         XmToggleButtonSetState(net_data,TRUE,FALSE);
20159         break;
20160 
20161       default:
20162         XmToggleButtonSetState(tnc_net_data,TRUE,FALSE);
20163         break;
20164     }
20165 
20166     if (show_only_station_capabilities)
20167     {
20168       XmToggleButtonSetState(capabilities_button,TRUE,FALSE);
20169     }
20170     else
20171     {
20172       XmToggleButtonSetState(capabilities_button,FALSE,FALSE);
20173     }
20174 
20175     if (Display_packet_data_mine_only)
20176     {
20177       XmToggleButtonSetState(mine_only_button,TRUE,FALSE);
20178     }
20179     else
20180     {
20181       XmToggleButtonSetState(mine_only_button,FALSE,FALSE);
20182     }
20183 
20184     XtManageChild(option_box);
20185     XtManageChild(Display_data_text);
20186     XtVaSetValues(Display_data_text, XmNbackground, colors[0x0f], NULL);
20187     XtManageChild(my_form);
20188     XtManageChild(pane);
20189 
20190     resize_dialog(my_form, Display_data_dialog);
20191 
20192     redraw_on_new_packet_data=1;
20193     XtPopup(Display_data_dialog,XtGrabNone);
20194 
20195     // Move focus to the Close button.  This appears to highlight the
20196     // button fine, but we're not able to hit the <Enter> key to
20197     // have that default function happen.  Note:  We _can_ hit the
20198     // <SPACE> key, and that activates the option.
20199 //        XmUpdateDisplay(Display_data_dialog);
20200     XmProcessTraversal(button_close, XmTRAVERSE_CURRENT);
20201 
20202   }
20203   else
20204   {
20205     (void)XRaiseWindow(XtDisplay(Display_data_dialog), XtWindow(Display_data_dialog));
20206   }
20207 
20208 }
20209 
20210 
20211 
20212 
20213 
20214 /****************************** Help menu ***********************************/
20215 /****************************************************************************/
20216 
20217 void help_view_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
20218 {
20219   Widget shell = (Widget) clientData;
20220   XtPopdown(shell);
20221   XtDestroyWidget(shell);
20222   help_view_dialog = (Widget)NULL;
20223 }
20224 
20225 
20226 
20227 
20228 
20229 void help_index_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
20230 {
20231   Widget shell = (Widget) clientData;
20232 
20233   if (help_view_dialog)
20234   {
20235     help_view_destroy_shell(help_view_dialog, help_view_dialog, NULL);
20236   }
20237 
20238   help_view_dialog = (Widget)NULL;
20239 
20240   XtPopdown(shell);
20241   XtDestroyWidget(shell);
20242   help_index_dialog = (Widget)NULL;
20243 }
20244 
20245 
20246 
20247 
20248 
20249 void help_view( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
20250 {
20251   Widget pane, scrollwindow, my_form, button_close,help_text;
20252   int i;
20253   Position x, y;
20254   unsigned int n;
20255   char *temp = NULL;
20256   char title[200];
20257   char temp2[200];
20258   char temp3[200];
20259   FILE *f;
20260   XmString *list;
20261   int open;
20262   Arg args[50];
20263   int data_on,pos;
20264   int found;
20265   Atom delw;
20266   char help_file_path[MAX_VALUE];
20267 
20268   data_on=0;
20269   pos=0;
20270   found=0;
20271 
20272   XtVaGetValues(help_list,
20273                 XmNitemCount,&i,
20274                 XmNitems,&list,
20275                 NULL);
20276 
20277   for (x=1; x<=i; x++)
20278   {
20279     if (XmListPosSelected(help_list,x))
20280     {
20281       found=1;
20282       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_BEGINNING);
20283       x=i+1;
20284     }
20285   }
20286   open=0;
20287 
20288   if (found)
20289   {
20290     if (help_view_dialog)
20291     {
20292       XtVaGetValues(help_view_dialog, XmNx, &x, XmNy, &y, NULL);
20293       help_view_destroy_shell(help_view_dialog, help_view_dialog, NULL);
20294       help_view_dialog = (Widget)NULL;
20295       open=1;
20296     }
20297     if (!help_view_dialog)
20298     {
20299       xastir_snprintf(title, sizeof(title), "%s - %s", langcode("MENUTB0009"), temp);
20300       help_view_dialog = XtVaCreatePopupShell(title,
20301                                               xmDialogShellWidgetClass, appshell,
20302                                               XmNdeleteResponse,XmDESTROY,
20303                                               XmNdefaultPosition, FALSE,
20304                                               XmNfontList, fontlist1,
20305                                               NULL);
20306       pane = XtVaCreateWidget("help_view pane",
20307                               xmPanedWindowWidgetClass,
20308                               help_view_dialog,
20309                               MY_FOREGROUND_COLOR,
20310                               MY_BACKGROUND_COLOR,
20311                               NULL);
20312 
20313       scrollwindow = XtVaCreateManagedWidget("scrollwindow",
20314                                            xmScrolledWindowWidgetClass,
20315                                            pane,
20316                                            XmNscrollingPolicy, XmAUTOMATIC,
20317                                            NULL);
20318 
20319       my_form =  XtVaCreateWidget("help_view my_form",
20320                                   xmFormWidgetClass,
20321                                   scrollwindow,
20322                                   XmNfractionBase, 5,
20323                                   XmNautoUnmanage, FALSE,
20324                                   XmNshadowThickness, 1,
20325                                   MY_FOREGROUND_COLOR,
20326                                   MY_BACKGROUND_COLOR,
20327                                   NULL);
20328 
20329       n=0;
20330       XtSetArg(args[n], XmNrows, 20);
20331       n++;
20332       XtSetArg(args[n], XmNcolumns, 80);
20333       n++;
20334       XtSetArg(args[n], XmNeditable, FALSE);
20335       n++;
20336       XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT);
20337       n++;
20338       XtSetArg(args[n], XmNwordWrap, TRUE);
20339       n++;
20340       XtSetArg(args[n], XmNscrollHorizontal, FALSE);
20341       n++;
20342       XtSetArg(args[n], XmNcursorPositionVisible, FALSE);
20343       n++;
20344       XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM);
20345       n++;
20346       XtSetArg(args[n], XmNtopOffset, 5);
20347       n++;
20348       XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE);
20349       n++;
20350       XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);
20351       n++;
20352       XtSetArg(args[n], XmNleftOffset, 5);
20353       n++;
20354       XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);
20355       n++;
20356       XtSetArg(args[n], XmNrightOffset, 5);
20357       n++;
20358       XtSetArg(args[n], XmNforeground, MY_FG_COLOR);
20359       n++;
20360       XtSetArg(args[n], XmNbackground, MY_BG_COLOR);
20361       n++;
20362       XtSetArg(args[n], XmNfontList, fontlist1);
20363       n++;
20364 
20365       help_text=NULL;
20366       help_text = XmCreateScrolledText(my_form,
20367                                        "help_view help text",
20368                                        args,
20369                                        n);
20370 
20371       get_user_base_dir(HELP_FILE, help_file_path, sizeof(help_file_path));
20372 
20373       f=fopen( help_file_path, "r" );
20374       if (f!=NULL)
20375       {
20376         while(!feof(f))
20377         {
20378           (void)get_line(f,temp2,200);
20379           if (strncmp(temp2,"HELP-INDEX>",11)==0)
20380           {
20381             if(strcmp((temp2+11),temp)==0)
20382             {
20383               data_on=1;
20384             }
20385             else
20386             {
20387               data_on=0;
20388             }
20389           }
20390           else
20391           {
20392             if (data_on)
20393             {
20394               strcpy(temp3, temp2);
20395               temp3[sizeof(temp3)-1] = '\0';  // Terminate string
20396               strcat(temp3, "\n");
20397               temp3[sizeof(temp3)-1] = '\0';  // Terminate string
20398 
20399               XmTextInsert(help_text,pos,temp3);
20400               pos += strlen(temp3);
20401               XmTextShowPosition(help_text,0);
20402             }
20403           }
20404         }
20405         (void)fclose(f);
20406       }
20407       else
20408       {
20409         fprintf(stderr,"Couldn't open file: %s\n", help_file_path);
20410       }
20411 
20412       button_close = XtVaCreateManagedWidget(langcode("UNIOP00003"),
20413                                              xmPushButtonGadgetClass,
20414                                              my_form,
20415                                              XmNtopAttachment, XmATTACH_WIDGET,
20416                                              XmNtopWidget, XtParent(help_text),
20417                                              XmNtopOffset, 5,
20418                                              XmNbottomAttachment, XmATTACH_FORM,
20419                                              XmNbottomOffset, 5,
20420                                              XmNleftAttachment, XmATTACH_POSITION,
20421                                              XmNleftPosition, 2,
20422                                              XmNrightAttachment, XmATTACH_POSITION,
20423                                              XmNrightPosition, 3,
20424                                              XmNfontList, fontlist1,
20425                                              NULL);
20426 
20427       XtAddCallback(button_close, XmNactivateCallback, help_view_destroy_shell, help_view_dialog);
20428 
20429       if (!open)
20430       {
20431         pos_dialog(help_view_dialog);
20432       }
20433       else
20434       {
20435         XtVaSetValues(help_view_dialog, XmNx, x, XmNy, y, NULL);
20436       }
20437 
20438       delw = XmInternAtom(XtDisplay(help_view_dialog),"WM_DELETE_WINDOW", FALSE);
20439       XmAddWMProtocolCallback(help_view_dialog, delw, help_view_destroy_shell, (XtPointer)help_view_dialog);
20440 
20441       XtManageChild(my_form);
20442       XtManageChild(help_text);
20443       XtVaSetValues(help_text, XmNbackground, colors[0x0f], NULL);
20444       XtManageChild(pane);
20445 
20446       resize_dialog(my_form, help_view_dialog);
20447 
20448       XtPopup(help_view_dialog,XtGrabNone);
20449       XmTextShowPosition(help_text,0);
20450     }
20451     XtFree(temp);   // Free up the space allocated
20452   }
20453 
20454 }
20455 
20456 
20457 
20458 
20459 
20460 void Help_Index( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
20461 {
20462   static Widget pane, scrollwindow, my_form, button_ok, button_cancel;
20463   int n;
20464   char temp[600];
20465   FILE *f;
20466   Arg al[50];           /* Arg List */
20467   unsigned int ac = 0;           /* Arg Count */
20468   Atom delw;
20469   XmString str_ptr;
20470   char help_file_path[MAX_VALUE];
20471 
20472   if(!help_index_dialog)
20473   {
20474     help_index_dialog = XtVaCreatePopupShell(langcode("WPUPHPI001"),
20475                         xmDialogShellWidgetClass,
20476                         appshell,
20477                         XmNdeleteResponse,XmDESTROY,
20478                         XmNdefaultPosition, FALSE,
20479                         XmNresize, FALSE,
20480                         XmNfontList, fontlist1,
20481                         NULL);
20482 
20483     pane = XtVaCreateWidget("Help_Index pane",
20484                             xmPanedWindowWidgetClass,
20485                             help_index_dialog,
20486                             MY_FOREGROUND_COLOR,
20487                             MY_BACKGROUND_COLOR,
20488                             NULL);
20489 
20490     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
20491                                            xmScrolledWindowWidgetClass,
20492                                            pane,
20493                                            XmNscrollingPolicy, XmAUTOMATIC,
20494                                            NULL);
20495 
20496     my_form =  XtVaCreateWidget("Help_Index my_form",
20497                                 xmFormWidgetClass,
20498                                 scrollwindow,
20499                                 XmNfractionBase, 5,
20500                                 XmNautoUnmanage, FALSE,
20501                                 XmNshadowThickness, 1,
20502                                 MY_FOREGROUND_COLOR,
20503                                 MY_BACKGROUND_COLOR,
20504                                 NULL);
20505 
20506     /*set args for color */
20507     ac=0;
20508     XtSetArg(al[ac], XmNvisibleItemCount, 11);
20509     ac++;
20510     XtSetArg(al[ac], XmNtraversalOn, TRUE);
20511     ac++;
20512     XtSetArg(al[ac], XmNshadowThickness, 3);
20513     ac++;
20514     XtSetArg(al[ac], XmNbackground, colors[0x0ff]);
20515     ac++;
20516     XtSetArg(al[ac], XmNselectionPolicy, XmSINGLE_SELECT);
20517     ac++;
20518     XtSetArg(al[ac], XmNscrollBarPlacement, XmBOTTOM_RIGHT);
20519     ac++;
20520     XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM);
20521     ac++;
20522     XtSetArg(al[ac], XmNtopOffset, 5);
20523     ac++;
20524     XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE);
20525     ac++;
20526     XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM);
20527     ac++;
20528     XtSetArg(al[ac], XmNrightOffset, 5);
20529     ac++;
20530     XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM);
20531     ac++;
20532     XtSetArg(al[ac], XmNleftOffset, 5);
20533     ac++;
20534     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
20535     ac++;
20536     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
20537     ac++;
20538     XtSetArg(al[ac], XmNfontList, fontlist1);
20539     ac++;
20540 
20541     help_list = XmCreateScrolledList(my_form,
20542                                      "Help_Index list",
20543                                      al,
20544                                      ac);
20545 
20546     n=1;
20547 
20548     get_user_base_dir(HELP_FILE, help_file_path, sizeof(help_file_path));
20549 
20550     f=fopen( help_file_path, "r" );
20551     if (f!=NULL)
20552     {
20553       while (!feof(f))
20554       {
20555         (void)get_line(f,temp,600);
20556         if (strncmp(temp,"HELP-INDEX>",11)==0)
20557         {
20558           XmListAddItem(help_list, str_ptr = XmStringCreateLocalized((temp+11)),n++);
20559           XmStringFree(str_ptr);
20560         }
20561       }
20562       (void)fclose(f);
20563     }
20564     else
20565     {
20566       fprintf(stderr,"Couldn't open file: %s\n", help_file_path );
20567     }
20568 
20569     button_ok = XtVaCreateManagedWidget(langcode("WPUPHPI002"),
20570                                         xmPushButtonGadgetClass,
20571                                         my_form,
20572                                         XmNtopAttachment, XmATTACH_WIDGET,
20573                                         XmNtopWidget, XtParent(help_list),
20574                                         XmNtopOffset,5,
20575                                         XmNbottomAttachment, XmATTACH_FORM,
20576                                         XmNbottomOffset,5,
20577                                         XmNleftAttachment, XmATTACH_POSITION,
20578                                         XmNleftPosition, 1,
20579                                         XmNrightAttachment, XmATTACH_POSITION,
20580                                         XmNrightPosition, 2,
20581                                         XmNnavigationType, XmTAB_GROUP,
20582                                         XmNfontList, fontlist1,
20583                                         NULL);
20584 
20585     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00003"),
20586                                             xmPushButtonGadgetClass,
20587                                             my_form,
20588                                             XmNtopAttachment, XmATTACH_WIDGET,
20589                                             XmNtopWidget, XtParent(help_list),
20590                                             XmNtopOffset,5,
20591                                             XmNbottomAttachment, XmATTACH_FORM,
20592                                             XmNbottomOffset,5,
20593                                             XmNleftAttachment, XmATTACH_POSITION,
20594                                             XmNleftPosition, 3,
20595                                             XmNrightAttachment, XmATTACH_POSITION,
20596                                             XmNrightPosition, 4,
20597                                             XmNnavigationType, XmTAB_GROUP,
20598                                             XmNfontList, fontlist1,
20599                                             NULL);
20600 
20601     XtAddCallback(button_cancel, XmNactivateCallback, help_index_destroy_shell, help_index_dialog);
20602     XtAddCallback(button_ok, XmNactivateCallback, help_view, NULL);
20603 
20604     pos_dialog(help_index_dialog);
20605 
20606     delw = XmInternAtom(XtDisplay(help_index_dialog),"WM_DELETE_WINDOW", FALSE);
20607     XmAddWMProtocolCallback(help_index_dialog, delw, help_index_destroy_shell, (XtPointer)help_index_dialog);
20608 
20609     XtManageChild(my_form);
20610     XtManageChild(help_list);
20611     XtVaSetValues(help_list, XmNbackground, colors[0x0f], NULL);
20612     XtManageChild(pane);
20613 
20614     resize_dialog(my_form, help_index_dialog);
20615 
20616     XtPopup(help_index_dialog,XtGrabNone);
20617 
20618     // Move focus to the Cancel button.  This appears to highlight the
20619     // button fine, but we're not able to hit the <Enter> key to
20620     // have that default function happen.  Note:  We _can_ hit the
20621     // <SPACE> key, and that activates the option.
20622 //        XmUpdateDisplay(help_index_dialog);
20623     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
20624 
20625   }
20626   else
20627   {
20628     XtPopup(help_index_dialog,XtGrabNone);
20629     (void)XRaiseWindow(XtDisplay(help_index_dialog), XtWindow(help_index_dialog));
20630   }
20631 }
20632 
20633 
20634 
20635 
20636 
20637 /************************** Clear stations *******************************/
20638 /*************************************************************************/
20639 
20640 void Stations_Clear( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
20641 {
20642 
20643   delete_all_stations();
20644 
20645   my_station_add(my_callsign,my_group,my_symbol,my_long,my_lat,my_phg,my_comment,(char)position_amb_chars);
20646 
20647   current_trail_color = 0x00;  // restart
20648 
20649   // Reload saved objects and items from previous runs.
20650   // This implements persistent objects.
20651   reload_object_item();
20652 
20653   redraw_on_new_data=2;
20654 }
20655 
20656 
20657 
20658 
20659 
20660 /************************* Map Properties*********************************/
20661 /*************************************************************************/
20662 
20663 // Destroys the Map Properties dialog
20664 void map_properties_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
20665 {
20666   Widget shell = (Widget) clientData;
20667   XtPopdown(shell);
20668   XtDestroyWidget(shell);
20669   map_properties_dialog = (Widget)NULL;
20670   re_sort_maps = 1;
20671 
20672   if (map_chooser_dialog)
20673   {
20674     XtSetSensitive(map_chooser_button_ok, TRUE);
20675     XtSetSensitive(map_chooser_button_cancel, TRUE);
20676   }
20677 }
20678 
20679 
20680 
20681 
20682 
20683 //WE7U
20684 // Possible changes:
20685 // *) Save/restore the map selections while changing properties.
20686 //    Malloc a char array the size of the map_properties_list and
20687 //    fill it in based on the current highlighting.  Free it when
20688 //    we're done.
20689 // *) Change the labels at the top into buttons?  Zoom/Layer buttons
20690 //    would pop up a dialog asking for the number.  Others would
20691 //    just toggle the feature.
20692 // *) Change to a single "Apply" button.  This won't allow us to
20693 //    easily change only some parameters unless we skip input fields
20694 //    that are blank.  Run through highlighted items, fill in input
20695 //    fields if the parameter is the same for all.  If different for
20696 //    some, leave input field blank.
20697 // *) Bring up an "Abandon Changes?" confirmation dialog if input
20698 //    fields are filled in but "Cancel" was pressed instead of
20699 //    "Apply".
20700 
20701 
20702 
20703 // Fills in the map properties file entries.
20704 //
20705 void map_properties_fill_in (void)
20706 {
20707   int n;
20708 //  int i;
20709   XmString str_ptr;
20710   map_index_record *current = map_index_head;
20711   int top_position;
20712 
20713 
20714   busy_cursor(appshell);
20715 
20716 //    i=0;
20717   if (map_properties_dialog)
20718   {
20719     char *current_selections = NULL;
20720     int kk, mm;
20721 
20722 
20723     // Save our current place in the dialog
20724     XtVaGetValues(map_properties_list,
20725                   XmNtopItemPosition, &top_position,
20726                   NULL);
20727 
20728     // Get the list count from the dialog
20729     XtVaGetValues(map_properties_list,
20730                   XmNitemCount,&kk,
20731                   NULL);
20732 
20733     if (kk)     // If list is not empty
20734     {
20735       // Allocate enough chars to hold the highlighting info
20736       current_selections = (char *)malloc(sizeof(char) * kk);
20737 //fprintf(stderr,"List entries:%d\n", kk);
20738 
20739       // Iterate over the list, saving the highlighting values
20740       for (mm = 0; mm < kk; mm++)
20741       {
20742         if (XmListPosSelected(map_properties_list, mm))
20743         {
20744           current_selections[mm] = 1;
20745         }
20746         else
20747         {
20748           current_selections[mm] = 0;
20749         }
20750       }
20751     }
20752 
20753 //        fprintf(stderr,"Top Position: %d\n",top_position);
20754 
20755     // Empty the map_properties_list widget first
20756     XmListDeleteAllItems(map_properties_list);
20757 
20758     // Put all the map files/dirs in the map_index into the Map
20759     // Properties dialog list (map_properties_list).  Include
20760     // the map_layer and draw_filled variables on the line.
20761     n=1;
20762 
20763 
20764 //
20765 // We wish to only show the files that are currently selected in the
20766 // map_chooser_dialog's map_list widget.  We'll need to run down
20767 // that widget's entries, checking whether each line is selected,
20768 // and only display it in the map_properties_list widget if selected
20769 // and a match with our string.
20770 //
20771 // One method would be to make the Map Chooser selections set a bit
20772 // in the in-memory index, so that we can tell which ones are
20773 // selected without a bunch of string compares.  The bit would need
20774 // to be tweaked on starting up the map chooser (setting the
20775 // selected entries that match the selected_maps.sys file), and when
20776 // the user tweaked a selection.
20777 //
20778 // What we don't want to get into is an n*n set of string compares
20779 // between two lists, which would be very slow.  If they're both
20780 // ordered lists though, we'll end up with at most a 2n multiplier,
20781 // which is much better.  If we can pass the info between the lists
20782 // with a special entry in the record, we don't slow down at all.
20783 //
20784 // Reasonably fast method:  Create a new list that contains only the
20785 // selected items from map_list.  Run through this list as we
20786 // populate map_properties_list from the big linked list.
20787 //
20788 // Actually, it's probably just as fast to run down through
20789 // map_list, looking up records for every line that's selected.
20790 // Just keep the pointers incrementing for each list instead of
20791 // running through the entire in-memory linked list for every
20792 // selected item in map_list.
20793 //
20794 // For selected directories, we need to add each file that has that
20795 // initial directory name.  We should be able to do this with a
20796 // match that stops at the end of the directory name.
20797 //
20798 // We need to grey-out the buttons in the Map Chooser until the
20799 // Properties dialog closes.  Otherwise we might not able to get to
20800 // to the map_list widget to re-do the Properties list when a button
20801 // is pressed in the Properties dialog (if the user closes the Map
20802 // Chooser).
20803 //
20804 
20805 
20806     // Set all of the temp_select bits to zero in the in-memory
20807     // map index.
20808     map_index_temp_select_clear();
20809 
20810     if (map_chooser_dialog)
20811     {
20812       map_index_record *ptr = map_index_head;
20813       int jj, x;
20814       XmString *list;
20815       char *temp;
20816 
20817       // Get the list and list count from the Map Chooser
20818       // dialog.
20819       XtVaGetValues(map_list,
20820                     XmNitemCount,&jj,
20821                     XmNitems,&list,
20822                     NULL);
20823 
20824       // Find all selected files/directories in the Map
20825       // Chooser.  Set the "temp_select" bits in the in-memory
20826       // map index to correspond.
20827       //
20828       for(x=1; x<=jj; x++)
20829       {
20830         if (XmListPosSelected(map_list,x))
20831         {
20832           // Snag the filename portion from the line
20833           temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_BEGINNING);
20834           if (temp)
20835           {
20836 
20837             // Update this file or directory in the in-memory
20838             // map index, setting the "temp_select" field to 1.
20839             map_index_update_temp_select(temp, &ptr);
20840             XtFree(temp);
20841           }
20842         }
20843       }
20844     }
20845 
20846     // We should now have all of the files/directories marked in
20847     // the in-memory map index.  Files underneath selected
20848     // directories should also be marked by this point, as the
20849     // map_index_update_temp_select() routine should assure
20850     // this.
20851 
20852     while (current != NULL)
20853     {
20854 
20855       if (current->temp_select)
20856       {
20857 
20858         //fprintf(stderr,"%s\n",current->filename);
20859 
20860         // Make sure it's a file and not a directory
20861         if (current->filename[strlen(current->filename)-1] != '/')
20862         {
20863           char temp[MAX_FILENAME+100];
20864           char temp_layer[10];
20865           char temp_max_zoom[10];
20866           char temp_min_zoom[10];
20867           char temp_filled[20];
20868           char temp_drg[20];
20869           char temp_auto[20];
20870           int len, start;
20871 
20872 
20873           // We have a file.  Construct the line that we wish
20874           // to place in the list
20875 
20876           // JMT - this is a guess
20877           if (current->max_zoom == 0)
20878           {
20879             xastir_snprintf(temp_max_zoom,
20880                             sizeof(temp_max_zoom),
20881                             "  -  ");
20882           }
20883           else
20884           {
20885             xastir_snprintf(temp_max_zoom,
20886                             sizeof(temp_max_zoom),
20887                             "%5d",
20888                             current->max_zoom);
20889           }
20890 
20891           if (current->min_zoom == 0)
20892           {
20893             xastir_snprintf(temp_min_zoom,
20894                             sizeof(temp_min_zoom),
20895                             "  -  ");
20896           }
20897           else
20898           {
20899             xastir_snprintf(temp_min_zoom,
20900                             sizeof(temp_min_zoom),
20901                             "%5d",
20902                             current->min_zoom);
20903           }
20904 
20905           if (current->map_layer == 0)
20906           {
20907             xastir_snprintf(temp_layer,
20908                             sizeof(temp_layer),
20909                             "  -  ");
20910           }
20911           else
20912           {
20913             xastir_snprintf(temp_layer,
20914                             sizeof(temp_layer),
20915                             "%5d",
20916                             current->map_layer);
20917           }
20918 
20919           xastir_snprintf(temp_filled,
20920                           sizeof(temp_filled),
20921                           "     ");
20922 
20923           switch (current->draw_filled)
20924           {
20925 
20926             case 0: // Global No-Fill (vector)
20927 
20928               // Center the string in the column
20929               len = strlen(langcode("MAPP007"));
20930               start = (int)( (5 - len) / 2 + 0.5);
20931 
20932               if (start < 0)
20933               {
20934                 start = 0;
20935               }
20936 
20937               // Insert the string.  Fill with spaces
20938               // on the end.
20939               xastir_snprintf(&temp_filled[start],
20940                               sizeof(temp_filled)-start,
20941                               "%s     ",
20942                               langcode("MAPP007"));   // "No"
20943 
20944               break;
20945 
20946             case 1: // Global Fill
20947 
20948               // Center the string in the column
20949               len = strlen(langcode("MAPP006"));
20950               start = (int)( (5 - len) / 2 + 0.5);
20951 
20952               if (start < 0)
20953               {
20954                 start = 0;
20955               }
20956 
20957               // Insert the string.  Fill with spaces
20958               // on the end.
20959               xastir_snprintf(&temp_filled[start],
20960                               sizeof(temp_filled)-start,
20961                               "%s     ",
20962                               langcode("MAPP006"));   // "Yes"
20963 
20964               break;
20965 
20966             case 2: // Auto
20967             default:
20968 
20969               // Center the string in the column
20970               len = strlen(langcode("MAPP011"));
20971               start = (int)( (5 - len) / 2 + 1.5);
20972 
20973               if (start < 0)
20974               {
20975                 start = 0;
20976               }
20977 
20978               // Insert the string.  Fill with spaces
20979               // on the end.
20980               xastir_snprintf(&temp_filled[start],
20981                               sizeof(temp_filled)-start,
20982                               "%s     ",
20983                               langcode("MAPP011"));   // "Auto"
20984 
20985               break;
20986 
20987           }   // End of switch
20988 
20989           // Truncate it so it fits our column width.
20990           temp_filled[5] = '\0';
20991 
20992           xastir_snprintf(temp_drg,
20993                           sizeof(temp_drg),
20994                           "     ");
20995 
20996           switch (current->usgs_drg)
20997           {
20998 
20999             case 0: // No
21000 
21001               // Center the string in the column
21002               len = strlen(langcode("MAPP007"));
21003               start = (int)( (5 - len) / 2 + 0.5);
21004 
21005               if (start < 0)
21006               {
21007                 start = 0;
21008               }
21009 
21010               // Insert the string.  Fill with spaces
21011               // on the end.
21012               xastir_snprintf(&temp_drg[start],
21013                               sizeof(temp_drg)-start,
21014                               "%s     ",
21015                               langcode("MAPP007"));   // "No"
21016 
21017               break;
21018 
21019             case 1: // Yes
21020 
21021               // Center the string in the column
21022               len = strlen(langcode("MAPP006"));
21023               start = (int)( (5 - len) / 2 + 0.5);
21024 
21025               if (start < 0)
21026               {
21027                 start = 0;
21028               }
21029 
21030               // Insert the string.  Fill with spaces
21031               // on the end.
21032               xastir_snprintf(&temp_drg[start],
21033                               sizeof(temp_drg)-start,
21034                               "%s     ",
21035                               langcode("MAPP006"));   // "Yes"
21036 
21037               break;
21038 
21039             case 2: // Auto
21040             default:
21041 
21042               // Center the string in the column
21043               len = strlen(langcode("MAPP011"));
21044               start = (int)( (5 - len) / 2 + 1.5);
21045 
21046               if (start < 0)
21047               {
21048                 start = 0;
21049               }
21050 
21051               // Insert the string.  Fill with spaces
21052               // on the end.
21053               xastir_snprintf(&temp_drg[start],
21054                               sizeof(temp_drg)-start,
21055                               "%s     ",
21056                               langcode("MAPP011"));   // "Auto"
21057 
21058               break;
21059 
21060           }   // End of switch
21061 
21062           // Truncate it so it fits our column width.
21063           temp_drg[5] = '\0';
21064 
21065           xastir_snprintf(temp_auto,
21066                           sizeof(temp_auto),
21067                           "     ");
21068 
21069           if (current->auto_maps)
21070           {
21071             int len, start;
21072 
21073             // Center the string in the column
21074             len = strlen(langcode("MAPP006"));
21075             start = (int)( (5 - len) / 2 + 0.5);
21076 
21077             if (start < 0)
21078             {
21079               start = 0;
21080             }
21081 
21082             // Insert the string.  Fill with spaces on the
21083             // end.
21084             xastir_snprintf(&temp_auto[start],
21085                             sizeof(temp_filled)-start,
21086                             "%s     ",
21087                             langcode("MAPP006"));
21088 
21089             // Truncate it so it fits our column width.
21090             temp_auto[5] = '\0';
21091           }
21092 
21093           //WARNING WARNING WARNING --- changing this format string
21094           // REQUIRES changing the defined constant MPD_FILENAME_OFFSET
21095           // at the top of this file, or all the routines that try
21096           // to decode the string will be wrong!
21097           xastir_snprintf(temp,
21098                           sizeof(temp),
21099                           "%s %s %s %s %s %s  %s",
21100                           temp_max_zoom,
21101                           temp_min_zoom,
21102                           temp_layer,
21103                           temp_filled,
21104                           temp_drg,
21105                           temp_auto,
21106                           current->filename);
21107 
21108           str_ptr = XmStringCreateLocalized(temp);
21109           XmListAddItem(map_properties_list, str_ptr, n);
21110           n++;
21111           XmStringFree(str_ptr);
21112         }
21113       }
21114 
21115       current = current->next;
21116     }
21117 
21118     if (kk)     // If list is not empty
21119     {
21120       // Restore the highlighting values
21121       for (mm = 0; mm < kk; mm++)
21122       {
21123         if (current_selections[mm])
21124         {
21125           XmListSelectPos(map_properties_list,mm,TRUE);
21126         }
21127       }
21128       // Free the highlighting array we allocated
21129       free(current_selections);
21130     }
21131 
21132     // Restore our place in the dialog
21133     XtVaSetValues(map_properties_list,
21134                   XmNtopItemPosition, top_position,
21135                   NULL);
21136   }
21137 }
21138 
21139 
21140 
21141 
21142 
21143 // Removes the highlighting for maps in the current view of the map
21144 // properties list.
21145 //
21146 void map_properties_deselect_maps(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21147 {
21148   int i, x;
21149   XmString *list;
21150 
21151   // Get the list and the count from the dialog
21152   XtVaGetValues(map_properties_list,
21153                 XmNitemCount,&i,
21154                 XmNitems,&list,
21155                 NULL);
21156 
21157   // Run through the widget's list, deselecting every line
21158   for(x=1; x<=i; x++)
21159   {
21160     if (XmListPosSelected(map_properties_list,x))
21161     {
21162       XmListDeselectPos(map_properties_list,x);
21163     }
21164   }
21165 }
21166 
21167 
21168 
21169 
21170 
21171 // Selects all maps in the current view of the map properties list.
21172 //
21173 void map_properties_select_all_maps(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21174 {
21175   int i, x;
21176   XmString *list;
21177 
21178   // Get the list and the count from the dialog
21179   XtVaGetValues(map_properties_list,
21180                 XmNitemCount,&i,
21181                 XmNitems,&list,
21182                 NULL);
21183 
21184   // Run through the widget's list, selecting every line
21185   for(x=1; x<=i; x++)
21186   {
21187     // Deselect each one first, in case already selected
21188     XmListDeselectPos(map_properties_list,x);
21189 
21190     // Select/highlight that position
21191     XmListSelectPos(map_properties_list,x,TRUE);
21192   }
21193 }
21194 
21195 
21196 
21197 
21198 
21199 // Change the "draw_filled" field in the in-memory map_index to a
21200 // two.
21201 void map_index_update_filled_auto(char *filename)
21202 {
21203   map_index_record *current = map_index_head;
21204 
21205   while (current != NULL)
21206   {
21207     if (strcmp(current->filename,filename) == 0)
21208     {
21209       // Found a match.  Update the field and return.
21210       current->draw_filled = 2;
21211       break;
21212     }
21213     current = current->next;
21214   }
21215 }
21216 
21217 
21218 
21219 
21220 
21221 // Change the "draw_filled" field in the in-memory map_index to a
21222 // one.
21223 void map_index_update_filled_yes(char *filename)
21224 {
21225   map_index_record *current = map_index_head;
21226 
21227   while (current != NULL)
21228   {
21229     if (strcmp(current->filename,filename) == 0)
21230     {
21231       // Found a match.  Update the field and return.
21232       current->draw_filled = 1;
21233       break;
21234     }
21235     current = current->next;
21236   }
21237 }
21238 
21239 
21240 
21241 
21242 
21243 // Change the "draw_filled" field in the in-memory map_index to a
21244 // zero.
21245 void map_index_update_filled_no(char *filename)
21246 {
21247   map_index_record *current = map_index_head;
21248 
21249   while (current != NULL)
21250   {
21251     if (strcmp(current->filename,filename) == 0)
21252     {
21253       // Found a match.  Update the field and return.
21254       current->draw_filled = 0;
21255       break;
21256     }
21257     current = current->next;
21258   }
21259 }
21260 
21261 
21262 
21263 
21264 
21265 void map_properties_filled_auto(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21266 {
21267   int i, x;
21268   XmString *list;
21269   char *temp;
21270 
21271 
21272   // Get the list and the count from the dialog
21273   XtVaGetValues(map_properties_list,
21274                 XmNitemCount,&i,
21275                 XmNitems,&list,
21276                 NULL);
21277 
21278   // Run through the widget's list, changing the filled field on
21279   // every one that is selected.
21280   for(x=1; x<=i; x++)
21281   {
21282     // If the line was selected
21283     if ( XmListPosSelected(map_properties_list,x) )
21284     {
21285 
21286       // Snag the filename portion from the line
21287       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_END);
21288       if (temp)
21289       {
21290         // Update this file or directory in the in-memory
21291         // map index, setting the "draw_filled" field to 2.
21292         map_index_update_filled_auto(&temp[MPD_FILENAME_OFFSET]);
21293         XtFree(temp);
21294       }
21295     }
21296   }
21297 
21298   // Delete all entries in the list and re-create anew.
21299   map_properties_fill_in();
21300 
21301   // Save the updated index to the file
21302   index_save_to_file();
21303 }
21304 
21305 
21306 
21307 
21308 
21309 void map_properties_filled_yes(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21310 {
21311   int i, x;
21312   XmString *list;
21313   char *temp;
21314 
21315 
21316   // Get the list and the count from the dialog
21317   XtVaGetValues(map_properties_list,
21318                 XmNitemCount,&i,
21319                 XmNitems,&list,
21320                 NULL);
21321 
21322   // Run through the widget's list, changing the filled field on
21323   // every one that is selected.
21324   for(x=1; x<=i; x++)
21325   {
21326     // If the line was selected
21327     if ( XmListPosSelected(map_properties_list,x) )
21328     {
21329 
21330       // Snag the filename portion from the line
21331       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_END);
21332       if (temp)
21333       {
21334         // Update this file or directory in the in-memory
21335         // map index, setting the "draw_filled" field to 1.
21336         map_index_update_filled_yes(&temp[MPD_FILENAME_OFFSET]);
21337         XtFree(temp);
21338       }
21339     }
21340   }
21341 
21342   // Delete all entries in the list and re-create anew.
21343   map_properties_fill_in();
21344 
21345   // Save the updated index to the file
21346   index_save_to_file();
21347 }
21348 
21349 
21350 
21351 
21352 
21353 void map_properties_filled_no(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21354 {
21355   int i, x;
21356   XmString *list;
21357   char *temp;
21358 
21359 
21360   // Get the list and the count from the dialog
21361   XtVaGetValues(map_properties_list,
21362                 XmNitemCount,&i,
21363                 XmNitems,&list,
21364                 NULL);
21365 
21366   // Run through the widget's list, changing the filled field on
21367   // every one that is selected.
21368   for(x=1; x<=i; x++)
21369   {
21370     // If the line was selected
21371     if ( XmListPosSelected(map_properties_list,x) )
21372     {
21373 
21374       // Snag the filename portion from the line
21375       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_END);
21376       if (temp)
21377       {
21378         // Update this file or directory in the in-memory
21379         // map index, setting the "draw_filled" field to 0.
21380         map_index_update_filled_no(&temp[MPD_FILENAME_OFFSET]);
21381         XtFree(temp);
21382       }
21383     }
21384   }
21385 
21386   // Delete all entries in the list and re-create anew.
21387   map_properties_fill_in();
21388 
21389   // Save the updated index to the file
21390   index_save_to_file();
21391 }
21392 
21393 
21394 
21395 // Change the "usgs_drg" field in the in-memory map_index to a
21396 // specified value.
21397 void map_index_update_usgs_drg(char *filename, int drg_setting)
21398 {
21399   map_index_record *current = map_index_head;
21400 
21401   while (current != NULL)
21402   {
21403     if (strcmp(current->filename,filename) == 0)
21404     {
21405       // Found a match.  Update the field and return.
21406       current->usgs_drg = drg_setting;
21407       break;
21408     }
21409     current = current->next;
21410   }
21411 }
21412 
21413 
21414 
21415 
21416 // common functionality of all the callbacks.  Probably don't even need
21417 // all the X data here, either
21418 void map_properties_usgs_drg(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData), int drg_setting)
21419 {
21420   int i, x;
21421   XmString *list;
21422   char *temp;
21423 
21424   // Get the list and the count from the dialog
21425   XtVaGetValues(map_properties_list,
21426                 XmNitemCount,&i,
21427                 XmNitems,&list,
21428                 NULL);
21429 
21430   // Run through the widget's list, changing the usgs_drg field on
21431   // every one that is selected.
21432   for(x=1; x<=i; x++)
21433   {
21434     // If the line was selected
21435     if ( XmListPosSelected(map_properties_list,x) )
21436     {
21437 
21438       // Snag the filename portion from the line
21439       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_END);
21440       if (temp)
21441       {
21442         // Update this file or directory in the in-memory
21443         // map index, setting the "usgs_drg" field to drg_setting.
21444         map_index_update_usgs_drg(&temp[MPD_FILENAME_OFFSET],drg_setting);
21445         XtFree(temp);
21446       }
21447     }
21448   }
21449 
21450   // Delete all entries in the list and re-create anew.
21451   map_properties_fill_in();
21452 
21453   // Save the updated index to the file
21454   index_save_to_file();
21455 }
21456 
21457 // the real callbacks
21458 void map_properties_usgs_drg_auto(Widget widget, XtPointer clientData, XtPointer callData)
21459 {
21460   map_properties_usgs_drg(widget, clientData, callData, 2);
21461 }
21462 void map_properties_usgs_drg_yes(Widget widget, XtPointer clientData, XtPointer callData)
21463 {
21464   map_properties_usgs_drg(widget, clientData, callData, 1);
21465 }
21466 void map_properties_usgs_drg_no(Widget widget, XtPointer clientData, XtPointer callData)
21467 {
21468   map_properties_usgs_drg(widget, clientData, callData, 0);
21469 }
21470 
21471 
21472 
21473 
21474 
21475 // Change the "auto_maps" field in the in-memory map_index to a one.
21476 void map_index_update_auto_maps_yes(char *filename)
21477 {
21478   map_index_record *current = map_index_head;
21479 
21480   while (current != NULL)
21481   {
21482     if (strcmp(current->filename,filename) == 0)
21483     {
21484       // Found a match.  Update the field and return.
21485       current->auto_maps = 1;
21486       return;
21487     }
21488     current = current->next;
21489   }
21490 }
21491 
21492 
21493 
21494 
21495 
21496 // Change the "auto_maps" field in the in-memory map_index to a
21497 // zero.
21498 void map_index_update_auto_maps_no(char *filename)
21499 {
21500   map_index_record *current = map_index_head;
21501 
21502   while (current != NULL)
21503   {
21504     if (strcmp(current->filename,filename) == 0)
21505     {
21506       // Found a match.  Update the field and return.
21507       current->auto_maps = 0;
21508       return;
21509     }
21510     current = current->next;
21511   }
21512 }
21513 
21514 
21515 
21516 
21517 
21518 void map_properties_auto_maps_yes(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21519 {
21520   int i, x;
21521   XmString *list;
21522   char *temp;
21523 
21524 
21525   // Get the list and the count from the dialog
21526   XtVaGetValues(map_properties_list,
21527                 XmNitemCount,&i,
21528                 XmNitems,&list,
21529                 NULL);
21530 
21531   // Run through the widget's list, changing the auto_maps field
21532   // on every one that is selected.
21533   for(x=1; x<=i; x++)
21534   {
21535     // If the line was selected
21536     if ( XmListPosSelected(map_properties_list,x) )
21537     {
21538 
21539       // Snag the filename portion from the line
21540       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_END);
21541       if (temp)
21542       {
21543         // Update this file or directory in the in-memory
21544         // map index, setting the "auto_maps" field to 1.
21545         map_index_update_auto_maps_yes(&temp[MPD_FILENAME_OFFSET]);
21546         XtFree(temp);
21547       }
21548     }
21549   }
21550 
21551   // Delete all entries in the list and re-create anew.
21552   map_properties_fill_in();
21553 
21554   // Save the updated index to the file
21555   index_save_to_file();
21556 }
21557 
21558 
21559 
21560 
21561 
21562 void map_properties_auto_maps_no(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21563 {
21564   int i, x;
21565   XmString *list;
21566   char *temp;
21567 
21568 
21569   // Get the list and the count from the dialog
21570   XtVaGetValues(map_properties_list,
21571                 XmNitemCount,&i,
21572                 XmNitems,&list,
21573                 NULL);
21574 
21575   // Run through the widget's list, changing the auto_maps field
21576   // on every one that is selected.
21577   for(x=1; x<=i; x++)
21578   {
21579     // If the line was selected
21580     if ( XmListPosSelected(map_properties_list,x) )
21581     {
21582 
21583       // Snag the filename portion from the line
21584       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_END);
21585       if (temp)
21586       {
21587         // Update this file or directory in the in-memory
21588         // map index, setting the "auto_maps" field to 0.
21589         map_index_update_auto_maps_no(&temp[MPD_FILENAME_OFFSET]);
21590         XtFree(temp);
21591       }
21592     }
21593   }
21594 
21595   // Delete all entries in the list and re-create anew.
21596   map_properties_fill_in();
21597 
21598   // Save the updated index to the file
21599   index_save_to_file();
21600 }
21601 
21602 
21603 
21604 
21605 
21606 // Update the "map_layer" field in the in-memory map_index based on
21607 // the "map_layer" input parameter.
21608 void map_index_update_layer(char *filename, int map_layer)
21609 {
21610   map_index_record *current = map_index_head;
21611 
21612   while (current != NULL)
21613   {
21614     if (strcmp(current->filename,filename) == 0)
21615     {
21616       // Found a match.  Update the field and return.
21617       current->map_layer = map_layer;
21618       return;
21619     }
21620     current = current->next;
21621   }
21622 }
21623 
21624 
21625 
21626 
21627 
21628 void map_properties_layer_change(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21629 {
21630   int i, x, new_layer;
21631   XmString *list;
21632   char *temp;
21633 
21634 
21635   // Get new layer selection in the form of an int
21636   temp = XmTextGetString(new_map_layer_text);
21637   new_layer = atoi(temp);
21638   XtFree(temp);
21639 
21640 //fprintf(stderr,"New layer selected is: %d\n", new_layer);
21641 
21642   // Get the list and the count from the dialog
21643   XtVaGetValues(map_properties_list,
21644                 XmNitemCount,&i,
21645                 XmNitems,&list,
21646                 NULL);
21647 
21648   // Run through the widget's list, changing the layer on every
21649   // one that is selected.
21650   for(x=1; x<=i; x++)
21651   {
21652     // If the line was selected
21653     if ( XmListPosSelected(map_properties_list,x) )
21654     {
21655 
21656       // Snag the filename portion from the line
21657       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_END);
21658       if (temp)
21659       {
21660         // Update this file or directory in the in-memory
21661         // map index, setting/resetting the "selected" field
21662         // as appropriate.
21663         map_index_update_layer(&temp[MPD_FILENAME_OFFSET], new_layer);
21664         XtFree(temp);
21665       }
21666     }
21667   }
21668 
21669   // Delete all entries in the list and re-create anew.
21670   map_properties_fill_in();
21671 
21672   // Save the updated index to the file
21673   index_save_to_file();
21674 }
21675 
21676 
21677 
21678 
21679 
21680 // Update the "max_zoom" field in the in-memory map_index based on
21681 // the "max_zoom" input parameter.
21682 void map_index_update_max_zoom(char *filename, int max_zoom)
21683 {
21684   map_index_record *current = map_index_head;
21685 
21686   while (current != NULL)
21687   {
21688     if (strcmp(current->filename,filename) == 0)
21689     {
21690       // Found a match.  Update the field and return.
21691       current->max_zoom = max_zoom;
21692       return;
21693     }
21694     current = current->next;
21695   }
21696 }
21697 
21698 
21699 
21700 
21701 
21702 void map_properties_max_zoom_change(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21703 {
21704   int i, x, new_max_zoom;
21705   XmString *list;
21706   char *temp;
21707 
21708 
21709   // Get new layer selection in the form of an int
21710   temp = XmTextGetString(new_max_zoom_text);
21711   new_max_zoom = atoi(temp);
21712   XtFree(temp);
21713 
21714 //    fprintf(stderr,"New max_zoom selected is: %d\n", new_max_zoom);
21715 
21716   // Get the list and the count from the dialog
21717   XtVaGetValues(map_properties_list,
21718                 XmNitemCount,&i,
21719                 XmNitems,&list,
21720                 NULL);
21721 
21722   // Run through the widget's list, changing the layer on every
21723   // one that is selected.
21724   for(x=1; x<=i; x++)
21725   {
21726     // If the line was selected
21727     if ( XmListPosSelected(map_properties_list,x) )
21728     {
21729 
21730       // Snag the filename portion from the line
21731       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_END);
21732       if (temp)
21733       {
21734         // Update this file or directory in the in-memory
21735         // map index, setting/resetting the "selected" field
21736         // as appropriate.
21737         map_index_update_max_zoom(&temp[MPD_FILENAME_OFFSET], new_max_zoom);
21738         XtFree(temp);
21739       }
21740     }
21741   }
21742 
21743   // Delete all entries in the list and re-create anew.
21744   map_properties_fill_in();
21745 
21746   // Save the updated index to the file
21747   index_save_to_file();
21748 }
21749 
21750 
21751 
21752 
21753 
21754 // Update the "min_zoom" field in the in-memory map_index based on
21755 // the "min_zoom" input parameter.
21756 void map_index_update_min_zoom(char *filename, int min_zoom)
21757 {
21758   map_index_record *current = map_index_head;
21759 
21760   while (current != NULL)
21761   {
21762     if (strcmp(current->filename,filename) == 0)
21763     {
21764       // Found a match.  Update the field and return.
21765       current->min_zoom = min_zoom;
21766       return;
21767     }
21768     current = current->next;
21769   }
21770 }
21771 
21772 
21773 
21774 
21775 
21776 void map_properties_min_zoom_change(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21777 {
21778   int i, x, new_min_zoom;
21779   XmString *list;
21780   char *temp;
21781 
21782 
21783   // Get new layer selection in the form of an int
21784   temp = XmTextGetString(new_min_zoom_text);
21785   new_min_zoom = atoi(temp);
21786   XtFree(temp);
21787 
21788 //fprintf(stderr,"New layer selected is: %d\n", new_layer);
21789 
21790   // Get the list and the count from the dialog
21791   XtVaGetValues(map_properties_list,
21792                 XmNitemCount,&i,
21793                 XmNitems,&list,
21794                 NULL);
21795 
21796   // Run through the widget's list, changing the layer on every
21797   // one that is selected.
21798   for(x=1; x<=i; x++)
21799   {
21800     // If the line was selected
21801     if ( XmListPosSelected(map_properties_list,x) )
21802     {
21803 
21804       // Snag the filename portion from the line
21805       temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_END);
21806       if (temp)
21807       {
21808         // Update this file or directory in the in-memory
21809         // map index, setting/resetting the "selected" field
21810         // as appropriate.
21811         map_index_update_min_zoom(&temp[MPD_FILENAME_OFFSET], new_min_zoom);
21812         XtFree(temp);
21813       }
21814     }
21815   }
21816 
21817   // Delete all entries in the list and re-create anew.
21818   map_properties_fill_in();
21819 
21820   // Save the updated index to the file
21821   index_save_to_file();
21822 }
21823 
21824 
21825 
21826 
21827 
21828 // JMT -- now supports max and min zoom levels
21829 
21830 // Allows setting map layer and filled polygon properties for maps
21831 // selected in the map chooser.  Show a warning or bring up a
21832 // confirmation dialog if more than one map is selected when this
21833 // function is entered.  This is the callback function for the
21834 // Properties button in the Map Chooser.
21835 //
21836 // If the map_layer is a range of values, inform the user here
21837 // via a popup, so that they don't make a mistake and change too
21838 // many different types of maps to the same map layer.
21839 //
21840 // We could either show all maps here and allow changing each
21841 // one, or just show min/max map_layer draw_filled properties
21842 // for the maps selected in the Map Chooser.
21843 //
21844 // Create the properties dialog.  Show the map_layer and
21845 // draw_filled properties for the maps.
21846 //
21847 // Could still create Cancel and OK buttons.  Cancel would wipe the
21848 // in-memory list and fetch it from file again.  OK would write the
21849 // in-memory list to disk.
21850 //
21851 void map_properties( Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
21852 {
21853 //    int i;
21854 //    int x;
21855 //    char *temp;
21856 //    XmString *list;
21857   static Widget pane, my_form, button_clear, button_close,
21858          rowcol1, rowcol2, rowcol3, label1, label2,
21859          button_filled_auto, button_filled_yes, button_filled_no,
21860          button_usgs_drg_auto, button_usgs_drg_yes, button_usgs_drg_no,
21861          button_layer_change,
21862          button_auto_maps_yes, button_auto_maps_no,
21863          button_max_zoom_change, button_min_zoom_change,
21864          button_select_all;
21865 //  static Widget label3, label4, label5;
21866   Atom delw;
21867   Arg al[50];                     // Arg List
21868   register unsigned int ac = 0;   // Arg Count
21869 
21870 
21871   busy_cursor(appshell);
21872 
21873   if (map_chooser_dialog)
21874   {
21875     XtSetSensitive(map_chooser_button_ok, FALSE);
21876     XtSetSensitive(map_chooser_button_cancel, FALSE);
21877   }
21878 
21879 //    i=0;
21880   if (!map_properties_dialog)
21881   {
21882 
21883     map_properties_dialog = XtVaCreatePopupShell(langcode("MAPP001"),
21884                             xmDialogShellWidgetClass, appshell,
21885                             XmNdeleteResponse,XmDESTROY,
21886                             XmNdefaultPosition, FALSE,
21887                             XmNfontList, fontlist1,
21888                             NULL);
21889 
21890     pane = XtVaCreateWidget("Map_properties pane",
21891                             xmPanedWindowWidgetClass,
21892                             map_properties_dialog,
21893                             MY_FOREGROUND_COLOR,
21894                             MY_BACKGROUND_COLOR,
21895                             NULL);
21896 
21897     my_form =  XtVaCreateWidget("Map_properties my_form",
21898                                 xmFormWidgetClass,
21899                                 pane,
21900                                 XmNfractionBase, 7,
21901                                 XmNautoUnmanage, FALSE,
21902                                 XmNshadowThickness, 1,
21903                                 MY_FOREGROUND_COLOR,
21904                                 MY_BACKGROUND_COLOR,
21905                                 NULL);
21906 
21907     /*set args for color */
21908     ac=0;
21909     XtSetArg(al[ac], XmNvisibleItemCount, 13);
21910     ac++;
21911     XtSetArg(al[ac], XmNshadowThickness, 3);
21912     ac++;
21913     XtSetArg(al[ac], XmNselectionPolicy, XmMULTIPLE_SELECT);
21914     ac++;
21915     XtSetArg(al[ac], XmNscrollBarPlacement, XmBOTTOM_RIGHT);
21916     ac++;
21917     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
21918     ac++;
21919     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
21920     ac++;
21921     XtSetArg(al[ac], XmNfontList, fontlist1);
21922     ac++;
21923 
21924     map_properties_list = XmCreateScrolledList(my_form,
21925                           "Map_properties list",
21926                           al,
21927                           ac);
21928 
21929     // Find the names of all the map files on disk and put them
21930     // into map_properties_list
21931     map_properties_fill_in();
21932 
21933     // Attach a rowcolumn manager widget to my_form to handle
21934     // the third button row.  Attach it to the bottom of the
21935     // form.
21936     rowcol3 = XtVaCreateManagedWidget("Map properties rowcol3",
21937                                       xmRowColumnWidgetClass,
21938                                       my_form,
21939                                       XmNorientation, XmHORIZONTAL,
21940                                       XmNtopAttachment, XmATTACH_NONE,
21941                                       XmNbottomAttachment, XmATTACH_FORM,
21942                                       XmNleftAttachment, XmATTACH_FORM,
21943                                       XmNrightAttachment, XmATTACH_FORM,
21944                                       XmNkeyboardFocusPolicy, XmEXPLICIT,
21945                                       MY_FOREGROUND_COLOR,
21946                                       MY_BACKGROUND_COLOR,
21947                                       XmNfontList, fontlist1,
21948                                       NULL);
21949 
21950     // Attach a rowcolumn manager widget to my_form to handle
21951     // the second button row.  Attach it to the top of rowcol3.
21952     rowcol2 = XtVaCreateManagedWidget("Map properties rowcol2",
21953                                       xmRowColumnWidgetClass,
21954                                       my_form,
21955                                       XmNorientation, XmHORIZONTAL,
21956                                       XmNtopAttachment, XmATTACH_NONE,
21957                                       XmNbottomAttachment, XmATTACH_WIDGET,
21958                                       XmNbottomWidget, rowcol3,
21959                                       XmNleftAttachment, XmATTACH_FORM,
21960                                       XmNrightAttachment, XmATTACH_FORM,
21961                                       XmNkeyboardFocusPolicy, XmEXPLICIT,
21962                                       MY_FOREGROUND_COLOR,
21963                                       MY_BACKGROUND_COLOR,
21964                                       XmNfontList, fontlist1,
21965                                       NULL);
21966 
21967     // Attach a rowcolumn manager widget to my_form to handle
21968     // the first button row.
21969     rowcol1 = XtVaCreateManagedWidget("Map properties rowcol1",
21970                                       xmRowColumnWidgetClass,
21971                                       my_form,
21972                                       XmNorientation, XmHORIZONTAL,
21973                                       XmNtopAttachment, XmATTACH_NONE,
21974                                       XmNbottomAttachment, XmATTACH_WIDGET,
21975                                       XmNbottomWidget, rowcol2,
21976                                       XmNleftAttachment, XmATTACH_FORM,
21977                                       XmNrightAttachment, XmATTACH_FORM,
21978                                       XmNkeyboardFocusPolicy, XmEXPLICIT,
21979                                       MY_FOREGROUND_COLOR,
21980                                       MY_BACKGROUND_COLOR,
21981                                       XmNfontList, fontlist1,
21982                                       NULL);
21983 
21984     label1  = XtVaCreateManagedWidget(langcode("MAPP002"),
21985                                       xmLabelWidgetClass,
21986                                       my_form,
21987                                       XmNtopAttachment, XmATTACH_FORM,
21988                                       XmNtopOffset, 5,
21989                                       XmNbottomAttachment, XmATTACH_NONE,
21990                                       XmNleftAttachment, XmATTACH_FORM,
21991                                       XmNleftOffset,10,
21992                                       XmNrightAttachment, XmATTACH_NONE,
21993                                       XmNsensitive, TRUE,
21994                                       MY_FOREGROUND_COLOR,
21995                                       MY_BACKGROUND_COLOR,
21996                                       XmNfontList, fontlist1,
21997                                       NULL);
21998 
21999     label2  = XtVaCreateManagedWidget(langcode("MAPP003"),
22000 
22001                                       xmLabelWidgetClass,
22002                                       my_form,
22003                                       XmNtopAttachment, XmATTACH_WIDGET,
22004                                       XmNtopWidget, label1,
22005                                       XmNtopOffset, 0,
22006                                       XmNbottomAttachment, XmATTACH_NONE,
22007                                       XmNleftAttachment, XmATTACH_FORM,
22008                                       XmNleftOffset,10,
22009                                       XmNrightAttachment, XmATTACH_NONE,
22010                                       XmNsensitive, TRUE,
22011                                       MY_FOREGROUND_COLOR,
22012                                       MY_BACKGROUND_COLOR,
22013                                       XmNfontList, fontlist1,
22014                                       NULL);
22015 
22016     XtVaSetValues(XtParent(map_properties_list),
22017                   XmNtopAttachment, XmATTACH_WIDGET,
22018                   XmNtopWidget, label2,
22019                   XmNtopOffset, 2,
22020                   XmNbottomAttachment, XmATTACH_WIDGET,
22021                   XmNbottomWidget, rowcol1,
22022                   XmNbottomOffset, 2,
22023                   XmNrightAttachment, XmATTACH_FORM,
22024                   XmNrightOffset, 5,
22025                   XmNleftAttachment, XmATTACH_FORM,
22026                   XmNleftOffset, 5,
22027                   XmNfontList, fontlist1,
22028                   NULL);
22029 
22030     // JMT -- this is a guess
22031 // "Max Zoom" stolen from "Change Layer"
22032     button_max_zoom_change = XtVaCreateManagedWidget(langcode("MAPP009"),
22033                              xmPushButtonGadgetClass,
22034                              rowcol1,
22035                              XmNnavigationType, XmTAB_GROUP,
22036                              MY_FOREGROUND_COLOR,
22037                              MY_BACKGROUND_COLOR,
22038                              XmNfontList, fontlist1,
22039                              NULL);
22040 
22041     new_max_zoom_text = XtVaCreateManagedWidget("Map Properties max zoom number",
22042                         xmTextWidgetClass,
22043                         rowcol1,
22044                         XmNeditable,   TRUE,
22045                         XmNcursorPositionVisible, TRUE,
22046                         XmNsensitive, TRUE,
22047                         XmNshadowThickness,    1,
22048                         XmNcolumns, 6,
22049                         XmNwidth, ((7*7)+2),
22050                         XmNmaxLength, 5,
22051                         XmNbackground, colors[0x0f],
22052                         XmNrightOffset, 1,
22053                         XmNnavigationType, XmTAB_GROUP,
22054                         XmNfontList, fontlist1,
22055                         NULL);
22056 
22057 // "Min Zoom" stolen from "Change Layer"
22058     button_min_zoom_change = XtVaCreateManagedWidget(langcode("MAPP010"),
22059                              xmPushButtonGadgetClass,
22060                              rowcol1,
22061                              XmNnavigationType, XmTAB_GROUP,
22062                              MY_FOREGROUND_COLOR,
22063                              MY_BACKGROUND_COLOR,
22064                              XmNfontList, fontlist1,
22065                              NULL);
22066 
22067     new_min_zoom_text = XtVaCreateManagedWidget("Map Properties min zoom number",
22068                         xmTextWidgetClass,
22069                         rowcol1,
22070                         XmNeditable,   TRUE,
22071                         XmNcursorPositionVisible, TRUE,
22072                         XmNsensitive, TRUE,
22073                         XmNshadowThickness,    1,
22074                         XmNcolumns, 6,
22075                         XmNwidth, ((7*7)+2),
22076                         XmNmaxLength, 5,
22077                         XmNbackground, colors[0x0f],
22078                         XmNrightOffset, 1,
22079                         XmNnavigationType, XmTAB_GROUP,
22080                         XmNfontList, fontlist1,
22081                         NULL);
22082 
22083 
22084 // "Change Layer"
22085     button_layer_change = XtVaCreateManagedWidget(langcode("MAPP004"),
22086                           xmPushButtonGadgetClass,
22087                           rowcol1,
22088                           XmNnavigationType, XmTAB_GROUP,
22089                           MY_FOREGROUND_COLOR,
22090                           MY_BACKGROUND_COLOR,
22091                           XmNfontList, fontlist1,
22092                           NULL);
22093 
22094     new_map_layer_text = XtVaCreateManagedWidget("Map Properties new layer number",
22095                          xmTextWidgetClass,
22096                          rowcol1,
22097                          XmNeditable,   TRUE,
22098                          XmNcursorPositionVisible, TRUE,
22099                          XmNsensitive, TRUE,
22100                          XmNshadowThickness,    1,
22101                          XmNcolumns, 6,
22102                          XmNwidth, ((7*7)+2),
22103                          XmNmaxLength, 5,
22104                          XmNbackground, colors[0x0f],
22105                          XmNrightOffset, 1,
22106                          XmNnavigationType, XmTAB_GROUP,
22107                          XmNfontList, fontlist1,
22108                          NULL);
22109 
22110     //label3
22111     XtVaCreateManagedWidget(langcode("MAPP005"),
22112                             xmLabelWidgetClass,
22113                             rowcol2,
22114                             MY_FOREGROUND_COLOR,
22115                             MY_BACKGROUND_COLOR,
22116                             XmNfontList, fontlist1,
22117                             NULL);
22118 
22119 // "Filled-Auto"
22120     button_filled_auto = XtVaCreateManagedWidget(langcode("MAPP011"),
22121                          xmPushButtonGadgetClass,
22122                          rowcol2,
22123                          XmNnavigationType, XmTAB_GROUP,
22124                          MY_FOREGROUND_COLOR,
22125                          MY_BACKGROUND_COLOR,
22126                          XmNfontList, fontlist1,
22127                          NULL);
22128 
22129 // "Filled-Yes"
22130     button_filled_yes = XtVaCreateManagedWidget(langcode("MAPP006"),
22131                         xmPushButtonGadgetClass,
22132                         rowcol2,
22133                         XmNnavigationType, XmTAB_GROUP,
22134                         MY_FOREGROUND_COLOR,
22135                         MY_BACKGROUND_COLOR,
22136                         XmNfontList, fontlist1,
22137                         NULL);
22138 
22139 // "Filled-No"
22140     button_filled_no = XtVaCreateManagedWidget(langcode("MAPP007"),
22141                        xmPushButtonGadgetClass,
22142                        rowcol2,
22143                        XmNnavigationType, XmTAB_GROUP,
22144                        MY_FOREGROUND_COLOR,
22145                        MY_BACKGROUND_COLOR,
22146                        XmNfontList, fontlist1,
22147                        NULL);
22148 
22149 // Automaps
22150     //label4
22151     XtVaCreateManagedWidget(langcode("MAPP008"),
22152                             xmLabelWidgetClass,
22153                             rowcol2,
22154                             MY_FOREGROUND_COLOR,
22155                             MY_BACKGROUND_COLOR,
22156                             XmNfontList, fontlist1,
22157                             NULL);
22158 
22159 // "Automaps-Yes"
22160     button_auto_maps_yes = XtVaCreateManagedWidget(langcode("MAPP006"),
22161                            xmPushButtonGadgetClass,
22162                            rowcol2,
22163                            XmNnavigationType, XmTAB_GROUP,
22164                            MY_FOREGROUND_COLOR,
22165                            MY_BACKGROUND_COLOR,
22166                            XmNfontList, fontlist1,
22167                            NULL);
22168 
22169 // "Automaps-No"
22170     button_auto_maps_no = XtVaCreateManagedWidget(langcode("MAPP007"),
22171                           xmPushButtonGadgetClass,
22172                           rowcol2,
22173                           XmNnavigationType, XmTAB_GROUP,
22174                           MY_FOREGROUND_COLOR,
22175                           MY_BACKGROUND_COLOR,
22176                           XmNfontList, fontlist1,
22177                           NULL);
22178 
22179 // USGS DRG->
22180     //label5
22181     XtVaCreateManagedWidget(langcode("MAPP012"),
22182                             xmLabelWidgetClass,
22183                             rowcol2,
22184                             MY_FOREGROUND_COLOR,
22185                             MY_BACKGROUND_COLOR,
22186                             XmNfontList, fontlist1,
22187                             NULL);
22188 
22189 // "USGS DRG Auto"
22190     button_usgs_drg_auto = XtVaCreateManagedWidget(langcode("MAPP011"),
22191                            xmPushButtonGadgetClass,
22192                            rowcol2,
22193                            XmNnavigationType, XmTAB_GROUP,
22194                            MY_FOREGROUND_COLOR,
22195                            MY_BACKGROUND_COLOR,
22196                            XmNfontList, fontlist1,
22197                            NULL);
22198 
22199 // "USGS DRG Yes"
22200     button_usgs_drg_yes = XtVaCreateManagedWidget(langcode("MAPP006"),
22201                           xmPushButtonGadgetClass,
22202                           rowcol2,
22203                           XmNnavigationType, XmTAB_GROUP,
22204                           MY_FOREGROUND_COLOR,
22205                           MY_BACKGROUND_COLOR,
22206                           XmNfontList, fontlist1,
22207                           NULL);
22208 
22209 // "USGS DRG No"
22210     button_usgs_drg_no = XtVaCreateManagedWidget(langcode("MAPP007"),
22211                          xmPushButtonGadgetClass,
22212                          rowcol2,
22213                          XmNnavigationType, XmTAB_GROUP,
22214                          MY_FOREGROUND_COLOR,
22215                          MY_BACKGROUND_COLOR,
22216                          XmNfontList, fontlist1,
22217                          NULL);
22218 
22219 // "Select All"
22220     button_select_all = XtVaCreateManagedWidget(langcode("PULDNMMC09"),
22221                         xmPushButtonGadgetClass,
22222                         rowcol3,
22223                         XmNnavigationType, XmTAB_GROUP,
22224                         MY_FOREGROUND_COLOR,
22225                         MY_BACKGROUND_COLOR,
22226                         XmNfontList, fontlist1,
22227                         NULL);
22228 
22229 // "Clear"
22230     button_clear = XtVaCreateManagedWidget(langcode("PULDNMMC01"),
22231                                            xmPushButtonGadgetClass,
22232                                            rowcol3,
22233                                            XmNnavigationType, XmTAB_GROUP,
22234                                            MY_FOREGROUND_COLOR,
22235                                            MY_BACKGROUND_COLOR,
22236                                            XmNfontList, fontlist1,
22237                                            NULL);
22238 
22239 // "Close"
22240     button_close = XtVaCreateManagedWidget(langcode("UNIOP00003"),
22241                                            xmPushButtonGadgetClass,
22242                                            rowcol3,
22243                                            XmNnavigationType, XmTAB_GROUP,
22244                                            MY_FOREGROUND_COLOR,
22245                                            MY_BACKGROUND_COLOR,
22246                                            XmNfontList, fontlist1,
22247                                            NULL);
22248 
22249     XtAddCallback(button_close, XmNactivateCallback, map_properties_destroy_shell, map_properties_dialog);
22250     XtAddCallback(button_clear, XmNactivateCallback, map_properties_deselect_maps, map_properties_dialog);
22251     XtAddCallback(button_select_all, XmNactivateCallback, map_properties_select_all_maps, map_properties_dialog);
22252     XtAddCallback(button_filled_auto, XmNactivateCallback, map_properties_filled_auto, map_properties_dialog);
22253     XtAddCallback(button_filled_yes, XmNactivateCallback, map_properties_filled_yes, map_properties_dialog);
22254     XtAddCallback(button_filled_no, XmNactivateCallback, map_properties_filled_no, map_properties_dialog);
22255     XtAddCallback(button_usgs_drg_auto, XmNactivateCallback, map_properties_usgs_drg_auto, map_properties_dialog);
22256     XtAddCallback(button_usgs_drg_yes, XmNactivateCallback, map_properties_usgs_drg_yes, map_properties_dialog);
22257     XtAddCallback(button_usgs_drg_no, XmNactivateCallback, map_properties_usgs_drg_no, map_properties_dialog);
22258     XtAddCallback(button_max_zoom_change, XmNactivateCallback, map_properties_max_zoom_change, map_properties_dialog);
22259     XtAddCallback(button_min_zoom_change, XmNactivateCallback, map_properties_min_zoom_change, map_properties_dialog);
22260     XtAddCallback(button_layer_change, XmNactivateCallback, map_properties_layer_change, map_properties_dialog);
22261     XtAddCallback(button_auto_maps_yes, XmNactivateCallback, map_properties_auto_maps_yes, map_properties_dialog);
22262     XtAddCallback(button_auto_maps_no, XmNactivateCallback, map_properties_auto_maps_no, map_properties_dialog);
22263 
22264     pos_dialog(map_properties_dialog);
22265 
22266     delw = XmInternAtom(XtDisplay(map_properties_dialog),"WM_DELETE_WINDOW", FALSE);
22267     XmAddWMProtocolCallback(map_properties_dialog, delw, map_properties_destroy_shell, (XtPointer)map_properties_dialog);
22268 
22269     XtManageChild(rowcol1);
22270     XtManageChild(rowcol2);
22271     XtManageChild(rowcol3);
22272     XtManageChild(my_form);
22273     XtManageChild(map_properties_list);
22274     XtVaSetValues(map_properties_list, XmNbackground, colors[0x0f], NULL);
22275     XtManageChild(pane);
22276 
22277     XmTextSetString(new_map_layer_text, "0");
22278 
22279     XtPopup(map_properties_dialog,XtGrabNone);
22280 
22281     // Move focus to the OK button.  This appears to highlight the
22282     // button fine, but we're not able to hit the <Enter> key to
22283     // have that default function happen.  Note:  We _can_ hit the
22284     // <SPACE> key, and that activates the option.
22285 //        XmUpdateDisplay(map_properties_dialog);
22286     XmProcessTraversal(button_close, XmTRAVERSE_CURRENT);
22287 
22288   }
22289   else
22290   {
22291     (void)XRaiseWindow(XtDisplay(map_properties_dialog), XtWindow(map_properties_dialog));
22292   }
22293 }
22294 
22295 
22296 
22297 
22298 
22299 /************************* Map Chooser ***********************************/
22300 /*************************************************************************/
22301 
22302 // Destroys the Map Chooser dialog
22303 void map_chooser_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
22304 {
22305   Widget shell = (Widget) clientData;
22306   XtPopdown(shell);
22307   XtDestroyWidget(shell);
22308   map_chooser_dialog = (Widget)NULL;
22309 }
22310 
22311 
22312 
22313 
22314 
22315 // Update the "selected" field in the in-memory map_index based on
22316 // the "selected" input parameter.
22317 void map_index_update_selected(char *filename, int selected, map_index_record **current)
22318 {
22319 
22320   // If we're passed a NULL pointer, start at the head of the
22321   // in-memory linked list.
22322   //
22323   if ( (*current) == NULL)
22324   {
22325     (*current) = map_index_head;
22326   }
22327 
22328   // Start searching through the list at the pointer we were
22329   // given.
22330   //
22331   while ( (*current) != NULL)
22332   {
22333     if (strcmp( (*current)->filename,filename) == 0)
22334     {
22335       // Found a match.  Update the field and return.
22336       (*current)->selected = selected;
22337       return;
22338     }
22339     (*current) = (*current)->next;
22340   }
22341 }
22342 
22343 
22344 
22345 
22346 
22347 // Update the "temp_select" field in the in-memory map_index.
22348 void map_index_update_temp_select(char *filename, map_index_record **current)
22349 {
22350   int result;
22351 
22352   // If we're passed a NULL pointer, start at the head of the
22353   // in-memory linked list.
22354   //
22355   if ( (*current) == NULL)
22356   {
22357     (*current) = map_index_head;
22358   }
22359 
22360   // Start searching through the list at the pointer we were
22361   // given.  We need to do a loose match here for directories.  If
22362   // a selected directory is contained in a filepath, select that
22363   // file as well.  For the directory case, once we find a match
22364   // in the file path, keep walking down the list until we get a
22365   // non-match.
22366   //
22367   while ( (*current) != NULL)
22368   {
22369 
22370     result = strncmp( (*current)->filename,filename,strlen(filename));
22371 
22372     if (result == 0)
22373     {
22374       // Found a match.  Update the field.
22375       (*current)->temp_select = 1;
22376     }
22377     else if (result > 0)    // We passsed the relevant area.
22378     {
22379       // All done for now.
22380       return;
22381     }
22382     (*current) = (*current)->next;
22383   }
22384 }
22385 
22386 
22387 
22388 
22389 
22390 // Clear all of the temp_select bits in the in-memory map index
22391 void map_index_temp_select_clear(void)
22392 {
22393   map_index_record *current;
22394 
22395   current = map_index_head;
22396   while (current != NULL)
22397   {
22398     current->temp_select = 0;
22399     current = current->next;
22400   }
22401 }
22402 
22403 
22404 
22405 
22406 
22407 // Gets the list of selected maps out of the dialog, writes them to
22408 // the selected maps disk file, destroys the dialog, then calls
22409 // create_image() with the newly selected map set in place.  This
22410 // should be the _only_ routine in this set of functions that
22411 // actually changes the selected maps disk file.  The others should
22412 // merely manipulate the list in the map chooser dialog.  This
22413 // function is attached to the "OK" button in the Map Chooser dialog.
22414 //
22415 // What we'll do here is set/reset the "selected" field in the
22416 // in-memory map_index list, then write the info out to the
22417 // selected_maps.sys file.  Only set the file entries if in file
22418 // mode, dir entries if in dir mode.  When writing out to file,
22419 // write them both out.
22420 //
22421 // In order to make this fast, we'll send a start pointer to
22422 // map_index_update_selected() which is the "next" pointer from the
22423 // previous hit.  We're relying on the fact that the Map Chooser
22424 // list and the in-memory linked list are in the same search order,
22425 // so this way we don't search through the entire linked list for
22426 // each update.  With 30,000 maps, it ended up being up to 30,000 *
22427 // 30,000 for the loop iterations, which was unwieldy.
22428 //
22429 void map_chooser_select_maps(Widget widget, XtPointer clientData, XtPointer callData)
22430 {
22431   int i, x;
22432   char *temp;
22433   XmString *list;
22434   FILE *f;
22435   map_index_record *ptr = map_index_head;
22436   char selected_map_path[MAX_VALUE];
22437 
22438   get_user_base_dir(SELECTED_MAP_DATA, selected_map_path,
22439                     sizeof(selected_map_path));
22440 
22441 // It'd be nice to turn off auto-maps here, or better perhaps would
22442 // be if any button were chosen other than "Cancel".
22443 
22444   // reset map_refresh in case we no longer have a refreshed map selected
22445   map_refresh_interval = 0;
22446 
22447   // Cause load_maps() and load_automaps() to re-sort the selected
22448   // maps by layer.
22449   re_sort_maps = 1;
22450 
22451   // Get the list and the list count from the dialog
22452   XtVaGetValues(map_list,
22453                 XmNitemCount,&i,
22454                 XmNitems,&list,
22455                 NULL);
22456 
22457   // Run through the list, updating the equivalent entries in the
22458   // in-memory map index.  If we're in "directory" mode we'll only
22459   // update the directory entries.  In "Expanded dirs" mode, we'll
22460   // update both file and directory entries.
22461   // The end result is that both directories and files may be
22462   // selected, not either/or as the code was written earlier.
22463   //
22464   // Here we basically walk both lists together, the List widget
22465   // and the in-memory linked list, as they're both in the same
22466   // sort order.  We do this by passing "ptr" back and forth, and
22467   // updating it to point to one after the last one found each
22468   // time.  That turns and N*N search into an N search and is a
22469   // big speed improvement when you have 1000's of maps.
22470   //
22471   for(x=1; x<=i; x++)
22472   {
22473     temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_BEGINNING);
22474     if (temp)
22475     {
22476       // Update this file or directory in the in-memory map
22477       // index, setting/resetting the "selected" field as
22478       // appropriate.
22479       map_index_update_selected(temp,
22480                                 XmListPosSelected(map_list,x),
22481                                 &ptr);
22482       XtFree(temp);
22483     }
22484     //fprintf(stderr,"Passed back: %s\n", ptr->filename);
22485     ptr = ptr->next;
22486   }
22487 
22488   // Now we have all of the updates done to the in-memory map
22489   // index.  Write out the selected maps to disk, overwriting
22490   // whatever was there before.
22491 
22492   ptr = map_index_head;
22493   f=fopen( selected_map_path, "w+" );
22494   if (f!=NULL)
22495   {
22496 
22497     while (ptr != NULL)
22498     {
22499       // Write only selected files/directories out to the disk
22500       // file.
22501       if (ptr->selected)
22502       {
22503         fprintf(f,"%s\n",ptr->filename);
22504       }
22505       ptr = ptr->next;
22506     }
22507     (void)fclose(f);
22508   }
22509   else
22510   {
22511     fprintf(stderr,"Couldn't open file: %s\n", selected_map_path );
22512   }
22513 
22514   map_chooser_destroy_shell(widget,clientData,callData);
22515 
22516   // Set interrupt_drawing_now because conditions have changed.
22517   interrupt_drawing_now++;
22518 
22519   // Request that a new image be created.  Calls create_image,
22520   // XCopyArea, and display_zoom_status.
22521   request_new_image++;
22522 
22523 //    if (create_image(da)) {
22524 //        (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0;
22525 //    }
22526 }
22527 
22528 
22529 
22530 
22531 
22532 // Same as map_chooser_select_maps, but doesn't destroy the Map
22533 // Chooser dialog.
22534 void map_chooser_apply_maps(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
22535 {
22536   int i, x;
22537   char *temp;
22538   XmString *list;
22539   FILE *f;
22540   map_index_record *ptr = map_index_head;
22541   char selected_map_path[MAX_VALUE];
22542 
22543   get_user_base_dir(SELECTED_MAP_DATA, selected_map_path,
22544                     sizeof(selected_map_path));
22545 
22546 // It'd be nice to turn off auto-maps here, or better perhaps would
22547 // be if any button were chosen other than "Cancel".
22548 
22549   // reset map_refresh in case we no longer have a refreshed map selected
22550   map_refresh_interval = 0;
22551 
22552   // Cause load_maps() and load_automaps() to re-sort the selected
22553   // maps by layer.
22554   re_sort_maps = 1;
22555 
22556   // Get the list and the list count from the dialog
22557   XtVaGetValues(map_list,
22558                 XmNitemCount,&i,
22559                 XmNitems,&list,
22560                 NULL);
22561 
22562   // Run through the list, updating the equivalent entries in the
22563   // in-memory map index.  If we're in "directory" mode we'll only
22564   // update the directory entries.  In "Expanded dirs" mode, we'll
22565   // update both file and directory entries.
22566   // The end result is that both directories and files may be
22567   // selected, not either/or as the code was written earlier.
22568   //
22569   // Here we basically walk both lists together, the List widget
22570   // and the in-memory linked list, as they're both in the same
22571   // sort order.  We do this by passing "ptr" back and forth, and
22572   // updating it to point to one after the last one found each
22573   // time.  That turns and N*N search into an N search and is a
22574   // big speed improvement when you have 1000's of maps.
22575   //
22576   for(x=1; x<=i; x++)
22577   {
22578     temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_BEGINNING);
22579     if (temp)
22580     {
22581       // Update this file or directory in the in-memory map
22582       // index, setting/resetting the "selected" field as
22583       // appropriate.
22584       map_index_update_selected(temp,
22585                                 XmListPosSelected(map_list,x),
22586                                 &ptr);
22587       XtFree(temp);
22588     }
22589 //fprintf(stderr,"Passed back: %s\n", ptr->filename);
22590     ptr = ptr->next;
22591   }
22592 
22593   // Now we have all of the updates done to the in-memory map
22594   // index.  Write out the selected maps to disk, overwriting
22595   // whatever was there before.
22596 
22597   ptr = map_index_head;
22598 
22599   f=fopen( selected_map_path, "w+" );
22600   if (f!=NULL)
22601   {
22602 
22603     while (ptr != NULL)
22604     {
22605       // Write only selected files/directories out to the disk
22606       // file.
22607       if (ptr->selected)
22608       {
22609         fprintf(f,"%s\n",ptr->filename);
22610       }
22611       ptr = ptr->next;
22612     }
22613     (void)fclose(f);
22614   }
22615   else
22616   {
22617     fprintf(stderr,"Couldn't open file: %s\n", selected_map_path );
22618   }
22619 
22620 //    map_chooser_destroy_shell(widget,clientData,callData);
22621 
22622   // Set interrupt_drawing_now because conditions have changed.
22623   interrupt_drawing_now++;
22624 
22625   // Request that a new image be created.  Calls create_image,
22626   // XCopyArea, and display_zoom_status.
22627   request_new_image++;
22628 
22629 //    if (create_image(da)) {
22630 //        (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
22631 //    }
22632 }
22633 
22634 
22635 
22636 
22637 
22638 // Counts the number of "selected" fields with a value of 1 in the
22639 // in-memory map index.  Updates the "Dirs/Maps Selected" count in
22640 // the map chooser.
22641 void map_chooser_update_quantity(void)
22642 {
22643   int dir_quantity = 0;
22644   int map_quantity = 0;
22645   static char str_quantity[100];
22646   map_index_record *current = map_index_head;
22647   XmString x_str;
22648 
22649   // Count the "selected" fields in the map index with value of 1
22650   while (current != NULL)
22651   {
22652     if (current->selected)
22653     {
22654 
22655       if (current->filename[strlen(current->filename)-1] == '/')
22656       {
22657         // It's a directory
22658         dir_quantity++;
22659       }
22660       else
22661       {
22662         // It's a map
22663         map_quantity++;
22664       }
22665     }
22666     current = current->next;
22667   }
22668 
22669   // Update the "Dirs/Maps Selected" label in the Map Chooser
22670   xastir_snprintf(str_quantity,
22671                   sizeof(str_quantity),
22672                   "%d/%d",
22673                   dir_quantity,
22674                   map_quantity);
22675   x_str = XmStringCreateLocalized(str_quantity);
22676   XtVaSetValues(map_chooser_maps_selected_data,
22677                 XmNlabelString, x_str,
22678                 NULL);
22679   XmStringFree(x_str);
22680 }
22681 
22682 
22683 
22684 
22685 
22686 void map_chooser_select_vector_maps(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
22687 {
22688   int i, x;
22689   char *temp;
22690   char *ext;
22691   XmString *list;
22692 
22693   // Get the list and the count from the dialog
22694   XtVaGetValues(map_list,
22695                 XmNitemCount,&i,
22696                 XmNitems,&list,
22697                 NULL);
22698 
22699   // Run through the list looking for matching file extensions
22700   for(x=1; x<=i; x++)
22701   {
22702 
22703 //        // Deselect all currently selected maps
22704 //        if (XmListPosSelected(map_list,x)) {
22705 //            XmListDeselectPos(map_list,x);
22706 //        }
22707 
22708     temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_BEGINNING);
22709     if(temp)
22710     {
22711       ext = get_map_ext (temp);
22712       if ( (ext != NULL)
22713            && (   (strcasecmp(ext,"map") == 0)
22714                   || (strcasecmp(ext,"shp") == 0)
22715                   || (strcasecmp(ext,"gnis") == 0)
22716                   || (strcasecmp(ext,"rt1") == 0)
22717                   || (strcasecmp(ext,"rt2") == 0)
22718                   || (strcasecmp(ext,"rt4") == 0)
22719                   || (strcasecmp(ext,"rt5") == 0)
22720                   || (strcasecmp(ext,"rt6") == 0)
22721                   || (strcasecmp(ext,"rt7") == 0)
22722                   || (strcasecmp(ext,"rt8") == 0)
22723                   || (strcasecmp(ext,"rta") == 0)
22724                   || (strcasecmp(ext,"rtc") == 0)
22725                   || (strcasecmp(ext,"rth") == 0)
22726                   || (strcasecmp(ext,"rti") == 0)
22727                   || (strcasecmp(ext,"rtp") == 0)
22728                   || (strcasecmp(ext,"rtr") == 0)
22729                   || (strcasecmp(ext,"rts") == 0)
22730                   || (strcasecmp(ext,"rtt") == 0)
22731                   || (strcasecmp(ext,"rtz") == 0)
22732                   || (strcasecmp(ext,"tab") == 0) ) )
22733       {
22734         XmListSelectPos(map_list,x,TRUE);
22735       }
22736       XtFree(temp);
22737     }
22738   }
22739 
22740   map_chooser_update_quantity();
22741 }
22742 
22743 
22744 
22745 
22746 
22747 void map_chooser_select_250k_maps(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
22748 {
22749   int i, x, length;
22750   char *temp;
22751   char *ext;
22752   XmString *list;
22753 
22754   // Get the list and the count from the dialog
22755   XtVaGetValues(map_list,
22756                 XmNitemCount,&i,
22757                 XmNitems,&list,
22758                 NULL);
22759 
22760   // Run through the list looking for matching file extensions
22761   for(x=1; x<=i; x++)
22762   {
22763 
22764 //        // Deselect all currently selected maps
22765 //        if (XmListPosSelected(map_list,x)) {
22766 //            XmListDeselectPos(map_list,x);
22767 //        }
22768 
22769     temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_BEGINNING);
22770     if(temp)
22771     {
22772       ext = get_map_ext (temp);
22773       length = (int)strlen(temp);
22774       if ( (ext != NULL) && (strcasecmp (ext, "tif") == 0)
22775            && (length >= 12)   // "o48122h3.tif", we might have subdirectories also
22776            && ( (temp[length - 12] == 'c') || (temp[length - 12] == 'C') ) )
22777       {
22778         XmListSelectPos(map_list,x,TRUE);
22779       }
22780       XtFree(temp);
22781     }
22782   }
22783 
22784   map_chooser_update_quantity();
22785 }
22786 
22787 
22788 
22789 
22790 
22791 void map_chooser_select_100k_maps(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
22792 {
22793   int i, x, length;
22794   char *temp;
22795   char *ext;
22796   XmString *list;
22797 
22798   // Get the list and the count from the dialog
22799   XtVaGetValues(map_list,
22800                 XmNitemCount,&i,
22801                 XmNitems,&list,
22802                 NULL);
22803 
22804   // Run through the list looking for matching file extensions
22805   for(x=1; x<=i; x++)
22806   {
22807 
22808 //        // Deselect all currently selected maps
22809 //        if (XmListPosSelected(map_list,x)) {
22810 //            XmListDeselectPos(map_list,x);
22811 //        }
22812 
22813     temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_BEGINNING);
22814     if(temp)
22815     {
22816       ext = get_map_ext (temp);
22817       length = (int)strlen(temp);
22818       if ( (ext != NULL) && (strcasecmp (ext, "tif") == 0)
22819            && (length >= 12)   // "o48122h3.tif", we might have subdirectories also
22820            && ( (temp[length - 12] == 'f') || (temp[length - 12] == 'F') ) )
22821       {
22822         XmListSelectPos(map_list,x,TRUE);
22823       }
22824       XtFree(temp);
22825     }
22826   }
22827 
22828   map_chooser_update_quantity();
22829 }
22830 
22831 
22832 
22833 
22834 
22835 void map_chooser_select_24k_maps(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
22836 {
22837   int i, x, length;
22838   char *temp;
22839   char *ext;
22840   XmString *list;
22841 
22842   // Get the list and the count from the dialog
22843   XtVaGetValues(map_list,
22844                 XmNitemCount,&i,
22845                 XmNitems,&list,
22846                 NULL);
22847 
22848   // Run through the list looking for matching file extensions
22849   for(x=1; x<=i; x++)
22850   {
22851 
22852 //        // Deselect all currently selected maps
22853 //        if (XmListPosSelected(map_list,x)) {
22854 //            XmListDeselectPos(map_list,x);
22855 //        }
22856 
22857     temp = XmStringUnparse(list[(x-1)], NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_BEGINNING);
22858     if(temp)
22859     {
22860       ext = get_map_ext (temp);
22861       length = (int)strlen(temp);
22862       if ( (ext != NULL) && (strcasecmp (ext, "tif") == 0)
22863            && (length >= 12)   // "o48122h3.tif", we might have subdirectories also
22864            && ( (temp[length - 12] == 'o') || (temp[length - 12] == 'O')
22865                 || (temp[length - 12] == 'k') || (temp[length - 12] == 'K') ) )
22866       {
22867         XmListSelectPos(map_list,x,TRUE);
22868       }
22869       XtFree(temp);
22870     }
22871   }
22872 
22873   map_chooser_update_quantity();
22874 }
22875 
22876 
22877 
22878 
22879 
22880 // Removes the highlighting for maps in the current view of the map
22881 // chooser.  In order to de-select all maps, must flip through both
22882 // map chooser views and hit the "none" button each time, then hit
22883 // the "ok" button.
22884 //
22885 // Changed the code to clear all of the "selected" bits in the
22886 // in-memory map index as well.  The "None" and "OK" buttons take
22887 // immediate effect, all others do not (until the "OK" button is
22888 // pressed).  Decided that this was too inconsistent, so changed it
22889 // back and changed "None" to "Clear", which means to clear the
22890 // currently seen selections, but not the selections in the other
22891 // mode.
22892 //
22893 void map_chooser_deselect_maps(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
22894 {
22895   int i, x;
22896   XmString *list;
22897 //    map_index_record *current = map_index_head;
22898 
22899   // Get the list and the count from the dialog
22900   XtVaGetValues(map_list,
22901                 XmNitemCount,&i,
22902                 XmNitems,&list,
22903                 NULL);
22904 
22905   // Run through the widget's list, deselecting every line
22906   for(x=1; x<=i; x++)
22907   {
22908     if (XmListPosSelected(map_list,x))
22909     {
22910       XmListDeselectPos(map_list,x);
22911     }
22912   }
22913 
22914   /*
22915       // Run through the in-memory map list, deselecting every line
22916       while (current != NULL) {
22917           current->selected = 0;    // Not Selected
22918           current = current->next;
22919       }
22920   */
22921 
22922   map_chooser_update_quantity();
22923 }
22924 
22925 
22926 
22927 
22928 
22929 void sort_list(char *filename,int size, Widget list, int *item)
22930 {
22931   FILE *f_data;
22932   FILE *f_pointer;
22933   char fill[2000];
22934   long file_ptr;
22935 //    long ptr;
22936   char ptr_filename[400];
22937   XmString str_ptr;
22938 
22939   // Clear the list widget first
22940   XmListDeleteAllItems(list);
22941 
22942   xastir_snprintf(ptr_filename, sizeof(ptr_filename), "%s-ptr", filename);
22943   f_pointer=fopen(ptr_filename,"r");
22944   f_data=fopen(filename,"r");
22945   if (f_pointer!=NULL && f_data !=NULL)
22946   {
22947     while (!feof(f_pointer))
22948     {
22949 //            ptr=ftell(f_pointer);
22950       if (fread(&file_ptr,sizeof(file_ptr),1,f_pointer)==1)
22951       {
22952         (void)fseek(f_data,file_ptr,SEEK_SET);
22953         if (fread(fill,(size_t)size,1,f_data)==1)
22954         {
22955           str_ptr = XmStringCreateLocalized(fill);
22956           XmListAddItem(list, str_ptr,*item);
22957           XmStringFree(str_ptr);
22958           (*item)++;
22959         }
22960       }
22961     }
22962   }
22963   if(f_pointer!=NULL)
22964   {
22965     (void)fclose(f_pointer);
22966   }
22967   else
22968   {
22969     fprintf(stderr,"Couldn't open file: %s\n", ptr_filename);
22970   }
22971 
22972 
22973   if(f_data!=NULL)
22974   {
22975     (void)fclose(f_data);
22976   }
22977   else
22978   {
22979     fprintf(stderr,"Couldn't open file: %s\n", filename);
22980   }
22981 }
22982 
22983 
22984 
22985 
22986 
22987 // Mark the "selected" field in the in-memory map index based on the
22988 // contents of the selected_maps.sys file.  Called from main() right
22989 // after map_indexer() is called on startup.
22990 void map_chooser_init (void)
22991 {
22992   FILE *f;
22993   char temp[600];
22994   map_index_record *current;
22995   char selected_map_path[MAX_VALUE];
22996 
22997   get_user_base_dir(SELECTED_MAP_DATA, selected_map_path,
22998                     sizeof(selected_map_path));
22999 
23000 
23001   busy_cursor(appshell);
23002 
23003   // First run through our in-memory map index, clearing all of
23004   // the selected bits.
23005   current = map_index_head;
23006   while (current != NULL)
23007   {
23008     current->selected = 0;
23009     current = current->next;
23010   }
23011 
23012   (void)filecreate( selected_map_path );   // Create empty file if it doesn't exist
23013 
23014   f=fopen( selected_map_path, "r" );
23015   if (f!=NULL)
23016   {
23017     while(!feof(f))
23018     {
23019       int done;
23020 
23021       (void)get_line(f,temp,600);
23022 
23023       // We have a line from the file.  Find the matching line
23024       // in the in-memory map index.
23025       current = map_index_head;
23026       done = 0;
23027       while (current != NULL && !done)
23028       {
23029         //fprintf(stderr,"%s\n",current->filename);
23030 
23031         if (strcmp(temp,current->filename) == 0)
23032         {
23033           current->selected = 1;
23034           done++;
23035         }
23036         current = current->next;
23037       }
23038     }
23039     (void)fclose(f);
23040   }
23041   else
23042   {
23043     fprintf(stderr,"Couldn't open file: %s\n", selected_map_path );
23044   }
23045 }
23046 
23047 
23048 
23049 
23050 
23051 // Fills in the map chooser file/directory entries based on the
23052 // current view and whether the "selected" field in the in-memory
23053 // map_index is set for each file/directory.
23054 //
23055 // We also check the XmStringPtr field in the map index records.  If
23056 // NULL, then we call XmStringCreateLocalized() to allocate and fill in
23057 // the XmString value corresponding to the filename.  We use that to
23058 // speed up Map Chooser later.
23059 //
23060 void map_chooser_fill_in (void)
23061 {
23062   int n,i;
23063   map_index_record *current = map_index_head;
23064 
23065 
23066   busy_cursor(appshell);
23067 
23068   i=0;
23069   if (map_chooser_dialog)
23070   {
23071 
23072     // Empty the map_list widget first
23073     XmListDeleteAllItems(map_list);
23074 
23075     // Put all the map files/dirs in the map_index into the Map
23076     // Chooser dialog list (map_list).
23077     n=1;
23078 
23079     while (current != NULL)
23080     {
23081 
23082       //fprintf(stderr,"%s\n",current->filename);
23083 
23084       // Check whether we're supposed to show dirs and files or
23085       // just dirs.  Directories are always shown.
23086       if (map_chooser_expand_dirs // Show all
23087           || current->filename[strlen(current->filename)-1] == '/')
23088       {
23089 
23090 
23091 // Try XmListAddItems() here?  Could also create XmString's for each
23092 // filename and keep them in the map index.  Then we wouldn't have to
23093 // free that malloc/free that storage space all the time.
23094 // XmListAddItems()
23095 // XmListAddItemsUnselected()
23096 // XmListReplaceItems()
23097 // XmListReplaceItemsUnselected()
23098 
23099 
23100         // If pointer is NULL, malloc and create the
23101         // XmString corresponding to the filename, attach it
23102         // to the record.  The 2nd and succeeding times we
23103         // bring up Map Chooser, things will be faster.
23104         if (current->XmStringPtr == NULL)
23105         {
23106           current->XmStringPtr = XmStringCreateLocalized(current->filename);
23107         }
23108 
23109         XmListAddItem(map_list,
23110                       current->XmStringPtr,
23111                       n);
23112 
23113         // If a selected map, hilight it in the list
23114         if (current->selected)
23115         {
23116           XmListSelectPos(map_list,i,TRUE);
23117         }
23118 
23119         n++;
23120       }
23121       current = current->next;
23122     }
23123   }
23124 }
23125 
23126 ///////////////////////////////////////  Configure DRG Dialog //////////////////////////////////////////////
23127 #if defined(HAVE_LIBGEOTIFF)
23128 void Configure_DRG_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
23129 {
23130   Widget shell = (Widget) clientData;
23131 
23132   if (configure_DRG_dialog)
23133   {
23134     XtPopdown(shell);
23135     XtDestroyWidget(shell);
23136     configure_DRG_dialog = (Widget)NULL;
23137   }
23138 }
23139 
23140 
23141 
23142 
23143 
23144 void Configure_DRG_change_data(Widget widget, XtPointer clientData, XtPointer callData)
23145 {
23146 
23147   if (configure_DRG_dialog)
23148   {
23149 
23150     if(XmToggleButtonGetState(DRG_XOR))
23151     {
23152       DRG_XOR_colors=TRUE;
23153     }
23154     else
23155     {
23156       DRG_XOR_colors=FALSE;
23157     }
23158 
23159     if(XmToggleButtonGetState(DRG_color0))
23160     {
23161       DRG_show_colors[0]=TRUE;
23162     }
23163     else
23164     {
23165       DRG_show_colors[0]=FALSE;
23166     }
23167 
23168     if(XmToggleButtonGetState(DRG_color1))
23169     {
23170       DRG_show_colors[1]=TRUE;
23171     }
23172     else
23173     {
23174       DRG_show_colors[1]=FALSE;
23175     }
23176 
23177     if(XmToggleButtonGetState(DRG_color2))
23178     {
23179       DRG_show_colors[2]=TRUE;
23180     }
23181     else
23182     {
23183       DRG_show_colors[2]=FALSE;
23184     }
23185 
23186     if(XmToggleButtonGetState(DRG_color3))
23187     {
23188       DRG_show_colors[3]=TRUE;
23189     }
23190     else
23191     {
23192       DRG_show_colors[3]=FALSE;
23193     }
23194 
23195     if(XmToggleButtonGetState(DRG_color4))
23196     {
23197       DRG_show_colors[4]=TRUE;
23198     }
23199     else
23200     {
23201       DRG_show_colors[4]=FALSE;
23202     }
23203 
23204     if(XmToggleButtonGetState(DRG_color5))
23205     {
23206       DRG_show_colors[5]=TRUE;
23207     }
23208     else
23209     {
23210       DRG_show_colors[5]=FALSE;
23211     }
23212 
23213     if(XmToggleButtonGetState(DRG_color6))
23214     {
23215       DRG_show_colors[6]=TRUE;
23216     }
23217     else
23218     {
23219       DRG_show_colors[6]=FALSE;
23220     }
23221 
23222     if(XmToggleButtonGetState(DRG_color7))
23223     {
23224       DRG_show_colors[7]=TRUE;
23225     }
23226     else
23227     {
23228       DRG_show_colors[7]=FALSE;
23229     }
23230 
23231     if(XmToggleButtonGetState(DRG_color8))
23232     {
23233       DRG_show_colors[8]=TRUE;
23234     }
23235     else
23236     {
23237       DRG_show_colors[8]=FALSE;
23238     }
23239 
23240     if(XmToggleButtonGetState(DRG_color9))
23241     {
23242       DRG_show_colors[9]=TRUE;
23243     }
23244     else
23245     {
23246       DRG_show_colors[9]=FALSE;
23247     }
23248 
23249     if(XmToggleButtonGetState(DRG_color10))
23250     {
23251       DRG_show_colors[10]=TRUE;
23252     }
23253     else
23254     {
23255       DRG_show_colors[10]=FALSE;
23256     }
23257 
23258     if(XmToggleButtonGetState(DRG_color11))
23259     {
23260       DRG_show_colors[11]=TRUE;
23261     }
23262     else
23263     {
23264       DRG_show_colors[11]=FALSE;
23265     }
23266 
23267     if(XmToggleButtonGetState(DRG_color12))
23268     {
23269       DRG_show_colors[12]=TRUE;
23270     }
23271     else
23272     {
23273       DRG_show_colors[12]=FALSE;
23274     }
23275 
23276     Configure_DRG_destroy_shell(widget,clientData,callData);
23277 
23278     // Reload maps
23279     // Set interrupt_drawing_now because conditions have
23280     // changed.
23281     interrupt_drawing_now++;
23282 
23283     // Request that a new image be created.  Calls
23284     // create_image,
23285     // XCopyArea, and display_zoom_status.
23286     request_new_image++;
23287 
23288     //    if (create_image(da)) {
23289     //        (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
23290     //    }
23291 
23292   }
23293 }
23294 
23295 
23296 
23297 
23298 
23299 void Configure_DRG_all(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
23300 {
23301 
23302   if (configure_DRG_dialog)
23303   {
23304     XmToggleButtonSetState(DRG_color0,TRUE,FALSE);
23305     XmToggleButtonSetState(DRG_color1,TRUE,FALSE);
23306     XmToggleButtonSetState(DRG_color2,TRUE,FALSE);
23307     XmToggleButtonSetState(DRG_color3,TRUE,FALSE);
23308     XmToggleButtonSetState(DRG_color4,TRUE,FALSE);
23309     XmToggleButtonSetState(DRG_color5,TRUE,FALSE);
23310     XmToggleButtonSetState(DRG_color6,TRUE,FALSE);
23311     XmToggleButtonSetState(DRG_color7,TRUE,FALSE);
23312     XmToggleButtonSetState(DRG_color8,TRUE,FALSE);
23313     XmToggleButtonSetState(DRG_color9,TRUE,FALSE);
23314     XmToggleButtonSetState(DRG_color10,TRUE,FALSE);
23315     XmToggleButtonSetState(DRG_color11,TRUE,FALSE);
23316     XmToggleButtonSetState(DRG_color12,TRUE,FALSE);
23317   }
23318 }
23319 
23320 
23321 
23322 
23323 
23324 void Configure_DRG_none(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
23325 {
23326 
23327   if (configure_DRG_dialog)
23328   {
23329     XmToggleButtonSetState(DRG_color0,FALSE,FALSE);
23330     XmToggleButtonSetState(DRG_color1,FALSE,FALSE);
23331     XmToggleButtonSetState(DRG_color2,FALSE,FALSE);
23332     XmToggleButtonSetState(DRG_color3,FALSE,FALSE);
23333     XmToggleButtonSetState(DRG_color4,FALSE,FALSE);
23334     XmToggleButtonSetState(DRG_color5,FALSE,FALSE);
23335     XmToggleButtonSetState(DRG_color6,FALSE,FALSE);
23336     XmToggleButtonSetState(DRG_color7,FALSE,FALSE);
23337     XmToggleButtonSetState(DRG_color8,FALSE,FALSE);
23338     XmToggleButtonSetState(DRG_color9,FALSE,FALSE);
23339     XmToggleButtonSetState(DRG_color10,FALSE,FALSE);
23340     XmToggleButtonSetState(DRG_color11,FALSE,FALSE);
23341     XmToggleButtonSetState(DRG_color12,FALSE,FALSE);
23342   }
23343 }
23344 
23345 
23346 
23347 
23348 
23349 void Config_DRG( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
23350 {
23351   static Widget DRG_pane, scrollwindow, DRG_form, button_ok, button_cancel,
23352          DRG_label1, sep1, sep2, button_all, button_none;
23353   Atom delw;
23354 
23355   if (!configure_DRG_dialog)
23356   {
23357 
23358     configure_DRG_dialog = XtVaCreatePopupShell(langcode("PULDNMP030"),
23359                            xmDialogShellWidgetClass, appshell,
23360                            XmNdeleteResponse,XmDESTROY,
23361                            XmNdefaultPosition, FALSE,
23362                            XmNfontList, fontlist1,
23363                            NULL);
23364 
23365     DRG_pane = XtVaCreateWidget("Configure_DRG pane",
23366                                 xmPanedWindowWidgetClass,
23367                                 configure_DRG_dialog,
23368                                 MY_FOREGROUND_COLOR,
23369                                 MY_BACKGROUND_COLOR,
23370                                 NULL);
23371 
23372     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
23373                                            xmScrolledWindowWidgetClass,
23374                                            DRG_pane,
23375                                            XmNscrollingPolicy, XmAUTOMATIC,
23376                                            NULL);
23377 
23378     DRG_form =  XtVaCreateWidget("Configure_DRG DRG_form",
23379                                  xmFormWidgetClass,
23380                                  scrollwindow,
23381                                  XmNfractionBase, 3,
23382                                  XmNautoUnmanage, FALSE,
23383                                  XmNshadowThickness, 1,
23384                                  MY_FOREGROUND_COLOR,
23385                                  MY_BACKGROUND_COLOR,
23386                                  NULL);
23387 
23388     DRG_XOR  = XtVaCreateManagedWidget(langcode("MPUPDRG002"),
23389                                        xmToggleButtonWidgetClass,
23390                                        DRG_form,
23391                                        XmNtopAttachment, XmATTACH_FORM,
23392                                        XmNtopOffset, 10,
23393                                        XmNbottomAttachment, XmATTACH_NONE,
23394                                        XmNleftAttachment, XmATTACH_POSITION,
23395                                        XmNleftPosition, 0,
23396                                        XmNleftOffset, 10,
23397                                        XmNrightAttachment, XmATTACH_NONE,
23398                                        XmNsensitive, TRUE,
23399                                        MY_FOREGROUND_COLOR,
23400                                        MY_BACKGROUND_COLOR,
23401                                        XmNfontList, fontlist1,
23402                                        NULL);
23403 
23404     sep1 = XtVaCreateManagedWidget("Config DRG sep1",
23405                                    xmSeparatorGadgetClass,
23406                                    DRG_form,
23407                                    XmNorientation, XmHORIZONTAL,
23408                                    XmNtopAttachment,XmATTACH_WIDGET,
23409                                    XmNtopWidget, DRG_XOR,
23410                                    XmNtopOffset, 10,
23411                                    XmNbottomAttachment,XmATTACH_NONE,
23412                                    XmNleftAttachment, XmATTACH_FORM,
23413                                    XmNrightAttachment,XmATTACH_FORM,
23414                                    MY_FOREGROUND_COLOR,
23415                                    MY_BACKGROUND_COLOR,
23416                                    XmNfontList, fontlist1,
23417                                    NULL);
23418 
23419     DRG_label1  = XtVaCreateManagedWidget(langcode("MPUPDRG001"),
23420                                           xmLabelWidgetClass,
23421                                           DRG_form,
23422                                           XmNtopAttachment, XmATTACH_WIDGET,
23423                                           XmNtopWidget, sep1,
23424                                           XmNtopOffset, 5,
23425                                           XmNbottomAttachment, XmATTACH_NONE,
23426                                           XmNleftAttachment, XmATTACH_POSITION,
23427                                           XmNleftPosition, 0,
23428                                           XmNleftOffset, 10,
23429                                           XmNrightAttachment, XmATTACH_NONE,
23430                                           XmNsensitive, TRUE,
23431                                           MY_FOREGROUND_COLOR,
23432                                           MY_BACKGROUND_COLOR,
23433                                           XmNfontList, fontlist1,
23434                                           NULL);
23435 
23436 
23437 // Column 1
23438     // Black
23439     DRG_color0  = XtVaCreateManagedWidget(langcode("MPUPDRG003"),
23440                                           xmToggleButtonWidgetClass,
23441                                           DRG_form,
23442                                           XmNtopAttachment, XmATTACH_WIDGET,
23443                                           XmNtopWidget, DRG_label1,
23444                                           XmNtopOffset, 5,
23445                                           XmNbottomAttachment, XmATTACH_NONE,
23446                                           XmNleftAttachment, XmATTACH_POSITION,
23447                                           XmNleftPosition, 0,
23448                                           XmNleftOffset, 10,
23449                                           XmNrightAttachment, XmATTACH_NONE,
23450                                           XmNsensitive, TRUE,
23451                                           MY_FOREGROUND_COLOR,
23452                                           MY_BACKGROUND_COLOR,
23453                                           XmNfontList, fontlist1,
23454                                           NULL);
23455 
23456     // Blue
23457     DRG_color2  = XtVaCreateManagedWidget(langcode("MPUPDRG005"),
23458                                           xmToggleButtonWidgetClass,
23459                                           DRG_form,
23460                                           XmNtopAttachment, XmATTACH_WIDGET,
23461                                           XmNtopWidget, DRG_color0,
23462                                           XmNtopOffset, 5,
23463                                           XmNbottomAttachment, XmATTACH_NONE,
23464                                           XmNleftAttachment, XmATTACH_POSITION,
23465                                           XmNleftPosition, 0,
23466                                           XmNleftOffset, 10,
23467                                           XmNrightAttachment, XmATTACH_NONE,
23468                                           XmNsensitive, TRUE,
23469                                           MY_FOREGROUND_COLOR,
23470                                           MY_BACKGROUND_COLOR,
23471                                           XmNfontList, fontlist1,
23472                                           NULL);
23473 
23474     // Red
23475     DRG_color3  = XtVaCreateManagedWidget(langcode("MPUPDRG006"),
23476                                           xmToggleButtonWidgetClass,
23477                                           DRG_form,
23478                                           XmNtopAttachment, XmATTACH_WIDGET,
23479                                           XmNtopWidget, DRG_color2,
23480                                           XmNtopOffset, 5,
23481                                           XmNbottomAttachment, XmATTACH_NONE,
23482                                           XmNleftAttachment, XmATTACH_POSITION,
23483                                           XmNleftPosition, 0,
23484                                           XmNleftOffset, 10,
23485                                           XmNrightAttachment, XmATTACH_NONE,
23486                                           XmNsensitive, TRUE,
23487                                           MY_FOREGROUND_COLOR,
23488                                           MY_BACKGROUND_COLOR,
23489                                           XmNfontList, fontlist1,
23490                                           NULL);
23491 
23492     // Brown
23493     DRG_color4  = XtVaCreateManagedWidget(langcode("MPUPDRG007"),
23494                                           xmToggleButtonWidgetClass,
23495                                           DRG_form,
23496                                           XmNtopAttachment, XmATTACH_WIDGET,
23497                                           XmNtopWidget, DRG_color3,
23498                                           XmNtopOffset, 5,
23499                                           XmNbottomAttachment, XmATTACH_NONE,
23500                                           XmNleftAttachment, XmATTACH_POSITION,
23501                                           XmNleftPosition, 0,
23502                                           XmNleftOffset, 10,
23503                                           XmNrightAttachment, XmATTACH_NONE,
23504                                           XmNsensitive, TRUE,
23505                                           MY_FOREGROUND_COLOR,
23506                                           MY_BACKGROUND_COLOR,
23507                                           XmNfontList, fontlist1,
23508                                           NULL);
23509 
23510     // Purple
23511     DRG_color6  = XtVaCreateManagedWidget(langcode("MPUPDRG009"),
23512                                           xmToggleButtonWidgetClass,
23513                                           DRG_form,
23514                                           XmNtopAttachment, XmATTACH_WIDGET,
23515                                           XmNtopWidget, DRG_color4,
23516                                           XmNtopOffset, 5,
23517                                           XmNbottomAttachment, XmATTACH_NONE,
23518                                           XmNleftAttachment, XmATTACH_POSITION,
23519                                           XmNleftPosition, 0,
23520                                           XmNleftOffset, 10,
23521                                           XmNrightAttachment, XmATTACH_NONE,
23522                                           XmNsensitive, TRUE,
23523                                           MY_FOREGROUND_COLOR,
23524                                           MY_BACKGROUND_COLOR,
23525                                           XmNfontList, fontlist1,
23526                                           NULL);
23527 
23528 // Column 2
23529     // Light Gray
23530     DRG_color11  = XtVaCreateManagedWidget(langcode("MPUPDRG014"),
23531                                            xmToggleButtonWidgetClass,
23532                                            DRG_form,
23533                                            XmNtopAttachment, XmATTACH_WIDGET,
23534                                            XmNtopWidget, DRG_label1,
23535                                            XmNtopOffset, 5,
23536                                            XmNbottomAttachment, XmATTACH_NONE,
23537                                            XmNleftAttachment, XmATTACH_POSITION,
23538                                            XmNleftPosition, 1,
23539                                            XmNrightAttachment, XmATTACH_NONE,
23540                                            XmNsensitive, TRUE,
23541                                            MY_FOREGROUND_COLOR,
23542                                            MY_BACKGROUND_COLOR,
23543                                            XmNfontList, fontlist1,
23544                                            NULL);
23545 
23546     // Light Blue
23547     DRG_color8  = XtVaCreateManagedWidget(langcode("MPUPDRG011"),
23548                                           xmToggleButtonWidgetClass,
23549                                           DRG_form,
23550                                           XmNtopAttachment, XmATTACH_WIDGET,
23551                                           XmNtopWidget, DRG_color11,
23552                                           XmNtopOffset, 5,
23553                                           XmNbottomAttachment, XmATTACH_NONE,
23554                                           XmNleftAttachment, XmATTACH_POSITION,
23555                                           XmNleftPosition, 1,
23556                                           XmNrightAttachment, XmATTACH_NONE,
23557                                           XmNsensitive, TRUE,
23558                                           MY_FOREGROUND_COLOR,
23559                                           MY_BACKGROUND_COLOR,
23560                                           XmNfontList, fontlist1,
23561                                           NULL);
23562 
23563     // Light Red
23564     DRG_color9  = XtVaCreateManagedWidget(langcode("MPUPDRG012"),
23565                                           xmToggleButtonWidgetClass,
23566                                           DRG_form,
23567                                           XmNtopAttachment, XmATTACH_WIDGET,
23568                                           XmNtopWidget, DRG_color8,
23569                                           XmNtopOffset, 5,
23570                                           XmNbottomAttachment, XmATTACH_NONE,
23571                                           XmNleftAttachment, XmATTACH_POSITION,
23572                                           XmNleftPosition, 1,
23573                                           XmNrightAttachment, XmATTACH_NONE,
23574                                           XmNsensitive, TRUE,
23575                                           MY_FOREGROUND_COLOR,
23576                                           MY_BACKGROUND_COLOR,
23577                                           XmNfontList, fontlist1,
23578                                           NULL);
23579 
23580     // Light Brown
23581     DRG_color12  = XtVaCreateManagedWidget(langcode("MPUPDRG015"),
23582                                            xmToggleButtonWidgetClass,
23583                                            DRG_form,
23584                                            XmNtopAttachment, XmATTACH_WIDGET,
23585                                            XmNtopWidget, DRG_color9,
23586                                            XmNtopOffset, 5,
23587                                            XmNbottomAttachment, XmATTACH_NONE,
23588                                            XmNleftAttachment, XmATTACH_POSITION,
23589                                            XmNleftPosition, 1,
23590                                            XmNrightAttachment, XmATTACH_NONE,
23591                                            XmNsensitive, TRUE,
23592                                            MY_FOREGROUND_COLOR,
23593                                            MY_BACKGROUND_COLOR,
23594                                            XmNfontList, fontlist1,
23595                                            NULL);
23596 
23597     // Light Purple
23598     DRG_color10  = XtVaCreateManagedWidget(langcode("MPUPDRG013"),
23599                                            xmToggleButtonWidgetClass,
23600                                            DRG_form,
23601                                            XmNtopAttachment, XmATTACH_WIDGET,
23602                                            XmNtopWidget, DRG_color12,
23603                                            XmNtopOffset, 4,
23604                                            XmNbottomAttachment, XmATTACH_NONE,
23605                                            XmNleftAttachment, XmATTACH_POSITION,
23606                                            XmNleftPosition, 1,
23607                                            XmNrightAttachment, XmATTACH_NONE,
23608                                            XmNsensitive, TRUE,
23609                                            MY_FOREGROUND_COLOR,
23610                                            MY_BACKGROUND_COLOR,
23611                                            XmNfontList, fontlist1,
23612                                            NULL);
23613 
23614 // Column 3
23615     // White
23616     DRG_color1  = XtVaCreateManagedWidget(langcode("MPUPDRG004"),
23617                                           xmToggleButtonWidgetClass,
23618                                           DRG_form,
23619                                           XmNtopAttachment, XmATTACH_WIDGET,
23620                                           XmNtopWidget, DRG_label1,
23621                                           XmNtopOffset, 5,
23622                                           XmNbottomAttachment, XmATTACH_NONE,
23623                                           XmNleftAttachment, XmATTACH_POSITION,
23624                                           XmNleftPosition, 2,
23625                                           XmNleftOffset, 10,
23626                                           XmNrightAttachment, XmATTACH_NONE,
23627                                           XmNsensitive, TRUE,
23628                                           MY_FOREGROUND_COLOR,
23629                                           MY_BACKGROUND_COLOR,
23630                                           XmNfontList, fontlist1,
23631                                           NULL);
23632 
23633     // Green
23634     DRG_color5  = XtVaCreateManagedWidget(langcode("MPUPDRG008"),
23635                                           xmToggleButtonWidgetClass,
23636                                           DRG_form,
23637                                           XmNtopAttachment, XmATTACH_WIDGET,
23638                                           XmNtopWidget, DRG_color1,
23639                                           XmNtopOffset, 5,
23640                                           XmNbottomAttachment, XmATTACH_NONE,
23641                                           XmNleftAttachment, XmATTACH_POSITION,
23642                                           XmNleftPosition, 2,
23643                                           XmNleftOffset, 10,
23644                                           XmNrightAttachment, XmATTACH_NONE,
23645                                           XmNsensitive, TRUE,
23646                                           MY_FOREGROUND_COLOR,
23647                                           MY_BACKGROUND_COLOR,
23648                                           XmNfontList, fontlist1,
23649                                           NULL);
23650 
23651     // Yellow
23652     DRG_color7  = XtVaCreateManagedWidget(langcode("MPUPDRG010"),
23653                                           xmToggleButtonWidgetClass,
23654                                           DRG_form,
23655                                           XmNtopAttachment, XmATTACH_WIDGET,
23656                                           XmNtopWidget, DRG_color5,
23657                                           XmNtopOffset, 5,
23658                                           XmNbottomAttachment, XmATTACH_NONE,
23659                                           XmNleftAttachment, XmATTACH_POSITION,
23660                                           XmNleftPosition, 2,
23661                                           XmNleftOffset, 10,
23662                                           XmNrightAttachment, XmATTACH_NONE,
23663                                           XmNsensitive, TRUE,
23664                                           MY_FOREGROUND_COLOR,
23665                                           MY_BACKGROUND_COLOR,
23666                                           XmNfontList, fontlist1,
23667                                           NULL);
23668 
23669     sep2 = XtVaCreateManagedWidget("Config DRG sep2",
23670                                    xmSeparatorGadgetClass,
23671                                    DRG_form,
23672                                    XmNorientation, XmHORIZONTAL,
23673                                    XmNtopAttachment,XmATTACH_WIDGET,
23674                                    XmNtopWidget, DRG_color6,
23675                                    XmNtopOffset, 10,
23676                                    XmNbottomAttachment,XmATTACH_NONE,
23677                                    XmNleftAttachment, XmATTACH_FORM,
23678                                    XmNrightAttachment,XmATTACH_FORM,
23679                                    MY_FOREGROUND_COLOR,
23680                                    MY_BACKGROUND_COLOR,
23681                                    XmNfontList, fontlist1,
23682                                    NULL);
23683 
23684     button_all = XtVaCreateManagedWidget(langcode("PULDNMMC09"),
23685                                          xmPushButtonGadgetClass,
23686                                          DRG_form,
23687                                          XmNtopAttachment, XmATTACH_WIDGET,
23688                                          XmNtopWidget, sep2,
23689                                          XmNtopOffset, 5,
23690                                          XmNbottomAttachment, XmATTACH_FORM,
23691                                          XmNbottomOffset, 5,
23692                                          XmNleftAttachment, XmATTACH_POSITION,
23693                                          XmNleftPosition, 0,
23694                                          XmNleftOffset, 10,
23695                                          XmNrightAttachment, XmATTACH_NONE,
23696                                          XmNnavigationType, XmTAB_GROUP,
23697                                          MY_FOREGROUND_COLOR,
23698                                          MY_BACKGROUND_COLOR,
23699                                          XmNfontList, fontlist1,
23700                                          NULL);
23701 
23702     button_none = XtVaCreateManagedWidget(langcode("PULDNDP040"),
23703                                           xmPushButtonGadgetClass,
23704                                           DRG_form,
23705                                           XmNtopAttachment, XmATTACH_WIDGET,
23706                                           XmNtopWidget, sep2,
23707                                           XmNtopOffset, 5,
23708                                           XmNbottomAttachment, XmATTACH_FORM,
23709                                           XmNbottomOffset, 5,
23710                                           XmNleftAttachment, XmATTACH_WIDGET,
23711                                           XmNleftWidget, button_all,
23712                                           XmNrightAttachment, XmATTACH_NONE,
23713                                           XmNnavigationType, XmTAB_GROUP,
23714                                           MY_FOREGROUND_COLOR,
23715                                           MY_BACKGROUND_COLOR,
23716                                           XmNfontList, fontlist1,
23717                                           NULL);
23718 
23719     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
23720                                         xmPushButtonGadgetClass,
23721                                         DRG_form,
23722                                         XmNtopAttachment, XmATTACH_WIDGET,
23723                                         XmNtopWidget, sep2,
23724                                         XmNtopOffset, 5,
23725                                         XmNbottomAttachment, XmATTACH_FORM,
23726                                         XmNbottomOffset, 5,
23727                                         XmNleftAttachment, XmATTACH_WIDGET,
23728                                         XmNleftWidget, button_none,
23729                                         XmNrightAttachment, XmATTACH_NONE,
23730                                         XmNrightOffset, 10,
23731                                         XmNnavigationType, XmTAB_GROUP,
23732                                         MY_FOREGROUND_COLOR,
23733                                         MY_BACKGROUND_COLOR,
23734                                         XmNfontList, fontlist1,
23735                                         NULL);
23736 
23737     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
23738                                             xmPushButtonGadgetClass,
23739                                             DRG_form,
23740                                             XmNtopAttachment, XmATTACH_WIDGET,
23741                                             XmNtopWidget, sep2,
23742                                             XmNtopOffset, 5,
23743                                             XmNbottomAttachment, XmATTACH_FORM,
23744                                             XmNbottomOffset, 5,
23745                                             XmNleftAttachment, XmATTACH_WIDGET,
23746                                             XmNleftWidget, button_ok,
23747                                             XmNrightAttachment, XmATTACH_POSITION,
23748                                             XmNrightPosition, 3,
23749                                             XmNrightOffset, 10,
23750                                             XmNnavigationType, XmTAB_GROUP,
23751                                             MY_FOREGROUND_COLOR,
23752                                             MY_BACKGROUND_COLOR,
23753                                             XmNfontList, fontlist1,
23754                                             NULL);
23755 
23756     XtAddCallback(button_all,
23757                   XmNactivateCallback,
23758                   Configure_DRG_all,
23759                   configure_DRG_dialog);
23760 
23761     XtAddCallback(button_none,
23762                   XmNactivateCallback,
23763                   Configure_DRG_none,
23764                   configure_DRG_dialog);
23765 
23766     XtAddCallback(button_ok,
23767                   XmNactivateCallback,
23768                   Configure_DRG_change_data,
23769                   configure_DRG_dialog);
23770 
23771     XtAddCallback(button_cancel,
23772                   XmNactivateCallback,
23773                   Configure_DRG_destroy_shell,
23774                   configure_DRG_dialog);
23775 
23776     pos_dialog(configure_DRG_dialog);
23777 
23778     delw = XmInternAtom(XtDisplay(configure_DRG_dialog),
23779                         "WM_DELETE_WINDOW",
23780                         FALSE);
23781     XmAddWMProtocolCallback(configure_DRG_dialog,
23782                             delw,
23783                             Configure_DRG_destroy_shell,
23784                             (XtPointer)configure_DRG_dialog);
23785 
23786     if(DRG_XOR_colors)
23787     {
23788       XmToggleButtonSetState(DRG_XOR,TRUE,FALSE);
23789     }
23790     else
23791     {
23792       XmToggleButtonSetState(DRG_XOR,FALSE,FALSE);
23793     }
23794 
23795     if(DRG_show_colors[0])
23796     {
23797       XmToggleButtonSetState(DRG_color0,TRUE,FALSE);
23798     }
23799     else
23800     {
23801       XmToggleButtonSetState(DRG_color0,FALSE,FALSE);
23802     }
23803 
23804     if(DRG_show_colors[1])
23805     {
23806       XmToggleButtonSetState(DRG_color1,TRUE,FALSE);
23807     }
23808     else
23809     {
23810       XmToggleButtonSetState(DRG_color1,FALSE,FALSE);
23811     }
23812 
23813     if(DRG_show_colors[2])
23814     {
23815       XmToggleButtonSetState(DRG_color2,TRUE,FALSE);
23816     }
23817     else
23818     {
23819       XmToggleButtonSetState(DRG_color2,FALSE,FALSE);
23820     }
23821 
23822     if(DRG_show_colors[3])
23823     {
23824       XmToggleButtonSetState(DRG_color3,TRUE,FALSE);
23825     }
23826     else
23827     {
23828       XmToggleButtonSetState(DRG_color3,FALSE,FALSE);
23829     }
23830 
23831     if(DRG_show_colors[4])
23832     {
23833       XmToggleButtonSetState(DRG_color4,TRUE,FALSE);
23834     }
23835     else
23836     {
23837       XmToggleButtonSetState(DRG_color4,FALSE,FALSE);
23838     }
23839 
23840     if(DRG_show_colors[5])
23841     {
23842       XmToggleButtonSetState(DRG_color5,TRUE,FALSE);
23843     }
23844     else
23845     {
23846       XmToggleButtonSetState(DRG_color5,FALSE,FALSE);
23847     }
23848 
23849     if(DRG_show_colors[6])
23850     {
23851       XmToggleButtonSetState(DRG_color6,TRUE,FALSE);
23852     }
23853     else
23854     {
23855       XmToggleButtonSetState(DRG_color6,FALSE,FALSE);
23856     }
23857 
23858     if(DRG_show_colors[7])
23859     {
23860       XmToggleButtonSetState(DRG_color7,TRUE,FALSE);
23861     }
23862     else
23863     {
23864       XmToggleButtonSetState(DRG_color7,FALSE,FALSE);
23865     }
23866 
23867     if(DRG_show_colors[8])
23868     {
23869       XmToggleButtonSetState(DRG_color8,TRUE,FALSE);
23870     }
23871     else
23872     {
23873       XmToggleButtonSetState(DRG_color8,FALSE,FALSE);
23874     }
23875 
23876     if(DRG_show_colors[9])
23877     {
23878       XmToggleButtonSetState(DRG_color9,TRUE,FALSE);
23879     }
23880     else
23881     {
23882       XmToggleButtonSetState(DRG_color9,FALSE,FALSE);
23883     }
23884 
23885     if(DRG_show_colors[10])
23886     {
23887       XmToggleButtonSetState(DRG_color10,TRUE,FALSE);
23888     }
23889     else
23890     {
23891       XmToggleButtonSetState(DRG_color10,FALSE,FALSE);
23892     }
23893 
23894     if(DRG_show_colors[11])
23895     {
23896       XmToggleButtonSetState(DRG_color11,TRUE,FALSE);
23897     }
23898     else
23899     {
23900       XmToggleButtonSetState(DRG_color11,FALSE,FALSE);
23901     }
23902 
23903     if(DRG_show_colors[12])
23904     {
23905       XmToggleButtonSetState(DRG_color12,TRUE,FALSE);
23906     }
23907     else
23908     {
23909       XmToggleButtonSetState(DRG_color12,FALSE,FALSE);
23910     }
23911 
23912     XtManageChild(DRG_form);
23913     XtManageChild(DRG_pane);
23914 
23915     resize_dialog(DRG_form, configure_DRG_dialog);
23916 
23917     XtPopup(configure_DRG_dialog,XtGrabNone);
23918 
23919     XmProcessTraversal(button_ok, XmTRAVERSE_CURRENT);
23920 
23921   }
23922   else
23923     (void)XRaiseWindow(XtDisplay(configure_DRG_dialog),
23924                        XtWindow(configure_DRG_dialog));
23925 }
23926 #endif // HAVE_LIBGEOTIFF
23927 ///////////////////////// End of Configure DRG code ///////////////////////////////////
23928 
23929 
23930 
23931 
23932 
23933 void Expand_Dirs_toggle( Widget w, XtPointer clientData, XtPointer callData)
23934 {
23935   char *which = (char *)clientData;
23936   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
23937 
23938   if(state->set)
23939   {
23940     map_chooser_expand_dirs = atoi(which);
23941   }
23942   else
23943   {
23944     map_chooser_expand_dirs = 0;
23945   }
23946 
23947   // Kill/resurrect the Map Chooser so that the changes take
23948   // effect.
23949   map_chooser_destroy_shell( w, map_chooser_dialog, (XtPointer) NULL);
23950   Map_chooser( w, (XtPointer)NULL, (XtPointer) NULL);
23951 
23952   map_chooser_update_quantity();
23953 }
23954 
23955 
23956 
23957 
23958 
23959 void Map_chooser( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
23960 {
23961   static Widget pane, scrollwindow, my_form, button_clear, button_V,
23962          button_C, button_F, button_O,
23963          rowcol, expand_dirs_button, button_properties,
23964          maps_selected_label, button_apply;
23965   Atom delw;
23966 //    int i;
23967   Arg al[50];                    /* Arg List */
23968   register unsigned int ac = 0;           /* Arg Count */
23969 
23970 
23971   busy_cursor(appshell);
23972 
23973 //    i=0;
23974   if (!map_chooser_dialog)
23975   {
23976     map_chooser_dialog = XtVaCreatePopupShell(langcode("WPUPMCP001"),
23977                          xmDialogShellWidgetClass, appshell,
23978                          XmNdeleteResponse,XmDESTROY,
23979                          XmNdefaultPosition, FALSE,
23980                          XmNfontList, fontlist1,
23981                          NULL);
23982 
23983     pane = XtVaCreateWidget("Map_chooser pane",
23984                             xmPanedWindowWidgetClass,
23985                             map_chooser_dialog,
23986                             MY_FOREGROUND_COLOR,
23987                             MY_BACKGROUND_COLOR,
23988                             NULL);
23989 
23990     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
23991                                            xmScrolledWindowWidgetClass,
23992                                            pane,
23993                                            XmNscrollingPolicy, XmAUTOMATIC,
23994                                            NULL);
23995 
23996     my_form =  XtVaCreateWidget("Map_chooser my_form",
23997                                 xmFormWidgetClass,
23998                                 scrollwindow,
23999                                 XmNfractionBase, 7,
24000                                 XmNautoUnmanage, FALSE,
24001                                 XmNshadowThickness, 1,
24002                                 MY_FOREGROUND_COLOR,
24003                                 MY_BACKGROUND_COLOR,
24004                                 NULL);
24005 
24006     /*set args for color */
24007     ac=0;
24008     XtSetArg(al[ac], XmNvisibleItemCount, 13);
24009     ac++;
24010     XtSetArg(al[ac], XmNshadowThickness, 3);
24011     ac++;
24012     XtSetArg(al[ac], XmNselectionPolicy, XmMULTIPLE_SELECT);
24013     ac++;
24014     XtSetArg(al[ac], XmNscrollBarPlacement, XmBOTTOM_RIGHT);
24015     ac++;
24016     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
24017     ac++;
24018     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
24019     ac++;
24020     XtSetArg(al[ac], XmNfontList, fontlist1);
24021     ac++;
24022 
24023     map_list = XmCreateScrolledList(my_form,
24024                                     "Map_chooser list",
24025                                     al,
24026                                     ac);
24027 
24028     // Find the names of all the map files on disk and put them into map_list
24029     map_chooser_fill_in();
24030 
24031     expand_dirs_button = XtVaCreateManagedWidget(langcode("PULDNMMC06"),
24032                          xmToggleButtonWidgetClass,
24033                          my_form,
24034                          XmNtopAttachment, XmATTACH_FORM,
24035                          XmNtopOffset, 5,
24036                          XmNbottomAttachment, XmATTACH_NONE,
24037                          XmNleftAttachment, XmATTACH_FORM,
24038                          XmNleftOffset,10,
24039                          XmNrightAttachment, XmATTACH_NONE,
24040                          XmNsensitive, TRUE,
24041                          XmNnavigationType, XmTAB_GROUP,
24042                          MY_FOREGROUND_COLOR,
24043                          MY_BACKGROUND_COLOR,
24044                          XmNfontList, fontlist1,
24045                          NULL);
24046     XtAddCallback(expand_dirs_button,XmNvalueChangedCallback,Expand_Dirs_toggle,"1");
24047     if(map_chooser_expand_dirs)
24048     {
24049       XmToggleButtonSetState(expand_dirs_button,TRUE,FALSE);
24050     }
24051     else
24052     {
24053       XmToggleButtonSetState(expand_dirs_button,FALSE,FALSE);
24054     }
24055 
24056     maps_selected_label = XtVaCreateManagedWidget(langcode("PULDNMMC07"),
24057                           xmLabelWidgetClass,
24058                           my_form,
24059                           XmNtopAttachment,           XmATTACH_FORM,
24060                           XmNtopOffset,               10,
24061                           XmNbottomAttachment,        XmATTACH_NONE,
24062                           XmNleftAttachment,          XmATTACH_WIDGET,
24063                           XmNleftWidget,              expand_dirs_button,
24064                           XmNleftOffset,              15,
24065                           XmNrightAttachment,         XmATTACH_NONE,
24066                           MY_FOREGROUND_COLOR,
24067                           MY_BACKGROUND_COLOR,
24068                           XmNfontList, fontlist1,
24069                           NULL);
24070 
24071     map_chooser_maps_selected_data = XtVaCreateManagedWidget("0/0",
24072                                      xmLabelWidgetClass,
24073                                      my_form,
24074                                      XmNtopAttachment,           XmATTACH_FORM,
24075                                      XmNtopOffset,               10,
24076                                      XmNbottomAttachment,        XmATTACH_NONE,
24077                                      XmNleftAttachment,          XmATTACH_WIDGET,
24078                                      XmNleftWidget,              maps_selected_label,
24079                                      XmNleftOffset,              2,
24080                                      XmNrightAttachment,         XmATTACH_NONE,
24081                                      MY_FOREGROUND_COLOR,
24082                                      MY_BACKGROUND_COLOR,
24083                                      XmNfontList, fontlist1,
24084                                      NULL);
24085 
24086     // Button for configuring properties
24087     button_properties = XtVaCreateManagedWidget(langcode("UNIOP00009"),
24088                         xmPushButtonGadgetClass,
24089                         my_form,
24090                         XmNtopAttachment, XmATTACH_FORM,
24091                         XmNtopOffset, 5,
24092                         XmNbottomAttachment, XmATTACH_NONE,
24093                         XmNleftAttachment, XmATTACH_NONE,
24094                         XmNrightAttachment, XmATTACH_FORM,
24095                         XmNrightOffset, 10,
24096                         XmNsensitive, TRUE,
24097                         XmNnavigationType, XmTAB_GROUP,
24098                         MY_FOREGROUND_COLOR,
24099                         MY_BACKGROUND_COLOR,
24100                         XmNfontList, fontlist1,
24101                         NULL);
24102     XtAddCallback(button_properties, XmNactivateCallback, map_properties, map_chooser_dialog);
24103 
24104     // Attach a rowcolumn manager widget to my_form to handle all of the buttons
24105     rowcol = XtVaCreateManagedWidget("Map Chooser rowcol",
24106                                      xmRowColumnWidgetClass,
24107                                      my_form,
24108                                      XmNorientation, XmHORIZONTAL,
24109                                      XmNtopAttachment, XmATTACH_NONE,
24110                                      XmNbottomAttachment, XmATTACH_FORM,
24111                                      XmNleftAttachment, XmATTACH_FORM,
24112                                      XmNrightAttachment, XmATTACH_FORM,
24113                                      XmNkeyboardFocusPolicy, XmEXPLICIT,
24114                                      MY_FOREGROUND_COLOR,
24115                                      MY_BACKGROUND_COLOR,
24116                                      XmNfontList, fontlist1,
24117                                      NULL);
24118 
24119     XtVaSetValues(XtParent(map_list),
24120                   XmNtopAttachment, XmATTACH_WIDGET,
24121                   XmNtopWidget, expand_dirs_button,
24122                   XmNtopOffset, 2,
24123                   XmNbottomAttachment, XmATTACH_WIDGET,
24124                   XmNbottomWidget, rowcol,
24125                   XmNbottomOffset, 2,
24126                   XmNrightAttachment, XmATTACH_FORM,
24127                   XmNrightOffset, 5,
24128                   XmNleftAttachment, XmATTACH_FORM,
24129                   XmNleftOffset, 5,
24130                   XmNfontList, fontlist1,
24131                   NULL);
24132 
24133 // "Clear"
24134     if(map_chooser_expand_dirs)     // "Clear"
24135     {
24136       button_clear = XtVaCreateManagedWidget(langcode("PULDNMMC01"),
24137                                              xmPushButtonGadgetClass,
24138                                              rowcol,
24139                                              XmNnavigationType, XmTAB_GROUP,
24140                                              MY_FOREGROUND_COLOR,
24141                                              MY_BACKGROUND_COLOR,
24142                                              XmNfontList, fontlist1,
24143                                              NULL);
24144     }
24145     else    // "Clear Dirs"
24146     {
24147       button_clear = XtVaCreateManagedWidget(langcode("PULDNMMC08"),
24148                                              xmPushButtonGadgetClass,
24149                                              rowcol,
24150                                              XmNnavigationType, XmTAB_GROUP,
24151                                              MY_FOREGROUND_COLOR,
24152                                              MY_BACKGROUND_COLOR,
24153                                              XmNfontList, fontlist1,
24154                                              NULL);
24155     }
24156 
24157 
24158 // "Vector Maps"
24159     button_V = XtVaCreateManagedWidget(langcode("PULDNMMC02"),
24160                                        xmPushButtonGadgetClass,
24161                                        rowcol,
24162                                        XmNnavigationType, XmTAB_GROUP,
24163                                        MY_FOREGROUND_COLOR,
24164                                        MY_BACKGROUND_COLOR,
24165                                        XmNfontList, fontlist1,
24166                                        NULL);
24167 
24168 // "250k Topos"
24169     button_C = XtVaCreateManagedWidget(langcode("PULDNMMC03"),
24170                                        xmPushButtonGadgetClass,
24171                                        rowcol,
24172                                        XmNnavigationType, XmTAB_GROUP,
24173 #ifndef HAVE_LIBGEOTIFF
24174                                        XmNsensitive, FALSE,
24175 #endif /* HAVE_LIBGEOTIFF */
24176                                        MY_FOREGROUND_COLOR,
24177                                        MY_BACKGROUND_COLOR,
24178                                        XmNfontList, fontlist1,
24179                                        NULL);
24180 
24181 // "100k Topos"
24182     button_F = XtVaCreateManagedWidget(langcode("PULDNMMC04"),
24183                                        xmPushButtonGadgetClass,
24184                                        rowcol,
24185                                        XmNnavigationType, XmTAB_GROUP,
24186 #ifndef HAVE_LIBGEOTIFF
24187                                        XmNsensitive, FALSE,
24188 #endif /* HAVE_LIBGEOTIFF */
24189                                        MY_FOREGROUND_COLOR,
24190                                        MY_BACKGROUND_COLOR,
24191                                        XmNfontList, fontlist1,
24192                                        NULL);
24193 
24194 // "24k Topos"
24195     button_O = XtVaCreateManagedWidget(langcode("PULDNMMC05"),
24196                                        xmPushButtonGadgetClass,
24197                                        rowcol,
24198                                        XmNnavigationType, XmTAB_GROUP,
24199 #ifndef HAVE_LIBGEOTIFF
24200                                        XmNsensitive, FALSE,
24201 #endif /* HAVE_LIBGEOTIFF */
24202                                        MY_FOREGROUND_COLOR,
24203                                        MY_BACKGROUND_COLOR,
24204                                        XmNfontList, fontlist1,
24205                                        NULL);
24206 
24207 // "Apply"
24208     button_apply = XtVaCreateManagedWidget(langcode("UNIOP00032"),
24209                                            xmPushButtonGadgetClass,
24210                                            rowcol,
24211                                            XmNnavigationType, XmTAB_GROUP,
24212                                            MY_FOREGROUND_COLOR,
24213                                            MY_BACKGROUND_COLOR,
24214                                            XmNfontList, fontlist1,
24215                                            NULL);
24216 
24217 // "OK"
24218     map_chooser_button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
24219                             xmPushButtonGadgetClass,
24220                             rowcol,
24221                             XmNnavigationType, XmTAB_GROUP,
24222                             MY_FOREGROUND_COLOR,
24223                             MY_BACKGROUND_COLOR,
24224                             XmNfontList, fontlist1,
24225                             NULL);
24226 
24227 // "Cancel"
24228     map_chooser_button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
24229                                 xmPushButtonGadgetClass,
24230                                 rowcol,
24231                                 XmNnavigationType, XmTAB_GROUP,
24232                                 MY_FOREGROUND_COLOR,
24233                                 MY_BACKGROUND_COLOR,
24234                                 XmNfontList, fontlist1,
24235                                 NULL);
24236 
24237     XtAddCallback(button_apply, XmNactivateCallback, map_chooser_apply_maps, map_chooser_dialog);
24238     XtAddCallback(map_chooser_button_cancel, XmNactivateCallback, map_chooser_destroy_shell, map_chooser_dialog);
24239     XtAddCallback(map_chooser_button_ok, XmNactivateCallback, map_chooser_select_maps, map_chooser_dialog);
24240     XtAddCallback(button_clear, XmNactivateCallback, map_chooser_deselect_maps, map_chooser_dialog);
24241     XtAddCallback(button_V, XmNactivateCallback, map_chooser_select_vector_maps, map_chooser_dialog);
24242 #ifdef HAVE_LIBGEOTIFF
24243     XtAddCallback(button_C, XmNactivateCallback, map_chooser_select_250k_maps, map_chooser_dialog);
24244     XtAddCallback(button_F, XmNactivateCallback, map_chooser_select_100k_maps, map_chooser_dialog);
24245     XtAddCallback(button_O, XmNactivateCallback, map_chooser_select_24k_maps, map_chooser_dialog);
24246 #endif /* HAVE_LIBGEOTIFF */
24247 
24248     if(!map_chooser_expand_dirs)
24249     {
24250       XtSetSensitive(button_V, FALSE);
24251       XtSetSensitive(button_C, FALSE);
24252       XtSetSensitive(button_F, FALSE);
24253       XtSetSensitive(button_O, FALSE);
24254     }
24255 
24256     pos_dialog(map_chooser_dialog);
24257 
24258     delw = XmInternAtom(XtDisplay(map_chooser_dialog),"WM_DELETE_WINDOW", FALSE);
24259     XmAddWMProtocolCallback(map_chooser_dialog, delw, map_chooser_destroy_shell, (XtPointer)map_chooser_dialog);
24260 
24261     XtManageChild(rowcol);
24262     XtManageChild(my_form);
24263     XtManageChild(map_list);
24264     XtVaSetValues(map_list, XmNbackground, colors[0x0f], NULL);
24265     XtManageChild(pane);
24266 
24267     resize_dialog(my_form, map_chooser_dialog);
24268 
24269     XtPopup(map_chooser_dialog,XtGrabNone);
24270 
24271     // Move focus to the OK button.  This appears to highlight the
24272     // button fine, but we're not able to hit the <Enter> key to
24273     // have that default function happen.  Note:  We _can_ hit the
24274     // <SPACE> key, and that activates the option.
24275 //        XmUpdateDisplay(map_chooser_dialog);
24276     XmProcessTraversal(map_chooser_button_ok, XmTRAVERSE_CURRENT);
24277 
24278   }
24279   else
24280   {
24281     (void)XRaiseWindow(XtDisplay(map_chooser_dialog), XtWindow(map_chooser_dialog));
24282   }
24283 
24284   map_chooser_update_quantity();
24285 }
24286 
24287 
24288 
24289 
24290 
24291 /****** Read in file **********/
24292 
24293 void read_file_selection_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
24294 {
24295   Widget shell = (Widget) clientData;
24296   XtDestroyWidget(shell);
24297   read_selection_dialog = (Widget)NULL;
24298 }
24299 
24300 
24301 
24302 
24303 
24304 void read_file_selection_now(Widget w, XtPointer clientData, XtPointer callData)
24305 {
24306   char *file;
24307   XmFileSelectionBoxCallbackStruct *cbs =(XmFileSelectionBoxCallbackStruct*)callData;
24308 
24309   file = XmStringUnparse(cbs->value, NULL, XmCHARSET_TEXT, XmCHARSET_TEXT, NULL, 0, XmOUTPUT_BEGINNING);
24310   if(file)
24311   {
24312     // fprintf(stderr,"FILE is %s\n",file);
24313 
24314     // Make sure we're not already reading a file and the user actually
24315     // selected a file (if not, the last character will be a '/').
24316     if ( (!read_file) && (file[strlen(file) - 1] != '/') )
24317     {
24318 
24319       /* do read file start */
24320       read_file_ptr = fopen(file,"r");
24321       if (read_file_ptr != NULL)
24322       {
24323         read_file = 1;
24324       }
24325       else
24326       {
24327         fprintf(stderr,"Couldn't open file: %s\n", file);
24328       }
24329 
24330     }
24331     XtFree(file);
24332   }
24333   read_file_selection_destroy_shell(w, clientData, callData);
24334 
24335   // Note that we leave the file in the "open" state.  UpdateTime
24336   // comes along shortly and reads the file.
24337 }
24338 
24339 
24340 
24341 
24342 
24343 void Read_File_Selection( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
24344 {
24345   Arg al[50];                    /* Arg List */
24346   register unsigned int ac = 0;           /* Arg Count */
24347   Widget fs;
24348   Widget child;
24349   char temp_base_dir[MAX_VALUE];
24350 
24351   if (read_selection_dialog!=NULL)
24352   {
24353     read_file_selection_destroy_shell(read_selection_dialog, read_selection_dialog, NULL);
24354   }
24355 
24356   if(read_selection_dialog==NULL)
24357   {
24358 
24359     // This is necessary because the resources for setting the
24360     // directory in the FileSelectionDialog aren't working in Lesstif.
24361     if (chdir( get_user_base_dir("logs", temp_base_dir, sizeof(temp_base_dir)) ) != 0)
24362     {
24363       fprintf(stderr,"Couldn't chdir to the file selection\n");
24364       return;
24365     }
24366 
24367     /*set args for color */
24368     ac=0;
24369     XtSetArg(al[ac], XmNtitle, langcode("PULDNFI002"));
24370     ac++;  // Open Log File
24371     XtSetArg(al[ac], XmNtraversalOn, TRUE);
24372     ac++;
24373     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
24374     ac++;
24375     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
24376     ac++;
24377     XtSetArg(al[ac], XmNfontList, fontlist1);
24378     ac++;
24379     //XtSetArg(al[ac], XmNdirMask, "/home/hacker/.xastir/logs/*"); ac++;
24380     //XtSetArg(al[ac], XmNdirectory, "/home/hacker/.xastir/logs/"); ac++;
24381     //XtSetArg(al[ac], XmNpattern, "*"); ac++;
24382     //XtSetArg(al[ac], XmNdirMask, ".xastir/logs/*"); ac++;
24383     read_selection_dialog = XmCreateFileSelectionDialog(appshell,
24384                             "filesb",
24385                             al,
24386                             ac);
24387 
24388     // Change back to the base directory
24389     if (chdir( get_user_base_dir("", temp_base_dir, sizeof(temp_base_dir)) ) != 0)
24390     {
24391       fprintf(stderr,"Couldn't chdir back to the base directory\n");
24392       return;
24393     }
24394 
24395     fs=XmFileSelectionBoxGetChild(read_selection_dialog,(unsigned char)XmDIALOG_TEXT);
24396     XtVaSetValues(fs,XmNbackground, colors[0x0f],NULL);
24397     XtVaSetValues(fs,XmNfontList,fontlist1,NULL);
24398 
24399     fs=XmFileSelectionBoxGetChild(read_selection_dialog,(unsigned char)XmDIALOG_FILTER_TEXT);
24400     XtVaSetValues(fs,XmNbackground, colors[0x0f],NULL);
24401     XtVaSetValues(fs,XmNfontList,fontlist1,NULL);
24402 
24403     fs=XmFileSelectionBoxGetChild(read_selection_dialog,(unsigned char)XmDIALOG_DIR_LIST);
24404     XtVaSetValues(fs,XmNbackground, colors[0x0f],NULL);
24405     XtVaSetValues(fs,XmNfontList,fontlist1,NULL);
24406 
24407     fs=XmFileSelectionBoxGetChild(read_selection_dialog,(unsigned char)XmDIALOG_LIST);
24408     XtVaSetValues(fs,XmNbackground, colors[0x0f],NULL);
24409     XtVaSetValues(fs,XmNfontList,fontlist1,NULL);
24410 
24411     //XtVaSetValues(read_selection_dialog, XmNdirMask, "/home/hacker/.xastir/logs/*", NULL);
24412 
24413     child = XmFileSelectionBoxGetChild(read_selection_dialog, XmDIALOG_FILTER_LABEL);
24414     XtVaSetValues(child,XmNfontList,fontlist1,NULL);
24415 
24416     child = XmFileSelectionBoxGetChild(read_selection_dialog, XmDIALOG_DIR_LIST_LABEL);
24417     XtVaSetValues(child,XmNfontList,fontlist1,NULL);
24418 
24419     child = XmFileSelectionBoxGetChild(read_selection_dialog, XmDIALOG_LIST_LABEL);
24420     XtVaSetValues(child,XmNfontList,fontlist1,NULL);
24421 
24422     child = XmFileSelectionBoxGetChild(read_selection_dialog, XmDIALOG_SELECTION_LABEL);
24423     XtVaSetValues(child,XmNfontList,fontlist1,NULL);
24424 
24425     child = XmFileSelectionBoxGetChild(read_selection_dialog, XmDIALOG_OK_BUTTON);
24426     XtVaSetValues(child,XmNfontList,fontlist1,NULL);
24427 
24428     child = XmFileSelectionBoxGetChild(read_selection_dialog, XmDIALOG_APPLY_BUTTON);
24429     XtVaSetValues(child,XmNfontList,fontlist1,NULL);
24430 
24431     child = XmFileSelectionBoxGetChild(read_selection_dialog, XmDIALOG_CANCEL_BUTTON);
24432     XtVaSetValues(child,XmNfontList,fontlist1,NULL);
24433 
24434     child = XmFileSelectionBoxGetChild(read_selection_dialog, XmDIALOG_HELP_BUTTON);
24435     XtVaSetValues(child,XmNfontList,fontlist1,NULL);
24436 
24437     XtAddCallback(read_selection_dialog, XmNcancelCallback,read_file_selection_destroy_shell,read_selection_dialog);
24438     XtAddCallback(read_selection_dialog, XmNokCallback,read_file_selection_now,read_selection_dialog);
24439 
24440     XtAddCallback(read_selection_dialog, XmNhelpCallback, Help_Index, read_selection_dialog);
24441 
24442     XtManageChild(read_selection_dialog);
24443     pos_dialog(read_selection_dialog);
24444   }
24445 }
24446 
24447 
24448 
24449 
24450 
24451 void Test(Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
24452 {
24453 //    static char temp[256];
24454 //    int port = 7;
24455 
24456 
24457   mdisplay_file(0);
24458 //    mem_display();
24459   alert_print_list();
24460 
24461   /*
24462       draw_wind_barb(50000000l,   // long x_long,
24463           32000000l,              // long y_lat,
24464           "169",                  // char *speed,
24465           "005",                  // char *course,
24466           sec_now(),              // time_t sec_heard,
24467           pixmap_final);          // Pixmap where);
24468 
24469       draw_wind_barb(60000000l,   // long x_long,
24470           32000000l,              // long y_lat,
24471           "009",                  // char *speed,
24472           "123",                  // char *course,
24473           sec_now(),              // time_t sec_heard,
24474           pixmap_final);          // Pixmap where);
24475 
24476       draw_wind_barb(70000000l,   // long x_long,
24477           32000000l,              // long y_lat,
24478           "109",                  // char *speed,
24479           "185",                  // char *course,
24480           sec_now(),              // time_t sec_heard,
24481           pixmap_final);          // Pixmap where);
24482 
24483       draw_wind_barb(80000000l,   // long x_long,
24484           32000000l,              // long y_lat,
24485           "079",                  // char *speed,
24486           "275",                  // char *course,
24487           sec_now(),              // time_t sec_heard,
24488           pixmap_final);          // Pixmap where);
24489   */
24490 
24491 //    fprintf(stderr,"view_zero_distance_bulletins = %d\n",
24492 //        view_zero_distance_bulletins);
24493 
24494 
24495   /*
24496       // Simulate data coming in from a TNC in order to test igating.
24497       // Port 7 in this case is a serial TNC port (in my current test
24498       // configuration).
24499       xastir_snprintf(temp,
24500           sizeof(temp),
24501           "WE7U-4>APOT01,SUMAS*,WIDE2-2:!4757.28N/12212.00Wv178/057/A=000208 14.0V 30C\r");
24502 
24503       if (begin_critical_section(&data_lock, "main.c" ) > 0)
24504           fprintf(stderr,"data_lock, Port = %d\n", port);
24505 
24506       incoming_data=temp;
24507       incoming_data_length = strlen(temp);
24508       data_port = port;
24509       data_avail = 1;
24510 
24511       if (end_critical_section(&data_lock, "main.c" ) > 0)
24512           fprintf(stderr,"data_lock, Port = %d\n", port);
24513 
24514       fprintf(stderr, "Sent: %s\n", temp);
24515   */
24516 
24517 
24518 //    (void)XCopyArea(XtDisplay(da),pixmap_final,XtWindow(da),gc,0,0,(unsigned int)screen_width,(unsigned int)screen_height,0,0);
24519 }
24520 
24521 
24522 
24523 
24524 
24525 /****** Save Config data **********/
24526 
24527 void Save_Config( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
24528 {
24529   save_data();
24530 }
24531 
24532 
24533 
24534 
24535 
24536 ///////////////////////////////////   Configure Defaults Dialog   //////////////////////////////////
24537 
24538 
24539 void Configure_defaults_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
24540 {
24541   Widget shell = (Widget) clientData;
24542   XtPopdown(shell);
24543   XtDestroyWidget(shell);
24544   configure_defaults_dialog = (Widget)NULL;
24545 }
24546 
24547 
24548 
24549 
24550 
24551 void Configure_defaults_change_data(Widget widget, XtPointer clientData, XtPointer callData)
24552 {
24553   char *temp;
24554   int load_predefined_cb_selected;
24555   XmString load_predefined_cb_selection;
24556 
24557 
24558   output_station_type = Station_transmit_type;
24559   if ((output_station_type >= 1) && (output_station_type <= 3))
24560   {
24561     next_time = 60;
24562     max_transmit_time = (time_t)120l;       // shorter beacon interval for mobile stations
24563   }
24564   else
24565   {
24566     max_transmit_time = (time_t)900l;
24567   }
24568 
24569   // Check for proper symbol in case we're a weather station
24570   (void)check_weather_symbol();
24571 
24572   // Check for NWS symbol and print warning if so
24573   (void)check_nws_weather_symbol();
24574 
24575 #ifdef TRANSMIT_RAW_WX
24576   transmit_raw_wx = (int)XmToggleButtonGetState(raw_wx_tx);
24577 #endif  // TRANSMIT_RAW_WX
24578 
24579   transmit_compressed_objects_items = (int)XmToggleButtonGetState(compressed_objects_items_tx);
24580 
24581   pop_up_new_bulletins = (int)XmToggleButtonGetState(new_bulletin_popup_enable);
24582   view_zero_distance_bulletins = (int)XmToggleButtonGetState(zero_bulletin_popup_enable);
24583 
24584   // user interface refers to all my trails in one color
24585   // my trail diff color as 0 means my trails in one color, so select
24586   // button when my trail diff color is 0 rather than 1.
24587   my_trail_diff_color = !(int)XmToggleButtonGetState(my_trail_diff_color_enable);
24588 
24589   // Predefined (SAR/EVENT) objects menu loading (default hardcoded SAR objects or objects from file)
24590   predefined_menu_from_file = (int)XmToggleButtonGetState(load_predefined_objects_menu_from_file_enable);
24591 
24592   // Use the file specified on the picklist if one is selected.
24593   load_predefined_cb_selected = 0;
24594 #ifdef USE_COMBO_BOX
24595   XtVaGetValues(load_predefined_objects_menu_from_file,
24596                 XmNselectedPosition,
24597                 &load_predefined_cb_selected,
24598                 NULL);
24599 #else
24600   load_predefined_cb_selected = lpomff_value;
24601 #endif //USE_COMBO_BOX
24602 
24603   // Use the file specified on the picklist if one is selected.
24604   if (load_predefined_cb_selected > 0)
24605   {
24606 
24607     // XtVaGetValues() expects to be able to write into
24608     // allocated memory.
24609     //
24610     load_predefined_cb_selection = (XmString)malloc(MAX_FILENAME);
24611 
24612 #ifdef USE_COMBO_BOX
24613     XtVaGetValues(load_predefined_objects_menu_from_file,
24614                   XmNselectedItem,
24615                   &load_predefined_cb_selection,
24616                   NULL);
24617 #else
24618     switch (load_predefined_cb_selected)
24619     {
24620       case 1:
24621         load_predefined_cb_selection = XmStringCreateLocalized("predefined_SAR.sys");
24622         break;
24623       case 2:
24624         load_predefined_cb_selection = XmStringCreateLocalized("predefined_EVENT.sys");
24625         break;
24626       case 3:
24627         load_predefined_cb_selection = XmStringCreateLocalized("predefined_USER.sys");
24628         break;
24629       case 4:
24630         load_predefined_cb_selection = XmStringCreateLocalized(predefined_object_definition_filename);
24631         break;
24632       default:
24633         load_predefined_cb_selection = XmStringCreateLocalized("predefined_SAR.sys");
24634     }
24635 #endif //USE_COMBO_BOX
24636   }
24637   else
24638   {
24639 
24640     load_predefined_cb_selection = XmStringCreateLocalized("predefined_SAR.sys");
24641   }
24642 
24643   xastir_snprintf(predefined_object_definition_filename,
24644                   sizeof(predefined_object_definition_filename),
24645                   "%s",
24646                   temp = XmStringUnparse(load_predefined_cb_selection,
24647                                          NULL,
24648                                          XmCHARSET_TEXT,
24649                                          XmCHARSET_TEXT,
24650                                          NULL,
24651                                          0,
24652                                          XmOUTPUT_ALL) );
24653 
24654   XtFree(temp);
24655   XmStringFree(load_predefined_cb_selection);
24656 
24657   // Repopulate the predefined object (SAR/Public service) struct
24658   Populate_predefined_objects(predefinedObjects);
24659 
24660   // Rebuild the predefined objects SAR/Public service menu.
24661   BuildPredefinedSARMenu_UI(&sar_object_sub);
24662 
24663   warn_about_mouse_modifiers = (int)XmToggleButtonGetState(warn_about_mouse_modifiers_enable);
24664 
24665   altnet = (int)(XmToggleButtonGetState(altnet_active));
24666 
24667   skip_dupe_checking = (int)(XmToggleButtonGetState(disable_dupe_check));
24668 
24669   temp = XmTextGetString(altnet_text);
24670   xastir_snprintf(altnet_call,
24671                   sizeof(altnet_call),
24672                   "%s",
24673                   temp);
24674   XtFree(temp);
24675 
24676   (void)remove_trailing_spaces(altnet_call);
24677   if (strlen(altnet_call)==0)
24678   {
24679     altnet = FALSE;
24680     xastir_snprintf(altnet_call,
24681                     sizeof(altnet_call),
24682                     "XASTIR");
24683   }
24684 
24685   operate_as_an_igate=Igate_type;
24686 
24687   redraw_on_new_data=2;
24688   Configure_defaults_destroy_shell(widget,clientData,callData);
24689 }
24690 
24691 
24692 
24693 
24694 
24695 /* Station_transmit type radio buttons */
24696 void station_type_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
24697 {
24698   char *which = (char *)clientData;
24699   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
24700 
24701   if(state->set)
24702   {
24703     Station_transmit_type = atoi(which);
24704   }
24705   else
24706   {
24707     Station_transmit_type = 0;
24708   }
24709 
24710 }
24711 
24712 
24713 
24714 
24715 
24716 /* Igate type radio buttons */
24717 void igate_type_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
24718 {
24719   char *which = (char *)clientData;
24720   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
24721 
24722   if(state->set)
24723   {
24724     Igate_type = atoi(which);
24725   }
24726   else
24727   {
24728     Igate_type = 0;
24729   }
24730 }
24731 
24732 
24733 #ifndef USE_COMBO_BOX
24734 void lpomff_menuCallback(Widget widget, XtPointer ptr, XtPointer callData)
24735 {
24736   XtPointer userData;
24737 
24738   XtVaGetValues(widget, XmNuserData, &userData, NULL);
24739   //clsd_menu is zero based, cad_line_style_data constants are one based.
24740   lpomff_value = (int)userData + 1;
24741   if (debug_level & 1)
24742   {
24743     fprintf(stderr,"Selected value on cad line type pulldown: %d\n",lpomff_value);
24744   }
24745 }
24746 #endif  // !USE_COMBO_BOX
24747 
24748 
24749 
24750 
24751 
24752 void Configure_defaults( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
24753 {
24754   static Widget  pane, scrollwindow, my_form, button_ok, button_cancel,
24755          frame4, frame5,
24756          type_box,
24757          styp1, styp2, styp3, styp4, styp5, styp6,
24758          igate_box,
24759          igtyp0, igtyp1, igtyp2, altnet_label;
24760 //  static Widget station_type, igate_option;
24761   Atom delw;
24762   Arg al[50];                      /* Arg List */
24763   register unsigned int ac = 0;   /* Arg Count */
24764 #ifndef USE_COMBO_BOX
24765   Widget lpomff_menuPane;
24766   Widget lpomff_button;
24767   Widget lpomff_buttons[4];
24768   Widget lpomff_menu;
24769   char buf[18];
24770   int x;
24771 #endif // !USE_COMBO_BOX
24772   Widget lpomff_widget;
24773   int i;
24774   XmString cb_items[4];
24775 #ifdef OBJECT_DEF_FILE_USER_BASE
24776   char temp_base_dir[MAX_VALUE];
24777 #endif
24778 
24779 
24780 
24781   if (!configure_defaults_dialog)
24782   {
24783     char loadfrom[300];
24784 
24785     // Set args for color
24786     ac = 0;
24787     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
24788     ac++;
24789     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
24790     ac++;
24791     XtSetArg(al[ac], XmNfontList, fontlist1);
24792     ac++;
24793 
24794     configure_defaults_dialog = XtVaCreatePopupShell(langcode("WPUPCFD001"),
24795                                 xmDialogShellWidgetClass, appshell,
24796                                 XmNdeleteResponse, XmDESTROY,
24797                                 XmNdefaultPosition, FALSE,
24798                                 XmNfontList, fontlist1,
24799                                 NULL);
24800 
24801     pane = XtVaCreateWidget("Configure_defaults pane",
24802                             xmPanedWindowWidgetClass,
24803                             configure_defaults_dialog,
24804                             MY_FOREGROUND_COLOR,
24805                             MY_BACKGROUND_COLOR,
24806                             NULL);
24807 
24808     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
24809                                            xmScrolledWindowWidgetClass,
24810                                            pane,
24811                                            XmNscrollingPolicy, XmAUTOMATIC,
24812                                            NULL);
24813 
24814     my_form =  XtVaCreateWidget("Configure_defaults my_form",
24815                                 xmFormWidgetClass,
24816                                 scrollwindow,
24817                                 XmNfractionBase, 5,
24818                                 XmNautoUnmanage, FALSE,
24819                                 XmNshadowThickness, 1,
24820                                 MY_FOREGROUND_COLOR,
24821                                 MY_BACKGROUND_COLOR,
24822                                 NULL);
24823 
24824     // Transmit Station Options
24825     frame4 = XtVaCreateManagedWidget("Configure_defaults frame4",
24826                                      xmFrameWidgetClass,
24827                                      my_form,
24828                                      XmNtopAttachment,XmATTACH_FORM,
24829                                      XmNtopOffset,10,
24830                                      XmNbottomAttachment,XmATTACH_NONE,
24831                                      XmNleftAttachment, XmATTACH_FORM,
24832                                      XmNleftOffset, 10,
24833                                      XmNrightAttachment,XmATTACH_FORM,
24834                                      XmNrightOffset, 10,
24835                                      MY_FOREGROUND_COLOR,
24836                                      MY_BACKGROUND_COLOR,
24837                                      NULL);
24838 
24839     //station_type
24840     XtVaCreateManagedWidget(langcode("WPUPCFD015"),
24841                             xmLabelWidgetClass,
24842                             frame4,
24843                             XmNchildType, XmFRAME_TITLE_CHILD,
24844                             MY_FOREGROUND_COLOR,
24845                             MY_BACKGROUND_COLOR,
24846                             XmNfontList, fontlist1,
24847                             NULL);
24848 
24849     type_box = XmCreateRadioBox(frame4,
24850                                 "Configure_defaults Transmit Options box",
24851                                 al,
24852                                 ac);
24853 
24854     XtVaSetValues(type_box,
24855                   XmNnumColumns,2,
24856                   NULL);
24857 
24858     styp1 = XtVaCreateManagedWidget(langcode("WPUPCFD016"),
24859                                     xmToggleButtonGadgetClass,
24860                                     type_box,
24861                                     MY_FOREGROUND_COLOR,
24862                                     MY_BACKGROUND_COLOR,
24863                                     XmNfontList, fontlist1,
24864                                     NULL);
24865     XtAddCallback(styp1,XmNvalueChangedCallback,station_type_toggle,"0");
24866 
24867     styp2 = XtVaCreateManagedWidget(langcode("WPUPCFD017"),
24868                                     xmToggleButtonGadgetClass,
24869                                     type_box,
24870                                     MY_FOREGROUND_COLOR,
24871                                     MY_BACKGROUND_COLOR,
24872                                     XmNfontList, fontlist1,
24873                                     NULL);
24874     XtAddCallback(styp2,XmNvalueChangedCallback,station_type_toggle,"1");
24875 
24876     styp3 = XtVaCreateManagedWidget(langcode("WPUPCFD018"),
24877                                     xmToggleButtonGadgetClass,
24878                                     type_box,
24879                                     MY_FOREGROUND_COLOR,
24880                                     MY_BACKGROUND_COLOR,
24881                                     XmNfontList, fontlist1,
24882                                     NULL);
24883     XtAddCallback(styp3,XmNvalueChangedCallback,station_type_toggle,"2");
24884 
24885     styp4 = XtVaCreateManagedWidget(langcode("WPUPCFD019"),
24886                                     xmToggleButtonGadgetClass,
24887                                     type_box,
24888                                     MY_FOREGROUND_COLOR,
24889                                     MY_BACKGROUND_COLOR,
24890                                     XmNfontList, fontlist1,
24891                                     NULL);
24892     XtAddCallback(styp4,XmNvalueChangedCallback,station_type_toggle,"3");
24893 
24894     styp5 = XtVaCreateManagedWidget(langcode("WPUPCFD021"),
24895                                     xmToggleButtonGadgetClass,
24896                                     type_box,
24897                                     MY_FOREGROUND_COLOR,
24898                                     MY_BACKGROUND_COLOR,
24899                                     XmNfontList, fontlist1,
24900                                     NULL);
24901     XtAddCallback(styp5,XmNvalueChangedCallback,station_type_toggle,"4");
24902 
24903     styp6 = XtVaCreateManagedWidget(langcode("WPUPCFD022"),
24904                                     xmToggleButtonGadgetClass,
24905                                     type_box,
24906                                     MY_FOREGROUND_COLOR,
24907                                     MY_BACKGROUND_COLOR,
24908                                     XmNfontList, fontlist1,
24909                                     NULL);
24910     XtAddCallback(styp6,XmNvalueChangedCallback,station_type_toggle,"5");
24911 
24912 
24913     // Igate Options
24914     frame5 = XtVaCreateManagedWidget("Configure_defaults frame5",
24915                                      xmFrameWidgetClass,
24916                                      my_form,
24917                                      XmNtopAttachment,XmATTACH_WIDGET,
24918                                      XmNtopWidget, frame4,
24919                                      XmNtopOffset,10,
24920                                      XmNbottomAttachment,XmATTACH_NONE,
24921                                      XmNleftAttachment, XmATTACH_FORM,
24922                                      XmNleftOffset, 10,
24923                                      XmNrightAttachment,XmATTACH_FORM,
24924                                      XmNrightOffset, 10,
24925                                      MY_FOREGROUND_COLOR,
24926                                      MY_BACKGROUND_COLOR,
24927                                      NULL);
24928 
24929     //igate_option
24930     XtVaCreateManagedWidget(langcode("IGPUPCF000"),
24931                             xmLabelWidgetClass,
24932                             frame5,
24933                             XmNchildType, XmFRAME_TITLE_CHILD,
24934                             MY_FOREGROUND_COLOR,
24935                             MY_BACKGROUND_COLOR,
24936                             XmNfontList, fontlist1,
24937                             NULL);
24938 
24939     igate_box = XmCreateRadioBox(frame5,
24940                                  "Configure_defaults Igate Options box",
24941                                  al,
24942                                  ac);
24943 
24944     XtVaSetValues(igate_box,
24945                   XmNnumColumns,2,
24946                   NULL);
24947 
24948     igtyp0 = XtVaCreateManagedWidget(langcode("IGPUPCF001"),
24949                                      xmToggleButtonGadgetClass,
24950                                      igate_box,
24951                                      MY_FOREGROUND_COLOR,
24952                                      MY_BACKGROUND_COLOR,
24953                                      XmNfontList, fontlist1,
24954                                      NULL);
24955 
24956     XtAddCallback(igtyp0,XmNvalueChangedCallback,igate_type_toggle,"0");
24957 
24958     igtyp1 = XtVaCreateManagedWidget(langcode("IGPUPCF002"),
24959                                      xmToggleButtonGadgetClass,
24960                                      igate_box,
24961                                      MY_FOREGROUND_COLOR,
24962                                      MY_BACKGROUND_COLOR,
24963                                      XmNfontList, fontlist1,
24964                                      NULL);
24965 
24966     XtAddCallback(igtyp1,XmNvalueChangedCallback,igate_type_toggle,"1");
24967 
24968     igtyp2 = XtVaCreateManagedWidget(langcode("IGPUPCF003"),
24969                                      xmToggleButtonGadgetClass,
24970                                      igate_box,
24971                                      MY_FOREGROUND_COLOR,
24972                                      MY_BACKGROUND_COLOR,
24973                                      XmNfontList, fontlist1,
24974                                      NULL);
24975 
24976     XtAddCallback(igtyp2,XmNvalueChangedCallback,igate_type_toggle,"2");
24977 
24978 
24979     // Miscellaneous Options
24980     compressed_objects_items_tx = XtVaCreateManagedWidget(langcode("WPUPCFD024"),
24981                                   xmToggleButtonWidgetClass,
24982                                   my_form,
24983                                   XmNtopAttachment, XmATTACH_WIDGET,
24984                                   XmNtopWidget, frame5,
24985                                   XmNtopOffset, 10,
24986                                   XmNbottomAttachment, XmATTACH_NONE,
24987                                   XmNleftAttachment, XmATTACH_FORM,
24988                                   XmNleftOffset,10,
24989                                   XmNrightAttachment, XmATTACH_NONE,
24990                                   XmNnavigationType, XmTAB_GROUP,
24991                                   MY_FOREGROUND_COLOR,
24992                                   MY_BACKGROUND_COLOR,
24993                                   XmNfontList, fontlist1,
24994                                   NULL);
24995 
24996     new_bulletin_popup_enable = XtVaCreateManagedWidget(langcode("WPUPCFD027"),
24997                                 xmToggleButtonWidgetClass,
24998                                 my_form,
24999                                 XmNtopAttachment, XmATTACH_WIDGET,
25000                                 XmNtopWidget, compressed_objects_items_tx,
25001                                 XmNbottomAttachment, XmATTACH_NONE,
25002                                 XmNleftAttachment, XmATTACH_FORM,
25003                                 XmNleftOffset,10,
25004                                 XmNrightAttachment, XmATTACH_NONE,
25005                                 XmNnavigationType, XmTAB_GROUP,
25006                                 MY_FOREGROUND_COLOR,
25007                                 MY_BACKGROUND_COLOR,
25008                                 XmNfontList, fontlist1,
25009                                 NULL);
25010 
25011     zero_bulletin_popup_enable = XtVaCreateManagedWidget(langcode("WPUPCFD029"),
25012                                  xmToggleButtonWidgetClass,
25013                                  my_form,
25014                                  XmNtopAttachment, XmATTACH_WIDGET,
25015                                  XmNtopWidget, new_bulletin_popup_enable,
25016                                  XmNbottomAttachment, XmATTACH_NONE,
25017                                  XmNleftAttachment, XmATTACH_FORM,
25018                                  XmNleftOffset,10,
25019                                  XmNrightAttachment, XmATTACH_NONE,
25020                                  XmNnavigationType, XmTAB_GROUP,
25021                                  MY_FOREGROUND_COLOR,
25022                                  MY_BACKGROUND_COLOR,
25023                                  XmNfontList, fontlist1,
25024                                  NULL);
25025 
25026     warn_about_mouse_modifiers_enable = XtVaCreateManagedWidget(langcode("WPUPCFD028"),
25027                                         xmToggleButtonWidgetClass,
25028                                         my_form,
25029                                         XmNtopAttachment, XmATTACH_WIDGET,
25030                                         XmNtopWidget, new_bulletin_popup_enable,
25031                                         XmNbottomAttachment, XmATTACH_NONE,
25032                                         XmNleftAttachment, XmATTACH_WIDGET,
25033                                         XmNleftWidget, zero_bulletin_popup_enable,
25034                                         XmNleftOffset,10,
25035                                         XmNrightAttachment, XmATTACH_NONE,
25036                                         XmNnavigationType, XmTAB_GROUP,
25037                                         MY_FOREGROUND_COLOR,
25038                                         MY_BACKGROUND_COLOR,
25039                                         XmNfontList, fontlist1,
25040                                         NULL);
25041 
25042     // Show all My trails in one color
25043     my_trail_diff_color_enable = XtVaCreateManagedWidget(langcode("WPUPCFD032"),
25044                                  xmToggleButtonWidgetClass,
25045                                  my_form,
25046                                  XmNtopAttachment, XmATTACH_WIDGET,
25047                                  XmNtopWidget, new_bulletin_popup_enable,
25048                                  XmNbottomAttachment, XmATTACH_NONE,
25049                                  XmNleftAttachment, XmATTACH_WIDGET,
25050                                  XmNleftWidget, warn_about_mouse_modifiers_enable,
25051                                  XmNleftOffset,10,
25052                                  XmNrightAttachment, XmATTACH_NONE,
25053                                  XmNnavigationType, XmTAB_GROUP,
25054                                  MY_FOREGROUND_COLOR,
25055                                  MY_BACKGROUND_COLOR,
25056                                  XmNfontList, fontlist1,
25057                                  NULL);
25058 
25059 
25060     // Check box to load predefined (SAR/Event) objects menu from a file or not.
25061     xastir_snprintf(loadfrom,
25062                     sizeof(loadfrom),
25063                     "%s %s",
25064                     langcode("WPUPCFD031"),
25065 #ifdef OBJECT_DEF_FILE_USER_BASE
25066                     get_user_base_dir("config", temp_base_dir, sizeof(temp_base_dir)));
25067 #else   // OBJECT_DEF_FILE_USER_BASE
25068                     get_data_base_dir("config"));
25069 #endif  // OBJECT_DEF_FILE_USER_BASE
25070 
25071     load_predefined_objects_menu_from_file_enable = XtVaCreateManagedWidget(loadfrom,
25072         xmToggleButtonWidgetClass,
25073         my_form,
25074         XmNtopAttachment, XmATTACH_WIDGET,
25075         XmNtopWidget, zero_bulletin_popup_enable,
25076         XmNtopOffset,5,
25077         XmNbottomAttachment, XmATTACH_NONE,
25078         XmNleftAttachment, XmATTACH_FORM,
25079         XmNleftOffset,10,
25080         XmNrightAttachment, XmATTACH_NONE,
25081         XmNnavigationType, XmTAB_GROUP,
25082         MY_FOREGROUND_COLOR,
25083         MY_BACKGROUND_COLOR,
25084         XmNfontList, fontlist1,
25085         NULL);
25086 
25087     // lesstif as of 0.95 in 2008 doesn't fully support combo boxes
25088     //
25089     // Need to replace combo boxes with a pull down menu when lesstif is used.
25090     // See xpdf's  XPDFViewer.cc/XPDFViewer.h for an example.
25091 
25092     cb_items[0] = XmStringCreateLocalized("predefined_SAR.sys");
25093     cb_items[1] = XmStringCreateLocalized("predefined_EVENT.sys");
25094     cb_items[2] = XmStringCreateLocalized("predefined_USER.sys");
25095 #ifdef USE_COMBO_BOX
25096     // Combo box to pick file from which to load predefined objects menu
25097     load_predefined_objects_menu_from_file = XtVaCreateManagedWidget("Load objects menu filename ComboBox",
25098         xmComboBoxWidgetClass,
25099         my_form,
25100         XmNtopAttachment, XmATTACH_WIDGET,
25101         XmNtopWidget, zero_bulletin_popup_enable,
25102         XmNtopOffset, 5,
25103         XmNbottomAttachment, XmATTACH_NONE,
25104         XmNleftAttachment, XmATTACH_WIDGET,
25105         XmNleftWidget, load_predefined_objects_menu_from_file_enable,
25106         XmNleftOffset, 10,
25107         XmNrightAttachment, XmATTACH_NONE,
25108         XmNnavigationType, XmTAB_GROUP,
25109         XmNcomboBoxType, XmDROP_DOWN_LIST,
25110         XmNpositionMode, XmONE_BASED,
25111         XmNvisibleItemCount, 3,
25112         MY_FOREGROUND_COLOR,
25113         MY_BACKGROUND_COLOR,
25114         XmNfontList, fontlist1,
25115         NULL);
25116     XmComboBoxAddItem(load_predefined_objects_menu_from_file,cb_items[0],1,1);
25117     XmComboBoxAddItem(load_predefined_objects_menu_from_file,cb_items[1],2,1);
25118     XmComboBoxAddItem(load_predefined_objects_menu_from_file,cb_items[2],3,1);
25119 
25120     lpomff_widget = load_predefined_objects_menu_from_file;
25121 #else
25122     // Menu replacement for combo box when using lesstif.
25123     // Not a full replacement, as combo box in motif can have editable values,
25124     // not just selection from predefined list as is the case here.
25125     ac = 0;
25126     XtSetArg(al[ac], XmNmarginWidth, 0);
25127     ac++;
25128     XtSetArg(al[ac], XmNmarginHeight, 0);
25129     ac++;
25130     XtSetArg(al[ac], XmNfontList, fontlist1);
25131     ac++;
25132     lpomff_menuPane = XmCreatePulldownMenu(my_form,"lpomff_menuPane", al, ac);
25133     //lpomff_menu is zero based, constants for filenames are one based
25134     //lpomff_value is set to match constants in callback.
25135     for (i=0; i<3; i++)
25136     {
25137       ac = 0;
25138       XtSetArg(al[ac], XmNlabelString, cb_items[i]);
25139       ac++;
25140       XtSetArg(al[ac], XmNuserData, (XtPointer)i);
25141       ac++;
25142       sprintf(buf,"button%d",i);
25143       lpomff_button = XmCreatePushButton(lpomff_menuPane, buf, al, ac);
25144       XtManageChild(lpomff_button);
25145       XtAddCallback(lpomff_button, XmNactivateCallback, lpomff_menuCallback, Configure_defaults);
25146       lpomff_buttons[i] = lpomff_button;
25147     }
25148     ac = 0;
25149     XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET);
25150     ++ac;
25151     XtSetArg(al[ac], XmNleftWidget, load_predefined_objects_menu_from_file_enable);
25152     ++ac;
25153     XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET);
25154     ++ac;
25155     XtSetArg(al[ac], XmNtopWidget, zero_bulletin_popup_enable);
25156     ++ac;
25157     XtSetArg(al[ac], XmNmarginWidth, 0);
25158     ++ac;
25159     XtSetArg(al[ac], XmNmarginHeight, 0);
25160     ++ac;
25161     XtSetArg(al[ac], XmNtopOffset, 5);
25162     ++ac;
25163     XtSetArg(al[ac], XmNleftOffset, 10);
25164     ++ac;
25165     XtSetArg(al[ac], XmNsubMenuId, lpomff_menuPane);
25166     ++ac;
25167     XtSetArg(al[ac], XmNfontList, fontlist1);
25168     ac++;
25169     lpomff_menu = XmCreateOptionMenu(my_form, "sddd_Menu", al, ac);
25170     XtManageChild(lpomff_menu);
25171     lpomff_value = 2;   // set a default value (line on off dash)
25172     lpomff_widget = lpomff_menu;
25173 #endif  // USE_COMBO_BOX
25174     // free up space from combo box strings
25175     for (i=0; i<3; i++)
25176     {
25177       XmStringFree(cb_items[i]);
25178     }
25179 
25180 
25181 #ifdef TRANSMIT_RAW_WX
25182     raw_wx_tx  = XtVaCreateManagedWidget(langcode("WPUPCFD023"),
25183                                          xmToggleButtonWidgetClass,
25184                                          my_form,
25185                                          XmNtopAttachment, XmATTACH_WIDGET,
25186                                          XmNtopWidget, lpomff_widget,
25187                                          XmNbottomAttachment, XmATTACH_NONE,
25188                                          XmNleftAttachment, XmATTACH_FORM,
25189                                          XmNleftOffset, 10,
25190                                          XmNrightAttachment, XmATTACH_NONE,
25191                                          XmNnavigationType, XmTAB_GROUP,
25192                                          MY_FOREGROUND_COLOR,
25193                                          MY_BACKGROUND_COLOR,
25194                                          XmNfontList, fontlist1,
25195                                          NULL);
25196 #endif  // TRANSMIT_RAW_WX
25197 
25198     altnet_active  = XtVaCreateManagedWidget(langcode("WPUPCFD025"),
25199                      xmToggleButtonWidgetClass,
25200                      my_form,
25201                      XmNtopAttachment, XmATTACH_WIDGET,
25202                      XmNtopWidget, frame5,
25203                      XmNtopOffset, 10,
25204                      XmNbottomAttachment, XmATTACH_NONE,
25205                      XmNleftAttachment, XmATTACH_WIDGET,
25206                      XmNleftWidget, compressed_objects_items_tx,
25207                      XmNrightAttachment, XmATTACH_NONE,
25208                      XmNnavigationType, XmTAB_GROUP,
25209                      MY_FOREGROUND_COLOR,
25210                      MY_BACKGROUND_COLOR,
25211                      XmNfontList, fontlist1,
25212                      NULL);
25213 
25214     // "ALTNET:"
25215     altnet_label = XtVaCreateManagedWidget(langcode("WPUPCFD033"),
25216                                            xmLabelWidgetClass,
25217                                            my_form,
25218                                            XmNchildType, XmFRAME_TITLE_CHILD,
25219                                            MY_FOREGROUND_COLOR,
25220                                            MY_BACKGROUND_COLOR,
25221                                            XmNtopAttachment,XmATTACH_WIDGET,
25222                                            XmNtopWidget, altnet_active,
25223                                            XmNtopOffset, 5,
25224                                            XmNbottomAttachment,XmATTACH_NONE,
25225                                            XmNleftAttachment, XmATTACH_WIDGET,
25226                                            XmNleftWidget, compressed_objects_items_tx,
25227                                            XmNrightAttachment, XmATTACH_NONE,
25228                                            XmNfontList, fontlist1,
25229                                            NULL);
25230 
25231     altnet_text = XtVaCreateManagedWidget("Configure_defaults Altnet_text",
25232                                           xmTextWidgetClass,
25233                                           my_form,
25234                                           XmNeditable,   TRUE,
25235                                           XmNcursorPositionVisible, TRUE,
25236                                           XmNsensitive, TRUE,
25237                                           XmNshadowThickness,    1,
25238                                           XmNcolumns, 9,
25239                                           XmNwidth, ((10*7)+2),
25240                                           XmNmaxLength, 9,
25241                                           XmNbackground, colors[0x0f],
25242                                           XmNtopAttachment,XmATTACH_WIDGET,
25243                                           XmNtopWidget, altnet_active,
25244                                           XmNbottomAttachment,XmATTACH_NONE,
25245                                           XmNleftAttachment, XmATTACH_WIDGET,
25246                                           XmNleftWidget, altnet_label,
25247                                           XmNrightAttachment, XmATTACH_NONE,
25248                                           XmNnavigationType, XmTAB_GROUP,
25249                                           XmNfontList, fontlist1,
25250                                           NULL);
25251 
25252     disable_dupe_check = XtVaCreateManagedWidget(langcode("WPUPCFD030"),
25253                          xmToggleButtonWidgetClass,
25254                          my_form,
25255                          XmNtopAttachment, XmATTACH_WIDGET,
25256                          XmNtopWidget, frame5,
25257                          XmNtopOffset, 10,
25258                          XmNbottomAttachment, XmATTACH_NONE,
25259                          XmNleftAttachment, XmATTACH_WIDGET,
25260                          XmNleftWidget, altnet_active,
25261                          XmNrightAttachment, XmATTACH_NONE,
25262                          XmNnavigationType, XmTAB_GROUP,
25263                          MY_FOREGROUND_COLOR,
25264                          MY_BACKGROUND_COLOR,
25265                          XmNfontList, fontlist1,
25266                          NULL);
25267 
25268     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
25269                                         xmPushButtonGadgetClass,
25270                                         my_form,
25271                                         XmNtopAttachment, XmATTACH_WIDGET,
25272 #ifdef TRANSMIT_RAW_WX
25273                                         XmNtopWidget, raw_wx_tx,
25274 #else   // TRANSMIT_RAW_WX
25275                                         XmNtopWidget, lpomff_widget,
25276 #endif  // TRANSMIT_RAW_WX
25277                                         XmNtopOffset, 5,
25278                                         XmNbottomAttachment, XmATTACH_FORM,
25279                                         XmNbottomOffset, 5,
25280                                         XmNleftAttachment, XmATTACH_POSITION,
25281                                         XmNleftPosition, 1,
25282                                         XmNrightAttachment, XmATTACH_POSITION,
25283                                         XmNrightPosition, 2,
25284                                         XmNnavigationType, XmTAB_GROUP,
25285                                         MY_FOREGROUND_COLOR,
25286                                         MY_BACKGROUND_COLOR,
25287                                         XmNfontList, fontlist1,
25288                                         NULL);
25289 
25290 
25291     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
25292                                             xmPushButtonGadgetClass,
25293                                             my_form,
25294                                             XmNtopAttachment, XmATTACH_WIDGET,
25295 #ifdef TRANSMIT_RAW_WX
25296                                             XmNtopWidget, raw_wx_tx,
25297 #else   // TRANSMIT_RAW_WX
25298                                             XmNtopWidget, lpomff_widget,
25299 #endif  // TRANSMIT_RAW_WX
25300                                             XmNtopOffset, 5,
25301                                             XmNbottomAttachment, XmATTACH_FORM,
25302                                             XmNbottomOffset, 5,
25303                                             XmNleftAttachment, XmATTACH_POSITION,
25304                                             XmNleftPosition, 3,
25305                                             XmNrightAttachment, XmATTACH_POSITION,
25306                                             XmNrightPosition, 4,
25307                                             XmNnavigationType, XmTAB_GROUP,
25308                                             MY_FOREGROUND_COLOR,
25309                                             MY_BACKGROUND_COLOR,
25310                                             XmNfontList, fontlist1,
25311                                             NULL);
25312 
25313     XtAddCallback(button_ok, XmNactivateCallback, Configure_defaults_change_data, configure_defaults_dialog);
25314     XtAddCallback(button_cancel, XmNactivateCallback, Configure_defaults_destroy_shell, configure_defaults_dialog);
25315 
25316     switch(output_station_type)
25317     {
25318       case(0):
25319         XmToggleButtonSetState(styp1,TRUE,FALSE);
25320         Station_transmit_type=0;
25321         break;
25322 
25323       case(1):
25324         XmToggleButtonSetState(styp2,TRUE,FALSE);
25325         Station_transmit_type=1;
25326         break;
25327 
25328       case(2):
25329         XmToggleButtonSetState(styp3,TRUE,FALSE);
25330         Station_transmit_type=2;
25331         break;
25332 
25333       case(3):
25334         XmToggleButtonSetState(styp4,TRUE,FALSE);
25335         Station_transmit_type=3;
25336         break;
25337 
25338       case(4):
25339         XmToggleButtonSetState(styp5,TRUE,FALSE);
25340         Station_transmit_type=4;
25341         break;
25342 
25343       case(5):
25344         XmToggleButtonSetState(styp6,TRUE,FALSE);
25345         Station_transmit_type=5;
25346         break;
25347 
25348       default:
25349         XmToggleButtonSetState(styp1,TRUE,FALSE);
25350         Station_transmit_type=0;
25351         break;
25352     }
25353 
25354 #ifdef TRANSMIT_RAW_WX
25355     if (transmit_raw_wx)
25356     {
25357       XmToggleButtonSetState(raw_wx_tx,TRUE,FALSE);
25358     }
25359     else
25360     {
25361       XmToggleButtonSetState(raw_wx_tx,FALSE,FALSE);
25362     }
25363 #endif  // TRANSMIT_RAW_WX
25364 
25365     if(transmit_compressed_objects_items)
25366     {
25367       XmToggleButtonSetState(compressed_objects_items_tx,TRUE,FALSE);
25368     }
25369     else
25370     {
25371       XmToggleButtonSetState(compressed_objects_items_tx,FALSE,FALSE);
25372     }
25373 
25374     if(pop_up_new_bulletins)
25375     {
25376       XmToggleButtonSetState(new_bulletin_popup_enable,TRUE,FALSE);
25377     }
25378     else
25379     {
25380       XmToggleButtonSetState(new_bulletin_popup_enable,FALSE,FALSE);
25381     }
25382 
25383     if(view_zero_distance_bulletins)
25384     {
25385       XmToggleButtonSetState(zero_bulletin_popup_enable,TRUE,FALSE);
25386     }
25387     else
25388     {
25389       XmToggleButtonSetState(zero_bulletin_popup_enable,FALSE,FALSE);
25390     }
25391 
25392     if(warn_about_mouse_modifiers)
25393     {
25394       XmToggleButtonSetState(warn_about_mouse_modifiers_enable,TRUE,FALSE);
25395     }
25396     else
25397     {
25398       XmToggleButtonSetState(warn_about_mouse_modifiers_enable,FALSE,FALSE);
25399     }
25400 
25401     // user interface refers to all my trails in one color
25402     // my trail diff color as 0 means my trails in one color, so select
25403     // button when my trail diff color is 0 rather than 1.
25404     if(my_trail_diff_color)
25405     {
25406       XmToggleButtonSetState(my_trail_diff_color_enable,FALSE,FALSE);
25407     }
25408     else
25409     {
25410       XmToggleButtonSetState(my_trail_diff_color_enable,TRUE,FALSE);
25411     }
25412 
25413     if(predefined_menu_from_file)
25414     {
25415       // Option to load the predefined SAR objects menu items from a file.
25416       // Display the filename if one is currently selected and option is enabled.
25417 
25418 #ifdef USE_COMBO_BOX
25419       XmString tempSelection = XmStringCreateLocalized(predefined_object_definition_filename);
25420       XmComboBoxSelectItem(load_predefined_objects_menu_from_file, tempSelection);
25421       XmStringFree(tempSelection);
25422 #else
25423       x = -1;
25424       if (strncmp(predefined_object_definition_filename,"predefined_SAR.sys",strlen(predefined_object_definition_filename)) == 0)
25425       {
25426         x = 0;
25427       }
25428       if (strncmp(predefined_object_definition_filename,"predefined_EVENT.sys",strlen(predefined_object_definition_filename)) == 0)
25429       {
25430         x = 1;
25431       }
25432       if (strncmp(predefined_object_definition_filename,"predefined_USER.sys",strlen(predefined_object_definition_filename)) == 0)
25433       {
25434         x = 2;
25435       }
25436       i = 3;
25437       // allow display of another filename from the config file.
25438       // user won't be able to edit it, but they will see it.
25439       if (x==-1)
25440       {
25441         ac = 0;
25442         cb_items[i] = XmStringCreateLocalized(predefined_object_definition_filename);
25443         XtSetArg(al[ac], XmNlabelString, cb_items[i]);
25444         ac++;
25445         XtSetArg(al[ac], XmNuserData, (XtPointer)i);
25446         ac++;
25447         XtSetArg(al[ac], XmNfontList, fontlist1);
25448         ac++;
25449         sprintf(buf,"button%d",i);
25450         lpomff_button = XmCreatePushButton(lpomff_menuPane, buf, al, ac);
25451         XtManageChild(lpomff_button);
25452         XtAddCallback(lpomff_button, XmNactivateCallback, lpomff_menuCallback, Configure_defaults);
25453         lpomff_buttons[i] = lpomff_button;
25454         XmStringFree(cb_items[i]);
25455         x = i;
25456       }
25457       XtVaSetValues(lpomff_menu, XmNmenuHistory, lpomff_buttons[x], NULL);
25458       lpomff_value = x+1;
25459 #endif // USE_COMBO_BOX
25460       XmToggleButtonSetState(load_predefined_objects_menu_from_file_enable,TRUE,FALSE);
25461     }
25462     else
25463     {
25464       // by default combo box is created with no selection
25465       // make sure that toggle button is unchecked
25466       XmToggleButtonSetState(load_predefined_objects_menu_from_file_enable,FALSE,FALSE);
25467     }
25468 
25469     XmToggleButtonSetState(altnet_active, altnet, FALSE);
25470 
25471     XmToggleButtonSetState(disable_dupe_check, skip_dupe_checking, FALSE);
25472 
25473     // Known to have memory leaks in some Motif versions:
25474     //XmTextSetString(altnet_text, altnet_call);
25475     XmTextReplace(altnet_text, (XmTextPosition) 0,
25476                   XmTextGetLastPosition(altnet_text), altnet_call);
25477 
25478     switch(operate_as_an_igate)
25479     {
25480       case(0):
25481         XmToggleButtonSetState(igtyp0,TRUE,FALSE);
25482         Igate_type=0;
25483         break;
25484 
25485       case(1):
25486         XmToggleButtonSetState(igtyp1,TRUE,FALSE);
25487         Igate_type=1;
25488         break;
25489 
25490       case(2):
25491         XmToggleButtonSetState(igtyp2,TRUE,FALSE);
25492         Igate_type=2;
25493         break;
25494 
25495       default:
25496         XmToggleButtonSetState(igtyp0,TRUE,FALSE);
25497         Igate_type=0;
25498         break;
25499     }
25500     pos_dialog(configure_defaults_dialog);
25501 
25502     delw = XmInternAtom(XtDisplay(configure_defaults_dialog),"WM_DELETE_WINDOW", FALSE);
25503     XmAddWMProtocolCallback(configure_defaults_dialog, delw, Configure_defaults_destroy_shell, (XtPointer)configure_defaults_dialog);
25504 
25505     XtManageChild(my_form);
25506     XtManageChild(type_box);
25507     XtManageChild(igate_box);
25508     XtManageChild(pane);
25509 
25510     resize_dialog(my_form, configure_defaults_dialog);
25511 
25512     XtPopup(configure_defaults_dialog,XtGrabNone);
25513 
25514     // Move focus to the Close button.  This appears to highlight the
25515     // button fine, but we're not able to hit the <Enter> key to
25516     // have that default function happen.  Note:  We _can_ hit the
25517     // <SPACE> key, and that activates the option.
25518 //        XmUpdateDisplay(configure_defaults_dialog);
25519     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
25520 
25521   }
25522   else
25523   {
25524     (void)XRaiseWindow(XtDisplay(configure_defaults_dialog), XtWindow(configure_defaults_dialog));
25525   }
25526 }
25527 
25528 
25529 
25530 
25531 
25532 ///////////////////////////////////   Configure Timing Dialog   //////////////////////////////////
25533 
25534 
25535 void Configure_timing_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
25536 {
25537   Widget shell = (Widget) clientData;
25538   XtPopdown(shell);
25539   XtDestroyWidget(shell);
25540   configure_timing_dialog = (Widget)NULL;
25541 }
25542 
25543 
25544 
25545 
25546 
25547 void Configure_timing_change_data(Widget widget, XtPointer clientData, XtPointer callData)
25548 {
25549   int value;
25550 
25551 
25552   XmScaleGetValue(ghosting_time, &value);     // Minutes
25553   sec_old = (time_t)(value * 60);             // Convert to seconds
25554 
25555   XmScaleGetValue(clearing_time, &value);     // Hours
25556   sec_clear = (time_t)(value * 60 * 60);      // Convert to seconds
25557 
25558   XmScaleGetValue(posit_interval, &value);    // Minutes * 10
25559   POSIT_rate = (long)(value * 60 / 10);       // Convert to seconds
25560 
25561   XmScaleGetValue(gps_interval, &value);      // Seconds
25562   gps_time = (long)value;
25563 
25564   XmScaleGetValue(dead_reckoning_time, &value);// Minutes
25565   dead_reckoning_timeout = value * 60;        // Convert to seconds
25566 
25567   XmScaleGetValue(object_item_interval, &value);// Minutes
25568   OBJECT_rate = value * 60;                   // Convert to seconds
25569 
25570   XmScaleGetValue(removal_time, &value);      // Days
25571   sec_remove = (time_t)(value * 60 * 60 * 24);// Convert to seconds
25572 
25573   // Set the new posit rate into effect immediately
25574   posit_next_time = posit_last_time + POSIT_rate;
25575 
25576   // Set the new GPS rate into effect immediately
25577   sec_next_gps = sec_now() + gps_time;
25578 
25579   // Set the serial port inter-character delay
25580   XmScaleGetValue(serial_pacing_time, &serial_char_pacing);     // Milliseconds
25581 
25582   XmScaleGetValue(trail_segment_timeout, &value); // Minutes
25583   trail_segment_time = (int)value;
25584 
25585   XmScaleGetValue(trail_segment_distance_max, &value); // Degrees
25586   trail_segment_distance = (int)value;
25587 
25588 #ifdef HAVE_GPSMAN
25589   XmScaleGetValue(RINO_download_timeout, &value); // Degrees
25590   RINO_download_interval = (int)value;
25591 #endif  // HAVE_GPSMAN
25592 
25593   XmScaleGetValue(net_map_slider, &net_map_timeout);
25594 
25595   XmScaleGetValue(snapshot_interval_slider, &snapshot_interval);
25596 
25597   XmScaleGetValue(aircraft_clearing_time, &value);     // Minutes
25598   aircraft_sec_clear = (time_t)(value * 60);      // Convert to seconds
25599 
25600   redraw_on_new_data=2;
25601   Configure_timing_destroy_shell(widget,clientData,callData);
25602 }
25603 
25604 
25605 
25606 
25607 
25608 void Configure_timing( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
25609 {
25610   static Widget  pane, scrollwindow, my_form, button_ok, button_cancel;
25611   Atom delw;
25612   XmString x_str;
25613 
25614 
25615   if (!configure_timing_dialog)
25616   {
25617     configure_timing_dialog = XtVaCreatePopupShell(langcode("WPUPCFTM01"),
25618                               xmDialogShellWidgetClass, appshell,
25619                               XmNdeleteResponse, XmDESTROY,
25620                               XmNdefaultPosition, FALSE,
25621                               XmNfontList, fontlist1,
25622                               NULL);
25623 
25624     pane = XtVaCreateWidget("Configure_timing pane",
25625                             xmPanedWindowWidgetClass,
25626                             configure_timing_dialog,
25627                             MY_FOREGROUND_COLOR,
25628                             MY_BACKGROUND_COLOR,
25629                             NULL);
25630 
25631     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
25632                                            xmScrolledWindowWidgetClass,
25633                                            pane,
25634                                            XmNscrollingPolicy, XmAUTOMATIC,
25635                                            NULL);
25636 
25637     my_form =  XtVaCreateWidget("Configure_timing my_form",
25638                                 xmFormWidgetClass,
25639                                 scrollwindow,
25640                                 XmNfractionBase, 2,
25641                                 XmNautoUnmanage, FALSE,
25642                                 XmNshadowThickness, 1,
25643                                 MY_FOREGROUND_COLOR,
25644                                 MY_BACKGROUND_COLOR,
25645                                 NULL);
25646 
25647     // Posit Time
25648     x_str = XmStringCreateLocalized(langcode("WPUPCFTM02"));
25649     posit_interval = XtVaCreateManagedWidget("Posit Interval",
25650                      xmScaleWidgetClass,
25651                      my_form,
25652                      XmNtopAttachment, XmATTACH_FORM,
25653                      XmNtopOffset, 10,
25654                      XmNbottomAttachment, XmATTACH_NONE,
25655                      XmNleftAttachment, XmATTACH_POSITION,
25656                      XmNleftPosition, 0,
25657                      XmNleftOffset, 10,
25658                      XmNrightAttachment, XmATTACH_POSITION,
25659                      XmNrightPosition, 1,
25660                      XmNrightOffset, 5,
25661                      XmNsensitive, TRUE,
25662                      XmNorientation, XmHORIZONTAL,
25663                      XmNborderWidth, 1,
25664                      XmNminimum, 0,          // Zero minutes (disables the function)
25665                      XmNmaximum, 60*10,      // 60 minutes
25666                      XmNdecimalPoints, 1,    // Move decimal point over one
25667                      XmNscaleMultiple, 5,    // Move 30 seconds per left mouse
25668                      XmNshowValue, TRUE,
25669                      XmNvalue, (int)((POSIT_rate * 10) / 60),  // Minutes * 10
25670                      XmNtitleString, x_str,
25671                      MY_FOREGROUND_COLOR,
25672                      MY_BACKGROUND_COLOR,
25673                      XmNfontList, fontlist1,
25674                      NULL);
25675     XmStringFree(x_str);
25676 
25677 
25678     // Interval for stations being considered old (symbol ghosting)
25679     x_str = XmStringCreateLocalized(langcode("WPUPCFTM03"));
25680     ghosting_time = XtVaCreateManagedWidget("Station Ghosting Time",
25681                                             xmScaleWidgetClass,
25682                                             my_form,
25683                                             XmNtopAttachment, XmATTACH_FORM,
25684                                             XmNtopOffset, 10,
25685                                             XmNbottomAttachment, XmATTACH_NONE,
25686                                             XmNleftAttachment, XmATTACH_POSITION,
25687                                             XmNleftPosition, 1,
25688                                             XmNleftOffset, 5,
25689                                             XmNrightAttachment, XmATTACH_POSITION,
25690                                             XmNrightPosition, 2,
25691                                             XmNrightOffset, 10,
25692                                             XmNsensitive, TRUE,
25693                                             XmNorientation, XmHORIZONTAL,
25694                                             XmNborderWidth, 1,
25695                                             XmNminimum, 1,      // One minute
25696                                             XmNmaximum, 3*60,   // Three hours
25697                                             XmNshowValue, TRUE,
25698                                             XmNvalue, (int)(sec_old/60),
25699                                             XmNtitleString, x_str,
25700                                             MY_FOREGROUND_COLOR,
25701                                             MY_BACKGROUND_COLOR,
25702                                             XmNfontList, fontlist1,
25703                                             NULL);
25704     XmStringFree(x_str);
25705 
25706     // Object Item Transmit Interval
25707     x_str = XmStringCreateLocalized(langcode("WPUPCFTM04"));
25708     object_item_interval = XtVaCreateManagedWidget("Object/Item Transmit Interval (min)",
25709                            xmScaleWidgetClass,
25710                            my_form,
25711                            XmNtopAttachment, XmATTACH_WIDGET,
25712                            XmNtopWidget, posit_interval,
25713                            XmNtopOffset, 10,
25714                            XmNbottomAttachment, XmATTACH_NONE,
25715                            XmNleftAttachment, XmATTACH_POSITION,
25716                            XmNleftPosition, 0,
25717                            XmNleftOffset, 10,
25718                            XmNrightAttachment, XmATTACH_POSITION,
25719                            XmNrightPosition, 1,
25720                            XmNrightOffset, 5,
25721                            XmNsensitive, TRUE,
25722                            XmNorientation, XmHORIZONTAL,
25723                            XmNborderWidth, 1,
25724                            XmNminimum, 5,      // Five minutes
25725                            XmNmaximum, 120,    // 120 minutes
25726                            XmNscaleMultiple, 5,    // Move 5 minutes per left mouse
25727                            XmNshowValue, TRUE,
25728                            XmNvalue, (int)(OBJECT_rate / 60),
25729                            XmNtitleString, x_str,
25730                            MY_FOREGROUND_COLOR,
25731                            MY_BACKGROUND_COLOR,
25732                            XmNfontList, fontlist1,
25733                            NULL);
25734     XmStringFree(x_str);
25735 
25736     // Interval for station not being displayed
25737     x_str = XmStringCreateLocalized(langcode("WPUPCFTM05"));
25738     clearing_time = XtVaCreateManagedWidget("Station Clear Time",
25739                                             xmScaleWidgetClass,
25740                                             my_form,
25741                                             XmNtopAttachment, XmATTACH_WIDGET,
25742                                             XmNtopWidget, posit_interval,
25743                                             XmNtopOffset, 10,
25744                                             XmNbottomAttachment, XmATTACH_NONE,
25745                                             XmNleftAttachment, XmATTACH_POSITION,
25746                                             XmNleftPosition, 1,
25747                                             XmNleftOffset, 5,
25748                                             XmNrightAttachment, XmATTACH_POSITION,
25749                                             XmNrightPosition, 2,
25750                                             XmNrightOffset, 10,
25751                                             XmNsensitive, TRUE,
25752                                             XmNorientation, XmHORIZONTAL,
25753                                             XmNborderWidth, 1,
25754                                             XmNminimum, 1,      // One hour
25755                                             XmNmaximum, 24*7,   // One week
25756                                             XmNshowValue, TRUE,
25757                                             XmNvalue, (int)(sec_clear/(60*60)),
25758                                             XmNtitleString, x_str,
25759                                             MY_FOREGROUND_COLOR,
25760                                             MY_BACKGROUND_COLOR,
25761                                             XmNfontList, fontlist1,
25762                                             NULL);
25763     XmStringFree(x_str);
25764 
25765     // GPS Time
25766     x_str = XmStringCreateLocalized(langcode("WPUPCFTM06"));
25767     gps_interval = XtVaCreateManagedWidget("GPS Interval",
25768                                            xmScaleWidgetClass,
25769                                            my_form,
25770                                            XmNtopAttachment, XmATTACH_WIDGET,
25771                                            XmNtopWidget, object_item_interval,
25772                                            XmNtopOffset, 10,
25773                                            XmNbottomAttachment, XmATTACH_NONE,
25774                                            XmNleftAttachment, XmATTACH_POSITION,
25775                                            XmNleftPosition, 0,
25776                                            XmNleftOffset, 10,
25777                                            XmNrightAttachment, XmATTACH_POSITION,
25778                                            XmNrightPosition, 1,
25779                                            XmNrightOffset, 5,
25780                                            XmNsensitive, TRUE,
25781                                            XmNorientation, XmHORIZONTAL,
25782                                            XmNborderWidth, 1,
25783                                            XmNminimum, 1,      // One second
25784                                            XmNmaximum, 60,     // Sixty seconds
25785                                            XmNshowValue, TRUE,
25786                                            XmNvalue, (int)gps_time,
25787                                            XmNtitleString, x_str,
25788                                            MY_FOREGROUND_COLOR,
25789                                            MY_BACKGROUND_COLOR,
25790                                            XmNfontList, fontlist1,
25791                                            NULL);
25792     XmStringFree(x_str);
25793 
25794     // Interval for station being removed from database
25795     x_str = XmStringCreateLocalized(langcode("WPUPCFTM07"));
25796     removal_time = XtVaCreateManagedWidget("Station Delete Time",
25797                                            xmScaleWidgetClass,
25798                                            my_form,
25799                                            XmNtopAttachment, XmATTACH_WIDGET,
25800                                            XmNtopWidget, object_item_interval,
25801                                            XmNtopOffset, 10,
25802                                            XmNbottomAttachment, XmATTACH_NONE,
25803                                            XmNleftAttachment, XmATTACH_POSITION,
25804                                            XmNleftPosition, 1,
25805                                            XmNleftOffset, 5,
25806                                            XmNrightAttachment, XmATTACH_POSITION,
25807                                            XmNrightPosition, 2,
25808                                            XmNrightOffset, 10,
25809                                            XmNsensitive, TRUE,
25810                                            XmNorientation, XmHORIZONTAL,
25811                                            XmNborderWidth, 1,
25812                                            XmNminimum, 1,      // One Day
25813                                            XmNmaximum, 14,     // Two weeks
25814                                            XmNshowValue, TRUE,
25815                                            XmNvalue, (int)(sec_remove/(60*60*24)),
25816                                            XmNtitleString, x_str,
25817                                            MY_FOREGROUND_COLOR,
25818                                            MY_BACKGROUND_COLOR,
25819                                            XmNfontList, fontlist1,
25820                                            NULL);
25821     XmStringFree(x_str);
25822 
25823     // Dead Reckoning Timeout
25824     x_str = XmStringCreateLocalized(langcode("WPUPCFTM08"));
25825     dead_reckoning_time = XtVaCreateManagedWidget("DR Time (min)",
25826                           xmScaleWidgetClass,
25827                           my_form,
25828                           XmNtopAttachment, XmATTACH_WIDGET,
25829                           XmNtopWidget, gps_interval,
25830                           XmNtopOffset, 10,
25831                           XmNbottomAttachment, XmATTACH_NONE,
25832                           XmNleftAttachment, XmATTACH_POSITION,
25833                           XmNleftPosition, 0,
25834                           XmNleftOffset, 10,
25835                           XmNrightAttachment, XmATTACH_POSITION,
25836                           XmNrightPosition, 1,
25837                           XmNrightOffset, 5,
25838                           XmNsensitive, TRUE,
25839                           XmNorientation, XmHORIZONTAL,
25840                           XmNborderWidth, 1,
25841                           XmNminimum, 1,      // One minute
25842                           XmNmaximum, 60,     // Sixty minutes
25843                           XmNshowValue, TRUE,
25844                           XmNvalue, (int)(dead_reckoning_timeout / 60),
25845                           XmNtitleString, x_str,
25846                           MY_FOREGROUND_COLOR,
25847                           MY_BACKGROUND_COLOR,
25848                           XmNfontList, fontlist1,
25849                           NULL);
25850     XmStringFree(x_str);
25851 
25852     // Serial Pacing Time (delay between each serial character)
25853     x_str = XmStringCreateLocalized(langcode("WPUPCFTM09"));
25854     serial_pacing_time = XtVaCreateManagedWidget("Serial Pacing Time (ms)",
25855                          xmScaleWidgetClass,
25856                          my_form,
25857                          XmNtopAttachment, XmATTACH_WIDGET,
25858                          XmNtopWidget, removal_time,
25859                          XmNtopOffset, 10,
25860                          XmNbottomAttachment, XmATTACH_NONE,
25861                          XmNleftAttachment, XmATTACH_POSITION,
25862                          XmNleftPosition, 1,
25863                          XmNleftOffset, 5,
25864                          XmNrightAttachment, XmATTACH_POSITION,
25865                          XmNrightPosition, 2,
25866                          XmNrightOffset, 10,
25867                          XmNsensitive, TRUE,
25868                          XmNorientation, XmHORIZONTAL,
25869                          XmNborderWidth, 1,
25870                          XmNminimum, 0,      // Zero
25871                          XmNmaximum, 50,     // Fifty milliseconds
25872                          XmNshowValue, TRUE,
25873                          XmNvalue, (int)(serial_char_pacing),
25874                          XmNtitleString, x_str,
25875                          MY_FOREGROUND_COLOR,
25876                          MY_BACKGROUND_COLOR,
25877                          XmNfontList, fontlist1,
25878                          NULL);
25879     XmStringFree(x_str);
25880 
25881     // Time below which track segment will get drawn, in minutes
25882     x_str = XmStringCreateLocalized(langcode("WPUPCFTM10"));
25883     trail_segment_timeout = XtVaCreateManagedWidget("Trail segment timeout",
25884                             xmScaleWidgetClass,
25885                             my_form,
25886                             XmNtopAttachment, XmATTACH_WIDGET,
25887                             XmNtopWidget, dead_reckoning_time,
25888                             XmNtopOffset, 10,
25889                             XmNbottomAttachment, XmATTACH_NONE,
25890                             XmNleftAttachment, XmATTACH_POSITION,
25891                             XmNleftPosition, 0,
25892                             XmNleftOffset, 10,
25893                             XmNrightAttachment, XmATTACH_POSITION,
25894                             XmNrightPosition, 1,
25895                             XmNrightOffset, 5,
25896                             XmNsensitive, TRUE,
25897                             XmNorientation, XmHORIZONTAL,
25898                             XmNborderWidth, 1,
25899                             XmNminimum, 0,     // Zero minutes
25900                             XmNmaximum, 12*60, // 12 hours
25901                             XmNshowValue, TRUE,
25902                             XmNvalue, trail_segment_time,
25903                             XmNtitleString, x_str,
25904                             MY_FOREGROUND_COLOR,
25905                             MY_BACKGROUND_COLOR,
25906                             XmNfontList, fontlist1,
25907                             NULL);
25908     XmStringFree(x_str);
25909 
25910     // Interval at track segment will not get drawn, in degrees
25911     x_str = XmStringCreateLocalized(langcode("WPUPCFTM11"));
25912     trail_segment_distance_max = XtVaCreateManagedWidget("Trail segment interval degrees",
25913                                  xmScaleWidgetClass,
25914                                  my_form,
25915                                  XmNtopAttachment, XmATTACH_WIDGET,
25916                                  XmNtopWidget, dead_reckoning_time,
25917                                  XmNtopOffset, 10,
25918                                  XmNbottomAttachment, XmATTACH_NONE,
25919                                  XmNleftAttachment, XmATTACH_POSITION,
25920                                  XmNleftPosition, 1,
25921                                  XmNleftOffset, 5,
25922                                  XmNrightAttachment, XmATTACH_POSITION,
25923                                  XmNrightPosition, 2,
25924                                  XmNrightOffset, 10,
25925                                  XmNsensitive, TRUE,
25926                                  XmNorientation, XmHORIZONTAL,
25927                                  XmNborderWidth, 1,
25928                                  XmNminimum, 0,  // Zero degrees
25929                                  XmNmaximum, 45, // 90 degrees
25930                                  XmNshowValue, TRUE,
25931                                  XmNvalue, trail_segment_distance,
25932                                  XmNtitleString, x_str,
25933                                  MY_FOREGROUND_COLOR,
25934                                  MY_BACKGROUND_COLOR,
25935                                  XmNfontList, fontlist1,
25936                                  NULL);
25937     XmStringFree(x_str);
25938 
25939     // Time below which track segment will get drawn, in minutes
25940     x_str = XmStringCreateLocalized(langcode("WPUPCFTM12"));
25941     RINO_download_timeout = XtVaCreateManagedWidget("RINO download interval",
25942                             xmScaleWidgetClass,
25943                             my_form,
25944                             XmNtopAttachment, XmATTACH_WIDGET,
25945                             XmNtopWidget, trail_segment_timeout,
25946                             XmNtopOffset, 10,
25947                             XmNbottomAttachment, XmATTACH_NONE,
25948                             XmNleftAttachment, XmATTACH_POSITION,
25949                             XmNleftPosition, 0,
25950                             XmNleftOffset, 10,
25951                             XmNrightAttachment, XmATTACH_POSITION,
25952                             XmNrightPosition, 1,
25953                             XmNrightOffset, 5,
25954                             XmNsensitive, TRUE,
25955                             XmNorientation, XmHORIZONTAL,
25956                             XmNborderWidth, 1,
25957                             XmNminimum, 0,      // Zero minutes (disables the function)
25958                             XmNmaximum, 30,     // 30 minutes
25959                             XmNshowValue, TRUE,
25960                             XmNvalue, RINO_download_interval,
25961                             XmNtitleString, x_str,
25962                             MY_FOREGROUND_COLOR,
25963                             MY_BACKGROUND_COLOR,
25964                             XmNfontList, fontlist1,
25965                             NULL);
25966     XmStringFree(x_str);
25967 
25968 #ifndef HAVE_GPSMAN
25969     XtSetSensitive(RINO_download_timeout, FALSE);
25970 #endif  // HAVE_GPSMAN
25971 
25972     x_str = XmStringCreateLocalized(langcode("MPUPTGR017"));
25973     net_map_slider  = XtVaCreateManagedWidget("Net Map Timeout",
25974                       xmScaleWidgetClass,
25975                       my_form,
25976                       XmNtopAttachment, XmATTACH_WIDGET,
25977                       XmNtopWidget, trail_segment_timeout,
25978                       XmNtopOffset, 10,
25979                       XmNbottomAttachment, XmATTACH_NONE,
25980                       XmNleftAttachment, XmATTACH_POSITION,
25981                       XmNleftPosition, 1,
25982                       XmNleftOffset, 5,
25983                       XmNrightAttachment, XmATTACH_POSITION,
25984                       XmNrightPosition, 2,
25985                       XmNrightOffset, 10,
25986                       XmNsensitive, TRUE,
25987                       XmNorientation, XmHORIZONTAL,
25988                       XmNborderWidth, 1,
25989                       XmNminimum, 10,
25990                       XmNmaximum, 300,
25991                       XmNshowValue, TRUE,
25992                       XmNvalue, net_map_timeout,
25993                       XmNtitleString, x_str,
25994                       MY_FOREGROUND_COLOR,
25995                       MY_BACKGROUND_COLOR,
25996                       XmNfontList, fontlist1,
25997                       NULL);
25998     XmStringFree(x_str);
25999 
26000     // Interval at which snapshots will be taken, in minutes
26001     x_str = XmStringCreateLocalized(langcode("WPUPCFTM13"));
26002     snapshot_interval_slider = XtVaCreateManagedWidget("Snapshot interval",
26003                                xmScaleWidgetClass,
26004                                my_form,
26005                                XmNtopAttachment, XmATTACH_WIDGET,
26006                                XmNtopWidget, RINO_download_timeout,
26007                                XmNtopOffset, 10,
26008                                XmNbottomAttachment, XmATTACH_NONE,
26009                                XmNleftAttachment, XmATTACH_POSITION,
26010                                XmNleftPosition, 0,
26011                                XmNleftOffset, 10,
26012                                XmNrightAttachment, XmATTACH_POSITION,
26013                                XmNrightPosition, 1,
26014                                XmNrightOffset, 5,
26015                                XmNsensitive, TRUE,
26016                                XmNorientation, XmHORIZONTAL,
26017                                XmNborderWidth, 1,
26018                                XmNminimum, 1,    // 0.5 minutes
26019                                XmNmaximum, 30,     // 30 minutes
26020                                XmNshowValue, TRUE,
26021                                XmNvalue, snapshot_interval,
26022                                XmNtitleString, x_str,
26023                                MY_FOREGROUND_COLOR,
26024                                MY_BACKGROUND_COLOR,
26025                                XmNfontList, fontlist1,
26026                                NULL);
26027     XmStringFree(x_str);
26028 
26029 // Interval for aircraft not being displayed
26030     x_str = XmStringCreateLocalized(langcode("WPUPCFTM14"));
26031     aircraft_clearing_time = XtVaCreateManagedWidget("Aircraft Clear Time",
26032                              xmScaleWidgetClass,
26033                              my_form,
26034                              XmNtopAttachment, XmATTACH_WIDGET,
26035 //                XmNtopWidget, clearing_time,
26036                              XmNtopWidget, RINO_download_timeout,
26037                              XmNtopOffset, 10,
26038                              XmNbottomAttachment, XmATTACH_NONE,
26039                              XmNleftAttachment, XmATTACH_POSITION,
26040                              XmNleftPosition, 1,
26041                              XmNleftOffset, 10,
26042                              XmNrightAttachment, XmATTACH_POSITION,
26043                              XmNrightPosition, 2,
26044                              XmNrightOffset, 5,
26045                              XmNsensitive, TRUE,
26046                              XmNorientation, XmHORIZONTAL,
26047                              XmNborderWidth, 1,
26048                              XmNminimum, 0,      // zero disables - this is the default
26049                              XmNmaximum, 60*8,   // 8 hours
26050                              XmNshowValue, TRUE,
26051                              XmNvalue, (int)(aircraft_sec_clear/(60)),
26052                              XmNtitleString, x_str,
26053                              MY_FOREGROUND_COLOR,
26054                              MY_BACKGROUND_COLOR,
26055                              XmNfontList, fontlist1,
26056                              NULL);
26057     XmStringFree(x_str);
26058 
26059 
26060     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
26061                                         xmPushButtonGadgetClass,
26062                                         my_form,
26063                                         XmNtopAttachment, XmATTACH_WIDGET,
26064                                         XmNtopWidget, snapshot_interval_slider,
26065                                         XmNtopOffset, 10,
26066                                         XmNbottomAttachment, XmATTACH_FORM,
26067                                         XmNbottomOffset, 5,
26068                                         XmNleftAttachment, XmATTACH_POSITION,
26069                                         XmNleftPosition, 0,
26070                                         XmNrightAttachment, XmATTACH_POSITION,
26071                                         XmNrightPosition, 1,
26072                                         XmNnavigationType, XmTAB_GROUP,
26073                                         MY_FOREGROUND_COLOR,
26074                                         MY_BACKGROUND_COLOR,
26075                                         XmNfontList, fontlist1,
26076                                         NULL);
26077 
26078 
26079     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
26080                                             xmPushButtonGadgetClass,
26081                                             my_form,
26082                                             XmNtopAttachment, XmATTACH_WIDGET,
26083                                             XmNtopWidget, snapshot_interval_slider,
26084                                             XmNtopOffset, 10,
26085                                             XmNbottomAttachment, XmATTACH_FORM,
26086                                             XmNbottomOffset, 5,
26087                                             XmNleftAttachment, XmATTACH_POSITION,
26088                                             XmNleftPosition, 1,
26089                                             XmNrightAttachment, XmATTACH_POSITION,
26090                                             XmNrightPosition, 2,
26091                                             XmNnavigationType, XmTAB_GROUP,
26092                                             MY_FOREGROUND_COLOR,
26093                                             MY_BACKGROUND_COLOR,
26094                                             XmNfontList, fontlist1,
26095                                             NULL);
26096 
26097     XtAddCallback(button_ok, XmNactivateCallback, Configure_timing_change_data, configure_timing_dialog);
26098     XtAddCallback(button_cancel, XmNactivateCallback, Configure_timing_destroy_shell, configure_timing_dialog);
26099 
26100     pos_dialog(configure_timing_dialog);
26101 
26102     delw = XmInternAtom(XtDisplay(configure_timing_dialog),"WM_DELETE_WINDOW", FALSE);
26103     XmAddWMProtocolCallback(configure_timing_dialog, delw, Configure_timing_destroy_shell, (XtPointer)configure_timing_dialog);
26104 
26105     XtManageChild(my_form);
26106     XtManageChild(pane);
26107 
26108     resize_dialog(my_form, configure_timing_dialog);
26109 
26110     XtPopup(configure_timing_dialog,XtGrabNone);
26111 
26112     // Move focus to the Close button.  This appears to highlight the
26113     // button fine, but we're not able to hit the <Enter> key to
26114     // have that default function happen.  Note:  We _can_ hit the
26115     // <SPACE> key, and that activates the option.
26116 //        XmUpdateDisplay(configure_timing_dialog);
26117     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
26118 
26119   }
26120   else
26121   {
26122     (void)XRaiseWindow(XtDisplay(configure_timing_dialog), XtWindow(configure_timing_dialog));
26123   }
26124 }
26125 
26126 
26127 
26128 
26129 
26130 ///////////////////////////////////   Configure Coordinates Dialog   //////////////////////////////////
26131 
26132 void coordinates_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
26133 {
26134   char *which = (char *)clientData;
26135   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
26136 
26137   if (state->set)
26138   {
26139     coordinate_system = atoi(which);
26140   }
26141   else
26142   {
26143     coordinate_system = USE_DDMMMM;
26144   }
26145 
26146   // Update any active view lists so their coordinates get updated
26147   Station_List_fill(1,0);     // Update View->Mobile Station list (has lat/lon or UTM info on it)
26148   // Force redraw
26149   redraw_on_new_data = 2;
26150 }
26151 
26152 
26153 
26154 
26155 
26156 void Configure_coordinates_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
26157 {
26158   Widget shell = (Widget) clientData;
26159   XtPopdown(shell);
26160   XtDestroyWidget(shell);
26161   configure_coordinates_dialog = (Widget)NULL;
26162 }
26163 
26164 
26165 
26166 
26167 
26168 void Configure_coordinates( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
26169 {
26170   static Widget pane, scrollwindow, my_form, button_ok, button_cancel, frame,
26171          coord_box, coord_0, coord_1, coord_2,
26172          coord_3, coord_4, coord_5;
26173 //  static Widget label;
26174   Atom delw;
26175   Arg al[50];                    /* Arg List */
26176   register unsigned int ac = 0;           /* Arg Count */
26177 
26178   if (!configure_coordinates_dialog)
26179   {
26180     configure_coordinates_dialog = XtVaCreatePopupShell(langcode("WPUPCFC001"),
26181                                    xmDialogShellWidgetClass, appshell,
26182                                    XmNdeleteResponse, XmDESTROY,
26183                                    XmNdefaultPosition, FALSE,
26184                                    XmNfontList, fontlist1,
26185                                    NULL);
26186 
26187     pane = XtVaCreateWidget("Configure_coordinates pane",
26188                             xmPanedWindowWidgetClass,
26189                             configure_coordinates_dialog,
26190                             MY_FOREGROUND_COLOR,
26191                             MY_BACKGROUND_COLOR,
26192                             NULL);
26193 
26194     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
26195                                            xmScrolledWindowWidgetClass,
26196                                            pane,
26197                                            XmNscrollingPolicy, XmAUTOMATIC,
26198                                            NULL);
26199 
26200     my_form =  XtVaCreateWidget("Configure_coordinates my_form",
26201                                 xmFormWidgetClass,
26202                                 scrollwindow,
26203                                 XmNfractionBase, 5,
26204                                 XmNautoUnmanage, FALSE,
26205                                 XmNshadowThickness, 1,
26206                                 MY_FOREGROUND_COLOR,
26207                                 MY_BACKGROUND_COLOR,
26208                                 NULL);
26209 
26210 
26211     // Interval for station being considered old
26212     frame = XtVaCreateManagedWidget("Configure_coordinates frame",
26213                                     xmFrameWidgetClass,
26214                                     my_form,
26215                                     XmNtopAttachment,XmATTACH_FORM,
26216                                     XmNtopOffset,10,
26217                                     XmNbottomAttachment,XmATTACH_NONE,
26218                                     XmNleftAttachment, XmATTACH_FORM,
26219                                     XmNleftOffset, 10,
26220                                     XmNrightAttachment,XmATTACH_FORM,
26221                                     XmNrightOffset, 10,
26222                                     MY_FOREGROUND_COLOR,
26223                                     MY_BACKGROUND_COLOR,
26224                                     NULL);
26225 
26226     //label
26227     XtVaCreateManagedWidget(langcode("WPUPCFC002"),
26228                             xmLabelWidgetClass,
26229                             frame,
26230                             XmNchildType, XmFRAME_TITLE_CHILD,
26231                             MY_FOREGROUND_COLOR,
26232                             MY_BACKGROUND_COLOR,
26233                             XmNfontList, fontlist1,
26234                             NULL);
26235     /*set args for color */
26236     ac=0;
26237     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
26238     ac++;
26239     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
26240     ac++;
26241     XtSetArg(al[ac], XmNfontList, fontlist1);
26242     ac++;
26243 
26244     coord_box = XmCreateRadioBox(frame,"Configure_coordinates coord_box",
26245                                  al,
26246                                  ac);
26247 
26248     XtVaSetValues(coord_box,
26249                   XmNpacking, XmPACK_TIGHT,
26250                   XmNorientation, XmHORIZONTAL,
26251                   XmNnumColumns,5,
26252                   NULL);
26253 
26254 
26255     coord_0 = XtVaCreateManagedWidget(langcode("WPUPCFC003"),
26256                                       xmToggleButtonGadgetClass,
26257                                       coord_box,
26258                                       MY_FOREGROUND_COLOR,
26259                                       MY_BACKGROUND_COLOR,
26260                                       XmNfontList, fontlist1,
26261                                       NULL);
26262     XtAddCallback(coord_0,XmNvalueChangedCallback,coordinates_toggle,"0");
26263 
26264 
26265     coord_1 = XtVaCreateManagedWidget(langcode("WPUPCFC004"),
26266                                       xmToggleButtonGadgetClass,
26267                                       coord_box,
26268                                       MY_FOREGROUND_COLOR,
26269                                       MY_BACKGROUND_COLOR,
26270                                       XmNfontList, fontlist1,
26271                                       NULL);
26272     XtAddCallback(coord_1,XmNvalueChangedCallback,coordinates_toggle,"1");
26273 
26274 
26275     coord_2 = XtVaCreateManagedWidget(langcode("WPUPCFC005"),
26276                                       xmToggleButtonGadgetClass,
26277                                       coord_box,
26278                                       MY_FOREGROUND_COLOR,
26279                                       MY_BACKGROUND_COLOR,
26280                                       XmNfontList, fontlist1,
26281                                       NULL);
26282     XtAddCallback(coord_2,XmNvalueChangedCallback,coordinates_toggle,"2");
26283 
26284 
26285     coord_3 = XtVaCreateManagedWidget(langcode("WPUPCFC006"),
26286                                       xmToggleButtonGadgetClass,
26287                                       coord_box,
26288                                       MY_FOREGROUND_COLOR,
26289                                       MY_BACKGROUND_COLOR,
26290                                       XmNfontList, fontlist1,
26291                                       NULL);
26292     XtAddCallback(coord_3,XmNvalueChangedCallback,coordinates_toggle,"3");
26293 
26294 
26295     coord_4 = XtVaCreateManagedWidget(langcode("WPUPCFC008"),
26296                                       xmToggleButtonGadgetClass,
26297                                       coord_box,
26298                                       MY_FOREGROUND_COLOR,
26299                                       MY_BACKGROUND_COLOR,
26300                                       XmNfontList, fontlist1,
26301                                       NULL);
26302     XtAddCallback(coord_4,XmNvalueChangedCallback,coordinates_toggle,"4");
26303 
26304 
26305     coord_5 = XtVaCreateManagedWidget(langcode("WPUPCFC007"),
26306                                       xmToggleButtonGadgetClass,
26307                                       coord_box,
26308                                       MY_FOREGROUND_COLOR,
26309                                       MY_BACKGROUND_COLOR,
26310                                       XmNfontList, fontlist1,
26311                                       NULL);
26312     XtAddCallback(coord_5,XmNvalueChangedCallback,coordinates_toggle,"5");
26313 
26314 
26315     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
26316                                         xmPushButtonGadgetClass,
26317                                         my_form,
26318                                         XmNtopAttachment, XmATTACH_WIDGET,
26319                                         XmNtopWidget, frame,
26320                                         XmNtopOffset, 5,
26321                                         XmNbottomAttachment, XmATTACH_FORM,
26322                                         XmNbottomOffset, 5,
26323                                         XmNleftAttachment, XmATTACH_POSITION,
26324                                         XmNleftPosition, 1,
26325                                         XmNrightAttachment, XmATTACH_POSITION,
26326                                         XmNrightPosition, 2,
26327                                         XmNnavigationType, XmTAB_GROUP,
26328                                         MY_FOREGROUND_COLOR,
26329                                         MY_BACKGROUND_COLOR,
26330                                         XmNfontList, fontlist1,
26331                                         NULL);
26332 
26333 
26334     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
26335                                             xmPushButtonGadgetClass,
26336                                             my_form,
26337                                             XmNtopAttachment, XmATTACH_WIDGET,
26338                                             XmNtopWidget, frame,
26339                                             XmNtopOffset, 5,
26340                                             XmNbottomAttachment, XmATTACH_FORM,
26341                                             XmNbottomOffset, 5,
26342                                             XmNleftAttachment, XmATTACH_POSITION,
26343                                             XmNleftPosition, 3,
26344                                             XmNrightAttachment, XmATTACH_POSITION,
26345                                             XmNrightPosition, 4,
26346                                             XmNnavigationType, XmTAB_GROUP,
26347                                             MY_FOREGROUND_COLOR,
26348                                             MY_BACKGROUND_COLOR,
26349                                             XmNfontList, fontlist1,
26350                                             NULL);
26351 
26352     XtAddCallback(button_ok, XmNactivateCallback, Configure_coordinates_destroy_shell, configure_coordinates_dialog);
26353     XtAddCallback(button_cancel, XmNactivateCallback, Configure_coordinates_destroy_shell, configure_coordinates_dialog);
26354 
26355     // Set the toggle buttons based on current data
26356     switch (coordinate_system)
26357     {
26358       case(USE_DDDDDD):
26359         XmToggleButtonSetState(coord_0,TRUE,FALSE);
26360         break;
26361 
26362       case(USE_DDMMSS):
26363         XmToggleButtonSetState(coord_2,TRUE,FALSE);
26364         break;
26365 
26366       case(USE_UTM):
26367         XmToggleButtonSetState(coord_3,TRUE,FALSE);
26368         break;
26369 
26370       case(USE_UTM_SPECIAL):
26371         XmToggleButtonSetState(coord_4,TRUE,FALSE);
26372         break;
26373 
26374       case(USE_MGRS):
26375         XmToggleButtonSetState(coord_5,TRUE,FALSE);
26376         break;
26377 
26378       case(USE_DDMMMM):
26379       default:
26380         XmToggleButtonSetState(coord_1,TRUE,FALSE);
26381         break;
26382     }
26383 
26384     pos_dialog(configure_coordinates_dialog);
26385 
26386     delw = XmInternAtom(XtDisplay(configure_coordinates_dialog),"WM_DELETE_WINDOW", FALSE);
26387     XmAddWMProtocolCallback(configure_coordinates_dialog, delw, Configure_coordinates_destroy_shell, (XtPointer)configure_coordinates_dialog);
26388 
26389     XtManageChild(my_form);
26390     XtManageChild(coord_box);
26391     XtManageChild(pane);
26392 
26393     resize_dialog(my_form, configure_coordinates_dialog);
26394 
26395     XtPopup(configure_coordinates_dialog,XtGrabNone);
26396 
26397     // Move focus to the Close button.  This appears to highlight the
26398     // button fine, but we're not able to hit the <Enter> key to
26399     // have that default function happen.  Note:  We _can_ hit the
26400     // <SPACE> key, and that activates the option.
26401 //        XmUpdateDisplay(configure_coordinates_dialog);
26402     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
26403 
26404   }
26405   else
26406   {
26407     (void)XRaiseWindow(XtDisplay(configure_coordinates_dialog), XtWindow(configure_coordinates_dialog));
26408   }
26409 }
26410 
26411 
26412 
26413 
26414 
26415 
26416 /////////////////////////////////   Configure Audio Alarms Dialog   ////////////////////////////////
26417 
26418 void Configure_audio_alarm_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
26419 {
26420   Widget shell = (Widget) clientData;
26421   XtPopdown(shell);
26422   XtDestroyWidget(shell);
26423   configure_audio_alarm_dialog = (Widget)NULL;
26424 }
26425 
26426 
26427 
26428 
26429 
26430 void Configure_audio_alarm_change_data(Widget widget, XtPointer clientData, XtPointer callData)
26431 {
26432   char *temp_ptr;
26433 
26434 
26435   temp_ptr = XmTextFieldGetString(audio_alarm_config_play_data);
26436   xastir_snprintf(sound_command,
26437                   sizeof(sound_command),
26438                   "%s",
26439                   temp_ptr);
26440   XtFree(temp_ptr);
26441 
26442   (void)remove_trailing_spaces(sound_command);
26443 
26444   temp_ptr = XmTextFieldGetString(audio_alarm_config_play_ons_data);
26445   xastir_snprintf(sound_new_station,
26446                   sizeof(sound_new_station),
26447                   "%s",
26448                   temp_ptr);
26449   XtFree(temp_ptr);
26450 
26451   (void)remove_trailing_spaces(sound_new_station);
26452 
26453   temp_ptr = XmTextFieldGetString(audio_alarm_config_play_onm_data);
26454   xastir_snprintf(sound_new_message,
26455                   sizeof(sound_new_message),
26456                   "%s",
26457                   temp_ptr);
26458   XtFree(temp_ptr);
26459 
26460   (void)remove_trailing_spaces(sound_new_message);
26461 
26462   temp_ptr = XmTextFieldGetString(audio_alarm_config_play_onpx_data);
26463   xastir_snprintf(sound_prox_message,
26464                   sizeof(sound_prox_message),
26465                   "%s",
26466                   temp_ptr);
26467   XtFree(temp_ptr);
26468 
26469   (void)remove_trailing_spaces(sound_prox_message);
26470 
26471   temp_ptr = XmTextFieldGetString(prox_min_data);
26472   xastir_snprintf(prox_min,
26473                   sizeof(prox_min),
26474                   "%s",
26475                   temp_ptr);
26476   XtFree(temp_ptr);
26477 
26478   (void)remove_trailing_spaces(prox_min);
26479 
26480   temp_ptr = XmTextFieldGetString(prox_max_data);
26481   xastir_snprintf(prox_max,
26482                   sizeof(prox_max),
26483                   "%s",
26484                   temp_ptr);
26485   XtFree(temp_ptr);
26486 
26487   (void)remove_trailing_spaces(prox_max);
26488 
26489   temp_ptr = XmTextFieldGetString(audio_alarm_config_play_onbo_data);
26490   xastir_snprintf(sound_band_open_message,
26491                   sizeof(sound_band_open_message),
26492                   "%s",
26493                   temp_ptr);
26494   XtFree(temp_ptr);
26495 
26496   (void)remove_trailing_spaces(sound_band_open_message);
26497 
26498   temp_ptr = XmTextFieldGetString(bando_min_data);
26499   xastir_snprintf(bando_min,
26500                   sizeof(bando_min),
26501                   "%s",
26502                   temp_ptr);
26503   XtFree(temp_ptr);
26504 
26505   (void)remove_trailing_spaces(bando_min);
26506 
26507   temp_ptr = XmTextFieldGetString(bando_max_data);
26508   xastir_snprintf(bando_max,
26509                   sizeof(bando_max),
26510                   "%s",
26511                   temp_ptr);
26512   XtFree(temp_ptr);
26513 
26514   (void)remove_trailing_spaces(bando_max);
26515 
26516   temp_ptr = XmTextFieldGetString(audio_alarm_config_wx_alert_data);
26517   xastir_snprintf(sound_wx_alert_message,
26518                   sizeof(sound_wx_alert_message),
26519                   "%s",
26520                   temp_ptr);
26521   XtFree(temp_ptr);
26522 
26523   (void)remove_trailing_spaces(sound_wx_alert_message);
26524 
26525   if(XmToggleButtonGetState(audio_alarm_config_play_on_new_station))
26526   {
26527     sound_play_new_station=1;
26528   }
26529   else
26530   {
26531     sound_play_new_station=0;
26532   }
26533 
26534   if(XmToggleButtonGetState(audio_alarm_config_play_on_new_message))
26535   {
26536     sound_play_new_message=1;
26537   }
26538   else
26539   {
26540     sound_play_new_message=0;
26541   }
26542 
26543   if(XmToggleButtonGetState(audio_alarm_config_play_on_prox))
26544   {
26545     sound_play_prox_message=1;
26546   }
26547   else
26548   {
26549     sound_play_prox_message=0;
26550   }
26551 
26552   if(XmToggleButtonGetState(audio_alarm_config_play_on_bando))
26553   {
26554     sound_play_band_open_message=1;
26555   }
26556   else
26557   {
26558     sound_play_band_open_message=0;
26559   }
26560 
26561   if(XmToggleButtonGetState(audio_alarm_config_play_on_wx_alert))
26562   {
26563     sound_play_wx_alert_message=1;
26564   }
26565   else
26566   {
26567     sound_play_wx_alert_message=0;
26568   }
26569 
26570   Configure_audio_alarm_destroy_shell(widget,clientData,callData);
26571 }
26572 
26573 
26574 
26575 
26576 
26577 void Configure_audio_alarms( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
26578 {
26579   static Widget pane, scrollwindow, my_form, button_ok, button_cancel,
26580          audio_play, file1, file2,
26581          min1, max1,
26582          minb1, maxb2,
26583          sep;
26584 //  static Widget min2, max2, minb2, maxb1;
26585   Atom delw;
26586 
26587   if (!configure_audio_alarm_dialog)
26588   {
26589     configure_audio_alarm_dialog = XtVaCreatePopupShell(langcode("WPUPCFA001"),
26590                                    xmDialogShellWidgetClass, appshell,
26591                                    XmNdeleteResponse, XmDESTROY,
26592                                    XmNdefaultPosition, FALSE,
26593                                    XmNfontList, fontlist1,
26594                                    NULL);
26595 
26596     pane = XtVaCreateWidget("Configure_audio_alarms pane",
26597                             xmPanedWindowWidgetClass,
26598                             configure_audio_alarm_dialog,
26599                             MY_FOREGROUND_COLOR,
26600                             MY_BACKGROUND_COLOR,
26601                             NULL);
26602 
26603     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
26604                                            xmScrolledWindowWidgetClass,
26605                                            pane,
26606                                            XmNscrollingPolicy, XmAUTOMATIC,
26607                                            NULL);
26608 
26609     my_form =  XtVaCreateWidget("Configure_audio_alarms my_form",
26610                                 xmFormWidgetClass,
26611                                 scrollwindow,
26612                                 XmNfractionBase, 3,
26613                                 XmNautoUnmanage, FALSE,
26614                                 XmNshadowThickness, 1,
26615                                 MY_FOREGROUND_COLOR,
26616                                 MY_BACKGROUND_COLOR,
26617                                 NULL);
26618 
26619     audio_play = XtVaCreateManagedWidget(langcode("WPUPCFA002"),
26620                                          xmLabelWidgetClass,
26621                                          my_form,
26622                                          XmNtopAttachment, XmATTACH_FORM,
26623                                          XmNtopOffset, 10,
26624                                          XmNbottomAttachment, XmATTACH_NONE,
26625                                          XmNleftAttachment, XmATTACH_FORM,
26626                                          XmNleftOffset, 10,
26627                                          XmNrightAttachment, XmATTACH_POSITION,
26628                                          XmNrightPosition, 1,
26629                                          MY_FOREGROUND_COLOR,
26630                                          MY_BACKGROUND_COLOR,
26631                                          XmNfontList, fontlist1,
26632                                          NULL);
26633 
26634     audio_alarm_config_play_data = XtVaCreateManagedWidget("Configure_audio_alarms Play Command",
26635                                    xmTextFieldWidgetClass,
26636                                    my_form,
26637                                    XmNeditable,   TRUE,
26638                                    XmNcursorPositionVisible, TRUE,
26639                                    XmNsensitive, TRUE,
26640                                    XmNshadowThickness,    1,
26641                                    XmNcolumns, 40,
26642                                    XmNwidth, ((40*7)+2),
26643                                    XmNmaxLength, 80,
26644                                    XmNbackground, colors[0x0f],
26645                                    XmNtopAttachment,XmATTACH_FORM,
26646                                    XmNtopOffset, 5,
26647                                    XmNbottomAttachment,XmATTACH_NONE,
26648                                    XmNleftAttachment, XmATTACH_POSITION,
26649                                    XmNleftPosition, 1,
26650                                    XmNrightAttachment,XmATTACH_FORM,
26651                                    XmNrightOffset, 10,
26652                                    XmNfontList, fontlist1,
26653                                    NULL);
26654 
26655 
26656     file1 = XtVaCreateManagedWidget(langcode("WPUPCFA003"),
26657                                     xmLabelWidgetClass,
26658                                     my_form,
26659                                     XmNtopAttachment, XmATTACH_WIDGET,
26660                                     XmNtopWidget, audio_play,
26661                                     XmNtopOffset, 20,
26662                                     XmNbottomAttachment, XmATTACH_NONE,
26663                                     XmNleftAttachment, XmATTACH_FORM,
26664                                     XmNleftOffset, 10,
26665                                     XmNrightAttachment, XmATTACH_POSITION,
26666                                     XmNrightPosition, 1,
26667                                     MY_FOREGROUND_COLOR,
26668                                     MY_BACKGROUND_COLOR,
26669                                     XmNfontList, fontlist1,
26670                                     NULL);
26671 
26672     file2 = XtVaCreateManagedWidget(langcode("WPUPCFA004"),
26673                                     xmLabelWidgetClass,
26674                                     my_form,
26675                                     XmNtopAttachment, XmATTACH_WIDGET,
26676                                     XmNtopWidget, audio_play,
26677                                     XmNtopOffset, 20,
26678                                     XmNbottomAttachment, XmATTACH_NONE,
26679                                     XmNleftAttachment, XmATTACH_POSITION,
26680                                     XmNleftPosition, 1,
26681                                     XmNrightAttachment, XmATTACH_FORM,
26682                                     XmNrightOffset, 10,
26683                                     MY_FOREGROUND_COLOR,
26684                                     MY_BACKGROUND_COLOR,
26685                                     XmNfontList, fontlist1,
26686                                     NULL);
26687 
26688     audio_alarm_config_play_on_new_station = XtVaCreateManagedWidget(langcode("WPUPCFA005"),
26689         xmToggleButtonWidgetClass,
26690         my_form,
26691         XmNtopAttachment, XmATTACH_WIDGET,
26692         XmNtopWidget, file1,
26693         XmNtopOffset, 10,
26694         XmNbottomAttachment, XmATTACH_NONE,
26695         XmNleftAttachment, XmATTACH_FORM,
26696         XmNleftOffset, 10,
26697         XmNrightAttachment, XmATTACH_POSITION,
26698         XmNrightPosition, 1,
26699         MY_FOREGROUND_COLOR,
26700         MY_BACKGROUND_COLOR,
26701         XmNfontList, fontlist1,
26702         NULL);
26703 
26704     audio_alarm_config_play_ons_data = XtVaCreateManagedWidget("Configure_audio_alarms Play Command NS",
26705                                        xmTextFieldWidgetClass,
26706                                        my_form,
26707                                        XmNeditable,   TRUE,
26708                                        XmNcursorPositionVisible, TRUE,
26709                                        XmNsensitive, TRUE,
26710                                        XmNshadowThickness,    1,
26711                                        XmNcolumns, 25,
26712                                        XmNwidth, ((25*7)+2),
26713                                        XmNmaxLength, 80,
26714                                        XmNbackground, colors[0x0f],
26715                                        XmNtopAttachment,XmATTACH_WIDGET,
26716                                        XmNtopWidget, file2,
26717                                        XmNtopOffset, 5,
26718                                        XmNbottomAttachment,XmATTACH_NONE,
26719                                        XmNleftAttachment, XmATTACH_POSITION,
26720                                        XmNleftPosition, 1,
26721                                        XmNleftWidget, audio_alarm_config_play_on_new_station,
26722                                        XmNrightAttachment,XmATTACH_FORM,
26723                                        XmNrightOffset, 10,
26724                                        XmNfontList, fontlist1,
26725                                        NULL);
26726 
26727     audio_alarm_config_play_on_new_message  = XtVaCreateManagedWidget(langcode("WPUPCFA006"),
26728         xmToggleButtonWidgetClass,
26729         my_form,
26730         XmNtopAttachment, XmATTACH_WIDGET,
26731         XmNtopWidget, audio_alarm_config_play_on_new_station,
26732         XmNtopOffset, 10,
26733         XmNbottomAttachment, XmATTACH_NONE,
26734         XmNleftAttachment, XmATTACH_FORM,
26735         XmNleftOffset, 10,
26736         XmNrightAttachment, XmATTACH_POSITION,
26737         XmNrightPosition, 1,
26738         MY_FOREGROUND_COLOR,
26739         MY_BACKGROUND_COLOR,
26740         XmNfontList, fontlist1,
26741         NULL);
26742 
26743     audio_alarm_config_play_onm_data = XtVaCreateManagedWidget("Configure_audio_alarms Play Command NM",
26744                                        xmTextFieldWidgetClass,
26745                                        my_form,
26746                                        XmNeditable,   TRUE,
26747                                        XmNcursorPositionVisible, TRUE,
26748                                        XmNsensitive, TRUE,
26749                                        XmNshadowThickness,    1,
26750                                        XmNcolumns, 25,
26751                                        XmNwidth, ((25*7)+2),
26752                                        XmNmaxLength, 80,
26753                                        XmNbackground, colors[0x0f],
26754                                        XmNtopAttachment,XmATTACH_WIDGET,
26755                                        XmNtopWidget, audio_alarm_config_play_on_new_station,
26756                                        XmNtopOffset, 5,
26757                                        XmNbottomAttachment,XmATTACH_NONE,
26758                                        XmNleftAttachment, XmATTACH_POSITION,
26759                                        XmNleftPosition, 1,
26760                                        XmNrightAttachment,XmATTACH_FORM,
26761                                        XmNrightOffset, 10,
26762                                        XmNfontList, fontlist1,
26763                                        NULL);
26764 
26765     audio_alarm_config_play_on_prox  = XtVaCreateManagedWidget(langcode("WPUPCFA007"),
26766                                        xmToggleButtonWidgetClass,
26767                                        my_form,
26768                                        XmNtopAttachment, XmATTACH_WIDGET,
26769                                        XmNtopWidget, audio_alarm_config_play_on_new_message,
26770                                        XmNtopOffset, 10,
26771                                        XmNbottomAttachment, XmATTACH_NONE,
26772                                        XmNleftAttachment, XmATTACH_FORM,
26773                                        XmNleftOffset,10,
26774                                        XmNrightAttachment, XmATTACH_POSITION,
26775                                        XmNrightPosition, 1,
26776                                        MY_FOREGROUND_COLOR,
26777                                        MY_BACKGROUND_COLOR,
26778                                        XmNfontList, fontlist1,
26779                                        NULL);
26780 
26781     audio_alarm_config_play_onpx_data = XtVaCreateManagedWidget("Configure_audio_alarms Play Command PROX",
26782                                         xmTextFieldWidgetClass,
26783                                         my_form,
26784                                         XmNeditable,   TRUE,
26785                                         XmNcursorPositionVisible, TRUE,
26786                                         XmNsensitive, TRUE,
26787                                         XmNshadowThickness,    1,
26788                                         XmNcolumns, 25,
26789                                         XmNwidth, ((25*7)+2),
26790                                         XmNmaxLength, 80,
26791                                         XmNbackground, colors[0x0f],
26792                                         XmNtopAttachment,XmATTACH_WIDGET,
26793                                         XmNtopWidget, audio_alarm_config_play_on_new_message,
26794                                         XmNtopOffset, 5,
26795                                         XmNbottomAttachment,XmATTACH_NONE,
26796                                         XmNleftAttachment, XmATTACH_POSITION,
26797                                         XmNleftPosition, 1,
26798                                         XmNrightAttachment,XmATTACH_FORM,
26799                                         XmNrightOffset, 10,
26800                                         XmNfontList, fontlist1,
26801                                         NULL);
26802 
26803     min1 = XtVaCreateManagedWidget(langcode("WPUPCFA009"),
26804                                    xmLabelWidgetClass,
26805                                    my_form,
26806                                    XmNtopAttachment, XmATTACH_WIDGET,
26807                                    XmNtopWidget, audio_alarm_config_play_on_prox,
26808                                    XmNtopOffset, 8,
26809                                    XmNbottomAttachment, XmATTACH_NONE,
26810                                    XmNleftAttachment, XmATTACH_FORM,
26811                                    XmNleftOffset, 10,
26812                                    XmNrightAttachment, XmATTACH_POSITION,
26813                                    XmNrightPosition, 1,
26814                                    MY_FOREGROUND_COLOR,
26815                                    MY_BACKGROUND_COLOR,
26816                                    XmNfontList, fontlist1,
26817                                    NULL);
26818 
26819     prox_min_data = XtVaCreateManagedWidget("Configure_audio_alarms prox min",
26820                                             xmTextFieldWidgetClass,
26821                                             my_form,
26822                                             XmNeditable,   TRUE,
26823                                             XmNcursorPositionVisible, TRUE,
26824                                             XmNsensitive, TRUE,
26825                                             XmNshadowThickness,    1,
26826                                             XmNcolumns, 10,
26827                                             XmNwidth, ((10*7)+2),
26828                                             XmNmaxLength, 20,
26829                                             XmNbackground, colors[0x0f],
26830                                             XmNtopAttachment,XmATTACH_WIDGET,
26831                                             XmNtopWidget, audio_alarm_config_play_onpx_data,
26832                                             XmNtopOffset, 2,
26833                                             XmNbottomAttachment,XmATTACH_NONE,
26834                                             XmNleftAttachment, XmATTACH_POSITION,
26835                                             XmNleftPosition, 1,
26836                                             XmNrightAttachment,XmATTACH_POSITION,
26837                                             XmNrightPosition, 2,
26838                                             XmNfontList, fontlist1,
26839                                             NULL);
26840 
26841     //min2
26842     XtVaCreateManagedWidget(english_units?langcode("UNIOP00004"):langcode("UNIOP00005"),
26843                             xmLabelWidgetClass,
26844                             my_form,
26845                             XmNtopAttachment, XmATTACH_WIDGET,
26846                             XmNtopWidget, audio_alarm_config_play_on_prox,
26847                             XmNtopOffset, 10,
26848                             XmNbottomAttachment, XmATTACH_NONE,
26849                             XmNleftAttachment, XmATTACH_POSITION,
26850                             XmNleftPosition, 2,
26851                             XmNrightAttachment, XmATTACH_FORM,
26852                             XmNrightOffset, 10,
26853                             MY_FOREGROUND_COLOR,
26854                             MY_BACKGROUND_COLOR,
26855                             XmNfontList, fontlist1,
26856                             NULL);
26857 
26858     max1 = XtVaCreateManagedWidget(langcode("WPUPCFA010"),
26859                                    xmLabelWidgetClass,
26860                                    my_form,
26861                                    XmNtopAttachment, XmATTACH_WIDGET,
26862                                    XmNtopWidget, min1,
26863                                    XmNtopOffset, 12,
26864                                    XmNbottomAttachment, XmATTACH_NONE,
26865                                    XmNleftAttachment, XmATTACH_FORM,
26866                                    XmNleftOffset, 10,
26867                                    XmNrightAttachment, XmATTACH_POSITION,
26868                                    XmNrightPosition, 1,
26869                                    MY_FOREGROUND_COLOR,
26870                                    MY_BACKGROUND_COLOR,
26871                                    XmNfontList, fontlist1,
26872                                    NULL);
26873 
26874     prox_max_data = XtVaCreateManagedWidget("Configure_audio_alarms prox max",
26875                                             xmTextFieldWidgetClass,
26876                                             my_form,
26877                                             XmNeditable,   TRUE,
26878                                             XmNcursorPositionVisible, TRUE,
26879                                             XmNsensitive, TRUE,
26880                                             XmNshadowThickness,    1,
26881                                             XmNcolumns, 10,
26882                                             XmNwidth, ((10*7)+2),
26883                                             XmNmaxLength, 20,
26884                                             XmNbackground, colors[0x0f],
26885                                             XmNtopAttachment,XmATTACH_WIDGET,
26886                                             XmNtopWidget, prox_min_data,
26887                                             XmNtopOffset, 2,
26888                                             XmNbottomAttachment,XmATTACH_NONE,
26889                                             XmNleftAttachment, XmATTACH_POSITION,
26890                                             XmNleftPosition, 1,
26891                                             XmNrightAttachment,XmATTACH_POSITION,
26892                                             XmNrightPosition, 2,
26893                                             XmNfontList, fontlist1,
26894                                             NULL);
26895 
26896     //max2
26897     XtVaCreateManagedWidget(english_units?langcode("UNIOP00004"):langcode("UNIOP00005"),
26898                             xmLabelWidgetClass,
26899                             my_form,
26900                             XmNtopAttachment, XmATTACH_WIDGET,
26901                             XmNtopWidget, min1,
26902                             XmNtopOffset, 14,
26903                             XmNbottomAttachment, XmATTACH_NONE,
26904                             XmNleftAttachment, XmATTACH_POSITION,
26905                             XmNleftPosition, 2,
26906                             XmNrightAttachment, XmATTACH_FORM,
26907                             XmNrightOffset, 10,
26908                             MY_FOREGROUND_COLOR,
26909                             MY_BACKGROUND_COLOR,
26910                             XmNfontList, fontlist1,
26911                             NULL);
26912 
26913     audio_alarm_config_play_on_bando  = XtVaCreateManagedWidget(langcode("WPUPCFA008"),
26914                                         xmToggleButtonWidgetClass,
26915                                         my_form,
26916                                         XmNtopAttachment, XmATTACH_WIDGET,
26917                                         XmNtopWidget, max1,
26918                                         XmNtopOffset, 12,
26919                                         XmNbottomAttachment, XmATTACH_NONE,
26920                                         XmNleftAttachment, XmATTACH_FORM,
26921                                         XmNleftOffset, 10,
26922                                         XmNrightAttachment, XmATTACH_POSITION,
26923                                         XmNrightPosition, 1,
26924                                         MY_FOREGROUND_COLOR,
26925                                         MY_BACKGROUND_COLOR,
26926                                         XmNfontList, fontlist1,
26927                                         NULL);
26928 
26929     audio_alarm_config_play_onbo_data = XtVaCreateManagedWidget("Configure_audio_alarms Play Command BAND",
26930                                         xmTextFieldWidgetClass,
26931                                         my_form,
26932                                         XmNeditable,   TRUE,
26933                                         XmNcursorPositionVisible, TRUE,
26934                                         XmNsensitive, TRUE,
26935                                         XmNshadowThickness,    1,
26936                                         XmNcolumns, 25,
26937                                         XmNwidth, ((25*7)+2),
26938                                         XmNmaxLength, 80,
26939                                         XmNbackground, colors[0x0f],
26940                                         XmNtopAttachment,XmATTACH_WIDGET,
26941                                         XmNtopWidget, prox_max_data,
26942                                         XmNtopOffset, 5,
26943                                         XmNbottomAttachment,XmATTACH_NONE,
26944                                         XmNleftAttachment, XmATTACH_POSITION,
26945                                         XmNleftPosition, 1,
26946                                         XmNrightAttachment,XmATTACH_FORM,
26947                                         XmNrightOffset, 10,
26948                                         XmNfontList, fontlist1,
26949                                         NULL);
26950 
26951     minb1 = XtVaCreateManagedWidget(langcode("WPUPCFA009"),
26952                                     xmLabelWidgetClass,
26953                                     my_form,
26954                                     XmNtopAttachment, XmATTACH_WIDGET,
26955                                     XmNtopWidget, audio_alarm_config_play_on_bando,
26956                                     XmNtopOffset, 12,
26957                                     XmNbottomAttachment, XmATTACH_NONE,
26958                                     XmNleftAttachment, XmATTACH_FORM,
26959                                     XmNleftOffset, 10,
26960                                     XmNrightAttachment, XmATTACH_POSITION,
26961                                     XmNrightPosition, 1,
26962                                     MY_FOREGROUND_COLOR,
26963                                     MY_BACKGROUND_COLOR,
26964                                     XmNfontList, fontlist1,
26965                                     NULL);
26966 
26967     bando_min_data = XtVaCreateManagedWidget("Configure_audio_alarms bando min",
26968                      xmTextFieldWidgetClass,
26969                      my_form,
26970                      XmNeditable,   TRUE,
26971                      XmNcursorPositionVisible, TRUE,
26972                      XmNsensitive, TRUE,
26973                      XmNshadowThickness,    1,
26974                      XmNcolumns, 12,
26975                      XmNwidth, ((10*7)+2),
26976                      XmNmaxLength, 20,
26977                      XmNbackground, colors[0x0f],
26978                      XmNtopAttachment,XmATTACH_WIDGET,
26979                      XmNtopWidget, audio_alarm_config_play_onbo_data,
26980                      XmNtopOffset, 2,
26981                      XmNbottomAttachment,XmATTACH_NONE,
26982                      XmNleftAttachment, XmATTACH_POSITION,
26983                      XmNleftPosition, 1,
26984                      XmNrightAttachment,XmATTACH_POSITION,
26985                      XmNrightPosition, 2,
26986                      XmNfontList, fontlist1,
26987                      NULL);
26988 
26989     //minb2
26990     XtVaCreateManagedWidget(english_units?langcode("UNIOP00004"):langcode("UNIOP00005"),
26991                             xmLabelWidgetClass,
26992                             my_form,
26993                             XmNtopAttachment, XmATTACH_WIDGET,
26994                             XmNtopWidget, audio_alarm_config_play_on_bando,
26995                             XmNtopOffset, 14,
26996                             XmNbottomAttachment, XmATTACH_NONE,
26997                             XmNleftAttachment, XmATTACH_POSITION,
26998                             XmNleftPosition, 2,
26999                             XmNrightAttachment, XmATTACH_FORM,
27000                             XmNrightOffset, 10,
27001                             MY_FOREGROUND_COLOR,
27002                             MY_BACKGROUND_COLOR,
27003                             XmNfontList, fontlist1,
27004                             NULL);
27005 
27006     //maxb1
27007     XtVaCreateManagedWidget(langcode("WPUPCFA010"),
27008                             xmLabelWidgetClass,
27009                             my_form,
27010                             XmNtopAttachment, XmATTACH_WIDGET,
27011                             XmNtopWidget, minb1,
27012                             XmNtopOffset, 12,
27013                             XmNbottomAttachment, XmATTACH_NONE,
27014                             XmNleftAttachment, XmATTACH_FORM,
27015                             XmNleftOffset, 10,
27016                             XmNrightAttachment, XmATTACH_POSITION,
27017                             XmNrightPosition, 1,
27018                             MY_FOREGROUND_COLOR,
27019                             MY_BACKGROUND_COLOR,
27020                             XmNfontList, fontlist1,
27021                             NULL);
27022 
27023     bando_max_data = XtVaCreateManagedWidget("Configure_audio_alarms bando max",
27024                      xmTextFieldWidgetClass,
27025                      my_form,
27026                      XmNeditable,   TRUE,
27027                      XmNcursorPositionVisible, TRUE,
27028                      XmNsensitive, TRUE,
27029                      XmNshadowThickness,    1,
27030                      XmNcolumns, 10,
27031                      XmNwidth, ((10*7)+2),
27032                      XmNmaxLength, 20,
27033                      XmNbackground, colors[0x0f],
27034                      XmNtopAttachment,XmATTACH_WIDGET,
27035                      XmNtopWidget, bando_min_data,
27036                      XmNtopOffset, 2,
27037                      XmNbottomAttachment,XmATTACH_NONE,
27038                      XmNleftAttachment, XmATTACH_POSITION,
27039                      XmNleftPosition, 1,
27040                      XmNrightAttachment,XmATTACH_POSITION,
27041                      XmNrightPosition, 2,
27042                      XmNfontList, fontlist1,
27043                      NULL);
27044 
27045     maxb2 = XtVaCreateManagedWidget(english_units?langcode("UNIOP00004"):langcode("UNIOP00005"),
27046                                     xmLabelWidgetClass,
27047                                     my_form,
27048                                     XmNtopAttachment, XmATTACH_WIDGET,
27049                                     XmNtopWidget, minb1,
27050                                     XmNtopOffset, 14,
27051                                     XmNbottomAttachment, XmATTACH_NONE,
27052                                     XmNleftAttachment, XmATTACH_POSITION,
27053                                     XmNleftPosition, 2,
27054                                     XmNrightAttachment, XmATTACH_FORM,
27055                                     XmNrightOffset, 10,
27056                                     MY_FOREGROUND_COLOR,
27057                                     MY_BACKGROUND_COLOR,
27058                                     XmNfontList, fontlist1,
27059                                     NULL);
27060 
27061     audio_alarm_config_play_on_wx_alert  = XtVaCreateManagedWidget(langcode("WPUPCFA011"),
27062                                            xmToggleButtonWidgetClass,
27063                                            my_form,
27064                                            XmNtopAttachment, XmATTACH_WIDGET,
27065                                            XmNtopWidget, maxb2,
27066                                            XmNtopOffset, 12,
27067                                            XmNbottomAttachment, XmATTACH_NONE,
27068                                            XmNleftAttachment, XmATTACH_FORM,
27069                                            XmNleftOffset, 10,
27070                                            XmNrightAttachment, XmATTACH_POSITION,
27071                                            XmNrightPosition, 1,
27072                                            MY_FOREGROUND_COLOR,
27073                                            MY_BACKGROUND_COLOR,
27074                                            XmNfontList, fontlist1,
27075                                            NULL);
27076 
27077     audio_alarm_config_wx_alert_data = XtVaCreateManagedWidget("Configure_audio_alarms Play Command WxAlert",
27078                                        xmTextFieldWidgetClass,
27079                                        my_form,
27080                                        XmNeditable, TRUE,
27081                                        XmNcursorPositionVisible, TRUE,
27082                                        XmNsensitive, TRUE,
27083                                        XmNshadowThickness, 1,
27084                                        XmNcolumns, 25,
27085                                        XmNwidth, ((25*7)+2),
27086                                        XmNmaxLength, 80,
27087                                        XmNbackground, colors[0x0f],
27088                                        XmNtopAttachment,XmATTACH_WIDGET,
27089                                        XmNtopWidget, bando_max_data,
27090                                        XmNtopOffset, 5,
27091                                        XmNbottomAttachment, XmATTACH_NONE,
27092                                        XmNleftAttachment, XmATTACH_POSITION,
27093                                        XmNleftPosition, 1,
27094                                        XmNrightAttachment, XmATTACH_FORM,
27095                                        XmNrightOffset, 10,
27096                                        XmNfontList, fontlist1,
27097                                        NULL);
27098 
27099     sep = XtVaCreateManagedWidget("Configure_audio_alarms sep",
27100                                   xmSeparatorGadgetClass,
27101                                   my_form,
27102                                   XmNorientation, XmHORIZONTAL,
27103                                   XmNtopAttachment,XmATTACH_WIDGET,
27104                                   XmNtopWidget, audio_alarm_config_play_on_wx_alert,
27105                                   XmNtopOffset, 20,
27106                                   XmNbottomAttachment,XmATTACH_NONE,
27107                                   XmNleftAttachment, XmATTACH_FORM,
27108                                   XmNrightAttachment,XmATTACH_FORM,
27109                                   MY_FOREGROUND_COLOR,
27110                                   MY_BACKGROUND_COLOR,
27111                                   XmNfontList, fontlist1,
27112                                   NULL);
27113 
27114     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
27115                                         xmPushButtonGadgetClass,
27116                                         my_form,
27117                                         XmNtopAttachment, XmATTACH_WIDGET,
27118                                         XmNtopWidget, sep,
27119                                         XmNtopOffset, 5,
27120                                         XmNbottomAttachment, XmATTACH_FORM,
27121                                         XmNbottomOffset, 5,
27122                                         XmNleftAttachment, XmATTACH_POSITION,
27123                                         XmNleftPosition, 0,
27124                                         XmNrightAttachment, XmATTACH_POSITION,
27125                                         XmNrightPosition, 1,
27126                                         XmNnavigationType, XmTAB_GROUP,
27127                                         MY_FOREGROUND_COLOR,
27128                                         MY_BACKGROUND_COLOR,
27129                                         XmNfontList, fontlist1,
27130                                         NULL);
27131 
27132     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
27133                                             xmPushButtonGadgetClass,
27134                                             my_form,
27135                                             XmNtopAttachment, XmATTACH_WIDGET,
27136                                             XmNtopWidget, sep,
27137                                             XmNtopOffset, 5,
27138                                             XmNbottomAttachment, XmATTACH_FORM,
27139                                             XmNbottomOffset, 5,
27140                                             XmNleftAttachment, XmATTACH_POSITION,
27141                                             XmNleftPosition, 2,
27142                                             XmNrightAttachment, XmATTACH_POSITION,
27143                                             XmNrightPosition, 3,
27144                                             XmNnavigationType, XmTAB_GROUP,
27145                                             MY_FOREGROUND_COLOR,
27146                                             MY_BACKGROUND_COLOR,
27147                                             XmNfontList, fontlist1,
27148                                             NULL);
27149 
27150     XtAddCallback(button_ok, XmNactivateCallback, Configure_audio_alarm_change_data, configure_audio_alarm_dialog);
27151     XtAddCallback(button_cancel, XmNactivateCallback, Configure_audio_alarm_destroy_shell, configure_audio_alarm_dialog);
27152 
27153     pos_dialog(configure_audio_alarm_dialog);
27154 
27155     delw = XmInternAtom(XtDisplay(configure_audio_alarm_dialog),"WM_DELETE_WINDOW", FALSE);
27156     XmAddWMProtocolCallback(configure_audio_alarm_dialog, delw, Configure_audio_alarm_destroy_shell,
27157                             (XtPointer)configure_audio_alarm_dialog);
27158 
27159     XmTextFieldSetString(audio_alarm_config_play_data,sound_command);
27160     XmTextFieldSetString(audio_alarm_config_play_ons_data,sound_new_station);
27161     XmTextFieldSetString(audio_alarm_config_play_onm_data,sound_new_message);
27162     XmTextFieldSetString(audio_alarm_config_play_onpx_data,sound_prox_message);
27163     XmTextFieldSetString(prox_min_data,prox_min);
27164     XmTextFieldSetString(prox_max_data,prox_max);
27165     XmTextFieldSetString(audio_alarm_config_play_onbo_data,sound_band_open_message);
27166     XmTextFieldSetString(bando_min_data,bando_min);
27167     XmTextFieldSetString(bando_max_data,bando_max);
27168     XmTextFieldSetString(audio_alarm_config_wx_alert_data, sound_wx_alert_message);
27169 
27170     if(sound_play_new_station)
27171     {
27172       XmToggleButtonSetState(audio_alarm_config_play_on_new_station,TRUE,FALSE);
27173     }
27174     else
27175     {
27176       XmToggleButtonSetState(audio_alarm_config_play_on_new_station,FALSE,FALSE);
27177     }
27178 
27179     if(sound_play_new_message)
27180     {
27181       XmToggleButtonSetState(audio_alarm_config_play_on_new_message,TRUE,FALSE);
27182     }
27183     else
27184     {
27185       XmToggleButtonSetState(audio_alarm_config_play_on_new_message,FALSE,FALSE);
27186     }
27187 
27188     if(sound_play_prox_message)
27189     {
27190       XmToggleButtonSetState(audio_alarm_config_play_on_prox,TRUE,FALSE);
27191     }
27192     else
27193     {
27194       XmToggleButtonSetState(audio_alarm_config_play_on_prox,FALSE,FALSE);
27195     }
27196 
27197     if(sound_play_band_open_message)
27198     {
27199       XmToggleButtonSetState(audio_alarm_config_play_on_bando,TRUE,FALSE);
27200     }
27201     else
27202     {
27203       XmToggleButtonSetState(audio_alarm_config_play_on_bando,FALSE,FALSE);
27204     }
27205 
27206     if (sound_play_wx_alert_message)
27207     {
27208       XmToggleButtonSetState(audio_alarm_config_play_on_wx_alert, TRUE, FALSE);
27209     }
27210     else
27211     {
27212       XmToggleButtonSetState(audio_alarm_config_play_on_wx_alert, FALSE, FALSE);
27213     }
27214 
27215     XtManageChild(my_form);
27216     XtManageChild(pane);
27217 
27218     resize_dialog(my_form, configure_audio_alarm_dialog);
27219 
27220     XtPopup(configure_audio_alarm_dialog,XtGrabNone);
27221 
27222     // Move focus to the Cancel button.  This appears to highlight the
27223     // button fine, but we're not able to hit the <Enter> key to
27224     // have that default function happen.  Note:  We _can_ hit the
27225     // <SPACE> key, and that activates the option.
27226 //        XmUpdateDisplay(configure_audio_alarm_dialog);
27227     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
27228 
27229   }
27230   else
27231   {
27232     (void)XRaiseWindow(XtDisplay(configure_audio_alarm_dialog), XtWindow(configure_audio_alarm_dialog));
27233   }
27234 
27235 }
27236 
27237 
27238 
27239 
27240 
27241 /////////////////////////////////////   Configure Speech Dialog   //////////////////////////////////
27242 
27243 
27244 void Configure_speech_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
27245 {
27246   Widget shell = (Widget) clientData;
27247   XtPopdown(shell);
27248   XtDestroyWidget(shell);
27249   configure_speech_dialog = (Widget)NULL;
27250 }
27251 
27252 
27253 
27254 
27255 
27256 void Test_speech(Widget UNUSED(widget), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
27257 {
27258   SayText(SPEECH_TEST_STRING);
27259 }
27260 
27261 
27262 
27263 
27264 
27265 void Configure_speech_change_data(Widget widget, XtPointer clientData, XtPointer callData)
27266 {
27267 
27268   if(XmToggleButtonGetState(speech_config_play_on_new_station))
27269   {
27270     festival_speak_new_station=1;
27271   }
27272   else
27273   {
27274     festival_speak_new_station=0;
27275   }
27276 
27277   if(XmToggleButtonGetState(speech_config_play_on_new_message_alert))
27278   {
27279     festival_speak_new_message_alert=1;
27280   }
27281   else
27282   {
27283     festival_speak_new_message_alert=0;
27284   }
27285 
27286   if(XmToggleButtonGetState(speech_config_play_on_new_message_body))
27287   {
27288     festival_speak_new_message_body=1;
27289   }
27290   else
27291   {
27292     festival_speak_new_message_body=0;
27293   }
27294 
27295   if(XmToggleButtonGetState(speech_config_play_on_prox))
27296   {
27297     festival_speak_proximity_alert=1;
27298   }
27299   else
27300   {
27301     festival_speak_proximity_alert=0;
27302   }
27303 
27304   if(XmToggleButtonGetState(speech_config_play_on_trak))
27305   {
27306     festival_speak_tracked_proximity_alert=1;
27307   }
27308   else
27309   {
27310     festival_speak_tracked_proximity_alert=0;
27311   }
27312 
27313   if(XmToggleButtonGetState(speech_config_play_on_bando))
27314   {
27315     festival_speak_band_opening=1;
27316   }
27317   else
27318   {
27319     festival_speak_band_opening=0;
27320   }
27321 
27322   if(XmToggleButtonGetState(speech_config_play_on_new_wx_alert))
27323   {
27324     festival_speak_new_weather_alert=1;
27325   }
27326   else
27327   {
27328     festival_speak_new_weather_alert=0;
27329   }
27330 
27331   Configure_speech_destroy_shell(widget,clientData,callData);
27332 }
27333 
27334 
27335 
27336 
27337 
27338 //Make it helpful - Gray the config selections, but add a choice
27339 //that basicly pops up a box that says where to get Festival, have
27340 //it be ungrayed if Festival isn't installed.
27341 
27342 void Configure_speech( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
27343 {
27344   static Widget pane, scrollwindow, my_form, button_ok, button_cancel, file1,
27345          sep, button_test;
27346   Atom delw;
27347 
27348   if (!configure_speech_dialog)
27349   {
27350     configure_speech_dialog = XtVaCreatePopupShell(langcode("WPUPCFSP01"),
27351                               xmDialogShellWidgetClass, appshell,
27352                               XmNdeleteResponse, XmDESTROY,
27353                               XmNdefaultPosition, FALSE,
27354                               XmNfontList, fontlist1,
27355                               NULL);
27356 
27357     pane = XtVaCreateWidget("Configure_speech pane",
27358                             xmPanedWindowWidgetClass,
27359                             configure_speech_dialog,
27360                             MY_FOREGROUND_COLOR,
27361                             MY_BACKGROUND_COLOR,
27362                             NULL);
27363 
27364     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
27365                                            xmScrolledWindowWidgetClass,
27366                                            pane,
27367                                            XmNscrollingPolicy, XmAUTOMATIC,
27368                                            NULL);
27369 
27370     my_form =  XtVaCreateWidget("Configure_speech my_form",
27371                                 xmFormWidgetClass,
27372                                 scrollwindow,
27373                                 XmNfractionBase, 5,
27374                                 XmNautoUnmanage, FALSE,
27375                                 XmNshadowThickness, 1,
27376                                 MY_FOREGROUND_COLOR,
27377                                 MY_BACKGROUND_COLOR,
27378                                 NULL);
27379 
27380     file1 = XtVaCreateManagedWidget(langcode("WPUPCFSP02"),
27381                                     xmLabelWidgetClass,
27382                                     my_form,
27383                                     XmNtopAttachment, XmATTACH_FORM,
27384                                     XmNtopOffset, 20,
27385                                     XmNbottomAttachment, XmATTACH_NONE,
27386                                     XmNleftAttachment, XmATTACH_FORM,
27387                                     XmNleftOffset, 10,
27388                                     XmNrightAttachment, XmATTACH_NONE,
27389                                     MY_FOREGROUND_COLOR,
27390                                     MY_BACKGROUND_COLOR,
27391                                     XmNfontList, fontlist1,
27392                                     NULL);
27393 
27394     speech_config_play_on_new_station  = XtVaCreateManagedWidget(langcode("WPUPCFSP03"),
27395                                          xmToggleButtonWidgetClass,
27396                                          my_form,
27397                                          XmNtopAttachment, XmATTACH_WIDGET,
27398                                          XmNtopWidget, file1,
27399                                          XmNtopOffset, 10,
27400                                          XmNbottomAttachment, XmATTACH_NONE,
27401                                          XmNleftAttachment, XmATTACH_FORM,
27402                                          XmNleftOffset,10,
27403                                          XmNrightAttachment, XmATTACH_NONE,
27404 #ifndef HAVE_FESTIVAL
27405                                          XmNsensitive, FALSE,
27406 #endif /* HAVE_FESTIVAL */
27407                                          MY_FOREGROUND_COLOR,
27408                                          MY_BACKGROUND_COLOR,
27409                                          XmNfontList, fontlist1,
27410                                          NULL);
27411 
27412     speech_config_play_on_new_message_alert  = XtVaCreateManagedWidget(langcode("WPUPCFSP04"),
27413         xmToggleButtonWidgetClass,
27414         my_form,
27415         XmNtopAttachment, XmATTACH_WIDGET,
27416         XmNtopWidget, speech_config_play_on_new_station,
27417         XmNtopOffset, 10,
27418         XmNbottomAttachment, XmATTACH_NONE,
27419         XmNleftAttachment, XmATTACH_POSITION,
27420         XmNleftPosition, 0,
27421         XmNleftOffset,10,
27422         XmNrightAttachment, XmATTACH_NONE,
27423 #ifndef HAVE_FESTIVAL
27424         XmNsensitive, FALSE,
27425 #endif /* HAVE_FESTIVAL */
27426         MY_FOREGROUND_COLOR,
27427         MY_BACKGROUND_COLOR,
27428         XmNfontList, fontlist1,
27429         NULL);
27430 
27431     speech_config_play_on_new_message_body  = XtVaCreateManagedWidget(langcode("WPUPCFSP05"),
27432         xmToggleButtonWidgetClass,
27433         my_form,
27434         XmNtopAttachment, XmATTACH_WIDGET,
27435         XmNtopWidget, speech_config_play_on_new_message_alert,
27436         XmNtopOffset, 10,
27437         XmNbottomAttachment, XmATTACH_NONE,
27438         XmNleftAttachment, XmATTACH_POSITION,
27439         XmNleftPosition, 0,
27440         XmNleftOffset,10,
27441         XmNrightAttachment, XmATTACH_NONE,
27442 #ifndef HAVE_FESTIVAL
27443         XmNsensitive, FALSE,
27444 #endif /* HAVE_FESTIVAL */
27445         MY_FOREGROUND_COLOR,
27446         MY_BACKGROUND_COLOR,
27447         XmNfontList, fontlist1,
27448         NULL);
27449 
27450     speech_config_play_on_prox  = XtVaCreateManagedWidget(langcode("WPUPCFSP06"),
27451                                   xmToggleButtonWidgetClass,
27452                                   my_form,
27453                                   XmNtopAttachment, XmATTACH_WIDGET,
27454                                   XmNtopWidget, speech_config_play_on_new_message_body,
27455                                   XmNtopOffset, 10,
27456                                   XmNbottomAttachment, XmATTACH_NONE,
27457                                   XmNleftAttachment, XmATTACH_POSITION,
27458                                   XmNleftPosition, 0,
27459                                   XmNleftOffset,10,
27460                                   XmNrightAttachment, XmATTACH_NONE,
27461 #ifndef HAVE_FESTIVAL
27462                                   XmNsensitive, FALSE,
27463 #endif /* HAVE_FESTIVAL */
27464                                   MY_FOREGROUND_COLOR,
27465                                   MY_BACKGROUND_COLOR,
27466                                   XmNfontList, fontlist1,
27467                                   NULL);
27468 
27469     speech_config_play_on_trak  = XtVaCreateManagedWidget(langcode("WPUPCFSP09"),
27470                                   xmToggleButtonWidgetClass,
27471                                   my_form,
27472                                   XmNtopAttachment, XmATTACH_WIDGET,
27473                                   XmNtopWidget, speech_config_play_on_prox,
27474                                   XmNtopOffset, 10,
27475                                   XmNbottomAttachment, XmATTACH_NONE,
27476                                   XmNleftAttachment, XmATTACH_POSITION,
27477                                   XmNleftPosition, 0,
27478                                   XmNleftOffset,10,
27479                                   XmNrightAttachment, XmATTACH_NONE,
27480 #ifndef HAVE_FESTIVAL
27481                                   XmNsensitive, FALSE,
27482 #endif /* HAVE_FESTIVAL */
27483                                   MY_FOREGROUND_COLOR,
27484                                   MY_BACKGROUND_COLOR,
27485                                   XmNfontList, fontlist1,
27486                                   NULL);
27487 
27488     speech_config_play_on_bando  = XtVaCreateManagedWidget(langcode("WPUPCFSP07"),
27489                                    xmToggleButtonWidgetClass,
27490                                    my_form,
27491                                    XmNtopAttachment, XmATTACH_WIDGET,
27492                                    XmNtopWidget, speech_config_play_on_trak,
27493                                    XmNtopOffset, 12,
27494                                    XmNbottomAttachment, XmATTACH_NONE,
27495                                    XmNleftAttachment, XmATTACH_POSITION,
27496                                    XmNleftPosition, 0,
27497                                    XmNleftOffset,10,
27498                                    XmNrightAttachment, XmATTACH_NONE,
27499 #ifndef HAVE_FESTIVAL
27500                                    XmNsensitive, FALSE,
27501 #endif /* HAVE_FESTIVAL */
27502                                    MY_FOREGROUND_COLOR,
27503                                    MY_BACKGROUND_COLOR,
27504                                    XmNfontList, fontlist1,
27505                                    NULL);
27506 
27507     speech_config_play_on_new_wx_alert  = XtVaCreateManagedWidget(langcode("WPUPCFSP08"),
27508                                           xmToggleButtonWidgetClass,
27509                                           my_form,
27510                                           XmNtopAttachment, XmATTACH_WIDGET,
27511                                           XmNtopWidget, speech_config_play_on_bando,
27512                                           XmNtopOffset, 12,
27513                                           XmNbottomAttachment, XmATTACH_NONE,
27514                                           XmNleftAttachment, XmATTACH_POSITION,
27515                                           XmNleftPosition, 0,
27516                                           XmNleftOffset,10,
27517                                           XmNrightAttachment, XmATTACH_NONE,
27518 #ifndef HAVE_FESTIVAL
27519                                           XmNsensitive, FALSE,
27520 #endif /* HAVE_FESTIVAL */
27521                                           MY_FOREGROUND_COLOR,
27522                                           MY_BACKGROUND_COLOR,
27523                                           XmNfontList, fontlist1,
27524                                           NULL);
27525 
27526 
27527     sep = XtVaCreateManagedWidget("Configure_speech sep",
27528                                   xmSeparatorGadgetClass,
27529                                   my_form,
27530                                   XmNorientation, XmHORIZONTAL,
27531                                   XmNtopAttachment,XmATTACH_WIDGET,
27532                                   XmNtopWidget, speech_config_play_on_new_wx_alert,
27533                                   XmNtopOffset, 20,
27534                                   XmNbottomAttachment,XmATTACH_NONE,
27535                                   XmNleftAttachment, XmATTACH_FORM,
27536                                   XmNrightAttachment,XmATTACH_FORM,
27537                                   MY_FOREGROUND_COLOR,
27538                                   MY_BACKGROUND_COLOR,
27539                                   XmNfontList, fontlist1,
27540                                   NULL);
27541 
27542     button_test = XtVaCreateManagedWidget(langcode("PULDNFI003"),
27543                                           xmPushButtonGadgetClass,
27544                                           my_form,
27545                                           XmNtopAttachment, XmATTACH_WIDGET,
27546                                           XmNtopWidget, sep,
27547                                           XmNtopOffset, 5,
27548                                           XmNbottomAttachment, XmATTACH_FORM,
27549                                           XmNbottomOffset, 5,
27550                                           XmNleftAttachment, XmATTACH_POSITION,
27551                                           XmNleftPosition, 0,
27552                                           XmNrightAttachment, XmATTACH_POSITION,
27553                                           XmNrightPosition, 1,
27554                                           XmNnavigationType, XmTAB_GROUP,
27555                                           MY_FOREGROUND_COLOR,
27556                                           MY_BACKGROUND_COLOR,
27557                                           XmNfontList, fontlist1,
27558                                           NULL);
27559 
27560     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
27561                                         xmPushButtonGadgetClass,
27562                                         my_form,
27563                                         XmNtopAttachment, XmATTACH_WIDGET,
27564                                         XmNtopWidget, sep,
27565                                         XmNtopOffset, 5,
27566                                         XmNbottomAttachment, XmATTACH_FORM,
27567                                         XmNbottomOffset, 5,
27568                                         XmNleftAttachment, XmATTACH_POSITION,
27569                                         XmNleftPosition, 2,
27570                                         XmNrightAttachment, XmATTACH_POSITION,
27571                                         XmNrightPosition, 3,
27572                                         XmNnavigationType, XmTAB_GROUP,
27573                                         MY_FOREGROUND_COLOR,
27574                                         MY_BACKGROUND_COLOR,
27575                                         XmNfontList, fontlist1,
27576                                         NULL);
27577 
27578     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
27579                                             xmPushButtonGadgetClass,
27580                                             my_form,
27581                                             XmNtopAttachment, XmATTACH_WIDGET,
27582                                             XmNtopWidget, sep,
27583                                             XmNtopOffset, 5,
27584                                             XmNbottomAttachment, XmATTACH_FORM,
27585                                             XmNbottomOffset, 5,
27586                                             XmNleftAttachment, XmATTACH_POSITION,
27587                                             XmNleftPosition, 4,
27588                                             XmNrightAttachment, XmATTACH_POSITION,
27589                                             XmNrightPosition, 5,
27590                                             XmNnavigationType, XmTAB_GROUP,
27591                                             MY_FOREGROUND_COLOR,
27592                                             MY_BACKGROUND_COLOR,
27593                                             XmNfontList, fontlist1,
27594                                             NULL);
27595 
27596     XtAddCallback(button_test, XmNactivateCallback, Test_speech, configure_speech_dialog);
27597     XtAddCallback(button_ok, XmNactivateCallback, Configure_speech_change_data, configure_speech_dialog);
27598     XtAddCallback(button_cancel, XmNactivateCallback, Configure_speech_destroy_shell, configure_speech_dialog);
27599 
27600     pos_dialog(configure_speech_dialog);
27601 
27602     delw = XmInternAtom(XtDisplay(configure_speech_dialog),"WM_DELETE_WINDOW", FALSE);
27603     XmAddWMProtocolCallback(configure_speech_dialog, delw, Configure_speech_destroy_shell,
27604                             (XtPointer)configure_speech_dialog);
27605 
27606 
27607     if(festival_speak_new_station)
27608     {
27609       XmToggleButtonSetState(speech_config_play_on_new_station,TRUE,FALSE);
27610     }
27611     else
27612     {
27613       XmToggleButtonSetState(speech_config_play_on_new_station,FALSE,FALSE);
27614     }
27615 
27616     if(festival_speak_new_message_alert)
27617     {
27618       XmToggleButtonSetState(speech_config_play_on_new_message_alert,TRUE,FALSE);
27619     }
27620     else
27621     {
27622       XmToggleButtonSetState(speech_config_play_on_new_message_alert,FALSE,FALSE);
27623     }
27624 
27625     if(festival_speak_new_message_body)
27626     {
27627       XmToggleButtonSetState(speech_config_play_on_new_message_body,TRUE,FALSE);
27628     }
27629     else
27630     {
27631       XmToggleButtonSetState(speech_config_play_on_new_message_body,FALSE,FALSE);
27632     }
27633 
27634     if(festival_speak_proximity_alert)
27635     {
27636       XmToggleButtonSetState(speech_config_play_on_prox,TRUE,FALSE);
27637     }
27638     else
27639     {
27640       XmToggleButtonSetState(speech_config_play_on_prox,FALSE,FALSE);
27641     }
27642 
27643     if(festival_speak_tracked_proximity_alert)
27644     {
27645       XmToggleButtonSetState(speech_config_play_on_trak,TRUE,FALSE);
27646     }
27647     else
27648     {
27649       XmToggleButtonSetState(speech_config_play_on_trak,FALSE,FALSE);
27650     }
27651 
27652     if(festival_speak_band_opening)
27653     {
27654       XmToggleButtonSetState(speech_config_play_on_bando,TRUE,FALSE);
27655     }
27656     else
27657     {
27658       XmToggleButtonSetState(speech_config_play_on_bando,FALSE,FALSE);
27659     }
27660 
27661     if(festival_speak_new_weather_alert)
27662     {
27663       XmToggleButtonSetState(speech_config_play_on_new_wx_alert,TRUE,FALSE);
27664     }
27665     else
27666     {
27667       XmToggleButtonSetState(speech_config_play_on_new_wx_alert,FALSE,FALSE);
27668     }
27669 
27670     XtManageChild(my_form);
27671     XtManageChild(pane);
27672 
27673     resize_dialog(my_form, configure_speech_dialog);
27674 
27675     XtPopup(configure_speech_dialog,XtGrabNone);
27676 
27677     // Move focus to the Cancel button.  This appears to highlight the
27678     // button fine, but we're not able to hit the <Enter> key to
27679     // have that default function happen.  Note:  We _can_ hit the
27680     // <SPACE> key, and that activates the option.
27681 //        XmUpdateDisplay(configure_speech_dialog);
27682     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
27683 
27684   }
27685   else
27686   {
27687     (void)XRaiseWindow(XtDisplay(configure_speech_dialog), XtWindow(configure_speech_dialog));
27688   }
27689 
27690 }
27691 
27692 
27693 
27694 
27695 
27696 /*
27697  *  Track_Me
27698  *
27699  */
27700 void Track_Me( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
27701 {
27702   char *which = (char *)clientData;
27703   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
27704 
27705   if(state->set)
27706   {
27707     xastir_snprintf(tracking_station_call,
27708                     sizeof(tracking_station_call),
27709                     "%s",
27710                     my_callsign);
27711     track_me = atoi(which);
27712     track_station_on = atoi(which);
27713     display_zoom_status();
27714   }
27715   else
27716   {
27717     track_me = 0;
27718     track_station_on = 0;
27719     display_zoom_status();
27720   }
27721 }
27722 
27723 
27724 
27725 
27726 
27727 // Pointer to the Move/Measure cursor object
27728 static Cursor cs_move_measure = (Cursor)NULL;
27729 
27730 /*
27731  *  Move_Object
27732  *
27733  */
27734 void  Move_Object( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
27735 {
27736   char *which = (char *)clientData;
27737   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
27738 
27739   if(state->set)
27740   {
27741     moving_object = atoi(which);
27742     XmToggleButtonSetState(measure_button, FALSE, FALSE);
27743     measuring_distance = 0;
27744 
27745     // Change the cursor
27746     if(!cs_move_measure)
27747     {
27748       cs_move_measure=XCreateFontCursor(XtDisplay(da),XC_crosshair);
27749     }
27750 
27751     (void)XDefineCursor(XtDisplay(da),XtWindow(da),cs_move_measure);
27752     (void)XFlush(XtDisplay(da));
27753   }
27754   else
27755   {
27756     moving_object = 0;
27757 
27758     // Remove the special "crosshair" cursor
27759     (void)XUndefineCursor(XtDisplay(da),XtWindow(da));
27760     (void)XFlush(XtDisplay(da));
27761   }
27762 }
27763 
27764 
27765 
27766 
27767 
27768 /*
27769  *  Measure_Distance
27770  *
27771  */
27772 void  Measure_Distance( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
27773 {
27774   char *which = (char *)clientData;
27775   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
27776 
27777   if(state->set)
27778   {
27779     measuring_distance = atoi(which);
27780     XmToggleButtonSetState(move_button, FALSE, FALSE);
27781     moving_object = 0;
27782 
27783     // Change the cursor
27784     if(!cs_move_measure)
27785     {
27786       cs_move_measure=XCreateFontCursor(XtDisplay(da),XC_crosshair);
27787     }
27788 
27789     (void)XDefineCursor(XtDisplay(da),XtWindow(da),cs_move_measure);
27790     (void)XFlush(XtDisplay(da));
27791   }
27792   else
27793   {
27794     measuring_distance = 0;
27795 
27796     // Remove the special "crosshair" cursor
27797     (void)XUndefineCursor(XtDisplay(da),XtWindow(da));
27798     (void)XFlush(XtDisplay(da));
27799   }
27800 }
27801 
27802 
27803 
27804 /////////////////////////////////////////////////////////////////////////
27805 
27806 
27807 
27808 /*
27809  *  Destroy Configure Station Dialog Popup Window
27810  */
27811 void Configure_station_destroy_shell( Widget widget, XtPointer clientData, XtPointer callData)
27812 {
27813   Widget shell = (Widget) clientData;
27814   XtPopdown(shell);
27815   (void)XFreePixmap(XtDisplay(appshell),CS_icon0);  // ???? DK7IN: avoid possible memory leak ?
27816   (void)XFreePixmap(XtDisplay(appshell),CS_icon);
27817   XtDestroyWidget(shell);
27818   configure_station_dialog = (Widget)NULL;
27819 
27820   // Take down the symbol selection dialog as well (if it's up)
27821   if (select_symbol_dialog)
27822   {
27823     Select_symbol_destroy_shell( widget, select_symbol_dialog, callData);
27824   }
27825 
27826   // NULL out the dialog field in the global struct used for
27827   // Coordinate Calculator.  Prevents segfaults if the calculator is
27828   // still up and trying to write to us.
27829   coordinate_calc_array.calling_dialog = NULL;
27830 }
27831 
27832 
27833 
27834 
27835 
27836 void  Configure_station_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
27837 {
27838   char *which = (char *)clientData;
27839   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
27840 
27841   if(state->set)
27842   {
27843     Configure_station_pos_amb = atoi(which);
27844   }
27845   else
27846   {
27847     Configure_station_pos_amb = 0;
27848   }
27849 }
27850 
27851 
27852 
27853 
27854 
27855 /*
27856  *  Process changes to station data
27857  */
27858 void Configure_station_change_data(Widget widget, XtPointer clientData, XtPointer callData)
27859 {
27860   char temp[40];
27861   char old_callsign[MAX_CALLSIGN+1];
27862   int ok = 1;
27863   int temp2;
27864   int temp3;
27865   char *temp_ptr;
27866   char *temp_ptr2;
27867 
27868 
27869   transmit_compressed_posit = (int)XmToggleButtonGetState(compressed_posit_tx);
27870 
27871   xastir_snprintf(old_callsign,
27872                   sizeof(old_callsign),
27873                   "%s",
27874                   my_callsign);
27875 
27876   /*fprintf(stderr,"Changing Configure station data\n");*/
27877 
27878   temp_ptr = XmTextFieldGetString(station_config_call_data);
27879   xastir_snprintf(my_callsign,
27880                   sizeof(my_callsign),
27881                   "%s",
27882                   temp_ptr);
27883   XtFree(temp_ptr);
27884 
27885   (void)remove_trailing_spaces(my_callsign);
27886   (void)to_upper(my_callsign);
27887   (void)remove_trailing_dash_zero(my_callsign);
27888 
27889   // Enter NOCALL if there's nothing left.
27890   if (my_callsign[0] == '\0')
27891     xastir_snprintf(my_callsign,
27892                     sizeof(my_callsign),
27893                     "NOCALL");
27894 
27895   temp_ptr = XmTextFieldGetString(station_config_slat_data_ns);
27896   if((char)toupper((int)temp_ptr[0])=='S')
27897   {
27898     temp[0]='S';
27899   }
27900   else
27901   {
27902     temp[0]='N';
27903   }
27904   XtFree(temp_ptr);
27905 
27906   // Check latitude for out-of-bounds
27907   temp_ptr = XmTextFieldGetString(station_config_slat_data_deg);
27908   temp2 = atoi(temp_ptr);
27909   XtFree(temp_ptr);
27910 
27911   if ( (temp2 > 90) || (temp2 < 0) )
27912   {
27913     ok = 0;
27914   }
27915 
27916   temp_ptr = XmTextFieldGetString(station_config_slat_data_min);
27917   temp3 = atof(temp_ptr);
27918   XtFree(temp_ptr);
27919 
27920   if ( (temp3 >= 60.0) || (temp3 < 0.0) )
27921   {
27922     ok = 0;
27923   }
27924 
27925   if ( (temp2 == 90) && (temp3 != 0.0) )
27926   {
27927     ok = 0;
27928   }
27929 
27930   temp_ptr = XmTextFieldGetString(station_config_slat_data_deg);
27931   temp_ptr2 = XmTextFieldGetString(station_config_slat_data_min);
27932   xastir_snprintf(my_lat, sizeof(my_lat), "%02d%06.3f%c",
27933                   atoi(temp_ptr),
27934                   atof(temp_ptr2),temp[0]);
27935   XtFree(temp_ptr);
27936   XtFree(temp_ptr2);
27937 
27938   temp_ptr = XmTextFieldGetString(station_config_slong_data_ew);
27939   if((char)toupper((int)temp_ptr[0])=='E')
27940   {
27941     temp[0]='E';
27942   }
27943   else
27944   {
27945     temp[0]='W';
27946   }
27947   XtFree(temp_ptr);
27948 
27949   // Check longitude for out-of-bounds
27950   temp_ptr = XmTextFieldGetString(station_config_slong_data_deg);
27951   temp2 = atoi(temp_ptr);
27952   XtFree(temp_ptr);
27953 
27954   if ( (temp2 > 180) || (temp2 < 0) )
27955   {
27956     ok = 0;
27957   }
27958 
27959   temp_ptr = XmTextFieldGetString(station_config_slong_data_min);
27960   temp3 = atof(temp_ptr);
27961   XtFree(temp_ptr);
27962 
27963   if ( (temp3 >= 60.0) || (temp3 < 0.0) )
27964   {
27965     ok = 0;
27966   }
27967 
27968   if ( (temp2 == 180) && (temp3 != 0.0) )
27969   {
27970     ok = 0;
27971   }
27972 
27973   temp_ptr = XmTextFieldGetString(station_config_slong_data_deg);
27974   temp_ptr2 = XmTextFieldGetString(station_config_slong_data_min);
27975   xastir_snprintf(my_long, sizeof(my_long), "%03d%06.3f%c",
27976                   atoi(temp_ptr),
27977                   atof(temp_ptr2),temp[0]);
27978   XtFree(temp_ptr);
27979   XtFree(temp_ptr2);
27980 
27981   temp_ptr = XmTextFieldGetString(station_config_group_data);
27982   my_group=temp_ptr[0];
27983   if(isalpha((int)my_group))
27984   {
27985     my_group = toupper((int)temp_ptr[0]);
27986   }
27987   XtFree(temp_ptr);
27988 
27989   temp_ptr = XmTextFieldGetString(station_config_symbol_data);
27990   my_symbol = temp_ptr[0];
27991   XtFree(temp_ptr);
27992 
27993   if(isdigit((int)my_phg[3]) && isdigit((int)my_phg[4]) && isdigit((int)my_phg[5]) && isdigit((int)my_phg[6]))
27994   {
27995     my_phg[0] = 'P';
27996     my_phg[1] = 'H';
27997     my_phg[2] = 'G';
27998     my_phg[7] = '\0';
27999   }
28000   else
28001   {
28002     my_phg[0]='\0';
28003   }
28004 
28005   /* set station ambiguity*/
28006   position_amb_chars = Configure_station_pos_amb;
28007 
28008   if (transmit_compressed_posit)
28009   {
28010     position_amb_chars = 0;
28011   }
28012 
28013   temp_ptr = XmTextFieldGetString(station_config_comment_data);
28014   xastir_snprintf(my_comment,
28015                   sizeof(my_comment),
28016                   "%s",
28017                   temp_ptr);
28018   XtFree(temp_ptr);
28019 
28020   (void)remove_trailing_spaces(my_comment);
28021 
28022   /* TO DO: KILL only my station data? */
28023   if (ok)     // If entered data was valid
28024   {
28025 
28026     // Check whether we changed our callsign
28027     if (strcasecmp(old_callsign,my_callsign) != 0)
28028     {
28029       station_del(old_callsign);  // move to new sort location...
28030 
28031       // If TrackMe is enabled, copy the new callsign into the
28032       // track_station_call variable.  If we don't do this, we
28033       // will still be tracking our old callsign.
28034       if (track_me)
28035       {
28036         xastir_snprintf(tracking_station_call,
28037                         sizeof(tracking_station_call),
28038                         "%s",
28039                         my_callsign);
28040       }
28041     }
28042 
28043     // Update our parameters
28044     my_station_add(my_callsign,my_group,my_symbol,my_long,my_lat,my_phg,my_comment,(char)position_amb_chars);
28045 
28046     redraw_on_new_data=2;
28047     Configure_station_destroy_shell(widget,clientData,callData);
28048   }
28049 
28050   // Check for proper weather symbols if a weather station
28051   (void)check_weather_symbol();
28052 
28053   // Check for use of NWS symbols
28054   (void)check_nws_weather_symbol();
28055 }
28056 
28057 
28058 
28059 
28060 
28061 /*
28062  *  Update symbol picture for changed symbol or table
28063  */
28064 void updateSymbolPictureCallback( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
28065 {
28066   char table, overlay;
28067   char symb, group;
28068   char *temp_ptr;
28069 
28070 
28071   XtVaSetValues(station_config_icon, XmNlabelPixmap, CS_icon0, NULL);         // clear old icon
28072   XtManageChild(station_config_icon);
28073 
28074   temp_ptr = XmTextFieldGetString(station_config_group_data);
28075   group = temp_ptr[0];
28076   XtFree(temp_ptr);
28077 
28078   temp_ptr = XmTextFieldGetString(station_config_symbol_data);
28079   symb  = temp_ptr[0];
28080   XtFree(temp_ptr);
28081 
28082   if (group == '/' || group == '\\')
28083   {
28084     table   = group;
28085     overlay = ' ';
28086   }
28087   else
28088   {
28089     table   = '\\';
28090     overlay = group;
28091   }
28092   symbol(station_config_icon,0,table,symb,overlay,CS_icon,0,0,0,' ');         // create icon
28093 
28094   XtVaSetValues(station_config_icon,XmNlabelPixmap,CS_icon,NULL);             // draw new icon
28095   XtManageChild(station_config_icon);
28096 }
28097 
28098 
28099 
28100 
28101 
28102 /* Power radio buttons */
28103 void Power_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
28104 {
28105   char *which = (char *)clientData;
28106   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
28107 
28108   if(state->set)
28109   {
28110 
28111     my_phg[3] = which[0];   // Set to power desired
28112 
28113     if (which[0] == 'x')       // Disable PHG field if 'x' found
28114     {
28115       my_phg[0] = '\0';
28116     }
28117   }
28118   else
28119   {
28120     my_phg[3] = '3';  // 10 Watts (default in spec if none specified)
28121   }
28122   my_phg[8] = '\0';
28123 
28124   //fprintf(stderr,"PHG: %s\n",my_phg);
28125 }
28126 
28127 
28128 
28129 
28130 
28131 /* Height radio buttons */
28132 void Height_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
28133 {
28134   char *which = (char *)clientData;
28135   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
28136 
28137   if(state->set)
28138   {
28139     my_phg[4] = which[0];    // Set to height desired
28140   }
28141   else
28142   {
28143     my_phg[4] = '1';  // 20 Feet above average terrain (default in spec if none specified)
28144   }
28145   my_phg[8] = '\0';
28146 
28147   //fprintf(stderr,"PHG: %s\n",my_phg);
28148 }
28149 
28150 
28151 
28152 
28153 
28154 
28155 /* Gain radio buttons */
28156 void Gain_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
28157 {
28158   char *which = (char *)clientData;
28159   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
28160 
28161   if(state->set)
28162   {
28163     my_phg[5] = which[0];    // Set to gain desired
28164   }
28165   else
28166   {
28167     my_phg[5] = '3';  // 3dB gain antenna (default in spec if none specified)
28168   }
28169   my_phg[8] = '\0';
28170 
28171   //fprintf(stderr,"PHG: %s\n",my_phg);
28172 }
28173 
28174 
28175 
28176 
28177 
28178 
28179 /* Directivity radio buttons */
28180 void Directivity_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
28181 {
28182   char *which = (char *)clientData;
28183   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
28184 
28185   if(state->set)
28186   {
28187     my_phg[6] = which[0];    // Set to directivity desired
28188   }
28189   else
28190   {
28191     my_phg[6] = '0';  // Omni-directional antenna (default in spec if none specified)
28192   }
28193   my_phg[8] = '\0';
28194 
28195   //fprintf(stderr,"PHG: %s\n",my_phg);
28196 }
28197 
28198 
28199 
28200 
28201 
28202 void Posit_compressed_toggle( Widget UNUSED(w), XtPointer clientData, XtPointer callData)
28203 {
28204   char *which = (char *)clientData;
28205   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
28206 
28207   if(state->set)
28208   {
28209     transmit_compressed_posit = atoi(which);
28210   }
28211   else
28212   {
28213     transmit_compressed_posit = 0;
28214   }
28215 
28216   if(transmit_compressed_posit)
28217   {
28218     // Compressed posits don't allow position ambiguity
28219     position_amb_chars = 0;
28220     XtSetSensitive(posamb0,FALSE);
28221     XtSetSensitive(posamb1,FALSE);
28222     XtSetSensitive(posamb2,FALSE);
28223     XtSetSensitive(posamb3,FALSE);
28224     XtSetSensitive(posamb4,FALSE);
28225   }
28226   else    // Position ambiguity ok for this mode
28227   {
28228     XtSetSensitive(posamb0,TRUE);
28229     XtSetSensitive(posamb1,TRUE);
28230     XtSetSensitive(posamb2,TRUE);
28231     XtSetSensitive(posamb3,TRUE);
28232     XtSetSensitive(posamb4,TRUE);
28233   }
28234 }
28235 
28236 
28237 
28238 
28239 
28240 /*
28241  *  Select a symbol graphically
28242  */
28243 void Configure_change_symbol(Widget widget, XtPointer clientData, XtPointer callData)
28244 {
28245 
28246   //fprintf(stderr,"Trying to change a symbol\n");
28247   symbol_change_requested_from = 1;   // Tell Select_symbol who to return the data to
28248   Select_symbol(widget, clientData, callData);
28249 }
28250 
28251 
28252 
28253 
28254 
28255 
28256 /*
28257  *  Setup Configure Station dialog
28258  */
28259 void Configure_station( Widget UNUSED(ww), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
28260 {
28261   static Widget pane, scrollwindow, cs_form, cs_form1, button_ok, button_cancel, call, frame, frame2,
28262          framephg, formphg,
28263          power_box,poption0,poption1,poption2,poption3,poption4,poption5,poption6,poption7,poption8,poption9,poption10,
28264          height_box,hoption1,hoption2,hoption3,hoption4,hoption5,hoption6,hoption7,hoption8,hoption9,hoption10,
28265          gain_box,goption1,goption2,goption3,goption4,goption5,goption6,goption7,goption8,goption9,goption10,
28266          directivity_box,doption1,doption2,doption3,doption4,doption5,doption6,doption7,doption8,doption9,
28267          slat,
28268          slat_deg,  slat_min,
28269          slong_deg, slong_min, slong_ew,
28270          group, st_symbol, comment,
28271          option_box,
28272          sep, configure_button_symbol, compute_button;
28273 //  static Widget pg2, slat_ns, slong, sts, posamb;
28274   char temp_data[40];
28275   Atom delw;
28276   Arg al[50];                    /* Arg List */
28277   register unsigned int ac = 0;           /* Arg Count */
28278 
28279 
28280   if(!configure_station_dialog)
28281   {
28282     configure_station_dialog = XtVaCreatePopupShell(langcode("WPUPCFS001"),
28283                                xmDialogShellWidgetClass,   appshell,
28284                                XmNdeleteResponse,          XmDESTROY,
28285                                XmNdefaultPosition,         FALSE,
28286                                XmNfontList, fontlist1,
28287                                NULL);
28288 
28289     pane = XtVaCreateWidget("Configure_station pane",
28290                             xmPanedWindowWidgetClass,
28291                             configure_station_dialog,
28292                             MY_FOREGROUND_COLOR,
28293                             MY_BACKGROUND_COLOR,
28294                             NULL);
28295 
28296     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
28297                                            xmScrolledWindowWidgetClass,
28298                                            pane,
28299                                            XmNscrollingPolicy, XmAUTOMATIC,
28300                                            NULL);
28301 
28302     cs_form =  XtVaCreateWidget("Configure_station cs_form",
28303                                 xmFormWidgetClass,
28304                                 scrollwindow,
28305                                 XmNfractionBase,            5,
28306                                 XmNautoUnmanage,            FALSE,
28307                                 XmNshadowThickness,         1,
28308                                 MY_FOREGROUND_COLOR,
28309                                 MY_BACKGROUND_COLOR,
28310                                 NULL);
28311 
28312     call = XtVaCreateManagedWidget(langcode("WPUPCFS002"),
28313                                    xmLabelWidgetClass,
28314                                    cs_form,
28315                                    XmNtopAttachment,           XmATTACH_FORM,
28316                                    XmNtopOffset,               10,
28317                                    XmNbottomAttachment,        XmATTACH_NONE,
28318                                    XmNleftAttachment,          XmATTACH_FORM,
28319                                    XmNleftOffset,              10,
28320                                    XmNrightAttachment,         XmATTACH_NONE,
28321                                    MY_FOREGROUND_COLOR,
28322                                    MY_BACKGROUND_COLOR,
28323                                    XmNfontList, fontlist1,
28324                                    NULL);
28325 
28326     station_config_call_data = XtVaCreateManagedWidget("Configure_station call_data",
28327                                xmTextFieldWidgetClass,
28328                                cs_form,
28329                                XmNeditable,                TRUE,
28330                                XmNcursorPositionVisible,   TRUE,
28331                                XmNsensitive,               TRUE,
28332                                XmNshadowThickness,         1,
28333                                XmNcolumns,                 10,
28334                                XmNwidth,                   ((10*7)+2),
28335                                XmNmaxLength,               9,
28336                                XmNbackground,              colors[0x0f],
28337                                XmNtopAttachment,           XmATTACH_FORM,
28338                                XmNtopOffset,               5,
28339                                XmNbottomAttachment,        XmATTACH_NONE,
28340                                XmNleftAttachment,          XmATTACH_POSITION,
28341                                XmNleftPosition,            1,
28342                                XmNrightAttachment,         XmATTACH_NONE,
28343                                XmNfontList, fontlist1,
28344                                NULL);
28345 
28346     compressed_posit_tx = XtVaCreateManagedWidget(langcode("WPUPCFS029"),
28347                           xmToggleButtonWidgetClass,
28348                           cs_form,
28349                           XmNtopAttachment,           XmATTACH_FORM,
28350                           XmNtopOffset,               10,
28351                           XmNbottomAttachment,        XmATTACH_NONE,
28352                           XmNleftAttachment,          XmATTACH_POSITION,
28353                           XmNleftPosition,            3,
28354                           XmNrightAttachment,         XmATTACH_NONE,
28355                           XmNnavigationType,          XmTAB_GROUP,
28356                           MY_FOREGROUND_COLOR,
28357                           MY_BACKGROUND_COLOR,
28358                           XmNfontList, fontlist1,
28359                           NULL);
28360 
28361     XtAddCallback(compressed_posit_tx,XmNvalueChangedCallback,Posit_compressed_toggle,"1");
28362 
28363     slat = XtVaCreateManagedWidget(langcode("WPUPCFS003"),
28364                                    xmLabelWidgetClass,
28365                                    cs_form,
28366                                    XmNtopAttachment,           XmATTACH_WIDGET,
28367                                    XmNtopWidget,               call,
28368                                    XmNtopOffset,               25,
28369                                    XmNbottomAttachment,        XmATTACH_NONE,
28370                                    XmNleftAttachment,          XmATTACH_FORM,
28371                                    XmNleftOffset,              10,
28372                                    XmNrightAttachment,         XmATTACH_NONE,
28373                                    MY_FOREGROUND_COLOR,
28374                                    MY_BACKGROUND_COLOR,
28375                                    XmNfontList, fontlist1,
28376                                    NULL);
28377 
28378     station_config_slat_data_deg = XtVaCreateManagedWidget("Configure_station lat_deg",
28379                                    xmTextFieldWidgetClass,
28380                                    cs_form,
28381                                    XmNeditable,                TRUE,
28382                                    XmNcursorPositionVisible,   TRUE,
28383                                    XmNsensitive,               TRUE,
28384                                    XmNshadowThickness,         1,
28385                                    XmNcolumns,                 3,
28386                                    XmNmaxLength,               2,
28387                                    XmNtopOffset,               20,
28388                                    XmNbackground,              colors[0x0f],
28389                                    XmNtopAttachment,           XmATTACH_WIDGET,
28390                                    XmNtopWidget,               call,
28391                                    XmNbottomAttachment,        XmATTACH_NONE,
28392                                    XmNleftAttachment,          XmATTACH_POSITION,
28393                                    XmNleftPosition,            1,
28394                                    XmNrightAttachment,         XmATTACH_NONE,
28395                                    XmNfontList, fontlist1,
28396                                    NULL);
28397 
28398     slat_deg = XtVaCreateManagedWidget(langcode("WPUPCFS004"),
28399                                        xmLabelWidgetClass,
28400                                        cs_form,
28401                                        XmNtopAttachment,           XmATTACH_WIDGET,
28402                                        XmNtopWidget,               call,
28403                                        XmNtopOffset,               25,
28404                                        XmNbottomAttachment,        XmATTACH_NONE,
28405                                        XmNleftAttachment,          XmATTACH_WIDGET,
28406                                        XmNleftWidget,              station_config_slat_data_deg,
28407                                        XmNrightAttachment,         XmATTACH_NONE,
28408                                        MY_FOREGROUND_COLOR,
28409                                        MY_BACKGROUND_COLOR,
28410                                        XmNfontList, fontlist1,
28411                                        NULL);
28412 
28413     station_config_slat_data_min = XtVaCreateManagedWidget("Configure_station lat_min",
28414                                    xmTextFieldWidgetClass,
28415                                    cs_form,
28416                                    XmNeditable,                TRUE,
28417                                    XmNcursorPositionVisible,   TRUE,
28418                                    XmNsensitive,               TRUE,
28419                                    XmNshadowThickness,         1,
28420                                    XmNcolumns,                 6,
28421                                    XmNmaxLength,               6,
28422                                    XmNtopOffset,               20,
28423                                    XmNbackground,              colors[0x0f],
28424                                    XmNleftAttachment,          XmATTACH_WIDGET,
28425                                    XmNleftWidget,              slat_deg,
28426                                    XmNleftOffset,              10,
28427                                    XmNtopAttachment,           XmATTACH_WIDGET,
28428                                    XmNtopWidget,               call,
28429                                    XmNbottomAttachment,        XmATTACH_NONE,
28430                                    XmNrightAttachment,         XmATTACH_NONE,
28431                                    XmNfontList, fontlist1,
28432                                    NULL);
28433 
28434     slat_min = XtVaCreateManagedWidget(langcode("WPUPCFS005"),
28435                                        xmLabelWidgetClass,
28436                                        cs_form,
28437                                        XmNtopAttachment,           XmATTACH_WIDGET,
28438                                        XmNtopWidget,               call,
28439                                        XmNtopOffset,               25,
28440                                        XmNbottomAttachment,        XmATTACH_NONE,
28441                                        XmNleftAttachment,          XmATTACH_WIDGET,
28442                                        XmNleftWidget,              station_config_slat_data_min,
28443                                        XmNrightAttachment,         XmATTACH_NONE,
28444                                        MY_FOREGROUND_COLOR,
28445                                        MY_BACKGROUND_COLOR,
28446                                        XmNfontList, fontlist1,
28447                                        NULL);
28448 
28449     station_config_slat_data_ns = XtVaCreateManagedWidget("Configure_station lat_ns",
28450                                   xmTextFieldWidgetClass,
28451                                   cs_form,
28452                                   XmNeditable,                TRUE,
28453                                   XmNcursorPositionVisible,   FALSE,
28454                                   XmNsensitive,               TRUE,
28455                                   XmNshadowThickness,         1,
28456                                   XmNcolumns,                 1,
28457                                   XmNmaxLength,               1,
28458                                   XmNtopOffset,               20,
28459                                   XmNbackground,              colors[0x0f],
28460                                   XmNleftAttachment,          XmATTACH_WIDGET,
28461                                   XmNleftWidget,              slat_min,
28462                                   XmNleftOffset,              10,
28463                                   XmNtopAttachment,           XmATTACH_WIDGET,
28464                                   XmNtopWidget,               call,
28465                                   XmNbottomAttachment,        XmATTACH_NONE,
28466                                   XmNrightAttachment,         XmATTACH_NONE,
28467                                   XmNfontList, fontlist1,
28468                                   NULL);
28469 
28470     //slat_n
28471     XtVaCreateManagedWidget(langcode("WPUPCFS006"),
28472                             xmLabelWidgetClass,
28473                             cs_form,
28474                             XmNtopAttachment,           XmATTACH_WIDGET,
28475                             XmNtopWidget,               call,
28476                             XmNtopOffset,               25,
28477                             XmNbottomAttachment,        XmATTACH_NONE,
28478                             XmNleftAttachment,          XmATTACH_WIDGET,
28479                             XmNleftWidget,              station_config_slat_data_ns,
28480                             XmNrightAttachment,         XmATTACH_NONE,
28481                             MY_FOREGROUND_COLOR,
28482                             MY_BACKGROUND_COLOR,
28483                             XmNfontList, fontlist1,
28484                             NULL);
28485 
28486     //slong
28487     XtVaCreateManagedWidget(langcode("WPUPCFS007"),
28488                             xmLabelWidgetClass,
28489                             cs_form,
28490                             XmNtopAttachment,           XmATTACH_WIDGET,
28491                             XmNtopWidget,               slat,
28492                             XmNtopOffset,               20,
28493                             XmNbottomAttachment,        XmATTACH_NONE,
28494                             XmNleftAttachment,          XmATTACH_FORM,
28495                             XmNleftOffset,              10,
28496                             XmNrightAttachment,         XmATTACH_NONE,
28497                             MY_FOREGROUND_COLOR,
28498                             MY_BACKGROUND_COLOR,
28499                             XmNfontList, fontlist1,
28500                             NULL);
28501 
28502     station_config_slong_data_deg = XtVaCreateManagedWidget("Configure_station long_deg",
28503                                     xmTextFieldWidgetClass,
28504                                     cs_form,
28505                                     XmNeditable,                TRUE,
28506                                     XmNcursorPositionVisible,   TRUE,
28507                                     XmNsensitive,               TRUE,
28508                                     XmNshadowThickness,         1,
28509                                     XmNcolumns,                 3,
28510                                     XmNmaxLength,               3,
28511                                     XmNtopOffset,               14,
28512                                     XmNbackground,              colors[0x0f],
28513                                     XmNtopAttachment,           XmATTACH_WIDGET,
28514                                     XmNtopWidget,               slat,
28515                                     XmNbottomAttachment,        XmATTACH_NONE,
28516                                     XmNleftAttachment,          XmATTACH_POSITION,
28517                                     XmNleftPosition,            1,
28518                                     XmNrightAttachment,         XmATTACH_NONE,
28519                                     XmNfontList, fontlist1,
28520                                     NULL);
28521 
28522     slong_deg = XtVaCreateManagedWidget(langcode("WPUPCFS004"),
28523                                         xmLabelWidgetClass,
28524                                         cs_form,
28525                                         XmNtopAttachment,           XmATTACH_WIDGET,
28526                                         XmNtopWidget,               slat,
28527                                         XmNtopOffset,               20,
28528                                         XmNbottomAttachment,        XmATTACH_NONE,
28529                                         XmNleftAttachment,          XmATTACH_WIDGET,
28530                                         XmNleftWidget,              station_config_slong_data_deg,
28531                                         XmNrightAttachment,         XmATTACH_NONE,
28532                                         MY_FOREGROUND_COLOR,
28533                                         MY_BACKGROUND_COLOR,
28534                                         XmNfontList, fontlist1,
28535                                         NULL);
28536 
28537     station_config_slong_data_min = XtVaCreateManagedWidget("Configure_station long_min",
28538                                     xmTextFieldWidgetClass,
28539                                     cs_form,
28540                                     XmNeditable,                TRUE,
28541                                     XmNcursorPositionVisible,   TRUE,
28542                                     XmNsensitive,               TRUE,
28543                                     XmNshadowThickness,         1,
28544                                     XmNcolumns,                 6,
28545                                     XmNmaxLength,               6,
28546                                     XmNtopOffset,               14,
28547                                     XmNbackground,              colors[0x0f],
28548                                     XmNleftAttachment,          XmATTACH_WIDGET,
28549                                     XmNleftWidget,              slong_deg,
28550                                     XmNleftOffset,              10,
28551                                     XmNtopAttachment,           XmATTACH_WIDGET,
28552                                     XmNtopWidget,               slat,
28553                                     XmNbottomAttachment,        XmATTACH_NONE,
28554                                     XmNrightAttachment,         XmATTACH_NONE,
28555                                     XmNfontList, fontlist1,
28556                                     NULL);
28557 
28558     slong_min = XtVaCreateManagedWidget(langcode("WPUPCFS005"),
28559                                         xmLabelWidgetClass,
28560                                         cs_form,
28561                                         XmNtopAttachment,           XmATTACH_WIDGET,
28562                                         XmNtopWidget,               slat,
28563                                         XmNtopOffset,               20,
28564                                         XmNbottomAttachment,        XmATTACH_NONE,
28565                                         XmNleftAttachment,          XmATTACH_WIDGET,
28566                                         XmNleftWidget,              station_config_slong_data_min,
28567                                         XmNrightAttachment,         XmATTACH_NONE,
28568                                         MY_FOREGROUND_COLOR,
28569                                         MY_BACKGROUND_COLOR,
28570                                         XmNfontList, fontlist1,
28571                                         NULL);
28572 
28573     station_config_slong_data_ew = XtVaCreateManagedWidget("Configure_station long_ew",
28574                                    xmTextFieldWidgetClass,
28575                                    cs_form,
28576                                    XmNeditable,                TRUE,
28577                                    XmNcursorPositionVisible,   FALSE,
28578                                    XmNsensitive,               TRUE,
28579                                    XmNshadowThickness,         1,
28580                                    XmNcolumns,                 1,
28581                                    XmNmaxLength,               1,
28582                                    XmNtopOffset,               14,
28583                                    XmNbackground,              colors[0x0f],
28584                                    XmNleftAttachment,          XmATTACH_WIDGET,
28585                                    XmNleftWidget,              slong_min,
28586                                    XmNleftOffset,              10,
28587                                    XmNtopAttachment,           XmATTACH_WIDGET,
28588                                    XmNtopWidget,               slat,
28589                                    XmNbottomAttachment,        XmATTACH_NONE,
28590                                    XmNrightAttachment,         XmATTACH_NONE,
28591                                    XmNfontList, fontlist1,
28592                                    NULL);
28593 
28594     slong_ew = XtVaCreateManagedWidget(langcode("WPUPCFS008"),
28595                                        xmLabelWidgetClass,
28596                                        cs_form,
28597                                        XmNtopAttachment,           XmATTACH_WIDGET,
28598                                        XmNtopWidget,               slat,
28599                                        XmNtopOffset,               20,
28600                                        XmNbottomAttachment,        XmATTACH_NONE,
28601                                        XmNleftAttachment,          XmATTACH_WIDGET,
28602                                        XmNleftWidget,              station_config_slong_data_ew,
28603                                        XmNrightAttachment,         XmATTACH_NONE,
28604                                        MY_FOREGROUND_COLOR,
28605                                        MY_BACKGROUND_COLOR,
28606                                        XmNfontList, fontlist1,
28607                                        NULL);
28608 
28609     compute_button = XtVaCreateManagedWidget(langcode("COORD002"),
28610                      xmPushButtonGadgetClass,
28611                      cs_form,
28612                      XmNtopAttachment,           XmATTACH_WIDGET,
28613                      XmNtopWidget,               slat,
28614                      XmNtopOffset,               20,
28615                      XmNbottomAttachment,        XmATTACH_NONE,
28616                      XmNleftAttachment,          XmATTACH_WIDGET,
28617                      XmNleftWidget,              slong_ew,
28618                      XmNleftOffset,              15,
28619                      XmNrightAttachment,         XmATTACH_NONE,
28620                      XmNnavigationType,          XmTAB_GROUP,
28621                      MY_FOREGROUND_COLOR,
28622                      MY_BACKGROUND_COLOR,
28623                      XmNfontList, fontlist1,
28624                      NULL);
28625 
28626     // Fill in the pointers to our input textfields so that the
28627     // coordinate calculator can fiddle with them.
28628     coordinate_calc_array.calling_dialog = configure_station_dialog;
28629     coordinate_calc_array.input_lat_deg = station_config_slat_data_deg;
28630     coordinate_calc_array.input_lat_min = station_config_slat_data_min;
28631     coordinate_calc_array.input_lat_dir = station_config_slat_data_ns;
28632     coordinate_calc_array.input_lon_deg = station_config_slong_data_deg;
28633     coordinate_calc_array.input_lon_min = station_config_slong_data_min;
28634     coordinate_calc_array.input_lon_dir = station_config_slong_data_ew;
28635 //        XtAddCallback(compute_button, XmNactivateCallback, Coordinate_calc, configure_station_dialog);
28636 //        XtAddCallback(compute_button, XmNactivateCallback, Coordinate_calc, "Configure_station");
28637     XtAddCallback(compute_button, XmNactivateCallback, Coordinate_calc, langcode("WPUPCFS001"));
28638 
28639 
28640 
28641 
28642 //----- Frame for table / symbol
28643     frame = XtVaCreateManagedWidget("Configure_station frame",
28644                                     xmFrameWidgetClass,
28645                                     cs_form,
28646                                     XmNtopAttachment,           XmATTACH_WIDGET,
28647                                     XmNtopWidget,               slong_ew,
28648                                     XmNtopOffset,               10,
28649                                     XmNbottomAttachment,        XmATTACH_NONE,
28650                                     XmNleftAttachment,          XmATTACH_FORM,
28651                                     XmNleftOffset,              10,
28652                                     XmNrightAttachment,         XmATTACH_FORM,
28653                                     XmNrightOffset,             10,
28654                                     MY_FOREGROUND_COLOR,
28655                                     MY_BACKGROUND_COLOR,
28656                                     NULL);
28657     // "Station Symbol"
28658     //sts
28659     XtVaCreateManagedWidget(langcode("WPUPCFS009"),
28660                             xmLabelWidgetClass,
28661                             frame,
28662                             XmNchildType,               XmFRAME_TITLE_CHILD,
28663                             MY_FOREGROUND_COLOR,
28664                             MY_BACKGROUND_COLOR,
28665                             XmNfontList, fontlist1,
28666                             NULL);
28667 
28668     cs_form1 =  XtVaCreateWidget("Configure_station cs_form1",
28669                                  xmFormWidgetClass,
28670                                  frame,
28671                                  XmNfractionBase,            5,
28672                                  MY_FOREGROUND_COLOR,
28673                                  MY_BACKGROUND_COLOR,
28674                                  XmNfontList, fontlist1,
28675                                  NULL);
28676 
28677     // "Group/overlay"
28678     group = XtVaCreateManagedWidget(langcode("WPUPCFS010"),
28679                                     xmLabelWidgetClass,
28680                                     cs_form1,
28681                                     XmNtopAttachment,           XmATTACH_FORM,
28682                                     XmNtopOffset,               10,
28683                                     XmNbottomAttachment,        XmATTACH_FORM,
28684                                     XmNbottomOffset,            10,
28685                                     XmNleftAttachment,          XmATTACH_FORM,
28686                                     XmNleftOffset,              100,
28687                                     XmNrightAttachment,         XmATTACH_NONE,
28688                                     MY_FOREGROUND_COLOR,
28689                                     MY_BACKGROUND_COLOR,
28690                                     XmNfontList, fontlist1,
28691                                     NULL);
28692     // table
28693     station_config_group_data = XtVaCreateManagedWidget("Configure_station group",
28694                                 xmTextFieldWidgetClass,
28695                                 cs_form1,
28696                                 XmNeditable,                TRUE,
28697                                 XmNcursorPositionVisible,   FALSE,
28698                                 XmNsensitive,               TRUE,
28699                                 XmNshadowThickness,         1,
28700                                 XmNcolumns,                 1,
28701                                 XmNmaxLength,               1,
28702                                 XmNtopOffset,               6,
28703                                 XmNbackground,              colors[0x0f],
28704                                 XmNleftAttachment,          XmATTACH_WIDGET,
28705                                 XmNleftWidget,              group,
28706                                 XmNleftOffset,              5,
28707                                 XmNtopAttachment,           XmATTACH_FORM,
28708                                 XmNbottomAttachment,        XmATTACH_NONE,
28709                                 XmNrightAttachment,         XmATTACH_NONE,
28710                                 XmNfontList, fontlist1,
28711                                 NULL);
28712 
28713     // "Symbol"
28714     st_symbol = XtVaCreateManagedWidget(langcode("WPUPCFS011"),
28715                                         xmLabelWidgetClass,
28716                                         cs_form1,
28717                                         XmNtopAttachment,           XmATTACH_FORM,
28718                                         XmNtopOffset,               10,
28719                                         XmNbottomAttachment,        XmATTACH_NONE,
28720                                         XmNleftAttachment,          XmATTACH_WIDGET,
28721                                         XmNleftWidget,              station_config_group_data,
28722                                         XmNleftOffset,              20,
28723                                         XmNrightAttachment,         XmATTACH_NONE,
28724                                         MY_FOREGROUND_COLOR,
28725                                         MY_BACKGROUND_COLOR,
28726                                         XmNfontList, fontlist1,
28727                                         NULL);
28728 
28729     // symbol
28730     station_config_symbol_data = XtVaCreateManagedWidget("Configure_station symbol",
28731                                  xmTextFieldWidgetClass,
28732                                  cs_form1,
28733                                  XmNeditable,                TRUE,
28734                                  XmNcursorPositionVisible,   FALSE,
28735                                  XmNsensitive,               TRUE,
28736                                  XmNshadowThickness,         1,
28737                                  XmNcolumns,                 1,
28738                                  XmNmaxLength,               1,
28739                                  XmNtopOffset,               6,
28740                                  XmNbackground,              colors[0x0f],
28741                                  XmNleftAttachment,          XmATTACH_WIDGET,
28742                                  XmNleftWidget,              st_symbol,
28743                                  XmNleftOffset,              5,
28744                                  XmNtopAttachment,           XmATTACH_FORM,
28745                                  XmNbottomAttachment,        XmATTACH_NONE,
28746                                  XmNrightAttachment,         XmATTACH_NONE,
28747                                  XmNfontList, fontlist1,
28748                                  NULL);
28749 
28750     // icon
28751     CS_icon0 = XCreatePixmap(XtDisplay(appshell),
28752                              RootWindowOfScreen(XtScreen(appshell)),
28753                              20,
28754                              20,
28755                              DefaultDepthOfScreen(XtScreen(appshell)));
28756     CS_icon  = XCreatePixmap(XtDisplay(appshell),
28757                              RootWindowOfScreen(XtScreen(appshell)),
28758                              20,
28759                              20,
28760                              DefaultDepthOfScreen(XtScreen(appshell)));
28761     station_config_icon = XtVaCreateManagedWidget("Configure_station icon",
28762                           xmLabelWidgetClass,
28763                           cs_form1,
28764                           XmNlabelType,               XmPIXMAP,
28765                           XmNlabelPixmap,             CS_icon,
28766                           XmNleftAttachment,          XmATTACH_WIDGET,
28767                           XmNleftWidget,              station_config_symbol_data,
28768                           XmNleftOffset,              15,
28769                           XmNtopAttachment,           XmATTACH_FORM,
28770                           XmNtopOffset,               10,
28771                           XmNbottomAttachment,        XmATTACH_NONE,
28772                           XmNrightAttachment,         XmATTACH_NONE,
28773                           MY_FOREGROUND_COLOR,
28774                           MY_BACKGROUND_COLOR,
28775                           XmNfontList, fontlist1,
28776                           NULL);
28777 
28778     configure_button_symbol = XtVaCreateManagedWidget(langcode("WPUPCFS028"),
28779                               xmPushButtonGadgetClass,
28780                               cs_form1,
28781                               XmNtopAttachment,           XmATTACH_FORM,
28782                               XmNtopOffset,               6,
28783                               XmNbottomAttachment,        XmATTACH_NONE,
28784                               XmNleftAttachment,          XmATTACH_WIDGET,
28785                               XmNleftWidget,              station_config_icon,
28786                               XmNleftOffset,              15,
28787                               XmNrightAttachment,         XmATTACH_NONE,
28788                               XmNnavigationType,          XmTAB_GROUP,
28789                               MY_FOREGROUND_COLOR,
28790                               MY_BACKGROUND_COLOR,
28791                               XmNfontList, fontlist1,
28792                               NULL);
28793     XtAddCallback(configure_button_symbol, XmNactivateCallback, Configure_change_symbol, configure_station_dialog);
28794 
28795 
28796 //----- Frame for Power-Gain
28797     framephg = XtVaCreateManagedWidget("Configure_station framephg",
28798                                        xmFrameWidgetClass,
28799                                        cs_form,
28800                                        XmNtopAttachment,           XmATTACH_WIDGET,
28801                                        XmNtopWidget,               frame,
28802                                        XmNtopOffset,               10,
28803                                        XmNbottomAttachment,        XmATTACH_NONE,
28804                                        XmNleftAttachment,          XmATTACH_FORM,
28805                                        XmNleftOffset,              10,
28806                                        XmNrightAttachment,         XmATTACH_FORM,
28807                                        XmNrightOffset,             10,
28808                                        MY_FOREGROUND_COLOR,
28809                                        MY_BACKGROUND_COLOR,
28810                                        NULL);
28811 
28812     //pg2
28813     XtVaCreateManagedWidget(langcode("WPUPCFS012"),
28814                             xmLabelWidgetClass,
28815                             framephg,
28816                             XmNchildType,               XmFRAME_TITLE_CHILD,
28817                             MY_FOREGROUND_COLOR,
28818                             MY_BACKGROUND_COLOR,
28819                             XmNfontList, fontlist1,
28820                             NULL);
28821 
28822     formphg =  XtVaCreateWidget("Configure_station power_form",
28823                                 xmFormWidgetClass,
28824                                 framephg,
28825                                 XmNfractionBase,            5,
28826                                 MY_FOREGROUND_COLOR,
28827                                 MY_BACKGROUND_COLOR,
28828                                 NULL);
28829 
28830     // Power
28831     ac = 0;
28832     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
28833     ac++;
28834     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
28835     ac++;
28836     XtSetArg(al[ac], XmNfontList, fontlist1);
28837     ac++;
28838 
28839     power_box = XmCreateRadioBox(formphg,
28840                                  "Configure_station Power Radio Box",
28841                                  al,
28842                                  ac);
28843 
28844     XtVaSetValues(power_box,
28845                   XmNpacking, XmPACK_TIGHT,
28846                   XmNorientation, XmHORIZONTAL,
28847                   XmNtopAttachment,XmATTACH_FORM,
28848                   XmNbottomAttachment,XmATTACH_NONE,
28849                   XmNleftAttachment, XmATTACH_FORM,
28850                   XmNleftOffset, 5,
28851                   XmNrightAttachment,XmATTACH_FORM,
28852                   XmNrightOffset, 5,
28853                   XmNnumColumns,11,
28854                   NULL);
28855 
28856     poption0 = XtVaCreateManagedWidget(langcode("WPUPCFS013"),
28857                                        xmToggleButtonGadgetClass,
28858                                        power_box,
28859                                        MY_FOREGROUND_COLOR,
28860                                        MY_BACKGROUND_COLOR,
28861                                        XmNfontList, fontlist1,
28862                                        NULL);
28863     XtAddCallback(poption0,XmNvalueChangedCallback,Power_toggle,"x");
28864 
28865     // 0 Watts
28866     poption1 = XtVaCreateManagedWidget("0W",
28867                                        xmToggleButtonGadgetClass,
28868                                        power_box,
28869                                        MY_FOREGROUND_COLOR,
28870                                        MY_BACKGROUND_COLOR,
28871                                        XmNfontList, fontlist1,
28872                                        NULL);
28873     XtAddCallback(poption1,XmNvalueChangedCallback,Power_toggle,"0");
28874 
28875     // 1 Watt
28876     poption2 = XtVaCreateManagedWidget("1W",
28877                                        xmToggleButtonGadgetClass,
28878                                        power_box,
28879                                        MY_FOREGROUND_COLOR,
28880                                        MY_BACKGROUND_COLOR,
28881                                        XmNfontList, fontlist1,
28882                                        NULL);
28883     XtAddCallback(poption2,XmNvalueChangedCallback,Power_toggle,"1");
28884 
28885     // 4 Watts
28886     poption3 = XtVaCreateManagedWidget("4W",
28887                                        xmToggleButtonGadgetClass,
28888                                        power_box,
28889                                        MY_FOREGROUND_COLOR,
28890                                        MY_BACKGROUND_COLOR,
28891                                        XmNfontList, fontlist1,
28892                                        NULL);
28893     XtAddCallback(poption3,XmNvalueChangedCallback,Power_toggle,"2");
28894 
28895     // 9 Watts
28896     poption4 = XtVaCreateManagedWidget("9W",
28897                                        xmToggleButtonGadgetClass,
28898                                        power_box,
28899                                        MY_FOREGROUND_COLOR,
28900                                        MY_BACKGROUND_COLOR,
28901                                        XmNfontList, fontlist1,
28902                                        NULL);
28903     XtAddCallback(poption4,XmNvalueChangedCallback,Power_toggle,"3");
28904 
28905     // 16 Watts
28906     poption5 = XtVaCreateManagedWidget("16W",
28907                                        xmToggleButtonGadgetClass,
28908                                        power_box,
28909                                        MY_FOREGROUND_COLOR,
28910                                        MY_BACKGROUND_COLOR,
28911                                        XmNfontList, fontlist1,
28912                                        NULL);
28913     XtAddCallback(poption5,XmNvalueChangedCallback,Power_toggle,"4");
28914 
28915     // 25 Watts
28916     poption6 = XtVaCreateManagedWidget("25W",
28917                                        xmToggleButtonGadgetClass,
28918                                        power_box,
28919                                        MY_FOREGROUND_COLOR,
28920                                        MY_BACKGROUND_COLOR,
28921                                        XmNfontList, fontlist1,
28922                                        NULL);
28923     XtAddCallback(poption6,XmNvalueChangedCallback,Power_toggle,"5");
28924 
28925     // 36 Watts
28926     poption7 = XtVaCreateManagedWidget("36W",
28927                                        xmToggleButtonGadgetClass,
28928                                        power_box,
28929                                        MY_FOREGROUND_COLOR,
28930                                        MY_BACKGROUND_COLOR,
28931                                        XmNfontList, fontlist1,
28932                                        NULL);
28933     XtAddCallback(poption7,XmNvalueChangedCallback,Power_toggle,"6");
28934 
28935     // 49 Watts
28936     poption8 = XtVaCreateManagedWidget("49W",
28937                                        xmToggleButtonGadgetClass,
28938                                        power_box,
28939                                        MY_FOREGROUND_COLOR,
28940                                        MY_BACKGROUND_COLOR,
28941                                        XmNfontList, fontlist1,
28942                                        NULL);
28943     XtAddCallback(poption8,XmNvalueChangedCallback,Power_toggle,"7");
28944 
28945     // 64 Watts
28946     poption9 = XtVaCreateManagedWidget("64W",
28947                                        xmToggleButtonGadgetClass,
28948                                        power_box,
28949                                        MY_FOREGROUND_COLOR,
28950                                        MY_BACKGROUND_COLOR,
28951                                        XmNfontList, fontlist1,
28952                                        NULL);
28953     XtAddCallback(poption9,XmNvalueChangedCallback,Power_toggle,"8");
28954 
28955     // 81 Watts
28956     poption10 = XtVaCreateManagedWidget("81W",
28957                                         xmToggleButtonGadgetClass,
28958                                         power_box,
28959                                         MY_FOREGROUND_COLOR,
28960                                         MY_BACKGROUND_COLOR,
28961                                         XmNfontList, fontlist1,
28962                                         NULL);
28963     XtAddCallback(poption10,XmNvalueChangedCallback,Power_toggle,"9");
28964 
28965 
28966     // Height
28967     height_box = XmCreateRadioBox(formphg,
28968                                   "Configure_station Height Radio Box",
28969                                   al,
28970                                   ac);
28971 
28972     XtVaSetValues(height_box,
28973                   XmNpacking, XmPACK_TIGHT,
28974                   XmNorientation, XmHORIZONTAL,
28975                   XmNtopAttachment,XmATTACH_WIDGET,
28976                   XmNtopWidget,power_box,
28977                   XmNbottomAttachment,XmATTACH_NONE,
28978                   XmNleftAttachment, XmATTACH_FORM,
28979                   XmNleftOffset, 5,
28980                   XmNrightAttachment,XmATTACH_FORM,
28981                   XmNrightOffset, 5,
28982                   XmNnumColumns,10,
28983                   NULL);
28984 
28985 
28986     // 10 Feet
28987     hoption1 = XtVaCreateManagedWidget(
28988                  (english_units) ? "10ft" : "3m",
28989                  xmToggleButtonGadgetClass,
28990                  height_box,
28991                  MY_FOREGROUND_COLOR,
28992                  MY_BACKGROUND_COLOR,
28993                  XmNfontList, fontlist1,
28994                  NULL);
28995     XtAddCallback(hoption1,XmNvalueChangedCallback,Height_toggle,"0");
28996 
28997     // 20 Feet
28998     hoption2 = XtVaCreateManagedWidget(
28999                  (english_units) ? "20ft" : "6m",
29000                  xmToggleButtonGadgetClass,
29001                  height_box,
29002                  MY_FOREGROUND_COLOR,
29003                  MY_BACKGROUND_COLOR,
29004                  XmNfontList, fontlist1,
29005                  NULL);
29006     XtAddCallback(hoption2,XmNvalueChangedCallback,Height_toggle,"1");
29007 
29008     // 40 Feet
29009     hoption3 = XtVaCreateManagedWidget(
29010                  (english_units) ? "40ft" : "12m",
29011                  xmToggleButtonGadgetClass,
29012                  height_box,
29013                  MY_FOREGROUND_COLOR,
29014                  MY_BACKGROUND_COLOR,
29015                  XmNfontList, fontlist1,
29016                  NULL);
29017     XtAddCallback(hoption3,XmNvalueChangedCallback,Height_toggle,"2");
29018 
29019     // 80 Feet
29020     hoption4 = XtVaCreateManagedWidget(
29021                  (english_units) ? "80ft" : "24m",
29022                  xmToggleButtonGadgetClass,
29023                  height_box,
29024                  MY_FOREGROUND_COLOR,
29025                  MY_BACKGROUND_COLOR,
29026                  XmNfontList, fontlist1,
29027                  NULL);
29028     XtAddCallback(hoption4,XmNvalueChangedCallback,Height_toggle,"3");
29029 
29030     // 160 Feet
29031     hoption5 = XtVaCreateManagedWidget(
29032                  (english_units) ? "160ft" : "49m",
29033                  xmToggleButtonGadgetClass,
29034                  height_box,
29035                  MY_FOREGROUND_COLOR,
29036                  MY_BACKGROUND_COLOR,
29037                  XmNfontList, fontlist1,
29038                  NULL);
29039     XtAddCallback(hoption5,XmNvalueChangedCallback,Height_toggle,"4");
29040 
29041     // 320 Feet
29042     hoption6 = XtVaCreateManagedWidget(
29043                  (english_units) ? "320ft" : "98m",
29044                  xmToggleButtonGadgetClass,
29045                  height_box,
29046                  MY_FOREGROUND_COLOR,
29047                  MY_BACKGROUND_COLOR,
29048                  XmNfontList, fontlist1,
29049                  NULL);
29050     XtAddCallback(hoption6,XmNvalueChangedCallback,Height_toggle,"5");
29051 
29052     // 640 Feet
29053     hoption7 = XtVaCreateManagedWidget(
29054                  (english_units) ? "640ft" : "195m",
29055                  xmToggleButtonGadgetClass,
29056                  height_box,
29057                  MY_FOREGROUND_COLOR,
29058                  MY_BACKGROUND_COLOR,
29059                  XmNfontList, fontlist1,
29060                  NULL);
29061     XtAddCallback(hoption7,XmNvalueChangedCallback,Height_toggle,"6");
29062 
29063     // 1280 Feet
29064     hoption8 = XtVaCreateManagedWidget(
29065                  (english_units) ? "1280ft" : "390m",
29066                  xmToggleButtonGadgetClass,
29067                  height_box,
29068                  MY_FOREGROUND_COLOR,
29069                  MY_BACKGROUND_COLOR,
29070                  XmNfontList, fontlist1,
29071                  NULL);
29072     XtAddCallback(hoption8,XmNvalueChangedCallback,Height_toggle,"7");
29073 
29074     // 2560 Feet
29075     hoption9 = XtVaCreateManagedWidget(
29076                  (english_units) ? "2560ft" : "780m",
29077                  xmToggleButtonGadgetClass,
29078                  height_box,
29079                  MY_FOREGROUND_COLOR,
29080                  MY_BACKGROUND_COLOR,
29081                  XmNfontList, fontlist1,
29082                  NULL);
29083     XtAddCallback(hoption9,XmNvalueChangedCallback,Height_toggle,"8");
29084 
29085     // 5120 Feet
29086     hoption10 = XtVaCreateManagedWidget(
29087                   (english_units) ? "5120ft" : "1561m",
29088                   xmToggleButtonGadgetClass,
29089                   height_box,
29090                   MY_FOREGROUND_COLOR,
29091                   MY_BACKGROUND_COLOR,
29092                   XmNfontList, fontlist1,
29093                   NULL);
29094     XtAddCallback(hoption10,XmNvalueChangedCallback,Height_toggle,"9");
29095 
29096 
29097     // Gain
29098     gain_box = XmCreateRadioBox(formphg,
29099                                 "Configure_station Gain Radio Box",
29100                                 al,
29101                                 ac);
29102 
29103     XtVaSetValues(gain_box,
29104                   XmNpacking, XmPACK_TIGHT,
29105                   XmNorientation, XmHORIZONTAL,
29106                   XmNtopAttachment,XmATTACH_WIDGET,
29107                   XmNtopWidget,height_box,
29108                   XmNbottomAttachment,XmATTACH_NONE,
29109                   XmNleftAttachment, XmATTACH_FORM,
29110                   XmNleftOffset, 5,
29111                   XmNrightAttachment,XmATTACH_FORM,
29112                   XmNrightOffset, 5,
29113                   XmNnumColumns,10,
29114                   NULL);
29115 
29116 
29117     // 0 dB
29118     goption1 = XtVaCreateManagedWidget("0dB",
29119                                        xmToggleButtonGadgetClass,
29120                                        gain_box,
29121                                        MY_FOREGROUND_COLOR,
29122                                        MY_BACKGROUND_COLOR,
29123                                        XmNfontList, fontlist1,
29124                                        NULL);
29125     XtAddCallback(goption1,XmNvalueChangedCallback,Gain_toggle,"0");
29126 
29127     // 1 dB
29128     goption2 = XtVaCreateManagedWidget("1dB",
29129                                        xmToggleButtonGadgetClass,
29130                                        gain_box,
29131                                        MY_FOREGROUND_COLOR,
29132                                        MY_BACKGROUND_COLOR,
29133                                        XmNfontList, fontlist1,
29134                                        NULL);
29135     XtAddCallback(goption2,XmNvalueChangedCallback,Gain_toggle,"1");
29136 
29137     // 2 dB
29138     goption3 = XtVaCreateManagedWidget("2dB",
29139                                        xmToggleButtonGadgetClass,
29140                                        gain_box,
29141                                        MY_FOREGROUND_COLOR,
29142                                        MY_BACKGROUND_COLOR,
29143                                        XmNfontList, fontlist1,
29144                                        NULL);
29145     XtAddCallback(goption3,XmNvalueChangedCallback,Gain_toggle,"2");
29146 
29147     // 3 dB
29148     goption4 = XtVaCreateManagedWidget("3dB",
29149                                        xmToggleButtonGadgetClass,
29150                                        gain_box,
29151                                        MY_FOREGROUND_COLOR,
29152                                        MY_BACKGROUND_COLOR,
29153                                        XmNfontList, fontlist1,
29154                                        NULL);
29155     XtAddCallback(goption4,XmNvalueChangedCallback,Gain_toggle,"3");
29156 
29157     // 4 dB
29158     goption5 = XtVaCreateManagedWidget("4dB",
29159                                        xmToggleButtonGadgetClass,
29160                                        gain_box,
29161                                        MY_FOREGROUND_COLOR,
29162                                        MY_BACKGROUND_COLOR,
29163                                        XmNfontList, fontlist1,
29164                                        NULL);
29165     XtAddCallback(goption5,XmNvalueChangedCallback,Gain_toggle,"4");
29166 
29167     // 5 dB
29168     goption6 = XtVaCreateManagedWidget("5dB",
29169                                        xmToggleButtonGadgetClass,
29170                                        gain_box,
29171                                        MY_FOREGROUND_COLOR,
29172                                        MY_BACKGROUND_COLOR,
29173                                        XmNfontList, fontlist1,
29174                                        NULL);
29175     XtAddCallback(goption6,XmNvalueChangedCallback,Gain_toggle,"5");
29176 
29177     // 6 dB
29178     goption7 = XtVaCreateManagedWidget("6dB",
29179                                        xmToggleButtonGadgetClass,
29180                                        gain_box,
29181                                        MY_FOREGROUND_COLOR,
29182                                        MY_BACKGROUND_COLOR,
29183                                        XmNfontList, fontlist1,
29184                                        NULL);
29185     XtAddCallback(goption7,XmNvalueChangedCallback,Gain_toggle,"6");
29186 
29187     // 7 dB
29188     goption8 = XtVaCreateManagedWidget("7dB",
29189                                        xmToggleButtonGadgetClass,
29190                                        gain_box,
29191                                        MY_FOREGROUND_COLOR,
29192                                        MY_BACKGROUND_COLOR,
29193                                        XmNfontList, fontlist1,
29194                                        NULL);
29195     XtAddCallback(goption8,XmNvalueChangedCallback,Gain_toggle,"7");
29196 
29197     // 8 dB
29198     goption9 = XtVaCreateManagedWidget("8dB",
29199                                        xmToggleButtonGadgetClass,
29200                                        gain_box,
29201                                        MY_FOREGROUND_COLOR,
29202                                        MY_BACKGROUND_COLOR,
29203                                        XmNfontList, fontlist1,
29204                                        NULL);
29205     XtAddCallback(goption9,XmNvalueChangedCallback,Gain_toggle,"8");
29206 
29207     // 9 dB
29208     goption10 = XtVaCreateManagedWidget("9dB",
29209                                         xmToggleButtonGadgetClass,
29210                                         gain_box,
29211                                         MY_FOREGROUND_COLOR,
29212                                         MY_BACKGROUND_COLOR,
29213                                         XmNfontList, fontlist1,
29214                                         NULL);
29215     XtAddCallback(goption10,XmNvalueChangedCallback,Gain_toggle,"9");
29216 
29217 
29218     // Gain
29219     directivity_box = XmCreateRadioBox(formphg,
29220                                        "Configure_station Directivity Radio Box",
29221                                        al,
29222                                        ac);
29223 
29224     XtVaSetValues(directivity_box,
29225                   XmNpacking, XmPACK_TIGHT,
29226                   XmNorientation, XmHORIZONTAL,
29227                   XmNtopAttachment,XmATTACH_WIDGET,
29228                   XmNtopWidget,gain_box,
29229                   XmNbottomAttachment,XmATTACH_NONE,
29230                   XmNleftAttachment, XmATTACH_FORM,
29231                   XmNleftOffset, 5,
29232                   XmNrightAttachment,XmATTACH_FORM,
29233                   XmNrightOffset, 5,
29234                   XmNnumColumns,10,
29235                   NULL);
29236 
29237 
29238     // Omni-directional
29239     doption1 = XtVaCreateManagedWidget(langcode("WPUPCFS016"), // Omni
29240                                        xmToggleButtonGadgetClass,
29241                                        directivity_box,
29242                                        MY_FOREGROUND_COLOR,
29243                                        MY_BACKGROUND_COLOR,
29244                                        XmNfontList, fontlist1,
29245                                        NULL);
29246     XtAddCallback(doption1,XmNvalueChangedCallback,Directivity_toggle,"0");
29247 
29248     // 45 NE
29249     doption2 = XtVaCreateManagedWidget("45\xB0",
29250                                        xmToggleButtonGadgetClass,
29251                                        directivity_box,
29252                                        MY_FOREGROUND_COLOR,
29253                                        MY_BACKGROUND_COLOR,
29254                                        XmNfontList, fontlist1,
29255                                        NULL);
29256     XtAddCallback(doption2,XmNvalueChangedCallback,Directivity_toggle,"1");
29257 
29258     // 90 E
29259     doption3 = XtVaCreateManagedWidget("90\xB0",
29260                                        xmToggleButtonGadgetClass,
29261                                        directivity_box,
29262                                        MY_FOREGROUND_COLOR,
29263                                        MY_BACKGROUND_COLOR,
29264                                        XmNfontList, fontlist1,
29265                                        NULL);
29266     XtAddCallback(doption3,XmNvalueChangedCallback,Directivity_toggle,"2");
29267 
29268     // 135 SE
29269     doption4 = XtVaCreateManagedWidget("135\xB0",
29270                                        xmToggleButtonGadgetClass,
29271                                        directivity_box,
29272                                        MY_FOREGROUND_COLOR,
29273                                        MY_BACKGROUND_COLOR,
29274                                        XmNfontList, fontlist1,
29275                                        NULL);
29276     XtAddCallback(doption4,XmNvalueChangedCallback,Directivity_toggle,"3");
29277 
29278     // 180 S
29279     doption5 = XtVaCreateManagedWidget("180\xB0",
29280                                        xmToggleButtonGadgetClass,
29281                                        directivity_box,
29282                                        MY_FOREGROUND_COLOR,
29283                                        MY_BACKGROUND_COLOR,
29284                                        XmNfontList, fontlist1,
29285                                        NULL);
29286     XtAddCallback(doption5,XmNvalueChangedCallback,Directivity_toggle,"4");
29287 
29288     // 225 SW
29289     doption6 = XtVaCreateManagedWidget("225\xB0",
29290                                        xmToggleButtonGadgetClass,
29291                                        directivity_box,
29292                                        MY_FOREGROUND_COLOR,
29293                                        MY_BACKGROUND_COLOR,
29294                                        XmNfontList, fontlist1,
29295                                        NULL);
29296     XtAddCallback(doption6,XmNvalueChangedCallback,Directivity_toggle,"5");
29297 
29298     // 270 W
29299     doption7 = XtVaCreateManagedWidget("270\xB0",
29300                                        xmToggleButtonGadgetClass,
29301                                        directivity_box,
29302                                        MY_FOREGROUND_COLOR,
29303                                        MY_BACKGROUND_COLOR,
29304                                        XmNfontList, fontlist1,
29305                                        NULL);
29306     XtAddCallback(doption7,XmNvalueChangedCallback,Directivity_toggle,"6");
29307 
29308     // 315 NW
29309     doption8 = XtVaCreateManagedWidget("315\xB0",
29310                                        xmToggleButtonGadgetClass,
29311                                        directivity_box,
29312                                        MY_FOREGROUND_COLOR,
29313                                        MY_BACKGROUND_COLOR,
29314                                        XmNfontList, fontlist1,
29315                                        NULL);
29316     XtAddCallback(doption8,XmNvalueChangedCallback,Directivity_toggle,"7");
29317 
29318     // 360 N
29319     doption9 = XtVaCreateManagedWidget("360\xB0",
29320                                        xmToggleButtonGadgetClass,
29321                                        directivity_box,
29322                                        MY_FOREGROUND_COLOR,
29323                                        MY_BACKGROUND_COLOR,
29324                                        XmNfontList, fontlist1,
29325                                        NULL);
29326     XtAddCallback(doption9,XmNvalueChangedCallback,Directivity_toggle,"8");
29327 
29328 
29329 //-----------------------
29330     comment = XtVaCreateManagedWidget(langcode("WPUPCFS017"),
29331                                       xmLabelWidgetClass,
29332                                       cs_form,
29333                                       XmNtopAttachment,           XmATTACH_WIDGET,
29334                                       XmNtopWidget,               framephg,
29335                                       XmNtopOffset,               15,
29336                                       XmNbottomAttachment,        XmATTACH_NONE,
29337                                       XmNleftAttachment,          XmATTACH_FORM,
29338                                       XmNleftOffset,              10,
29339                                       XmNrightAttachment,         XmATTACH_NONE,
29340                                       MY_FOREGROUND_COLOR,
29341                                       MY_BACKGROUND_COLOR,
29342                                       XmNfontList, fontlist1,
29343                                       NULL);
29344 
29345 
29346     station_config_comment_data = XtVaCreateManagedWidget("Configure_station comment",
29347                                   xmTextFieldWidgetClass,
29348                                   cs_form,
29349                                   XmNeditable,                TRUE,
29350                                   XmNcursorPositionVisible,   TRUE,
29351                                   XmNsensitive,               TRUE,
29352                                   XmNshadowThickness,         1,
29353                                   XmNcolumns,                 60,
29354                                   XmNwidth,                   ((60*7)+2),
29355                                   XmNmaxLength,               MAX_COMMENT,
29356                                   XmNtopOffset,               11,
29357                                   XmNbackground,              colors[0x0f],
29358                                   XmNleftAttachment,          XmATTACH_WIDGET,
29359                                   XmNleftWidget,              comment,
29360                                   XmNleftOffset,              5,
29361                                   XmNtopAttachment,           XmATTACH_WIDGET,
29362                                   XmNtopWidget,               framephg,
29363                                   XmNbottomAttachment,        XmATTACH_NONE,
29364                                   XmNrightAttachment,         XmATTACH_NONE,
29365                                   XmNfontList, fontlist1,
29366                                   NULL);
29367 
29368 
29369 //Position Ambiguity Frame
29370     frame2 = XtVaCreateManagedWidget("Configure_station frame2",
29371                                      xmFrameWidgetClass,
29372                                      cs_form,
29373                                      XmNtopAttachment,           XmATTACH_WIDGET,
29374                                      XmNtopWidget,               comment,
29375                                      XmNtopOffset,               10,
29376                                      XmNbottomAttachment,        XmATTACH_NONE,
29377                                      XmNleftAttachment,          XmATTACH_FORM,
29378                                      XmNleftOffset,              10,
29379                                      XmNrightAttachment,         XmATTACH_FORM,
29380                                      XmNrightOffset,             10,
29381                                      MY_FOREGROUND_COLOR,
29382                                      MY_BACKGROUND_COLOR,
29383                                      NULL);
29384 
29385     //posamb
29386     XtVaCreateManagedWidget(langcode("WPUPCFS018"),
29387                             xmLabelWidgetClass,
29388                             frame2,
29389                             XmNchildType,               XmFRAME_TITLE_CHILD,
29390                             MY_FOREGROUND_COLOR,
29391                             MY_BACKGROUND_COLOR,
29392                             XmNfontList, fontlist1,
29393                             NULL);
29394 
29395     /*set args for color */
29396     ac=0;
29397     XtSetArg(al[ac], XmNforeground, MY_FG_COLOR);
29398     ac++;
29399     XtSetArg(al[ac], XmNbackground, MY_BG_COLOR);
29400     ac++;
29401     XtSetArg(al[ac], XmNfontList, fontlist1);
29402     ac++;
29403 
29404     option_box = XmCreateRadioBox(frame2,
29405                                   "Configure_station Option box",
29406                                   al,
29407                                   ac);
29408 
29409     XtVaSetValues(option_box,
29410                   XmNnumColumns,5,
29411                   NULL);
29412 
29413     posamb0 = XtVaCreateManagedWidget(langcode("WPUPCFS019"),
29414                                       xmToggleButtonGadgetClass,
29415                                       option_box,
29416                                       MY_FOREGROUND_COLOR,
29417                                       MY_BACKGROUND_COLOR,
29418                                       XmNfontList, fontlist1,
29419                                       NULL);
29420     XtAddCallback(posamb0,XmNvalueChangedCallback,Configure_station_toggle,"0");
29421 
29422     posamb1 = XtVaCreateManagedWidget(english_units?langcode("WPUPCFS020"):langcode("WPUPCFS024"),
29423                                       xmToggleButtonGadgetClass,
29424                                       option_box,
29425                                       MY_FOREGROUND_COLOR,
29426                                       MY_BACKGROUND_COLOR,
29427                                       XmNfontList, fontlist1,
29428                                       NULL);
29429     XtAddCallback(posamb1,XmNvalueChangedCallback,Configure_station_toggle,"1");
29430 
29431 
29432     posamb2 = XtVaCreateManagedWidget(english_units?langcode("WPUPCFS021"):langcode("WPUPCFS025"),
29433                                       xmToggleButtonGadgetClass,
29434                                       option_box,
29435                                       MY_FOREGROUND_COLOR,
29436                                       MY_BACKGROUND_COLOR,
29437                                       XmNfontList, fontlist1,
29438                                       NULL);
29439     XtAddCallback(posamb2,XmNvalueChangedCallback,Configure_station_toggle,"2");
29440 
29441     posamb3 = XtVaCreateManagedWidget(english_units?langcode("WPUPCFS022"):langcode("WPUPCFS026"),
29442                                       xmToggleButtonGadgetClass,
29443                                       option_box,
29444                                       MY_FOREGROUND_COLOR,
29445                                       MY_BACKGROUND_COLOR,
29446                                       XmNfontList, fontlist1,
29447                                       NULL);
29448     XtAddCallback(posamb3,XmNvalueChangedCallback,Configure_station_toggle,"3");
29449 
29450     posamb4 = XtVaCreateManagedWidget(english_units?langcode("WPUPCFS023"):langcode("WPUPCFS027"),
29451                                       xmToggleButtonGadgetClass,
29452                                       option_box,
29453                                       MY_FOREGROUND_COLOR,
29454                                       MY_BACKGROUND_COLOR,
29455                                       XmNfontList, fontlist1,
29456                                       NULL);
29457     XtAddCallback(posamb4,XmNvalueChangedCallback,Configure_station_toggle,"4");
29458 
29459     sep = XtVaCreateManagedWidget("Configure_station sep",
29460                                   xmSeparatorGadgetClass,
29461                                   cs_form,
29462                                   XmNorientation,             XmHORIZONTAL,
29463                                   XmNtopAttachment,           XmATTACH_WIDGET,
29464                                   XmNtopWidget,               frame2,
29465                                   XmNtopOffset,               14,
29466                                   XmNbottomAttachment,        XmATTACH_NONE,
29467                                   XmNleftAttachment,          XmATTACH_FORM,
29468                                   XmNrightAttachment,         XmATTACH_FORM,
29469                                   MY_FOREGROUND_COLOR,
29470                                   MY_BACKGROUND_COLOR,
29471                                   XmNfontList, fontlist1,
29472                                   NULL);
29473 
29474     button_ok = XtVaCreateManagedWidget(langcode("UNIOP00001"),
29475                                         xmPushButtonGadgetClass,
29476                                         cs_form,
29477                                         XmNtopAttachment,           XmATTACH_WIDGET,
29478                                         XmNtopWidget,               sep,
29479                                         XmNtopOffset,               5,
29480                                         XmNbottomAttachment,        XmATTACH_FORM,
29481                                         XmNbottomOffset,            5,
29482                                         XmNleftAttachment,          XmATTACH_POSITION,
29483                                         XmNleftPosition,            1,
29484                                         XmNrightAttachment,         XmATTACH_POSITION,
29485                                         XmNrightPosition,           2,
29486                                         XmNnavigationType,          XmTAB_GROUP,
29487                                         MY_FOREGROUND_COLOR,
29488                                         MY_BACKGROUND_COLOR,
29489                                         XmNfontList, fontlist1,
29490                                         NULL);
29491 
29492     button_cancel = XtVaCreateManagedWidget(langcode("UNIOP00002"),
29493                                             xmPushButtonGadgetClass,
29494                                             cs_form,
29495                                             XmNtopAttachment,           XmATTACH_WIDGET,
29496                                             XmNtopWidget,               sep,
29497                                             XmNtopOffset,               5,
29498                                             XmNbottomAttachment,        XmATTACH_FORM,
29499                                             XmNbottomOffset,            5,
29500                                             XmNleftAttachment,          XmATTACH_POSITION,
29501                                             XmNleftPosition,            3,
29502                                             XmNrightAttachment,         XmATTACH_POSITION,
29503                                             XmNrightPosition,           4,
29504                                             XmNnavigationType,          XmTAB_GROUP,
29505                                             MY_FOREGROUND_COLOR,
29506                                             MY_BACKGROUND_COLOR,
29507                                             XmNfontList, fontlist1,
29508                                             NULL);
29509 
29510     XtAddCallback(button_ok, XmNactivateCallback, Configure_station_change_data, configure_station_dialog);
29511     XtAddCallback(button_cancel, XmNactivateCallback, Configure_station_destroy_shell, configure_station_dialog);
29512 
29513     // fill in current data
29514     XmTextFieldSetString(station_config_call_data,my_callsign);
29515 
29516     substr(temp_data,my_lat,2);
29517     XmTextFieldSetString(station_config_slat_data_deg,temp_data);
29518     substr(temp_data,my_lat+2,6);
29519     XmTextFieldSetString(station_config_slat_data_min,temp_data);
29520     substr(temp_data,my_lat+8,1);
29521     XmTextFieldSetString(station_config_slat_data_ns,temp_data);
29522 
29523     substr(temp_data,my_long,3);
29524     XmTextFieldSetString(station_config_slong_data_deg,temp_data);
29525     substr(temp_data,my_long+3,6);
29526     XmTextFieldSetString(station_config_slong_data_min,temp_data);
29527     substr(temp_data,my_long+9,1);
29528     XmTextFieldSetString(station_config_slong_data_ew,temp_data);
29529 
29530     temp_data[0] = my_group;
29531     temp_data[1] = '\0';
29532     XmTextFieldSetString(station_config_group_data,temp_data);
29533     XtAddCallback(station_config_group_data, XmNvalueChangedCallback, updateSymbolPictureCallback, configure_station_dialog);
29534 
29535     temp_data[0] = my_symbol;
29536     temp_data[1] = '\0';
29537     XmTextFieldSetString(station_config_symbol_data,temp_data);
29538     XtAddCallback(station_config_symbol_data, XmNvalueChangedCallback, updateSymbolPictureCallback, configure_station_dialog);
29539 
29540     // update symbol picture
29541     (void)updateSymbolPictureCallback((Widget)NULL,(XtPointer)NULL,(XtPointer)NULL);
29542 
29543 
29544     if (my_phg[0]=='P')
29545     {
29546       switch (my_phg[3])
29547       {
29548         case '0':
29549           XmToggleButtonGadgetSetState(poption1, TRUE, TRUE);
29550           break;
29551         case '1':
29552           XmToggleButtonGadgetSetState(poption2, TRUE, TRUE);
29553           break;
29554         case '2':
29555           XmToggleButtonGadgetSetState(poption3, TRUE, TRUE);
29556           break;
29557         case '3':
29558           XmToggleButtonGadgetSetState(poption4, TRUE, TRUE);
29559           break;
29560         case '4':
29561           XmToggleButtonGadgetSetState(poption5, TRUE, TRUE);
29562           break;
29563         case '5':
29564           XmToggleButtonGadgetSetState(poption6, TRUE, TRUE);
29565           break;
29566         case '6':
29567           XmToggleButtonGadgetSetState(poption7, TRUE, TRUE);
29568           break;
29569         case '7':
29570           XmToggleButtonGadgetSetState(poption8, TRUE, TRUE);
29571           break;
29572         case '8':
29573           XmToggleButtonGadgetSetState(poption9, TRUE, TRUE);
29574           break;
29575         case '9':
29576           XmToggleButtonGadgetSetState(poption10, TRUE, TRUE);
29577           break;
29578         case 'x':
29579         default:
29580           XmToggleButtonGadgetSetState(poption0, TRUE, TRUE);
29581           break;
29582       }
29583       switch (my_phg[4])
29584       {
29585         case '0':
29586           XmToggleButtonGadgetSetState(hoption1, TRUE, TRUE);
29587           break;
29588         case '1':
29589           XmToggleButtonGadgetSetState(hoption2, TRUE, TRUE);
29590           break;
29591         case '2':
29592           XmToggleButtonGadgetSetState(hoption3, TRUE, TRUE);
29593           break;
29594         case '3':
29595           XmToggleButtonGadgetSetState(hoption4, TRUE, TRUE);
29596           break;
29597         case '4':
29598           XmToggleButtonGadgetSetState(hoption5, TRUE, TRUE);
29599           break;
29600         case '5':
29601           XmToggleButtonGadgetSetState(hoption6, TRUE, TRUE);
29602           break;
29603         case '6':
29604           XmToggleButtonGadgetSetState(hoption7, TRUE, TRUE);
29605           break;
29606         case '7':
29607           XmToggleButtonGadgetSetState(hoption8, TRUE, TRUE);
29608           break;
29609         case '8':
29610           XmToggleButtonGadgetSetState(hoption9, TRUE, TRUE);
29611           break;
29612         case '9':
29613           XmToggleButtonGadgetSetState(hoption10, TRUE, TRUE);
29614           break;
29615         default:
29616           break;
29617       }
29618       switch (my_phg[5])
29619       {
29620         case '0':
29621           XmToggleButtonGadgetSetState(goption1, TRUE, TRUE);
29622           break;
29623         case '1':
29624           XmToggleButtonGadgetSetState(goption2, TRUE, TRUE);
29625           break;
29626         case '2':
29627           XmToggleButtonGadgetSetState(goption3, TRUE, TRUE);
29628           break;
29629         case '3':
29630           XmToggleButtonGadgetSetState(goption4, TRUE, TRUE);
29631           break;
29632         case '4':
29633           XmToggleButtonGadgetSetState(goption5, TRUE, TRUE);
29634           break;
29635         case '5':
29636           XmToggleButtonGadgetSetState(goption6, TRUE, TRUE);
29637           break;
29638         case '6':
29639           XmToggleButtonGadgetSetState(goption7, TRUE, TRUE);
29640           break;
29641         case '7':
29642           XmToggleButtonGadgetSetState(goption8, TRUE, TRUE);
29643           break;
29644         case '8':
29645           XmToggleButtonGadgetSetState(goption9, TRUE, TRUE);
29646           break;
29647         case '9':
29648           XmToggleButtonGadgetSetState(goption10, TRUE, TRUE);
29649           break;
29650         default:
29651           break;
29652       }
29653       switch (my_phg[6])
29654       {
29655         case '0':
29656           XmToggleButtonGadgetSetState(doption1, TRUE, TRUE);
29657           break;
29658         case '1':
29659           XmToggleButtonGadgetSetState(doption2, TRUE, TRUE);
29660           break;
29661         case '2':
29662           XmToggleButtonGadgetSetState(doption3, TRUE, TRUE);
29663           break;
29664         case '3':
29665           XmToggleButtonGadgetSetState(doption4, TRUE, TRUE);
29666           break;
29667         case '4':
29668           XmToggleButtonGadgetSetState(doption5, TRUE, TRUE);
29669           break;
29670         case '5':
29671           XmToggleButtonGadgetSetState(doption6, TRUE, TRUE);
29672           break;
29673         case '6':
29674           XmToggleButtonGadgetSetState(doption7, TRUE, TRUE);
29675           break;
29676         case '7':
29677           XmToggleButtonGadgetSetState(doption8, TRUE, TRUE);
29678           break;
29679         case '8':
29680           XmToggleButtonGadgetSetState(doption9, TRUE, TRUE);
29681           break;
29682         default:
29683           break;
29684       }
29685     }
29686     else      // PHG field disabled
29687     {
29688       XmToggleButtonGadgetSetState(poption0, TRUE, TRUE);
29689     }
29690 
29691 
29692     XmTextFieldSetString(station_config_comment_data,my_comment);
29693 
29694 
29695     if(transmit_compressed_posit)
29696     {
29697       // Compressed posits don't allow position ambiguity
29698       XmToggleButtonSetState(compressed_posit_tx,TRUE,FALSE);
29699       position_amb_chars = 0;
29700       XtSetSensitive(posamb0,FALSE);
29701       XtSetSensitive(posamb1,FALSE);
29702       XtSetSensitive(posamb2,FALSE);
29703       XtSetSensitive(posamb3,FALSE);
29704       XtSetSensitive(posamb4,FALSE);
29705     }
29706     else    // Position ambiguity ok for this mode
29707     {
29708       XmToggleButtonSetState(compressed_posit_tx,FALSE,FALSE);
29709 
29710       XtSetSensitive(posamb0,TRUE);
29711       XtSetSensitive(posamb1,TRUE);
29712       XtSetSensitive(posamb2,TRUE);
29713       XtSetSensitive(posamb3,TRUE);
29714       XtSetSensitive(posamb4,TRUE);
29715     }
29716 
29717     Configure_station_pos_amb = position_amb_chars;
29718     switch (Configure_station_pos_amb)
29719     {
29720       case(0):
29721         XmToggleButtonSetState(posamb0,TRUE,FALSE);
29722         break;
29723 
29724       case(1):
29725         XmToggleButtonSetState(posamb1,TRUE,FALSE);
29726         break;
29727 
29728       case(2):
29729         XmToggleButtonSetState(posamb2,TRUE,FALSE);
29730         break;
29731 
29732       case(3):
29733         XmToggleButtonSetState(posamb3,TRUE,FALSE);
29734         break;
29735 
29736       case(4):
29737         XmToggleButtonSetState(posamb4,TRUE,FALSE);
29738         break;
29739 
29740       default:
29741         XmToggleButtonSetState(posamb0,TRUE,FALSE);
29742         break;
29743     }
29744 
29745     pos_dialog(configure_station_dialog);
29746 
29747     delw = XmInternAtom(XtDisplay(configure_station_dialog),"WM_DELETE_WINDOW", FALSE);
29748 
29749     XmAddWMProtocolCallback(configure_station_dialog, delw, Configure_station_destroy_shell, (XtPointer)configure_station_dialog);
29750 
29751     XtManageChild(cs_form);
29752     XtManageChild(cs_form1);
29753     XtManageChild(option_box);
29754     XtManageChild(power_box);
29755     XtManageChild(height_box);
29756     XtManageChild(gain_box);
29757     XtManageChild(directivity_box);
29758     XtManageChild(formphg);
29759     XtManageChild(pane);
29760 
29761     resize_dialog(cs_form, configure_station_dialog);
29762 
29763     XtPopup(configure_station_dialog,XtGrabNone);
29764 
29765     // Move focus to the Close button.  This appears to highlight the
29766     // button fine, but we're not able to hit the <Enter> key to
29767     // have that default function happen.  Note:  We _can_ hit the
29768     // <SPACE> key, and that activates the option.
29769 //        XmUpdateDisplay(configure_station_dialog);
29770     XmProcessTraversal(button_cancel, XmTRAVERSE_CURRENT);
29771 
29772   }
29773   else
29774   {
29775     (void)XRaiseWindow(XtDisplay(configure_station_dialog), XtWindow(configure_station_dialog));
29776   }
29777 }
29778 
29779 
29780 
29781 
29782 
29783 // Borrowed from the libiberty library, a GPL'ed program.
29784 //
29785 void freeargv (char **vector)
29786 {
29787   register char **scan;
29788 
29789   if (vector != NULL)
29790   {
29791     for (scan = vector; *scan != NULL; scan++)
29792     {
29793       free (*scan);
29794     }
29795     free (vector);
29796   }
29797 }
29798 
29799 
29800 
29801 
29802 
29803 // Borrowed from the libiberty library, a GPL'ed program.
29804 //
29805 char **dupargv (char **argv)
29806 {
29807   int argc;
29808   char **copy;
29809 
29810   if (argv == NULL)
29811   {
29812     return NULL;
29813   }
29814 
29815   /* the vector */
29816   for (argc = 0; argv[argc] != NULL; argc++);
29817 
29818   copy = (char **) calloc ((argc + 1), sizeof (char *));
29819 
29820   if (copy == NULL)
29821   {
29822     return NULL;
29823   }
29824 
29825   /* the strings */
29826   for (argc = 0; argv[argc] != NULL; argc++)
29827   {
29828     int len = strlen (argv[argc]);
29829 
29830     copy[argc] = malloc (sizeof (char *) * (len + 1));
29831     if (copy[argc] == NULL)
29832     {
29833       freeargv (copy);
29834       return NULL;
29835     }
29836     strcpy (copy[argc], argv[argc]);
29837   }
29838   copy[argc] = NULL;
29839   return copy;
29840 }
29841 
29842 
29843 
29844 
29845 
29846 /////////////////////////////////////////////   main   /////////////////////////////////////////////
29847 
29848 
29849 // Third argument is now deprecated
29850 //int main(int argc, char *argv[], char *envp[]) {
29851 
29852 int main(int argc, char *argv[], char *envp[])
29853 {
29854   int ag, ag_error, trap_segfault, deselect_maps_on_startup;
29855   uid_t user_id;
29856   struct passwd *user_info;
29857   static char lang_to_use_or[30];
29858   char temp[100];
29859   static char *Geometry = NULL;
29860   static int xt = 0;
29861   char temp_base_dir[MAX_VALUE];
29862 
29863   // Define some overriding resources for the widgets.
29864   // Look at files in /usr/X11/lib/X11/app-defaults for ideas.
29865   String fallback_resources[] =
29866   {
29867 
29868 //        "Mwm*iconImageForeground: #000000000000\n",
29869 
29870     "*initialResourcesPersistent: False\n",
29871 
29872 // Default font if nothing else overrides it:
29873     "*.fontList:    fixed\n",
29874 
29875     "*List.Translations: #override \n\
29876         <Key>Return:    Select(children)\n\
29877         <Key>space:     Select(children)\n",
29878 
29879     "*List.baseTranslations: #override \n\
29880         <Key>Return:    Select(children)\n\
29881         <Key>space:     Select(children)\n",
29882 
29883     "*XmTextField.translations: #override \
29884         <Key>Return:    activate()\n\
29885         <Key>Enter:     activate()\n",
29886 
29887     "*.Text.Translations: #override\n\
29888         Ctrl<Key>S:     no-op(RingBell)\n\
29889         Ctrl<Key>R:     no-op(RingBell)\n\
29890         <Key>space:     next-page()\n\
29891         <Key>F:         next-page()\n\
29892         Ctrl<Key>B:     previous-page()\n\
29893         <Key>B:         previous-page()\n\
29894         <Key>K:         scroll-one-line-down()\n\
29895         <Key>Y:         scroll-one-line-down()\n\
29896         <Key>J:         scroll-one-line-up()\n\
29897         <Key>E:         scroll-one-line-up()\n\
29898         <Key>Return:    scroll-one-line-up()\n\
29899         <Key>q:         quit()\n",
29900 
29901     "*.Text.baseTranslations: #override\n\
29902         <Key>space:     next-page()\n\
29903         <Key>F:         next-page()\n\
29904         Ctrl<Key>B:     previous-page()\n\
29905         <Key>K:         scroll-one-line-down()\n\
29906         <Key>Y:         scroll-one-line-down()\n\
29907         <Key>J:         scroll-one-line-up()\n\
29908         <Key>E:         scroll-one-line-up()\n\
29909         <Key>Return:    scroll-one-line-up()\n\
29910         <Key>q:         quit()\n",
29911 
29912     "*.vertical.Translations: #override\n\
29913         <Key>space: StartScroll(Forward)  NotifyScroll(FullLength) EndScroll() \n\
29914         <Key>Delete: StartScroll(Backward) NotifyScroll(FullLength) EndScroll() \n\
29915         Ctrl<Key>Up:        KbdScroll(up,50) EndScroll()\n\
29916         Ctrl<Key>Down:      KbdScroll(down,50) EndScroll()\n\
29917         <Key>Up:            KbdScroll(up,10) EndScroll()\n\
29918         <Key>Down:          KbdScroll(down,10) EndScroll()\n\
29919         <Key>Page_Up:       KbdScroll(up,90) EndScroll()\n\
29920         <Key>Page_Down:     KbdScroll(down,90) EndScroll()\n",
29921 
29922     "*.horizontal.translations:      #override \n\
29923         Ctrl<Key>Left:      KbdScroll(left,50) EndScroll()\n\
29924         Ctrl<Key>Right:     KbdScroll(right,50) EndScroll()\n\
29925         <Key>Left:          KbdScroll(left,10) EndScroll()\n\
29926         <Key>Right:         KbdScroll(right,10) EndScroll()\n",
29927 
29928     "*.horizontal.accelerators:      #override \n\
29929         Ctrl<Key>Left:      KbdScroll(left,50) EndScroll()\n\
29930         Ctrl<Key>Right:     KbdScroll(right,50) EndScroll()\n\
29931         <Key>Left:          KbdScroll(left,10) EndScroll()\n\
29932         <Key>Right:         KbdScroll(right,10) EndScroll()\n",
29933 
29934     "*.vertical.accelerators:        #override \n\
29935         Ctrl<Key>Up:        KbdScroll(up,50) EndScroll()\n\
29936         Ctrl<Key>Down:      KbdScroll(down,50) EndScroll()\n\
29937         <Key>Up:            KbdScroll(up,10) EndScroll()\n\
29938         <Key>Down:          KbdScroll(down,10) EndScroll()\n\
29939         <Key>Page_Up:       KbdScroll(up,90) EndScroll()\n\
29940         <Key>Page_Down:     KbdScroll(down,90) EndScroll()\n",
29941 
29942     "*.nodeText.Translations: #override \n\
29943         None<Key>b:     beginning-of-file() \n\
29944         <Key>Home:      beginning-of-file() \n\
29945         <Key>Delete:    previous-page() \n\
29946         <Key>Prior:     previous-page() \n\
29947         <Key>Next:      next-page() \n\
29948         <Key>space:     next-page() \n\
29949         None<Btn1Down>: select-end() info_click() \n",
29950 
29951     "*.arg.translations:    #override \n\
29952         <Key>Return: confirm() \n\
29953         Ctrl<Key>G:  abort() \n",
29954 
29955     "*.pane.text.translations:         #override \n\
29956         None<Key>q:     MenuPopdown(help) \n\
29957         None<Key>b:     beginning-of-file() \n\
29958         <Key>Home:      beginning-of-file() \n\
29959         <Key>Delete:    previous-page() \n\
29960         <Key>Prior:     previous-page() \n\
29961         <Key>Next:      next-page() \n\
29962         <Key>space:     next-page() \n",
29963 
29964     "*.dialog.value.translations:     #override \n\
29965         <Key>Return: confirm() \n\
29966         Ctrl<Key>G:  abort() \n\
29967         <Key>Tab: Complete()\n",
29968 
29969     "*.dialog.value.baseTranslations:     #override \n\
29970         <Key>Return: confirm() \n\
29971         Ctrl<Key>G:  abort() \n",
29972 
29973     "*.baseTranslations: #override \n\
29974         Ctrl<Key>q: Quit()\n\
29975         Ctrl<Key>c: Quit()\n\
29976         <Key>Return: Accept()\n",
29977 
29978     "*Translations: #override \n\
29979         <Key>q: Quit()\n\
29980         <Key>c: Quit()\n\
29981         Ctrl <Key>n: Next()\n\
29982         Ctrl <Key>p: Prev()\n",
29983 
29984     "*minWidth: 200\n",
29985 
29986     "*minHeight: 100\n",
29987 
29988     NULL
29989   };
29990 
29991 
29992 #ifndef optarg
29993   extern char *optarg;
29994 #endif  // optarg
29995 
29996   extern char gitstring[];
29997 
29998 #ifdef USING_LIBGC
29999   GC_find_leak = 1;
30000   GC_INIT();
30001 #endif  // USING_LIBGC
30002 
30003 
30004   // Make copies of argc/argv/envp so that we can start other
30005   // processes and know the environment we were started with.
30006   //
30007   my_argc = argc;
30008 //    my_argv = argv;
30009   my_argv = dupargv(argv);
30010   my_envp = (void *)&envp[0];
30011 
30012 
30013 
30014   euid = geteuid();
30015   egid = getegid();
30016 
30017   DISABLE_SETUID_PRIVILEGE;
30018 
30019   program_start_time = sec_now(); // For use by "Display Uptime"
30020 
30021   (void)setlocale(LC_NUMERIC, "C");
30022   (void)setlocale(LC_CTYPE, "C");
30023 
30024 #ifdef HAVE_LIBCURL
30025   curl_global_init(CURL_GLOBAL_ALL);
30026 #endif
30027 
30028 
30029 #ifdef HAVE_GRAPHICSMAGICK
30030   InitializeMagick(*argv);
30031 #else   // HAVE_GRAPHICSMAGICK
30032 #ifdef HAVE_IMAGEMAGICK
30033 #if (MagickLibVersion < 0x0538)
30034   MagickIncarnate(*argv);
30035 #else   // 0x0538 < MagickLibVersion < 0x0669
30036   #if (MagickLibVersion < 0x0669)
30037     InitializeMagick(*argv);
30038   #else // > 0x669
30039     MagickCoreGenesis(*argv, MagickTrue);
30040   #endif
30041 #endif  // MagickLibVersion < 0x0538
30042 #endif  // HAVE_IMAGEMAGICK
30043 #endif  //HAVE_GRAPHICSMAGICK
30044 
30045 
30046   /* check fhs directories ?*/
30047 
30048   /* setup values */
30049   redo_list = FALSE;          // init lists
30050 
30051   xa_config_dir[0]='\0';
30052 
30053   delay_time = 0;
30054   last_weather_cycle = sec_now();
30055   redraw_on_new_packet_data = 0;
30056   next_file_read = sec_now();         // init file replay timing
30057   redraw_on_new_data = 0;
30058   display_up = 0;
30059   display_up_first = 0;
30060   max_transmit_time = (time_t)900l;
30061   sec_next_gps = 0l;
30062   gprmc_save_string[0] = '\0';
30063   gpgga_save_string[0] = '\0';
30064   sec_next_raw_wx = 0l;
30065   auto_reply = 0;
30066   satellite_ack_mode = 0;
30067   last_time = 0l;
30068   next_time = (time_t)120l;
30069   net_last_time = 0l;
30070   net_next_time = (time_t)120l;
30071   posit_last_time = 0l;
30072   posit_next_time = 0l;
30073   wait_to_redraw=1;
30074 
30075   last_popup_x = 0;
30076   last_popup_y = 0;
30077   trap_segfault = 0;          // Default is to dump core
30078   deselect_maps_on_startup = 0;
30079   debug_level = 0;
30080   install_colormap = 0;
30081   last_sound_pid = 0;
30082 
30083   my_last_course = 0;
30084   my_last_speed = 0;
30085   my_last_altitude = 0l;
30086   my_last_altitude_time = 0l;
30087 
30088   wx_station_type[0] = '\0';
30089   last_alert_redraw = 0;
30090   igate_msgs_tx = 0;
30091   last_statusline = 0;        // inactive statusline
30092 
30093   last_object[0] = '\0';      // initialize object dialog
30094   last_obj_grp   = '\\';
30095   last_obj_sym   = '!';
30096 
30097   clear_rain_data();          // init weather data
30098   clear_local_wx_data();
30099 
30100   next_redraw = sec_now()+60; // init redraw timing
30101   last_redraw = sec_now();
30102 
30103   lang_to_use_or[0] = '\0';
30104   ag_error=0;
30105 
30106   // Reset the gps variables.
30107   xastir_snprintf(gps_sats,
30108                   sizeof(gps_sats),
30109                   "00");
30110   gps_valid = 0;
30111 
30112   memset(&appshell, 0, sizeof(appshell));
30113 
30114   // Here we had to add "g:" in order to allow -geometry to be
30115   // used and x: to allow xt arguments, which is actually parsed out
30116   // by the XtIntrinsics code, not directly in Xastir code.
30117   //
30118   while ((ag = getopt(argc, argv, "c:f:v:l:g:x:012346789timpV")) != EOF)
30119   {
30120 
30121     switch (ag)
30122     {
30123 
30124       case 'c':
30125         if (optarg)
30126         {
30127           xastir_snprintf(xa_config_dir,sizeof(xa_config_dir),"%s", optarg);
30128           fprintf(stderr,"Using config dir %s\n",xa_config_dir);
30129         }
30130         break;
30131 
30132       case 'f':   // Track callsign
30133         if (optarg)
30134         {
30135           xastir_snprintf(temp_tracking_station_call,
30136                           sizeof(temp_tracking_station_call),
30137                           "%s",
30138                           optarg);
30139           fprintf(stderr,
30140                   "Tracking callsign %s\n",
30141                   temp_tracking_station_call);
30142           (void)remove_leading_spaces(temp_tracking_station_call);
30143           (void)remove_trailing_spaces(temp_tracking_station_call);
30144           (void)remove_trailing_dash_zero(temp_tracking_station_call);
30145           (void)to_upper(temp_tracking_station_call);
30146         }
30147         break;
30148 
30149       case 't':
30150         fprintf(stderr,"Internal SIGSEGV handler enabled\n");
30151         trap_segfault = 1;
30152         break;
30153 
30154       case 'v':
30155         fprintf(stderr,"debug");
30156         if (optarg)
30157         {
30158           debug_level = atoi(optarg);
30159           fprintf(stderr," level %d", debug_level);
30160         }
30161         fprintf(stderr,"\n");
30162         break;
30163 
30164       case 'V':
30165         printf("\nXastir V%s %s\n",xastir_version, gitstring);
30166         exit(0);
30167         break;
30168       case 'l':
30169         fprintf(stderr,"Language is");
30170         if (optarg)
30171         {
30172           lang_to_use_or[0] = '\0';
30173           if        (strncasecmp(optarg,"ENGLISH",    7) == 0)
30174           {
30175             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "English");
30176           }
30177           else if (strncasecmp(optarg,"DUTCH",      5) == 0)
30178           {
30179             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "Dutch");
30180           }
30181           else if (strncasecmp(optarg,"FRENCH",     6) == 0)
30182           {
30183             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "French");
30184           }
30185           else if (strncasecmp(optarg,"GERMAN",     6) == 0)
30186           {
30187             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "German");
30188           }
30189           else if (strncasecmp(optarg,"SPANISH",    7) == 0)
30190           {
30191             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "Spanish");
30192           }
30193           else if (strncasecmp(optarg,"ITALIAN",    7) == 0)
30194           {
30195             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "Italian");
30196           }
30197           else if (strncasecmp(optarg,"PORTUGUESE",10) == 0)
30198           {
30199             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "Portuguese");
30200           }
30201           else if (strncasecmp(optarg,"ELMERFUDD",10) == 0)
30202           {
30203             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "ElmerFudd");
30204           }
30205           else if (strncasecmp(optarg,"MUPPETSCHEF",10) == 0)
30206           {
30207             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "MuppetsChef");
30208           }
30209           else if (strncasecmp(optarg,"OLDEENGLISH",10) == 0)
30210           {
30211             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "OldeEnglish");
30212           }
30213           else if (strncasecmp(optarg,"PIGLATIN",10) == 0)
30214           {
30215             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "PigLatin");
30216           }
30217           else if (strncasecmp(optarg,"PIRATEENGLISH",10) == 0)
30218           {
30219             xastir_snprintf(lang_to_use_or, sizeof(lang_to_use_or), "PirateEnglish");
30220           }
30221           else
30222           {
30223             ag_error++;
30224             fprintf(stderr," INVALID");
30225           }
30226           if (!ag_error)
30227           {
30228             fprintf(stderr," %s", lang_to_use_or);
30229           }
30230         }
30231         fprintf(stderr,"\n");
30232         break;
30233 
30234       case 'i':
30235         fprintf(stderr,"Install Colormap\n");
30236         install_colormap = (int)TRUE;
30237         break;
30238 
30239       case 'm':
30240         fprintf(stderr,"De-select Maps\n");
30241         deselect_maps_on_startup = (int)TRUE;
30242         break;
30243 
30244       case 'g':   // -geometry
30245         Geometry = argv[optind++];
30246         break;
30247 
30248       case 'x':   // -xtsessionID
30249         optind++; // swallow argument, let XtIntrinsics deal with it.
30250         xt = 1;
30251         break;
30252 
30253       case 'p':   // Disable popups
30254         disable_all_popups = 1;
30255         pop_up_new_bulletins = 0;
30256         warn_about_mouse_modifiers = 0;
30257         break;
30258 
30259       default:
30260         ag_error++;
30261         break;
30262     }
30263   }
30264 
30265 
30266   if (ag_error)
30267   {
30268     fprintf(stderr,"\nXastir Command line Options\n\n");
30269     fprintf(stderr,"-c /path/dir       Xastir config dir\n");
30270     fprintf(stderr,"-f callsign        Track callsign\n");
30271     fprintf(stderr,"-i                 Install private Colormap\n");
30272     fprintf(stderr,"-geometry WxH+X+Y  Set Window Geometry\n");
30273     fprintf(stderr,"-l Dutch           Set the language to Dutch\n");
30274     fprintf(stderr,"-l English         Set the language to English\n");
30275     fprintf(stderr,"-l French          Set the language to French\n");
30276     fprintf(stderr,"-l German          Set the language to German\n");
30277     fprintf(stderr,"-l Italian         Set the language to Italian\n");
30278     fprintf(stderr,"-l Portuguese      Set the language to Portuguese\n");
30279     fprintf(stderr,"-l Spanish         Set the language to Spanish\n");
30280     fprintf(stderr,"-l ElmerFudd       Set the language to ElmerFudd\n");
30281     fprintf(stderr,"-l MuppetsChef     Set the language to MuppetsChef\n");
30282     fprintf(stderr,"-l OldeEnglish     Set the language to OldeEnglish\n");
30283     fprintf(stderr,"-l PigLatin        Set the language to PigLatin\n");
30284     fprintf(stderr,"-l PirateEnglish   Set the language to PirateEnglish\n");
30285     fprintf(stderr,"-m                 Deselect Maps\n");
30286     fprintf(stderr,"-p                 Disable popups\n");
30287     fprintf(stderr,"-t                 Internal SIGSEGV handler enabled\n");
30288     fprintf(stderr,"-v level           Set the debug level\n");
30289     fprintf(stderr,"-V                 Print version number and exit\n\n");
30290     fprintf(stderr,"\n");
30291     exit(0);    // Exiting after dumping out command-line options
30292   }
30293 
30294 
30295   // If we don't make this call, we can't access Xt or
30296   // Xlib calls from multiple threads at the same time.
30297   // Note that Motif from the OSF (including OpenMotif)
30298   // still can't handle multiple threads talking to it at
30299   // the same time.  See:
30300   // http://www.faqs.org/faqs/x-faq/part7/section-46.html
30301   // We'll probably have to add in a global mutex lock in
30302   // order to keep from accessing the widget set from more
30303   // than one thread.
30304   //
30305   XInitThreads();
30306 
30307 
30308   // Set language attribs.  Must be called prior to
30309   // XtVaOpenApplication().
30310   (void)XtSetLanguageProc((XtAppContext) NULL,
30311                           XtSetLanguageProc(NULL, NULL, NULL),
30312                           (XtPointer) NULL );
30313 
30314 
30315   if (Geometry)
30316   {
30317     //
30318     // Really we should be merging with the RDB database as well
30319     // and then parsing the final geometry (Xlib Programming
30320     // Manual section 14.4.3 and 14.4.4).
30321     //
30322     geometry_flags = XParseGeometry(Geometry,
30323                                     &geometry_x,
30324                                     &geometry_y,
30325                                     &geometry_width,
30326                                     &geometry_height);
30327 
30328     /*
30329             if ((WidthValue|HeightValue) & geometry_flags) {
30330                 fprintf(stderr,"Found width/height\n");
30331             }
30332             if (XValue & geometry_flags) {
30333                 fprintf(stderr,"Found X-offset\n");
30334             }
30335             if (YValue & geometry_flags) {
30336                 fprintf(stderr,"Found Y-offset\n");
30337             }
30338             fprintf(stderr,
30339                 "appshell:  Width:%4d  Height:%4d  X-offset:%4d  Y-offset:%4d\n",
30340                 (int)geometry_width,
30341                 (int)geometry_height,
30342                 (int)geometry_x,
30343                 (int)geometry_y);
30344     */
30345   }
30346 
30347 
30348   /* get User info */
30349   user_id   = getuid();
30350   user_info = getpwuid(user_id);
30351   xastir_snprintf(user_dir,
30352                   sizeof(user_dir),
30353                   "%s",
30354                   user_info->pw_dir);
30355 
30356   /*
30357       fprintf(stderr,"User %s, Dir %s\n",user_info->pw_name,user_dir);
30358       fprintf(stderr,"User dir %s\n",get_user_base_dir(""));
30359       fprintf(stderr,"Data dir %s\n",get_data_base_dir(""));
30360   */
30361 
30362   /* check user directories */
30363   if (filethere(get_user_base_dir("", temp_base_dir, sizeof(temp_base_dir))) != 1)
30364   {
30365     fprintf(stderr,"Making user dir\n");
30366     if (mkdir(get_user_base_dir("", temp_base_dir, sizeof(temp_base_dir)),S_IRWXU) !=0)
30367     {
30368       fprintf(stderr,"Fatal error making user dir '%s':\n\t%s \n",
30369               get_user_base_dir("", temp_base_dir, sizeof(temp_base_dir)), strerror(errno) );
30370 
30371       // Creature to feep later?
30372       // needs <libgen.h>
30373       // fprintf(stderr,"Check to see if '%s' exists \n",
30374       //    dirname(get_user_base_dir("")) );
30375 
30376       exit(errno);
30377     }
30378 
30379   }
30380 
30381   if (filethere(get_user_base_dir("config", temp_base_dir, sizeof(temp_base_dir))) != 1)
30382   {
30383     fprintf(stderr,"Making user config dir\n");
30384     if (mkdir(get_user_base_dir("config", temp_base_dir, sizeof(temp_base_dir)),S_IRWXU) !=0)
30385     {
30386       fprintf(stderr,"Fatal error making user dir '%s':\n\t%s \n",
30387               get_user_base_dir("config", temp_base_dir, sizeof(temp_base_dir)), strerror(errno) );
30388       exit(errno);
30389     }
30390   }
30391 
30392   if (filethere(get_user_base_dir("data", temp_base_dir, sizeof(temp_base_dir))) != 1)
30393   {
30394     fprintf(stderr,"Making user data dir\n");
30395     if (mkdir(get_user_base_dir("data", temp_base_dir, sizeof(temp_base_dir)),S_IRWXU) !=0)
30396     {
30397       fprintf(stderr,"Fatal error making user dir '%s':\n\t%s \n",
30398               get_user_base_dir("data", temp_base_dir, sizeof(temp_base_dir)), strerror(errno) );
30399       exit(errno);
30400     }
30401   }
30402 
30403   if (filethere(get_user_base_dir("logs", temp_base_dir, sizeof(temp_base_dir))) != 1)
30404   {
30405     fprintf(stderr,"Making user log dir\n");
30406     if (mkdir(get_user_base_dir("logs", temp_base_dir, sizeof(temp_base_dir)),S_IRWXU) !=0 )
30407     {
30408       fprintf(stderr,"Fatal error making user dir '%s':\n\t%s \n",
30409               get_user_base_dir("logs", temp_base_dir, sizeof(temp_base_dir)), strerror(errno) );
30410       exit(errno);
30411     }
30412   }
30413 
30414   if (filethere(get_user_base_dir("tracklogs", temp_base_dir, sizeof(temp_base_dir))) != 1)
30415   {
30416     fprintf(stderr,"Making user tracklogs dir\n");
30417     if (mkdir(get_user_base_dir("tracklogs", temp_base_dir, sizeof(temp_base_dir)),S_IRWXU) !=0 )
30418     {
30419       fprintf(stderr,"Fatal error making user dir '%s':\n\t%s \n",
30420               get_user_base_dir("tracklogs", temp_base_dir, sizeof(temp_base_dir)), strerror(errno) );
30421       exit(errno);
30422     }
30423   }
30424 
30425   if (filethere(get_user_base_dir("tmp", temp_base_dir, sizeof(temp_base_dir))) != 1)
30426   {
30427     fprintf(stderr,"Making user tmp dir\n");
30428     if (mkdir(get_user_base_dir("tmp", temp_base_dir, sizeof(temp_base_dir)),S_IRWXU) !=0 )
30429     {
30430       fprintf(stderr,"Fatal error making user dir '%s':\n\t%s \n",
30431               get_user_base_dir("tmp", temp_base_dir, sizeof(temp_base_dir)), strerror(errno) );
30432       exit(errno);
30433     }
30434   }
30435 
30436   if (filethere(get_user_base_dir("gps", temp_base_dir, sizeof(temp_base_dir))) != 1)
30437   {
30438     fprintf(stderr,"Making user gps dir\n");
30439     if ( mkdir(get_user_base_dir("gps", temp_base_dir, sizeof(temp_base_dir)),S_IRWXU) !=0 )
30440     {
30441       fprintf(stderr,"Fatal error making user dir '%s':\n\t%s \n",
30442               get_user_base_dir("gps", temp_base_dir, sizeof(temp_base_dir)), strerror(errno) );
30443       exit(errno);
30444     }
30445   }
30446 
30447   if (filethere(get_user_base_dir("map_cache", temp_base_dir, sizeof(temp_base_dir))) != 1)
30448   {
30449     fprintf(stderr,"Making map_cache dir\n");
30450     if (mkdir(get_user_base_dir("map_cache", temp_base_dir, sizeof(temp_base_dir)),S_IRWXU) !=0 )
30451     {
30452       fprintf(stderr,"Fatal error making user dir '%s':\n\t%s \n",
30453               get_user_base_dir("map_cache", temp_base_dir, sizeof(temp_base_dir)), strerror(errno) );
30454       exit(errno);
30455     }
30456   }
30457 
30458 
30459   /* done checking user dirs */
30460 
30461 
30462 
30463 
30464 
30465 #ifdef USE_PID_FILE_CHECK
30466 
30467   if (pid_file_check(xt) !=0 )
30468   {
30469     fprintf(stderr,"pid_file_check failed:\t%s \n", strerror(errno) );
30470     exit(errno);
30471   }
30472 
30473 #endif
30474 
30475 
30476 
30477   // initialize interfaces
30478   init_critical_section(&port_data_lock);   // Protects the port_data[] array of structs
30479   init_critical_section(&output_data_lock); // Protects interface.c:channel_data() function only
30480   init_critical_section(&data_lock);        // Protects global incoming_data_queue
30481   init_critical_section(&connect_lock);     // Protects port_data[].thread_status and port_data[].connect_status
30482 // We should probably protect redraw_on_new_data, alert_redraw_on_update, and
30483 // redraw_on_new_packet_data variables as well?
30484 // Also need to protect dialogs.
30485 
30486 #ifdef HAVE_DB
30487   connections_initialized = 0;
30488 #endif // HAVE_DB
30489 
30490 #ifdef USE_MAP_CACHE
30491   map_cache_init();
30492 #endif  // USE_MAP_CACHE
30493 
30494   (void)bulletin_gui_init();
30495   (void)db_init();
30496   (void)draw_symbols_init();
30497   (void)interface_gui_init();
30498   (void)list_gui_init();
30499   (void)locate_gui_init();
30500   (void)geocoder_gui_init();
30501   (void)location_gui_init();
30502   (void)maps_init();
30503   (void)messages_gui_init();
30504   (void)popup_gui_init();
30505   (void)track_gui_init();
30506   (void)view_message_gui_init();
30507   (void)wx_gui_init();
30508   (void)igate_init();
30509 
30510   clear_all_port_data();              // clear interface port data
30511 
30512   (void) signal(SIGINT,quit);         // set signal on stop
30513   (void) signal(SIGQUIT,quit);
30514   (void) signal(SIGTERM,quit);
30515 
30516 
30517   // Make sure that we reset to SIG_DFL handler any time we spawn
30518   // a child process.  This is so the child process doesn't call
30519   // restart() as well.  Only the main process needs to call
30520   // restart() on receiving a SIGHUP.  We can do this via the
30521   // following call:
30522   //
30523   //          (void)signal(SIGHUP,SIG_DFL);
30524   //
30525   (void) signal(SIGHUP,restart);      // Shut down/restart if SIGHUP received
30526 
30527 
30528 #ifndef OLD_PTHREADS
30529   (void) signal(SIGUSR1,usr1sig);     // take a snapshot on demand
30530   (void) signal(SIGUSR2,usr2sig);     // transmit now on demand
30531 #else   // OLD_PTHREADS
30532 #   warning ***** Old kernel detected: Disabling SIGUSR1 handler (snapshot on demand) *****
30533 #endif  // OLD_PTHREADS
30534 
30535 #ifdef HAVE_SIGIGNORE
30536   (void) sigignore(SIGPIPE);
30537 #else   // HAVE_SIGIGNORE
30538   (void) signal(SIGPIPE,SIG_IGN);     // set sigpipe signal to ignore
30539 #endif  // HAVE_SIGIGNORE
30540 
30541   if (trap_segfault)
30542   {
30543     (void) signal(SIGSEGV,segfault);  // set segfault signal to check
30544   }
30545 
30546 
30547   // Load program parameters or set to default values
30548   load_data_or_default();
30549 
30550 
30551   // Start the listening socket.  If we fork it early we end up
30552   // with much smaller process memory allocated for it and all its
30553   // children.  The server will authenticate each client that
30554   // connects.  We'll share all of our data with the server, which
30555   // will send it to all connected/authenticated clients.
30556   // Anything transmitted by the clients will come back to us and
30557   // standard igating rules should apply from there.
30558   if (enable_server_port)
30559   {
30560     tcp_server_pid = Fork_TCP_server(my_argc, my_argv, my_envp);
30561     udp_server_pid = Fork_UDP_server(my_argc, my_argv, my_envp);
30562   }
30563 
30564 
30565   if (deselect_maps_on_startup)
30566   {
30567     unlink( get_user_base_dir(SELECTED_MAP_DATA, temp_base_dir, sizeof(temp_base_dir)) );  // Remove the selected_maps.sys file
30568   }
30569 
30570   update_units(); // set up conversion factors and strings
30571 
30572   /* do language links */
30573   if (strlen(lang_to_use_or) > 0)
30574     xastir_snprintf(lang_to_use,
30575                     sizeof(lang_to_use),
30576                     "%s",
30577                     lang_to_use_or);
30578 
30579   xastir_snprintf(temp, sizeof(temp), "help/help-%s.dat", lang_to_use);
30580   (void)unlink(get_user_base_dir("config/help.dat", temp_base_dir, sizeof(temp_base_dir)));
30581 
30582   // Note that this symlink will probably not fail.  It's easy to
30583   // create a symlink that points to nowhere.
30584   if (symlink(get_data_base_dir(temp),get_user_base_dir("config/help.dat", temp_base_dir, sizeof(temp_base_dir))) == -1)
30585   {
30586     fprintf(stderr,"Error creating database link for help.dat\n");
30587     fprintf(stderr,
30588             "Couldn't create symlink: %s -> %s\n",
30589             get_user_base_dir("config/help.dat", temp_base_dir, sizeof(temp_base_dir)),
30590             get_data_base_dir(temp));
30591     exit(0);  // Exiting 'cuz online help won't work.
30592   }
30593 
30594   xastir_snprintf(temp, sizeof(temp), "config/language-%s.sys", lang_to_use);
30595   (void)unlink(get_user_base_dir("config/language.sys", temp_base_dir, sizeof(temp_base_dir)));
30596 
30597   // Note that this symlink will probably not fail.  It's easy to
30598   // create a symlink that points to nowhere.
30599   if (symlink(get_data_base_dir(temp),get_user_base_dir("config/language.sys", temp_base_dir, sizeof(temp_base_dir))) == -1)
30600   {
30601     fprintf(stderr,"Error creating database link for language.sys\n");
30602     fprintf(stderr,
30603             "Couldn't create symlink: %s -> %s\n",
30604             get_user_base_dir("config/language.sys", temp_base_dir, sizeof(temp_base_dir)),
30605             get_data_base_dir(temp));
30606     exit(0);    // We can't set our language, so exit.
30607   }
30608 
30609   /* (NEW) set help file area */
30610   xastir_snprintf(HELP_FILE,
30611                   sizeof(HELP_FILE),
30612                   "%s",
30613                   "config/help.dat");
30614 
30615 #ifdef HAVE_FESTIVAL
30616   /* Initialize the festival speech synthesis port */
30617   if (SayTextInit())
30618   {
30619     fprintf(stderr,"Error connecting to Festival speech server.\n");
30620     //exit(0);  // Not worth exiting just because we can't talk!
30621   }
30622 #endif  // HAVE_FESTIVAL
30623 
30624 
30625   /* populate the predefined object (SAR/Public service) struct */
30626   Populate_predefined_objects(predefinedObjects);
30627 
30628   if (load_color_file())
30629   {
30630     if (load_language_file(get_user_base_dir("config/language.sys", temp_base_dir, sizeof(temp_base_dir))))
30631     {
30632       init_device_names();                // set interface names
30633       clear_message_windows();
30634       clear_popup_message_windows();
30635       init_station_data();                // init station storage
30636       init_message_data();                // init messages
30637       reset_outgoing_messages();
30638 
30639 
30640       // This convenience function calls (in turn):
30641       //      XtToolkitInitialize()
30642       //      XtCreateApplicationContext()
30643       //      XtOpenDisplay()
30644       //      XtAppCreateShell().
30645       //
30646       appshell = XtVaOpenApplication(
30647                    &app_context,
30648                    "Xastir",
30649                    NULL,
30650                    0,
30651                    &argc,
30652                    argv,
30653                    fallback_resources,
30654                    sessionShellWidgetClass,
30655                    XmNmappedWhenManaged, FALSE,
30656                    NULL);
30657 
30658       display = XtDisplay(appshell);
30659 
30660       if (!display)
30661       {
30662         fprintf(stderr,"%s: can't open display, exiting...\n", argv[0]);
30663         exit(-1);   // Must exit here as we can't get our display.
30664       }
30665 
30666       XtSetValues(XmGetXmDisplay(display), NULL, 0);
30667 
30668       // DK7IN: now scanf and printf use "," instead of "."
30669       // that leads to several problems in the initialization.
30670       //
30671       // DK7IN: inserted next line here for avoiding scanf
30672       // errors during init!
30673       //
30674 //            (void)setlocale(LC_NUMERIC, "C");       // DK7IN: It's now ok
30675       (void)setlocale(LC_CTYPE, "C");         // K4INT: Make sure strings work OK.
30676 
30677 
30678       setup_visual_info(display, DefaultScreen(display));
30679 
30680 
30681       // Get colormap (N7TAP: do we need this if the screen
30682       // visual is TRUE or DIRECT?
30683       //
30684       cmap = DefaultColormapOfScreen(XtScreen(appshell));
30685       if (visual_type == NOT_TRUE_NOR_DIRECT)
30686       {
30687         if (install_colormap)
30688         {
30689           cmap = XCopyColormapAndFree(display, cmap);
30690           XtVaSetValues(appshell, XmNcolormap, cmap, NULL);
30691         }
30692       }
30693 
30694 
30695 //fprintf(stderr,"***index_restore_from_file\n");
30696 
30697       // Read the current map index file into the index linked list
30698       index_restore_from_file();
30699 
30700 
30701       // Reload tactical calls.  This implements persistence
30702       // for this type.
30703       reload_tactical_calls();
30704 
30705 
30706 //fprintf(stderr,"***create_appshell\n");
30707 
30708 
30709       // This call fills in the top-level window and then
30710       // calls XtRealize.
30711       //
30712       create_appshell(display, argv[0], argc, argv);
30713 
30714 
30715       // reset language attribs for numeric, program needs
30716       // decimal in US for all data!
30717       (void)setlocale(LC_NUMERIC, "C");
30718       (void)setlocale(LC_CTYPE, "C");
30719       // DK7IN: now scanf and printf work as wanted...
30720 
30721 
30722 //fprintf(stderr,"***check_fcc_data\n");
30723 
30724       /* check for ham databases */
30725       (void)check_rac_data();
30726       (void)check_fcc_data();
30727 
30728 
30729       // Find the extents of every map we have.  Use the smart
30730       // timestamp-checking reindexing (quicker).
30731       if ( index_maps_on_startup )
30732       {
30733         map_indexer(0);
30734       }
30735 
30736 
30737       // Check whether we're running Xastir for the first time.
30738       // If so, my_callsign will be "NOCALL".   In this case
30739       // write "worldhi.map" into ~/.xastir/config/selected_maps.sys
30740       // so that we get the default map on startup.  Also
30741       // request to bring up the Configure->Station dialog in
30742       // this case.
30743       //
30744       if (strncasecmp(my_callsign,"NOCALL",6) == 0)
30745       {
30746         FILE *ff;
30747 
30748 //                fprintf(stderr,"***** First time run *****\n");
30749 
30750         // Set the flag
30751         first_time_run = 1;
30752 
30753         // Write the default map into the selected map file
30754         ff = fopen( get_user_base_dir(SELECTED_MAP_DATA, temp_base_dir, sizeof(temp_base_dir)), "a");
30755         if (ff != NULL)
30756         {
30757           fprintf(ff,"worldhi.map\n");
30758           (void)fclose(ff);
30759         }
30760       }
30761 
30762 
30763       // Mark the "selected" field in the in-memory map index
30764       // to correspond to the selected_maps.sys file.
30765       map_chooser_init();
30766 
30767 
30768       // Warn the user if altnet is enabled on startup.  This
30769       // is so that the people who are button pushers/knob turners
30770       // will know what's wrong when they don't see stations on their
30771       // screen anymore.
30772       //
30773       if (altnet)
30774       {
30775         // "Warning"
30776         // "Altnet is enabled (File->Configure->Defaults dialog)");
30777         popup_message_always( langcode("POPEM00035"),
30778                               langcode("POPEM00051") );
30779       }
30780 
30781 
30782       // Start UpdateTime.  It schedules itself to be run
30783       // again each time.  This is also the process that
30784       // starts up the interfaces.
30785       UpdateTime( (XtPointer) da, (XtIntervalId) NULL );
30786 
30787 
30788       // Update the logging indicator
30789       Set_Log_Indicator();
30790 
30791 
30792       XtAppMainLoop(app_context);
30793 
30794 
30795     }
30796     else
30797     {
30798       fprintf(stderr,"Error in language file! Exiting...\n");
30799     }
30800 
30801   }
30802   else
30803   {
30804     fprintf(stderr,"Error in Color file! Exiting...\n");
30805   }
30806 
30807   quit(0);
30808   return 0;
30809 }
30810 
30811 
30812