// Allocate a new environment structure Cfg_Environment *environment_new(void) { Cfg_Environment *env; // Allocate new environment structure if (!(env=AllocVec(sizeof(Cfg_Environment),MEMF_CLEAR)) || !(env->memory=NewMemHandle(0,0,MEMF_CLEAR)) || !(env->desktop_memory=NewMemHandle(1024,512,MEMF_PUBLIC|MEMF_CLEAR)) || !(env->volatile_memory=NewMemHandle(1024,sizeof(ButtonBankNode)+256,MEMF_PUBLIC|MEMF_CLEAR))) { environment_free(env); return 0; } // Initialise environment InitSemaphore(&env->lock); NewList((struct List *)&env->path_formats); NewList((struct List *)&env->path_list); NewList((struct List *)&env->sound_list); strcpy(env->toolbar_path,"dopus5:buttons/toolbar"); strcpy(env->menu_path,"dopus5:buttons/lister menu"); strcpy(env->user_menu_path,"dopus5:buttons/user menu"); strcpy(env->hotkeys_path,"dopus5:buttons/hotkeys"); strcpy(env->scripts_path,"dopus5:buttons/scripts"); NewList((struct List *)&env->desktop); InitSemaphore(&env->desktop_lock); InitSemaphore(&env->sound_lock); // Allocate space for settings if (!(env->env=AllocMemH(env->memory,sizeof(CFG_ENVR)))) { environment_free(env); return 0; } // Get default settings DefaultEnvironment(env->env); return env; }
// Create a new backdrop handle BackdropInfo *backdrop_new(IPCData *ipc,ULONG flags) { BackdropInfo *info; // Allocate structure if (!(info=AllocVec(sizeof(BackdropInfo),MEMF_CLEAR))) return 0; // Create memory pool info->memory=NewMemHandle(2048,512,MEMF_CLEAR); // Initialise stuff InitListLock(&info->objects,0); InitSemaphore(&info->window_lock); InitSemaphore(&info->idcmp_lock); NewList(&info->boopsi_list); info->ipc=ipc; info->flags=flags; return info; }
short LIBFUNC L_Config_Filetypes( REG(a0, struct Screen *screen), REG(a1, IPCData *ipc), REG(a2, IPCData *owner_ipc), REG(d0, ULONG command_list), REG(a3, char *name)) { config_filetypes_data *data; IPCMessage *quit_msg=0; short undo_flag=0,pending_quit=0; short ret=0,fontsize; struct IBox pos; ConfigWindow dims; // Allocate data and memory handle if (!(data=AllocVec(sizeof(config_filetypes_data),MEMF_CLEAR)) || !(data->memory=NewMemHandle(4096,256,MEMF_CLEAR))) return 0; // Save pointers data->ipc=ipc; data->owner_ipc=owner_ipc; data->command_list=command_list; // Initialise data NewList(&data->list_list); InitListLock(&data->proc_list,0); // Fill in new window data->newwin.parent=screen; data->newwin.dims=&dims; data->newwin.title=GetString(locale,MSG_FILETYPES_TITLE); data->newwin.locale=locale; data->newwin.flags=WINDOW_SCREEN_PARENT|WINDOW_VISITOR|WINDOW_REQ_FILL|WINDOW_AUTO_KEYS|WINDOW_SIZE_BOTTOM; // Get default size dims=_config_filetypes_window; // Get saved position if (LoadPos("dopus/windows/filetypes",&pos,&fontsize)) { dims.char_dim.Width=0; dims.char_dim.Height=0; dims.fine_dim.Width=pos.Width; dims.fine_dim.Height=pos.Height; } // Open window and add objects if (!(data->window=OpenConfigWindow(&data->newwin)) || !(data->objlist=AddObjectList(data->window,_config_filetypes_objects))) { CloseConfigWindow(data->window); FreeMemHandle(data->memory); FreeVec(data); return 0; } // Set minimum size SetConfigWindowLimits(data->window,&_config_filetypes_window,0); // Read filetype list SetWindowBusy(data->window); filetype_read_list(data->memory,&data->list_list); // Build display list filetype_build_list(data); ClearWindowBusy(data->window); // Name to edit? if (name) filetype_edit_name(data,name); // Event loop FOREVER { struct IntuiMessage *msg; IPCMessage *imsg; int quit_flag=0; // Any IPC messages? while ((imsg=(IPCMessage *)GetMsg(ipc->command_port))) { // Look at command switch (imsg->command) { // Quit case IPC_QUIT: quit_flag=1; quit_msg=imsg; imsg=0; data->change=0; break; // Activate case IPC_ACTIVATE: if (data->window) { // Bring window to front WindowToFront(data->window); ActivateWindow(data->window); // Edit name supplied? if (imsg->data) filetype_edit_name(data,(char *)imsg->data); } break; // Process saying goodbye case IPC_GOODBYE: { FiletypeNode *node; // Handle goodbye if ((node=(FiletypeNode *)IPC_GetGoodbye(imsg))) { // Node no longer has an editor node->editor=0; } // All process gone and pending quit? if (pending_quit && (IsListEmpty(&data->proc_list.list))) { quit_flag=1; pending_quit=2; } } break; // Got a filetype back from the editor case FILETYPEEDIT_RETURN: if (filetype_receive_edit( data, (Cfg_Filetype *)imsg->flags, (FiletypeNode *)imsg->data)) { data->change=1; imsg->command=1; } else imsg->command=0; break; } // Reply message IPC_Reply(imsg); // Check quit flag if (quit_flag) break; } // Intuimessages if (data->window) { while ((msg=GetWindowMsg(data->window->UserPort))) { struct IntuiMessage msg_copy; UWORD id; // Copy message and reply msg_copy=*msg; ReplyWindowMsg(msg); if (pending_quit) continue; // Look at message switch (msg_copy.Class) { // Close window case IDCMP_CLOSEWINDOW: quit_flag=1; undo_flag=1; break; // Gadget case IDCMP_GADGETUP: id=((struct Gadget *)msg_copy.IAddress)->GadgetID; switch (id) { // Cancel case GAD_FILETYPES_CANCEL: undo_flag=1; // Use case GAD_FILETYPES_USE: quit_flag=1; break; // Filetype selected case GAD_FILETYPES_LIST: { Att_Node *node; // Enable buttons filetype_able_buttons(data,FALSE); // Get selection if (!(node=Att_FindNode(data->filetype_list,msg_copy.Code))) break; // Double-click? if (node==data->sel_filetype && DoubleClick( data->seconds,data->micros, msg_copy.Seconds,msg_copy.Micros)) { // Launch editor for this filetype filetype_edit(data,(FiletypeNode *)data->sel_filetype->data,0); } // New selection else { data->sel_filetype=node; data->seconds=msg_copy.Seconds; data->micros=msg_copy.Micros; } } break; // Add a new filetype case GAD_FILETYPES_DUPLICATE: if (!data->sel_filetype) break; case GAD_FILETYPES_ADD: { Cfg_FiletypeList *list; Cfg_Filetype *type=0; // Allocate a new filetype list if ((list=AllocMemH(data->memory,sizeof(Cfg_FiletypeList)))) { // Initialise list NewList(&list->filetype_list); // Copy existing filetype? if ((((struct Gadget *)msg_copy.IAddress)->GadgetID== GAD_FILETYPES_DUPLICATE)) { // Copy filetype type=CopyFiletype( ((FiletypeNode *)data->sel_filetype->data)->type, data->memory); } // Allocate a new filetype else if ((type=NewFiletype(data->memory))) { // Initialise name strcpy(type->type.name,GetString(locale,MSG_UNTITLED)); } // Get a filetype? if (type) { // Add filetype list to main list AddTail(&data->list_list,&list->node); // Add filetype to list AddTail(&list->filetype_list,&type->node); // Set list pointer type->list=list; list->flags=FTLISTF_CHANGED; } // Failed else FreeMemH(list); } // Got new filetype? if (type) { Att_Node *node; // Remove existing list SetGadgetChoices( data->objlist, GAD_FILETYPES_LIST, (APTR)~0); // Add entry for this filetype node=filetype_add_entry(data,type); // Handle new nodes filetype_new_node(data,node); } } break; // Edit filetype case GAD_FILETYPES_EDIT: // Valid selection? if (data->sel_filetype) { // Launch editor for this filetype filetype_edit(data,(FiletypeNode *)data->sel_filetype->data,0); } break; // Remove/Store case GAD_FILETYPES_REMOVE: case GAD_FILETYPES_STORE: // Valid selection? if (data->sel_filetype) { short ret; // Remove filetype if ((ret= filetype_remove( data, data->sel_filetype, (id==GAD_FILETYPES_STORE)))==1) { data->change=1; data->sel_filetype=0; } // Quit? else if (ret==-1) { quit_flag=1; } } break; } break; // Key press case IDCMP_RAWKEY: // Help? if (msg_copy.Code==0x5f && !(msg_copy.Qualifier&VALID_QUALIFIERS)) { // Set busy pointer SetWindowBusy(data->window); // Send help command IPC_Command(data->owner_ipc,IPC_HELP,(1<<31),"File Types",0,REPLY_NO_PORT); // Clear busy pointer ClearWindowBusy(data->window); } break; } // Check quit flag if (quit_flag) break; } } // Check quit flag if (quit_flag) { if (!pending_quit) { SetWindowBusy(data->window); if (!(IPC_ListQuit(&data->proc_list,0,!undo_flag,FALSE))) pending_quit=2; else pending_quit=1; } } // Set to break? if (pending_quit==2) { // Save filetypes? if (data->change && !undo_flag) { if (!(ret=filetype_save(data))) { // Abort save/quit ClearWindowBusy(data->window); pending_quit=0; continue; } } break; } // Wait for an event Wait(1<<ipc->command_port->mp_SigBit| ((data->window)?1<<data->window->UserPort->mp_SigBit:0)); } // Save window position if (data->window) { struct IBox pos; pos.Left=data->window->LeftEdge; pos.Top=data->window->TopEdge; pos.Width=data->window->Width-data->window->BorderLeft-data->window->BorderRight; pos.Height=data->window->Height-data->window->BorderTop-data->window->BorderBottom; SavePos("dopus/windows/filetypes",(struct IBox *)&pos,data->window->RPort->TxHeight); } // Close up CloseConfigWindow(data->window); // Free data Att_RemList(data->filetype_list,REMLIST_FREEDATA); FreeMemHandle(data->memory); FreeVec(data); // Reply quit message IPC_Reply(quit_msg); return ret; }
// 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); }
// Add an AppIcon from rexx long rexx_add_appicon(char *str,struct RexxMsg *msg) { char iconfile[256],menustem[80]; RexxAppThing *app; struct TagItem *tags; short key,menu_count=0,count; long base=0; APTR memory; // Allocate AppNode if (!(app=AllocVec(sizeof(RexxAppThing),MEMF_CLEAR))) return 0; // Allocate memory handle if (!(memory=NewMemHandle(0,0,MEMF_CLEAR))) { FreeVec(app); return 0; } // Set type app->node.ln_Type=REXXAPP_ICON; // Initialise position app->pos_x=NO_ICON_POSITION; app->pos_y=NO_ICON_POSITION; // Get port name rexx_parse_word(&str,app->port_name,sizeof(app->port_name)); // Get icon name rexx_parse_word(&str,app->icon_name,sizeof(app->icon_name)); // Get ID rexx_skip_space(&str); app->id=rexx_parse_number(&str,0,0); // Clear buffers iconfile[0]=0; menustem[0]=0; // Position set? rexx_skip_space(&str); while ((key=rexx_match_keyword(&str,pos_keys,0))!=-1) { // Position? if (key==APPARG_POS) { // Get position app->pos_x=rexx_parse_number(&str,1,NO_ICON_POSITION); app->pos_y=rexx_parse_number(&str,0,NO_ICON_POSITION); } // Quotes? else if (key==APPARG_QUOTES) app->flags|=RATF_QUOTES; // Info? else if (key==APPARG_INFO) app->flags|=RATF_INFO; // Snapshot else if (key==APPARG_SNAP) app->flags|=RATF_SNAP; // Close else if (key==APPARG_CLOSE) app->flags|=RATF_CLOSE; // Local else if (key==APPARG_LOCAL) app->flags|=RATF_LOCAL; // Locked else if (key==APPARG_LOCKED) app->flags|=RATF_LOCKED; // Icon else if (key==APPARG_ICON) { // Get filename rexx_parse_word(&str,iconfile,256); } // Menu else if (key==APPARG_MENU) { // Get menu stem if (rexx_parse_word(&str,menustem,30)) { // Check stem has a period if (menustem[0] && menustem[strlen(menustem)-1]!='.') strcat(menustem,"."); } } // Skip spaces rexx_skip_space(&str); } // Try and get icon if (iconfile[0]) app->icon=GetCachedDiskObject(iconfile,GCDOF_NOCACHE); // Failed? Get default if (!app->icon && !(app->icon=GetCachedDefDiskObject(WBTOOL|GCDOF_NOCACHE))) { // Failed completely FreeVec(app); return 0; } // Set icon position app->icon->do_CurrentX=app->pos_x-WBICONMAGIC_X; app->icon->do_CurrentY=app->pos_y-WBICONMAGIC_Y; SetIconFlags(app->icon,GetIconFlags(app->icon)&~ICONF_POSITION_OK); // Remap the icon (only if a local one) if (app->flags&RATF_LOCAL) RemapIcon(app->icon,GUI->screen_pointer,FALSE); // Menu items? if (menustem[0]) { char buffer[10]; // Get count rexx_get_var(msg,menustem,"COUNT",buffer,10); menu_count=atoi(buffer); // Get base if (rexx_get_var(msg,menustem,"BASE",buffer,10)) base=atoi(buffer); } // Number of tags needed count=7+menu_count; // Allocate tags if ((tags=AllocMemH(memory,sizeof(struct TagItem)*count))) { // Initialise tags tags[0].ti_Tag=DAE_SnapShot; tags[0].ti_Data=(app->flags&RATF_SNAP)?1:0; tags[1].ti_Tag=DAE_Info; tags[1].ti_Data=(app->flags&RATF_INFO)?1:0; tags[2].ti_Tag=DAE_Close; tags[2].ti_Data=(app->flags&RATF_CLOSE)?1:0; tags[3].ti_Tag=(app->flags&RATF_LOCAL)?DAE_Local:TAG_IGNORE; tags[3].ti_Data=1; tags[4].ti_Tag=DAE_Locked; tags[4].ti_Data=(app->flags&RATF_LOCKED)?1:0; tags[5].ti_Tag=DAE_MenuBase; tags[5].ti_Data=base; // Go through menus for (count=0;count<menu_count;count++) { char buffer[80]; // Build variable name lsprintf(iconfile,"%ld",count); // Get variable if (rexx_get_var(msg,menustem,iconfile,buffer,80)) { // Allocate buffer if ((tags[count+6].ti_Data=(ULONG)AllocMemH(memory,strlen(buffer)+1))) { // Copy name strcpy((char *)tags[count+6].ti_Data,buffer); // Set tag ID tags[count+6].ti_Tag=DAE_Menu; } else tags[count+6].ti_Tag=TAG_IGNORE; } // Skip this tag else tags[count+6].ti_Tag=TAG_IGNORE; } } // Add AppIcon app->app_thing= AddAppIconA( app->id, (ULONG)app, app->icon_name, GUI->rexx_app_port, 0, app->icon, tags); // Free memory FreeMemHandle(memory); // Failed? if (!app->app_thing) { // Failed if (app->flags&RATF_LOCAL) RemapIcon(app->icon,GUI->screen_pointer,FALSE); FreeCachedDiskObject(app->icon); FreeVec(app); return 0; } // Add to AppList lock_listlock(&GUI->rexx_apps,TRUE); AddTail(&GUI->rexx_apps.list,(struct Node *)app); unlock_listlock(&GUI->rexx_apps); return (long)app; }