mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-04 06:00:15 +00:00
(svn r11718) -Fix [FS#1483]: Show the fullscreen modes available to the cocoa driver in windowed mode too.
This commit is contained in:
parent
13ffc5b581
commit
bb45f46355
@ -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);
|
||||
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 {
|
||||
int display_width;
|
||||
int display_height;
|
||||
@ -449,80 +529,7 @@ public:
|
||||
|
||||
virtual uint ListModes(OTTD_Point* modes, uint max_modes)
|
||||
{
|
||||
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;
|
||||
return QZ_ListModes(modes, max_modes, display_id, display_depth);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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::UpdatePalette(uint first_color, uint num_colors)
|
||||
|
||||
uint WindowQuickdrawSubdriver::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 WindowQuickdrawSubdriver::ChangeResolution(int w, int h)
|
||||
|
Loading…
Reference in New Issue
Block a user