src/video/quartz/SDL_QuartzVideo.h
author Ryan C. Gordon <icculus@icculus.org>
Fri, 06 Apr 2007 20:30:41 +0000
branchSDL-1.2
changeset 3936 c5c3c772f5aa
parent 3877 81f66f258d77
child 4049 60f677630282
permissions -rw-r--r--
Let app set SDL_VIDEO_ALLOW_SCREENSAVER environment variable to override SDL's
attempt to disable screen savers. Works for Quartz (Mac OS X) and X11.

Need a formal API for this in 1.3, still.

Fixes Bugzilla #415.
     1 /*
     2     SDL - Simple DirectMedia Layer
     3     Copyright (C) 1997-2003  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@libsdl.org
    21 */
    22 #include "SDL_config.h"
    23 
    24 /*    
    25     @file   SDL_QuartzVideo.h
    26     @author Darrell Walisser, Max Horn, et al.
    27     
    28     @abstract SDL video driver for Mac OS X.
    29     
    30     @discussion
    31     
    32     TODO
    33         - Hardware Cursor support with NSCursor instead of Carbon
    34         - Keyboard repeat/mouse speed adjust (if needed)
    35         - Multiple monitor support (currently only main display)
    36         - Accelerated blitting support
    37         - Fix white OpenGL window on minimize (fixed) (update: broken again on 10.2)
    38         - Find out what events should be sent/ignored if window is minimized
    39         - Find a way to deal with external resolution/depth switch while app is running
    40         - Check accuracy of QZ_SetGamma()
    41     Problems:
    42         - OGL not working in full screen with software renderer
    43         - SetColors sets palette correctly but clears framebuffer
    44         - Crash in CG after several mode switches (I think this has been fixed)
    45         - Retained windows don't draw their title bar quite right (OS Bug) (not using retained windows)
    46         - Cursor in 8 bit modes is screwy (might just be Radeon PCI bug) (update: not just Radeon)
    47         - Warping cursor delays mouse events for a fraction of a second,
    48           there is a hack around this that helps a bit
    49 */
    50 
    51 /* Needs to be first, so QuickTime.h doesn't include glext.h (10.4) */
    52 #include "SDL_opengl.h"
    53 
    54 #include <Cocoa/Cocoa.h>
    55 #include <Carbon/Carbon.h>
    56 #include <QuickTime/QuickTime.h>
    57 #include <OpenGL/OpenGL.h>	/* For CGL functions and types */
    58 #include <IOKit/IOKitLib.h>	/* For powersave handling */
    59 #include <pthread.h>
    60 
    61 #include "SDL_thread.h"
    62 #include "SDL_video.h"
    63 #include "SDL_error.h"
    64 #include "SDL_timer.h"
    65 #include "SDL_loadso.h"
    66 #include "SDL_syswm.h"
    67 #include "../SDL_sysvideo.h"
    68 #include "../SDL_pixels_c.h"
    69 #include "../../events/SDL_events_c.h"
    70 
    71 /* 
    72     This is a workaround to directly access NSOpenGLContext's CGL context
    73     We need this to check for errors NSOpenGLContext doesn't support
    74 */
    75 @interface NSOpenGLContext (CGLContextAccess)
    76 - (CGLContextObj) cglContext;
    77 @end
    78 
    79 
    80 /* Main driver structure to store required state information */
    81 typedef struct SDL_PrivateVideoData {
    82 
    83     BOOL               allow_screensaver;  /* 0 == disable screensaver */
    84     CGDirectDisplayID  display;            /* 0 == main display (only support single display) */
    85     CFDictionaryRef    mode;               /* current mode of the display */
    86     CFDictionaryRef    save_mode;          /* original mode of the display */
    87     CFArrayRef         mode_list;          /* list of available fullscreen modes */
    88     CGDirectPaletteRef palette;            /* palette of an 8-bit display */
    89     NSOpenGLContext    *gl_context;        /* OpenGL rendering context */
    90     Uint32             width, height, bpp; /* frequently used data about the display */
    91     Uint32             flags;              /* flags for current mode, for teardown purposes */
    92     Uint32             video_set;          /* boolean; indicates if video was set correctly */
    93     Uint32             warp_flag;          /* boolean; notify to event loop that a warp just occured */
    94     Uint32             warp_ticks;         /* timestamp when the warp occured */
    95     NSWindow           *window;            /* Cocoa window to implement the SDL window */
    96     NSQuickDrawView    *view;              /* the window's view; draw 2D and OpenGL into this view */
    97     SDL_Surface        *resize_icon;       /* icon for the resize badge, we have to draw it by hand */
    98     SDL_GrabMode       current_grab_mode;  /* default value is SDL_GRAB_OFF */
    99     SDL_Rect           **client_mode_list; /* resolution list to pass back to client */
   100     SDLKey             keymap[256];        /* Mac OS X to SDL key mapping */
   101     Uint32             current_mods;       /* current keyboard modifiers, to track modifier state */
   102     Uint32             last_virtual_button;/* last virtual mouse button pressed */
   103     io_connect_t       power_connection;   /* used with IOKit to detect wake from sleep */
   104     Uint8              expect_mouse_up;    /* used to determine when to send mouse up events */
   105     Uint8              grab_state;         /* used to manage grab behavior */
   106     NSPoint            cursor_loc;         /* saved cursor coords, for activate/deactivate when grabbed */
   107     BOOL               cursor_should_be_visible;     /* tells if cursor is supposed to be visible (SDL_ShowCursor) */
   108     BOOL               cursor_visible;     /* tells if cursor is *actually* visible or not */
   109     Uint8*             sw_buffers[2];      /* pointers to the two software buffers for double-buffer emulation */
   110     SDL_Thread         *thread;            /* thread for async updates to the screen */
   111     SDL_sem            *sem1, *sem2;       /* synchronization for async screen updates */
   112     Uint8              *current_buffer;    /* the buffer being copied to the screen */
   113     BOOL               quit_thread;        /* used to quit the async blitting thread */
   114     SInt32             system_version;     /* used to dis-/enable workarounds depending on the system version */
   115     
   116     ImageDescriptionHandle yuv_idh;
   117     MatrixRecordPtr        yuv_matrix;
   118     DecompressorComponent  yuv_codec;
   119     ImageSequence          yuv_seq;
   120     PlanarPixmapInfoYUV420 *yuv_pixmap;
   121     Sint16                  yuv_width, yuv_height;
   122     CGrafPtr                yuv_port;
   123 
   124     void *opengl_library;    /* dynamically loaded OpenGL library. */
   125 } SDL_PrivateVideoData;
   126 
   127 #define _THIS    SDL_VideoDevice *this
   128 #define display_id (this->hidden->display)
   129 #define mode (this->hidden->mode)
   130 #define save_mode (this->hidden->save_mode)
   131 #define allow_screensaver (this->hidden->allow_screensaver)
   132 #define mode_list (this->hidden->mode_list)
   133 #define palette (this->hidden->palette)
   134 #define gl_context (this->hidden->gl_context)
   135 #define device_width (this->hidden->width)
   136 #define device_height (this->hidden->height)
   137 #define device_bpp (this->hidden->bpp)
   138 #define mode_flags (this->hidden->flags)
   139 #define qz_window (this->hidden->window)
   140 #define window_view (this->hidden->view)
   141 #define video_set (this->hidden->video_set)
   142 #define warp_ticks (this->hidden->warp_ticks)
   143 #define warp_flag (this->hidden->warp_flag)
   144 #define resize_icon (this->hidden->resize_icon)
   145 #define current_grab_mode (this->hidden->current_grab_mode)
   146 #define client_mode_list (this->hidden->client_mode_list)
   147 #define keymap (this->hidden->keymap)
   148 #define current_mods (this->hidden->current_mods)
   149 #define last_virtual_button (this->hidden->last_virtual_button)
   150 #define power_connection (this->hidden->power_connection)
   151 #define expect_mouse_up (this->hidden->expect_mouse_up)
   152 #define grab_state (this->hidden->grab_state)
   153 #define cursor_loc (this->hidden->cursor_loc)
   154 #define cursor_should_be_visible (this->hidden->cursor_should_be_visible)
   155 #define cursor_visible (this->hidden->cursor_visible)
   156 #define sw_buffers (this->hidden->sw_buffers)
   157 #define thread (this->hidden->thread)
   158 #define sem1 (this->hidden->sem1)
   159 #define sem2 (this->hidden->sem2)
   160 #define current_buffer (this->hidden->current_buffer)
   161 #define quit_thread (this->hidden->quit_thread)
   162 #define system_version (this->hidden->system_version)
   163 #define opengl_library (this->hidden->opengl_library)
   164 
   165 /* grab states - the input is in one of these states */
   166 enum {
   167     QZ_UNGRABBED = 0,
   168     QZ_VISIBLE_GRAB,
   169     QZ_INVISIBLE_GRAB
   170 };
   171 
   172 /* grab actions - these can change the grabbed state */
   173 enum {
   174     QZ_ENABLE_GRAB = 0,
   175     QZ_DISABLE_GRAB,
   176     QZ_HIDECURSOR,
   177     QZ_SHOWCURSOR
   178 };
   179 
   180 /* Gamma Functions */
   181 int    QZ_SetGamma          (_THIS, float red, float green, float blue);
   182 int    QZ_GetGamma          (_THIS, float *red, float *green, float *blue);
   183 int    QZ_SetGammaRamp      (_THIS, Uint16 *ramp);
   184 int    QZ_GetGammaRamp      (_THIS, Uint16 *ramp);
   185 
   186 /* OpenGL functions */
   187 int    QZ_SetupOpenGL       (_THIS, int bpp, Uint32 flags);
   188 void   QZ_TearDownOpenGL    (_THIS);
   189 void*  QZ_GL_GetProcAddress (_THIS, const char *proc);
   190 int    QZ_GL_GetAttribute   (_THIS, SDL_GLattr attrib, int* value);
   191 int    QZ_GL_MakeCurrent    (_THIS);
   192 void   QZ_GL_SwapBuffers    (_THIS);
   193 int    QZ_GL_LoadLibrary    (_THIS, const char *location);
   194 
   195 /* Cursor and Mouse functions */
   196 void         QZ_FreeWMCursor     (_THIS, WMcursor *cursor);
   197 WMcursor*    QZ_CreateWMCursor   (_THIS, Uint8 *data, Uint8 *mask,
   198                                   int w, int h, int hot_x, int hot_y);
   199 int          QZ_ShowWMCursor     (_THIS, WMcursor *cursor);
   200 void         QZ_WarpWMCursor     (_THIS, Uint16 x, Uint16 y);
   201 void         QZ_MoveWMCursor     (_THIS, int x, int y);
   202 void         QZ_CheckMouseMode   (_THIS);
   203 void         QZ_UpdateMouse      (_THIS);
   204 
   205 /* Event functions */
   206 void         QZ_InitOSKeymap     (_THIS);
   207 void         QZ_PumpEvents       (_THIS);
   208 
   209 /* Window Manager functions */
   210 void         QZ_SetCaption       (_THIS, const char *title, const char *icon);
   211 void         QZ_SetIcon          (_THIS, SDL_Surface *icon, Uint8 *mask);
   212 int          QZ_IconifyWindow    (_THIS);
   213 SDL_GrabMode QZ_GrabInput        (_THIS, SDL_GrabMode grab_mode);
   214 /*int          QZ_GetWMInfo        (_THIS, SDL_SysWMinfo *info);*/
   215 
   216 /* YUV functions */
   217 SDL_Overlay* QZ_CreateYUVOverlay (_THIS, int width, int height,
   218                                          Uint32 format, SDL_Surface *display);
   219 
   220 
   221 /* Private functions (used internally) */
   222 void         QZ_PrivateWarpCursor (_THIS, int x, int y);
   223 void         QZ_ChangeGrabState (_THIS, int action);
   224 void         QZ_RegisterForSleepNotifications (_THIS);
   225 void         QZ_ShowMouse (_THIS);
   226 void         QZ_HideMouse (_THIS);
   227 void         QZ_PrivateGlobalToLocal (_THIS, NSPoint *p);
   228 void         QZ_PrivateCocoaToSDL (_THIS, NSPoint *p);
   229 BOOL         QZ_IsMouseInWindow (_THIS);
   230 void         QZ_DoActivate (_THIS);
   231 void         QZ_DoDeactivate (_THIS);