// See if a group is open GroupData *backdrop_find_group(BackdropObject *object) { IPCData *ipc; // Go through processes (list must be locked) for (ipc=(IPCData *)GUI->group_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Is this a group process? if (ipc->proc && ipc->proc->pr_Task.tc_Node.ln_Name && strcmp(ipc->proc->pr_Task.tc_Node.ln_Name,"dopus_group")==0) { // Is it the group for this icon? if (((GroupData *)IPCDATA(ipc))->object==object) { GroupData *group=(GroupData *)IPCDATA(ipc); // If window is open, update window position if (group->window) group->dimensions=*((struct IBox *)&group->window->LeftEdge); // Return pointer to group return group; } } } // Not found return 0; }
// Do a global datestamp update void update_lister_global(char *path) { IPCData *ipc; Lister *lister; // Lock lister list lock_listlock(&GUI->lister_list,0); // Go through listers for (ipc=(IPCData *)GUI->lister_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Get lister lister=IPCDATA(ipc); // Compare path if (stricmp(lister->cur_buffer->buf_Path,path)==0) { // Send update command lister_command(lister,LISTER_UPDATE_STAMP,0,0,0,0); } } // Unlock lister list unlock_listlock(&GUI->lister_list); }
// Save from button editor void buttons_edit_defaults(ULONG id) { IPCData *ipc; // Lock buttons list lock_listlock(&GUI->buttons_list,FALSE); // Go through button banks for (ipc=(IPCData *)GUI->buttons_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Get buttons pointer Buttons *buttons=IPCDATA(ipc); // Is this the bank being edited, and is it a toolbar? if (buttons->editor && buttons->flags&BUTTONF_TOOLBAR) { // Send command to button bank IPC_Command(buttons->ipc,id,0,0,0,0); break; } } // Unlock buttons list unlock_listlock(&GUI->buttons_list); }
// Save from button editor void buttons_edit_save(ULONG id) { IPCData *ipc; // Lock buttons list lock_listlock(&GUI->buttons_list,FALSE); // Go through button banks for (ipc=(IPCData *)GUI->buttons_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Get buttons pointer Buttons *buttons=IPCDATA(ipc); // Is this the bank being edited? if (buttons->editor) { // Send command to button bank IPC_Command( buttons->ipc, (id==BUTTONEDIT_MENU_SAVE)?BUTTONS_SAVE:BUTTONS_SAVEAS, 0, 0, 0, 0); break; } } // Unlock buttons list unlock_listlock(&GUI->buttons_list); }
// Send an ARexx command long __asm __saveds HookRexxCommand( register __a0 char *command, register __a1 char *result, register __d0 long length, register __a2 struct MsgPort *replyport, register __d1 ULONG flags) { struct MsgPort *rexx,*reply; struct RexxMsg *msg; long rc=-1; // Clear result if (result) *result=0; // Get rexx port if (!GUI->rexx_proc || !(rexx=(struct MsgPort *)IPCDATA(GUI->rexx_proc))) return -1; // Create reply port if needed if ((reply=replyport) || (reply=CreateMsgPort())) { // Create message if (msg=BuildRexxMsgExTags( reply, ".dopus5", rexx->mp_Node.ln_Name, RexxTag_Arg0,command, TAG_END)) { // Initialise message msg->rm_Action|=1|RXCOMM; if (result) msg->rm_Action|=RXFF_RESULT; // Send the message and wait for reply PutMsg(rexx,(struct Message *)msg); WaitPort(reply); GetMsg(reply); // String reply? if (msg->rm_Result2 && result) stccpy(result,(char *)msg->rm_Result2,length); rc=msg->rm_Result1; // Free message FreeRexxMsgEx(msg); } // Free message port if (reply!=replyport) DeleteMsgPort(reply); } return rc; }
LIBFUNC ULONG SAVEDS ASM L_ProgressHook(REG(a0, struct Hook *hook), REG(a2, int skip),REG(a1, struct xadProgressInfo *xpi)) { struct xoData *data = hook->h_Data; /*struct Library *DOpusBase; struct DosLibrary *DOSBase; struct Library *UtilityBase;*/ // struct TagItem tags[] = {{PW_FileDone, 0, TAG_DONE}}; struct TagItem tags[] = {{PW_FileDone, 0}, {TAG_DONE}}; /* struct TagItem reqtags[]={AR_Window,0,AR_Message,0, AR_Button,0, AR_Button,0, AR_Button,0, AR_Button,0, AR_Button,0, AR_Button,0, TAG_DONE};*/ ULONG ret = XADPIF_OK; LONG rc; char mess[200]; DOpusCallbackInfo *infoptr = &data->hook; tags[0].ti_Data = xpi->xpi_CurrentSize; /*if(!(DOpusBase=data->DOpusBase)) return(0); if(!(DOSBase=data->DOSBase)) return(0); if(!(UtilityBase=data->UtilityBase)) return(0);*/ SetProgressWindow(data->ptr, tags); switch(xpi->xpi_Mode) { case XADPMODE_ERROR: { sprintf(data->buf,"lister request %s \"%s\" %s|%s", data->lists, xadGetErrorText(xpi->xpi_Error), DOpusGetString(data->locale, MSG_OK), DOpusGetString(data->locale, MSG_ABORT)); if (!DC_CALL4(infoptr, dc_SendCommand, DC_REGA0, IPCDATA(data->ipc), DC_REGA1, data->buf, DC_REGA2, NULL, DC_REGD0, 0)) //if(!data->hook.dc_SendCommand(IPCDATA(data->ipc), data->buf, NULL, NULL)) ret &= ~XADPIF_OK; break; } case XADPMODE_ASK: { if(xpi->xpi_Status & XADPIF_OVERWRITE) { if(data->All == TRUE) { ret |= XADPIF_OVERWRITE; break; } else if(data->All == FALSE) break; sprintf(mess, DOpusGetString(data->locale, MSG_EXISTS_FORM), FilePart(xpi->xpi_FileName)); /* reqtags[0].ti_Data = (ULONG) data->listw; reqtags[1].ti_Data = (ULONG) mess; reqtags[2].ti_Data = (ULONG) DOpusGetString(data->locale,MSG_REPLACE); reqtags[3].ti_Data = (ULONG) DOpusGetString(data->locale,MSG_REPLACE_ALL); reqtags[4].ti_Data = (ULONG) DOpusGetString(data->locale,MSG_SKIP); reqtags[5].ti_Data = (ULONG) DOpusGetString(data->locale,MSG_SKIP_ALL); reqtags[6].ti_Data = (ULONG) DOpusGetString(data->locale,MSG_ABORT); AsyncRequest(IPCDATA(data->ipc),REQTYPE_SIMPLE,NULL,NULL,NULL,reqtags); */ sprintf(data->buf, "lister request %s \"%s\" %s|%s|%s|%s|%s", data->lists, mess, DOpusGetString(data->locale, MSG_REPLACE), DOpusGetString(data->locale, MSG_REPLACE_ALL), DOpusGetString(data->locale, MSG_SKIP), DOpusGetString(data->locale, MSG_SKIP_ALL), DOpusGetString(data->locale, MSG_ABORT)); rc = DC_CALL4(infoptr, dc_SendCommand, DC_REGA0, IPCDATA(data->ipc), DC_REGA1, data->buf, DC_REGA2, NULL, DC_REGD0, 0); //rc = data->hook.dc_SendCommand(IPCDATA(data->ipc), data->buf, NULL, NULL); if(!rc) ret = 0; else { if(rc <= 2) ret |= XADPIF_OVERWRITE; if(rc == 2) data->All = TRUE; else if(rc == 4) data->All = FALSE; } } break; } } return ret; }
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; }
// Save an environment int environment_save(Cfg_Environment *env,char *name,short snapshot,CFG_ENVR *data) { APTR iff; long success=0; struct OpenEnvironmentData *opendata=0; #ifdef __AROS__ CFG_ENVR *env_be; #endif // Invalid name? if (!name || !*name) return 0; // Get data pointer if not supplied if (!data) data=env->env; #ifdef __AROS__ if (!(env_be=AllocVec(sizeof(CFG_ENVR),MEMF_CLEAR))) return 0; #endif // Update main window position if (snapshot&ENVSAVE_WINDOW) { GetSemaphore(&GUI->backdrop->window_lock,SEMF_SHARED,0); display_store_pos(); FreeSemaphore(&GUI->backdrop->window_lock); } // Not snapshotting listers? if (!(snapshot&ENVSAVE_LAYOUT)) { if ((opendata=AllocMemH(env->volatile_memory,sizeof(struct OpenEnvironmentData)))) { opendata->memory=env->desktop_memory; opendata->volatile_memory=env->volatile_memory; opendata->flags=OEDF_BANK|OEDF_LSTR; OpenEnvironment(name,opendata); } } // Try to open file to write while ((iff=IFFOpen(name,MODE_NEWFILE,ID_EPUS))) { IPCData *ipc; Lister *lister; Buttons *buttons; Cfg_Desktop *desk; struct MinNode *node; Cfg_SoundEntry *sound; // Write environment settings #ifdef __AROS__ CopyMem(data,env_be,sizeof(CFG_ENVR)); { int i; env_be->screen_mode = AROS_LONG2BE(env_be->screen_mode); env_be->screen_flags = AROS_WORD2BE(env_be->screen_flags); env_be->screen_depth = AROS_WORD2BE(env_be->screen_depth); env_be->screen_width = AROS_WORD2BE(env_be->screen_width); env_be->screen_height = AROS_WORD2BE(env_be->screen_height); for (i=0; i<50; i++) env_be->palette[i] = AROS_LONG2BE(env_be->palette[i]); env_be->window_pos.Left = AROS_WORD2BE(env_be->window_pos.Left); env_be->window_pos.Top = AROS_WORD2BE(env_be->window_pos.Top); env_be->window_pos.Width = AROS_WORD2BE(env_be->window_pos.Width); env_be->window_pos.Height = AROS_WORD2BE(env_be->window_pos.Height); env_be->general_screen_flags = AROS_LONG2BE(env_be->general_screen_flags); env_be->palette_count = AROS_WORD2BE(env_be->palette_count); for (i=0; i<CUST_PENS; i++) { env_be->env_Colours[i][0][0] = AROS_LONG2BE(env_be->env_Colours[i][0][0]); env_be->env_Colours[i][0][1] = AROS_LONG2BE(env_be->env_Colours[i][0][1]); env_be->env_Colours[i][0][2] = AROS_LONG2BE(env_be->env_Colours[i][0][2]); env_be->env_Colours[i][1][0] = AROS_LONG2BE(env_be->env_Colours[i][1][0]); env_be->env_Colours[i][1][1] = AROS_LONG2BE(env_be->env_Colours[i][1][1]); env_be->env_Colours[i][1][2] = AROS_LONG2BE(env_be->env_Colours[i][1][2]); } env_be->env_ColourFlag = AROS_LONG2BE(env_be->env_ColourFlag); env_be->env_NewIconsFlags = AROS_LONG2BE(env_be->env_NewIconsFlags); env_be->display_options = AROS_WORD2BE(env_be->display_options); env_be->main_window_type = AROS_WORD2BE(env_be->main_window_type); env_be->hotkey_flags = AROS_WORD2BE(env_be->hotkey_flags); env_be->hotkey_code = AROS_WORD2BE(env_be->hotkey_code); env_be->hotkey_qual = AROS_WORD2BE(env_be->hotkey_qual); env_be->default_stack = AROS_LONG2BE(env_be->default_stack); env_be->lister_options = AROS_WORD2BE(env_be->lister_options); env_be->flags = AROS_LONG2BE(env_be->flags); env_be->lister_popup_code = AROS_WORD2BE(env_be->lister_popup_code); env_be->lister_popup_qual = AROS_WORD2BE(env_be->lister_popup_qual); env_be->env_flags = AROS_LONG2BE(env_be->env_flags); env_be->clock_left = AROS_WORD2BE(env_be->clock_left); env_be->clock_top = AROS_WORD2BE(env_be->clock_top); env_be->lister_width = AROS_WORD2BE(env_be->lister_width); env_be->lister_height = AROS_WORD2BE(env_be->lister_height); env_be->version = AROS_WORD2BE(env_be->version); env_be->desktop_flags = AROS_LONG2BE(env_be->desktop_flags); for (i=0; i<4; i++) env_be->env_BackgroundFlags[i] = AROS_WORD2BE(env_be->env_BackgroundFlags[i]); env_be->settings.copy_flags = AROS_LONG2BE(env_be->settings.copy_flags); env_be->settings.delete_flags = AROS_LONG2BE(env_be->settings.delete_flags); env_be->settings.error_flags = AROS_LONG2BE(env_be->settings.error_flags); env_be->settings.general_flags = AROS_LONG2BE(env_be->settings.general_flags); env_be->settings.icon_flags = AROS_LONG2BE(env_be->settings.icon_flags); env_be->settings.replace_method = AROS_WORD2BE(env_be->settings.replace_method); env_be->settings.replace_flags = AROS_WORD2BE(env_be->settings.replace_flags); env_be->settings.update_flags = AROS_LONG2BE(env_be->settings.update_flags); env_be->settings.dir_flags = AROS_LONG2BE(env_be->settings.dir_flags); env_be->settings.view_flags = AROS_LONG2BE(env_be->settings.view_flags); env_be->settings.max_buffer_count = AROS_WORD2BE(env_be->settings.max_buffer_count); env_be->settings.date_format = AROS_WORD2BE(env_be->settings.date_format); env_be->settings.date_flags = AROS_WORD2BE(env_be->settings.date_flags); env_be->settings.pop_code = AROS_WORD2BE(env_be->settings.pop_code); env_be->settings.pop_qual = AROS_WORD2BE(env_be->settings.pop_qual); env_be->settings.pop_qual_mask = AROS_WORD2BE(env_be->settings.pop_qual_mask); env_be->settings.pop_qual_same = AROS_WORD2BE(env_be->settings.pop_qual_same); env_be->settings.popup_delay = AROS_WORD2BE(env_be->settings.popup_delay); env_be->settings.max_openwith = AROS_WORD2BE(env_be->settings.max_openwith); env_be->settings.command_line_length = AROS_WORD2BE(env_be->settings.command_line_length); env_be->settings.max_filename = AROS_WORD2BE(env_be->settings.max_filename); env_be->settings.flags = AROS_LONG2BE(env_be->settings.flags); for (i=0; i<4; i++) env_be->env_BackgroundBorderColour[i] = AROS_LONG2BE(env_be->env_BackgroundBorderColour[i]); } if (!(IFFWriteChunk(iff,env_be,ID_ENVR,sizeof(CFG_ENVR)))) #else if (!(IFFWriteChunk(iff,data,ID_ENVR,sizeof(CFG_ENVR)))) #endif { success=IoErr(); break; } // Write some path names if ((success=write_env_string(iff,env->toolbar_path,ID_TBAR)) || (success=write_env_string(iff,env->menu_path,ID_LMEN)) || (success=write_env_string(iff,env->user_menu_path,ID_UMEN)) || (success=write_env_string(iff,env->scripts_path,ID_SCRP)) || (success=write_env_string(iff,env->hotkeys_path,ID_HKEY))) break; // Not snapshotting? if (!(snapshot&ENVSAVE_LAYOUT) && opendata) { ButtonBankNode *button; OpenListerNode *lister; // Go through existing listers for (lister=(OpenListerNode *)opendata->listers.mlh_Head; lister->node.ln_Succ;) { OpenListerNode *next=(OpenListerNode *)lister->node.ln_Succ; // Write lister data if (!(SaveListerDef(iff,(Cfg_Lister *)lister->lister))) break; // Remove this node, get next Remove((struct Node *)lister); lister=next; } // Go through buttons to open for (button=(ButtonBankNode *)opendata->buttons.mlh_Head; button->node.ln_Succ;) { ButtonBankNode *next=(ButtonBankNode *)button->node.ln_Succ; ULONG pad[5]; #ifdef __AROS__ struct IBox pos_be; #endif // Write bank header if (!(IFFPushChunk(iff,ID_BANK))) break; // Fill out padding pad[0]=0; pad[1]=0; pad[2]=button->icon_pos_x; pad[3]=button->icon_pos_y; pad[4]=button->flags&BUTTONF_ICONIFIED; #ifdef __AROS__ CopyMem(&button->pos,&pos_be,sizeof(struct IBox)); pos_be.Left = AROS_WORD2BE(pos_be.Left); pos_be.Top = AROS_WORD2BE(pos_be.Top); pos_be.Width = AROS_WORD2BE(pos_be.Width); pos_be.Height = AROS_WORD2BE(pos_be.Height); pad[2] = AROS_LONG2BE(pad[2]); pad[3] = AROS_LONG2BE(pad[3]); pad[4] = AROS_LONG2BE(pad[4]); if (!(IFFWriteChunkBytes(iff,pad,sizeof(pad))) || !(IFFWriteChunkBytes(iff,&pos_be,sizeof(struct IBox))) || !(IFFWriteChunkBytes(iff,button->node.ln_Name,strlen(button->node.ln_Name)+1)) || !(IFFPopChunk(iff))) break; #else // Write padding and position and path if (!(IFFWriteChunkBytes(iff,pad,sizeof(pad))) || !(IFFWriteChunkBytes(iff,&button->pos,sizeof(struct IBox))) || !(IFFWriteChunkBytes(iff,button->node.ln_Name,strlen(button->node.ln_Name)+1)) || !(IFFPopChunk(iff))) break; #endif // Remove this node, get next Remove((struct Node *)button); button=next; } // Go through StartMenus to open for (button=(ButtonBankNode *)opendata->startmenus.mlh_Head; button->node.ln_Succ;) { ButtonBankNode *next=(ButtonBankNode *)button->node.ln_Succ; ULONG pad[5]; #ifdef __AROS__ struct IBox pos_be; #endif // Write bank header if (!(IFFPushChunk(iff,ID_STRT))) break; // Fill out padding pad[0]=0; pad[1]=0; pad[2]=button->icon_pos_x; pad[3]=button->icon_pos_y; pad[4]=button->flags; #ifdef __AROS__ CopyMem(&button->pos,&pos_be,sizeof(struct IBox)); pos_be.Left = AROS_WORD2BE(pos_be.Left); pos_be.Top = AROS_WORD2BE(pos_be.Top); pos_be.Width = AROS_WORD2BE(pos_be.Width); pos_be.Height = AROS_WORD2BE(pos_be.Height); pad[2] = AROS_LONG2BE(pad[2]); pad[3] = AROS_LONG2BE(pad[3]); pad[4] = AROS_LONG2BE(pad[4]); if (!(IFFWriteChunkBytes(iff,pad,sizeof(pad))) || !(IFFWriteChunkBytes(iff,&pos_be,sizeof(struct IBox))) || !(IFFWriteChunkBytes(iff,button->node.ln_Name,strlen(button->node.ln_Name)+1)) || !(IFFPopChunk(iff))) break; #else // Write padding and position and path if (!(IFFWriteChunkBytes(iff,pad,sizeof(pad))) || !(IFFWriteChunkBytes(iff,&button->pos,sizeof(struct IBox))) || !(IFFWriteChunkBytes(iff,button->node.ln_Name,strlen(button->node.ln_Name)+1)) || !(IFFPopChunk(iff))) break; #endif // Remove this node, get next Remove((struct Node *)button); button=next; } } // Otherwise, snapshotting current layout else { // Lock lister list lock_listlock(&GUI->lister_list,FALSE); // Write lister definitions for (ipc=(IPCData *)GUI->lister_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Get lister lister=IPCDATA(ipc); // Valid lister definition? if (lister->lister) { // Update lister lister_update(lister); // Write lister data if (!(SaveListerDef(iff,lister->lister))) break; } } // Unlock lister list unlock_listlock(&GUI->lister_list); // Fail? if (ipc->node.mln_Succ) { success=IoErr(); break; } // Lock buttons list lock_listlock(&GUI->buttons_list,FALSE); // Write button file paths for (ipc=(IPCData *)GUI->buttons_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Get buttons pointer buttons=IPCDATA(ipc); // Valid button configuration? if (buttons->bank && buttons->bank->path[0]) { ULONG pad[5]; #ifdef __AROS__ struct IBox pos_be; #endif // Update buttons buttons_update(buttons); // Write bank header if (!(IFFPushChunk(iff,ID_BANK))) break; // Fill out padding pad[0]=0; pad[1]=0; pad[2]=buttons->icon_pos_x; pad[3]=buttons->icon_pos_y; pad[4]=buttons->flags&BUTTONF_ICONIFIED; #ifdef __AROS__ CopyMem(&buttons->pos,&pos_be,sizeof(struct IBox)); pos_be.Left = AROS_WORD2BE(pos_be.Left); pos_be.Top = AROS_WORD2BE(pos_be.Top); pos_be.Width = AROS_WORD2BE(pos_be.Width); pos_be.Height = AROS_WORD2BE(pos_be.Height); pad[2] = AROS_LONG2BE(pad[2]); pad[3] = AROS_LONG2BE(pad[3]); pad[4] = AROS_LONG2BE(pad[4]); if (!(IFFWriteChunkBytes(iff,pad,sizeof(pad))) || !(IFFWriteChunkBytes(iff,&pos_be,sizeof(struct IBox))) || !(IFFWriteChunkBytes(iff,buttons->bank->path,strlen(buttons->bank->path)+1)) || !(IFFPopChunk(iff))) break; #else // Write padding and position and path if (!(IFFWriteChunkBytes(iff,pad,sizeof(pad))) || !(IFFWriteChunkBytes(iff,&buttons->pos,sizeof(struct IBox))) || !(IFFWriteChunkBytes(iff,buttons->bank->path,strlen(buttons->bank->path)+1)) || !(IFFPopChunk(iff))) break; #endif } } // Unlock buttons list unlock_listlock(&GUI->buttons_list); // Fail? if (ipc->node.mln_Succ) { success=IoErr(); break; } // Lock StartMenu list lock_listlock(&GUI->startmenu_list,FALSE); // Write StartMenu paths for (ipc=(IPCData *)GUI->startmenu_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { StartMenu *menu; // Get menu pointer menu=(StartMenu *)IPCDATA(ipc); // Lock the bank GetSemaphore(&menu->lock,SEMF_SHARED,0); // Valid configuration? if (menu->bank && menu->bank->path[0]) { ULONG pad[5]; struct IBox pos; // Get position pos.Left=menu->bank->window.pos.Left; pos.Top=menu->bank->window.pos.Top; #ifdef __AROS__ pos.Left = AROS_WORD2BE(pos.Left); pos.Top = AROS_WORD2BE(pos.Top); #endif // Write menu header if (!(IFFPushChunk(iff,ID_STRT))) break; // Fill out padding pad[0]=0; pad[1]=0; pad[2]=0; pad[3]=0; pad[4]=0; // Write padding and position and path if (!(IFFWriteChunkBytes(iff,pad,sizeof(pad))) || !(IFFWriteChunkBytes(iff,&pos,sizeof(struct IBox))) || !(IFFWriteChunkBytes(iff,menu->bank->path,strlen(menu->bank->path)+1)) || !(IFFPopChunk(iff))) break; } // Unlock bank FreeSemaphore(&menu->lock); } // Unlock startmenu list unlock_listlock(&GUI->startmenu_list); // Fail? if (ipc->node.mln_Succ) success=IoErr(); } // Failed? if (success) break; // Go through desktop list for (desk=(Cfg_Desktop *)env->desktop.mlh_Head; desk->node.mln_Succ; desk=(Cfg_Desktop *)desk->node.mln_Succ) { #ifdef __AROS__ char buffer[64]; // 12 bytes CFG_DESK + 34 bytes device name + 18 bytes extra CFG_DESK *desk_be = (CFG_DESK *)buffer; CopyMem(&desk->data,desk_be,desk->data.dt_Size); desk_be->dt_Type = AROS_WORD2BE(desk_be->dt_Type); desk_be->dt_Size = AROS_WORD2BE(desk_be->dt_Size); desk_be->dt_Flags = AROS_LONG2BE(desk_be->dt_Flags); if (desk->data.dt_Type != DESKTOP_HIDE_BAD && desk->data.dt_Type != DESKTOP_HIDE) desk_be->dt_Data = AROS_LONG2BE(desk_be->dt_Data); if (!(IFFWriteChunk(iff,desk_be,ID_DESK,desk->data.dt_Size))) #else // Write chunk if (!(IFFWriteChunk(iff,&desk->data,ID_DESK,desk->data.dt_Size))) #endif { success=IoErr(); break; } } // Go through pathlist for (node=env->path_list.mlh_Head;node->mln_Succ;node=node->mln_Succ) { // Write chunk if (!(IFFWriteChunk(iff,(char *)(node+1),ID_PATH,strlen((char *)(node+1))))) { success=IoErr(); break; } } // Go through sound list for (sound=(Cfg_SoundEntry *)env->sound_list.mlh_Head;sound->dse_Node.ln_Succ;sound=(Cfg_SoundEntry *)sound->dse_Node.ln_Succ) { #ifdef __AROS__ Cfg_SoundEntry sound_be; CopyMem(&sound,&sound_be,sizeof(Cfg_SoundEntry)); sound_be.dse_Volume = AROS_WORD2BE(sound_be.dse_Volume); sound_be.dse_Flags = AROS_WORD2BE(sound_be.dse_Flags); if (!(IFFWriteChunk(iff,sound_be.dse_Name,ID_SNDX,32+2+2+strlen(sound->dse_Sound)+1))) #else // Write chunk if (!(IFFWriteChunk(iff,sound->dse_Name,ID_SNDX,32+2+2+strlen(sound->dse_Sound)+1))) #endif { success=IoErr(); break; } } break; } // Close file if (!iff) success=IoErr(); else IFFClose(iff); #ifdef __AROS__ FreeVec(env_be); #endif // Write icon if successful (and enabled) if ((!success) && (GUI->flags&GUIF_SAVE_ICONS)) { WriteFileIcon("dopus5:icons/Environment",name); } // Free stuff FreeMemH(opendata); ClearMemHandle(env->volatile_memory); return success; }
// Open the button editor (called from a sub-process) void buttons_edit( IPCData *my_ipc, buttons_edit_packet *packet) { ButtonsStartup startup; struct Library *ConfigOpusBase; IPCData *ipc; long ret,command; Buttons *buttons=0; Cfg_Button *send_button=0; struct AppMessage *send_msg=0; short button_col=-1,button_row=-1; short can_start=1; // Get packet data if (packet) { buttons=packet->buttons; send_button=packet->edit; button_col=packet->col; button_row=packet->row; can_start=packet->can_start; send_msg=packet->appmsg; } // Lock process list lock_listlock(&GUI->process_list,FALSE); // Get edit command command=(button_col==-2)?BUTTONEDIT_RE_EDIT_ME:BUTTONEDIT_EDIT_ME; // See if button editor is running if (ipc=IPC_FindProc(&GUI->process_list,NAME_BUTTON_EDITOR_RUN,FALSE,0)) { BOOL front=1; // Button bank supplied? if (buttons) { // Does the bank not already have the editor? if (!buttons->editor) { // Tell editor to edit the toolbar bank IPC_Command( ipc, command, (ULONG)buttons->bank, buttons->ipc, 0, 0); // Set flag for pending edit request buttons->flags|=BUTTONF_EDIT_REQUEST; front=0; } // Button to send? if (send_button) { Point *pos; // Allocate position if (pos=AllocVec(sizeof(Point),MEMF_CLEAR)) { // Convert coordinates to window relative pos->x=button_col-buttons->window->LeftEdge; pos->y=button_row-buttons->window->TopEdge; // Send command IPC_Command( ipc, BUTTONEDIT_BUTTON_TO_BANK, 0, send_button, pos, 0); send_button=0; } front=0; } // Message to send? if (send_msg) { // Send it on IPC_Command( ipc, CFG_APPMESSAGE_PASS, (ULONG)buttons->bank, send_msg, 0, 0); send_msg=0; } // Button to edit? if (button_col>-1) { // Send edit command IPC_Command( ipc, BUTTONEDIT_EDIT_BUTTON, button_col, (APTR)button_row, 0, 0); front=0; } } // Bring editor to front if (front) IPC_Command(ipc,IPC_ACTIVATE,0,0,0,0); } // Unlock the process list unlock_listlock(&GUI->process_list); // Free button if we have one if (send_button) FreeButton(send_button); // Free message if we have one if (send_msg) ReplyAppMessage((DOpusAppMessage *)send_msg); // If editor was already running, or we can't start it if not, return if (ipc || !can_start) return; // Change our name my_ipc->proc->pr_Task.tc_Node.ln_Name=NAME_BUTTON_EDITOR_RUN; // Set flag GUI->flags|=GUIF_BUTTON_EDITOR; // Open configuration library if (!(ConfigOpusBase=OpenModule(config_name))) return; // Bank supplied? if (buttons) { // Fill out startup packet startup.bank=buttons->bank; startup.ipc=buttons->ipc; // Button supplied? if (button_col>-1) { // Set flag startup.flag=1; // Pass button startup.button=(button_col<<16)|button_row; } else startup.flag=0; // Set pending edit request buttons->flags|=BUTTONF_EDIT_REQUEST; } else startup.bank=0; // Configure buttons ret=Config_Buttons( &startup, my_ipc, &main_ipc, GUI->screen_pointer, (ULONG)&GUI->command_list.list); // Change our name back my_ipc->proc->pr_Task.tc_Node.ln_Name=NAME_BUTTON_EDITOR; // Clear flag GUI->flags&=~GUIF_BUTTON_EDITOR; // Permit now we've cleaned up Permit(); // Close library CloseLibrary(ConfigOpusBase); // Lock buttons list lock_listlock(&GUI->buttons_list,FALSE); // Go through button banks for (ipc=(IPCData *)GUI->buttons_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Get buttons pointer Buttons *buttons=IPCDATA(ipc); // Toolbar buttons? if (buttons->flags&BUTTONF_TOOLBAR) { // Hide bank IPC_Command(ipc,IPC_HIDE,0,0,0,REPLY_NO_PORT); // Need to save? if (ret&CONFIG_SAVE) IPC_Command(ipc,BUTTONS_SAVE,0,0,0,REPLY_NO_PORT); // Use? if (ret) { // Send change send_main_reset_cmd(CONFIG_CHANGE_LIST_TOOLBAR,0,buttons->bank); // Steal bank pointer IPC_Command(ipc,BUTTONEDIT_NEW_BANK,1,0,0,REPLY_NO_PORT); } // Close bank IPC_Command(ipc,IPC_QUIT,0,0,0,0); } // Ok? else if (ret) { // Save? if (ret&CONFIG_SAVE) { // Buttons been changed? if (buttons->flags&BUTTONF_CHANGED) { // Tell bank to save itself IPC_Command(ipc,BUTTONS_SAVE,0,0,0,REPLY_NO_PORT); } } // Clear 'new' flag buttons->flags&=~BUTTONF_NEW_BANK; } } // Unlock buttons list unlock_listlock(&GUI->buttons_list); }
// Change volume name of a disk in buffers void notify_disk_name_change( BackdropInfo *info, char *device, char *new_volume) { IPCData *ipc; Lister *lister; DirBuffer *buffer; char *ptr; // Get list lock lock_listlock(&GUI->buffer_list,FALSE); // Go through all buffers for (buffer=(DirBuffer *)GUI->buffer_list.list.lh_Head; buffer->node.ln_Succ; buffer=(DirBuffer *)buffer->node.ln_Succ) { // Correct disk? if (strnicmp(device,buffer->buf_Path,strlen(device))==0) { // Change volume name strcpy(buffer->buf_VolumeLabel,new_volume); // Get new full path strcpy(buffer->buf_ExpandedPath,new_volume); if ((ptr=strchr(buffer->buf_Path,':'))) strcat(buffer->buf_ExpandedPath,ptr); // Is buffer currently displayed in a lister? if (buffer->buf_CurrentLister) { // Refresh path IPC_Command(buffer->buf_CurrentLister->ipc,LISTER_REFRESH_PATH,0,0,0,0); } } } // Free list lock unlock_listlock(&GUI->buffer_list); // Lock lister list lock_listlock(&GUI->lister_list,FALSE); // Go through listers for (ipc=(IPCData *)GUI->lister_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Get lister pointer lister=(Lister *)IPCDATA(ipc); // Is lister a device list? if (lister->cur_buffer->more_flags&DWF_DEVICE_LIST) { // Check it's not our current backdrop if (lister->backdrop_info!=info) { devname_change *change; // Allocate data structure if ((change=AllocVec(sizeof(devname_change),MEMF_CLEAR))) { // Fill it out strcpy(change->old_name,device); strcpy(change->new_name,new_volume); // Signal it to update the name of the device IPC_Command( ipc, LISTER_UPDATE_DEVICE, 0, 0, change, 0); } } } } // Unlock lister list unlock_listlock(&GUI->lister_list); // Have to update main window? if (info!=GUI->backdrop) { devname_change change; // Fill in change packet strcpy(change.old_name,device); strcpy(change.new_name,new_volume); // Update name backdrop_update_disk(GUI->backdrop,&change,TRUE); } }
// 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)); }
// Snapshot objects void backdrop_snapshot(BackdropInfo *info,BOOL unsnapshot,BOOL all,BackdropObject *icon) { BackdropObject *object; Lister *lister; IPCData *ipc; BPTR old,lock; short count=0,beep=0; #ifdef DISTINCT_OK BOOL save_env=0; #endif BOOL savepos=0; // Lock backdrop list lock_listlock(&info->objects,0); // Lock lister list lock_listlock(&GUI->lister_list,0); // Lock group list lock_listlock(&GUI->group_list,0); // Go through backdrop list for (object=(BackdropObject *)info->objects.list.lh_Head; object->node.ln_Succ; object=(BackdropObject *)object->node.ln_Succ) { BOOL ok=0; // Icon supplied? if (icon) { // Does it match? if (object!=icon || !object->icon) continue; } // Is object selected? else if ((!object->state && !all) || !object->icon) continue; beep=1; // Appicon? if (object->type==BDO_APP_ICON) { // Does icon support snapshot itself? if (WB_AppIconFlags((struct AppIcon *)object->misc_data)&APPENTF_SNAPSHOT) { backdrop_appicon_message(object,(unsnapshot)?BAPPF_UNSNAPSHOT:0); ++count; } // Otherwise, fake snapshot else if (*object->name) ok=1; } // Otherwise, is it ok to snapshot? else if (object->type!=BDO_BAD_DISK) ok=1; // Ok to snapshot? if (ok) { short x,y; // UnShapshot? if (unsnapshot) { // Set "no position" position x=-1; y=-1; } // Snapshot else { // Drawer? if (object->icon->do_DrawerData) { // Group icon? if (object->type==BDO_GROUP) { GroupData *group; // See if group is open if ((group=backdrop_find_group(object))) { // Update window position *((struct IBox *)&object->icon->do_DrawerData->dd_NewWindow.LeftEdge)=group->dimensions; } } // Otherwise go through listers else for (ipc=(IPCData *)GUI->lister_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Get lister lister=IPCDATA(ipc); // Is lister from this icon? if (lister->backdrop==object) { // Update lister PositionUpdate(lister,POSUPF_SAVE); break; } } } // Get position x=object->pos.Left; y=object->pos.Top; } // AppIcon? if (object->type==BDO_APP_ICON) { leftout_record *left; // Lock position list lock_listlock(&GUI->positions,TRUE); // 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_APPICON) { // Match this icon? if (strcmp(left->icon_label,object->name)==0) break; } } // Didn't find one? if (!(left->node.ln_Succ) && !unsnapshot) { // Create a new entry if ((left=AllocMemH(GUI->position_memory,sizeof(leftout_record)))) { // Fill out entry stccpy(left->icon_label,object->name,sizeof(left->icon_label)); left->node.ln_Name=left->name; left->node.ln_Type=PTYPE_APPICON; // Add to list AddTail((struct List *)&GUI->positions,(struct Node *)left); } } // Got one? if (left->node.ln_Succ) { // Unsnapshot? if (unsnapshot) { // Remove entry and free it Remove((struct Node *)left); FreeMemH(left); } // Update entry else { ULONG iflags; // Adjust for borders? if (!((iflags=GetIconFlags(object->icon))&ICONF_BORDER_OFF) && (!(environment->env->desktop_flags&DESKTOPF_NO_BORDERS) || (iflags&ICONF_BORDER_ON))) { // Shift back by border size x-=ICON_BORDER_X; y-=ICON_BORDER_Y_TOP; } // Save position left->icon_x=x; left->icon_y=y; left->flags&=~LEFTOUTF_NO_POSITION; } // Set flag to save positions savepos=1; } // Can't snapshot for some reason else if (!unsnapshot) beep=1; // Unlock position list unlock_listlock(&GUI->positions); } // Left-out on desktop? else if (object->type==BDO_LEFT_OUT && !(object->flags&BDOF_DESKTOP_FOLDER) && info->flags&BDIF_MAIN_DESKTOP) { 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) break; } } // Got one? if (left->node.ln_Succ) { // Save position left->icon_x=x; left->icon_y=y; left->flags&=~LEFTOUTF_NO_POSITION; // Set flag to save positions savepos=1; } // Must be temporary else beep=1; // Unlock position list unlock_listlock(&GUI->positions); } #ifdef DISTINCT_OK // Distinct icon positions? else if (environment->env->desktop_flags&DESKTOPF_DISTINCT && info->flags&BDIF_MAIN_DESKTOP) { // Snapshot icon for this environment desktop_snapshot_icon(object,x,y); save_env=1; } #endif // Group icon? else if (info->flags&BDIF_GROUP) { // Snapshot in group group_snapshot_icon(info,object,x,y); } // Save to icon else { // Using Workbench positions? if (environment->env->display_options&DISPOPTF_ICON_POS) { // Set position object->icon->do_CurrentX=(unsnapshot)?NO_ICON_POSITION:x-WBICONMAGIC_X; object->icon->do_CurrentY=(unsnapshot)?NO_ICON_POSITION:y-WBICONMAGIC_Y; // Removing Opus positions? if (environment->env->display_options&DISPOPTF_REMOPUSPOS) { // Remove Opus position from icon SetIconFlags(object->icon,GetIconFlags(object->icon)&~ICONF_POSITION_OK); } } // Using Opus positions else { // Set "position ok" flag SetIconFlags(object->icon,GetIconFlags(object->icon)|ICONF_POSITION_OK); // Update icon position SetIconPosition(object->icon,x,y); } // Get icon lock if ((lock=backdrop_icon_lock(object))) { // Change directory old=CurrentDir(lock); // Save this object out if (!(WriteIcon((object->icon->do_Type==WBDISK)?"Disk":object->name,object->icon))) beep=1; // Success; is this in a lister? else if (info->lister) { char name[256]; // Get icon name strcpy(name,(object->icon->do_Type==WBDISK)?"Disk":object->name); strcat(name,".info"); // Reload the file rexx_lister_reload_file(info->lister,name); } // Restore directory CurrentDir(old); UnLock(lock); } } ++count; } // Icon supplied? if (icon) break; } // Failed to do anything? if (!count && beep) DisplayBeep(info->window->WScreen); // Unlock group list unlock_listlock(&GUI->group_list); // Unlock backdrop list unlock_listlock(&info->objects); // Unlock lister list unlock_listlock(&GUI->lister_list); #ifdef DISTINCT_OK // Save environment file? if (save_env && environment->env->flags&ENVF_CHANGED) { // Save environment if (environment_save(environment,environment->path,0,0)) environment->env->flags&=~ENVF_CHANGED; } #endif // Save positions? if (savepos) { // Lock list lock_listlock(&GUI->positions,0); // Save list SavePositions(&GUI->positions.list,GUI->position_name); // Unlock list unlock_listlock(&GUI->positions); } // If this is a lister, update its datestamp if (info->lister) update_buffer_stamp(info->lister); }