// Trap 'more' in default tool BOOL file_trap_more(char *name,char *tool) { short len; BOOL ok=0; if (!(environment->env->settings.icon_flags&ICONFLAG_TRAP_MORE)) return 0; // Look for 'more' in default tool len=strlen(tool); if (len>=4 && stricmp(tool+len-4,"more")==0 && (len==4 || tool[len-5]=='/' || tool[len-5]==':')) { struct read_startup *read; // Allocate startup if ((read=AllocVec(sizeof(struct read_startup),MEMF_CLEAR))) { // Create list if ((read->files=(struct List *)Att_NewList(0))) { // Add file to list if (Att_NewNode((Att_List *)read->files,name,0,0)) { // Substitute internal viewer misc_startup("dopus_more_trap",FUNC_SMARTREAD,0,read,FALSE); ok=1; } else Att_RemList((Att_List *)read->files,0); } if (!ok) FreeVec(read); } } return ok; }
int __asm __saveds L_Module_Entry( register __a0 struct List *files, register __a1 struct Screen *callback1, register __a2 IPCData *callback2, register __a3 IPCData *main_ipc, register __d0 ULONG mod_id, register __d1 ULONG mod_data) { NewConfigWindow newwin; struct Window *window; ObjectList *objlist; Att_List *list; TimerHandle *timer; short count=0; struct Task *task; rego_data test={0}; // Call back to main program ((void __asm (*) (register __a0 struct List *, register __a1 rego_data *, register __a2 rego_data *, register __a3 void **, register __d0 ULONG))callback2)(files,&test,®o,&newwin.parent,global_checksum); // Won't work with DOpus library > 55 if (DOpusBase->lib_Version>55) return 0; // Fix IPC main_ipc->proc=(struct Process *)FindTask(0); main_ipc->proc->pr_Task.tc_UserData=main_ipc; main_ipc->list=0; if (!main_ipc->command_port) main_ipc->command_port=CreateMsgPort(); // Fill out new window newwin.parent=0; newwin.dims=&serial_window; newwin.title=GetString(locale,MSG_TITLE); newwin.locale=locale; newwin.port=0; newwin.flags=WINDOW_VISITOR|WINDOW_NO_CLOSE|WINDOW_REQ_FILL|WINDOW_AUTO_KEYS; newwin.font=0; // Initialise timer if (!(timer=AllocTimer(UNIT_VBLANK,0))) return 0; // Open window if (!(window=OpenConfigWindow(&newwin)) || !(objlist=AddObjectList(window,serial_objects))) { CloseConfigWindow(window); FreeTimer(timer); return 0; } // Set ok flag *((ULONG *)mod_data)|=(1<<28); // Display text list=build_text_display(window,objlist,message0); // Start timer StartTimer(timer,DELAY,0); // Event loop FOREVER { struct IntuiMessage *msg; BOOL break_flag=0; // Timer returned? if (CheckTimer(timer)) { // Exit break_flag=1; } // Any Intuition messages? while (msg=GetWindowMsg(window->UserPort)) { struct IntuiMessage copy_msg; // Copy message and reply copy_msg=*msg; ReplyWindowMsg(msg); // Gadget? if (copy_msg.Class==IDCMP_GADGETUP) { struct Gadget *gadget; // Get gadget gadget=(struct Gadget *)copy_msg.IAddress; // Look at gadget ID switch (gadget->GadgetID) { // Ok case GAD_SERIAL_OKAY: break_flag=1; break; } } } if (break_flag) break; Wait(1<<window->UserPort->mp_SigBit|1<<timer->port->mp_SigBit); } // Close window CloseConfigWindow(window); // Free list and timer Att_RemList(list,0); FreeTimer(timer); // Success return 1; }
void FunctionEditor(void) { struct IntuiMessage *gmsg,msg; int break_flag=0; UWORD gadgetid=0; ULONG waitbits; FuncEdData *data; IPCData *ipc; NewConfigWindow newwin; FunctionStartup *startup=0; IPCMessage *submsg; int success=0; BOOL open_window=1; BPTR lock; ConfigWindow windims; // Do startup if (!(ipc=Local_IPC_ProcStartup((ULONG *)&startup, (APTR)&funced_init))) { funced_cleanup(startup->data); return; } // Get data pointer data=startup->data; // Lock RAM: and CD to it if ((lock=Lock("ram:",ACCESS_READ))) lock=CurrentDir(lock); // Copy dimensions if (startup->flags&FUNCEDF_CENTER) windims=_function_editor_window_center; else if (startup->flags&FUNCEDF_LABEL) windims=_function_editor_label_window; else windims=_function_editor_window; // Fill in new window newwin.parent=startup->window; newwin.dims=&windims; newwin.title=(startup->title[0])?startup->title:(char *)GetString(startup->locale,MSG_FUNCED_TITLE); newwin.locale=startup->locale; newwin.port=0; newwin.flags=WINDOW_VISITOR|WINDOW_AUTO_KEYS|WINDOW_REQ_FILL;//|WINDOW_SIZE_BOTTOM; newwin.font=0; // Build flag list funced_build_flaglist(data); waitbits=1<<ipc->command_port->mp_SigBit|1<<data->drag.timer->port->mp_SigBit; // Event loop FOREVER { // Check drag if (config_drag_check(&data->drag)) { // End drag functioned_end_drag(data,0); } // Task message? while ((submsg=(IPCMessage *)GetMsg(ipc->command_port))) { // Close message? if (submsg->command==IPC_QUIT) { // Keep changes? success=submsg->flags; // Set break flag break_flag=1; } // Activate else if (submsg->command==IPC_ACTIVATE && data->window) { WindowToFront(data->window); ActivateWindow(data->window); } // Hide else if (submsg->command==IPC_HIDE && data->window) { // Store changes in function funced_store_edits(data); // End any drag in progress functioned_end_drag(data,0); // Remove AppWindow RemoveAppWindow(data->appwindow); data->appwindow=0; // Close window CloseConfigWindow(data->window); // Zero stuff data->window=0; data->objlist=0; waitbits=1<<ipc->command_port->mp_SigBit; } // Show else if (submsg->command==IPC_SHOW && !data->window) { // Set flag to open window open_window=1; newwin.parent=(struct Window *)submsg->data; } // Passed-along app message else if (submsg->command==CFG_APPMESSAGE_PASS) { funced_appmsg(data,submsg->data); ReplyMsg((struct Message *)submsg->data); } // Update our identity else if (submsg->command==CFG_NEW_ID) { data->function->function.func_type=submsg->flags; startup->object_flags=(ULONG)submsg->data; } // Copy a function else if (submsg->command==FUNCTIONEDIT_COPY_LINE) { FunctionEntry *entry,*next; // Copy function functioned_copy_line( data, (FunctionEntry *)submsg->data, 0, (Point *)submsg->data_free); // Free function entry=(FunctionEntry *)submsg->data; while (entry) { // Get next next=(FunctionEntry *)entry->node; // Free entry FreeVec(entry); entry=next; } } // Clip button else if (submsg->command==BUTTONEDIT_CLIP_BUTTON) { Cfg_ButtonFunction *func; // Show busy pointer SetWindowBusy(data->window); // Stop editing funced_end_edit(data,data->edit_node,0,0); data->edit_node=0; // Get first function if ((func=(Cfg_ButtonFunction *) FindFunctionType( (struct List *)&((Cfg_Button *)submsg->data)->function_list, FTYPE_LEFT_BUTTON))) { FunctionEntry dummy; Cfg_Instruction *ins; // Go through instructions for (ins=(Cfg_Instruction *)func->instructions.mlh_Head; ins->node.mln_Succ; ins=(Cfg_Instruction *)ins->node.mln_Succ) { // Fill out dummy entry dummy.type=ins->type; if (ins->string) strcpy(dummy.buffer,ins->string); else dummy.buffer[0]=0; // Copy function line data->edit_node=funced_new_entry(data,0,&dummy); } // Start editing last line funced_start_edit(data); // Get flags data->function->function.flags=func->function.flags; data->function->function.code=func->function.code; data->function->function.qual=func->function.qual; data->function->function.qual_mask=func->function.qual_mask; data->function->function.qual_same=func->function.qual_same; // Update flag list funced_update_flaglist(data); // Update key funced_show_key(data); } // Free button FreeButton((Cfg_Button *)submsg->data); // Clear busy pointer ClearWindowBusy(data->window); } // Reply the message IPC_Reply(submsg); } // Open window? if (open_window) { // Open window if (!(data->window=OpenConfigWindow(&newwin)) || !(data->p_objlist=AddObjectList( data->window, (startup->flags&FUNCEDF_IMAGE)?_function_editor_image_objects: ((startup->flags&FUNCEDF_LABEL)?_function_editor_label_objects: _function_editor_normal_objects))) || !(data->objlist=AddObjectList(data->window,_function_editor_objects))) break; // Add use or save button AddObjectList(data->window,(startup->flags&FUNCEDF_SAVE)?_function_editor_objects_save:_function_editor_objects_use); // Store window for drag data->drag.window=data->window; // Set window ID SetWindowID(data->window,0,WINDOW_FUNCTION_EDITOR,(struct MsgPort *)ipc); // Add menus AddWindowMenus(data->window,_funced_menus); // Make this an AppWindow data->appwindow=AddAppWindowA(0,0,data->window,data->appport,0); // Get waitbits waitbits|=1<<data->window->UserPort->mp_SigBit; if (data->appwindow) waitbits|=1<<data->appport->mp_SigBit; // Disable key? if (startup->flags&FUNCEDF_NO_KEY) { DisableObject(data->objlist,GAD_FUNCED_KEY,TRUE); } // Initialise gadgets with function data. funced_init_gads(data); open_window=0; } // Intuimessage if (data->window) { while ((gmsg=GetWindowMsg(data->window->UserPort))) { Att_Node *node; // Copy message and reply (unless IDCMPUPDATE) msg=*gmsg; if (gmsg->Class!=IDCMP_IDCMPUPDATE) { ReplyWindowMsg(gmsg); gmsg=0; } // Get GadgetID if (msg.Class==IDCMP_GADGETDOWN || msg.Class==IDCMP_GADGETUP) gadgetid=((struct Gadget *)msg.IAddress)->GadgetID; // Look at message switch (msg.Class) { // Key press case IDCMP_VANILLAKEY: // If editing something, activate string gadget if (data->edit_node) ActivateStrGad(GADGET(GetObject(data->objlist,GAD_FUNCED_EDIT)),data->window); break; // Close window case IDCMP_CLOSEWINDOW: // Set break flag break_flag=1; break; // Mouse move case IDCMP_MOUSEMOVE: // Handle drag move config_drag_move(&data->drag); break; // Inactive window does menu down case IDCMP_INACTIVEWINDOW: msg.Code=MENUDOWN; // Mouse buttons case IDCMP_MOUSEBUTTONS: // Valid drag info? if (data->drag.drag) { short ok=-1; // Dropped ok? if (msg.Code==SELECTUP) { // Is shift down? if (msg.Qualifier&(IEQUALIFIER_LSHIFT|IEQUALIFIER_RSHIFT)) data->drag_shift=1; else data->drag_shift=0; // Remember last position data->drag.drag_x=data->window->WScreen->MouseX; data->drag.drag_y=data->window->WScreen->MouseY; ok=1; } // Aborted else if (msg.Code==MENUDOWN) { // Set abort ok=0; } // End drag? if (ok!=-1) functioned_end_drag(data,ok); } break; // Menu case IDCMP_MENUPICK: { struct MenuItem *item; // Get item if (!(item=ItemAddress(data->window->MenuStrip,msg.Code))) break; // Treat as gadget gadgetid=MENUID(item); } // Gadget case IDCMP_GADGETUP: case IDCMP_GADGETDOWN: // Look at gadget ID switch (gadgetid) { // Hotkey case GAD_FUNCED_KEY: { IX ix; char *ptr; // Get key, see if it's invalid if ((ptr=(char *)GetGadgetValue(data->objlist,GAD_FUNCED_KEY)) && *ptr) { // Try to parse if (ParseIX(ptr,&ix)) { // Flash screen DisplayBeep(data->window->WScreen); // Activate key field again ActivateStrGad(GADGET(GetObject(data->objlist,GAD_FUNCED_KEY)),data->window); } else { data->function->function.code=ix.ix_Code; data->function->function.qual=QualValid(ix.ix_Qualifier); data->function->function.qual_mask=ix.ix_QualMask; data->function->function.qual_same=ix.ix_QualSame; } } } break; // Flag selected case GAD_FUNCED_FLAGS: // Get selected node node=Att_FindNode(data->flag_list,msg.Code); // Set flag data->function->function.flags^=node->data; // Check change funced_check_flag(&data->function->function.flags,node->data); // Update flag list funced_update_flaglist(data); break; // Edit a line case GAD_FUNCED_LISTER: // Get selected node node=Att_FindNode(data->func_display_list,msg.Code); // Is this the node we're already editing? if (node==data->edit_node) break; // If we're editing another one, store its contents if (data->edit_node) funced_end_edit(data,data->edit_node,0,0); // Start editing this entry data->edit_node=node; funced_start_edit(data); break; // Return pressed in edit line case GAD_FUNCED_EDIT: // See if we were editing something if (data->edit_node) { // Stop editing funced_end_edit(data,data->edit_node,END_DISABLE,msg.Qualifier); data->edit_node=0; } break; // New entry case GAD_FUNCED_NEW_ENTRY: case GAD_FUNCED_INSERT_ENTRY: // Create new entry functioned_copy_line(data,0,gadgetid,0); break; // Delete entry case GAD_FUNCED_DELETE_ENTRY: // Check we were editing something if (!data->edit_node) break; // Stop editing (signal delete) funced_end_edit(data,data->edit_node,END_DISABLE|END_DELETE,0); data->edit_node=0; break; // Function type case GAD_FUNCED_FUNCTION_TYPE: // Check we were editing something if (!data->edit_node) break; // Store type ((FunctionEntry *)data->edit_node->data)->type=msg.Code; // Disable popup button if no functions DisableObject( data->objlist, GAD_FUNCED_EDIT_GLASS, (msg.Code==INST_COMMAND && !data->startup->func_list)); break; // Glass gadget case GAD_FUNCED_EDIT_GLASS: // Check we were editing something if (data->edit_node) { char buffer[256]; // Put up requester if (!(funced_command_req( data, buffer, ((FunctionEntry *)data->edit_node->data)->type))) break; // Insert string in edit line funced_edit_insertstring( data->objlist, GAD_FUNCED_EDIT, buffer, DOpusBase,(struct Library *)IntuitionBase); } break; // Argument list case GAD_FUNCED_EDIT_ARGUMENT: // Check we were editing something if (data->edit_node) { char buffer[80]; // Put up requester if (!(funced_command_req( data, buffer, -1))) break; // Insert string in edit line funced_edit_insertstring( data->objlist, GAD_FUNCED_EDIT, buffer, DOpusBase,(struct Library *)IntuitionBase); } break; // Export case MENU_FUNCED_EXPORT_ASCII: case MENU_FUNCED_EXPORT_CMD: // Got file requester? if (WINREQUESTER(data->window)) { struct TagItem tags[6]; struct FileRequester *req=WINREQUESTER(data->window); // Show busy pointer SetWindowBusy(data->window); // File requester tags tags[0].ti_Tag=ASLFR_Window; tags[0].ti_Data=(ULONG)data->window; tags[1].ti_Tag=ASLFR_TitleText; tags[1].ti_Data=(ULONG)GetString(startup->locale,MSG_FUNCED_SELECT_FILE); tags[2].ti_Tag=ASLFR_Flags1; tags[2].ti_Data=FRF_DOSAVEMODE|FRF_PRIVATEIDCMP; tags[3].ti_Tag=ASLFR_Flags2; tags[3].ti_Data=FRF_REJECTICONS; tags[4].ti_Tag=(gadgetid==MENU_FUNCED_EXPORT_CMD)?ASLFR_InitialDrawer:TAG_DONE; tags[4].ti_Data=(ULONG)"DOpus5:Commands"; tags[5].ti_Tag=TAG_DONE; // Show filerequester if (AslRequest(req,tags)) { // Build filename strcpy(data->buffer,req->fr_Drawer); AddPart(data->buffer,req->fr_File,256); // Store changes in function funced_store_edits(data); // Do export if (gadgetid==MENU_FUNCED_EXPORT_CMD) function_export_cmd(data->buffer,0,data->function); else L_FunctionExportASCII(data->buffer,0,data->function,startup->a4); } // Remove busy pointer ClearWindowBusy(data->window); } break; // Cut/Copy case MENU_FUNCED_CUT: case MENU_FUNCED_COPY: { APTR iff; // Set busy pointer SetWindowBusy(data->window); // Open clipboard if ((iff=IFFOpen((char *)0,IFF_CLIP_WRITE,ID_OPUS))) { // Stop editing funced_end_edit(data,data->edit_node,END_DISABLE,0); data->edit_node=0; // Store changes in function funced_store_edits(data); // Save function SaveFunction(iff,data->function); // Close clipboard IFFClose(iff); } // Just copy, not cut? if (gadgetid==MENU_FUNCED_COPY) { // Clear busy pointer ClearWindowBusy(data->window); break; } // Fall through, paste null function } // Paste case MENU_FUNCED_PASTE: { Cfg_Function *func=0; // Set busy pointer SetWindowBusy(data->window); // End any edit funced_end_edit(data,data->edit_node,END_DISABLE,0); data->edit_node=0; // Paste? if (gadgetid==MENU_FUNCED_PASTE) { APTR iff; // Open clipboard if ((iff=IFFOpen((char *)0,IFF_CLIP_READ,ID_OPUS))) { // Find function if (IFFNextChunk(iff,ID_FUNC)) { // Read function func=ReadFunction(iff,0,0,0); } // Close clipboard IFFClose(iff); } // No valid function? if (!func) { // Flash error DisplayBeep(data->window->WScreen); ClearWindowBusy(data->window); break; } } // Detach existing list SetGadgetChoices(data->objlist,GAD_FUNCED_FLAGS,(APTR)~0); // Clear function list Att_RemList(data->function_list,REMLIST_SAVELIST|REMLIST_FREEDATA); // Free existing instructions FreeInstructionList(data->function); // Rebuild display list funced_build_display(data); // Clear flags data->function->function.flags=0; funced_update_flaglist(data); // Clear key data->function->function.code=0xffff; SetGadgetValue(data->objlist,GAD_FUNCED_KEY,0); // Clear label if (startup->flags&FUNCEDF_LABEL) { data->label[0]=0; SetGadgetValue(data->p_objlist,GAD_FUNCED_LABEL,0); } // Paste function in? if (func) { short type; // Save type type=data->function->function.func_type; // Copy function in CopyFunction(func,0,data->function); data->function->function.func_type=type; // Free copied function FreeFunction(func); // Initialise gadgets funced_init_gads(data); } // Clear busy pointer ClearWindowBusy(data->window); } break; // Use case GAD_FUNCED_USE: success=1; // Cancel case GAD_FUNCED_CANCEL: break_flag=1; break; } break; // Key press case IDCMP_RAWKEY: // Help? if (msg.Code==0x5f && !(msg.Qualifier&VALID_QUALIFIERS)) { // Set busy pointer SetWindowBusy(data->window); // Send help command IPC_Command(startup->main_owner,IPC_HELP,(1<<31),"Function Editor",0,REPLY_NO_PORT); // Clear busy pointer ClearWindowBusy(data->window); } break; // BOOPSI message case IDCMP_IDCMPUPDATE: { struct TagItem *tags=(struct TagItem *)msg.IAddress; short item; // Check ID if (GetTagData(GA_ID,0,tags)!=GAD_FUNCED_LISTER) break; // Get item if ((item=GetTagData(DLV_DragNotify,-1,tags))!=-1) { // Start the drag config_drag_start(&data->drag,data->func_display_list,item,tags,TRUE); } } break; // Ticks case IDCMP_INTUITICKS: ++data->drag.tick_count; break; } // Reply to any outstanding message if (gmsg) ReplyWindowMsg(gmsg); } } // AppMessage if (data->appwindow) { struct AppMessage *msg; while ((msg=(struct AppMessage *)GetMsg(data->appport))) { // Make sure window is active ActivateWindow(data->window); // Handle message funced_appmsg(data,msg); ReplyMsg((struct Message *)msg); } } // Check break flag if (break_flag) break; // Wait for message Wait(waitbits); } // Restore CD if (lock) UnLock(CurrentDir(lock)); // Edit successful? if (success) { FunctionReturn ret; // Store changes in function funced_store_edits(data); // Fill out return data ret.object=startup->object; ret.object_flags=startup->object_flags; ret.function=data->function; // Send new function back IPC_Command(startup->owner_ipc,FUNCTIONEDIT_RETURN,0,&ret,0,REPLY_NO_PORT); } // End any drag in progress functioned_end_drag(data,0); // Free edit function FreeFunction(data->function); // Close window RemoveAppWindow(data->appwindow); CloseConfigWindow(data->window); // Close application port if (data->appport) { struct Message *msg; while ((msg=GetMsg(data->appport))) ReplyMsg(msg); DeleteMsgPort(data->appport); } // Say goodbye IPC_Goodbye(ipc,startup->owner_ipc,startup->object_flags); // Delete IPC data Forbid(); IPC_Free(ipc); // Free data funced_cleanup(data); FreeVec(startup); }
void FiletypeEditor(void) { filetype_ed_data *data=0; IPCData *ipc; short success=0,pending_quit=0; BOOL change_flag=0; // Do startup if (!(ipc=Local_IPC_ProcStartup((ULONG *)&data, (APTR)&_filetypeed_init))) return; // Create App stuff if ((data->app_port=CreateMsgPort())) { data->app_window=AddAppWindowA(0,0,data->window,data->app_port,0); } // Get icon image if (data->type->icon_path) { #ifdef USE_DRAWICONSTATE { char *path_copy; data->icon_image=NULL; if ((path_copy=AllocMemH(0,strlen(data->type->icon_path)+1))) { // icon_path is guaranteed to have a .info at the end stccpy(path_copy,data->type->icon_path,strlen(data->type->icon_path)-4); data->icon_image=GetCachedDiskObject(path_copy,0); FreeMemH(path_copy); } } #else data->icon_image=OpenImage(data->type->icon_path,0); #endif // Show icon image filetypeed_show_icon(data); } // Launch class editor immediately? if (data->edit_flag) filetypeed_edit_definition(data); // Message loop FOREVER { IPCMessage *msg; struct IntuiMessage *imsg; short break_flag=0; // Check drag if (config_drag_check(&data->drag)) { // End drag filetypeed_end_drag(data,0); } // Task message? while ((msg=(IPCMessage *)GetMsg(ipc->command_port))) { switch (msg->command) { // Close message? case IPC_QUIT: if (!pending_quit) { success=msg->flags; break_flag=1; } break; // Activate case IPC_ACTIVATE: if (data->window) { WindowToFront(data->window); ActivateWindow(data->window); } break; // Editor saying goodbye case IPC_GOODBYE: { ULONG which; // What's just gone? which=IPC_GetGoodbye(msg); // Class editor? if (which==(ULONG)-1) data->class_editor=0; // Icon menu editor? else if (which>15) { Att_Node *node; // Go through icon list for (node=(Att_Node *)data->icon_list->list.lh_Head; node->node.ln_Succ; node=(Att_Node *)node->node.ln_Succ) { // Match function if (((func_node *)node->data)->func==(Cfg_Function *)which) { // Clear editor pointer ((func_node *)node->data)->editor=0; // Check for invalid function if (filetypeed_check_iconmenu(data,node,FALSE)) change_flag=1; break; } } } // Normal filetype editor else data->editor[which]=0; } break; // Editor returning a function case FUNCTIONEDIT_RETURN: { short ret; if ((ret=filetypeed_receive_edit( data, (FunctionReturn *)msg->data))) { change_flag=1; filetypeed_update_actions(data); if (ret==2) filetypeed_update_iconmenu(data); } } break; // Class editor returning case CLASSEDIT_RETURN: filetypeed_receive_class(data,(Cfg_Filetype *)msg->data); change_flag=1; break; // Get a copy of a button case BUTTONEDIT_CLIP_BUTTON: // Handle this button if (filetypeed_get_button(data,(Cfg_Button *)msg->data,(Point *)msg->data_free)) change_flag=1; break; } // Reply the message IPC_Reply(msg); } // Intuimessage if (data->window) { while ((imsg=GetWindowMsg(data->window->UserPort))) { struct IntuiMessage msg_copy; struct Gadget *gadget; struct TagItem *tags; // Copy message msg_copy=*imsg; // Don't reply to IDCMPUPDATE messages just yet if (imsg->Class!=IDCMP_IDCMPUPDATE) { ReplyWindowMsg(imsg); imsg=0; } // Get gadget and tag pointers gadget=(struct Gadget *)msg_copy.IAddress; tags=(struct TagItem *)gadget; // Look at message switch (msg_copy.Class) { // Close window case IDCMP_CLOSEWINDOW: if (!pending_quit) break_flag=1; break; // Gadget case IDCMP_GADGETUP: switch (gadget->GadgetID) { // Use case GAD_FILETYPEED_USE: success=1; // Cancel case GAD_FILETYPEED_CANCEL: if (!pending_quit) break_flag=1; break; // Select a function case GAD_FILETYPEED_ACTION_LIST: { Att_Node *node; // Get selected node if (!(node=Att_FindNode(data->action_list,msg_copy.Code))) break; // Enable edit action button DisableObject(data->objlist,GAD_FILETYPES_EDIT_ACTION,FALSE); // Double-click? if (!(DoubleClick(data->last_sec,data->last_mic,msg_copy.Seconds,msg_copy.Micros)) || node!=data->last_sel) { data->last_sec=msg_copy.Seconds; data->last_mic=msg_copy.Micros; data->last_sel=node; data->last_icon=0; break; } } // Fall through case GAD_FILETYPES_EDIT_ACTION: // No current selection? if (!data->last_sel) break; // Is editor already up for this action? if (data->editor[data->last_sel->data]) IPC_Command(data->editor[data->last_sel->data],IPC_ACTIVATE,0,0,0,0); // Need to launch editor else filetypeed_edit_action(data,data->last_sel->data,data->last_sel->node.ln_Name); break; // Delete action case GAD_FILETYPES_DEL_ACTION: // No current selection? if (!data->last_sel) break; // Is editor up for this action? if (data->editor[data->last_sel->data]) IPC_Command(data->editor[data->last_sel->data],IPC_QUIT,0,0,0,0); // Delete it if (filetypeed_del_action(data,data->last_sel->data)) change_flag=1; break; // Edit filetype definition case GAD_FILETYPEED_EDIT_CLASS: // Is class editor already up for this action? if (data->class_editor) IPC_Command(data->class_editor,IPC_ACTIVATE,0,0,0,0); // Need to launch editor else filetypeed_edit_definition(data); break; // Select icon case GAD_FILETYPEED_SELECT_ICON: if (filetypeed_pick_icon(data)) change_flag=1; break; // Add to icon menu case GAD_FILETYPES_ADD_ICON_MENU: filetypeed_add_iconmenu(data); break; // Select an icon menu case GAD_FILETYPES_ICON_MENU: { Att_Node *last=data->last_icon; // Handle selection if (!(filetypeed_sel_icon(data,msg_copy.Code))) break; // Double-click? if (data->last_icon!=last || !(DoubleClick( data->last_sec, data->last_mic, msg_copy.Seconds, msg_copy.Micros))) { data->last_sec=msg_copy.Seconds; data->last_mic=msg_copy.Micros; data->last_sel=0; break; } } // Fall through case GAD_FILETYPES_EDIT_ICON_MENU: // No current selection? if (!data->last_icon) break; // Edit it filetypeed_edit_iconmenu(data,data->last_icon); break; // Delete from icon menu case GAD_FILETYPES_DEL_ICON_MENU: // No current selection? if (!data->last_icon) break; // Delete function if (filetypeed_check_iconmenu(data,data->last_icon,TRUE)) change_flag=1; break; } break; // BOOPSI message case IDCMP_IDCMPUPDATE: { short item; // Icon list? if (GetTagData(GA_ID,0,tags)!=GAD_FILETYPES_ICON_MENU) break; // Get item if ((item=GetTagData(DLV_DragNotify,-1,tags))!=-1) { // Handle selection filetypeed_sel_icon(data,item); // Start the drag config_drag_start(&data->drag,data->icon_list,item,tags,TRUE); } } break; // Ticks case IDCMP_INTUITICKS: ++data->drag.tick_count; break; // Mouse move case IDCMP_MOUSEMOVE: // Handle drag move config_drag_move(&data->drag); break; // Mouse buttons case IDCMP_MOUSEBUTTONS: // Valid drag info? if (data->drag.drag) { short ok=-1; // Dropped ok? if (msg_copy.Code==SELECTUP) { // Remember last position data->drag.drag_x=data->window->WScreen->MouseX; data->drag.drag_y=data->window->WScreen->MouseY; ok=1; } // Aborted else if (msg_copy.Code==MENUDOWN) ok=0; // End drag? if (ok!=-1 && filetypeed_end_drag(data,ok)) change_flag=1; } break; // Key press case IDCMP_RAWKEY: // Help? if (msg_copy.Code==0x5f && !(msg_copy.Qualifier&VALID_QUALIFIERS)) { // Set busy pointer SetWindowBusy(data->window); // Send help command IPC_Command(data->func_startup.main_owner,IPC_HELP,(1<<31),"File Type Editor",0,REPLY_NO_PORT); // Clear busy pointer ClearWindowBusy(data->window); } break; } // Reply to outstanding messages if (imsg) ReplyWindowMsg(imsg); } // Check break flag if (break_flag || pending_quit) { // See if all the editors are gone if (IsListEmpty(&data->proc_list.list)) break; // Send quit? if (break_flag) { IPC_ListQuit(&data->proc_list,0,success,FALSE); SetWindowBusy(data->window); } pending_quit=1; } } // AppMessage if (data->app_window) { struct AppMessage *msg; while ((msg=(struct AppMessage *)GetMsg(data->app_port))) { // Got an argument? if (msg->am_NumArgs>0) { char name[256]; short len; APTR image; // Get full name NameFromLock(msg->am_ArgList[0].wa_Lock,name,256); if (msg->am_ArgList[0].wa_Name && *msg->am_ArgList[0].wa_Name) AddPart(name,msg->am_ArgList[0].wa_Name,256); // Add .info if ((len=strlen(name))<6 || stricmp(name+len-5,".info")!=0) strcat(name,".info"); // Try to get image #ifdef USE_DRAWICONSTATE { char *path_copy; image=NULL; if ((path_copy=AllocMemH(0,strlen(name)+1))) { // icon_path is guaranteed to have a .info at the end stccpy(path_copy,name,strlen(name)-4); image=GetCachedDiskObject(path_copy,0); FreeMemH(path_copy); } } #else image=OpenImage(name,0); #endif if (image) { // Store path FreeMemH(data->type->icon_path); if ((data->type->icon_path=AllocMemH(0,strlen(name)+1))) strcpy(data->type->icon_path,name); // Free existing image #ifdef USE_DRAWICONSTATE FreeCachedDiskObject(data->icon_image); #else CloseImage(data->icon_image); #endif data->icon_image=image; // Show new image filetypeed_show_icon(data); change_flag=1; } } // Reply message ReplyMsg((struct Message *)msg); } } Wait(1<<ipc->command_port->mp_SigBit| 1<<data->drag.timer->port->mp_SigBit| ((data->window)?(1<<data->window->UserPort->mp_SigBit):0)| ((data->app_window)?(1<<data->app_port->mp_SigBit):0)); } // End any drag in progress filetypeed_end_drag(data,0); // Need to send button back? if (success==1 && change_flag) { if (IPC_Command( data->owner_ipc, FILETYPEEDIT_RETURN, (ULONG)data->type, data->node, 0, REPLY_NO_PORT)) { data->node=0; } } // Free edit filetype FreeFiletype(data->type); // Remove AppWindow RemoveAppWindow(data->app_window); // Close window CloseConfigWindow(data->window); // Close app port if (data->app_port) { struct Message *msg; while ((msg=GetMsg(data->app_port))) ReplyMsg(msg); DeleteMsgPort(data->app_port); } // Say goodbye IPC_Goodbye(ipc,data->owner_ipc,(success==-1)?0:(ULONG)data->node); // Free icon image #ifdef USE_DRAWICONSTATE FreeCachedDiskObject(data->icon_image); #else CloseImage(data->icon_image); #endif // Close timer FreeTimer(data->drag.timer); // Free data IPC_Free(ipc); Att_RemList(data->action_list,0); Att_RemList(data->icon_list,REMLIST_FREEDATA); FreeVec(data); }
// Show about requester void show_about(struct Screen *screen,IPCData *ipc) { char buf[80],*buffer; struct Library *ModuleBase; Att_List *list; Att_Node *node; // Create list of text if (!(list=Att_NewList(0))) return; // Build lines lsprintf(buf,"%s %ld.%ld %s",dopus_name,5,version_num,version_string); Att_NewNode(list,buf,2,0); Att_NewNode(list,about_1,2,0); Att_NewNode(list,about_2,2,0); // Name of the translator Att_NewNode(list,GetString(&locale,MSG_TRANSLATION_BY_YOUR_NAME),3,0); // Registered? if (GUI->rego.name[0] && GUI->rego.serial_number[0] && atoi(GUI->rego.serial_number)!=(ULONG)GUI->backdrop) { Att_NewNode(list,GetString(&locale,MSG_REGISTERED_TO),1,0); Att_NewNode(list,"",1,0); Att_NewNode(list,GUI->rego.name,1,0); if (GUI->rego.company[0]) Att_NewNode(list,GUI->rego.company,1,0); if (GUI->rego.address1[0]) Att_NewNode(list,GUI->rego.address1,1,0); if (GUI->rego.address2[0]) Att_NewNode(list,GUI->rego.address2,1,0); if (GUI->rego.address3[0]) Att_NewNode(list,GUI->rego.address3,1,0); Att_NewNode(list,"",1,0); strcpy(buf,GetString(&locale,MSG_SERIAL_NUMBER)); strcat(buf,GUI->rego.serial_number); Att_NewNode(list,buf,0,0); } // Unregistered else { Att_NewNode(list,"",1,0); Att_NewNode(list,GetString(&locale,MSG_UNREGISTERED),1,0); Att_NewNode(list,"",0,0); } // Try for external about library if ((ModuleBase=OpenLibrary("dopus5:modules/about.module",0))) { short ret; // Show about ret=Module_Entry((struct List *)list,screen,ipc,&main_ipc,0,0); CloseLibrary(ModuleBase); // If it displayed ok, return if (ret) { Att_RemList(list,0); return; } } // Allocate buffer if (buffer=AllocVec(512,0)) { // Clear buffer buffer[0]=0; // Build about text for (node=(Att_Node *)list->list.lh_Head; node->node.ln_Succ; node=(Att_Node *)node->node.ln_Succ) { // Skip? if (node->data==3) continue; // Add to string strcat(buffer,node->node.ln_Name); if (node->data>0) { strcat(buffer,(node->data==2)?"\n\n":"\n"); } } // Display about text super_request_args( screen, buffer, SRF_SCREEN_PARENT|SRF_IPC, ipc, GetString(&locale,MSG_OKAY),0); // Free buffer FreeVec(buffer); } // Free list Att_RemList(list,0); }
static Att_List *do_read_sites_iff(struct opusftp_globals *og,char *filename,LONG *diskerr) { APTR iff; BOOL err=FALSE; Att_List *list; D(bug("read sites\n")); if (!(list=Att_NewList(LISTF_POOL))) return(NULL); // Open IFF file if ((iff=IFFOpen(filename,IFF_READ,ID_OPUS))) { struct site_entry *e; ULONG chunk; while (!err && (chunk=IFFNextChunk(iff,0))) { if ((e=AllocVec(sizeof(struct site_entry),MEMF_CLEAR))) { int size; int chunksize = 0; if (chunk==ID_FTPSITE_SHORT) size=SMALL_SIZE; else if (chunk==ID_FTPSITE_LONG) size=LARGE_SIZE; else { *diskerr=212; err=TRUE; FreeVec(e); break; } // Adjustment for changed ListFormat size chunksize = (int)IFFChunkSize(iff); if ((chunksize < size) && (size - chunksize == 84)) { if (!(err=(chunksize!=IFFReadChunkBytes(iff,(char *)e,chunksize)))); { char patterns[82] = {'\0'}; int i = 0; CopyMem(e->se_listformat.show_pattern_p, patterns, 80); memset(e->se_listformat.show_pattern_p, 0, 160); for (i = 0; i < 40; i++) { e->se_listformat.show_pattern_p[i] = patterns[i]; e->se_listformat.hide_pattern_p[i] = patterns[i+40]; } } } else err=(size!=IFFReadChunkBytes(iff,(char *)e,size)); if (!err) { #ifdef __AROS__ e->se_anon = AROS_BE2WORD(e->se_anon); e->se_port = AROS_BE2LONG(e->se_port); e->se_has_custom_env = AROS_BE2WORD(e->se_has_custom_env); if (size == LARGE_SIZE) { e->se_env_private.e_retry_count = AROS_BE2LONG(e->se_env_private.e_retry_count); e->se_env_private.e_retry_delay = AROS_BE2LONG(e->se_env_private.e_retry_delay); e->se_env_private.e_list_update = AROS_BE2LONG(e->se_env_private.e_list_update); e->se_env_private.e_timeout = AROS_BE2LONG(e->se_env_private.e_timeout); e->se_env_private.e_script_time = AROS_BE2LONG(e->se_env_private.e_script_time); e->se_env_private.e_indexsize = AROS_BE2LONG(e->se_env_private.e_indexsize); e->se_env_private.bitfield1 = AROS_BE2LONG(e->se_env_private.bitfield1); e->se_env_private.bitfield2 = AROS_BE2LONG(e->se_env_private.bitfield2); } #endif // adjust ptrs for environment // if custom env then set ptr to internal private copy // else set it to point to global ftp default if (e->se_has_custom_env) e->se_env=&e->se_env_private; else e->se_env=&og->og_oc.oc_env; Att_NewNode(list, e->se_name ,(ULONG)e ,0 ); } else FreeVec(e); } else err=TRUE; } // Close file IFFClose(iff); if (!err) return(list); } Att_RemList(list,REMLIST_FREEDATA); if (!*diskerr) *diskerr=IoErr(); return(NULL); }
int LIBFUNC L_Module_Entry( REG(a0, char *argstring), REG(a1, struct Screen *screen), REG(a2, IPCData *ipc), REG(a3, IPCData *main_ipc), REG(d0, ULONG mod_id), REG(d1, EXT_FUNC(func_callback))) { DOpusCallbackInfo info, *infoptr = &info; char filename[300]; FuncArgs *args; // Get callbacks info.dc_Count=DOPUS_HOOK_COUNT; info.dc_RexxCommand=0; info.dc_FileRequest=0; info.dc_GetThemes=0; info.dc_UnlockSource=0; IPC_Command(main_ipc,HOOKCMD_GET_CALLBACKS,0,&info,0,REPLY_NO_PORT); // Must be able to send rexx commands and show file requester if (!info.dc_RexxCommand || !info.dc_FileRequest) return 0; // See if filename is supplied filename[0]=0; if ((args=ParseArgs(func_templates[mod_id],argstring)) && args->FA_Arguments[0]) { strcpy(filename,(char *)args->FA_Arguments[0]); if (!strchr(filename,'/') && !strchr(filename,':')) { lsprintf(filename,"D5THEMES:%s",(IPTR)args->FA_Arguments[0]); } if (mod_id!=CONVERTTHEME && (strlen(filename)<7 || stricmp(filename+strlen(filename)-6,".theme")!=0)) strcat(filename,".theme"); } // No filename? if (!*filename && (mod_id==LOADTHEME || mod_id==CONVERTTHEME)) { FunctionEntry *entry; // Get first entries if ((entry=(FunctionEntry *)func_callback(EXTCMD_GET_ENTRY,IPCDATA(ipc),0))) { struct endentry_packet packet; // Build filename func_callback(EXTCMD_GET_SOURCE,IPCDATA(ipc),filename); AddPart(filename,entry->name,256); // Fill out packet to end entry packet.entry=entry; packet.deselect=1; func_callback(EXTCMD_END_ENTRY,IPCDATA(ipc),&packet); } } // Unlock source lister if (info.dc_UnlockSource) DC_CALL1(infoptr, dc_UnlockSource, DC_REGA0, IPCDATA(ipc)); //DC_UnlockSource(infoptr, IPCDATA(ipc)); //info.dc_UnlockSource(IPCDATA(ipc)); // Save theme? if (mod_id==SAVETHEME || mod_id==BUILDTHEME) { char buf[256]; // Get themes path if (info.dc_GetThemes) DC_CALL1(infoptr, dc_GetThemes, DC_REGA0, buf); //DC_GetThemes(infoptr,buf); //info.dc_GetThemes(buf); else strcpy(buf,"D5THEMES:"); // Get filename if (filename[0] || DC_CALL6(infoptr, dc_FileRequest, DC_REGA0, (struct Window *)screen, DC_REGA1, GetString(locale,(mod_id==SAVETHEME)?MSG_SAVE_THEME_MSG:MSG_BUILD_THEME_MSG), DC_REGA2, buf, DC_REGA3, filename, DC_REGD0, (1<<30)|(1<<31)|FRF_DOSAVEMODE, DC_REGD1, 0)) //DC_FileRequest(infoptr, //info.dc_FileRequest( /* (struct Window *)screen, GetString(locale,(mod_id==SAVETHEME)?MSG_SAVE_THEME_MSG:MSG_BUILD_THEME_MSG), buf, filename, (1<<30)|(1<<31)|FRF_DOSAVEMODE,0))*/ { long res; char *ptr; // Check .theme suffix if (strlen(filename)<7 || stricmp(filename+strlen(filename)-6,".theme")!=0) strcat(filename,".theme"); // Remove spaces for (ptr=FilePart(filename);*ptr;ptr++) if (*ptr==' ') *ptr='_'; // Save theme if ((res=save_theme(screen,&info,filename,(mod_id==BUILDTHEME)?TRUE:FALSE))) { // Build error lsprintf(filename,GetString(locale,MSG_SAVE_ERROR),res); // Show error AsyncRequestTags( ipc, REQTYPE_SIMPLE, 0, 0, 0, AR_Screen,(IPTR)screen, AR_Message,(IPTR)filename, AR_Button,(IPTR)GetString(locale,MSG_OK), TAG_END); } } } // Load theme else if (mod_id==LOADTHEME) { ULONG apply_flags=0; // Flags supplied? if (args) { short num; for (num=0;num<4;num++) { if (args->FA_Arguments[num+1]) apply_flags|=1<<num; } } // No name supplied? if (!filename[0]) { BPTR lock; Att_List *list; Att_Node *node; char *apply_switches[5]; char temp[20]; char path[256]; long err; // Get old apply flags if (!apply_flags && (GetVar("dopus/taf",temp,16,GVF_GLOBAL_ONLY))>0) apply_flags=atoi(temp); // Initial theme path strcpy(path,"D5THEMES:"); if ((lock=Lock(path,ACCESS_READ))) { NameFromLock(lock,path,256); UnLock(lock); } // Get list of themes while ((list=theme_build_list(path))) { // Switches for what to apply apply_switches[0]=GetString(locale,MSG_THEME_APPLY_PALETTE); apply_switches[1]=GetString(locale,MSG_THEME_APPLY_FONTS); apply_switches[2]=GetString(locale,MSG_THEME_APPLY_PICTURES); apply_switches[3]=GetString(locale,MSG_THEME_APPLY_SOUNDS); apply_switches[4]=0; // Show selection list strcpy(filename,path); if ((err=SelectionList( list, 0, screen, GetString(locale,MSG_LOAD_THEME_MSG), -1, SLF_DIR_FIELD|SLF_USE_INITIAL|SLF_SWITCHES|SLF_RETURN_PATH, filename, GetString(locale,MSG_OK), GetString(locale,MSG_CANCEL), apply_switches, &apply_flags))>-1) { // Name selected? if ((node=Att_FindNode(list,err))) { char *ptr; for (ptr=node->node.ln_Name;*ptr;ptr++) if (*ptr==' ') *ptr='_'; lsprintf(filename,"D5THEMES:%s.theme",(IPTR)node->node.ln_Name); } else filename[0]=0; // Save apply flags lsprintf(temp,"%ld",apply_flags); SetEnv("dopus/taf",temp,TRUE); } else if (err!=-1 && filename[0]!=0 && filename[strlen(filename)-1]=='/') filename[0]=0; // Free list Att_RemList(list,0); // Break out? if (err!=-1) break; // Empty path returns to default if (!filename[0]) { // Get themes path if (info.dc_GetThemes) DC_CALL1(infoptr, dc_GetThemes, DC_REGA0, filename); //DC_GetThemes(infoptr,filename); //info.dc_GetThemes(filename); else strcpy(filename,"DOpus5:Themes/"); } // Re-open with new path strcpy(path,filename); // Assign D5THEMES to the new directory if ((lock=Lock(filename,ACCESS_READ)) && !(AssignLock("D5THEMES",lock))) UnLock(lock); } } // File to load? if (filename[0]) { short num; char apply[20],*ptr,command[400],port[40]; // Build apply flags for (num=0,ptr=apply;num<APPLY_LAST;num++) { if (apply_flags&(1<<num)) *(ptr++)=apply_lookup[num]; } *ptr=0; // Get ARexx port name DC_CALL1(infoptr, dc_GetPort, DC_REGA0, port); //DC_GetPort(infoptr,port); //info.dc_GetPort(port); // Build ARexx command to send to DOpus lsprintf(command,"%s %s %s",(IPTR)filename,(IPTR)port,(IPTR)apply); DC_CALL4(infoptr, dc_SendCommand, DC_REGA0, 0, DC_REGA1, command, DC_REGA2, 0, DC_REGD0, COMMANDF_RUN_SCRIPT); //DC_SendCommand(infoptr,0,command,0,COMMANDF_RUN_SCRIPT); //info.dc_SendCommand(0,command,0,COMMANDF_RUN_SCRIPT); } } // Convert theme else if (mod_id==CONVERTTHEME) { // Get filename if (filename[0] || DC_CALL6(infoptr, dc_FileRequest, DC_REGA0, (struct Window *)screen, DC_REGA1, GetString(locale,MSG_CONVERT_THEME_MSG), DC_REGA2, 0, DC_REGA3, filename, DC_REGD0, (1<<30)|(1<<31)|(1<<29)|FRF_DOPATTERNS, DC_REGD1, "#?.theme")) //DC_FileRequest(infoptr, //info.dc_FileRequest( /*(struct Window *)screen, GetString(locale,MSG_CONVERT_THEME_MSG), 0, filename, (1<<30)|(1<<31)|(1<<29)|FRF_DOPATTERNS, "#?.theme"))*/ { char dest[256],buf[256],*ptr; dest[0]=0; if ((args=ParseArgs(func_templates[mod_id],argstring)) && args->FA_Arguments[1]) { strcpy(dest,(char *)args->FA_Arguments[1]); if (!strchr(dest,'/') && !strchr(dest,':')) { lsprintf(dest,"D5THEMES:%s",(IPTR)args->FA_Arguments[0]); } } // Ask for path? if (!dest[0]) { // Get themes path if (info.dc_GetThemes) DC_CALL1(infoptr, dc_GetThemes, DC_REGA0, buf); //DC_GetThemes(infoptr,buf); //info.dc_GetThemes(buf); else strcpy(buf,"D5THEMES:"); } // Get save filename if (dest[0] || DC_CALL6(infoptr, dc_FileRequest, DC_REGA0, (struct Window *)screen, DC_REGA1, GetString(locale,MSG_SAVE_THEME_MSG), DC_REGA2, buf, DC_REGA3, dest, DC_REGD0, (1<<30)|(1<<31)|FRF_DOSAVEMODE, DC_REGD1, 0)) //(DC_FileRequest(infoptr, //(info.dc_FileRequest( /* (struct Window *)screen, GetString(locale,MSG_SAVE_THEME_MSG), buf, dest, (1<<30)|(1<<31)|FRF_DOSAVEMODE,0)))*/ { short res; // Check .theme suffix if (strlen(dest)<7 || stricmp(dest+strlen(dest)-6,".theme")!=0) strcat(dest,".theme"); // Remove spaces for (ptr=FilePart(dest);*ptr;ptr++) if (*ptr==' ') *ptr='_'; // Convert the file if ((res=convert_theme(&info,filename,dest))) { // Build error lsprintf(filename,GetString(locale,MSG_SAVE_ERROR),res); // Show error AsyncRequestTags( ipc, REQTYPE_SIMPLE, 0, 0, 0, AR_Screen,(IPTR)screen, AR_Message,(IPTR)filename, AR_Button,(IPTR)GetString(locale,MSG_OK), TAG_END); } } } } DisposeArgs(args); return 1; }
// Quit the program void quit(BOOL script) { // If main status window is open, close it if (main_status) { CloseProgressWindow(main_status); main_status=0; } if (GUI) { // Clear 'startup' flag for scripts GUI->flags&=~GUIF_DONE_STARTUP; // Close commodities cx_remove(GUI->cx); // Update environment settings env_update_settings(1); // Stop notify request RemoveNotifyRequest(GUI->notify_req); GUI->notify_req=0; // Is there a hide appicon? if (GUI->hide_appicon) { RemoveAppIcon(GUI->hide_appicon); FreeCachedDiskObject(GUI->hide_diskobject); } // Or an appmenuitem? if (GUI->hide_appitem) RemoveAppMenuItem(GUI->hide_appitem); // Launch shutdown script if (script) RunScript(SCRIPT_SHUTDOWN,0); // Set quit flag GUI->flags|=GUIF_PENDING_QUIT; // Shut the display down close_display(CLOSE_ALL,TRUE); // Send quit notifications quit_notify(); // Stop notifications stop_file_notify(GUI->pattern_notify); stop_file_notify(GUI->font_notify); stop_file_notify(GUI->modules_notify); stop_file_notify(GUI->commands_notify); stop_file_notify(GUI->env_notify); stop_file_notify(GUI->desktop_notify); stop_file_notify(GUI->filetype_notify); // Free application port if (GUI->appmsg_port) { DOpusAppMessage *amsg; RemPort(GUI->appmsg_port); while ((amsg=(DOpusAppMessage *)GetMsg(GUI->appmsg_port))) ReplyAppMessage(amsg); DeleteMsgPort(GUI->appmsg_port); GUI->appmsg_port=0; // Remove public semaphore RemSemaphore((struct SignalSemaphore *)&pub_semaphore); } // Flush IPC port IPC_Flush(&main_ipc); // Close all processes IPC_ListQuit(&GUI->lister_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->group_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->buttons_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->startmenu_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->process_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->function_list,&main_ipc,0,TRUE); // Free buffers buffers_clear(0); // Remove all handlers RemFunctionTrap("*","#?"); // Free filetypes FreeMemHandle(GUI->filetype_memory); // Flush the filetype cache ClearFiletypeCache(); // Free lister toolbar FreeToolBar(GUI->toolbar); // Free menus and hotkeys CloseButtonBank(GUI->lister_menu); CloseButtonBank(GUI->hotkeys); // Free user menus CloseButtonBank(GUI->user_menu); FreeVec(GUI->user_menu_data); // Free backdrop list backdrop_free(GUI->backdrop); // Free icons if (GUI->lister_icon) FreeCachedDiskObject(GUI->lister_icon); if (GUI->button_icon) FreeCachedDiskObject(GUI->button_icon); // Free arrow image CloseImage(GUI->toolbar_arrow_image); #ifdef __amigaos3__ FreeVec(arrow_hi_data_chip); FreeVec(arrow_lo_data_chip); FreeVec(small_arrow_chip); FreeVec(big_arrow_chip); #ifndef USE_SCREENTITLE FreeVec(moon_big_data_chip); FreeVec(moon_small_data_chip); #endif FreeVec(command_arrow_chip); FreeVec(parent_arrow_chip); #endif // Free screen signal if (GUI->screen_signal!=-1) FreeSignal(GUI->screen_signal); // Delete notify port if (GUI->notify_port) DeleteMsgPort(GUI->notify_port); // Free position memory FreeMemHandle(GUI->position_memory); // Free command history Att_RemList(GUI->command_history,0); // Delete icon positioning port DeleteMsgPort(GUI->iconpos_port); // Free popup menu PopUpFreeHandle(GUI->desktop_menu); // Clear requester pattern hook in library if (GUI->flags2&GUIF2_BACKFILL_SET) SetReqBackFill(0,0); } // Free scripts FreeScripts(); // Free environment environment_free(environment); // Delete main message ports IPC_Flush(&main_ipc); DeleteMsgPort(main_ipc.command_port); DeleteMsgPort(main_ipc.reply_port); // Pause here for a couple of seconds to let everything clean up Delay(3*50); // Free global data FreeMemHandle(global_memory_pool); // Delete any temporary files delete_temp_files(0); // Free locale data free_locale_data(&locale); // Close input device if (InputBase) { #ifdef __amigaos4__ DropInterface((struct Interface *)IInput); #endif CloseDevice((struct IORequest *)&input_req); } // Close timer device if (TimerBase) { #ifdef __amigaos4__ DropInterface((struct Interface *)ITimer); #endif CloseDevice((struct IORequest *)&timer_req); } // Close console device if (ConsoleDevice) { #ifdef __amigaos4__ DropInterface((struct Interface *)IConsole); #endif CloseDevice((struct IORequest *)&console_req); } // Close libraries #ifdef __amigaos4__ DropInterface((struct Interface *)Imu); #endif CloseLibrary(muBase); #ifndef __amigaos3__ #ifdef __amigaos4__ DropInterface((struct Interface *)INewIcon); #endif CloseLibrary((struct Library *)NewIconBase); #endif #ifdef __amigaos4__ DropInterface((struct Interface *)ICyberGfx); #endif CloseLibrary(CyberGfxBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IAmigaGuide); #endif CloseLibrary(AmigaGuideBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IDataTypes); #endif CloseLibrary(DataTypesBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IAsl); #endif CloseLibrary(AslBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IIcon); #endif CloseLibrary(IconBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IDiskfont); #endif CloseLibrary(DiskfontBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IWorkbench); #endif CloseLibrary(WorkbenchBase); #ifdef __amigaos4__ DropInterface((struct Interface *)ICommodities); #endif CloseLibrary(CxBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IRexxSys); #endif CloseLibrary((struct Library *)RexxSysBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IUtility); #endif CloseLibrary(UtilityBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IGadTools); #endif CloseLibrary(GadToolsBase); #ifdef __amigaos4__ DropInterface((struct Interface *)ILayers); #endif CloseLibrary((struct Library *)LayersBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IGraphics); #endif CloseLibrary((struct Library *)GfxBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IIntuition); #endif CloseLibrary((struct Library *)IntuitionBase); // Restore old current directory? if (old_current_dir) { UnLock(CurrentDir(old_current_dir)); } // Close the dopus5.library #ifdef __amigaos4__ DropInterface((struct Interface *)IDOpus); #endif CloseLibrary(DOpusBase); // Outahere! exit(0); }
short LIBFUNC L_Config_Filetypes( REG(a0, struct Screen *screen), REG(a1, IPCData *ipc), REG(a2, IPCData *owner_ipc), REG(d0, ULONG command_list), REG(a3, char *name)) { config_filetypes_data *data; IPCMessage *quit_msg=0; short undo_flag=0,pending_quit=0; short ret=0,fontsize; struct IBox pos; ConfigWindow dims; // Allocate data and memory handle if (!(data=AllocVec(sizeof(config_filetypes_data),MEMF_CLEAR)) || !(data->memory=NewMemHandle(4096,256,MEMF_CLEAR))) return 0; // Save pointers data->ipc=ipc; data->owner_ipc=owner_ipc; data->command_list=command_list; // Initialise data NewList(&data->list_list); InitListLock(&data->proc_list,0); // Fill in new window data->newwin.parent=screen; data->newwin.dims=&dims; data->newwin.title=GetString(locale,MSG_FILETYPES_TITLE); data->newwin.locale=locale; data->newwin.flags=WINDOW_SCREEN_PARENT|WINDOW_VISITOR|WINDOW_REQ_FILL|WINDOW_AUTO_KEYS|WINDOW_SIZE_BOTTOM; // Get default size dims=_config_filetypes_window; // Get saved position if (LoadPos("dopus/windows/filetypes",&pos,&fontsize)) { dims.char_dim.Width=0; dims.char_dim.Height=0; dims.fine_dim.Width=pos.Width; dims.fine_dim.Height=pos.Height; } // Open window and add objects if (!(data->window=OpenConfigWindow(&data->newwin)) || !(data->objlist=AddObjectList(data->window,_config_filetypes_objects))) { CloseConfigWindow(data->window); FreeMemHandle(data->memory); FreeVec(data); return 0; } // Set minimum size SetConfigWindowLimits(data->window,&_config_filetypes_window,0); // Read filetype list SetWindowBusy(data->window); filetype_read_list(data->memory,&data->list_list); // Build display list filetype_build_list(data); ClearWindowBusy(data->window); // Name to edit? if (name) filetype_edit_name(data,name); // Event loop FOREVER { struct IntuiMessage *msg; IPCMessage *imsg; int quit_flag=0; // Any IPC messages? while ((imsg=(IPCMessage *)GetMsg(ipc->command_port))) { // Look at command switch (imsg->command) { // Quit case IPC_QUIT: quit_flag=1; quit_msg=imsg; imsg=0; data->change=0; break; // Activate case IPC_ACTIVATE: if (data->window) { // Bring window to front WindowToFront(data->window); ActivateWindow(data->window); // Edit name supplied? if (imsg->data) filetype_edit_name(data,(char *)imsg->data); } break; // Process saying goodbye case IPC_GOODBYE: { FiletypeNode *node; // Handle goodbye if ((node=(FiletypeNode *)IPC_GetGoodbye(imsg))) { // Node no longer has an editor node->editor=0; } // All process gone and pending quit? if (pending_quit && (IsListEmpty(&data->proc_list.list))) { quit_flag=1; pending_quit=2; } } break; // Got a filetype back from the editor case FILETYPEEDIT_RETURN: if (filetype_receive_edit( data, (Cfg_Filetype *)imsg->flags, (FiletypeNode *)imsg->data)) { data->change=1; imsg->command=1; } else imsg->command=0; break; } // Reply message IPC_Reply(imsg); // Check quit flag if (quit_flag) break; } // Intuimessages if (data->window) { while ((msg=GetWindowMsg(data->window->UserPort))) { struct IntuiMessage msg_copy; UWORD id; // Copy message and reply msg_copy=*msg; ReplyWindowMsg(msg); if (pending_quit) continue; // Look at message switch (msg_copy.Class) { // Close window case IDCMP_CLOSEWINDOW: quit_flag=1; undo_flag=1; break; // Gadget case IDCMP_GADGETUP: id=((struct Gadget *)msg_copy.IAddress)->GadgetID; switch (id) { // Cancel case GAD_FILETYPES_CANCEL: undo_flag=1; // Use case GAD_FILETYPES_USE: quit_flag=1; break; // Filetype selected case GAD_FILETYPES_LIST: { Att_Node *node; // Enable buttons filetype_able_buttons(data,FALSE); // Get selection if (!(node=Att_FindNode(data->filetype_list,msg_copy.Code))) break; // Double-click? if (node==data->sel_filetype && DoubleClick( data->seconds,data->micros, msg_copy.Seconds,msg_copy.Micros)) { // Launch editor for this filetype filetype_edit(data,(FiletypeNode *)data->sel_filetype->data,0); } // New selection else { data->sel_filetype=node; data->seconds=msg_copy.Seconds; data->micros=msg_copy.Micros; } } break; // Add a new filetype case GAD_FILETYPES_DUPLICATE: if (!data->sel_filetype) break; case GAD_FILETYPES_ADD: { Cfg_FiletypeList *list; Cfg_Filetype *type=0; // Allocate a new filetype list if ((list=AllocMemH(data->memory,sizeof(Cfg_FiletypeList)))) { // Initialise list NewList(&list->filetype_list); // Copy existing filetype? if ((((struct Gadget *)msg_copy.IAddress)->GadgetID== GAD_FILETYPES_DUPLICATE)) { // Copy filetype type=CopyFiletype( ((FiletypeNode *)data->sel_filetype->data)->type, data->memory); } // Allocate a new filetype else if ((type=NewFiletype(data->memory))) { // Initialise name strcpy(type->type.name,GetString(locale,MSG_UNTITLED)); } // Get a filetype? if (type) { // Add filetype list to main list AddTail(&data->list_list,&list->node); // Add filetype to list AddTail(&list->filetype_list,&type->node); // Set list pointer type->list=list; list->flags=FTLISTF_CHANGED; } // Failed else FreeMemH(list); } // Got new filetype? if (type) { Att_Node *node; // Remove existing list SetGadgetChoices( data->objlist, GAD_FILETYPES_LIST, (APTR)~0); // Add entry for this filetype node=filetype_add_entry(data,type); // Handle new nodes filetype_new_node(data,node); } } break; // Edit filetype case GAD_FILETYPES_EDIT: // Valid selection? if (data->sel_filetype) { // Launch editor for this filetype filetype_edit(data,(FiletypeNode *)data->sel_filetype->data,0); } break; // Remove/Store case GAD_FILETYPES_REMOVE: case GAD_FILETYPES_STORE: // Valid selection? if (data->sel_filetype) { short ret; // Remove filetype if ((ret= filetype_remove( data, data->sel_filetype, (id==GAD_FILETYPES_STORE)))==1) { data->change=1; data->sel_filetype=0; } // Quit? else if (ret==-1) { quit_flag=1; } } break; } break; // Key press case IDCMP_RAWKEY: // Help? if (msg_copy.Code==0x5f && !(msg_copy.Qualifier&VALID_QUALIFIERS)) { // Set busy pointer SetWindowBusy(data->window); // Send help command IPC_Command(data->owner_ipc,IPC_HELP,(1<<31),"File Types",0,REPLY_NO_PORT); // Clear busy pointer ClearWindowBusy(data->window); } break; } // Check quit flag if (quit_flag) break; } } // Check quit flag if (quit_flag) { if (!pending_quit) { SetWindowBusy(data->window); if (!(IPC_ListQuit(&data->proc_list,0,!undo_flag,FALSE))) pending_quit=2; else pending_quit=1; } } // Set to break? if (pending_quit==2) { // Save filetypes? if (data->change && !undo_flag) { if (!(ret=filetype_save(data))) { // Abort save/quit ClearWindowBusy(data->window); pending_quit=0; continue; } } break; } // Wait for an event Wait(1<<ipc->command_port->mp_SigBit| ((data->window)?1<<data->window->UserPort->mp_SigBit:0)); } // Save window position if (data->window) { struct IBox pos; pos.Left=data->window->LeftEdge; pos.Top=data->window->TopEdge; pos.Width=data->window->Width-data->window->BorderLeft-data->window->BorderRight; pos.Height=data->window->Height-data->window->BorderTop-data->window->BorderBottom; SavePos("dopus/windows/filetypes",(struct IBox *)&pos,data->window->RPort->TxHeight); } // Close up CloseConfigWindow(data->window); // Free data Att_RemList(data->filetype_list,REMLIST_FREEDATA); FreeMemHandle(data->memory); FreeVec(data); // Reply quit message IPC_Reply(quit_msg); return ret; }
// Cleanup a lister void lister_cleanup(Lister *lister,BOOL bye) { struct Node *node; // Send goodbye message? if (bye) { // Update our position if (!(environment->env->lister_options&LISTEROPTF_SNAPSHOT)) PositionUpdate(lister,0); // Send goodbye message IPC_Goodbye(lister->ipc,&main_ipc,WINDOW_LISTER); } // Is lister iconified? if (lister->appicon) { // Remove AppIcon RemoveAppIcon(lister->appicon); // Free icon FreeDiskObjectCopy(lister->appicon_icon); } // If we still have a progress window, close it lister_progress_off(lister); // Showing a special buffer? if (lister->cur_buffer==lister->special_buffer) { // Return to normal lister->cur_buffer=lister->old_buffer; } // Remove buffer lock if (lister->cur_buffer) { // Get buffer list lock lock_listlock(&GUI->buffer_list,TRUE); // Unlock buffer buffer_clear_lock(lister->cur_buffer,1); // If buffer is empty or buffer count exceeds maximum, free it if (lister->cur_buffer->buf_TotalEntries[0]==0 || GUI->buffer_count>environment->env->settings.max_buffer_count || (environment->env->settings.dir_flags&DIRFLAGS_DISABLE_CACHING)) { // Free buffer lister_free_buffer(lister->cur_buffer); } // Unlock buffer list unlock_listlock(&GUI->buffer_list); } // Free user data while ((node=lister->user_data_list.list.lh_Head)->ln_Succ) { Remove(node); FreeMemH(node); } // Free ports if (lister->app_port) { DOpusAppMessage *msg; while ((msg=(DOpusAppMessage *)GetMsg(lister->app_port))) ReplyAppMessage(msg); DeleteMsgPort(lister->app_port); } // Close font if (lister->font) CloseFont(lister->font); // Free signals if (lister->abort_signal!=-1) FreeSignal(lister->abort_signal); if (lister->hot_name_bit!=-1) FreeSignal(lister->hot_name_bit); // Free timer stuff if (lister->timer_port) { // Close timers FreeTimer(lister->foo_timer); FreeTimer(lister->icon_drag_timer); FreeTimer(lister->busy_timer); FreeTimer(lister->edit_timer); FreeTimer(lister->scroll_timer); // Delete timer port DeleteMsgPort(lister->timer_port); } // Free regions if (lister->title_region) DisposeRegion(lister->title_region); if (lister->refresh_extra) DisposeRegion(lister->refresh_extra); // Free special buffer if (lister->special_buffer) buffer_free(lister->special_buffer); // Free reselection FreeReselect(&lister->reselect); // Free history Att_RemList(lister->path_history,0); // Free popup menu PopUpFreeHandle(lister->lister_tool_menu); // Free toolbar FreeToolBar(lister->toolbar_alloc); // Free IPC data IPC_Free(lister->ipc); // Free lister data lister_free(lister); // Decrement count --main_lister_count; }
void desktop_delete(IPCData *ipc,BackdropInfo *info,BackdropObject *only_one) { short groupcount=0,filecount=0,assigncount=0,othercount=0,dircount=0; BackdropObject *object=0; Att_List *list; Att_Node *node; char buf[100]; // Create list if (!(list=Att_NewList(LISTF_POOL))) return; // Lock backdrop list lock_listlock(&info->objects,0); // Go through backdrop list while ((object=backdrop_next_object(info,object,only_one))) { // Group? if (object->type==BDO_GROUP) ++groupcount; // Assign? else if (object->flags&BDOF_ASSIGN) ++assigncount; // Group object? else if (object->type==BDO_LEFT_OUT && info->flags&BDIF_GROUP) ++filecount; // Desktop object? else if (object->type==BDO_LEFT_OUT && object->flags&BDOF_DESKTOP_FOLDER) { ++othercount; if (object->icon->do_Type==WBDRAWER) ++dircount; } // Something else else continue; // Add to list Att_NewNode(list,0,(ULONG)object,0); } // Unlock backdrop list unlock_listlock(&info->objects); // Nothing to delete? if (IsListEmpty((struct List *)list)) { Att_RemList(list,0); return; } // Build message; start with query strcpy(info->buffer,GetString(&locale,MSG_DESKTOP_REALLY_DELETE)); // Any groups? if (groupcount>0) { lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_GROUPS),groupcount); strcat(info->buffer,buf); } // Or assigns? else if (assigncount>0) { lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_ASSIGNS),assigncount); strcat(info->buffer,buf); } // Any group files? else if (filecount>0) { // Add file count lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_GROUP_OBJECTS),filecount); strcat(info->buffer,buf); } // Desktop objects? if (othercount>0) { BOOL cr=0; // Add CR? if (groupcount>0 || assigncount>0 || filecount>0) cr=1; // Add files if (othercount>dircount) { lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_DESKTOP_FILES),othercount-dircount); if (cr) strcat(info->buffer,"\n"); strcat(info->buffer,buf); cr=1; } // Add dirs if (dircount>0) { lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_DESKTOP_DIRS),dircount); if (cr) strcat(info->buffer,"\n"); strcat(info->buffer,buf); } } // Add question mark strcat(info->buffer,"?"); // Display requester if (!(super_request_args( GUI->screen_pointer, info->buffer, SRF_IPC|SRF_SCREEN_PARENT, ipc, GetString(&locale,MSG_DELETE), GetString(&locale,MSG_CANCEL),0))) { Att_RemList(list,0); return; } // Check owner for refresh if (info->lister) IPC_Command(info->lister->ipc,LISTER_CHECK_REFRESH,0,0,0,REPLY_NO_PORT); // Group objects? if (info->flags&BDIF_GROUP) { // Send command to group IPC_Command(info->ipc,GROUP_DELETE,0,only_one,0,0); } // Otherwise else { // Go through the list for (node=(Att_Node *)list->list.lh_Head; node->node.ln_Succ; node=(Att_Node *)node->node.ln_Succ) { // Lock backdrop list lock_listlock(&info->objects,1); // Get object if ((object=find_backdrop_object(info,(BackdropObject *)node->data))) { // Group? if (object->type==BDO_GROUP) { // Delete this group backdrop_delete_group(info,object); } // Assign? else if (object->flags&BDOF_ASSIGN) { // Copy name, strip trailing colon strcpy(info->buffer+2,object->name); info->buffer[strlen(info->buffer+2)+1]=0; // Delete assign if (AssignLock(info->buffer+2,0)) { // Erase object backdrop_erase_icon(info,object,0); // Remove object backdrop_remove_object(info,object); } } } // Unlock backdrop list unlock_listlock(&info->objects); } } // Free list Att_RemList(list,0); // Recalc backdrop objects backdrop_calc_virtual(info); // Delete other things? if (othercount>0) { // Run delete function icon_function(info,0,0,def_function_delete_quiet,0); } }
// Rename some objects void icon_rename(IPCData *ipc,BackdropInfo *info,BackdropObject *icon) { Att_List *list; Att_Node *node; BackdropObject *object; BOOL save_pos=0; BPTR lock=0,old=0; // Group? if (info->flags&BDIF_GROUP) { GroupData *group; // Get group pointer group=(GroupData *)IPCDATA(info->ipc); // Build directory name lsprintf(info->buffer,"dopus5:groups/%s",group->name); // Lock directory if (!(lock=Lock(info->buffer,ACCESS_READ))) return; // Change directory old=CurrentDir(lock); } // Create list if (!(list=Att_NewList(0))) { if (lock) UnLock(CurrentDir(old)); return; } // Lock backdrop list lock_listlock(&info->objects,0); // Go through backdrop list (backwards, just for the hell of it) for (object=(BackdropObject *)info->objects.list.lh_TailPred; object->node.ln_Pred; object=(BackdropObject *)object->node.ln_Pred) { // Correct type? if (object->type!=BDO_APP_ICON && object->type!=BDO_BAD_DISK && !(object->flags&BDOF_CACHE)) { // Selected or supplied? if ((!icon && object->state) || icon==object) { // Add object to list Att_NewNode( list, (object->flags&BDOF_CUSTOM_LABEL)?object->device_name:object->name, (ULONG)object, 0); if (icon) break; } } } // Unlock backdrop list unlock_listlock(&info->objects); // Go through list of objects for (node=(Att_Node *)list->list.lh_Head; node->node.ln_Succ; node=(Att_Node *)node->node.ln_Succ) { char *name,*origname; BackdropObject *object; short ret,copy=1; BOOL retry,fail=0; if (!(name=AllocVec(512,0))) break; origname=name+256; // Loop on retries do { // Clear retry flag retry=0; // Copy name strcpy(name,node->node.ln_Name); // Build message lsprintf(info->buffer,GetString(&locale,MSG_RENAME_DISK),name); // Strip trailing colon for assigns if (name[(ret=(strlen(name)-1))]==':') name[ret]=0; // Copy original name strcpy(origname,name); // Ask for new name if (!(ret=super_request_args( info->window, info->buffer, SRF_BUFFER|SRF_IPC|SRF_PATH_FILTER|SRF_MOUSE_POS, name,255, ipc, GetString(&locale,MSG_OKAY), GetString(&locale,(node->node.ln_Succ->ln_Succ)?MSG_SKIP:MSG_CANCEL), (node->node.ln_Succ->ln_Succ)?GetString(&locale,MSG_CANCEL):0,0))) { // Cancel fail=1; break; } // Ok to rename? else if (ret!=2) { // Lock backdrop list lock_listlock(&info->objects,0); // Is object still valid?> if ((object=find_backdrop_object(info,(BackdropObject *)node->data))) { // Object in a group? if (info->flags&BDIF_GROUP) { // Must have custom label if (object->flags&BDOF_CUSTOM_LABEL) { // Try to rename object if (Rename(object->device_name,name)) { // Store new name strcpy(object->device_name,name); ret=1; copy=0; } } } // Assign? else if (object->flags&BDOF_ASSIGN) { BPTR lock; // Lock the assign if ((lock=Lock(object->name,ACCESS_READ))) { // Assign the new name to it while (!(ret=AssignLock(name,lock))) { // Failed, display requester if (!(error_request( info->window, ERF_MOUSE, GetString(&locale,MSG_RENAMING), -1, object->name, ":", 0))) break; } // Success? if (ret) { // Delete the old assignment AssignLock(origname,0); } // Otherwise free the lock else UnLock(lock); } } // Disk? else if (object->type==BDO_DISK) { // Try to relabel while (!(ret=OriginalRelabel(object->device_name,name))) { // Failed, display requester if (!(error_request( info->window, ERF_MOUSE, GetString(&locale,MSG_RENAMING), -1, object->name, ":", 0))) break; } // Success? if (ret) { // Pass name change through to things notify_disk_name_change(info,object->device_name,name); } } // Group, desktop folder else if (object->type==BDO_GROUP || (object->type==BDO_LEFT_OUT && object->flags&BDOF_DESKTOP_FOLDER)) { BPTR old=0,lock; // Change directory if ((lock=Lock(object->path,ACCESS_READ))) old=CurrentDir(lock); // Rename file if (!(ret=Rename(object->name,name))) { // Show error requester if (error_request( info->window, ERF_MOUSE, GetString(&locale,MSG_RENAMING), -1, object->name, ":", 0)) { // Set flag to retry retry=1; } } // Success? if (ret) { GroupData *group; // Add .infos on strcpy(info->buffer,object->name); strcat(info->buffer,".info"); strcpy(info->buffer+300,name); strcat(info->buffer+300,".info"); // Rename icon Rename(info->buffer,info->buffer+300); // Group? if (object->type==BDO_GROUP) { // Lock process list lock_listlock(&GUI->group_list,0); // See if group is open if ((group=backdrop_find_group(object))) { char *name_copy; // Get a copy of the name if ((name_copy=AllocVec(strlen(name)+1,0))) { // Signal it to update its name strcpy(name_copy,name); IPC_Command(group->ipc,GROUP_NEW_NAME,0,0,name_copy,0); } } // Unlock process list unlock_listlock(&GUI->group_list); } } // Restore directory if (lock) UnLock(CurrentDir(old)); } // Left-out else if (object->type==BDO_LEFT_OUT) { leftout_record *left; // Lock position list lock_listlock(&GUI->positions,0); // Look for entry for icon for (left=(leftout_record *)&GUI->positions.list.lh_Head; left->node.ln_Succ; left=(leftout_record *)left->node.ln_Succ) { // Leftout? if (left->node.ln_Type==PTYPE_LEFTOUT) { // Match this icon? if (object->misc_data==(ULONG)left) { // Store new label stccpy(left->icon_label,name,sizeof(left->icon_label)); save_pos=1; break; } } } // Unlock position list unlock_listlock(&GUI->positions); // Store name in icon if (object->flags&BDOF_CUSTOM_LABEL) { strcpy(object->device_name,name); ret=1; copy=0; } } // Successful? if (ret) { // Erase object backdrop_erase_icon(info,object,0); // Store new name if (copy) { strcpy(object->name,name); if (object->flags&BDOF_ASSIGN) strcat(object->name,":"); } // Show new object backdrop_render_object(info,object,BRENDERF_CLIP); } } // Unlock backdrop list unlock_listlock(&info->objects); } } while (retry); // Abort? FreeVec(name); if (fail) break; } // Free list Att_RemList(list,0); // Lock backdrop list lock_listlock(&info->objects,0); // Save any left-outs if (save_pos) { // Lock list lock_listlock(&GUI->positions,0); // Save list SavePositions(&GUI->positions.list,GUI->position_name); // Unlock list unlock_listlock(&GUI->positions); } // Unlock backdrop list unlock_listlock(&info->objects); // Restore CD if (lock) UnLock(CurrentDir(old)); }