Josselin Mouette <[EMAIL PROTECTED]> writes: > While the documentation talks about ints, it actually reads longs, which > becomes truly annoying in the case of pygame, where we use > SDL_FULLSCREEN, which is 0x80000000. On 32 bit arches, it gives > -2147483648 for an int as well as a long. But with 64 bits, the long > becomes 2147483648, which is a wrong value.
I disagree. <SDL/SDL_video.h> declares SDL_VideoModeOK as: extern DECLSPEC int SDLCALL SDL_VideoModeOK(int width, int height, int bpp, Uint32 flags); SDL takes the flags as an unsigned integer; 2147483648 is entirely correct there. How should this value be represented in the Python side? Consider how Python handles hexadecimal constants. On i386: | [EMAIL PROTECTED]:~$ python | Python 2.2.2 (#1, Mar 29 2003, 19:44:37) | [GCC 3.2.3 20030316 (Debian prerelease)] on linux2 | Type "help", "copyright", "credits" or "license" for more information. | >>> 0x7fffffff | 2147483647 | >>> 0x80000000 | -2147483648 | >>> 0xffffffff | -1 | >>> 0x100000000 | 4294967296L | >>> 0x7fffffffffffffff | 9223372036854775807L | >>> 0x8000000000000000 | 9223372036854775808L | >>> 0xffffffffffffffff | 18446744073709551615L | >>> 0x10000000000000000 | 18446744073709551616L | >>> But on alpha: | [EMAIL PROTECTED]:~$ python | Python 2.2.2 (#1, Apr 17 2003, 18:40:10) | [GCC 3.2.3 20030407 (Debian prerelease)] on linux2 | Type "help", "copyright", "credits" or "license" for more information. | >>> 0x7fffffff | 2147483647 | >>> 0x80000000 | 2147483648 | >>> 0xffffffff | 4294967295 | >>> 0x100000000 | 4294967296 | >>> 0x7fffffffffffffff | 9223372036854775807 | >>> 0x8000000000000000 | -9223372036854775808 | >>> 0xffffffffffffffff | -1 | >>> 0x10000000000000000 | 18446744073709551616L | >>> Hexadecimal constants are typically used for bit masks. It seems Python preserves the bits that probably matter, but sacrifices others in order to fit the value in a machine integer. I think this means: * SDL_FULLSCREEN should be mapped to the same value as 0x80000000: that is, -2147483648 on 32-bit and 2147483648 on 64-bit platforms. * Code that decodes bit masks passed from Python should ignore the high bits that Python does not attempt to preserve. In pygame, mode_ok() should decode the value as a long int so that the exception will not occur.

