@@ -79,4 +79,6 @@ void QZ_GameLoop();
void QZ_ShowMouse();
void QZ_HideMouse();
uint QZ_ListModes(OTTD_Point* modes, uint max_modes, CGDirectDisplayID display_id, int display_depth);
#endif /* VIDEO_COCOA_H */
@@ -76,6 +76,86 @@ struct OTTD_QuartzGammaTable {
@end
uint QZ_ListModes(OTTD_Point* modes, uint max_modes, CGDirectDisplayID display_id, int display_depth)
{
CFArrayRef mode_list;
CFIndex num_modes;
CFIndex i;
uint count = 0;
mode_list = CGDisplayAvailableModes(display_id);
num_modes = CFArrayGetCount(mode_list);
/* Build list of modes with the requested bpp */
for (i = 0; i < num_modes && count < max_modes; i++) {
CFDictionaryRef onemode;
CFNumberRef number;
int bpp;
int intvalue;
bool hasMode;
uint16 width, height;
onemode = (const __CFDictionary*)CFArrayGetValueAtIndex(mode_list, i);
number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayBitsPerPixel);
CFNumberGetValue (number, kCFNumberSInt32Type, &bpp);
if (bpp != display_depth) continue;
number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayWidth);
CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
width = (uint16)intvalue;
number = (const __CFNumber*)CFDictionaryGetValue(onemode, kCGDisplayHeight);
height = (uint16)intvalue;
/* Check if mode is already in the list */
uint i;
hasMode = false;
for (i = 0; i < count; i++) {
if (modes[i].x == width && modes[i].y == height) {
hasMode = true;
break;
}
if (hasMode) continue;
/* Add mode to the list */
modes[count].x = width;
modes[count].y = height;
count++;
/* Sort list smallest to largest */
uint i, j;
for (j = 0; j < count-1; j++) {
if (modes[j].x > modes[j + 1].x || (
modes[j].x == modes[j + 1].x &&
modes[j].y > modes[j + 1].y
)) {
uint tmpw = modes[j].x;
uint tmph = modes[j].y;
modes[j].x = modes[j + 1].x;
modes[j].y = modes[j + 1].y;
modes[j + 1].x = tmpw;
modes[j + 1].y = tmph;
return count;
class FullscreenSubdriver: public CocoaSubdriver {
int display_width;
int display_height;
@@ -449,80 +529,7 @@ public:
virtual uint ListModes(OTTD_Point* modes, uint max_modes)
return QZ_ListModes(modes, max_modes, display_id, display_depth);
virtual bool ChangeResolution(int w, int h)
@@ -660,12 +660,7 @@ void WindowQuartzSubdriver::UpdatePalett
uint WindowQuartzSubdriver::ListModes(OTTD_Point* modes, uint max_modes)
if (max_modes == 0) return 0;
modes[0].x = window_width;
modes[0].y = window_height;
return 1;
return QZ_ListModes(modes, max_modes, kCGDirectMainDisplay, buffer_depth);
bool WindowQuartzSubdriver::ChangeResolution(int w, int h)
@@ -685,12 +685,7 @@ void WindowQuickdrawSubdriver::UpdatePal
uint WindowQuickdrawSubdriver::ListModes(OTTD_Point* modes, uint max_modes)
bool WindowQuickdrawSubdriver::ChangeResolution(int w, int h)
Status change: