// Reset window menus void display_reset_menus(BOOL main_only,BOOL fix_only) { // Do main window if (GUI->window) { // Reset? if (!fix_only) { // Free existing menu display_free_menu(GUI->window); // Get new menu display_get_menu(GUI->window); } // Fix checkmarks display_fix_menu(GUI->window,WINDOW_BACKDROP,0); } // Doing main window only? if (main_only) return; // Signal children to reset their menus IPC_ListCommand(&GUI->lister_list,IPC_RESET,!fix_only,0,0); IPC_ListCommand(&GUI->buttons_list,IPC_RESET,!fix_only,0,0); IPC_ListCommand(&GUI->process_list,IPC_RESET,!fix_only,0,0); IPC_ListCommand(&GUI->group_list,IPC_RESET,!fix_only,0,0); }
// Group handler void __saveds backdrop_group_handler(void) { IPCData *ipc; GroupData *group=0; // Do group if (ipc=IPC_ProcStartup((ULONG *)&group,backdrop_group_init)) { // Read objects SetBusyPointer(group->window); backdrop_read_group_objects(group); ClearPointer(group->window); // Event loop FOREVER { IPCMessage *msg; BOOL quit_flag=0; // Got an AppWindow? if (group->appwindow) { DOpusAppMessage *amsg; BOOL beep=0; // AppMessages? while (amsg=(DOpusAppMessage *)GetMsg(group->appport)) { short arg; char path[256]; BackdropObject *drop_obj; // Lock backdrop list lock_listlock(&group->info->objects,1); // Set busy pointer if (group->window) SetBusyPointer(group->window); // Dropped on an object? if (drop_obj=backdrop_get_object(group->info,amsg->da_Msg.am_MouseX,amsg->da_Msg.am_MouseY,0)) { USHORT qual; // Get qualifiers qual=(InputBase)?PeekQualifier():0; // Is shift/alt down? if (qual&(IEQUALIFIER_LSHIFT|IEQUALIFIER_LALT)==(IEQUALIFIER_LSHIFT|IEQUALIFIER_LALT)) { // Get path of first file GetWBArgPath(&amsg->da_Msg.am_ArgList[0],path,256); // Replace the image backdrop_replace_icon_image(group->info,path,drop_obj); } // Run program with args else backdrop_object_open( group->info, drop_obj, 0, 0, amsg->da_Msg.am_NumArgs, amsg->da_Msg.am_ArgList); } // Otherwise, adding objects to the group else for (arg=0;arg<amsg->da_Msg.am_NumArgs;arg++) { // Valid name? if (*amsg->da_Msg.am_ArgList[arg].wa_Name) { short x,y; // Get full path name GetWBArgPath(&amsg->da_Msg.am_ArgList[arg],path,256); // Default to no position x=-1; y=-1; // Dopus app message? if (CheckAppMessage(amsg)) { // Get icon position x=amsg->da_DragOffset.x+amsg->da_Msg.am_MouseX+amsg->da_DropPos[arg].x; y=amsg->da_DragOffset.y+amsg->da_Msg.am_MouseY+amsg->da_DropPos[arg].y; } // Add group object backdrop_group_add_object(group->name,group->info,path,x,y); } // Otherwise, set beep flag for error else if (!beep) { beep=1; DisplayBeep(group->window->WScreen); } } // Clear busy pointer if (group->window) ClearPointer(group->window); // Unlock backdrop list unlock_listlock(&group->info->objects); // Reply to message ReplyMsg((struct Message *)amsg); } } // Icon notification if (group->info->notify_req) { DOpusNotify *notify; // Get notify message if (notify=(DOpusNotify *)GetMsg(group->info->notify_port)) backdrop_check_notify(group->info,notify,0); } // IPC messages? while (msg=(IPCMessage *)GetMsg(ipc->command_port)) { // Look at message switch (msg->command) { // Activate case IPC_ACTIVATE: // Bring window to front if (group->window) backdrop_show_group(group); break; // Quit case IPC_QUIT: quit_flag=1; group->got_quit=1; break; // Hide case IPC_HIDE: backdrop_hide_group(group); break; // Show case IPC_SHOW: group->screen=(struct Screen *)msg->data; backdrop_show_group(group); break; // Reset (menus) case IPC_RESET: // Gotta window? if (group->window) { // Reset menus? if (msg->flags) { display_free_menu(group->window); display_get_menu(group->window); } // Fix menus display_fix_menu(group->window,WINDOW_GROUP,0); } break; // New font case GROUP_NEW_FONT: // Get new font backdrop_get_font(group->info); // Redraw objects backdrop_show_objects(group->info,BDSF_CLEAR|BDSF_RESET); break; // New name case GROUP_NEW_NAME: // Copy name strcpy(group->name,msg->data_free); // Update window title if (group->window) SetWindowTitles(group->window,group->name,(char *)-1); break; // Add a new icon case GROUP_ADD_ICON: // Lock backdrop list lock_listlock(&group->info->objects,1); // Set busy pointer if (group->window) SetBusyPointer(group->window); // Add object backdrop_group_add_object(group->name,group->info,msg->data_free,-1,-1); // Clear busy pointer if (group->window) ClearPointer(group->window); // Unlock backdrop list unlock_listlock(&group->info->objects); break; // New backfill pattern case LISTER_BACKFILL_CHANGE: // Window open? if (group->window) { // Install appropriate hook InstallLayerHook( group->window->WLayer, (msg->flags)?&group->pattern.hook:LAYERS_BACKFILL); // Redraw window erase_window(group->window); // Redraw icons backdrop_show_objects(group->info,0); } break; // Delete from group case GROUP_DELETE: SetBusyPointer(group->window); backdrop_remove_group_objects(group,(BackdropObject *)msg->data); ClearPointer(group->window); break; // Help case IPC_HELP: // Show help for group help_show_help(HELP_PROGRAM_GROUP,0); break; // Do a function case LISTER_DO_FUNCTION: // Arrange icons? if (msg->data>=(APTR)MENU_LISTER_ARRANGE_NAME && msg->data<=(APTR)MENU_LISTER_ARRANGE_SIZE) { // Do cleanup backdrop_cleanup(group->info,BSORT_NAME+(((ULONG)msg->data)-MENU_LISTER_ARRANGE_NAME),0); } break; } // Reply to message IPC_Reply(msg); } // Is window open? if (group->window) { struct IntuiMessage *imsg; // Check timer if (CheckTimer(group->timer)) { // Dragging something? if (group->info->flags&BDIF_DRAGGING) { // Check for deadlocks if (group->info->last_tick==group->info->tick_count) { // Stop drag backdrop_stop_drag(group->info); } // Remember tick count group->info->last_tick=group->info->tick_count; } // Re-start timer StartTimer(group->timer,0,500000); } // Window messages while (imsg=(struct IntuiMessage *)GetMsg(group->window->UserPort)) { struct IntuiMessage msg_copy; struct MenuItem *item; // Copy message msg_copy=*imsg; // Menu verify? if (imsg->Class==IDCMP_MENUVERIFY) { // See if we want to swallow it if (!backdrop_test_rmb(group->info,imsg,&msg_copy,TRUE)) { // Did event happen over the window? if (imsg->MouseX>=0 && imsg->MouseY>=0 && imsg->MouseX<group->window->Width && imsg->MouseY<group->window->Height && imsg->Qualifier&IEQUALIFIER_RBUTTON) { // Cancel menu event imsg->Code=MENUCANCEL; // Change our copy to MOUSEBUTTONS msg_copy.Class=IDCMP_MOUSEBUTTONS; msg_copy.Code=MENUDOWN; // Kludge for MagicMenu if (msg_copy.Seconds==0) CurrentTime(&msg_copy.Seconds,&msg_copy.Micros); } } } // Resize/refresh? if (imsg->Class==IDCMP_NEWSIZE || imsg->Class==IDCMP_REFRESHWINDOW) { // Handle message backdrop_idcmp(group->info,imsg,0); // Reply to message ReplyMsg((struct Message *)imsg); continue; } // Reply to message ReplyMsg((struct Message *)imsg); // Is it a backdrop message? if (backdrop_idcmp(group->info,&msg_copy,0)) continue; // Look at message class switch (msg_copy.Class) { // Window closed case IDCMP_CLOSEWINDOW: quit_flag=1; break; // Window is inactive case IDCMP_INACTIVEWINDOW: // Abort timer if running StopTimer(group->timer); break; // Window is active case IDCMP_ACTIVEWINDOW: // Start timer if not running StartTimer(group->timer,1,0); break; // Key press case IDCMP_RAWKEY: // Help? if (msg_copy.Code==0x5f && !(msg_copy.Qualifier&VALID_QUALIFIERS)) { help_get_help( msg_copy.MouseX+group->window->LeftEdge, msg_copy.MouseY+group->window->TopEdge, msg_copy.Qualifier); } // Close? else if (msg_copy.Code==0x45 && msg_copy.Qualifier&IEQUAL_ANYSHIFT) quit_flag=1; break; // Button pressed case IDCMP_MOUSEBUTTONS: // Right button? if (msg_copy.Code==MENUDOWN) { USHORT res; // Do popup menu if (group->popup && (res=DoPopUpMenu(group->window,&group->popup->ph_Menu,NULL,MENUDOWN))!=(USHORT)-1) { // Help? if (res&POPUP_HELPFLAG) { // Get help ID res&=~POPUP_HELPFLAG; // Do help help_menu_help(res,0); break; } // Do the function quit_flag=backdrop_group_do_function(group,res,0); } } break; // Menu event case IDCMP_MENUPICK: case IDCMP_MENUHELP: { struct Menu *oldstrip=group->window->MenuStrip; USHORT nextselect; // Get item nextselect=msg_copy.Code; while (item=ItemAddress(group->window->MenuStrip,nextselect)) { // get next nextselect=item->NextSelect; // Help? if (msg_copy.Class==IDCMP_MENUHELP) { help_menu_help((long)GTMENUITEM_USERDATA(item),0); break; } // Do the function quit_flag=backdrop_group_do_function(group,(ULONG)GTMENUITEM_USERDATA(item),item); // Check valid next if (!nextselect || !group->window || oldstrip!=group->window->MenuStrip) break; } } break; } } } // Check quit flag if (quit_flag) break; // Wait for event Wait( 1<<ipc->command_port->mp_SigBit| 1<<group->timer->port->mp_SigBit| ((group->info->notify_req)?(1<<group->info->notify_port->mp_SigBit):0)| ((group->window)?(1<<group->window->UserPort->mp_SigBit):0)| ((group->appwindow)?(1<<group->appport->mp_SigBit):0)); } // Close window backdrop_free_group(group); // Send goodbye IPC_Goodbye(ipc,&main_ipc,0); }
struct Window *lister_open_window(Lister *lister,struct Screen *screen) { struct Gadget *gadget,*lock_gad; struct IBox *dims; ULONG mode; // If lister is already open, return if (!lister || lister->window) return lister->window; // Is lister meant to be iconified? if (lister->flags&LISTERF_ICONIFIED) return 0; // Is lister iconified? if (lister->appicon) { // Update icon position lister_update_icon(lister); // Remove AppIcon RemoveAppIcon(lister->appicon); lister->appicon=0; // Free icon if (lister->appicon_icon) { FreeDiskObjectCopy(lister->appicon_icon); lister->appicon_icon=0; } } // If lister was zoomed, swap dimensions around if ((lister->dimensions.wd_Flags&(WDF_VALID|WDF_ZOOMED))==(WDF_VALID|WDF_ZOOMED)) { struct IBox temp; // Swap dimensions temp=lister->dimensions.wd_Zoomed; lister->dimensions.wd_Zoomed=lister->dimensions.wd_Normal; lister->dimensions.wd_Normal=temp; // Clear zoomed flag lister->dimensions.wd_Flags&=~WDF_ZOOMED; } // Get dimensions pointer dims=&lister->dimensions.wd_Normal; // Get screen font AskFont(&screen->RastPort,&lister->screen_font); // Calculate minimum size lister_calc_limits(lister,screen); // Check lister size against minimums if (dims->Width<lister->win_limits.Left) dims->Width=lister->win_limits.Left; if (dims->Height<lister->win_limits.Top) dims->Height=lister->win_limits.Top; // Initialise backfill pattern #if defined(__MORPHOS__) lister->pattern.hook.h_Entry = (HOOKFUNC)HookEntry; lister->pattern.hook.h_SubEntry=(ULONG (*)())PatternBackfill; #else lister->pattern.hook.h_Entry=(ULONG (*)())PatternBackfill; #endif lister->pattern.hook.h_Data=lister->backdrop_info; lister->pattern.pattern=&GUI->pattern[PATTERN_LISTER]; // Is pattern initially enabled? if (lister->flags&LISTERF_VIEW_ICONS) lister->pattern.disabled=FALSE; else lister->pattern.disabled=TRUE; // Get refresh mode if (environment->env->lister_options&LISTEROPTF_SIMPLE) mode=WA_SimpleRefresh; else mode=WA_SmartRefresh; // Initialise boopsi list NewList(&lister->backdrop_info->boopsi_list); // Create iconify gadget gadget= create_iconify_gadget( screen, &lister->backdrop_info->boopsi_list, (lister->flags&LISTERF_LOCK_POS)?TRUE:FALSE); // Create lock gadget if (!(GUI->flags2&GUIF2_NO_PADLOCK) && (lock_gad= CreateTitleGadget( screen, &lister->backdrop_info->boopsi_list, (lister->flags&LISTERF_LOCK_POS)?TRUE:FALSE, (gadget)?-gadget->Width+TBGADGETOFFSET:0, IM_LOCK, GAD_LOCK))) { // Chain gadgets if (gadget) gadget->NextGadget=lock_gad; else gadget=lock_gad; // Fix selection flags lock_gad->Activation|=GACT_TOGGLESELECT; if (lister->more_flags&LISTERF_LOCK_FORMAT) lock_gad->Flags|=GFLG_SELECTED; } // Open lister window if (!(lister->window=OpenWindowTags(0, WA_Left,dims->Left, WA_Top,dims->Top, WA_Width,dims->Width, WA_Height,dims->Height, WA_MinWidth,lister->win_limits.Left, WA_MinHeight,lister->win_limits.Top, WA_MaxWidth,(ULONG)~0, WA_MaxHeight,(ULONG)~0, (lister->dimensions.wd_Flags&WDF_VALID)?WA_Zoom:TAG_IGNORE,(ULONG)&lister->dimensions.wd_Zoomed, WA_IDCMP, IDCMP_ACTIVEWINDOW| IDCMP_CHANGEWINDOW| IDCMP_CLOSEWINDOW| IDCMP_GADGETDOWN| IDCMP_GADGETUP| IDCMP_INACTIVEWINDOW| IDCMP_MENUHELP| IDCMP_MENUPICK| IDCMP_MENUVERIFY| IDCMP_MOUSEBUTTONS| IDCMP_MOUSEMOVE| #ifdef __amigaos4__ IDCMP_EXTENDEDMOUSE| #endif IDCMP_NEWSIZE| IDCMP_REFRESHWINDOW| IDCMP_RAWKEY, WA_AutoAdjust,TRUE, WA_CloseGadget,!(lister->flags&LISTERF_LOCK_POS), WA_DragBar,!(lister->flags&LISTERF_LOCK_POS), WA_DepthGadget,TRUE, WA_MenuHelp,TRUE, WA_NewLookMenus,TRUE, WA_SizeGadget,TRUE, WA_SizeBRight,TRUE, WA_SizeBBottom,TRUE, WA_CustomScreen,screen, WA_ScreenTitle,GUI->screen_title, WA_WindowName, DOPUS_WIN_NAME, WA_Gadgets,gadget, mode,TRUE, (lister->flags&LISTERF_LOCK_POS)?WA_Title:TAG_IGNORE,"", WA_BackFill,&lister->pattern, TAG_END))) return 0; // Fix title gadgets FixTitleGadgets(lister->window); // Save left border lister->old_border_left=lister->window->BorderLeft; // Initialise ID SetWindowID(lister->window,&lister->id,WINDOW_LISTER,(struct MsgPort *)lister->ipc); // Initialise dimensions InitWindowDims(lister->window,&lister->dimensions); // Close existing font if (lister->font) CloseFont(lister->font); // Clear proportional font flag lister->more_flags&=~LISTERF_PROP_FONT; // Open font if ((lister->font=OpenDiskFont(&lister->lister_font))) { // Proportional font? if (lister->font->tf_Flags&FPF_PROPORTIONAL) { lister->more_flags|=LISTERF_PROP_FONT; } } // Got a font? if (lister->font) { // Set font in window and text area SetFont(lister->window->RPort,lister->font); SetFont(&lister->text_area.rast,lister->font); } // Otherwise, get info on default font else { // Get font info AskFont(lister->window->RPort,&lister->lister_font); } // Get DrawInfo lister->drawinfo=GetScreenDrawInfo(lister->window->WScreen); // Set menus display_get_menu(lister->window); display_fix_menu( lister->window, (lister->flags&LISTERF_VIEW_ICONS)?WINDOW_LISTER_ICONS:WINDOW_LISTER, lister); lister_fix_menus(lister,0); // Initialise backdrop info backdrop_init_info(lister->backdrop_info,lister->window,0); // Turn on gauge if needed lister_set_gauge(lister,FALSE); // Fill out size covering gadget if ((gadget=FindGadgetType(lister->window->FirstGadget,GTYP_SIZING))) { // Copy size gadget fill_out_cover_gadget(gadget,&lister->size_cover_gadget); // Clear image in original gadget if lister is locked if (lister->flags&LISTERF_LOCK_POS) { gadget->Flags&=~GFLG_GADGIMAGE; gadget->GadgetRender=0; } } // Fill out zoom covering gadget if ((gadget=FindGadgetType(lister->window->FirstGadget,GTYP_WZOOM))) { // Copy zoom gadget fill_out_cover_gadget(gadget,&lister->zoom_cover_gadget); // Clear image in original gadget if lister is locked if (lister->flags&LISTERF_LOCK_POS) { // Clear image in original gadget gadget->Flags&=~GFLG_GADGIMAGE; gadget->GadgetRender=0; } // Otherwise, change gadget type else { // Clear zoom flag, set ID gadget->GadgetType&=~(GTYP_SYSTYPEMASK|GTYP_SYSGADGET); gadget->GadgetID=GAD_ZOOM; } } // Is lister locked? if (lister->flags&LISTERF_LOCK_POS) { // Add to window lister->size_cover_gadget.NextGadget=0; AddGList(lister->window,&lister->size_cover_gadget,0,1,0); RefreshWindowFrame(lister->window); } // Fix next pointer else lister->size_cover_gadget.NextGadget=&lister->zoom_cover_gadget; // Create edit hook lister->path_edit_hook= GetEditHookTags( 0, OBJECTF_NO_SELECT_NEXT, GTCustom_History,lister->path_history, TAG_END); // Create path field if (!(lister->path_field=(struct Gadget *) NewObject(0,"dopusstrgclass", GA_ID,GAD_PATH, GA_Left,lister->window->BorderLeft, GA_RelBottom,-(lister->window->BorderBottom+FIELD_FONT->tf_YSize+4), GA_RelWidth,-(lister->window->BorderLeft+lister->window->BorderRight), GA_Height,FIELD_FONT->tf_YSize+4, GA_RelVerify,TRUE, GA_Immediate,TRUE, GTCustom_ThinBorders,TRUE, GTCustom_NoGhost,TRUE, STRINGA_TextVal,(lister->cur_buffer)?lister->cur_buffer->buf_Path:"", STRINGA_MaxChars,511, STRINGA_Buffer,lister->path_buffer, STRINGA_UndoBuffer,GUI->global_undo_buffer, STRINGA_WorkBuffer,GUI->global_undo_buffer+512, STRINGA_Font,FIELD_FONT, STRINGA_EditHook,lister->path_edit_hook, TAG_END))) { lister_close(lister,0); return 0; } DoMethod((Object *)lister->path_field,OM_ADDTAIL,&lister->backdrop_info->boopsi_list); // Initialise side parent button lister->parent_button.NextGadget=lister->path_field; lister->parent_button.TopEdge=lister->window->BorderTop; lister->parent_button.Width=lister->window->BorderLeft; lister->parent_button.Height=-(lister->window->BorderTop+lister->window->BorderBottom); lister->parent_button.Flags=GFLG_GADGHCOMP|GFLG_RELHEIGHT; lister->parent_button.Activation=GACT_RELVERIFY; lister->parent_button.GadgetType=GTYP_BOOLGADGET; lister->parent_button.GadgetID=GAD_PARENT; // Try to add AppWindow lister->appwindow=AddAppWindowA( WINDOW_LISTER, (ULONG)lister, lister->window, lister->app_port,0); // Is lister busy? if (lister->flags&LISTERF_BUSY || lister->old_flags&LISTERF_BUSY) { lister->flags&=~(LISTERF_BUSY|LISTERF_LOCK|LISTERF_LOCKED); lister_busy(lister,0); } else if (lister->flags&LISTERF_LOCKED || lister->old_flags&LISTERF_LOCKED) { lister->flags&=~(LISTERF_BUSY|LISTERF_LOCK|LISTERF_LOCKED); lister_busy(lister,1); } // Initialise lister flags lister->flags&= LISTERF_LOCK_POS|LISTERF_BUSY| LISTERF_LOCK|LISTERF_LOCKED| LISTERF_VIEW_ICONS|LISTERF_SHOW_ALL|LISTERF_PATH_FIELD| LISTERF_STORED_SOURCE|LISTERF_STORED_DEST|LISTERF_ICON_ACTION| LISTERF_FIRST_TIME; lister->more_flags&=~LISTERF_TITLEBARRED; // Update selection count if in icon mode if (lister->flags&LISTERF_ICON_ACTION) backdrop_fix_count(lister->backdrop_info,0); // Initialise cursor setting lister->cursor_line=-1; lister->edit_type=-1; // Setup lister display lister_init_display(lister); lister_refresh(lister,LREFRESH_FULL); lister_refresh_name(lister); // Clear old flags lister->old_flags=0; // Is this our first time open? if (lister->flags&LISTERF_FIRST_TIME) { char buf[16]; // Build handle string lsprintf(buf,"%ld",lister); // Launch script RunScript(SCRIPT_OPEN_LISTER,buf); } // If busy, show progress window if (lister->progress_window) ShowProgressWindow(lister->progress_window,0,lister->window); // Fix current directory lister_fix_cd(lister); // Initialise things lister->title_click=-1; // Return window pointer return lister->window; }