/*********************************************************** * INTERPRETER WINDOW * ************************************************************ * Description: * * * * Created by: avrami tzur * * At: Wed Jul 22 16:34:04 1992 * ***********************************************************/ /* INCLUDES */ # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include "winlib.h" # include # include /* DECLARATIONS */ /* PROTOTYPES */ void main(int argc, char **argv); static void Application(); static void getFileInput(XtPointer client_data, int *fid,XtInputId *id); static void ErrSys(char *msg); static void InterfaceExit(); static void SendResults(int type, win_msg_header *in_msg, int data_length, void *data ); static Widget CreateMenu(Widget parent); static void QuitMenuCallback(Widget w,caddr_t client_data, XmPushButtonCallbackStruct *call_data); static void AgentsCB(Widget w,caddr_t client_data, XmPushButtonCallbackStruct *call_data); static Widget CreateInformMessage(Widget parent, char *title, char *message, win_msg_header *client_data); static void inform_ok(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static Widget CreateCommandWindow(); static void CommandApplyCB(Widget w, XtPointer client_data, XmCommandCallbackStruct *call_data); static void CreateLoadAgentWindow(); static void LoadApplyCB(Widget w, XtPointer client_data, XmCommandCallbackStruct *call_data); static char **readTextFile(char *file_name, int *counter); static void CreateSimpleQuery(Widget parent, char *title, char *message, win_msg_header *client_data); static void SimpleQnoCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static void SimpleQokCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static void CreateIntervalWindow(Widget parent, char *msg, win_msg_header *client_data); static void IntervalOkCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); static void IntervalCancelCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data); /* End prototypes */ extern int errno; static Widget top_level; /* Top level window */ static int read_pipe, write_pipe; typedef struct { win_msg_header *header; void *slot1; void *slot2; } internal_struct; /* ============================================================ | main() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ void main(int argc, char **argv) { XtAppContext app_context; Arg args[20]; #ifndef WINDOW_DEBUG /* Called from interpreter */ /* Initilize the pipes. */ read_pipe = atoi(argv[1]); fcntl(read_pipe, F_SETFL, O_NDELAY); write_pipe = atoi(argv[2]); #else printf("Debug mode\n"); #endif /* Create the top level window */ argc = 1; top_level = XtAppInitialize(&app_context, "Main",NULL,0, (Cardinal *)&argc, argv, NULL, args,0); Application(); #ifndef WINDOW_DEBUG /* Add the pipe as an input event for the window loop. */ XtAppAddInput(app_context, read_pipe, XtInputReadMask, getFileInput, NULL); #endif XtRealizeWidget(top_level); XtAppMainLoop(app_context); } /* ============================================================ | Application() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void Application() { Widget main_window; /* Main window */ Widget menu_bar; /* Menu bar */ Widget command_w; /* Message area */ Arg args[20]; /* Create the main window */ XtSetArg(args[0], XmNmainWindowMarginHeight, 3 ); XtSetArg(args[1], XmNmainWindowMarginWidth, 3 ); XtSetArg(args[2], XmNshowSeparator, True ); XtSetArg(args[3], XmNwidth, 400 ); XtSetArg(args[4], XmNheight, 300 ); main_window = XmCreateMainWindow(top_level, "main", args, 5); XtManageChild(main_window); /* Create the menu */ menu_bar = CreateMenu(main_window); command_w = CreateCommandWindow(main_window); XmMainWindowSetAreas(main_window, menu_bar, command_w, NULL, NULL, NULL); } /* ============================================================ | getFileInput() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void getFileInput(XtPointer client_data, int *fid,XtInputId *id) { int n; win_msg_header temp; win_msg_header *header; char *data; if((n = read(*fid, (char *)&temp, sizeof(win_msg_header))) > 0){ if (n!= sizeof(win_msg_header)) ErrSys(" Read pipe - read header"); data = (char *)malloc(temp.data_length); n = read(*fid, data, temp.data_length); if(n != temp.data_length ) ErrSys(" Read pipe = read data"); header = (win_msg_header *)malloc(sizeof(win_msg_header)); memcpy((void *)header, (void *)&temp,sizeof(win_msg_header)); switch (header->msg_type) { case WIN_INFORM_REQUEST: { CreateInformMessage(top_level, "Inform message", data, header); break; } case WIN_QUIT_REQUEST: { InterfaceExit(); break; } case WIN_QUESTION_REQUEST: { CreateSimpleQuery(top_level, "Simple Question", data, header); break; } case WIN_INTERVAL_HOURS_REQUEST:{ CreateIntervalWindow(top_level, data, header); break; } case WIN_INTERVAL_DAYS_REQUEST:{ CreateIntervalWindow(top_level, data, header); break; } case WIN_INTERVAL_MONTHS_REQUEST:{ CreateIntervalWindow(top_level, data, header); break; } } } } /* ============================================================ | ErrSys() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void ErrSys(char *msg) { printf("Error: %s\n", msg); SendResults(WIN_QUIT_REQUEST, NULL, 0, NULL); } /* ============================================================ | InterfaceExit() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void InterfaceExit() { /* CloseV the pipes. */ close(read_pipe); close(write_pipe); XtCloseDisplay(XtDisplay(top_level)); exit(0); } /* ============================================================ | SendResults() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void SendResults(int type, win_msg_header *in_msg, int data_length, void *data ) { char buffer[1000]; int header_size = sizeof(win_msg_header); win_msg_header *ptr1 = (win_msg_header *)buffer; char *ptr2 = (char *)(buffer + header_size); if(in_msg != NULL){ memcpy((void *)buffer, (void *)in_msg, header_size ); } ptr1->msg_type = type; ptr1->data_length = data_length; memcpy((void *)ptr2, data,data_length); #ifndef WINDOW_DEBUG write(write_pipe, buffer, header_size + data_length ); #endif } /* ============================================================ | CreateMenu() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static Widget CreateMenu(Widget parent) { Widget menu_bar; Widget schedule_menu, quit_menu; Arg args[20]; XmString bar_items[5], schedule_items[6], quit_items[1]; XmButtonType bar_items_type[5], schedule_items_type[6], quit_items_type[1]; XmString bar_accelerator[5]; /* Create the bar items labels*/ bar_items[0] = XmStringCreateLtoR("Agents", XmSTRING_DEFAULT_CHARSET); /* bar_items[1] = XmStringCreateLtoR("Send mesage to agent", XmSTRING_DEFAULT_CHARSET); bar_items[2] = XmStringCreateLtoR("Mail", XmSTRING_DEFAULT_CHARSET); bar_items[3] = XmStringCreateLtoR("Options", XmSTRING_DEFAULT_CHARSET); */ bar_items[1] = XmStringCreateLtoR("Quit", XmSTRING_DEFAULT_CHARSET); /* Bar items type */ bar_items_type[0] = XmCASCADEBUTTON; bar_items_type[1] = XmCASCADEBUTTON; /* bar_items_type[2] = XmCASCADEBUTTON; bar_items_type[3] = XmCASCADEBUTTON; bar_items_type[4] = XmCASCADEBUTTON; */ /* Bar items quick keys */ bar_accelerator[0] = XmStringCreateLtoR("Alt-S", XmSTRING_DEFAULT_CHARSET); /* bar_accelerator[1] = XmStringCreateLtoR("Alt-E", XmSTRING_DEFAULT_CHARSET); bar_accelerator[2] = XmStringCreateLtoR("Alt-M", XmSTRING_DEFAULT_CHARSET); bar_accelerator[3] = XmStringCreateLtoR("Alt-O", XmSTRING_DEFAULT_CHARSET); */ bar_accelerator[1] = XmStringCreateLtoR("Alt-Q", XmSTRING_DEFAULT_CHARSET); /* Set the arguments */ XtSetArg(args[0], XmNbuttonCount, 2); XtSetArg(args[1], XmNbuttons, bar_items); XtSetArg(args[2], XmNbuttonType, bar_items_type); XtSetArg(args[3], XmNbuttonAcceleratorText, bar_accelerator); XtSetArg(args[4], XmNadjustLast, False); /* Create the menu bar widget */ menu_bar = XmCreateSimpleMenuBar(parent, "MenuBar", args, 5); XtManageChild(menu_bar); /* Create the pull-down menus */ /* Agents menu */ schedule_items[0] = XmStringCreateLtoR("Load", XmSTRING_DEFAULT_CHARSET); schedule_items[1] = XmStringCreateLtoR("Interval", XmSTRING_DEFAULT_CHARSET); schedule_items[2] = XmStringCreateLtoR("Inform", XmSTRING_DEFAULT_CHARSET); schedule_items[3] = XmStringCreateLtoR("Question", XmSTRING_DEFAULT_CHARSET); schedule_items[4] = XmStringCreateLtoR("", XmSTRING_DEFAULT_CHARSET); schedule_items[5] = XmStringCreateLtoR("Compile", XmSTRING_DEFAULT_CHARSET); /* Agents items type */ schedule_items_type[0] = XmPUSHBUTTON; schedule_items_type[1] = XmPUSHBUTTON; schedule_items_type[2] = XmPUSHBUTTON; schedule_items_type[3] = XmPUSHBUTTON; schedule_items_type[4] = XmSEPARATOR; schedule_items_type[5] = XmPUSHBUTTON; /* Set the arguments */ XtSetArg(args[0], XmNbuttonCount, 6); XtSetArg(args[1], XmNbuttons, schedule_items); XtSetArg(args[2], XmNbuttonType, schedule_items_type); XtSetArg(args[3], XmNpostFromButton, 0); XtSetArg(args[4], XmNsimpleCallback, (XtCallbackProc)AgentsCB); schedule_menu = XmCreateSimplePulldownMenu(menu_bar, "Control", args, 5); /* Quit menu */ quit_items[0] = XmStringCreateLtoR("Exit", XmSTRING_DEFAULT_CHARSET); /* Quit items type */ quit_items_type[0] = XmPUSHBUTTON; XtSetArg(args[0], XmNbuttonCount, 1); XtSetArg(args[1], XmNbuttons, quit_items); XtSetArg(args[2], XmNbuttonType, quit_items_type); XtSetArg(args[3], XmNpostFromButton, 1); XtSetArg(args[4], XmNsimpleCallback, (XtCallbackProc)QuitMenuCallback); quit_menu = XmCreateSimplePulldownMenu(menu_bar, "QuitMenu", args, 5); return(menu_bar); } /* ============================================================ | QuitMenuCallback() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void QuitMenuCallback(Widget w,caddr_t client_data, XmPushButtonCallbackStruct *call_data) { SendResults(WIN_QUIT_REQUEST, NULL, 0, NULL); } /* ============================================================ | AgentsCB() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void AgentsCB(Widget w,caddr_t client_data, XmPushButtonCallbackStruct *call_data) { switch ((int)client_data) { case 0: CreateLoadAgentWindow(); break; case 1: CreateIntervalWindow(top_level, "Hour selection", NULL); break; case 2: CreateInformMessage(top_level, "Internl inform message", "Hello World\n12dfffffffffffffffffffffffffffffffffffffffffffffffffff22222222222222\n2\n3\n4\n", NULL); break; case 3: CreateSimpleQuery(top_level, "Simple Question", "Who are you?/nAre you at home?\nWhat is your name", NULL); default:{ break; } } } /* ============================================================ | CreateInformMessage() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static Widget CreateInformMessage(Widget parent, char *title, char *message, win_msg_header *client_data) { Widget inform, butt, sep, msg; Arg args[20]; int counter; XmString xm_string; /* Create the shell widget */ counter = 0; XtSetArg(args[counter], XmNnoResize,True);counter++; inform = XmCreateFormDialog(parent,title,args,counter); /* Create the information message widget */ xm_string = XmStringCreateLtoR(message, XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_BEGINNING);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; msg = XmCreateLabelGadget(inform,"message",args,counter); XmStringFree(xm_string); XtManageChild(msg); /* Create the seperator widget */ counter = 0; XtSetArg(args[counter], XmNheight,10);counter++; XtSetArg(args[counter], XmNseparatorType, XmSINGLE_LINE);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,msg);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNleftPosition, 0);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNrightPosition, 100);counter++; sep = XmCreateSeparatorGadget(inform,"separator",args,counter); XtManageChild(sep); /* Create the dissmes button */ xm_string = XmStringCreateLtoR("Dissmised", XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,sep);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNleftPosition, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset,10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNrightPosition, 90);counter++; butt = XmCreatePushButton(inform,"controlB",args,counter); free(xm_string); XtAddCallback(butt, XmNactivateCallback, (XtCallbackProc) inform_ok, (XtPointer) client_data); XtManageChild(butt); XtManageChild(inform); } /* ============================================================ | inform_ok() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void inform_ok(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { SendResults(WIN_INFORM_OK_REPLY, (win_msg_header *)client_data, 0, NULL); free((win_msg_header *)client_data); XtDestroyWidget(XtParent(w)); } /* ============================================================ | CreateCommandWindow() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static Widget CreateCommandWindow(Widget parent) { Widget command_w; Arg args[20]; int counter,i; XmString xm_string = XmStringCreateLtoR("Enter message:", XmSTRING_DEFAULT_CHARSET); XtCallbackRec null_rec = {(XtCallbackProc) NULL, (caddr_t) NULL}; XtCallbackRec apply_rec; XtCallbackRec apply_callback_list[2]; char **agent_file_list; XmString *agent_list; int agent_list_counter; /* Get the agents file name. */ agent_file_list = readTextFile(COMMAND_FILE, &agent_list_counter); /* Convert to X strings. */ agent_list = (XmString *)malloc(agent_list_counter * sizeof(XmString)); for(i=0;ivalue, XmSTRING_DEFAULT_CHARSET, &buffer); SendResults(WIN_PROCESS_TERM, NULL, strlen(buffer)+1, (void *)buffer); } /* ============================================================ | CreateLoadAgentWindow() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void CreateLoadAgentWindow() { Widget command_w, shell_w; Arg args[20]; int counter,i; XmString xm_string = XmStringCreateLtoR("Enter agent name:", XmSTRING_DEFAULT_CHARSET); XtCallbackRec null_rec = {(XtCallbackProc) NULL, (caddr_t) NULL}; XtCallbackRec apply_rec; XtCallbackRec apply_callback_list[2]; char **agent_file_list; XmString *agent_list; int agent_list_counter; /* Get the agents file name. */ agent_file_list = readTextFile(AGENTS_FILE, &agent_list_counter); /* Convert to X strings. */ agent_list = (XmString *)malloc(agent_list_counter * sizeof(XmString)); for(i=0;ivalue, XmSTRING_DEFAULT_CHARSET, &buffer); SendResults(WIN_LOAD_AGENT, NULL, strlen(buffer)+1, (void *)buffer); XtDestroyWidget(XtParent(w)); } /* ============================================================ | CreateSimpleQuery() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void CreateSimpleQuery(Widget parent, char *title, char *message, win_msg_header *client_data) { Widget question, butt_yes, butt_no, sep, msg; Arg args[20]; int counter; XmString xm_string; /* Create the shell widget */ counter = 0; XtSetArg(args[counter], XmNnoResize,True);counter++; question = XmCreateFormDialog(parent,title,args,counter); /* Create the questionation message widget */ xm_string = XmStringCreateLtoR(message, XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter],XmNlabelString, xm_string);counter++; XtSetArg(args[counter],XmNalignment, XmALIGNMENT_BEGINNING);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; msg = XmCreateLabelGadget(question,"message",args,counter); XmStringFree(xm_string); XtManageChild(msg); /* Create the seperator widget */ counter = 0; XtSetArg(args[counter], XmNheight,10);counter++; XtSetArg(args[counter], XmNseparatorType, XmSINGLE_LINE);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNtopWidget,msg);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNleftPosition, 0);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNrightPosition, 100);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; sep = XmCreateSeparatorGadget(question,"separator",args,counter); XtManageChild(sep); /* Create the yes button */ xm_string = XmStringCreateLtoR("Yes", XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,sep);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNleftPosition, 20);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset,10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; butt_yes = XmCreatePushButton(question,"controlB",args,counter); free(xm_string); XtAddCallback(butt_yes, XmNactivateCallback, (XtCallbackProc) SimpleQokCB, (XtPointer) client_data); XtManageChild(butt_yes); /* Create the no button */ xm_string = XmStringCreateLtoR("No", XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNlabelString, xm_string);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,sep);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNrightPosition, 80);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_NONE);counter++; butt_no = XmCreatePushButton(question,"controlB",args,counter); free(xm_string); XtAddCallback(butt_no, XmNactivateCallback, (XtCallbackProc) SimpleQnoCB, (XtPointer) client_data); XtManageChild(butt_no); XtManageChild(question); XtAddGrab(question, True, False); } /* ============================================================ | SimpleQnoCB() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void SimpleQnoCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { SendResults(WIN_QUESTION_CANCEL_REPLY, (win_msg_header *)client_data, 0, NULL); free((win_msg_header *)client_data); XtRemoveGrab(XtParent(w)); XtDestroyWidget(XtParent(w)); } /* ============================================================ | SimpleQokCB() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void SimpleQokCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { SendResults(WIN_QUESTION_OK_REPLY, (win_msg_header *)client_data, 0, NULL); free((win_msg_header *)client_data); XtRemoveGrab(XtParent(w)); XtDestroyWidget(XtParent(w)); } /* ============================================================ | CreateIntervalWindow() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void CreateIntervalWindow(Widget parent, char *msg, win_msg_header *client_data) { Widget board_w, rowcol_w, label_w,butt_done,butt_cancel; Widget *button_w = (Widget *)malloc(9*sizeof(Widget)); internal_struct *data = (internal_struct *)malloc(sizeof(internal_struct)); Arg args[20]; int counter, i; XmString xstring; static char *hour[] = { "8-9","9-10","10-11", "11-12","12-1","1-2" , "2-3","3-4","4-5" }; /* Create the shell window. */ counter = 0; XtSetArg(args[counter],XmNnoResize, True);counter++; xstring = XmStringCreateLtoR("Interval Selection", XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter],XmNdialogTitle, xstring);counter++; board_w = XmCreateFormDialog(parent,"interval",args,counter); free(xstring); /* Create the label widget. */ xstring = XmStringCreateLtoR(msg, XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNlabelString, xstring);counter++; XtSetArg(args[counter], XmNalignment, XmALIGNMENT_BEGINNING);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; label_w = XmCreateLabelGadget(board_w,"message",args,counter); XmStringFree(xstring); XtManageChild(label_w); /* Create the RowCol container window. */ counter = 0; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,label_w);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNrightOffset, 10);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_NONE);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNleftOffset, 10);counter++; XtSetArg(args[counter],XmNspacing, 5);counter++; XtSetArg(args[counter],XmNnumColumns, 3);counter++; XtSetArg(args[counter],XmNpacking, XmPACK_COLUMN);counter++; XtSetArg(args[counter],XmNadjustLast, False);counter++; XtSetArg(args[counter],XmNorientation, XmHORIZONTAL);counter++; rowcol_w = XmCreateRowColumn(board_w,"rowcol",args,counter); XtManageChild(rowcol_w); /* Create the buttons window */ counter = 0; XtSetArg(args[counter], XmNindicatorOn, True);counter++; for (i=0; i<9; i++){ xstring = XmStringCreateLtoR(hour[i], XmSTRING_DEFAULT_CHARSET); XtSetArg(args[counter], XmNlabelString, xstring);counter++; button_w[i]= XmCreateToggleButton(rowcol_w, "radio", args, counter); free(xstring); } XtManageChildren(button_w,9); data->header = client_data; data->slot1 = (void *)button_w; data->slot2 = NULL; /* Create the Done button */ xstring = XmStringCreateLtoR("Done", XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNlabelString, xstring);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,rowcol_w);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNleftPosition, 20);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset,10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_NONE);counter++; butt_done = XmCreatePushButton(board_w,"controlB",args,counter); free(xstring); XtAddCallback(butt_done, XmNactivateCallback, (XtCallbackProc)&IntervalOkCB , (XtPointer) data); XtManageChild(butt_done); /* Create the Cancel button */ xstring = XmStringCreateLtoR("Cancel", XmSTRING_DEFAULT_CHARSET); counter = 0; XtSetArg(args[counter], XmNlabelString, xstring);counter++; XtSetArg(args[counter], XmNtopAttachment,XmATTACH_WIDGET);counter++; XtSetArg(args[counter], XmNtopWidget,rowcol_w);counter++; XtSetArg(args[counter], XmNtopOffset,10);counter++; XtSetArg(args[counter], XmNrightAttachment,XmATTACH_POSITION);counter++; XtSetArg(args[counter], XmNrightPosition, 80);counter++; XtSetArg(args[counter], XmNbottomAttachment,XmATTACH_FORM);counter++; XtSetArg(args[counter], XmNbottomOffset,10);counter++; XtSetArg(args[counter], XmNleftAttachment,XmATTACH_NONE);counter++; butt_cancel = XmCreatePushButton(board_w,"controlB",args,counter); free(xstring); XtAddCallback(butt_cancel, XmNactivateCallback, (XtCallbackProc)&IntervalCancelCB , (XtPointer) data); XtManageChild(butt_cancel); XtManageChild(board_w); } /* ============================================================ | IntervalOkCB() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void IntervalOkCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { internal_struct *data = (internal_struct *)client_data; int free_slots[9], i; Widget *button_w = (Widget *)data->slot1; /* Find out which buttons are set. */ for (i=0; i< 9; i++) free_slots[i] =0; for (i=0; i< 9; i++) free_slots[i] = !XmToggleButtonGetState(button_w[i]); SendResults(WIN_INTERVAL_OK_REPLY, data->header, sizeof(free_slots), (void *)free_slots); free(data->header); free(button_w); free(data); XtDestroyWidget(XtParent(w)); } /* ============================================================ | IntervalCancelCB() | |----------------------------------------------------------| | Params : 1) | | 2) | | 3) | | Desc : | | | | Returns: | |==========================================================| */ static void IntervalCancelCB(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *call_data) { internal_struct *data = (internal_struct *)client_data; SendResults(WIN_INTERVAL_CANCEL_REPLY, data->header, 0, NULL); free(data->header); free((Widget *)data->slot1); free(data); XtDestroyWidget(XtParent(w)); }