Mercurial > sdl-ios-xcode
view src/video/maccommon/SDL_mackeys.h @ 4139:568c9b3c0167 SDL-1.2
* Added configure option --enable-screensaver, to allow enabling the screensaver by default.
* Use XResetScreenSaver() instead of disabling screensaver entirely.
Full discussion summary from Erik on the SDL mailing list:
Current behaviour
=================
SDL changes the user's display power management settings without
permission from the user and without telling the user.
The interface that it uses to do so is DPMSDisable/DPMSEnable, which
should only ever be used by configuration utilities like KControl, never
by normal application programs, let alone by the libraries that they
use. Using an interface that is not at all intended for what SDL tries
to achieve means that it will not work as it should. Firstly, the power
management is completely disabled during the whole lifetime of the SDL
program, not only when it should be. Secondly, it makes SDL
non-reentrant, meaning that things will break when multiple SDL programs
are clients of the same X server simultaneously. Thirdly, no cleanup
mechanism ensures that the setting is restored if the client does not do
that (for example if it crashes).
In addition to that, this interface is broken on xorg,
[http://bugs.freedesktop.org/show_bug.cgi?id=13962], so what SDL tries
to do does not work at all on that implementation of the X Window
System. (The reason that the DPMSEnable works in KControl is that it
calls DPMSSetTimeout immediately after,
[http://websvn.kde.org/tags/KDE/3.5.9/kdebase/kcontrol/energy/energy.cpp?annotate=774532#l343]).
The problems that the current behaviour causes
==============================================
1. Information leak. When the user is away, someone might see what the
user has on the display when the user counts on the screensaver
preventing this. This does not even require physical access to the
workstation, it is enough to see it from a distance.
2. Draining battery. An SDL program that runs on a laptop will quickly
drain the battery while the user is away. The system will soon shut down
and require recharging before being usable again, while it should in
fact have consumed very little energy if the user's settings would have
been obeyed.
3. Wasting energy. Even if battery issues are not considered, energy as
such is wasted.
4. Display wear. The display may be worn out.
The problems that the current behaviour tries to solve
======================================================
1. Preventing screensaver while playing movies.
Many SDL applications are media players. They have reasons to prevent
screensavers from being activated while a movie is being played. When a
user clicks on the play button it can be interpreted as saying "play
this movie, but do not turn off the display while playing it, because I
will watch it even though I do not interact with the system".
2. Preventing screensaver when some input bypasses X.
Sometimes SDL uses input from another source than the X server, so
that the X server is bypassed. This obviously breaks the screensaver
handling. SDL tries to work around that.
3. Preventing screensaver when all input bypasses X.
There is something called Direct Graphics Access mode, where a
program takes control of both the display and the input devices from the
X server. This obviously means that the X server can not handle the
screensaver alone, since screensaver handling depends on input handling.
SDL does not do what it should to help the X server to handle the
screensaver. Nor does SDL take care of screeensaver handling itself. SDL
simply disables the screensaver completely.
How the problems should be solved
=================================
The correct way for an application program to prevent the screensaver
under X is to call XResetScreenSaver. This was recently discovered and
implemented by the mplayer developers,
[http://svn.mplayerhq.hu/mplayer?view=rev&revision=25637]. SDL needs to
wrap this in an API call (SDL_ResetScreenSaver) and implement it for the
other video targets (if they do not have a corresponding call, SDL
should do what it takes on that particular target, for example sending
fake key events).
1. When a movie is played, the player should reset the screensaver when
the animation is advanced to a new frame. The same applies to anything
similar, like slideshows.
2. When the X server is handling input, it must handle all input
(keyboards, mice, gamepads, ...). This is necessary, not only to be able
to handle the screensaver, but also so that it can send the events to
the correct (the currently active) client. If there is an input device
that the X server can not handle for some reason (such as lack of Plug
and Play capability), the program that handles the device as a
workaround must simulate what would happen if the X server would have
handled the device, by calling XResetScreenSaver when input is received
from the device.
3. When the X server is not handling the input, it depends on the
program that does to call XResetScreenSaver whenever an input event
occurs. Alternatively the program must handle the screensaver countdown
internally and call XActivateScreenSaver.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Fri, 29 Feb 2008 13:55:44 +0000 |
parents | f12379c41042 |
children | 782fd950bd46 a1b03ba2fcd0 |
line wrap: on
line source
/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2006 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Sam Lantinga slouken@libsdl.org */ /* These are the Macintosh key scancode constants -- from Inside Macintosh */ #define MK_ESCAPE 0x35 #define MK_F1 0x7A #define MK_F2 0x78 #define MK_F3 0x63 #define MK_F4 0x76 #define MK_F5 0x60 #define MK_F6 0x61 #define MK_F7 0x62 #define MK_F8 0x64 #define MK_F9 0x65 #define MK_F10 0x6D #define MK_F11 0x67 #define MK_F12 0x6F #define MK_PRINT 0x69 #define MK_SCROLLOCK 0x6B #define MK_PAUSE 0x71 #define MK_POWER 0x7F #define MK_BACKQUOTE 0x32 #define MK_1 0x12 #define MK_2 0x13 #define MK_3 0x14 #define MK_4 0x15 #define MK_5 0x17 #define MK_6 0x16 #define MK_7 0x1A #define MK_8 0x1C #define MK_9 0x19 #define MK_0 0x1D #define MK_MINUS 0x1B #define MK_EQUALS 0x18 #define MK_BACKSPACE 0x33 #define MK_INSERT 0x72 #define MK_HOME 0x73 #define MK_PAGEUP 0x74 #define MK_NUMLOCK 0x47 #define MK_KP_EQUALS 0x51 #define MK_KP_DIVIDE 0x4B #define MK_KP_MULTIPLY 0x43 #define MK_TAB 0x30 #define MK_q 0x0C #define MK_w 0x0D #define MK_e 0x0E #define MK_r 0x0F #define MK_t 0x11 #define MK_y 0x10 #define MK_u 0x20 #define MK_i 0x22 #define MK_o 0x1F #define MK_p 0x23 #define MK_LEFTBRACKET 0x21 #define MK_RIGHTBRACKET 0x1E #define MK_BACKSLASH 0x2A #define MK_DELETE 0x75 #define MK_END 0x77 #define MK_PAGEDOWN 0x79 #define MK_KP7 0x59 #define MK_KP8 0x5B #define MK_KP9 0x5C #define MK_KP_MINUS 0x4E #define MK_CAPSLOCK 0x39 #define MK_a 0x00 #define MK_s 0x01 #define MK_d 0x02 #define MK_f 0x03 #define MK_g 0x05 #define MK_h 0x04 #define MK_j 0x26 #define MK_k 0x28 #define MK_l 0x25 #define MK_SEMICOLON 0x29 #define MK_QUOTE 0x27 #define MK_RETURN 0x24 #define MK_KP4 0x56 #define MK_KP5 0x57 #define MK_KP6 0x58 #define MK_KP_PLUS 0x45 #define MK_LSHIFT 0x38 #define MK_z 0x06 #define MK_x 0x07 #define MK_c 0x08 #define MK_v 0x09 #define MK_b 0x0B #define MK_n 0x2D #define MK_m 0x2E #define MK_COMMA 0x2B #define MK_PERIOD 0x2F #define MK_SLASH 0x2C #if 0 /* These are the same as the left versions - use left by default */ #define MK_RSHIFT 0x38 #endif #define MK_UP 0x7E #define MK_KP1 0x53 #define MK_KP2 0x54 #define MK_KP3 0x55 #define MK_KP_ENTER 0x4C #define MK_LCTRL 0x3B #define MK_LALT 0x3A #define MK_LMETA 0x37 #define MK_SPACE 0x31 #if 0 /* These are the same as the left versions - use left by default */ #define MK_RMETA 0x37 #define MK_RALT 0x3A #define MK_RCTRL 0x3B #endif #define MK_LEFT 0x7B #define MK_DOWN 0x7D #define MK_RIGHT 0x7C #define MK_KP0 0x52 #define MK_KP_PERIOD 0x41 /* Wierd, these keys are on my iBook under Mac OS X */ #define MK_IBOOK_ENTER 0x34 #define MK_IBOOK_LEFT 0x3B #define MK_IBOOK_RIGHT 0x3C #define MK_IBOOK_DOWN 0x3D #define MK_IBOOK_UP 0x3E