indent
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403336
This commit is contained in:
parent
a01b1f5aec
commit
67426e7b9f
3 changed files with 107 additions and 67 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue