/*
pygame - Python Game Library
Copyright (C) 2000-2001 Pete Shinners
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
Pete Shinners
pete@shinners.org
*/
/*
* pygame keyboard module
*/
#include "pygame.h"
/* keyboard module functions */
/*DOC*/ static char doc_key_set_repeat[] =
/*DOC*/ "pygame.key.set_repeat([delay, interval]) -> None\n"
/*DOC*/ "change the keyboard repeat\n"
/*DOC*/ "\n"
/*DOC*/ "When the keyboard repeat is enabled, you will receive multiple\n"
/*DOC*/ "KEYDOWN events when the user holds a key. You can control the\n"
/*DOC*/ "repeat timing with the delay and interval values. If no arguments\n"
/*DOC*/ "are passed, keyboard repeat will be disabled.\n"
/*DOC*/ "\n"
/*DOC*/ "Good values for delay and interval are 500 and 30.\n"
/*DOC*/ "\n"
/*DOC*/ "Delay is the amount of milliseconds before the first repeated\n"
/*DOC*/ "KEYDOWN event is received. The interval is the amount of\n"
/*DOC*/ "milliseconds for each repeated KEYDOWN event after that.\n"
/*DOC*/ ;
static PyObject* key_set_repeat(PyObject* self, PyObject* args)
{
int delay = 0, interval = 0;
if(!PyArg_ParseTuple(args, "|ii", &delay, &interval))
return NULL;
VIDEO_INIT_CHECK();
if(delay && !interval)
interval = delay;
if(SDL_EnableKeyRepeat(delay, interval) == -1)
return RAISE(PyExc_SDLError, SDL_GetError());
RETURN_NONE
}
/*DOC*/ static char doc_key_get_pressed[] =
/*DOC*/ "pygame.key.get_pressed() -> tuple of bools\n"
/*DOC*/ "get the pressed state for all keys\n"
/*DOC*/ "\n"
/*DOC*/ "This gives you a big tuple with the pressed state for all keys.\n"
/*DOC*/ "You index the sequence using the keysym constant (K_SPACE, etc)\n"
/*DOC*/ ;
static PyObject* key_get_pressed(PyObject* self, PyObject* args)
{
int num_keys;
Uint8* key_state;
PyObject* key_tuple;
int i;
if(!PyArg_ParseTuple(args, ""))
return NULL;
VIDEO_INIT_CHECK();
key_state = SDL_GetKeyState(&num_keys);
if(!key_state || !num_keys)
{
Py_INCREF(Py_None);
return Py_None;
}
if(!(key_tuple = PyTuple_New(num_keys)))
return NULL;
for(i = 0;i < num_keys;i++)
{
PyObject* key_elem;
key_elem = PyInt_FromLong(key_state[i]);
if(!key_elem)
{
Py_DECREF(key_tuple);
return NULL;
}
PyTuple_SET_ITEM(key_tuple, i, key_elem);
}
return key_tuple;
}
/*DOC*/ static char doc_key_name[] =
/*DOC*/ "pygame.key.name(int) -> string\n"
/*DOC*/ "get the name of a key\n"
/*DOC*/ "\n"
/*DOC*/ "This will provide you with the keyboard name for a keysym. For\n"
/*DOC*/ "example 'pygame.key.name(K_SPACE)' will return 'space'.\n"
/*DOC*/ ;
static PyObject* key_name(PyObject* self, PyObject* args)
{
int key;
if(!PyArg_ParseTuple(args, "i", &key))
return NULL;
return PyString_FromString(SDL_GetKeyName(key));
}
/*DOC*/ static char doc_key_get_mods[] =
/*DOC*/ "pygame.key.get_mods() -> int\n"
/*DOC*/ "get current state of modifier keys\n"
/*DOC*/ "\n"
/*DOC*/ "Returns a bitwise combination of the pressed state for all\n"
/*DOC*/ "modifier keys (KMOD_LSHIFT, etc).\n"
/*DOC*/ ;
static PyObject* key_get_mods(PyObject* self, PyObject* args)
{
if(!PyArg_ParseTuple(args, ""))
return NULL;
VIDEO_INIT_CHECK();
return PyInt_FromLong(SDL_GetModState());
}
/*DOC*/ static char doc_key_set_mods[] =
/*DOC*/ "pygame.key.set_mods(int) -> None\n"
/*DOC*/ "set the state of the modifier keys\n"
/*DOC*/ "\n"
/*DOC*/ "Allows you to control the internal state of the modifier keys.\n"
/*DOC*/ "Pass an interger built from using the bitwise-or (|) of all the\n"
/*DOC*/ "modifier keys you want to be treated as pressed.\n"
/*DOC*/ ;
static PyObject* key_set_mods(PyObject* self, PyObject* args)
{
int mods;
if(!PyArg_ParseTuple(args, "i", &mods))
return NULL;
VIDEO_INIT_CHECK();
SDL_SetModState(mods);
RETURN_NONE
}
/*DOC*/ static char doc_key_get_focused[] =
/*DOC*/ "pygame.key.get_focused() -> bool\n"
/*DOC*/ "state of keyboard focus\n"
/*DOC*/ "\n"
/*DOC*/ "Returns true when the application has the keyboard input focus.\n"
/*DOC*/ ;
static PyObject* key_get_focused(PyObject* self, PyObject* args)
{
if(!PyArg_ParseTuple(args, ""))
return NULL;
VIDEO_INIT_CHECK();
return PyInt_FromLong((SDL_GetAppState()&SDL_APPINPUTFOCUS) != 0);
}
static PyMethodDef key_builtins[] =
{
{ "set_repeat", key_set_repeat, 1, doc_key_set_repeat },
{ "get_pressed", key_get_pressed, 1, doc_key_get_pressed },
{ "name", key_name, 1, doc_key_name },
{ "get_mods", key_get_mods, 1, doc_key_get_mods },
{ "set_mods", key_set_mods, 1, doc_key_set_mods },
{ "get_focused", key_get_focused, 1, doc_key_get_focused },
{ NULL, NULL }
};
/*DOC*/ static char doc_pygame_key_MODULE[] =
/*DOC*/ "Contains routines for dealing with the keyboard. All keyboard\n"
/*DOC*/ "events can be retreived through the pygame.event module. With the\n"
/*DOC*/ "key module, you can get the current state of the keyboard, as\n"
/*DOC*/ "well as set the rate of keyboard repeating and lookup names of\n"
/*DOC*/ "keysyms.\n"
/*DOC*/ ;
PYGAME_EXPORT
void initkey(void)
{
PyObject *module, *dict;
/* create the module */
module = Py_InitModule3("key", key_builtins, doc_pygame_key_MODULE);
dict = PyModule_GetDict(module);
/*imported needed apis*/
import_pygame_base();
}
syntax highlighted by Code2HTML, v. 0.9.1