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", °, &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