Пример #1
0
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);
}