--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/x11/SDL_x11modes.c Wed Jul 26 06:34:54 2006 +0000
@@ -0,0 +1,139 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997-2006 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+#include "SDL_x11video.h"
+
+
+static int
+get_visualinfo(Display * display, int screen, XVisualInfo * vinfo)
+{
+ const char *visual_id = SDL_getenv("SDL_VIDEO_X11_VISUALID");
+ int use_directcolor = 1;
+ int depth;
+
+ /* Look for an exact visual, if requested */
+ if (visual_id) {
+ XVisualInfo *vi, template;
+ int nvis;
+
+ SDL_zero(template);
+ template.visualid = SDL_strtol(visual_id, NULL, 0);
+ vi = XGetVisualInfo(display, VisualIDMask, &template, &nvis);
+ if (vi) {
+ *vinfo = *vi;
+ XFree(vi);
+ return 0;
+ }
+ }
+
+ depth = DefaultDepth(display, screen);
+ if ((use_directcolor &&
+ XMatchVisualInfo(display, screen, depth, DirectColor, vinfo)) ||
+ XMatchVisualInfo(display, screen, depth, TrueColor, vinfo) ||
+ XMatchVisualInfo(display, screen, depth, PseudoColor, vinfo) ||
+ XMatchVisualInfo(display, screen, depth, StaticColor, vinfo)) {
+ return 0;
+ }
+ return -1;
+}
+
+void
+X11_InitModes(_THIS)
+{
+ SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
+ int screen;
+ int n;
+ XPixmapFormatValues *p;
+
+ p = XListPixmapFormats(data->display, &n);
+ for (screen = 0; screen < ScreenCount(data->display); ++screen) {
+ XVisualInfo vinfo;
+ int i, bpp;
+ Uint32 Rmask, Gmask, Bmask, Amask;
+ SDL_VideoDisplay display;
+ SDL_DisplayData *displaydata;
+ SDL_DisplayMode mode;
+
+ if (get_visualinfo(data->display, screen, &vinfo) < 0) {
+ continue;
+ }
+
+ bpp = vinfo.depth;
+ for (i = 0; i < n; ++i) {
+ if (p[i].depth == vinfo.depth) {
+ bpp = p[i].bits_per_pixel;
+ break;
+ }
+ }
+ Rmask = vinfo.visual->red_mask;
+ Gmask = vinfo.visual->green_mask;
+ Bmask = vinfo.visual->blue_mask;
+ if (vinfo.depth == 32) {
+ Amask = (0xFFFFFFFF & ~(Rmask | Gmask | Bmask));
+ } else {
+ Amask = 0;
+ }
+ mode.format =
+ SDL_MasksToPixelFormatEnum(bpp, Rmask, Gmask, Bmask, Amask);
+ mode.w = DisplayWidth(data->display, screen);
+ mode.h = DisplayHeight(data->display, screen);
+ mode.refresh_rate = 0;
+ mode.driverdata = NULL;
+
+ displaydata = (SDL_DisplayData *) SDL_malloc(sizeof(*displaydata));
+ if (!displaydata) {
+ continue;
+ }
+ displaydata->screen = screen;
+ displaydata->visual = vinfo.visual;
+
+ SDL_zero(display);
+ display.desktop_mode = mode;
+ display.current_mode = mode;
+ display.driverdata = displaydata;
+ SDL_AddVideoDisplay(&display);
+ }
+ XFree(p);
+}
+
+void
+X11_GetDisplayModes(_THIS)
+{
+ SDL_DisplayData *data = (SDL_DisplayData *) SDL_CurrentDisplay.driverdata;
+ SDL_DisplayMode mode;
+ //SDL_AddDisplayMode(_this->current_display, &mode);
+}
+
+int
+X11_SetDisplayMode(_THIS, SDL_DisplayMode * mode)
+{
+ //SDL_DisplayModeData *data = (SDL_DisplayModeData *) mode->driverdata;
+ return -1;
+}
+
+void
+X11_QuitModes(_THIS)
+{
+}
+
+/* vi: set ts=4 sw=4 expandtab: */