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