B2{MM010.BPMM010.BBACKUP MENU_MANAGER_CONST.DAT,MENU_MANAGER.C,MM_MESSAGE_MBX.C,MM_HELP.C,MENU_MANAGER.UIL,MAKEFILE.,MENU_MANAGER_CONST.H,MENU_MANAGER_CONST.UIL,MM_HELP.HLP MM010.B/SAVE/INTER/GROUP=0/BLO=2048 HELLER hcШǒV5.1 _VULCAN::  _DENEVA$DUA0: V5.0 A*[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER_CONST.DAT;13+,/./h 4:*-0123KPWO56@Elǒ7Alǒ89ǒGhHJ/* -*-c-mode-*- */8/*------------------------------------------------------9 * MENU_MANAGER_CONST.DAT - menu-manager constants (tags)) * Robert Heller Thu Oct 12 13:02:39 1989: *------------------------------------------------------*//*** Main callback tags */MM_MAIN_WINDOWMM_OUTPUT_WINDOW MM_MENU_BAR!/*** File menu callback tags ***/MM_EXIT_BUTTONMM_CLEAR_TEXT_BUTTONMM_RELOAD_USER_MENU_BUTTONMM_SAVE_TEXT_BUTTON/*** Options menu ***/MM_SET_MENU_FILENAME/*** user menu ***/ MM_USER_MENU/*** help menu ***/ MM_HELP_MENU MM_HELP_ABOUTMM_HELP_OVERVIEW/*** generic box tags ***/MM_GENERIC_CAUTION_YESMM_GENERIC_CAUTION_NOMM_GENERIC_CAUTION_CANCELMM_GENERIC_WIP_CANCEL&/*** menu file selection box tags ***/MM_MENU_FILE_SELECTION&/*** text file selection box tags ***/MM_TEXT_FILE_SELECTION)/*** help popup dialog box constants ***/MM_HELP_DIALOGMM_HELP_OUTPUTMM_HELP_UP_LEVEL MM_HELP_OK MM_HELP_INPUT$/*** max wid`U&MM010.B/A[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER_CONST.DAT;13:$;get - must be last! ***/ MM_MAX_WIDGET9*[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74+,_.*/h 4Y*(-0123KPWO+56jǒ7@^Mkǒ89ǒGhHJ/* -*-c-mode-*- */8/*------------------------------------------------------- * MENU_MANAGER.C - Menu Manager main program) * Robert Heller Thu Oct 12 14:40:47 1989: *------------------------------------------------------*/K#include /* For printf and so on. */#include #ifdef VMS@#include /* DECwindows Toolkit */#else@#include /* DECwindows Toolkit */#endif#include "menubMM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74Y*_manager_const.h"'#define MAX_WIDGETS (MM_MAX_WIDGET + 1)/* * Global data */Cstatic Widget toplevel_widget, /* Root widget ID of our */: /* application. */D main_window_widget, /* Root widget ID of main */7 /* DRM fetch */4 generic_message_widget, /* generic message box */4 generic_caution_widget, /* generic caution box */- generic_wip_widget, /* generic WIP box */9 user_pulldown_widget; /* user pulldown menu widget */Knoshare widget_array[MAX_WIDGETS]; /* Place to keep all other */8 /* widget IDs */;static DwtCompString latin_create; /* Variables for */?static DwtCompString latin_dismiss; /* compound strings. */!static DwtCompString latin_space; static DwtCompString latin_zero;Gstatic DRMHierarchy s_DRMHierarchy; /* DRM database hierarchy ID */Astatic DRMType *dummy_class; /* and class variable. */Estatic char *db_filename_vec[] = /* DRM heirachy file list. */S {"mm$data:menu_manager.uid" /* There is only one UID file for */? }; /* this application. */static int db_filename_num =F (sizeof db_filename_vec / sizeof db_filename_vec [0]);1#define MM_CUSTOMIZE_FILE "SYS$LOGIN:DECW$MM.DAT"0#define DEFAULTMENUFILE "SYS$LOGIN:DECW$MM.MENU"&#define DEFAULTHEADER "Menu Manager"#define COMMENT MM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74Y*F'!'#define USER_BUTTON_HEIGHT 20static char menufilename[256];static char headerstring[256];typedef struct { char *button_text; char *command_text; struct dsc$descriptor com; Widget button_widget; } USERBUTTON;#define MAX_USER_BUTTONS 1001static USERBUTTON user_buttons[MAX_USER_BUTTONS]; static int num_user_buttons = 0;/* * Forward declarations */void s_error();static void get_something();static void set_something();static void activate_proc();static void create_proc();static void cancel_proc();$static void user_menu_button_proc();H/* The names and addresses of things that DRM has to bind. The names do, * not have to be in alphabetical order. */#static DRMRegisterArg reglist[] = {, {"ACTIVATE_PROC", (caddr_t) activate_proc},( {"CREATE_PROC", (caddr_t) create_proc},( {"CANCEL_PROC", (caddr_t) cancel_proc},; {"USER_MENU_BUTTON_PROC", (caddr_t) user_menu_button_proc}};?static int reglist_num = (sizeof reglist / sizeof reglist [0]);-static struct des$descriptor_s *mailbox_name;5struct des$descriptor_s *create_mm_message_mailbox();/*G * OS transfer point. The main routine does all the one-time setup and * then calls XtMainLoop. */unsigned int main(argc, argv)J unsigned int argc; /* Command line argument count. */L char *argv[]; /* Pointers to command line args. */{ register int status; read_customization_file();M DwtInitializeDRM(); wvMM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74T.DAT;13Y* /* Initialize DRM before initializing< /* the X Toolkit. */O /* If we had user-defined widgets, we would register them with DRM here. */I /* Initialize the X Toolkit. We get back a top level shell widget. */1 toplevel_widget = XtInitialize(headerstring, F /* Main window banner text. */C "MenuManager", /* Root class name. */= NULL, /* No option list. */@ 0, /* Number of options. */= &argc, /* Address of argc */2 argv); /* argv */M /* Open the UID files (the output of the UIL compiler) in the hierarchy*/@ if (DwtOpenHierarchy(db_filename_num, /* Number of files. */E db_filename_vec, /* Array of file names. */F NULL, /* Default OS extenstion. */J &s_DRMHierarchy) /* Pointer to returned DRM ID */ !=DRMSuccess)( s_error("can't open hierarchy"); init_application();6 /* Register the items DRM needs to bind for us. */7 status = DwtRegisterDRMNames(reglist, reglist_num);2 /* Go get the main part of the application. */L if (DwtFetchWidget(s_DRMHierarchy, "MENU_MANAGER_MAIN", toplevel_widget,7 &main_window_widget, &dummy_class) != DRMSuccess)+ s_error("can't fetch main window");K /*.MM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74Y* Manage the main part and realize everything. The interface comes up * on the display now. */& XtManageChild(main_window_widget);% XtRealizeWidget(toplevel_widget);F /* Sit around forever waiting to process X-events. We never leaveJ * XtMainLoop. From here on, we only execute our callback routines. */ XtMainLoop();}/*: * One-time initialization of application data structures. */static int init_application(){ register int k;5 /* Initialize the application data structures. */% for (k = 0; k < MAX_WIDGETS; k++) widget_array[k] = NULL;, for (k = 0; k < MAX_USER_BUTTONS; k++) {$ user_buttons[k].button_text = NULL;% user_buttons[k].command_text = NULL;& user_buttons[k].button_widget = NULL; }" generic_message_widget = NULL;" generic_caution_widget = NULL; generic_wip_widget = NULL; user_pulldown_widget = NULL;3 /* Set up the compound strings that we need. */= latin_create = DwtLatin1String("Create operator box...");? latin_dismiss = DwtLatin1String("Dismiss operator box...");' latin_space = DwtLatin1String(" ");( latin_zero = DwtLatin1String(" 0 ");/ mailbox_name = create_mm_message_mailbox();}read_customization_file(){ register char *p; char *fgets(); FILE *custfile; static char temp[1024];' strcpy(headerstring,DEFAULTHEADER);) strcpy(menufilename,DEFAULTMENUFILE);, custfile = fopen(MM_CUSTOMIZE_FILE,"r"); if (cuӷMM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74Y*Qstfile != NULL) {2 while ((p = fgets(temp,1024,custfile)) != NULL) {6 if (strncmp(p,"MenuManager.MenuFile=",21) == 0) {! strncpy(menufilename,p+21,256); p = strchr(menufilename,'\n'); if (p != NULL) *p = '\0'; }? else if (strncmp(p,"MenuManager.HeaderString=",25) == 0) {! strncpy(headerstring,p+25,256); p = strchr(headerstring,'\n'); if (p != NULL) *p = '\0'; } } fclose(custfile); } } L/*************************************************************************** *A * These are some little utilities used by the callback routines. *//* * All errors are fatal. */void s_error(problem_string) char *problem_string;{# printf("%s\n", problem_string); exit(0);}/*M * Simplified SET VALUE routine to use only when changing a single attribute.D * If we need to change more than one, all new values should be put K * into one arglist and we should make one XtSetValues call (which is MUCH  * more efficient). */-static void set_something(w, resource, value) Widget w; char *resource, *value;{ Arg al[1];% XtSetArg(al[0], resource, value); XtSetValues(w, al, 1);}/*O * Simplified GET VALUE routine to use only when retrieving a single attribute.B * If we need to retrieve more than one, all values should be put K * into one arglist and we should make one XtGetValues call (which is MUCH  * more efficient). */-static void get_something(w, resource, value)⥧MM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74T.DAT;13Y*~ Widget w;* char *resource, *value;-{- Arg al[1];% XtSetArg(al[0], resource, value);n XtGetValues(w, al, 1);}e*static void activate_proc (w, tag, reason) Widget w;- int *tag;-unsigned long *reason;{c int widget_num;  static char buffer[1024];i widget_num = *tag;#ifdef DEBUGGINGL main_text_printf("*** In activate_proc: widget_num = %d\n", widget_num);#endif switch (widget_num) {  case MM_EXIT_BUTTON : exit(0); E case MM_RELOAD_USER_MENU_BUTTON: read_and_attach_user_menu(); break; 5 case MM_CLEAR_TEXT_BUTTON: main_text_clear(); break;t= case MM_SAVE_TEXT_BUTTON: start_save_text_filename(); break;7 case MM_USER_MENU: if (user_pulldown_widget == NULL) { read_and_attach_user_menu(); } break;9 case MM_SET_MENU_FILENAME: start_menu_filename(); break;*, case MM_HELP_ABOUT: mm_help_about(); break;2 case MM_HELP_OVERVIEW: mm_help_overview(); break;& case MM_HELP_OK: mm_help_ok(); break;2 case MM_HELP_UP_LEVEL: mm_help_up_level(); break;? case MM_MENU_FILE_SELECTION: set_menu_filename(reason); break;X> case MM_TEXT_FILE_SELECTION: save_text_window(reason); break;N case MM_HELP_MENU: get_widget_if_needed(MM_HELP_DIALOG,"HELP_DIALOG"); break; default : break;l } }(static void create_proc (w, tag, reason) Widget w;i int *tag;tunsigned long *reason;{a int widget_num;t widget_num = *tag;! widget_array[widget_num] = w;D#ifdef DEBUGGINGJ main_text_printf("*** In create_proc: widget_num .EMM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74Y*NH = %d\n", widget_num);#endif }d(static void cancel_proc (w, tag, reason) Widget w; int *tag;tunsigned long *reason;{  register int widget_num; static char buffer[1024];  widget_num = *tag;#ifdef DEBUGGINGJ main_text_printf("*** In cancel_proc: widget_num = %d\n", widget_num);#endif switch (widget_num) {< case MM_TEXT_FILE_SELECTION: cancel_text_filename(); break;< case MM_MENU_FILE_SELECTION: cancel_menu_filename(); break;. case MM_HELP_DIALOG: mm_help_cancel(); break; } }O5static get_widget_if_needed(widget_index,widget_name)aregister int widget_index;register char *widget_name;e{- if (widget_array[widget_index] == NULL) {c? if (DwtFetchWidget(s_DRMHierarchy,widget_name,toplevel_widget,BA &widget_array[widget_index], &dummy_class) != DRMSuccess) {t< fprintf(stderr,"Can't fetch %s widget!\n",widget_name); exit(0);e } } }istatic start_menu_filename(){_K get_widget_if_needed(MM_MENU_FILE_SELECTION,"MENU_FILE_SELECTION_BOX");t; if (!XtIsManaged(widget_array[MM_MENU_FILE_SELECTION]))5 XtManageChild(widget_array[MM_MENU_FILE_SELECTION]);b }hstatic cancel_menu_filename()a{aK get_widget_if_needed(MM_MENU_FILE_SELECTION,"MENU_FILE_SELECTION_BOX");,: if (XtIsManaged(widget_array[MM_MENU_FILE_SELECTION]))7 XtUnmanageChild(widget_array[MM_MENU_FILE_SELECTION]);E }B'static set_menu_filename(fileselection)c.DwtFileSelectionCallbackStruct *fileselection;{/- register FILE *o IMM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74Y*ldcustfile, *newcustfile;c static char temp[1024];u register char *p;eO copyfromCStosimple(menufilename,fileselection->value,sizeof(menufilename));tK get_widget_if_needed(MM_MENU_FILE_SELECTION,"MENU_FILE_SELECTION_BOX");(: if (XtIsManaged(widget_array[MM_MENU_FILE_SELECTION]))7 XtUnmanageChild(widget_array[MM_MENU_FILE_SELECTION]); / oldcustfile = fopen(MM_CUSTOMIZE_FILE,"r");/ newcustfile = fopen(MM_CUSTOMIZE_FILE,"w");a if (oldcustfile != NULL) {5 while ((p = fgets(temp,1024,newcustfile)) != NULL) {l6 if (strncmp(p,"MenuManager.MenuFile=",21) != 0) { fputs(p,newcustfile);  }d } fclose(oldcustfile);  }B fprintf(newcustfile,"MenuManager.MenuFile=%s\n",menufilename); fclose(newcustfile); }.!static start_save_text_filename()a{eK get_widget_if_needed(MM_TEXT_FILE_SELECTION,"TEXT_FILE_SELECTION_BOX");e; if (!XtIsManaged(widget_array[MM_TEXT_FILE_SELECTION]))o5 XtManageChild(widget_array[MM_TEXT_FILE_SELECTION]);  }Nstatic cancel_text_filename() { K get_widget_if_needed(MM_TEXT_FILE_SELECTION,"TEXT_FILE_SELECTION_BOX"); : if (XtIsManaged(widget_array[MM_TEXT_FILE_SELECTION]))7 XtUnmanageChild(widget_array[MM_TEXT_FILE_SELECTION]);t }u&static save_text_window(fileselection).DwtFileSelectionCallbackStruct *fileselection;{m register FILE *windowfile; static char filename[1024];r$ register char *p, *windowbuffer;G copyfromCStosimple(filename,fileselection->value,sizeof(filename));r paMM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74T.DAT;13Y*:K get_widget_if_needed(MM_TEXT_FILE_SELECTION,"TEXT_FILE_SELECTION_BOX");: if (XtIsManaged(widget_array[MM_TEXT_FILE_SELECTION]))7 XtUnmanageChild(widget_array[MM_TEXT_FILE_SELECTION]); % windowfile = fopen(filename,"w");R if (windowfile == NULL) {7 main_text_printf("Could not open file %s\n",filename);  return; }E windowbuffer = DwtSTextGetString(widget_array[MM_OUTPUT_WINDOW]);_# fputs(windowbuffer,windowfile);c fclose(windowfile);c XtFree(windowbuffer); }*2static void user_menu_button_proc (w, tag, reason) Widget w;sint tag;unsigned long *reason;{ register int status;% static $DESCRIPTOR(NLA0,"NLA0:");l#ifdef DEBUGGINGF main_text_printf("*** In user_menu_button_proc: tag = %d\n", tag);#endifE status = lib$spawn(&user_buttons[tag].com,&NLA0,mailbox_name,&1);t1 if ((status & 01) != 01) spawn_error(status);a } spawn_error(status)u{." static char error_message[80];# static unsigned short int mlen; - static $DESCRIPTOR(MSGBUF,error_message);* int delete_err_window(); float xdummy; " static $DESCRIPTOR(SPACE," ");2 MSGBUF.dsc$w_length = sizeof(error_message)-1;) sys$getmsg(status,&mlen,&MSGBUF,1,0);a MSGBUF.dsc$w_length = mlen;] error_message[mlen] = '\0';eA main_text_printf("Error from LIB$SPAWN: %s\n",error_message);  }i6wprintf(widget,format,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)Widget widget;=char *format,*a,*b,*c,*d,*e,*f,*g,*h,*i,*j,*k,*l,*m,*n,*o,*p;i{t &MM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74Y*7 static char buffer[1024]; register char *oldstring;S register int oldlen, buflen;; sprintf(buffer,format,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);t* oldstring = DwtSTextGetString(widget); oldlen = strlen(oldstring); buflen = strlen(buffer);5 oldstring = XtRealloc(oldstring,oldlen+buflen+1);E$ strcpy(oldstring+oldlen,buffer);( DwtSTextSetString(widget,oldstring); XtFree(oldstring); },8main_text_printf(format,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)=char *format,*a,*b,*c,*d,*e,*f,*g,*h,*i,*j,*k,*l,*m,*n,*o,*p;4{s0 if (widget_array[MM_OUTPUT_WINDOW] == NULL) 0 printf(format,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p);X else wprintf(widget_array[MM_OUTPUT_WINDOW],format,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); }tstatic main_text_clear(){n9 DwtSTextSetString(widget_array[MM_OUTPUT_WINDOW],"");  }hread_and_attach_user_menu()N{) register FILE *menufile;; static char menuline[1024], button[256], command[1024];* register char *p;* char *fgets(); char *calloc();e register int k;iY static DwtCallback button_callback[2] = {{(caddr_t) user_menu_button_proc,-1},{0,0}};d#ifdef DEBUGGING static int adjust_margin;g7 static int menu_width, button_width, button_height;;#endif- if (widget_array[MM_USER_MENU] == NULL) {h#ifdef DEBUGGINGU main_text_printf("*** read_and_attach_user_menu() called before widget created!\n");*#endif return; }, for (k = 0; k < num_user_buttons; k++) {L if (user_buttons[k].but [9MM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74Y*< ton_text != NULL) free(user_buttons[k].button_text);$ user_buttons[k].button_text = NULL;N if (user_buttons[k].command_text != NULL) free(user_buttons[k].command_text);% user_buttons[k].command_text = NULL;*- if (user_buttons[k].button_widget != NULL) {r5 if (XtIsManaged(user_buttons[k].button_widget)) v5 XtUnmanageChild(user_buttons[k].button_widget); 4 XtDestroyWidget(user_buttons[k].button_widget);* user_buttons[k].button_widget = NULL; } }' if (user_pulldown_widget != NULL) {g' XtDestroyWidget(user_pulldown_widget); user_pulldown_widget = NULL;a }> set_something(widget_array[MM_USER_MENU],DwtNsubMenuId,0);' menufile = fopen(menufilename,"r");t if (menufile == NULL) {n7 main_text_printf("Could not open %s!\n",menufilename);f return; } k = 0; num_user_buttons = 0;G# while (num_user_buttons == 0) {t8 while (((p = fgets(menuline,1024,menufile)) != NULL) &&$ (menuline[0] == COMMENT)) ; if (p != NULL) {s, filter_ctrl_chars(button,menuline,256);< while (((p = fgets(menuline,1024,menufile)) != NULL) &&! (menuline[0] == COMMENT)) ;B if (p == NULL) {f num_user_buttons = k;  break; }f. filter_ctrl_chars(command,menuline,1024); if (k < MAX_USER_BUTTONS) {F user_buttons[k].button_text = calloc(strlen(button)+1,sizeof(char));, if (user_buttons[k].button_text == NULL) { perror("menu_manager");v exit(12); }H- strcpy(user_buttons[k].button_text,button);LH user_buttonsUMM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74T.DAT;13Y*#[k].command_text = calloc(strlen(command)+1,sizeof(char));- if (user_buttons[k].command_text == NULL) {L perror("menu_manager");) exit(12);M }U/ strcpy(user_buttons[k].command_text,command);GC user_buttons[k].com.dsc$a_pointer = user_buttons[k].command_text; 2 user_buttons[k].com.dsc$b_class = DSC$K_CLASS_S;2 user_buttons[k].com.dsc$b_dtype = DSC$K_DTYPE_T;J user_buttons[k].com.dsc$w_length = strlen(user_buttons[k].command_text); }x else { = main_text_printf("Too many menu items, excess ignored!\n");d num_user_buttons = k;o break; }o k++;w } else num_user_buttons = k;; } fclose(menufile);_K if (DwtFetchWidget(s_DRMHierarchy,"USERMENU",widget_array[MM_MENU_BAR],G6 &user_pulldown_widget, &dummy_class) != DRMSuccess)3 s_error("can't fetch user pulldowen menu widget"); #ifdef DEBUGGING> get_something(user_pulldown_widget,DwtNwidth,&menu_width);4 main_text_printf("*** width = %d\n",menu_width);G get_something(user_pulldown_widget,DwtNmenuPacking,&adjust_margin);n> main_text_printf("*** Menu Packing = %d\n",adjust_margin);#endif, for (k = 0; k < num_user_buttons; k++) { button_callback[0].tag = k;D user_buttons[k].button_widget = DwtPushButton(user_pulldown_widget,$ user_buttons[k].button_text,0,0,1 DwtLatin1String(user_buttons[k].button_text),h NULL,NULL);d#ifdef DEBUGGING; get_something(user_pulldown_widget,DwtNwidth,&menu_width);1 main_text_printf("*** width = %d\n",menu_width);,?xMM010.B_9[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.C;74Y*& get_something(user_pulldown_widget,DwtNheight,&adjust_margin);M5 main_text_printf("*** height = %d\n",adjust_margin);M#endif2 XtManageChild(user_buttons[k].button_widget);B set_something(user_buttons[k].button_widget,DwtNactivateCallback, button_callback); }Q set_something(widget_array[MM_USER_MENU],DwtNsubMenuId,user_pulldown_widget);[  }S"filter_ctrl_chars(dest,source,len)register char *dest,*source;register int len;a{t( while (*source != '\0' && len > 1) {9 if (*source >= ' ' && *source <= '~') *dest++ = *source;u else *dest++ = ' '; source++; len--;o } *dest = '\0';e }o*static copyfromCStosimple(output,CS,osize)register char *output;register DwtCompString CS;register int osize;({s) static DwtCompStringContext scontext;]! static long int charset,lang;M static Boolean dir_r_to_l; static DwtRendMask rend; register char *segment;  register int slen;7 if (DwtInitGetSegment(&scontext,CS) != DwtSuccess) s( s_error("error in copyfromCStosimple"); while (osize > 1 && U DwtGetNextSegment(&scontext,&segment,&charset,&dir_r_to_l,&lang,&rend) ==  DwtSuccess) {e slen = strlen(segment); if (slen < osize) {" strncpy(output,segment,slen); output[slen] = '\0';t output += slen; osize -= slen;M } else {T% strncpy(output,segment,osize-1);f output[osize-1] = '\0'; osize = 0;I } XtFree(segment);e } }TT_FILE_SELECTION]);  }NRXMM010.B :[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_MESSAGE_MBX.C;6P+:*[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_MESSAGE_MBX.C;6+, ./h 4Pz-0123KPWO56 Œ7kŒ89ǒGhHJ/* -*-c-mode-*- */8/*------------------------------------------------------- * MM_MESSAGE_MBX.C - message mailbox hackery) * Robert Heller Mon Oct 16 08:38:04 1989: *------------------------------------------------------*/#include #include #include #include #include *static unsigned short int mailbox_channel;static char mailboxname[256];)static $DESCRIPTOR(mbx_name,mailboxname);4struct dsc$descriptor_s *create_mm_message_mailbox(){ static char username[14];& static unsigned short int userlen;& int mm_message_mailbox_attn_ast(); static struct {# unsigned short int iostat,iobytes; unsigned long int iodevdep; } attn_iosb; static struct { unsigned short int blen, icode; char *outbuff; unsigned short int *olen; } jpi_itmlst[] = {9 { sizeof(username), JPI$_USERNAME, username, &userlen }, { 0, 0, NULL, NULL } }; register int status; register char *p;1 status = sys$gS%HMM010.B :[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_MESSAGE_MBX.C;6.DAT;13Petjpiw(0,0,0,jpi_itmlst,0,0,0);0 if ((status & 01) != 01) lib$signal(status); p = username + userlen; while (*--p == ' ') ; *++p = '\0';: sprintf(mailboxname,"%s_MM_MESSAGE_MAILBOX",username);0 mbx_name.dsc$w_length = strlen(mailboxname);C status = sys$crembx(1,&mailbox_channel,256,1024,0,0,&mbx_name);0 if ((status & 01) != 01) lib$signal(status);P status = sys$qiow(0,mailbox_channel,IO$_SETMODE|IO$M_WRTATTN,&attn_iosb,0,0,/ mm_message_mailbox_attn_ast,0,0,0,0,0);0 if ((status & 01) != 01) lib$signal(status);D if ((attn_iosb.iostat & 01) != 01) lib$signal(attn_iosb.iostat);) status = sys$delmbx(mailbox_channel);0 if ((status & 01) != 01) lib$signal(status); return(&mbx_name); }(static int mm_message_mailbox_attn_ast(){ static struct {# unsigned short int iostat,iobytes; unsigned long int iodevdep; } attn_iosb, read_iosb; register int status;$ static char mailbox_buffer[258];M status = sys$qiow(0,mailbox_channel,IO$_READVBLK|IO$M_NOW,&read_iosb,0,0,$ mailbox_buffer,256,0,0,0,0);0 if ((status & 01) != 01) lib$signal(status);, if (read_iosb.iostat != SS$_ENDOFFILE) {A if ((read_iosb.iostat & 01) != 01) lib$signal(read_iosb.iostat);* mailbox_buffer[read_iosb.iobytes] = '\0';) main_text_printf("%s\n",mailbox_buffer); }P status = sys$qiow(0,mailbox_channel,IO$_SETMODE|IO$M_WRTATTN,&attn_iosb,0,0,/ mm_message_mailbox_attn_ast,0,0,0,0,0);0 if ((status & 01) != 01) lMM010.B :[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_MESSAGE_MBX.C;6Pib$signal(status);D if ((attn_iosb.iostat & 01) != 01) lib$signal(attn_iosb.iostat); return(SS$_NORMAL); }4*[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_HELP.C;17+,^ . /h 4Z -0123KPWO 56@4upǒ7pǒ89GhHJ/* -*-c-mode-*- */8/*------------------------------------------------------/ * MM_HELP.C - Routines to provide on-line help) * Robert Heller Mon Oct 16 13:35:50 1989: *------------------------------------------------------*/#include #include #include #include #include #include #include -#define MM_HELP_LIBRARY "MM$HELP:MM_HELP.HLB"5readonly static $DESCRIPTOR(HELPLIB,MM_HELP_LIBRARY); #ifdef VMS@#inclu} MM010.B^ 4[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_HELP.C;17BX.C;6Z .de /* DECwindows Toolkit */#else@#include /* DECwindows Toolkit */#endif#include "menu_manager_const.h"'#define MAX_WIDGETS (MM_MAX_WIDGET + 1)Knoshare widget_array[MAX_WIDGETS]; /* Place to keep all other */2#define HELP_DIALOG (widget_array[MM_HELP_DIALOG])0#define HELP_INPUT (widget_array[MM_HELP_INPUT])2#define HELP_OUTPUT (widget_array[MM_HELP_OUTPUT])#define MAXKEYS 10Ostatic struct dsc$descriptor_s *keys[MAXKEYS] = {NULL, NULL, NULL, NULL, NULL, % NULL, NULL, NULL, NULL, NULL}; static long int libr_index = -1;#define ABOUT "ABOUT"#define OVERVIEW "OVERIVEW"static int help_level;3static struct dsc$descriptor_s *make_dsc_pointer();static int add_help_line();char *malloc(), *calloc();mm_help_about(){> if (!XtIsManaged(HELP_DIALOG)) XtManageChild(HELP_DIALOG);& DwtSTextSetString(HELP_OUTPUT,"");% DwtSTextSetString(HELP_INPUT,"");) if (libr_index == -1) open_library();& keys[0] = make_dsc_pointer(ABOUT); help_level = 1;Y lbr$get_help(&libr_index,&80,add_help_line,0,keys[0],keys[1],keys[2],keys[3],keys[4],0 keys[5],keys[6],keys[7],keys[8],keys[9]);! wprintf(HELP_INPUT,"ABOUT "); }mm_help_overview(){> if (!XtIsManaged(HELP_DIALOG)) XtManageChild(HELP_DIALOG);& DwtSTextSetString(HELP_OUTPUT,"");% DwtSTextSetString(HELP_INPUT,"");) if (libr_index == -1) open_library();) keys[0] = make_dsc_pointLb MM010.B^ 4[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_HELP.C;17BX.C;6.DAT;13Z er(OVERVIEW); help_level = 1;Y lbr$get_help(&libr_index,&80,add_help_line,0,keys[0],keys[1],keys[2],keys[3],keys[4],0 keys[5],keys[6],keys[7],keys[8],keys[9]);$ wprintf(HELP_INPUT,"OVERVIEW "); } mm_help_ok(){ register int i, j;! register char *p, *q, *ibuff; static char keybuff[128];* ibuff = DwtSTextGetString(HELP_INPUT); p = ibuff;* while (*p != '\0' && isspace(*p)) p++;1 for (i = 0; i < MAXKEYS && *p != '\0'; i++) {A for (q = keybuff; *p != '\0' && !isspace(*p); p++, q++) *q = *p;' while (*p != '\0' && isspace(*p)) p++; *q = '\0';0 if (keys[i] != NULL) free_dsc_pointer(keys[i]);% keys[i] = make_dsc_pointer(keybuff); } XtFree(ibuff);& DwtSTextSetString(HELP_OUTPUT,""); help_level = i;# for (j = i; j < MAXKEYS; j++) { if (keys[j] != NULL) { free_dsc_pointer(keys[j]); keys[j] = NULL; } }Y lbr$get_help(&libr_index,&80,add_help_line,0,keys[0],keys[1],keys[2],keys[3],keys[4],0 keys[5],keys[6],keys[7],keys[8],keys[9]); }mm_help_up_level(){ register int i; if (help_level > 0) {# DwtSTextSetString(HELP_OUTPUT,"");" DwtSTextSetString(HELP_INPUT,""); help_level--;$ free_dsc_pointer(keys[help_level]); keys[help_level] = NULL;N lbr$get_help(&libr_index,&80,add_help_line,0,keys[0],keys[1],keys[2],keys[3],+ keys[4],keys[5],keys[6],keys[7], keys[8],keys[9]);# for (i = 0; i < help_level; i++) {6 wprintf(HELP_INPUT,"%s ",$lMM010.B^ 4[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_HELP.C;17BX.C;6Z e0keys[i]->dsc$a_pointer); } } }mm_help_cancel(){ register int j;? if (XtIsManaged(HELP_DIALOG)) XtUnmanageChild(HELP_DIALOG);# for (j = 0; j < MAXKEYS; j++) { if (keys[j] != NULL) { free_dsc_pointer(keys[j]); keys[j] = NULL; } } lbr$close(&libr_index); libr_index = -1; }/static int add_help_line(line,flags,data,level)'register struct dsc$descriptor_s *line;,register unsigned long *flags, *data, level;{ static char temp[82];9 strncpy(temp,line->dsc$a_pointer,line->dsc$w_length);$ temp[line->dsc$w_length] = '\n';& temp[line->dsc$w_length+1] = '\0'; wprintf(HELP_OUTPUT,temp); return(SS$_NORMAL); }$static free_dsc_pointer(dsc_pointer)%struct dsc$descriptor_s *dsc_pointer;{% free(dsc_pointer->dsc$a_pointer); free(dsc_pointer); }8static struct dsc$descriptor_s *make_dsc_pointer(string)register char *string;{6 register struct dsc$descriptor_s *new_dsc_pointer;Z new_dsc_pointer = (struct dsc$descriptor_s *) malloc(sizeof(struct dsc$descriptor_s));" if (new_dsc_pointer == NULL) {1 s_error("memory allocation problem in mm_help"); }3 new_dsc_pointer->dsc$w_length = strlen(string);1 new_dsc_pointer->dsc$b_class = DSC$K_CLASS_S;1 new_dsc_pointer->dsc$b_dtype = DSC$K_DTYPE_T;Z new_dsc_pointer->dsc$a_pointer = calloc(new_dsc_pointer->dsc$w_length+1,sizeof(char));1 if (new_dsc_pointer->dsc$a_pointer == NULL) { free(new_dsc_poin%MM010.B^ 4[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_HELP.C;17BX.C;6Z  ter);1 s_error("memory allocation problem in mm_help"); }2 strcpy(new_dsc_pointer->dsc$a_pointer,string); return(new_dsc_pointer); }static open_library(){ register int status;J status = lbr$ini_control(&libr_index,&LBR$C_READ,&LBR$C_TYP_HLP,NULL);0 if ((status & 01) != 01) lib$signal(status);6 status = lbr$open(&libr_index,&HELPLIB,0,0,0,0,0);0 if ((status & 01) != 01) lib$signal(status); };*[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.UIL;42+,d./h 4Q"-0123KPWO56 S}.ǒ7`/ǒ89ǒGhHJ/* -*-c-mode-*- */8/*------------------------------------------------------1 * MENU_MANAGER.UIL - menu-manager User Interface) * Robert Heller Thu Oct 12 13:03:02 1989: *------------------------------------------------------*/module menu_manager version = 'v1.0' names = case_insensitiveinclude file 'DwtAppl.uil'; procedure activate_proc (integer); create_proc (integer); cancel_proc (integer);! user_menu_button_proc (integer); valueH adb_top_attachmenti3+MM010.Bd;[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.UIL;42DAT;13Q : argument('adbTopAttachment', integer);K adb_bottom_attachment : argument('adbBottomAttachment', integer);I adb_left_attachment : argument('adbLeftAttachment', integer);J adb_right_attachment : argument('adbRightAttachment', integer);@ adb_top_widget : argument('adbTopWidget', any);C adb_bottom_widget : argument('adbBottomWidget', any);A adb_left_widget : argument('adbLeftWidget', any);B adb_right_widget : argument('adbRightWidget', any);D adb_top_offset : argument('adbTopOffset', integer);G adb_bottom_offset : argument('adbBottomOffset', integer);E adb_left_offset : argument('adbLeftOffset', integer);F adb_right_offset : argument('adbRightOffset', integer);"! Colors, color tables, and icons.valueA yellow : color('yellow', foreground);> red : color('red', background);@ green : color('green', foreground);B magenta : color('magenta', background);? gold : color('gold', foreground);D lightblue : color('lightblue', background);! Fonts.valueP large_font : font('-Adobe-Courier-Bold-R-Normal--14-140-75-75-M-90-ISO8859-1');Q medium_font : font('-Adobe-Courier-Bold-R-Normal--12-120-75-75-M-70-ISO8859-1');Q small_font : font('-Adobe-Courier-Bold-R-Normal--10-100-75vNMM010.Bd;[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.UIL;42QUy-75-M-60-ISO8859-1');&include file 'menu_manager_const.uil';/* non-generated constants. */"VALUE MM_GENERIC_DIALOG_BOX : -1;VALUE MM_GENERIC_CONTROL : -2;object" MENU_MANAGER_MAIN : main_window { arguments { x = 10; y = 20; width = 0; height = 0; }; controls { menu_bar main_menu_bar; simple_text output_window; }; };!object main_menu_bar : menu_bar { arguments {, orientation = DwtOrientationHorizontal; spacing = 15; }; controls {$ pulldown_entry file_menu_entry;' pulldown_entry options_menu_entry;$ pulldown_entry user_menu_entry;$ pulldown_entry help_menu_entry; }; callbacks {2 create = PROCEDURE create_proc (MM_MENU_BAR); }; };)OBJECT file_menu_entry : PULLDOWN_ENTRY {- ARGUMENTS {LABEL_LABEL = 'File'; };/ CONTROLS {PULLDOWN_MENU file_menu; };};"OBJECT file_menu : PULLDOWN_MENU {# CONTROLS {PUSH_BUTTON exit_button;" PUSH_BUTTON clear_text_button;( PUSH_BUTTON reload_user_menu_button;! PUSH_BUTTON save_text_button; };};I/* ----------------------------------------------------------------------* File menu pushbuttons.L* ---------------------------------------------------------------------- */.OBJECT reload_user_menu_button : PUSH_BUTTON {8 ARGUMENTS {LABEL_LABEL = 'Reload User Menu'; };. CALLBACKS {ACTIVATE = PROCEDURE activate_proc& (mm_reload_user_menu_button); };};"ZbMM010.Bd;[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.UIL;42QOBJECT exit_button : PUSH_BUTTON {- ARGUMENTS {LABEL_LABEL = 'Exit'; };F CALLBACKS {ACTIVATE = PROCEDURE activate_proc (mm_exit_button); };};(OBJECT clear_text_button : PUSH_BUTTON {0 ARGUMENTS {LABEL_LABEL = 'Clear Text Window';};F CALLBACKS {ACTIVATE = PROCEDURE activate_proc (mm_clear_text_button); };};'object save_text_button : push_button {; arguments {label_label = 'Save contents of text window';};G callbacks {activate = procedure activate_proc (mm_save_text_button);}; };,OBJECT options_menu_entry : PULLDOWN_ENTRY {0 ARGUMENTS {LABEL_LABEL = 'Options'; };2 CONTROLS {PULLDOWN_MENU options_menu; };};%OBJECT options_menu : PULLDOWN_MENU { CONTROLS {* PUSH_BUTTON set_menu_filename_button; };};I/* ----------------------------------------------------------------------* options menu pushbuttons.L* ---------------------------------------------------------------------- *//OBJECT set_menu_filename_button : PUSH_BUTTON {9 ARGUMENTS {LABEL_LABEL = 'Set Menu Filename'; };. CALLBACKS {ACTIVATE = PROCEDURE activate_proc (mm_set_menu_filename); };};)OBJECT user_menu_entry : PULLDOWN_ENTRY {1 ARGUMENTS {LABEL_LABEL = 'Commands'; };; callbacks {CREATE = PROCEDURE create_proc (MM_USER_MENU); 6 PULLING = PROCEDURE activate_proc (MM_USER_MENU); };};!OBJECT USERMENU : pulldown_menu { };)OBJECT help_menu_entry : PULLDOWN_ENTRY {- ARGUMENTS {LABEL_LABEL = 'Help'; };/)MM010.Bd;[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.UIL;42DAT;13Q CONTROLS {PULLDOWN_MENU help_menu; }; callbacks {6 PULLING = PROCEDURE activate_proc (MM_HELP_MENU); };};"OBJECT help_menu : PULLDOWN_MENU {$ CONTROLS {PUSH_BUTTON about_button; PUSH_BUTTON overview_button; };};I/* ----------------------------------------------------------------------* help menu pushbuttons.L* ---------------------------------------------------------------------- */#OBJECT about_button : PUSH_BUTTON {- ARGUMENTS {LABEL_LABEL = 'About'; };. CALLBACKS {ACTIVATE = PROCEDURE activate_proc (mm_help_about); };};&OBJECT overview_button : PUSH_BUTTON {1 ARGUMENTS {LABEL_LABEL = 'Overview'; };H CALLBACKS {ACTIVATE = PROCEDURE activate_proc (mm_help_overview); };};$OBJECT output_window : SIMPLE_TEXT {! arguments {rows = 16; cols = 60; x = 80; y = 80; /*  half_border = false; word_wrap = false; */2 insertion_point_visible = true;& auto_show_insertion_point = true; scroll_vertical = true;" scroll_horizontal = true; font_argument = large_font; }; CALLBACKS {4 CREATE = PROCEDURE create_proc (MM_OUTPUT_WINDOW); };};I/* ----------------------------------------------------------------------* Generic separator.L* ---------------------------------------------------------------------- */(OBJECT generic_separator: SEPARATOR { };I/* ----------------------------------------------------- >MM010.Bd;[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.UIL;42Q-----------------* Generic Message Box.L* ---------------------------------------------------------------------- */*OBJECT generic_message_box : MESSAGE_BOX { ARGUMENTS {D LABEL_LABEL = 'There must be a bug in\nyour DWT:SET-VALUES call.';/* OK_LABEL = 'Bummer'; */ TAKE_FOCUS = True; DEFAULT_POSITION = True;* /* alignment = DwtAlignmentBeginning; */ };};I/* ----------------------------------------------------------------------* Generic Caution Box.L* ---------------------------------------------------------------------- */*OBJECT generic_caution_box : CAUTION_BOX { ARGUMENTS {@ LABEL_LABEL = 'You should not see this.\nCheck your ARGLIST.'; DEFAULT_POSITION = True;# DEFAULT_PUSHBUTTON = DwtNoButton; CANCEL_LABEL = ''; }; CALLBACKS {9 YES = PROCEDURE activate_proc (MM_GENERIC_CAUTION_YES);7 NO = PROCEDURE activate_proc (MM_GENERIC_CAUTION_NO);" CANCEL = PROCEDURE activate_proc& (MM_GENERIC_CAUTION_CANCEL); }; };I/* ----------------------------------------------------------------------* Generic Work-in-progress Box.L* ---------------------------------------------------------------------- *//OBJECT generic_wip_box : WORK_IN_PROGRESS_BOX { ARGUMENTS {@ LABEL_LABEL = 'You should not see this.\nCheck your ARGLIST.';/* CANCEL_LABEL = O 'Did you really want a button here?\nSet cancelLabel to the null string.'; */ DEFAULT_POSITION = True; }; CALLBACKS {; CANCEL = PROCEDURE activate_proc (MM_GENERIC_WIP_CANCEL); };6MM010.Bd;[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.UIL;42Q'};1OBJECT menu_file_selection_box : FILE_SELECTION {-* ARGUMENTS {DIR_MASK = 'SYS$LOGIN:*.MENU'; TITLE = 'Menu File Name'; DEFAULT_POSITION = true;: STYLE = DwtModeless;- };-. CALLBACKS {ACTIVATE = PROCEDURE activate_proc (MM_MENU_FILE_SELECTION);# CANCEL = PROCEDURE cancel_proc' (MM_MENU_FILE_SELECTION);# CREATE = PROCEDURE create_procc (MM_MENU_FILE_SELECTION); };; };e1OBJECT text_file_selection_box : FILE_SELECTION {d) ARGUMENTS {DIR_MASK = 'SYS$LOGIN:*.TXT';a TITLE = 'Text File Name'; DEFAULT_POSITION = true;' STYLE = DwtModeless;e }; . CALLBACKS {ACTIVATE = PROCEDURE activate_proc (MM_TEXT_FILE_SELECTION);# CANCEL = PROCEDURE cancel_procd (MM_TEXT_FILE_SELECTION);# CREATE = PROCEDURE create_proce (MM_TEXT_FILE_SELECTION); };t };d'object help_dialog : popup_dialog_box { arguments {! title = 'Menu Manager Help';W style = DwtModeless;_ /* x = 300; y = 100; */ /* margin_width = 20; */ 1 default_button = push_button help_ok_button;i }; controls {o" simple_text help_output_area; work_area_menu help_clicks;! simple_text help_input_area;d };e callbacks {4 create = procedure create_proc(MM_HELP_DIALOG); };i };r'object help_output_area : simple_text { arguments { rows = 24;  cols = 80;r x = 0; y = 50;  half_border = false;  word_wrap = false;  scroll_vertic3K\>MM010.Bd;[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.UIL;42DAT;13QOsal = true; scroll_horizontal = true;! font_argument = medium_font;  }; callbacks {4 create = procedure create_proc(MM_HELP_OUTPUT); };  };l%object help_clicks : work_area_menu {u arguments { + orientation = DwtOrientationHorizontal;t spacing = 50;e x = 0; y = 25;C border_width = 0;4 entry_border_width = 3; }; controls {% push_button help_up_level_button;7 push_button help_ok_button; # push_button help_cancel_button;- }; };+object help_up_level_button : push_button {r arguments { label_label = 'Up';n x = 0; y = 0;G }; callbacks {;9 activate = procedure activate_proc(MM_HELP_UP_LEVEL);E }; };%object help_ok_button : push_button { arguments { label_label = 'OK';  x = 0; y = 33; }; callbacks { 3 activate = procedure activate_proc(MM_HELP_OK);w }; };)object help_cancel_button : push_button { arguments {{ label_label = 'Dismiss'; x = 0; y = 66; }; callbacks {5 activate = procedure cancel_proc(MM_HELP_DIALOG);  }; };&object help_input_area : simple_text { arguments {r rows = 1;w cols = 80; x = 0; y = 0;l half_border = false; word_wrap = false; scroll_vertical = false; scroll_horizontal = false;# insertion_point_visible = true; % auto_show_insertion_point = true;D font_argument = medium_font; }; callbacks {:2 create = procedure create_proc(MM_HELP_INPUT);^MM010.Bd;[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER.UIL;42Q }; }; END MODULE;tn;( PUSH_BUTTON reload_user_menu_button;! PUSH_BUTTON save_text_button; };};I/* ----------------------------------------------------------------------* File menu pushbuttons.L* ---------------------------------------------------------------------- */.OBJECT reload_user_menu_button : PUSH_BUTTON {8 ARGUMENTS {LABEL_LABEL = 'Reload User Menu'; };. CALLBACKS {ACTIVATE = PROCEDURE activate_proc& (mm_reload_user_menu_button); };};"4*[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MAKEFILE.;25+,]./h 4\R-0123KPWO56@ǒ7ޟǒ89GhHJ#$# Make file for netuser window stuff#L!CFLAGS = /nolist/debug/noopt/obj=$(MMS$TARGET_NAME).OBJ ! /define=DEBUGGING$DECWOPTIONS = DECWSHARLIBRARIES.OPTUCONST = menu_manager_const.datUCONST_H = menu_manager_const.h#UCONST_UIL = menu_manager_const.uilEMENU_MANAGER_OBJS = Menu_Manager.obj, mm_message_mbx.obj, mm_help.obj@MENU_MANAGER_SRCS = Menu_Manager.c, mm_message_mbx.c, mm_help.cMENU_HELP_LIBRARY = MM_HELP.HLBMENU_HELP_FILE = MM_HELP.HLP$MENU_MANAGER_UIL = ss>MM010.B]4[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MAKEFILE.;25.UIL;42\]Menu_Manager.uil$MENU_MANAGER_UID = Menu_Manager.uid$MENU_MANAGER_EXE = Menu_Manager.exeKIT_A = MM010.AKIT_B = MM010.BHKIT_A_FILES = mm010.release_notes, kitinstal.com, $(MENU_MANAGER_UID), -; $(MENU_MANAGER_OBJS), $(DECWOPTIONS), mm_help.hlb, -# mm_startup.com, decw$mm.menu0KIT_B_FILES = $(UCONST), $(MENU_MANAGER_SRCS), -5 $(MENU_MANAGER_UIL), Makefile., $(UCONST_H), -' $(UCONST_UIL), $(MENU_HELP_FILE) UIL = UIL1UILFLAGS = /NOLIST /OUTPUT=$(MMS$TARGET_NAME).UID.SUFFIXES .UID .UIL.UIL.UID# @ define uil$include decw$include:! $(UIL) $(UILFLAGS) $(MMS$SOURCE)LMenu_Manager. : $(MENU_MANAGER_EXE) $(MENU_MANAGER_UID) $(MENU_HELP_LIBRARY) @ copy nl: Menu_Manager. @ purge*$(MENU_MANAGER_EXE) : $(MENU_MANAGER_OBJS)\ link/exe=$(MENU_MANAGER_EXE) $(MENU_MANAGER_OBJS),$(DECWOPTIONS)/opt/notrace ! /debug/trace-Menu_Manager.obj : Menu_Manager.c $(UCONST_H)#mm_help.obj : mm_help.c $(UCONST_H)$(UCONST_H) : $(UCONST)- @ puc == "$rcf$util:parse-uil-constants.exe" puc $(UCONST) $(UCONST_H) C 7$(MENU_MANAGER_UID) : $(MENU_MANAGER_UIL) $(UCONST_UIL)$(UCONST_UIL) : $(UCONST)- @ puc == "$rcf$util:parse-uil-constants.exe" puc $(UCONST) $(UCONST_UIL) UIL($(MENU_HELP_LIBRARY) : $(MENU_HELP_FILE)! kit and source save sets$(KIT_A) : $(KIT_A_FILES) @ purge $(KIT_A_FILES); backup $(KIT_A_FILES) $(KIT_A)/save/inter/group=0/blo=2048 @ purge $(KIT_A)$(KIT_B) : $(KIT_B_FILES) @ purge $(KIT_B_FILES) O)XMM010.B]4[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MAKEFILE.;25.UIL;42DAT;13\; backup $(KIT_B_FILES) $(KIT_B)/save/inter/group=0/blo=2048 @ purge $(KIT_B)>*[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER_CONST.H;8+,A./h 4:F-0123KPWO56@Ifǒ7@ǒ89ǒGhHJ/* -*-c-mode-*- */8/*------------------------------------------------------9 * MENU_MANAGER_CONST.DAT - menu-manager constants (tags)) * Robert Heller Thu Oct 12 13:02:39 1989: *------------------------------------------------------*//*** Main callback tags */#define MM_MAIN_WINDOW 1 #define MM_OUTPUT_WINDOW 2 #define MM_MENU_BAR 3 !/*** File menu callback tags ***/#define MM_EXIT_BUTTON 4 #define MM_CLEAR_TEXT_BUTTON 5 %#define MM_RELOAD_USER_MENU_BUTTON 6 #define MM_S!JMM010.BA>[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER_CONST.H;8:7~AVE_TEXT_BUTTON 7 /*** Options menu ***/#define MM_SET_MENU_FILENAME 8 /*** user menu ***/#define MM_USER_MENU 9 /*** help menu ***/#define MM_HELP_MENU 10 #define MM_HELP_ABOUT 11 #define MM_HELP_OVERVIEW 12 /*** generic box tags ***/"#define MM_GENERIC_CAUTION_YES 13 !#define MM_GENERIC_CAUTION_NO 14 %#define MM_GENERIC_CAUTION_CANCEL 15 !#define MM_GENERIC_WIP_CANCEL 16 &/*** menu file selection box tags ***/"#define MM_MENU_FILE_SELECTION 17 &/*** text file selection box tags ***/"#define MM_TEXT_FILE_SELECTION 18 )/*** help popup dialog box constants ***/#define MM_HELP_DIALOG 19 #define MM_HELP_OUTPUT 20 #define MM_HELP_UP_LEVEL 21 #define MM_HELP_OK 22 #define MM_HELP_INPUT 23 $/*** max widget - must be last! ***/#define MM_MAX_WIDGET 24 @*[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER_CONST.UIL;8+,G./h 4:\-0123KPWO56Bǒ7)ǒ89ǒGhHJ"sO<MM010.BG@[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MENU_MANAGER_CONST.UIL;8:*/* -*-c-mode-*- */8/*------------------------------------------------------9 * MENU_MANAGER_CONST.DAT - menu-manager constants (tags)) * Robert Heller Thu Oct 12 13:02:39 1989: *------------------------------------------------------*//*** Main callback tags */VALUE MM_MAIN_WINDOW : 1; VALUE MM_OUTPUT_WINDOW : 2; VALUE MM_MENU_BAR : 3; !/*** File menu callback tags ***/VALUE MM_EXIT_BUTTON : 4; VALUE MM_CLEAR_TEXT_BUTTON : 5; &VALUE MM_RELOAD_USER_MENU_BUTTON : 6; VALUE MM_SAVE_TEXT_BUTTON : 7; /*** Options menu ***/ VALUE MM_SET_MENU_FILENAME : 8; /*** user menu ***/VALUE MM_USER_MENU : 9; /*** help menu ***/VALUE MM_HELP_MENU : 10; VALUE MM_HELP_ABOUT : 11; VALUE MM_HELP_OVERVIEW : 12; /*** generic box tags ***/#VALUE MM_GENERIC_CAUTION_YES : 13; "VALUE MM_GENERIC_CAUTION_NO : 14; &VALUE MM_GENERIC_CAUTION_CANCEL : 15; "VALUE MM_GENERIC_WIP_CANCEL : 16; &/*** menu file selection box tags ***/#VALUE MM_MENU_FILE_SELECTION : 17; &/*** text file selection box tags ***/#VALUE MM_TEXT_FILE_SELECTION : 18; )/*** help popup dialog box constants ***/VALUE MM_HELP_DIALOG : 19; VALUE MM_HELP_OUTPUT : 20; VALUE MM_HELP_UP_LEVEL : 21; VALUE MM_HELP_OK : 22; VALUE MM_HELP_INPUT : 23; $/*** max widget - must be last! ***/VALUE MM_MAX_WIDGET : 24; #.MM010.BH5[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_HELP.HLP;6UIL;42DAT;13N5*[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_HELP.HLP;6+,H./h 4Nl-0123KPWO56Xǒ7ǒ89GhHJ1 HELPKTo get help, enter the topic in the top (one line) window of the help popupNdialog and click on the OK button (or press RETURN). Sub-topics can be added Mto the topic and the rightmost [sub-]topic can be removed with the Up button.1 ABOUTCMenu Manager is a simple menu program. It provides a user-definable:menu of things to do and a user-accessable message window.2 PULLDOWN_menusAThe four pulldown menus provide access to its various functions. 3 FILE(The File menu contains four selections: 6 1. Exit - Exit the program.; 2. Clear Text Window - Clear the text window.D 3. Reload User Menu - Re-read in the user menu file. D 4. Save contents of text window - writes the contents of the textA output window to a text file 3 OPTIONS=The Options menu has one selection: Set menu filename. This Boption allows the user to set the name of the file containing the user's menu $][MM010.BH5[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_HELP.HLP;6CONST.H;8Nspecification. 3 COMMANDS;This menu is defined by the user's menu specification file.3 HELP?This menu has two selections, one for a brief overview and one 'for a complete help about Menu Manager.2 SPECIFICATION_file_formatDThe menu specification file is a text file containing pairs of linesFof text. Each pair of lines describes one menu item. The first line isBthe text to place in the button label and the second line is a DCL?command string (Menu Manager uses LIB$SPAWN to run commands). AD"!" in column 1 indicatets a comment line, which is skipped. Output Hfrom the spawned process is directed to the Menu Manager's message area.KThe default name for the menu specification file is SYS$LOGIN:DECW$MM.MENU.)2 MESSAGE_area_Access_from_a_user_programEThe Menu Manager's message area is accessed by writing to the logical5name _MM_MESSAGE_MAILBOX. is the5username of the user who started up the Menu Manager.2 USE_of_the_text_output_windowHThe main window on the menu manager is used as the output stream for theJsub-processes it creates. It can also be written to by user programs via aKmailbox device (see the MESSAGE_area_Access_from_a_user_program sub-topic).IIn addition, the user can enter and edit text directly from the keyboard.LThe textual contents of the window can also be saved in a text file (see the4FILE sub-sub-topic of the PULLDOWN_menus sub-topic). 1 OVERVIEWDMenu Manager is a simple menuing program. It features a user-defin%&/MM010.BH5[HELLER.DECW_MAGIC.ROBERTS_MENU_MANAGER]MM_HELP.HLP;6CONST.UIL;8N edEmenu and a user-accessable message area. Click on the About button onthe Help menu for more details.