mirror of https://github.com/OpenTTD/OpenTTD
(svn r11718) -Fix [FS#1483]: Show the fullscreen modes available to the cocoa driver in windowed mode too.
parent
108ab3b910
commit
6ae9302708
|
@ -79,4 +79,6 @@ void QZ_GameLoop();
|
||||||
void QZ_ShowMouse();
|
void QZ_ShowMouse();
|
||||||
void QZ_HideMouse();
|
void QZ_HideMouse();
|
||||||
|
|
||||||
|
uint QZ_ListModes(OTTD_Point* modes, uint max_modes, CGDirectDisplayID display_id, int display_depth);
|
||||||
|
|
||||||
#endif /* VIDEO_COCOA_H */
|
#endif /* VIDEO_COCOA_H */
|
||||||
|
|
|
@ -76,6 +76,86 @@ struct OTTD_QuartzGammaTable {
|
||||||
@end
|
@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);
|
||||||
|
CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
|
||||||
|
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 (i = 0; i < count; i++) {
|
||||||
|
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 {
|
class FullscreenSubdriver: public CocoaSubdriver {
|
||||||
int display_width;
|
int display_width;
|
||||||
int display_height;
|
int display_height;
|
||||||
|
@ -449,80 +529,7 @@ public:
|
||||||
|
|
||||||
virtual uint ListModes(OTTD_Point* modes, uint max_modes)
|
virtual uint ListModes(OTTD_Point* modes, uint max_modes)
|
||||||
{
|
{
|
||||||
CFArrayRef mode_list;
|
return QZ_ListModes(modes, max_modes, display_id, display_depth);
|
||||||
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);
|
|
||||||
CFNumberGetValue(number, kCFNumberSInt32Type, &intvalue);
|
|
||||||
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 (i = 0; i < count; i++) {
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool ChangeResolution(int w, int h)
|
virtual bool ChangeResolution(int w, int h)
|
||||||
|
|
|
@ -660,12 +660,7 @@ void WindowQuartzSubdriver::UpdatePalette(uint first_color, uint num_colors)
|
||||||
|
|
||||||
uint WindowQuartzSubdriver::ListModes(OTTD_Point* modes, uint max_modes)
|
uint WindowQuartzSubdriver::ListModes(OTTD_Point* modes, uint max_modes)
|
||||||
{
|
{
|
||||||
if (max_modes == 0) return 0;
|
return QZ_ListModes(modes, max_modes, kCGDirectMainDisplay, buffer_depth);
|
||||||
|
|
||||||
modes[0].x = window_width;
|
|
||||||
modes[0].y = window_height;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WindowQuartzSubdriver::ChangeResolution(int w, int h)
|
bool WindowQuartzSubdriver::ChangeResolution(int w, int h)
|
||||||
|
|
|
@ -685,12 +685,7 @@ void WindowQuickdrawSubdriver::UpdatePalette(uint first_color, uint num_colors)
|
||||||
|
|
||||||
uint WindowQuickdrawSubdriver::ListModes(OTTD_Point* modes, uint max_modes)
|
uint WindowQuickdrawSubdriver::ListModes(OTTD_Point* modes, uint max_modes)
|
||||||
{
|
{
|
||||||
if (max_modes == 0) return 0;
|
return QZ_ListModes(modes, max_modes, kCGDirectMainDisplay, buffer_depth);
|
||||||
|
|
||||||
modes[0].x = window_width;
|
|
||||||
modes[0].y = window_height;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WindowQuickdrawSubdriver::ChangeResolution(int w, int h)
|
bool WindowQuickdrawSubdriver::ChangeResolution(int w, int h)
|
||||||
|
|
Loading…
Reference in New Issue