void IdeIconDes::Save() { if(format == 1) { for(int i = 0; i < GetCount(); i++) { Image m = GetImage(i); Point p = m.Get2ndSpot(); if(m.GetKind() == IMAGE_ALPHA || p.x || p.y) { if(PromptYesNo("Legacy file format does not support images " "with full alpha channel or 2nd hotspot - " "the information would be lost.&" "Do you wish to convert the file to the new format?")) { format = 0; } break; } } } StoreToGlobal(*this, "icondes-ctrl"); Array<ImlImage> m; VectorMap<Size, Image> exp; String folder = GetFileFolder(filename); for(int i = 0; i < GetCount(); i++) { ImlImage& c = m.Add(); c.name = GetName(i); c.image = GetImage(i); c.exp = GetExport(i); if(c.exp) { Size sz = c.image.GetSize(); exp.GetAdd(sz) = c.image; PNGEncoder png; SaveChangedFile(AppendFileName(folder, String().Cat() << "icon" << sz.cx << 'x' << sz.cy << ".png"), png.SaveString(c.image)); } } String d = SaveIml(m, format); if(!SaveChangedFileFinish(filename, d)) return; filetime = FileGetTime(filename); if(exp.GetCount()) SaveChangedFile(AppendFileName(folder, "icon.ico"), WriteIcon(exp.GetValues())); }
ResultCode ArchiveManager::CreateExtSaveData(MediaType media_type, u32 high, u32 low, const std::vector<u8>& smdh_icon, const FileSys::ArchiveFormatInfo& format_info, u64 program_id) { // Construct the binary path to the archive first FileSys::Path path = FileSys::ConstructExtDataBinaryPath(static_cast<u32>(media_type), high, low); auto archive = id_code_map.find(media_type == MediaType::NAND ? ArchiveIdCode::SharedExtSaveData : ArchiveIdCode::ExtSaveData); if (archive == id_code_map.end()) { return UnimplementedFunction(ErrorModule::FS); // TODO(Subv): Find the right error } auto ext_savedata = static_cast<FileSys::ArchiveFactory_ExtSaveData*>(archive->second.get()); ResultCode result = ext_savedata->Format(path, format_info, program_id); if (result.IsError()) return result; ext_savedata->WriteIcon(path, smdh_icon.data(), smdh_icon.size()); return RESULT_SUCCESS; }
void EventLoop(void) { ULONG signal = NULL, rc; WORD code; BOOL running = TRUE; GetAttr( WINDOW_SigMask, WO_Window, &signal ); if(signal) { do { if(Wait(signal | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C ) { running=FALSE; } while (( rc = CA_HandleInput( WO_Window, &code)) != WMHI_LASTMSG) { switch(rc & WMHI_CLASSMASK) { case WMHI_CLOSEWINDOW: running=FALSE; break; case WMHI_GADGETUP: case WMHI_MENUPICK: { if((rc & WMHI_CLASSMASK) == WMHI_MENUPICK) { struct MenuItem *mi; mi = ItemAddress(Menu, rc & WMHI_MENUMASK); if(mi) { rc = (ULONG) GTMENUITEM_USERDATA(mi); } } switch( rc & WMHI_GADGETMASK) { #if 0 case ACTID_OPEN: { if(DoMethod( openreq, FRM_DOREQUEST ) == FRQ_OK) { char *file = NULL; GetAttr( FRQ_Path, openreq, (ULONG *) &file); NewSettings(file); GUINewSettings(); } break; } case ACTID_SAVEAS: { FillUnit(); if(DoMethod( savereq, FRM_DOREQUEST ) == FRQ_OK) { char *file = NULL; GetAttr( FRQ_Path, savereq, (ULONG *) &file); SaveSettings(file, UnitList); if(SaveIcons) { WriteIcon(file); } } break; } #endif case ACTID_ABOUT: Req( (char *) msgButtonOK, (char *) msgTextCopyright, "",(char *) msgTextProgramName, "1996-2003 Martin Blom" ); break; case ACTID_SAVE: FillUnit(); SaveSettings(ENVFILE, UnitList); SaveSettings(ENVARCFILE, UnitList); running=FALSE; break; case ACTID_USE: FillUnit(); SaveSettings(ENVFILE, UnitList); running=FALSE; break; case ACTID_QUIT: running=FALSE; break; case ACTID_DEFAULT: SetAttrs( WO_Window, WA_BusyPointer, TRUE, TAG_DONE); NewSettings(NULL); // This is VERY slow!! SetAttrs( WO_Window, WA_BusyPointer, FALSE, TAG_DONE); GUINewSettings(); break; case ACTID_LASTSAVED: NewSettings(ENVARCFILE); GUINewSettings(); break; case ACTID_RESTORE: NewSettings(args.from); GUINewSettings(); break; case ACTID_ICONS: { struct MenuItem *item; item = FindMenuItem(ACTID_ICONS); if(item) { if(item->Flags & CHECKED) SaveIcons = TRUE; else SaveIcons = FALSE; } break; } #if 0 case ACTID_HELP: { APTR lock = BGUI_LockWindow(Window); if(!BGUI_Help( Window, HELPFILE, "AHI", NULL)) { Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE); } BGUI_UnlockWindow(lock); break; } case ACTID_GUIDE: { APTR lock = BGUI_LockWindow(Window); if(!BGUI_Help( Window, HELPFILE, NULL, NULL)) { Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE); } BGUI_UnlockWindow(lock); break; } case ACTID_HELPINDEX: { APTR lock = BGUI_LockWindow(Window); if(!BGUI_Help( Window, HELPFILE, "Concept Index", 0)) { Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE); } BGUI_UnlockWindow(lock); break; } #endif case ACTID_UNIT: { FillUnit(); NewUnit(code); GUINewUnit(); break; } case ACTID_MODE: { FillUnit(); NewMode(code); GUINewMode(); break; } case ACTID_DEBUG: case ACTID_SURROUND: case ACTID_ECHO: case ACTID_CPULIMIT: case ACTID_CLIPMV: { ULONG debug = AHI_DEBUG_NONE, surround = FALSE, echo = 0, cpu = 90; ULONG clip = FALSE; GetAttr( CHOOSER_Active, Window_Objs[ACTID_DEBUG], &debug); GetAttr( CHOOSER_Active, Window_Objs[ACTID_SURROUND], &surround); GetAttr( CHOOSER_Active, Window_Objs[ACTID_ECHO], &echo); GetAttr( CHOOSER_Active, Window_Objs[ACTID_CLIPMV], &clip); GetAttr( INTEGER_Number, Window_Objs[ACTID_CPULIMIT], &cpu); globalprefs.ahigp_DebugLevel = debug; globalprefs.ahigp_DisableSurround = surround; globalprefs.ahigp_DisableEcho = (echo == 2); globalprefs.ahigp_FastEcho = (echo == 1); globalprefs.ahigp_MaxCPU = (cpu << 16) / 100; globalprefs.ahigp_ClipMasterVolume= clip; break; } } /* switch(GADGETMASK) */ } } /* switch(CLASSMASK) */ } /* HandleInput */ } while(running); } }
void EventLoop(void) { ULONG signal = NULL, rc; BOOL running = TRUE; GetAttr( WINDOW_SigMask, WO_Window, &signal ); if(signal) { do { if(Wait(signal | SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C ) { running=FALSE; } while (( rc = HandleEvent( WO_Window )) != WMHI_NOMORE ) { switch(rc) { case WMHI_CLOSEWINDOW: running=FALSE; break; case ACTID_OPEN: { if(DoMethod( openreq, FRM_DOREQUEST ) == FRQ_OK) { char *file = NULL; GetAttr( FRQ_Path, openreq, (ULONG *) &file); NewSettings(file); GUINewSettings(); } break; } case ACTID_SAVEAS: { FillUnit(); if(DoMethod( savereq, FRM_DOREQUEST ) == FRQ_OK) { char *file = NULL; GetAttr( FRQ_Path, savereq, (ULONG *) &file); SaveSettings(file, UnitList); if(SaveIcons) { WriteIcon(file); } } break; } case ACTID_ABOUT: Req( (char *) msgButtonOK, (char *) msgTextCopyright, ISEQ_C, msgTextProgramName, "1996-2003 Martin Blom" ); break; case ACTID_SAVE: FillUnit(); SaveSettings(ENVFILE, UnitList); SaveSettings(ENVARCFILE, UnitList); running=FALSE; break; case ACTID_USE: FillUnit(); SaveSettings(ENVFILE, UnitList); running=FALSE; break; case ACTID_QUIT: running=FALSE; break; case ACTID_DEFAULT: NewSettings(NULL); GUINewSettings(); break; case ACTID_LASTSAVED: NewSettings(ENVARCFILE); GUINewSettings(); break; case ACTID_RESTORE: NewSettings(args.from); GUINewSettings(); break; case ACTID_ICONS: { struct MenuItem *item; item = FindMenuItem(ACTID_ICONS); if(item) { if(item->Flags & CHECKED) SaveIcons = TRUE; else SaveIcons = FALSE; } break; } case ACTID_HELP: { APTR lock = BGUI_LockWindow(window); if(!BGUI_Help( window, HELPFILE, "AHI", NULL)) { Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE); } BGUI_UnlockWindow(lock); break; } case ACTID_GUIDE: { APTR lock = BGUI_LockWindow(window); if(!BGUI_Help( window, HELPFILE, NULL, NULL)) { Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE); } BGUI_UnlockWindow(lock); break; } case ACTID_HELPINDEX: { APTR lock = BGUI_LockWindow(window); if(!BGUI_Help( window, HELPFILE, "Concept Index", 0)) { Req( (char *) msgButtonOK, (char *) msgTextNoFind, HELPFILE); } BGUI_UnlockWindow(lock); break; } case ACTID_UNIT: { ULONG unit; FillUnit(); GetAttr( CYC_Active, Window_Objs[rc], &unit); NewUnit(unit); GUINewUnit(); break; } case ACTID_MODE: { ULONG mode; FillUnit(); GetAttr( LISTV_LastClickedNum, Window_Objs[rc], &mode); NewMode(mode); GUINewMode(); break; } case ACTID_DEBUG: case ACTID_SURROUND: case ACTID_ECHO: case ACTID_CPULIMIT: case ACTID_CLIPMV: { ULONG debug = AHI_DEBUG_NONE, surround = FALSE, echo = 0, cpu = 90; ULONG clip = FALSE; GetAttr( CYC_Active, Window_Objs[ACTID_DEBUG], &debug); GetAttr( CYC_Active, Window_Objs[ACTID_SURROUND], &surround); GetAttr( CYC_Active, Window_Objs[ACTID_ECHO], &echo); GetAttr( CYC_Active, Window_Objs[ACTID_CLIPMV], &clip); GetAttr( SLIDER_Level, Window_Objs[ACTID_CPULIMIT], &cpu); globalprefs.ahigp_DebugLevel = debug; globalprefs.ahigp_DisableSurround = surround; globalprefs.ahigp_DisableEcho = (echo == 2); globalprefs.ahigp_FastEcho = (echo == 1); globalprefs.ahigp_MaxCPU = (cpu << 16) / 100; globalprefs.ahigp_ClipMasterVolume= clip; break; } } } } while(running); } }
void EventLoop(void) { ULONG sigs = 0UL; while (1) { ULONG rc = DoMethod(MUIApp, MUIM_Application_NewInput, &sigs); switch(rc) { case MUIV_Application_ReturnID_Quit: return; case ACTID_OPEN: { struct FileRequester *request; request = MUI_AllocAslRequestTags(ASL_FileRequest, ASLFR_Window, xget(MUIWindow, MUIA_Window_Window), ASLFR_TitleText, msgTextProgramName, ASLFR_RejectIcons, TRUE, ASLFR_InitialDrawer, "SYS:Prefs/Presets", TAG_DONE ); if( request != NULL ) { DoMethod(MUIApp, MUIA_Application_Sleep, TRUE); if (MUI_AslRequest(request, NULL)) { char *file; DoMethod(MUIApp, MUIA_Application_Sleep, FALSE); file = AllocVec(strlen(request->fr_Drawer)+128,0); if( file != NULL ) { CopyMem(request->fr_Drawer, file, strlen(request->fr_Drawer)+1); AddPart(file, request->fr_File, 128); NewSettings(file); GUINewSettings(); FreeVec(file); } } else { DoMethod(MUIApp, MUIA_Application_Sleep, FALSE); } MUI_FreeAslRequest(request); } break; } case ACTID_SAVEAS: { struct FileRequester *request; request = MUI_AllocAslRequestTags(ASL_FileRequest, ASLFR_Window, xget(MUIWindow, MUIA_Window_Window), ASLFR_TitleText, msgTextProgramName, ASLFR_RejectIcons, TRUE, ASLFR_DoSaveMode, TRUE, ASLFR_InitialDrawer, "SYS:Prefs/Presets", TAG_DONE); if(request != NULL ) { DoMethod(MUIApp, MUIA_Application_Sleep, TRUE); FillUnit(); if (MUI_AslRequest(request, NULL)) { char *file; DoMethod(MUIApp, MUIA_Application_Sleep, FALSE); file = AllocVec(strlen(request->fr_Drawer)+128,0); if( file != NULL ) { CopyMem(request->fr_Drawer, file, strlen(request->fr_Drawer)+1); AddPart(file, request->fr_File, 128); SaveSettings(file, UnitList); if(SaveIcons) { WriteIcon(file); } FreeVec(file); } } else { DoMethod(MUIApp, MUIA_Application_Sleep, FALSE); } MUI_FreeAslRequest(request); } break; } case ACTID_ABOUT: { char* args[] = { "\033c", (char*)msgTextProgramName, "1996-2004 Stéphane Barbaray/Martin Blom" }; MUI_RequestA(MUIApp, MUIWindow, 0, (char *) msgTextProgramName, (char*)msgButtonOK, (char*)msgTextCopyright, args ); break; } case ACTID_SAVE: FillUnit(); SaveSettings(ENVFILE, UnitList); SaveSettings(ENVARCFILE, UnitList); return; case ACTID_USE: FillUnit(); SaveSettings(ENVFILE, UnitList); return; case ACTID_QUIT: return; case ACTID_DEFAULT: NewSettings(NULL); GUINewSettings(); break; case ACTID_LASTSAVED: NewSettings(ENVARCFILE); GUINewSettings(); break; case ACTID_RESTORE: NewSettings(args.from); GUINewSettings(); break; case ACTID_ICONS: { APTR item = (APTR)DoMethod(MUIMenu,MUIM_FindUData,ACTID_ICONS); if(item) { if(xget(item, MUIA_Menuitem_Checked)) { SaveIcons = TRUE; } else { SaveIcons = FALSE; } } break; } case ACTID_HELP: DoMethod(MUIApp,MUIM_Application_ShowHelp,NULL,NULL,"AHI",0); break; case ACTID_GUIDE: DoMethod(MUIApp,MUIM_Application_ShowHelp,NULL,NULL,"MAIN",0); break; case ACTID_HELPINDEX: DoMethod(MUIApp,MUIM_Application_ShowHelp,NULL,NULL,"Concept Index",0); break; case ACTID_UNIT: FillUnit(); NewUnit(xget(MUIUnit,MUIA_Cycle_Active)); GUINewUnit(); break; case ACTID_MODE: FillUnit(); NewMode(xget(MUIList, MUIA_List_Active)); GUINewMode(); break; case ACTID_PLAY: { int unit_id; struct UnitNode* unit; FillUnit(); unit_id = xget( MUIUnit, MUIA_Cycle_Active ); unit = (struct UnitNode *) GetNode( unit_id, UnitList ); PlaySound( &unit->prefs ); break; } case ACTID_DEBUG: case ACTID_SURROUND: case ACTID_ECHO: case ACTID_CPULIMIT: case ACTID_CLIPMV: case ACTID_ACTIME: case ACTID_SCALEMODE: { ULONG debug = AHI_DEBUG_NONE, surround = FALSE, echo = 0, cpu = 90; ULONG clip = FALSE, actime = 0, scalemode = AHI_SCALE_FIXED_0_DB; get(MUIDebug, MUIA_Cycle_Active, &debug); get(MUISurround, MUIA_Cycle_Active, &surround); get(MUIEcho, MUIA_Cycle_Active, &echo); get(MUIClipvol, MUIA_Cycle_Active, &clip); get(MUICpu, MUIA_Numeric_Value, &cpu); get(MUIACTime, MUIA_Numeric_Value, &actime); get(MUIScalemode, MUIA_Cycle_Active, &scalemode); globalprefs.ahigp_DebugLevel = debug; globalprefs.ahigp_DisableSurround = surround; globalprefs.ahigp_DisableEcho = (echo == 2); globalprefs.ahigp_FastEcho = (echo == 1); globalprefs.ahigp_MaxCPU = ((cpu << 16) + 50) / 100; globalprefs.ahigp_ClipMasterVolume = clip; globalprefs.ahigp_AntiClickTime = ((actime << 16) + 500) / 1000; globalprefs.ahigp_ScaleMode = scalemode; break; } } if (sigs) { sigs = Wait(sigs | SIGBREAKF_CTRL_C); if (sigs & SIGBREAKF_CTRL_C) return; } } }
// Snapshot objects void backdrop_snapshot(BackdropInfo *info,BOOL unsnapshot,BOOL all,BackdropObject *icon) { BackdropObject *object; Lister *lister; IPCData *ipc; BPTR old,lock; short count=0,beep=0; #ifdef DISTINCT_OK BOOL save_env=0; #endif BOOL savepos=0; // Lock backdrop list lock_listlock(&info->objects,0); // Lock lister list lock_listlock(&GUI->lister_list,0); // Lock group list lock_listlock(&GUI->group_list,0); // Go through backdrop list for (object=(BackdropObject *)info->objects.list.lh_Head; object->node.ln_Succ; object=(BackdropObject *)object->node.ln_Succ) { BOOL ok=0; // Icon supplied? if (icon) { // Does it match? if (object!=icon || !object->icon) continue; } // Is object selected? else if ((!object->state && !all) || !object->icon) continue; beep=1; // Appicon? if (object->type==BDO_APP_ICON) { // Does icon support snapshot itself? if (WB_AppIconFlags((struct AppIcon *)object->misc_data)&APPENTF_SNAPSHOT) { backdrop_appicon_message(object,(unsnapshot)?BAPPF_UNSNAPSHOT:0); ++count; } // Otherwise, fake snapshot else if (*object->name) ok=1; } // Otherwise, is it ok to snapshot? else if (object->type!=BDO_BAD_DISK) ok=1; // Ok to snapshot? if (ok) { short x,y; // UnShapshot? if (unsnapshot) { // Set "no position" position x=-1; y=-1; } // Snapshot else { // Drawer? if (object->icon->do_DrawerData) { // Group icon? if (object->type==BDO_GROUP) { GroupData *group; // See if group is open if ((group=backdrop_find_group(object))) { // Update window position *((struct IBox *)&object->icon->do_DrawerData->dd_NewWindow.LeftEdge)=group->dimensions; } } // Otherwise go through listers else for (ipc=(IPCData *)GUI->lister_list.list.lh_Head; ipc->node.mln_Succ; ipc=(IPCData *)ipc->node.mln_Succ) { // Get lister lister=IPCDATA(ipc); // Is lister from this icon? if (lister->backdrop==object) { // Update lister PositionUpdate(lister,POSUPF_SAVE); break; } } } // Get position x=object->pos.Left; y=object->pos.Top; } // AppIcon? if (object->type==BDO_APP_ICON) { leftout_record *left; // Lock position list lock_listlock(&GUI->positions,TRUE); // 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_APPICON) { // Match this icon? if (strcmp(left->icon_label,object->name)==0) break; } } // Didn't find one? if (!(left->node.ln_Succ) && !unsnapshot) { // Create a new entry if ((left=AllocMemH(GUI->position_memory,sizeof(leftout_record)))) { // Fill out entry stccpy(left->icon_label,object->name,sizeof(left->icon_label)); left->node.ln_Name=left->name; left->node.ln_Type=PTYPE_APPICON; // Add to list AddTail((struct List *)&GUI->positions,(struct Node *)left); } } // Got one? if (left->node.ln_Succ) { // Unsnapshot? if (unsnapshot) { // Remove entry and free it Remove((struct Node *)left); FreeMemH(left); } // Update entry else { ULONG iflags; // Adjust for borders? if (!((iflags=GetIconFlags(object->icon))&ICONF_BORDER_OFF) && (!(environment->env->desktop_flags&DESKTOPF_NO_BORDERS) || (iflags&ICONF_BORDER_ON))) { // Shift back by border size x-=ICON_BORDER_X; y-=ICON_BORDER_Y_TOP; } // Save position left->icon_x=x; left->icon_y=y; left->flags&=~LEFTOUTF_NO_POSITION; } // Set flag to save positions savepos=1; } // Can't snapshot for some reason else if (!unsnapshot) beep=1; // Unlock position list unlock_listlock(&GUI->positions); } // Left-out on desktop? else if (object->type==BDO_LEFT_OUT && !(object->flags&BDOF_DESKTOP_FOLDER) && info->flags&BDIF_MAIN_DESKTOP) { 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) break; } } // Got one? if (left->node.ln_Succ) { // Save position left->icon_x=x; left->icon_y=y; left->flags&=~LEFTOUTF_NO_POSITION; // Set flag to save positions savepos=1; } // Must be temporary else beep=1; // Unlock position list unlock_listlock(&GUI->positions); } #ifdef DISTINCT_OK // Distinct icon positions? else if (environment->env->desktop_flags&DESKTOPF_DISTINCT && info->flags&BDIF_MAIN_DESKTOP) { // Snapshot icon for this environment desktop_snapshot_icon(object,x,y); save_env=1; } #endif // Group icon? else if (info->flags&BDIF_GROUP) { // Snapshot in group group_snapshot_icon(info,object,x,y); } // Save to icon else { // Using Workbench positions? if (environment->env->display_options&DISPOPTF_ICON_POS) { // Set position object->icon->do_CurrentX=(unsnapshot)?NO_ICON_POSITION:x-WBICONMAGIC_X; object->icon->do_CurrentY=(unsnapshot)?NO_ICON_POSITION:y-WBICONMAGIC_Y; // Removing Opus positions? if (environment->env->display_options&DISPOPTF_REMOPUSPOS) { // Remove Opus position from icon SetIconFlags(object->icon,GetIconFlags(object->icon)&~ICONF_POSITION_OK); } } // Using Opus positions else { // Set "position ok" flag SetIconFlags(object->icon,GetIconFlags(object->icon)|ICONF_POSITION_OK); // Update icon position SetIconPosition(object->icon,x,y); } // Get icon lock if ((lock=backdrop_icon_lock(object))) { // Change directory old=CurrentDir(lock); // Save this object out if (!(WriteIcon((object->icon->do_Type==WBDISK)?"Disk":object->name,object->icon))) beep=1; // Success; is this in a lister? else if (info->lister) { char name[256]; // Get icon name strcpy(name,(object->icon->do_Type==WBDISK)?"Disk":object->name); strcat(name,".info"); // Reload the file rexx_lister_reload_file(info->lister,name); } // Restore directory CurrentDir(old); UnLock(lock); } } ++count; } // Icon supplied? if (icon) break; } // Failed to do anything? if (!count && beep) DisplayBeep(info->window->WScreen); // Unlock group list unlock_listlock(&GUI->group_list); // Unlock backdrop list unlock_listlock(&info->objects); // Unlock lister list unlock_listlock(&GUI->lister_list); #ifdef DISTINCT_OK // Save environment file? if (save_env && environment->env->flags&ENVF_CHANGED) { // Save environment if (environment_save(environment,environment->path,0,0)) environment->env->flags&=~ENVF_CHANGED; } #endif // Save positions? if (savepos) { // Lock list lock_listlock(&GUI->positions,0); // Save list SavePositions(&GUI->positions.list,GUI->position_name); // Unlock list unlock_listlock(&GUI->positions); } // If this is a lister, update its datestamp if (info->lister) update_buffer_stamp(info->lister); }