/* Copyright (c) 1998   Alexander Yukhimets. All rights reserved. */

#define XM_NOTEBOOK 0

#include<stdio.h>
#include<string.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>

#include"axyftp.h"
#include"utils.h"
#include"multi.h"
#include"status.h"
#include"read_init.h"
#include"session_data.h"
#include"functions.h"
#include"session_dialog.h"
#include"session_general.h"
#include"session_startup.h"
#include"session_advanced.h"

static void time_to_retry(int sig){
  siglongjmp(jmp_down_env,2);
}

#ifdef BUILD_GTK

#include<gtk/gtk.h>

static void init_session_dialog(GtkWidget*);

void request_connection(){
  char* volatile mask;
  volatile int count,ret,total,delay;
  char t[40];
  
  fetch_session_data(appdata.session,appdata.sdata);
  gtk_entry_set_text(GTK_ENTRY(appdata.remote.text),appdata.sdata->remmask);
  gtk_entry_set_text(GTK_ENTRY(appdata.local.text),appdata.sdata->locmask);
  mask=gtk_entry_get_text(GTK_ENTRY(appdata.remote.text));
  total=atoi(appdata.odata->redial);
  if(total<0)total=0;
  delay=atoi(appdata.odata->delay);
  if(delay<0)delay=0;
  count=0;
  while(1){
    start_session(appdata.sdata,mask);
    if(appdata.connected){
      gtk_label_set(GTK_LABEL(GTK_BUTTON(appdata.conbutton)->child),
	  "disconnect");
      signal(SIGALRM,SIG_IGN);
      break;
    } else {
      sprintf(t,"Attempt %d failed\n",count++);
      append_status(t);
      if(count>total){
	signal(SIGALRM,SIG_IGN);
	break;
      }
      if(delay>0){
	signal(SIGALRM,time_to_retry);
	alarm(delay);
	if(!(ret=sigsetjmp(jmp_down_env,1))){
	  appdata.jump_on_cancel=1;
	  LOOP();
	} 
	appdata.jump_on_cancel=0;
      }
      if(appdata.interrupt){
	signal(SIGALRM,SIG_IGN);
	appdata.interrupt=0;
	break;
      }
      sprintf(t,"Attempt %d ...\n",count);
      append_status(t);
    }
  }
}

void update_session_dialog(int pos,char set_profile){
  session_data *sd;
  int i;
  for(i=0,sd=appdata.sdata;i<pos;i++)sd=sd->next;
  put_session_data(appdata.session,sd,set_profile);
}

void put_session_data(GtkWidget *dialog,session_data* sd,char set_profile){
  GtkWidget *current;
  char* pass;
  
  if(set_profile){
    current=WXnameToWidget(dialog,"profile");
    gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(current)->entry),sd->profile);
  }
  
  current=WXnameToWidget(dialog,"host");
  gtk_entry_set_text(GTK_ENTRY(current),sd->host);

  current=WXnameToWidget(dialog,"Anonymous");
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(current),sd->anon);
  gtk_object_set_user_data(GTK_OBJECT(current),(gpointer)(sd->anon?TRUE:FALSE));

  current=WXnameToWidget(dialog,"user");
  gtk_entry_set_text(GTK_ENTRY(current),sd->user);

  current=WXnameToWidget(dialog,"pass");
  pass=(char*)gtk_object_get_user_data(GTK_OBJECT(current));
#ifdef OLD_GTK
  if(sd->anon){
#endif
    gtk_entry_set_text(GTK_ENTRY(current),sd->pass);
    pass[0]='\0';
#ifdef OLD_GTK
  } else {
    char* stars;
    int n;
    stars=WXmalloc((n=strlen(sd->pass))+1);
    strcpy(pass,sd->pass);
    memset(stars,'*',n);
    stars[n]='\0';
    gtk_entry_set_text(GTK_ENTRY(current),stars);
    WXfree(stars);
  }
#endif

  current=WXnameToWidget(dialog,"account");
  gtk_entry_set_text(GTK_ENTRY(current),sd->account);

  current=WXnameToWidget(dialog,"comment");
  gtk_entry_set_text(GTK_ENTRY(current),sd->comment);

  current=WXnameToWidget(dialog,"remdir");
  gtk_entry_set_text(GTK_ENTRY(current),sd->remdir);

  current=WXnameToWidget(dialog,"locdir");
  gtk_entry_set_text(GTK_ENTRY(current),sd->locdir);

  current=WXnameToWidget(dialog,"initcom");
  gtk_entry_set_text(GTK_ENTRY(current),sd->initcom);

  current=WXnameToWidget(dialog,"locmask");
  gtk_entry_set_text(GTK_ENTRY(current),sd->locmask);

  current=WXnameToWidget(dialog,"remmask");
  gtk_entry_set_text(GTK_ENTRY(current),sd->remmask);

  current=WXnameToWidget(dialog,"Save Password");
  gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(current),sd->save);

  current=WXnameToWidget(dialog,"port");
  gtk_entry_set_text(GTK_ENTRY(current),sd->port);
}

void fetch_session_data(GtkWidget *dialog,session_data* sd){
  GtkWidget *current;
#ifdef OLD_GTK
  char* pass;
#endif

  current=WXnameToWidget(dialog,"profile");
  sd->profile=WXnewstring(gtk_entry_get_text(
	GTK_ENTRY(GTK_COMBO(current)->entry)));
  
  current=WXnameToWidget(dialog,"host");
  sd->host=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  current=WXnameToWidget(dialog,"user");
  sd->user=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  current=WXnameToWidget(dialog,"Anonymous");
  sd->anon=(int)GTK_TOGGLE_BUTTON(current)->active;

  current=WXnameToWidget(dialog,"pass");
#ifdef OLD_GTK
  if(sd->anon){
#endif
    sd->pass=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));
#ifdef OLD_GTK
  } else {
    pass=gtk_object_get_user_data(GTK_OBJECT(current));
    sd->pass=WXnewstring(pass);
  }
#endif

  current=WXnameToWidget(dialog,"account");
  sd->account=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  current=WXnameToWidget(dialog,"comment");
  sd->comment=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  current=WXnameToWidget(dialog,"remdir");
  sd->remdir=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  current=WXnameToWidget(dialog,"locdir");
  sd->locdir=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  current=WXnameToWidget(dialog,"initcom");
  sd->initcom=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  current=WXnameToWidget(dialog,"locmask");
  sd->locmask=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  current=WXnameToWidget(dialog,"remmask");
  sd->remmask=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  current=WXnameToWidget(dialog,"Save Password");
  sd->save=(int)GTK_TOGGLE_BUTTON(current)->active;

  current=WXnameToWidget(dialog,"port");
  sd->port=WXnewstring(gtk_entry_get_text(GTK_ENTRY(current)));

  return;
}

static void action_cb(GtkWidget *w){
  GtkWidget *combo,*list,*item;
  char *s;
  session_data *sd;
  GList *sel;
  int pos,i;

  gtk_label_get(GTK_LABEL(GTK_BUTTON(w)->child),&s);

  if(strcmp(s,"OK")==0){
    gtk_widget_hide(appdata.session);
    gtk_grab_remove(appdata.session);
    appdata.job=1;
    busy_cursor(TRUE);
    process_events();
    request_connection();
    busy_cursor(FALSE);
    appdata.job=0;
  } else if(strcmp(s,"Help")==0){
    show_help(2);
  } else if(strcmp(s,"Cancel")==0){
    gtk_widget_hide(appdata.session);
    gtk_grab_remove(appdata.session);
  } else if(strcmp(s,"Save")==0){
    combo=WXnameToWidget(appdata.session,"profile");
    list=GTK_COMBO(combo)->list;
    sel=GTK_LIST(list)->selection;
    if(sel!=0){
      pos=gtk_list_child_position(GTK_LIST(list),sel->data);
      for(i=0,sd=appdata.sdata;i<pos+1;i++)sd=sd->next;
      fetch_session_data(appdata.session,sd);
      gtk_combo_set_item_string(GTK_COMBO(combo),sel->data,sd->profile);
      /*
      gtk_list_select_child(list,poslist[0],False);
      */
      write_session_data(session_file,appdata.sdata);
    } else {
      appdata.sdata->next=create_session_data(appdata.sdata->next);
      fetch_session_data(appdata.session,appdata.sdata->next);
      item=gtk_list_item_new_with_label(appdata.sdata->next->profile);
      gtk_widget_show(item);
      sel=g_list_append(sel,(gpointer)item);
      gtk_list_prepend_items(GTK_LIST(list),sel);
      gtk_list_select_child(GTK_LIST(list),item);
      write_session_data(session_file,appdata.sdata);
    }
  }
}

static GtkWidget* create_actions(GtkWidget* parent){
  static char* label[]={"OK","Cancel","Save","Help"};
  GtkWidget *actions, *button;
  int i;

  actions=gtk_hbox_new(TRUE,2);
  gtk_container_border_width(GTK_CONTAINER(actions),4);
  gtk_widget_show(actions);

  for(i=0;i<4;i++){
    button=gtk_button_new_with_label(label[i]);
    gtk_widget_show(button);
    gtk_signal_connect(GTK_OBJECT(button),"clicked",
	GTK_SIGNAL_FUNC(action_cb),NULL);
    gtk_box_pack_start(GTK_BOX(actions),button,TRUE,TRUE,1);
  }

  return actions;
}

static int close_cb(GtkWidget* w){
  gtk_widget_hide(w);
  gtk_grab_remove(w);
  return TRUE;
}

GtkWidget* create_session_dialog(GtkWidget *parent){
  GtkWidget *session,*box,*actions;
  GtkWidget *notebook,*general,*startup,*advanced;
  
  session=gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_widget_realize(session);
  /*
  gdk_window_set_decorations(session->window,GDK_DECOR_BORDER|GDK_DECOR_TITLE);
  gdk_window_set_functions(session->window,GDK_FUNC_CLOSE|GDK_FUNC_MOVE);
  gtk_window_position(GTK_WINDOW(session),GTK_WIN_POS_NONE);
  */
  gtk_window_set_title(GTK_WINDOW(session),"AxY FTP sessions");

  gtk_signal_connect(GTK_OBJECT(session),"delete_event",
      GTK_SIGNAL_FUNC(close_cb),NULL);

  box=gtk_vbox_new(FALSE,4);
  gtk_widget_show(box);
  gtk_container_add(GTK_CONTAINER(session),box);
  actions=create_actions(box);
  gtk_box_pack_end(GTK_BOX(box),actions,FALSE,FALSE,0);

  notebook=gtk_notebook_new();
  gtk_container_border_width(GTK_CONTAINER(notebook),4);
  gtk_widget_show(notebook);
  gtk_box_pack_end(GTK_BOX(box),notebook,TRUE,TRUE,0);

  general=create_session_general(notebook);

  gtk_notebook_append_page(GTK_NOTEBOOK(notebook),general,
      gtk_label_new("General"));

  startup=create_session_startup(notebook);

  gtk_notebook_append_page(GTK_NOTEBOOK(notebook),startup,
      gtk_label_new("Startup"));

  advanced=create_session_advanced(notebook);

  gtk_notebook_append_page(GTK_NOTEBOOK(notebook),advanced,
      gtk_label_new("Advanced"));

  init_session_dialog(session);

  return session;

}

static void listselect_cb(GtkWidget *w,GtkWidget* item){
  update_session_dialog(gtk_list_child_position(GTK_LIST(w),item)+1,'\0');
  return;
}

void set_profile_strings(GtkWidget* profile){
  GList *list;
  session_data *top;

  list=NULL;
  top=appdata.sdata;
  while(top->next!=NULL){
    top=top->next;
    list=g_list_append(list,top->profile);
  }
  if(list){
    gtk_combo_set_popdown_strings(GTK_COMBO(profile),list);
    g_list_free(list);
  } else {
    gtk_list_clear_items(GTK_LIST(GTK_COMBO(profile)->list),0,-1);
  }

}

static void init_session_dialog(GtkWidget *dialog){
  GtkWidget *profile;
  session_data* top;

  profile=WXnameToWidget(dialog,"profile");

  set_profile_strings(profile);

  top=create_session_data(NULL);
  empty_session_data(top);
  put_session_data(dialog,top,TRUE);
  destroy_session_data(top);

  gtk_signal_connect(GTK_OBJECT(GTK_COMBO(profile)->list),"select_child",
      GTK_SIGNAL_FUNC(listselect_cb),NULL);
}

#elif defined BUILD_MOTIF

#include<Xm/Xm.h>
#include<Xm/Form.h>
#include<Xm/PushB.h>
#include<Xm/ToggleB.h>
#include<Xm/TextF.h>
#include<Dt/ComboBox.h>
#include<Xm/Label.h>
#include<Xm/List.h>
#if XM_NOTEBOOK
#include<Xm/Notebook.h>
#else
#include<XmAxy/Notebook.h>
#endif

static void init_session_dialog(Widget);
static void action_cb(Widget,XtPointer,XtPointer);

static void request_connection(){
  char* volatile mask;
  volatile int count,ret,total,delay;
  char t[40];
  
  fetch_session_data(appdata.session,appdata.sdata);
  XmTextFieldSetString(appdata.remote.text,appdata.sdata->remmask);
  XmTextFieldSetString(appdata.local.text,appdata.sdata->locmask);
  mask=XmTextFieldGetString(appdata.remote.text);

  total=atoi(appdata.odata->redial);
  if(total<0)total=0;
  delay=atoi(appdata.odata->delay);
  if(delay<0)delay=0;
  count=0;
  while(1){
    start_session(appdata.sdata,mask);
    if(appdata.connected){
      XmString l;
      l=XmStringCreateLocalized("disconnect");
      XtVaSetValues(appdata.conbutton,XmNlabelString,l,NULL);
      XmStringFree(l);
      signal(SIGALRM,SIG_IGN);
      break;
    } else {
      sprintf(t,"Attempt %d failed\n",count++);
      append_status(t);
      if(count>total){
	signal(SIGALRM,SIG_IGN);
	break;
      }
      if(delay>0){
	signal(SIGALRM,time_to_retry);
	alarm(delay);
	if(!(ret=sigsetjmp(jmp_down_env,1))){
	  appdata.jump_on_cancel=1;
	  LOOP();
	} 
	appdata.jump_on_cancel=0;
      }
      if(appdata.interrupt){
	signal(SIGALRM,SIG_IGN);
	appdata.interrupt=0;
	break;
      }
      sprintf(t,"Attempt %d ...\n",count);
      append_status(t);
    }
  }
  XtFree(mask);
}

void update_session_dialog(int pos,char set_profile){
  session_data *sd;
  int i;
  for(i=0,sd=appdata.sdata;i<pos;i++)sd=sd->next;
  put_session_data(appdata.session,sd,set_profile);
}

void put_session_data(Widget dialog,session_data* sd,char set_profile){
  Widget current;
  char* pass;

  if(set_profile){
    current=XtNameToWidget(dialog,"*profile*Text");
    XmTextFieldSetString(current,sd->profile);
  }
  
  current=XtNameToWidget(dialog,"*host");
  XmTextFieldSetString(current,sd->host);

  current=XtNameToWidget(dialog,"*Anonymous");
  XmToggleButtonSetState(current,sd->anon,True);

  current=XtNameToWidget(dialog,"*user");
  XmTextFieldSetString(current,sd->user);

  current=XtNameToWidget(dialog,"*pass");
  XtVaGetValues(current,XmNuserData,&pass,NULL);
  if(sd->anon){
    XmTextFieldSetString(current,sd->pass);
    pass[0]='\0';
  } else {
    XmTextFieldSetString(current,sd->pass);
  }

  current=XtNameToWidget(dialog,"*account");
  XmTextFieldSetString(current,sd->account);

  current=XtNameToWidget(dialog,"*comment");
  XmTextFieldSetString(current,sd->comment);

  current=XtNameToWidget(dialog,"*remdir");
  XmTextFieldSetString(current,sd->remdir);

  current=XtNameToWidget(dialog,"*locdir");
  XmTextFieldSetString(current,sd->locdir);

  current=XtNameToWidget(dialog,"*initcom");
  XmTextFieldSetString(current,sd->initcom);

  current=XtNameToWidget(dialog,"*locmask");
  XmTextFieldSetString(current,sd->locmask);

  current=XtNameToWidget(dialog,"*remmask");
  XmTextFieldSetString(current,sd->remmask);

  current=XtNameToWidget(dialog,"*Save Password");
  XmToggleButtonSetState(current,sd->save,False);

  current=XtNameToWidget(dialog,"*port");
  XmTextFieldSetString(current,sd->port);

  XmUpdateDisplay(toplevel);
}

void fetch_session_data(Widget dialog,session_data* sd){
  Widget current;
  char* pass;

  current=XtNameToWidget(dialog,"*profile*Text");
  sd->profile=XmTextFieldGetString(current);
  
  current=XtNameToWidget(dialog,"*host");
  sd->host=XmTextFieldGetString(current);

  current=XtNameToWidget(dialog,"*user");
  sd->user=XmTextFieldGetString(current);

  current=XtNameToWidget(dialog,"*Anonymous");
  sd->anon=XmToggleButtonGetState(current);

  current=XtNameToWidget(dialog,"*pass");
  if(sd->anon){
    sd->pass=XmTextFieldGetString(current);
  } else {
    XtVaGetValues(current,XmNuserData,&pass,NULL);
    sd->pass=XtNewString(pass);
  }

  current=XtNameToWidget(dialog,"*account");
  sd->account=XmTextFieldGetString(current);

  current=XtNameToWidget(dialog,"*comment");
  sd->comment=XmTextFieldGetString(current);

  current=XtNameToWidget(dialog,"*remdir");
  sd->remdir=XmTextFieldGetString(current);

  current=XtNameToWidget(dialog,"*locdir");
  sd->locdir=XmTextFieldGetString(current);

  current=XtNameToWidget(dialog,"*initcom");
  sd->initcom=XmTextFieldGetString(current);

  current=XtNameToWidget(dialog,"*locmask");
  sd->locmask=XmTextFieldGetString(current);

  current=XtNameToWidget(dialog,"*remmask");
  sd->remmask=XmTextFieldGetString(current);

  current=XtNameToWidget(dialog,"*Save Password");
  sd->save=XmToggleButtonGetState(current);

  current=XtNameToWidget(dialog,"*port");
  sd->port=XmTextFieldGetString(current);

  return;
}

static void action_cb(Widget w,XtPointer app,XtPointer call){
  XmString xms,item;
  String s;
  Widget list,combo;
  int * poslist;
  int poscount,i;
  session_data *sd;

  XtVaGetValues(w,XmNlabelString,&xms,NULL);
  if(XmStringGetLtoR(xms,XmFONTLIST_DEFAULT_TAG,&s)){
    if(strcmp(s,"OK")==0){
      XtUnmanageChild(appdata.session);
      appdata.job=1;
      busy_cursor(True);
      process_events();
      request_connection();
      busy_cursor(False);
      appdata.job=0;
    } else if(strcmp(s,"Help")==0){
      show_help(2);
    } else if(strcmp(s,"Cancel")==0){
      XtUnmanageChild(appdata.session);
    } else if(strcmp(s,"Save")==0){
      combo=XtNameToWidget(appdata.session,"*profile");
      list=XtNameToWidget(combo,"*List");
      if(XmListGetSelectedPos(list,&poslist,&poscount)){
	for(i=0,sd=appdata.sdata;i<poslist[0];i++)sd=sd->next;
	fetch_session_data(appdata.session,sd);
	item=XmStringCreateLocalized(sd->profile);
	XmListReplaceItemsPos(list,&item,1,poslist[0]);
	XmListUpdateSelectedList(list);
	XmListSelectPos(list,poslist[0],False);
	XmStringFree(item);
	XtFree((char*)poslist);
        write_session_data(session_file,appdata.sdata);
      } else {
	appdata.sdata->next=create_session_data(appdata.sdata->next);
	fetch_session_data(appdata.session,appdata.sdata->next);
	item=XmStringCreateLocalized(appdata.sdata->next->profile);
	XtVaGetValues(list,XmNitemCount,&i,NULL);
	DtComboBoxAddItem(combo,item,1,FALSE);
	i++;
	if(i<=MAX_VISIBLE_ITEMS){
	  XtVaSetValues(combo,DtNvisibleItemCount,i,NULL);
	  XtVaSetValues(list,XmNvisibleItemCount,i,NULL);
	}
	XmStringFree(item);
	XmListSelectPos(list,1,TRUE);
        write_session_data(session_file,appdata.sdata);
      }
    } 
    XtFree(s);
  }
  XmStringFree(xms);
}

static Widget create_actions(Widget parent){
  static String label[]={"OK","Cancel","Save","Help"};
  Widget actions,button;
  XmString xml;
  int i;
  Arg args[10];
  Cardinal n;

  n=0;
  XtSetArg(args[n],XmNfractionBase,XtNumber(label));n++;
  actions=XmCreateForm(parent,"Actions",args,n);
  XtManageChild(actions);

  for(i=0;i<XtNumber(label);i++){
    xml=XmStringCreateLocalized(label[i]);

    n=0;
    XtSetArg(args[n],XmNlabelString,xml);n++;
    XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM);n++;
    XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM);n++;
    XtSetArg(args[n],XmNleftAttachment,XmATTACH_POSITION);n++;
    XtSetArg(args[n],XmNleftPosition,i);n++;
    XtSetArg(args[n],XmNrightAttachment,XmATTACH_POSITION);n++;
    XtSetArg(args[n],XmNrightPosition,i+1);n++;
    button=XmCreatePushButton(actions,label[i],args,n);
    XtManageChild(button);
    XtAddCallback(button,XmNactivateCallback,action_cb,NULL);

    XmStringFree(xml);
  }
  
  return actions;
}

Widget create_session_dialog(Widget parent){
  Widget session;
  Arg args[10];
  Cardinal n;
  Widget actions,notebook,general,startup,advanced;
  
  n=0;
  XtSetArg(args[n],XmNtitle,"AxY FTP sessions");n++;
  XtSetArg(args[n],XmNdialogStyle,XmDIALOG_APPLICATION_MODAL);n++;
  XtSetArg(args[n],XmNverticalSpacing,6);n++;
  XtSetArg(args[n],XmNhorizontalSpacing,6);n++;
  session=XmCreateFormDialog(parent,"session",args,n);

  actions=create_actions(session);

  n=0;
#if XM_NOTEBOOK 
  XtSetArg(args[n],XmNbackPagePlacement,XmTOP_RIGHT);n++;
  XtSetArg(args[n],XmNmajorTabSpacing,0);n++;
  XtSetArg(args[n],XmNorientation,XmVERTICAL);n++;
  XtSetArg(args[n],XmNbindingType,XmNONE);n++;
  XtSetArg(args[n],XmNbackPageNumber,1);n++;
  XtSetArg(args[n],XmNbackPageSize,0);n++;
  notebook=XmCreateNotebook(session,"notebook",args,n);
#else
  notebook=XmAxyCreateNotebook(session,"notebook",args,n);
#endif
  XtManageChild(notebook);

#if XM_NOTEBOOK 
  n=0;
  XtSetArg(args[n],XmNnotebookChildType,XmPAGE_SCROLLER);n++;
  XtManageChild(XmCreateLabel(notebook,"",args,n));
#endif  

  general=create_session_general(notebook);
  XtManageChild(general);

#if XM_NOTEBOOK 
  n=0;
  XtSetArg(args[n],XmNnotebookChildType,XmMAJOR_TAB);n++;
  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  XtManageChild(XmCreatePushButton(notebook,"General",args,n));
#endif

  n=0;
  startup=create_session_startup(notebook);
  XtManageChild(startup);

#if XM_NOTEBOOK 
  n=0;
  XtSetArg(args[n],XmNnotebookChildType,XmMAJOR_TAB);n++;
  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  XtManageChild(XmCreatePushButton(notebook,"Startup",args,n));
#endif

  n=0;
  advanced=create_session_advanced(notebook);
  XtManageChild(advanced);

#if XM_NOTEBOOK 
  n=0;
  XtSetArg(args[n],XmNnotebookChildType,XmMAJOR_TAB);n++;
  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  XtManageChild(XmCreatePushButton(notebook,"Advanced",args,n));
#endif


  XtVaSetValues(actions,
      XmNbottomAttachment,XmATTACH_FORM,
      XmNrightAttachment,XmATTACH_FORM,
      XmNtopAttachment,XmATTACH_NONE,
      XmNleftAttachment,XmATTACH_FORM,NULL);

  XtVaSetValues(notebook,
      XmNbottomAttachment,XmATTACH_WIDGET,
      XmNbottomWidget,actions,
      XmNrightAttachment,XmATTACH_FORM,
      XmNtopAttachment,XmATTACH_FORM,
      XmNleftAttachment,XmATTACH_FORM,NULL);

#if !XM_NOTEBOOK
  XmAxyNotebookSetCurrentPage(notebook,1,FALSE);
#endif
  init_session_dialog(session);
  
  return session;

}

void set_profile_strings(Widget combo){
  Widget list;
  session_data* top;
  XmString xms;
  int i;

  list=XtNameToWidget(combo,"*List");

  XmListDeleteAllItems(list);
  
  top=appdata.sdata;
  while(top->next!=NULL){
    top=top->next;
    xms=XmStringCreateLocalized(top->profile);
    DtComboBoxAddItem(combo,xms,0,FALSE);
    XmStringFree(xms);
  }
  XtVaGetValues(list,XmNitemCount,&i,NULL);
  if(i>MAX_VISIBLE_ITEMS)i=MAX_VISIBLE_ITEMS;
  XtVaSetValues(combo,DtNvisibleItemCount,i>0?i:1,NULL);
  XtVaSetValues(list,XmNvisibleItemCount,i>0?i:1,NULL);

}

static void init_session_dialog(Widget dialog){
  Widget combo;
  session_data* top;

  combo=XtNameToWidget(dialog,"*profile");

  set_profile_strings(combo);

  top=create_session_data(NULL);
  empty_session_data(top);
  put_session_data(dialog,top,TRUE);
  destroy_session_data(top);
}

#else
#error Either BUILD_GTK or BUILD_MOTIF should be defined
#endif


syntax highlighted by Code2HTML, v. 0.9.1