Mercurial > sdl-ios-xcode
view src/video/xbios/SDL_xbios.h @ 1192:54aa9aa32327
To: sdl@libsdl.org
From: Christian Walther <cwalther@gmx.ch>
Date: Fri, 18 Nov 2005 23:39:02 +0100
Subject: [SDL] Mouse position bugs on Mac OS X
The attached patch fixes a few bugs in SDL related to the mouse position
in windowed mode on Mac OS X, reproduced using the attached minimal test
program - at least here on 10.3.9, with SDL CVS from today. Could anyone
test whether the bugs exist and are fixed by the patch on 10.2 and 10.4?
1. When using OpenGL, the vertical mouse positions obtained through
events or SDL_GetMouseState() are off by one.
2. When using OpenGL, SDL_WarpMouse() inverts the y coordinate.
3. Clicks on the topmost pixel row of the window are not recognized.
1 and 2 do not occur in non-OpenGL mode, while 3 does. All three only
occur in windowed mode, not in fullscreen.
The cause for 1 and 3 is that in Cocoa, "the location of the mouse"
seems to be defined as "the location of the top left corner of the mouse
pointer's hot pixel" (this is not documented, it's just what I found out
here), which together with the fact that Cocoa's usual y coordinates
start at the bottom and increase upwards means that the y coordinate of
the mouse runs from 1 to h, not from 0 to h-1, in a window of height h.
If it does work on 10.2 and 10.4 (I'll try to test it as soon as I can,
but at the moment all I have at hand is 10.3.9), can this be applied to
the CVS?
-Christian
To: sdl@libsdl.org
From: Christian Walther <cwalther@gmx.ch>
Date: Mon, 28 Nov 2005 10:41:51 +0100
Subject: [SDL] Re: Mouse position bugs on Mac OS X
I wrote:
> I'll try to test it as soon as I can, but at the moment all I have at hand is 10.3.9
So, here are the results of my tests (with patched and unpatched
frameworks compiled with Xcode 1.5 (gcc 3.3) on 10.3.9):
On 10.1.5, my test program doesn't run because of "Undefined symbols:
SDL undefined reference to _CGMainDisplayID expected to be defined in
Carbon". I guess not supporting 10.1 was a deliberate decision then and
that's OK with me.
On 10.2.8, 10.3.9, and 10.4.0, the bugs exist as described in my
original post and are fixed by my patch. That is, there is no difference
between pre/post 10.3 and the patched version works correctly in all
combinations of GL/non-GL and windowed/fullscreen.
I therefore recommend the patch for inclusion.
-Christian
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Mon, 28 Nov 2005 13:58:26 +0000 |
parents | fba6b67b4d60 |
children | c9b51268668f |
line wrap: on
line source
/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2004 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 */ #ifdef SAVE_RCSID static char rcsid = "@(#) $Id$"; #endif #ifndef _SDL_xbios_h #define _SDL_xbios_h #include "SDL_types.h" #include "SDL_sysvideo.h" /* Hidden "this" pointer for the video functions */ #define _THIS SDL_VideoDevice *this /* TT video modes: 2 Falcon RVB: 16 (could be *2 by adding PAL/NTSC modes) Falcon VGA: 6 ST low: 1 */ #define SDL_NUMMODES 16 typedef struct { Uint16 number; /* Video mode number */ Uint16 width; /* Size */ Uint16 height; Uint16 depth; /* bits per plane */ SDL_bool doubleline; /* Double the lines ? */ } xbiosmode_t; /* Private display data */ #define NUM_MODELISTS 2 /* 8 and 16 bits-per-pixel */ struct SDL_PrivateVideoData { long cookie_vdo; int old_video_mode; /* Old video mode before entering SDL */ void *old_video_base; /* Old pointer to screen buffer */ void *old_palette; /* Old palette */ Uint32 old_num_colors; /* Nb of colors in saved palette */ int num_modes; /* Number of xbios video modes */ xbiosmode_t *mode_list; /* List of xbios video modes */ void *screens[2]; /* Pointers to aligned screen buffer */ void *screensmem[2]; /* Pointers to screen buffer */ void *shadowscreen; /* Shadow screen for c2p conversion */ int doubleline; /* Double line mode ? */ int frame_number; /* Number of frame for double buffer */ int pitch; /* Destination line width for C2P */ int width, height; /* Screen size for centered C2P */ SDL_bool centscreen; /* Centscreen extension present ? */ SDL_Rect *SDL_modelist[NUM_MODELISTS][SDL_NUMMODES+1]; xbiosmode_t *videomodes[NUM_MODELISTS][SDL_NUMMODES+1]; }; /* _VDO cookie values */ enum { VDO_ST=0, VDO_STE, VDO_TT, VDO_F30 }; /* Monitor types */ enum { MONITOR_MONO=0, MONITOR_TV, MONITOR_VGA, MONITOR_RGB }; /* EgetShift masks */ #define ES_BANK 0x000f #define ES_MODE 0x0700 #define ES_GRAY 0x1000 #define ES_SMEAR 0x8000 /* TT shifter modes */ #define ST_LOW 0x0000 #define ST_MED 0x0100 #define ST_HIGH 0x0200 #define TT_LOW 0x0700 #define TT_MED 0x0300 #define TT_HIGH 0x0600 /* Hidden structure -> variables names */ #define SDL_modelist (this->hidden->SDL_modelist) #define XBIOS_mutex (this->hidden->mutex) #define XBIOS_cvdo (this->hidden->cookie_vdo) #define XBIOS_oldpalette (this->hidden->old_palette) #define XBIOS_oldnumcol (this->hidden->old_num_colors) #define XBIOS_oldvbase (this->hidden->old_video_base) #define XBIOS_oldvmode (this->hidden->old_video_mode) #define XBIOS_nummodes (this->hidden->num_modes) #define XBIOS_modelist (this->hidden->mode_list) #define XBIOS_screens (this->hidden->screens) #define XBIOS_screensmem (this->hidden->screensmem) #define XBIOS_shadowscreen (this->hidden->shadowscreen) #define XBIOS_videomodes (this->hidden->videomodes) #define XBIOS_doubleline (this->hidden->doubleline) #define XBIOS_fbnum (this->hidden->frame_number) #define XBIOS_pitch (this->hidden->pitch) #define XBIOS_width (this->hidden->width) #define XBIOS_height (this->hidden->height) #define XBIOS_centscreen (this->hidden->centscreen) /*--- Functions prototypes ---*/ void SDL_XBIOS_AddMode(_THIS, Uint16 modecode, Uint16 width, Uint16 height, Uint16 depth, SDL_bool flags); #endif /* _SDL_xbios_h */