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; }
// 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); }