Mercurial > sdl-ios-xcode
diff src/video/x11/SDL_x11modes.c @ 499:f480ecd70499
Added an aborted try at making fullscreen work on Xinerama screen != 0
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 30 Sep 2002 00:35:25 +0000 |
parents | f6ffac90895c |
children | 31d3af76488b |
line wrap: on
line diff
--- a/src/video/x11/SDL_x11modes.c Mon Sep 16 18:38:09 2002 +0000 +++ b/src/video/x11/SDL_x11modes.c Mon Sep 30 00:35:25 2002 +0000 @@ -43,7 +43,7 @@ #include <XFree86/extensions/Xinerama.h> #endif -#define MAX(a, b) (a > b ? a : b) +#define MAX(a, b) (a > b ? a : b) #ifdef XFREE86_VM Bool SDL_NAME(XF86VidModeGetModeInfo)(Display *dpy, int scr, SDL_NAME(XF86VidModeModeInfo) *info) @@ -126,41 +126,41 @@ } #endif /* XFREE86_VM */ - /* XiG */ + /* XiG */ #ifdef HAVE_XIGXME #ifdef XIG_DEBUG fprintf(stderr, "XME: set_best_resolution(): w = %d, h = %d\n", - width, height); + width, height); #endif if ( SDL_modelist ) { - int i; + int i; for ( i=0; SDL_modelist[i]; ++i ) { - if ( (SDL_modelist[i]->w >= width) && + if ( (SDL_modelist[i]->w >= width) && (SDL_modelist[i]->h >= height) ) { - break; - } + break; + } } - - if ( SDL_modelist[i] ) { /* found one, lets try it */ - int w, h; + + if ( SDL_modelist[i] ) { /* found one, lets try it */ + int w, h; /* check current mode so we can avoid uneccessary mode changes */ - get_real_resolution(this, &w, &h); + get_real_resolution(this, &w, &h); - if ( (SDL_modelist[i]->w != w) || (SDL_modelist[i]->h != h) ) { + if ( (SDL_modelist[i]->w != w) || (SDL_modelist[i]->h != h) ) { # ifdef XIG_DEBUG - fprintf(stderr, "XME: set_best_resolution: " - "XiGMiscChangeResolution: %d %d\n", - SDL_modelist[s]->w, SDL_modelist[s]->h); + fprintf(stderr, "XME: set_best_resolution: " + "XiGMiscChangeResolution: %d %d\n", + SDL_modelist[s]->w, SDL_modelist[s]->h); # endif - XiGMiscChangeResolution(SDL_Display, - SDL_Screen, - 0, /* view */ - SDL_modelist[i]->w, - SDL_modelist[i]->h, - 0); - XSync(SDL_Display, False); + XiGMiscChangeResolution(SDL_Display, + SDL_Screen, + 0, /* view */ + SDL_modelist[i]->w, + SDL_modelist[i]->h, + 0); + XSync(SDL_Display, False); } } } @@ -189,8 +189,8 @@ XiGMiscResolutionInfo *modelist; XiGMiscQueryResolutions(SDL_Display, SDL_Screen, - 0, /* view */ - &ractive, &modelist); + 0, /* view */ + &ractive, &modelist); *w = modelist[ractive].width; *h = modelist[ractive].height; #ifdef XIG_DEBUG @@ -232,10 +232,10 @@ { XVisualInfo vi; if(XMatchVisualInfo(SDL_Display, SDL_Screen, depth, class, &vi)) { - int n = this->hidden->nvisuals; - this->hidden->visuals[n].depth = vi.depth; - this->hidden->visuals[n].visual = vi.visual; - this->hidden->nvisuals++; + int n = this->hidden->nvisuals; + this->hidden->visuals[n].depth = vi.depth; + this->hidden->visuals[n].visual = vi.visual; + this->hidden->nvisuals++; } return(this->hidden->nvisuals); } @@ -249,10 +249,10 @@ template.visualid = strtol(visual_id, NULL, 0); vi = XGetVisualInfo(SDL_Display, VisualIDMask, &template, &nvis); if ( vi ) { - int n = this->hidden->nvisuals; - this->hidden->visuals[n].depth = vi->depth; - this->hidden->visuals[n].visual = vi->visual; - this->hidden->nvisuals++; + int n = this->hidden->nvisuals; + this->hidden->visuals[n].depth = vi->depth; + this->hidden->visuals[n].visual = vi->visual; + this->hidden->nvisuals++; XFree(vi); } } @@ -315,14 +315,14 @@ #ifdef BROKEN_XFREE86_4001 #ifdef X_XF86VidModeGetDotClocks /* Compiled under XFree86 4.0 */ /* Earlier X servers hang when doing vidmode */ - if ( vm_major < 2 ) { + if ( vm_major < 2 ) { #ifdef XFREE86_DEBUG printf("Compiled under XFree86 4.0, server is XFree86 3.X\n"); #endif buggy_X11 = 1; } #else - /* XFree86 3.X code works with XFree86 4.0 servers */; + /* XFree86 3.X code works with XFree86 4.0 servers */; #endif /* XFree86 4.0 */ #endif /* XFree86 4.02 and newer are fixed wrt backwards compatibility */ } else { @@ -377,69 +377,69 @@ } #endif /* XFREE86_VM */ - /* XiG */ + /* XiG */ #ifdef HAVE_XIGXME /* first lets make sure we have the extension, and it's at least v2.0 */ if (XiGMiscQueryVersion(SDL_Display, &xme_major, &xme_minor)) { #ifdef XIG_DEBUG - fprintf(stderr, "XME: XiGMiscQueryVersion: V%d.%d\n", - xme_major, xme_minor); + fprintf(stderr, "XME: XiGMiscQueryVersion: V%d.%d\n", + xme_major, xme_minor); #endif - /* work around a XiGMisc bogosity in our version of libXext */ - if (xme_major == 0 && xme_major == 0) { - /* Ideally libxme would spit this out, but the problem is that - the right Query func will never be called if using the bogus - libXext version. - */ - fprintf(stderr, + /* work around a XiGMisc bogosity in our version of libXext */ + if (xme_major == 0 && xme_major == 0) { + /* Ideally libxme would spit this out, but the problem is that + the right Query func will never be called if using the bogus + libXext version. + */ + fprintf(stderr, "XME: If you are using Xi Graphics CDE and a Summit server, you need to\n" "XME: get the libXext update from our ftp site before fullscreen switching\n" "XME: will work. Fullscreen switching is only supported on Summit Servers\n"); - } + } } else { /* not there. Bummer. */ - xme_major = xme_minor = 0; + xme_major = xme_minor = 0; } modelist = NULL; if (xme_major >= 2 && (nummodes = XiGMiscQueryResolutions(SDL_Display, - SDL_Screen, - 0, /* view */ - &ractive, - &modelist)) > 1) - { /* then we actually have some */ - int j; + SDL_Screen, + 0, /* view */ + &ractive, + &modelist)) > 1) + { /* then we actually have some */ + int j; #ifdef XIG_DEBUG - fprintf(stderr, "XME: nummodes = %d, active mode = %d\n", - nummodes, ractive); + fprintf(stderr, "XME: nummodes = %d, active mode = %d\n", + nummodes, ractive); #endif - SDL_modelist = (SDL_Rect **)malloc((nummodes+1)*sizeof(SDL_Rect *)); + SDL_modelist = (SDL_Rect **)malloc((nummodes+1)*sizeof(SDL_Rect *)); - /* we get the list already sorted in */ - /* descending order. We'll copy it in */ - /* reverse order so SDL is happy */ - if (SDL_modelist) { - for ( i=0, j=nummodes-1; j>=0; i++, j-- ) { - if ((SDL_modelist[i] = - (SDL_Rect *)malloc(sizeof(SDL_Rect))) == NULL) - break; + /* we get the list already sorted in */ + /* descending order. We'll copy it in */ + /* reverse order so SDL is happy */ + if (SDL_modelist) { + for ( i=0, j=nummodes-1; j>=0; i++, j-- ) { + if ((SDL_modelist[i] = + (SDL_Rect *)malloc(sizeof(SDL_Rect))) == NULL) + break; #ifdef XIG_DEBUG - fprintf(stderr, "XME: mode = %4d, w = %4d, h = %4d\n", - i, modelist[i].width, modelist[i].height); + fprintf(stderr, "XME: mode = %4d, w = %4d, h = %4d\n", + i, modelist[i].width, modelist[i].height); #endif - - SDL_modelist[i]->x = 0; - SDL_modelist[i]->y = 0; - SDL_modelist[i]->w = modelist[j].width; - SDL_modelist[i]->h = modelist[j].height; - - } + + SDL_modelist[i]->x = 0; + SDL_modelist[i]->y = 0; + SDL_modelist[i]->w = modelist[j].width; + SDL_modelist[i]->h = modelist[j].height; + + } SDL_modelist[i] = NULL; /* terminator */ - } - use_xme = 1; - saved_res = modelist[ractive]; /* save the current resolution */ + } + use_xme = 1; + saved_res = modelist[ractive]; /* save the current resolution */ } else { use_xme = 0; } @@ -449,46 +449,46 @@ #endif /* HAVE_XIGXME */ { - static int depth_list[] = { 32, 24, 16, 15, 8 }; - int j, np; - int use_directcolor = 1; - XPixmapFormatValues *pf; + static int depth_list[] = { 32, 24, 16, 15, 8 }; + int j, np; + int use_directcolor = 1; + XPixmapFormatValues *pf; - /* Search for the visuals in deepest-first order, so that the first - will be the richest one */ - if ( getenv("SDL_VIDEO_X11_NODIRECTCOLOR") ) { - use_directcolor = 0; - } - this->hidden->nvisuals = 0; - if ( ! add_visual_byid(this, getenv("SDL_VIDEO_X11_VISUALID")) ) { - for ( i=0; i<SDL_TABLESIZE(depth_list); ++i ) { - if ( depth_list[i] > 8 ) { - if ( use_directcolor ) { - add_visual(this, depth_list[i], DirectColor); - } - add_visual(this, depth_list[i], TrueColor); - } else { - add_visual(this, depth_list[i], PseudoColor); - add_visual(this, depth_list[i], StaticColor); - } - } - } - if ( this->hidden->nvisuals == 0 ) { - SDL_SetError("Found no sufficiently capable X11 visuals"); - return -1; - } - - /* look up the pixel quantum for each depth */ - pf = XListPixmapFormats(SDL_Display, &np); - for(i = 0; i < this->hidden->nvisuals; i++) { - int d = this->hidden->visuals[i].depth; - for(j = 0; j < np; j++) - if(pf[j].depth == d) - break; - this->hidden->visuals[i].bpp = j < np ? pf[j].bits_per_pixel : d; - } + /* Search for the visuals in deepest-first order, so that the first + will be the richest one */ + if ( getenv("SDL_VIDEO_X11_NODIRECTCOLOR") ) { + use_directcolor = 0; + } + this->hidden->nvisuals = 0; + if ( ! add_visual_byid(this, getenv("SDL_VIDEO_X11_VISUALID")) ) { + for ( i=0; i<SDL_TABLESIZE(depth_list); ++i ) { + if ( depth_list[i] > 8 ) { + if ( use_directcolor ) { + add_visual(this, depth_list[i], DirectColor); + } + add_visual(this, depth_list[i], TrueColor); + } else { + add_visual(this, depth_list[i], PseudoColor); + add_visual(this, depth_list[i], StaticColor); + } + } + } + if ( this->hidden->nvisuals == 0 ) { + SDL_SetError("Found no sufficiently capable X11 visuals"); + return -1; + } + + /* look up the pixel quantum for each depth */ + pf = XListPixmapFormats(SDL_Display, &np); + for(i = 0; i < this->hidden->nvisuals; i++) { + int d = this->hidden->visuals[i].depth; + for(j = 0; j < np; j++) + if(pf[j].depth == d) + break; + this->hidden->visuals[i].bpp = j < np ? pf[j].bits_per_pixel : d; + } - XFree(pf); + XFree(pf); } if ( SDL_modelist == NULL ) { @@ -535,13 +535,20 @@ /* Query Xinerama extention */ if ( SDL_NAME(XineramaQueryExtension)(SDL_Display, &i, &i) && SDL_NAME(XineramaIsActive)(SDL_Display) ) { - /* Find out which screen is the zero'th one */ + /* Find out which screen is the desired one */ + int desired = 0; int screens; SDL_NAME(XineramaScreenInfo) *xinerama; #ifdef XINERAMA_DEBUG printf("X11 detected Xinerama:\n"); #endif +#if 0 /* Apparently the vidmode extension doesn't work with Xinerama */ + const char *variable = getenv("SDL_VIDEO_X11_XINERAMA_SCREEN"); + if ( variable ) { + desired = atoi(variable); + } +#endif xinerama = SDL_NAME(XineramaQueryScreens)(SDL_Display, &screens); for ( i = 0; i < screens; i++ ) { #ifdef XINERAMA_DEBUG @@ -550,7 +557,7 @@ xinerama[i].width, xinerama[i].height, xinerama[i].x_org, xinerama[i].y_org); #endif - if ( xinerama[i].screen_number == 0 ) { + if ( xinerama[i].screen_number == desired ) { xinerama_x = xinerama[i].x_org; xinerama_y = xinerama[i].y_org; } @@ -566,8 +573,8 @@ { int i; for(i = 0; i < this->hidden->nvisuals; i++) - if(this->hidden->visuals[i].bpp == format->BitsPerPixel) - return 1; + if(this->hidden->visuals[i].bpp == format->BitsPerPixel) + return 1; return 0; } @@ -672,7 +679,8 @@ if ( current_h > real_h ) { real_h = MAX(real_h, screen_h); } - XMoveResizeWindow(SDL_Display, FSwindow, 0, 0, real_w, real_h); + XMoveResizeWindow(SDL_Display, FSwindow, + xinerama_x, xinerama_y, real_w, real_h); XMapRaised(SDL_Display, FSwindow); X11_WaitMapped(this, FSwindow); @@ -745,22 +753,22 @@ #endif #ifdef HAVE_XIGXME - if ( use_xme ) { - int rw, rh; - + if ( use_xme ) { + int rw, rh; + /* check current mode so we can avoid uneccessary mode changes */ - get_real_resolution(this, &rw, &rh); + get_real_resolution(this, &rw, &rh); - if (rw != saved_res.width || rh != saved_res.height) { - XiGMiscChangeResolution(SDL_Display, - SDL_Screen, - 0, /* view */ - saved_res.width, - saved_res.height, - 0); - XSync(SDL_Display, False); - } - } + if (rw != saved_res.width || rh != saved_res.height) { + XiGMiscChangeResolution(SDL_Display, + SDL_Screen, + 0, /* view */ + saved_res.width, + saved_res.height, + 0); + XSync(SDL_Display, False); + } + } #endif XUnmapWindow(SDL_Display, FSwindow);