dx5_mode * dx5_common_class::get_mode_list(IDirectDraw2 * dd)
{
	dx_mode_list=0;

	DDSURFACEDESC ddsd;
	DDPIXELFORMAT p_format;

	memset(&ddsd,0,sizeof(DDSURFACEDESC));
	ddsd.dwSize   = sizeof(DDSURFACEDESC);
	ddsd.dwFlags  = DDSD_PIXELFORMAT;

	memset(&p_format,0,sizeof(DDPIXELFORMAT));
	p_format.dwSize = sizeof(DDPIXELFORMAT);
	p_format.dwFlags = DDPF_RGB;
	p_format.dwRGBBitCount = DEPTH; //DEPTH zur Zeit 16
	ddsd.ddpfPixelFormat = p_format; //Wir können kein 16-Bit Modus suchen,
	//wenn wir gerade im 24-Bit Fenstermodus arbeiten!
	//Zählen heute ALLE Modi ab (2. Parameter sonst &ddsd)
	if (!i4_dx5_check(dd->EnumDisplayModes(0,NULL,0,(LPDDENUMMODESCALLBACK)dx5_vidmode_callback)))
	{
		free_mode_list(dx_mode_list);
		dx_mode_list=0;
	}

	return dx_mode_list;
}
Beispiel #2
0
static Errcode go_screen_menu(Screen_mode *sm)
{
Errcode err;
Mode_entry *mlist;
Names *wildlist;
Names *current;
char sbuf[80];

	hide_mp();

	if((err = build_mode_list(&mlist,&wildlist,&current)) < Success)
		goto error;

	err = go_driver_scroller(stack_string("screen_menu", sbuf),
								(Names *)mlist, current,
							  pick_screen_mode, show_driver_info, sm, NULL);

error:
	free_mode_list(&mlist,&wildlist);
	show_mp();
	return(err);
}
Beispiel #3
0
static Errcode build_mode_list(Mode_entry **pmlist,Names **pwildlist,
							   Names **pcurrent )
{
extern char pj_mcga_name[];
Errcode err;
Names mcga_entry;
Names *drv_entry;
Mode_entry **pmode_entry;
Mode_entry *mentry;
Vmode_info mode_info;
Vdevice *drv = NULL;
Boolean is_current = FALSE;
USHORT mode;
char wstr[32];
char hstr[32];
int mode_count;

#ifdef USE_DYNAMIC_VIDEO_DRIVERS
	build_wild_list(pwildlist, "*.drv", FALSE);
#else /* USE_DYNAMIC_VIDEO_DRIVERS */
	*pwildlist = NULL;
#endif /* USE_DYNAMIC_VIDEO_DRIVERS */

	drv_entry = &mcga_entry;
	mcga_entry.name = pj_mcga_name;
	mcga_entry.next = *pwildlist;

	pmode_entry = pmlist;
	*pcurrent = NULL;

	while(drv_entry != NULL)
	{
		is_current = !txtcmp(vconfg.smode.drv_name, drv_entry->name);

		if(is_current)
		{
			drv = vb.vd;
		}
		else if((err = pj_open_ddriver(&drv, drv_entry->name)) < Success)
		{
			if(err != Err_no_display)
				cant_query_driver(err,drv_entry->name);
			goto next_drv_entry;
		}
		mode_count = pj_vd_get_mode_count(drv);
		for(mode = 0;mode < mode_count;++mode)
		{
			if ((err = pj_vd_get_mode(drv,mode,&mode_info)) < Success)
				goto error;
			if(NULL == (mentry = *pmode_entry = pj_zalloc(sizeof(Mode_entry))))
			{
				err = Err_no_memory;
				goto error;
			}
			mentry->mode_name = mentry->name_buf;
			mentry->drv_file = drv_entry->name;
			mentry->mode = mode;
			mentry->wrange = mode_info.width;
			mentry->hrange = mode_info.height;

			if(mode_info.width.min == mode_info.width.max)
				sprintf(wstr,"%d", mode_info.width.max);
			else
			{
				sprintf(wstr,"%d:%d",
						mode_info.width.min,mode_info.width.max);
			}

			if(mode_info.height.min == mode_info.height.max)
				sprintf(hstr,"%d", mode_info.height.max);
			else
			{
			    sprintf(hstr,"%d:%d",
						mode_info.height.min,mode_info.height.max);
			}
			sprintf(mentry->name_buf, "%-12.12s %-2d %-18.18s %s X %s", 
					mentry->drv_file, mode, mode_info.mode_name,
					wstr, hstr );

			/* load pointer to current entry if found */
			if(is_current && mode == vconfg.smode.mode)
				*pcurrent = (Names *)mentry;

			pmode_entry = (Mode_entry **)&(mentry->next);
		}
	next_drv_entry:

		if(!is_current)
			pj_close_vdriver(&drv);
		drv = NULL;
		drv_entry = drv_entry->next;
	}
	err = Success;
	goto done;
error:
	free_mode_list(pmlist,pwildlist);
done:
	if(!is_current)
		pj_close_vdriver(&drv);
	return(err);
}