/*
 * TCPVIEW
 *
 * Author:	Martin Hunt
 *		Networks and Distributed Computing
 *		Computing & Communications
 *		University of Washington
 *		Administration Building, AG-44
 *		Seattle, WA  98195
 *		Internet: martinh@cac.washington.edu
 *
 *
 * Copyright 1992 by the University of Washington
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, provided
 * that the above copyright notice appears in all copies and that both the
 * above copyright notice and this permission notice appear in supporting
 * documentation, and that the name of the University of Washington not be
 * used in advertising or publicity pertaining to distribution of the software
 * without specific, written prior permission.  This software is made
 * available "as is", and
 * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
 * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
 * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
 * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

#ifndef lint
static char rcsid[] =
    "@(#) $Header: /usr/staff/martinh/tcpview/RCS/dialogs.c,v 1.1 1993/04/22 20:18:20 martinh Exp $ (UW)";
#endif

#include <stdio.h>
#include  <X11/Intrinsic.h>
#include  <X11/StringDefs.h>
#include  <Xm/Xm.h>
#include  <Xm/Frame.h>
#include  <Xm/MessageB.h>
#include  <Xm/RowColumn.h>
#include  <Xm/SeparatoG.h>
#include  <Xm/ToggleB.h>
#include  <Xm/BulletinB.h>
#include  <Xm/TextF.h>
#include  <Xm/Form.h>

#include  "tcpview.h"
#include "motif.h"

void generic_callback();
static void timea_callback(), timer_callback(), timed_callback();
static void times_callback(), timen_callback(), line_callback();
static void addr1_callback(), addr2_callback(), addr3_callback(), addr4_callback();
static void verbose_callback(), brief_callback(), seq_callback(), dlc_callback();
static Widget bb_widget, text_widget;

#ifdef __STDC__
void savefile( char *, Boolean , u_short );
void printfile( char *, Boolean , u_short );
#else
void savefile();
void printfile();
#endif

extern char FileName1[];
char PrintName[128];
static Boolean SaveAll=False;
static u_short Filetype = 0;
static Boolean Print2File=False;

/* these are temporary flags */
static int nfl, Nfl, qfl, vfl, Sfl, efl, tfl;
static u_short Line_Fl, Man_Fl;

extern u_long Current_Packets, Packet_Count;

static
void save_callback( widget, name, call_data )
Widget  widget;
char    *name;
caddr_t call_data;
{
  char *string;
  string = XmTextFieldGetString(text_widget);
  XtUnrealizeWidget( bb_widget ); 
  savefile( string, SaveAll, Filetype );
  SaveAll = False;
  XtFree(string);
}       /* save_callback */

static
void print_callback( widget, name, call_data )
Widget  widget;
char    *name;
caddr_t call_data;
{
  char *filename, str[128];
  extern char PrintCommand[];

  if( Print2File )
    filename = XmTextFieldGetString(text_widget);
  else
    filename = tmpnam(NULL);

  XtUnrealizeWidget( bb_widget );

  printfile( filename, SaveAll, Filetype );

  if( Print2File == False ) {
    sprintf( str, "%s %s",PrintCommand, filename );
    system( str );
    unlink( filename ); 
  }
    
  SaveAll = False;
  XtFree(filename);
}       /* print_callback */

static
void tog_callback( widget, data, call_data )
Widget  widget;
caddr_t data;
caddr_t call_data;
{
  int i = (int)data;

  switch(i) {
  case 0:
    SaveAll = False;
    break;
  case 1:
    SaveAll = True;
    break;
  case 2:
    Filetype = 0;
    break;
  case 3:
    Filetype = 1;
    break;
  case 4:
    if( Print2File==True )
      Print2File = False;
    else
      Print2File = True;
  }
}       /* tog_callback */

static void sumopts_callback( widget, name, call_data )
Widget  widget;
char    *name;
caddr_t call_data;
{
  void redisplay_current_list();
  XtUnrealizeWidget( bb_widget );

  /* set flags with their temporary values */

  tflag = tfl; eflag = efl; vflag = vfl; nflag = nfl;
  Nflag = Nfl; Sflag = Sfl; Line_Flag = Line_Fl;
  Man_Flag = Man_Fl;

  /* rescan list and display */
  redisplay_current_list();
}

static void cancel_callback( widget, name, call_data )
Widget  widget;
char    *name;
caddr_t call_data;
{
  XtUnrealizeWidget( bb_widget );
}

/*
** SaveDialog() creates the dialog displayed when "Save"
** is selected.
*/

void SaveDialog (parent, name, callback)
Widget parent;
char *name;
void (*callback)();
{
  Widget pack_label, main_row, row, ok, cancel, help;
  Widget frame1, frame2, rc1, rc2, form;
  Arg args[10];
  int n;
  char buf[30];

  n=0;
  XtSetArg( args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL ); n++; 
  bb_widget = XmCreateBulletinBoardDialog (parent,"save",args,n);

  n = 0;
  XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
  main_row = XmCreateRowColumn( bb_widget,"main",args,n);
  XtManageChild( main_row ); 
		
  sprintf(buf,"%d packets selected out of %d",Current_Packets,Packet_Count);
  n=0;
  pack_label = CreateLabelWidget (main_row,"save_packets",buf,args,n);

  n = 0;
  XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
  XtSetArg( args[n], XmNpacking,     XmPACK_COLUMN ); n++;
  row = XmCreateRowColumn( main_row,"row",args,n);
  XtManageChild( row ); 

  /* make a frame */
  n=0;
  XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
  frame1 = XmCreateFrame (row,"frame",args,n);
  XtManageChild(frame1);

  /* create a radio box to hold toggle buttons */
  rc1 = CreateRadioBox (frame1, "options");

  /* create toggles */
  (void)CreateSimpleToggle (rc1, "Filtered",!SaveAll,XmONE_OF_MANY,
			    tog_callback,(caddr_t)0);
  (void)CreateSimpleToggle (rc1,"All",SaveAll,XmONE_OF_MANY,
			    tog_callback,(caddr_t)1);
  XtManageChild(rc1);  

  /* create another frame */
  n=0;
  XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
  frame2 = XmCreateFrame (row,"frame",args,n);
  XtManageChild(frame2);

  /* create a radio box to hold toggle buttons */
  rc2 = CreateRadioBox (frame2, "options");

  /* create toggles */
  CreateSimpleToggle (rc2, "Sniffer Format",(Filetype==0)?True:False,
		      XmONE_OF_MANY,tog_callback,(caddr_t)2);
  CreateSimpleToggle (rc2, "TCPDUMP Format",(Filetype==1)?True:False,
		      XmONE_OF_MANY,tog_callback,(caddr_t)3);
  XtManageChild(rc2);  

  n=0;
  (void)CreateLabelWidget (main_row,"","Filename:",args,n);

  /* make a textfield to hold filename */
  n=0;
  if( *FileName1 ) {
    XtSetArg ( args[n], XmNvalue, FileName1 ); n++;
    XtSetArg ( args[n], XmNcursorPosition, strlen(FileName1) ); n++; 
  }
  text_widget = XmCreateTextField(main_row,"text",args,n);
  XtManageChild(text_widget);
  
  /* create a form to hold OK, Cancel, and Help buttons */
  n = 0;
  form = XtCreateManagedWidget("buttons",
	        xmFormWidgetClass,main_row,args,n);
  
  /* create 'OK' pushbutton */
  n = 0;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNrightPosition, 30); n++;
  ok = CreatePushButton( form, "OK", "OK" ,args, n, save_callback );
  
  /* Set OK button as default */
  BulletinDefaultButton( bb_widget, ok );

  /* create 'Cancel' pushbutton */
  n = 0;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNleftPosition, 35); n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNrightPosition, 65); n++;
  cancel = CreatePushButton( form, "Cancel", "Cancel", args, n, 
			    cancel_callback );

  /* create 'Help' pushbutton */
  n = 0;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNleftPosition, 70); n++;
  help = CreatePushButton( form, "Help", "Help", args, n, generic_callback );

  /* turn off 'Help' pushbutton for now */
  XtSetSensitive( help, False );
  XtManageChild(form);

  XtManageChild( bb_widget ); 
}


void SummaryOptionDialog (parent, name, callback)
Widget parent;
char *name;
void (*callback)();
{
  Widget frame1, frame2, tog_row, main_row, form;
  Widget rc1, rc2, help, cancel, ok, add_label, col1;
  int n;
  Arg args[10];

  tfl = tflag; efl = eflag; vfl = vflag; nfl = nflag; Man_Fl = Man_Flag;
  Nfl = Nflag; Sfl = Sflag; Line_Fl = Line_Flag;
  n=0;
  XtSetArg( args[n], XmNautoUnmanage, False ); n++;
  XtSetArg( args[n], XmNnoResize, True ); n++; 
  XtSetArg( args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL ); n++; 
  bb_widget = XmCreateBulletinBoardDialog (parent,"sumopts",args,n);

  n = 0;
  XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
  main_row = XmCreateRowColumn( bb_widget,"main",args,n);
  XtManageChild( main_row ); 
  
  n = 0;
  XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
  XtSetArg( args[n], XmNpacking,     XmPACK_COLUMN ); n++;
  tog_row = XmCreateRowColumn( main_row,"sumopts_row",args,n);
  XtManageChild( tog_row ); 

  /* make a frame */
  n=0;
  XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
  frame1 = XmCreateFrame (tog_row,"frame",args,n);
  XtManageChild(frame1);

  n = 0;
  XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
  col1 = XmCreateRowColumn( frame1,"col1",args,n);

  n=0;
  XtSetArg( args[n], XmNalignment, XmALIGNMENT_CENTER ); n++;
  add_label = CreateLabelWidget (col1,"addopt","ADDRESS OPTIONS",args,n);

  /* create a radio box to hold toggle buttons */
  rc1 = CreateRadioBox (col1, "addroptions");

  /* create toggles */
  (void)CreateToggle (rc1, "name","Name (from DNS or host table)",
		      nfl?False:True,XmONE_OF_MANY,addr1_callback);
  (void)CreateToggle (rc1, "numerical","Number (IP or DLC)",nfl,
		      XmONE_OF_MANY,addr2_callback);
  XtManageChild(rc1);  

  /* create toggles */
  (void)CreateSimpleToggle (col1, "Use full domain name",
		      Nfl?False:True,XmN_OF_MANY,addr3_callback,(caddr_t)0);
  (void)CreateSimpleToggle (col1, "Use manuf. name in DLC addresses",Man_Fl,
		      XmN_OF_MANY,addr4_callback,(caddr_t)0);
  XtManageChild( col1 ); 


  /* Now do the time options */
  /* create another frame */
  n=0;
  XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
  frame2 = XmCreateFrame (tog_row,"frame",args,n);
  XtManageChild(frame2);

  n = 0;
  XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
  col1 = XmCreateRowColumn( frame2,"col1",args,n);

  n=0;
  XtSetArg( args[n], XmNalignment, XmALIGNMENT_CENTER ); n++;
  (void)CreateLabelWidget (col1,"timeopt","  TIME OPTIONS",args,n);

  /* create a rowcolumn to hold toggle buttons */
  n = 0;
  XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
  XtSetArg( args[n], XmNnumColumns, 2 ); n++;
  rc2 = XmCreateRadioBox( col1,"timecol",args,n);

  /* create toggles */
  (void)CreateSimpleToggle (rc2, "Absolute",tfl==0?True:False,
		      XmONE_OF_MANY,timea_callback,(caddr_t)0);
  (void)CreateSimpleToggle (rc2, "Delta",tfl==3?True:False,
		      XmONE_OF_MANY,timed_callback,(caddr_t)0);
  (void)CreateSimpleToggle (rc2, "None", tfl==1?True:False,
		      XmONE_OF_MANY,timen_callback,(caddr_t)0);
  (void)CreateSimpleToggle (rc2, "Unix Timestamp",tfl==2?True:False,
		      XmONE_OF_MANY,times_callback,(caddr_t)0);
  (void)CreateSimpleToggle (rc2, "Relative",tfl==4?True:False,
		      XmONE_OF_MANY,timer_callback,(caddr_t)0);
  XtManageChild(rc2);
  XtManageChild(col1);

  /* make a frame */
  n=0;
  XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
  frame1 = XmCreateFrame (main_row,"frame",args,n);
  XtManageChild(frame1);

  /* put a row-column in frame */
  n = 0;
  XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
  XtSetArg( args[n], XmNpacking, XmPACK_COLUMN ); n++;
  XtSetArg( args[n], XmNnumColumns, 2 ); n++;
  col1 = XmCreateRowColumn( frame1,"col1",args,n);

  /* create toggles */
  (void)CreateSimpleToggle (col1, "Verbose",vfl,XmN_OF_MANY,verbose_callback,(caddr_t)0);
  (void)CreateSimpleToggle (col1, "Brief",qfl,XmN_OF_MANY,brief_callback,(caddr_t)0);
  (void)CreateSimpleToggle (col1, "Display DLC header",efl,XmN_OF_MANY,dlc_callback,(caddr_t)0);
  (void)CreateSimpleToggle (col1, "Use relative TCP sequence numbers",!Sfl,XmN_OF_MANY,seq_callback,(caddr_t)0);
  (void)CreateSimpleToggle (col1, "Display line numbers", Line_Fl,XmN_OF_MANY, line_callback,(caddr_t)0);
  XtManageChild( col1 ); 
  
    /* create a form to hold OK, Cancel, and Help buttons */
  n = 0;
  form = XtCreateManagedWidget("buttons",
	        xmFormWidgetClass,main_row,args,n);

  /* create 'OK' pushbutton */
  n = 0;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNrightPosition, 30); n++;
  ok = CreatePushButton( form, "OK", "OK",args, n, sumopts_callback );
  
  /* Set OK button as default */
  BulletinDefaultButton( bb_widget, ok );

  /* create 'Cancel' pushbutton */
  n = 0;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNleftPosition, 35); n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNrightPosition, 65); n++;
  cancel = CreatePushButton( form, "Cancel", "Cancel",args, n, cancel_callback );

  /* create 'Help' pushbutton */
  n = 0;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNleftPosition, 70); n++;
  help = CreatePushButton( form, "Help", "Help",args, n, generic_callback );

  /* turn off 'Help' pushbutton for now */
  XtSetSensitive( help, False );
  XtManageChild( form );
  XtManageChild( bb_widget ); 
}

static void timea_callback( widget, name, x )
Widget  widget;
char    *name;
XmToggleButtonCallbackStruct *x;
{
  tfl = 0;
}

static void timer_callback( widget, name, x )
Widget  widget;
char    *name;
XmToggleButtonCallbackStruct *x;
{
  tfl = 4;
}

static void timed_callback( widget, name, x )
Widget  widget;
char    *name;
XmToggleButtonCallbackStruct *x;
{
  tfl = 3;
}

static void times_callback( widget, name, x )
Widget  widget;
char    *name;
XmToggleButtonCallbackStruct *x;
{
  tfl = 2;
}

static void timen_callback( widget, name, x )
Widget  widget;
char    *name;
XmToggleButtonCallbackStruct *x;
{
  tfl = 1;
}

static void addr1_callback( widget, name, call_data )
Widget  widget;
char    *name;
caddr_t call_data;
{
  nfl = 0;
}

static void addr2_callback( widget, name, call_data )
Widget  widget;
char    *name;
caddr_t call_data;
{
  nfl = 1;
}

static void addr3_callback( widget, name, x )
Widget  widget;
char    *name;
XmToggleButtonCallbackStruct *x;
{
  if(Nfl)
    Nfl = 0;
  else
    Nfl = 1;
}

static void addr4_callback( widget, name, x )
Widget  widget;
char    *name;
XmToggleButtonCallbackStruct *x;
{
  if(Man_Fl)
    Man_Fl = 0;
  else
    Man_Fl = 1;
}

static void verbose_callback( widget, name, call_data )
Widget widget;
caddr_t name, call_data;
{
  if(vfl)
    vfl = 0;
  else
    vfl = 1;
}

static void brief_callback( widget, name, call_data )
Widget widget;
caddr_t name, call_data;
{
  if(qfl)
    qfl = 0;
  else
    qfl = 1;
}

static void dlc_callback( widget, name, call_data )
Widget  widget;
char    *name;
caddr_t call_data;
{
  if(efl)
    efl = 0;
  else
    efl = 1;
}

static void seq_callback( widget, name, call_data )
Widget  widget;
char    *name;
caddr_t call_data;
{
  if(Sfl)
    Sfl = 0;
  else
    Sfl = 1;
}

static void line_callback( widget, name, call_data )
Widget  widget;
char    *name;
caddr_t call_data;
{
  if(Line_Fl)
    Line_Fl = 0;
  else
    Line_Fl = 1;
}

void PrintDialog (parent, name, callback)
Widget parent;
char *name;
void (*callback)();
{
  Widget pack_label, main_row, row, ok, cancel, help;
  Widget frame1, frame2, rc1, rc2, form;
  Arg args[10];
  int n;
  char buf[30];

  n=0;
  XtSetArg( args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL ); n++; 
  bb_widget = XmCreateBulletinBoardDialog (parent,"save",args,n);

  n = 0;
  XtSetArg( args[n], XmNorientation, XmVERTICAL ); n++;
  main_row = XmCreateRowColumn( bb_widget,"main",args,n);
  XtManageChild( main_row ); 
		
  sprintf(buf,"%d packets selected out of %d",Current_Packets,Packet_Count);
  n=0;
  pack_label = CreateLabelWidget (main_row,"save_packets",buf,args,n);

  n = 0;
  XtSetArg( args[n], XmNorientation, XmHORIZONTAL ); n++;
  XtSetArg( args[n], XmNpacking,     XmPACK_COLUMN ); n++;
  row = XmCreateRowColumn( main_row,"row",args,n);
  XtManageChild( row ); 

  /* make a frame */
  n=0;
  XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
  frame1 = XmCreateFrame (row,"frame",args,n);
  XtManageChild(frame1);

  /* create a radio box to hold toggle buttons */
  rc1 = CreateRadioBox (frame1, "options");

  /* create toggles */
  CreateSimpleToggle (rc1, "Filtered",!SaveAll,XmONE_OF_MANY,tog_callback,(caddr_t)0);
  CreateSimpleToggle (rc1, "All",SaveAll,XmONE_OF_MANY,tog_callback,(caddr_t)1);
  XtManageChild(rc1);  

  /* create another frame */
  n=0;
  XtSetArg ( args[n], XmNshadowThickness, 4 ); n++;
  frame2 = XmCreateFrame (row,"frame",args,n);
  XtManageChild(frame2);

  /* create a radiobox to hold toggle buttons */
  rc2 = CreateRadioBox (frame2, "options");

  Filetype = 0;
  /* create toggles */
  CreateSimpleToggle (rc2, "Summary",!Filetype,XmONE_OF_MANY,tog_callback,(caddr_t)2);
  CreateSimpleToggle (rc2, "Detail",Filetype,XmONE_OF_MANY,tog_callback,(caddr_t)3);
  XtManageChild(rc2);

  n=0;
/*  pack_label = CreateLabelWidget (main_row,"save_packets","Print to file: ",args,n); */
  CreateSimpleToggle(main_row,"Print to File",Print2File,
		     XmN_OF_MANY,tog_callback,(caddr_t)4);

  /* make a textfield to hold filename */
  n=0;

  if( PrintName[0] != '\0' ) {
    XtSetArg ( args[n], XmNvalue, PrintName ), n++;
    XtSetArg ( args[n], XmNcursorPosition, strlen(PrintName) ); n++; 
  }
  text_widget = XmCreateTextField(main_row,"text",args,n);
  XtManageChild(text_widget);
  
  /* create a form to hold OK, Cancel, and Help buttons */
  n = 0;
  form = XtCreateManagedWidget("buttons",xmFormWidgetClass,main_row,args,n);
  
  /* create 'OK' pushbutton */
  n = 0;
/*  XtSetArg( args[n], XmNshowAsDefault, 1 ); n++; */
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNrightPosition, 30); n++;
  ok = CreatePushButton( form, "OK", "OK" ,args, n, print_callback );
  
  /* Set OK button as default */
  BulletinDefaultButton( bb_widget, ok );

  /* create 'Cancel' pushbutton */
  n = 0;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNleftPosition, 35); n++;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNrightPosition, 65); n++;
  cancel = CreatePushButton( form, "Cancel", "Cancel", args, n, 
			    cancel_callback );

  /* create 'Help' pushbutton */
  n = 0;
  XtSetArg (args[n], XmNrightAttachment, XmATTACH_FORM); n++;
  XtSetArg (args[n], XmNleftAttachment, XmATTACH_POSITION); n++;
  XtSetArg (args[n], XmNleftPosition, 70); n++;
  help = CreatePushButton( form, "Help", "Help", args, n, generic_callback );

  /* turn off 'Help' pushbutton for now */
  XtSetSensitive( help, False );
  XtManageChild(form);

  XtManageChild( bb_widget ); 
}


void AboutDialog (parent, name, callback)
Widget parent;
char *name;
void (*callback)();
{
  extern char tcpview_version[];
  char buf[256];
  XmString ms, Str2XmString();
  int n;
  Arg a[4];
  Widget widget;

  sprintf(buf,"TCPVIEW version %s\n\nBy Martin M. Hunt\nmartinh@cac.washington.edu\nUniversity of Washington\nNetworks and Distributed Computing",tcpview_version);

  ms = Str2XmString(buf);
  n=0;
  XtSetArg( a[n], XmNmessageString, ms ); n++;
  widget = XmCreateInformationDialog(parent, "About", a, n );
  RemoveDialButton( widget, XmDIALOG_CANCEL_BUTTON );
  RemoveDialButton( widget, XmDIALOG_HELP_BUTTON );
  XtManageChild(widget);
  XmStringFree(ms);
}






syntax highlighted by Code2HTML, v. 0.9.1