IPC_StartupCode(funced_init, FunctionStartup *, startup) #endif { FuncEdData *data; // Allocate data if (!(data=AllocVec(sizeof(FuncEdData),MEMF_CLEAR))) return 0; // Store data startup->data=data; // Initialise some pointers data->startup=startup; data->function=startup->function; data->locale=startup->locale; // Create timer if (!(data->drag.timer=AllocTimer(UNIT_VBLANK,0))) return 0; // Create lists if (!(data->func_display_list=Att_NewList(0)) || !(data->flag_list=Att_NewList(0)) || !(data->function_list=Att_NewList(0))) return 0; // Create app port data->appport=CreateMsgPort(); return 1; }
// Show list of status bar options void _config_env_status_list(ObjectList *objlist,ULONG id,long first,long last) { Att_List *list; short a,b; char name[80]; // Build list if (!(list=Att_NewList(0))) return; for (a=first;a<=((last)?last:32767);a++) { stccpy(name,GetString(locale,a),sizeof(name)); if (name[0]=='-' && name[1]==0) break; for (b=0;name[b] && name[b]!='\t';b++) if (name[b]=='*') name[b]='%'; Att_NewNode(list,name,0,0); } // Make window busy SetWindowBusy(objlist->window); // Display selection list a=SelectionList(list,objlist->window,0, GetString(locale,MSG_ENVIRONMENT_LISTER_SELECT_STATUS), -1, 0, 0, GetString(locale,MSG_OKAY), GetString(locale,MSG_CANCEL),0,0); // Clear busy ClearWindowBusy(objlist->window); // Selection? if (a!=-1) { Att_Node *node; // Get node if ((node=Att_FindNode(list,a))) { char *ptr,buf[10]; // Get string pointer ptr=strchr(node->node.ln_Name,'\t'); if (ptr) stccpy(buf,node->node.ln_Name,(ptr-node->node.ln_Name)+1); else stccpy(buf,node->node.ln_Name,sizeof(buf)); // Insert into gadget funced_edit_insertstring(objlist,id,buf,DOpusBase,(struct Library *)IntuitionBase); } } // Free list Att_RemList(list,0); }
IPC_StartupCode(_filetypeed_init, filetype_ed_data *, data) #endif { short a; // Store IPC pointer data->ipc=ipc; // Fill in new window data->new_win.title=data->type->type.name; data->new_win.flags=WINDOW_VISITOR|WINDOW_REQ_FILL|WINDOW_AUTO_KEYS; // Create timer if (!(data->drag.timer=AllocTimer(UNIT_VBLANK,0))) return 0; // Open window, create action list if (!(data->window=OpenConfigWindow(&data->new_win)) || !(data->objlist=AddObjectList(data->window,data->obj_def)) || !(data->action_list=Att_NewList(0))) { CloseConfigWindow(data->window); FreeTimer(data->drag.timer); return 0; } // Store window for drag data->drag.window=data->window; // Set window ID SetWindowID(data->window,0,WINDOW_BUTTON_CONFIG,(struct MsgPort *)data->ipc); // Build action list for (a=0;data->action_lookup[a];a+=2) { Att_NewNode( data->action_list, GetString(Locale,data->action_lookup[a]), data->action_lookup[a+1], 0); } // Disable edit and delete buttons DisableObject(data->objlist,GAD_FILETYPES_EDIT_ACTION,TRUE); // Update action and icon list filetypeed_update_actions(data); filetypeed_update_iconmenu(data); // Initialise process list InitListLock(&data->proc_list,0); return 1; }
// Build theme list Att_List *theme_build_list(char *path) { Att_List *list; // Create list if ((list=Att_NewList(LISTF_POOL))) { long err; char buf[280]; #ifdef __amigaos4__ struct AnchorPath *anchor; if (!(anchor = AllocDosObjectTags( DOS_ANCHORPATH, ADO_Strlen, 0, ADO_Flags, APF_DOWILD, ADO_Mask, 0, TAG_DONE))) { return NULL; } #else D_S(struct AnchorPath,anchor) anchor->ap_BreakBits=0; anchor->ap_Flags=APF_DOWILD; anchor->ap_Strlen=0; #endif strcpy(buf,path); AddPart(buf,"#?.theme",280); err=MatchFirst(buf,anchor); while (!err) { char *ptr; if (anchor->ap_Info.fib_DirEntryType>0) { anchor->ap_Flags&=~APF_DODIR; continue; } anchor->ap_Info.fib_FileName[strlen(anchor->ap_Info.fib_FileName)-6]=0; for (ptr=anchor->ap_Info.fib_FileName;*ptr;ptr++) if (*ptr=='_') *ptr=' '; Att_NewNode(list,anchor->ap_Info.fib_FileName,0,ADDNODE_SORT); err=MatchNext(anchor); } MatchEnd(anchor); #ifdef __amigaos4__ FreeDosObject(DOS_ANCHORPATH,anchor); #endif }
// Build list of available filetypes void filetype_build_list(config_filetypes_data *data) { Cfg_FiletypeList *list; Cfg_Filetype *type; // Remove existing list SetGadgetChoices(data->objlist,GAD_FILETYPES_LIST,(APTR)~0); // Free list Att_RemList(data->filetype_list,REMLIST_FREEDATA); // Create new list if ((data->filetype_list=Att_NewList(0))) { // Go through filetype lists for (list=(Cfg_FiletypeList *)data->list_list.lh_Head; list->node.ln_Succ; list=(Cfg_FiletypeList *)list->node.ln_Succ) { // Go through filetypes in this list for (type=(Cfg_Filetype *)list->filetype_list.lh_Head; type->node.ln_Succ; type=(Cfg_Filetype *)type->node.ln_Succ) { // Add an entry for this filetype filetype_add_entry(data,type); } } } // Add list to gadget SetGadgetChoices(data->objlist,GAD_FILETYPES_LIST,data->filetype_list); // Clear current selection SetGadgetValue(data->objlist,GAD_FILETYPES_LIST,(ULONG)-1); data->sel_filetype=0; // Disable buttons filetype_able_buttons(data,TRUE); }
// 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; }
Att_List *build_text_display(struct Window *window,ObjectList *objlist,char *text) { Att_List *list; struct TextExtent extent; short want_len,max_len,textlen=0,width; char *textpos=0; struct Rectangle rect; char old; // Allocate a new list list=Att_NewList(0); // Get list object size GetObjectRect(objlist,GAD_TEXT_DISPLAY,&rect); width=RECTWIDTH(&rect)-28; // Go through text FOREVER { // No current line? if (!textpos) textpos=text; // Move on from current line else { // Were we on a newline? if (textlen==0) ++textpos; // No else { // Bump pointer textpos+=textlen; // If this leaves us on a newline or space, skip over it if (*textpos=='\n' || *textpos=='\t') ++textpos; } } // End of text? if (!*textpos) break; // If we're on a space, skip over it if (*textpos==' ') ++textpos; // Calculate desired length of the line for (want_len=0;textpos[want_len] && textpos[want_len]!='\n';++want_len); // Blank line? if (want_len==0) { textlen=0; } // Not blank else { // Get maximum length that will actually fit max_len=TextFit( window->RPort, textpos, want_len, &extent, 0,1, width,window->RPort->TxHeight); // Go from here to end of current word want_len=max_len; while ( textpos[want_len] && textpos[want_len]!='\n' && textpos[want_len]!=' ') ++want_len; // Loop until successful do { // Get text size TextExtent(window->RPort,textpos,want_len,&extent); // Will it fit? if (extent.te_Width<=width) { // Save size textlen=want_len; break; } // Come backwards to word break for (--want_len;want_len>0 && textpos[want_len]!=' ';--want_len); // Didn't find one? if (want_len<1) { // Get maximum length want_len=max_len; } } while(1); } // Null out break temporarily old=textpos[textlen]; textpos[textlen]=0; // Add node Att_NewNode(list,textpos,0,0); // Restore character textpos[textlen]=old; } // Add list to display SetGadgetChoices(objlist,GAD_TEXT_DISPLAY,list); return list; }
int LIBFUNC L_Module_Entry( REG(a0, struct List *files), REG(a1, struct Screen *screen), REG(a2, IPCData *ipc), REG(a3, IPCData *main_ipc), REG(d0, ULONG mod_id), REG(d1, ULONG mod_data)) { config_path_data *data; short success=1; // Allocate data if (!(data=AllocVec(sizeof(config_path_data),MEMF_CLEAR)) || !(data->path_list=Att_NewList(0))) { FreeVec(data); return 0; } // Store data pointers data->paths=files; data->ipc=ipc; data->main_ipc=main_ipc; data->memory=(APTR)mod_id; data->def_format=(ListFormat *)mod_data; // AppPort data->appport=CreateMsgPort(); // Open commodities library /*data->cxbase=OpenLibrary("commodities.library",0); #ifdef __amigaos4__ ICommodities=(struct CommoditiesIFace *)GetInterface(data->cxbase,"main",1,NULL); #endif */ // Build path list config_paths_build_list(data); // Open window if (!(config_paths_open(data,screen))) return 0; // Event loop FOREVER { IPCMessage *imsg; struct IntuiMessage *msg; int quit_flag=0; // IPC messages? while ((imsg=(IPCMessage *)GetMsg(ipc->command_port))) { // Quit? if (imsg->command==IPC_QUIT) { quit_flag=1; success=0; } // Hide? else if (imsg->command==IPC_HIDE) { RemoveAppWindow(data->appwindow); data->appwindow=0; CloseConfigWindow(data->window); data->window=0; } // Show? else if (imsg->command==IPC_SHOW) { if (!(config_paths_open(data,imsg->data))) { quit_flag=1; success=0; } } // Activate else if (imsg->command==IPC_ACTIVATE) { if (data->window) { WindowToFront(data->window); ActivateWindow(data->window); } } // Reply IPC_Reply(imsg); } // Any messages to the window? if (data->window) { while ((msg=GetWindowMsg(data->window->UserPort))) { struct IntuiMessage msg_copy; UWORD gadgetid; // Copy message and reply msg_copy=*msg; ReplyWindowMsg(msg); // Look at message switch (msg_copy.Class) { // Close window case IDCMP_CLOSEWINDOW: quit_flag=1; success=0; break; // Gadget case IDCMP_GADGETUP: case IDCMP_GADGETDOWN: // Get GadgetID gadgetid=((struct Gadget *)msg_copy.IAddress)->GadgetID; // Look at gadget switch (gadgetid) { // Cancel case GAD_PATHFORMAT_CANCEL: success=0; // Use case GAD_PATHFORMAT_SAVE: quit_flag=1; break; // Add an entry case GAD_PATHFORMAT_ADD: config_paths_add(data,TRUE); break; // Change path name case GAD_PATHFORMAT_PATH: config_paths_change(data); break; // Select an entry case GAD_PATHFORMAT_PATHS: { Att_Node *node; // Find selected entry node=Att_FindNode(data->path_list,msg_copy.Code); // Double-click? if (DoubleClick(data->seconds,data->micros,msg_copy.Seconds,msg_copy.Micros) && node==data->path_sel) { // Edit it config_paths_edit(data); break; } // Store double-click time data->seconds=msg_copy.Seconds; data->micros=msg_copy.Micros; // Not already selected? if (node!=data->path_sel) { // Select it config_paths_select(data,node,FALSE); } } break; // Key case GAD_PATHFORMAT_KEY: config_paths_get_key(data); break; // Open new lister case GAD_PATHFORMAT_NEW_LISTER: // Valid selection? if (data->path_sel) { position_rec *pos=(position_rec *)data->path_sel->data; // Open new lister? if (msg_copy.Code) { // Set flag pos->flags|=POSITIONF_OPEN_NEW; // Clear type flags pos->flags&=~(POSITIONF_ICON|POSITIONF_ICON_ACTION); // Icon action? if (msg_copy.Code==MODE_ACTION) pos->flags|=POSITIONF_ICON|POSITIONF_ICON_ACTION; // Icon? else if (msg_copy.Code==MODE_ICON) pos->flags|=POSITIONF_ICON; } // No lister else pos->flags&=~POSITIONF_OPEN_NEW; } break; // Remove case GAD_PATHFORMAT_REMOVE: config_paths_remove(data,TRUE); break; // Edit case GAD_PATHFORMAT_EDIT: config_paths_edit(data); break; } break; // Key press case IDCMP_RAWKEY: // Help? if (msg_copy.Code==0x5f && !(msg_copy.Qualifier&VALID_QUALIFIERS)) { // Valid main IPC? if (main_ipc) { // Set busy pointer SetWindowBusy(data->window); // Send help request IPC_Command(main_ipc,IPC_HELP,(1<<31),"Paths",0,(struct MsgPort *)-1); // Clear busy pointer ClearWindowBusy(data->window); } } break; } // Check quit flag if (quit_flag) break; } } // Check quit flag if (quit_flag) break; // App messages? if (data->appport) { struct AppMessage *msg; // Get messages while ((msg=(struct AppMessage *)GetMsg(data->appport))) { // Get first argument if (msg->am_NumArgs>0) { // Is it a directory? if (!msg->am_ArgList[0].wa_Name || !*msg->am_ArgList[0].wa_Name) { char buf[256]; // Expand path name if (NameFromLock(msg->am_ArgList[0].wa_Lock,buf,256)) { Att_Node *node; // Fix trailing / AddPart(buf,"",256); // Check it's not already in the list if (!(node=(Att_Node *)FindNameI((struct List *)data->path_list,buf))) { // Add a new entry config_paths_add(data,FALSE); // Copy path to path field SetGadgetValue(data->objlist,GAD_PATHFORMAT_PATH,(ULONG)buf); // Accept the new path config_paths_change(data); } // It is, select this entry else config_paths_select(data,node,FALSE); } } } // Reply message ReplyMsg((struct Message *)msg); } } // Wait for input Wait( ((data->window)?(1<<data->window->UserPort->mp_SigBit):0)| ((data->appport)?(1<<data->appport->mp_SigBit):0)| 1<<ipc->command_port->mp_SigBit); } // Free stuff config_paths_cleanup(data); return success; }
// 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); }
static Att_List *do_import_amftp(struct display_globals *dg,char *path) { struct opusftp_globals *og; Att_List *list=NULL; char *buf; og=dg->dg_og; if (!check_amftpfile(dg,path)) return (NULL); if ((buf=AllocVec(AMFTP_LEN,MEMF_CLEAR))) { struct amftp_profile *p = (struct amftp_profile *)buf; if ((list = Att_NewList(LISTF_POOL))) { BPTR fp; if ((fp = Open(path, MODE_OLDFILE))) { WORD a; LONG b; // read intro unknown stuff Read(fp,&a, 2); Read(fp, &b, 4); while (AMFTP_LEN==Read(fp, buf, AMFTP_LEN)) { ULONG magic=-1; int i; struct site_entry *e; for (i = 0; i < AMFTP_LEN; ++i) buf[i] ^= encrypt(&magic); if ((e = AllocVec( sizeof(struct site_entry), MEMF_CLEAR ))) { // get main settings from amftp config if (p->amftp_name) stccpy( e->se_name, p->amftp_name, HOSTNAMELEN ); if (p->amftp_host) stccpy( e->se_host, p->amftp_host, HOSTNAMELEN ); if (buf[520]) e->se_anon = TRUE; if (!e->se_anon) { if (p->amftp_login) stccpy( e->se_user, p->amftp_login, USERNAMELEN ); if (p->amftp_pass) stccpy( e->se_pass, p->amftp_pass, PASSWORDLEN ); } e->se_port=atoi(p->amftp_port); if (e->se_port<=0 || e->se_port >16384) e->se_port=21; if (p->amftp_remote) stccpy( e->se_path,p->amftp_remote, PATHLEN ); // get global default env and mark as custom *(&e->se_env_private)=*(&og->og_oc.oc_env); e->se_env=&e->se_env_private; e->se_has_custom_env=TRUE; // Clear format marker e->se_env->e_custom_format=FALSE; // get retry and save last dir settings if ((e->se_env->e_retry_count=buf[521])) e->se_env->e_retry=TRUE; if (buf[522]) e->se_env->e_keep_last_dir=TRUE; Att_NewNode(list, e->se_name ,(ULONG)e ,ADDNODE_SORT ); } } Close( fp ); } } FreeVec(buf); } return list; }
static Att_List *do_import_sites(struct opusftp_globals *og,char *path) { FuncArgs * fa; struct site_entry *e; int anon, acct; BPTR cf; char *buf; Att_List *list=NULL; if (!(buf=AllocVec(TMPBUFLEN,MEMF_CLEAR))) { DisplayBeep(NULL); return(NULL); } if ((list = Att_NewList(LISTF_POOL))) { if ((cf = Open(path, MODE_OLDFILE ))) { while ( FGets( cf, buf, TMPBUFLEN )) { if (*buf=='#' || *buf=='\n') continue; /* skip config entries */ if ((fa = ParseArgs( CONFIG_TEMPLATE, buf ))) { DisposeArgs( fa ); continue; } /* handle addressbook stuff*/ if ((fa = ParseArgs( ADDR_TEMPLATE, buf ))) { anon = fa->FA_Arguments[A_OPT_ANON]; acct = fa->FA_Arguments[A_OPT_ACCT]; // skip any lines starting with '---' if (fa->FA_Arguments[A_OPT_HOST] && strncmp((char*)fa->FA_Arguments[A_OPT_HOST],"---",3)==0) { DisposeArgs( fa ); continue; } if (((anon == 0) != (acct == 0)) /* Can't be both or neither */ && (anon || fa->FA_Arguments[A_OPT_USER]) /* User Account must have user name */ && (fa->FA_Arguments[A_OPT_HOST] || fa->FA_Arguments[A_OPT_ADDR])/* Must have Hostname or Address */ ) { if ((e = AllocVec( sizeof(struct site_entry), MEMF_CLEAR ))) { e->se_anon = anon; if (!anon) { if (fa->FA_Arguments[A_OPT_USER]) stccpy( e->se_user, (char*)fa->FA_Arguments[A_OPT_USER], USERNAMELEN ); if (fa->FA_Arguments[A_OPT_PASS]) stccpy( e->se_pass, (char*)fa->FA_Arguments[A_OPT_PASS], PASSWORDLEN ); } /* Use Hostname or Address for the socket */ if (fa->FA_Arguments[A_OPT_HOST]) stccpy( e->se_host, (char*)fa->FA_Arguments[A_OPT_HOST], HOSTNAMELEN ); else stccpy( e->se_host, (char*)fa->FA_Arguments[A_OPT_ADDR], HOSTNAMELEN ); // special port specified ? if (fa->FA_Arguments[A_OPT_PORT]) e->se_port=*(int*)fa->FA_Arguments[A_OPT_PORT]; if (e->se_port<=0 || e->se_port >9999) e->se_port=21; /* Use Alias, Hostname, or Address in requester */ if (fa->FA_Arguments[A_OPT_ALIS]) stccpy( e->se_name, (char*)fa->FA_Arguments[A_OPT_ALIS], HOSTNAMELEN ); else if (fa->FA_Arguments[A_OPT_HOST]) stccpy( e->se_name, (char*)fa->FA_Arguments[A_OPT_HOST], HOSTNAMELEN ); else if (fa->FA_Arguments[A_OPT_ADDR]) stccpy( e->se_name, (char*)fa->FA_Arguments[A_OPT_ADDR], HOSTNAMELEN ); if (fa->FA_Arguments[A_OPT_PATH]) stccpy( e->se_path, (char*)fa->FA_Arguments[A_OPT_PATH], PATHLEN ); // set env to point to global default e->se_env=&og->og_oc.oc_env; e->se_has_custom_env=FALSE; Att_NewNode(list, e->se_name ,(ULONG)e ,ADDNODE_SORT); } } DisposeArgs( fa ); } } Close(cf); } } FreeVec(buf); return(list); }
// Create a global memory pool and GUI structure void startup_init_gui() { short a,proc=0; // Create a global memory pool and GUI structure if (!(global_memory_pool=NewMemHandle(1024,512,MEMF_CLEAR|MEMF_PUBLIC)) || !(GUI=AllocMemH(global_memory_pool,sizeof(GUI_Glue))) || !(GUI->screen_title=AllocMemH(global_memory_pool,256)) || !(GUI->filter_string=AllocMemH(global_memory_pool,256))) quit(0); // Initialise lists InitListLock(&GUI->lister_list,0); InitListLock(&GUI->buffer_list,0); InitListLock(&GUI->buttons_list,0); InitListLock(&GUI->process_list,0); InitListLock(&GUI->group_list,0); InitListLock(&GUI->filetypes,0); InitListLock(&GUI->notify_process_list,0); InitListLock(&GUI->function_traps,0); InitListLock(&GUI->positions,0); InitListLock(&GUI->rexx_readers,0); InitListLock(&GUI->function_list,0); InitListLock(&GUI->rexx_apps,0); InitListLock(&GUI->command_list,0); #ifdef __AROS__ GUI->command_list.list.lh_Type = 255; // requires special handling #endif InitListLock(&GUI->original_cmd_list,0); InitListLock(&GUI->modules_list,0); InitListLock(&GUI->popupext_list,0); InitListLock(&GUI->iconpos_list,0); InitListLock(&GUI->startmenu_list,0); InitListLock(&GUI->open_with_list,0); GUI->command_history=Att_NewList(LISTF_POOL|LISTF_LOCK); // Initialise locks InitSemaphore(&GUI->select_lock); InitSemaphore(&GUI->req_lock); InitSemaphore(&GUI->lister_menu_lock); InitSemaphore(&GUI->hotkeys_lock); InitSemaphore(&GUI->findfile_lock); InitSemaphore(&GUI->filter_lock); InitSemaphore(&GUI->scripts_lock); InitSemaphore(&GUI->user_menu_lock); InitSemaphore(&GUI->custom_pen_lock); // Signal for getting screen close GUI->screen_signal=AllocSignal(-1); // This pointer is cleared by the registration module; big crashes if that doesn't happen #if 0 GUI->screen=(struct Screen *)1; #endif GUI->def_filename_length=FILENAME_LEN; // Initialise filter string strcpy(GUI->filter_string,"#?"); // Initial requester coordinates GUI->req_coords.Left=64; GUI->req_coords.Top=32; GUI->req_coords.Width=320; GUI->req_coords.Height=200; // Initialise selection data GUI->select_data.type=SELECT_SIMPLE; GUI->select_data.entry_type=SELECT_ENTRY_BOTH; strcpy(GUI->select_data.name,"*"); GUI->select_data.name_match=SELECT_MATCH_MATCH; GUI->select_data.date_from[0]=0; GUI->select_data.date_to[0]=0; GUI->select_data.date_match=SELECT_MATCH_IGNORE; GUI->select_data.bits=0; GUI->select_data.bits_match=SELECT_MATCH_IGNORE; GUI->select_data.compare=0; GUI->select_data.compare_match=SELECT_MATCH_IGNORE; GUI->select_data.include=SELECT_INCLUDE; // Get decimal separator GUI->decimal_sep=(locale.li_Locale)?locale.li_Locale->loc_GroupSeparator[0]:','; // Locale patches installed? if (locale.li_LocaleBase && ((struct LocaleBase *)locale.li_LocaleBase)->lb_SysPatches) GUI->flags|=GUIF_LOCALE_OK; // Calculate width of date field if (locale.li_LocaleBase) { char *str; short day,len; #define LocaleBase locale.li_LocaleBase // Get lengths of days of the week for (day=DAY_1; day<=DAY_7; day++) { if ((str=(char *)GetLocaleStr(locale.li_Locale,day)) && (len=strlen(str))>GUI->date_length) GUI->date_length=len; } // Yesterday, etc for (day=YESTERDAYSTR; day<=FUTURESTR; day++) { if ((str=(char *)GetLocaleStr(locale.li_Locale,day)) && (len=strlen(str))>GUI->date_length) GUI->date_length=len; } } // Otherwise, use default (Yesterday) else GUI->date_length=9; // See if SysIHack is running if (FindTask("« sysihack »")) GUI->flags|=GUIF_SYSIHACK; // Allocate a string for spaces, and the global undo buffer if (!(str_space_string=AllocMemH(global_memory_pool,MAXDISPLAYLENGTH)) || !(GUI->global_undo_buffer=AllocMemH(global_memory_pool,1024))) quit(0); for (a=0; a<MAXDISPLAYLENGTH-1; a++) str_space_string[a]=' '; // Allocate backdrop patterns if (!(GUI->pattern=AllocMemH(global_memory_pool,sizeof(PatternData)*3))) quit(0); // Initialise requester pattern #if defined(__MORPHOS__) GUI->req_pattern.hook.h_Entry = (HOOKFUNC)HookEntry; GUI->req_pattern.hook.h_SubEntry=(ULONG (*)())PatternBackfill; #else GUI->req_pattern.hook.h_Entry=(ULONG (*)())PatternBackfill; #endif GUI->req_pattern.hook.h_Data=0; GUI->req_pattern.pattern=&GUI->pattern[PATTERN_REQ]; GUI->req_pattern.disabled=FALSE; // Set requester pattern hook in library SetReqBackFill(&GUI->req_pattern.hook,&GUI->screen_pointer); GUI->flags2|=GUIF2_BACKFILL_SET; // Build kickstart version string if (GetVar("Kickstart",GUI->ver_kickstart,15,GVF_GLOBAL_ONLY)<1) { char *ptr3; ULONG ptr,*ptr2; UWORD ver,rev; #ifdef __AROS__ ver = ((struct Library *)SysBase)->lib_Version; rev = ((struct Library *)SysBase)->lib_Revision; #else ptr2=(ULONG *)0xffffec; ptr=0x1000000-(*ptr2); ptr3=(char *)ptr+12; ptr2=(ULONG *)ptr3; ptr=*ptr2; ver=ptr>>16; rev=ptr&(((1<<32)-(1<<16))-1); #endif lsprintf(GUI->ver_kickstart,"%ld.%ld",ver,rev); }
// Initialise a new lister IPC_StartupCode(lister_init, Lister *, lister, static) { // Store IPC and lister pointers lister->ipc=ipc; ipc->userdata=lister; // Store IPC pointer in backdrop info lister->backdrop_info->ipc=ipc; // Path history list lister->path_history=Att_NewList(LISTF_LOCK); // Initialise reselection InitReselect(&lister->reselect); lister->abort_signal=-1; // Create message ports and signals if (!(lister->app_port=CreateMsgPort()) || !(lister->timer_port=CreateMsgPort()) || (lister->hot_name_bit=AllocSignal(-1))==-1 || (lister->abort_signal=AllocSignal(-1))==-1) return 0; // Allocate some timers if (!(lister->busy_timer=AllocTimer(UNIT_VBLANK,lister->timer_port)) || !(lister->scroll_timer=AllocTimer(UNIT_VBLANK,lister->timer_port)) || !(lister->edit_timer=AllocTimer(UNIT_VBLANK,lister->timer_port)) || !(lister->foo_timer=AllocTimer(UNIT_VBLANK,lister->timer_port))) return 0; StartTimer(lister->foo_timer,5,0); // Create regions if (!(lister->title_region=NewRegion()) || !(lister->refresh_extra=NewRegion())) return 0; // Lock buffer list lock_listlock(&GUI->buffer_list,TRUE); // Allocate initial buffer if (!(lister->cur_buffer=lister_get_empty_buffer()) && !(lister->cur_buffer=lister_new_buffer(lister))) return 0; lister->cur_buffer->buf_CurrentLister=lister; // Unlock buffer list unlock_listlock(&GUI->buffer_list); // Allocate "special" buffer if (!(lister->special_buffer=buffer_new())) return 0; // Build popup menu lister_build_menu(lister); // Initialise flags lister->flags|=LISTERF_FIRST_TIME; lister->flags2|=LISTERF2_UNAVAILABLE; lister->tool_sel=-1; lister->toolbar_offset=0; // Fix priority lister->normal_pri=environment->env->settings.pri_lister[0]; lister->busy_pri=environment->env->settings.pri_lister[1]; SetTaskPri((struct Task *)lister->ipc->proc,lister->normal_pri); // Get font to use lister->lister_font.ta_Name=lister->font_name; lister->lister_font.ta_YSize=lister->font_size; lister->lister_font.ta_Flags=0; lister->lister_font.ta_Style=0; // Open font if ((lister->font=OpenDiskFont(&lister->lister_font))) { // Proportional font? if (lister->font->tf_Flags&FPF_PROPORTIONAL) lister->more_flags|=LISTERF_PROP_FONT; // Set font in text area InitRastPort(&lister->text_area.rast); SetFont(&lister->text_area.rast,lister->font); } return 1; }
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)); }