view src/video/quartz/CGS.h @ 983:7f08bd66f1ca

Date: Fri, 19 Nov 2004 06:23:53 -0800 (PST) From: Eric Wing Subject: OS X Mouse inversion problem fix (again) Here's yet another patch for the OS X mouse inversion problem. This should fix the problem once and for all. I know I've said this before, but *This time for sure!* :) If you recall, my last patch broke the non-OpenGL windowed code and caused the inversion to occur there instead. Max submitted a patch that partially reverted the changes back which included the os version hack which is currently the most recent CVS. Aaron Sullivan identified and reported to the mailing list the other day, that the last partial regression of the code broke OS X 10.2. Looking over the results, I'm thinking that I was slightly more successful than I thought at unifying the code. I think I was trying to unify the code base for OpenGL and non-OpenGL windowed modes for all versions of the OS. It looks like I failed at at unifying the OpenGL and non-OpenGL code, but I did succeed at unifying the OS versions. Thus, we no longer need the hack for the OS version checks. The partial regression still included an OS check which is what broke things for < 10.3. Attached is the patch for SDL_QuartzWM.m. It basically is a half-line change that removes one of the two checks that decides if the mouse coordinates need to be inverted, i.e: if (system_version >= 0x1030 && (SDL_VideoSurface->flags & SDL_OPENGL) ) becomes this: if(SDL_VideoSurface->flags & SDL_OPENGL) With Aaron's outstanding help, we have collectively tested: windowed OpenGL windowed non-OpenGL fullscreen OpenGL fullscreen non-OpenGL under OS X 10.2 (Jaguar), 10.3 (Panther), and 10.4 (Tiger). We don't have access to 10.0 or 10.1, but since the original problem didn't materialize until 10.3, I'm hopeful that testing 10.2 is sufficient. And now that the code is uniform, I'm also hoping we'll be safe moving forward to deal with future revisions of the OS with this issue.
author Sam Lantinga <slouken@libsdl.org>
date Sun, 21 Nov 2004 00:57:47 +0000
parents c5b2b6d2d1fe
children d910939febfa
line wrap: on
line source

/*
    SDL - Simple DirectMedia Layer
    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
    License as published by the Free Software Foundation; either
    version 2 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    Sam Lantinga
    slouken@libsdl.org
*/

/* 
    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);