// Display a buffer in a lister // Called from LISTER PROCESS void lister_show_buffer(Lister *lister,DirBuffer *buffer,int show,BOOL active) { // Different to current buffer? if (lister->cur_buffer!=buffer) { // End a direct edit lister_end_edit(lister,0); // Clear lock pointer in current buffer buffer_clear_lock(lister->cur_buffer,0); // Free icons backdrop_free_list(lister->backdrop_info); // Store new buffer pointer lister->cur_buffer=buffer; buffer->buf_CurrentLister=lister; // Remove buffer and add to head of list Remove(&buffer->node); AddHead(&GUI->buffer_list.list,&buffer->node); // See if buffer needs to be resorted lister_resort(lister,0); // Clear save status flag lister->flags&=~LISTERF_SAVE_STATUS; // Does new buffer have a custom handler? if (lister->cur_buffer->buf_CustomHandler[0] && active) { // Send active message buffer_active(lister->cur_buffer,0); } // Add to history list lister_add_history(lister); } // Initialise path field if (show && lister_valid_window(lister)) { // Is volume present? if (!lister->cur_buffer->buf_CustomHandler[0] && VolumePresent(buffer)) { BPTR lock; struct FileInfoBlock __aligned fib; // Lock path if (lock=Lock(buffer->buf_Path,ACCESS_READ)) { // Store full path NameFromLock(lock,buffer->buf_ExpandedPath,512); AddPart(buffer->buf_ExpandedPath,"",512); // Examine object Examine(lock,&fib); UnLock(lock); // Save object name if (fib.fib_FileName[0]) strcpy(buffer->buf_ObjectName,fib.fib_FileName); else { if (buffer->flags&DWF_ROOT) { char *ptr; stccpy(buffer->buf_ObjectName,buffer->buf_ExpandedPath,GUI->def_filename_length-1); if (ptr=strchr(buffer->buf_ObjectName,':')) *ptr=0; } else stccpy(buffer->buf_ObjectName,FilePart(buffer->buf_ExpandedPath),GUI->def_filename_length-1); } } // Failed to lock else strcpy(buffer->buf_ExpandedPath,buffer->buf_Path); // Update disk name and size lister_update_name(lister); } // No, refresh disk name from buffer else lister_show_name(lister); // Not showing icons? if (!(lister->flags&LISTERF_VIEW_ICONS) || lister->flags&LISTERF_ICON_ACTION) { // Update path field lister_update_pathfield(lister); // Refresh window lister_refresh_display(lister,REFRESHF_SLIDERS|REFRESHF_STATUS|REFRESHF_CLEAR_ICONS); // Show selection information select_show_info(lister,1); } } }
void lister_close_window(Lister *lister,BOOL run_script) { short a; // If busy, hide progress window if (lister->progress_window) HideProgressWindow(lister->progress_window); // Fix current directory UnLock(CurrentDir(0)); // Free icon remapping backdrop_free_remap(lister->backdrop_info,lister->window); // Close window if (lister->window) { // Cancel edit lister_end_edit(lister,EDITF_CANCEL|EDITF_NOREFRESH); // Remove 'hot name' requester lister_rem_hotname(lister); // Run script? if (run_script) { char buf[16]; // Build handle string lsprintf(buf,"%ld",lister); // Run script RunScript(SCRIPT_CLOSE_LISTER,buf); } // Remove AppWindow RemoveAppWindow(lister->appwindow); lister->appwindow=0; // Remember window coordinates StoreWindowDims(lister->window,&lister->dimensions); if (lister->more_flags&LISTERF_TITLEBARRED) { lister->dimensions.wd_Normal.Width=lister->restore_dims.Width; lister->dimensions.wd_Normal.Height=lister->restore_dims.Height; } // If window was busy, abort timer if (lister->flags&LISTERF_BUSY) StopTimer(lister->busy_timer); // Clear menus display_free_menu(lister->window); // Free DrawInfo if (lister->drawinfo) { FreeScreenDrawInfo(lister->window->WScreen,lister->drawinfo); lister->drawinfo=0; } // Have we got a buffer? if (lister->cur_buffer) { // Store dimensions of window in buffer lister->cur_buffer->dimensions=*((struct IBox *)&lister->window->LeftEdge); lister->cur_buffer->dim_valid=1; } // Got Drag info? if (lister->drag_info) { // Free it FreeDragInfo(lister->drag_info); lister->drag_info=0; } // Close window CloseWindow(lister->window); lister->window=0; // Free edit hook FreeEditHook(lister->path_edit_hook); lister->path_edit_hook=0; } // Free render bitmap DisposeBitMap(lister->render_bitmap); lister->render_bitmap=0; // Free backdrop stuff backdrop_free_info(lister->backdrop_info); // Free gauge gadget if (lister->gauge_gadget) { DisposeObject((Object *)lister->gauge_gadget); lister->gauge_gadget=0; } // Free pens for (a=0;a<ENVCOL_MAX;a++) lister_init_colour(lister,a,TRUE); // Remember flags lister->old_flags=lister->flags; // Clear flags lister->flags&= LISTERF_LOCK_POS| LISTERF_ICONIFIED| LISTERF_BUSY| LISTERF_VIEW_ICONS| LISTERF_ICON_ACTION| LISTERF_SHOW_ALL; // Store source/destination status if (lister->old_flags&LISTERF_SOURCE) lister->flags|=LISTERF_STORED_SOURCE; else if (lister->old_flags&LISTERF_DEST) lister->flags|=LISTERF_STORED_DEST; }