This is mibMenu.c in view mode; [Download] [Up]
#include "mibload.h" #include "mibwidgets.h" extern Display *dpy; extern GC mib_gc; static int delhandler; /* delay adding event handler until menu is actually created */ /* Code for Menu */ /*****************************************************************************/ mib_Widget *mib_create_Menu(mib_Widget *parent, char *name, char *label, int posx, int posy, int width, int height, int mib_fill) { mib_Widget *temp; mib_Menu *myres; Widget wtemp; char label_temp[50]; Arg args[20]; int n; /* create the new widget and add it to the tree */ temp = mib_new_mib_Widget(); if (mib_fill == WDEFAULT) mib_add_backward(temp, parent); else mib_add_mib_Widget(temp, parent); myres = (mib_Menu *)malloc(sizeof(mib_Menu)); /* initialize public resources */ if (mib_fill == WDEFAULT) { temp->name = (char *)malloc(strlen(name)+1); strcpy(temp->name,name); } temp->mib_class = (char *)malloc(8); sprintf(temp->mib_class,"Menu"); temp->mib_class_num = MIB_MENU; temp->width = width; temp->height = height; temp->topOffset = posy; temp->leftOffset = posx; temp->bottomOffset = 0; temp->rightOffset = 0; temp->topAttachment = 1; temp->leftAttachment = 1; temp->bottomAttachment = 0; temp->rightAttachment = 0; temp->mib_allowresize = 0; /* initialize private resources */ temp->myres = (void *)myres; myres->numitems = 0; /* create Xt widget */ n = 0; if (mib_fill == WDEFAULT) { XtSetArg (args[n], XmNleftAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNleftOffset, posx);n++; XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++; XtSetArg (args[n], XmNtopOffset, posy);n++; } XtSetArg (args[n], XmNrubberPositioning, False); n++; temp->me = XtCreateManagedWidget(name, xmRowColumnWidgetClass, temp->parent->me, args, n); n = 0; delhandler = 1; if (mib_fill == WDEFAULT) { delhandler = 0; myres->numitems = 3; myres->my_menu = (MenuItem *)malloc(sizeof(MenuItem) * (myres->numitems+1)); myres->items = (Widget *)malloc(sizeof(Widget) * myres->numitems); sprintf(label_temp, "Item 1"); myres->my_menu[0].label = (char *)malloc(strlen(label_temp)+1); strcpy(myres->my_menu[0].label,label_temp); myres->my_menu[0].class = &xmPushButtonGadgetClass; myres->my_menu[0].mnemonic = '1'; myres->my_menu[0].accelerator = NULL; myres->my_menu[0].accel_text = NULL; myres->my_menu[0].accel_text = NULL; myres->my_menu[0].callback = NULL; myres->my_menu[0].callback_data = NULL; myres->my_menu[0].subitems = (struct _menu_item *)1; sprintf(label_temp, "Item 2"); myres->my_menu[1].label = (char *)malloc(strlen(label_temp)+1); strcpy(myres->my_menu[1].label,label_temp); myres->my_menu[1].class = &xmPushButtonGadgetClass; myres->my_menu[1].mnemonic = '2'; myres->my_menu[1].accelerator = NULL; myres->my_menu[1].accel_text = NULL; myres->my_menu[1].accel_text = NULL; myres->my_menu[1].callback = NULL; myres->my_menu[1].callback_data = NULL; myres->my_menu[1].subitems = (struct _menu_item *)1; sprintf(label_temp, "Item 3"); myres->my_menu[2].label = (char *)malloc(strlen(label_temp)+1); strcpy(myres->my_menu[2].label,label_temp); myres->my_menu[2].class = &xmPushButtonGadgetClass; myres->my_menu[2].mnemonic = '2'; myres->my_menu[2].accelerator = NULL; myres->my_menu[2].accel_text = NULL; myres->my_menu[2].accel_text = NULL; myres->my_menu[2].callback = NULL; myres->my_menu[2].callback_data = NULL; myres->my_menu[2].subitems = (struct _menu_item *)1; myres->my_menu[3].label = NULL; wtemp = BuildMenu(temp->me, XmMENU_OPTION, NULL, 'M', myres->my_menu); XtManageChild(wtemp); } if (mib_fill == WEDIT || mib_fill == WDEFAULT) { /* default menu */ if (!delhandler) { mib_apply_eventhandlers(wtemp, temp); mib_apply_eventhandlers(temp->me, temp); } } if (mib_fill == WEMPTY) delhandler = 0; return temp; } void mib_delete_Menu(mib_Widget *this) { mib_Menu *temp = (mib_Menu *)this->myres; free(temp); } void mib_save_Menu(mib_Widget *this, FILE *fout) { mib_Menu *temp = (mib_Menu *)this->myres; int count; fprintf(fout, "numitems: %d\\n\\\n", temp->numitems); for (count=0; count < temp->numitems; count++) { fprintf(fout, "item: \\\"%s\\\"\\n\\\n", temp->my_menu[count].label); } } int mib_load_Menu(mib_Widget *this, mib_Buffer *fin) { char res[MI_MAXSTRLEN]; char val[MI_MAXSTRLEN]; int count, vallen; Widget wtemp; mib_Menu *myres = (mib_Menu *)this->myres; if (!mib_read_line(fin, res, val)) return 0; if (!strcmp(res, "numitems")) { myres->numitems = 0; sscanf(val, "%d", &(myres->numitems)); if (!(myres->numitems)) return 0; myres->my_menu = (MenuItem *)malloc(sizeof(MenuItem) * (myres->numitems+1)); myres->items = (Widget *)malloc(sizeof(Widget) * myres->numitems); for (count = 0; count < myres->numitems; count++) { if (!mib_read_line(fin, res, val)) return 0; vallen = strlen(val); if (vallen < 2) return 0; val[vallen-1] = '\0'; myres->my_menu[count].label = (char *)malloc(vallen-1); sprintf(myres->my_menu[count].label, "%s", &(val[1])); myres->my_menu[count].class = &xmPushButtonGadgetClass; myres->my_menu[count].mnemonic = NULL; myres->my_menu[count].accelerator = NULL; myres->my_menu[count].accel_text = NULL; myres->my_menu[count].accel_text = NULL; myres->my_menu[count].callback = NULL; myres->my_menu[count].callback_data = NULL; myres->my_menu[count].subitems = (struct _menu_item *)1; } myres->my_menu[myres->numitems].label = NULL; wtemp = BuildMenu(this->me, XmMENU_OPTION, NULL, NULL, myres->my_menu); XtManageChild(wtemp); if (delhandler) { mib_apply_eventhandlers(wtemp, this); mib_apply_eventhandlers(this->me, this); } else this->me = wtemp; for (count = 0; count < myres->numitems; count++) { /* this hack extracts the widget for each item in the menu for possible use by the programmer */ myres->items[count] = (Widget)(myres->my_menu[count].subitems); } } else return 0; if (!mib_read_line(fin, res, val)) return 0; if (strcmp(res,"EndWidget")) return 0; return 1; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.