// generic requester wrapper short super_request(APTR parent,char *message,IPCData *ipc,ULONG *flagptr) { struct super_request_data *data; short ret=1; // Allocate data if (!(data=AllocVec(sizeof(struct super_request_data),MEMF_CLEAR))) return 0; // Initialise data data->ret_val=1; // Initialise simple request structure data->request.title=GetString(&locale,MSG_DIRECTORY_OPUS_REQUEST); data->request.message=message; data->request.gadgets=data->gadgets; data->request.return_values=data->return_values; data->request.flags=flagptr[0]; // Asked to open on main window? if (!(data->request.flags&SRF_SCREEN_PARENT) && parent==(APTR)GUI->window) { // Change to open on main screen, unless mouse positioning is set if (!(data->request.flags&SRF_MOUSE_POS)) { parent=GUI->screen_pointer; data->request.flags|=SRF_SCREEN_PARENT; } } // Buffer supplied? if (data->request.flags&SRF_BUFFER) { // Get buffer pointer data->request.string_buffer=(char *)flagptr[ret++]; // Get buffer length data->request.string_len=(int)flagptr[ret++]; } // Buffer supplied? if (data->request.flags&SRF_BUFFER2) { // Get buffer pointer data->request.string_buffer_2=(char *)flagptr[ret++]; // Get buffer length data->request.string_len_2=(int)flagptr[ret++]; } // History supplied? if (data->request.flags&SRF_HISTORY) { // Get history list data->request.history=(Att_List *)flagptr[ret++]; } // IPC supplied? if (ipc) { // Store pointer, set flag data->request.ipc=ipc; data->request.flags|=SRF_IPC; } // IPC or signal bit supplied? else if (data->request.flags&(SRF_IPC|SRF_SIGNAL)) { // Get IPC pointer data->request.ipc=(IPCData *)flagptr[ret++]; } // Checkmark supplied? if (data->request.flags&SRF_CHECKMARK) { // Get checkmark pointers data->request.check_text=(char *)flagptr[ret++]; data->request.check_ptr=(short *)flagptr[ret++]; } // Go through gadgets while ((data->gad=(char *)flagptr[ret++])) { // Valid gadget? if (data->gad==(char *)-1) continue; // Store gadget in the array data->gadgets[data->gad_count]=data->gad; data->return_values[data->gad_count++]=data->ret_val++; // Maximum of 10 gadgets if (data->gad_count==10) break; } // If we got more than 1 gadget, make the last gadget a "cancel" gadget if (data->gad_count>1) data->return_values[data->gad_count-1]=0; // Zero the last gadget pointer data->gadgets[data->gad_count]=0; // Do the request ret=DoSimpleRequest(parent,&data->request); // Free data FreeVec(data); return ret; }
// Remove a filetype short filetype_remove( config_filetypes_data *data, Att_Node *node, short store) { FiletypeNode *ftnode; struct DOpusSimpleRequest simple; char buf[100],*gadgets[3]; int ret_vals[2]; short change=0; // Get filetype node ftnode=(FiletypeNode *)node->data; // Fill out requester structure simple.title=GetString(locale,MSG_FILETYPE_EDITOR_TITLE); simple.message=buf; simple.gadgets=gadgets; simple.return_values=ret_vals; simple.string_buffer=0; simple.flags=SRF_IPC; simple.font=0; simple.ipc=data->ipc; // Build message lsprintf(buf,GetString(locale,MSG_FILETYPE_REMOVE_REQ),ftnode->type->type.name); // Fill in gadgets gadgets[0]=GetString(locale,MSG_FILETYPES_REMOVE); gadgets[1]=GetString(locale,MSG_CANCEL); gadgets[2]=0; ret_vals[0]=1; ret_vals[1]=0; // Make window busy SetWindowBusy(data->window); // Display requester if (store || (change=DoSimpleRequest(data->window,&simple))==1) { // Is the editor open for this filetype? if (ftnode->editor) { // Tell it to quit IPC_Quit(ftnode->editor,-1,0); } // Remove filetype list from lister SetGadgetChoices(data->objlist,GAD_FILETYPES_LIST,(APTR)~0); // Mark this list as changed ftnode->type->list->flags|=FTLISTF_CHANGED; // Stored? if (store) { ftnode->type->list->flags|=FTLISTF_STORE; change=1; } // Removed else { // Free filetype FreeFiletype(ftnode->type); } // Free node data and node FreeVec(ftnode); Att_RemNode(node); // Reattach list with no selection SetGadgetValue(data->objlist,GAD_FILETYPES_LIST,(ULONG)-1); SetGadgetChoices(data->objlist,GAD_FILETYPES_LIST,data->filetype_list); // Disable buttons filetype_able_buttons(data,TRUE); } // Make window unbusy ClearWindowBusy(data->window); return change; }