display_mode* GlutGameMode::_FindMatchingMode() { if (fWidth == -1 && fHeight == -1 && fPixelDepth == -1 && fRefreshRate == -1) // nothing to match! return NULL; if (!fModesList) { // Lazy retrieval of supported modes... BScreen screen; if (screen.GetModeList(&fModesList, &fModesCount) == B_OK) { // sort modes in decrease order (resolution, depth, frequency) qsort(fModesList, fModesCount, sizeof(display_mode), _CompareModes); } else { // bad luck, no modes can be retrieved! fModesList = NULL; fModesCount = 0; } } if (!fModesList) return NULL; float bestRefreshDiff = 999999; int bestMode = -1; for (uint32 i =0; i < fModesCount; i++) { printf("[%" B_PRId32 "]: %d x %d, %d Bpp, %d Hz\n", i, fModesList[i].virtual_width, fModesList[i].virtual_height, _GetModePixelDepth(&fModesList[i]), _GetModeRefreshRate(&fModesList[i])); if (fWidth > 0 && fModesList[i].virtual_width != fWidth) continue; if (fHeight > 0 && fModesList[i].virtual_height != fHeight) continue; if (fPixelDepth > 0 && _GetModePixelDepth(&fModesList[i]) != fPixelDepth) continue; float refreshDiff = fabs(_GetModeRefreshRate(&fModesList[i]) - fRefreshRate); if (fRefreshRate > 0 && (refreshDiff > 0.006 * fRefreshRate)) { // not exactly the same, but maybe the best similar mode so far? if (refreshDiff < bestRefreshDiff) { bestRefreshDiff = refreshDiff; bestMode = i; } continue; } // Hey, this one match everything! return &fModesList[i]; } if (bestMode == -1) return NULL; return &fModesList[bestMode]; }