src/video/cybergfx/SDL_cgxmodes.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. set_best_resolution
  2. get_real_resolution
  3. add_visual
  4. CGX_GetVideoModes
  5. CGX_SupportedVisual
  6. CGX_ListModes
  7. CGX_FreeVideoModes
  8. CGX_ResizeFullScreen
  9. _QueueEnterFullScreen
  10. CGX_EnterFullScreen
  11. CGX_LeaveFullScreen

   1 /*
   2     SDL - Simple DirectMedia Layer
   3     Copyright (C) 1997, 1998, 1999, 2000, 2001  Sam Lantinga
   4 
   5     This library is free software; you can redistribute it and/or
   6     modify it under the terms of the GNU Library General Public
   7     License as published by the Free Software Foundation; either
   8     version 2 of the License, or (at your option) any later version.
   9 
  10     This library is distributed in the hope that it will be useful,
  11     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13     Library General Public License for more details.
  14 
  15     You should have received a copy of the GNU Library General Public
  16     License along with this library; if not, write to the Free
  17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18 
  19     Sam Lantinga
  20     slouken@devolution.com
  21 */
  22 
  23 #ifdef SAVE_RCSID
  24 static char rcsid =
  25  "@(#) $Id: SDL_cgxmodes.c,v 1.1.2.2 2001/02/10 07:20:06 hercules Exp $";
  26 #endif
  27 
  28 /* Utilities for getting and setting the X display mode */
  29 
  30 /*
  31 #include <stdlib.h>
  32 #include <string.h>
  33 */
  34 
  35 #include "SDL_timer.h"
  36 #include "SDL_error.h"
  37 #include "SDL_events.h"
  38 #include "SDL_events_c.h"
  39 #include "SDL_cgxvideo.h"
  40 #include "SDL_cgxwm_c.h"
  41 #include "SDL_cgxmodes_c.h"
  42 
  43 #define CGX_DEBUG
  44 
  45 static void set_best_resolution(_THIS, int width, int height)
     /* [<][>][^][v][top][bottom][index][help] */
  46 {
  47         Uint32 idok;
  48         int depth=8;
  49 
  50         if(SDL_Display)
  51                 depth=GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH);
  52 
  53         idok=BestCModeIDTags(CYBRBIDTG_NominalWidth,width,
  54                                 CYBRBIDTG_NominalHeight,height,
  55                                 CYBRBIDTG_Depth,depth,
  56                                 TAG_DONE);
  57 
  58         if(idok!=INVALID_ID)
  59         {
  60                 if(SDL_Display)
  61                 {
  62                         if(currently_fullscreen)
  63                                 CloseScreen(SDL_Display);
  64                         else
  65                                 UnlockPubScreen(NULL,SDL_Display);
  66                 }
  67                 SDL_Display=GFX_Display=OpenScreenTags(NULL,SA_Width,width,SA_Height,height,
  68                                                                                         SA_Depth,depth,SA_DisplayID,idok,
  69                                                                                         TAG_DONE);
  70         }
  71 }
  72 
  73 static void get_real_resolution(_THIS, int* w, int* h)
     /* [<][>][^][v][top][bottom][index][help] */
  74 {
  75     *w = SDL_Display->Width;
  76     *h = SDL_Display->Height;
  77 }
  78 
  79 static void add_visual(_THIS, int depth, int class)
     /* [<][>][^][v][top][bottom][index][help] */
  80 {
  81         Uint32 tID;
  82 
  83         tID=BestCModeIDTags(CYBRBIDTG_Depth,depth,
  84                                                 CYBRBIDTG_NominalWidth,640,
  85                                                 CYBRBIDTG_NominalHeight,480,
  86                                                 TAG_DONE);
  87 
  88         if(tID!=INVALID_ID)
  89         {
  90                 int n = this->hidden->nvisuals;
  91 
  92                 this->hidden->visuals[n].depth = depth;
  93                 this->hidden->visuals[n].visual = tID;
  94                 this->hidden->visuals[n].bpp = GetCyberIDAttr(CYBRIDATTR_BPPIX,tID);
  95                 this->hidden->nvisuals++;
  96         }
  97 }
  98 
  99 #define TrueColor 1
 100 #define PseudoColor 2
 101 
 102 int CGX_GetVideoModes(_THIS)
     /* [<][>][^][v][top][bottom][index][help] */
 103 {
 104     int i;
 105         ULONG nextid;
 106         int nmodes=0;
 107 
 108         SDL_modelist=NULL;
 109 
 110         nextid=NextDisplayInfo(INVALID_ID);
 111 
 112         while(nextid!=INVALID_ID)
 113         {
 114                 if(IsCyberModeID(nextid))
 115                 {
 116                         DisplayInfoHandle h;
 117 
 118                         if(h=FindDisplayInfo(nextid))
 119                         {
 120                                 struct DimensionInfo info;
 121 
 122                                 if(GetDisplayInfoData(h,(char *)&info,sizeof(struct DimensionInfo),DTAG_DIMS,NULL))
 123                                 {
 124                                         int ok=0;
 125 
 126                                         for(i=0;i<nmodes;i++)
 127                                         {
 128                                                 if(     SDL_modelist[i]->w == (info.Nominal.MaxX+1) &&
 129                                                         SDL_modelist[i]->h == (info.Nominal.MaxY+1) )
 130                                                         ok=1;
 131                                         }
 132 
 133                                         if(!ok)
 134                                         {
 135                                                 nmodes++;
 136 
 137                                                 SDL_modelist = (SDL_Rect **)realloc(SDL_modelist,(nmodes+1)*sizeof(SDL_Rect *));
 138                                                 SDL_modelist[nmodes]=NULL;
 139 
 140                                                 if ( SDL_modelist ) 
 141                                                 {
 142                                                         SDL_modelist[nmodes-1] = (SDL_Rect *)malloc(sizeof(SDL_Rect));
 143 
 144                                                         if ( SDL_modelist[nmodes-1] == NULL ) 
 145                                                                 break;
 146 
 147                                                         SDL_modelist[nmodes-1]->x = 0;
 148                                                         SDL_modelist[nmodes-1]->y = 0;
 149                                                         SDL_modelist[nmodes-1]->w = info.Nominal.MaxX+1;
 150                                                         SDL_modelist[nmodes-1]->h = info.Nominal.MaxY+1;
 151                                                 }
 152                                         }                                                                                                                                       
 153                                 }
 154                         }
 155                 }
 156                 nextid=NextDisplayInfo(nextid);
 157         }
 158 
 159 
 160         this->hidden->nvisuals = 0;
 161         /* Search for the visuals in deepest-first order, so that the first
 162            will be the richest one */
 163         add_visual(this, 32, TrueColor);
 164         add_visual(this, 24, TrueColor);
 165         add_visual(this, 16, TrueColor);
 166         add_visual(this, 15, TrueColor);
 167         add_visual(this, 8, PseudoColor);
 168 
 169         if(this->hidden->nvisuals == 0) {
 170             SDL_SetError("Found no sufficiently capable CGX visuals");
 171                     return -1;
 172         }
 173 
 174     if ( SDL_modelist == NULL ) {
 175         SDL_modelist = (SDL_Rect **)malloc((1+1)*sizeof(SDL_Rect *));
 176         i = 0;
 177         if ( SDL_modelist ) {
 178             SDL_modelist[i] = (SDL_Rect *)malloc(sizeof(SDL_Rect));
 179             if ( SDL_modelist[i] ) {
 180                 SDL_modelist[i]->x = 0;
 181                 SDL_modelist[i]->y = 0;
 182                 SDL_modelist[i]->w = SDL_Display->Width;
 183                 SDL_modelist[i]->h = SDL_Display->Height;
 184                 ++i;
 185             }
 186             SDL_modelist[i] = NULL;
 187         }
 188     }
 189 
 190     D( if ( SDL_modelist ) {
 191         bug("CGX video mode list: (%ld)\n",nmodes);
 192         for ( i=0; SDL_modelist[i]; ++i ) {
 193             bug( "\t%ld x %ld\n",
 194                 SDL_modelist[i]->w, SDL_modelist[i]->h);
 195         }
 196         }
 197     );
 198 
 199     D(  { bug("CGX visuals list: (%ld)\n",this->hidden->nvisuals);
 200 
 201         for(i=0;i<this->hidden->nvisuals;i++)
 202                 bug("\t%lx - depth: %ld bpp: %ld\n",this->hidden->visuals[i].visual,this->hidden->visuals[i].depth,this->hidden->visuals[i].bpp);
 203         }
 204     );
 205     return 0;
 206 }
 207 
 208 int CGX_SupportedVisual(_THIS, SDL_PixelFormat *format)
     /* [<][>][^][v][top][bottom][index][help] */
 209 {
 210     int i;
 211     for(i = 0; i < this->hidden->nvisuals; i++)
 212         {
 213                 if(this->hidden->visuals[i].depth == format->BitsPerPixel) // Era bpp
 214                     return 1;
 215         }
 216     return 0;
 217 }
 218 
 219 SDL_Rect **CGX_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
     /* [<][>][^][v][top][bottom][index][help] */
 220 {
 221     if ( CGX_SupportedVisual(this, format) ) {
 222         if ( flags & SDL_FULLSCREEN ) {
 223             return(SDL_modelist);
 224         } else {
 225             return((SDL_Rect **)-1);
 226         }
 227     } else {
 228         return((SDL_Rect **)0);
 229     }
 230 }
 231 
 232 void CGX_FreeVideoModes(_THIS)
     /* [<][>][^][v][top][bottom][index][help] */
 233 {
 234     int i;
 235 
 236     if ( SDL_modelist ) {
 237         for ( i=0; SDL_modelist[i]; ++i ) {
 238             free(SDL_modelist[i]);
 239         }
 240         free(SDL_modelist);
 241         SDL_modelist = NULL;
 242     }
 243 }
 244 
 245 int CGX_ResizeFullScreen(_THIS)
     /* [<][>][^][v][top][bottom][index][help] */
 246 {
 247     int x, y;
 248     int real_w, real_h;
 249 
 250     if ( currently_fullscreen ) {
 251 /* Per ora non faccio nulla qui */
 252     }
 253     return(1);
 254 }
 255 
 256 void _QueueEnterFullScreen(_THIS)
     /* [<][>][^][v][top][bottom][index][help] */
 257 {
 258 }
 259 
 260 int CGX_EnterFullScreen(_THIS)
     /* [<][>][^][v][top][bottom][index][help] */
 261 {
 262     int okay;
 263 
 264     okay = 1;
 265     if ( ! currently_fullscreen ) 
 266         {
 267         int real_w, real_h;
 268 
 269         /* Map the fullscreen window to blank the screen */
 270         get_real_resolution(this, &real_w, &real_h);
 271                 
 272                 CGX_DestroyWindow(this,this->screen);
 273                 set_best_resolution(this, real_w,real_h);
 274 
 275         /* Grab the mouse on the fullscreen window
 276            The event handling will know when we become active, and then
 277            enter fullscreen mode if we can't grab the mouse this time.
 278          */
 279 #if 0
 280         if ( (XGrabPointer(SDL_Display, FSwindow, True, 0,
 281                           GrabModeAsync, GrabModeAsync,
 282                           FSwindow, None, CurrentTime) != GrabSuccess) ||
 283              (XGrabKeyboard(SDL_Display, WMwindow, True,
 284                           GrabModeAsync, GrabModeAsync, CurrentTime) != 0) ) {
 285             XUnmapWindow(SDL_Display, FSwindow);
 286             X11_WaitUnmapped(this, FSwindow);
 287             X11_QueueEnterFullScreen(this);
 288             return(0);
 289         }
 290 #endif
 291 
 292         currently_fullscreen = 1;
 293 
 294                 CGX_CreateWindow(this,this->screen,real_w,real_h,GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH),this->screen->flags);
 295 
 296         /* Set the new resolution */
 297         okay = CGX_ResizeFullScreen(this);
 298         if ( ! okay ) {
 299             CGX_LeaveFullScreen(this);
 300         }
 301         /* Set the colormap */
 302 /*
 303                 if ( SDL_XColorMap ) {
 304                         XInstallColormap(SDL_Display, SDL_XColorMap);
 305                 }
 306 */
 307     }    
 308 //    CGX_GrabInputNoLock(this, this->input_grab | SDL_GRAB_FULLSCREEN);
 309     return(okay);
 310 }
 311 
 312 int CGX_LeaveFullScreen(_THIS)
     /* [<][>][^][v][top][bottom][index][help] */
 313 {
 314     if ( currently_fullscreen ) {
 315                 int width,height;
 316                 if ( SDL_Window ) {
 317                         CloseWindow(SDL_Window);
 318                         SDL_Window=NULL;
 319                 }
 320                 CloseScreen(SDL_Display);
 321 
 322                 GFX_Display=SDL_Display=LockPubScreen(NULL);
 323 
 324                 currently_fullscreen = 0;
 325 
 326                 CGX_CreateWindow(this,this->screen,this->screen->w,this->screen->h,GetCyberMapAttr(SDL_Display->RastPort.BitMap,CYBRMATTR_DEPTH),this->screen->flags);
 327                 CGX_ResizeImage(this,this->screen,0L);
 328     }
 329 
 330     return(0);
 331 }

/* [<][>][^][v][top][bottom][index][help] */