mirror of https://github.com/encounter/SDL.git
x11: make the X11 target work on macOS with Xquartz.
This commit is contained in:
parent
61a3ba303c
commit
13f2e54295
|
@ -202,7 +202,7 @@ ShouldUseTextureFramebuffer()
|
||||||
return SDL_FALSE;
|
return SDL_FALSE;
|
||||||
|
|
||||||
#elif defined(__MACOSX__)
|
#elif defined(__MACOSX__)
|
||||||
/* Mac OS X uses OpenGL as the native fast path */
|
/* Mac OS X uses OpenGL as the native fast path (for cocoa and X11) */
|
||||||
return SDL_TRUE;
|
return SDL_TRUE;
|
||||||
|
|
||||||
#elif defined(__LINUX__)
|
#elif defined(__LINUX__)
|
||||||
|
@ -1177,29 +1177,31 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool fullscreen)
|
||||||
/* if the window is going away and no resolution change is necessary,
|
/* if the window is going away and no resolution change is necessary,
|
||||||
do nothing, or else we may trigger an ugly double-transition
|
do nothing, or else we may trigger an ugly double-transition
|
||||||
*/
|
*/
|
||||||
if (window->is_destroying && (window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)
|
if (SDL_strcmp(_this->name, "cocoa") == 0) { /* don't do this for X11, etc */
|
||||||
return 0;
|
if (window->is_destroying && (window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)
|
||||||
|
|
||||||
if (!_this->is_dummy) {
|
|
||||||
/* If we're switching between a fullscreen Space and "normal" fullscreen, we need to get back to normal first. */
|
|
||||||
if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN)) {
|
|
||||||
if (!Cocoa_SetWindowFullscreenSpace(window, SDL_FALSE)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)) {
|
|
||||||
display = SDL_GetDisplayForWindow(window);
|
|
||||||
SDL_SetDisplayModeForDisplay(display, NULL);
|
|
||||||
if (_this->SetWindowFullscreen) {
|
|
||||||
_this->SetWindowFullscreen(_this, window, display, SDL_FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Cocoa_SetWindowFullscreenSpace(window, fullscreen)) {
|
|
||||||
if (Cocoa_IsWindowInFullscreenSpace(window) != fullscreen) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
window->last_fullscreen_flags = window->flags;
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (!_this->is_dummy) {
|
||||||
|
/* If we're switching between a fullscreen Space and "normal" fullscreen, we need to get back to normal first. */
|
||||||
|
if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN)) {
|
||||||
|
if (!Cocoa_SetWindowFullscreenSpace(window, SDL_FALSE)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)) {
|
||||||
|
display = SDL_GetDisplayForWindow(window);
|
||||||
|
SDL_SetDisplayModeForDisplay(display, NULL);
|
||||||
|
if (_this->SetWindowFullscreen) {
|
||||||
|
_this->SetWindowFullscreen(_this, window, display, SDL_FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Cocoa_SetWindowFullscreenSpace(window, fullscreen)) {
|
||||||
|
if (Cocoa_IsWindowInFullscreenSpace(window) != fullscreen) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
window->last_fullscreen_flags = window->flags;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10)
|
#elif __WINRT__ && (NTDDI_VERSION < NTDDI_WIN10)
|
||||||
|
@ -2521,8 +2523,10 @@ ShouldMinimizeOnFocusLoss(SDL_Window * window)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __MACOSX__
|
#ifdef __MACOSX__
|
||||||
if (Cocoa_IsWindowInFullscreenSpace(window)) {
|
if (SDL_strcmp(_this->name, "cocoa") == 0) { /* don't do this for X11, etc */
|
||||||
return SDL_FALSE;
|
if (Cocoa_IsWindowInFullscreenSpace(window)) {
|
||||||
|
return SDL_FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -391,12 +391,17 @@ X11_GL_InitExtensions(_THIS)
|
||||||
|
|
||||||
/* glXChooseVisual and glXChooseFBConfig have some small differences in
|
/* glXChooseVisual and glXChooseFBConfig have some small differences in
|
||||||
* the attribute encoding, it can be chosen with the for_FBConfig parameter.
|
* the attribute encoding, it can be chosen with the for_FBConfig parameter.
|
||||||
|
* Some targets fail if you use GLX_X_VISUAL_TYPE_EXT/GLX_DIRECT_COLOR_EXT,
|
||||||
|
* so it gets specified last if used and is pointed to by *_pvistypeattr.
|
||||||
|
* In case of failure, if that pointer is not NULL, set that pointer to None
|
||||||
|
* and try again.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int size, Bool for_FBConfig)
|
X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int size, Bool for_FBConfig, int **_pvistypeattr)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
const int MAX_ATTRIBUTES = 64;
|
const int MAX_ATTRIBUTES = 64;
|
||||||
|
int *pvistypeattr = NULL;
|
||||||
|
|
||||||
/* assert buffer is large enough to hold all SDL attributes. */
|
/* assert buffer is large enough to hold all SDL attributes. */
|
||||||
SDL_assert(size >= MAX_ATTRIBUTES);
|
SDL_assert(size >= MAX_ATTRIBUTES);
|
||||||
|
@ -488,6 +493,7 @@ X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int si
|
||||||
EXT_visual_info extension, then add GLX_X_VISUAL_TYPE_EXT. */
|
EXT_visual_info extension, then add GLX_X_VISUAL_TYPE_EXT. */
|
||||||
if (X11_UseDirectColorVisuals() &&
|
if (X11_UseDirectColorVisuals() &&
|
||||||
_this->gl_data->HAS_GLX_EXT_visual_info) {
|
_this->gl_data->HAS_GLX_EXT_visual_info) {
|
||||||
|
pvistypeattr = &attribs[i];
|
||||||
attribs[i++] = GLX_X_VISUAL_TYPE_EXT;
|
attribs[i++] = GLX_X_VISUAL_TYPE_EXT;
|
||||||
attribs[i++] = GLX_DIRECT_COLOR_EXT;
|
attribs[i++] = GLX_DIRECT_COLOR_EXT;
|
||||||
}
|
}
|
||||||
|
@ -496,6 +502,10 @@ X11_GL_GetAttributes(_THIS, Display * display, int screen, int * attribs, int si
|
||||||
|
|
||||||
SDL_assert(i <= MAX_ATTRIBUTES);
|
SDL_assert(i <= MAX_ATTRIBUTES);
|
||||||
|
|
||||||
|
if (_pvistypeattr) {
|
||||||
|
*_pvistypeattr = pvistypeattr;
|
||||||
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -505,14 +515,21 @@ X11_GL_GetVisual(_THIS, Display * display, int screen)
|
||||||
/* 64 seems nice. */
|
/* 64 seems nice. */
|
||||||
int attribs[64];
|
int attribs[64];
|
||||||
XVisualInfo *vinfo;
|
XVisualInfo *vinfo;
|
||||||
|
int *pvistypeattr = NULL;
|
||||||
|
|
||||||
if (!_this->gl_data) {
|
if (!_this->gl_data) {
|
||||||
/* The OpenGL library wasn't loaded, SDL_GetError() should have info */
|
/* The OpenGL library wasn't loaded, SDL_GetError() should have info */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
X11_GL_GetAttributes(_this, display, screen, attribs, 64, SDL_FALSE);
|
X11_GL_GetAttributes(_this, display, screen, attribs, 64, SDL_FALSE, &pvistypeattr);
|
||||||
vinfo = _this->gl_data->glXChooseVisual(display, screen, attribs);
|
vinfo = _this->gl_data->glXChooseVisual(display, screen, attribs);
|
||||||
|
|
||||||
|
if (!vinfo && (pvistypeattr != NULL)) {
|
||||||
|
*pvistypeattr = None;
|
||||||
|
vinfo = _this->gl_data->glXChooseVisual(display, screen, attribs);
|
||||||
|
}
|
||||||
|
|
||||||
if (!vinfo) {
|
if (!vinfo) {
|
||||||
SDL_SetError("Couldn't find matching GLX visual");
|
SDL_SetError("Couldn't find matching GLX visual");
|
||||||
}
|
}
|
||||||
|
@ -626,20 +643,28 @@ X11_GL_CreateContext(_THIS, SDL_Window * window)
|
||||||
/* Create a GL 3.x context */
|
/* Create a GL 3.x context */
|
||||||
GLXFBConfig *framebuffer_config = NULL;
|
GLXFBConfig *framebuffer_config = NULL;
|
||||||
int fbcount = 0;
|
int fbcount = 0;
|
||||||
|
int *pvistypeattr = NULL;
|
||||||
|
|
||||||
X11_GL_GetAttributes(_this,display,screen,glxAttribs,64,SDL_TRUE);
|
X11_GL_GetAttributes(_this,display,screen,glxAttribs,64,SDL_TRUE,&pvistypeattr);
|
||||||
|
|
||||||
if (!_this->gl_data->glXChooseFBConfig
|
if (_this->gl_data->glXChooseFBConfig) {
|
||||||
|| !(framebuffer_config =
|
framebuffer_config = _this->gl_data->glXChooseFBConfig(display,
|
||||||
_this->gl_data->glXChooseFBConfig(display,
|
|
||||||
DefaultScreen(display), glxAttribs,
|
DefaultScreen(display), glxAttribs,
|
||||||
&fbcount))) {
|
&fbcount);
|
||||||
SDL_SetError("No good framebuffers found. OpenGL 3.0 and later unavailable");
|
|
||||||
} else {
|
if (!framebuffer_config && (pvistypeattr != NULL)) {
|
||||||
context = _this->gl_data->glXCreateContextAttribsARB(display,
|
*pvistypeattr = None;
|
||||||
framebuffer_config[0],
|
framebuffer_config = _this->gl_data->glXChooseFBConfig(display,
|
||||||
share_context, True, attribs);
|
DefaultScreen(display), glxAttribs,
|
||||||
X11_XFree(framebuffer_config);
|
&fbcount);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (framebuffer_config) {
|
||||||
|
context = _this->gl_data->glXCreateContextAttribsARB(display,
|
||||||
|
framebuffer_config[0],
|
||||||
|
share_context, True, attribs);
|
||||||
|
X11_XFree(framebuffer_config);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue