Mercurial > sdl-ios-xcode
diff src/video/quartz/SDL_QuartzVideo.h @ 761:c5b2b6d2d1fe
Date: Wed, 31 Dec 2003 21:55:30 +0100
From: Max Horn
Subject: SDL: video/quartz cleanup
while doing some experimental changes in the quartz code, I was annoyed
by having to recompile that one big .o file over and over again. So I
decided to finally realize one TODO: properly splitting the code over
multiple files :-).
With two exceptions, I didn't make code changes, only rearranged files
and added new headers. Since there are several new files, making a
patch didn't work out so well, so I decided to just send you all the
new & modified files.
The one source change I made is related to showing/hiding the mouse. I
renamed cursor_visible to cursor_should_be_visible and cursor_hidden to
cursor_visible; I think that makes reading the code easier.
Then I added two new functions: QZ_ShowMouse and QZ_HideMouse. They
help manage cursor_visible (the former 'cursor_hidden'). Finally I
replaced the Carbon ShowCursor/HiderCuror calls by [NSCursor hide] and
[NSCursor unhide]. The API docs are not conclusive, but it might be
that with those the "cursor_visible" (former 'cursor_hidden') hack may
not be necessary anymore; however so far I didn't test this hypothesis,
so I left that in.
The other change was to remove in_foreground and use [NSApp isActive]
instead: Manually keeping track of whether we are in the foreground is
error prone. This should work better in some corner cases.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 04 Jan 2004 14:55:35 +0000 |
parents | 74b4b9f9e5e1 |
children | ac44ddb84f6f |
line wrap: on
line diff
--- a/src/video/quartz/SDL_QuartzVideo.h Wed Dec 31 04:48:38 2003 +0000 +++ b/src/video/quartz/SDL_QuartzVideo.h Sun Jan 04 14:55:35 2004 +0000 @@ -1,6 +1,6 @@ /* SDL - Simple DirectMedia Layer - Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga + Copyright (C) 1997-2003 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -54,7 +54,7 @@ #include <OpenGL/glext.h> #include <Carbon/Carbon.h> #include <QuickTime/QuickTime.h> -#include <IOKit/IOKitLib.h> /* For powersave handling */ +#include <IOKit/IOKitLib.h> /* For powersave handling */ #include <pthread.h> #include "SDL_thread.h" @@ -66,53 +66,6 @@ #include "SDL_pixels_c.h" #include "SDL_events_c.h" -/* - Add methods to get at private members of NSScreen. - Since there is a bug in Apple's screen switching code - that does not update this variable when switching - to fullscreen, we'll set it manually (but only for the - main screen). -*/ -@interface NSScreen (NSScreenAccess) -- (void) setFrame:(NSRect)frame; -@end - -@implementation NSScreen (NSScreenAccess) -- (void) setFrame:(NSRect)frame; -{ - _frame = frame; -} -@end - -/* - This is a workaround to directly access NSOpenGLContext's CGL context - We need this to check for errors NSOpenGLContext doesn't support -*/ -@interface NSOpenGLContext (CGLContextAccess) -- (CGLContextObj) cglContext; -@end - -@implementation NSOpenGLContext (CGLContextAccess) -- (CGLContextObj) cglContext; -{ - return _contextAuxiliary; -} -@end - -/* - Structure for rez switch gamma fades - We can hide the monitor flicker by setting the gamma tables to 0 -*/ -#define QZ_GAMMA_TABLE_SIZE 256 - -typedef struct { - - CGGammaValue red[QZ_GAMMA_TABLE_SIZE]; - CGGammaValue green[QZ_GAMMA_TABLE_SIZE]; - CGGammaValue blue[QZ_GAMMA_TABLE_SIZE]; - -} SDL_QuartzGammaTable; - /* Main driver structure to store required state information */ typedef struct SDL_PrivateVideoData { @@ -131,7 +84,6 @@ NSQuickDrawView *view; /* the window's view; draw 2D and OpenGL into this view */ SDL_Surface *resize_icon; /* icon for the resize badge, we have to draw it by hand */ SDL_GrabMode current_grab_mode; /* default value is SDL_GRAB_OFF */ - BOOL in_foreground; /* boolean; indicate if app is in foreground or not */ SDL_Rect **client_mode_list; /* resolution list to pass back to client */ SDLKey keymap[256]; /* Mac OS X to SDL key mapping */ Uint32 current_mods; /* current keyboard modifiers, to track modifier state */ @@ -140,8 +92,8 @@ Uint8 expect_mouse_up; /* used to determine when to send mouse up events */ Uint8 grab_state; /* used to manage grab behavior */ NSPoint cursor_loc; /* saved cursor coords, for activate/deactivate when grabbed */ - BOOL cursor_visible; /* tells if cursor was instructed to be hidden or not (SDL_ShowCursor) */ - BOOL cursor_hidden; /* tells if cursor is *actually* hidden or not */ + BOOL cursor_should_be_visible; /* tells if cursor is supposed to be visible (SDL_ShowCursor) */ + BOOL cursor_visible; /* tells if cursor is *actually* visible or not */ Uint8* sw_buffers[2]; /* pointers to the two software buffers for double-buffer emulation */ SDL_Thread *thread; /* thread for async updates to the screen */ SDL_sem *sem1, *sem2; /* synchronization for async screen updates */ @@ -156,7 +108,7 @@ Sint16 yuv_width, yuv_height; CGrafPtr yuv_port; -} SDL_PrivateVideoData ; +} SDL_PrivateVideoData; #define _THIS SDL_VideoDevice *this #define display_id (this->hidden->display) @@ -176,7 +128,6 @@ #define warp_flag (this->hidden->warp_flag) #define resize_icon (this->hidden->resize_icon) #define current_grab_mode (this->hidden->current_grab_mode) -#define in_foreground (this->hidden->in_foreground) #define client_mode_list (this->hidden->client_mode_list) #define keymap (this->hidden->keymap) #define current_mods (this->hidden->current_mods) @@ -185,8 +136,8 @@ #define expect_mouse_up (this->hidden->expect_mouse_up) #define grab_state (this->hidden->grab_state) #define cursor_loc (this->hidden->cursor_loc) +#define cursor_should_be_visible (this->hidden->cursor_should_be_visible) #define cursor_visible (this->hidden->cursor_visible) -#define cursor_hidden (this->hidden->cursor_hidden) #define sw_buffers (this->hidden->sw_buffers) #define thread (this->hidden->thread) #define sem1 (this->hidden->sem1) @@ -194,17 +145,6 @@ #define current_buffer (this->hidden->current_buffer) #define quit_thread (this->hidden->quit_thread) -#define yuv_idh (this->hidden->yuv_idh) -#define yuv_matrix (this->hidden->yuv_matrix) -#define yuv_codec (this->hidden->yuv_codec) -#define yuv_seq (this->hidden->yuv_seq) -#define yuv_pixmap (this->hidden->yuv_pixmap) -#define yuv_data (this->hidden->yuv_data) -#define yuv_width (this->hidden->yuv_width) -#define yuv_height (this->hidden->yuv_height) -#define yuv_port (this->hidden->yuv_port) - - /* grab states - the input is in one of these states */ enum { QZ_UNGRABBED = 0, @@ -220,145 +160,52 @@ QZ_SHOWCURSOR }; -/* - Obscuring code: maximum number of windows above ours (inclusive) - - Note: this doesn't work too well in practice and should be - phased out when we add OpenGL 2D acceleration. It was never - enabled in the first place, so this shouldn't be a problem ;-) -*/ -#define kMaxWindows 256 - -/* Some of the Core Graphics Server API for obscuring code */ -#define kCGSWindowLevelTop 2147483632 -#define kCGSWindowLevelDockIconDrag 500 -#define kCGSWindowLevelDockMenu 101 -#define kCGSWindowLevelMenuIgnore 21 -#define kCGSWindowLevelMenu 20 -#define kCGSWindowLevelDockLabel 12 -#define kCGSWindowLevelDockIcon 11 -#define kCGSWindowLevelDock 10 -#define kCGSWindowLevelUtility 3 -#define kCGSWindowLevelNormal 0 - -/* - For completeness; We never use these window levels, they are always below us - #define kCGSWindowLevelMBarShadow -20 - #define kCGSWindowLevelDesktopPicture -2147483647 - #define kCGSWindowLevelDesktop -2147483648 -*/ - -typedef CGError CGSError; -typedef long CGSWindowCount; -typedef void * CGSConnectionID; -typedef int CGSWindowID; -typedef CGSWindowID* CGSWindowIDList; -typedef CGWindowLevel CGSWindowLevel; -typedef NSRect CGSRect; - -extern CGSConnectionID _CGSDefaultConnection (); - -extern CGSError CGSGetOnScreenWindowList (CGSConnectionID cid, - CGSConnectionID owner, - CGSWindowCount listCapacity, - CGSWindowIDList list, - CGSWindowCount *listCount); - -extern CGSError CGSGetScreenRectForWindow (CGSConnectionID cid, - CGSWindowID wid, - CGSRect *rect); - -extern CGWindowLevel CGSGetWindowLevel (CGSConnectionID cid, - CGSWindowID wid, - CGSWindowLevel *level); - -extern CGSError CGSDisplayHWFill (CGDirectDisplayID id, unsigned int x, unsigned int y, - unsigned int w, unsigned int h, unsigned int color); - -extern CGSError CGSDisplayCanHWFill (CGDirectDisplayID id); - -extern CGSError CGSGetMouseEnabledFlags (CGSConnectionID cid, CGSWindowID wid, int *flags); - -int CGSDisplayHWSync (CGDirectDisplayID id); - -/* Bootstrap functions */ -static int QZ_Available (); -static SDL_VideoDevice* QZ_CreateDevice (int device_index); -static void QZ_DeleteDevice (SDL_VideoDevice *device); - -/* Initialization, Query, Setup, and Redrawing functions */ -static int QZ_VideoInit (_THIS, SDL_PixelFormat *video_format); - -static SDL_Rect** QZ_ListModes (_THIS, SDL_PixelFormat *format, - Uint32 flags); -static void QZ_UnsetVideoMode (_THIS); - -static SDL_Surface* QZ_SetVideoMode (_THIS, SDL_Surface *current, - int width, int height, int bpp, - Uint32 flags); -static int QZ_ToggleFullScreen (_THIS, int on); -static int QZ_SetColors (_THIS, int first_color, - int num_colors, SDL_Color *colors); - -static int QZ_LockDoubleBuffer (_THIS, SDL_Surface *surface); -static void QZ_UnlockDoubleBuffer (_THIS, SDL_Surface *surface); -static int QZ_ThreadFlip (_THIS); -static int QZ_FlipDoubleBuffer (_THIS, SDL_Surface *surface); -static void QZ_DoubleBufferUpdate (_THIS, int num_rects, SDL_Rect *rects); - -static void QZ_DirectUpdate (_THIS, int num_rects, SDL_Rect *rects); -static int QZ_LockWindow (_THIS, SDL_Surface *surface); -static void QZ_UnlockWindow (_THIS, SDL_Surface *surface); -static void QZ_UpdateRects (_THIS, int num_rects, SDL_Rect *rects); -static void QZ_VideoQuit (_THIS); - -/* Hardware surface functions (for fullscreen mode only) */ -#if 0 /* Not used (apparently, it's really slow) */ -static int QZ_FillHWRect (_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color); -#endif -static int QZ_LockHWSurface(_THIS, SDL_Surface *surface); -static void QZ_UnlockHWSurface(_THIS, SDL_Surface *surface); -static void QZ_FreeHWSurface (_THIS, SDL_Surface *surface); -/* static int QZ_FlipHWSurface (_THIS, SDL_Surface *surface); */ - /* Gamma Functions */ -static int QZ_SetGamma (_THIS, float red, float green, float blue); -static int QZ_GetGamma (_THIS, float *red, float *green, float *blue); -static int QZ_SetGammaRamp (_THIS, Uint16 *ramp); -static int QZ_GetGammaRamp (_THIS, Uint16 *ramp); +int QZ_SetGamma (_THIS, float red, float green, float blue); +int QZ_GetGamma (_THIS, float *red, float *green, float *blue); +int QZ_SetGammaRamp (_THIS, Uint16 *ramp); +int QZ_GetGammaRamp (_THIS, Uint16 *ramp); /* OpenGL functions */ -static int QZ_SetupOpenGL (_THIS, int bpp, Uint32 flags); -static void QZ_TearDownOpenGL (_THIS); -static void* QZ_GL_GetProcAddress (_THIS, const char *proc); -static int QZ_GL_GetAttribute (_THIS, SDL_GLattr attrib, int* value); -static int QZ_GL_MakeCurrent (_THIS); -static void QZ_GL_SwapBuffers (_THIS); -static int QZ_GL_LoadLibrary (_THIS, const char *location); - -/* Private function to warp the cursor (used internally) */ -static void QZ_PrivateWarpCursor (_THIS, int x, int y); +int QZ_SetupOpenGL (_THIS, int bpp, Uint32 flags); +void QZ_TearDownOpenGL (_THIS); +void* QZ_GL_GetProcAddress (_THIS, const char *proc); +int QZ_GL_GetAttribute (_THIS, SDL_GLattr attrib, int* value); +int QZ_GL_MakeCurrent (_THIS); +void QZ_GL_SwapBuffers (_THIS); +int QZ_GL_LoadLibrary (_THIS, const char *location); /* Cursor and Mouse functions */ -static void QZ_FreeWMCursor (_THIS, WMcursor *cursor); -static WMcursor* QZ_CreateWMCursor (_THIS, Uint8 *data, Uint8 *mask, - int w, int h, int hot_x, int hot_y); -static int QZ_ShowWMCursor (_THIS, WMcursor *cursor); -static void QZ_WarpWMCursor (_THIS, Uint16 x, Uint16 y); -static void QZ_MoveWMCursor (_THIS, int x, int y); -static void QZ_CheckMouseMode (_THIS); +void QZ_FreeWMCursor (_THIS, WMcursor *cursor); +WMcursor* QZ_CreateWMCursor (_THIS, Uint8 *data, Uint8 *mask, + int w, int h, int hot_x, int hot_y); +int QZ_ShowWMCursor (_THIS, WMcursor *cursor); +void QZ_WarpWMCursor (_THIS, Uint16 x, Uint16 y); +void QZ_MoveWMCursor (_THIS, int x, int y); +void QZ_CheckMouseMode (_THIS); /* Event functions */ -static void QZ_InitOSKeymap (_THIS); -static void QZ_PumpEvents (_THIS); +void QZ_InitOSKeymap (_THIS); +void QZ_PumpEvents (_THIS); /* Window Manager functions */ -static void QZ_SetCaption (_THIS, const char *title, const char *icon); -static void QZ_SetIcon (_THIS, SDL_Surface *icon, Uint8 *mask); -static int QZ_IconifyWindow (_THIS); -static SDL_GrabMode QZ_GrabInput (_THIS, SDL_GrabMode grab_mode); -/*static int QZ_GetWMInfo (_THIS, SDL_SysWMinfo *info);*/ +void QZ_SetCaption (_THIS, const char *title, const char *icon); +void QZ_SetIcon (_THIS, SDL_Surface *icon, Uint8 *mask); +int QZ_IconifyWindow (_THIS); +SDL_GrabMode QZ_GrabInput (_THIS, SDL_GrabMode grab_mode); +/*int QZ_GetWMInfo (_THIS, SDL_SysWMinfo *info);*/ /* YUV functions */ -static SDL_Overlay* QZ_CreateYUVOverlay (_THIS, int width, int height, +SDL_Overlay* QZ_CreateYUVOverlay (_THIS, int width, int height, Uint32 format, SDL_Surface *display); + + +/* Private functions (used internally) */ +void QZ_PrivateWarpCursor (_THIS, int x, int y); +void QZ_ChangeGrabState (_THIS, int action); +void QZ_RegisterForSleepNotifications (_THIS); +void QZ_ShowMouse (_THIS); +void QZ_HideMouse (_THIS); +void QZ_PrivateGlobalToLocal (_THIS, NSPoint *p); +void QZ_PrivateCocoaToSDL (_THIS, NSPoint *p); +