/* 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" /* This file contains functions for backwards compatibility with SDL 1.2 */ #include "SDL.h" #include "video/SDL_sysvideo.h" static SDL_WindowID window; static char *wm_title; char * SDL_AudioDriverName (char *namebuf, int maxlen) { const char *name = SDL_GetCurrentAudioDriver (); if (name) { SDL_strlcpy (namebuf, name, maxlen); return namebuf; } return NULL; } char * SDL_VideoDriverName (char *namebuf, int maxlen) { const char *name = SDL_GetCurrentVideoDriver (); if (name) { SDL_strlcpy (namebuf, name, maxlen); return namebuf; } return NULL; } int SDL_VideoModeOK (int width, int height, int bpp, Uint32 flags) { int i, actual_bpp = 0; if (!SDL_GetVideoDevice ()) { return 0; } if (!(flags & SDL_FULLSCREEN)) { return SDL_BITSPERPIXEL (SDL_GetDesktopDisplayMode ()->format); } for (i = 0; i < SDL_GetNumDisplayModes (); ++i) { const SDL_DisplayMode *mode = SDL_GetDisplayMode (i); if (!mode->w || !mode->h || (width == mode->w && height == mode->h)) { if (!mode->format) { return bpp; } if (SDL_BITSPERPIXEL (mode->format) >= bpp) { actual_bpp = SDL_BITSPERPIXEL (mode->format); } } } return actual_bpp; } SDL_Rect ** SDL_ListModes (SDL_PixelFormat * format, Uint32 flags) { int i, nmodes; SDL_Rect **modes; if (!SDL_GetVideoDevice ()) { return NULL; } if (!(flags & SDL_FULLSCREEN)) { return (SDL_Rect **) (-1); } /* Memory leak, but this is a compatibility function, who cares? */ nmodes = 0; for (i = 0; i < SDL_GetNumDisplayModes (); ++i) { const SDL_DisplayMode *mode = SDL_GetDisplayMode (i); if (!mode->w || !mode->h) { return (SDL_Rect **) (-1); } if (SDL_BITSPERPIXEL (mode->format) != format->BitsPerPixel) { continue; } if (nmodes > 0 && modes[nmodes - 1]->w == mode->w && modes[nmodes - 1]->h == mode->h) { continue; } modes = SDL_realloc (modes, (nmodes + 2) * sizeof (*modes)); if (!modes) { return NULL; } modes[nmodes] = (SDL_Rect *) SDL_malloc (sizeof (SDL_Rect)); if (!modes[nmodes]) { return NULL; } modes[nmodes]->x = 0; modes[nmodes]->y = 0; modes[nmodes]->w = mode->w; modes[nmodes]->h = mode->h; ++nmodes; } if (modes) { modes[nmodes] = NULL; } return modes; } SDL_Surface * SDL_SetVideoMode (int width, int height, int bpp, Uint32 flags) { SDL_DisplayMode mode; int i; Uint32 window_flags; Uint32 desktop_format; Uint32 desired_format; if (!SDL_GetVideoDevice ()) { if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE) < 0) { return NULL; } } /* Destroy existing window */ SDL_DestroyWindow (window); /* Create a new window */ window_flags = SDL_WINDOW_SHOWN; if (flags & SDL_FULLSCREEN) { window_flags |= SDL_WINDOW_FULLSCREEN; } if (flags & SDL_OPENGL) { window_flags |= SDL_WINDOW_OPENGL; } if (flags & SDL_RESIZABLE) { window_flags |= SDL_WINDOW_RESIZABLE; } if (flags & SDL_NOFRAME) { window_flags |= SDL_WINDOW_BORDERLESS; } window = SDL_CreateWindow (wm_title, 0, 0, width, height, window_flags); if (!window) { return NULL; } /* Set up the desired display mode */ desktop_format = SDL_GetDesktopDisplayMode ()->format; if ((bpp == SDL_BITSPERPIXEL(desktop_format)) || (desktop_format && (flags & SDL_ANYFORMAT))) { desired_format = desktop_format; } else { switch (bpp) { case 8: desired_format = SDL_PixelFormat_Index8; break; case 15: desired_format = SDL_PixelFormat_RGB555; break; case 16: desired_format = SDL_PixelFormat_RGB565; break; case 24: desired_format = SDL_PixelFormat_RGB24; break; case 32: desired_format = SDL_PixelFormat_RGB888; break; default: SDL_SetError ("Unsupported bpp in SDL_SetVideoMode()"); return NULL; } } mode.format = desired_format; mode.w = width; mode.h = height; mode.refresh_rate = 0; /* Set the desired display mode */ if (flags & SDL_FULLSCREEN) { if (!SDL_GetClosestDisplayMode (&mode, &mode)) { return NULL; } } else { mode = *SDL_GetDesktopDisplayMode (); } if (SDL_SetDisplayMode (&mode) < 0) { return NULL; } /* Create the display surface */ return SDL_CreateWindowSurface (window, desired_format, flags); } SDL_Surface * SDL_GetVideoSurface (void) { SDL_VideoDevice *_this = SDL_GetVideoDevice (); return SDL_VideoSurface; } void SDL_WM_SetCaption (const char *title, const char *icon) { if (wm_title) { SDL_free (wm_title); } else { wm_title = SDL_strdup (title); } SDL_SetWindowTitle (window, wm_title); } void SDL_WM_GetCaption (char **title, char **icon) { if (title) { *title = wm_title; } if (icon) { *icon = ""; } } void SDL_WM_SetIcon (SDL_Surface * icon, Uint8 * mask) { /* FIXME */ } int SDL_WM_IconifyWindow (void) { SDL_MinimizeWindow (window); } int SDL_WM_ToggleFullScreen (SDL_Surface * surface) { return 0; } SDL_GrabMode SDL_WM_GrabInput (SDL_GrabMode mode) { if (mode != SDL_GRAB_QUERY) { SDL_SetWindowGrab (window, mode); } return (SDL_GrabMode) SDL_GetWindowGrab (window); } Uint8 SDL_GetAppState (void) { Uint8 state = 0; Uint32 flags = 0; flags = SDL_GetWindowFlags (window); if ((flags & SDL_WINDOW_SHOWN) && !(flags & SDL_WINDOW_MINIMIZED)) { state |= SDL_APPACTIVE; } if (flags & SDL_WINDOW_KEYBOARD_FOCUS) { state |= SDL_APPINPUTFOCUS; } if (flags & SDL_WINDOW_MOUSE_FOCUS) { state |= SDL_APPMOUSEFOCUS; } return state; } const SDL_version * SDL_Linked_Version (void) { static SDL_version version; SDL_VERSION (&version); return &version; } int SDL_SetPalette (SDL_Surface * surface, int flags, SDL_Color * colors, int firstcolor, int ncolors) { SDL_SetColors (surface, colors, firstcolor, ncolors); } int SDL_GetWMInfo (SDL_SysWMinfo * info) { return SDL_GetWindowWMInfo (window, info); } /* vi: set ts=4 sw=4 expandtab: */