// Check for DOPUS5: assignments void startup_check_assign() { BPTR lock; #if !defined(__amigaos3__) && !defined(__amigaos4__) // See if we have a DOPUS5: lock if ((lock=Lock("DOPUS5:",ACCESS_READ))) UnLock(lock); // We don't; assign it to PROGDIR: else #endif if ((lock=DupLock(GetProgramDir()))) { if (!(AssignLock("DOPUS5",lock))) UnLock(lock); } // See if we have a D5THEMES: lock if ((lock=Lock("D5THEMES:",ACCESS_READ))) UnLock(lock); // We don't; assign it to DOpus5:Themes else if ((lock=Lock("DOpus5:Themes",ACCESS_READ))) { if (!(AssignLock("D5THEMES",lock))) UnLock(lock); } }
// Assign the themes directory void env_fix_themes() { BPTR lock; if (!environment->env->themes_location[0]) strcpy(environment->env->themes_location,"DOpus5:Themes/"); if ((lock=Lock(environment->env->themes_location,ACCESS_READ)) && !AssignLock("D5THEMES",lock)) UnLock(lock); }
/* * Creates peudo DEV:DFx files. */ void initpseudodevices(void) { ULONG lock; int i; pseudo_dev_created = 0; pseudo_dev_assigned = 0; for(i=0;i<4;++i) dfx_done[i]=0; /* check if dev: already exists */ set_req(0);lock = Lock(amiga_dev_path,SHARED_LOCK);set_req(1); if(!lock) { char name[80]; set_req(0);lock = Lock(pseudo_dev_path,SHARED_LOCK);set_req(1); if(!lock) { /* create it */ lock = CreateDir(pseudo_dev_path); if(!lock) goto fail; UnLock(lock);lock = Lock(pseudo_dev_path,SHARED_LOCK); pseudo_dev_created = 1; } strcpy(name,amiga_dev_path); if(*name && name[strlen(name)-1]==':') name[strlen(name)-1]='\0'; if(!AssignLock(name,lock)) {UnLock(lock);goto fail;} /* the lock is the assign now */ pseudo_dev_assigned = 1; } else UnLock(lock); /* Create the dev:DFi entry */ for(i=0;i<4;++i) if(device_exists("trackdisk.device",i)) { ULONG fd; char name[80]; sprintf(name,"%sDF%d",amiga_dev_path,i); fd = Open(name,MODE_NEWFILE); if(fd) {Close(fd);dfx_done[i]=1;} } return; fail: fprintf(stderr,"Failed to create pseudo dev: entry!\n"); }
/* * Cleanup pseudo DEV:DFx */ void closepseudodevices(void) { int i; for(i=0;i<4;++i) if(dfx_done[i]) { char name[80]; sprintf(name,"%sDF%d",amiga_dev_path,i); DeleteFile(name); dfx_done[i] = 0; } if(pseudo_dev_assigned) { char name[80]; strcpy(name,amiga_dev_path); if(*name && name[strlen(name)-1]==':') name[strlen(name)-1]='\0'; AssignLock (name, (BPTR)NULL); pseudo_dev_assigned = 0; } if(pseudo_dev_created) { DeleteFile(pseudo_dev_path); pseudo_dev_created = 0; } }
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; }
LONG DoNameAsynch(struct IOFileSys *iofs, STRPTR name, struct DosLibrary *DOSBase) { STRPTR volname, pathname, s1 = NULL; BPTR cur, lock = (BPTR)NULL; struct DosList *dl; struct Device *device; struct Unit *unit; struct FileHandle *fh; struct Process *me = (struct Process *)FindTask(NULL); if (!Strnicmp(name, "PROGDIR:", 8) && me->pr_HomeDir) { cur = me->pr_HomeDir; volname = NULL; pathname = name + 8; } else if (*name == ':') { cur = me->pr_CurrentDir; volname = NULL; pathname = name + 1; } else { /* Copy volume name */ cur = me->pr_CurrentDir; s1 = name; pathname = name; volname = NULL; while (*s1) { if (*s1++ == ':') { volname = (STRPTR)AllocMem(s1-name, MEMF_ANY); if (volname == NULL) { return ERROR_NO_FREE_STORE; } CopyMem(name, volname, s1 - name - 1); volname[s1 - name - 1] = '\0'; pathname = s1; break; } } } if (!volname && !cur && !DOSBase->dl_SYSLock) { return ERROR_OBJECT_NOT_FOUND; } dl = LockDosList(LDF_ALL | LDF_READ); if (volname != NULL) { /* Find logical device */ dl = FindDosEntry(dl, volname, LDF_ALL); if (dl == NULL) { UnLockDosList(LDF_ALL | LDF_READ); FreeMem(volname, s1 - name); return ERROR_DEVICE_NOT_MOUNTED; } else if (dl->dol_Type == DLT_LATE) { lock = Lock(dl->dol_misc.dol_assign.dol_AssignName, SHARED_LOCK); UnLockDosList(LDF_ALL | LDF_READ); if (lock != NULL) { AssignLock(volname, lock); dl = LockDosList(LDF_ALL | LDF_READ); dl = FindDosEntry(dl, volname, LDF_ALL); if (dl == NULL) { UnLockDosList(LDF_ALL | LDF_READ); FreeMem(volname, s1 - name); return ERROR_DEVICE_NOT_MOUNTED; } device = dl->dol_Ext.dol_AROS.dol_Device; unit = dl->dol_Ext.dol_AROS.dol_Unit; } else { FreeMem(volname, s1 - name); return IoErr(); } } else if (dl->dol_Type == DLT_NONBINDING) { lock = Lock(dl->dol_misc.dol_assign.dol_AssignName, SHARED_LOCK); fh = (struct FileHandle *)BADDR(lock); if (fh != NULL) { device = fh->fh_Device; unit = fh->fh_Unit; } else { UnLockDosList(LDF_ALL | LDF_READ); FreeMem(volname, s1 - name); return IoErr(); } } else { device = dl->dol_Ext.dol_AROS.dol_Device; unit = dl->dol_Ext.dol_AROS.dol_Unit; } } else if (cur) { fh = (struct FileHandle *)BADDR(cur); device = fh->fh_Device; unit = fh->fh_Unit; } else { #if 0 /* stegerg: ?? */ device = DOSBase->dl_NulHandler; unit = DOSBase->dl_NulLock; #else fh = (struct FileHandle *)BADDR(DOSBase->dl_SYSLock); device = fh->fh_Device; unit = fh->fh_Unit; #endif } iofs->IOFS.io_Device = device; iofs->IOFS.io_Unit = unit; iofs->io_Union.io_NamedFile.io_Filename = pathname; if (volname != NULL) { FreeMem(volname, s1 - name); } return 0; }
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)); }