1 /*
2  *
3  * XASTIR, Amateur Station Tracking and Information Reporting
4  * Copyright (C) 1999,2000  Frank Giannandrea
5  * Copyright (C) 2000-2019 The Xastir Group
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20  *
21  * Look at the README for more information on the program.
22  */
23 
24 #ifdef HAVE_CONFIG_H
25   #include "config.h"
26 #endif  // HAVE_CONFIG_H
27 
28 #include "snprintf.h"
29 
30 #include <Xm/XmAll.h>
31 #include <X11/Xatom.h>
32 #include <X11/Shell.h>
33 
34 #include <stdio.h>
35 #include <fcntl.h>
36 #include <unistd.h>
37 #include <signal.h>
38 #include <stdio.h>
39 #include <stdlib.h>
40 #ifdef HAVE_STRING_H
41   #include <string.h>
42 #else
43   #include <strings.h>
44 #endif
45 #include <ctype.h>
46 #include <sys/types.h>
47 
48 #if TIME_WITH_SYS_TIME
49   #include <sys/time.h>
50   #include <time.h>
51 #else   // TIME_WITH_SYS_TIME
52   #if HAVE_SYS_TIME_H
53     #include <sys/time.h>
54   #else  // HAVE_SYS_TIME_H
55     #include <time.h>
56   #endif // HAVE_SYS_TIME_H
57 #endif  // TIME_WITH_SYS_TIME
58 
59 #include "xastir.h"
60 #include "main.h"
61 #include "util.h"
62 
63 // Must be last include file
64 #include "leak_detection.h"
65 
66 
67 extern XmFontList fontlist1;    // Menu/System fontlist
68 
69 Widget All_messages_dialog = NULL;
70 Widget view_messages_text = NULL;
71 Widget vm_dist_data = NULL;
72 
73 static xastir_mutex All_messages_dialog_lock;
74 
75 int vm_range;
76 int view_message_limit = 10000;
77 int Read_messages_packet_data_type = 0; // 1=tnc_only, 2=net_only, 0=tnc&net
78 int Read_messages_mine_only = 0;
79 
80 
81 
82 
83 
view_message_gui_init(void)84 void view_message_gui_init(void)
85 {
86   init_critical_section( &All_messages_dialog_lock );
87 }
88 
89 
90 
91 
92 
view_message_print_record(Message * m_fill)93 void view_message_print_record(Message *m_fill)
94 {
95   int pos;
96   char *temp;
97   int i;
98   int my_size = 200;
99   char temp_my_course[10];
100   XmTextPosition drop_ptr;
101   int distance;
102 
103 
104   // Make sure it's within our distance range we have set
105   distance = distance_from_my_station(m_fill->from_call_sign,temp_my_course);
106 
107   if (Read_messages_mine_only
108       || (!Read_messages_mine_only
109           && ( (vm_range == 0) || (distance <= vm_range) ) ) )
110   {
111 
112     // Check that it's coming from the correct type of interface
113     // Compare Read_messages_packet_data_type against the port
114     // type associated with data_port to determine whether or
115     // not to display it.
116     //
117     // I = Internet
118     // L = Local
119     // T = TNC
120     // F = File
121     //
122     switch (Read_messages_packet_data_type)
123     {
124 
125       case 2:     // Display NET data only
126         // if not network_interface, return
127         if (m_fill->data_via != 'I')
128         {
129           return;  // Don't display it
130         }
131         break;
132 
133       case 1:     // Display TNC data only
134         // if not local_tnc_interface, return
135         if (m_fill->data_via != 'T')
136         {
137           return;  // Don't display it
138         }
139         break;
140 
141       case 0:     // Display both TNC and NET data
142       default:
143         break;
144     }
145 
146     // Check for my stations only if set
147     if (Read_messages_mine_only)
148     {
149       char short_call[MAX_CALLSIGN];
150       char *p;
151 
152       memcpy(short_call, my_callsign, sizeof(short_call));
153       short_call[sizeof(short_call)-1] = '\0';  // Terminate string
154       if ( (p = index(short_call,'-')) )
155       {
156         *p = '\0';  // Terminate it
157       }
158 
159       if (!strstr(m_fill->call_sign, short_call)
160           && !strstr(m_fill->from_call_sign, short_call))
161       {
162         return;
163       }
164     }
165 
166     if ((temp = malloc((size_t)my_size)) == NULL)
167     {
168       return;
169     }
170 
171     sprintf(temp,"%-9s>%-9s %s:%5s %s:%c :%s\n",
172             m_fill->from_call_sign,
173             m_fill->call_sign,
174             langcode("WPUPMSB013"),
175             m_fill->seq,
176             langcode("WPUPMSB014"),
177             m_fill->type,
178             m_fill->message_line);
179 
180     pos = (int)XmTextGetLastPosition(view_messages_text);
181 
182 
183     XmTextInsert(view_messages_text, pos, temp);
184     pos += strlen(temp);
185     while (pos > view_message_limit)
186     {
187       for (drop_ptr = i = 0; i < 3; i++)
188       {
189         (void)XmTextFindString(view_messages_text, drop_ptr, "\n", XmTEXT_FORWARD, &drop_ptr);
190         drop_ptr++;
191       }
192       XmTextReplace(view_messages_text, 0, drop_ptr, "");
193       pos = (int)XmTextGetLastPosition(view_messages_text);
194     }
195     XtVaSetValues(view_messages_text, XmNcursorPosition, pos, NULL);
196 
197     free(temp);
198   }
199 }
200 
201 
202 
203 
204 
view_message_display_file(char msg_type)205 void view_message_display_file(char msg_type)
206 {
207   int pos;
208 
209   if ((All_messages_dialog != NULL))
210   {
211     mscan_file(msg_type, view_message_print_record);
212   }
213   pos = (int)XmTextGetLastPosition(view_messages_text);
214   XmTextShowPosition(view_messages_text, pos);
215 }
216 
217 
218 
219 
220 
all_messages(char from,char * call_sign,char * from_call,char * message)221 void all_messages(char from, char *call_sign, char *from_call, char *message)
222 {
223   char temp_my_course[10];
224   char *temp;
225   char data1[97];
226   char data2[97];
227   int pos;
228   int i;
229   int my_size = 200;
230   XmTextPosition drop_ptr;
231 
232 
233   if (Read_messages_mine_only
234       || (!Read_messages_mine_only
235           && ((vm_range == 0)
236               || (distance_from_my_station(call_sign,temp_my_course) <= vm_range)) ) )
237   {
238 
239     // Check that it's coming from the correct type of interface
240     // Compare Read_messages_packet_data_type against the port
241     // type associated with data_port to determine whether or
242     // not to display it.
243     //
244     // I = Internet
245     // L = Local
246     // T = TNC
247     // F = File
248     //
249     switch (Read_messages_packet_data_type)
250     {
251 
252       case 2:     // Display NET data only
253         // if not network_interface, return
254         if (from != 'I')
255         {
256           return;  // Don't display it
257         }
258         break;
259 
260       case 1:     // Display TNC data only
261         // if not local_tnc_interface, return
262         if (from != 'T')
263         {
264           return;  // Don't display it
265         }
266         break;
267 
268       case 0:     // Display both TNC and NET data
269       default:
270         break;
271     }
272 
273     // Check for my stations only if set
274     if (Read_messages_mine_only)
275     {
276       char short_call[MAX_CALLSIGN];
277       char *p;
278 
279       memcpy(short_call, my_callsign, sizeof(short_call));
280       short_call[sizeof(short_call)-1] = '\0';  // Terminate string
281       if ( (p = index(short_call,'-')) )
282       {
283         *p = '\0';  // Terminate it
284       }
285 
286       if (!strstr(call_sign, short_call)
287           && !strstr(from_call, short_call))
288       {
289         return;
290       }
291     }
292 
293     if ((temp = malloc((size_t)my_size)) == NULL)
294     {
295       return;
296     }
297 
298     if (strlen(message)>95)
299     {
300       xastir_snprintf(data1,
301                       sizeof(data1),
302                       "%s",
303                       message);
304       data1[95]='\0';
305       xastir_snprintf(data2,
306                       sizeof(data2),
307                       "\n\t%s",
308                       message+95);
309     }
310     else
311     {
312       xastir_snprintf(data1,
313                       sizeof(data1),
314                       "%s",
315                       message);
316       data2[0] = '\0';
317     }
318 
319     if (strncmp(call_sign, "java",4) == 0)
320     {
321       xastir_snprintf(call_sign,
322                       MAX_CALLSIGN+1,
323                       "%s", langcode("WPUPMSB015") );   // Broadcast
324       xastir_snprintf(temp,
325                       my_size,
326                       "%s %s\t%s%s\n",
327                       from_call,
328                       call_sign,
329                       data1,
330                       data2);
331     }
332     else if (strncmp(call_sign, "USER", 4) == 0)
333     {
334       xastir_snprintf(call_sign,
335                       MAX_CALLSIGN+1,
336                       "%s", langcode("WPUPMSB015") );   // Broadcast
337       xastir_snprintf(temp,
338                       my_size,
339                       "%s %s\t%s%s\n",
340                       from_call,
341                       call_sign,
342                       data1,
343                       data2);
344     }
345     else
346     {
347       char from_str[10];
348 
349       xastir_snprintf(from_str, sizeof(from_str), "%c", from);
350 
351       strcpy(temp, from_call);
352       temp[sizeof(temp)-1] = '\0';  // Terminate string
353       strcat(temp, " to ");
354       temp[sizeof(temp)-1] = '\0';  // Terminate string
355       strcat(temp, call_sign);
356       temp[sizeof(temp)-1] = '\0';  // Terminate string
357       strcat(temp, " via:");
358       temp[sizeof(temp)-1] = '\0';  // Terminate string
359       strcat(temp, from_str);
360       temp[sizeof(temp)-1] = '\0';  // Terminate string
361       strcat(temp, "\t");
362       temp[sizeof(temp)-1] = '\0';  // Terminate string
363       strcat(temp, data1);
364       temp[sizeof(temp)-1] = '\0';  // Terminate string
365       strcat(temp, data2);
366       temp[sizeof(temp)-1] = '\0';  // Terminate string
367       strcat(temp, "\n");
368       temp[sizeof(temp)-1] = '\0';  // Terminate string
369     }
370 
371     if ((All_messages_dialog != NULL))
372     {
373 
374       begin_critical_section(&All_messages_dialog_lock, "view_message_gui.c:all_messages" );
375 
376       pos = (int)XmTextGetLastPosition(view_messages_text);
377       XmTextInsert(view_messages_text, pos, temp);
378       pos += strlen(temp);
379       while (pos > view_message_limit)
380       {
381         for (drop_ptr = i = 0; i < 3; i++)
382         {
383           (void)XmTextFindString(view_messages_text, drop_ptr, "\n", XmTEXT_FORWARD, &drop_ptr);
384           drop_ptr++;
385         }
386         XmTextReplace(view_messages_text, 0, drop_ptr, "");
387         pos = (int)XmTextGetLastPosition(view_messages_text);
388       }
389       XtVaSetValues(view_messages_text, XmNcursorPosition, pos, NULL);
390       XmTextShowPosition(view_messages_text, pos);
391 
392       end_critical_section(&All_messages_dialog_lock, "view_message_gui.c:all_messages" );
393 
394     }
395     free(temp);
396   }
397 }
398 
399 
400 
401 
402 
All_messages_destroy_shell(Widget UNUSED (widget),XtPointer clientData,XtPointer UNUSED (callData))403 void All_messages_destroy_shell( Widget UNUSED(widget), XtPointer clientData, XtPointer UNUSED(callData) )
404 {
405   Widget shell = (Widget) clientData;
406   char *temp_ptr;
407 
408 
409   temp_ptr = XmTextFieldGetString(vm_dist_data);
410   vm_range = atoi(temp_ptr);
411   XtFree(temp_ptr);
412 
413   XtPopdown(shell);
414 
415   begin_critical_section(&All_messages_dialog_lock, "view_message_gui.c:All_messages_destroy_shell" );
416 
417   XtDestroyWidget(shell);
418   All_messages_dialog = (Widget)NULL;
419 
420   end_critical_section(&All_messages_dialog_lock, "view_message_gui.c:All_messages_destroy_shell" );
421 
422 }
423 
424 
425 
426 
427 
All_messages_change_range(Widget widget,XtPointer clientData,XtPointer callData)428 void All_messages_change_range( Widget widget, XtPointer clientData, XtPointer callData)
429 {
430   Widget shell = (Widget) clientData;
431   char *temp_ptr;
432 
433 
434   temp_ptr = XmTextFieldGetString(vm_dist_data);
435   vm_range = atoi(temp_ptr);
436   XtFree(temp_ptr);
437 
438   XtPopdown(shell);
439 
440   All_messages_destroy_shell(widget, clientData, callData);
441   view_all_messages(widget, clientData, callData);
442 }
443 
444 
445 
446 
447 
Read_messages_packet_toggle(Widget UNUSED (widget),XtPointer clientData,XtPointer callData)448 void  Read_messages_packet_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
449 {
450   char *which = (char *)clientData;
451   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
452 
453   if(state->set)
454   {
455     Read_messages_packet_data_type = atoi(which);
456   }
457   else
458   {
459     Read_messages_packet_data_type = 0;
460   }
461 }
462 
463 
464 
465 
466 
467 Widget button_range;
468 
469 
470 
471 
472 
Read_messages_mine_only_toggle(Widget UNUSED (widget),XtPointer clientData,XtPointer callData)473 void  Read_messages_mine_only_toggle( Widget UNUSED(widget), XtPointer clientData, XtPointer callData)
474 {
475   char *which = (char *)clientData;
476   XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *)callData;
477 
478   if(state->set)
479   {
480     Read_messages_mine_only = atoi(which);
481     XtSetSensitive(vm_dist_data, FALSE);
482   }
483   else
484   {
485     Read_messages_mine_only = 0;
486     XtSetSensitive(vm_dist_data, TRUE);
487   }
488 }
489 
490 
491 
492 
493 
view_all_messages(Widget UNUSED (w),XtPointer UNUSED (clientData),XtPointer UNUSED (callData))494 void view_all_messages( Widget UNUSED(w), XtPointer UNUSED(clientData), XtPointer UNUSED(callData) )
495 {
496   Widget pane, scrollwindow, my_form, button_close, dist, dist_units;
497   Widget option_box, tnc_data, net_data, tnc_net_data,
498          read_mine_only_button;
499   unsigned int n;
500 #define NCNT 50
501 #define IncN(n) if (n< NCNT) n++; else fprintf(stderr, "Oops, too many arguments for array!\a")
502   Arg args[NCNT];
503   Atom delw;
504   char temp[10];
505 
506   if (!All_messages_dialog)
507   {
508 
509     begin_critical_section(&All_messages_dialog_lock, "view_message_gui.c:view_all_messages" );
510 
511     All_messages_dialog = XtVaCreatePopupShell(langcode("AMTMW00001"),
512                           xmDialogShellWidgetClass, appshell,
513                           XmNdeleteResponse, XmDESTROY,
514                           XmNdefaultPosition, FALSE,
515                           XmNfontList, fontlist1,
516                           NULL);
517 
518     pane = XtVaCreateWidget("view_all_messages pane",
519                             xmPanedWindowWidgetClass,
520                             All_messages_dialog,
521                             MY_FOREGROUND_COLOR,
522                             MY_BACKGROUND_COLOR,
523                             NULL);
524 
525     scrollwindow = XtVaCreateManagedWidget("scrollwindow",
526                                            xmScrolledWindowWidgetClass,
527                                            pane,
528                                            XmNscrollingPolicy, XmAUTOMATIC,
529                                            NULL);
530 
531     my_form =  XtVaCreateWidget("view_all_messages my_form",
532                                 xmFormWidgetClass,
533                                 scrollwindow,
534                                 XmNfractionBase, 5,
535                                 XmNautoUnmanage, FALSE,
536                                 XmNshadowThickness, 1,
537                                 MY_FOREGROUND_COLOR,
538                                 MY_BACKGROUND_COLOR,
539                                 NULL);
540 
541     dist = XtVaCreateManagedWidget(langcode("AMTMW00002"),
542                                    xmLabelWidgetClass,
543                                    my_form,
544                                    XmNtopAttachment, XmATTACH_FORM,
545                                    XmNtopOffset, 10,
546                                    XmNbottomAttachment, XmATTACH_NONE,
547                                    XmNleftAttachment, XmATTACH_FORM,
548                                    XmNleftOffset, 10,
549                                    XmNrightAttachment, XmATTACH_NONE,
550                                    XmNtraversalOn, FALSE,
551                                    MY_FOREGROUND_COLOR,
552                                    MY_BACKGROUND_COLOR,
553                                    XmNfontList, fontlist1,
554                                    NULL);
555 
556     vm_dist_data = XtVaCreateManagedWidget("view_all_messages dist_data",
557                                            xmTextFieldWidgetClass,
558                                            my_form,
559                                            XmNeditable,   TRUE,
560                                            XmNcursorPositionVisible, TRUE,
561                                            XmNsensitive, TRUE,
562                                            XmNshadowThickness,    1,
563                                            XmNcolumns, 8,
564                                            XmNwidth, ((8*7)+2),
565                                            XmNmaxLength, 8,
566                                            XmNbackground, colors[0x0f],
567                                            XmNtopAttachment, XmATTACH_FORM,
568                                            XmNtopOffset, 5,
569                                            XmNbottomAttachment,XmATTACH_NONE,
570                                            XmNleftAttachment, XmATTACH_WIDGET,
571                                            XmNleftWidget, dist,
572                                            XmNleftOffset, 10,
573                                            XmNrightAttachment,XmATTACH_NONE,
574                                            XmNfontList, fontlist1,
575                                            NULL);
576 
577     dist_units = XtVaCreateManagedWidget((english_units?langcode("UNIOP00004"):langcode("UNIOP00005")),
578                                          xmLabelWidgetClass,
579                                          my_form,
580                                          XmNtopAttachment, XmATTACH_FORM,
581                                          XmNtopOffset, 10,
582                                          XmNbottomAttachment, XmATTACH_NONE,
583                                          XmNleftAttachment, XmATTACH_WIDGET,
584                                          XmNleftWidget, vm_dist_data,
585                                          XmNleftOffset, 10,
586                                          XmNrightAttachment, XmATTACH_NONE,
587                                          XmNtraversalOn, FALSE,
588                                          MY_FOREGROUND_COLOR,
589                                          MY_BACKGROUND_COLOR,
590                                          XmNfontList, fontlist1,
591                                          NULL);
592 
593     button_range = XtVaCreateManagedWidget(langcode("BULMW00003"),
594                                            xmPushButtonGadgetClass,
595                                            my_form,
596                                            XmNtopAttachment, XmATTACH_FORM,
597                                            XmNtopOffset, 5,
598                                            XmNbottomAttachment, XmATTACH_NONE,
599                                            XmNleftAttachment, XmATTACH_WIDGET,
600                                            XmNleftWidget, dist_units,
601                                            XmNleftOffset, 10,
602                                            XmNrightAttachment, XmATTACH_NONE,
603                                            XmNnavigationType, XmTAB_GROUP,
604                                            MY_FOREGROUND_COLOR,
605                                            MY_BACKGROUND_COLOR,
606                                            XmNfontList, fontlist1,
607                                            NULL);
608 
609     XtAddCallback(button_range, XmNactivateCallback, All_messages_change_range, All_messages_dialog);
610 
611     button_close = XtVaCreateManagedWidget(langcode("UNIOP00003"),
612                                            xmPushButtonGadgetClass,
613                                            my_form,
614                                            XmNtopAttachment, XmATTACH_FORM,
615                                            XmNtopOffset, 5,
616                                            XmNbottomAttachment, XmATTACH_NONE,
617                                            XmNleftAttachment, XmATTACH_WIDGET,
618                                            XmNleftWidget, button_range,
619                                            XmNleftOffset, 10,
620                                            XmNrightAttachment, XmATTACH_FORM,
621                                            XmNnavigationType, XmTAB_GROUP,
622                                            MY_FOREGROUND_COLOR,
623                                            MY_BACKGROUND_COLOR,
624                                            XmNfontList, fontlist1,
625                                            NULL);
626 
627     XtAddCallback(button_close, XmNactivateCallback, All_messages_destroy_shell, All_messages_dialog);
628 
629     n=0;
630     XtSetArg(args[n],XmNforeground, MY_FG_COLOR);
631     n++;
632     XtSetArg(args[n],XmNbackground, MY_BG_COLOR);
633     n++;
634     XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);
635     n++;
636     XtSetArg(args[n], XmNtopWidget, dist);
637     n++;
638     XtSetArg(args[n], XmNtopOffset, 5);
639     n++;
640     XtSetArg(args[n], XmNbottomAttachment, XmATTACH_NONE);
641     n++;
642     XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);
643     n++;
644     XtSetArg(args[n], XmNleftOffset, 5);
645     n++;
646     XtSetArg(args[n], XmNrightAttachment, XmATTACH_NONE);
647     n++;
648     XtSetArg(args[n], XmNfontList, fontlist1);
649     n++;
650 
651     option_box = XmCreateRadioBox(my_form,
652                                   "Vew Messages option box",
653                                   args,
654                                   n);
655 
656     XtVaSetValues(option_box,
657                   XmNpacking, XmPACK_TIGHT,
658                   XmNorientation, XmHORIZONTAL,
659                   NULL);
660 
661     tnc_data = XtVaCreateManagedWidget(langcode("WPUPDPD002"),
662                                        xmToggleButtonGadgetClass,
663                                        option_box,
664                                        MY_FOREGROUND_COLOR,
665                                        MY_BACKGROUND_COLOR,
666                                        XmNfontList, fontlist1,
667                                        NULL);
668 
669     XtAddCallback(tnc_data,XmNvalueChangedCallback,Read_messages_packet_toggle,"1");
670 
671     net_data = XtVaCreateManagedWidget(langcode("WPUPDPD003"),
672                                        xmToggleButtonGadgetClass,
673                                        option_box,
674                                        MY_FOREGROUND_COLOR,
675                                        MY_BACKGROUND_COLOR,
676                                        XmNfontList, fontlist1,
677                                        NULL);
678 
679     XtAddCallback(net_data,XmNvalueChangedCallback,Read_messages_packet_toggle,"2");
680 
681     tnc_net_data = XtVaCreateManagedWidget(langcode("WPUPDPD004"),
682                                            xmToggleButtonGadgetClass,
683                                            option_box,
684                                            MY_FOREGROUND_COLOR,
685                                            MY_BACKGROUND_COLOR,
686                                            XmNfontList, fontlist1,
687                                            NULL);
688 
689     XtAddCallback(tnc_net_data,XmNvalueChangedCallback,Read_messages_packet_toggle,"0");
690 
691     read_mine_only_button = XtVaCreateManagedWidget(langcode("WPUPDPD008"),
692                             xmToggleButtonGadgetClass,
693                             my_form,
694                             XmNvisibleWhenOff, TRUE,
695                             XmNindicatorSize, 12,
696                             XmNtopAttachment, XmATTACH_WIDGET,
697                             XmNtopWidget, dist,
698                             XmNtopOffset, 10,
699                             XmNbottomAttachment, XmATTACH_NONE,
700                             XmNleftAttachment, XmATTACH_WIDGET,
701                             XmNleftWidget, option_box,
702                             XmNleftOffset, 20,
703                             XmNrightAttachment, XmATTACH_NONE,
704                             MY_FOREGROUND_COLOR,
705                             MY_BACKGROUND_COLOR,
706                             XmNfontList, fontlist1,
707                             NULL);
708 
709     XtAddCallback(read_mine_only_button,XmNvalueChangedCallback,Read_messages_mine_only_toggle,"1");
710 
711     n=0;
712     XtSetArg(args[n], XmNrows, 15);
713     IncN(n);
714     XtSetArg(args[n], XmNcolumns, 85);
715     IncN(n);
716     XtSetArg(args[n], XmNeditable, FALSE);
717     IncN(n);
718     XtSetArg(args[n], XmNtraversalOn, TRUE);
719     IncN(n);
720     XtSetArg(args[n], XmNlistSizePolicy, XmVARIABLE);
721     IncN(n);
722     XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT);
723     IncN(n);
724     XtSetArg(args[n], XmNwordWrap, TRUE);
725     IncN(n);
726     XtSetArg(args[n], XmNscrollHorizontal, TRUE);
727     IncN(n);
728     XtSetArg(args[n], XmNscrollVertical, TRUE);
729     IncN(n);
730 //        XtSetArg(args[n], XmNscrollBarDisplayPolicy, XmSTATIC); IncN(n);
731     XtSetArg(args[n], XmNselectionPolicy, XmMULTIPLE_SELECT);
732     IncN(n);
733     XtSetArg(args[n], XmNcursorPositionVisible, FALSE);
734     IncN(n);
735     XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET);
736     IncN(n);
737     XtSetArg(args[n], XmNtopWidget, option_box);
738     IncN(n);
739     XtSetArg(args[n], XmNtopOffset, 5);
740     IncN(n);
741     XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM);
742     IncN(n);
743     XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM);
744     IncN(n);
745     XtSetArg(args[n], XmNleftOffset, 5);
746     IncN(n);
747     XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM);
748     IncN(n);
749     XtSetArg(args[n], XmNrightOffset, 5);
750     IncN(n);
751     XtSetArg(args[n], XmNforeground, MY_FG_COLOR);
752     IncN(n);
753     XtSetArg(args[n], XmNbackground, MY_BG_COLOR);
754     IncN(n);
755     XtSetArg(args[n], XmNfontList, fontlist1);
756     n++;
757 
758     view_messages_text = XmCreateScrolledText(my_form,
759                          "view_all_messages text",
760                          args,
761                          n);
762 
763 // It's hard to get tab groups working with ScrolledText widgets.  Tab'ing in is
764 // fine, but then I'm stuck in insert mode and it absorbs the tabs and beeps.
765 
766     pos_dialog(All_messages_dialog);
767 
768     delw = XmInternAtom(XtDisplay(All_messages_dialog),"WM_DELETE_WINDOW", FALSE);
769     XmAddWMProtocolCallback(All_messages_dialog, delw, All_messages_destroy_shell, (XtPointer)All_messages_dialog);
770 
771     sprintf(temp,"%d",vm_range);
772     XmTextFieldSetString(vm_dist_data,temp);
773 
774     switch (Read_messages_packet_data_type)
775     {
776       case(0):
777         XmToggleButtonSetState(tnc_net_data,TRUE,FALSE);
778         break;
779 
780       case(1):
781         XmToggleButtonSetState(tnc_data,TRUE,FALSE);
782         break;
783 
784       case(2):
785         XmToggleButtonSetState(net_data,TRUE,FALSE);
786         break;
787 
788       default:
789         XmToggleButtonSetState(tnc_net_data,TRUE,FALSE);
790         break;
791     }
792 
793     if (Read_messages_mine_only)
794     {
795       XmToggleButtonSetState(read_mine_only_button,TRUE,FALSE);
796       XtSetSensitive(vm_dist_data, FALSE);
797     }
798     else
799     {
800       XmToggleButtonSetState(read_mine_only_button,FALSE,FALSE);
801       XtSetSensitive(vm_dist_data, TRUE);
802     }
803 
804     XtManageChild(option_box);
805     XtManageChild(view_messages_text);
806     XtVaSetValues(view_messages_text, XmNbackground, colors[0x0f], NULL);
807     XtManageChild(my_form);
808     XtManageChild(pane);
809 
810     resize_dialog(my_form, All_messages_dialog);
811 
812     redraw_on_new_packet_data=1;
813 
814     // Dump all currently active messages to the new window
815     view_message_display_file('M');
816 
817     end_critical_section(&All_messages_dialog_lock, "view_message_gui.c:view_all_messages" );
818 
819     XtPopup(All_messages_dialog,XtGrabNone);
820 
821     // Move focus to the Close button.  This appears to highlight the
822     // button fine, but we're not able to hit the <Enter> key to
823     // have that default function happen.  Note:  We _can_ hit the
824     // <SPACE> key, and that activates the option.
825 //        XmUpdateDisplay(All_messages_dialog);
826     XmProcessTraversal(button_close, XmTRAVERSE_CURRENT);
827 
828 
829   }
830   else
831   {
832     (void)XRaiseWindow(XtDisplay(All_messages_dialog), XtWindow(All_messages_dialog));
833   }
834 }
835 
836 
837