src/video/x11/SDL_x11modes.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 01 Jan 2009 18:58:26 +0000
changeset 2945 e38423786728
parent 2920 cdb01906cb7e
child 2954 2c01dc6218cc
permissions -rw-r--r--
Fixed DirectColor visual window creation problem
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     1
/*
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     2
    SDL - Simple DirectMedia Layer
2859
99210400e8b9 Updated copyright date
Sam Lantinga <slouken@libsdl.org>
parents: 1951
diff changeset
     3
    Copyright (C) 1997-2009 Sam Lantinga
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     4
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     5
    This library is free software; you can redistribute it and/or
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     6
    modify it under the terms of the GNU Lesser General Public
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     7
    License as published by the Free Software Foundation; either
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     8
    version 2.1 of the License, or (at your option) any later version.
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
     9
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    10
    This library is distributed in the hope that it will be useful,
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    13
    Lesser General Public License for more details.
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    14
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    15
    You should have received a copy of the GNU Lesser General Public
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    16
    License along with this library; if not, write to the Free Software
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    17
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    18
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    19
    Sam Lantinga
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    20
    slouken@libsdl.org
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    21
*/
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    22
#include "SDL_config.h"
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    23
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    24
#include "SDL_x11video.h"
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    25
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
    26
//#define X11MODES_DEBUG
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
    27
#undef SDL_VIDEO_DRIVER_X11_XINERAMA
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
    28
#undef SDL_VIDEO_DRIVER_X11_XRANDR
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
    29
#undef SDL_VIDEO_DRIVER_X11_VIDMODE
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    30
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    31
static int
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    32
get_visualinfo(Display * display, int screen, XVisualInfo * vinfo)
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    33
{
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    34
    const char *visual_id = SDL_getenv("SDL_VIDEO_X11_VISUALID");
2945
e38423786728 Fixed DirectColor visual window creation problem
Sam Lantinga <slouken@libsdl.org>
parents: 2920
diff changeset
    35
    /* We really don't need DirectColor visuals until we implement
e38423786728 Fixed DirectColor visual window creation problem
Sam Lantinga <slouken@libsdl.org>
parents: 2920
diff changeset
    36
     * gamma ramps, but we'll leave it on for now to catch bugs */
e38423786728 Fixed DirectColor visual window creation problem
Sam Lantinga <slouken@libsdl.org>
parents: 2920
diff changeset
    37
    int use_directcolor = 1;
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    38
    int depth;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    39
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    40
    /* Look for an exact visual, if requested */
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    41
    if (visual_id) {
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    42
        XVisualInfo *vi, template;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    43
        int nvis;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    44
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    45
        SDL_zero(template);
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    46
        template.visualid = SDL_strtol(visual_id, NULL, 0);
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    47
        vi = XGetVisualInfo(display, VisualIDMask, &template, &nvis);
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    48
        if (vi) {
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    49
            *vinfo = *vi;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    50
            XFree(vi);
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    51
            return 0;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    52
        }
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    53
    }
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    54
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    55
    depth = DefaultDepth(display, screen);
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    56
    if ((use_directcolor &&
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    57
         XMatchVisualInfo(display, screen, depth, DirectColor, vinfo)) ||
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    58
        XMatchVisualInfo(display, screen, depth, TrueColor, vinfo) ||
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    59
        XMatchVisualInfo(display, screen, depth, PseudoColor, vinfo) ||
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    60
        XMatchVisualInfo(display, screen, depth, StaticColor, vinfo)) {
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    61
        return 0;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    62
    }
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    63
    return -1;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    64
}
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
    65
2870
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    66
static Uint32
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
    67
X11_GetPixelFormatFromVisualInfo(Display * display, XVisualInfo * vinfo)
2870
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    68
{
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    69
    if (vinfo->class == DirectColor || vinfo->class == TrueColor) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    70
        int bpp;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    71
        Uint32 Rmask, Gmask, Bmask, Amask;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    72
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    73
        Rmask = vinfo->visual->red_mask;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    74
        Gmask = vinfo->visual->green_mask;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    75
        Bmask = vinfo->visual->blue_mask;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    76
        if (vinfo->depth == 32) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    77
            Amask = (0xFFFFFFFF & ~(Rmask | Gmask | Bmask));
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    78
        } else {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    79
            Amask = 0;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    80
        }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    81
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    82
        bpp = vinfo->depth;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    83
        if (bpp == 24) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    84
            int i, n;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    85
            XPixmapFormatValues *p = XListPixmapFormats(display, &n);
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    86
            if (p) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    87
                for (i = 0; i < n; ++i) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    88
                    if (p[i].depth == 24) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    89
                        bpp = p[i].bits_per_pixel;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    90
                        break;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    91
                    }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    92
                }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    93
                XFree(p);
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    94
            }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    95
        }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    96
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    97
        return SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask);
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    98
    }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
    99
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   100
    if (vinfo->class == PseudoColor || vinfo->class == StaticColor) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   101
        switch (vinfo->depth) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   102
        case 8:
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   103
            return SDL_PIXELTYPE_INDEX8;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   104
        case 4:
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   105
            if (BitmapBitOrder(display) == LSBFirst) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   106
                return SDL_PIXELFORMAT_INDEX4LSB;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   107
            } else {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   108
                return SDL_PIXELFORMAT_INDEX4MSB;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   109
            }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   110
            break;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   111
        case 1:
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   112
            if (BitmapBitOrder(display) == LSBFirst) {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   113
                return SDL_PIXELFORMAT_INDEX1LSB;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   114
            } else {
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   115
                return SDL_PIXELFORMAT_INDEX1MSB;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   116
            }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   117
            break;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   118
        }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   119
    }
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   120
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   121
    return SDL_PIXELFORMAT_UNKNOWN;
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   122
}
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   123
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   124
void
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   125
X11_InitModes(_THIS)
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   126
{
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   127
    SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   128
    int screen;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   129
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   130
    for (screen = 0; screen < ScreenCount(data->display); ++screen) {
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   131
        XVisualInfo vinfo;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   132
        SDL_VideoDisplay display;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   133
        SDL_DisplayData *displaydata;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   134
        SDL_DisplayMode mode;
2916
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   135
        XPixmapFormatValues *pixmapFormats;
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   136
        int i, n;
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   137
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   138
        if (get_visualinfo(data->display, screen, &vinfo) < 0) {
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   139
            continue;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   140
        }
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   141
2870
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   142
        mode.format = X11_GetPixelFormatFromVisualInfo(data->display, &vinfo);
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   143
        mode.w = DisplayWidth(data->display, screen);
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   144
        mode.h = DisplayHeight(data->display, screen);
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   145
        mode.refresh_rate = 0;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   146
        mode.driverdata = NULL;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   147
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   148
        displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata));
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   149
        if (!displaydata) {
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   150
            continue;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   151
        }
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   152
        displaydata->screen = screen;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   153
        displaydata->visual = vinfo.visual;
1951
7177581dc9fa Initial work on X11 window code in.
Sam Lantinga <slouken@libsdl.org>
parents: 1950
diff changeset
   154
        displaydata->depth = vinfo.depth;
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   155
2920
Sam Lantinga <slouken@libsdl.org>
parents: 2916
diff changeset
   156
        displaydata->scanline_pad = SDL_BYTESPERPIXEL(mode.format) * 8;
2916
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   157
        pixmapFormats = XListPixmapFormats(data->display, &n);
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   158
        if (pixmapFormats) {
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   159
            for (i = 0; i < n; ++i) {
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   160
                if (pixmapFormats[i].depth == displaydata->depth) {
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   161
                    displaydata->scanline_pad = pixmapFormats[i].scanline_pad;
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   162
                    break;
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   163
                }
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   164
            }
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   165
            XFree(pixmapFormats);
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   166
        }
ffdd533f7add Fixed pitch alignment problem causing MITSHM error on 16-bit displays
Sam Lantinga <slouken@libsdl.org>
parents: 2906
diff changeset
   167
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   168
        SDL_zero(display);
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   169
        display.desktop_mode = mode;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   170
        display.current_mode = mode;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   171
        display.driverdata = displaydata;
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   172
        SDL_AddVideoDisplay(&display);
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   173
    }
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   174
}
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   175
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   176
/* Global for the error handler */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   177
int vm_event, vm_error = -1;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   178
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   179
#if SDL_VIDEO_DRIVER_X11_XINERAMA
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   180
static SDL_bool
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   181
CheckXinerama(Display * display, int *major, int *minor)
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   182
{
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   183
    const char *env;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   184
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   185
    /* Default the extension not available */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   186
    *major = *minor = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   187
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   188
    /* Allow environment override */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   189
    env = getenv("SDL_VIDEO_X11_XINERAMA");
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   190
    if (env && !SDL_atoi(env)) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   191
        return SDL_FALSE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   192
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   193
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   194
    /* Query the extension version */
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   195
    if (!SDL_NAME(XineramaQueryExtension) (display, major, minor) ||
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   196
        !SDL_NAME(XineramaIsActive) (display)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   197
        return SDL_FALSE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   198
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   199
    return SDL_TRUE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   200
}
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   201
#endif /* SDL_VIDEO_DRIVER_X11_XINERAMA */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   202
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   203
#if SDL_VIDEO_DRIVER_X11_XRANDR
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   204
static SDL_bool
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   205
CheckXRandR(Display * display, int *major, int *minor)
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   206
{
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   207
    const char *env;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   208
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   209
    /* Default the extension not available */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   210
    *major = *minor = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   211
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   212
    /* Allow environment override */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   213
    env = getenv("SDL_VIDEO_X11_XRANDR");
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   214
    if (env && !SDL_atoi(env)) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   215
        return SDL_FALSE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   216
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   217
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   218
    if (!SDL_X11_HAVE_XRANDR) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   219
        return SDL_FALSE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   220
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   221
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   222
    /* Query the extension version */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   223
    if (!XRRQueryVersion(display, major, minor)) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   224
        return SDL_FALSE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   225
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   226
    return SDL_TRUE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   227
}
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   228
#endif /* SDL_VIDEO_DRIVER_X11_XRANDR */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   229
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   230
#if SDL_VIDEO_DRIVER_X11_VIDMODE
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   231
static SDL_bool
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   232
CheckVidMode(Display * display, int *major, int *minor)
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   233
{
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   234
    const char *env;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   235
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   236
    /* Default the extension not available */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   237
    *major = *minor = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   238
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   239
    /* Allow environment override */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   240
    env = getenv("SDL_VIDEO_X11_VIDMODE");
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   241
    if (env && !SDL_atoi(env)) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   242
        return SDL_FALSE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   243
    }
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   244
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   245
    /* Query the extension version */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   246
    vm_error = -1;
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   247
    if (!SDL_NAME(XF86VidModeQueryExtension) (display, &vm_event, &vm_error)
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   248
        || !SDL_NAME(XF86VidModeQueryVersion) (display, major, minor)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   249
        return SDL_FALSE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   250
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   251
    return SDL_TRUE;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   252
}
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   253
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   254
Bool SDL_NAME(XF86VidModeGetModeInfo) (Display * dpy, int scr,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   255
                                       SDL_NAME(XF86VidModeModeInfo) * info)
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   256
{
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   257
    Bool retval;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   258
    int dotclock;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   259
    SDL_NAME(XF86VidModeModeLine) l;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   260
    SDL_zerop(info);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   261
    SDL_zero(l);
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   262
    retval = SDL_NAME(XF86VidModeGetModeLine) (dpy, scr, &dotclock, &l);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   263
    info->dotclock = dotclock;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   264
    info->hdisplay = l.hdisplay;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   265
    info->hsyncstart = l.hsyncstart;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   266
    info->hsyncend = l.hsyncend;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   267
    info->htotal = l.htotal;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   268
    info->hskew = l.hskew;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   269
    info->vdisplay = l.vdisplay;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   270
    info->vsyncstart = l.vsyncstart;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   271
    info->vsyncend = l.vsyncend;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   272
    info->vtotal = l.vtotal;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   273
    info->flags = l.flags;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   274
    info->privsize = l.privsize;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   275
    info->private = l.private;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   276
    return retval;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   277
}
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   278
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   279
static int
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   280
calculate_rate(SDL_NAME(XF86VidModeModeInfo) * info)
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   281
{
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   282
    return (info->htotal
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   283
            && info->vtotal) ? (1000 * info->dotclock / (info->htotal *
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   284
                                                         info->vtotal)) : 0;
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   285
}
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   286
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   287
static void
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   288
save_mode(Display * display, SDL_DisplayData * data)
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   289
{
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   290
    SDL_NAME(XF86VidModeGetModeInfo) (display, data->screen,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   291
                                      &data->saved_mode);
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   292
    SDL_NAME(XF86VidModeGetViewPort) (display, data->screen,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   293
                                      &data->saved_view.x,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   294
                                      &data->saved_view.y);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   295
}
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   296
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   297
static void
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   298
restore_mode(Display * display, SDL_DisplayData * data)
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   299
{
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   300
    SDL_NAME(XF86VidModeModeInfo) mode;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   301
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   302
    if (SDL_NAME(XF86VidModeGetModeInfo) (display, data->screen, &mode)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   303
        if (SDL_memcmp(&mode, &data->saved_mode, sizeof(mode)) != 0) {
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   304
            SDL_NAME(XF86VidModeSwitchToMode) (display, data->screen,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   305
                                               &data->saved_mode);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   306
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   307
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   308
    if ((data->saved_view.x != 0) || (data->saved_view.y != 0)) {
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   309
        SDL_NAME(XF86VidModeSetViewPort) (display, data->screen,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   310
                                          data->saved_view.x,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   311
                                          data->saved_view.y);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   312
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   313
}
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   314
#endif /* SDL_VIDEO_DRIVER_X11_VIDMODE */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   315
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   316
void
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   317
X11_GetDisplayModes(_THIS)
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   318
{
2870
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   319
    Display *display = ((SDL_VideoData *) _this->driverdata)->display;
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   320
    SDL_DisplayData *data = (SDL_DisplayData *) SDL_CurrentDisplay.driverdata;
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   321
#if SDL_VIDEO_DRIVER_X11_XINERAMA
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   322
    int xinerama_major, xinerama_minor;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   323
    int screens;
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   324
    SDL_NAME(XineramaScreenInfo) * xinerama;
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   325
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   326
#if SDL_VIDEO_DRIVER_X11_XRANDR
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   327
    int xrandr_major, xrandr_minor;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   328
    int nsizes, nrates;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   329
    XRRScreenSize *sizes;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   330
    short *rates;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   331
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   332
#if SDL_VIDEO_DRIVER_X11_VIDMODE
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   333
    int vm_major, vm_minor;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   334
    int nmodes;
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   335
    SDL_NAME(XF86VidModeModeInfo) ** modes;
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   336
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   337
    int screen_w;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   338
    int screen_h;
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   339
    SDL_DisplayMode mode;
2870
b801df19835f The X11 window and all pixmaps and images share the same visual and depth.
Sam Lantinga <slouken@libsdl.org>
parents: 2859
diff changeset
   340
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   341
    /* Unfortunately X11 requires the window to be created with the correct
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   342
     * visual and depth ahead of time, but the SDL API allows you to create
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   343
     * a window before setting the fullscreen display mode.  This means that
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   344
     * we have to use the same format for all windows and all display modes.
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   345
     * (or support recreating the window with a new visual behind the scenes)
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   346
     */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   347
    mode.format = SDL_CurrentDisplay.current_mode.format;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   348
    mode.driverdata = NULL;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   349
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   350
    data->use_xinerama = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   351
    data->use_xrandr = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   352
    data->use_vidmode = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   353
    screen_w = DisplayWidth(display, data->screen);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   354
    screen_h = DisplayHeight(display, data->screen);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   355
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   356
#if SDL_VIDEO_DRIVER_X11_XINERAMA
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   357
    /* Query Xinerama extention */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   358
    if (CheckXinerama(display, &xinerama_major, &xinerama_minor)) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   359
#ifdef X11MODES_DEBUG
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   360
        printf("X11 detected Xinerama:\n");
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   361
#endif
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   362
        xinerama = SDL_NAME(XineramaQueryScreens) (display, &screens);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   363
        if (xinerama) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   364
            int i;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   365
            for (i = 0; i < screens; i++) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   366
#ifdef X11MODES_DEBUG
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   367
                printf("xinerama %d: %dx%d+%d+%d\n",
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   368
                       xinerama[i].screen_number,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   369
                       xinerama[i].width, xinerama[i].height,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   370
                       xinerama[i].x_org, xinerama[i].y_org);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   371
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   372
                if (xinerama[i].screen_number == data->screen) {
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   373
                    data->use_xinerama =
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   374
                        xinerama_major * 100 + xinerama_minor;
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   375
                    data->xinerama_info = xinerama[i];
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   376
                }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   377
            }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   378
            XFree(xinerama);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   379
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   380
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   381
        if (data->use_xinerama) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   382
            /* Add the full xinerama mode */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   383
            if (screen_w > data->xinerama_info.width ||
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   384
                screen_h > data->xinerama_info.height) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   385
                mode.w = screen_w;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   386
                mode.h = screen_h;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   387
                mode.refresh_rate = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   388
                SDL_AddDisplayMode(_this->current_display, &mode);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   389
            }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   390
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   391
            /* Add the head xinerama mode */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   392
            mode.w = data->xinerama_info.width;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   393
            mode.h = data->xinerama_info.height;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   394
            mode.refresh_rate = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   395
            SDL_AddDisplayMode(_this->current_display, &mode);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   396
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   397
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   398
#endif /* SDL_VIDEO_DRIVER_X11_XINERAMA */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   399
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   400
#if SDL_VIDEO_DRIVER_X11_XRANDR
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   401
    /* XRandR */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   402
    /* require at least XRandR v1.0 (arbitrary) */
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   403
    if (CheckXRandR(display, &xrandr_major, &xrandr_minor)
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   404
        && xrandr_major >= 1) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   405
#ifdef X11MODES_DEBUG
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   406
        fprintf(stderr, "XRANDR: XRRQueryVersion: V%d.%d\n",
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   407
                xrandr_major, xrandr_minor);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   408
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   409
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   410
        /* save the screen configuration since we must reference it
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   411
           each time we toggle modes.
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   412
         */
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   413
        data->screen_config =
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   414
            XRRGetScreenInfo(display, RootWindow(display, data->screen));
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   415
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   416
        /* retrieve the list of resolution */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   417
        sizes = XRRConfigSizes(data->screen_config, &nsizes);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   418
        if (nsizes > 0) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   419
            int i, j;
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   420
            for (i = 0; i < nsizes; i++) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   421
                mode.w = sizes[i].width;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   422
                mode.h = sizes[i].height;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   423
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   424
                rates = XRRConfigRates(data->screen_config, i, &nrates);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   425
                for (j = 0; j < nrates; ++j) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   426
                    mode.refresh_rate = rates[j];
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   427
#ifdef X11MODES_DEBUG
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   428
                    fprintf(stderr,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   429
                            "XRANDR: mode = %4d[%d], w = %4d, h = %4d, rate = %4d\n",
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   430
                            i, j, mode.w, mode.h, mode.refresh_rate);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   431
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   432
                    SDL_AddDisplayMode(_this->current_display, &mode);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   433
                }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   434
            }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   435
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   436
            data->use_xrandr = xrandr_major * 100 + xrandr_minor;
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   437
            data->saved_size =
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   438
                XRRConfigCurrentConfiguration(data->screen_config,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   439
                                              &data->saved_rotation);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   440
            data->saved_rate = XRRConfigCurrentRate(data->screen_config);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   441
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   442
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   443
#endif /* SDL_VIDEO_DRIVER_X11_XRANDR */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   444
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   445
#if SDL_VIDEO_DRIVER_X11_VIDMODE
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   446
    /* XVidMode */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   447
    if (!data->use_xrandr &&
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   448
#if SDL_VIDEO_DRIVER_X11_XINERAMA
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   449
        (!data->use_xinerama || data->xinerama_info.screen_number == 0) &&
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   450
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   451
        CheckVidMode(display, &vm_major, &vm_minor) &&
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   452
        SDL_NAME(XF86VidModeGetAllModeLines) (display, data->screen, &nmodes,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   453
                                              &modes)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   454
        int i;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   455
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   456
#ifdef X11MODES_DEBUG
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   457
        printf("VidMode modes: (unsorted)\n");
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   458
        for (i = 0; i < nmodes; ++i) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   459
            printf("Mode %d: %d x %d @ %d\n", i,
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   460
                   modes[i]->hdisplay, modes[i]->vdisplay,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   461
                   calculate_rate(modes[i]));
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   462
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   463
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   464
        for (i = 0; i < nmodes; ++i) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   465
            mode.w = modes[i]->hdisplay;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   466
            mode.h = modes[i]->vdisplay;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   467
            mode.refresh_rate = calculate_rate(modes[i]);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   468
            SDL_AddDisplayMode(_this->current_display, &mode);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   469
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   470
        XFree(modes);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   471
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   472
        data->use_vidmode = vm_major * 100 + vm_minor;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   473
        save_mode(display, data);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   474
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   475
#endif /* SDL_VIDEO_DRIVER_X11_VIDMODE */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   476
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   477
    if (!data->use_xrandr && !data->use_vidmode) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   478
        mode.w = screen_w;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   479
        mode.h = screen_h;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   480
        mode.refresh_rate = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   481
        SDL_AddDisplayMode(_this->current_display, &mode);
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   482
    }
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   483
#ifdef X11MODES_DEBUG
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   484
    if (data->use_xinerama) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   485
        printf("Xinerama is enabled\n");
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   486
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   487
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   488
    if (data->use_xrandr) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   489
        printf("XRandR is enabled\n");
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   490
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   491
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   492
    if (data->use_vidmode) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   493
        printf("VidMode is enabled\n");
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   494
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   495
#endif /* X11MODES_DEBUG */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   496
}
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   497
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   498
static void
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   499
get_real_resolution(Display * display, SDL_DisplayData * data, int *w, int *h,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   500
                    int *rate)
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   501
{
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   502
#if SDL_VIDEO_DRIVER_X11_XRANDR
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   503
    if (data->use_xrandr) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   504
        int nsizes;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   505
        XRRScreenSize *sizes;
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   506
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   507
        sizes = XRRConfigSizes(data->screen_config, &nsizes);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   508
        if (nsizes > 0) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   509
            int cur_size;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   510
            Rotation cur_rotation;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   511
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   512
            cur_size =
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   513
                XRRConfigCurrentConfiguration(data->screen_config,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   514
                                              &cur_rotation);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   515
            *w = sizes[cur_size].width;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   516
            *h = sizes[cur_size].height;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   517
            *rate = XRRConfigCurrentRate(data->screen_config);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   518
#ifdef X11MODES_DEBUG
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   519
            fprintf(stderr,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   520
                    "XRANDR: get_real_resolution: w = %d, h = %d, rate = %d\n",
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   521
                    *w, *h, *rate);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   522
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   523
            return;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   524
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   525
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   526
#endif /* SDL_VIDEO_DRIVER_X11_XRANDR */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   527
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   528
#if SDL_VIDEO_DRIVER_X11_VIDMODE
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   529
    if (data->use_vidmode) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   530
        SDL_NAME(XF86VidModeModeInfo) mode;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   531
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   532
        if (SDL_NAME(XF86VidModeGetModeInfo) (display, data->screen, &mode)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   533
            *w = mode.hdisplay;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   534
            *h = mode.vdisplay;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   535
            *rate = calculate_rate(&mode);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   536
            return;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   537
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   538
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   539
#endif /* SDL_VIDEO_DRIVER_X11_VIDMODE */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   540
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   541
#if SDL_VIDEO_DRIVER_X11_XINERAMA
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   542
    if (data->use_xinerama) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   543
        *w = data->xinerama_info.width;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   544
        *h = data->xinerama_info.height;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   545
        *rate = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   546
        return;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   547
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   548
#endif /* SDL_VIDEO_DRIVER_X11_XINERAMA */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   549
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   550
    *w = DisplayWidth(display, data->screen);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   551
    *h = DisplayHeight(display, data->screen);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   552
    *rate = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   553
}
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   554
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   555
static void
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   556
set_best_resolution(Display * display, SDL_DisplayData * data, int w, int h,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   557
                    int rate)
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   558
{
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   559
    int real_w, real_h, real_rate;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   560
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   561
    /* check current mode so we can avoid uneccessary mode changes */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   562
    get_real_resolution(display, data, &real_w, &real_h, &real_rate);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   563
    if (w == real_w && h == real_h && (!rate || rate == real_rate)) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   564
        return;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   565
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   566
#if SDL_VIDEO_DRIVER_X11_XRANDR
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   567
    if (data->use_xrandr) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   568
#ifdef X11MODES_DEBUG
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   569
        fprintf(stderr, "XRANDR: set_best_resolution(): w = %d, h = %d\n",
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   570
                w, h);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   571
#endif
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   572
        int i, nsizes, nrates;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   573
        int best;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   574
        int best_rate;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   575
        XRRScreenSize *sizes;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   576
        short *rates;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   577
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   578
        /* find the smallest resolution that is at least as big as the user requested */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   579
        best = -1;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   580
        sizes = XRRConfigSizes(data->screen_config, &nsizes);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   581
        for (i = 0; i < nsizes; ++i) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   582
            if (sizes[i].width < w || sizes[i].height < h) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   583
                continue;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   584
            }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   585
            if (sizes[i].width == w && sizes[i].height == h) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   586
                best = i;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   587
                break;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   588
            }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   589
            if (best == -1 ||
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   590
                (sizes[i].width < sizes[best].width) ||
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   591
                (sizes[i].width == sizes[best].width
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   592
                 && sizes[i].height < sizes[best].height)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   593
                best = i;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   594
            }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   595
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   596
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   597
        if (best >= 0) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   598
            best_rate = 0;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   599
            rates = XRRConfigRates(data->screen_config, best, &nrates);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   600
            for (i = 0; i < nrates; ++i) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   601
                if (rates[i] == rate) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   602
                    best_rate = rate;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   603
                    break;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   604
                }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   605
                if (!rate) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   606
                    /* Higher is better, right? */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   607
                    if (rates[i] > best_rate) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   608
                        best_rate = rates[i];
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   609
                    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   610
                } else {
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   611
                    if (SDL_abs(rates[i] - rate) < SDL_abs(best_rate - rate)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   612
                        best_rate = rates[i];
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   613
                    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   614
                }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   615
            }
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   616
            XRRSetScreenConfigAndRate(display, data->screen_config,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   617
                                      RootWindow(display, data->screen), best,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   618
                                      data->saved_rotation, best_rate,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   619
                                      CurrentTime);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   620
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   621
        return;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   622
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   623
#endif /* SDL_VIDEO_DRIVER_X11_XRANDR */
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   624
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   625
#if SDL_VIDEO_DRIVER_X11_VIDMODE
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   626
    if (data->use_vidmode) {
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   627
        SDL_NAME(XF86VidModeModeInfo) ** modes;
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   628
        int i, nmodes;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   629
        int best;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   630
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   631
        if (SDL_NAME(XF86VidModeGetAllModeLines)
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   632
            (display, data->screen, &nmodes, &modes)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   633
            best = -1;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   634
            for (i = 0; i < nmodes; ++i) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   635
                if (modes[i]->hdisplay < w || modes[i]->vdisplay < h) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   636
                    continue;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   637
                }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   638
                if (best == -1 ||
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   639
                    (modes[i]->hdisplay < modes[best]->hdisplay) ||
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   640
                    (modes[i]->hdisplay == modes[best]->hdisplay
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   641
                     && modes[i]->vdisplay < modes[best]->vdisplay)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   642
                    best = i;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   643
                    continue;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   644
                }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   645
                if ((modes[i]->hdisplay == modes[best]->hdisplay) &&
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   646
                    (modes[i]->vdisplay == modes[best]->vdisplay)) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   647
                    if (!rate) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   648
                        /* Higher is better, right? */
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   649
                        if (calculate_rate(modes[i]) >
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   650
                            calculate_rate(modes[best])) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   651
                            best = i;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   652
                        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   653
                    } else {
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   654
                        if (SDL_abs(calculate_rate(modes[i]) - rate) <
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   655
                            SDL_abs(calculate_rate(modes[best]) - rate)) {
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   656
                            best = i;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   657
                        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   658
                    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   659
                }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   660
            }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   661
            if (best >= 0) {
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   662
#ifdef X11MODES_DEBUG
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   663
                printf("Best Mode %d: %d x %d @ %d\n", best,
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   664
                       modes[best]->hdisplay, modes[best]->vdisplay,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   665
                       calculate_rate(modes[best]));
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   666
#endif
2874
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   667
                SDL_NAME(XF86VidModeSwitchToMode) (display, data->screen,
Sam Lantinga <slouken@libsdl.org>
parents: 2873
diff changeset
   668
                                                   modes[best]);
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   669
            }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   670
            XFree(modes);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   671
        }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   672
        return;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   673
    }
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   674
#endif /* SDL_VIDEO_DRIVER_X11_VIDMODE */
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   675
}
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   676
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   677
int
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   678
X11_SetDisplayMode(_THIS, SDL_DisplayMode * mode)
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   679
{
2873
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   680
    Display *display = ((SDL_VideoData *) _this->driverdata)->display;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   681
    SDL_DisplayData *data = (SDL_DisplayData *) SDL_CurrentDisplay.driverdata;
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   682
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   683
    set_best_resolution(display, data, mode->w, mode->h, mode->refresh_rate);
b33e38aaa027 Progress on fullscreen mode switching on X11
Sam Lantinga <slouken@libsdl.org>
parents: 2870
diff changeset
   684
    return 0;
1950
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   685
}
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   686
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   687
void
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   688
X11_QuitModes(_THIS)
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   689
{
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   690
}
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   691
a344e42bce3b Started work on the new X11 driver.
Sam Lantinga <slouken@libsdl.org>
parents:
diff changeset
   692
/* vi: set ts=4 sw=4 expandtab: */