--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403336
This commit is contained in:
Sam Lantinga 2008-12-16 17:44:10 +00:00
parent a01b1f5aec
commit 67426e7b9f
3 changed files with 107 additions and 67 deletions

View file

@ -228,14 +228,15 @@ CheckVidMode(Display *display, int *major, int *minor)
/* Query the extension version */ /* Query the extension version */
vm_error = -1; vm_error = -1;
if (!SDL_NAME(XF86VidModeQueryExtension)(display, &vm_event, &vm_error) || if (!SDL_NAME(XF86VidModeQueryExtension) (display, &vm_event, &vm_error)
!SDL_NAME(XF86VidModeQueryVersion)(display, major, minor)) { || !SDL_NAME(XF86VidModeQueryVersion) (display, major, minor)) {
return SDL_FALSE; return SDL_FALSE;
} }
return SDL_TRUE; return SDL_TRUE;
} }
Bool SDL_NAME(XF86VidModeGetModeInfo)(Display *dpy, int scr, SDL_NAME(XF86VidModeModeInfo) *info) Bool SDL_NAME(XF86VidModeGetModeInfo) (Display * dpy, int scr,
SDL_NAME(XF86VidModeModeInfo) * info)
{ {
Bool retval; Bool retval;
int dotclock; int dotclock;
@ -262,14 +263,19 @@ Bool SDL_NAME(XF86VidModeGetModeInfo)(Display *dpy, int scr, SDL_NAME(XF86VidMod
static int static int
calculate_rate(SDL_NAME(XF86VidModeModeInfo) * info) calculate_rate(SDL_NAME(XF86VidModeModeInfo) * info)
{ {
return (info->htotal && info->vtotal) ? (1000 * info->dotclock / (info->htotal * info->vtotal)) : 0; return (info->htotal
&& info->vtotal) ? (1000 * info->dotclock / (info->htotal *
info->vtotal)) : 0;
} }
static void static void
save_mode(Display * display, SDL_DisplayData * data) save_mode(Display * display, SDL_DisplayData * data)
{ {
SDL_NAME(XF86VidModeGetModeInfo)(display, data->screen, &data->saved_mode); SDL_NAME(XF86VidModeGetModeInfo) (display, data->screen,
SDL_NAME(XF86VidModeGetViewPort)(display, data->screen, &data->saved_view.x,&data->saved_view.y); &data->saved_mode);
SDL_NAME(XF86VidModeGetViewPort) (display, data->screen,
&data->saved_view.x,
&data->saved_view.y);
} }
static void static void
@ -279,11 +285,14 @@ restore_mode(Display *display, SDL_DisplayData *data)
if (SDL_NAME(XF86VidModeGetModeInfo) (display, data->screen, &mode)) { if (SDL_NAME(XF86VidModeGetModeInfo) (display, data->screen, &mode)) {
if (SDL_memcmp(&mode, &data->saved_mode, sizeof(mode)) != 0) { if (SDL_memcmp(&mode, &data->saved_mode, sizeof(mode)) != 0) {
SDL_NAME(XF86VidModeSwitchToMode)(display, data->screen, &data->saved_mode); SDL_NAME(XF86VidModeSwitchToMode) (display, data->screen,
&data->saved_mode);
} }
} }
if ((data->saved_view.x != 0) || (data->saved_view.y != 0)) { if ((data->saved_view.x != 0) || (data->saved_view.y != 0)) {
SDL_NAME(XF86VidModeSetViewPort)(display, data->screen, data->saved_view.x, data->saved_view.y); SDL_NAME(XF86VidModeSetViewPort) (display, data->screen,
data->saved_view.x,
data->saved_view.y);
} }
} }
#endif /* SDL_VIDEO_DRIVER_X11_VIDMODE */ #endif /* SDL_VIDEO_DRIVER_X11_VIDMODE */
@ -345,7 +354,8 @@ X11_GetDisplayModes(_THIS)
xinerama[i].x_org, xinerama[i].y_org); xinerama[i].x_org, xinerama[i].y_org);
#endif #endif
if (xinerama[i].screen_number == data->screen) { if (xinerama[i].screen_number == data->screen) {
data->use_xinerama = xinerama_major * 100 + xinerama_minor; data->use_xinerama =
xinerama_major * 100 + xinerama_minor;
data->xinerama_info = xinerama[i]; data->xinerama_info = xinerama[i];
} }
} }
@ -374,7 +384,8 @@ X11_GetDisplayModes(_THIS)
#if SDL_VIDEO_DRIVER_X11_XRANDR #if SDL_VIDEO_DRIVER_X11_XRANDR
/* XRandR */ /* XRandR */
/* require at least XRandR v1.0 (arbitrary) */ /* require at least XRandR v1.0 (arbitrary) */
if (CheckXRandR(display, &xrandr_major, &xrandr_minor) && xrandr_major >= 1) { if (CheckXRandR(display, &xrandr_major, &xrandr_minor)
&& xrandr_major >= 1) {
#ifdef X11MODES_DEBUG #ifdef X11MODES_DEBUG
fprintf(stderr, "XRANDR: XRRQueryVersion: V%d.%d\n", fprintf(stderr, "XRANDR: XRRQueryVersion: V%d.%d\n",
xrandr_major, xrandr_minor); xrandr_major, xrandr_minor);
@ -383,7 +394,8 @@ X11_GetDisplayModes(_THIS)
/* save the screen configuration since we must reference it /* save the screen configuration since we must reference it
each time we toggle modes. each time we toggle modes.
*/ */
data->screen_config = XRRGetScreenInfo(display, RootWindow(display, data->screen)); data->screen_config =
XRRGetScreenInfo(display, RootWindow(display, data->screen));
/* retrieve the list of resolution */ /* retrieve the list of resolution */
sizes = XRRConfigSizes(data->screen_config, &nsizes); sizes = XRRConfigSizes(data->screen_config, &nsizes);
@ -397,7 +409,8 @@ X11_GetDisplayModes(_THIS)
for (j = 0; j < nrates; ++j) { for (j = 0; j < nrates; ++j) {
mode.refresh_rate = rates[j]; mode.refresh_rate = rates[j];
#ifdef X11MODES_DEBUG #ifdef X11MODES_DEBUG
fprintf(stderr, "XRANDR: mode = %4d[%d], w = %4d, h = %4d, rate = %4d\n", fprintf(stderr,
"XRANDR: mode = %4d[%d], w = %4d, h = %4d, rate = %4d\n",
i, j, mode.w, mode.h, mode.refresh_rate); i, j, mode.w, mode.h, mode.refresh_rate);
#endif #endif
SDL_AddDisplayMode(_this->current_display, &mode); SDL_AddDisplayMode(_this->current_display, &mode);
@ -405,7 +418,9 @@ X11_GetDisplayModes(_THIS)
} }
data->use_xrandr = xrandr_major * 100 + xrandr_minor; data->use_xrandr = xrandr_major * 100 + xrandr_minor;
data->saved_size = XRRConfigCurrentConfiguration(data->screen_config, &data->saved_rotation); data->saved_size =
XRRConfigCurrentConfiguration(data->screen_config,
&data->saved_rotation);
data->saved_rate = XRRConfigCurrentRate(data->screen_config); data->saved_rate = XRRConfigCurrentRate(data->screen_config);
} }
} }
@ -418,8 +433,8 @@ X11_GetDisplayModes(_THIS)
(!data->use_xinerama || data->xinerama_info.screen_number == 0) && (!data->use_xinerama || data->xinerama_info.screen_number == 0) &&
#endif #endif
CheckVidMode(display, &vm_major, &vm_minor) && CheckVidMode(display, &vm_major, &vm_minor) &&
SDL_NAME(XF86VidModeGetAllModeLines)(display, data->screen, &nmodes, &modes) ) SDL_NAME(XF86VidModeGetAllModeLines) (display, data->screen, &nmodes,
{ &modes)) {
int i; int i;
#ifdef X11MODES_DEBUG #ifdef X11MODES_DEBUG
@ -449,7 +464,6 @@ X11_GetDisplayModes(_THIS)
mode.refresh_rate = 0; mode.refresh_rate = 0;
SDL_AddDisplayMode(_this->current_display, &mode); SDL_AddDisplayMode(_this->current_display, &mode);
} }
#ifdef X11MODES_DEBUG #ifdef X11MODES_DEBUG
if (data->use_xinerama) { if (data->use_xinerama) {
printf("Xinerama is enabled\n"); printf("Xinerama is enabled\n");
@ -466,7 +480,8 @@ X11_GetDisplayModes(_THIS)
} }
static void static void
get_real_resolution(Display *display, SDL_DisplayData *data, int *w, int *h, int *rate) get_real_resolution(Display * display, SDL_DisplayData * data, int *w, int *h,
int *rate)
{ {
#if SDL_VIDEO_DRIVER_X11_XRANDR #if SDL_VIDEO_DRIVER_X11_XRANDR
if (data->use_xrandr) { if (data->use_xrandr) {
@ -478,12 +493,16 @@ get_real_resolution(Display *display, SDL_DisplayData *data, int *w, int *h, int
int cur_size; int cur_size;
Rotation cur_rotation; Rotation cur_rotation;
cur_size = XRRConfigCurrentConfiguration(data->screen_config, &cur_rotation); cur_size =
XRRConfigCurrentConfiguration(data->screen_config,
&cur_rotation);
*w = sizes[cur_size].width; *w = sizes[cur_size].width;
*h = sizes[cur_size].height; *h = sizes[cur_size].height;
*rate = XRRConfigCurrentRate(data->screen_config); *rate = XRRConfigCurrentRate(data->screen_config);
#ifdef X11MODES_DEBUG #ifdef X11MODES_DEBUG
fprintf(stderr, "XRANDR: get_real_resolution: w = %d, h = %d, rate = %d\n", *w, *h, *rate); fprintf(stderr,
"XRANDR: get_real_resolution: w = %d, h = %d, rate = %d\n",
*w, *h, *rate);
#endif #endif
return; return;
} }
@ -518,7 +537,8 @@ get_real_resolution(Display *display, SDL_DisplayData *data, int *w, int *h, int
} }
static void static void
set_best_resolution(Display *display, SDL_DisplayData *data, int w, int h, int rate) set_best_resolution(Display * display, SDL_DisplayData * data, int w, int h,
int rate)
{ {
int real_w, real_h, real_rate; int real_w, real_h, real_rate;
@ -527,7 +547,6 @@ set_best_resolution(Display *display, SDL_DisplayData *data, int w, int h, int r
if (w == real_w && h == real_h && (!rate || rate == real_rate)) { if (w == real_w && h == real_h && (!rate || rate == real_rate)) {
return; return;
} }
#if SDL_VIDEO_DRIVER_X11_XRANDR #if SDL_VIDEO_DRIVER_X11_XRANDR
if (data->use_xrandr) { if (data->use_xrandr) {
#ifdef X11MODES_DEBUG #ifdef X11MODES_DEBUG
@ -553,7 +572,8 @@ set_best_resolution(Display *display, SDL_DisplayData *data, int w, int h, int r
} }
if (best == -1 || if (best == -1 ||
(sizes[i].width < sizes[best].width) || (sizes[i].width < sizes[best].width) ||
(sizes[i].width == sizes[best].width && sizes[i].height < sizes[best].height)) { (sizes[i].width == sizes[best].width
&& sizes[i].height < sizes[best].height)) {
best = i; best = i;
} }
} }
@ -577,7 +597,10 @@ set_best_resolution(Display *display, SDL_DisplayData *data, int w, int h, int r
} }
} }
} }
XRRSetScreenConfigAndRate(display, data->screen_config, RootWindow(display, data->screen), best, data->saved_rotation, best_rate, CurrentTime); XRRSetScreenConfigAndRate(display, data->screen_config,
RootWindow(display, data->screen), best,
data->saved_rotation, best_rate,
CurrentTime);
} }
return; return;
} }
@ -589,7 +612,8 @@ set_best_resolution(Display *display, SDL_DisplayData *data, int w, int h, int r
int i, nmodes; int i, nmodes;
int best; int best;
if (SDL_NAME(XF86VidModeGetAllModeLines)(display,data->screen,&nmodes,&modes)) { if (SDL_NAME(XF86VidModeGetAllModeLines)
(display, data->screen, &nmodes, &modes)) {
best = -1; best = -1;
for (i = 0; i < nmodes; ++i) { for (i = 0; i < nmodes; ++i) {
if (modes[i]->hdisplay < w || modes[i]->vdisplay < h) { if (modes[i]->hdisplay < w || modes[i]->vdisplay < h) {
@ -597,7 +621,8 @@ set_best_resolution(Display *display, SDL_DisplayData *data, int w, int h, int r
} }
if (best == -1 || if (best == -1 ||
(modes[i]->hdisplay < modes[best]->hdisplay) || (modes[i]->hdisplay < modes[best]->hdisplay) ||
(modes[i]->hdisplay == modes[best]->hdisplay && modes[i]->vdisplay < modes[best]->vdisplay)) { (modes[i]->hdisplay == modes[best]->hdisplay
&& modes[i]->vdisplay < modes[best]->vdisplay)) {
best = i; best = i;
continue; continue;
} }
@ -605,11 +630,13 @@ set_best_resolution(Display *display, SDL_DisplayData *data, int w, int h, int r
(modes[i]->vdisplay == modes[best]->vdisplay)) { (modes[i]->vdisplay == modes[best]->vdisplay)) {
if (!rate) { if (!rate) {
/* Higher is better, right? */ /* Higher is better, right? */
if (calculate_rate(modes[i]) > calculate_rate(modes[best])) { if (calculate_rate(modes[i]) >
calculate_rate(modes[best])) {
best = i; best = i;
} }
} else { } else {
if (SDL_abs(calculate_rate(modes[i])-rate) < SDL_abs(calculate_rate(modes[best])-rate)) { if (SDL_abs(calculate_rate(modes[i]) - rate) <
SDL_abs(calculate_rate(modes[best]) - rate)) {
best = i; best = i;
} }
} }
@ -621,7 +648,8 @@ set_best_resolution(Display *display, SDL_DisplayData *data, int w, int h, int r
modes[best]->hdisplay, modes[best]->vdisplay, modes[best]->hdisplay, modes[best]->vdisplay,
calculate_rate(modes[best])); calculate_rate(modes[best]));
#endif #endif
SDL_NAME(XF86VidModeSwitchToMode)(display, data->screen, modes[best]); SDL_NAME(XF86VidModeSwitchToMode) (display, data->screen,
modes[best]);
} }
XFree(modes); XFree(modes);
} }

View file

@ -45,7 +45,8 @@ typedef struct
#endif #endif
#if SDL_VIDEO_DRIVER_X11_VIDMODE #if SDL_VIDEO_DRIVER_X11_VIDMODE
SDL_NAME(XF86VidModeModeInfo) saved_mode; SDL_NAME(XF86VidModeModeInfo) saved_mode;
struct { struct
{
int x, y; int x, y;
} saved_view; } saved_view;
#endif #endif

View file

@ -236,7 +236,9 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags)
data->current_pixmap = 0; data->current_pixmap = 0;
/* Get the format of the window */ /* Get the format of the window */
if (!SDL_PixelFormatEnumToMasks(display->current_mode.format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { if (!SDL_PixelFormatEnumToMasks
(display->current_mode.format, &bpp, &Rmask, &Gmask, &Bmask,
&Amask)) {
SDL_SetError("Unknown display format"); SDL_SetError("Unknown display format");
X11_DestroyRenderer(renderer); X11_DestroyRenderer(renderer);
return NULL; return NULL;
@ -364,7 +366,9 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
data->pixels = shminfo->shmaddr; data->pixels = shminfo->shmaddr;
data->image = data->image =
XShmCreateImage(renderdata->display, renderdata->visual, renderdata->depth, ZPixmap, shminfo->shmaddr, shminfo, texture->w, texture->h); XShmCreateImage(renderdata->display, renderdata->visual,
renderdata->depth, ZPixmap, shminfo->shmaddr,
shminfo, texture->w, texture->h);
if (!data->image) { if (!data->image) {
XShmDetach(renderdata->display, shminfo); XShmDetach(renderdata->display, shminfo);
XSync(renderdata->display, False); XSync(renderdata->display, False);
@ -386,7 +390,11 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
} }
data->image = data->image =
XCreateImage(renderdata->display, renderdata->visual, renderdata->depth, ZPixmap, 0, data->pixels, texture->w, texture->h, SDL_BYTESPERPIXEL(data->format) * 8, data->pitch); XCreateImage(renderdata->display, renderdata->visual,
renderdata->depth, ZPixmap, 0, data->pixels,
texture->w, texture->h,
SDL_BYTESPERPIXEL(data->format) * 8,
data->pitch);
if (!data->image) { if (!data->image) {
X11_DestroyTexture(renderer, texture); X11_DestroyTexture(renderer, texture);
SDL_SetError("XCreateImage() failed"); SDL_SetError("XCreateImage() failed");
@ -404,7 +412,10 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
} }
data->image = data->image =
XCreateImage(renderdata->display, renderdata->visual, renderdata->depth, ZPixmap, 0, NULL, texture->w, texture->h, SDL_BYTESPERPIXEL(data->format) * 8, data->pitch); XCreateImage(renderdata->display, renderdata->visual,
renderdata->depth, ZPixmap, 0, NULL, texture->w,
texture->h, SDL_BYTESPERPIXEL(data->format) * 8,
data->pitch);
if (!data->image) { if (!data->image) {
X11_DestroyTexture(renderer, texture); X11_DestroyTexture(renderer, texture);
SDL_SetError("XCreateImage() failed"); SDL_SetError("XCreateImage() failed");
@ -606,8 +617,8 @@ X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
} }
image = image =
XCreateImage(data->display, data->visual, data->depth, ZPixmap, XCreateImage(data->display, data->visual, data->depth,
0, pixels, dstrect->w, dstrect->h, ZPixmap, 0, pixels, dstrect->w, dstrect->h,
SDL_BYTESPERPIXEL(texturedata->format) * 8, SDL_BYTESPERPIXEL(texturedata->format) * 8,
pitch); pitch);
if (!image) { if (!image) {