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; }
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,¤t)) < 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); }
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); }