struct WCSScreenMode *ModeList_New(void) { struct NameInfo ModeName; struct DisplayInfo Properties; struct DimensionInfo Sizes; struct WCSScreenMode *ModeList, *ThisMode, *Sort, DummyFirst; ULONG DInfoID; int Order; DummyFirst.Next = NULL; ThisMode = NULL; ModeList = &DummyFirst; DInfoID = INVALID_ID; DInfoID = NextDisplayInfo(DInfoID); while (DInfoID != INVALID_ID) { if(!(ModeNotAvailable(DInfoID))) { if(GetDisplayInfoData(NULL, (UBYTE *)&ModeName, sizeof(ModeName), DTAG_NAME, DInfoID)) { if(GetDisplayInfoData(NULL, (UBYTE *)&Sizes, sizeof(Sizes), DTAG_DIMS, DInfoID)) { if((Sizes.StdOScan.MaxX - Sizes.StdOScan.MinX + 1 >= 500) && (Sizes.StdOScan.MaxY - Sizes.StdOScan.MinY + 1 >= 300) && (Sizes.MaxDepth >= 4)) { if(ThisMode = get_Memory(sizeof(struct WCSScreenMode), MEMF_CLEAR)) { ThisMode->ModeID = DInfoID; strcpy(ThisMode->ModeName, ModeName.Name); ThisMode->X = ThisMode->UX = ThisMode->OX =Sizes.Nominal.MaxX - Sizes.Nominal.MinX + 1; ThisMode->Y = ThisMode->UY = ThisMode->OY =Sizes.Nominal.MaxY - Sizes.Nominal.MinY + 1; ThisMode->OScans[0].x = Sizes.TxtOScan.MaxX - Sizes.TxtOScan.MinX + 1; ThisMode->OScans[0].y = Sizes.TxtOScan.MaxY - Sizes.TxtOScan.MinY + 1; ThisMode->OScans[1].x = Sizes.StdOScan.MaxX - Sizes.StdOScan.MinX + 1; ThisMode->OScans[1].y = Sizes.StdOScan.MaxY - Sizes.StdOScan.MinY + 1; ThisMode->OScans[2].x = Sizes.MaxOScan.MaxX - Sizes.MaxOScan.MinX + 1; ThisMode->OScans[2].y = Sizes.MaxOScan.MaxY - Sizes.MaxOScan.MinY + 1; ThisMode->OScans[3].x = Sizes.VideoOScan.MaxX - Sizes.VideoOScan.MinX + 1; ThisMode->OScans[3].y = Sizes.VideoOScan.MaxY - Sizes.VideoOScan.MinY + 1; ThisMode->MaxX = Sizes.MaxRasterWidth; ThisMode->MaxY = Sizes.MaxRasterHeight; if(GetDisplayInfoData(NULL, (UBYTE *)&Properties, sizeof(Properties), DTAG_DISP, DInfoID)) { ThisMode->PropertyFlags = Properties.PropertyFlags; ThisMode->PixelSpeed = Properties.PixelSpeed; } /* if */ for(Sort = ModeList; Sort;) { if(Sort->Next) { Order = stricmp(Sort->Next->ModeName, ThisMode->ModeName); if (Order > 0) { ThisMode->Next = Sort->Next; Sort->Next = ThisMode; Sort = NULL; /* We're done. */ } /* else */ else if (Order == 0) { /* We already have an entry by that name, don't ** bother adding a new one. Break out. */ free_Memory(ThisMode, sizeof(struct WCSScreenMode)); Sort = NULL; } /* else */ } /* if */ else { /* ThisMode->Next = NULL; */ /* Unnecessary: MEMF_CLEAR */ Sort->Next = ThisMode; Sort = NULL; /* break out */ } /* else */ if(Sort) /* prevent many fine enforcer hits */ { Sort = Sort->Next; } /* if */ } /* for */ } /* if */ } /* if */ } /* if */ } /* if */ } /* if */ DInfoID = NextDisplayInfo(DInfoID); } /* while */ ModeList = ModeList->Next; /* Pull off DummyFirst */ return(ModeList); } /* ModeList_New() */
void _config_env_screenmode_init_mode(config_env_data *data,BOOL save_depth) { struct DimensionInfo diminfo; char buf[128]; struct Screen *screen; int a; ULONG mode_id=0; BOOL got_dims=0; // Get current screenmode information switch (data->config->screen_mode) { // Existing screen case MODE_WORKBENCHUSE: case MODE_WORKBENCHCLONE: case MODE_PUBLICSCREEN: { // Strip Use/Clone from mode name stccpy(buf,data->mode_name,sizeof(buf)); for (a=strlen(buf)-1;a>=0;a--) { if (buf[a]==':') { buf[a]=0; break; } } // Get screen if (screen=LockPubScreen(buf)) { // Get screen mode mode_id=GetVPModeID(&screen->ViewPort); // Get minimum size if (data->config->screen_mode==MODE_WORKBENCHCLONE) { data->mode_size_limit.MinX=screen->Width; data->mode_size_limit.MinY=screen->Height; // Clone depth if (!save_depth) data->config->screen_depth=screen->RastPort.BitMap->Depth; } else { data->mode_size_limit.MinX=640; data->mode_size_limit.MinY=200; } // Get maximum size data->mode_size_limit.MaxX=screen->Width; data->mode_size_limit.MaxY=screen->Height; // Get default size data->mode_size_default.MaxX=screen->Width; data->mode_size_default.MaxY=screen->Height; // Got dimensions got_dims=1; // Release screen UnlockPubScreen(0,screen); } } break; // Real screen mode default: mode_id=data->config->screen_mode; break; } // Get mode info (if available) if (!(ModeNotAvailable(mode_id)) && (GetDisplayInfoData(0,(char *)&diminfo,sizeof(diminfo),DTAG_DIMS,mode_id))) { // Not already got dimensions? if (!got_dims) { // Get minimum size data->mode_size_limit.MinX=diminfo.MinRasterWidth; data->mode_size_limit.MinY=diminfo.MinRasterHeight; // Get maximum size data->mode_size_limit.MaxX=diminfo.MaxRasterWidth; data->mode_size_limit.MaxY=diminfo.MaxRasterHeight; // Get default size data->mode_size_default.MaxX=diminfo.TxtOScan.MaxX+1; data->mode_size_default.MaxY=diminfo.TxtOScan.MaxY+1; } // Get maximum colours data->mode_max_colours=diminfo.MaxDepth; } // Check settings if (data->mode_size_limit.MinX<640) data->mode_size_limit.MinX=640; if (data->mode_size_limit.MinY<200) data->mode_size_limit.MinY=200; if (data->mode_size_limit.MaxX<data->mode_size_limit.MinX) data->mode_size_limit.MaxX=data->mode_size_limit.MinX; if (data->mode_size_limit.MaxY<data->mode_size_limit.MinY) data->mode_size_limit.MaxY=data->mode_size_limit.MinY; if (data->mode_size_default.MaxX<data->mode_size_limit.MinX) data->mode_size_default.MaxX=data->mode_size_limit.MinX; else if (data->mode_size_default.MaxX>data->mode_size_limit.MaxX) data->mode_size_default.MaxX=data->mode_size_limit.MaxX; if (data->mode_size_default.MaxY<data->mode_size_limit.MinY) data->mode_size_default.MaxY=data->mode_size_limit.MinY; else if (data->mode_size_default.MaxY>data->mode_size_limit.MaxY) data->mode_size_default.MaxY=data->mode_size_limit.MaxY; if (data->mode_max_colours<1) data->mode_max_colours=1; // Fix gadgets _config_env_screenmode_fix_gadgets(data); }